Seite 1 von 2
Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 16:42
von Snatsch
Hallo, da meine Innogy Zentrale immer mal wieder offline geht hatte ich bis jetzt immer folgende Rule laufen
Code: Alles auswählen
rule "Innogy Zentrale ist Offline"
when
Thing "innogysmarthome:bridge:d79b954f20" changed
then
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20")
if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
logInfo("ThingStatus", "The thing is online.")
} else {
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")
}
end
jetzt ist es aber so das die Zentrale ständig für ein paar Sekunden offline ist und ich mit Nachrichten zugemüllt werde
ich hätte gerne einen Timmer eingebaut, das die Benachrichtigung erst nach ca 3 Minuten kommt sollte die Zentrale so lange offline sein
vielleicht habt ihr einen Tipp für mich
Code: Alles auswählen
var Timer innogyzentrale = null
rule "Innogy Zentrale ist Offline"
when
Thing "innogysmarthome:bridge:d79b954f20" changed
then
if"innogysmarthome:bridge:d79b954f20" .state == online )
return;
innogyzentrale = createTimer(ZonedDateTime.now.plusMinutes(3), [|
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20")
if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
logInfo("ThingStatus", "The thing is online.")
])
} else {
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")
}
end
vielen Dank im voraus
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 18:35
von udo1toni
Ja, aber nein.

So wird ein Schuh draus:
Code: Alles auswählen
// Globale Variablen immer zu Anfang der Datei definieren!
var Timer tInnogyAlarm = null // Timer für Alarm Meldung
rule "Prüfung Innogy Zentrale"
when
Thing "innogysmarthome:bridge:d79b954f20" changed // Thing hat Stataus geändert
then
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
if(thingStatusInfo == "ONLINE") { // falls online
tInnogyAlarm?.cancel // falls existent, brich Timer ab
if(tInnogyAlarm !== null) tInnogyAlarm = null // falls Zeiger auf Timer gesetzt, löschen
} else if(tInnogyAlarm === null) { // nicht online -> falls noch kein Timer definiert
tInnogyAlarm = createTimer(ZonedDateTime.now.plusMinutes(3), [| // lege Timer an. Wenn Timer abläuft
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!") // Melde Offline Zustand
tInnogyAlarm = null
])
}
end
Der Punkt ist: Sobald die Zentrale Online ist, soll der Timer abgebrochen werden, der die Alarmmeldung bringt (das ist der erste Teil der Rule). Falls das Thing nicht Online ist, soll ein Timer gestartet werden (natürlich nur, wenn der Timer nicht bereits läuft).
Da wir außerhalb des Timers prüfen, ob das Thing Online ist, müssen wir diesen Test nicht im Timer selbst ausführen.
Die Rule sendet also genau dann einen Alarm, wen ndie Innogy Zentrale mehr als drei Minuten am Stück nicht Online ist.
Man kann das übrigens auch ohne DSL Timer erledigen, indem man ein Item als Timer definiert.
Gegeben: Switch Item tInnogyAlarm (weil sprechender Name...) mit Metadaten Expiration Timer:
Code: Alles auswählen
value: 0h3m0s,command=OFF
config:
ignoreStateUpdates: "false"
Nun gibt es zwei Rules:
Code: Alles auswählen
rule "Prüfung Innogy Zentrale"
when
Thing "innogysmarthome:bridge:d79b954f20" changed // Thing hat Stataus geändert
then
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
if(thingStatusInfo == "ONLINE") { // falls online
tInnogyAlarm.postUpdate(OFF) // falls existent, brich Timer ab
} else if(tInnogyAlarm.state != ON) { // nicht online -> falls noch kein Timer definiert
tInnogyAlarm.postUpdate(ON)
}
end
rule "Sende Alarm Innogy Zentrale"
when
Item tInnogyAlarm received command OFF
then
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!") // Melde Offline Zustand
end
Der Code ist weitgehend identisch. Die zweite Variante kann direkt über UI Rules definiert werden. Dafür ist aber die Expiration Time fix.
In der Rules DSL ist es ein Leichtes, je nach Bedarf unterschiedliche Ablaufzeiten zu verwenden (ich habe darüber z.B. meinen Dusch-WC Lüfter mit variablen Nachlaufzeiten ausgerüstet). Dafür muss die Rule aber zwingend über Textdatei angelegt werden, da ja eine globale Variable benötigt wird.
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 20:42
von Snatsch
He udo1toni

vielen Dank für deine Hilfe (wie so oft

) wie immer auch prima erklärt
nur ein paar zu viele Gleichzeichen
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 21:01
von int5749
Snatsch hat geschrieben: ↑7. Apr 2022 20:42
nur ein paar zu viele Gleichzeichen
Ich behaupte mal: Nicht, wenn Udo dies so schreibt

Denn
== ist anders als
===
Einmal aus dem englischen Forum.
== : equals to, it compares the data of the two operands for equivalency
!= : not equals, it compares the data of the two operands for non-equivalency
=== : identity, it compares the two Objects to see if they are the same (i.e. both variable point to the same space in RAM)
!== : not identity, it compares the two Objects to see if they are not the same (i.e. both point to different space in RAM)
VG
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 21:11
von Snatsch
ok vielen Dank

kannte ich nicht und hab es auch noch nicht gesehen
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 7. Apr 2022 21:36
von udo1toni
Ja, das ist gerne mal unbekannt.
Variablen und Konstanten sind ja in Wirklichkeit Zeiger auf Speicherbereiche. Wenn ich also in die Variable a einen Wert speichere, so schaut das System nach, auf welchen Speicherbereich a zeigt und speichert den Wert anschließend an dieser Stelle.
Wenn man a aber auf null setzt (nicht NULL oder 0), so wird der Zeiger selbst überschrieben, der Speicher wird freigegeben.
== liest für die linke und rechte Seite den Speicherbereich, auf den verwiesen wird und vergleicht die dort gefundenen Werte miteinander.
=== prüft, ob linke und rechte Seite den selben Speicherbereich adressieren.
Der DSL Parser beschwert sich, wenn man einen Vergleich mit null mit == ausführt (auch wenn der Vergleich selbst dennoch funktioniert). Andere Identitätsprüfungen als null kommen in der openHAB DSL meines Wissens nicht vor.
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 8. Apr 2022 20:04
von scotty
Hab den Vorschlag von Udo aufgegriffen und auf ein anderes Thing umgeschrieben. Leider mit dem Ergebnis, dass nach einigen Stunden etwa 7 oder 8 andere Things Offline waren.
Code: Alles auswählen
// Globale Variablen immer zu Anfang der Datei definieren!
var Timer tSpeedtestAlarm = null // Timer für Alarm Meldung
rule "speedtestReset"
when
Thing "speedtest:speedtest:43ecbb5615" changed // Thing hat Stataus geändert
then
val thingStatusInfo = getThingStatusInfo("speedtest:speedtest:43ecbb5615") // hole aktuellen Status
if(thingStatusInfo == "ONLINE") { // falls online
tSpeedtestAlarm?.cancel // falls existent, brich Timer ab
if(tSpeedtestAlarm !== null) tSpeedtestAlarm = null // falls Zeiger auf Timer gesetzt, löschen
} else if(tSpeedtestAlarm === null) { // nicht online -> falls noch kein Timer definiert
tSpeedtestAlarm = createTimer(ZonedDateTime.now.plusMinutes(3), [| // lege Timer an. Wenn Timer abläuft
tSpeedtestAlarm = null
val mailActions = getActions("mail","mail:smtp:samplesmtp")
val success = mailActions.sendMail("xxx@unity-mail.de", "Thing error", "Achtung, System meldet Speedtest Offline")
])
}
end
Thing speedtest musste danach sogar neu installiert werden.
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 8. Apr 2022 22:29
von udo1toni
Nein.
Sorry, wenn ich das so sage, aber es ist schlicht unmöglich, dass eine Rule überhaupt solche Auswirkungen hat. Schon gar nicht mit den aufgeführten Befehlen.
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 9. Apr 2022 01:06
von scotty
Lieber Udo, du kannst es mir glauben. Die Rule habe ich wieder gelöscht, Speedtest neu installiert und alle Things sind wieder Online (habe gerade noch einmal nachgeschaut). Ich werde allerdings in den nächsten Tagen einen neuen Versuch starten.
Re: Könnte mal wieder Hilfe gebrauchen :)
Verfasst: 9. Apr 2022 06:09
von udo1toni
Wenn eine einfache Rule wie die aufgeführte zu dem von Dir beschriebenen Fehlerbild führen würde, dann könntest Du überhaupt keine Rules dauerhaft laufen lassen, die
- auf ein Thing changed reagieren
- den genauen Thing Status erfragen
- einen Timer verwenden
- eine eMail versenden
denn mehr passiert ja in der Rule nicht.
Thing changed ist jetzt nicht so exotisch; ich würde in entsprechenden Rules immer erwarten, dass auch der aktuelle Status erfragt wird.
e-Mail versenden kommt auch nicht selten vor.
Bleibt noch der Timer, das ist nun eine absolute Standardfunktion.
Jede Funktion für sich wird also keinesfalls als Ursache für Deinen Kollosalabsturz heranzuziehen sein.
Und selbst die Kombination ist jetzt nicht wirklich seltsam.
Allenfalls wäre das Thing (speedtest) in meinen Augen etwas ungewöhnlich.