Hallo,
ich hab mal eine theoretishe Frage:
ich habe einen Entfeuchter für den Hobbyraum laufen, dieser soll Zeit und von mehreren anderen Geräte abhängig aus und wieder an geschaltet werden.
Z.B. an Werktagen von 07.00 - 17.00 und an Wochenenden und in den Ferien von 10.00 - 17:00 Uhr. Weiterhin sollen zwei Presence abgefragt werden und das Gerät davon abhängig aus, und wenn die wieder absent sind eingeschaltet werden. Wochennde steht per $we zur Verfügung, für die Ferien habe ich einen Schalter, die Presence sind auch vorhanden und laufen.
Versucht habe ich das über DOIF mit mäßigem Erfolg.
Wei würde das ein "FHEM-Profi" lösen? Ist DOIF hier das richtige Werkzeug (bei meinen Versuchen, werden zwar alle Bedingungen richtig abgefragt, aber der Entfeuchter schaltet sich regelmäßig ab und wieder an (wenn ich ein DOELSE Gerät off drin habe) oder bei einer anderen Variante nicht mehr an, wenn eine Bedingung zum Abschalten wieder weg fällt.
Internals:
DEF ([08:00-17:00] and !($we) and [UrlauboderFerien] eq "Arbeit" and [MArbeit] eq "absent") (
set MQTT2_DVES_486458_CH2 on)
DOELSEIF ([10:00-17:00] and ($we or [UrlauboderFerien] eq "Ferien")) (
set MQTT2_DVES_486458_CH2 on)
DOELSEIF (
[08:00-17:00] and ([MArbeit] eq "present" or [MPCLAN] eq "present")) (
set MQTT2_DVES_486458_CH2 off)
FUUID 61a09b7b-f33f-214e-5263-a6b4d21c256845f3
MODEL FHEM
NAME EntfeuchterEin
NOTIFYDEV MArbeit,global,UrlauboderFerien,MPCLAN
NR 242
NTFY_ORDER 50-EntfeuchterEin
STATE cmd_3
TYPE DOIF
VERSION 25295 2021-12-04 18:13:39
READINGS:
2021-12-27 11:39:25 Device MArbeit
2021-12-27 11:39:25 cmd 3
2021-12-27 11:39:25 cmd_event MArbeit
2021-12-27 11:39:25 cmd_nr 3
2021-12-27 11:39:25 e_MArbeit_STATE present
2021-12-27 11:39:20 e_MPCLAN_STATE present
2021-12-27 09:29:10 mode enabled
2021-12-27 11:39:25 state cmd_3
2021-12-27 09:29:10 timer_01_c01 28.12.2021 08:00:00
2021-12-27 09:29:10 timer_02_c01 27.12.2021 17:00:00
2021-12-27 09:29:10 timer_03_c02 27.12.2021 10:00:00
2021-12-27 09:29:10 timer_04_c02 27.12.2021 17:00:00
2021-12-27 09:29:10 timer_05_c03 28.12.2021 08:00:00
2021-12-27 09:29:10 timer_06_c03 27.12.2021 17:00:00
Regex:
accu:
collect:
cond:
MArbeit:
0:
&STATE ^MArbeit$
1:
2:
&STATE ^MArbeit$
MPCLAN:
0:
1:
2:
&STATE ^MPCLAN$
UrlauboderFerien:
0:
&STATE ^UrlauboderFerien$
1:
&STATE ^UrlauboderFerien$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and !($we) and ::InternalDoIf($hash,'UrlauboderFerien','STATE') eq "Arbeit" and ::InternalDoIf($hash,'MArbeit','STATE') eq "absent"
1 ::DOIF_time($hash,2,3,$wday,$hms) and ($we or ::InternalDoIf($hash,'UrlauboderFerien','STATE') eq "Ferien")
2 ::DOIF_time($hash,4,5,$wday,$hms) and (::InternalDoIf($hash,'MArbeit','STATE') eq "present" or ::InternalDoIf($hash,'MPCLAN','STATE') eq "present")
days:
do:
0:
0 set MQTT2_DVES_486458_CH2 on
1:
0 set MQTT2_DVES_486458_CH2 on
2:
0 set MQTT2_DVES_486458_CH2 off
3:
helper:
DEVFILTER ^global$|^UrlauboderFerien$|^MArbeit$|^MPCLAN$
NOTIFYDEV global|UrlauboderFerien|MArbeit|MPCLAN
event present,presence: present
globalinit 1
last_timer 6
sleeptimer -1
timerdev MArbeit
timerevent present,presence: present
triggerDev MArbeit
DOIF_eventa:
cmd_nr: 3
cmd: 3
cmd_event: MArbeit
cmd_3
DOIF_eventas:
cmd_nr: 3
cmd: 3
cmd_event: MArbeit
state: cmd_3
timerevents:
present
presence: present
timereventsState:
state: present
presence: present
triggerEvents:
present
presence: present
triggerEventsState:
state: present
presence: present
internals:
all UrlauboderFerien:STATE MArbeit:STATE MPCLAN:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
intervaltimer:
localtime:
0 1640674800
1 1640620800
2 1640595600
3 1640620800
4 1640674800
5 1640620800
readings:
realtime:
0 08:00:00
1 17:00:00
2 10:00:00
3 17:00:00
4 08:00:00
5 17:00:00
time:
0 08:00:00
1 17:00:00
2 10:00:00
3 17:00:00
4 08:00:00
5 17:00:00
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
0 0 1
1 2 3
2 4 5
trigger:
triggertime:
1640620800:
localtime 1640620800
hash:
1640674800:
localtime 1640674800
hash:
uiState:
uiTable:
Attributes:
alias EntfeuchterEin
do always
room nt+di
matze1999
Ich steuere meinen Befeuchter ähnlich und ohne Probleme.
Du triggertst mit allem und nutzt keine Abfragen [?UrlauboderFerien] eq "Ferien".
Da würde ich anfangen.
Hilfreich ist oft ein DOELSE (), denn in welchen Zweig soll erspringen, wenn keiner richtig ist?
Ich mache das mit einem notify und perl if ... ist für mich persönlich übersichtlicher als DOIF
@Wernieman,
Zitat von: Wernieman am 27 Dezember 2021, 13:41:17
Ich mache das mit einem notify und perl if ... ist für mich persönlich übersichtlicher als DOIF
kann man das irgendwo nachlesen, am Besten mit Beispielen?
matze1999
Zitat von: matze1999 am 10 Januar 2022, 08:00:48
@Wernieman,
kann man das irgendwo nachlesen, am Besten mit Beispielen?
matze1999
-> https://wiki.fhem.de/wiki/Notify
(etwas weiter unten)
EDIT: bzw. innerhalb von { } ist ganz normale Perl-Programmierung ;) -> https://wiki.fhem.de/wiki/Klammerebenen
("Zugriff" zurück auf fhem [wie im Wiki auch zu lesen?] -> fhem("hier dann fhem Befehle") / inkl. Abfragen von Readings etc.: ReadingsVal, ReadingsNum, AttrVal, AttrNum, usw.)
Evtl. auslagern in eine myUtils-Sub (übersichtlicher [finde ich])... -> https://wiki.fhem.de/wiki/99_myUtils_anlegen
Leichteres Anlegen von notify (und DOIF und FileLog und...) -> https://wiki.fhem.de/wiki/Event_monitor
Gruß, Joachim
Als Ergänzung:
FHEM ist Ereignisbassiert (sollte so sein), also ist das erste sich zu überlegen, auf was man Trickert. Dann ein perl-if dahinter ...
Zitat von: matze1999 am 27 Dezember 2021, 11:41:03
Wei würde das ein "FHEM-Profi" lösen? Ist DOIF hier das richtige Werkzeug (bei meinen Versuchen, werden zwar alle Bedingungen richtig abgefragt, aber der Entfeuchter schaltet sich regelmäßig ab und wieder an (wenn ich ein DOELSE Gerät off drin habe) oder bei einer anderen Variante nicht mehr an, wenn eine Bedingung zum Abschalten wieder weg fällt.
Du hast hier mehrere Bedingungen, aber in Wirklichkeit nur zwei Fälle. Es reicht, wenn du die beiden Fälle zum Einschalten in eine if-Bedingung mit or zusammenfasst, Ausschalten wäre dann der else-Fall. Diese Aussage gilt unabhängig davon, ob du es mit DOIF oder sonst wie löst.