Ich habe ein Problem mit einer führenden Null in einem Reading. Das Reading "raw" hat beispielsweise den Wert "0672.9840".
ReadingsNum (<device>, "raw", -1) liefert nicht "672.9840" wie erwartet, sondern "-1".
Post doch ein list.
Heißt das Reading tatsächlich raw? Nicht irgendwo ein "verstecktes Leerzeichen" o.ä.?
Weil es sieht verdammt danach aus, als würde beim Auslesen etwas nicht funktionieren und dann der "Ersatzwert" (-1) genommen werden.
Schon mal einen anderen "Ersatzwert" probiert?
Kommt dann auch dieser?
-> Auslesen geht schief...
EDIT: eben mit einem dummy getestet -> geht. Also es kommt der Zahlenwert 0672.9840 zurück (wie erwartet/gedacht)...
Gruß, Joachim
Hier ist ein Ausschnitt aus dem List:
READINGS:
2023-09-27 18:13:17 CPUtemp 50
2023-09-23 22:53:19 IODev myMQTT_Server
2023-09-25 16:33:25 IP 192.168.178.102
2023-09-25 16:33:25 MAC A8:42:E3:55:69:84
2023-09-27 18:13:17 changeabsolut 0.0000
2023-09-27 18:13:17 connection connected
2023-09-27 18:13:17 error no error
2023-09-27 18:13:17 freeMem 767123
2023-09-25 16:33:25 hostname ESP-08
2023-09-25 16:33:25 interval 5.0
2023-09-23 16:58:38 link <html><a href='http://192.168.178.102'>Sensor</a></html>
2023-09-27 18:13:17 pre 672.9840
2023-09-27 18:13:17 rate 0.000000
2023-09-27 18:13:17 rate_per_digitalization_round 0.0000
2023-09-27 18:13:17 rate_per_time_unit 0.000000
2023-09-27 18:13:17 raw 0672.9840
2023-09-27 18:13:17 status Flow finished
2023-09-03 15:45:16 subscriptions SmartHome/Sensors/WaterMeter/ctrl/flow_start SmartHome/Sensors/WaterMeter/ctrl/set_prevalue
2023-09-27 18:13:17 timestamp 2023-09-27T18:12:44+0200
2023-09-27 18:13:17 uptime 178856
2023-09-27 18:13:17 value 672.9840
2023-09-27 18:13:17 wifiRSSI -78
Wenn ich einen anderen Ersatzwert nehme, kommt dieser.
Gut kein vollständiges list...
Wie lautet dein Aufruf und bitte nicht "mystifizieren", sondern poste doch den echten Aufruf...
Zitat von: JWRu am 27 September 2023, 18:17:56Wenn ich einen anderen Ersatzwert nehme, kommt dieser.
Deutet ja wie geschrieben darauf hin, dass beim Auslesen etwas nicht passt...
Gruß, Joachim
Habe Mist gebaut beim Namen - es kommt tatsächlich "0672.9840" zurück.
Das wird aber anscheinend von Perl (trotz "ReadingsNum" statt "ReadingsVal") nicht als Zahl erkannt.
(0672.9840 - 672.9839) liefert z.B. 4429167.0161
Zitat von: JWRu am 27 September 2023, 18:28:17Das wird aber anscheinend von Perl (trotz "ReadingsNum" statt "ReadingsVal") nicht als Zahl erkannt.
(0672.9840 - 672.9839) liefert z.B. 4429167.0161
Das hat nix mit ReadingsNum() oder ReadingsVal() zu tun.
Perl erkennt das sehr wohl als "Zahl", aber nicht als Zahl mit der Basis 10, sondern als Oktalzahl mit der Basis 8. Und das wird genau daran erkannt, dass die Zahl mit einer 0 beginnt.
Das habe ich auch gerade herausgefunden.
Das heißt wohl, dass ich ReadingsVal verwenden und anschließend die führende Null entfernen muss.
{my $v = ReadingsVal("bla","blub","0672.9840");; $v=~s/^0//;; return $v}
Zitat{my $v = ReadingsVal("bla","blub","0672.9840");; $v=~s/^0//;; return $v}
funktioniert
Zitat von: JWRu am 27 September 2023, 19:47:30funktioniert
Natürlich 8)
https://forum.fhem.de/index.php?topic=135120.0
Wieder mal ein Grund, warum ich mich für Perl nie richtig begeistern werde.
Ich mag Sprachen mit expliziten cast-Operatoren - da kann man viel besser kontrollieren was passiert.
Dass Zahlen mit 0 am Anfang als Oktalzahlen betrachtet werden, ist aber nicht nur in perl so.
Das ist richtig - man kann aber mit entsprechenden Operatoren die Umwandlung String -> Zahl besser kontrollieren.
Hast du einen besonderen Grund das Reading raw zu verwenden? Wenn du hier Daten von 'Digitizer - AI on the edge - watermeter' verarbeitest, steht im Reading value der numerische Wert des Wasserzahlers nach der Umwandlung von analog nach digital.
ZitatHast du einen besonderen Grund das Reading raw zu verwenden?
Ich benutze das im Fehlerfall - dann wird "value" nicht gefüllt.
Es ist die Wasseruhr. Der analoge Bereich funktioniert prima - der digitale macht manchmal noch Probleme.
Ich werte im Fehlerfall die Differenz zwischen "pre" und "raw" aus. Wenn diese zu groß ist, erhalte ich eine Nachricht.
Ich hatte auch Probleme mit dem digitalen Bereich, da meine Wasseruhr sehr spät und dann auch noch relativ langsam auf den nächst höheren Wert umschaltet. Seit ich die digitale Erkennung auf dig-class11_1600_s2.tflite umgestellt habe, funktioniert es aber recht gut.
Ich benutze jetzt dig-class100-0165_s2_q.tflite - hatte seitdem auch noch keinen Fehler.
Zitat von: JWRu am 27 September 2023, 19:30:51Das heißt wohl, dass ich ReadingsVal verwenden und anschließend die führende Null entfernen muss.
Ab dem morgigen Update sollte sich Deine Aufgabe auch mit ReadingsNum() ohne weitere Klimmzüge lösen lassen.