Problem Taupunktberechnung

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
Handi
Beiträge: 192
Registriert: 15.08.2006, 20:34
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal

Problem Taupunktberechnung

Beitrag von Handi » 22.09.2018, 18:02

in Wikimatic bin ich über folgenden Codeschnipsel zur Taupunktberechnung gestolpert:

Code: Alles auswählen

!Temperatur in °C
!Feuchte in % rH
!Tp in °C

real Feuchte = 40.00;
real Temperatur = 30.0;

var Tp = 243.12*(((17.62*Temperatur)/(243.12+Temperatur))+((Feuchte/100).Log()))/((4283.7744/(243.12+Temperatur))-((Feuchte/100).Log())); 
Wenn ich das unter "Script testen" ausführe funktioniert es. Allerdings schaffe ich es nicht, das in meine eigene Umgebung zu integrieren. Ich logge die Temperatur- und Feuchtewerte stündlich in einer SQL-Datenbank und kopiere daher die Sensorwerte dazu erfolgreich in jeweile eigene Systemvariablen:

Code: Alles auswählen

! Außentemperatur u. -feuchtigkeit in Logging-Variable kopieren
dom.GetObject("T_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.TEMPERATURE").State());
dom.GetObject("F_aussen").State(dom.GetObject("BidCos-RF.LEQ0xxx:1.HUMIDITY").State());
Integriert in die Taupunktsberechnung scheitere ich aber. Das Test-Script dazu sieht folgendermaßen aus:

Code: Alles auswählen

! Variablen (nur fuer Test; in der CCU als Systemvariable definiert)
real T_aussen;
real F_aussen;
real Tp_aussen;

! Außentemperatur u. -feuchtigkeit in Logging-Variable kopieren
dom.GetObject("T_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.TEMPERATURE").State());
dom.GetObject("F_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.HUMIDITY").State());

! Umwandlung in Gleitkommazahlen fuer Berechnung
real rT = T_aussen.ToFloat();
real rF = F_aussen.ToFloat();

! Taupunktsberechnung
Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));

WriteLine(T_aussen);
WriteLine(F_aussen);
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Als Ergebnis bekomme ich aktuell (18,2°, 45%)

Code: Alles auswählen

0.000000
0.000000
1.000000
1.000000
-49.747733
Irgendwas scheint schon bei der Variablenzuweisung nicht zu stimmen, obwohl das im Prinzip funktioniert (beim Logging von T und F). Bin was die Scriptprogrammierung angeht leider blutiger Laie. Kann mir jemand sagen wo mein Fehler liegt?
Meine langjährige Mitgliedschaft im Forum heißt nicht zwingend, daß ich mich mit der HM-Umgebung gut auskenne (bin nur "Gelegenheits-Anwender")

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

Re: Problem Taupunktberechnung

Beitrag von nicolas-eric » 22.09.2018, 18:45

Nimm doch das CuxD (90) Wrapper Device als Thermostat. Das berechnet den Taupunkt ganz von alleine auf Grundlage der Temperatur/Luftfeuchtigkeit der HM Sensoren. S.76 der aktuellen CuxD Doku.

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Problem Taupunktberechnung

Beitrag von alchy » 23.09.2018, 12:04

So wird das nichts, da du in deinem Testscript, zwar die Systemvariablen T_aussen & F_aussen mit Sensorenwerten füllst (im besten Fall)
dann aber die Werte für das Script gar nicht zur Verfügung stellst.

Um es kurz zu machen nur für die Funktion, Anmerkungen habe ich hinzugeschrieben:

Code: Alles auswählen

! Variablen (nur fuer Test; in der CCU als Systemvariable definiert)

! Außentemperatur u. -feuchtigkeit in Logging-Variable kopieren - Alchy sagt: Achtung fehlerträchtig bei Namensgleichheit von Objekten
dom.GetObject("T_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.TEMPERATURE").Value());
dom.GetObject("F_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.HUMIDITY").Value());

! Werte aus Systemvariablen im Script zur Verfügung stellen - Alchy sagt Achtung wenn Zahlenvariablen & keine Prüfung 
real rT = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("T_aussen").Value(); 
real rF = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("F_aussen").Value(); 

! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));

!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Anmerkungen:
Du musst die Werte von Sensoren doch bestimmt nicht stündlich in eine Variable schreiben, du kannst sicher auch die Werte der Sensoren selber loggen, oder? Machst du das mit allen Sensoren so? Und wenn schon, dann würde sich anbieten die Systemvariable zu synchronisieren.
Abgesehen von der schon vorgeschlagenen Möglichkeit die virtuellen CUxD Geräte zu benutzen.
wenn ich nur diesen Wert haben möchte und kein CUxD wollte usw. würde ich die Sensorwerte zur Berechnung direkt Benutzen und die einzige Systemvariable für den Taupunkt dem Kanal des Sensors zuordnen.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Handi
Beiträge: 192
Registriert: 15.08.2006, 20:34
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal

Re: Problem Taupunktberechnung

Beitrag von Handi » 23.09.2018, 14:30

alchy hat geschrieben:
23.09.2018, 12:04
So wird das nichts, da du in deinem Testscript, zwar die Systemvariablen T_aussen & F_aussen mit Sensorenwerten füllst (im besten Fall) dann aber die Werte für das Script gar nicht zur Verfügung stellst.
Tausend Dank erstmal - hab ja geschrieben daß ich bzgl. Programmierung blutiger Laie bin (vor allem objektorientiert).
! Außentemperatur u. -feuchtigkeit in Logging-Variable kopieren - Alchy sagt: Achtung fehlerträchtig bei Namensgleichheit von Objekten
Was meinst damit?
! Werte aus Systemvariablen im Script zur Verfügung stellen - Alchy sagt Achtung wenn Zahlenvariablen & keine Prüfung
Kann ich einerseits nachvollziehen. Andererseits: was soll der Sensor sonst liefern?
Du musst die Werte von Sensoren doch bestimmt nicht stündlich in eine Variable schreiben, du kannst sicher auch die Werte der Sensoren selber loggen, oder? Machst du das mit allen Sensoren so?
Ich mache das mit der Variablen so, weil ich kein Meteorologe bin, der die Daten in kurzen Zeitabständen braucht - mir reichen Stundenwerte; außerdem geht es mir auch um die zu speichernde Datenmenge. Und da es im History-/SQL-Adapter keine Möglichkeit gibt ein Speicherintervall zu definieren bleibt mir m.E. nur diese eine Möglichkeit. Ich mach das auch mit allen Temperatur-/Feuchtigkeitssensoren so.
Und wenn schon, dann würde sich anbieten die Systemvariable zu synchronisieren.
Hab ich jetzt nicht verstanden :(
Abgesehen von der schon vorgeschlagenen Möglichkeit die virtuellen CUxD Geräte zu benutzen.
Hab ich mich dran versucht, aber außer der Temperatur bekomme ich in WebUI leider nix zu sehen (warum auch immer).
wenn ich nur diesen Wert haben möchte und kein CUxD wollte usw. würde ich die Sensorwerte zur Berechnung direkt Benutzen und die einzige Systemvariable für den Taupunkt dem Kanal des Sensors zuordnen.
Naja, diese umständliche Vorgehensweise ist wohl darauf zurückzuführen daß ich mich halt nicht wirklich auskenne. Die erste Zuweisung

Code: Alles auswählen

dom.GetObject("T_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.TEMPERATURE").State());
dom.GetObject("F_aussen").State(dom.GetObject("BidCos-RF.LEQxxx:1.HUMIDITY").State());
entstammt 1:1 dem stündlich laufenden Script für das Umkopieren der Sensordaten in die zu loggenden Variablen. Und da die Taupunktsberechnung ebenfalls stündlich laufen soll sind die beiden Zuweisungen natürlich schon vorhanden und werden dann eigentlich nur um die Umwandlung in real und die eigentliche Taupunktsberechnung ergänzt. Wenn man nur letzteres machen will dann sollte die direkte Nutzung der Sensorvariablen natürlich auch möglich sein. Nur weiß ich halt wieder nicht wie das genau geht.

Die Crux ist daß ich bisher keine vernünftige / für mich verständliche Anleitung für die Programmierung gefunden habe. Die Doku von eq3 geht da nicht so drauf ein und alles andere was ich gefunden habe geht nicht so tief. Ich bin schon froh daß ich rausgefunden habe wie man Sensorwerte Variablen zuweist :(
Meine langjährige Mitgliedschaft im Forum heißt nicht zwingend, daß ich mich mit der HM-Umgebung gut auskenne (bin nur "Gelegenheits-Anwender")

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Problem Taupunktberechnung

Beitrag von alchy » 24.09.2018, 11:06

Handi hat geschrieben:
23.09.2018, 14:30
Alchy sagt: Achtung fehlerträchtig bei Namensgleichheit von Objekten
Was meinst damit?
Das was ich schrieb. Und wenn du mal die Suche benutzt dann wirst du reichlich Lesestoff dazu finden.
Kein Objekt darf heißen wie ein anderes.

Der Zugriff mittels Script auf ein Objekt in der CCU

dom.GetObject("Objektname").....

ist fehlerträchtig. Gibt es 2 oder mehr Objekte mit demselben Namen verringern sich die Chancen, das dein Script das macht, was du willst.
Das mag dir vielleicht bei einem Objeknamen wie T_aussen nicht gleich passieren, aber selbst den hattest du schon als Scriptvariable als auch als Objektnamen in deinem kurzen Script. (was zwar keine Dopplung im Sinne des Bugs ist) aber
Ich glaube kaum, das dir bewusst ist, wenn du eine Systemvariabe: Licht besitzt, ein Programm: Licht und ein Gewerk: Licht und einen Favoriten: Licht das es dann beim z.B. Zugriff mittels Script
dom.GetObject("Licht").....
für die CCU schwierig wird zu erraten, was du denn willst. Jetzt verstanden?
Handi hat geschrieben:
23.09.2018, 14:30
Kann ich einerseits nachvollziehen. Andererseits: was soll der Sensor sonst liefern?
Ich habe Zahlenvariable geschrieben. Du kannst ja den Wert des Sensors auch z.B. in einer Stringvariablen speichern, dann ist es eine Zeichenkette mit der man erstmal nicht rechnen kann. Nehmen wir die Feuchtewerte eines Sensors. Die haben den Typ Integer - und schon geht das Theater los.
Was ich also sagen wollte: Es erfolgt weder eine Prüfung auf Vorhandensein des Objekts, noch auf Korrektheit des Typs usw..
Es wird im Beispielscript nichts geprüft - kurzum - es funktioniert nur, wenn du Regeln beachtest und alles richtig machst.
Handi hat geschrieben:
23.09.2018, 14:30
Ich mache das mit der Variablen so, weil ich kein Meteorologe bin,
Mir wäre es absolut zu blöd, für meine in Summe ca. 15 Temperatursensoren jeweils eine Systemvariable für Temperatur und Luftfeuchtigkeit anzulegen damit ich dessen Werte stündlich loggen kann. Aber bitte - jedem Tierchen sein....
Handi hat geschrieben:
23.09.2018, 14:30
Hab ich mich dran versucht, aber außer der Temperatur bekomme ich in WebUI leider nix zu sehen (warum auch immer).
Dann hast du dabei einen Fehler gemacht. Statt diesen auszumerzen, wird eben irgendetwas anderes versucht. :P
(Aber ich würde auch nicht 15 virtuelle CUxD Geräte anlegen um die Werte für alle HM Sensoren bei mir zu haben :mrgreen: )
Handi hat geschrieben:
23.09.2018, 14:30
entstammt 1:1 dem stündlich laufenden Script für das Umkopieren der Sensordaten in die zu loggenden Variablen. Und da die Taupunktsberechnung ebenfalls stündlich laufen soll sind die beiden Zuweisungen natürlich schon vorhanden und werden dann eigentlich nur um die Umwandlung in real und die eigentliche Taupunktsberechnung ergänzt. Wenn man nur letzteres machen will dann sollte die direkte Nutzung der Sensorvariablen natürlich auch möglich sein. Nur weiß ich halt wieder nicht wie das genau geht.
In meiner Signatur sollten Links sein zur Scriptdoku. Die ist ein Anfang, wenn auch noch lange nicht das Ende.
Natürlich kannst du das so machen, wie du es willst.

Ein paar Sachen:

Die Wandlung des Wertes einer Systemvariabel vom Typ Zahl ist nicht nötig. Der Wert hat den Typ real.
Ebenso z.B. der Temperaturdatenpunkt eines Sensors. Feuchtewerte, siehe oben.
Und was die Nutzung von unterschiedlichen Objekten angeht.

Hier das Beispiel1 von oben
- du hast 2 Systemvariablen vom Typ Zahl angelegt, welche von wo auch immer ihre Werte für Temperatur und Feuchte stündlich erhalten. Nun willst du den Taupunkt daraus errechnen:

Code: Alles auswählen

! Objekte die Werte enthalten 
object temperatur = dom.GetObject(ID_SYSTEM_VARIABLES).Get("T_aussen"); 
object feuchte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("F_aussen"); 

! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value(); 
real rF = feuchte.Value(); 

! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));

!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Die Werte sind natürlich eben genau so alt wie eben die Werte aus den Variablen. Aber es funktioniert, wie du willst.

Jetzt willst du aber nicht die Werte aus Systemvariablen lesen, sondern direkt die Werte aus deinem Sensor verwenden.
Nun könnte man auf die Idee kommen die Objekte, welche die Werte enthalten einfach auszutauschen

Code: Alles auswählen

! Objekte die Werte enthalten 
object temperatur = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ012345678:1.TEMPERATURE");
object feuchte = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ012345678:1.HUMIDITY"); 

! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value(); 
real rF = feuchte.Value(); 

! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));

!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Das wird aber nicht funktionieren. :shock: Die Ausgabe sieht dann ungefähr so aus:

Code: Alles auswählen

19.500000
62
-nan
Der Grund ist, wie ich schon oben schrieb, das der Feuchtewert ein Integer Wert ist. Das man real davor schreibt interessiert erstmal wenig.
Klar, wandeln wir den Wert, wie du es oben gemacht hast mittels .ToFloat();
Auch dieses wird dich nicht weiterbringen (je nach Rega). Probier es aus. :shock:
Was auch immer, es ist doch aber mehr auf den Rücken durch die Brust ins Auge.

Ich kürze es ab:
Also suchen wir die Ursache oder beschreiten gleich einen anderen Weg zur Berechnung.
Nehmen wir also dieses:

Code: Alles auswählen

! Objekte die Werte enthalten 
object temperatur = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ0105626:1.TEMPERATURE");
object feuchte = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ0105626:1.HUMIDITY"); 

! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value(); 
real rF = feuchte.Value(); 
! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((0.01*rF).Log()))/((4283.7744/(243.12+rT))-((0.01*rF).Log()));

!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Werden wir annehmbare Werte erhalten.

Also nehmen wir dieselbe Berechnung auch bei den Systemvariablen:

Code: Alles auswählen

! Objekte die Werte enthalten 
object temperatur = dom.GetObject(ID_SYSTEM_VARIABLES).Get("T_aussen"); 
object feuchte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("F_aussen"); 

! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value(); 
real rF = feuchte.Value(); 

! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((0.01*rF).Log()))/((4283.7744/(243.12+rT))-((0.01*rF).Log()));

!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Auch das sollte funktionieren. Langer Text - hoffe du konntest folgen.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

steingarten
Beiträge: 295
Registriert: 28.10.2013, 18:38
Hat sich bedankt: 15 Mal
Danksagung erhalten: 43 Mal

Re: Problem Taupunktberechnung

Beitrag von steingarten » 30.01.2020, 20:39

Danke, dies half mir sehr bei der automatisierten Garagenbelüftung.

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“