DOIF neue Features (Sleep-Alternative)

Begonnen von Damian, 12 Juli 2015, 21:17:52

Vorheriges Thema - Nächstes Thema

Virsacer

Nein, da ich nur einen Fall habe, sollte das DOELSE eigentlich implizit sein, mit der alten Version gings auch ohne und in der Commandref stehts auch nur so drin:
ZitatAnwendungsbeispiel: Benachrichtung "Waschmaschine fertig", wenn Verbrauch mindestens 5 Minuten unter 2 Watt (Perl-Code wird in geschweifte Klammern gesetzt):

define di_washer DOIF ([power:watt]<2) ({system("wmail washer finished")})
attr di_washer wait 300

...aber mit einem expliziten DOELSE() funktioniert es tatsächlich :o

Danke :)

Damian

#151
Zitat von: Virsacer am 03 September 2015, 18:12:26
Nein, da ich nur einen Fall habe, sollte das DOELSE eigentlich implizit sein, mit der alten Version gings auch ohne und in der Commandref stehts auch nur so drin:
...aber mit einem expliziten DOELSE() funktioniert es tatsächlich :o

Danke :)

ja, das wurde irgendwann geändert. Der imaginäre DOELSE-Fall wird nur noch ohne do always gesetzt. In Verbindung mit do always muss man explizit DOELSE ohne etwas angeben. Das hat aber nichts mit der neuen Version zu tun.

Gruß

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

Mumpitz

Hallo Damian

Besten Dank für Dein absolut cooles Modul. Mittlerweilen habe ich fast alle Notifys durch DOIF ersetzt, da es für mich als "nichtprogrammierer" doch sehr viel einfacher zum nachvollziehen  ist...

Ich setzte folgendes DOIF seit mehreren Monaten ein. Es hat immer perfekt funktioniert. Komischerweise heute nicht mehr... Kann es einen Zusammenhang mit dem update des Moduls haben?

Es ist eine Beschattungssteuereung, welche einen Dummy "Beschattung_OG" schaltet, welcher wiederum die Rollladen Temperaturabhängig ganz oder teilweise zu fährt....
Hier das List:

Internals:
   DEF        ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "off" and [Helligkeit_Twilight:azimuth] > 109 and [Helligkeit_Twilight:azimuth] < 270 and ([Multisensor_Ost:state] > 25000 or [Sensor_Licht_Sued:state] > 19000)) (set Beschattung_OG on)
DOELSEIF ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "on" and [Helligkeit_Twilight:azimuth] > 109 and [Helligkeit_Twilight:azimuth] < 270 and [Sensor_Licht_Sued:state] < 9000) (set Beschattung_OG off)
DOELSEIF ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "on" and ([Helligkeit_Twilight:azimuth] > 277 or [Helligkeit_Twilight:compasspoint] eq "west")) (set Beschattung_OG off)
   NAME       di_SoSchu_OG
   NR         119
   NTFY_ORDER 50-di_SoSchu_OG
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-09-07 11:48:38   Device          Helligkeit_Twilight
     2015-09-05 10:32:45   cmd_event       Multisensor_Ost
     2015-09-05 10:32:45   cmd_nr          1
     2015-09-07 11:44:03   e_Beschattung_OG_STATE off
     2015-09-07 11:48:38   e_Helligkeit_Twilight_azimuth 148.18
     2015-09-07 11:48:38   e_Helligkeit_Twilight_compasspoint southeast
     2015-09-07 11:48:31   e_Multisensor_Ost_state 37134
     2015-09-07 11:47:07   e_Sensor_Licht_Sued_state 39640
     2015-09-05 10:32:45   state           cmd_1
     2015-09-06 08:50:23   wait_timer      no timer
   Condition:
     0          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "off" and ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 109 and ReadingValDoIf('Helligkeit_Twilight','azimuth','') < 270 and (ReadingValDoIf('Multisensor_Ost','state','') > 25000 or ReadingValDoIf('Sensor_Licht_Sued','state','') > 19000)
     1          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "on" and ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 109 and ReadingValDoIf('Helligkeit_Twilight','azimuth','') < 270 and ReadingValDoIf('Sensor_Licht_Sued','state','') < 9000
     2          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "on" and (ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 277 or ReadingValDoIf('Helligkeit_Twilight','compasspoint','') eq "west")
   Devices:
     0           Auto_Beschattung Beschattung_OG Helligkeit_Twilight Multisensor_Ost Sensor_Licht_Sued
     1           Auto_Beschattung Beschattung_OG Helligkeit_Twilight Sensor_Licht_Sued
     2           Auto_Beschattung Beschattung_OG Helligkeit_Twilight
     all         Auto_Beschattung Beschattung_OG Helligkeit_Twilight Multisensor_Ost Sensor_Licht_Sued
   Do:
     0:
       0          set Beschattung_OG on
     1:
       0          set Beschattung_OG off
     2:
       0          set Beschattung_OG off
     3:
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
     0           Auto_Beschattung:STATE Beschattung_OG:STATE
     1           Auto_Beschattung:STATE Beschattung_OG:STATE
     2           Auto_Beschattung:STATE Beschattung_OG:STATE
     all         Auto_Beschattung:STATE Beschattung_OG:STATE
   Itimer:
   Readings:
     0           Helligkeit_Twilight:azimuth Multisensor_Ost:state Sensor_Licht_Sued:state
     1           Helligkeit_Twilight:azimuth Sensor_Licht_Sued:state
     2           Helligkeit_Twilight:azimuth Helligkeit_Twilight:compasspoint
     all         Helligkeit_Twilight:azimuth Multisensor_Ost:state Sensor_Licht_Sued:state Helligkeit_Twilight:compasspoint
   State:
   Trigger:
Attributes:
   wait       900:2400


Aus meiner Sicht müsste mittlerweilen ein Timer gestartet sein, da sämtliche Bedingungen für die Erfüllung gegeben sind, oder?

Danke fürs anschauen

mfeske

Hallo zusammen,

im kleinen funktioniert es mit dem wait ganz gut bei mir, aber wenn es etwas länger wird, blicke sich selber nicht mehr durch :-( da war das setzen vom sleep zwischendrin einfacher, das scheint jetzt aber nicht mehr zuverlässig zu funktionieren. Könnt Ihr mir beim überführen zu wait behilflich sein ?
Kompliziert wird es natürlich auch, wenn man im Ausführungsteil etwas ergänzt und dann mit den waits durcheinander kommt.

([{sunset(-1200)}|8]) (set Rolladen01 on, set Rolladen01_Zustand down, set gong_MP3 playTone 0, sleep 1; set gong_MP3 playTone 008, sleep 1; set gong_MP3 playTone 0) DOELSEIF ([{sunset(-2400)}|7]) (set Rolladen01 on, set Rolladen01_Zustand down, set gong_MP3 playTone 0, sleep 1; set gong_MP3 playTone 008, sleep 1; set gong_MP3 playTone 0) DOELSEIF ([{sunrise(+2)}|8]) (set Rolladen01 off, set Rolladen01_Zustand up, set gong_MP3 playTone 0, sleep 1; set gong_MP3 playTone 009, sleep 1; set gong_MP3 playTone 0) DOELSEIF ([{sunrise(+1200)}|7]) (set Rolladen01 off, set Rolladen01_Zustand up, set gong_MP3 playTone 0, sleep 1; set gong_MP3 playTone 009, sleep 1; set gong_MP3 playTone 0)

Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Damian

Zitat von: Mumpitz am 07 September 2015, 11:50:34
Hallo Damian

Besten Dank für Dein absolut cooles Modul. Mittlerweilen habe ich fast alle Notifys durch DOIF ersetzt, da es für mich als "nichtprogrammierer" doch sehr viel einfacher zum nachvollziehen  ist...

Ich setzte folgendes DOIF seit mehreren Monaten ein. Es hat immer perfekt funktioniert. Komischerweise heute nicht mehr... Kann es einen Zusammenhang mit dem update des Moduls haben?

Es ist eine Beschattungssteuereung, welche einen Dummy "Beschattung_OG" schaltet, welcher wiederum die Rollladen Temperaturabhängig ganz oder teilweise zu fährt....
Hier das List:

Internals:
   DEF        ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "off" and [Helligkeit_Twilight:azimuth] > 109 and [Helligkeit_Twilight:azimuth] < 270 and ([Multisensor_Ost:state] > 25000 or [Sensor_Licht_Sued:state] > 19000)) (set Beschattung_OG on)
DOELSEIF ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "on" and [Helligkeit_Twilight:azimuth] > 109 and [Helligkeit_Twilight:azimuth] < 270 and [Sensor_Licht_Sued:state] < 9000) (set Beschattung_OG off)
DOELSEIF ([Auto_Beschattung] eq "on" and [Beschattung_OG] eq "on" and ([Helligkeit_Twilight:azimuth] > 277 or [Helligkeit_Twilight:compasspoint] eq "west")) (set Beschattung_OG off)
   NAME       di_SoSchu_OG
   NR         119
   NTFY_ORDER 50-di_SoSchu_OG
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-09-07 11:48:38   Device          Helligkeit_Twilight
     2015-09-05 10:32:45   cmd_event       Multisensor_Ost
     2015-09-05 10:32:45   cmd_nr          1
     2015-09-07 11:44:03   e_Beschattung_OG_STATE off
     2015-09-07 11:48:38   e_Helligkeit_Twilight_azimuth 148.18
     2015-09-07 11:48:38   e_Helligkeit_Twilight_compasspoint southeast
     2015-09-07 11:48:31   e_Multisensor_Ost_state 37134
     2015-09-07 11:47:07   e_Sensor_Licht_Sued_state 39640
     2015-09-05 10:32:45   state           cmd_1
     2015-09-06 08:50:23   wait_timer      no timer
   Condition:
     0          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "off" and ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 109 and ReadingValDoIf('Helligkeit_Twilight','azimuth','') < 270 and (ReadingValDoIf('Multisensor_Ost','state','') > 25000 or ReadingValDoIf('Sensor_Licht_Sued','state','') > 19000)
     1          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "on" and ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 109 and ReadingValDoIf('Helligkeit_Twilight','azimuth','') < 270 and ReadingValDoIf('Sensor_Licht_Sued','state','') < 9000
     2          InternalDoIf('Auto_Beschattung','STATE','') eq "on" and InternalDoIf('Beschattung_OG','STATE','') eq "on" and (ReadingValDoIf('Helligkeit_Twilight','azimuth','') > 277 or ReadingValDoIf('Helligkeit_Twilight','compasspoint','') eq "west")
   Devices:
     0           Auto_Beschattung Beschattung_OG Helligkeit_Twilight Multisensor_Ost Sensor_Licht_Sued
     1           Auto_Beschattung Beschattung_OG Helligkeit_Twilight Sensor_Licht_Sued
     2           Auto_Beschattung Beschattung_OG Helligkeit_Twilight
     all         Auto_Beschattung Beschattung_OG Helligkeit_Twilight Multisensor_Ost Sensor_Licht_Sued
   Do:
     0:
       0          set Beschattung_OG on
     1:
       0          set Beschattung_OG off
     2:
       0          set Beschattung_OG off
     3:
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
     0           Auto_Beschattung:STATE Beschattung_OG:STATE
     1           Auto_Beschattung:STATE Beschattung_OG:STATE
     2           Auto_Beschattung:STATE Beschattung_OG:STATE
     all         Auto_Beschattung:STATE Beschattung_OG:STATE
   Itimer:
   Readings:
     0           Helligkeit_Twilight:azimuth Multisensor_Ost:state Sensor_Licht_Sued:state
     1           Helligkeit_Twilight:azimuth Sensor_Licht_Sued:state
     2           Helligkeit_Twilight:azimuth Helligkeit_Twilight:compasspoint
     all         Helligkeit_Twilight:azimuth Multisensor_Ost:state Sensor_Licht_Sued:state Helligkeit_Twilight:compasspoint
   State:
   Trigger:
Attributes:
   wait       900:2400


Aus meiner Sicht müsste mittlerweilen ein Timer gestartet sein, da sämtliche Bedingungen für die Erfüllung gegeben sind, oder?

Danke fürs anschauen

Der letzte Schaltvorgang war um 2015-09-05 10:32:45 allerdings ohne Verzögerung, denn das Event war zum gleichen Zeitpunkt.

Hast du wait später gesetzt?

Bei mir laufen alle Verzögerung seit über einem Monat mit der neuen Version fehlerfrei.

Gruß

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

Mumpitz

Nein. Das wait war schon immer so!

Kann es sein, dass das Problem war, dass der Status auf cmd_1 stand? Und dann wäre ja cmd_1 erneut aufgerufen worden wenn genug Sonne vorhanden war. Dann klappt es glaub nicht, oder? Könnte ich das mit dem do always umgehen?

Damian

Zitat von: Mumpitz am 07 September 2015, 22:33:59
Nein. Das wait war schon immer so!

Kann es sein, dass das Problem war, dass der Status auf cmd_1 stand? Und dann wäre ja cmd_1 erneut aufgerufen worden wenn genug Sonne vorhanden war. Dann klappt es glaub nicht, oder? Könnte ich das mit dem do always umgehen?

do always ist nicht sinnvoll, falls ein Device zyklisch sendet.

Ich weiß nicht, ob du zwischendurch das System neu gestartet hast. Du kannst das DOIF-Modul mit dem Attribut initialize beim Hochfahren neuinitialisieren lassen, dann wird nach dem Neustart unabhängig vom alten Zustand auf jeden Fall geschaltet, wenn die entsprechende Bedingung wahr wird.

Gruß

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

Toto1973

Zitat von: Damian am 27 Juli 2015, 10:36:43
Mal zur Info:

Man kann jetzt mit der neuen Version auch solche Sachen machen:

define di_Zufall DOIF ([:00]) (set bla on)

attr di_Zufall do always
attr di_Zufall timerWithWait
attr di_Zufall wait rand(60)


Gruß

Damian

Geht das dann auch in der Form?
attr di_Zufall wait rand(60):rand(900):0,5:10
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Damian

Zitat von: Toto1973 am 09 September 2015, 10:43:07
Geht das dann auch in der Form?
attr di_Zufall wait rand(60):rand(900):0,5:10

Klar. Zitat aus der Commandref:

Verzögerungen
...

Statt Sekundenangaben können ebenfalls Stati in eckigen Klammen oder Perlbefehle angegeben werden.

Gruß

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

Toto1973

#159
Ich hätte da noch "Vorschläge/Verbesserungen" :-)
Ich würde mir eine Datumssteuerung wünschen. Also das ich sagen kann, am XX.12.12 um 14 Uhr steuern. Dazu dann eben Dinge wie ab XX.12. alle 2 Tage usw...

Der 2. Vorschlag wäre, das DOIF alle "Zeilen" (also alle DOIFs und DOELSEIF) bis zum Ende durchsucht und alle Bedingungen, die eben wahr sind ausführt.
Nach meinen Kenntnisstand hört DOIF ja dann auf zu suchen, wenn eine "Zeile" (Bedingung) wahr ist.
Um das steuern zu können, könnte man ja das Attribut Do um einen Befehl erweitern.

Anwendungsbeispiel ist hier zum Beispiel eine Lichtsteuerung. Abhängig von Uhrzeiträumen sollen 2 Lampen gesteuert werden. Lampe 1 von 16:00 bis 22:00 Uhr wenn TV an ist, 2. Lampe von 17:00 bis 22:00 Uhr, wenn TV an ist.
Überschneidet sich dann der Zeitraum (TV geht um 17:10 Uhr an), wird ja nun die erste Bedingung (Lampe 1) geschaltet. Somit muss man die Steuerung in 2 DOIFs packen.
Ich würde es aber schöner finden, wenn ich beides in ein DOIF packen könnte. Dann müssen nicht so viele Prozesse im Hintergrund laufen!
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Ralli

Hallo Toto,

die Datumssteuerung ist m.W. in der Pipeline.

Den 2. Vorschlag finde ich in dieser Form unpassend - das hat mit if und else dann gar nichts mehr zu tun. Aber auch hier plant Damian m.W. die Möglichkeit, in der Def zusätzlich zu DOELSEIF und DOELSE noch weitere DOIFs einzubauen - damit wäre vermutlich das erfüllt, was Du Dir vorstellst.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Ellert

@Toto1973: Fall 2 ist mit einer hinreichend genauen Bedingung zu lösen.
define du DOIF ([16:00:00-16:59:59] and [TVan]) (set Lampe1 on)
DOELSEIF ([17:00:00-22:00:00] and [TVan]) (set Lampe1:FILTER=STATE=off on, set Lampe2 on)



Damian

#162
Zitat von: Ralli am 11 September 2015, 10:32:41
Hallo Toto,

die Datumssteuerung ist m.W. in der Pipeline.

Den 2. Vorschlag finde ich in dieser Form unpassend - das hat mit if und else dann gar nichts mehr zu tun. Aber auch hier plant Damian m.W. die Möglichkeit, in der Def zusätzlich zu DOELSEIF und DOELSE noch weitere DOIFs einzubauen - damit wäre vermutlich das erfüllt, was Du Dir vorstellst.

Ich habe mal überlegt mehrere DOIF-Fälle in einem Modul zu erlauben, das hätte allerdings einen entscheidenden Nachteil, dass mehrere Zustände (von verschiedenen DOIF-Fällen) bei einem Trigger nacheinander gesetzt und sich damit überschreiben würden.  Damit würde man Problemfälle kaum noch nachvollziehen können - daher bleibt erst einmal alles beim alten. 

In solch einem Fall muss man einfach mehrere DOIFs definieren.

Gruß

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

Toto1973

Zitat von: Ellert am 11 September 2015, 21:00:06
define du DOIF ([16:00:00-16:59:59] and [TVan]) (set Lampe1 on)
DOELSEIF ([17:00:00-22:00:00] and [TVan]) (set Lampe1:FILTER=STATE=off on, set Lampe2 on)

Kurze Frage dazu: Was bewirkt dieses ":FILTER=STATE=off"?
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Ralli

#164
Das soll bewirken, dass Lampe1 nur eingeschaltet wird, wenn sie aus ist.

Siehe commandref, Abschnitt "Geräte-Spezifikation (devspec)".

Hier im konkreten Fall wird sie aber wohl auf jeden Fall eingeschaltet - auch wenn sie an ist.

Zitat
falls ein Gerätename exakt dem Spezifikation entspricht, dann werden keine reguläre Ausdrücke oder Filter ausgewertet.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa