neuer FHEM-Befehl IF

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: Bartimaus am 04 März 2014, 20:05:31
Hallo,

dh, ich kann mir zB einen Temperaturwert eines angeschlossenen Sensors in einem Dummy merken, und diesen Wert dann dividieren&multiplizieren und das Ergebnis als "set-on-for-timer" verwenden ?


warum nicht  ;)

IF (irgendwas)
  (set test_dummy 50)
ELSE
  (set lampe on-for-timer {[test_dummy:state]*10+40-[sonstwas:state]})


In der geschweiften Klammer kannst du prinzipiell alles unterbringen, was in Perl geht.
Ich glaube das hat trotz meiner Doku noch keiner durchschaut.  ;D

Ich habe den Spieß umgedreht: hier spielt FHEM die erste Geige und Perl ist nur ein Hilfsmittel und nicht umgekehrt.

Gruß

Damian



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

Bartimaus

Danke.
Timer hat sich nicht eingeschaltet, mit dem Hinweis: Bad time spec.

Zu berechnen ist testweise: *21:27 set PoolPumpe on-for-timer {[Pool:state:T]/2*3600}

state aktuell T:6.8

Lt. Wiki bekommt man diesen Hinweis, wenn der Dezimaltrenner ein "," statt "." ist. Kann es sein, das Perl aus der Berechnung einen Wert mit "," zurückliefert ?
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 04 März 2014, 21:36:36
Danke.
Timer hat sich nicht eingeschaltet, mit dem Hinweis: Bad time spec.

Zu berechnen ist testweise: *21:27 set PoolPumpe on-for-timer {[Pool:state:T]/2*3600}
state aktuell T:6.8

Lt. Wiki bekommt man diesen Hinweis, wenn der Dezimaltrenner ein "," statt "." ist. Kann es sein, das Perl aus der Berechnung einen Wert mit "," zurückliefert ?

Ich habe dir bereits zwei mal per PN geantwortet. Dennoch zur Aufklärung für andere Interessierte.
Die Sache mit den geschweiften Klammern in Kombination mit FHEM-Befehlen funktioniert nur innerhalb des IF-Befehls.  (Bitte nicht woanders nachmachen  :( )

Zum Filtern von Zahlen habe ich :d eingebaut. Man kann sich dennoch behelfen, indem man IF Funktionalität ausnutzt, auch wenn man gar kein IF braucht. In deinem Falle:

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

Natürlich kann man so etwas auch in Perl realisieren. Ob es allerdings kürzer wird oder gar eleganter, wage ich zu bezweifeln.

Gruß

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

Bartimaus

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})
LG
B.


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

Bartimaus

Guten Morgen,

heute morgen hat sich die Poolpumpe korrekt eingeschaltet. Auch der Timer wurde korrekt ermittelt. Jedoch hat sich die Pumpe nicht zum errechneten Timerende ausgeschaltet.

Dies stand im Log: 2014.03.05 08:13:19 3: PoolPumpe_timer: Unknown command {readingsSingleUpdate($defs{'PoolPumpe'},'state','off',, try help

Aktuellstes FHEM-Update ist drauf..

Any ideas ?

LG
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 05 März 2014, 08:43:36
Guten Morgen,

heute morgen hat sich die Poolpumpe korrekt eingeschaltet. Auch der Timer wurde korrekt ermittelt. Jedoch hat sich die Pumpe nicht zum errechneten Timerende ausgeschaltet.

Dies stand im Log: 2014.03.05 08:13:19 3: PoolPumpe_timer: Unknown command {readingsSingleUpdate($defs{'PoolPumpe'},'state','off',, try help

Aktuellstes FHEM-Update ist drauf..

Any ideas ?

LG

Wann wurde der IF-Befehl ausgeführt? Du sagst der Timer wurde richtig ermittelt, wo hast du das gesehen?

Wenn die Meldung nicht zum Zeitpunkt der Ausführung des IF-Befehls kommt und der korrekte set-on-timer-Befehl absetzt wurde (müsste im Log zu finden sein), dann hat das mit IF nicht mehr viel zu tun.

Gruß

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

Bartimaus

#156
Ich habe einen Testzyklus gestartet, mit entsprechend kurzer Laufzeit.
Start 07:30. Den errechneten Ausschaltpunkt konnte man sehen, wenn man mit der Maus über das "On-for-Timer" Symbol fuhr, dann zeigte es "On-for-Timer 2880" an. Die errechnete EndeUhrzeit sah man unter "unsorted oder everything" mit "..till 08:18".

Mit IF hat das glaube ich auch nichst zu tun. Ich werde den Test heute abend nochmal wiederholen, und dann berichten...

EDIT:
So, mal mit der Poollampe getestet, diesmal hat es geklappt ;)

Logfile:
2014.03.05 13:04:00 3: FS20 set Poollampe on-for-timer 108.8
2014.03.05 13:04:00 2: Poollampe: changing timeout to 112 from 108.8


in "unsorted" unter "at"
+00:01:52 {readingsSingleUpdate($defs{'Poollampe'},'state','off', 1); undef}
LG
B.


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

Michi240281

Hallo Damian,

ich habe mir ein Notify gebastelt, um ein paar Lampen für 3 Minuten einzuschalten, wenn man abends zu Bett geht (DM500HD ändert sein reading "power" auf "off").


define Bettgehbeleuchtung notify DM500HD IF ($hms gt "18:00" and $hms lt "22:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)


Funktioniert auch wunderbar.

Wie müsste ich das nun umändern, um den Zeitraum auf "zwischen 22 Uhr abends und 3 Uhr nachts" zu ändern?

Danke und Gruß
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

der-Lolo

Interessante frage - ich habe auch keine Lösung, ich dachte zwar zuerst Du könntest ja anstelle von und ein und nicht auf
($hour ~~ [8..21]) setzen, und nicht scheint es aber nicht zu geben...
Ich bin gespannt was Damian sagt - ich habe da auch die ein oder andere Anwendung die nachts aktiv sein soll..

vielleicht geht es auch einfach wenn Du ($hour ~~ [22..2]) angibst... Keine Ahnung wie $hour da arbeitet.

2 jedenfalls weil es ja dann zutrifft bis 2:59:59

Damian

Zitat von: Michi240281 am 06 März 2014, 19:12:55

Wie müsste ich das nun umändern, um den Zeitraum auf "zwischen 22 Uhr abends und 3 Uhr nachts" zu ändern?

Ist doch ganz einfach: "größer 22 und kleiner 3", also

define Bettgehbeleuchtung notify DM500HD IF ($hms gt "22:00" and $hms lt "03:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)

Gruß

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

Damian

Zitat von: der-Lolo am 06 März 2014, 20:30:43
($hour ~~ [8..21])

Würde ich nicht nehmen, da werden Listen durchsucht - schlechte Performance.

Gruß

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

Michi240281

Zitat von: Damian am 06 März 2014, 21:00:14
Ist doch ganz einfach: "größer 22 und kleiner 3", also

define Bettgehbeleuchtung notify DM500HD IF ($hms gt "22:00" and $hms lt "03:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)

Gruß

Damian

Ok, besten Dank!

Dachte, es gäbe da vllt ein Problem wegen Mitternacht!
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

Damian

Zitat von: Michi240281 am 06 März 2014, 22:38:07
Ok, besten Dank!

Dachte, es gäbe da vllt ein Problem wegen Mitternacht!

Mein Denkfehler:

es muss "or" und nicht "and "heißen, die Klammern würde ich auch wegen Prioritäten zusätzlich setzen:


define Bettgehbeleuchtung notify DM500HD IF (($hms gt "22:00" or $hms lt "03:00") and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)


Gruß

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

Michi240281

Hi Damian!

Funktioniert besten! :)

Habe jetzt eine weitere Anwendung für dein neues Modul:

define Ambientelicht_TV notify My_Twilight IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)

Dabei sollen die Steckdosen auch angehen, wenn die DM500HD bereits an war, wenn Twilight < 3 wird. Habe dafür auf "My_Twilight" ein event-on-update reading auf "light" gesetzt, leider geht irgendwas noch nicht. Ne Idee wo der Fehler sich versteckt?

Danke schonmal!
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

Damian

Zitat von: Michi240281 am 09 März 2014, 20:03:31
define Ambientelicht_TV notify My_Twilight IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)

Ich sehe keinen Fehler. Da musst du im Event Monitor schauen, ob die Events auch kommen. Vielleich hast du durch event-on-update deine Events zu stark eingeschränkt.

Ob dein IF-Ausdruck grundsätzlich funktioniert, kannst du immer testen, indem du:


IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)


in der Kommandozeile aufrufst.

Wenn in My_Twillight:light noch etwas anderes als eine Zahl steht, so kannst du im Reading nach Zahlen filtern:

[My_Twilight:light:d]

Gruß

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