Script ToString() -Funktion

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Script ToString() -Funktion

Beitrag von Tyfys » 14.09.2021, 12:40

Hallo
Kann mir jemand erklären wie das funktioniert ?

Hier
https://homematic-forum.de/forum/viewt ... 9#p678371


gibt es Formeln zur Berechnung der absoluten Feuchte für innen und aussen:

Code: Alles auswählen

! xxx Berechnung der absoluten Feuchte innen (in g/m³ Luftvolumen)
! https://homematic-forum.de/forum/viewtopic.php?f=26&t=69549&p=678384#p678382
!
    real afVin = (0.0 + (rfin * 13.245 * ((17.67 * tin)/(tin + 243.5)).Exp()) / (273.15 + tin)).ToString(2);
! xxx
!
! xxx Berechnung der absoluten Feuchte außen (in g/m³ Luftvolumen)
!
	real afVau = (0.0 + (rfau * 13.245 * ((17.67 * tau)/(tau + 243.5)).Exp()) / (273.15 + tau)).ToString(2);
! xxx
!
! xxx Berechnung der Lüftungsempfehlung in g/m³ Luftvolumen
! true Faktor; 0.8 bis 1.5; false Faktor; 0.3 bis 0.5; 	Hysterese mind 0.5
    if (afVau < afVin - 1.2) {oLueften.Variable(1);}
     else { 
        if (afVau >= afVin - 0.5) {oLueften.Variable(0);}
          }
Die beiden Variablen afVau und afVin sind zwar als real definiert, werden aber durch die Funktion ToString() in Zeichenketten umgewandelt.

In den nachfolgenden if/else - Statements wird dann mit diesen Strings noch gerechnet - 1.2 bzw 0.5 subtrahiert.

Nach meiner Kenntnis kann man mit Zahlen in Strings nicht direkt rechnen
sowie nicht so ohne weiteres auf Grösser / Kleiner prüfen.
Z.B., wird "6" bei dem Vergleich immer grösser als "10" gewertet.

Also daher nochmal die Frage, wieso das funktioniert
und warum man überhaupt bei den Berechnung ToString() verwendet?


Gruß
Harry
Gruß
Harry

MichaelN
Beiträge: 9634
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 Mal

Re: Script ToString() -Funktion

Beitrag von MichaelN » 14.09.2021, 13:31

Tyfys hat geschrieben:
14.09.2021, 12:40
warum man überhaupt bei den Berechnung ToString() verwendet?
Wieso fragst Du nicht den Autoren dieser Zeilen? Vielleicht wollte er einfach nur auf 2 Nachkommastellen runden?
HM Skript ändert den Variablentyp wie es gerade passt. Das kann hilfreich sein, wie in diesem Fall, oder man kann damit gewaltig auf die Schnauze fallen.
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 +++

schlichi
Beiträge: 387
Registriert: 26.08.2016, 19:26
System: Alternative CCU (auf Basis OCCU)
Wohnort: Erding
Hat sich bedankt: 60 Mal
Danksagung erhalten: 28 Mal

Re: Script ToString() -Funktion

Beitrag von schlichi » 14.09.2021, 14:15

Hallo Harry,

du hast natürlich recht. Ich hatte die Formel für die Luftfeuchteberechnung für Luftvolumen (g/m³) bisher nicht verwendet und deshalb den Fehler, den ich aus dem Scriptschnitzel in mein Script übernommen hatte, nicht bemerkt. Wie Michael richtig feststellt, wollte der Scriptersteller einfach nur Runden.

Ich habe den Fehler im Script entsprechend korrigiert.

Gruß
schlichi
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

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

Re: Script ToString() -Funktion

Beitrag von Baxxy » 14.09.2021, 15:12

schlichi hat geschrieben:
14.09.2021, 14:15
wollte der Scriptersteller einfach nur Runden.
Rundet .ToString(x) überhaupt? Ich bin eigentlich der Meinung das hier nur "abgeschnitten" wird ohne Rundung. Für's korrekte Runden gibt's doch .Round(x)

Grüße
Baxxy

Benutzeravatar
jmaus
Beiträge: 9839
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 461 Mal
Danksagung erhalten: 1863 Mal
Kontaktdaten:

Re: Script ToString() -Funktion

Beitrag von jmaus » 14.09.2021, 15:15

Baxxy hat geschrieben:
14.09.2021, 15:12
schlichi hat geschrieben:
14.09.2021, 14:15
wollte der Scriptersteller einfach nur Runden.
Rundet .ToString(x) überhaupt? Ich bin eigentlich der Meinung das hier nur "abgeschnitten" wird ohne Rundung. Für's korrekte Runden gibt's doch .Round(x)
Ja, .Round(x) sollte man verwenden und für das Abschneiden gibt es auch entsprechende numerische Funktionen wie .Trunc(x), etc. Ein .ToString(x) sollte man nun wirklich (genau wegen dieser Verwirrung hier) nur dann verwenden wenn man auch wirklich einen String danach haben will/muss.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

schlichi
Beiträge: 387
Registriert: 26.08.2016, 19:26
System: Alternative CCU (auf Basis OCCU)
Wohnort: Erding
Hat sich bedankt: 60 Mal
Danksagung erhalten: 28 Mal

Re: Script ToString() -Funktion

Beitrag von schlichi » 14.09.2021, 16:46

Hallo Zusammen,

man lernt aus der Praxis 8)

Deshalb auch für nicht so versierte User das kleine Script:

Code: Alles auswählen

! Test runden .Round(n), abschneiden .Trunc(n), beides zusammen .ToString(n)

real afMin = 123.1234567;
!
string rwerte = afMin.Round(4);
string twerte = afMin.Trunc(4); 
string swerte = afMin.ToString(4);
!
WriteLine("Round: " # rwerte # ", Trunc: " # twerte # ", String: " # swerte );
Ergebnis:

Code: Alles auswählen

Round: 123.123500, Trunc: 123.123400, String: 123.1235
Danke.

Gruß
schlichi
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script ToString() -Funktion

Beitrag von Tyfys » 14.09.2021, 18:08

Hallo schlichi

Du hättest besser die beiden Variablen rwerte und twerte auch als Type real definieren sollen,
denn den erben sie auch von afMin durch Round(4) bzw Trunc(4).
Diese kann man auch weiter für Berechnungen verwenden.

Die Variable swerte wird durch ToString(4) dann tatsächlich zum Type String, womit man dann auch nicht rechnen kann.

Die Variablentypen kann man sich so anzeigen lassen:

Code: Alles auswählen

WriteLine(afMin.VarType());
WriteLine(rwerte.VarType());
WriteLine(twerte.VarType());
WriteLine(swerte.VarType());
Ergebnis:

Code: Alles auswählen

3
3
3
4
lt.Skript-Doku
3 = real
4 = string

Für mich macht die richtige Variablentyp - Definition das lesen immer einfacher.

Gruß
Harry
Gruß
Harry

Antworten

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