Rule Item.State > Null

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Antworten
Thommy2012
Beiträge: 92
Registriert: 11. Apr 2018 09:55
Answers: 0

Rule Item.State > Null

Beitrag von Thommy2012 »

Hallo zusammen,

habe mir eine Rule für Katwarn gebaut.

Diese funktioniert auch soweit.

Wenn die Meldung aber beendet wird ,wird eine NULL Ausgegeben.

Wie kann ich im .state es so setzen wenn größer als NULL dann Ausgabe (Meldung)

Für Nachricht beendet habe ich jetzt Item.State == Null genommen

Code: Alles auswählen

rule "Katwarn Alexa"
when
    Item KatwarnKatwarnUhrzeit changed
then

if (Timecronausloeser.state == ON && KatwarnKatwarnUhrzeit.state  ??????????????? )
habe schon mit > probiert aber das wird wohl nur bei Temperatur funktionieren.

Danke für jeden Tipp

Thommy2012
Beiträge: 92
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: Rule Item.State > Null

Beitrag von Thommy2012 »

könnte das so funktionieren

Code: Alles auswählen

if (Timecronausloeser.state == ON && KatwarnKatwarnUhrzeit.state  ==true =>null )

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

Re: Rule Item.State > Null

Beitrag von udo1toni »

Handelt es sich bei KatwarnKatwarnUhrzeit um ein DateTime Item?

Üblicherweise bietet sich eine Prüfung auf den Typ an:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState instanceof DateTimeType)
newState ist eine implizite Variable, die in jeder Rule existiert, welche über changed oder received update getriggert wurde. Sie enthält den wert, der die Rule getriggert hat - im Gegensatz zur expliziten Abfrage des Status des triggernden Items, der kann sich schon wieder geändert haben (Zu Beginn des Codes eher kein Problem, kann aber bei längeren Prozeduren tatsächlich Auswirkungen haben)
instanceof testet, ob der Wert eine Instanz des angegebenen Datentyps ist. NULL gehört nicht zu dem Datentyp :)
Alternativ könntest du natürlich auch auf NULL testen, nur ist NULL nicht der einzige mögliche Wert, der kein gültiges Datum darstellt:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState != NULL)
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

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

Re: Rule Item.State > Null

Beitrag von udo1toni »

Thommy2012 hat geschrieben: 2. Jun 2024 20:09 könnte das so funktionieren

Code: Alles auswählen

if (Timecronausloeser.state == ON && KatwarnKatwarnUhrzeit.state  ==true =>null )
Nein :)
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Thommy2012
Beiträge: 92
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: Rule Item.State > Null

Beitrag von Thommy2012 »

Hallo Udo,

Die Abfrage wird über json gemacht.

Habe zwei Items mal angelegt zum testen, da ich im Vorfeld nicht wusste was hinten raus kommt.
Eigentlich bräuchte man nur eine da eh beide nach Beendigung auf NULL springen.

Sind beide als String angelegt



udo1toni hat geschrieben: 2. Jun 2024 20:17 Handelt es sich bei KatwarnKatwarnUhrzeit um ein DateTime Item?

Üblicherweise bietet sich eine Prüfung auf den Typ an:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState instanceof DateTimeType)
newState ist eine implizite Variable, die in jeder Rule existiert, welche über changed oder received update getriggert wurde. Sie enthält den wert, der die Rule getriggert hat - im Gegensatz zur expliziten Abfrage des Status des triggernden Items, der kann sich schon wieder geändert haben (Zu Beginn des Codes eher kein Problem, kann aber bei längeren Prozeduren tatsächlich Auswirkungen haben)
instanceof testet, ob der Wert eine Instanz des angegebenen Datentyps ist. NULL gehört nicht zu dem Datentyp :)
Alternativ könntest du natürlich auch auf NULL testen, nur ist NULL nicht der einzige mögliche Wert, der kein gültiges Datum darstellt:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState != NULL)

Thommy2012
Beiträge: 92
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: Rule Item.State > Null

Beitrag von Thommy2012 »

Verstehe ich das also richtig das das !=null wie ein invertiert funktioniert. Also quasi wenn nicht null ?


udo1toni hat geschrieben: 2. Jun 2024 20:17 Handelt es sich bei KatwarnKatwarnUhrzeit um ein DateTime Item?

Üblicherweise bietet sich eine Prüfung auf den Typ an:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState instanceof DateTimeType)
newState ist eine implizite Variable, die in jeder Rule existiert, welche über changed oder received update getriggert wurde. Sie enthält den wert, der die Rule getriggert hat - im Gegensatz zur expliziten Abfrage des Status des triggernden Items, der kann sich schon wieder geändert haben (Zu Beginn des Codes eher kein Problem, kann aber bei längeren Prozeduren tatsächlich Auswirkungen haben)
instanceof testet, ob der Wert eine Instanz des angegebenen Datentyps ist. NULL gehört nicht zu dem Datentyp :)
Alternativ könntest du natürlich auch auf NULL testen, nur ist NULL nicht der einzige mögliche Wert, der kein gültiges Datum darstellt:

Code: Alles auswählen

if(Timecronausloeser.state == ON && newState != NULL)

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

Re: Rule Item.State > Null

Beitrag von udo1toni »

Thommy2012 hat geschrieben: 2. Jun 2024 22:03 Verstehe ich das also richtig das das !=null wie ein invertiert funktioniert. Also quasi wenn nicht null ?
Du hast es insofern richtig erkannt, als dass das ! einem logischen NOT entspricht. Aber statt !== zu schreiben, wird das eine = weg gelassen.
Hat man eine Variable vom Typ Boolean, kann man diese auch direkt negieren:

Code: Alles auswählen

var Boolean bTest = true
if(bTest)  logInfo("test","Erster Test bTest ist wahr!")
if(!bTest) logInfo("test","Erster Test bTest ist falsch!")
bTest = !bTest
if(bTest)  logInfo("test","Zweiter Test bTest ist wahr!")
if(!bTest) logInfo("test","Zweiter Test bTest ist falsch!")
Was Du allerdings hier durcheinander bringst:
NULL != null (!)
Groß/Kleinschreibung ist wirklich wichtig!
null ist eine ganz bestimmte Adresse im RAM. Wenn eine Variable nicht initialisiert ist, zeigt der Zeiger auf diese Speicherzelle.
NULL ist der Status eines Items, welches noch keinen Wert zugewiesen bekommen hat. Man kann mittels .postUpdate(NULL) einem Item auch gezielt den Status NULL zuweisen, was dann dem Löschen des Status entspricht. Achtung! .postUpdate(NULL) ist etwas anderes als .postUpdate("NULL") (insbesondere, wenn es sich um ein String Item handelt). Und auch .postUpdate("") ist etwas anderes ;)
Thommy2012 hat geschrieben: 2. Jun 2024 22:01 Die Abfrage wird über json gemacht.
Ich nehme mal an, dass das etwas verkürzt ist. Mutmaßlich läuft da das http Binding, welches im Zweifel ein JSON ausliefert, welches Du dann wiederum mit der JSONPATH Transformation in das Item extrahierst?
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

Thommy2012
Beiträge: 92
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: Rule Item.State > Null

Beitrag von Thommy2012 »

Ja genau es ist ein http Binding was mit JSON transformation die Sache dann ausgibt

Vielen Dank für deine vielen Tipps.

Ich werde mal schauen ob ich mir aus den ganzen Informationen was Guten zusammen bauen kann.

udo1toni hat geschrieben: 2. Jun 2024 22:49
Thommy2012 hat geschrieben: 2. Jun 2024 22:03 Verstehe ich das also richtig das das !=null wie ein invertiert funktioniert. Also quasi wenn nicht null ?
Du hast es insofern richtig erkannt, als dass das ! einem logischen NOT entspricht. Aber statt !== zu schreiben, wird das eine = weg gelassen.
Hat man eine Variable vom Typ Boolean, kann man diese auch direkt negieren:

Code: Alles auswählen

var Boolean bTest = true
if(bTest)  logInfo("test","Erster Test bTest ist wahr!")
if(!bTest) logInfo("test","Erster Test bTest ist falsch!")
bTest = !bTest
if(bTest)  logInfo("test","Zweiter Test bTest ist wahr!")
if(!bTest) logInfo("test","Zweiter Test bTest ist falsch!")
Was Du allerdings hier durcheinander bringst:
NULL != null (!)
Groß/Kleinschreibung ist wirklich wichtig!
null ist eine ganz bestimmte Adresse im RAM. Wenn eine Variable nicht initialisiert ist, zeigt der Zeiger auf diese Speicherzelle.
NULL ist der Status eines Items, welches noch keinen Wert zugewiesen bekommen hat. Man kann mittels .postUpdate(NULL) einem Item auch gezielt den Status NULL zuweisen, was dann dem Löschen des Status entspricht. Achtung! .postUpdate(NULL) ist etwas anderes als .postUpdate("NULL") (insbesondere, wenn es sich um ein String Item handelt). Und auch .postUpdate("") ist etwas anderes ;)
Thommy2012 hat geschrieben: 2. Jun 2024 22:01 Die Abfrage wird über json gemacht.
Ich nehme mal an, dass das etwas verkürzt ist. Mutmaßlich läuft da das http Binding, welches im Zweifel ein JSON ausliefert, welches Du dann wiederum mit der JSONPATH Transformation in das Item extrahierst?

Antworten