So ich habe weitere Erkenntnisse.
Im Script wird die Systemvariable "DiffLFabsInOut" mit einem Wert befüllt.
Diese Befüllung genügt, um das "Unterprogramm" auszulösen. Denn durch die Anweisung "bei Änderung auslösen" oder "bei Aktualisierung auslösen" führt ja zur Abarbeitung des Programms.
Nun kommt der Fehler!
Dann aber rufe ich am Schluss des Scripts per Scriptbefehle das Programm noch einmal auf und verursache damit dieses konfuse Verhalten.
Lösung:
Somit habe ich auf Grund der Aussage von "Xel66" die Anweisung "bei Aktualisierung" auf "bei Änderung" gestellt.
Ich habe den Programmaufruf aus dem Script geschmissen, weil unnötig und damit auch den Empfehlungen von "Henke" entsprochen, nämlich kein Programm aus dem Script aufzurufen.
Und nun funktioniert es zu meiner grossen Freude!
Hier noch einmal mein Konstrukt, sollten sich andere dafür interessieren:
- Als erstes wird das Script ausgelöst, wenn eine Temperaturänderung draussen oder im Keller festgestellt wird.
- Zum Zweiten wird dann das Script abgearbeitet und die Systemvariable "DiffLFabsInOut" mit dem Zahlenwert befüllt.
Code: Alles auswählen
! Die Luftfeuchte aussen in absoluten Wert berechnen und dann den daraus folgenden relativen Wert für den Keller umrechnen.
! v0.1 (c) by Hobyist
! ++++++++ benutzte Sytemvariablen +++++++++
! Temperatur aussen von Davis Wetterstation über meteobridge ausgelesen
! th0_Temperatur
! rel Luftfeuchte von Davis Wetterstation über meteobridge ausgelesen
! th0_Luftfeuchte
! ++++++++ benutzte Geräte +++++++++
! 11TempFeu
! Auslesen der Systemvariablen
real tempaussen = dom.GetObject("th0_Temperatur").Value();
real feuchtaussen = dom.GetObject("th0_Luftfeuchte").Value();
! Kontrollausdrucke
WriteLine ("Aussentemperatur: " #tempaussen);
WriteLine ("rel Feuchte aussen: " #feuchtaussen);
! Auslesen der Thermostaatwerte
string Name_Thermostat_CH2 = '11TempFeu:1';
object obj_Thermostat_Kanal = channels.Get (Name_Thermostat_CH2);
if (obj_Thermostat_Kanal)
{
real Thermostat_Temp = obj_Thermostat_Kanal.DPByHssDP ("ACTUAL_TEMPERATURE").Value();
real Thermostat_Hum = 0.0+obj_Thermostat_Kanal.DPByHssDP ("HUMIDITY").Value();
! das 0.0+ ist nur dazu da, dass die Variable Thermostat_Hum als reale Zahl gilt und nicht als Ganzzahl
WriteLine("Kellerthemperatur: "#Thermostat_Temp);
WriteLine("rel Feuchte Keller: "#Thermostat_Hum);
}
else { WriteLine("Gerätekanal: "# Name_Thermostat_CH2 #" nicht gefunden!"); }
! Berechnen der absoluten Feuchtigkeit aussen
real feuchteaussenabs = ((6.112 * ((17.67 * tempaussen) / (tempaussen + 243.5)).Exp() * feuchtaussen * 2.1874) / (273.15 + tempaussen));
WriteLine("berechnete abs Feuchte aussen: "#feuchteaussenabs);
! Berechnen der absoluten Feuchtigkeit innen
real feuchteinnenabs = ((6.112 * ((17.67 * Thermostat_Temp) / (Thermostat_Temp + 243.5)).Exp() * Thermostat_Hum * 2.1874) / (273.15 + Thermostat_Temp));
WriteLine("berechnete abs Feuchte innen: "#feuchteinnenabs);
! Berechnen ob gelüftet werden soll
real diffabsausseninnen = feuchteinnenabs - feuchteaussenabs;
WriteLine("Soll gelüftet werden, wenn positiver Wert -> Ja: "#diffabsausseninnen);
! Differenzwert der absoluten Feuchtigkeit in Systemvariablen abspeichern (ist der Wert positiv soll gelüftet werden.)
dom.GetObject("DiffLFabsInOut").State(diffabsausseninnen);
WriteLine("Sytemvariable DiffLFabsInOut: "#dom.GetObject("DiffLFabsInOut").State());
- Als drittes wird dann in einem separaten Programm die Schaltdose ein- oder ausgeschaltet in Abhängigkeit der Systemvariablen "DiffLFabsInOut"
So nun läuft es für erste! So hoffe ich
Vielen Dank für alle Unterstützung!
Nun kann ich in Ruhe an die Steuerung der PSM-Schaltdose über das Script gehen, damit würde dann das Programm unter Punkt 3 hinfällig.
Das wird aber eine sehr grosse Knacknuss werden.