Seite 1 von 1
Item changed in die if Abfrage
Verfasst: 15. Feb 2020 13:36
von lukh
Hallo, eine Frage zur Rule-Programmierung.
Wie muss es lauten, wenn ich eine Statusänderung eines Items nicht in die When-Abfrage haben möchte, sondern in die Then-Angabe unter "if"
Versteht Ihr was ich meine?
Als Beispiel:
Code: Alles auswählen
rule "Beispiel"
when
Time cron "0 0 6-7 * * ?"
then
if(Item.state changed)
Geht das überhaupt? Oder kann ich in der if Abfrage nur den Status direkt abfragen? Also ob er ON oder OFF ist zum Beispiel.
Ich würde gerne nur die Tatsache abfragen, ob sich der Status geändert hat, nicht in was er sich geändert hat!
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 13:49
von eiGelbGeek
So wie du es dort schreibst geht es natürlich nicht

aber so sollte es gehen (Persistence erforderlich)
Code: Alles auswählen
rule "Beispiel für changed from OFF to ON"
when
Time cron "0 0 6-7 * * ?"
then
if(Item.previousState.state == OFF && Item.state == ON){
//DOSTUFF
}
end
Code: Alles auswählen
rule "Beispiel - Hat sich der Status in den letzten 6 Stunden geändert?"
when
Time cron "0 0 6-7 * * ?"
then
if(Item.changedSince(now.minusHours(6))){
//DOSTUFF
}
end
https://www.smarthomeblog.net/openhab-p ... ial-rules/
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 14:16
von violine21
Hallo,
Du könntest es genau anders herum schreiben
Code: Alles auswählen
rule "Beispiel"
when
Item.state changed
then
if(now.getHourOfDay > 5 && now.getHourOfDay < 7) //6:00 - 6:59 Uhr
{Status hat sich im Zeitraum geändert}
end
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 16:57
von lukh
Das verstehe ich nicht so ganz. Ich muss da noch mal ganz blöd nachfragen.
Also erst einmal zu der Zeit. Das sollte eigentlich heissen: zwischen 6 und 7 Uhr
(Persistence erforderlich) verstehe ich auch nicht. Wieso ist das erforderlich?
Das Beispiel changed from OFF to ON möchte ich ja gerade nicht. Das wäre ja auch wieder zu explizit.
Der Wechsel von ON to OFF fehlt, oder?
Eigentlich wollte ich einen Regelaufbau, der in etwa so aussieht:
Code: Alles auswählen
Wenn
es zwischen 6 und 7 Uhr ist
dann
(if)wenn sich ein Item geändert hat
(if)wenn das Item sich auf ON geändert hat
dann mache A
(else) anderenfalls
(if) wenn das Item ungleich ON ist
dann mache B
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 17:58
von Darkwin101
Genau bei deinem Aufbau mit Time Cron wird die Regel 1 mal um 6 ausgeführt und um 7 Uhr
mit Item changed wird es ausgeführt immer wenn sich das item ändert und dann die zeit abfrage also
Code: Alles auswählen
if(now.getHourOfDay > 5 && now.getHourOfDay < 7) // zeit ist zwischen 6 und 7 Uhr
natürlich kann das ganze noch weiter abgefragt werden also
Code: Alles auswählen
if((now.getHourOfDay > 5 && now.getHourOfDay < 7) && Item.state == ON)
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 21:10
von violine21
Hallo,
Wenn
es zwischen 6 und 7 Uhr ist
dann
Das ist ein sehr schwammiger Trigger für die Rule. Soll die Rule ständig lauschen? Das geht so nicht. Du brauchst einen eindeutigen Trigger.
Das kann in Deinem Fall nur das Item.Changed-Ereignis sein.
Im "then-Anweisungsteil" musst Du dann den Zeitbereich eingrenzen
Code: Alles auswählen
then
if(now.getHourOfDay > 5 && now.getHourOfDay < 7) //6:00 - 6:59 Uhr
{Status hat sich im Zeitraum geändert}
end
Evtl. kannst Du dann nach Deinen Wünschen in weiteren if-Abfragen nach OFF -> ON oder ON -> OFF eingrenzen.
Dazu benötigst du keine Persistence.
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 22:26
von lukh
violine21 hat geschrieben: ↑15. Feb 2020 21:10
Das ist ein sehr schwammiger Trigger für die Rule. Soll die Rule ständig lauschen? Das geht so nicht. Du brauchst einen eindeutigen Trigger.
So habe ich das noch gar nicht betrachtet. Danke für die deutlichen Worte.
Mein Denken war einfach, das ich zu einem bestimmten Zeitpunkt, bzw. in einem Zeitbereich, eine Abfrage laufen lassen kann.
Das die Abfrage aber der Trigger sein muss, das habe ich nun kapiert.
Kann ich eigentlich im THEN-Bereich der Rule die IF-Abfragen so oft schachteln wie ich möchte?
Re: Item changed in die if Abfrage
Verfasst: 15. Feb 2020 22:50
von violine21
lukh hat geschrieben: ↑15. Feb 2020 22:26
Mein Denken war einfach, das ich zu einem bestimmten Zeitpunkt, bzw. in einem Zeitbereich, eine Abfrage laufen lassen kann.
Das die Abfrage aber der Trigger sein muss, das habe ich nun kapiert.
Kann ich eigentlich im THEN-Bereich der Rule die IF-Abfragen so oft schachteln wie ich möchte?
Zu einem bestimmten Zeitpunkt, das geht immer. Auch zu festgelegten Zeitpunkten (z.B. alle x Sekunden) innerhalb eines Zeitbereichs gehts.
Wenn dann aber das changed-Ereignis genau zwischen den Zeitpunkten auftritt, hat es OH nicht mitbekommen.Zeitpunkt und changed-Ereignis
müssten praktisch zeitlich zusammen fallen. Das ist unwahrscheinlich.
Du kannst if-Abfragen schachteln, allerdings weiss ich nicht, ob es eine Verschachtelungstiefe gibt.
Viele Grüße
André
Re: Item changed in die if Abfrage
Verfasst: 16. Feb 2020 01:11
von udo1toni
Nur nochmal zur Klarstellung:
Die Rules sind eventbezogen. Es geht also um Ereignisse. Die Rule wird in dem Moment gestartet, in dem das Ereignis eintritt.
Ein Zeitraum ist aber kein Event. Ein Zeitpunkt wäre ein Event (die Rule startet beim Erreichen des Zeitpunkts).
Die Rule muss also exakt andersrum funktionieren. Die Rule wird bei Änderung des Items gestartet, innerhalb der Rule (also im then-Block) wird dann geprüft, ob der Zeitraum passt.
Re: Item changed in die if Abfrage
Verfasst: 16. Feb 2020 03:55
von eiGelbGeek
lukh hat geschrieben: ↑15. Feb 2020 16:57
Also erst einmal zu der Zeit. Das sollte eigentlich heissen: zwischen 6 und 7 Uhr
Hier mal die Übersetzung deines Time Cron
At second :00, at minute :00, every hour between 06am and 07am, of every day
Heißt deine Rule wird um 06:00 und um 07:00 ausgeführt.
lukh hat geschrieben: ↑15. Feb 2020 22:26
Kann ich eigentlich im THEN-Bereich der Rule die IF-Abfragen so oft schachteln wie ich möchte?
Ja ... kann man
