Script zur Berechnung des Feuchtegehalts

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

Moderator: Co-Administratoren

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von paul53 » 04.01.2015, 13:25

Ich erkenne:
tin = 18.5 °C;
tau = 6.4 °C;
afin = 7.8 g/kg;
afau = 4.5 g/kg;
Damit sind die Bedingungen für Lüften = true erfüllt:

Code: Alles auswählen

if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 18))
{oLueften.Variable(true);}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 16.5))
  {oLueften.Variable(false);}
}
Versuche es mal anstelle von .Variable(true) mit

Code: Alles auswählen

{oLueften.State(true);}
Dann wird auch der Zeitstempel aktualisiert.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
Jailbraik
Beiträge: 429
Registriert: 26.07.2013, 06:53
Hat sich bedankt: 11 Mal
Danksagung erhalten: 2 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Jailbraik » 04.01.2015, 13:47

Komme nicht weiter..

Code: Alles auswählen

! Raum_Schlafzimmer Berechnung der Schimmelwarnung und Lüftungsempfehlung
    object oTHi = dom.GetObject("HM-TC-IT-WM-W-EU Schlafzimmer:1");
    object oTi = oTHi.DPByHssDP("TEMPERATURE");
    object oHi = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("SZ_Schimmel");
   object oLueften = dom.GetObject("SZ_Lueften");
    object oTHa = dom.GetObject("Klima_Aussen:1");
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa = oTHa.DPByHssDP("HUMIDITY");
   ! Programmteil Lüftungsempfehlung
   ! Lokale Variablen
    real tin = oTi.Value(); ! Temperatur in °C innen
    integer rfin = oHi.Value(); ! relative Feuchte in % innen
   real afin;  ! absolute feuchte in g/kg innen
   real tau = oTa.Value(); ! Temperatur in °C außen
    integer rfau = oHa.Value(); ! relative Feuchte in % außen
    real afau; ! absolute feuchte in g/kg außen
   ! Berechnung der absoluten Feuchte innen
    if (tin < 0.0) {tin = 0.0;}
    if (tin < 10.0)
    { afin = (3.78 + (0.29 * tin) + (0.0046 * tin * tin) + (0.00051 * tin * tin * tin)) * 0.01 * rfin;
    }
    else
    { afin = (7.62 + (0.51 * (tin-10.0)) + (0.0143 * (tin-10.0) * (tin-10.0)) + (0.00045 * (tin-10.0) * (tin-10.0) * (tin-10.0))) * 0.01 * rfin;
    }
   ! Berechnung der absoluten Feuchte außen
   if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.29 * tau) + (0.0046 * tau * tau) + (0.00051 * tau * tau * tau)) * 0.01 * rfau;
    }
    else
    { afau = (7.62 + (0.51 * (tau-10.0)) + (0.0143 * (tau-10.0) * (tau-10.0)) + (0.00045 * (tau-10.0) * (tau-10.0) * (tau-10.0))) * 0.01 * rfau;
    }
   ! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
   if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 20.5))
   {oLueften.State(true);}
   else
   { if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 17.5))
   {oLueften.Variable(false);}
   }
   ! Programmteil Schimmelwarnung
   ! Berechnung der Oberflächentemperatur der Außenwandecke
    real tw; ! Oberfächentemperatur der Außenwandecke in °C
    real ta = oTa.Value(); ! Außentemperatur in °C
    real ti = oTi.Value(); ! Raumtemperatur in °C
    tw = ti + ((0.13 / 1.000) * (ta - ti)); ! Rges = 1.000 empirisch ermittelt
   ! Lokale Variablen
    real    t;    ! Temperatur in °C
    integer rf; ! relative Feuchte in %
    real    afw;  ! Schimmelwarn-Grenzfeuchte in g/kg
    real    afa;  ! Schimmelalarm-Grenzfeuchte in g/kg
    t = tw;
    ! Berechnung Warn-Grenzfeuchte
    rf = 70;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afw = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afw = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
    ! Berechnung Alarm-Grenzfeuchte
    rf = 80;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afa = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afa = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
    ! Schimmelwarnung
   ! 0 - keine Gefahr
   ! 1 - Warnung
   ! 2 - Alarm
   if (afin > afa) {oSchimmel.Variable(2);}
        else {
            if (afin > afw) {oSchimmel.Variable(1);}
            else {oSchimmel.Variable(0);}
     }
Das ist die Ausgabe:

Code: Alles auswählen

{
  "oHi": "BidCos-RF.LEQ0002712:1.HUMIDITY",
  "sessionId": "",
  "tau": "6.400000",
  "STDOUT": "",
  "tin": "18.600000",
  "t": "17.014000",
  "oTHa": "Klima_Aussen:1",
  "oTa": "BidCos-RF.KEQ0054269:1.TEMPERATURE",
  "ta": "6.400000",
  "rfau": "75",
  "rfin": "59",
  "afa": "9.644739",
  "rf": "80",
  "oHa": "BidCos-RF.KEQ0054269:1.HUMIDITY",
  "oSchimmel": "SZ_Schimmel",
  "oLueften": "SZ_Lueften",
  "tw": "17.014000",
  "oTHi": "HM-TC-IT-WM-W-EU Schlafzimmer:1",
  "oTi": "BidCos-RF.LEQ0002712:1.TEMPERATURE",
  "ti": "18.600000",
  "afau": "4.468582",
  "afw": "8.439146",
  "afin": "7.876413",
  "httpUserAgent": ""
}
So sehen die Variablen aus:
Screenshot (428).png

Das Ergebniss: nicht Lüften:
Screenshot (429).png
Ich werd Irre, habe ich etwas vergessen anzulegen?

Jetzt schon mal danke für die Mühe.
@
Raspberry 4 / Home Assistant / 80 Aktoren /

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von paul53 » 04.01.2015, 14:09

Ändere bitte (tin > 18) in (tin > 18.0).

Sollte es dann immer noch nicht funktionieren:
Um einzugrenzen, ob es an der Abfrage oder am Namen der SV liegt, ergänze mal um ein WriteLine(Lüften) innerhalb des if-then-Zweiges:

Code: Alles auswählen

if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 18.0))
{oLueften.State(true);
 WriteLine("Lüften");
}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 16.5))
  {oLueften.State(false);}
}
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
Jailbraik
Beiträge: 429
Registriert: 26.07.2013, 06:53
Hat sich bedankt: 11 Mal
Danksagung erhalten: 2 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Jailbraik » 04.01.2015, 14:29

paul53 hat geschrieben:Ändere bitte (tin > 18) in (tin > 18.0).

Sollte es dann immer noch nicht funktionieren:
Um einzugrenzen, ob es an der Abfrage oder am Namen der SV liegt, ergänze mal um ein WriteLine(Lüften) innerhalb des if-then-Zweiges:

Code: Alles auswählen

if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 18.0))
{oLueften.State(true);
 WriteLine("Lüften");
}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 16.5))
  {oLueften.State(false);}
}
:) Habe es jetzt so geändert:

Code: Alles auswählen

  ! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
   if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 18.0))
   {oLueften.State(true);}
   else
   { if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 16.5))
   {oLueften.Variable(false);}
Kannst Du mir noch kurz erklären, was da jetzt eingestellt wurde?

VIELEN DANK
@
Raspberry 4 / Home Assistant / 80 Aktoren /

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von paul53 » 04.01.2015, 14:42

Damit der Zeitstempel der SV auch bei Übergang zu false aktualisiert wird, ändere bitte noch

Code: Alles auswählen

  {oLueften.Variable(false);}
in

Code: Alles auswählen

  {oLueften.State(false);}
Jailbraik hat geschrieben:Kannst Du mir noch kurz erklären, was da jetzt eingestellt wurde?
18 ist ein Integer-Wert. Also wurde vermutlich aus tin auch ein Integer-Wert für den Vergleich gemacht, d.h. tin wurde auf 18 abgerundet. 18 > 18 ergibt false.
18.0 ist ein Gleitkomma-Wert wie auch tin. Damit funktioniert der Vergleich ab tin = 18.1 °C.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

neothehacker
Beiträge: 2
Registriert: 19.02.2015, 23:03

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von neothehacker » 20.02.2015, 01:02

Hallo zusammen, ich habe die Lüftungsempfehlung implementiert und soweit scheint es zu funktionieren. Allerdings werden die SV nicht verändert (Lüften / Nicht lüften) wenn das Programm (und das darin enthaltene Skript) automatisch gestartet wird (Auslösung durch Temp oder Feuchtigkeitsänderung).

Starte ich das Programm manuell, wird die SV wie gewünscht geändert. Jemand eine Idee? Danke!

Update: Scheint ein Bug zu sein? Erfolgt die Programmauslösung durch ein Zeitmodul , z.B. jede Minute, sehe ich wie die SV jede Minute gesetzt wird (am timestamp). Mache ich das über Änderung der Temp / rel. Feuchtigkeit, führt er zwar das Programm aus, die SV wird aber nicht aktualisiert. Siehe Bild.
Dateianhänge
Programm_Kinderzimmer.jpg
So wird die SV nicht aktualisiert - Bug?

peissl.at
Beiträge: 1295
Registriert: 16.05.2010, 12:39
Wohnort: Südwestlich von Graz
Danksagung erhalten: 9 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von peissl.at » 20.02.2015, 07:33

Hallo,

Du hast einen Bug (Denkfehler) eingebaut. Denn Du triggerst bei jeden Wert auf Änderung. Das bedeutet zB bei der ersten Wenn-Bedingung im Kinderzimmer: es muss die Temperatur von über 0C auf unter 0C wechseln, oder umgekehrt.
Du musst anstelle von "auf Änderung" "auf Aktualisierung" verwenden, damit das Programm ausgeführt wird. Dann reicht aber bereits ein Trigger aus, um das Programm ca. alle 3 Min aufzurufen.

Du solltest Dich nochmal mit den Grundlagen der Programme vertraut machen.

Sonnige Grüße!
Robert

neothehacker
Beiträge: 2
Registriert: 19.02.2015, 23:03

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von neothehacker » 20.02.2015, 12:50

:shock: :shock: bug im Kopf! Danke!

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von paul53 » 20.02.2015, 12:51

Das Auslösen durch den Temperatur- ODER den Feuchtemesswert ist nicht erforderlich, da meiner Meinung nach stets beide Werte in einem Funktelegramm gesendet werden. Da bei der Außentemperatur 0°C ein gültiger Wert vorliegt, wird das Programm auch bei CCU-Reboot ausgeführt, was bis zum nächsten Funktelegramm zu falschen Werten führt. Folgendes WebUI-Programm sollte immer richtig auslösen:

Wenn...
Sensor Kinderzimmer bei Rel. Luftfeuchte > 1 % bei Aktualisierung auslösen
ODER
Wettersensor Aussen bei Rel. Luftfeuchte > 1 % bei Aktualisierung auslösen
Dann...
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

washburn
Beiträge: 12
Registriert: 29.01.2015, 14:59

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von washburn » 10.05.2015, 09:58

Hallo,
ich bräuchte bitte eure Hilfe. Ich habe einen zurzeit unbeheizten leicht feuchten Keller und will diesen überwachen/lüften/entfeuchten. Was für Homematicteile brauche ich dazu?
Außen: http://www.elv.de/homematic-hm-wds10-th ... r-oth.html

Innen?
Heizkörperthermostat http://www.elv.de/homematic-heizkoerper ... tat-1.html
Wandthermostat http://www.elv.de/homematic-funk-wandthermostat-1.html

oder garnichts.

Danke

Antworten

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