Hi,
ich versuche, mir bei meinen Zigbee2MQTT-Geräten zusätzlich den aktuellen Online-Status anzeigen zu lassen, analog zu den Tasmota-MQTT2-Templates.
Dazu habe ich in Zigbee2MQTT den availability_timeout gesetzt und bekomme bei den einzelnen Devices jetzt den Status (online/offline) als Reading availability.
So sieht ein Device dann aus:
Internals:
CHANGED
CID Osram_SmartPlug_1
DEF Osram_SmartPlug_1
DEVICETOPIC Osram_SmartPlug_1
FUUID 5c77cdd9-f33f-1aa9-f7de-7506ca5809b49bc0
IODev m2s
LASTInputDev m2s
MSGCNT 1746
NAME Osram_SmartPlug_1
NR 486
STATE on
TYPE MQTT2_DEVICE
m2s_MSGCNT 1746
m2s_TIME 2020-03-27 13:25:10
OLDREADINGS:
2020-03-27 13:25:09 LastMessage Fri Mar 27 13:25:09 2020
READINGS:
2020-03-27 13:25:10 LastMessage Fri Mar 27 13:25:10 2020
2020-03-27 13:25:10 LastOldMessage Fri Mar 27 13:25:09 2020
2019-03-29 10:44:43 associatedWith Zigbee2MQTT
2020-03-27 12:22:34 availability online
2020-03-27 13:25:10 device_dateCode 20140331DEOS****
2020-03-27 13:25:10 device_friendlyName Osram_SmartPlug_1
2020-03-27 13:25:10 device_hardwareVersion 1
2020-03-27 13:25:10 device_ieeeAddr 0x84182600000d36cb
2020-03-27 13:25:10 device_manufacturerID 48042
2020-03-27 13:25:10 device_manufacturerName OSRAM
2020-03-27 13:25:10 device_model AB3257001NJ
2020-03-27 13:25:10 device_networkAddress 9178
2020-03-27 13:25:10 device_powerSource Mains (single phase)
2020-03-27 13:25:10 device_softwareBuildID V1.05.09
2020-03-27 13:25:10 device_type Router
2020-03-27 13:25:10 device_zclVersion 1
2020-03-27 13:25:10 last_seen 2020-03-27T13:25:10+01:00
2020-03-27 13:25:10 linkquality 46
2020-03-27 13:25:10 state ON
2020-03-27 13:25:10 update_available false
Attributes:
DbLogExclude .*
IODev m2s
autocreate 0
devStateIcon online:10px-kreis-gruen offline:10px-kreis-rot off:message_socket_off@black on:message_socket_on2@green set_.*:message_socket_unknown@red
event-on-change-reading state,availability
eventMap { dev=>{ON=>'on',OFF=>'off'} }
group Schalter,Zigbee2MQTT
icon hue_filled_outlet
imageLink /fhem/deviceimages/mqtt2/AB3257001NJ.jpg
model OSRAM Smart+ plug (AB3257001NJ)
oldreadings LastMessage
readingList zigbee2mqtt/Osram_SmartPlug_1:.* { json2nameValue($EVENT) }
zigbee2mqtt/Osram_SmartPlug_1/availability:.* availability
room MQTT2_DEVICE,Zigbee2MQTT
setList on:noArg zigbee2mqtt/Osram_SmartPlug_1/set {"state":"ON"}
off:noArg zigbee2mqtt/Osram_SmartPlug_1/set {"state":"OFF"}
statusRequest:noArg zigbee2mqtt/Osram_SmartPlug_1/get
checkOTA:noArg zigbee2mqtt/bridge/ota_update/check Osram_SmartPlug_1
doOTA:noArg zigbee2mqtt/bridge/ota_update/update Osram_SmartPlug_1
stateFormat availability
state
userReadings LastMessage {localtime},
LastOldMessage {OldReadingsVal($name,"LastMessage","")}
webCmd on:off
Analog zu den MQTT2-Templates habe ich dann devStateIcon und stateFormat gesetzt:
devStateIcon online:10px-kreis-gruen offline:10px-kreis-rot off:message_socket_off@black on:message_socket_on2@green set_.*:message_socket_unknown@red
stateFormat availability
state
Wenn ich jetzt das Device schalte, sehe ich kurz die Anzeige, die ich haben will, danach verschwindet der Kreis für den Status sofort wieder. STATE ist danach auch wieder "on" oder "off", nicht das "online on" oder "online off" wie erwartet.
Nach einigen Suchen hab ich dann festgestellt, dass die eventMap der Verursacher zu sein scheint. Lösche ich diese, bleibt STATE wie erwartet und die Anzeige funktioniert. Dummerweise kann ich dann die Steckdose nicht mehr schalten....
Gibt es eine Möglichkeit, beides zu benutzen?
Gruß,
Michael
Mach es zweizeilig im stateFormat:attr Osram_SmartPlug_1 stateFormat state\
availability
Dann kannst du vermutlich auch auf webCmd verzichten.
Hi,
das ist es schon, kam im list wohl nicht richtig über.
Hier mal die RAW definition:
defmod Osram_SmartPlug_1 MQTT2_DEVICE Osram_SmartPlug_1
attr Osram_SmartPlug_1 DbLogExclude .*
attr Osram_SmartPlug_1 IODev m2s
attr Osram_SmartPlug_1 autocreate 0
attr Osram_SmartPlug_1 devStateIcon online:10px-kreis-gruen offline:10px-kreis-rot off:message_socket_off@black on:message_socket_on2@green set_.*:message_socket_unknown@red
attr Osram_SmartPlug_1 event-on-change-reading state,availability
attr Osram_SmartPlug_1 eventMap { dev=>{ON=>'on',OFF=>'off'} }
attr Osram_SmartPlug_1 group Schalter,Zigbee2MQTT
attr Osram_SmartPlug_1 icon hue_filled_outlet
attr Osram_SmartPlug_1 imageLink /fhem/deviceimages/mqtt2/AB3257001NJ.jpg
attr Osram_SmartPlug_1 model OSRAM Smart+ plug (AB3257001NJ)
attr Osram_SmartPlug_1 oldreadings LastMessage
attr Osram_SmartPlug_1 readingList zigbee2mqtt/Osram_SmartPlug_1:.* { json2nameValue($EVENT) }\
zigbee2mqtt/Osram_SmartPlug_1/availability:.* availability
attr Osram_SmartPlug_1 room MQTT2_DEVICE,Zigbee2MQTT
attr Osram_SmartPlug_1 setList on:noArg zigbee2mqtt/Osram_SmartPlug_1/set {"state":"ON"}\
off:noArg zigbee2mqtt/Osram_SmartPlug_1/set {"state":"OFF"}\
statusRequest:noArg zigbee2mqtt/Osram_SmartPlug_1/get\
checkOTA:noArg zigbee2mqtt/bridge/ota_update/check Osram_SmartPlug_1\
doOTA:noArg zigbee2mqtt/bridge/ota_update/update Osram_SmartPlug_1
attr Osram_SmartPlug_1 stateFormat availability\
state
attr Osram_SmartPlug_1 userReadings LastMessage {localtime},\
LastOldMessage {OldReadingsVal($name,"LastMessage","")}
attr Osram_SmartPlug_1 webCmd on:off
Gruß,
Michael
Ah, sorry, hatte ich übersehen.
Dann 3. Argument für devStateIcon testen:
ZitatdevStateIcon online:10px-kreis-gruen offline:10px-kreis-rot off:message_socket_off@black:on on:message_socket_on2@green:off set_.*:message_socket_unknown@red:toggle
Kein Unterschied.
Beim Schalten ist kurz der Kreis zu sehen, dann wieder nur das Icon. STATE ist auch wieder nur "on" oder "off".
Ich hab mal versucht, die eventMap zu vergrößern ({ dev=>{ON=>'on',OFF=>'off','online ON'=>'online on'}), auch kein Erfolg.
Hmm, eigentlich sollte die eventMap seit einiger Zeit gar nicht erforderlich sein, das kratzt eh' nur ziemlich an der Oberfläche.
Aber wenn im Internal STATE keine zwei Zeilen stehen, sondern nur "on" (bzw. "ON" usw.) kann das nicht klappen. Erst da für saubere Verhältnisse sorgen, der Rest kommt dann erst.