Benötigt wird ein RT, irgendein Schaltaktor, eine CCU, Stellantriebe natürlich nicht.
So gehts:
1. WebUI-Programm: HEIZSTATUS ist bei mir eine Systemvariable, die im Sommer auf AUS steht.
"Auslösen auf Aktualisierung": jedesmal wenn ein neuer Meßwert an die CCU übertragen wird (alle paar Minuten), wird das Script ausgelöst.
"Auslösen auf Änderung" geht hier nicht: nicht bei Änderung des Werts vom Sensor wird ausgelöst, sondern bei Änderung der Bedingung von WAHR auf FALSCH oder umgekehrt.
Dann würde also das Script nur bei bei Temparaturänderung von -10,5 auf -9,5° und zurück (oder so) ausgelöst. Das kommt aber eher selten vor .
2. Das Script steuert den Aktor:
Code: Alles auswählen
string VentilSchalterKanal = "HM-LC-Sw4-SM DEQ0000000:1";
string Raumregler = "HM-CC-TC GEQ0000000";
if( ! dom.GetObject(Raumregler # ":1") )
{
WriteLine("Raumreglername Kanal 1 ist nicht korrekt");
}
if( ! dom.GetObject(Raumregler # ":2") )
{
WriteLine("Raumreglername Kanal 2 ist nicht korrekt");
}
if( ! dom.GetObject(VentilSchalterKanal) )
{
WriteLine("VentilSchalterKanal ist nicht korrekt");
}
real aktuelleTemperatur = dom.GetObject(Raumregler # ":1").DPByHssDP("TEMPERATURE").Value();
real zielTemperatur = dom.GetObject(Raumregler # ":2").DPByHssDP("SETPOINT").Value();
object ventilAktorDP = dom.GetObject(VentilSchalterKanal).DPByHssDP("STATE");
real hysterese = 0.5;
if( aktuelleTemperatur < ( zielTemperatur - hysterese ) )
{
! WriteLine("temperatur zu niedrig");
if( ! ventilAktorDP.Value() )
{
! WriteLine("Aktor einschalten");
ventilAktorDP.State(1);
}
}
else
{
if( aktuelleTemperatur > ( zielTemperatur + hysterese ) )
{
! WriteLine("temperatur zu hoch");
if( ventilAktorDP.Value() )
{
! WriteLine("Aktor ausschalten");
ventilAktorDP.State(0);
}
}
}
Die ganzen debug-Infos (WriteLines) besser aus dem Script rauszuschmeißen, die CCU hat auch so schon genug zu tun. Der Übersichtlichkeit hab ichs hier im Beitrag aber drin gelassen.
Volkmar
EDIT 12/11: die Sache hat einen Haken. Wenn sich wegen des im RT gespeicherten Programms die Solltemperatur ändert (anscheinend nur dann), wird diese an die CCU übertragen. Wenn die CCU den 'Funkspruch' nicht mitbekommt bleibt die bisherige Temperatur weiter gültig - und es wird die Nacht über durchgeheizt oder morgens nicht eingeschaltet. Nachdem es ganz sporadisch solche Fehler gab hab ich einfach bei einer Temperaturänderung im RT zwei oder drei Schaltzeitpunkte dicht hintereinander gesetzt - seitdem keine Probleme mehr.
Ob ein dummy-Programm was zeitgesteuert alle 5 Minuten die SOLLtemperatur der RT in eine Variable einliest Funkverkehr erzwingt hab ich mir noch nicht weiter überlegt.
EDIT 2/12: nach einem CCU-Neustart ist für die CCU die SOLLtemp. solange Null, bis der RT das nächste Mal was sendet. Je nach Mode kann das aber dauern... solange wird die Heizung nicht gesteuert. Hier: http://homematic-forum.de/forum/viewtop ... 258#p57994 ist ein schöner workaround beschrieben.
Hier noch ein kompaktes Script für einen wired-Aktor:
Code: Alles auswählen
!Heizung Versand steuern ..................
var TempSensorSN = "GEQ0022222";
var SchaltaktorSN = "GEQ0033333:13";
var istTemperatur = dom.GetObject("BidCos-RF."+TempSensorSN+":1.TEMPERATURE").Value();
var sollTemperatur = dom.GetObject("BidCos-RF."+TempSensorSN+":2.SETPOINT").Value();
if( (istTemperatur < sollTemperatur) || (sollTemperatur == 100.0) ){
dom.GetObject("BidCos-Wired."+SchaltaktorSN+".STATE").State(true);
} else {
dom.GetObject("BidCos-Wired."+SchaltaktorSN+".STATE").State(false);
}