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