Zigbee Items - mehrfache Statusänderung bei Schaltung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
technick90
Beiträge: 36
Registriert: 24. Jul 2019 16:56
Answers: 1

Zigbee Items - mehrfache Statusänderung bei Schaltung

Beitrag von technick90 »

Hallo,

ich habe ein grundsätzliches Problem, welches sich dann auch auf Regeln auswirkt.

Wenn ich eine meine Zigbee-Steckdosen ein- oder ausschalte, wird der Status mehrfach geändert.
Ist auch egal von welchem Hersteller die Steckdose aus, z. B. OSRAM oder Blitzwolf.

Beispiel einschalten:

Code: Alles auswählen

2024-05-04 14:06:33.794 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' received command ON
2024-05-04 14:06:33.797 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'MQTT_OSRAM_Steckdose_2_Plug' predicted to become ON
2024-05-04 14:06:33.801 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from OFF to ON
2024-05-04 14:06:33.922 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from ON to OFF
2024-05-04 14:06:33.925 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from OFF to ON
Beispiel ausschalten:

Code: Alles auswählen

2024-05-04 14:07:38.679 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' received command OFF
2024-05-04 14:07:38.684 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'MQTT_OSRAM_Steckdose_2_Plug' predicted to become OFF
2024-05-04 14:07:38.688 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from ON to OFF
2024-05-04 14:07:38.760 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from OFF to ON
2024-05-04 14:07:38.762 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MQTT_OSRAM_Steckdose_2_Plug' changed from ON to OFF
Hat jemand eine Idee warum das geschieht bzw. wie ich das verhindern kann?
Angebunden sind die ZigBee Geräte über zigbee2mqtt.

Gruß
Robert

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

Re: Zigbee Items - mehrfache Statusänderung bei Schaltung

Beitrag von udo1toni »

Frage 1: Wie ist der Channel definiert?
Frage 2: Wie ist das Item definiert?
Frage 3: Wie ist/sind die Regel(n) definiert?

Ein Item hat zwei Funktionen, den Status und den Befehl. Die beiden Komponenten haben nicht zwingend etwas miteinander zu tun.
betrachten wir einen Schaltkanal und entsprechend ein Switch Item:
  1. Du betätigst in der UI eine Schaltfläche in einem Widget
  2. Das Widget sendet einen Befehl an das verknüpfte Item
  3. Das Item sendet den Befehl an den verlinkten Channel
  4. Der Channel sendet einen Befehl an das verknüpfte Gerät
  5. Das Gerät schaltet
  6. Das Gerät sendet seinen Status
  7. Der Channel empfängt den Status
  8. Der Channel leitet den Status ans Item weiter
  9. Das Item aktualisiert den Status
  10. Das Widget aktualisiert die Anzeige
Da von 1 bis 10 schon etwas Zeit vergehen kann, versucht openHAB regelhaft, den wahrscheinlichsten neuen Status zu berechnen, der aus dem Befehl resultieren wird und aktualisiert den Status des Items schon mal, noch bevor es überhaupt Kenntnis vom neuen Status hat. Das besagen die Zeilen

Code: Alles auswählen

'MQTT_OSRAM_Steckdose_2_Plug' received command ON
'MQTT_OSRAM_Steckdose_2_Plug' predicted to become ON
'MQTT_OSRAM_Steckdose_2_Plug' changed from OFF to ON
Nun ist es aber durchaus so, dass der Channel eine Status aktiv setzen kann, selbst wenn momentan kein Status aktualisiert wurde. Deshalb kommt vom Channel jetzt

Code: Alles auswählen

'MQTT_OSRAM_Steckdose_2_Plug' changed from ON to OFF
und nachdem der Befehl an das Gerät ging, antwortet das Gerät irgendwann mit dem neuen Status, in der Folge:

Code: Alles auswählen

'MQTT_OSRAM_Steckdose_2_Plug' changed from OFF to ON
Man kann den "Wahrsagermodus" einfach abschalten, das geht im Item über die Metadaten, das Feld heißt autoupdate und Du musst es auf false setzen, damit der Status des Items nicht mehr automatisch von openHAB "erraten" wird.
Wichtig ist natürlich, dass der Status auch sauber vom Gerät gesendet wird :)

Im Zusammenhang mit den Rules kommt es sehr drauf an, wie die Rules getriggert werden, also ob sie auf Befehl oder Status reagieren müssen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

technick90
Beiträge: 36
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Zigbee Items - mehrfache Statusänderung bei Schaltung

Beitrag von technick90 »

Vorweg: Mit autoupdate = false ist der Effekt weg. Vielen Dank.

Zu den Fragen:

1) Channel-Definition:

Code: Alles auswählen

channels:
  - id: plug
    channelTypeUID: mqtt:switch
    label: MQTT_OSRAM_Steckdose_1_Plug
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/Osram_Steckdose_1/set
      stateTopic: zigbee2mqtt/Osram_Steckdose_1
      transformationPattern: JSONPATH:$.state
2) Item-Definition:

Code: Alles auswählen

label: Arbeitszimmer Wandlicht An/Aus
type: Switch
category: ""
groupNames:
  - Licht_Arbeitszimmer
  - Licht
tags:
  - Point
3) Aufgefallen ist es mir der Rule für Betriebsstunden, siehe viewtopic.php?p=57575#p57575.

Code: Alles auswählen

var long dtStart = now.toEpochSecond  

rule "Betriebsstunden Poolpumpe"
  when Item MQTT_OSRAM_Steckdose_2_Plug changed  then                                               
    if (MQTT_OSRAM_Steckdose_2_Plug.state == ON) dtStart = now.toEpochSecond                     
    else if (MQTT_OSRAM_Steckdose_2_Plug.state == OFF) {  
      if(previousState == NULL) return;
      var double dSum = (MyCounter_Poolpumpe.state as QuantityType<?>).doubleValue                                              
      dSum = dSum + ((now.toEpochSecond - dtStart).doubleValue / 3600.0)
      MyCounter_Poolpumpe.postUpdate(dSum)  }    
end
Dadurch bin ich im Log wieder darauf gestoßen. Die berechnete Zeit stimmte nicht.
Habe nun das Item der Steckdose angepasst, dann stimmt auch die Zeit.

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

Re: Zigbee Items - mehrfache Statusänderung bei Schaltung

Beitrag von udo1toni »

:) Prima.

Tipp am Rande: In Rules, die durch changed triggern, stehen die impliziten Variablen newState und previousState zur Verfügung. previousState nutzt Du schon nicht aber newState. Dabei gibt es keinerlei Garantie, dass der Status des Items, welches das changed Ereignis ausgelöst hat, noch den Status hat, der zum Ereignis führte, das ist nur über die implizite Variable sichergestellt.

Also besser so:

Code: Alles auswählen

if(newState == ON) ... else ...
die zweite Bedingung (... == OFF) kannst Du in diesem Fall im Grunde weg lassen, es sei denn, Du setzt den Status des Items irgendwo explizit auf NULL, openHAB wird (von sich aus) nur OFF oder ON als Status setzen.
Die Abfrage der previousState ist natürlich etwas anderes :) die ist wichtig und richtig.

Was die lokalen und globalen Variablen betrifft, ist es noch wichtig, den Unterschied zwischen long und Long (bzw. double und Double) zu kennen. Mit eine Kleinbuchstaben am Anfang werden Primitives definiert, mit einem Großbuchstaben werden Objects definiert. Der Punkt dabei ist, dass openHAB extrem langsam ist, wenn es Primitives verwendet.

Code: Alles auswählen

var Long dtStart = now.toEpochSecond  

rule "Betriebsstunden Poolpumpe"
 when Item MQTT_OSRAM_Steckdose_2_Plug changed then
    if(newState == ON) dtStart = now.toEpochSecond
    else {
        if(previousState == NULL) return;
        var Double dSum = (MyCounter_Poolpumpe.state as QuantityType<?>).doubleValue
        dSum = dSum + ((now.toEpochSecond - dtStart).doubleValue / 3600)
        MyCounter_Poolpumpe.postUpdate(dSum)}
end
Vermutlich wäre es besser, vor der Verwendung von MyCounter_Poolpumpe.state auf eine gültige Zahl zu testen. Wenn der Status keine gültige Zahl liefert, wird das Casting ansonsten zu einer nullPointerException führen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Antworten