[Gelöst] Vergleich von Text Ausschnitt mit Zahl

Begonnen von Stippy19, 27 April 2017, 23:12:08

Vorheriges Thema - Nächstes Thema

Stippy19

Ich versuche gerade den Waschmaschinen-Status auszulesen und mit einem notify darauf zu reagieren (Ähnlich https://www.youtube.com/watch?v=D9CdKLxnayI&feature=youtu.be ).
Von der Steckdose bekomme ich ein reading "power" mit Inhalt "0 W previous: 0 delta_time: 301 s".
Ich will jetzt die 0W Angabe auswerten.
if ({sprintf("%.2f", ReadingsVal("Bad_PowerPlug_Waschmaschine","power",0))} > 1.00)
Wenn also die power > 1 W ist möchte ich etwas machen. Bekomme leider nur den Fehler
PERL WARNING: Argument " 0 W previous: 0 delta_time: 301 s" isn't numeric in sprintf at (eval 37722) line 3.

Jemand ne Idee? sprintf gibt wie gewünscht "0.00" aus. Ich dachte Pearl konvertiert das direkt in eine Zahl und dann sollte ich doch 0.00 mit 1.00 vergleichen können?

CoolTux

Wenn Räder userReading erstellen oder split nehmen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

franky08

ZitatWenn Räder...

Mmh?? Dann geh ich nur noch zu Fuß...
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Stippy19

#3
Ich würde vermuten dass "Wenn Räder" = "Entweder" sein sollte =)

Vielen Dank!

Hab es jetzt mal so gebaut und scheint zu funktionieren:

my $temp = ReadingsVal("Bad_PowerPlug_Waschmaschine","power",0);
my @temp=split(/W/, $temp);

if (@temp[0] > 1.00)
{}


Ergibt:

$temp = "0 W previous: 1.52 delta_time: 11 s"
@temp[0] = 0
@temp[1] = previous: 1.52 delta_time: 11 s



Gibt es da noch etwas zu verschönern oder kann man das so lassen? = aka hat noch jemand Tipps dazu?

/Edit: Also, ich bekomm immernoch die Meldung:
2017.04.28 00:56:09 1: PERL WARNING: Argument " 1.51 W previous: 0 delta_time: 215 s" isn't numeric in sprintf at (eval 39597) line 3.
2017.04.28 00:56:31 1: PERL WARNING: Argument " 0 W previous: 0 delta_time: 301 s" isn't numeric in sprintf at (eval 39599) line 4.

Woran liegt das? Ich komm mit Peal noch nicht wirklich zurecht... Bin C gewöhnt von früher, Pearl macht mir irgendwie Schwierigkeiten mit dem Syntax

CoolTux

Guten Morgen.

Ja das sollte ein entweder werden. War bisschen spät gestern. Da Du ja nur ne Zahl haben willst nimm ReadingsNum statt ReadingsVal dann haste erstmal nur Zahlen. Musst halt dann noch deine benötigte raus suchen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Stippy19

Die Idee versteh ich, nur nicht wie ich es umsetze.
Der Wert ist
0 W previous: 0 delta_time: 301 s
Wenn ich nun ReadingsNum nutze, bekomme ich
00301
Ich kann nicht nach Anzahl der Werte gehen, da die 0W auch 1.65W sein können.

KernSani

dann muss wohl 'ne regex her...

irgendwie sowas (quick & dirty und ungetestet)

my $string = ReadingsVal(x,y,z);
my @zahlen = $string =~ /(.*) W previous: (.*) delta_time: (.*) s/


Hoffe das gibt einen Ansatzpunkt...

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Stippy19

Danke KernSani für deinen Input.
Aber, da habe ich doch wieder das selbe "Problem"
my $temp = ReadingsVal("Bad_PowerPlug_Waschmaschine","power",0);
my @temp = $temp =~ /(.*) W previous: (.*) delta_time: (.*) s/;

if ($temp[0] > 4.00) {}

Ergibt
2017.04.28 18:58:28 1: PERL WARNING: Argument " 0 W previous: 0 delta_time: 301 s" isn't numeric in sprintf at (eval 48166) line 4.

Bitte nicht falsch verstehen, es funktioniert! Die Zahl wird richtig ausgewertet, ich würde nur gerne wissen, wie man es richtig macht, damit dieses Warning eben nicht kommt.

CoolTux

Lass Dir doch erstmal ausgeben was da überhaupt übrig bleibt.
Kommentier also Deine Bedingung erstmal aus und mache ein

Log(1,$temp[0]);
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

my $temp = (split " ",ReadingsVal("Bad_PowerPlug_Waschmaschine","power","0 W previous: 0 delta_time: 301 s"))[0];

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Stippy19

 :-[ Der Fehler PERL WARNING: Argument " 1.51 W previous: 0 delta_time: 215 s" isn't numeric in sprintf at (eval 39597) line 3.
kam leider garnicht von dem notify in der letzten Version, sondern von einer anderen Baustelle, wo ich Ihn übersehen hatte.
Sry, war mein Fehler.

Diese Lösung hier, scheint mir aber die eleganteste zu sein:
Zitat von: DeeSPe am 28 April 2017, 19:12:24
my $temp = (split " ",ReadingsVal("Bad_PowerPlug_Waschmaschine","power","0 W previous: 0 delta_time: 301 s"))[0];

Gruß
Dan

Vielen Dank euch!

CoolTux

Dan seine Lösung kannst Du prima als userReading nehmen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

Eine weitere Lösung wäre der Einsatz des Moduls readingsChange.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe