Hi,
ich versuche gerade verzweifelt mehreren Devices gleichzeitig ein Stateformat zu verpassen, scheitere aber daran das ich die readings namen nicht greifen kann, da sie am anfang vareieren.
list vom device
Internals:
CID MQTT2_tasmota_ble
DEF MQTT2_tasmota_ble
FUUID 637fd31e-f33f-5aff-ca88-aa3c99df3c01625d
IODev MQTT2_Broker
LASTInputDev MQTT2_Broker
MQTT2_Broker_CONN MQTT2_Broker_192.168.1.181_62163
MQTT2_Broker_MSGCNT 12951
MQTT2_Broker_TIME 2022-12-04 19:20:57
MSGCNT 12951
NAME MI_ATCa78a8d
NR 206
STATE =~ m{.*Battery}x
TYPE MQTT2_DEVICE
eventCount 12951
READINGS:
2022-12-04 19:20:57 ATCa78a8d_Battery 84
2022-12-04 19:20:57 ATCa78a8d_Btn 1
2022-12-04 19:20:57 ATCa78a8d_DewPoint 9.1
2022-12-04 19:20:57 ATCa78a8d_Humidity 47.0
2022-12-04 19:20:57 ATCa78a8d_RSSI -80
2022-12-04 19:20:57 ATCa78a8d_Temperature 20.9
2022-12-04 19:20:57 ATCa78a8d_mac a4c138a78a8d
2022-11-25 19:07:45 IODev MQTT2_Broker
2022-12-04 19:20:57 TempUnit C
2022-12-04 19:20:57 Time 2022-12-04T19:20:57
Attributes:
alias WohnZi_Temp
autocreate 0
group 1_temperaturen
icon mqtt
readingList tele/tasmota_ble/ATCa78a8d:.* { json2nameValue($EVENT) }
room Wohnzimmer
sortby 3
und zwar würde ich gern immer den hinteren teil von z.b. "ATCa78a8d_Temperature" abfragen wollen.
ich weis das ich mal eine anleitung hier gesehen habe wie man wo welche maskierung oder perlcodesyntax verwendet.
aber wie ich auch such ich finds einfach nimmer.
jsonMap würde helfen, einfachere Reading-Namen zu haben.
Mein Testgerät heisst ftuitest und das fragliche Reading ftuitest_temperature.
Folgendes Attribut würde bei jedem gleichgestrickten Gerät funktionieren:
attr ftuitest stateFormat Temperature: {(ReadingsVal("$DEV","$DEV".'_temperature','unbekannt'))} # {(ReadingsVal("$name","$name".'_temperature','unbekannt'))}\
Bei gebräuchlichen MQTT2_DEVICE-Namen würde es aber nicht passen ...
@Beta-User sicherlich die richtigere herangehensweise, aber dazu müsste ich wieder an jeden wert einzeln ein maping dran basteln.
ich habe sinnigerweise, die namen umbenannt (Mi_)(ja ich habs schon bereut) war aber der meinung ich umgehe hiermit eine mögliche verwechsungsgefahr. war doof geb ich zu. werd ich vermutlich rückgänig machen um mit $name weiter arbeiten zu können. und ggf ne schleife schreiben und die über readingsnamen laufen lassen.
@OdfFhem danke für den codeschnipsel, werd ich mal versuchen auf mich umzumünzen, auch wenn das womöglich die "nicht" richtige lösung sein sollte, so komm ich zumindest im "trial and error" wieder besser in den syntax. ich bin ein plasitischer mensch und muß sachen anfassen um sie begreifen zu können. So ein schnipsel hilft mir da ungemein weiter.
Zitat von: DasQ am 05 Dezember 2022, 07:56:24
@Beta-User sicherlich die richtigere herangehensweise, aber dazu müsste ich wieder an jeden wert einzeln ein maping dran basteln.
Moin. Da fällt mir noch ein, dass es hier so ähnlich zu sein scheint wie bei zigbee2tasmota. Da ist es so, dass die eigentlichen Werte in einer Art "innerem JSON" stecken. Dann wäre es möglich, nur diesen inneren JSON an json2nameValue() zu übergeben, und das Umbenennen könnte sich weitgehend erledigt haben bzw. überall gleich laufen. Da sieht das so aus:
attr DEVICE readingList \
TELETOPIC:.* { $EVENT =~ m,^.*(..Device.+)..$, ? json2nameValue($1,'',$JSONMAP) : $EVENT =~ m,0xDEV_ID.:(.*).., ? json2nameValue($1,'',$JSONMAP) : undef }
Wenn ich das richtig verstanden habe, könnte das hier klappen:
tele/tasmota_ble/ATCa78a8d { $EVENT =~ m,ATCa78a8d.:(.*).., ? json2nameValue($1,'',$JSONMAP) : undef }
Danke @OdfFhem mit dem codeschnipsel habe ich nun 10 geräten in einem rutsch das attribut zugewiesen.
zuvor musste ich allerdings wie oben geschrieben, erstmal alles wieder zurück umbennen inkls gplots (dank subline-text in 5 minuten erledigt)(zurück umbennen wegen der systemvariable und weil mich hier im board mal ein schlauer mensch drauf hingewiesen hat ;) )
attr TYPE=MQTT2_DEVICE:FILTER=NAME=ATC.* stateFormat T: {(ReadingsVal("$DEV","$DEV".'_Temperature','unbekannt'))}°, H: {(ReadingsVal("$DEV","$DEV".'_Humidity','unbekannt'))} % <br> Bat: {(ReadingsVal("$DEV","$DEV".'_Battery','unbekannt'))}%, Name $name
(nicht schön, aber selten ::) )
fürs erste ok und langsam kommt auch wieder das syntax verständis
@Beta-User ich werd mich mal an
tele/tasmota_ble/ATCa78a8d { $EVENT =~ m,ATC.:(.*).., ? json2nameValue($1,'',$JSONMAP) : undef }
versuchen, da ja ATC immer gleichbleibend ist. Das mit den punkten und komma raff ich noch nicht so ganz. wo bekommt man denn diese infos kompakt her?
atc1441 (https://github.com/atc1441) ist ja der vater von der ganzen geschichte, drum fangen die thermometer ja auch mit seim nick an. tasmota bastelt das nur mit der MI32Option6 2 (https://tasmota.github.io/docs/Commands/#mi32option) an das topic mit dran und läd es in dem gemeinsamen topiclevel "tasmota_ble" ab. so spar ich mir das nach signalstärke, den aktuellsten wert raus suchen. die landen da einfach alle von allen 3 empfängern.
Zitat von: DasQ am 05 Dezember 2022, 10:48:38
@Beta-User ich werd mich mal an
tele/tasmota_ble/ATCa78a8d { $EVENT =~ m,ATC..*).., ? json2nameValue($1,'',$JSONMAP) : undef }
versuchen, da ja ATC immer gleichbleibend ist. Das mit den punkten und komma raff ich noch nicht so ganz. wo bekommt man denn diese infos kompakt her?
https://regex101.com/ (https://regex101.com/)
Ein Punkt ist ein beliebiges Zeichen. (Hinten also die beiden schließenden Klammern).
Deswegen greift "ATC." m.E. auch zu kurz. Ist vermutlich dann eher "alles bis zum nächsten Doppelpunkt", also so:
tele/tasmota_ble/ATCa78a8d { $EVENT =~ m,ATC[^:]+:(.*).., ? json2nameValue($1,'',$JSONMAP) : undef }
du glaubst garnicht, was ich die seite die letzten tage gequält hab. :o
aber ausser ganz viele hübsche fehlermeldung, in fhem, hab ich nicht hinbekommen. ::)
du meinst den doppelpunkt?
Zitat{"Time":"2022-12-05T11:40:49","ATC595e99":{"mac":"a4c138595e99","Temperature":21.8,"Humidity":47.7,"DewPoint":10.2,"Btn":1,"Battery":98,"RSSI":-87},"TempUnit":"C"}
langsam rieselt es wieder ... mußte mich erstmal wieder an mein MQTT.fx erinnern. (OMG)
OK, wenn der JSON anders aussieht, ist es klar, dass json2NameValue() das nicht mag...
Dann versuchen wir es mal mit "alles bist einschließlich der nächsten schleißenden geschweiften Klammer":
tele/tasmota_ble/ATCa78a8d { $EVENT =~ m,ATC[^:]+:([^}]+[}]).., ? json2nameValue($1,'',$JSONMAP) : undef }
*bussi* :)
da fehlte noch ein :.* aber egal, das war einfach
Internals:
CID MQTT2_tasmota_ble
DEF MQTT2_tasmota_ble
FUUID 63805ac8-f33f-5aff-c37b-5bc59de37b653017
IODev MQTT2_Broker
LASTInputDev MQTT2_Broker
MQTT2_Broker_CONN MQTT2_Broker_192.168.1.181_62165
MQTT2_Broker_MSGCNT 33
MQTT2_Broker_TIME 2022-12-05 12:25:59
MSGCNT 33
NAME ATC364197
NR 235
STATE T: 20.2°, H: 50.8 % <br> Bat: 87%, Name ATC364197
TYPE MQTT2_DEVICE
eventCount 33
READINGS:
2022-12-05 12:15:59 ATC364197_Battery 87
2022-12-05 12:15:59 ATC364197_Btn 1
2022-12-05 12:15:59 ATC364197_DewPoint 9.6
2022-12-05 12:15:59 ATC364197_Humidity 50.8
2022-12-05 12:15:59 ATC364197_RSSI -93
2022-12-05 12:15:59 ATC364197_Temperature 20.2
2022-12-05 12:15:59 ATC364197_mac a4c138364197
2022-12-05 12:25:59 Battery 87
2022-12-05 12:25:59 Btn 1
2022-12-05 12:25:59 DewPoint 9.5
2022-12-05 12:25:59 Humidity 50.2
2022-12-05 10:04:36 IODev MQTT2_Broker
2022-12-05 12:25:59 RSSI -85
2022-12-05 12:15:59 TempUnit C
2022-12-05 12:25:59 Temperature 20.2
2022-12-05 12:15:59 Time 2022-12-05T12:15:58
2022-12-05 12:25:59 mac a4c138364197
Attributes:
alias LukasZi_Temp
group 1_temperaturen
icon mqtt
readingList tele/tasmota_ble/ATC364197:.* { $EVENT =~ m,ATC[^:]+:([^}]+[}]).., ? json2nameValue($1,'',$JSONMAP) : undef }
room Lukas
sortby 2
stateFormat T: {(ReadingsVal("$DEV","$DEV".'_Temperature','unbekannt'))}°, H: {(ReadingsVal("$DEV","$DEV".'_Humidity','unbekannt'))} % <br> Bat: {(ReadingsVal("$DEV","$DEV".'_Battery','unbekannt'))}%, Name $name
vielen lieben dank, jetzt kann ich das stateformat und die readingsgroup doch noch etwas aufhübschen.
Jetzt kannst du das noch mit jsonMap auf Kleinschreibung, batteryPercent (?) etc. umstellen ;) . Dann ist es "standardkonform" 8) .