[gelöst] Weshalb greift jsonMap nicht ?

Begonnen von TomLee, 30 November 2020, 16:16:20

Vorheriges Thema - Nächstes Thema

Beta-User

OK, jetzt habe ich das auch mal nachgestelt (Danke für die json).

fhem.pl mag die Modifikation desselben Readings in userReadings nicht, also braucht man zwei Readings, wenn man das so machen will :( . Unschön...

Dann also so?
#by TomLee, https://forum.fhem.de/index.php/topic,116310.msg1105927.html#msg1105927
name:zigbee2mqtt_human_body_movement
desc: Human motion sensor via zigbee2mqtt <br>Tested with: Xiaomi MiJia human RTCGQ01LM body movement sensor (occupancy)
filter:TYPE=MQTT2_DEVICE:FILTER=CID~zigbee.*
order:L_08
set DEVICE attrTemplate zigbee2mqtt_human_body_movement_illuminance
attr DEVICE jsonMap battery:batteryPercent battery:batterymV
attr DEVICE stateFormat Motion: occupancy\
Battery: batteryPercent%
attr DEVICE model zigbee2mqtt_human_body_movement
setreading DEVICE attrTemplateVersion 20201203

#source post: https://forum.fhem.de/index.php/topic,94495.msg898198.html#msg898198, addon by TomLee, https://forum.fhem.de/index.php/topic,116310.msg1105927.html#msg1105927
name:zigbee2mqtt_human_body_movement_illuminance
desc: Human motion sensor with illumiuance measurement via zigbee2mqtt <br>Tested with: Xiaomi Aqara RTCGQ11LM Human Motion Sensor
filter:TYPE=MQTT2_DEVICE:FILTER=CID~zigbee.*
order:L_08a
par:BASE_TOPIC;base topic set in configuration.yaml of the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
par:DEV_ID;name of the device in the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[^/]+[/]([^/:]+).*, ? $1 : undef }
par:ICON;ICON as set, defaults to people_sensor;{ AttrVal("DEVICE","icon","people_sensor") }
attr DEVICE icon ICON
attr DEVICE devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr DEVICE devicetopic BASE_TOPIC/DEV_ID
attr DEVICE jsonMap battery:batteryPercent battery:batteryVoltage illuminance_lux:0
attr DEVICE stateFormat Motion: occupancy\
Luminance: illuminance Battery: batteryPercent%
attr DEVICE readingList $\DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE model zigbee2mqtt_human_body_movement_illuminance
setreading DEVICE attrTemplateVersion 20201203
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Zitatfhem.pl mag die Modifikation desselben Readings in userReadings nicht, also braucht man zwei Readings, wenn man das so machen will :( . Unschön...
Oder https://fhem.de/commandref_modular.html#readingsChange

Beta-User

Zitat von: rudolfkoenig am 03 Dezember 2020, 12:10:43
Oder https://fhem.de/commandref_modular.html#readingsChange
:)
Eigentlich hätte "man" es wissen können, dass du schon weiter gedacht hattest und es auch eine Lösung für dieses Problem gibt :o ::) .

Habe mal eine ersten Schnelltest mit den Topc/JSON-Strukturen von hier gemacht, aber offenbar irgendwas übersehen (da sind noch Konfigurationsreste von der userReadings-Konstruktion drin, aber das sollte eigentlich keinen Einfluss haben, voltage kommt ungefiltert und ohne weitere Berechnung durch):

defmod mVtoV readingsChange MQTT2_zigbee_0x00158d00031c22fa voltage ([0-9]+) {sprintf("%0.2f", ($1/1000))}

defmod MQTT2_zigbee_0x00158d00031c22fa MQTT2_DEVICE zigbee_0x00158d00031c22fa
attr MQTT2_zigbee_0x00158d00031c22fa IODev m2server
attr MQTT2_zigbee_0x00158d00031c22fa devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr MQTT2_zigbee_0x00158d00031c22fa devicetopic zigbee2mqtt/0x00158d00031c22fa
attr MQTT2_zigbee_0x00158d00031c22fa icon people_sensor
attr MQTT2_zigbee_0x00158d00031c22fa jsonMap battery:batteryPercent illuminance_lux:0
attr MQTT2_zigbee_0x00158d00031c22fa model zigbee2mqtt_human_body_movement_illuminance
attr MQTT2_zigbee_0x00158d00031c22fa readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_zigbee_0x00158d00031c22fa room MQTT2_DEVICE
attr MQTT2_zigbee_0x00158d00031c22fa stateFormat Motion: occupancy\
Luminance: illuminance Battery: batteryPercent%
attr MQTT2_zigbee_0x00158d00031c22fa userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}


Für das publishen:

defmod m2server MQTT2_SERVER 1883 global
attr m2server rePublish 1

setstate m2server 2020-12-03 12:41:06 lastPublish zigbee2mqtt/0x00158d00031c22fa:{"battery":97,"illuminance":0,"illuminance_lux":0,"linkquality":0,"occupancy":true,"voltage":2096}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Mihca

Auf Hinweis von Beta-User hier ein paar Anmerkungen:

Zitat von: Beta-User am 02 Dezember 2020, 08:55:26
https://forum.fhem.de/index.php/topic,116310.msg1106143.html#msg1106143

Ich habe kürzlich eine Sonoff-ZigBee-Bridge mit Tasmota geflasht und einen SONOFF SNZB-02 Temperatur-Feuchtigkeit Sensor angebunden. Mit dem Template "tasmota_zigbee2tasmota_generic_battery_sensor" fehlte dann noch das Reading "batteryLevel" (wie bei HomeMatic). Das habe ich gelöst, indem ich im Attribut "jsonMap" das "BatteryVoltage:batteryLevel" ergänzt habe. Das Reading kommt in Volt.

Da der Empfang über die Sonoff-Bridge instabil war, habe ich den Sensor an einen ConBee II gekoppelt. Die Daten kommen stabil alle 5 Min. Allerdings fehlt das Reading "batteryLevel". Das habe ich nun über ein "userReading" "batteryLevel:batteryPercent.* {sprintf("%.1f",(ReadingsNum($name,"batteryPercent",3)/100*0.55+2.5))}" ergänzt (Annahme: 0%=2.5V, 100% =3.05V). Unschön an den Readings ist, dass das Reading "battery" denselben Prozentsatz wie "batteryPercent" anzeigt, und nicht wie bei HomeMatic "ok" oder "low". Da das Reading immer gleichzeitig mit "batteryPercent" geändert wird, macht es auch keinen Sinn es zu überschreiben. Wäre gut, da nochmal Hand anzulegen,

VG Achim
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

Beta-User

ConBee II bedeutet: Du sprichst über ein HUEDevice?

Tendenziell würde ich dazu neigen, keine Readings (rechnerisch) zu erfinden, und schon gleich nicht unter "falschem" Namen (batteryVoltage wäre der aktuelle "Vorschlag" aus dem Developer guide, den "veralteten" Namen aus CUL_HM sollte man m.E. als "alten Zopf" abschneiden...). Was "battery" angeht, würde ich dazu neigen, hier dem Hinweis von Rudi in Richtung readingsChange zu folgen und aus dem doppelten Prozentwert dann ein "ok" oder "low" zu generieren. Leider waren meine ersten eigenen Versuche (mit der Umrechnung) da irgendwie nicht zielführend, bestimmt habe ich mal wieder irgendeine Kleinigkeit übersehen ::) .

Würde aber vorschlagen, das Thema (sofern es HUEDevice betrifft) dann an anderer Stelle weiter zu vertiefen, für MQTT2_DEVICE aus zigbee2mqtt habe ich erst mal das Ummappen nach batterymV + userReading-Umrechnung nach batteryVoltage in der attrTemplate-File drin.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Hab mir heute erst angeschaut was jetzt im SVN ist, ergibt:

defmod test1 MQTT2_DEVICE zigbee_0x00158d00032c6d54
attr test1 IODev MQTT2_Server
attr test1 devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr test1 devicetopic zigbee2mqtt/0x00158d00032c6d54
attr test1 icon people_sensor
attr test1 imageLink /fhem/deviceimages/mqtt2/RTCGQ01LM.jpg
attr test1 jsonMap battery:batteryPercent battery:batterymV
attr test1 model zigbee2mqtt_human_body_movement
attr test1 readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr test1 room MQTT2_DEVICE
attr test1 stateFormat Motion: occupancy\
Battery: batteryPercent%
attr test1 userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate test1 Motion: false\
Battery: batteryPercent%
setstate test1 2020-12-08 18:55:44 batteryVoltage 0.086
setstate test1 2020-12-08 18:55:44 batterymV 86
setstate test1 2020-12-08 18:55:44 linkquality 47
setstate test1 2020-12-08 18:55:44 occupancy false
setstate test1 2020-12-08 18:55:44 voltage 2975



defmod bliblablub MQTT2_DEVICE zigbee_0x00158d000302cc1e
attr bliblablub IODev MQTT2_Server
attr bliblablub devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr bliblablub devicetopic zigbee2mqtt/0x00158d000302cc1e
attr bliblablub group Wohnzimmer
attr bliblablub icon people_sensor
attr bliblablub jsonMap battery:batteryPercent battery:batteryVoltage illuminance_lux:0
attr bliblablub model zigbee2mqtt_human_body_movement_illuminance
attr bliblablub readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr bliblablub room MQTT2_DEVICE,Rollladen
attr bliblablub stateFormat Motion: occupancy\
Luminance: illuminance Battery: batteryPercent%
attr bliblablub userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate bliblablub Motion: false\
Luminance: 0 Battery: batteryPercent%
setstate bliblablub 2020-12-08 18:58:05 attrTemplateVersion 20201203
setstate bliblablub 2020-12-08 18:59:54 batteryVoltage 91
setstate bliblablub 2020-12-08 18:59:54 illuminance 0
setstate bliblablub 2020-12-08 18:59:54 linkquality 15
setstate bliblablub 2020-12-08 18:59:54 occupancy false
setstate bliblablub 2020-12-08 18:59:54 voltage 2985


Ganz ehrlich, komm nicht mit.
War es vielleicht so gemeint, das es dann halt erstmal zwei "Voltage"-Readings gibt ?

defmod test1 MQTT2_DEVICE zigbee_0x00158d00032c6d54
attr test1 IODev MQTT2_Server
attr test1 devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr test1 devicetopic zigbee2mqtt/0x00158d00032c6d54
attr test1 icon people_sensor
attr test1 imageLink /fhem/deviceimages/mqtt2/RTCGQ01LM.jpg
attr test1 jsonMap battery:batteryPercent voltage:batterymV
attr test1 model zigbee2mqtt_human_body_movement
attr test1 readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr test1 room MQTT2_DEVICE
attr test1 stateFormat Motion: occupancy\
Battery: batteryPercent%
attr test1 userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate test1 Motion: false\
Battery: 86%
setstate test1 2020-12-08 18:50:55 batteryPercent 86
setstate test1 2020-12-08 18:50:55 batteryVoltage 2.975
setstate test1 2020-12-08 18:50:55 batterymV 2975
setstate test1 2020-12-08 18:50:55 linkquality 49
setstate test1 2020-12-08 18:50:55 occupancy false



defmod bliblablub MQTT2_DEVICE zigbee_0x00158d000302cc1e
attr bliblablub IODev MQTT2_Server
attr bliblablub devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr bliblablub devicetopic zigbee2mqtt/0x00158d000302cc1e
attr bliblablub group Wohnzimmer
attr bliblablub icon people_sensor
attr bliblablub jsonMap battery:batteryPercent voltage:batterymV illuminance_lux:0
attr bliblablub model zigbee2mqtt_human_body_movement_illuminance
attr bliblablub readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr bliblablub room MQTT2_DEVICE,Rollladen
attr bliblablub stateFormat Motion: occupancy\
Luminance: illuminance Battery: batteryPercent%
attr bliblablub userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate bliblablub Motion: false\
Luminance: 0 Battery: 91%
setstate bliblablub 2020-12-08 18:50:29 batteryPercent 91
setstate bliblablub 2020-12-08 18:50:29 batteryVoltage 2.985
setstate bliblablub 2020-12-08 18:50:29 batterymV 2985
setstate bliblablub 2020-12-08 18:50:29 illuminance 0
setstate bliblablub 2020-12-08 18:50:29 linkquality 15
setstate bliblablub 2020-12-08 18:50:29 occupancy false

Beta-User

Mist, da habe ich in der Tat was durcheinandergewürfelt, update folgt...

Es sollten jetzt zwei Voltage-Readings vorhanden sein, das mit readingsChange wollte - jedenfalls auf die Schnelle - nicht so richtig.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Ich mein es gibt keinen Cube-Template-Thread darum kurz hier.

Das zigbee2mqtt_aqara_cube-Template müsste dann genauso ergänzt werden ist mir heute aufgefallen.

Zitatname:zigbee2mqtt_aqara_cube
desc: Aqara smarthome cube via zigbee2mqtt <br>Tested with: Xiaomi Aqara MFKZQ01LM smarthome cube
filter:TYPE=MQTT2_DEVICE:FILTER=CID~zigbee.*
order:L_14
par:BASE_TOPIC;base topic set in configuration.yaml of the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
par:DEV_ID;name of the device in the zigbee2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[^/]+[/]([^/:]+).*, ? $1 : undef }
attr DEVICE stateFormat Action: action
attr DEVICE devicetopic BASE_TOPIC/DEV_ID
attr DEVICE readingList $\DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE jsonMap battery:batteryPercent voltage:batterymV
attr DEVICE userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

deletereading -q DEVICE (?!associatedWith).*
attr DEVICE model zigbee2mqtt_aqara_cube
setreading DEVICE attrTemplateVersion 20200904




Beta-User

Danke für den input, ist drin.

Vermutlich sollte "jemand" mal die ganzen z2m-Dinger durchgehen, gibt bestimmt noch mehr ("jemand"=jemand, der wenigstens einen Teil der Geräte mit z2m am laufen hat...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Mir fällt gerade was auf und ich frage mich jetzt ob es sinnvoll wäre mit den Templates (zigbee2mqtt_human_body_movement occupancy+zigbee2mqtt_human_body_movement_illuminance) occupancy zusätzlich in state darzustellen ?

Beta-User

Prinzipiell spricht "nur" dagegen, dass man a) eine Doppelung hat und b) dazu ein userReading setzen müßte, wenn man nicht schlicht statt "occupancy" "state" als Reading füllen würde (was via jsonMap ja ginge).

Tendenziell würde ich es lassen, wie es ist, und lieber im Wiki ((unfunktionaler, aber richtiger) link kann nach comment?) darstellen, wie man z.B. ein userReadings dafür baut, um dann in "state" ein ("FHEM-typisches"?!?) "motion" bzw. "nomotion" zu basteln...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files