Großartig erklärt: MQTT / Tasmota Sensor Daten String auswerten

Begonnen von dougie, 04 Januar 2021, 07:16:34

Vorheriges Thema - Nächstes Thema

dougie


Moin  zusammen,

tut mir leid wenn ich jetzt nerven muss, aber die Frage ist leider etwas speziell.
Ich verwende fhem seit bestimmt 7 Jahren oder so, und die Hausinstallation ist seinerzeit ständig gewachsen.
Leider wurden seinerzeit noch öfters Dinge in der fhem Syntax geändert, so dass ich irgendwann aus dem Update Zyklus aussteigen musste, um zu Hause niemanden weiter zu ärgern. Daher: meine fhem Version ist von 2015 (sorry for that)

Zum Thema: ich hab die Weihnachtstage genutzt und mal ein paar Gosund 112 3.4 Steckdosen mit Tasmota geflashed, mosquitto installiert und ein MQTT_Device angelegt. Funktioniert auch soweit prima.

Frage: ich habe ein "Sensor" Reading vom Device und möchte daraus den "Power" Wert in z.B. ein userreading auslesen.


Readings...
Sensor {"Time":"2021-01-04T07:08:20","ENERGY":{"TotalStartTime":"2021-01-02T16:56:00","Total":0.077,"Yesterday":0.045,"Today":0.003,"Period":0,"Power":0,"ApparentPower":0,"ReactivePower":0,"Factor":0.00,"Voltage":0,"Current":0.000}}


JSon hab ich in meiner 2015er Installation nicht und upgraden würde vermutlich eine Woche Arbeit bedeuten.
Gibt es eine einfachere Lösung für die Frage?

VG
Ralf

Beta-User

Mittelfristig wird es vermutlich einfacher (und zeitsparender), FHEM mal auf den aktuellen Stand zu bringen und z.B. die aktuellen MQTT2_.*-Module zu nutzen statt diesen Oldtimer zu warten und immer weiter spezielle Lösungen ranzubasteln...
Auch das OS dürfte zwischenzeitlich nicht mehr sicher sein, und ein backup hast du hoffentlich, v.a. aber nicht nur wg. des SD-Karten-Themas?!?

Hier mal ein Vorschlag für ein userReadings (falls es "damals" schon trigger gab...):
userReadings Power:Sensor.* { my $strg = ReadingsVal($name,'Sensor',''); $strg =~ m,"Power":([0-9.]+), ? $1 : undef }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

dougie

#2

Uaaaa, grossartig! Vielen Dank, probiert ich gleich aus! Held der RegExps...

Und wegen des eigentlich fälligen Updates.... du weisst doch: nichts ist beständiger wie Provisorien!  ;-)

Der ganze Home-Server (inkl. fhem) läuft seit Jahren auf nem alten Lenovo L430 Laptop mit i5
Letztes Jahr hab ich dem noch ne SSD spendiert, weil ich auch Angst hatte das ich im Kalten sitze, wenn das Ding mal die Biege macht.

Meine 99_MyUtils.pm ist gefühlt einen Kilometer lang, und nachdem Dr. Rudi seinerzeit die Syntax von irgend welchen Befehlen geändert hatte, wollte ich nicht alles neu schreiben.

Vielleicht muss ich da doch noch mal dran.


Edit: ... Funktioniert Super!!! Dankeschön noch mal! :-)

Wenn du Langeweile hast, kannst du mir ja noch kurz erklären, was das RegExp macht.... ich steig noch nicht ganz durch...

Beta-User

#3
Gerne, v.a. für einen weiteren Freund alter Hardware statt Pi :) .

Das mit den myUtils ist sicher ein Thema, aber Rom wurde ja auch nicht an einem Tag gebaut, und ggf. ist es auch mal Zeit für eine grundlegende Renovierung ;) , jeder Kilometer beginnt eben beim ersten Schritt, und manchmal ist es ganz sinnvoll mal nachzusehen, was man alles generalisieren kann (also v.a. ohne Devicenamen in den eigentlichen Routinen auskommt)...

(Habe auch ein paar Durchläufe gemacht und die meisten Routinen jetzt so geschrieben, dass sie für verschiedene Einsatzzwecke bzw. Start- und Zieldevices passen).

Falls du irgendeine Zwischenversion nutzt, die beide Versionen von Befehlen "kann", kannst du ja erst mal die Syntax aktualisieren (und z.B. mit mehreren myUtils-Files arbeiten, dann siehst du auch schneller, wie weit du schon bist (oder eben auch nicht)).

Zitat von: dougie am 04 Januar 2021, 14:26:42
kannst du mir ja noch kurz erklären, was das RegExp macht.... ich steig noch nicht ganz durch...
Die regex sucht nach dem String '"Power":', gefolgt von beliebig vielen Zahlen und Punkten ('[0-9.]'). Was in Klammern steht, findet sich hinterher in $1. Gibt es das, wird eben $1 zurückgegeben, gibt es das nicht, wird "nichts" (undef) zurückgeliefert, also auch das Reading nicht angelegt oder aktualisiert (nnn ? nn : mm nennt sich "ternärer Operator").
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

dougie

#4

....ich denke mal laut nach:


my $strg = ReadingsVal($name,'Sensor','')

Hier wird der gesamte String vom Sensor Reading in $strg kopiert

$strg =~ m,"Power":([0-9.]+)


m, -> wir suchen den matching String "Power":

([0-9.]+) -> ... und die folgenden Zahlen (+ -> eine oder mehrere)

? -> keine Ahnung

$1 -> keine Ahnung

: undef -> keine Ahnung





Beta-User

Sorry, hatte deinen Edit zu spät gesehen, und du jetzt wohl meinen ebenso:
ZitatDie regex sucht nach dem String '"Power":', gefolgt von beliebig vielen Zahlen und Punkten ('[0-9.]'). Was in Klammern steht, findet sich hinterher in $1. Gibt es das, wird eben $1 zurückgegeben, gibt es das nicht, wird "nichts" (undef) zurückgeliefert, also auch das Reading nicht angelegt oder aktualisiert (nnn ? nn : mm nennt sich "ternärer Operator").
Ternärer Operator ist sowas wie ein stark verkürztes "if - else".
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

dougie



...das ist schon ziemlich geil...

Jetzt ist alles bis hier hin klar! :D

"Je mehr ich weiß, um so mehr weiß ich, das ich nicht(s) weiß"

Großartige Sache, das.

dougie

#7
Zitat von: Beta-User am 04 Januar 2021, 14:11:14
Hier mal ein Vorschlag für ein userReadings (falls es "damals" schon trigger gab...):
userReadings Power:Sensor.* { my $strg = ReadingsVal($name,'Sensor',''); $strg =~ m,"Power":([0-9.]+), ? $1 : undef }

...Als OT Nachtrag: ich hab 154 ReadingsVal in meiner 99_MyUtils.... und alle verwenden noch die Syntax mit Anführungszeichen (") an Stelle von Hochkomma (')

Seltsamerweise funktioniert dein ReadingsVal auch ohne Fehler.... scheint ich laufe auf so einer Version, die beides kann.

$Id: fhem.pl 9118 2015-08-23 12:43:56Z rudolfkoenig $


Beta-User

...immer wieder gerne...

Falls du "Spaß" daran hast, kannst du ja mal einen "Zeitmaschinen"-Thread starten: "Wie bringe ich mein Uralt-FHEM nervenschonend auf einen aktuellen Stand?"

Das ist ein Thema, von dem ich annehme, dass es sehr viele interessiert (oder besser: betrifft) und eventuelle Mitleser einiges lernen können, wie man es (nicht oder besser ;) ) macht...

Die Quotes funktionieren beide, nur ist "einfach" effizienter, weil nicht versucht wird zu interpolieren (also eventuelle Variablen aufzulösen).

Vielleicht versuchst du einfach mal, ein aktuelles FHEM aufzusetzen und dann mit deiner fhem.cfg und myUtils zu starten. Da kommt dann schon evtl. die eine oder andere Fehlermeldung usw. ins Log, aber dann siehst du, wie groß das gefürchtete Problem wirklich ist. Afaik sind eigentlich nur die Schreibweisen mit "%" und "@" problematisch, also "%NAME" (sollte in den Changelogs zu 5.6/5.7 zu finden sein...?)?

Zitat3762  - IMPORTANT: featurelevel is now 5.7, rendering @ and % non-functional
(https://svn.fhem.de/trac/browser/trunk/fhem/CHANGED)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

andies

Zitat von: Beta-User am 04 Januar 2021, 15:30:32
Falls du "Spaß" daran hast, kannst du ja mal einen "Zeitmaschinen"-Thread starten: "Wie bringe ich mein Uralt-FHEM nervenschonend auf einen aktuellen Stand?"

Das ist ein Thema, von dem ich annehme, dass es sehr viele interessiert (oder besser: betrifft) und eventuelle Mitleser einiges lernen können, wie man es (nicht oder besser ;) ) macht...
Ich wäre schonmal interessiert. Ich kenne diese Ängste, nachdem ich wegen eines updates (und einem Fehler von mir) einen ganzen Tag das System neu aufsetzen musste.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann