Umwandlung String in Zahl für einen Plot

Begonnen von Markus., 30 Oktober 2019, 09:21:40

Vorheriges Thema - Nächstes Thema

Markus.

Hallo Zusammen,

habe da mal wieder ein Problem mit sprintf. Und zwar habe ich in einer MySQl DB für einen Temperatursensor folgendes Value


state: T: 20.7  H: 44  Bat: ok

Die Werte für T und H definiere ich im Plot wie folgt, geht bestimmt auch einfacher aber funktioniert erstmal

dblog,predict,extend=24*60*60:Temp_Wohnzimmer:data:::$val=~s/.*H..([\d.]*).*/$1/eg
dblog,predict,extend=24*60*60:Temp_Wohnzimmer:data:::$val=~s/.*T..([\d.]*).*/$1/eg


Jetzt würde ich gerne den Wert von Bat umwandeln von ok= 10 sonst 5. habe es wie folgt probiert. Aber da steh ich total auf dem Schlauch

dblog,predict,extend=24*60*60:Temp_Wohnzimmer:data:::$val=~s/.*Bat..($val=~'ok'?10:5);


Dieser fehlerhafte Versuch meinerseits bringt dann auch folgende Fehlermeldungen im Log:

2019.10.30 09:02:05 1: PERL WARNING: Argument "DbLog" isn't numeric in subtraction (-) at ./FHEM/92_FileLog.pm line 733, <GEN3453> line 200.
2019.10.30 09:02:08 1: PERL WARNING: Argument "DbLog" isn't numeric in subtraction (-) at ./FHEM/92_FileLog.pm line 733, <GEN3455> line 200.
2019.10.30 09:03:10 1: PERL WARNING: Argument "state: T: 20.6  H: 45  Bat: ok" isn't numeric in sprintf at ./FHEM/98_SVG.pm line 2211.


Hoffe mir kann da einer auf die Sprünge helfen :-)

Viele Grüße

Markus

Otto123

Hi,

dein Ansatz erscheint mir ziemlich unlogisch. Ich sag mal warum:
$val=~s/.*T..([\d.]*).*/$1/eg bedeutet in etwa: suche (s/suche/ersetze/option) in dem String das was als Ziffern und Punkte ([\d.]*) nach (.*T..) steht und ersetze das mit dem ersten Teilmatch ($1).

Was Du jetzt gemacht hast ist kein gültiger Ausdruck. Im WIki https://wiki.fhem.de/wiki/SVG-Plots_von_FileLog_auf_DbLog_umstellen
Findet sich ein Beispiel: #DbLog HMW02.O05_4k7:state:::$val=($val=~"on"?10:1)

Nimm doch einfach das? Nur mit ok natürlich :)
$val=($val=~"ok"?10:5)
Also wenn Dein Wert ok enthält setze das 10 ansonsten 5. Ist doch Wurst was sonst in der Zeile steht?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus.

:-)
Hatte vorher SQLlite laufen. Denke ich muss das alles noch anpassen.
Aber funktioniert jetzt soweit mit der Batterie :-) Erstmal danke!
Aber wenn wir schon dabei sind.. Wie mache ich das denn am besten für H und T ?

Otto123

Ich hatte dazu schonmal einen Blogbeitrag angefangen. Ist noch nicht fertig und veröffentlicht. Deswegen kopiere ich meine Notiz einfach mal:
Ist das verständlich?
ZitatIm Menüpunkt "Diagram label, Source" wählt man als Quelle sein DbLog Device.
Dahinter kommt die Wertzuweisung in der Form (für den Fall das man nicht nur ein Reading mit einem Wert pro Zeile geloggt hat).
<Device>:<Reading>:::$val=~s/<regex>/$1/eg
$val ist die interne Variable die letztendlich den Wert für diese Plotzeile enthält (z.B. die Temperatur)
Auf $val wird ein regex angewendet (=~) welches mit suchen (<regex>) und ersetzen ($1) den Inhalt von $val verändert. Trifft das regex nicht zu, bleibt $val unverändert!
$1 (oder auch $2 usw) enthält dabei den "Groupmatch", also normal einen Teilstring.
Dezimalzahlen mit Punkt kann man so als Gruppe erkennen: ([-\d.]+) -> erkennt eine Zeichengruppe aus "- . und Ziffer" zwischen 1 und unendlich mal. (* erkennt zwischen 0 und unendlich mal, Punkt ist hier wirklich der Punkt und nicht ein beliebiges Zeichen)
Ein "T: " am Beginn eines Wertes kann man so erkennen: ^T:\s -> Anfang der Zeichenkette, ein T, ein : und ein Whitespace.
Einen Trenner zwischendrin kann man so erkennen: .H:\s -> Ein Zeichen, ein H ein : und ein Whitespace
Mein geloggtes state Reading sieht so aus: T: 20.7 H: 69 und mit dem regex   ^T:\s([-\d.]+).H:\s([-\d.]+) habe ich den Zahlenwert hinter T in $1 und den Zahlenwert für H in $2.
Nach diesem Schema ließen sich jetzt beliebige Kolonnen analysieren. Anstatt in jeder Zeile die Klammern zu versetzen und immer eine Ersetzung mit $1 zu machen, finde ich es übersichtlicher jede Zeile mit gleichen (allen) Klammern auszustatten und von Zeile zu Zeile $1 auf $n zu wechseln.
Resultat
Zeile in der Datenbank
select * from history where (TIMESTAMP like "2019-08-19 10:25:21");

+---------------------+--------------+-------+----------------------+---------+---------------+------+
| TIMESTAMP           | DEVICE       | TYPE  | EVENT                | READING | VALUE         | UNIT |
+---------------------+--------------+-------+----------------------+---------+---------------+------+
| 2019-08-19 10:25:21 | SensorAussen | DUMMY | state: T: 20.7 H: 69 | state   | T: 20.7 H: 69 |      |
| 2019-08-19 10:25:21 | SensorAussen | DUMMY | tempMax: 30.3        | tempMax | 30.3          |      |
| 2019-08-19 10:25:21 | SensorAussen | DUMMY | tempMin: 18.6        | tempMin | 18.6          |      |
+---------------------+--------------+-------+----------------------+---------+---------------+------+


Zeilen im SVG Plot

SensorAussen:state:::$val=~s/^T:\s([-\d.]+).*H:\s([-\d.]+)/$1/eg
SensorAussen:state:::$val=~s/^T:\s([-\d.]+).*H:\s([-\d.]+)/$2/eg

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus.

#4
super Danke dir !!!! ;D
Dann war ich mit meinem T und H ja nicht soooo verkehrt..

Viele Grüße

Markus

Otto123

#5
überhaupt nicht. Aber Du hattest keine negativen Werte und ich finde es nach meinem Ansatz übersichtlicher und man hat bei langen Kolonnen (bei sysmon z.B.) nicht soviel von Zeile zu Zeile zu ändern. Man kopiert die Zeilen und tauscht hinten nur ein Ziffer.

Einen großen Nachteil hat die Rechnerei: Es frisst Zeit beim Plot zeichnen! Man ist viel schneller wenn man einzelne Werte hat. Das was beim FileLog aus meiner Sicht übersichtlich ist (eine Zeile) ist bei der DB kontraproduktiv.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus.

Da hast du recht. Habe gerade mal versucht die Temperatur anzupassen anlog zu Deinem Beispiel,
da bekomme ich aber dann keine Werte

Org:

dblog,predict,extend=24*60*60:Temp_Wohnzimmer:data:::$val=~s/.*T..([\d.]*).*/$1/eg


geändert:


dblog,predict,extend=24*60*60:Temp_Wohnzimmer:data:::$val=~s/^T:\s([-\d.]+).*H:\s([-\d.]+)/$1/eg


Eine Idee?
Gruß

MArkus

Markus.

#7
nne quatsch was ich rede...

muss ja auch "state: T:" sein wenn ich "~s/^" verwende...oder eben "=~s/.*T:"


Markus.

Aber einen Nachteil hat diese Lösung. Und zwar wenn man im plot label verwendet mit z.B. {currval1} zeigt er den kompletten Datensatz an und nicht nur die selektion nach $1 oder $2.
Muss das nochmal testen...

Otto123

an der Ecke "label" war ich noch nicht. Ich bin der totale Anfänger :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus.

Zitat von: Otto123 am 30 Oktober 2019, 11:03:57
an der Ecke "label" war ich noch nicht. Ich bin der totale Anfänger :)

Neee schon klar :-) :-)

Aber mit Batterie funktioniert klasse jetzt.

Vielen Dank

Markus

Otto123

Ich sag Dir: Das mit den Plots und DbLog wird wirklich alles viel einfacher wenn man nicht solche state Zeilen sondern die einzelne Werte loggt!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frober

Ich verwende
#logProxy DbLog:logdb,extend=1800:TH_Aussen:state:::$val=~s/^T..([\d.-]*).*/$1/eg

Damit funktioniert das Label.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...