FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MacDad am 28 Januar 2016, 19:38:44

Titel: Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 28 Januar 2016, 19:38:44
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: betateilchen am 28 Januar 2016, 19:55:24
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.
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 28 Januar 2016, 20:22:23
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: betateilchen am 28 Januar 2016, 20:24:31
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.
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 28 Januar 2016, 20:50:26
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Sunny am 29 Januar 2016, 12:46:28
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Ellert am 29 Januar 2016, 13:46:26
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 30 Januar 2016, 14:00:21
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 31 Januar 2016, 13:15:21
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: betateilchen am 31 Januar 2016, 13:25:19
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 31 Januar 2016, 14:04:03
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Ellert am 31 Januar 2016, 14:24:25
ZitatIch bekomme den Max-Wert nicht ausgewiesen

Wie sieht Dein Code aus?
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: betateilchen am 31 Januar 2016, 14:40:03
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?
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 31 Januar 2016, 15:03:16
@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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Ellert am 31 Januar 2016, 16:57:55
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Damian am 31 Januar 2016, 20:49:28
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Ellert am 31 Januar 2016, 22:51:58
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?

Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Damian am 01 Februar 2016, 09:03:10
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Ellert am 01 Februar 2016, 10:51:37
Danke, es offenbaren sich mir immer wieder neue Details.
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: Damian am 01 Februar 2016, 13:15:34
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
Titel: Antw:Ergebnis von Sunset mit Zeit vom Dummy vergleichen
Beitrag von: MacDad am 01 Februar 2016, 17:34:03
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