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.