Blocky: Vergleich vom Status 2er Items

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
TheDallas
Beiträge: 7
Registriert: 28. Mär 2024 23:05
Answers: 0

Blocky: Vergleich vom Status 2er Items

Beitrag von TheDallas »

Hi zusammen !

Da ist vermutlich total einfach, aber ich blicke das gerade nicht...

Ich habe 2 Items. Beide Point, beide String, beide mit identischen CommandOptionen.

Wenn in beiden der Status unterschiedlich ist, dann schreibe ich per Send Command den Status vom einen in das andere Item.
Das klappt auch alles.
Man sieht also sofort, das das Item 2 den Wert von 1 annimmt.

Wenn ich nun Item 1 nochmal mit dem gleichen Wert durchlaufe soll im Skript nichts passieren.

Das Script wird sowohl per Schalter als auch per Cron durchlaufen. Über die Schalter kann ich manuell AN und AUS ober eben auf Automatik schalten.
Heißt, 1x an, dann immer an, 1x aus, dann immer aus, oder Automatik an, dann entscheiden das Script per Cron ob an oder aus.
Das klappt soweit alles, aber:

Wenn ich nun sowas mache wie IF getstate item 1 = getstate item 2 (also in Blocky), dann sind diese beiden Items nie gleich (obwohl im vorherigen Lauf ja schon beide gleichgezogen wurden.

Ich habe auch schon den einen oder den anderen ober beide in einer Variable zwischengeparkt, aber das ändert nichts am Ergebnis.
Also beiden ITEMS haben den Wert OFF , aber der IF wird nie durchlaufen. Ich lande immer im ELSE Zweig. Hat jemand da einen Tipp wo mein Denkfehler ist ?

Herzlichen Dank

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

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von udo1toni »

Bitte poste die Code Ansicht Deiner Rule (als Code markiert), denn Diene Beschreibung ist nicht hinreichend, um den Fehler zu identifizieren.

Grundsätzlich nehme ich an, dass es sich dabei auch um ein xy Problem handeln könnte (Du fragst nach x, sinnvoller wäre aber die Frage nach y, um das Problem zu lösen)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

TheDallas
Beiträge: 7
Registriert: 28. Mär 2024 23:05
Answers: 0

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von TheDallas »

Hallo und Sorry, das ich mich nicht gemeldet habe. Ich war unterwegs .
Das Skript ist zu groß, daher hier die Kurzform, die aber das gleiche Problem hat (bzw. ich das gleiche Problem habe :D )
Sachverhalt:
Ich möchte erkennen ob die Schaltstellung des Schalters sich tatsächlich ändern. Wenn also jemand 2x auf ON klickt, ändert sich NICHTS an der Einstellung, dann muss ich auch nicht meine Änderungsskripte durchlaufen.
Das Script läuft nämlich sowohl manuell per Schalter (Web) und 433MHZ Fernbedienung (schaltet den gleichen Schalter) und ( weil ja Automatik) eben auch per Cron.

Ich habe also 2 Items.
Das eine ist der Schalter selbst und das andere ist der letzte Status. Beide sind String und beide haben 3 Commandoptions.
AUTO
ON und
OFF.

Wenn der Schalter schaltet, dann wird das Blocky aufgerufen:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: DerSchalterSchaltet
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      considerConditions: true
      ruleUIDs:
        - 88fe491395
    type: core.RunRuleAction
Das Blocky soll nun erkennen, ob sich der Schaltzustand verändert hat oder nicht:

Code: Alles auswählen

var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);


if (itemRegistry.getItem('DerSchalterSchaltet').getState() == itemRegistry.getItem('DerletzteStatus').getState()) {
  logger.error('Hat sich nicht verändert.');
} else {
  logger.error('Hat sich verändert, also wieder gleichschalten.');
  events.sendCommand('DerletzteStatus', itemRegistry.getItem('DerSchalterSchaltet').getState());
}
Das ist eigentlich alles:

Wenn ich nun den Schalter von AUTO auf ON schalte, dann sind die nicht gleich und er übergibt den Status im ELSE vom Schalter zum letzten Status.
Genau was ich will.

Nun klicke ich am Schalter wieder auf ON . Also ON war es und ON bleibt es.
Also eigentlich keine Änderung (da wird eine sein, aber ich erkenne eben nicht, was OH da jetzt macht).
Erwartet hab ich eine Reaktion im IF, da vorher und nachher beide ON.
OH sieht das anders und erkenn eine Änderung und läuft fröhlich wieder in den ELSE.

Hier mal die Ausgabe:

Einmal von AUTO auf ON.

Code: Alles auswählen

17:43:59.639 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'DerSchalterSchaltet' received command ON
17:43:59.641 [ERROR] [org.openhab.rule.88fe491395          ] - Hat sich verändert, also wieder gleichschalten.
17:43:59.707 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'DerSchalterSchaltet' changed from AUTO to ON
17:43:59.724 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'DerletzteStatus' received command ON
und jetzt einfach nochmal den gleichen Schalter wieder auf ON:

Code: Alles auswählen

17:45:15.380 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'DerSchalterSchaltet' received command ON
17:45:15.381 [ERROR] [org.openhab.rule.88fe491395          ] - Hat sich verändert, also wieder gleichschalten.
17:45:15.440 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'DerletzteStatus' received command ON
Jetzt bin ich verwirrt. Es war on, ist blieb on und trotzdem sagt es, es wäre eine Veränderung eingetreten.
Das OH Status und Commando unterscheidet hab ich mal gelesen und vermute es hat irgendwas damit zu tun, das er ja eigentlich ein Kommando ausführt und das ist eben kein Status. Jedenfalls versuche ich mir das so zu erklären.
Ich habe auch schon mit der RULE (also dem Auslöser des Blockys) versucht zu spielen, aber es ist mir nicht so richtig gelungen, das das Blocky nur dann läuft, wenn sich der tatsächliche Wert des Schalter ändert. Ich denke, mit dem X/Y Problem liegst Du nicht falsch. Das was ich da habe, wirkt auf mich selbst ja auch wie ein Workaround, aber wie geht das "richtig" ?

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

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von udo1toni »

Wir sind immer noch bei x-y.
Du hast einen Schalter und eine Cron Rule. Was macht der Schalter? Was macht die Cron Rule?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

TheDallas
Beiträge: 7
Registriert: 28. Mär 2024 23:05
Answers: 0

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von TheDallas »

Der Schalter schaltet 3 Betriebszustände. AUTO, ON und OFF.
ON und OFF schalten die Automatik aus und aktivieren die Kameras bzw. schalten diese ab.
Der Cron ist die Automatik. Die Bedingungen für das Ein- oder Ausschalten werden in diesem Skript geprüft, aber nur bei AUTO überhaupt
durchlaufen. Bei ON oder OFF wird eben nur geprüft, was der Status der Kamera aktuell ist (das wird von Skript geschaltet) und dann entsprechend umgeschaltet, wenn das erforderlich ist. Die Routinen der Automatik werden dann nicht durchlaufen (weil die ja sonst die manuelle Funktion übersteuert, was nicht gewünscht ist).

Was eben nicht so richtig funktioniert ist, das ich eben das Skript gar nicht anstarten will, wenn sich sowieso am Betriebsmodus nicht geändert hat.
Also ON bleibt ON , oder AUTO bleibt AUTO. Das mag jetzt für das Skript nicht sooo wichtig sein (geht ja irgendwie auch so), aber es nervt mich halt, das ich nicht verstehe wieso ein simpler Vergleich von 2 Werten (die sogar die gleiche Quelle haben) doch nicht als gleich identifiziert wird.

Harka
Beiträge: 311
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von Harka »

Moin,
sind die Strings wirklich gleich? Ich frage, weil im anderem Beitrag ein Status gemappt wurde oder theoretisch noch ein Leerzeichen zu Fehlinterpretation führen kann. Ich würde daher mal den Status der Schalter im Log ausgeben. Im Beispiel die Bewegungsschalter durch Deine Sting-Items ersetzen.
ForomSchalterVergleich.png
Geh aber bitte auch auf Udos Bedenken ein. Das geht bestimmt auch einfacher.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Blocky: Vergleich vom Status 2er Items

Beitrag von udo1toni »

Mein Tipp an der Stelle wäre, statt String Items lieber Number Items zu verwenden. Genauer, Number Items, welche als Status einen von drei Zahlen annehmen. Zahlen sind leichter (fehlerfrei) miteinander zu vergleichen. Für die Schaltflächen oder Statusanzeige muss dass keinen Unterschied machen, das kann man einfach mappen.
TheDallas hat geschrieben: 7. Apr 2024 17:56 Wenn also jemand 2x auf ON klickt, ändert sich NICHTS an der Einstellung, dann muss ich auch nicht meine Änderungsskripte durchlaufen.
Man kann Rules verschieden triggern lassen, bei statusbezogenen Triggern entweder received update (triggert bei jeder Aktualisierung, gleich ob sich dadurch eine Änderung ergibt oder nicht) oder changed (triggert nur, wenn sich durch ein Update eine Statusänderung ergibt).
Wenn eine Rule also nur bei einer Statusänderung auslösen soll, wäre es am sinnvollsten, die Rule auf changed triggern zu lassen.

received command wiederum löst bei Befehlen aus, entweder über sendCommand() oder über die UI ausgelöst. Von externen Quellen hingegen kommen gewöhnlich keine Befehle.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten