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 (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?
Wenn Räder userReading erstellen oder split nehmen.
ZitatWenn Räder...
Mmh?? Dann geh ich nur noch zu Fuß...
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
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.
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.
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...
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.
Lass Dir doch erstmal ausgeben was da überhaupt übrig bleibt.
Kommentier also Deine Bedingung erstmal aus und mache ein
Log(1,$temp[0]);
my $temp = (split " ",ReadingsVal("Bad_PowerPlug_Waschmaschine","power","0 W previous: 0 delta_time: 301 s"))[0];
Gruß
Dan
:-[ 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!
Dan seine Lösung kannst Du prima als userReading nehmen.
Eine weitere Lösung wäre der Einsatz des Moduls readingsChange.
Gruß
Dan