Hallo zusammen,
ich bräuchte mal eine Tipp. In der Suche hab ich nichts vergleichbares gefunden.
Seit über 10 Jahren verwende ich für die Heizungssteuerung im Haus das MAX System. (Wandthermostate, Fensterkontakte, Heizungsthermostate). Jetzt ist ein Fensterkontakt komplett ausgefallen und zu kaufen gibt diese nicht mehr.
Da ich einige Homatic Rolladen habe war es m.E. naheliegend in diese Richtung gehen. HM-SEC-SC-2
Erfolgreich eingebunden.
Nun zu meinem Problem. Der Fensterkontakt spricht ja jetzt nicht mehr direkt mit dem Wandthermostat bzw. Heiszungsthermostat.
Meine Idee: entsprechendes DOIF für die Regelung der Heizung sobald das Fenster geöffnet wird.
Dazu habe ich aktuell 2 DOIF in Abhängigkeit zum Betriebsmodus auto|manual des Wandthermostates erstellt.
list auto (mode:auto => Fenster auf => Thermostat 5 Grad => Fenster zu => mode:auto)
Internals:
DEF ([EG_Kinderzimmer_Fenster] eq "open" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
DOELSE
([EG_Kinderzimmer_Fenster] eq "closed") (set EG_Kinderzimmer_Wandthermostat desiredTemperature auto)
FUUID 66e15b1f-f33f-430c-9d84-84374feddf54b16c
FVERSION 98_DOIF.pm:0.285460/2024-02-23
MODEL FHEM
NAME doif.Kinderzimmer_Fenster_Heizung_automatic
NOTIFYDEV global,EG_Kinderzimmer_Fenster
NR 528
NTFY_ORDER 50-doif.Kinderzimmer_Fenster_Heizung_automatic
STATE cmd_2
TYPE DOIF
eventCount 72
READINGS:
2024-09-12 19:15:46 Device EG_Kinderzimmer_Fenster
2024-09-12 19:16:01 cmd 2.2
2024-09-12 19:16:01 cmd_event EG_Kinderzimmer_Fenster
2024-09-12 19:16:01 cmd_nr 2
2024-09-12 19:16:01 cmd_seqnr 2
2024-09-12 19:15:46 e_EG_Kinderzimmer_Fenster_STATE closed
2024-09-12 19:07:23 mode enabled
2024-09-12 19:16:01 state cmd_2
2024-09-12 19:16:01 wait_timer no timer
Regex:
accu:
bar:
barAvg:
collect:
cond:
EG_Kinderzimmer_Fenster:
0:
&STATE ^EG_Kinderzimmer_Fenster$
attr:
cmdState:
wait:
0:
15
1:
15
waitdel:
condition:
0 ::InternalDoIf($hash,'EG_Kinderzimmer_Fenster','STATE') eq "open" and ::ReadingValDoIf($hash,'EG_Kinderzimmer_Wandthermostat','mode') eq "auto"
do:
0:
0 set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0
1:
0 [EG_Kinderzimmer_Fenster] eq "closed"
1 set EG_Kinderzimmer_Wandthermostat desiredTemperature auto
helper:
NOTIFYDEV global,EG_Kinderzimmer_Fenster
event battery: ok,contact: closed (to broadcast),closed,trigger_cnt: 69
globalinit 1
last_timer 0
sleepdevice EG_Kinderzimmer_Fenster
sleepsubtimer -1
sleeptimer -1
timerdev EG_Kinderzimmer_Fenster
timerevent battery: ok,contact: closed (to broadcast),closed,trigger_cnt: 69
triggerDev EG_Kinderzimmer_Fenster
timerevents:
battery: ok
contact: closed (to broadcast)
closed
trigger_cnt: 69
timereventsState:
battery: ok
contact: closed (to broadcast)
state: closed
trigger_cnt: 69
triggerEvents:
battery: ok
contact: closed (to broadcast)
closed
trigger_cnt: 69
triggerEventsState:
battery: ok
contact: closed (to broadcast)
state: closed
trigger_cnt: 69
internals:
all EG_Kinderzimmer_Fenster:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
room doif.Automatisierung
wait 15:15
list manual (mode:manual => Fenster auf => Thermostat 5 Grad => Fenster zu => Thermostat 15 Grad)
Internals:
CFGFN
DEF ([EG_Kinderzimmer_Fenster] eq "open" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "manual") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
DOELSE
([EG_Kinderzimmer_Fenster] eq "closed") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 15.0)
FUUID 66e28e0c-f33f-430c-9470-f3e0118ee0a025b7
MODEL FHEM
NAME doif.Kinderzimmer_Fenster_Heizung_manual
NOTIFYDEV global,EG_Kinderzimmer_Fenster
NR 551
NTFY_ORDER 50-doif.Kinderzimmer_Fenster_Heizung_manuel
STATE cmd_2
TYPE DOIF
eventCount 53
READINGS:
2024-09-12 19:15:46 Device EG_Kinderzimmer_Fenster
2024-09-12 19:08:15 cmd 2.2
2024-09-12 19:08:15 cmd_event EG_Kinderzimmer_Fenster
2024-09-12 19:08:15 cmd_nr 2
2024-09-12 19:08:15 cmd_seqnr 2
2024-09-12 19:15:46 e_EG_Kinderzimmer_Fenster_STATE closed
2024-09-12 19:07:35 mode enabled
2024-09-12 19:08:15 state cmd_2
2024-09-12 19:08:15 wait_timer no timer
Regex:
accu:
bar:
barAvg:
collect:
cond:
EG_Kinderzimmer_Fenster:
0:
&STATE ^EG_Kinderzimmer_Fenster$
attr:
cmdState:
wait:
0:
15
1:
15
waitdel:
condition:
0 ::InternalDoIf($hash,'EG_Kinderzimmer_Fenster','STATE') eq "open" and ::ReadingValDoIf($hash,'EG_Kinderzimmer_Wandthermostat','mode') eq "manual"
do:
0:
0 set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0
1:
0 [EG_Kinderzimmer_Fenster] eq "closed"
1 set EG_Kinderzimmer_Wandthermostat desiredTemperature 15.0
helper:
NOTIFYDEV global,EG_Kinderzimmer_Fenster
event battery: ok,contact: closed (to broadcast),closed,trigger_cnt: 69
globalinit 1
last_timer 0
sleepdevice EG_Kinderzimmer_Fenster
sleepsubtimer -1
sleeptimer -1
timerdev EG_Kinderzimmer_Fenster
timerevent battery: ok,contact: closed (to broadcast),closed,trigger_cnt: 69
triggerDev EG_Kinderzimmer_Fenster
timerevents:
battery: ok
contact: closed (to broadcast)
closed
trigger_cnt: 69
timereventsState:
battery: ok
contact: closed (to broadcast)
state: closed
trigger_cnt: 69
triggerEvents:
battery: ok
contact: closed (to broadcast)
closed
trigger_cnt: 69
triggerEventsState:
battery: ok
contact: closed (to broadcast)
state: closed
trigger_cnt: 69
internals:
all EG_Kinderzimmer_Fenster:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
room doif.Automatisierung
wait 15:15
Beides funktioniert.
Nun zu meiner Herausforderung bzw. Frage:
Wie kann ich die beiden DOIF in Einem zusammenfassen? Mir fehlt die Idee den Betriebsmodus (auto|manual) irgendwie "zwischenzuspeichern" für den DOELSE Zweig.
Geht das überhaupt?
Lieben Dank
DOELSEIF wäre die Lösung.
Ausserdem, glaube ich nicht das die beiden DOIF funktionieren. Die DOELSE kann keine Bedingung haben. Das ist falscher Syntax.
Bitte mal die Hilfe lesen.
Zuerst danke für Deine schnelle Rückmeldung.
Ggf. ist das nicht ganz korrekt. Glaub mir ich lese viel und hab schon einiges umsetzen können.
Zitat von: rabehd am 12 September 2024, 19:50:42DOELSEIF wäre die Lösung.
Das hatte ich auch gedacht und zu Beginn auch genutzt.
ABER: Das führte dazu, dass jeweils beide DOIF beim Fenster schliessen ihren
set EG_Kinderzimmer_Wandthermostat desiredTemperature ...
gesendet haben.
Nach dem Lesen der von Dir zitierten Hilfe (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen) mit
Ist DOELSE angegeben, es gab einen passenden Auslöser und alle geprüften Bedingungen waren unwahr, dann werden die nach DOELSE angegebenen Befehle ausgeführt.
habe ich dies geändert.
Seit ich aus DOELSEIF ein DOELSE gemacht habe funktioniert es wie gewünscht. :)
Klingt jetzt vielleicht komisch, ist aber so.
Sicherlich hast Du Recht mit
Zitat von: rabehd am 12 September 2024, 19:50:42Die DOELSE kann keine Bedingung haben. Das ist falscher Syntax.
Wahrscheinlich
kann ich die Bedingung im DOELSE
[EG_Kinderzimmer_Fenster] eq "closed"
weglassen. Das habe ich aber nicht getestet.
Hast Du auch eine Vorschlag / Idee zu meiner Frage?
Zitat von: mobiljoe123 am 12 September 2024, 19:32:50Nun zu meiner Herausforderung bzw. Frage:
Wie kann ich die beiden DOIF in Einem zusammenfassen? Mir fehlt die Idee den Betriebsmodus (auto|manual) irgendwie "zwischenzuspeichern" für den DOELSE Zweig.
Lieben Dank.
Zitat von: mobiljoe123 am 13 September 2024, 07:35:26Wahrscheinlich kann ich die Bedingung im DOELSE
Ein DOELSE prüft keine Bedingung, denn "Ist DOELSE angegeben, es gab einen passenden Auslöser und alle geprüften Bedingungen waren unwahr, dann werden die nach DOELSE angegebenen Befehle".
Bedingungen gibt es nur bei IF und DOELSEIF. Du musst also bei Ausführung des Zweiges einen Fehlermeldung bekommen, denn Deine Bedingung wird als Befehl behandelt.
Man kann beide DOIF zusammenlegen, aber dafür müßte ich verstehen was Du eigentlich mit Deinem DOELSE-Zweigen beabsichtigst.
Damit wären wir wieder bei DOELSE mit Bedingung, was wohl nur bei Dir funktioniert.
([EG_Kinderzimmer_Fenster] eq "open" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "manual") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
DOELSEIF ([EG_Kinderzimmer_Fenster] eq "closed" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "manual") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 15.0)
DOELSEIF ([EG_Kinderzimmer_Fenster] eq "open" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
DOELSEIF ([EG_Kinderzimmer_Fenster] eq "closed" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature auto)
Dazu noch attr do always
Ich denke auch die Fälle bei open (manual/auto) könnte man "zusammenfassen", weil ja egal ob manual oder auto immer auf 5 Grad geschalten wird...
Gruß, Joachim
Sorry.
Mit
Zitat von: rabehd am 13 September 2024, 09:31:00DOELSEIF ([EG_Kinderzimmer_Fenster] eq "closed" and [?EG_Kinderzimmer_Wandthermostat:mode] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature auto)
Dazu noch attr do always
hast Du mich darauf gebracht, dass Euch / Dir eine entscheidene Info gefehlt hat. Diese Variante kann es nicht geben, da ein
(set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
immer zu
EG_Kinderzimmer_Wandthermostat:mode = "manual"
führt.
Daher kam ja meine Idee mit dem "zwischenspeichern".
Durch
Zitat von: eisman am 13 September 2024, 07:56:06und die SUB:
sub sub_FensterHeizung($) {
kam ich auf die Idee eines userreadings. Danke für den Schubser.
Ich hab jetzt folgendes gemacht bzw vor. Noch nicht getestet.
defmod doif.Kinderzimmer_Fenster_Heizung DOIF ([EG_Kinderzimmer_Fenster] eq "open") (setreading EG_Kinderzimmer_Fenster user_mode_Wandthermostat [EG_Kinderzimmer_Wandthermostat:mode]), (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)
DOELSEIF
([EG_Kinderzimmer_Fenster] eq "closed") and [?EG_Kinderzimmer_Fenster:user_mode_Wandthermostat] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature auto)
DOELSEIF
([EG_Kinderzimmer_Fenster] eq "closed") and [?EG_Kinderzimmer_Fenster:user_mode_Wandthermostat] eq "manual") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 15.0)
DOELSE
attr doif.Kinderzimmer_Fenster_Heizung do always
attr doif.Kinderzimmer_Fenster_Heizung room doif.Automatisierung
attr doif.Kinderzimmer_Fenster_Heizung wait 5,10:15:15
So hab ich jetzt gelöst.
defmod doif.Kinderzimmer_Fenster_Heizung DOIF ([EG_Kinderzimmer_Fenster] eq "open") (setreading EG_Kinderzimmer_Fenster user_mode_Wandthermostat [EG_Kinderzimmer_Wandthermostat:mode]) (set EG_Kinderzimmer_Wandthermostat desiredTemperature 5.0)\
DOELSEIF\
(([EG_Kinderzimmer_Fenster] eq "closed") and [?EG_Kinderzimmer_Fenster:user_mode_Wandthermostat] eq "auto") (set EG_Kinderzimmer_Wandthermostat desiredTemperature auto)\
DOELSEIF\
(([EG_Kinderzimmer_Fenster] eq "closed") and [?EG_Kinderzimmer_Fenster:user_mode_Wandthermostat] eq "manual") (set EG_Kinderzimmer_Wandthermostat desiredTemperature 15.0)\
DOELSE
attr doif.Kinderzimmer_Fenster_Heizung do always
attr doif.Kinderzimmer_Fenster_Heizung room doif.Automatisierung
attr doif.Kinderzimmer_Fenster_Heizung wait 5,10:15:15
Danke für die Hinweise und Ideen.
@mobiljoe123 das aktuelle MAX Modul unterstützt doch virtuelle Fensterkontakte.
Damit kannst du einen beliebigen Fensterkontakt als "Quelle" für das Fenster-auf/Fenster-zu Signal nutzen.
Wäre es damit nicht einfacher umzusetzen?
Danke. Das war mir gar nicht bekannt.
Werd ich testen.