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 » 25.07.2017, 19:15

Nimm am Besten die Daten aus dem CUxD Thermostat Device. Im folgenden ist CUxD-Device 1 = Aussen und CUxD-Device 2 = Bad.

Code: Alles auswählen

! Werte einlesen
ta = dom.GetObject("CUxD.CUX9002001:1.TEMPERATURE").Value();
afa = dom.GetObject("CUxD.CUX9002001:1.ABS_HUMIDITY").Value();
ti = dom.GetObject("CUxD.CUX9002002:1.TEMPERATURE").Value();
afi = dom.GetObject("CUxD.CUX9002002:1.ABS_HUMIDITY").Value();
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)

Tomcraft
Beiträge: 6
Registriert: 28.07.2017, 13:31

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Tomcraft » 31.07.2017, 18:30

Hallo liebe Community,

ich habe zu der zusammengetragenen Anleitung von hier mal ein paar Fragen (Die ganze HomeMatic Materie ist für mich komplett neu):

Vorab mein aktuelles Programm (den Programmteil für Ventilator benutze ich derzeit noch nicht und ist daher auskommentiert):

Code: Alles auswählen

! Nur hier anpassen
string   raum = "Badezimmer"; ! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor) und des Namens der Systemvariable (Raum:Feuchtegehalt)
!real     Rges = 0.07428; ! Mittels eigener empirischer Messung im Winter ermittelter Gesamtwärmeübergangswiderstand gemäß Rges = 0.13 * (ta-ti) / (tw-ti)
real     Rges = 1.000; ! Realistischer Wert für Badezimmer
!real     Rges = 0.247; ! Üblicher Wert für Außenzimmer Neubau
real    t_aus = 20.0; ! Ausschaltwert in °C
real     hyst = 0.7; ! Der Einschaltwert ergibt sich aus dem Ausschaltwert plus einer Hysterese (hier 0,7 K), die verhindert, dass die Anzeige im Grenzbereich ständig hin und her wechselt.
object oLicht = 0; ! Manuell auf 0 gesetzt, da ich bisher noch keine Aktoren für Licht benutze

! Prüfen, ob Systemvariablen bereits vorhanden, ansonsten anlegen
! https://www.blogging-it.com/code-snippet-homematic-systemvariablen-ueber-ein-script-automatisch-erzeugen/programmierung/homematic-script.html
string svName = "SV_Raum_"#raum#"_Schimmel";
object svObj  = dom.GetObject(svName);
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtInteger);
    svObj.ValueSubType(istEnum);
    svObj.ValueList("keine Gefahr;Warnung;Alarm");
    svObj.State(1);
 
    svObj.DPInfo("");
 
    dom.RTUpdate(false);
}
!Debugging
!var valList = svObj.ValueList();
!var val = valList .StrValueByIndex(";",svObj.Value());
!WriteLine(val);

string svName = "SV_Raum_"#raum#"_Lueften";
object svObj  = dom.GetObject(svName);
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtBinary);
    svObj.ValueSubType(istBool);
    svObj.ValueName0("ist falsch");
    svObj.ValueName1("ist wahr");    
    svObj.State(true);
 
    svObj.DPInfo("");
    svObj.ValueUnit("");
 
    dom.RTUpdate(false);
}
!Debugging
!WriteLine(svObj.State().ToString());
!WriteLine(svObj.ValueName());

! Berechnung der Schimmelwarnung und Lueftungsempfehlung
! https://smart-wohnen.org/homematic-raumklimaueberwachung-und-entfeuchtung/
object oTHa = dom.GetObject("Temperatur-/ Feuchtesensor außen:1"); ! Name des Temperatur-/Feuchtesensors im Außenbereich
object oTa = oTHa.DPByHssDP("TEMPERATURE");
object oHa = oTHa.DPByHssDP("HUMIDITY");

object oTHi = dom.GetObject("Wandthermostat "#raum#":1"); ! Name des Temperatur-/Feuchtesensors im Innenraum
object oTi   = oTHi.DPByHssDP("TEMPERATURE");
object oHi   = oTHi.DPByHssDP("HUMIDITY");

object oSchimmel = dom.GetObject("SV_Raum_"#raum#"_Schimmel"); ! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
object oLueften = dom.GetObject("SV_Raum_"#raum#"_Lueften"); ! Name der Systemvariablen für die Lüftungsempfehlung (Logikwert: wahr = ist wahr, falsch = ist falsch)

string VentilatorName = "Ventilator "#raum;
string VentilatorAdresse = dom.GetObject(VentilatorName).Address();
object oVentilator = dom.GetObject("BidCos-RF."#VentilatorAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Wandventilators für HomeMatic Geräte
!object oVentilator = dom.GetObject("HmIP-RF."#VentilatorAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Wandventilators für HomeMatic IP Geräte

string EntfeuchterName = "Entfeuchter "#raum;
string EntfeuchterAdresse = dom.GetObject(EntfeuchterName).Address();
!object oEntfeuchter = dom.GetObject("BidCos-RF."#EntfeuchterAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Entfeuchters für HomeMatic Geräte
object oEntfeuchter = dom.GetObject("HmIP-RF."#EntfeuchterAdresse#":3.STATE"); ! Seriennummer des Aktors zur Steuerung des Entfeuchters für HomeMatic IP Geräte

string LichtName = "Licht "#raum;
string LichtAdresse = dom.GetObject(LichtName).Address();
object oLicht = dom.GetObject("BidCos-RF."#LichtAdresse#":3.STATE"); ! Seriennummer des Deckenlichtaktors im Raum für HomeMatic Geräte
!object oLicht = dom.GetObject("HmIP-RF."#LichtAdresse#":3.STATE"); ! Seriennummer des Deckenlichtaktors im Raum für HomeMatic IP Geräte

! 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.285 * tin) + (0.0052 * tin * tin) + (0.0005 * tin * tin * tin));
}
else
{ afin = (7.62 + (0.524 * (tin-10.0)) + (0.0131 * (tin-10.0) * (tin-10.0)) + (0.00048 * (tin-10.0) * (tin-10.0) * (tin-10.0)));
}
afin = (afin * rfin) / (100.0 + afin * (100.0 - rfin) / 622);
! Berechnung der absoluten Feuchte außen
if (tau < 0.0) {tau = 0.0;}
if (tau < 10.0)
{ afau = (3.78 + (0.285 * tau) + (0.0052 * tau * tau) + (0.0005 * tau * tau * tau));
}
else
{ afau = (7.62 + (0.524 * (tau-10.0)) + (0.0131 * (tau-10.0) * (tau-10.0)) + (0.00048 * (tau-10.0) * (tau-10.0) * (tau-10.0)));
}
afau = (afau * rfau) / (100.0 + afau * (100.0 - rfau) / 622);
! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
real t_ein = t_aus + hyst; ! Einschaltwert in °C
if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > t_ein))
{oLueften.State(true);}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= t_aus))
{oLueften.State(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 / Rges) * (ta - ti)); ! Rges = Z.ZZZ 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.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ afw = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}
afw = (afw * rf) / (100.0 + afw * (100.0 - rf) / 622);
! Berechnung Alarm-Grenzfeuchte
rf = 80;
if (t < 0.0) {t = 0.0;}
if (t < 10.0)
{ afa = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ afa = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}
afa = (afa * rf) / (100.0 + afa * (100.0 - rf) / 622);
! Schimmelwarnung
! 0 - keine Gefahr
! 1 - Warnung
! 2 - Alarm
if ((afin > afa) && (rfin > 64 )) {oSchimmel.State(2);}
    else {
        if ((afin > afa) || (afin > afw)) {oSchimmel.State(1);}
        else {oSchimmel.State(0);}
    }

! Programmteil Ventilatorsteuerung
! Prüfen, ob Raum schon zu kalt
!if (ti > 20.0)
!    { if ((afau <= (afin - 0.8)) && (ta <= (ti - 1.0)) && (oLicht.Value() == 0) && (oSchimmel.Value() == 2))
!        {oVentilator.State(1);}
!        else
!        { if ((afau >= (afin - 0.3)) || (ta >= (ti - 0.3)) || (oLicht.Value() == 1) || (oSchimmel.Value() == 1) || (oSchimmel.Value() == 0))
!        {oVentilator.State(0);}
!        }
!    }
!else
!    { if (ti <= 19.5)
!    {oVentilator.State(0);}
!    }

! Programmteil Entfeuchter
time timestamp = oEntfeuchter.Timestamp();
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
integer diff = now.ToInteger() - timestamp.ToInteger();
if (diff > 2700) { ! "Ein" bzw. "Aus" jeweils mindestens 45 min (2700 sec) lang aufrecht erhalten zum Schutz des Kompressors
  if ((oHi.Value() > 64) && (oEntfeuchter.Value() == 0) && (oSchimmel.Value() > 1)) {
     oEntfeuchter.State(1);
  }
  if ((oHi.Value() < 64) && (oEntfeuchter.Value() == 1)) {
     oEntfeuchter.State(0);
  }
}
1.) Mir ist nicht ganz klar, wieso in Zeile 75 "real tin" gesetzt wird und in Zeile 113 dann "real ti", wobei jeweils auf "oTi.Value();" zurück gegriffen wird.
Das gleiche gilt für "real tau" Zeile 78 und "real ta" Zeile 112, wobei jeweils auf "oTa.Value();" zurück gegriffen wird.
Das gleich gilt für "tw" Zeile 111 und "t" Zeile 114, denn in Zeile 114 wird t = tw gesetzt.
Wie gesagt das ist eine total neue Materie für mich, aber es scheint mir, als würden hier unnötig viele Variablen benutzt werden.

2.) In der Hoffnung, dass die Variablen lokal bleiben und sich nicht gegenseitig überschreiben, habe ich das ganze mal so erweitert, dass die Systemvariablen automatisch erstellt werden und man eigentlich nur noch oben "string raum" anpassen muss, sofern man seine Geräte auch entsprechend benannt hat, was man wohl aber sollte um den Überblick zu behalten. ;-)

3.) Trifft das folgende Zitat auch noch auf mein Programm zu?
paul53 hat geschrieben:
Mercy00 hat geschrieben:...Kann ich von dem neuen Script mehrere laufen lassen ohne das die sich gegenseitig stören. Also von wegen beim beschreiben oder auslesen der internen Variablen.
Die internen Variablen sind lokal und beeinflussen sich gegenseitig nicht. Allerdings müssen die SV für das Ergebnis unterschiedliche Namen erhalten.
Vielen Dank für eure Hilfe.

Grüße

Tom

ZaHackn
Beiträge: 147
Registriert: 24.03.2014, 10:00
Hat sich bedankt: 7 Mal
Danksagung erhalten: 1 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von ZaHackn » 02.08.2017, 11:45

Ich hab das jetzt mal angepasst:

Code: Alles auswählen

! Raumlüftung
! ausgelöst durch SV "Raum:Feuchtegehalt" ODER "Aussen:Feuchtegehalt"          

! Raumname im Namen der SV (Raum:Temperatur Raum:Feuchtegehalt Raum:Lueften)
string raum = "SZ";
       
! Lokale Variablen
real ta;   ! Aussentemperatur in °C
real ti;   ! Innentemperatur in °C
real afa;   ! Aussenfeuchtegehalt in g/kg
real afi;   ! Innenfeuchtegehalt in g/kg                                    

! Werte einlesen
ta = dom.GetObject("CUxD.CUX9002001:1.TEMPERATURE").Value();
afa = dom.GetObject("CUxD.CUX9002001:1.ABS_HUMIDITY").Value();
ti = dom.GetObject("CUxD.CUX9002002:1.TEMPERATURE").Value();
afi = dom.GetObject("CUxD.CUX9002002:1.ABS_HUMIDITY").Value();

! Lüftung steuern mit 0,5 g/kg und 0,7 K Hysterese
! Raum unter 21,0 °C zu kalt
if ((afa <= (afi - 0.8)) && (ta <= (ti - 1.0)) && (ti >= 21.7))
{dom.GetObject(raum#":Lueften").State(true);}
else
{ if ((afa >= (afi - 0.3)) || (ta >= (ti - 0.3)) || (ti <= 21.0))
  {dom.GetObject(raum#":Lueften").State(false);}
}
Ich verstehe das so:

Das hier füllt die lokalen Variablen (LV) anhand der Seriennummer des CUXD Devices:

! Werte einlesen
ta = dom.GetObject("CUxD.CUX9002001:1.TEMPERATURE").Value();
afa = dom.GetObject("CUxD.CUX9002001:1.ABS_HUMIDITY").Value();
ti = dom.GetObject("CUxD.CUX9002002:1.TEMPERATURE").Value();
afi = dom.GetObject("CUxD.CUX9002002:1.ABS_HUMIDITY").Value();

Das hier setzt dann die Systemvariable (SV) auf wahr oder falsch:


! Lüftung steuern mit 0,5 g/kg und 0,7 K Hysterese
! Raum unter 21,0 °C zu kalt
if ((afa <= (afi - 0.8)) && (ta <= (ti - 1.0)) && (ti >= 21.7))
{dom.GetObject(raum#":Lueften").State(true);}
else
{ if ((afa >= (afi - 0.3)) || (ta >= (ti - 0.3)) || (ti <= 21.0))
{dom.GetObject(raum#":Lueften").State(false);}
}[/code]


Wo kommen die SVs hier her?

! ausgelöst durch SV "Raum:Feuchtegehalt" ODER "Aussen:Feuchtegehalt"

! Raumname im Namen der SV (Raum:Temperatur Raum:Feuchtegehalt Raum:Lueften)

Man schreibt die Werte doch direkt vom CuXD Device in die LVs...
Dateianhänge
LüftenProgramm.JPG
LüftenInnen.JPG
LüftenAußen.JPG
Lüften3.JPG
Lüften2.JPG
Lüften1.JPG

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 » 02.08.2017, 12:29

Die SV "Aussen:Feuchtegehalt", "Aussen:Temperatur", "SZ:Feuchtegehalt" und "SZ:Temperatur" benötigst Du nicht, da du im Skript direkt auf die Werte aus dem CUxD Thermostat Device zugreifst. Lediglich die SV "SZ:Lueften" wird benötigt: Als Lüftungsempfehlung oder um in einem weiteren WebUI-Programm den Lüfter zu schalten:
Wenn SV "SZ:Lueften" ist wahr (bei Änderung auslösen)
Dann Lüfter sofort auf Ein
Sonst Lüfter sofort auf Aus
Das Auslösen des Programmes mit dem Skript sollte durch den Feuchtegehalt (CUxD) erfolgen:
Wenn "CUxD.CUX9002001:1" ABS_HUMIDITY ist größer als 0 (bei Aktualisierung auslösen)
ODER
"CUxD.CUX9002002:1" ABS_HUMIDITY ist größer als 0 (bei Aktualisierung auslösen)
Dann Skript sofort
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)

DyNamicJoe
Beiträge: 8
Registriert: 13.10.2017, 14:20

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von DyNamicJoe » 13.10.2017, 14:26

Hallo,
ich bin ganz neu in der Homematic Welt und fange erst an mich richtig einzuarbeiten. Daher verzeit wenn ich teilweise nicht alles weiß. Ich habe den ganzen Thread gelesen und habe ein paar Fragen.
Ich möchte zunächst das Beispiel Skript von smart-wohnen.org nutzen um mir eine Lüftungsempfehlung und eine Schimmelwarnung für das Bad auszugeben. Als Sensoren habe ich das Homematic Wandthermostat für die Luftfeuchtigkeit innen. Da ich mir als Student die Außensensoren noch nicht leisten kann will ich hier auf eine Wetterstation des Nachbarn zugreifen. Dessen Daten lasse ich schon durch wounderworld in meiner Homematic als Systemvariablen ablegen. Somit habe ich relativ genaue Luftfeuchtigkeitswerte usw. .
Wie ersetze ich jetzt in dem Skript die Abfrage des Gerätes für den Außensensor durch meine Systemvariablen für Temperatur und relative Luftfeuchtigkeit?
Ich würde mich freuen, wenn ihr mir etwas Starthilfe geben könnten.

Grüße

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

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von alchy » 13.10.2017, 15:11

Wäre es dir in Zukunft möglich einen Link zu dem Script, bzw. das Script hier per Copy & Paste in Ciodetags eingebettet zu posten?
Dann kann dir auch schneller geholfen werden.


du entfernst:

Code: Alles auswählen

! Werte einlesen
t = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value();
rf = dom.GetObject(raum#".Sensor").DPByHssDP("HUMIDITY").Value();
und ersetzt es durch:

Code: Alles auswählen

!Werte aus Systemvariablen Typ Zahl einlesen
t = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("SYSTEMVARIABLENNAME_TEMPERATURE").Value(); 
rf = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("SYSTEMVARIABLENNAME_HUMIDITY").Value();


wobei du natürlich die Namen SYSTEMVARIABLENNAME_TEMPERATURE und SYSTEMVARIABLENNAME_HUMIDITY durch die Namen deiner schon angelegten und mit Werten gefüllten Variable ersetzt.

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.

User 17410

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von User 17410 » 24.09.2018, 15:24

Danke für dieses: viewtopic.php?f=31&t=9835&start=8#p73359 Script.

Ich habe es nun bei mir auch Programmiert. Ich wollte mich aber mal bei den Profis vergewissern, ob ich alles richtig gemacht habe.

Gerät für die Temp. und Luftfeuchtigkeit aussen: HmIP-STHO
Bildschirmfoto 2018-09-24 um 15.31.15.png
(Im Programm & Script habe ich Kanal :1 verwendet)


Gerät für die Temp. und Luftfeuchtigkeit innen: HmIP-STHD
Bildschirmfoto 2018-09-24 um 15.32.02.png
(Im Programm & Script habe ich Kanal :1 verwendet)


Die Systemvariablen:
Bildschirmfoto 2018-09-24 um 15.21.09.png

Das Programm:
Bildschirmfoto 2018-09-24 um 15.17.47.png

Das Script:

Code: Alles auswählen

    ! Garage Berechnung der Schimmelwarnung und Lüftungsempfehlung 
    object oTHi = dom.GetObject("Garagentemperatur:1");
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("Garage_Schimmel");
	object oLueften = dom.GetObject("Garage_Lueften");
    object oTHa = dom.GetObject("Aussentemperatur:1");
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa   = oTHi.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 = oHi.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
    if (afau < afin - 0.8) {oLueften.Variable(true);}
    else
    { if (afau >= afin - 0.3) {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 / 0.268) * (ta - ti)); ! Rges = 0.268 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);}
        }
Wie vielleicht schon anderen die mein Thema und die Frage dazu kennen, möchte ich damit meine Garage lüften. Das ganze soll mir hauptsächlich in den Kalten und feuchten Wintermonaten Empfehlung geben.

Danke!

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 » 24.09.2018, 18:57

Hallo User,

Dein Programm wird kaum ausgeführt werden, weil Du die ganzen Bedingungen mit UND verknüpft hast. So müssen sie zeitgleich eintreten, was eher unwahrscheinlich ist.

Eigentlich sollte eine einzige der Bedingungen reichen. Ebenso sollte es egal sein, wenn das Programm auch noch bei CCU Neustart ausgeführt wird.

Sonnige Grüße!
Robert

User 17410

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von User 17410 » 24.09.2018, 19:10

Aber hier steht auch alles auf UND:
viewtopic.php?f=43&t=9835&start=20#p82314

Die Systemvariable "CCU_im_reboot" habe ich aus dem Programm entfernt.

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 » 24.09.2018, 19:56

Ja, aber es macht wenig Sinn, denn die Luftfeuchte in der Werkstatt wird immer über 15% betragen und die Temperatur im Garten sollte wohl auch nie über 80C steigen (hoffentlich).

Es reicht eine Temperatur als Auslöser zu nehmen. Diese wird zyklisch aktualisiert und das löst dann Dein Programm regelmäßig aus. Um den Rest kümmert sich Dein Script.

Drei Bedingungen würden das Programm 3x sooft auslösen, das macht der CCU nur unnötig Arbeit.

Antworten

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