Regelung Fussbodenheizung mit Raumregler
Verfasst: 30.04.2009, 21:32
Hallo allerseits,
ich habe ein kleines Skript geschrieben mit dem ich in Abhaengigkeit der vom Raumregler gemeldeten Raumtemperatur und der eingestellten Zieltemperatur die Fussbodenheizung hier im Haus steuern kann. Aber es sind genauso auch Regelungen von anderen Heizungstypen moeglich.
Dabei setze ich als Aktoren 4 Kanal Schalter ein, es funktioniert aber auch mit anderen Schaltaktoren. Wenn man mehrere Raumregler im Einsatz hat wird pro Raumregler ein separates Skript benoetigt.
Zu den einzustellenden Variablen:
Hier muss der eindeutige Gerätename des Raumreglers drin stehen
Hier kommen die (eindeutigen) Kanalnamen rein, es kann sich dabei auch um Kanäle verschiedener Geräte handeln. Bei den Geräten muss es sich um Schaltaktoren handeln.
Hier wird das maximale Alter (in Sekunden) des letzten Temperatur Messwerts festgelegt. (Fuer den Fall dass beim Regler die Batterien leer sind oder die Funkkommunikation laenger gestoert ist. Dieser Wert sollte unbedingt ueber 180 Sekunden liegen da die Regler im 2-3 Minuten Rhythmus neue Werte an die CCU senden. Ich schlage hier ein vielfaches von 180 vor da es durchaus ja mal passieren darf dass ein Funksignal verloren geht.
Legt die Einschaltdauer (in Sekunden) fuer alle unter "Aktoren" angegebenen Kanäle fest. Dieser Wert sollte je nach Heizungstyp angepasst werden. Der Wert sollte auch so gewaehlt werden dass er etwas geringer ist als die Zeit nach der das Skript erneut aufgerufen wird: z.B. Skript wird alle 2h gestartet, Einschaltdauer 1h55min (6900 sekunden)
Wenn man hier den Namen einer Systemvariable vom Typ Alarm eintraegt wird die entsprechende Variable auf true gesetzt wenn das Skript aufgerufen wird und das MaximaleMesswertAlter (s.o.) ueberschritten ist. (Kann z.B. in einem Hotel auf den Diebstahl des Raumreglers hindeuten).
Wichtig ist dass die Namen der Raumregler sowie die Kanalnamen der Aktoren eindeutig sind.
Kommentare und Verbesserungsvorschlaege sind wie immer willkommen.
Gruss,
Dirch
ich habe ein kleines Skript geschrieben mit dem ich in Abhaengigkeit der vom Raumregler gemeldeten Raumtemperatur und der eingestellten Zieltemperatur die Fussbodenheizung hier im Haus steuern kann. Aber es sind genauso auch Regelungen von anderen Heizungstypen moeglich.
Dabei setze ich als Aktoren 4 Kanal Schalter ein, es funktioniert aber auch mit anderen Schaltaktoren. Wenn man mehrere Raumregler im Einsatz hat wird pro Raumregler ein separates Skript benoetigt.
Code: Alles auswählen
! Name des zu steuernden/ueberwachenden Raumreglers (Name des Geraets)
string Raumregler = "Raumregler Wohnzimmer";
! Array von einzuschaltenden kanaelen, durch tab (\t) getrennt (Namen der Kanaele)
string Aktoren = "HM-LC-Sw1-FM EEQ0001522:1-Ventil1\tHM-LC-Sw1-FM EEQ0001522:1-Ventil2";
! maximales alter des messwerts in sekunden.
integer MaximalesMesswertAlter = 360;
! Einschaltdauer des Aktors/der Aktoren in Sekunden
integer Einschaltdauer = (120 * 60);
!Name der Alarm-Systemvariablen (optional)
string Alarmvariable = "ReglerAlarm";
! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
! X X
! X Ab hier nichts mehr aendern!
! X X
! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
!workaround, irgendwie mag die StrBalueByIndex kein \t
string tab = "\t";
! als erstes versuchen wir das raumregler object zu holen
object oRegler= dom.GetObject(Raumregler);
if(oRegler)
{
! wir haben etwas dieses namens gefunden
if( (OT_DEVICE == oRegler.Type()) && ("HM-CC-TC" == oRegler.HssType()) )
{
! offenbar existiert ein raumregler geraet mit diesem namen
string sChans = oRegler.Channels().EnumUsedIDs();
! nur die ersten beiden kanaele sind interessant, der erste kanal
! hat die DPs TEMPERATURE und HUMIDITY, der zweite
! kanal SETPOINT und ADJUSTING_COMMAND
string sChan1 = sChans.StrValueByIndex(tab, 0);
string sChan2 = sChans.StrValueByIndex(tab, 1);
object oChan1 = dom.GetObject(sChan1);
object oChan2 = dom.GetObject(sChan2);
! TEMPERATURE enthaelt die aktuelle raumtemperatur
object oTempDP = oChan1.DPByHssDP("TEMPERATURE");
! SETPOINT die eingestellte zieltemperatur
object oSetpointDP = oChan2.DPByHssDP("SETPOINT");
if(oTempDP && oSetpointDP)
{
! wenn beide datenpunkte existieren schauen wir
! erstmal wie aktuell die daten sind
integer iLetzteMeldung = oTempDP.Timestamp().ToInteger();
integer iJetzt = system.Date('%F %T').ToTime().ToInteger();
! wir vergleichen den timestamp von jetzt mit dem der letzten
! meldung plus + MaximalesMesswertAlter, somit stellen wir sicher
! dass der wert auch noch aktuell ist.
if(iJetzt < (iLetzteMeldung + MaximalesMesswertAlter))
{
! alles ok bis hier, nun mal die eigentlichen
! temperaturwerte auslesen
integer iAktuellerWert = oTempDP.Value();
integer iZielWert = oSetpointDP.Value();
! ist der aktuelle wert kleiner als der eingestellte zielwert
if( iAktuellerWert < iZielWert )
{
! dann versuchen wir nun alle kanaele fuer
! die Einschaltdauer einzuschalten
string sAktorChannel = "";
foreach(sAktorChannel, Aktoren)
{
object oAktorChannel = dom.GetObject(sAktorChannel);
if(oAktorChannel)
{ ! kanal existiert
string sOTDP = oAktorChannel.DPByHssDP("ON_TIME");
string sSDP = oAktorChannel.DPByHssDP("STATE");
dom.GetObject(sOTDP).State(Einschaltdauer);
dom.GetObject(sSDP).State(1);
}
}
}
else
{
! falls einer der aktoren manuell eingeschaltet wurde
! wird dieser ausgeschaltet wenn die zieltemperatur ueberschritten ist
string sAktorChannel = "";
foreach(sAktorChannel, Aktoren)
{
object oAktorChannel = dom.GetObject(sAktorChannel);
if(oAktorChannel)
{ ! kanal existiert
string sSDP = oAktorChannel.DPByHssDP("STATE");
if(dom.GetObject(sSDP).State() > 0)
{
!kanal ist aktuell eingeschaltet, also ausschalten
dom.GetObject(sSDP).State(0);
}
}
}
}
}
else
{
! Whitney, wir haben ein problem
system.Exec("logger -t Raumregler -p user.warning Raumregler " # Raumregler # " hat sich seit " # (iJetzt - iLetzteMeldung) # " Sekunden nicht gemeldet!");
if(Alarmvariable.Length() > 0)
{
object oAlarmvar = dom.GetObject(Alarmvariable);
if(! oAlarmvar.Value())
{
oAlarmvar.Variable(true);
oAlarmvar.State(true);
}
}
}
}
}
else
{
system.Exec("logger -t Raumregler -p user.warning Raumregler " # Raumregler # " ist kein Geraet oder nicht vom Typ Raumregler");
}
}
else
{
system.Exec("logger -t Raumregler -p user.warning Raumregler " # Raumregler # " nicht vorhanden, skript abgebrochen");
}
Code: Alles auswählen
string Raumregler = "Raumregler Wohnzimmer";
Code: Alles auswählen
string Aktoren = "HM-LC-Sw1-FM EEQ0001522:1-Ventil1\tHM-LC-Sw1-FM EEQ0001522:1-Ventil2";
Code: Alles auswählen
integer MaximalesMesswertAlter = 360;
Code: Alles auswählen
integer Einschaltdauer = (120 * 60);
Code: Alles auswählen
string Alarmvariable = "ReglerAlarm";
Wichtig ist dass die Namen der Raumregler sowie die Kanalnamen der Aktoren eindeutig sind.
Kommentare und Verbesserungsvorschlaege sind wie immer willkommen.
Gruss,
Dirch