Wenn Du massig Änderungen bekommst, ist es sinnvoller, einfach nur zeitlich gesteuert zu senden, so wie Du es ja auch umgesetzt hast.
Aber um auf Deine ursprüngliche Rule zurück zu kommen: Es gibt ein paar Probleme dabei.
Zum ersten erzeugst Du ja einen Timer, der die Ausführung des beinhalteten Codes um 60 Sekunden verzögert. Das ist schon mal nicht das, was Du willst
Dann nutzt Du newState, was eine implizite Variable ist, die lediglich zur Verfügung steht, wenn eine Rule mit changed oder revceived update getrigert wurde (der Code des Timers kann evtl. den Status der Variable erben, darauf verlassen würde ich mich aber nicht)
Dann prüfst Du auf === null, sorgst aber zu keinem Zeitpunkt dafür, dass die Variable tatsächlich wieder geleert wird.
Und ganz wichtig: Du nutzt eine Variable für den Timer, initialisierst sie aber nicht als Timer Variable. Das mag funktionieren, ist aber auch eher keine gute Idee. Der saubere Ansatz hätte so ausgesehen:
Code: Alles auswählen
// globale Variablen zu Beginn der Datei definieren
var Timer tSend = null
rule "Aktive AC Power"
when
Item GenericMQTTThingVictronGridACPower changed // Wert geändert
then
if(tSend !== null) // Timervariable gesetzt?
return; // dann Abbruch
val strPower = newState.toString // hole den Wert als String
// json Objekt bauen
val json='{"pos" : 2,"text" : "' + strPower + ' W","icon" : 2708,"duration" : 10,"rainbow": true,"color" : "#FFFFFF"}'
Anzeigeuhr.sendCommand(json) // json senden
tSend = createTimer(now.plusSeconds(20), [| // Zeitsperre aktivieren
tSend = null // Timervariable löschen
])
end
Ist die Variable nicht gesetzt, wird der aktuelle Wert ermittelt, ins json integriert und an die Anzeige geschickt. Anschließend wird der Timer gestartet, womit die nächste Ausführung verhindert (abgebrochen) wird.
Läuft der Timer ab, so wird lediglich die Timervariable auf null gesetzt, womit die Sperre wieder aufgehoben ist.