[gelöst] Uhrzeit vergleichen

Begonnen von brown78, 24 April 2019, 07:56:54

Vorheriges Thema - Nächstes Thema

brown78

Hallo zusammen,

ich habe schon einiges gegoogelt, komme aber trotzdem nicht weiter. Ich habe 2 dummies, in welchen Uhrzeiten stehen - einmal für Rolladen auf und einmal für Rolladen zu. Das funktioniert soweit.
Jetzt möchte ich aber als Hitzeschutz die Rollos ab einer bestimmten Innentemperatur schließen - funktionert auch, und unterhalb dieser Temperatur wieder öffnen. Öffnen sollen die Rollos dann aber auch nur, wenn diese
sowieso offen sein dürften. Die Innentemperatur soll also kleiner als x sein und die aktuelle Uhrzeit größer als Rollo auf und aktuelle Uhrzeit kleiner als Rollo zu.

Ich bin nun soweit, dass der state des dummy ein string ist, der nur bis zum ":" verglichen wird, wie bekomme ich das denn hin?

Bisher habe ich versucht (erstmal nur die Zeiten ohne Temperatur):
($hms gt [dmy_rollo_auf:state] and $hms lt [dmy_rollo_zu:state])(set dmy_test auf)
führt immer cmd 2 aus.
($hms > [dmy_rollo_auf:state] and $hms < [dmy_rollo_zu:state])(set dmy_test auf)
funktioniert nur stunden genau - alles ab dem ":" wird ja nicht ausgewertet.
Also mit < und > wird alles vor dem ":" verglichen allerdings steht folgende Meldung im device:
condition c01: Argument "07:53:47" isn't numeric in numeric gt (>)


CoolTux

Schau Dir mal das Modul AutoShuttersControl (ASC) an. Das kann sowas alles von sich aus.

Und nun zu Deiner Frage. Ich würde die Uhrzeit in Unix-Time umrechnen.
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

rabehd

ZitatIch würde die Uhrzeit in Unix-Time umrechnen.
Ich auch.
Alternative wäre die Uhrzeit, das Datum, im Format YYYYMMDDHHmmss. Unix-Time ist schöner.

    my $unixtime = timelocal(00,$minute,$stunde,$tag,$monat-1,$jahr);
Auch funktionierende Lösungen kann man hinterfragen.

brown78

Also ASC habe ich mir mal kurz angeschaut, das ist aber sehr umfangreich, denke dazu brauche ich Rollo devices? Meine Rollos werden mit IT CMR-500 Funkschaltern angesteuert.... Sieht aber auf jeden Fall interessant aus - werde ich sobald die Zeit es zulässt näher anschauen.
Zur Unix Time - die Systemzeit liefert {time} oder? Wie wandle ich dann meinen dummy:state in unix zeit um?

CoolTux

str2time (localtime(time));

Wie schaut denn Dein Zeitformat in den Dummys aus?
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

Damian

Zuerst solltest du schreiben mit welchem Modul du hantierst. Ich kann mir denken, dass es DOIF ist, das steht aber nirgendwo. Wenn du mit Zeitintervallen dort arbeiten willst, dann solltest du auf Zeitintervalle zurückgreifen, dort kann man auch Dummys mit Zeiten angeben:

https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitintervallen
https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

brown78

In den Dummies steht die Uhrzeit als "8:00" in 15 Minuten Schritten kann ich die per dropdown ändern

Damian

Zitat von: brown78 am 24 April 2019, 09:37:12
In den Dummies steht die Uhrzeit als "8:00" in 15 Minuten Schritten kann ich die per dropdown ändern

Dann sollten alle Voraussetzungen erfüllt sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

brown78

Ich arbeite tatsächlich mit einem DOIF. Auf die Zeitintervalle bin ich gar nicht gekommen, das ist natürlich am einfachsten. Ein erster kurzer Test mit:
([[dmy_test_time:state]-[dmy_test_time_2:state]]) (set dummy_actor jetzt schon)  DOELSE (set dummy_actor jetzt nicht mehr)
hat schon mal funktioniert....

brown78

Ich habe hierzu noch eine kleine Frage, in einem DOIF mit Intervall:
([[dmy_test_time:state]-[dmy_test_time_2:state]] and [dmy_test_state:state] eq on) (set dummy_actor jetzt)  DOELSE (set dummy_actor jetzt nicht mehr)
Hätte ich gerne eine Verzögerung bzw. einen Offset, aber nur wenn "dmy_test_state" genau zur Zeit "dmy_test_time" auf on wechselt.
Mit Wait würde ja immer wenn Condition 1 wahr ist verzögert. Ich möchte aber quasi eine Zeit addieren.

Zur Erläuterung, die beiden Zeit Dummies sind die Öffungs- und Schließzeiten von Rolläden, der State Dummy wird temperaturabhänging gesetzt, um die Rollos bei Hitze zu schließen.
Hier möchte ich für die Schaltzeiten eine Entprellzeit. Also quasi wenn der Rollo um 8:00 Uhr aufgeht, soll vor 8:15 dieser nicht wieder zu gehen bei Hitze. Wird die Hitze erst um 14:00 Uhr erreicht, soll aber um 14:00 Uhr geschlossen werden.

Ich habe schon versucht:
[[dmy_test_time:state]+00:15-[dmy_test_time_2:state]]
und verschiedene Klammerungen - bekomme aber entweder wrong timespec oder unknown expression format.
[[[dmy_test_time:state]+00:15]-[dmy_test_time_2:state]]

::) ???

rabehd

Ich denke Du brauchst erstmal eine Matrix der Bedingungen.

Welche Ereignisse unter welchen Bedingungen was auslösen.
Erstmal alle Varianten auflisten, dann prüfen ob sich welche zusammenfassen lassen und dann programmieren.
Auch funktionierende Lösungen kann man hinterfragen.

brown78

Hab ich bereits, was noch fehlt ist eben diese Entprellzeit damit nicht während dem hochfahren gleichzeitig geschlossen wird. Das kann in ungünstigen Konstellationen zu unangenehmen Effekten führen.

brown78

OK, hab es mit etwas rumprobieren raus bekommen, so scheint es zu funktionieren:
([([dmy_test_time:state]-{"00:24"})-[dmy_test_time_2:state]]) (set dummy_actor jetzt)