Hallo liebe Community,
ich habe zu der zusammengetragenen Anleitung von
hier mal ein paar Fragen (Die ganze HomeMatic Materie ist für mich komplett neu):
Vorab mein aktuelles Programm (den Programmteil für Ventilator benutze ich derzeit noch nicht und ist daher auskommentiert):
Code: Alles auswählen
! Nur hier anpassen
string raum = "Badezimmer"; ! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor) und des Namens der Systemvariable (Raum:Feuchtegehalt)
!real Rges = 0.07428; ! Mittels eigener empirischer Messung im Winter ermittelter Gesamtwärmeübergangswiderstand gemäß Rges = 0.13 * (ta-ti) / (tw-ti)
real Rges = 1.000; ! Realistischer Wert für Badezimmer
!real Rges = 0.247; ! Üblicher Wert für Außenzimmer Neubau
real t_aus = 20.0; ! Ausschaltwert in °C
real hyst = 0.7; ! Der Einschaltwert ergibt sich aus dem Ausschaltwert plus einer Hysterese (hier 0,7 K), die verhindert, dass die Anzeige im Grenzbereich ständig hin und her wechselt.
object oLicht = 0; ! Manuell auf 0 gesetzt, da ich bisher noch keine Aktoren für Licht benutze
! Prüfen, ob Systemvariablen bereits vorhanden, ansonsten anlegen
! https://www.blogging-it.com/code-snippet-homematic-systemvariablen-ueber-ein-script-automatisch-erzeugen/programmierung/homematic-script.html
string svName = "SV_Raum_"#raum#"_Schimmel";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtInteger);
svObj.ValueSubType(istEnum);
svObj.ValueList("keine Gefahr;Warnung;Alarm");
svObj.State(1);
svObj.DPInfo("");
dom.RTUpdate(false);
}
!Debugging
!var valList = svObj.ValueList();
!var val = valList .StrValueByIndex(";",svObj.Value());
!WriteLine(val);
string svName = "SV_Raum_"#raum#"_Lueften";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.ValueName0("ist falsch");
svObj.ValueName1("ist wahr");
svObj.State(true);
svObj.DPInfo("");
svObj.ValueUnit("");
dom.RTUpdate(false);
}
!Debugging
!WriteLine(svObj.State().ToString());
!WriteLine(svObj.ValueName());
! Berechnung der Schimmelwarnung und Lueftungsempfehlung
! https://smart-wohnen.org/homematic-raumklimaueberwachung-und-entfeuchtung/
object oTHa = dom.GetObject("Temperatur-/ Feuchtesensor außen:1"); ! Name des Temperatur-/Feuchtesensors im Außenbereich
object oTa = oTHa.DPByHssDP("TEMPERATURE");
object oHa = oTHa.DPByHssDP("HUMIDITY");
object oTHi = dom.GetObject("Wandthermostat "#raum#":1"); ! Name des Temperatur-/Feuchtesensors im Innenraum
object oTi = oTHi.DPByHssDP("TEMPERATURE");
object oHi = oTHi.DPByHssDP("HUMIDITY");
object oSchimmel = dom.GetObject("SV_Raum_"#raum#"_Schimmel"); ! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
object oLueften = dom.GetObject("SV_Raum_"#raum#"_Lueften"); ! Name der Systemvariablen für die Lüftungsempfehlung (Logikwert: wahr = ist wahr, falsch = ist falsch)
string VentilatorName = "Ventilator "#raum;
string VentilatorAdresse = dom.GetObject(VentilatorName).Address();
object oVentilator = dom.GetObject("BidCos-RF."#VentilatorAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Wandventilators für HomeMatic Geräte
!object oVentilator = dom.GetObject("HmIP-RF."#VentilatorAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Wandventilators für HomeMatic IP Geräte
string EntfeuchterName = "Entfeuchter "#raum;
string EntfeuchterAdresse = dom.GetObject(EntfeuchterName).Address();
!object oEntfeuchter = dom.GetObject("BidCos-RF."#EntfeuchterAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Entfeuchters für HomeMatic Geräte
object oEntfeuchter = dom.GetObject("HmIP-RF."#EntfeuchterAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Entfeuchters für HomeMatic IP Geräte
string LichtName = "Licht "#raum;
string LichtAdresse = dom.GetObject(LichtName).Address();
object oLicht = dom.GetObject("BidCos-RF."#LichtAdresse#":3.STATE"); ! Seriennummer des Deckenlichtaktors im Raum für HomeMatic Geräte
!object oLicht = dom.GetObject("HmIP-RF."#LichtAdresse#":3.STATE"); ! Seriennummer des Deckenlichtaktors im Raum für HomeMatic IP Geräte
! Programmteil Lüftungsempfehlung
! Lokale Variablen
real tin = oTi.Value(); ! Temperatur in °C innen
integer rfin = oHi.Value(); ! relative Feuchte in % innen
real afin; ! absolute feuchte in g/kg innen
real tau = oTa.Value(); ! Temperatur in °C außen
integer rfau = oHa.Value(); ! relative Feuchte in % außen
real afau; ! absolute feuchte in g/kg außen
! Berechnung der absoluten Feuchte innen
if (tin < 0.0) {tin = 0.0;}
if (tin < 10.0)
{ afin = (3.78 + (0.285 * tin) + (0.0052 * tin * tin) + (0.0005 * tin * tin * tin));
}
else
{ afin = (7.62 + (0.524 * (tin-10.0)) + (0.0131 * (tin-10.0) * (tin-10.0)) + (0.00048 * (tin-10.0) * (tin-10.0) * (tin-10.0)));
}
afin = (afin * rfin) / (100.0 + afin * (100.0 - rfin) / 622);
! Berechnung der absoluten Feuchte außen
if (tau < 0.0) {tau = 0.0;}
if (tau < 10.0)
{ afau = (3.78 + (0.285 * tau) + (0.0052 * tau * tau) + (0.0005 * tau * tau * tau));
}
else
{ afau = (7.62 + (0.524 * (tau-10.0)) + (0.0131 * (tau-10.0) * (tau-10.0)) + (0.00048 * (tau-10.0) * (tau-10.0) * (tau-10.0)));
}
afau = (afau * rfau) / (100.0 + afau * (100.0 - rfau) / 622);
! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
real t_ein = t_aus + hyst; ! Einschaltwert in °C
if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > t_ein))
{oLueften.State(true);}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= t_aus))
{oLueften.State(false);}
}
! Programmteil Schimmelwarnung
! Berechnung der Oberflächentemperatur der Außenwandecke
real tw; ! Oberfächentemperatur der Außenwandecke in °C
real ta = oTa.Value(); ! Außentemperatur in °C
real ti = oTi.Value(); ! Raumtemperatur in °C
tw = ti + ((0.13 / Rges) * (ta - ti)); ! Rges = Z.ZZZ empirisch ermittelt
! Lokale Variablen
real t; ! Temperatur in °C
integer rf; ! relative Feuchte in %
real afw; ! Schimmelwarn-Grenzfeuchte in g/kg
real afa; ! Schimmelalarm-Grenzfeuchte in g/kg
t = tw;
! Berechnung Warn-Grenzfeuchte
rf = 70;
if (t < 0.0) {t = 0.0;}
if (t < 10.0)
{ afw = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ afw = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}
afw = (afw * rf) / (100.0 + afw * (100.0 - rf) / 622);
! Berechnung Alarm-Grenzfeuchte
rf = 80;
if (t < 0.0) {t = 0.0;}
if (t < 10.0)
{ afa = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ afa = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}
afa = (afa * rf) / (100.0 + afa * (100.0 - rf) / 622);
! Schimmelwarnung
! 0 - keine Gefahr
! 1 - Warnung
! 2 - Alarm
if ((afin > afa) && (rfin > 64 )) {oSchimmel.State(2);}
else {
if ((afin > afa) || (afin > afw)) {oSchimmel.State(1);}
else {oSchimmel.State(0);}
}
! Programmteil Ventilatorsteuerung
! Prüfen, ob Raum schon zu kalt
!if (ti > 20.0)
! { if ((afau <= (afin - 0.8)) && (ta <= (ti - 1.0)) && (oLicht.Value() == 0) && (oSchimmel.Value() == 2))
! {oVentilator.State(1);}
! else
! { if ((afau >= (afin - 0.3)) || (ta >= (ti - 0.3)) || (oLicht.Value() == 1) || (oSchimmel.Value() == 1) || (oSchimmel.Value() == 0))
! {oVentilator.State(0);}
! }
! }
!else
! { if (ti <= 19.5)
! {oVentilator.State(0);}
! }
! Programmteil Entfeuchter
time timestamp = oEntfeuchter.Timestamp();
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
integer diff = now.ToInteger() - timestamp.ToInteger();
if (diff > 2700) { ! "Ein" bzw. "Aus" jeweils mindestens 45 min (2700 sec) lang aufrecht erhalten zum Schutz des Kompressors
if ((oHi.Value() > 64) && (oEntfeuchter.Value() == 0) && (oSchimmel.Value() > 1)) {
oEntfeuchter.State(1);
}
if ((oHi.Value() < 64) && (oEntfeuchter.Value() == 1)) {
oEntfeuchter.State(0);
}
}
1.) Mir ist nicht ganz klar, wieso in Zeile 75 "real tin" gesetzt wird und in Zeile 113 dann "real ti", wobei jeweils auf "oTi.Value();" zurück gegriffen wird.
Das gleiche gilt für "real tau" Zeile 78 und "real ta" Zeile 112, wobei jeweils auf "oTa.Value();" zurück gegriffen wird.
Das gleich gilt für "tw" Zeile 111 und "t" Zeile 114, denn in Zeile 114 wird t = tw gesetzt.
Wie gesagt das ist eine total neue Materie für mich, aber es scheint mir, als würden hier unnötig viele Variablen benutzt werden.
2.) In der Hoffnung, dass die Variablen lokal bleiben und sich nicht gegenseitig überschreiben, habe ich das ganze mal so erweitert, dass die Systemvariablen automatisch erstellt werden und man eigentlich nur noch oben "string raum" anpassen muss, sofern man seine Geräte auch entsprechend benannt hat, was man wohl aber sollte um den Überblick zu behalten.
3.) Trifft das folgende Zitat auch noch auf mein Programm zu?
paul53 hat geschrieben:
Mercy00 hat geschrieben:...Kann ich von dem neuen Script mehrere laufen lassen ohne das die sich gegenseitig stören. Also von wegen beim beschreiben oder auslesen der internen Variablen.
Die internen Variablen sind lokal und beeinflussen sich gegenseitig nicht. Allerdings müssen die SV für das Ergebnis unterschiedliche Namen erhalten.
Vielen Dank für eure Hilfe.
Grüße
Tom