Ich beginne gerade die Readings meiner Devices über MQTT zu publishen, um sie in anderen Tools weiter zu verarbeiten.
Ich habe mich bislang nur an Beispielen orientiert und mich entsprechend entlang gehangelt und für die anderen Devices angepasst.
Für meinen Stromzähler habe ich folgendes definiert:
mqttDefaults => base={"rf/esa2000wz"} pub:qos=2 sub:qos=2 retain=0
mqttPublish => status:topic={"$base/$name"} state!json:topic={"$base/status"} state!json:expression={toJSON({actual_ticks=>ReadingsVal($device, "actual_ticks",0)+0,product=>"ESA2000WZ-LED",rate=>ReadingsVal($device, "rate",""),raw=>ReadingsVal($device, "raw",""), raw_total=>ReadingsVal($device, "raw_total", 0)+0, sequence=>ReadingsVal($device, "sequence", 0)+0, ticks=>ReadingsVal($device, "ticks", 0)+0, total=>ReadingsVal($device, "total", 0)+0, total_ticks=>ReadingsVal($device, "total_ticks", 0)+0, actual=>ReadingsVal($device, "actual", 0.0)+0.0, timestamp=>Internals($device, "CUL_0_TIME", "")})}
... bekomme aber beim letzten Attribut timestamp einen Fehler weil es offenbar diese "Funktion" Internals nicht gibt. Wie greife ich denn auf ein Key-Value-Paar aus den Internals eines devices zu?
list ESAx000WZ_4750
Internals:
CODE 4750
CUL_0_MSGCNT 164
CUL_0_RAWMSG S944750011E00140F4D000C165FFF01B3
CUL_0_RSSI -73
CUL_0_TIME 2024-09-14 23:31:27
DEF 4750
FUUID 5d2a1b6c-f33f-97a9-6bb1-1f1c3274ea844be5
IODev CUL_0
LASTInputDev CUL_0
MSGCNT 164
NAME ESAx000WZ_4750
NR 66
STATE CNT: 20- CUM: 34267.502 CUR: 0.636 TICKS: 500 LR
TYPE ESA2000
eventCount 142
READINGS:
2024-09-14 14:10:34 IODev CUL_0
2024-09-14 23:31:27 actual 0.635557331870726
2024-09-14 23:31:27 actual_ticks 12
2024-09-14 23:31:27 battery ok
2024-09-14 23:31:27 day 19.228
2024-09-13 19:58:43 day_hr 10.464
2024-09-14 00:05:07 day_last 15.784
2024-09-14 23:31:27 day_lr 19.228
2024-09-14 23:31:27 diff 0.0240
2024-09-14 23:31:27 diff_sec 135.943675994873
2024-09-14 23:31:27 diff_ticks 12
2024-09-14 23:31:27 hour 0.314
2024-09-14 23:03:35 hour_last 0.584
2024-09-14 23:31:27 last_sec 1726349487.27361
2023-05-07 11:37:50 max 8.80875000845578
2024-09-14 23:31:27 month 1679.67399999999
2024-09-13 19:58:43 month_hr 55.4539999999999
2024-09-08 19:01:28 month_last 660.26799999999
2024-09-14 23:31:27 month_lr 1624.22
2024-09-14 23:31:27 rate LR
2024-09-14 23:31:27 raw CNT: 20- CUM: 1314637 CUR: 12 TICKS: 500 LR
2024-09-14 23:31:27 raw_total 2629.274
2024-09-14 23:31:27 repeat -
2024-09-14 23:31:27 sequence 20
2024-09-14 23:31:27 state CNT: 20- CUM: 34267.502 CUR: 0.636 TICKS: 500 LR
2024-09-14 23:31:27 ticks 500
2024-09-14 23:31:27 total 34267.5020000025
2024-09-14 23:31:27 total_ticks 1314637
2024-09-14 23:31:27 type ESAx000WZ
2024-09-14 23:31:27 year 2458.50799999998
2024-09-13 19:58:43 year_hr 220.264000000002
2024-04-06 22:39:02 year_last 5605.57999999993
2024-09-14 23:31:27 year_lr 2238.24399999999
Attributes:
IODev CUL_0
mqttDefaults base={"rf/esa2000wz"} pub:qos=2 sub:qos=2 retain=0
mqttPublish status:topic={"$base/$name"} state!json:topic={"$base/status"} state!json:expression={toJSON({actual_ticks=>ReadingsVal($device, "actual_ticks",0)+0,product=>"ESA2000WZ-LED",rate=>ReadingsVal($device, "rate",""),raw=>ReadingsVal($device, "raw",""), raw_total=>ReadingsVal($device, "raw_total", 0)+0, sequence=>ReadingsVal($device, "sequence", 0)+0, ticks=>ReadingsVal($device, "ticks", 0)+0, total=>ReadingsVal($device, "total", 0)+0, total_ticks=>ReadingsVal($device, "total_ticks", 0)+0, actual=>ReadingsVal($device, "actual", 0.0)+0.0, timestamp=>Internals($device, "CUL_0_TIME", "")})}
room Cellar
Im Log habe ich diesen Fehler:
2024.09.14 23:23:15 2: MQTT_GENERIC_BRIDGE: [mqttGeneric] error while evaluating expression ('{toJSON({actual_ticks=>ReadingsVal($device, "actual_ticks",0)+0,product=>"ESA2000WZ-LED",rate=>ReadingsVal($device, "rate",""),raw=>ReadingsVal($device, "raw",""), raw_total=>ReadingsVal($device, "raw_total", 0)+0, sequence=>ReadingsVal($device, "sequence", 0)+0, ticks=>ReadingsVal($device, "ticks", 0)+0, total=>ReadingsVal($device, "total", 0)+0, total_ticks=>ReadingsVal($device, "total_ticks", 0)+0, actual=>ReadingsVal($device, "actual", 0.0)+0.0, timestamp=>Internals($device, "CUL_0_TIME", "")})}'') eval error: Undefined subroutine &MQTT::GENERIC_BRIDGE::Internals called at (eval 9679) line 1.
Um ehrlich zu sein ist mir auch nicht klar, was eigentlich diese Definition "mqttPublish => status:topic={"$base/$name"} state!json:topic={"$base/status"} state!json:expression={toJSON({actual_ticks=>ReadingsVal..." bedeuten soll...
Das mit den Readings ist soweit schon klar, aber was bedeutet jeweils:
status:topic={"$base/$name"}
state!json:topic={"$base/status"}
state!json:expression=...
?
Mit was erzeuge ich das "status" topic konkret? Mit der 1. oder der 2. Zeile? Hätte jetzt gesagt, mit der 2. Aber was macht dann die 1. Zeile? Sind "topic" und "expression" attribute des "json" (Objektes?)
Warum steht vor dem '!' das Reading "state", obwohl ich es doch eigentlich gar nicht nutze?
Wo finde ich mehr über die konkrete Syntax dieses Aufrufes?
Zitat von: daubsi am 14 September 2024, 23:43:17... bekomme aber beim letzten Attribut timestamp einen Fehler weil es offenbar diese "Funktion" Internals nicht gibt. Wie greife ich denn auf ein Key-Value-Paar aus den Internals eines devices zu?
InternalVal()
sollte funktionieren. Falls nicht, musst du in den main-namespace verweisen und zwei Doppelpunkte voranstellen.
Zitat von: daubsi am 14 September 2024, 23:43:17Mit was erzeuge ich das "status" topic konkret? Mit der 1. oder der 2. Zeile? Hätte jetzt gesagt, mit der 2. Aber was macht dann die 1. Zeile? Sind "topic" und "expression" attribute des "json" (Objektes?)
Warum steht vor dem '!' das Reading "state", obwohl ich es doch eigentlich gar nicht nutze?
Wo finde ich mehr über die konkrete Syntax dieses Aufrufes?
help MQTT_GENERIC_BRIDGE
Es gibt auch einen (unfertigen) Wiki-Artikel dazu.
Das Thema ist einigermaßen komplex, daher erst mal nur ein paar Kerninfos:
- MGB ist ein eventhandler, daher wird "status" nichts bringen, weil es keine dazu passenden Events gibt (jedenfalls enthält dein list keinen Hinweis darauf).
- MGB ist sehr flexibel in der Konfiguration und arbeitet typischerweise mit defaults und einigen Variablen, die dann erst am Device aufgelöst werden. Von daher ist es in der Regel sinnvoll, eine (für die jeweilige FHEM-Instanz gültige) allgemeingültige Topic-Struktur an der Bridge selbst zu definieren und dann nur die Ausnahmen dazu am einzelnen Device.