Hauptmenü

DOIF aktualisiert state nicht

Begonnen von wertz, 01 Februar 2023, 11:40:45

Vorheriges Thema - Nächstes Thema

wertz

Hallo zusammen,
ich hoffe jemand kann mir bei meinem Problem(chen) helfen.
Ich habe mein Fhem/ftui V3 auf Rpi3 komplett neu aufgesetzt mit aktuellem OS, mosquitto, zigbee2mqtt und wollte nun mit einem DOIF die Devices meiner Fenstersensoren auflisten welche aktuell den state ,,open" haben um somit im ftui dieses anzuzeigen.
In meinem DOIF wird eine Änderung des state der Fenstersensoren nicht aktualisiert.  :(
attr xx do always ist gesetzt.

Wenn ich aber im DOIF auf attr [@":state":state:$_ eq "open","alle OK"] klicke, auch ohne Änderung der Werte, wird der aktuelle Wert der Fenstersensoren angezeigt und auch nur dann.

Ich weiß an dieser Stelle nicht mehr weiter, alles was ich bis hierhin geschafft habe beruht auf lesen, try und error.
Bin halt noch ein blutiger Anfänger
Bestimmt ist es nur eine Kleinigkeit und ich brauche jemanden der mir einen Schubs gibt

An dieser Stelle schon mal vielen Dank für die Unterstützung!

Hier ein List von meinem Fenstersensor

Internals:
   CID        zigbee_pi
   DEF        zigbee_pi
   FUUID      63d7abd5-f33f-94a6-5c59-18b1bf02dd35efbc
   IODev      MQTT2Xiaomi
   LASTInputDev MQTT2Xiaomi
   MQTT2Xiaomi_MSGCNT 15
   MQTT2Xiaomi_TIME 2023-02-01 11:22:20
   MSGCNT     15
   NAME       Test.Sensor.Fenster
   NR         53
   STATE      closed
   TYPE       MQTT2_DEVICE
   eventCount 15
   JSONMAP:
     contact    state
   READINGS:
     2023-02-01 09:56:32   IODev           MQTT2Xiaomi
     2023-01-30 12:37:45   attrTemplateVersion 20220622
     2023-02-01 11:22:20   battery         90
     2023-02-01 11:22:20   linkquality     54
     2023-02-01 11:22:20   power_outage_count 288
     2023-02-01 11:22:20   state           closed
     2023-02-01 11:22:20   voltage         2985
Attributes:
   IODev      MQTT2Xiaomi
   devStateIcon open:fts_window_1w_open@red closed:fts_window_1w@green
   devicetopic zigbee2mqtt/Test.Sensor.Fenster
   jsonMap    contact:state
   model      zigbee2mqtt_ContactSensor
   readingList $DEVICETOPIC:.* { my $ret=json2nameValue($EVENT,'',$JSONMAP); $ret->{state}=$ret->{state} eq 'true' ? 'closed' : 'open'; return $ret }
   room       MQTT2_DEVICE


und hier ein List von meinem DOIF

Internals:
   DEF        ##
   FUUID      63d9b3b3-f33f-94a6-bfc9-7b57a06521218eb0
   MODEL      FHEM
   NAME       windowmonitor
   NOTIFYDEV  global,.*().*
   NR         55
   NTFY_ORDER 50-windowmonitor
   STATE      Test.Sensor.Fenster
   TYPE       DOIF
   VERSION    26938 2023-01-01 18:13:32
   eventCount 1
   READINGS:
     2023-02-01 01:34:59   cmd             0
     2023-02-01 01:34:59   mode            enabled
     2023-02-01 09:57:26   state           Test.Sensor.Fenster
   Regex:
     STATE:
       :
         STATE:
           ":state"   :state
     accu:
     collect:
   condition:
   do:
     0:
   helper:
     NOTIFYDEV  global,.*().*
     event      ATTR windowmonitor state [@":state":state:$_ eq "open","alle OK"]
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev global
     triggerEvents:
       ATTR windowmonitor state [@":state":state:$_ eq "open","alle OK"]
     triggerEventsState:
       ATTR windowmonitor state [@":state":state:$_ eq "open","alle OK"]
   perlblock:
   uiState:
   uiTable:
Attributes:
   do         always
   room       MQTT2_DEVICE
   state      [@":state":state:$_ eq "open","alle OK"]


Grüße und vorab schon mal vielen Dank!!






Damian

Das Wort state kommt bekanntlich nicht im Event vor.

Wahrscheinlich brauchst du das: https://fhem.de/commandref_DE.html#DOIF_addStateEvent
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wertz

Okay,
nach weiterem Lesen sowie try habe ich jetzt noch folgendes im DOIF hinzugefügt


attr readingList openWindowsCount openWindowsState
attr stateFormat openWindowsState (openWindowsCount)

somit habe ich 2 weitere Readings welche mir
- den Status Anzeigt ob alle Fenster geschlossen sind oder 1 bzw. mehrere geöffnet sind.
- die Anzahl der geöffneten Fenster anzeigt
...das funktioniert soweit

dann habe ich noch ein DOIF_Readings hinzugefügt

attr DOIF_Readings windows:[@as( )"Test.Sensor.*":state:"closed","keine"]
welches bewirkt, dass das nächste (s.u.) Reading_Kontakte mit den Werten "keine" bzw. "Devicenamen offener sensoren" angezeigt wird
...aber im diesem DOIF_Reading (windows) bei Statusänderung vom Sensor nichts passiert


zusätzlich habe ich ein userReadings hinzugefügt
attr userReadings Kontakte {(ReadingsVal($name,"windows",""));;}
dieses zeigt mir den Sensor an, welcher den state open" hat.

soweit so gut, jetzt funktioniert die Abfrage und die Anzeige der offenen Fenster.
...dachte ich

Wenn nun ein Sensor über längere Zeit keine Statusänderung hat (Fenster wird nicht geöffnet/geschlossen)
dann sendet der Sensor zyklisch seine werte wie
"battery"
"contact"
"linkquality"
"power_outage_count"
"voltage"

So!
Genau in diesem Moment ändert sich der Eintrag im Reading Kontakt von "Devicenamen offener sensoren" auf "keine" obwohl der Sensor nicht geöffnet/geschlosssen wurde!

Wie bekomme ich das noch hin, dass der Eintrag im Reading Kontakt immer den richtigen Zustand anzeigt??

An dieser Stelle vielen Dank für eure Hilfe



Hier ein list von meinem jetzigen DOIF
Internals:
   DEF        ([#"Test.Sensor.*":state:"open"] > 0) (set $SELF openWindowsCount [#"Test.Sensor.*":state:"open"], set $SELF openWindowsState open ) DOELSE (set $SELF openWindowsCount 0,   set $SELF openWindowsState closed )
   FUUID      63da614b-f33f-94a6-b594-534bfdf6928b7444
   MODEL      FHEM
   NAME       window_Offen
   NOTIFYDEV  .*(Test.Sensor.*).*,global
   NR         57
   NTFY_ORDER 50-window_Offen
   STATE      open (1)
   TYPE       DOIF
   VERSION    26938 2023-01-01 18:13:32
   eventCount 297
   DOIF_Readings:
     windows    ::AggregateDoIf($hash,'@as( )','Test.Sensor.*','state','"closed"','"keine"') 
   READINGS:
     2023-02-01 16:11:32   Device          Test.Sensor.Fenster
     2023-02-01 16:11:32   Kontakte        keine
     2023-02-01 16:11:32   cmd             1
     2023-02-01 16:11:32   cmd_event       Test.Sensor.Fenster
     2023-02-01 16:11:32   cmd_nr          1
     2023-02-01 15:13:40   mode            enabled
     2023-02-01 16:11:32   openWindowsCount 1
     2023-02-01 16:11:32   openWindowsState open
     2023-02-01 16:11:32   state           cmd_1
     2023-02-01 16:11:26   windows         keine
   Regex:
     DOIF_Readings:
       :
         windows:
           "Test.Sensor.*" Test.Sensor.*
       window_Offen:
         windows:
     accu:
     collect:
     cond:
       :
         0:
           "Test.Sensor.*" Test.Sensor.*
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','Test.Sensor.*','state','"open"') > 0
   do:
     0:
       0          set window_Offen openWindowsCount [#"Test.Sensor.*":state:"open"], set window_Offen openWindowsState open
     1:
       0          set window_Offen openWindowsCount 0,   set window_Offen openWindowsState closed
   helper:
     NOTIFYDEV  .*(Test.Sensor.*).*,global
     event      open,voltage: 2985,power_outage_count: 292,battery: 90,linkquality: 24
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Test.Sensor.Fenster
     timerevent open,voltage: 2985,power_outage_count: 292,battery: 90,linkquality: 24
     triggerDev Test.Sensor.Fenster
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: Test.Sensor.Fenster
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Test.Sensor.Fenster
       state: cmd_1
     timerevents:
       open
       voltage: 2985
       power_outage_count: 292
       battery: 90
       linkquality: 24
     timereventsState:
       state: open
       voltage: 2985
       power_outage_count: 292
       battery: 90
       linkquality: 24
     triggerEvents:
       open
       voltage: 2985
       power_outage_count: 292
       battery: 90
       linkquality: 24
     triggerEventsState:
       state: open
       voltage: 2985
       power_outage_count: 292
       battery: 90
       linkquality: 24
   internals:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings windows:[@as( )"Test.Sensor.*":state:"closed","keine"]


   do         always
   readingList openWindowsCount  openWindowsState
   room       neu
   stateFormat openWindowsState (openWindowsCount)
   userReadings Kontakte {(ReadingsVal($name,"windows",""));;}


wertz

Zitat von: Damian am 01 Februar 2023, 16:44:29
Das Wort state kommt bekanntlich nicht im Event vor.

Wahrscheinlich brauchst du das: https://fhem.de/commandref_DE.html#DOIF_addStateEvent

Hallo Damian,
Vielen Dank für deine Antwort, lese ich mir gleich durch  :)