Moin,
ich stehe gerade etwas auf´m Schlauch und komme irgendwie nicht weiter.
Zur Ausgangssituation:
Mit nachstehendem CODE
*00:10:00 {
my $Sonnenaufgang = sunrise();
my $Sonnenuntergang = sunset();
fhem("set Sonnenaufgang $Sonnenaufgang");
fhem("set Sonnenuntergang $Sonnenuntergang");
}
lasse ich mir die Zeiten für sunrise und sunset in jeweils ein Dummy schreiben, funktioniert auch ohne Probleme.
Jetzt habe ich einen weiteren Dummy_XY, wo ich über eine setList Uhrzeiten eintrage
state: 05:00,05:10,05:20 ... 08:00 ... usw.
Wie kann ich jetzt prüfen, ob die Zeit von sunrise (Dummy Sonnenaufgang) größer als die vorgegeben Zeit des Dummy_XY ist.
Beispiel:
sunrise liefert die Uhrzeit 07:32:22
Dummy_XY hat 08:00 Uhr hinterlegt.
Wenn Sonnenaufgang > Dummy_XY dann mach das sonst mach dieses.
Wenn ich diese Wenn-Formel in ein DOIF packe, bekomme ich folgende Meldung im Log.
PERL WARNING: Argument "07:32:22" isn't numeric in numeric gt (>) at (eval 83800) line 1.
Auch die Änderung von userReadings
state {substr((ReadingsVal( "dummy_XY", "state","")),0,5)}
auf 07:32 hat keine Lösung gebraucht.
Kann mir hier jemand helfen?
Danke., Gruß Dirk
Sowohl
{ "20:10:20" < "21:00:00" }
als auch
{ "20:10:20" lt "21:00:00" }
in der fhem-Kommandozeile liefern bei mir korrekt eine 1 zurück.
Ansonsten würde ich timestamps direkt vergleichen.
Moin betateilchen,
ja, wenn ich es so wie von Dir beschrieben in die Kommandozeile eintrage, bekomme ich auch ein Ergebnis.
Mein Problem sind die Dummys die nicht wollen.
Die Abfrage im DOIF sieht z.Z. so aus:
([?Sonnenaufgang] > [[dummy_XY]]) (set Lichtan)
DOELSE
(Set ...usw..)
Relevant ist hier nur die ERSTE Abfrage.
Auch wenn in Deiner Signatur DOIF freie Zone! steht, kannst Du mit weiter helfen?
Danke, Gruß Dirk
Zitat von: MacDad am 28 Januar 2016, 20:22:23
Auch wenn in Deiner Signatur DOIF freie Zone! steht, kannst Du mit weiter helfen?
Grundsätzlich könnte ich Dir schon helfen, die Aufgabe in perl und fhem zu lösen - aber leider nicht mit DOIF (ich hab DOIF nie kapiert). Dafür gibts hier im Forum andere Spezialisten.
Zitat von: betateilchen am 28 Januar 2016, 20:24:31
Grundsätzlich könnte ich Dir schon helfen ... aber leider nicht mit DOIF ...
OK, Danke betateilchen.
Da ich gerade dabei bin mich mit DOIF etwas mehr zu beschäftigen, würde ich eine entsprechende Lösung über DOIF natürlich bevorzugen :)
Dann versuche ich mal weiter mein Glück.
Schönen Abend, Gruß Dirk
Moin Dirk,
Zitat von: MacDad am 28 Januar 2016, 20:22:23
...Abfrage im DOIF sieht z.Z. so aus:
([?Sonnenaufgang] > [[dummy_XY]]) (set Lichtan)
DOELSE
(Set ...usw..)
Schon mal:
(([Sonnenaufgang]) > ([?dummy_XY])) (set Lichtan)
DOELSE
(Set ...usw..)
getestet.
Ich vermute, das sich bei Dir hauptsächlich (täglich) der Sonnenaufgang ändert. ;)
Durch das Fragezeichen hast Du dem DOIF "gesagt", das es nicht auf Sonnenaufgang triggern soll, sondern auf dummy_XY.
Vielleicht hilft es Dir für den Einstieg in DOIF.
Vermute aber, das das was Du möchtest eventuell einfacher funktioniert.
Bin aber auch noch eher Anfänger.
Viele Grüße
Sunny
ZitatPERL WARNING: Argument "07:32:22" isn't numeric in numeric gt (>) at (eval 83800) line 1.
Wie schon fast täglich in irgend einer Antwort angemerkt: Es ist nur eine Warnung.
Wenn Du versuchst den Text zu verstehen, dann erfährst Du dass "07:32:22" keine Zahl ist (sondern eine Zeichenkette) und du sie in einem numerischen Vergleich benutzt.
Das könnte Dich dazu veranlassen, statt eines numerischen Vergleichsoperator einen Zeichenkettenvergleichsoperator zu verwenden, also gt statt >.
Du solltest Dir aber über die Wirkungsweise von gt im Klaren sein, denn {"99" gt "100"} ist 1.
Im DOIF müsste es dann so aussehen:
([?Sonnenaufgang] gt [dummy_XY])
aber was sollte hier triggern?
Ich würde es so versuchen:
([{(max([Sonnenaufgang],[dummy_XY]))}]) oder falls es eine Fehlermeldung gibt ([{(max("[Sonnenaufgang]","[dummy_XY]"))}])
{} ergänzt
Moin,
nach einem FHEM freien Familientag, kann ich mich jetzt wieder meinem Hobby widmen :) Danke für Eure Beiträge.
@Ellert
Mir ist schon bewusst, das es sich hier "nur" um eine Warnung handelt und der
Vergleich nicht 100 prozentig ist ;)
Daher ja auch meine Fragestellung bzgl. Verbesserung :)
Da ich hier ja mit
Indirekten Zeitangaben hantiere, konnte meine Variante aus #2 auch nicht Funktionieren.
[
?Sonnenaufgang] geändert in
[[Sonnenaufgang
]] und schon kommt ein Ergebnis.
([[dum_Sonnenaufgang]] > [[dummy_XY]]) (set dum_Licht Licht an durch dummy_XY)
DOELSE
(set dum_Licht Licht an durch dum_Sonnenaufgang)
Diese Variante ...
Zitat von: Ellert am 29 Januar 2016, 13:46:26
Ich würde es so versuchen:
([{(max([Sonnenaufgang],[dummy_XY]))}]) oder falls es eine Fehlermeldung gibt ([{(max("[Sonnenaufgang]","[dummy_XY]"))}])
... kannte ich noch nicht, werde ich aber mal testen ... könnte genau das sein, was ich brauche :)
@Sunny
Zitat von: Sunny am 29 Januar 2016, 12:46:28
... Vermute aber, das das was Du möchtest eventuell einfacher funktioniert.
Da könntest Du eventuell recht haben ;D
Mein Ziel in Worte gefasst:
Wenn die Uhrzeit vom Sonnenaufgang (07:30) größer als die Uhrzeit vom dummy_XY (06:30) ist
dann soll das Licht mit der Uhrzeit vom dummy_XY (06:30) angehen,
sonst mit der Uhrzeit vom Sonnenaufgang (07:30)
Alle Klarheiten beseitigt :D
Gruß Dirk
Moin Ellert,
Deine Max-Variante bekomme ich bei mir einfach nicht ans laufen.
Über die SUFU bekomme ich leider immer nur Treffer vom Max System, aber nicht von der Funktion Max in FHEM.
Kannst Du mir bitte mal einen Link posten, wo ich mehr Infos über Min/Max in FHEM nachlesen kann.
Vielen Dank, Gruß Dirk
Zitat von: MacDad am 31 Januar 2016, 13:15:21
Kannst Du mir bitte mal einen Link posten, wo ich mehr Infos über Min/Max in FHEM nachlesen kann.
commandref, what else? http://fhem.de/commandref.html#Utils
Danke betateilchen,
aber glaube mir, ich hätte diese Frage nicht gestellt, wenn ich im www etwas gefunden hätte, was mich weiter bringt.
Gib mal Google
fhem commandref Funktion max ein und Du wirst dich wundern, was Du nicht findest.
Kein Hinweis auf die von dir verlinkte Seite.
Auch wenn ich jetzt die Hinweise aus der commandref lese,
Zitatmax(str1, str2, ...)
returns the highest value from a given list (sorted alphanumeric)
maxNum(num1, num2, ...)
returns the highest value from a given list (sorted numeric)
hilft es mir aktuell nicht weiter.
Ich bekomme den Max-Wert nicht ausgewiesen, mein Brett vorm Kopf ist glaube ich eine Eiche, ich könnte k.... >:(
Gruß Dirk
ZitatIch bekomme den Max-Wert nicht ausgewiesen
Wie sieht Dein Code aus?
Zitat von: MacDad am 28 Januar 2016, 20:50:26
würde ich eine entsprechende Lösung über DOIF natürlich bevorzugen :)
Ich werde nie verstehen, warum sich Leute das Leben unnötig schwer machen. Mit DOIF sollte man (wenn es wirklich sein muss) meiner Meinung erst anfangen, wenn man sich die einfachsten Grundlagen von perl, beispielsweise den Unterschied von numerischen und alphanumerischen Werten und den zugehörigen Operatoren, angeeignet und verstanden hat.
Zitat von: MacDad am 31 Januar 2016, 14:04:03
Gib mal Google fhem commandref Funktion max ein
warum sollte ich einen solchen völlig sinnlosen Suchbegriff in google eingeben?
@Ellert
Zitat von: Ellert am 31 Januar 2016, 14:24:25
Wie sieht Dein Code aus?
Ich hatte es mit den Varianten von Dir versucht. Da es so (bei mir) nicht funktionierte, habe ich versucht diese Anzupassen.
(Klamme Setzung, nur mit "Werten" ohne Dummy usw.) Leider ohne Erfolg.
Nach zahlreichen Änderungsversuchen lief mein LOG mit "Warnmeldungen" voll und ich habe alles wieder gelöscht.
@betateilchen
Zitat von: betateilchen am 31 Januar 2016, 14:40:03
Ich werde nie verstehen, warum sich Leute das Leben unnötig schwer machen ...
Ich programmiere viel mit/in Excel-VBA, auch alles
learning by doing aber diese "max" Geschichte in FHEM bringt mich noch zur Verzweiflung.
Gruß Dirk
Zitatsunrise liefert die Uhrzeit 07:32:22
Dummy_XY hat 08:00 Uhr hinterlegt.
Zitat{max("07:32:22","06:00")}
funktioniert das bei Dir nicht?
Habs gerade probiert, das funktioniert:
([({max([d2:hms1],[d2:hms2])})]) ()
[d2:hms1] = 08:00
[d2:hms2] = 07:32:22
Zitat von: Ellert am 31 Januar 2016, 16:57:55
funktioniert das bei Dir nicht?
Habs gerade probiert, das funktioniert:
([({max([d2:hms1],[d2:hms2])})]) ()
[d2:hms1] = 08:00
[d2:hms2] = 07:32:22
Nur zur Info: Die geschweiften Klammern sind hier überflüssig, da es eine Perl-Auswertung ist, funktioniert es dennoch ;)
Gruß
Damian
Zitat von: Damian am 31 Januar 2016, 20:49:28
Nur zur Info: Die geschweiften Klammern sind hier überflüssig, da es eine Perl-Auswertung ist, funktioniert es dennoch ;)
Gruß
Damian
"max" ist in der 99_Utils.pm definiert, führt einen Zeichenkettenvergleich durch und liefert die grössere Zeichenkette zurück.
ZitatPerlfunktionen, wie z. B. sunset(), die eine Zeitangabe in HH:MM liefern, werden in geschweifte Klammern gesetzt.
Ich verstehe nicht, was ich falsch verstanden habe?
Zitat von: Ellert am 31 Januar 2016, 22:51:58
"max" ist in der 99_Utils.pm definiert, führt einen Zeichenkettenvergleich durch und liefert die grössere Zeichenkette zurück.
Ich verstehe nicht, was ich falsch verstanden habe?
ja, geschweifte Klammer direkt [{..}] weist auf eine Zeitfunktion im Format HH:MM hin, diese Syntax habe ich vom at-Befehl übernommen. Daran erkenne ich im Modul, dass es sich um Zeitangabe handelt.
Später habe ich das "Rechnen mit Zeiten" eingeführt, das wird mit einer runden Klammer angegeben [(...)]. Daran erkenne ich bereits, dass es sich um eine Zeitberechnung handelt. Wenn man darin geschweifte Klammern angibt, dann werden diese an Perl weiter geleitet.
Gruß
Damian
Danke, es offenbaren sich mir immer wieder neue Details.
Zitat von: Ellert am 01 Februar 2016, 10:51:37
Danke, es offenbaren sich mir immer wieder neue Details.
Ich glaube du kennst dich inzwischen besser mit dem Modul aus als ich, denn so ganz Unrecht hast du nicht.
[(sunset())] sollte nach meiner Aussage funktionieren, tut's aber nicht, weil das Ergebnis von sunset() als Zahl interpretiert wird und auch bei der Berechnung in runden Klammern erst mit [({sunset()})] richtig funktioniert. Warum das Ergebnis von max() auch ohne geschweifte Klammern als korrekte Zeit erkannt wird muss ich in den Tiefen des Codes noch eruieren.
Gruß
Damian
Moin Ellert,
Zitat von: Ellert am 31 Januar 2016, 16:57:55
funktioniert das bei Dir nicht?
Habs gerade probiert, das funktioniert:
([({max([d2:hms1],[d2:hms2])})]) ()
[d2:hms1] = 08:00
[d2:hms2] = 07:32:22
so funktioniert es ... vielen Dank. :)
Da hat sich zur Variante aus #6 die Reihenfolge der Klammern geändert, da wäre ich nicht wirklich drauf gekommen. :-[
Vielen Dank an alle Beteiligten für Ihre Geduld und Hilfsbereitschaft
Gruß Dirk