Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Henke
Beiträge: 705
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 86 Mal
Danksagung erhalten: 137 Mal

Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von Henke » 15.09.2022, 01:16

Ziel:

Anzeige des Taupunktes und der "Abs. Luftfeuchte" und bereitstellen in einer Variablen zur weiteren Nutzung.
Die Installation soll dabei möglichst automatisch und einfach sein.
Screenshot 2022-09-15 004841.jpg
Anzeige
Implementierung:

CCU-Programm anlegen, siehe:
Screenshot 2022-09-15 005517.jpg
CCU-Programm
In diesem Beispiel habe ich 2 Sensoren angelegt. Mehr sind auch möglich. Für das CCU-Programm das folgende Script einfügen. Anpassungen sind nicht nötig!

Code: Alles auswählen

!Hinzufügen vom Taupunkt und Abs.Luftfeuchte zu Temperatursensoren und Wandthermostaten
!Copyleft M.Henke
!V 1.0
!Einzelne Systemvariablen können gelöscht werden. Werden alle gelöscht, so werden auch alle wieder angelegt

boolean debug = false;
!src für mich zum Testen 1524 Aussen Temp 14100 WW
integer srcId = ("$src$").ToInteger();
if (srcId > 0) {
    object oSrc = dom.GetObject(srcId);
    if ( !oSrc ) { quit; };
    object oCh = channels.Get(oSrc.Channel());
}
else { quit; }
if (!oCh || (oSrc.Type() != OT_HSSDP)) {
    quit;
}

object oDP = oCh.DPByHssDP(oSrc.HssType());
if ( debug ) {
	WriteLine("run Kanal: "#oCh.ChnNumber()#", DP: \""#oSrc.HssType()#"\", Wert: "# "$val$");
	WriteLine(oDP.Name() # " " # oDP.TypeName() # "-" # oDP.ValueName() # "-" # oDP.ID());
}

if (oSrc.HssType() != "ACTUAL_TEMPERATURE") {
    if (oSrc.HssType() != "HUMIDITY") {
        quit;
    }
}

object dp = oCh.DPByHssDP("ACTUAL_TEMPERATURE");
if (!dp) { quit; }
real temp = dp.Value().ToFloat();

object dp = oCh.DPByHssDP("HUMIDITY");
if (!dp) { quit; }
real feuchte = dp.Value().ToFloat();

!WriteLine(temp # " " # feuchte);

!https://www.wetterochs.de/wetter/feuchte.html
real T = temp;
if (T < 0.0) { T = 0.0; }
real TK = T + 273.15; !Temperatur in Kelvin
real r = feuchte;
real    a = 7.5;
real  b = 237.3; !für T >= 0
real R = 8314.3; !J / (kmol * K)(universelle Gaskonstante)
real mw = 18.016; !kg / kmol(Molekulargewicht des Wasserdampfes)

real pp = (a * T) / (b + T);
real SDD = 6.1078 * (10.0).Pow(pp);
real DD = SDD * r / 100.0;
real v = (DD / 6.1078).Log10();
real TD = (b * v / (a - v));
real AF = (10.0).Pow(5.0) * (mw / R) * DD / TK;

string out = ""
    # "\nTP: " # TD.Round(0).ToInteger() # " °C"
    # "\nAF: " # AF.Round(0).ToInteger() # " g/m³";
WriteLine(out);

string praefix = "x_";
string sv_TP = "Taupunkt"; !Taupunkt
string sv_AbsF = "Abs.Luftfeuchte"; !Abs.Luftfeuchte

string sv_ref_TP = praefix # sv_TP # "_" # oCh.ID();
object svOj_TP = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sv_ref_TP);
string sv_ref_AbsF = praefix # sv_AbsF # "_" # oCh.ID();
object svOj_AbsF = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sv_ref_AbsF);

!Wenn noch keine Systemvariable vorhanden, diese anlegen
if ((!svOj_TP) && (!svOj_AbsF) ) {
if (!svOj_AbsF ) {
    WriteLine("Erstelle: " # sv_ref_TP);
    object svOj_list = dom.GetObject(ID_SYSTEM_VARIABLES);
    svOj_TP = dom.CreateObject(OT_VARDP);
    svOj_list.Add(svOj_TP.ID());
    svOj_TP.Name(sv_ref_TP);
    svOj_TP.ValueType(ivtFloat);
    svOj_TP.ValueSubType(istGeneric);
    svOj_TP.DPInfo('Taupunkt - ' # oCh.Name());
    svOj_TP.ValueUnit('°C');
    svOj_TP.State("0");
    svOj_TP.ValueMin("0");
    svOj_TP.ValueMax("50");
    svOj_TP.Internal(false);
    svOj_TP.Visible(true);
    svOj_TP.Channel(oCh.ID());
    oCh.DPs().Add(svOj_TP);
    dom.RTUpdate(0);
}

if (!svOj_AbsF) {
    WriteLine("Erstelle: " # sv_ref_AbsF);
    object svOj_list = dom.GetObject(ID_SYSTEM_VARIABLES);
    svOj_AbsF = dom.CreateObject(OT_VARDP);
    svOj_list.Add(svOj_AbsF.ID());
    svOj_AbsF.Name(sv_ref_AbsF);
    svOj_AbsF.ValueType(ivtFloat);
    svOj_AbsF.ValueSubType(istGeneric);
    svOj_AbsF.DPInfo('Absolute Luftfeuchte - ' # oCh.Name());
    svOj_AbsF.ValueUnit('g/m³');
    svOj_AbsF.State("0");
    svOj_AbsF.ValueMin("0");
    svOj_AbsF.ValueMax("100");
    svOj_AbsF.Internal(false);
    svOj_AbsF.Visible(true);
    svOj_AbsF.Channel(oCh.ID());
    oCh.DPs().Add(svOj_AbsF);
    dom.RTUpdate(0);
}
}

if ( svOj_TP ) {svOj_TP.State(TD)};
if ( svOj_AbsF ) {svOj_AbsF.State(AF)};

Und dann kommt das schwierige. Warten... :D
Erste wenn ein Sensor eine Aktualisierung (Temperatur oder Feuchte) schickt, erscheint die Anzeige.
Bei den Wandthermostaten reicht es sie zu bedienen. Bei mir kam durch umschalten auf Manuell und zurück auf Automatik die Anzeige sofort.

Ausblick:
Script zur Berechnung von Durchschnittswerten (Temperatur,Feuchte,Spannung,...), die einen Neustart der CCU überdauern. Stichwort: Tagesmitteltemperatur

Script zum Erzeugen von Differenzwerten berechnet auf 1 Stunde eines Datenpunktes, so das darüber z.B. der "Boost" der Wandheizung im Bad gesteuert werden kann. Die Dusche erhöht die Feuchte dramatisch -> Handtuch wärmen.
Siehe: viewtopic.php?f=26&t=75545

Script als Betriebsstundenzähler.
Siehe: viewtopic.php?f=60&t=75670&p=733990#p733990

Hoffe es kann einer gebrauchen.

G
Michael
Zuletzt geändert von Henke am 22.09.2022, 23:40, insgesamt 5-mal geändert.

Benutzeravatar
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 15 Mal

Re: Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von GEVJan » 15.09.2022, 05:36

Hi Michael,

Kann man dafür nicht auch einfach das Cuxd Universal Wrapper Device (Thermostat) nehmen?

Gruß Jan
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

Henke
Beiträge: 705
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 86 Mal
Danksagung erhalten: 137 Mal

Re: Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von Henke » 15.09.2022, 15:27

GEVJan hat geschrieben:
15.09.2022, 05:36
Kann man dafür nicht auch einfach das Cuxd Universal Wrapper Device (Thermostat) nehmen?
Ja, den habe ich bisher auch genutzt. Die Installation und Wartung ist jedoch aufwendiger und es gibt keine gemittelten Tageswerte.

Vergleich mit 10 Temperatur/Feuchte Sensoren:

CUxD: 10 Geräte anlegen, 10 Geräte konfigurieren und den Räumen zuordnen, 10 Programme anlegen mit 20 Mini-Scripten mit dem Ergebnis das die Werte nicht beim Sensor stehen.

Version mit Scripten dieser Art: 1 Programm, dort 20 Datenpunkt eintragen und 2 Scripte. Die Werte stehen dann direkt bei den Sensoren inkl. Tagesmittel. Werden Werte nicht benötigt, einfach die entsprechende Systemvariable löschen.

LG
Michael

AGmac
Beiträge: 13
Registriert: 20.12.2022, 11:18
System: CCU
Hat sich bedankt: 1 Mal

Re: Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von AGmac » 20.12.2022, 11:20

Eine Anfänger Frage: woher bekomme ich die SrcID?

MichaelN
Beiträge: 7523
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 565 Mal
Danksagung erhalten: 1213 Mal

Re: Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von MichaelN » 20.12.2022, 12:00

Die übergibt die WebUI automatisch an das Skript. Es ist die ID des triggernden Datenpunktes.
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
mototeacher
Beiträge: 315
Registriert: 28.11.2013, 22:41
Wohnort: Idstein
Hat sich bedankt: 23 Mal
Danksagung erhalten: 19 Mal

Re: Script Taupunkt und Abs.Luftfeuchte in Systemvariable schreiben

Beitrag von mototeacher » 06.02.2023, 21:30

Hallo Michael,

blass vor Neid!

Aber als Hardwarehansel aus der Steinzeit wurde einem weder das Programmieren, noch die Fähigkeit Selbiges im fortgeschrittenen Alter zu erlernen, in die Wiege gelegt.

Viele, denen es ähnlich geht, lernen hier etwas Scriptprogrammierung durch copy & paste mit dezenten Anpassungen.
Für erklärende Kommentare würde sicher nicht nur ich Nachtgebete oder weltliche Äquivalente von uns geben.

Ach ja, klappt auf Anhieb.

Danke und Gruß
Uli
>450 Kanäle in ca. 90 Geräten / CCU2 als LAN GW / Tinker S mit 3.67.10.20230114 produktiv.
Weiterhin über Cat5 abgesetztes HM-MOD-RPI-PCB Modul zum optimalen Antennenstandort -
3 HmIP AP Systeme mit > 30 + 40 + 15 Komponenten aufgebaut und fortlaufender Support.
1 HmIP AP mit knapp 40 Komponenten (Klimaregelung in einem Appartmenthaus/FB Heizung)
Wärmebedarfssteuerung mehrerer Buderus Systeme über HM und HmIP
Offline Hilfe angeboten
Administrator der neuen User Map v.2 https://t1p.de/HMmap

Antworten

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