DOIF und Wait für Lüftersteuerung und Relais

Begonnen von Ruggy, 29 November 2021, 22:32:39

Vorheriges Thema - Nächstes Thema

Ruggy

Habe eine Lüftersteuerung (Luftfeuchtigkeitsabhängig) um den Keller trockener zu bekommen. Hier betreibe ich bereits seit einiger Zeit eine Steuerung, welche unter bestimmten Voraussetzung einen Lüfter für einer bestimmte Zeit einschaltet.
Im Lüftungsrohr habe ich zusätzlich eine Klappe, welche zufällt, wenn der Lüfter ausschaltet. Leider friert die Klappe manchmal an, fällt nicht mehr automatisch zu und die Luft kann weiter zirkulieren.

Deshalt habe ich jetzt eine Klappe im Rohr, welche mit 220 Volt auf und zu fährt. Dessen Motor hat drei Anschlüsse. Einmal Neutralleiter und ein Anschluss für öffnen und einer für schließen. Die Klappe benötigt ca. 10 Sekunden bis sie geschlossen oder offen ist. Danach schaltet der Motor automatisch aus.

Steuern möchte ich dies mit einem Zweitwegeschaltmodul (mit zwei Relais) von Xiaomi Aquara. Dies habe ich in FHEM bereits angelernt.
Es wurden zwei Devices (Lüftungsrohr_schießen und Lüftungsrohr_öffnen) angelegt.
Manuell kann ich die Klappe bereits steuern indem ich z.B. Lüftungsrohr_öffnen "on" mit der Maus klicke. Weil es ein Relais ist muß aber danach wieder auf "off" klicken, weil es nicht automatisch auf "off" umschaltet.

Kann folgendes DOIF funktionieren?

([deltadewpoint:state]>2.3 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<=9 and
[AUS_LUFTFEUCHTIGKEIT:temperature]>[KEL_LUFTFEUCHTIGKEIT:temperature])
(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)
DOELSE
(set HUEDevice9 off)


Als Attribut habe ich Wait 0,10,720 gesetzt.

Das heißt Strom für Klappe auf für 10 Sek, dann Lüfter nach 10 Sekunden an für 700 Sekunden und dann nach 720 Sekunden Strom für Klappe zu für 10 Sekunden.

Hier das List von der Lüftersteuerung:

Internals:
   DEF        ([deltadewpoint:state]>2.3 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<=9 and
[AUS_LUFTFEUCHTIGKEIT:temperature]>[KEL_LUFTFEUCHTIGKEIT:temperature])
(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ef63-f33f-f59f-0724-1fb6e7a4b53fc5e7
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_KALT
   NOTIFYDEV  KEL_LUFTFEUCHTIGKEIT,AUS_LUFTFEUCHTIGKEIT,global,deltadewpoint
   NR         113
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_KALT
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24429 2021-05-12 19:22:50
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1638220210.42912
           VALUE      cmd_2
   READINGS:
     2021-11-29 22:21:54   Device          deltadewpoint
     2021-11-29 22:10:10   cmd             2
     2021-11-29 22:10:10   cmd_event       KEL_LUFTFEUCHTIGKEIT
     2021-11-29 22:10:10   cmd_nr          2
     2021-11-29 22:21:53   e_AUS_LUFTFEUCHTIGKEIT_temperature -1.27
     2021-11-29 22:10:10   e_KEL_LUFTFEUCHTIGKEIT_temperature 8.89
     2021-11-29 22:21:54   e_deltadewpoint_state 8.7
     2021-11-29 22:07:39   mode            enabled
     2021-11-29 22:10:10   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       AUS_LUFTFEUCHTIGKEIT:
         0:
           temperature ^AUS_LUFTFEUCHTIGKEIT$:^temperature:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     cmdState:
     repeatcmd:
       7500
     wait:
       0:
         0
         10
         720
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2.3 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<=9 and ::ReadingValDoIf($hash,'AUS_LUFTFEUCHTIGKEIT','temperature')>::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')
   do:
     0:
       0          set HUEDevice18 on-for-timer 10
       1          set HUEDevice9 on-for-timer 700
       2          set HUEDevice7 on-for-timer 10
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^KEL_LUFTFEUCHTIGKEIT$|^AUS_LUFTFEUCHTIGKEIT$|^deltadewpoint$
     NOTIFYDEV  global|KEL_LUFTFEUCHTIGKEIT|AUS_LUFTFEUCHTIGKEIT|deltadewpoint
     event      8.7
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   deltadewpoint
     timerevent 8.7
     triggerDev deltadewpoint
     timerevents:
       8.7
     timereventsState:
       state: 8.7
     triggerEvents:
       8.7
     triggerEventsState:
       state: 8.7
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature AUS_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  7500
   room       Kellerlüftung
   wait       0,10,720


Danke
Grüße
Ruggy

Ruggy

Bevor ich das obere ausprobiere, wollte ich eine "einfachere" Schaltung mal testen (HUEDevice9 ist der Lüfter).
Diese soll immer um 12:15 Uhr ausgeführt werden.

Hier fehlt mir aber jetzt das Attribut "wait"


So sieht mein DEF beim DOIF aus:

([12:15])
(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)
DOELSE
(set HUEDevice9 off)


Funktioniert dies grundsätzlich? Stimmt die Angabe mit der Uhrzeit?

Damian

Zitat von: Ruggy am 30 November 2021, 12:24:10
Bevor ich das obere ausprobiere, wollte ich eine "einfachere" Schaltung mal testen (HUEDevice9 ist der Lüfter).
Diese soll immer um 12:15 Uhr ausgeführt werden.

Hier fehlt mir aber jetzt das Attribut "wait"


So sieht mein DEF beim DOIF aus:

([12:15])
(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)
DOELSE
(set HUEDevice9 off)


Funktioniert dies grundsätzlich? Stimmt die Angabe mit der Uhrzeit?

Du weißt ja: Probieren, geht über studieren. Was wie funktioniert oder nicht funktioniert, wirst du dann schon sehen. Beim Dummy kannst du ja nichts kaputt machen.

Ohne wait werden alle HUEDevices gleichzeitig gestartet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Aber ich bräuche das Wait, weil

HUEDevice18 sofort
HUEDevice9 nach 10 Sekunden
HUEDevice7 nach 700 Sekunden

eingeschaltet werden sollte.

Das wait ist aber als Attribut unter Module nicht vorhanden.
Bei oberen doif kann ich es dort finden und auswählen.

Leider ist das kein Dummy sondern der echte Lüfter und Xiaomi Zweiwegeschaltmodul für die Rohrklappe.
Deshalb wollte ich vor wissen ob es funktionieren könnte.

Damian

Dann poste das list vom DOIF, wo du kein wait auswählen kannst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

#5

Internals:
   CFGFN     
   DEF        ([12:15])
(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         1117595
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      initialized
   TYPE       DOIF
   VERSION    24429 2021-05-12 19:22:50
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1638271292.98603
           VALUE      initialized
   READINGS:
     2021-11-30 12:21:32   cmd             0
     2021-11-30 12:21:32   mode            enabled
     2021-11-30 12:21:32   state           initialized
     2021-11-30 12:21:33   timer_01_c01    01.12.2021 12:15:00
   Regex:
     accu:
     collect:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 10
       1          set HUEDevice9 on-for-timer 700
       2          set HUEDevice7 on-for-timer 10
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 1
     sleeptimer -1
   intervalfunc:
   localtime:
     0          1638357300
   realtime:
     0          12:15:00
   time:
     0          12:15:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1638357300:
       localtime  1638357300
       hash:
   uiState:
   uiTable:
Attributes:
   room       Kellerlüftung

Damian

Du befindest dich im DOIF-FHEM-Model, daher sollte das Attribut wait auswählbar sein. Vielleicht musst du deine Browserdarstellung aktualisieren. Das wait-Attribut ist dann nicht auswählbar, wenn man sich aufgrund der Definition im DOIF-Perl-Model befindet, das sieht man unter Model im Device.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Danke. Jetzt kann ich wait auswählen.
Unter Model stand pearl. Nachdem ich die Browserdarstellung aktualisiert habe stand FHEM drinnen und ich konnte auch wait auswählen.

Habe ich folgenden Ablauf für das wait richtig verstanden?

(set HUEDevice18 on-for-timer 10)
(set HUEDevice9 on-for-timer 700)
(set HUEDevice7 on-for-timer 10)


wait 0,20,720

HUEDevice18 wird sofort eingeschaltet und nach 10 Sekunden wieder aus
HUEDevice9 wird 20 Sekunden nachdem HUEDevice18 eingeschalten wurde eingeschalten und nach 700 Sekunden wieder aus
HUEDevice7 wird nach 720 Sekunden (700+20) eingeschaltet und nach 10 Sekunden wieder aus.

Habe es mit kürzeren Zeiträumen getestet aber bin mir nicht so ganz sicher.
Möchte vermeiden, dass der Lüfter läuft, wenn die Rohrklappe zu ist.



Damian

#8
Entscheidend ist, ob on-for-timer im Gerät läuft oder nur im HUE-Device nachgebildet ist. Beim letzteren hast du keine Garantie, dass der Abschaltbefehlt beim Aktor ankommt und das Gerät tatsächlich abschaltet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

#9
Oh je. Das habe ich mir mal wieder einfacher vorgestellt.

Wie kann ich feststellen ob on-for-timer im Gerät läuft?
Das HUEDevice9 ist eine Osram Smart + Steckdose und das HUEDevice18 und HUEDevice7 wie beschrieben der Xiaomi Aquara Schaltaktor mit 2 Relais.


Was wäre eine bessere Methode für mein Vorhaben?
Vor allem, dass es auch mit meiner "Schaltung" aus dem Eröffnungsthread funktioniert (für das benötige ich ja wahrscheinlich DOIF?).


Damian

Zitat von: Ruggy am 30 November 2021, 20:01:35
Oh je. Das habe ich mir mal wieder einfacher vorgestellt.

Wie kann ich feststellen ob on-for-timer im Gerät läuft?

Was wäre eine bessere Methode für mein Vorhaben?
Vor allem, dass es auch mit meiner "Schaltung" aus dem Eröffnungsthread funktioniert (für das benötige ich ja wahrscheinlich DOIF?).

Kritische Steuerungsaufgaben sollten kein Funk verwenden und kein FHEM. So etwas programmierst du besser im Microcontroller mit Relais auf einer Platine.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

#11
Zitat von: Damian am 30 November 2021, 20:05:40
Kritische Steuerungsaufgaben sollten kein Funk verwenden und kein FHEM. So etwas programmierst du besser im Microcontroller mit Relais auf einer Platine.

Dann muss ich leider passen. Das kann ich leider nicht.

Die Osram Steckdose müsste einen Rückkanal haben?
Zur Not müsste ich halt anstatt dem Schaltrelais zwei weitere Osram Steckdosen verwenden.

Wäre das sicherer?

Damian

Zitat von: Ruggy am 30 November 2021, 20:15:12
Dann muss ich leider passen. Das kann ich leider nicht.

Kann man es evlt. mit einer Art Rückmeldung machen?

Meine Hue-Steckdose ist heute nicht angegangen, obwohl sie korrekt eingeschaltet wurde. Ob Zigbee, HM mit Rückkanal oder sonst was für ein Protokoll - beim Funk wirst du nie eine 100-prozentige Garantie beim Schalten haben.

Vielleicht kannst du dir etwas mit esp und Relais-Modulen etwas bauen oder von jemandem bauen lassen, der sich damit auskennt (230V!)

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

Ruggy

Habe zwar vor ca. zwei Jahren etwas mit einen ESP gemacht und mit arduino ide bespielt. Aber größtenteils nur nach einer Anleitung nachgebaut. Ich hätte sogar noch einen und ein paar andere Sachen, die ich mir damals bestellt hatte. Evlt. sogar Relais.

Momentan fällt mir leider niemand ein, der soetwas könnte für mich bauen könnte. Ich bin zwar seit ca. 2 Jahren in einem FatLab aber wegen Corona schon längere Zeit nicht mehr dort gewesen. Es findet derzeit auch kein Treffen wie damals statt. Dort hätte ich bestimmt jemanden getroffen, der dies kann.

Evlt. könntest Du mir grob sagen, was der ESP übernehmen soll. Evlt. kann ich beim FatLab per Email mal nachfragen.
Verstehe ich es richtig, dass FHEM z.B. den Befehl gibt set Lüftungs_ESP on und der ESP übernimmt den Teil mit der Steuerung bzgl. Klappe auf, nach 10 Sek Lüfter an, nach 700 Sek Lüfter aus und danach die Klappe zu?

Wobei es schon wichtig wäre die Lüfterzeit per FHEM variabel festzulegen (Winter anders als im Sommer).
Wäre das auch mit ESP möglich? Das dieser nur die Steuerung der Klappen übernimmt und den Lüfter nach Vorgabe der Zeit durch FHEM einschaltet?
Kann der ESP auch über ZigBee angesteuert werden oder ist anderes Funksignal besser?

Damian

Ich steuere meine Heizung z. B. auch per FHEM, allerdings nur unkritische Sachen, wie Temperaturvorgabe oder Zeiten, also alles, was man als User von außen verändern darf. Interne Abläufe sind dem Hersteller vorbehalten und das ist aus Sicherheitsgründen auch gut so.

Das würde für dich bedeuten: Dein FHEM kann durchaus etwas steuern, allerdings unter der Annahme, dass es mal nicht funktioniert mit entsprechenden Konsequenzen, die nicht sicherheitsrelevant sein sollten.

Am besten fragst du im anderen Board nach, wo sich mehr Elektronik-Freaks aufhalten. Hier geht es ja in erster Linie um die Steuerung unkritischer Dinge, wie bei allen FHEM-Modulen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

#15
Hallo,
evlt. ist dies doch eine Anfängerfrage, weil es eigenlich nur um einen Zeitablauf bei DoIF und wait geht.

Habe jetzt schon herumprobiert aber irgendwie funktioniert es nicht.

In kürze, was eigentlich passieren sollte (vorheriges bräuchte dazu nicht unbedingt gelesen werden):

- 1. Relais (HUEDevice18) sofort  für 17 Sekunden auf ein dann auf aus.
- dann nach 20 Sekunden (also 3 Sekunden nachdem 1.Relais auf aus ist) Lüfter für 900 Sekunden einschalten (HUEDevice9).
- 2. Relais (HUEDevice7) 20 Sekunden nachdem der Lüfter ausgeschalten hat (900 Sekunden Laufzeit) für 17 Sekunden auf ein schalten dann wieder aus

Leider schließt das Relais nach ca. 15 min aber der Lüfter ist nach 17 Minuten immer noch gelaufen.

Was mache ich falsch?


Hier das List (mit dem Wait-Befehl):

Internals:
   DEF        ([16:11])
(set HUEDevice18 on-for-timer 17)
(set HUEDevice9 on-for-timer 900)
(set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1638718000.09559
           VALUE      cmd_1
   READINGS:
     2021-12-05 16:26:40   cmd             1.3
     2021-12-05 16:26:40   cmd_event       timer_1
     2021-12-05 16:26:40   cmd_nr          1
     2021-12-05 16:26:40   cmd_seqnr       3
     2021-12-05 16:10:41   mode            enabled
     2021-12-05 16:26:40   state           cmd_1
     2021-12-05 16:11:00   timer_01_c01    06.12.2021 16:11:00
     2021-12-05 16:26:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1638803460
   realtime:
     0          16:11:00
   time:
     0          16:11:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1638803460:
       localtime  1638803460
       hash:
   uiState:
   uiTable:
Attributes:
   room       Kellerlüftung
   wait       0,20,920:0

Ruggy

#16
Ist es wichtig, dass beim DOIF zwischen (set...) (set...) ein Leerzeichen ist?
Kann das ein Fehler gewesen sein?

Hatte kein Leerzeichen dazwischen und eins eingefügt und gespeichert.
Jetzt funktionierte es.

Ruggy

Hallo,
leider funktioniert es immer noch nicht so wie ich es mir vorstelle und komme nicht auf den Fehler.

Wo liegt der Fehler, dass die "Zwangslüftung" um 4:00 Uhr nicht ausgeführt wird?

Anfangs funktionierte es ein paar Mal aber dann nicht mehr.

Hier ist der List von dem DOIF:

Internals:
   DEF        ([04:00])
(set HUEDevice18 on-for-timer 17) (set HUEDevice9 on-for-timer 900) (set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639278940.07351
           VALUE      cmd_1
   READINGS:
     2021-12-12 04:15:40   cmd             1.3
     2021-12-12 04:15:40   cmd_event       timer_1
     2021-12-12 04:15:40   cmd_nr          1
     2021-12-12 04:15:40   cmd_seqnr       3
     2021-12-11 23:27:57   mode            enabled
     2021-12-12 04:15:40   state           cmd_1
     2021-12-14 04:00:00   timer_01_c01    15.12.2021 04:00:00
     2021-12-12 04:15:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: timer_1
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: timer_1
       state: cmd_1
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1639537200
   realtime:
     0          04:00:00
   time:
     0          04:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1639537200:
       localtime  1639537200
       hash:
   uiState:
   uiTable:
Attributes:
   room       Kellerlüftung
   wait       0,20,920:0

Damian

Du befindest dich im FHEM-Modus, solange cmd_2 nicht kommt, wird cmd_1 nicht wiederholt. Das kannst du mit do always-Attribut ändern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Ich habe jetzt einfach das Attribut do allways gesetzt und das war alles und sollte funktionieren?

Wird das immer benötigt, wenn ich ein DOIF mit einem Attribut wait habe?
Ich dachte, dass das Ereignis ja immer erneut um 4:00 Uhr statt findet und dann das DOIF immer von Beginn abläuft.
Oder ist das wegen dem Attribut "wait" im DOIF immer so, dass ich auch das "do allways" immer benötige?

Hier der aktuelle List mit den "do allways":
Internals:
   DEF        ([04:00])
(set HUEDevice18 on-for-timer 17) (set HUEDevice9 on-for-timer 900) (set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639278940.07351
           VALUE      cmd_1
   READINGS:
     2021-12-12 04:15:40   cmd             1.3
     2021-12-12 04:15:40   cmd_event       timer_1
     2021-12-12 04:15:40   cmd_nr          1
     2021-12-12 04:15:40   cmd_seqnr       3
     2021-12-11 23:27:57   mode            enabled
     2021-12-12 04:15:40   state           cmd_1
     2021-12-14 04:00:00   timer_01_c01    15.12.2021 04:00:00
     2021-12-12 04:15:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1639537200
   realtime:
     0          04:00:00
   time:
     0          04:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1639537200:
       localtime  1639537200
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Kellerlüftung
   wait       0,20,920:0

Damian

Das hat mit wait nichts zu tun, sondern mit der Tatsache, dass DOIF im FHEM-Modus zustandsorientiert arbeitet. Ich merke, du hast die Commanderf zum DOIF noch nicht intensiv genug studiert :)

Dieser Absatz steht direkt in der Einleitung in der Commadref zu DOIF:

ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Statuswechsel des DOIF-Moduls stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen. Das Verhalten des Moduls im FHEM-Modus kann durch diverse Attribute verändert werden. Im FHEM-Modus wird maximal nur ein Zweig pro Ereignis- oder Zeit-Trigger ausgeführt, es gibt nur einen Wait-Timer.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Hallo,
sorry konnte gestern nicht mehr antworten. Ist was dazwischen gekommen.

Heute nacht hat es funktioniert und der Lüfter hat sich um 4:00 Uhr eingeschaltet.

Und Du hast recht, ich habe anscheindend das Prinzip noch nicht verstanden (wie auch manch andere FHEM-Steuerungen; bin leider nicht vom Fach und habe das Grundverständnis leider noch nicht erreicht).
Die Commandref habe ich mir zwar angeschaut aber es anscheinden falsch verstanden.

Habe es so verstanden, dass ein Ausführungszweig wie in meinem Beispiel das "([04:00])" ist und der andere "DOELSE (set HUEDevice9 off)".

Dann würde doch immer, wenn es gerade nicht 4:00 Uhr ist, der Ausführungszweig mit DOELSE ausgeführt (weil es nicht 4:00 Uhr ist) und somit ein Statuswechsel stattfinden.
Habe ich das anscheinend nicht richtig verstanden?

Damian

Naja, bei deiner Definition kann der DOELSE-Fall gar nicht auftreten.

Um 4:00 Uhr wird getriggert und da ist die Bedingung immer wahr, also wird immer der erste Zweig ausgeführt. Da es keine weiteren Trigger gibt, kann der DOELSE-Fall nie zuschlagen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Das leuchtet mir jetzt ein.

Dann sollte mein anderer dazugehöriger DOIF demnach ohne "do always" funktionieren?

Der erste Ausführungszweig wäre demnach der Teil mit den Bedingungen für Temperatur und dewpoint und der zweite Ausführungszweig bei DOELSE.
Wenn der erste nicht zutrifft würde der zweite zutreffen und umgekehrt; und somit nach der Zeit von 4800 Sekunden (repeatcmd) erneut von vorne beginnen?

Internals:
   DEF        ([deltadewpoint:state]>2.3 and
[KEL_LUFTFEUCHTIGKEIT:temperature]>8.5 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<12)
(set HUEDevice18 on-for-timer 17)
(set HUEDevice9 on-for-timer 1200)
(set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ee07-f33f-f59f-9eb7-12b1002aa68bffa8
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_NORMAL
   NOTIFYDEV  deltadewpoint,global,KEL_LUFTFEUCHTIGKEIT
   NR         111
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_NORMAL
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639566310.61321
           VALUE      cmd_1
   READINGS:
     2021-12-15 12:56:19   Device          deltadewpoint
     2021-12-15 12:05:10   cmd             1.3
     2021-12-15 12:05:10   cmd_event       deltadewpoint
     2021-12-15 12:05:10   cmd_nr          1
     2021-12-15 12:05:10   cmd_seqnr       3
     2021-12-15 12:14:23   e_KEL_LUFTFEUCHTIGKEIT_temperature 8.61
     2021-12-15 12:56:19   e_deltadewpoint_state 5.1
     2021-12-15 10:50:29   mode            enabled
     2021-12-15 12:05:10   state           cmd_1
     2021-12-15 12:05:10   wait_timer      15.12.2021 13:25:10 cmd_1_1 deltadewpoint
   Regex:
     accu:
     collect:
     cond:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     cmdState:
     repeatcmd:
       4800
     wait:
       0:
         0
         20
         1220
       1:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2.3 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')>8.5 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<12
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 1200
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^deltadewpoint$|^KEL_LUFTFEUCHTIGKEIT$
     NOTIFYDEV  global|deltadewpoint|KEL_LUFTFEUCHTIGKEIT
     event      5.1
     globalinit 1
     last_timer 0
     sleepdevice deltadewpoint
     sleepsubtimer 0
     sleeptimer 0
     timerdev   deltadewpoint
     timerevent 5.1
     triggerDev deltadewpoint
     timerevents:
       5.1
     timereventsState:
       state: 5.1
     triggerEvents:
       5.1
     triggerEventsState:
       state: 5.1
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  4800
   room       Kellerlüftung
   wait       0,20,1220:0




Damian

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

Ruggy

Dann habe ich es jetzt zumindest grundsätzlich verstanden.

Danke.

satprofi

#26
Hallo.
möchte 2 devices abschalten, aber verzögert. Habe fhem neu auf bullseye aufgesetzt, und bekomme es nicht hin das die verzögerung zutrifft. lampe 2 sollte 20 sekundcen später abschalten



Internals:
   CFGFN     
   DEF        ([dummy1] eq "on") (set Socket_4_bf50219899eabfb485synp on, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 on)
DOELSE (set Socket_4_bf50219899eabfb485synp off, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off)
   FUUID      61fd0d4a-f33f-6462-46e0-8631fa18b68ac9c8
   MODEL      FHEM
   NAME       wait
   NOTIFYDEV  dummy1,global
   NR         9161
   NTFY_ORDER 50-wait
   STATE      cmd_2
   TYPE       DOIF
   VERSION    25386 2021-12-28 22:19:25
   READINGS:
     2022-02-04 12:28:42   Device          dummy1
     2022-02-04 12:28:52   cmd             2
     2022-02-04 12:28:52   cmd_event       dummy1
     2022-02-04 12:28:52   cmd_nr          2
     2022-02-04 12:28:42   e_dummy1_STATE  off
     2022-02-04 12:27:34   mode            enabled
     2022-02-04 12:28:52   state           cmd_2
     2022-02-04 12:28:52   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       dummy1:
         0:
           &STATE     ^dummy1$
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         10
         30
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'dummy1','STATE') eq "on"
   do:
     0:
       0          set Socket_4_bf50219899eabfb485synp on, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 on
     1:
       0          set Socket_4_bf50219899eabfb485synp off, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off
   helper:
     DEVFILTER  ^global$|^dummy1$
     NOTIFYDEV  global|dummy1
     event      off
     globalinit 1
     last_timer 0
     sleepdevice dummy1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dummy1
     timerevent off
     triggerDev dummy1
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: dummy1
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: dummy1
       state: cmd_2
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     all         dummy1:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   group      test
   room       DOIF
   wait       0:10,30


auf einem älteren system kalppt es aber hervorragend


DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py", setreading Wert_I A 48)
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

statt:

wait       0:10,30

eher

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

satprofi

hallo.
ich will ja nur abschalten verzögern, muss es daher nicht 0:0,20 sein?
hab ich aber auch getestet, klappt einfach nicht. beide schalten gleichzeitig.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Dann:

DOELSE (set Socket_4_bf50219899eabfb485synp off) (set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off)

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

satprofi

Zitat von: Damian am 04 Februar 2022, 15:05:45
Dann:

DOELSE (set Socket_4_bf50219899eabfb485synp off) (set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off)

wait 0:0,20

Interessant. Am alten System klappt aber noch so

DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py", setreading Wert_I A 48)
gabs update?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 04 Februar 2022, 19:00:39
Interessant. Am alten System klappt aber noch so

DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py", setreading Wert_I A 48)
gabs update?

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

satprofi

also funktioniert es auch so, nur mit bullseye 2 klammern nötig.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 05 Februar 2022, 13:43:42
also funktioniert es auch so, nur mit bullseye 2 klammern nötig.

Also wenn eine Verzögerung beim zweiten Befehl festzustellen war, dann aber nicht durch die wait-Angabe.

Verzögerungen für Befehle einer Sequenz funktionieren nur, wenn man die einzelnen Befehle separat klammert - das war immer so, siehe: https://fhem.de/commandref_DE.html#DOIF_wait



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

satprofi

hallo.
so sollte es 100% klappen?


DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py") (setreading Wert_I A 48)

wait 0:0,2
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 05 Februar 2022, 17:56:17
hallo.
so sollte es 100% klappen?


DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py") (setreading Wert_I A 48)

wait 0:0,2

du kannst es einfach über set  wait cmd_2 ausprobieren :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

klappr leider nicht. 2. befehl wird nur abgesetzt wenn beide in 1 klammer, mit komma getrennt, stehen.
wiw gesagt, stretch mit fhem 5.8
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Per

Zitat von: Ruggy am 30 November 2021, 20:15:12
Das kann ich leider nicht..
Schau dir mal die Logo von Siemens an, die gibt es a als 230V Variante.


Zitat von: Ruggy am 30 November 2021, 20:15:12
Wäre das sicherer?
Nicht wirklich, denn du musst auch sicherstellen, dass nicht beide Steckdosen gleichzeitig schalten. Von der Verkabelung mal ganz abgesehen.