neuer FHEM-Befehl IF

Begonnen von Damian, 25 Dezember 2013, 23:50:06

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: Alex_E am 26 März 2014, 22:27:21

define LichtA notify rr_alex IF ([rr_Alex:home] and ($hms gt "18:00" and $hms lt "05:00") (set ku_Lampe_gross on-for-timer 576)

Jemand einen Tip für mich was ich falsch mache?

Es gibt keine Uhrzeit, die sowohl größer als 18:00 und gleichzeitig kleiner als 05:00 Uhr ist.

Wenn es über Mitternacht geht, gibt es zwei Intervalle von 18:00 bis 00:00 Uhr und von 0:00 bis 05:00 Uhr

In solchen Fällen,  musst du beide Intervalle mit oder verknüpfen. In diesem Fall also:

define LichtA notify rr_alex IF ([rr_Alex:home] and ($hms gt "18:00" or $hms lt "05:00") (set ku_Lampe_gross on-for-timer 576)

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Zitat von: Bartimaus am 04 März 2014, 21:52:58
So hat es jetzt (dank Damians Hilfe) funktioniert...

define PoolPumpeAn at *21:00 IF (1) (set PoolPumpe on-for-timer {[Pool:state:d]/2*3600})

MoinMoin,
ich habe jetzt gemerkt, das der maximale "on-for-timer" wert "lediglich" -> 15.360s beträgt.
Das ist für meine Fälle zu wenig.
Kann man nicht auch eine "on-Till" Zeit berechnen in abhängigkeit vom einschaltzeitpunkt ?
zb
define PoolPumpeAn at *01:00 IF (set PoolPumpe on-till {01:00 + ([Pool:state:d]/2*3600)})
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Zitat von: Bartimaus am 31 März 2014, 10:16:36

MoinMoin,
ich habe jetzt gemerkt, das der maximale "on-for-timer" wert "lediglich" -> 15.360s beträgt.
Das ist für meine Fälle zu wenig.
Kann man nicht auch eine "on-Till" Zeit berechnen in abhängigkeit vom einschaltzeitpunkt ?
zb
define PoolPumpeAn at *01:00 IF (set PoolPumpe on-till {01:00 + ([Pool:state:d]/2*3600)})

Im Prinzip kannst du in den geschweiften Klammern bei IF alles einbauen, was in Perl geht + Nutzung der Readings.

define PoolPumpeAn at *01:00 IF (1) ((set  PoolPumpe on-till {sprintf("%02d:%02d",1+[Pool:state:d]/2,([Pool:state:d]/2-int([Pool:state:d]/2))*60)}))

Elegant ist anders - da könnte man schon eine Perl-Routine dafür auslagern - aber es funktioniert.

Gruß

Damian



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Hallo Damian,
wie immer erstmal ein fettes Danke für Deine schnelle Hilfe.
Ich habe das jetzt mal an einem Dummy ausprobiert. Dabei habe ich den *at-befehl auf 11:53 Uhr gelegt. Seit 11:53 sehe ich jetzt, das der Dummy eingeschaltet ist, mit "on-till 04:08".
D.h. in Deinem Code steckt irgendwo  noch die Einschaltuhrzeit "01:00:00" verschachtelt drin, richtig ? Ich hatte vermutet hier sprintf("%02d:%02d",1+[Pool:state:d]/4, war es aber nicht.
Pool:state = 12,6
define PoolPumpeAutomatikMaster15 at *11:53:00 IF ($month> 2 && $month< 10 and [PoolPumpe_Master:state] eq "on" and [Pool:state:d]>= 10) ((set PoolPumpe_Master2 on-till {sprintf("%02d:%02d",1+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))

LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

rudolfkoenig

Das besondere an on-for-timer ist, dass die Ablaufzeit im Geraet gespeichert wird, und keine zweite Funk-Nachricht zum abschalten notwendig ist.
D.h. wenn die Nachricht (on-for-timer) nicht ankommt, dann schaltet das Geraet nicht ein, wenn es ankommt, dann schaltet es mit grosser Wahrscheinlichkeit nach Ablauf der Zeit auch ab. Z.Bsp bei einer Bewaesserungspumpe wuerde ich nur on-for-timer senden (notfalls mehrere verteilt auf dem Tag), und nicht mit on-till arbeiten. MWn deckt on-for-timer fuer Homematic einen groesseren Zeit-Bereich ab.

Ansonsten kann man auch einen Abschalt-At definieren, on-till ist nichts anderes.

Damian

Zitat von: Bartimaus am 31 März 2014, 12:01:43

D.h. in Deinem Code steckt irgendwo  noch die Einschaltuhrzeit "01:00:00" verschachtelt drin, richtig ?

define PoolPumpeAutomatikMaster15 at *11:53:00 IF ($month> 2 && $month< 10 and [PoolPumpe_Master:state] eq "on" and [Pool:state:d]>= 10) ((set PoolPumpe_Master2 on-till {sprintf("%02d:%02d",1+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: rudolfkoenig am 31 März 2014, 12:02:54
Ansonsten kann man auch einen Abschalt-At definieren, on-till ist nichts anderes.

ja, dennoch wird er die Abschaltzeit dynamisch anhand des Pool-Readings bestimmen wollen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Danke, habe ich gerade auch mal mit 6+ getestet. Hat funktioniert.
d.h. der *at muss identisch sein mit dem sprintf(n+)...

@Rudolf
Danke für die Info. Das mit dem Abschalttimer muss ich mir mal durch den Kopf gehen lassen, allerdings wird diese bestimmt durch einen errechneten Wert (Pooltemp / n*3600)
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

betateilchen

Zitat von: Damian am 27 März 2014, 09:37:23Es gibt keine Uhrzeit, die sowohl größer als 18:00 und gleichzeitig kleiner als 05:00 Uhr ist.

Das nicht. Aber alle anderen Uhrzeiten zeichnen sich dadurch aus, dass sie zwischen 05:00 und 18:00 liegen.
Wenn ich also eine Abfrage auf  ~~ [5..17] mache und das Ergebnis mit ! umkehre, brauche ich keine Intervalle berücksichtigen.

Gib doch mal folgendes ein:

{!($hour ~~ [5..17])}

um die Ecke denken ;)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: betateilchen am 31 März 2014, 14:02:19
{!($hour ~~ [5..17])}

um die Ecke denken ;)

Ist nicht zu empfehlen. Hier wird unnötig eine Liste durchsucht, funktioniert auch nur mit ganzen Zahlen.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

Stunden sind meistens ganze Zahlen.

Und man kann das natürlich auch mit zwei Vergleichen > und < machen und braucht trotzdem keine zwei Intervalle.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

#236
Zitat von: betateilchen am 31 März 2014, 14:31:58
Stunden sind meistens ganze Zahlen.

Und man kann das natürlich auch mit zwei Vergleichen > und < machen und braucht trotzdem keine zwei Intervalle.

Noch mal für alle, die jetzt total verwirrt sind:

8:00 bis 15:00 Uhr ist ein Intervall, also (a >= 8 and a<=15), mathematisch dargestellt [8,15].

Von 15:00 Uhr bis 8:00 ist bis auf die Grenzen die Negation des Oberen: also not( a >= 8 and a<= 15)  ist gleich  (a<8 or a>15) bzw.

( a> 15 or a < 8 ) (vergl. mein unterer Beitrag)

Mathematisch als zwei unbeschränkte Intervalle zu sehen also: ]-unendlich,8[ bzw. ]15,unendlich[

Ist aber schon OT hier. Bei Interesse hier weiterlesen: http://de.wikipedia.org/wiki/Intervall_(Mathematik)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Zitat von: Damian am 31 März 2014, 11:05:44
Im Prinzip kannst du in den geschweiften Klammern bei IF alles einbauen, was in Perl geht + Nutzung der Readings.

define PoolPumpeAn at *01:00 IF (1) ((set  PoolPumpe on-till {sprintf("%02d:%02d",1+[Pool:state:d]/2,([Pool:state:d]/2-int([Pool:state:d]/2))*60)}))

Elegant ist anders - da könnte man schon eine Perl-Routine dafür auslagern - aber es funktioniert.

Gruß

Damian


Hi, darf ich nochmal ? Der Einschaltbefehl funktioniert, auch den errechneten Ausschaltzeitpunkt kann ich  erkennen (Windows zeigt diesen beim "drüberfahren" mit der Maus in einer Sprechblase an), beim Test war er zb: um 16:21Uhr. Nur hat der Dummy um 16:21 nicht den state von on nach off gewechselt, sondern leuchtet munter weiter. Liegt das an dem Dummy ? Theoretisch doch nicht.
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly