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!!
Das Wort state kommt bekanntlich nicht im Event vor.
Wahrscheinlich brauchst du das: https://fhem.de/commandref_DE.html#DOIF_addStateEvent
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",""));;}
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 :)