Hallo.
Ich frage mich, wie man bei userReadings Wert und Einheiten getrennt angeben kann.
Ziel ist es einen DbLog richtig befüllt zu haben mit VALUE und UNIT. Wenn ich ein sprintf("%.2f °C", ...) benutze, würde alles in VALUE landen.
Lt. commandref gibt es keine Möglichkeit eine UNIT bei userReadings mitzugeben, oder übersehe ich etwas?
Danke euch für euren Input :)
Gruß
ZitatWenn ich ein sprintf("%.2f °C", ...) benutze, würde alles in VALUE landen.
Sicher? Hast du es probiert?
Zitat von: DS_Starter am 11 Mai 2023, 10:51:28Sicher? Hast du es probiert?
Hast Du es denn mal probiert? 8)
2023-05-11 11:01:17|global|GLOBAL|temperature: 2.7 °C|temperature|2.7 °C|
Nein, deswegen hab ich ja gefragt. ;)
Dieses Splitting macht einen noch fertig ...
@Tompkin,
jetzt habe ich das Standardsplitting umgebaut und es deckt diesen Fall und hoffentlich auch alle bisherigen Splittings ab.
Die Version 5.8.8 habe ich zunächst zum Test in mein contib geladen.
Zum Download in der FHEMWEB Kommandozeile inklusive der Anführungszeichen angeben und danach FHEM restarten:
"wget -qO ./FHEM/93_DbLog.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/93_DbLog.pm"
Bitte teste diese Version in deinem System.
Jeder andere Mitleser ist natürlich ebenfalls eingeladen das Splitting zu testen. Je mehr User sich beteiligen desto besser und hilfreicher ist es für mich vor dem CheckIn.
Grüße,
Heiko
@DS_Starter
Sorry, dass ich erst jetzt Zeit finde das zu prüfen. Läuft so wie erwartet, ich danke dir vielmals :)
Werden die Daten aus den anderen Quellen auch mit split Leerzeichen aufgebröselt? Ich hätte eher erwartet, dass userReadings erweitert wird um Unit.
Gruß
Schön dass es funktioniert. :)
Ich hoffe auch alle deine anderen zu loggenden Events werden ordnungsgemäß wie bisher gesplittet ?
ZitatWerden die Daten aus den anderen Quellen auch mit split Leerzeichen aufgebröselt? Ich hätte eher erwartet, dass userReadings erweitert wird um Unit.
userReadings erweitert sich nicht von allein. Im userReading wird der Inhalt erstellt, den du mit deinem Code im Attribut vorgibst, in dem Fall eben "x.xx °C". Was so völlig ok ist.
Daraus resultiert ein entsprechender Event, den DbLog verarbeitet und für die Datenbankfelder splitten muß.
Für das Splitting gibt es verschiedene implementierte Varianten. Für Module freue ich mich, wenn die Entwickler eine spezifische Splittingfunktion implementieren, was häufig leider etwas vernachlässigt wird. Dann hat DbLog das nicht zu tun.
Es gibt eine Reihe eingebauter Splittings für bestimmte Modultypen.
Der Rest wird durch das Default-SPlitting vorgenommen, so auch die Events die sich aus userReadings ergeben.
LG
Zitat von: DS_Starter am 12 Mai 2023, 08:49:25Ich hoffe auch alle deine anderen zu loggenden Events werden ordnungsgemäß wie bisher gesplittet ?
Ich habe bis jetzt nix negatives im Log gesehen. Da SQL, ist etwas schwerer alle Werte mal eben so schnell zu überfliegen. Aber scheint zu passen :)
ZitatuserReadings erweitert sich nicht von allein. Im userReading wird der Inhalt erstellt, den du mit deinem Code im Attribut vorgibst, in dem Fall eben "x.xx °C". Was so völlig ok ist.
Daraus resultiert ein entsprechender Event, den DbLog verarbeitet und für die Datenbankfelder splitten muß.
Ok, dachte das wird etwas anders gehandhabt, aber wenn man davon ausgehen darf, dass es keine Werte mit Leerzeichen gibt, dann passt es ja.
Jedenfalls nochmal vielen Dank fürs schnelle fixen. Nun funktioniert es wie erwartet.
Gruß
Der DbLog Splitter geht davon aus, dass wenn exakt zwei durch Leerzeichen getrennte Terms nach dem Reading empfangen werden, ist es ein Wert mit Einheitsangabe.
Bei weniger oder mehr Terms ist es nicht so.
"state" erfährt eine Sonderbehandlung.
Vermutlich wird es auch jetzt eine kleine Anzahl von Fällen geben wo der default Splitter versagt.
Der default Splitter ist einfach nicht perfekt.
In diesen Fällen ist es einfach der beste Weg die Modulautoren bauen eine Splittingfunktion ein um das Thema für ihre Module sauber zu handhaben.
LG
Zitat von: DS_Starter am 12 Mai 2023, 11:29:52Der DbLog Splitter geht davon aus, dass wenn exakt zwei durch Leerzeichen getrennte Terms nach dem Reading empfangen werden, ist es ein Wert mit Einheitsangabe.
Das macht die Sache nicht besser, sondern in vielen devices noch schlimmer als wenn die Einheit mit im Wert steht. Zumindest bei allen devices, die nicht nur einen numerischen Inhalt haben, dürfte der Ansatz schwierig sein.
Zitat von: DS_Starter am 12 Mai 2023, 11:29:52Vermutlich wird es auch jetzt eine kleine Anzahl von Fällen geben wo der default Splitter versagt.
Vermutlich unterschätzt Du die Anzahl der devices, die alphanumerische Readinginhalte haben.
Einfaches Beispiel: Calendar-devices
setstate abfall_Jork 2022-01-05 00:04:05 calname Abfall Jork
setstate abfall_Jork 2023-05-12 12:04:03 lastUpdate 2023-05-12 12:04:00
setstate abfall_Jork 2023-05-12 12:04:03 nextUpdate 2023-05-12 13:04:00
setstate abfall_Jork 2023-05-12 12:04:03 nextWakeup 2023-05-12 13:04:00
Hier ist immer der gesamte Inhalt der korrekte Inhalt, eine Einheit gibt es hier nicht.
Von den ganzen Multimedia-devices mit Titelanzeigen etc. wollen wir gar nicht reden.
Du solltest eventuell noch $value darauf prüfen, ob looks_like_number($value) erfüllt ist. Das hilft zwar auch nicht zu 100%, aber es dürfte die Anzahl der "falschen" Splittings erheblich reduzieren.
Zitat von: DS_Starter am 12 Mai 2023, 11:29:52In diesen Fällen ist es einfach der beste Weg die Modulautoren bauen eine Splittingfunktion ein um das Thema für ihre Module sauber zu handhaben.
Das ist für mich der einzige sinnvolle Weg, um das Problem wirklich richtig zu lösen.
ZitatDu solltest eventuell noch $value darauf prüfen, ob looks_like_number($value) erfüllt ist
Das ist ein gute Idee... danke.
Baue ich ein und gebe euch eine Info.
Das sollte die Fails reduzieren.
Ich habe die Prüfung wie von betateilchen vorgeschlagen eingebaut und bei mir erfolgreich getestet.
Die Version liegt wieder in meinem contrib zum Gegencheck.
Sieht gut aus denke ich.
Kann bei mir keine Probleme feststellen mit der aktuellen überarbeiteten Version. Allerdings habe ich auch ausschließlich numerische Readings.
Gruß.
Danke für die Rückmeldung.
Auch ich konnte bisher nichts Negatives feststellen. Ich setze die V jetzt auf meinem produktiven System ein.
Wenn alles passt, werde ich die V dann zeitnah einchecken.
LG