Item changed in die if Abfrage

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
lukh
Beiträge: 99
Registriert: 5. Dez 2019 20:15
Answers: 2

Item changed in die if Abfrage

Beitrag 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!

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Item changed in die if Abfrage

Beitrag von eiGelbGeek »

So wie du es dort schreibst geht es natürlich nicht :mrgreen: aber so sollte es gehen (Persistence erforderlich) :D

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/

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Item changed in die if Abfrage

Beitrag 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

Benutzeravatar
lukh
Beiträge: 99
Registriert: 5. Dez 2019 20:15
Answers: 2

Re: Item changed in die if Abfrage

Beitrag 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

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Item changed in die if Abfrage

Beitrag 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)
 
 

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Item changed in die if Abfrage

Beitrag 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.

Benutzeravatar
lukh
Beiträge: 99
Registriert: 5. Dez 2019 20:15
Answers: 2

Re: Item changed in die if Abfrage

Beitrag 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?

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Item changed in die if Abfrage

Beitrag 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é

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Item changed in die if Abfrage

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Item changed in die if Abfrage

Beitrag 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 :mrgreen:

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 :mrgreen:

Antworten