Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Baxxy » 04.06.2023, 23:46

Hobyist hat geschrieben:
04.06.2023, 16:27
Irgendwie verstehe ich die Logik nicht.
Das Programm an sich ist jetzt erstmal nicht falsch.

Ungewöhnlich ist aber die Benamung ("LueftenJaNein") der SysVar welche dann aber als Zahl deklariert ist.

Ohne das finale Script zu kennen welches diese SysVar befüllt sowie ohne Kenntnis des Programmes welches dein Script ausführt kann man hier aber nicht wirklich weiterhelfen.

Die Empfehlung gleich alles im Script zu erledigen ist zwar gut, könnte aber mangels Scriptkenntnisse genauso in die Hose gehen.

Xel66
Beiträge: 14086
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Xel66 » 05.06.2023, 06:34

Nur wenn die Variable mit .State() gesetzt wird, kann sie auch triggern. Die anderen Varianten (.Value(), .Variable()) triggern keine Bedingungsprüfung. Auch halte ich bezüglich des Duty Cycles das Triggern eines Programms auf "bei Aktualisierung" für grundsätzlich ungünstig (außer in wirklich begründeten Fällen). Im gezeigten Programm ist es aber unschädlich, da der Status des letztendlich angesteuerten Aktors geprüft wird und somit ein Schaltbefehl nur bei "falschem" Status generiert wird. Sollte der Aktor aber mal nicht erreichbar sein, kann das den DC treiben.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Hobyist
Beiträge: 136
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Hobyist » 05.06.2023, 08:23

Vielen Dank für die Beiträge!

Nun ich habe die Systemvariable in "DiffLFabsInOut" umbenannt, um keine Missverständnisse zu produzieren. Sie beinhaltet die Differenz der "absoluten Feuchte innen" - "absolute Feuchte aussen".
Die Systemvariable ist mit der Variante ".State" :

Code: Alles auswählen

dom.GetObject("DiffLFabsInOut").State(diffabsausseninnen); 
Das Script sieht so aus:

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);
! zum testen des Programms in der WEBUI mit manuell gesetzten Werte für die Systemvariable
! dom.GetObject("DiffLFabsInOut").State(-0.009);
WriteLine("Sytemvariable DiffLFabsInOut: "#dom.GetObject("DiffLFabsInOut").State());

! Nun das Unterpgromm für die Schaltdoser aufrufen
var prgObj = dom.GetObject(ID_PROGRAMS).Get("2 Lüfter Keller einauschalten");
if ( prgObj.Active() ) {
  WriteLine("Unterprogramm aktiv");
  prgObj.ProgramExecute();
} else {
  WriteLine("Unterprogramm inaktiv");
}
Das Unterprogramm nun wie bekannt, jedoch mit geändertem Systemvariablenname.
05-06-2023_08-18-49.png
Ich hoffe mein Konstrukt ist verständlich. :D

Ich werde nun versuche, trotz mangelnden Script-Kenntnissen, ob ich die PSM-Schaltdose nicht direkt aus dem Script ansteuern könnte.
Diese Lösung wäre für mich am schönsten.

Ich bin aber für den bestehenden Weg, wie für den noch zu erstellenden Script Weg dankbar für Hinweise.
CCU3 Start Up, Wohnort Schweiz

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von MichaelN » 05.06.2023, 08:54

Einschalt Dauer immer VOR dem einschalten setzen.
Oder besser, wenn vorhanden, die Kanalaktion nutzen.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Henke » 05.06.2023, 09:05

Programme aus Scripten aufzurufen ist eine schlechte Idee. Das klappt maximal sauber am Ende. Unterm Strich gibt das nur Probleme.

Hobyist
Beiträge: 136
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Hobyist » 05.06.2023, 10:10

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.
01 05-06-2023_09-57-56.png

- 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"
2 05-06-2023_09-58-25.png

So nun läuft es für erste! So hoffe ich :D
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.
CCU3 Start Up, Wohnort Schweiz

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Henke » 05.06.2023, 10:42

Code: Alles auswählen

! 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());

boolean lueften = false;
if ( feuchteinnenabs < feuchteaussenabs ) {  	lueften = true; }
var dose = "2SchDos:3";

if ( dom.GetObject(dose ).Value() != lueften  )
{
	dom.GetObject(dose ).State ( lueften );
}

Hobyist
Beiträge: 136
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Hobyist » 05.06.2023, 10:58

Henke hat geschrieben:
05.06.2023, 10:42

Code: Alles auswählen

! 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());

boolean lueften = false;
if ( feuchteinnenabs < feuchteaussenabs ) {  	lueften = true; }
var dose = "2SchDos:3";

if ( dom.GetObject(dose ).Value() != lueften  )
{
	dom.GetObject(dose ).State ( lueften );
}
Ich staune. :!: Danke!
CCU3 Start Up, Wohnort Schweiz

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Baxxy » 05.06.2023, 14:34

Hobyist hat geschrieben:
05.06.2023, 10:58
Ich staune.
Ich auch. :roll:

Darüber das Micha hier so ein ungares Beispiel raushaut was für deine IP-"Dose" definitiv nicht funktioniert.
(und für HM Aktorik auch nicht)

Ersetze:

Code: Alles auswählen

if ( dom.GetObject(dose ).Value() != lueften  )
{
	dom.GetObject(dose ).State ( lueften );
}
durch:

Code: Alles auswählen

if ( dom.GetObject( dose ).DPByHssDP ("STATE").Value() != lueften  )
 {
  dom.GetObject( dose ).DPByHssDP ("STATE").State ( lueften );
 }


...dann sollte das mit IP und HM funktionieren.

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Rel Feuchtigkeit innen aus absoluter Feuchtigket aussen ableiten

Beitrag von Baxxy » 05.06.2023, 16:20

Hobyist hat geschrieben:
05.06.2023, 10:10
- Als erstes wird das Script ausgelöst, wenn eine Temperaturänderung draussen oder im Keller festgestellt wird.
Da musst du dich aber nochmal hinsetzen und die WebUI-Logik pauken. :wink:

Wenn beide Werte innerhalb des jeweiligen Bereiches schwanken wird dein DANN nicht ausgeführt.

Ausgeführt wird wenn Wert A oder Wert B ihren jeweiligen Bereich "von unten" oder "von oben" betreten.
Zusätzlich wird ausgeführt wenn WERT A oder Wert B ihren Bereich "nach unten" oder "nach oben" verlassen aber nur wenn der andere Wert noch innerhalb des Bereiches liegt.

Klar soweit? :mrgreen:

Stell beide auf "bei Aktualisierung" um, das macht es einfacher.
"Abfangen" tust du die Aktualisierung dann im weiteren Verlauf indem du entweder im Script oder im Programm den Aktorstatus vor der Aktion prüfst und nur "schaltest" wenn SOLL-Status != IST-Status.

Wenn beides HM-Sensoren sind dann würde es auch reichen nur einen in das Programm aufzunehmen. Die senden i.d.R im ~3Min Takt was völlig ausreichend ist. Den Vergleich macht ja dein Script.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“