HM-CC-RT-DN: Heizkörperthermostate in einem Raum synchronsieren

Begonnen von heiko.ne, 10 Oktober 2015, 13:47:37

Vorheriges Thema - Nächstes Thema

heiko.ne

Hallo zusammen,
ich bin auch der Suche nach einer Lösung dafür, zwei Raumthermostate von Homematic (HM-CC-RT-DN), die in einem Raum sind zu synchronisieren.
Ziel der Sache soll sein, das das eine Thermostat genau das tut, was das andere vorgibt. Dies soll sowohl durch Änderungen am Thermostat direkt, als auch über das Web-Interface von FHEM funktionieren.
Meine derzeitige Lösung sieht so aus, dass die Thermometer in einem Climateam verbunden sind und ich zusätzlich zwei "notifys" gesetzt habe. Eines gibt die Temperatur (desired-temp) von einen Thermostat an das andere, das den Modus (controlMode). Das funktioniert so weit ganz gut. Temperaturen und Modus werden über das Handrad sogar bidirektional übergeben.
Das ganze scheitert nur leider daran, dass das eine eine  Thermostat, dem die Sachen über die "notifys" übergeben werden, immer wieder in seinen Schaltplan zurückfällt und dann zwischen der Vorgabe des Master-Thermostat und seinem eigenen Schaltplan hin und her springt.

Wer kann Hilfe anbieten?

Meine Notifys sehen so aus ... siehe Anhang.

martinp876

für mich beginnt es mit einer sinnvollen Nomenklatur der Namen. Ich haben
h(zimmer)_(ort)
gewählt.
zimmer ist immer gleich lang.
hwz_fenster
hwz_tuer
hsz_bett
hsz_tuer

dann habe ich 2 Notifies (wie du, eines für mode, eines für temp).
Weil ich faul bin besteht das zimmer aus einem Buchstaben - macht es noch einmal einfacher

ich lasse 2 Zimmer zu, a und w. die Liste kann man auch verlängern
h[aw].*_Clima

Alle Zimme wäre
h._.*_Clima

für Lange Namen (3 Buchstaben) ist es
h..._.*_Clima

oder dediziert
h(car|sch|gar)_.*_Clima


danach der 2. Eintrag. - wenn das Zimmer ein Buchstabe ist (plus das h)
"NAME=".substr($NAME,0,2).".*_Clima"

bei 3 Buchstaben:
"NAME=".substr($NAME,0,4).".*_Clima"

bei "einem Buchstaben" und nur Zimmer a und w ist es dann

define h_team_temp notify h[aw].*_Clima:desired-temp.* {\\
foreach(devspec2array("NAME=".substr($NAME,0,2).".*_Clima")){\\
  if ($EVTPART1 ne ReadingsVal($_,"desired-temp","")){\\
    fhem "set $_ desired-temp $EVTPART1"}\\
    }}

define h_team_mode notify h[aw].*_Clima:mode.* {\\
  foreach(devspec2array("NAME=".substr($NAME,0,2).".*_Clima")){\\
    if ($EVTPART1 ne ReadingsVal($_,"mode","")){\\
      if ($EVTPART1 =~ m/(auto|boost)/){\\
        fhem "set $_ controlMode $EVTPART1"}\\
     elsif($EVTPART1 eq 'manu'){\\
        fhem "set $_ controlManu ".ReadingsVal($_,"desired-temp","")}\\
    }}}

So lange die Nommenklatur stimmt klappt das für beliebig viele Zimmer und beliebig viele RTs in jeden Zimmer. Bei mir zumindest.

heiko.ne

Hallo Martin,

Danke für Deine ausführlichen Erklärungen.
Im Falle der Temperatur funktioniert dies auch gut, aber leider noch nicht beim Setzen des Modus.

Mein Code habe ich so modifiziert:
define Wohnzimmer_Heizung_Team_temp notify Wohnzimmer_Thermostat_[12].*_Clima:desired-temp.* {\\
  foreach(devspec2array("NAME=".substr($NAME,0,21).".*_Clima")){\\
    if ($EVTPART1 ne ReadingsVal($_,"desired-temp","")){\\
      fhem "set $_ desired-temp $EVTPART1"}\\
    }}


define Wohnzimmer_Heizung_Team_mode notify Wohnzimmer_Thermostat_[12].*_Clima:controlMode.* {\\
  foreach(devspec2array("NAME=".substr($NAME,0,21).".*_Clima")){\\
    if ($EVTPART1 ne ReadingsVal($_,"controlMode","")){\\
      if ($EVTPART1 =~ m/(auto|boost)/){\\
        fhem "set $_ controlMode $EVTPART1"}\\
      elsif($EVTPART1 eq 'manual'){\\
        fhem "set $_ desired-temp ".ReadingsVal($_,"desired-temp","")}\\
    }}}


Ich beim Modus-Code in Zeile 1 und 3 "mode" zu "controlMode" anpassen, sowie weiter unten "manu" zu "manual". Trotzdem gibt mir FHEM folgenden Fehler aus, wenn ich den Modus an einem Thermostat verändere:

Zitat2015.10.11 10:01:43 3: Wohnzimmer_Heizung_Team_mode return value: syntax error at (eval 29732) line 1, near "\   foreach"
syntax error at (eval 29732) line 1, near "\       elsif"

Meiner Vermutung nach liegt es daran, dass FHEM beim Wechsel des Modus kurzzeitig den controlMode
zu "set_manual" mit dem vorgesetzten "set_" einstellt, bevor der Modus gewechselt wird und dann nach Umsetzung "controlMode set_manual" erreicht. Darüber stolpert das Notify.

Kannst Du (oder jemand anderes) mir hier nochmal helfen?

Gruß
Heiko