Anfängerfrage zu MQTT_GENERIC_BRIDGE und attr mqttPublish

Begonnen von daubsi, 14 September 2024, 23:43:17

Vorheriges Thema - Nächstes Thema

daubsi

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?


Beta-User

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.
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