Hauptmenü

[gelöst] 2 DOIF zusammenfassen

Begonnen von mobiljoe123, 12 September 2024, 19:32:50

Vorheriges Thema - Nächstes Thema

mobiljoe123

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

Raspi 2; HM; MAX!; RFXtrx

rabehd

#1
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.
Auch funktionierende Lösungen kann man hinterfragen.

mobiljoe123

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 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.
Raspi 2; HM; MAX!; RFXtrx

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

rabehd

([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
Auch funktionierende Lösungen kann man hinterfragen.

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

mobiljoe123

#6
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
Raspi 2; HM; MAX!; RFXtrx

mobiljoe123

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.
Raspi 2; HM; MAX!; RFXtrx

KyleK

@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?
FHEM on Raspberry Pi 3B+
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

mobiljoe123

Danke. Das war mir gar nicht bekannt.
Werd ich testen.
Raspi 2; HM; MAX!; RFXtrx