Ich hab gerade mal nachgeschaut, und tatsächlich ist die Nennlast eines "gewöhnlichen" Rohrmotors z.B. 145 W. Und ich kann die Fahrt der Rollläden gut als Lastspitze im Stromverbrauch des Hauses sehen, weil halt alle Läden auf einen Schlag fahren - hätte ich nicht gedacht.
Trigger der Rule: ja, klar, die sicherste Variante ist tatsächlich, auf das zu messende Item zu triggern und nicht auf irgendwas anderes
Durch die Änderung des Triggers kannst Du die Rule vereinfachen (zumindest was die Schreibweise betrifft).
Was die mehrfach-Mails betrifft, so ist es vermutlich das beste, hier mit einem Timeout zu arbeiten.
Sobald Überlast erkannt wird, wird die Nachricht geschickt, gleichzeitig wird ein Flag gesetzt, welches nach Zeit x (am sichersten die normale Laufzeit des Motors plus etwas Karenz) wieder gelöscht wird, so:
Code: Alles auswählen
// globale Variablen müssen zu Beginn der Datei definiert werden (vor der ersten Rule)
var Timer tLastalarm = null // Timer für Überlast Alarm
rule "DG Rolladen Erker Mitte"
when
Item DG_Rolladen_Erker_mitte_Stromverbrauch changed
then
if(!(newState instanceof Number)) {
logInfo("shutter","Leistungsmessung liefert keine Zahl! Abbruch der Rule")
return;
}
val nWatt = (newState as Number).floatValue
if(nWatt > 150 && tLastalarm === null) { // === ist hier korrekt
logWarn("shutter", "Überlast ({} W) Rollladen Erker Mitte!",newState)
tLastalarm = createTimer(now.plusMinutes(2),[|tLastalarm = null]) // Timeout Timer
val mailActions = getActions("mail","mail:smtp:xxxx")
mailActions.sendMail("xxx", "Störung Rolladen", "DG Rolladen Erker Mitte Überlast.")
}
end
Zu Beginn wird eine globale Variable definiert, welche später als Zeiger auf den Timer für den Timeout dient. Diese muss vor der ersten Rule in der rules-Datei definiert werden
In den Rules gibt es diverse implizite Variablen, welche abhängig vom Trigger der Rule zur Verfügung stehen. Z.B. enthält die Variable
newState bei jeder Rule, welche durch ein
changed oder
received update Ereignis getriggert wurde, den aktuellen Status des triggernden Items
zum Zeitpunkt des Triggers.
Im Unterschied zu
DG_Rolladen_Erker_mitte_Stromverbrauch.state enthält
newState also einen statischen Wert, der sich garantiert während der Ausführung der Rule nicht ändert. Natürlich sollte das hier bei dieser Rule keine große Rolle spielen, aber dennoch...
Um die aktuelle Last mit ausgeben zu können, nutze ich eine lokale Konstante (nWatt). klar, man könnte auch den Wert dirkt verwenden, schließlich ist er ja statisch, aber so spart man ein paar Zeichen (und während der Ausführung muss der Wert nur einmalig abgefragt werden - Zugriffe auf lokale Konstanten sollten wesentlich flotter sein als der Zugriff auf Items. Auch hier geht es höchstens um eine ms, aber dennoch...
logWarn() gibt eine Warnmeldung im Log aus. Alle Logbefehle erwarten zwei Strings als Argumente, dabei ist der erste String der Name des Loggers. Auch wenn openHAB Leerzeichen und Sonderzeichen hier verarbeiten kann, ist das keine gute Idee. Über den Loggernamen kann man nämlich das Verhalten des Loggers steuern, hier kann man z.B. die obere Meldung unterdrücken, die untere wird aber weiterhin ausgegeben (ohne den Code zu ändern und damit ohne Neueinlesen der rules-Datei).
Der Loggername sollte keine Leer- oder Sonderzeichen enthalten, er sollte kurz sein und sich am allgemeinen Namensschema von openHAB orientieren, d.h. CamelCaseSchreibweise. Der vollständige Loggername lautet hier übrigens
org.openhab.core.model.script.shutter, alle Logger aus DSL Rules haben den vorderen Teil gemein (also bis incl.
script.) Entsprechend braucht es auch kein "rule" oder so zur Identifikation.
Die Zeile
Code: Alles auswählen
tLastalarm = createTimer(now.plusMinutes(2),[|tLastalarm = null])
Legt einen Timer im Scheduler an, der Scheduler führt den im Lambda übergebenen Code zur angegebenen Zeit aus, hier also nach zwei Minuten den Befehl
tLastalarm = null. Da diese Variable der Zeiger auf den Timer ist, wird die Variable also beim Start des Timers gesetzt und beim Ablauf wieder geleert, das reicht zur Steuerung aus.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet