NEWS
[Skript] Absolute Feuchte berechnen
-
Die Werte (0,6 g/kg, usw.), sind die irgendwo "definiert", oder hat jemand die einfach mal festgelegt (paul53 / ruhr70 ?)? `
ich denke, dass paul die Temperturdifferenzen in seinen uraltskripten bereits hatte, es ergibt ja auch einen sinn mit der Hysterese.g/kg ist halt die (eine) offizielle Größe für den Feuchtegehalt nur nicht jedem Laien verständlich zu machen.
Aber da sind noch mehr Faktoren im Skript, die noch nicht eingearbeitet worden sind.
z.B. die Zieltemperatur:
im Header steht Zieltemperatur xy, wenn im Raum nicht anders definiert.
Dadurch dass ich die Räume einfach kopiert habe, stehtfür diese Variable natürlich auch in jedem Raum ein Wert.
Ich könnte mir denken, dass man oben ienen allgemeingültigen Wert, z.B. 21°C eingeben soll und NUR in den Räumen, die einen anderen Zielwrt haben (Schlafzimmer 19°C, Bad 24°C) muss dies beim Raum noch extra angegeben werden.
Sollte dann diese Zeile in allen anderen Räumen auskommentiert/gelöscht werden? Oder ein bestimmter Platzhalter eingegeben werden?
Dann baue ich das morgen Abend ein.
Ich habe auch mal ein ganz kurzes Testskript gemacht. Da trägt man oben die Temp. und die rel. Luftfeuchte ein und es berechnet dann die einzelnen Werte `
Das klingt ja schon fast nach einem Ansatz für einen Adapter mit komfortabler Einzelraumkonfiguration :mrgreen: :mrgreen: :mrgreen:
Das hast du nu davon!
Gruß
Rainer
-
Woran mache ich fest, das gelüftet werden sollte?
Lüften,
- wenn abs. Aussenfeuchte < abs. Innenfeuchte - Hysterese (Entfeuchten)
- UND Aussentemperatur < Innentemperatur - Hysterese (Kühlen)
- UND Innentemperatur >= Raumtemperaturminimum + Hysterese (Auskühlschutz)
Die Hysterese hatte ich auf 0,3 g/kg und 0,5 K festgelegt, damit ein Lüfter im Grenzbereich nicht zu häufig ein- und ausschaltet. Da meine Fühler gut übereinstimmen und ich das nur zur Lüftungsempfehlung (Fenster) verwende, habe ich bei mir die Hysterese auf
0,2 g/kg und 0,3 K verringert.
-
Eine Frage beschäftigt mich aber noch ….
Woran mache ich fest, das gelüftet werden sollte?
Irgendwie habe ich die Logik dahinter noch nicht verstanden ... kann mir jemand das mal in einfachen Worten versuchen zu erklären?
Dann baue ich das noch mit ein. `
Du musst zunächst für dich selbst definieren, warum du wie lüften willst.
Bei mir habe ich das System mit automatischen Fensteröffnern im Keller zur Entfeuchtung implementiert. Die Temperaturen sind mir dabei ziemlich egal, die Fenster sollen auch nicht immer offen sein wenn wenn absolute Feuchte draußen geringer als im Keller.
Für mich habe ich definiert: Wenn im Keller die relative Feuchte über 70 % steigt, soll er lüften, und damit aufhören, wenn es unter 55 % fällt (damit es nicht permanent offen ist im WInter). Die absolute Feuchte nehme ich dann nur zur Berechnung, die zu haltende Mindesttemperatur orientiert sich am Taupunkt im Keller und eine maximale gibt es nicht, da es nie über 20 °C wird im Keller.
Für Wohnräume sieht das vielleicht anders aus, da ist die Bandbreite bei 40 bis 60 % (zB).
Meine Öffnungsdifferenz für den Keller beträgt 0,9 g/kg und die zum Schließen 0,3 g/kg. Mit 0,4/0,3 oder ähnliche Werte hatte ich das Problem, dass die Fenster im 10 Minutentakt auf und zu gegangen sind, deshalb habe ich die Öffnungsdifferenz erhöht, es muss also (absolut) deutlich trockener draußen sein um drin zu lüften.
Es kommt natürlich auch daraus an wo die Sensoren stehen. Wenn die im Keller zwischen den Fenstern (also im Zug) stehen dann reagiert der schneller, steht der an einer Wand ohne Zug reagiert er deutlich langsamer, weil die Luft dort nicht so schnell ausgetauscht wird. Das muss mit rein in die Überlegungen und der Anpassung der Hysterese.
Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein. DIe Temperatur berücksichtige ich gar nicht, außer es ist im Keller nahe der Taupunktgrenze oder es werden über 25 °C im Keller, dann deaktiviert sich die Öffnung und es schließt..
Nachts ist es immer deutlich trockener (wenn es also kühler ist draußen). Im Winter kann man eigentlich immer den ganzen Tag lüften, es ist immer trockener draußen. Im Sommer gibt es tagsüber Probleme, das geht soweit, dass man tagelang bei schwülem Wetter die Kellerfeuchte nicht unter 80 % bekommt nur durch das Lüften. Ich baue mir deshalb noch eine Zeitprüfung ein, um wenn es morgens um 8 drin trockener als draußen ist, sollen die Fenster zugehen, damit nicht mit der Außenfeuchte die Innenfeuchte mit steigt (man sich also die feuchte Luft von außen reinholt). Geht ganz leicht, einfach mit on bei einer bestimmten Uhrzeit die Fenster schließen, wenn es drin trockener als draußen ist. Sobald die Macimalfeuchte im Keller danach erreicht wird, öffnet er wieder nach der Automatik.
Wenn man nur die Fenster ab und zu manuell aufmachen möchte im Wohnraum, brauch man so etwas natürlich nicht. Bei elektrischen Lüftern oder automatischen Fenstern muss man aber etwas probieren und Erfahrnungswerte sammeln.
Ich habe ja wegen dem Lüften mit iobroker angefangen und muss sagen, was besseres konnte mir nicht passieren, als iobroker zu entdecken. Tolle Software! Führt leider dazu, dass man den Rest des Hauses gleich mit anbindet :lol:
-
super Beschreibung Solear.
Und mit der Erklärung vom Paul habe ich ein Gefühl, wo der Fehler in meinem Skript liegt. Schaue ich mir nachher mal an.
Bei der Definition der Räume habe ich eine "Zieltemperatur" definiert. Es müsste aber die Raumminimumtemperatur sein (Auskühlschutz). Kein Wunder, das es keine Lüftungsempfehlung gibt, wenn es draußen nur etwas kühler ist.
Gesendet von iPhone mit Tapatalk
-
Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein.
Nein, die Kellerfeuchte steigt trotz Lüften, wenn der Feuchteeintrag aus den Wänden stärker ist als die Entfeuchtung durch die trocknere Aussenluft. Lüftet man dann nicht, steigt die Kellerfeuchte noch schneller.
DIe Temperatur berücksichtige ich gar nicht, außer es ist im Keller nahe der Taupunktgrenze oder es werden über 25 °C im Keller, dann deaktiviert sich die Öffnung und es schließt.
Bei einer Kellerlüftung sollte man die Temperaturdifferenz Innen - Aussen tatsächlich nicht berücksichtigen, denn den Keller will man nicht durch Aussenluft kühlen, sondern nur entfeuchten. Mindestraumtemperatur (Winter) und Maximaltemperatur (Sommer) sollten berücksichtigt werden.
Keller lüften,
- wenn abs. Aussenfeuchte < abs. Kellerfeuchte - Hysterese (Entfeuchten)
- UND Innentemperatur <= Kellertemperaturmaximum
- UND Innentemperatur >= Kellertemperaturminimum + Hysterese (Auskühlschutz)
-
Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein.
Nein, die Kellerfeuchte steigt ****trotz**** Lüften, wenn der Feuchteeintrag aus den Wänden stärker ist als die Entfeuchtung durch die trocknere Aussenluft. Lüftet man dann nicht, steigt die Kellerfeuchte noch schneller.
Vielleicht habe ich mich falsch ausgedrückt,
bei mir steigt ohne Lüften die Kellerfeuchte um 1-2 % je Stunde bis auf 80-90 %.
Dadurch kann es sein, wenn die absolute Feuchte in den Morgenstunden draußen schneller steigt als drin die umgerechnet relative Feuchtigkeit, dass ich mir in den 3 Morgenstunden von draußen mehr Feuchte reinhole (aber alles noch unterhalb des Schwellwertes von 60 % im Keller) als die Kellerfeuchte ohne Lüften ansteigen würde. Deshalb kann es sich lohnen, früh die Fenster zu schließen. Dann steigt die Kellerfeuchte langsamer an von einem tieferen Wert aus.
-
…dass ich mir in den 3 Morgenstunden von draußen mehr Feuchte reinhole (aber alles noch unterhalb des Schwellwertes von 60 % im Keller) als die Kellerfeuchte ohne Lüften ansteigen würde. Deshalb kann es sich lohnen, früh die Fenster zu schließen. Dann steigt die Kellerfeuchte langsamer an von einem tieferen Wert aus.
Nein, dass kann nicht sein, wenn die Bedingung für das Lüften ist: Absolute Aussenfeuchte < absolute Innenfeuchte.
Lass Dich nicht dadurch täuschen, dass die abs. Aussenfeuchte schneller steigt als die abs. Kellerfeuchte. Solange die Bedingung (s.o.) gilt, wird durch Lüftung entfeuchtet.
-
Mh, stimmt [emoji3] Na zum Glück habe ich den Timer für 8 Uhr noch nicht eingebaut [emoji41]
Gesendet von iPhone mit Tapatalk
-
Das http://forum.iobroker.de/viewtopic.php?f=8&t=2666&p=23676&sid=2fa3b0af7f17bde5f1a4e7949ecb5792&sid=b8069d562410810f54c78eb16b004eee#p23676 habe ich um eine Kellerlüftung (als Kommentar) ergänzt.
-
Hallo zusammen,
dann hier die letzte Version (Script und Widget).
Rückmeldungen sind absolut erbeten !!!
Gruß,
Eric `
Hat das seine Richtigkeit, dass die Belüftungsempfehlung false ist für das Bad? Kann ich bei dem abs. Feuchteunterschied gar nicht verstehen.Und noch eine Anfängerfrage: diese Script Codes… schreibe ich das in das Feld CSS vom Script? Und dann muss es bestimmt das Script sein, dass gleich am Anfang vom Code steht, richtig? `
Hast Du das Skript noch so aktiv?
Wenn ja, kannst Du bitte den Zweig CONTROL mit aufklappen und die Werte dort posten (Temp_Zielwert und Aussensensor).
Ich habe die Formel im Skript überprüft und die Formel sieht eigentlich gut aus. Händisch geprüft, sollte im Ergebnis in der Tat "true" und nicht "false" rauskommen. Ich möchte nur sichergehen, was als Zieltemperatur und was als Außensensor eingetragen ist. Dann kann man noch die Luftqualität mit einbeziehen und und und
Ansonsten kann man das Thema beliebig kompliziert machen. Entgegen der Formel würde ich z.B. im Arbeitszimmer auch lüften, damit kühlere Luft von Außen reinkommt, wenn wiederum die Luft nicht schon zu trocken wäre (relative Luftfeuchtigkeit).
Als Vergleich die Lüftungsempfehlung bei mir aktuell:
filename="lüften.jpg" index="0">~~
-
Entgegen der Formel würde ich z.B. im Arbeitszimmer auch lüften, damit kühlere Luft von Außen reinkommt, wenn wiederum die Luft nicht schon zu trocken wäre (relative Luftfeuchtigkeit).
Ja, im Arbeitszimmer würde ich auch Lüften. Die relative Luftfeuchte steigt durch das Lüften, da die Temperatur im Raum sinkt.
EDIT: Bei einem Raumfeuchtegehalt von 7 g/kg ist keine Entfeuchtung nötig, aber Kühlung bei über 27 °C.
-
Hi,
so nicht mehr, habe es aber noch da.
Werde es nachher mal aktivieren und einen Screenshot posten.
Bin noch nicht zu Hause und komme daher nicht dran.
Gruß,
Eric
-
argh…
ein Fehler ist drin...
xi und xa werden nicht mit der absoluten Feuchtigkeit gefüttert, sondern mit der relativen Luftfeuchtigkeit.
Ich werde mir hinterher eh das Script vom eric krallen, möchte jetzt nur wissen, was falsch lief;-)
-
Hi,
Hast Du das Skript noch so aktiv?
Wenn ja, kannst Du bitte den Zweig CONTROL mit aufklappen und die Werte dort posten (Temp_Zielwert und Aussensensor). `
so, hier die Screenshots - habe das Script aus meinem Posting nochmal gestartet.Gruß,
Eric
-
Hi Eric,
danke! Aber ich meinte eigentlich Lobomau ;-), da das da so offensichtlich falsch war:
http://forum.iobroker.net/viewtopic.php … 100#p27581
Hab aber in der Tat einen Fehler gefunden, siehe etwas weiter oben. In xi und xa wurde mit der relativen Luftfeuchtigkeit für den Vergleich gerechnet und nicht mit der absoluten.
Hier ist die korrigierte calc() Funktion (zeigt bei mir gerade in allen Räumen an, dass ich lüften soll:
! ````
function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
var cobStr = (boolean) ? 'true' : 'false';
return cobStr;
}
! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
! t = makeNumber(t);
rh = makeNumber(rh);
! var toffset = 0.0; // Offset in °C
var rhoffset = 0; // Offset in %
if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
}
if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
}
! t = t + toffset;
rh = rh + rhoffset;
! var y = xdp.Calc(t, rh);
var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
setState(idt , t); // Sensor Temperatur inkl. Offset
setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
setState(ih , runden(h,2)); // Enthalpie
! // Lüftungsempfehlung berechnen
// -------------------------------------------------------------------------
if(typeof raeume[raum].Aussensensor !=="undefined") {
var aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
var idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
//var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
} else {
return;
}
! var ti = t; // Raumtemperatur in °C
//var xi = rh; // Raumfeuchtegehalt in g/kg
var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
var ta = getState(idta).val; // Aussentemperatur in °C
var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
if (xa == 0) return;
! var mi = defaultTemp; // Temperaturmittelwert auf Default
! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
if(typeof raeume[raum].TEMP_Zielwert == "number") {
mi = raeume[raum].TEMP_Zielwert;
}
var mih = mi + 0.25; // Temperaturmittelwert hoch
var mit = mi - 0.25; // Temperaturmittelwert tief
! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
// (bedingung ? then-ausdruck : else-ausdruck)
var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)var b1ln = (xa >= (xi - 0.1)) ? true : false; // Bedingnung 1 lüften negativ (Außenluft ist zu feucht) var b2ln = (ta >= (ti - 0.1)) ? true : false; // Bedingnung 2 lüften negativ (Außentemperatur zu warm) var b3ln = (ti <= mit) ? true : false; // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur) if (b1lp && b2lp && b3lp) { setState(idLueften, true); if (debug) log(raum + ': **Lüftungsempfehlung**');
! } else if (b1ln || b2ln || b3ln) {
setState(idLueften, false);
if (debug) log(raum + ': Empfehlung Fenster zu');
}
else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
! // lüften (und - Alle Bedingungen müssen erfüllt sein):
// #1 - Außenluft ist mind. 0,4 trockener als Innen
// #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
// #3 - Innentemperatur ist höher als die Zieltemperatur
! // nicht lüften (oder):
// #1 - Außenluft ist zu feucht
// #2 - Außentemperatur zu warm
// #3 - Innentemperatur niedriger als Zieltemperatur
! if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp);
! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
if (debug) log("" + raum + " --------------------------------------------");
}
! ````Die Variable debug wird am Anfang noch benötigt, da ich ein Logging eingebaut habe.
var debug = true;
-
Hi Eric,
danke! Aber ich meinte eigentlich Lobomau ;-), da das da so offensichtlich falsch war: `
Ja, hatte ich noch aktiv. Grad reingeschaut in Control. Steht immer 0%, 0°C, 21°C. Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus… -
Warum benennt ihr eigentlich die Variablen nie vernünftig? Also etwas länger? [emoji3]
Gesendet von iPhone mit Tapatalk
-
Warum benennt ihr eigentlich die Variablen nie vernünftig?
Die üblichen physikalischen Formel-Kurzzeichen sind vernünftig.
-
…Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus... `
Ist mir leider nicht geglückt die calc () function richtig einzutragen -
…Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus...
Ist mir leider nicht geglückt die calc () function richtig einzutragen :(
Wenn Du magst, kannst Du es mit dem ganzen Skript noch einmal testen.
Einfach ein anderen Pfad eintragen und nach dem Test Pfad und Skript löschen.
! ````
// Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
// gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
// -----------------------------------------------------------------------------
// benötigt in der Javascript das Modul "dewpoint"
// (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
// -----------------------------------------------------------------------------
//
// Formeln zur Berechnung der Luftfeuchtigkeit:
// http://www.nabu-eibelshausen.de/Rechner/feuchte_luft_enthalpie.html
//
// Kalibrierung der Offsetwerte in einer für den Vergleich relevanten Umgebung
// z.B. 22°C, 65% Luftfeuchte (nicht im Winter).
//
! // TODO:
//
// - Zählen: Anzahl Lüftungsempfehlungen, Ausgabe in Datenpunkt
//
// - Verzicht auf das node module ""dewpoint"
//
// - Sonstige Werte:
// - Ausgabe Dampfgewicht, Luftgewicht und Gesamtgewicht
//
// - Einstellungen Hysterese
//
// - differenziertere Lüftungsempfehlung
//
// - on() mit REGExp
//
// - Luftdruck alternativ vom Messgerät und nicht über Skript
//
// - keine Lüftungsempfehlung, bei relativer Luftfeuchtigkeit unter 40%. (macht das Sinn?)
! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
! // -----------------------------------------------------------------------------
// Einstellungen Skriptverhalten
// -----------------------------------------------------------------------------
! // Wichtig: // betrifft den CONTROL Zweig bei den Raumdatepunkten
var skriptConf = true; // true: Raumwerte werden über das Skript geändert
// false: Raumwerte werden über Objekte (oder VIS) geändert
! // eigene Parameter:
var hunn = 39.87; // eigene Höhe über nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
var defaultTemp = 19.00; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
//var tempDeltaMin = 4.0; // Temperaturunterschied Auskühlschutz
//var tempDeltaMax = 4.0; // Temperaturunterschied maximales aufheizen
! var debug = true;
! // Pfade für die Datenpunkte:
var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
! var raumPfad = "Raum" +"."; // Pfad unterhalb des Haptpfads für die Räume
var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums für Kontrollparameter
! var infoPfad = "Skriptinfos" +"."; // Pfad für globale Skriptparameter zur Info
! // -----------------------------------------------------------------------------
// Räume mit Sensoren, Parametrisierung
// -----------------------------------------------------------------------------
var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
// Sensoren Aussen
"Balkon" : {
"Sensor_TEMP" : "hm-rpc.0.FEQ0039183.1.TEMPERATURE" /Balkon gr. Klima:1.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.FEQ0039183.1.HUMIDITY" /Balkon gr. Klima:1.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0
},
"weatherunderground" : {
"Sensor_TEMP" : "weatherunderground.0.current.temp_c"/Temperature/,
"Sensor_HUM" : "weatherunderground.0.current.relative_humidity"/Relative humidity/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0
},
// Sensoren Innen
"Bad" : {
"Sensor_TEMP" : "hm-rpc.0.KEQ0175977.1.TEMPERATURE" /Bad Lana.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.KEQ0175977.1.HUMIDITY" /Bad Lana.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp, // oder Zieltemperatur in Form von: 20.00 angeben
"Aussensensor" : "Balkon"
},
"Arbeitszimmer" : {
"Sensor_TEMP" : "hm-rpc.0.LEQ1072823.1.TEMPERATURE" /Arbeitszimmer Thermostat.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.LEQ1072823.1.HUMIDITY" /Arbeitszimmer Thermostat.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp,
"Aussensensor" : "Balkon"
},
"Arbeitszimmer-2" : {
"Sensor_TEMP" : "javascript.1.WIFFI.Arbeitszimmer.wz_temp"/Temperatur/,
"Sensor_HUM" : "javascript.1.WIFFI.Arbeitszimmer.wz_feuchte"/Luftfeuchte/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp,
"Aussensensor" : "Balkon"
},
"Katharina" : {
"Sensor_TEMP" : "hm-rpc.0.KEQ0175649.1.TEMPERATURE" /Katharina Klima.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.KEQ0175649.1.HUMIDITY" /Katharina Klima.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp,
"Aussensensor" : "Balkon"
},
"Schlafzimmer" : {
"Sensor_TEMP" : "hm-rpc.0.GEQ0071478.1.TEMPERATURE"/Schlafzimmer Klima:1.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.GEQ0071478.1.HUMIDITY"/Schlafzimmer Klima:1.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : 18.00,
"Aussensensor" : "Balkon"
},
"Wohnzimmer" : {
"Sensor_TEMP" : "hm-rpc.0.KEQ0850896.1.TEMPERATURE"/Wohnzimmer Klima.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.KEQ0850896.1.HUMIDITY"/Wohnzimmer Klima.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : 20.00,
"Aussensensor" : "Balkon"
},
"Flur" : {
"Sensor_TEMP" : "hm-rpc.0.KEQ0175954.1.TEMPERATURE"/Flur:1.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.KEQ0175954.1.HUMIDITY"/Flur:1.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp,
"Aussensensor" : "Balkon"
},
"Gästebad" : {
"Sensor_TEMP" : "hm-rpc.0.GEQ0071605.1.TEMPERATURE"/Gästebad Klima:1.TEMPERATURE/,
"Sensor_HUM" : "hm-rpc.0.GEQ0071605.1.HUMIDITY"/Gästebad Klima:1.HUMIDITY/,
"Sensor_TEMP_OFFSET" : 0.0,
"Sensor_HUM_OFFSET" : 0,
"TEMP_Zielwert" : defaultTemp,
"Aussensensor" : "Balkon"
}
};
! // =============================================================================
// Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
// =============================================================================
! var idSkriptinfoBar = pfad + infoPfad + "Luftdruck";
var idSkriptinfoHunn = pfad + infoPfad + "Höhe_über_NN";
! // forceCreation = true, damit bei geändert eigener Höhe im Konfigurationsbereich der Datenpunkt neu geschrieben wird
createState(idSkriptinfoBar, luftdruck(hunn), true, {
name: 'mittlerer Luftdruck in bar',
desc: 'mittlerer Luftdruck in bar, errechnet anhand der eigenen Höhe über NN',
type: 'number',
unit: 'bar',
role: 'info'
});
! createState(idSkriptinfoHunn, hunn, true, {
name: 'Eigene Höhe über NN',
desc: 'Eigene Höhe über NN (Normal Null), als Basis für den mittleren Luftdruck',
type: 'number',
unit: 'm',
role: 'info'
});
! var raumDatenpunkte = {
"x" : {
"DpName" : "Feuchtegehalt_Absolut",
"init": 0,
"dp": {
"name": 'absoluter Feuchtegehalt',
"desc": 'absoluter Feuchtegehalt, errechnet',
"type": 'number',
"role": 'value',
"unit": 'g/kg'
}
},
"rh" : {
"DpName" : "relative_Luftfeuchtigkeit",
"init": 0,
"dp": {
"name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
"desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
"type": 'number',
"role": 'value',
"unit": '%'
}
},
"dp" : {
"DpName" : "Taupunkt",
"init": 0,
"dp": {
"name": 'Taupunkt',
"desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
"type": 'number',
"role": 'value',
"unit": '°C'
}
},
"t" : {
"DpName" : "Temperatur",
"init": 0,
"dp": {
"name": 'gemessene Temperatur (inkl. Offset)',
"desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
"type": 'number',
"role": 'value',
"unit": '°C'
}
},
"h" : {
"DpName" : "Enthalpie",
"init": 0,
"dp": {
"name": 'Enthalpie',
"desc": 'Enthalpie',
"type": 'number',
"role": 'value',
"unit": 'kJ/kg'
}
},
"lüften" : {
"DpName" : "Lüftungsempfehlung",
//"init": false,
"dp": {
"name": 'Lüftungsempfehlung',
"desc": 'Lüftungsempfehlung',
"type": 'boolean',
"role": 'value'
}
}
};
! var raumControl = {
"Sensor_TEMP_OFFSET" : {
"DpName" : "Sensor_TEMP_OFFSET",
"init": 0,
"dp": {
"name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
"desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
"type": 'number',
"role": 'control.value',
"unit": '°C'
}
},
"Sensor_HUM_OFFSET" : {
"DpName" : "Sensor_HUM_OFFSET",
"init": 0,
"dp": {
"name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
"desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
"type": 'number',
"role": 'control.value',
"unit": '%'
}
},
"TEMP_Zielwert" : {
"DpName" : "TEMP_Zielwert",
"init": 0,
"dp": {
"name": 'Temperatursteuerwert zum lüften',
"desc": 'Temperatursteuerwert zum lüften',
"type": 'number',
"role": 'control.value',
"unit": '°C'
}
},
"Aussensensor" : {
"DpName" : "Aussensensor",
"init": "",
"dp": {
"name": 'Aussensensor, der zum Vergleich genommen wird',
"desc": 'Aussensensor, der zum Vergleich genommen wird',
"type": 'string',
"role": 'control.value'
}
}
};
! var xdp = new DP(hunn);
! var pbar = luftdruck(hunn); // individueller Luftdruck in bar (eigene Höhe)
! //------------------------------------------------------------------------------
// Funktionen
//------------------------------------------------------------------------------
! function createDp() {
var name;
var init;
var forceCreation;
var common;
for (var raum in raeume) {
for (var datenpunktID in raumDatenpunkte) {
name = pfad + raumPfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
init = raumDatenpunkte[datenpunktID].init;
forceCreation = false; // Init der Datenpunkte wird nur beim ersten Star angelegt. Danach bleiben die Wert auch nach Skritpstart enthalten.
common = raumDatenpunkte[datenpunktID].dp;
createState(name, init , forceCreation, common);
log("neuer Datenpunkt: " + name,"debug");
}
for (var control in raumControl) {
name = pfad + raumPfad + raum + "." + controlPfad + raumControl[control].DpName;
//init = raumControl[control].init;
forceCreation = skriptConf;
common = raumControl[control].dp;
if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
init = raeume[raum][raumControl[control].DpName];
createState(name, init , forceCreation, common);
}
}
}
}
! function runden(wert,stellen) {
return Math.round(wert * 10 * stellen) / (10 * stellen);
}
! function luftdruck(hunn) {
var pnn = 1013.25; // Mittlerer Luftdruck in hPa bei NN
var p = pnn - (hunn / 8.0); // individueller Luftdruck in hPa (eigenen Höhe)
return p / 1000; // Luftdruck von hPa in bar umrechnen
}
! function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
var cobStr = (boolean) ? 'true' : 'false';
return cobStr;
}
! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
! t = makeNumber(t);
rh = makeNumber(rh);
! var toffset = 0.0; // Offset in °C
var rhoffset = 0; // Offset in %
if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
}
if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
}
! t = t + toffset;
rh = rh + rhoffset;
! var y = xdp.Calc(t, rh);
var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
setState(idt , t); // Sensor Temperatur inkl. Offset
setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
setState(ih , runden(h,2)); // Enthalpie
! // Lüftungsempfehlung berechnen
// -------------------------------------------------------------------------
var aussen;
var idta, idxa;
if(typeof raeume[raum].Aussensensor !=="undefined") {
aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
//var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
} else {
return;
}
! var ti = t; // Raumtemperatur in °C
//var xi = rh; // Raumfeuchtegehalt in g/kg
var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
var ta = getState(idta).val; // Aussentemperatur in °C
var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
if (xa == 0) return;
! var mi = defaultTemp; // Temperaturmittelwert auf Default
! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
if(typeof raeume[raum].TEMP_Zielwert == "number") {
mi = raeume[raum].TEMP_Zielwert;
}
var mih = mi + 0.25; // Temperaturmittelwert hoch
var mit = mi - 0.25; // Temperaturmittelwert tief
! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
// (bedingung ? then-ausdruck : else-ausdruck)
var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)var b1ln = (xa >= (xi - 0.1)) ? true : false; // Bedingnung 1 lüften negativ (Außenluft ist zu feucht) var b2ln = (ta >= (ti - 0.1)) ? true : false; // Bedingnung 2 lüften negativ (Außentemperatur zu warm) var b3ln = (ti <= mit) ? true : false; // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur) if (b1lp && b2lp && b3lp) { setState(idLueften, true); if (debug) log(raum + ': **Lüftungsempfehlung**');
! } else if (b1ln || b2ln || b3ln) {
setState(idLueften, false);
if (debug) log(raum + ': Empfehlung Fenster zu');
}
else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
! // lüften (und - Alle Bedingungen müssen erfüllt sein):
// #1 - Außenluft ist mind. 0,4 trockener als Innen
// #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
// #3 - Innentemperatur ist höher als die Zieltemperatur
! // nicht lüften (oder):
// #1 - Außenluft ist zu feucht
// #2 - Außentemperatur zu warm
// #3 - Innentemperatur niedriger als Zieltemperatur
! if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));
if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
if (debug) log(raum + ": Fenster zu (ein true reicht):");//if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp); if (debug) log(raum + ": Innentemperatur ist höher als die Zieltemperatur (b3lp): " + cob(b3lp)); if (debug) log(raum + ": Außentemperatur ist mindestens 0,6 Grad kühler als innen (b2lp): " + cob(b2lp)); if (debug) log(raum + ": Außenluft ist mind. 0,4° trockener als Innen (b1lp): " + cob(b1lp) + ": xa: " + xa + " <= (xi - 0.4) " + (xi - 0.4)); if (debug) log(raum + ": Lüftungsempfehlung (alle Bedingungen auf true):");
! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
if (debug) log("------ " + raum + " ------- Aussensensor: " + aussen + " -----------");
}
! function calcDelayed(raum, delay) {
setTimeout(function () {
calc(raum);
}, delay || 0);
}
! function calcAll() {
for (var raum in raeume) {
//calc(raum);
calcDelayed(raum,200);
}
}
! function makeNumber(wert) {
if(isNaN(wert)) {
wert = parseFloat(wert.match(/\d+[.|,]?\d+/g));
}
return wert;
}
! /*
on({id: idSensorTemperaturBad ,change:'ne'}, function (obj) {
calc();
});
! on({id: idSensorLuftfeuchteBad ,change:'ne'}, function (obj) {
calc();
});
/
! // alle zwei Minuten neu berechnen
schedule("/2 * * * *", function () {
calcAll();
});
! function main() {
calcAll();
//calcAll();
}
! createDp(); // Datenpunkte anlegen
setTimeout(main, 1500); // Zum Skriptstart ausführen
! ````