[UPDATE4]Codevorlage: Steuerung meiner Therme mit dem MAX!-Zwischenstecker

Begonnen von Mr.Heat, 27 Oktober 2013, 23:49:24

Vorheriges Thema - Nächstes Thema

Mr.Heat

UPDATE4: Ich habe mein schönes Skript, welches mir mehrere Jahre treu gedient hat, jetzt durch das Modul HCS ersetzt, welches mittlerweile auch die MAX-Thermostate beherrscht.



#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Beginn##################
#### Heizung: Winterbetrieb Sommerbetrieb
define HA_Heizung_Modus dummy
attr HA_Heizung_Modus alias Betriebsmodus
attr HA_Heizung_Modus fp_Heizung 36,220,7,
attr HA_Heizung_Modus group Betriebsmodus
attr HA_Heizung_Modus room Haus
attr HA_Heizung_Modus setList state:Winter,Sommer
attr HA_Heizung_Modus userReadings HCS_TEMP { if (ReadingsVal("HA_Heizung_Modus","state","Unbekannt") eq "Winter"){return 0} else {return 30};;}
attr HA_Heizung_Modus webCmd state
#Versuch mit HCS-Modul
define HCS_System HCS HA_Heizung_Schalter
attr HCS_System alias Heizungssteuerung
attr HCS_System deviceCmdOff desiredTemperature on
attr HCS_System deviceCmdOn desiredTemperature off
attr HCS_System event-on-change-reading state,devicestate,eco,overdrive
attr HCS_System exclude HA_Heizung_Schalter
attr HCS_System idleperiod 5
attr HCS_System interval 1
attr HCS_System loglevel 3
attr HCS_System mode valve
attr HCS_System room System
attr HCS_System sensor HA_Heizung_Modus
attr HCS_System sensorReading HCS_TEMP
attr HCS_System sensorThresholdOff 20
attr HCS_System sensorThresholdOn -1
attr HCS_System thermostatThresholdOff 0.5
attr HCS_System thermostatThresholdOn 0.5
attr HCS_System valveThresholdOff 10
attr HCS_System valveThresholdOn 40
#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################



Sollte das Ganze nicht zu meiner Zufriedenheit funktionieren, so werde ich das hier wieder Ändern und berichten. Ansonsten ist das der bessere Weg, da weniger Fehlermöglichkeiten. Natürlich ist ein eigenes Skript (s. unten) bei eigenen Wünschen besser modifizierbar.
Viel Erfolg!


hallo zusammen, seit heute steuere ich erfolgreich eine Junkers-Therme über den Wohnzimmerthermostat-Eingang. Ich habe dazu das Skript aus der Wiki-Seite "Heizungskontrolle einfach" angepasst, um entsprechend mit Max-Komponenten zu funktionieren.
Ich dachte, ich stelle das mal als Vorlage zur Verfügung.
Hier sind Situationsbedingt folgende Vorraussetzungen erforderlich (falls anders, muss das angepasst werden):
-Am MAX!-Zwischenstecker ist ein Relais(Schließer) angebracht, der an der Therme einen Steuereingang kurzschließt (=keine Wärme benötigt). Schalter AN= Therme AUS, Schalter AUS = Therme AN.
-Der Zwischenstecker wird über desiredTemperature on bzw. desiredTemperature off an bzw. abgeschaltet, der aktuelle Status ist aus der "valveposition" des Zwischensteckers sichtbar (0=Schalter aus, 100=Schalter an).
-Da sich der Zwischenstecker als HeatingThermostat meldet, werden die MAX-Thermostate hier nach Name gefiltert. Die Thermostaten folgen bei mir dem Schema XX_Thermostat_XXXXXXXX und werden mittels der RegEx ".{3}Thermostat* gefiltert. Dies muss so angepasst werden, dass nur die wirklichen Thermostaten, nicht aber der Zwischenstecker selbst zurückgegeben wird.

-das Skript schaltet die Therme an, sobald mindestens ein Thermostat > 40% ist, und aus, wenn alle Thermostaten <20% geöffnet sind (Hysterese, um Schaltvorgänge zu vermeiden und den Thermostaten die Möglichkeit zu geben, wirklich zu regeln).

Viel Spaß mit dem Code, er kann im Web-Interface in die fhem.cfg eingefügt werden.

[color]UPDATE3:[/color]
Alternative mit manueller Umschaltung Sommer/Winterbetrieb, momentan so bei mir im Einsatz:



#### Heizung: Winterbetrieb Sommerbetrieb
define HA_Heizung_Modus dummy
attr HA_Heizung_Modus room Haus
attr HA_Heizung_Modus setList state:Winter,Sommer
attr HA_Heizung_Modus webCmd state

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Beginn##################




#Name des Schaltkontakts: HA_Heizung_Schalter
#verhaelt sich aehnlich wie Thermostat
#Ventilstellung des Schaltkontakts = 0: Therme AN (Schalter AUS)   (Setzen: desiredTemperature=off)
#Ventilstellung des Schaltkontakts = 100: Therme AUS (Schalter AN) (Setzen: desiredTemperature=on)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
   my $heizung_status=ReadingsVal("HA_Heizung_Schalter","valveposition","100");;\
   my $modus=ReadingsVal("HA_Heizung_Modus","state",'MODUSFHLER');;\
   foreach(@@thermostaten) {\
      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ( ($modus eq 'Winter') && ($ventil > 40) ) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt. Vorheriger Heizungsstatus: " . $heizung_status . " Modus: " . $modus );;\
      if ($heizung_status > 0){\
         fhem("set HA_Heizung_Schalter desiredTemperature off");;\
         Log(2,"Wärme benötigt. Heizung wird ANgeschaltet");;\
      }\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt. Vorheriger Heizungsstatus: " . $heizung_status . " Modus: " . $modus );;\
        if ($heizung_status == 0){\
           fhem("set HA_Heizung_Schalter desiredTemperature on");;\
           Log(2,"Wärme nicht mehr benötigt. Heizung wird ABgeschaltet");;\
        }\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " von " . @@thermostaten . " Thermostaten im Leerlauf. Aktueller Heizungsstatus: " . $heizung_status . " Modus: " . $modus );;\
     }\
  }\
}

define a_heizung at +*00:00:20 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################






Alte Variante mit Wetter; hat nicht so toll funktioniert bei mir:


#Name des Weather-Devices: "Wetter"
#Name des Schaltkontakts: HA_Heizung_Schalter
#verhaelt sich aehnlich wie Thermostat
#Ventilstellung des Schaltkontakts = 0: Therme AN (Schalter AUS)   (Setzen: desiredTemperature=off)
#Ventilstellung des Schaltkontakts = 100: Therme AUS (Schalter AN) (Setzen: desiredTemperature=on)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
   my $heizung_status=ReadingsVal("HA_Heizung_Schalter","valveposition","100");;\
   my $temperatur=ReadingsVal("Wetter","temp_c","-30");;\
   foreach(@@thermostaten) {\
      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ( ($temperatur <= 10) && ($ventil > 40) ) {\
         $brauche_waerme=1;;\
      }\
      elsif ($ventil > 95) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
       fhem("set HA_Heizung_Schalter desiredTemperature off") if ($heizung_status > 0);;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
        fhem("set HA_Heizung_Schalter desiredTemperature on") if ($heizung_status == 0)\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################




UPDATE:
im Anhang ein Screenshot von heute. Die Überschwinger nicht zu ernst nehmen, die Thermostaten sind teilweise etwas "zugebaut".
Bevor jemand fragt, warum ich so tiefe Temperaturen in den Absenkzeiten habe: das liegt an den baulichen gegebenheiten, ein Heizen des Bads wäre sinnfrei da die komplette Heizleistung sofort nach oben verfliegt (bad im Keller) und nur die anderen Räume viel zu stark heizt.
Ebenso die Küche obendrüber (offenes Treppenhaus).

[color]UPDATE2:[/color]
Da sinnloserweise zur Zeit immer morgens die Heizung anspringt, wird eine automatische Sommer/Winterumstellung anhand der Wettervorhersage gemacht: ab 10°C wird nur bei 95% Ventilöffnung die Heizung angeschaltet (also manueller Boost). Have Fun.


The-Holgi

Hallo,
erstmal Danke für das script.
Würde es gerne an meine Gegebenheiten anpassen. Ich benutze zum ein und aus schalten der Therme einen ELRO Zwischenstecker. on = Heizung an, off = Heizung aus.

#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)


Vielleicht kann mir jemand sagen wie ich den code an der Stelle ändern muß:
my $heizung_status=ReadingsVal("HA_Heizung_Schalter","valveposition","100");;\
   foreach(@@thermostaten) {\
      my $ventil=ReadingsVal($_, "valveposition", "101");;\


HA_Heizung_Schalter wäre ja bei mir Therme und valvepostion 100 Heizung aus. Wie muß der code dann aussehen ?

Gruß Holgi

HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

Hallo,
ich weiß leider nicht, welches reading dein Zwischenstecker als status hat; in dem von dir geposteten Abschnitt geht es ja in der ersten Zeile darum, den aktuellen Status des Schalters festzustellen.
Wenn es kein solches Reading gibt (also der aktuelle Status nicht gelesen werden kann), müsstest du entweder den Schaltstatus selbst speichern (weiß ich leider nicht, wie das in fhem-Syntax geht),oder den Teil einfach weglassen.
Der Status wird ja nur dafür benutzt, um einen etwaigen Schaltbefehl nicht unnötig absetzen zu müssen (z.B. nicht anschalten, falls die Therme schon an ist).  Lässt du das weg, wird halt alle 5 Minuten trotzdem der Befehl geschickt, egal was davor war, was auch nicht so schlimm ist (vor allem, wenn es vom Schaltkontakt keine Antwort gibt, und evtl. mal ein Befehl nicht ankommt).

LG Mr.Heat

The-Holgi

Hallo, Danke für die schnelle Antwort.
Die Elro Zwischenstecker können ihren Status soweit ich das gelesen habe garnicht übertragen. Allerdings wird beim senden eines Schaltbefehls der letzte Status durch ändern des Symbols (Glühlampe gelb oder grau) in fhem angezeigt.
Könnte das dann so funktionieren ?
#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
   
      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
       fhem("set Therme on") if ($heizung_status > 0);;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
        fhem("set Therme off") if ($heizung_status == 0)\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################


Oder muß an den Zeilen mit dem vorherigen Heizungsstatus noch was geändert werden ?

Gruß Holgi
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

Da du ja so den Status nicht mehr abfragst, müsste das auch unten entfernt werden:
Zitat
#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
   
      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt.";;\
       fhem("set Therme on");;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt");;\
        fhem("set Therme off");;\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################


die andere Möglichkeit wäre wohl, den Status doch auszulesen (müsste STATE=on bzw off sein, ähnlich wie bei http://www.fhemwiki.de/wiki/Heizungskontrolle_Einfach):
Zitat
my $heizung_status=ReadingsVal("Therme","state","off")};;\

dementsprechend unten die Abfrage auf
if ($heizung_status == "on") bzw. if ($heizung_status == "off") (ich hoffe, das geht so).

LG Mr.Heat

The-Holgi

#5
Danke für den Tipp, das werde ich so mal testen. Wenn ich es richtig verstanden habe sollte das so aussehen ?

#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
    my $heizung_status=ReadingsVal("Therme","state","off")};;\

      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt.";;\
       fhem("set Therme on")if ($heizung_status == "off");;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt");;\
        fhem("set Therme off") if ($$heizung_status == "on")\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################


Gruß Holgi
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

Ich glaube nur ein "$" bei $heizung_status;
also so:
Zitat#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
    my $heizung_status=ReadingsVal("Therme","state","off")};;\

      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt.";;\
       fhem("set Therme on")if ($heizung_status == "off");;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt");;\
        fhem("set Therme off") if ($heizung_status == "on")\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################

Sollte eigentlich passen.

Bei mir läuft übrigens das Ganze seit 5 Wochen super :)

The-Holgi

Danke für den Tipp, weiß auch nicht wo das 2. $ herkam. :o
Sobald meine Thermostate da sind werde ich testen und berichten.

Gruß Holgi
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

hobu

Tolles Skript! Danke!

z.Zt. wird nur ein einheitlicher Schwellwert (Ventilstellung) für alle Thermostate geprüft. Ich habe hier mal eine rudimentäre Erweiterung eingearbeitet, mit der nun für jeden Raum ein eigener Wert als Trigger verwendet wird. Hintergrund: Unterschiedliches Aufheizverhalten von grossen und kleinen Räumen, sowie "WAF-Optimierung"...

Des weiteren wird die Heizung hier auch sofort eingeschaltet, wenn der Modus "Boost" aktiviert wird.

Bei nur 4 zu steuernden Thermostaten ist das mit den if-Abfragen der Thermostate so noch überschaubar, aber evtl. kann sich ein Perl-Crack mal 'ransetzen und dies verbessern (2D-Array oder so):


define Waerme.ntfy notify Waerme.ntfy {\
  my $brauche_waerme=0;;\
  my $ventile_im_leerlauf=0;;\
  my $ventilPos=0;;\
  my $heizung_status=ReadingsVal("CUL_SA","state","off");;\
  Log(3,"Heizungsstatus ". $heizung_status);;\
  my @@maxs=devspec2array("[BWLS]R_HT");;\
  foreach(@@maxs) {\
    my $ventil=ReadingsVal($_, "valveposition","101");;\
    my $modecheck=ReadingsVal($_, "mode","?");;\
    if ($modecheck eq "boost"){$brauche_waerme=1}\
    else {\
      if ("$_" eq "BR_HT"){$ventilPos=45;;}\
      if ("$_" eq "WR_HT"){$ventilPos=35;;}\
      if ("$_" eq "LR_HT"){$ventilPos=40;;}\
      if ("$_" eq "SR_HT"){$ventilPos=35;;}\
    }\
    Log(3,"ventil ".$_.": ".$ventil." (".$ventilPos.") ".$modecheck);;\
    if ($ventil > $ventilPos){$brauche_waerme=1};;\
    if ($ventil < 30){$ventile_im_leerlauf++};;\
  }\
  if ($brauche_waerme != 0) {\
    Log(3,"Waerme benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
    if ($heizung_status eq "off"){fhem("set CUL_SA on")}\
  }\
  else {\
    if (($ventile_im_leerlauf == @@maxs) && ($heizung_status eq "on")) {\
      Log(3,"Keine Waerme (mehr) benoetigt. Vorheriger Heizungsstatus: " . $heizung_status);;\
      Log(3,"Schalte CUL_SA aus");;\
      if ($heizung_status eq "on"){fhem("set CUL_SA off")}\
    }\
     else {\
      Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@maxs . " Ventile im Leerlauf.")\
    }\
  }\
}


Thermosstat-Status und Triggerwert werden mitgeloggt:
2013.12.01 12:55:07 3: Heizungsstatus on
2013.12.01 12:55:07 3: ventil BR_HT: 0 (45) auto
2013.12.01 12:55:07 3: ventil LR_HT: 9 (40) manual
2013.12.01 12:55:07 3: ventil SR_HT: 12 (35) auto
2013.12.01 12:55:07 3: ventil WR_HT: 100 (35) boost
2013.12.01 12:55:07 3: Waerme benoetigt. Vorheriger Heizungsstatus: on


Gruss
Holger
Raspberry Pi (Model B)
HM-CFG-USB, HM-CC-RT-DN, HM-LC-SW1-FM, HM-Dis-WM55, HM-FK-SCO

The-Holgi

Hallo Holger,
wühle mich gerade durch dein Skript.
Was bedeutet  my @@maxs, damit weiß ich nichts anzufangen.

Gruß Holgi
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

#10
Hallo,

interessanter Ansatz, allerdings möchte ich mal begründen, wieso die Abfrage meiner Meinung nicht nötig ist:
Die Thermostaten sind PID-Regler,die adaptiv gewisse Parameter ändern.
1. Wird der Sollwert plötzlich einiges nach oben verändert, z.B. von 17° Nachtabsenkung auf 21°C oder manuell, so sorgt das für einen relativ großen Sprung der Ventilstellung: soll heißen um den Sollwert schnell zu erreichen, reißen die Thermostaten erstmal voll auf (liegt am D-Anteil), um dann relativ schnell wieder runter zu gehen, bis ein konstanter Wert gefunden ist um die Temperatur zu halten. Damit hat eine Unterscheidung um 5% erst gar keinen Sinn, da die Thermostaten bei so einem Sollwertsprung sowieso auf 60% oder höher aufmachen.

2. der Thermostat arbeitet adaptiv, versucht sich also den Bedingungen anzupassen (dem Raum+ Heizungsverhalten). Soll heißen, ich würde behaupten deine Thermostaten lernen mit der Zeit, dass unter 35% bzw. 40% nix läuft. Deshalb werden sie ihr Verhalten einfach dahingehend ändern, darüber zu bleiben, um zu heizen. Sie hebeln meiner Meinung nach also deine Unterscheidung auf.

3. Das individuelle Raumverhalten sollte durch die adaptiven Eigenschaften eigentlich selbstständig vom Thermostaten gelernt werden; selbst einzugreifen kann den Regelalgorithmus des Thermostaten nur verschlechtern. Ich denke, die Unterscheidung erzeugt hauptsächlich nur Komplexität ohne wirklichen (positiven) Effekt.
Auch die Heizungssteuerung durch mein Skript verschlechtert schon die Bedingungen für die Thermostaten (zugunsten des Ausschaltens der Heizung).
Ich würde eher die beiden Parameter (an und aus) bei Bedarf etwas anpassen, immer im Hinterkopf, den Thermostaten ausreichend Platz zum regeln zu geben, immerhin sind es Regler und weit komplexer als herkömmlichen Thermostaten.
Der Boost-Modus reißt den Thermostaten ja (normalerweise) sowieso relativ weit auf, deshalb schaltet die Heizung dann sowieso ein.

KISS!
So sehe ich das jedenfalls :)
LG Mr.Heat

The-Holgi

Hm, habe es jetzt so umgesetzt:
#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}.*Thermostat");;\
    my $heizung_status=ReadingsVal("Therme","state","off")};;\

      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt.";;\
       fhem("set Therme on")if ($heizung_status == "off");;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt");;\
        fhem("set Therme off") if ($heizung_status == "on")\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

Leider nur Fehler im log sobald der Zwischenstecker schalten sollte:
2013.12.10 17:14:01 3: n_heizung return value: Global symbol "$brauche_waerme" requires explicit package name at (eval 1197) line 8.
Global symbol "$ventile_im_leerlauf" requires explicit package name at (eval 1197) line 11.
Unmatched right curly bracket at (eval 1197) line 13, at end of line
syntax error at (eval 1197) line 13, near "}
}"
Global symbol "$brauche_waerme" requires explicit package name at (eval 1197) line 14.
Global symbol "$heizung_status" requires explicit package name at (eval 1197) line 16.
syntax error at (eval 1197) line 17, near ";
}"
Global symbol "$ventile_im_leerlauf" requires explicit package name at (eval 1197) line 19.
Global symbol "@thermostaten" requires explicit package name at (eval 1197) line 19.
Global symbol "$heizung_status" requires explicit package name at (eval 1197) line 21.
syntax error at (eval 1197) line 22, near ")
}"
(eval 1197) has too many errors.


Jemand eine Idee ?
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

#12
Zitatmy $heizung_status=ReadingsVal("Therme","state","off")};;\

Die Klammer muss auf jeden Fall weg.
Außerdem hast du z.B. die for-Schleife weggelassen; wieso? das kann so nicht funktionieren.

Korrektur:

Zitat#Name des Schaltkontakts: Therme
#ELRO Zwischenstecker
#Schaltkontakt on = Therme AN   (Setzen: set Therme on)
#Schaltkontakt off = Therme AUS (Setzen: set Therme off)

define n_heizung notify n_heizung {\
   my $brauche_waerme=0;;\
   my $ventile_im_leerlauf=0;;\
   my @@thermostaten=devspec2array(".{3}Thermostat.*");;\
   my $heizung_status=ReadingsVal("Therme","state","off");;\
   foreach(@@thermostaten) {\
      my $ventil=ReadingsVal($_, "valveposition", "101");;\
      if ($ventil > 40) {\
         $brauche_waerme=1;;\
      }\
      if ($ventil < 20) {\
         $ventile_im_leerlauf++;;\
      }\
    }\
  if ($brauche_waerme != 0) {\
       Log(3,"Wärme benoetigt.";;\
       fhem("set Therme on")if ($heizung_status == "off");;\
  }\
  else {\
     if ($ventile_im_leerlauf == @@thermostaten) {\
        Log(3,"Keine Wärme (mehr) benoetigt");;\
        fhem("set Therme off") if ($heizung_status == "on")\
     }\
     else {\
        Log(3,"Heizbedarf: " . $ventile_im_leerlauf . " of " . @@thermostaten . " actuators are idle.");;\
     }\
  }\
}

define a_heizung at +*00:05:00 trigger n_heizung

#############Kontrolle der Gastherme ueber MAX-Schaltkontakt Ende####################

The-Holgi

#13
Hallo, Danke für deine Hilfe. Die for schleife ist wohl bei der Fehlersuche draufgegangen.
Habs jetzt geändert dabei ist mir noch was aufgefallen, meine Thermostate enden alle auf  _Thermostate. (wz_Thermostat, ku_Thermostat) Hier hatte ich den _ vergessen.
Habe es jetzt so geändert (".{3}.*_Thermostat")
Sollte doch eigentlich klappen oder ?

Edit:  :( Klappt leider nicht. Die Therme wird nicht abgeschaltet.

Gruß Holgi
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Mr.Heat

Nein, das hätte davor schon stimmen sollen.
.{3}Thermostat.*" bedeutet, dass der Name genau drei Zeichen hat am anfang (beliebig), dann "Thermostat", dann dürfen kein oder ein oder mehrere Zeichen folgen. das passt ja dann auch auf dich.