Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. Die Sache mir der Luftfeuchtigkeit, dem Taupunkt und der Schimmelgefahr

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    485

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

Die Sache mir der Luftfeuchtigkeit, dem Taupunkt und der Schimmelgefahr

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
25 Beiträge 16 Kommentatoren 11.2k Aufrufe 20 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • C Offline
    C Offline
    coffee-junk
    schrieb am zuletzt editiert von
    #1

    Seit einiger Zeit beschäftige ich mich mit dem Thema Luftfeuchtigkeit, vorrangig ging es bisher um die Entfeuchtung von Kellerräumen, welche mit einem Luftentfeuchter auf einem schadfreien Luftfeuchte-Level gehalten werden sollen.

    Am Anfang war die These, einen Luftentfeuchter reinzustellen, die Luftfeuchtigkeit auf 50% einzustellen, den kältesten Punkt im Raum zu ermitteln, den Taupunkt zu berechnen. Wenn der Taupunkt nicht erreicht wird, dann sollte alles gut werden.

    Fazit: Funktionierte im Sommer problemlos, bei bestimmten Aussentemperaturen über eine längere Zeit wurde es dennoch manchmal immer wieder "muffelig", obwohl der Taupunkt nie erreicht wurde.

    Den Stromverbrauch des Luftentfeuchters im Blick, wollte ich die Luftfeuchte nicht unbedingt duerhaft nach unten korrigieren, also dann erstmal hingesetzt und überlegt, wo das eigentliche Problem liegt.

    Nimmt man eine Luftfeuchtig von 55%rel und eine Raumtemperatur von 23.3Grad an, liegt der Taupunkt bei ca. 13.7 Grad, die absolute Luftfeuchte liegt dann bei 9.8g/KgLuft. Hat dann zum Beispiel die Kellerwand an der kältesten Stelle 20.0 Grad, könnte man nun der Meinung sein, dass die Luftfeuchte für den ganzen Raum schadfrei sein könnte, da man ja weit vom Taupunkt entfernt ist.

    Nun ist es aber so, dass der Taupunkt den Wert kennzeichnet, bei dem die Luftfeuchtigkeit 100%rel erreicht und dann Feuchtigkeit sichtbar an dem Objekt kondensiert, wenn diese Temperatur unterschritten wird.

    Nun weiss man aber auch, dass Schimmelbildung bei einer relativen Luftfeuchte von 70% mit Sicherheit einsetzt und dauerhaft die relative Luftfeuchte unter 70% liegen sollte, damit auch Schimmelbildung ausgeschlossen werden kann.

    Berechnet man nun die Luftfeuchte an der Kellerwand bei 20.0 Grad, kommt an dieser Stelle ein Wert von ca. 67%rel raus, das heisst, man befindet sich schon fast an der Grenze zur Schimmelbildung. Das heisst, dass die maximal schadfreie Raumluftfeuchte von allen 3 Faktoren abhängig ist.

    Also musste mehr Sensorik her um die Raumparameter zu erfassen. Ausgestattet mit einem Aktor der den Luftentfeuchter steuert, einem Raumthermostat der die Luftfeuchte und Raumtemperatur misst und zwei Temperatursensoren, die an den kältesten Stellen im Raum angebracht wurden, werden die entsprechenden Werte erfasst und einem Script zur weiteren Berechnung übergeben.

    Das eigentliche Scipt erzeugt ein "Luftfeuchte Objekt" in dem alle erforderlichen Daten erfasst und die dafür erforderlichen Funktionen enthalten sind.

    Für die Berechnung ist auch der Luftdruck in "bar" von Bedeutung, wird dieser nicht angegeben, wird als Luftfdruck 0m über Meeresspiegel angenommen.

    Übrigends: für die Taupunktberechnung spielt der Luftdruck keine Rolle, will man allerdings korrekte Werte für Dampfdruck oder die absFeuchte, sind die Ergebnisse umso genauer, wenn der tatsächliche oder auch der über die "einfache Höhenformel" errechnete Luftdruck benutzt wird. Am besten wäre natürlich der augenblicklich gemessene Luftdruck eines Barometers.

    Benötigt man lediglich Vergleichs-Werte z.B. für eine Lüftungsempfehlung, kann man mit dem Standard-Luftdruck bei 0m Meeresspiegel rechnen.

    Nun zum Script:

    Um im Script ein neues Luftfeuchteobjekt zu erstellen und die Berechnung zu starten (der Luftdruck ist optional):

    var keller = new Luftfeuchte(temperatur, luftfeuchte [,LuftdruckInBar]);
    keller.Calc;
    

    Danach können die einzelnen Werte ausgelesen werden, die wichtigsten sind:

    keller.tTau == Taupunkt GradCelsius

    keller.absFeuchte == Absolute Feuchte in KgWasser/KgLuft

    Die Funktion Calc gibt ein Flag zurück, die signalisiert ob die Berechnung erfolgreich (true) oder fehlerhaft (false) war.

    Um nun die maximale Luftfeuchtigkeit des Raumes zu berechnen, bei der auch an der kältesten Stelle des Raumes die maximale Luftfeuchtigkeit nicht überschritten wird, besitzt das Objekt eine Funktion, welche die maximal zulässige Raumluftfeuchte berechnet.

    Zur Berechnung (wird maxRelLuftfeuchte nicht angegeben wird 65%rel angenommen):

    var maxPhi = keller.CalcMaxPhi(raumtemperatur, tempDerKaltenStelle [, maxRelLuftfeuchteDesRaums]);
    

    Als Ergebnis erhält man die maximal zulässige Luftfeuchte, damit an der kältesten Stelle der geforderte Wert nicht überschritten wird.

    Beispielhaft hier ein Script, das ich seit einiger Zeit in Verwendung habe:

    ! // V0.02 Luftfeuchtigkeit im Büro Keller regeln ! // Namen für die einzelnen states const OBJ_TEMP_SENSOR1 = 'LuftfeuchteKeller.Bodensensor1'; const OBJ_TEMP_SENSOR2 = 'LuftfeuchteKeller.Bodensensor2'; const OBJ_MAXPHI = 'LuftfeuchteKeller.ObererGrenzwert'; const OBJ_MINPHI = 'LuftfeuchteKeller.UntererGrenzwert'; const OBJ_AKTPHI = "LuftfeuchteKeller.AktuelleLuftfeuchtigkeit"; const OBJ_AKTTEMP = "LuftfeuchteKeller.AktuelleTemperatur"; ! // Namen der Homematic Sensoren const ID_HM_LF_STATUS = 'LF-Buero-Status'; // Systemvariable der Homematic die Entfeuchter steuert const ID_HM_SENSOR_PHI = 'Wand-Buero-TempSensor.HUMIDITY'; // Sensor für Luftfeuchte const ID_HM_SENSOR_TEMP = 'Wand-Buero-Regler.ACTUAL_TEMPERATURE'; // Sensor für Raumtemperatur const ID_HM_TempSensor1 = 'BodenTempBuero-Sensor1.TEMPERATURE'; // Sensoren für Bodentemperatur const ID_HM_TempSensor2 = 'BodenTempBuero-Sensor2.TEMPERATURE'; ! const STATUS_TO_WETT = true; // Flag für Systemvariable der Homematic, wenn Raum zu feucht const STATUS_OK = false; // ... wenn Raumfeuchte OK const PHI_HYST = 4.0; // Schalthsysterese für Luftentfeuchtung in %relFeuchte ! var hmsLfStatus = getIdByName(ID_HM_LF_STATUS); var hmsSensorPhi = getIdByName(ID_HM_SENSOR_PHI); var hmsSensorTemp = getIdByName(ID_HM_SENSOR_TEMP); var hmsBodenTemp1 = getIdByName(ID_HM_TempSensor1); var hmsBodenTemp2 = getIdByName(ID_HM_TempSensor2); ! stateCreate(); // Benötigte States Erstellen setTimeout (mainStart, 1000); // Wait for states if new ! function mainStart() { check(); // Bei Scriptstart ausführen on ({id: hmsSensorPhi, change: "ne" }, check); // Wenn sich Luftfeuchtigkeit ändert on ({id: hmsSensorTemp, change: "ne" }, check); // Wenn sich Raumtemperatur ändert on ({id: hmsBodenTemp1, change: "ne" }, check); // Wenn sich Bodentemperatur 1 ändert on ({id: hmsBodenTemp2, change: "ne" }, check); // Wenn sich Bodentemperatur 2 ändert } ! // Prüfen der Klima Parameter function check() { var maxRoomPhi = 0; // Maximale zulässige Raum-Luftfeuchte berechnet nach dem kältesten Punkt im Raum var minRoomPhi = 0; // Unterer Wert der Luftfeuchte zur Steuerung var tempSens1 = 0; // Temperatur des Bodensensors 1 var tempSens2 = 0; // Temperatur des Bodensensors 2 var minTemp = 0; // Niedrigster Wert von beiden Sensoren ! t = new Luftfeuchte(getState(hmsSensorTemp).val, getState(hmsSensorPhi).val); setState(OBJ_AKTPHI,getState(hmsSensorPhi).val); // Speichern für Historie setState(OBJ_AKTTEMP, getState(hmsSensorTemp).val); t.Calc(); tempSens1 = getState(hmsBodenTemp1).val; // Bodentemperaturwerte holen tempSens2 = getState(hmsBodenTemp2).val; setState(OBJ_TEMP_SENSOR1, tempSens1); // Speichern für Historie setState(OBJ_TEMP_SENSOR2, tempSens2); if(tempSens1 < tempSens2) { // Kleinste Temperatur suchen minTemp = tempSens1; } else { minTemp = tempSens2; } // Maximal zulässige Raumluftfeuchte berechnen für kältesten Punkt maxRoomPhi = t.CalcMaxPhi(getState(hmsSensorTemp).val, minTemp, 69); if (isNaN(maxRoomPhi)) { log('Berechnung der maximalen Luftfeuchte fehlerhaft! Prüfen!', 'error'); return; } minRoomPhi = maxRoomPhi - PHI_HYST; setState(OBJ_MAXPHI, maxRoomPhi); // Speichern für Historie setState(OBJ_MINPHI, minRoomPhi); // Speichern für Historie ! if (t.relFeuchte >= maxRoomPhi) { // Luftfeuchte zu hoch, Entfeuchtung aktivieren setState(hmsLfStatus, STATUS_TO_WETT); log('Luftentfeuchtung Keller aktiviert'); return; } ! if(t.relFeuchte <= minRoomPhi) { // Luftfeuchte OK, Entfeuchtung deaktivieren setState(hmsLfStatus, STATUS_OK); log('Luftentfeuchtung Keller deaktiviert'); return; } // Hier kommen wir nur hin, wenn Luftfeuchte zwischen max und min liegt, also keine Reaktion nötig ist } ! // Prototype für Luftfeuchte // Quellenangabe: Dieses kleine und freie Programm stammt von der heute nicht mehr aktiven Seite // "http://ourworld.compuserve.com/homepages/MTEC/" von MTEC Technology Software. // Es arbeitet nach dem Standardwerk "Properties of Water and Steam in SI-Units", // bearbeitet von Ernst Schmidt, Springer-Verlag. // Angepasst fuer ioBroker von coffee-yunk function Luftfeuchte(temperatur , relFeuchte, luftdruck ) { const PMIN = 0.01; const PMAX = 20; const TMIN = -20; const TMAX = 100; const MAX_ALLOWED_PHI = 65; ! if (luftdruck === undefined) {luftdruck = 1.01325;} this.temperatur = parseFloat(temperatur); // t Temperatur in Grad Celsius this.relFeuchte = parseFloat(relFeuchte); // phi relative Luftfeuchte in % this.luftdruck = parseFloat(luftdruck); // p Luftdruck in bar this.sattDampf = NaN; // pS SattDampf in bar this.absFeuchte = NaN; // x Absolute Feuchte in in kg/kg this.enthalpie = NaN; // h EnthalpieLuft KJ/kg (Energiegehalt) this.pD = NaN; // pD Dampfdruck in Bar this.rhoD = NaN; // rhoD Dampf in Kg/m3 this.rhoL = NaN; // Luftdichte in KG/m3 this.rhoG = NaN; // Gesamtfeuchte in KG/m3 this.thoL = NaN; this.tTau = NaN; // Taupunkt in Grad Celsius ! /* Maximale zulässige Luftfeuchte des Raumes berechnen in Abhängikeit des kältesten Punktes im Raum Dabei die maximal zulässige Raumluftfeuchte (safePhi) beachten roomTemp = Raumtemperatur lowTemp = Temperatur der kältesten Stelle im Raum maxColdPhi= Maximale zulässige Luftfeuchte an der kältesten Stelle safePhi = (Optional) Höchste Luftfeuchte des Raumes auf die begrenzt wird (Keine Angabe dann 65 %rel) return NaN, fehlerhafte Daten max. %rel Luftfeuchte des Raumes, die nicht überschritten werden darf um am kältesten Punkt die maximale Luftfeuchte zu erzielen */ this.CalcMaxPhi = function (roomTemp, lowTemp, maxColdPhi, safePhi) { if(safePhi === undefined) {safePhi = MAX_ALLOWED_PHI;} if(safePhi > 100 || safePhi < 0) {return NaN;} if(roomTemp === undefined) {return NaN;} if(lowTemp === undefined) {return NaN;} ! // abs Luftfeuchte berechnen für t-Boden und maxColdPhi var n = new Luftfeuchte(lowTemp, maxColdPhi); n.Calc(); var absRaumfeuchte = n.absFeuchte; ! n.temperatur = roomTemp; ! for (r=safePhi; r>0; r--){ n.relFeuchte = r; n.Calc(); if (n.absFeuchte <= absRaumfeuchte) { return r; } } return 0; ! }; ! // Berechnet den Luftdruck nach der sogenannten "Höhenformel" in bar this.CalcHighToBar = function(h) { return (Math.round(1013.25 *Math.pow(1 - (0.0065 * h / 288.15), 5.255))) / 1000; }; ! // Object copy this.Copy = function(obj) { obj.temperatur = this.temperatur; obj.relFeuchte = this.relFeuchte; obj.luftdruck = this.luftdruck; obj.sattDampf = this.sattDampf; obj.absFeuchte = this.absFeuchte; obj.enthalpie = this.enthalpie; obj.pD = this.pD; obj.rhoD = this.rhoD; obj.rhoL = this.rhoL; obj.rhoG = this.rhoG; obj.thoL = this.thoL; obj.tTau = this.tTau; }; ! // Alle Werte berechnen this.Calc = function() { if (this.temperatur.length === 0 || this.luftdruck.length === 0) { return false;} this.temperatur = parseFloat(this.temperatur); this.luftdruck = parseFloat(this.luftdruck); this.relFeuchte = parseFloat(this.relFeuchte); ! if(this.temperatur < TMIN) { log('temperatur < ' + TMIN + ' °C', 'warn'); return false; } if(this.luftdruck < PMIN) { log('luftdruck < ' + PMIN + ' bar', 'warn'); return false; } if(this.temperatur > TMAX) { log('temperatur > ' + TMAX + ' °C','warn'); return false; } if(this.luftdruck > PMAX) { log('luftdruck > ' + PMAX + ' bar','warn'); return false; } this.sattDampf = this.SattdampfDruckWasser(this.temperatur); this.AbsFeuchte(); this.EnthalpieLuft(); this.DichteWDampf(); this.DichteLuft(); this.rhoG = this.rhoD + this.rhoL; this.Taupunkt(); return true; }; ! this.SattdampfDruckWasser = function (t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; ! if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return pS; } else { return 0; } }; ! // Energiegehalt der Luft berechnen in KJ/KG this.EnthalpieLuft = function EnthalpieLuft() { var t = this.temperatur; var x = this.absFeuchte; this.enthalpie = 1.006 * t + x * (1.86 * t + 2500); }; ! // Absolute Feuchte in kgWasser pro kgLuft this.AbsFeuchte = function AbsFeuchte() { var phi = this.relFeuchte; var p = this.luftdruck; var pS = this.sattDampf; var phi = phi / 100; this.absFeuchte = 0.622 * phi * pS / (p - phi * pS); }; ! // Dichte Wasserdampf Berechnungen this.DichteWDampf = function () { var phi = this.relFeuchte; var t = this.temperatur; var pS = this.sattDampf; this.rhoD = 1E5 * phi / 100 * pS / 461.1 / (273.15 + t); this.pD = phi / 100 * pS; }; ! this.DichteLuft = function () { var phi = this.relFeuchte; var t = this.temperatur; var p = this.luftdruck; var pS = this.sattDampf; this.rhoL = 1E5 * 1.001076176 * ((p - phi / 100 * pS) / 287.2 / (273.15 + t)); }; ! // Dampfsättigungstemperatur berechnen this.Sattdampftemperatur = function (pS) { var t = 100; var dt = 0.001; var t0; var t1; var f0; var f1; var fs; do { t0 = t - dt / 2; t1 = t + dt / 2; f0 = this.SattdampfDruckWasser(t0) - pS; f1 = this.SattdampfDruckWasser(t1) - pS; fS = (f1 - f0) / dt; t0 = t; t = t - f0 / fS; } while(Math.abs(t - t0) > dt); return(t); }; ! this.SattdampfDruckWasser = function(t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return(pS); } else { return(0); } }; ! // Taupunkt berechnen this.Taupunkt = function() { var tTau = 0; var x = this.absFeuchte; if(x > 0) {tTau = this.Sattdampftemperatur(x * this.luftdruck / (0.622 + x));} if(tTau === Infinity) { this.tTau = 0; return; } if(x > 0 && tTau > 0) { this.tTau = tTau; } else { this.tTau = 0; } }; ! } function Aufrunden(Wert, Stellen) { Stellen = parseInt(Stellen); var x = Math.pow(10, Stellen); var str = "" + Math.round(Wert * x) / x; return str; } ! // States generieren, falls noch nicht in der DB function stateCreate() { createState(OBJ_TEMP_SENSOR1, { name: 'Temperatur des Bodensensor 1', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_TEMP_SENSOR2, { name: 'Temperatur des Bodensensor 2', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_MAXPHI, { name: 'Maximal erlaubte berechnete Luftfeuchtigkeit', type: 'number', def: 0.0, unit: "%rel", role: "value" }); createState(OBJ_MINPHI, { name: 'Minimale Luftfeuchtigkeit für Luftentfeuchter', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTPHI, { name: 'Aktuelle Luftfeuchtigkeit im Raum', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTTEMP, { name: 'Aktuelle Temperatur im Raum', type: 'number', def: 0.0, unit: "Grad", role: "value" }); } !
    Um die Lufentfeuchtung zu steuern, wird eine Systemvariable in der Homematic gesetzt. Natürlich werden in der Homematic noch andere Parameter geprüft, da es ja keinen Sinn macht, den Luftentfeuchter rennen zu lassen, während zum Beispiel durch geöffnete Fenster weiterhin feuchte Luft in den Raum strömt.

    Wer es brauchen kann….. und wer Verbesserungsvorschläge hat.... (bin immer noch script-anfänger ;) )

    Jürgen

    PowerPanP K 2 Antworten Letzte Antwort
    2
    • eric2905E Online
      eric2905E Online
      eric2905
      schrieb am zuletzt editiert von
      #2

      Hi,

      schau Dir mal diesen Thread an ==> http://forum.iobroker.net/viewtopic.php?t=2645

      Da haben wir sowas mal umgesetzt.

      Für jeden Raum wird die absolute Feuchte, Taupunkt, usw. berechnet und auch eine Lüftungsempfehlung ausgesprochen.

      Ja, ist ein seeehhhrrr langer Thread, aber lesenswert [emoji6]

      Gruß,

      Eric

      Gesendet von iPad mit Tapatalk

      Roses are red, violets are blue,

      if I listen to metal, my neighbours do too

      1 Antwort Letzte Antwort
      1
      • HomoranH Nicht stören
        HomoranH Nicht stören
        Homoran
        Global Moderator Administrators
        schrieb am zuletzt editiert von
        #3

        @eric2905:

        , ist ein seeehhhrrr langer Thread `
        Und das Skript läuft seeehr gut

        144_screenshot_20170630-082329.jpg

        Gruß

        Rainer

        kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

        1 Antwort Letzte Antwort
        1
        • S Offline
          S Offline
          Solear
          schrieb am zuletzt editiert von
          #4

          Läuft wirklich gut, und entfeuchtet meinen Keller hervorragend und zuverlässig Dank paul53 seinem Code.

          Von coffee-junk das sieht auch hervorragend aus.

          iobroker als LXC unter Proxmox

          1 Antwort Letzte Antwort
          0
          • C Offline
            C Offline
            coffee-junk
            schrieb am zuletzt editiert von
            #5

            @eric2905:

            schau Dir mal diesen Thread an ==> http://forum.iobroker.net/viewtopic.php?t=2645

            Da haben wir sowas mal umgesetzt. `

            Ja, habe ich mir mal angeschaut, sieht gut aus! Da hab ich wohl teilweise das Rad neu erfunden :roll:

            Doch man sollte das mit der Schimmelgefahr nicht unterschätzen.

            http://www.tbas.de/Der-fRSi-Wert-zur-Be … inlic.html

            Mein Script ist eigentlich noch keine "fertige" Anwendung, es sollte lediglich die Funktionsweise des "Objekts Luftfeuchte" erklären. Mir war wichtig das ganze ohne zusätzliche Module rein in JS zu haben….

            Hier sieht man schön, wie sich Änderungen der Parameter auswirken:
            1573_klima.jpg

            Durch das Script habe ich den täglichen Strombedarf für den Luftentfeuchter von ca. 1000Wh/Tag auf 300Wh/Tag gedrückt, da ich jetzt nicht mehr fix auf eine bestimmte Luftfeuchte reguliere, wobei als oberster Grenzwert 65%rel im Raum erlaubt ist und an der kältesten Stelle 69%rel.

            Macht pro Monat im Augenblick ca. 9 KWh weniger Stromverbrauch…

            Jürgen

            1 Antwort Letzte Antwort
            0
            • paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #6

              Zur Schimmelgefahr und der Steuerung eines Entfeuchters wurden für die http://hausautomation.stern-av.de/homematic-raumklimaueberwachung-und-entfeuchtung/ Lösungen diskutiert und Skripte erstellt.

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Antwort Letzte Antwort
              0
              • C coffee-junk

                Seit einiger Zeit beschäftige ich mich mit dem Thema Luftfeuchtigkeit, vorrangig ging es bisher um die Entfeuchtung von Kellerräumen, welche mit einem Luftentfeuchter auf einem schadfreien Luftfeuchte-Level gehalten werden sollen.

                Am Anfang war die These, einen Luftentfeuchter reinzustellen, die Luftfeuchtigkeit auf 50% einzustellen, den kältesten Punkt im Raum zu ermitteln, den Taupunkt zu berechnen. Wenn der Taupunkt nicht erreicht wird, dann sollte alles gut werden.

                Fazit: Funktionierte im Sommer problemlos, bei bestimmten Aussentemperaturen über eine längere Zeit wurde es dennoch manchmal immer wieder "muffelig", obwohl der Taupunkt nie erreicht wurde.

                Den Stromverbrauch des Luftentfeuchters im Blick, wollte ich die Luftfeuchte nicht unbedingt duerhaft nach unten korrigieren, also dann erstmal hingesetzt und überlegt, wo das eigentliche Problem liegt.

                Nimmt man eine Luftfeuchtig von 55%rel und eine Raumtemperatur von 23.3Grad an, liegt der Taupunkt bei ca. 13.7 Grad, die absolute Luftfeuchte liegt dann bei 9.8g/KgLuft. Hat dann zum Beispiel die Kellerwand an der kältesten Stelle 20.0 Grad, könnte man nun der Meinung sein, dass die Luftfeuchte für den ganzen Raum schadfrei sein könnte, da man ja weit vom Taupunkt entfernt ist.

                Nun ist es aber so, dass der Taupunkt den Wert kennzeichnet, bei dem die Luftfeuchtigkeit 100%rel erreicht und dann Feuchtigkeit sichtbar an dem Objekt kondensiert, wenn diese Temperatur unterschritten wird.

                Nun weiss man aber auch, dass Schimmelbildung bei einer relativen Luftfeuchte von 70% mit Sicherheit einsetzt und dauerhaft die relative Luftfeuchte unter 70% liegen sollte, damit auch Schimmelbildung ausgeschlossen werden kann.

                Berechnet man nun die Luftfeuchte an der Kellerwand bei 20.0 Grad, kommt an dieser Stelle ein Wert von ca. 67%rel raus, das heisst, man befindet sich schon fast an der Grenze zur Schimmelbildung. Das heisst, dass die maximal schadfreie Raumluftfeuchte von allen 3 Faktoren abhängig ist.

                Also musste mehr Sensorik her um die Raumparameter zu erfassen. Ausgestattet mit einem Aktor der den Luftentfeuchter steuert, einem Raumthermostat der die Luftfeuchte und Raumtemperatur misst und zwei Temperatursensoren, die an den kältesten Stellen im Raum angebracht wurden, werden die entsprechenden Werte erfasst und einem Script zur weiteren Berechnung übergeben.

                Das eigentliche Scipt erzeugt ein "Luftfeuchte Objekt" in dem alle erforderlichen Daten erfasst und die dafür erforderlichen Funktionen enthalten sind.

                Für die Berechnung ist auch der Luftdruck in "bar" von Bedeutung, wird dieser nicht angegeben, wird als Luftfdruck 0m über Meeresspiegel angenommen.

                Übrigends: für die Taupunktberechnung spielt der Luftdruck keine Rolle, will man allerdings korrekte Werte für Dampfdruck oder die absFeuchte, sind die Ergebnisse umso genauer, wenn der tatsächliche oder auch der über die "einfache Höhenformel" errechnete Luftdruck benutzt wird. Am besten wäre natürlich der augenblicklich gemessene Luftdruck eines Barometers.

                Benötigt man lediglich Vergleichs-Werte z.B. für eine Lüftungsempfehlung, kann man mit dem Standard-Luftdruck bei 0m Meeresspiegel rechnen.

                Nun zum Script:

                Um im Script ein neues Luftfeuchteobjekt zu erstellen und die Berechnung zu starten (der Luftdruck ist optional):

                var keller = new Luftfeuchte(temperatur, luftfeuchte [,LuftdruckInBar]);
                keller.Calc;
                

                Danach können die einzelnen Werte ausgelesen werden, die wichtigsten sind:

                keller.tTau == Taupunkt GradCelsius

                keller.absFeuchte == Absolute Feuchte in KgWasser/KgLuft

                Die Funktion Calc gibt ein Flag zurück, die signalisiert ob die Berechnung erfolgreich (true) oder fehlerhaft (false) war.

                Um nun die maximale Luftfeuchtigkeit des Raumes zu berechnen, bei der auch an der kältesten Stelle des Raumes die maximale Luftfeuchtigkeit nicht überschritten wird, besitzt das Objekt eine Funktion, welche die maximal zulässige Raumluftfeuchte berechnet.

                Zur Berechnung (wird maxRelLuftfeuchte nicht angegeben wird 65%rel angenommen):

                var maxPhi = keller.CalcMaxPhi(raumtemperatur, tempDerKaltenStelle [, maxRelLuftfeuchteDesRaums]);
                

                Als Ergebnis erhält man die maximal zulässige Luftfeuchte, damit an der kältesten Stelle der geforderte Wert nicht überschritten wird.

                Beispielhaft hier ein Script, das ich seit einiger Zeit in Verwendung habe:

                ! // V0.02 Luftfeuchtigkeit im Büro Keller regeln ! // Namen für die einzelnen states const OBJ_TEMP_SENSOR1 = 'LuftfeuchteKeller.Bodensensor1'; const OBJ_TEMP_SENSOR2 = 'LuftfeuchteKeller.Bodensensor2'; const OBJ_MAXPHI = 'LuftfeuchteKeller.ObererGrenzwert'; const OBJ_MINPHI = 'LuftfeuchteKeller.UntererGrenzwert'; const OBJ_AKTPHI = "LuftfeuchteKeller.AktuelleLuftfeuchtigkeit"; const OBJ_AKTTEMP = "LuftfeuchteKeller.AktuelleTemperatur"; ! // Namen der Homematic Sensoren const ID_HM_LF_STATUS = 'LF-Buero-Status'; // Systemvariable der Homematic die Entfeuchter steuert const ID_HM_SENSOR_PHI = 'Wand-Buero-TempSensor.HUMIDITY'; // Sensor für Luftfeuchte const ID_HM_SENSOR_TEMP = 'Wand-Buero-Regler.ACTUAL_TEMPERATURE'; // Sensor für Raumtemperatur const ID_HM_TempSensor1 = 'BodenTempBuero-Sensor1.TEMPERATURE'; // Sensoren für Bodentemperatur const ID_HM_TempSensor2 = 'BodenTempBuero-Sensor2.TEMPERATURE'; ! const STATUS_TO_WETT = true; // Flag für Systemvariable der Homematic, wenn Raum zu feucht const STATUS_OK = false; // ... wenn Raumfeuchte OK const PHI_HYST = 4.0; // Schalthsysterese für Luftentfeuchtung in %relFeuchte ! var hmsLfStatus = getIdByName(ID_HM_LF_STATUS); var hmsSensorPhi = getIdByName(ID_HM_SENSOR_PHI); var hmsSensorTemp = getIdByName(ID_HM_SENSOR_TEMP); var hmsBodenTemp1 = getIdByName(ID_HM_TempSensor1); var hmsBodenTemp2 = getIdByName(ID_HM_TempSensor2); ! stateCreate(); // Benötigte States Erstellen setTimeout (mainStart, 1000); // Wait for states if new ! function mainStart() { check(); // Bei Scriptstart ausführen on ({id: hmsSensorPhi, change: "ne" }, check); // Wenn sich Luftfeuchtigkeit ändert on ({id: hmsSensorTemp, change: "ne" }, check); // Wenn sich Raumtemperatur ändert on ({id: hmsBodenTemp1, change: "ne" }, check); // Wenn sich Bodentemperatur 1 ändert on ({id: hmsBodenTemp2, change: "ne" }, check); // Wenn sich Bodentemperatur 2 ändert } ! // Prüfen der Klima Parameter function check() { var maxRoomPhi = 0; // Maximale zulässige Raum-Luftfeuchte berechnet nach dem kältesten Punkt im Raum var minRoomPhi = 0; // Unterer Wert der Luftfeuchte zur Steuerung var tempSens1 = 0; // Temperatur des Bodensensors 1 var tempSens2 = 0; // Temperatur des Bodensensors 2 var minTemp = 0; // Niedrigster Wert von beiden Sensoren ! t = new Luftfeuchte(getState(hmsSensorTemp).val, getState(hmsSensorPhi).val); setState(OBJ_AKTPHI,getState(hmsSensorPhi).val); // Speichern für Historie setState(OBJ_AKTTEMP, getState(hmsSensorTemp).val); t.Calc(); tempSens1 = getState(hmsBodenTemp1).val; // Bodentemperaturwerte holen tempSens2 = getState(hmsBodenTemp2).val; setState(OBJ_TEMP_SENSOR1, tempSens1); // Speichern für Historie setState(OBJ_TEMP_SENSOR2, tempSens2); if(tempSens1 < tempSens2) { // Kleinste Temperatur suchen minTemp = tempSens1; } else { minTemp = tempSens2; } // Maximal zulässige Raumluftfeuchte berechnen für kältesten Punkt maxRoomPhi = t.CalcMaxPhi(getState(hmsSensorTemp).val, minTemp, 69); if (isNaN(maxRoomPhi)) { log('Berechnung der maximalen Luftfeuchte fehlerhaft! Prüfen!', 'error'); return; } minRoomPhi = maxRoomPhi - PHI_HYST; setState(OBJ_MAXPHI, maxRoomPhi); // Speichern für Historie setState(OBJ_MINPHI, minRoomPhi); // Speichern für Historie ! if (t.relFeuchte >= maxRoomPhi) { // Luftfeuchte zu hoch, Entfeuchtung aktivieren setState(hmsLfStatus, STATUS_TO_WETT); log('Luftentfeuchtung Keller aktiviert'); return; } ! if(t.relFeuchte <= minRoomPhi) { // Luftfeuchte OK, Entfeuchtung deaktivieren setState(hmsLfStatus, STATUS_OK); log('Luftentfeuchtung Keller deaktiviert'); return; } // Hier kommen wir nur hin, wenn Luftfeuchte zwischen max und min liegt, also keine Reaktion nötig ist } ! // Prototype für Luftfeuchte // Quellenangabe: Dieses kleine und freie Programm stammt von der heute nicht mehr aktiven Seite // "http://ourworld.compuserve.com/homepages/MTEC/" von MTEC Technology Software. // Es arbeitet nach dem Standardwerk "Properties of Water and Steam in SI-Units", // bearbeitet von Ernst Schmidt, Springer-Verlag. // Angepasst fuer ioBroker von coffee-yunk function Luftfeuchte(temperatur , relFeuchte, luftdruck ) { const PMIN = 0.01; const PMAX = 20; const TMIN = -20; const TMAX = 100; const MAX_ALLOWED_PHI = 65; ! if (luftdruck === undefined) {luftdruck = 1.01325;} this.temperatur = parseFloat(temperatur); // t Temperatur in Grad Celsius this.relFeuchte = parseFloat(relFeuchte); // phi relative Luftfeuchte in % this.luftdruck = parseFloat(luftdruck); // p Luftdruck in bar this.sattDampf = NaN; // pS SattDampf in bar this.absFeuchte = NaN; // x Absolute Feuchte in in kg/kg this.enthalpie = NaN; // h EnthalpieLuft KJ/kg (Energiegehalt) this.pD = NaN; // pD Dampfdruck in Bar this.rhoD = NaN; // rhoD Dampf in Kg/m3 this.rhoL = NaN; // Luftdichte in KG/m3 this.rhoG = NaN; // Gesamtfeuchte in KG/m3 this.thoL = NaN; this.tTau = NaN; // Taupunkt in Grad Celsius ! /* Maximale zulässige Luftfeuchte des Raumes berechnen in Abhängikeit des kältesten Punktes im Raum Dabei die maximal zulässige Raumluftfeuchte (safePhi) beachten roomTemp = Raumtemperatur lowTemp = Temperatur der kältesten Stelle im Raum maxColdPhi= Maximale zulässige Luftfeuchte an der kältesten Stelle safePhi = (Optional) Höchste Luftfeuchte des Raumes auf die begrenzt wird (Keine Angabe dann 65 %rel) return NaN, fehlerhafte Daten max. %rel Luftfeuchte des Raumes, die nicht überschritten werden darf um am kältesten Punkt die maximale Luftfeuchte zu erzielen */ this.CalcMaxPhi = function (roomTemp, lowTemp, maxColdPhi, safePhi) { if(safePhi === undefined) {safePhi = MAX_ALLOWED_PHI;} if(safePhi > 100 || safePhi < 0) {return NaN;} if(roomTemp === undefined) {return NaN;} if(lowTemp === undefined) {return NaN;} ! // abs Luftfeuchte berechnen für t-Boden und maxColdPhi var n = new Luftfeuchte(lowTemp, maxColdPhi); n.Calc(); var absRaumfeuchte = n.absFeuchte; ! n.temperatur = roomTemp; ! for (r=safePhi; r>0; r--){ n.relFeuchte = r; n.Calc(); if (n.absFeuchte <= absRaumfeuchte) { return r; } } return 0; ! }; ! // Berechnet den Luftdruck nach der sogenannten "Höhenformel" in bar this.CalcHighToBar = function(h) { return (Math.round(1013.25 *Math.pow(1 - (0.0065 * h / 288.15), 5.255))) / 1000; }; ! // Object copy this.Copy = function(obj) { obj.temperatur = this.temperatur; obj.relFeuchte = this.relFeuchte; obj.luftdruck = this.luftdruck; obj.sattDampf = this.sattDampf; obj.absFeuchte = this.absFeuchte; obj.enthalpie = this.enthalpie; obj.pD = this.pD; obj.rhoD = this.rhoD; obj.rhoL = this.rhoL; obj.rhoG = this.rhoG; obj.thoL = this.thoL; obj.tTau = this.tTau; }; ! // Alle Werte berechnen this.Calc = function() { if (this.temperatur.length === 0 || this.luftdruck.length === 0) { return false;} this.temperatur = parseFloat(this.temperatur); this.luftdruck = parseFloat(this.luftdruck); this.relFeuchte = parseFloat(this.relFeuchte); ! if(this.temperatur < TMIN) { log('temperatur < ' + TMIN + ' °C', 'warn'); return false; } if(this.luftdruck < PMIN) { log('luftdruck < ' + PMIN + ' bar', 'warn'); return false; } if(this.temperatur > TMAX) { log('temperatur > ' + TMAX + ' °C','warn'); return false; } if(this.luftdruck > PMAX) { log('luftdruck > ' + PMAX + ' bar','warn'); return false; } this.sattDampf = this.SattdampfDruckWasser(this.temperatur); this.AbsFeuchte(); this.EnthalpieLuft(); this.DichteWDampf(); this.DichteLuft(); this.rhoG = this.rhoD + this.rhoL; this.Taupunkt(); return true; }; ! this.SattdampfDruckWasser = function (t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; ! if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return pS; } else { return 0; } }; ! // Energiegehalt der Luft berechnen in KJ/KG this.EnthalpieLuft = function EnthalpieLuft() { var t = this.temperatur; var x = this.absFeuchte; this.enthalpie = 1.006 * t + x * (1.86 * t + 2500); }; ! // Absolute Feuchte in kgWasser pro kgLuft this.AbsFeuchte = function AbsFeuchte() { var phi = this.relFeuchte; var p = this.luftdruck; var pS = this.sattDampf; var phi = phi / 100; this.absFeuchte = 0.622 * phi * pS / (p - phi * pS); }; ! // Dichte Wasserdampf Berechnungen this.DichteWDampf = function () { var phi = this.relFeuchte; var t = this.temperatur; var pS = this.sattDampf; this.rhoD = 1E5 * phi / 100 * pS / 461.1 / (273.15 + t); this.pD = phi / 100 * pS; }; ! this.DichteLuft = function () { var phi = this.relFeuchte; var t = this.temperatur; var p = this.luftdruck; var pS = this.sattDampf; this.rhoL = 1E5 * 1.001076176 * ((p - phi / 100 * pS) / 287.2 / (273.15 + t)); }; ! // Dampfsättigungstemperatur berechnen this.Sattdampftemperatur = function (pS) { var t = 100; var dt = 0.001; var t0; var t1; var f0; var f1; var fs; do { t0 = t - dt / 2; t1 = t + dt / 2; f0 = this.SattdampfDruckWasser(t0) - pS; f1 = this.SattdampfDruckWasser(t1) - pS; fS = (f1 - f0) / dt; t0 = t; t = t - f0 / fS; } while(Math.abs(t - t0) > dt); return(t); }; ! this.SattdampfDruckWasser = function(t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return(pS); } else { return(0); } }; ! // Taupunkt berechnen this.Taupunkt = function() { var tTau = 0; var x = this.absFeuchte; if(x > 0) {tTau = this.Sattdampftemperatur(x * this.luftdruck / (0.622 + x));} if(tTau === Infinity) { this.tTau = 0; return; } if(x > 0 && tTau > 0) { this.tTau = tTau; } else { this.tTau = 0; } }; ! } function Aufrunden(Wert, Stellen) { Stellen = parseInt(Stellen); var x = Math.pow(10, Stellen); var str = "" + Math.round(Wert * x) / x; return str; } ! // States generieren, falls noch nicht in der DB function stateCreate() { createState(OBJ_TEMP_SENSOR1, { name: 'Temperatur des Bodensensor 1', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_TEMP_SENSOR2, { name: 'Temperatur des Bodensensor 2', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_MAXPHI, { name: 'Maximal erlaubte berechnete Luftfeuchtigkeit', type: 'number', def: 0.0, unit: "%rel", role: "value" }); createState(OBJ_MINPHI, { name: 'Minimale Luftfeuchtigkeit für Luftentfeuchter', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTPHI, { name: 'Aktuelle Luftfeuchtigkeit im Raum', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTTEMP, { name: 'Aktuelle Temperatur im Raum', type: 'number', def: 0.0, unit: "Grad", role: "value" }); } !
                Um die Lufentfeuchtung zu steuern, wird eine Systemvariable in der Homematic gesetzt. Natürlich werden in der Homematic noch andere Parameter geprüft, da es ja keinen Sinn macht, den Luftentfeuchter rennen zu lassen, während zum Beispiel durch geöffnete Fenster weiterhin feuchte Luft in den Raum strömt.

                Wer es brauchen kann….. und wer Verbesserungsvorschläge hat.... (bin immer noch script-anfänger ;) )

                PowerPanP Offline
                PowerPanP Offline
                PowerPan
                schrieb am zuletzt editiert von
                #7

                @coffee-junk

                Hi ich würde davon gerne einen Adapter bauen und allen einfach bereitstellen ;)

                Was machen die ganzen ! Im Code ?

                Kannst du mir den Code anständig formatiert zukommen lassen ?

                BBTownB H D ChaotC 4 Antworten Letzte Antwort
                1
                • PowerPanP PowerPan

                  @coffee-junk

                  Hi ich würde davon gerne einen Adapter bauen und allen einfach bereitstellen ;)

                  Was machen die ganzen ! Im Code ?

                  Kannst du mir den Code anständig formatiert zukommen lassen ?

                  BBTownB Offline
                  BBTownB Offline
                  BBTown
                  schrieb am zuletzt editiert von
                  #8

                  @PowerPan Du weisst schon, dass Du auf 2,5 Jahre alten Thread antwortest?

                  ioBroker auf NUC (VM debian v13 (Trixie ), node v22.21.0 npm v10.9.4, js-controller v7.1.0 jsonl/jsonl / HomeMatic CCU-2 (Wired und Funk) / Philips HUE / echo.DOT / Broadlink RM pro / SONOS

                  PowerPanP 1 Antwort Letzte Antwort
                  0
                  • BBTownB BBTown

                    @PowerPan Du weisst schon, dass Du auf 2,5 Jahre alten Thread antwortest?

                    PowerPanP Offline
                    PowerPanP Offline
                    PowerPan
                    schrieb am zuletzt editiert von
                    #9

                    @BBTown
                    Ja .... und?

                    1 Antwort Letzte Antwort
                    1
                    • PowerPanP PowerPan

                      @coffee-junk

                      Hi ich würde davon gerne einen Adapter bauen und allen einfach bereitstellen ;)

                      Was machen die ganzen ! Im Code ?

                      Kannst du mir den Code anständig formatiert zukommen lassen ?

                      H Offline
                      H Offline
                      Hamudulu
                      schrieb am zuletzt editiert von
                      #10

                      @PowerPan Da wär ich sehr interessiert dran...

                      1 Antwort Letzte Antwort
                      0
                      • B Offline
                        B Offline
                        BoBeRzE
                        schrieb am zuletzt editiert von
                        #11

                        @PowerPan Einen Adapter würde ich auch klasse finden (y)

                        1 Antwort Letzte Antwort
                        0
                        • C coffee-junk

                          Seit einiger Zeit beschäftige ich mich mit dem Thema Luftfeuchtigkeit, vorrangig ging es bisher um die Entfeuchtung von Kellerräumen, welche mit einem Luftentfeuchter auf einem schadfreien Luftfeuchte-Level gehalten werden sollen.

                          Am Anfang war die These, einen Luftentfeuchter reinzustellen, die Luftfeuchtigkeit auf 50% einzustellen, den kältesten Punkt im Raum zu ermitteln, den Taupunkt zu berechnen. Wenn der Taupunkt nicht erreicht wird, dann sollte alles gut werden.

                          Fazit: Funktionierte im Sommer problemlos, bei bestimmten Aussentemperaturen über eine längere Zeit wurde es dennoch manchmal immer wieder "muffelig", obwohl der Taupunkt nie erreicht wurde.

                          Den Stromverbrauch des Luftentfeuchters im Blick, wollte ich die Luftfeuchte nicht unbedingt duerhaft nach unten korrigieren, also dann erstmal hingesetzt und überlegt, wo das eigentliche Problem liegt.

                          Nimmt man eine Luftfeuchtig von 55%rel und eine Raumtemperatur von 23.3Grad an, liegt der Taupunkt bei ca. 13.7 Grad, die absolute Luftfeuchte liegt dann bei 9.8g/KgLuft. Hat dann zum Beispiel die Kellerwand an der kältesten Stelle 20.0 Grad, könnte man nun der Meinung sein, dass die Luftfeuchte für den ganzen Raum schadfrei sein könnte, da man ja weit vom Taupunkt entfernt ist.

                          Nun ist es aber so, dass der Taupunkt den Wert kennzeichnet, bei dem die Luftfeuchtigkeit 100%rel erreicht und dann Feuchtigkeit sichtbar an dem Objekt kondensiert, wenn diese Temperatur unterschritten wird.

                          Nun weiss man aber auch, dass Schimmelbildung bei einer relativen Luftfeuchte von 70% mit Sicherheit einsetzt und dauerhaft die relative Luftfeuchte unter 70% liegen sollte, damit auch Schimmelbildung ausgeschlossen werden kann.

                          Berechnet man nun die Luftfeuchte an der Kellerwand bei 20.0 Grad, kommt an dieser Stelle ein Wert von ca. 67%rel raus, das heisst, man befindet sich schon fast an der Grenze zur Schimmelbildung. Das heisst, dass die maximal schadfreie Raumluftfeuchte von allen 3 Faktoren abhängig ist.

                          Also musste mehr Sensorik her um die Raumparameter zu erfassen. Ausgestattet mit einem Aktor der den Luftentfeuchter steuert, einem Raumthermostat der die Luftfeuchte und Raumtemperatur misst und zwei Temperatursensoren, die an den kältesten Stellen im Raum angebracht wurden, werden die entsprechenden Werte erfasst und einem Script zur weiteren Berechnung übergeben.

                          Das eigentliche Scipt erzeugt ein "Luftfeuchte Objekt" in dem alle erforderlichen Daten erfasst und die dafür erforderlichen Funktionen enthalten sind.

                          Für die Berechnung ist auch der Luftdruck in "bar" von Bedeutung, wird dieser nicht angegeben, wird als Luftfdruck 0m über Meeresspiegel angenommen.

                          Übrigends: für die Taupunktberechnung spielt der Luftdruck keine Rolle, will man allerdings korrekte Werte für Dampfdruck oder die absFeuchte, sind die Ergebnisse umso genauer, wenn der tatsächliche oder auch der über die "einfache Höhenformel" errechnete Luftdruck benutzt wird. Am besten wäre natürlich der augenblicklich gemessene Luftdruck eines Barometers.

                          Benötigt man lediglich Vergleichs-Werte z.B. für eine Lüftungsempfehlung, kann man mit dem Standard-Luftdruck bei 0m Meeresspiegel rechnen.

                          Nun zum Script:

                          Um im Script ein neues Luftfeuchteobjekt zu erstellen und die Berechnung zu starten (der Luftdruck ist optional):

                          var keller = new Luftfeuchte(temperatur, luftfeuchte [,LuftdruckInBar]);
                          keller.Calc;
                          

                          Danach können die einzelnen Werte ausgelesen werden, die wichtigsten sind:

                          keller.tTau == Taupunkt GradCelsius

                          keller.absFeuchte == Absolute Feuchte in KgWasser/KgLuft

                          Die Funktion Calc gibt ein Flag zurück, die signalisiert ob die Berechnung erfolgreich (true) oder fehlerhaft (false) war.

                          Um nun die maximale Luftfeuchtigkeit des Raumes zu berechnen, bei der auch an der kältesten Stelle des Raumes die maximale Luftfeuchtigkeit nicht überschritten wird, besitzt das Objekt eine Funktion, welche die maximal zulässige Raumluftfeuchte berechnet.

                          Zur Berechnung (wird maxRelLuftfeuchte nicht angegeben wird 65%rel angenommen):

                          var maxPhi = keller.CalcMaxPhi(raumtemperatur, tempDerKaltenStelle [, maxRelLuftfeuchteDesRaums]);
                          

                          Als Ergebnis erhält man die maximal zulässige Luftfeuchte, damit an der kältesten Stelle der geforderte Wert nicht überschritten wird.

                          Beispielhaft hier ein Script, das ich seit einiger Zeit in Verwendung habe:

                          ! // V0.02 Luftfeuchtigkeit im Büro Keller regeln ! // Namen für die einzelnen states const OBJ_TEMP_SENSOR1 = 'LuftfeuchteKeller.Bodensensor1'; const OBJ_TEMP_SENSOR2 = 'LuftfeuchteKeller.Bodensensor2'; const OBJ_MAXPHI = 'LuftfeuchteKeller.ObererGrenzwert'; const OBJ_MINPHI = 'LuftfeuchteKeller.UntererGrenzwert'; const OBJ_AKTPHI = "LuftfeuchteKeller.AktuelleLuftfeuchtigkeit"; const OBJ_AKTTEMP = "LuftfeuchteKeller.AktuelleTemperatur"; ! // Namen der Homematic Sensoren const ID_HM_LF_STATUS = 'LF-Buero-Status'; // Systemvariable der Homematic die Entfeuchter steuert const ID_HM_SENSOR_PHI = 'Wand-Buero-TempSensor.HUMIDITY'; // Sensor für Luftfeuchte const ID_HM_SENSOR_TEMP = 'Wand-Buero-Regler.ACTUAL_TEMPERATURE'; // Sensor für Raumtemperatur const ID_HM_TempSensor1 = 'BodenTempBuero-Sensor1.TEMPERATURE'; // Sensoren für Bodentemperatur const ID_HM_TempSensor2 = 'BodenTempBuero-Sensor2.TEMPERATURE'; ! const STATUS_TO_WETT = true; // Flag für Systemvariable der Homematic, wenn Raum zu feucht const STATUS_OK = false; // ... wenn Raumfeuchte OK const PHI_HYST = 4.0; // Schalthsysterese für Luftentfeuchtung in %relFeuchte ! var hmsLfStatus = getIdByName(ID_HM_LF_STATUS); var hmsSensorPhi = getIdByName(ID_HM_SENSOR_PHI); var hmsSensorTemp = getIdByName(ID_HM_SENSOR_TEMP); var hmsBodenTemp1 = getIdByName(ID_HM_TempSensor1); var hmsBodenTemp2 = getIdByName(ID_HM_TempSensor2); ! stateCreate(); // Benötigte States Erstellen setTimeout (mainStart, 1000); // Wait for states if new ! function mainStart() { check(); // Bei Scriptstart ausführen on ({id: hmsSensorPhi, change: "ne" }, check); // Wenn sich Luftfeuchtigkeit ändert on ({id: hmsSensorTemp, change: "ne" }, check); // Wenn sich Raumtemperatur ändert on ({id: hmsBodenTemp1, change: "ne" }, check); // Wenn sich Bodentemperatur 1 ändert on ({id: hmsBodenTemp2, change: "ne" }, check); // Wenn sich Bodentemperatur 2 ändert } ! // Prüfen der Klima Parameter function check() { var maxRoomPhi = 0; // Maximale zulässige Raum-Luftfeuchte berechnet nach dem kältesten Punkt im Raum var minRoomPhi = 0; // Unterer Wert der Luftfeuchte zur Steuerung var tempSens1 = 0; // Temperatur des Bodensensors 1 var tempSens2 = 0; // Temperatur des Bodensensors 2 var minTemp = 0; // Niedrigster Wert von beiden Sensoren ! t = new Luftfeuchte(getState(hmsSensorTemp).val, getState(hmsSensorPhi).val); setState(OBJ_AKTPHI,getState(hmsSensorPhi).val); // Speichern für Historie setState(OBJ_AKTTEMP, getState(hmsSensorTemp).val); t.Calc(); tempSens1 = getState(hmsBodenTemp1).val; // Bodentemperaturwerte holen tempSens2 = getState(hmsBodenTemp2).val; setState(OBJ_TEMP_SENSOR1, tempSens1); // Speichern für Historie setState(OBJ_TEMP_SENSOR2, tempSens2); if(tempSens1 < tempSens2) { // Kleinste Temperatur suchen minTemp = tempSens1; } else { minTemp = tempSens2; } // Maximal zulässige Raumluftfeuchte berechnen für kältesten Punkt maxRoomPhi = t.CalcMaxPhi(getState(hmsSensorTemp).val, minTemp, 69); if (isNaN(maxRoomPhi)) { log('Berechnung der maximalen Luftfeuchte fehlerhaft! Prüfen!', 'error'); return; } minRoomPhi = maxRoomPhi - PHI_HYST; setState(OBJ_MAXPHI, maxRoomPhi); // Speichern für Historie setState(OBJ_MINPHI, minRoomPhi); // Speichern für Historie ! if (t.relFeuchte >= maxRoomPhi) { // Luftfeuchte zu hoch, Entfeuchtung aktivieren setState(hmsLfStatus, STATUS_TO_WETT); log('Luftentfeuchtung Keller aktiviert'); return; } ! if(t.relFeuchte <= minRoomPhi) { // Luftfeuchte OK, Entfeuchtung deaktivieren setState(hmsLfStatus, STATUS_OK); log('Luftentfeuchtung Keller deaktiviert'); return; } // Hier kommen wir nur hin, wenn Luftfeuchte zwischen max und min liegt, also keine Reaktion nötig ist } ! // Prototype für Luftfeuchte // Quellenangabe: Dieses kleine und freie Programm stammt von der heute nicht mehr aktiven Seite // "http://ourworld.compuserve.com/homepages/MTEC/" von MTEC Technology Software. // Es arbeitet nach dem Standardwerk "Properties of Water and Steam in SI-Units", // bearbeitet von Ernst Schmidt, Springer-Verlag. // Angepasst fuer ioBroker von coffee-yunk function Luftfeuchte(temperatur , relFeuchte, luftdruck ) { const PMIN = 0.01; const PMAX = 20; const TMIN = -20; const TMAX = 100; const MAX_ALLOWED_PHI = 65; ! if (luftdruck === undefined) {luftdruck = 1.01325;} this.temperatur = parseFloat(temperatur); // t Temperatur in Grad Celsius this.relFeuchte = parseFloat(relFeuchte); // phi relative Luftfeuchte in % this.luftdruck = parseFloat(luftdruck); // p Luftdruck in bar this.sattDampf = NaN; // pS SattDampf in bar this.absFeuchte = NaN; // x Absolute Feuchte in in kg/kg this.enthalpie = NaN; // h EnthalpieLuft KJ/kg (Energiegehalt) this.pD = NaN; // pD Dampfdruck in Bar this.rhoD = NaN; // rhoD Dampf in Kg/m3 this.rhoL = NaN; // Luftdichte in KG/m3 this.rhoG = NaN; // Gesamtfeuchte in KG/m3 this.thoL = NaN; this.tTau = NaN; // Taupunkt in Grad Celsius ! /* Maximale zulässige Luftfeuchte des Raumes berechnen in Abhängikeit des kältesten Punktes im Raum Dabei die maximal zulässige Raumluftfeuchte (safePhi) beachten roomTemp = Raumtemperatur lowTemp = Temperatur der kältesten Stelle im Raum maxColdPhi= Maximale zulässige Luftfeuchte an der kältesten Stelle safePhi = (Optional) Höchste Luftfeuchte des Raumes auf die begrenzt wird (Keine Angabe dann 65 %rel) return NaN, fehlerhafte Daten max. %rel Luftfeuchte des Raumes, die nicht überschritten werden darf um am kältesten Punkt die maximale Luftfeuchte zu erzielen */ this.CalcMaxPhi = function (roomTemp, lowTemp, maxColdPhi, safePhi) { if(safePhi === undefined) {safePhi = MAX_ALLOWED_PHI;} if(safePhi > 100 || safePhi < 0) {return NaN;} if(roomTemp === undefined) {return NaN;} if(lowTemp === undefined) {return NaN;} ! // abs Luftfeuchte berechnen für t-Boden und maxColdPhi var n = new Luftfeuchte(lowTemp, maxColdPhi); n.Calc(); var absRaumfeuchte = n.absFeuchte; ! n.temperatur = roomTemp; ! for (r=safePhi; r>0; r--){ n.relFeuchte = r; n.Calc(); if (n.absFeuchte <= absRaumfeuchte) { return r; } } return 0; ! }; ! // Berechnet den Luftdruck nach der sogenannten "Höhenformel" in bar this.CalcHighToBar = function(h) { return (Math.round(1013.25 *Math.pow(1 - (0.0065 * h / 288.15), 5.255))) / 1000; }; ! // Object copy this.Copy = function(obj) { obj.temperatur = this.temperatur; obj.relFeuchte = this.relFeuchte; obj.luftdruck = this.luftdruck; obj.sattDampf = this.sattDampf; obj.absFeuchte = this.absFeuchte; obj.enthalpie = this.enthalpie; obj.pD = this.pD; obj.rhoD = this.rhoD; obj.rhoL = this.rhoL; obj.rhoG = this.rhoG; obj.thoL = this.thoL; obj.tTau = this.tTau; }; ! // Alle Werte berechnen this.Calc = function() { if (this.temperatur.length === 0 || this.luftdruck.length === 0) { return false;} this.temperatur = parseFloat(this.temperatur); this.luftdruck = parseFloat(this.luftdruck); this.relFeuchte = parseFloat(this.relFeuchte); ! if(this.temperatur < TMIN) { log('temperatur < ' + TMIN + ' °C', 'warn'); return false; } if(this.luftdruck < PMIN) { log('luftdruck < ' + PMIN + ' bar', 'warn'); return false; } if(this.temperatur > TMAX) { log('temperatur > ' + TMAX + ' °C','warn'); return false; } if(this.luftdruck > PMAX) { log('luftdruck > ' + PMAX + ' bar','warn'); return false; } this.sattDampf = this.SattdampfDruckWasser(this.temperatur); this.AbsFeuchte(); this.EnthalpieLuft(); this.DichteWDampf(); this.DichteLuft(); this.rhoG = this.rhoD + this.rhoL; this.Taupunkt(); return true; }; ! this.SattdampfDruckWasser = function (t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; ! if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return pS; } else { return 0; } }; ! // Energiegehalt der Luft berechnen in KJ/KG this.EnthalpieLuft = function EnthalpieLuft() { var t = this.temperatur; var x = this.absFeuchte; this.enthalpie = 1.006 * t + x * (1.86 * t + 2500); }; ! // Absolute Feuchte in kgWasser pro kgLuft this.AbsFeuchte = function AbsFeuchte() { var phi = this.relFeuchte; var p = this.luftdruck; var pS = this.sattDampf; var phi = phi / 100; this.absFeuchte = 0.622 * phi * pS / (p - phi * pS); }; ! // Dichte Wasserdampf Berechnungen this.DichteWDampf = function () { var phi = this.relFeuchte; var t = this.temperatur; var pS = this.sattDampf; this.rhoD = 1E5 * phi / 100 * pS / 461.1 / (273.15 + t); this.pD = phi / 100 * pS; }; ! this.DichteLuft = function () { var phi = this.relFeuchte; var t = this.temperatur; var p = this.luftdruck; var pS = this.sattDampf; this.rhoL = 1E5 * 1.001076176 * ((p - phi / 100 * pS) / 287.2 / (273.15 + t)); }; ! // Dampfsättigungstemperatur berechnen this.Sattdampftemperatur = function (pS) { var t = 100; var dt = 0.001; var t0; var t1; var f0; var f1; var fs; do { t0 = t - dt / 2; t1 = t + dt / 2; f0 = this.SattdampfDruckWasser(t0) - pS; f1 = this.SattdampfDruckWasser(t1) - pS; fS = (f1 - f0) / dt; t0 = t; t = t - f0 / fS; } while(Math.abs(t - t0) > dt); return(t); }; ! this.SattdampfDruckWasser = function(t) { var aq = 5.426651; var bq = -2005.1; var cq = 0.00013869; var dq = 0.000000000011965; var eq = -0.0044; var fq = -0.0057148; var kq = 293700; var ta = (t + 273.15) / 647.3; if(t >= -20 && t <= 374) { var te = t + 273.16; var x = te * te - kq; var y = 374.11 - t; var h1 = dq * x * x; var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1) + eq * Math.pow(10, (fq * Math.pow(y, 1.25))); h1 = Math.exp(-12 * Math.pow(ta, 4)); var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta) * Math.exp(h1) * 0.00980665; return(pS); } else { return(0); } }; ! // Taupunkt berechnen this.Taupunkt = function() { var tTau = 0; var x = this.absFeuchte; if(x > 0) {tTau = this.Sattdampftemperatur(x * this.luftdruck / (0.622 + x));} if(tTau === Infinity) { this.tTau = 0; return; } if(x > 0 && tTau > 0) { this.tTau = tTau; } else { this.tTau = 0; } }; ! } function Aufrunden(Wert, Stellen) { Stellen = parseInt(Stellen); var x = Math.pow(10, Stellen); var str = "" + Math.round(Wert * x) / x; return str; } ! // States generieren, falls noch nicht in der DB function stateCreate() { createState(OBJ_TEMP_SENSOR1, { name: 'Temperatur des Bodensensor 1', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_TEMP_SENSOR2, { name: 'Temperatur des Bodensensor 2', type: 'number', def: 0.0, unit: "Grad", role: "value" }); ! createState(OBJ_MAXPHI, { name: 'Maximal erlaubte berechnete Luftfeuchtigkeit', type: 'number', def: 0.0, unit: "%rel", role: "value" }); createState(OBJ_MINPHI, { name: 'Minimale Luftfeuchtigkeit für Luftentfeuchter', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTPHI, { name: 'Aktuelle Luftfeuchtigkeit im Raum', type: 'number', def: 0.0, unit: "%rel", role: "value" }); ! createState(OBJ_AKTTEMP, { name: 'Aktuelle Temperatur im Raum', type: 'number', def: 0.0, unit: "Grad", role: "value" }); } !
                          Um die Lufentfeuchtung zu steuern, wird eine Systemvariable in der Homematic gesetzt. Natürlich werden in der Homematic noch andere Parameter geprüft, da es ja keinen Sinn macht, den Luftentfeuchter rennen zu lassen, während zum Beispiel durch geöffnete Fenster weiterhin feuchte Luft in den Raum strömt.

                          Wer es brauchen kann….. und wer Verbesserungsvorschläge hat.... (bin immer noch script-anfänger ;) )

                          K Offline
                          K Offline
                          klaus88
                          schrieb am zuletzt editiert von
                          #12

                          @coffee-junk : Erstmal Danke für die wirklich tolle Erklärung, aber eher eine allgemeine Frage an dich: Welchen Luftenetfeuchter verwendest du, denn ich bekomme keinen, den ich per (z.B. WLAN Steckdose oder HomematicIP) aus und einschalten kann. Jeder Entfeuchter braucht prinzipiell Strom, aber muss dann extra noch am Bedienfeld "speziell" eingestellt werden, damit er auch dann läuft. Kannst du mir hier einen Tipp geben, bzw. kann mir wer vom Forum einen Tipp geben? Danke Klaus

                          W 1 Antwort Letzte Antwort
                          0
                          • PowerPanP PowerPan

                            @coffee-junk

                            Hi ich würde davon gerne einen Adapter bauen und allen einfach bereitstellen ;)

                            Was machen die ganzen ! Im Code ?

                            Kannst du mir den Code anständig formatiert zukommen lassen ?

                            D Offline
                            D Offline
                            darkiop
                            Most Active
                            schrieb am zuletzt editiert von darkiop
                            #13

                            @PowerPan sagte in Die Sache mir der Luftfeuchtigkeit, dem Taupunkt und der Schimmelgefahr:

                            Was machen die ganzen ! Im Code ?

                            Das sind Kommentare von der HomeMatic Skript-Sprache.

                            Hat das Skript noch jemand über ioBroker im Einsatz?

                            Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                            1 Antwort Letzte Antwort
                            0
                            • PowerPanP PowerPan

                              @coffee-junk

                              Hi ich würde davon gerne einen Adapter bauen und allen einfach bereitstellen ;)

                              Was machen die ganzen ! Im Code ?

                              Kannst du mir den Code anständig formatiert zukommen lassen ?

                              ChaotC Offline
                              ChaotC Offline
                              Chaot
                              schrieb am zuletzt editiert von
                              #14

                              @PowerPan An einem Adapter wäre ich auch sehr interessiert.

                              @darkiop Ich hatte das andere Script mal eine Zit lang im Einsatz. Aber nach der Systemumstellung auf den NUC habe ich das wohl wieder vergessen. Das werde ich mal wieder aktivieren bzw. dann einen Adapter nutzen wenn der gemacht würde.

                              ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                              D 1 Antwort Letzte Antwort
                              0
                              • ChaotC Chaot

                                @PowerPan An einem Adapter wäre ich auch sehr interessiert.

                                @darkiop Ich hatte das andere Script mal eine Zit lang im Einsatz. Aber nach der Systemumstellung auf den NUC habe ich das wohl wieder vergessen. Das werde ich mal wieder aktivieren bzw. dann einen Adapter nutzen wenn der gemacht würde.

                                D Offline
                                D Offline
                                darkiop
                                Most Active
                                schrieb am zuletzt editiert von
                                #15

                                @Chaot Würdest du deine Version mal posten?

                                Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                                ChaotC 2 Antworten Letzte Antwort
                                0
                                • D darkiop

                                  @Chaot Würdest du deine Version mal posten?

                                  ChaotC Offline
                                  ChaotC Offline
                                  Chaot
                                  schrieb am zuletzt editiert von
                                  #16

                                  @darkiop muss ich mal raussuchen. Ich habe die nur hier auf dem Rechner. Wie gesagt habe ich die nie mehr eingebaut nach dem Umzug auf den NUC.

                                  ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                  1 Antwort Letzte Antwort
                                  0
                                  • D darkiop

                                    @Chaot Würdest du deine Version mal posten?

                                    ChaotC Offline
                                    ChaotC Offline
                                    Chaot
                                    schrieb am zuletzt editiert von
                                    #17

                                    @darkiop Ich habe mir das heute nochmal rausgekramt.
                                    Aber ich bringe das Script nicht mehr zum laufen.
                                    Keine Ahnung warum.

                                    // von paul53 übernommen und angepasst
                                    // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A#p21476
                                    createState('0_userdata.0.Taupunkt.Aussen.Temperatur', 0);            // °C
                                    createState('0_userdata.0.Taupunkt.Aussen.rel_Feuchte', 0);           // %
                                    createState('0_userdata.0.Taupunkt.Aussen.Feuchtegehalt', 0);         // g/kg  (nicht g/m3 !)
                                    createState('0_userdata.0.Taupunkt.Aussen.Taupunkt', 0);              // °C
                                    createState('0_userdata.0.Taupunkt.Aussen.Enthalpie', 0);             // kJ/kg
                                    // Ordner Toilette/Aussen
                                    // Offsets
                                    var toffset = 0.0; // in K zur Korrektur, falls nötig
                                    var rhoffset = 0;  // in % zur Korrektur, falls nötig
                                    var tsid = "sonoff.0.BadSensor.BME280_Temperature";		// Sensor Aussen
                                    var hsid = "sonoff.0.BadSensor.BME280_Humidity";
                                    var tid = "0_userdata.0.Taupunkt.Aussen.Temperatur";
                                    var rhid = "0_userdata.0.Taupunkt.Aussen.rel_Feuchte";
                                    var xid = "0_userdata.0.Taupunkt.Aussen.Feuchtegehalt";
                                    var dpid = "0_userdata.0.Taupunkt.Aussen.Taupunkt";
                                    var enth = "0_userdata.0.Taupunkt.Aussen.Enthalpie";
                                    var t = getState(tsid).val + toffset; // Temperatur, korrigiert in °C
                                    var rh = getState(hsid).val + rhoffset; // rel. Feuchte, korrigiert in %
                                    var x;  // Feuchtegehalt in g/kg
                                    var dp; // Taupunkt in °C
                                    var  DP = require('dewpoint');
                                    // 70 m über NN
                                    var xdp = new DP(36); 
                                    function calc() {
                                      var y = xdp.Calc(t, rh);
                                      x = y.x;
                                      dp = y.dp;
                                      setState(xid, x);
                                      setState(dpid, dp);
                                    }
                                    function anzeige() {
                                     // Enthalpie berechnen
                                      var h = (1.00545 * t + (2.500827 + 0.00185894 * t) * x).toFixed(1);
                                      var tanz = t.toFixed(1);
                                      dp = dp.toFixed(1);
                                      var rhanz = rh.toFixed(0);
                                     x = x.toFixed(2);
                                       setState(tid, t);
                                      setState(rhid, rh);
                                      setState(xid, x);
                                      setState(dpid, dp);
                                      setState(enth, h);
                                    }
                                    function klima() {
                                     calc();
                                     anzeige();
                                    }
                                    klima(); // Script start
                                    on(tsid, function (dp) {
                                      t = dp.state.val + toffset; 
                                      setState(tid, t);
                                     klima();
                                    });
                                    on(hsid, function (dp) {
                                      rh = dp.state.val + rhoffset; 
                                      setState(rhid, rh); 
                                     klima();
                                    });
                                    


                                    // von paul53 übernommen und angepasst
                                    // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A#p21476
                                    createState('0_userdata.0.Taupunkt.Toilette.Temperatur', 0);            // °C
                                    createState('0_userdata.0.Taupunkt.Toilette.rel_Feuchte', 0);           // %
                                    createState('0_userdata.0.Taupunkt.Toilette.Feuchtegehalt', 0);         // g/kg  (nicht g/m3 !)
                                    createState('0_userdata.0.Taupunkt.Toilette.Taupunkt', 0);              // °C
                                    createState('0_userdata.0.Taupunkt.Toilette.Enthalpie', 0);             // kJ/kg
                                    // Ordner Toilette/Toilette
                                    // Offsets
                                    var toffset = 0.0; // in K zur Korrektur, falls nötig
                                    var rhoffset = 0;  // in % zur Korrektur, falls nötig
                                    var tsid = "sonoff.0.BadSensor.SI7021_Temperature"; // Toilette Temperatur
                                    var hsid = "sonoff.0.BadSensor.SI7021_Humidity";    // Toilette relative Feuchtigkeit
                                    var tid = "0_userdata.0.Taupunkt.Toilette.Temperatur";
                                    var rhid = "0_userdata.0.Taupunkt.Toilette.rel_Feuchte";
                                    var xid = "0_userdata.0.Taupunkt.Toilette.Feuchtegehalt";
                                    var dpid = "0_userdata.0.Taupunkt.Toilette.Taupunkt";
                                    var enth = "0_userdata.0.Taupunkt.Toilette.Enthalpie";
                                    var t = getState(tsid).val + toffset;           // Temperatur, korrigiert in °C
                                    var rh = getState(hsid).val + rhoffset;         // rel. Feuchte, korrigiert in %
                                    var x;  // Feuchtegehalt in g/kg
                                    var dp; // Taupunkt in °C
                                    var  DP = require('dewpoint');
                                    // 275 m über NN (Meter über dem Meeresspiegel)
                                    var xdp = new DP(275); 
                                    function calc() {
                                      var y = xdp.Calc(t, rh);
                                      x = y.x;
                                      dp = y.dp;
                                      setState(xid, x);
                                      setState(dpid, dp);
                                    }
                                    function anzeige() {
                                     // Enthalpie berechnen
                                      var h = (1.00545 * t + (2.500827 + 0.00185894 * t) * x).toFixed(1);
                                      dp = dp.toFixed(1);
                                      x = x.toFixed(2);
                                       setState(tid, t);
                                      setState(rhid, rh);
                                      setState(xid, x);
                                      setState(dpid, dp);
                                      setState(enth, h);
                                    }
                                    function klima() {
                                     calc();
                                     anzeige();
                                    }
                                    klima(); // Script start
                                    on(tsid, function (dp) {
                                      t = dp.state.val + toffset; 
                                      setState(tid, t);
                                     klima();
                                    });
                                    on(hsid, function (dp) {
                                      rh = dp.state.val + rhoffset; 
                                      setState(rhid, rh); 
                                     klima();
                                    });
                                    


                                    // Ordner Toilette/Fenstersteuerung
                                    createState('0_userdata.0.Taupunkt.Fenstersteuerung.Mindesttemperatur');              // 12   => in Objekte oder vis festlegen
                                    createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximaltemperatur');              // 25
                                    createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindestfeuchte');                  // 55
                                    createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximalfeuchte');                 // 63
                                    var mintid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindesttemperatur"); // Holt sich State
                                    var maxtid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximaltemperatur");
                                    var minfid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindestfeuchte");
                                    var maxfid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximalfeuchte");
                                    var mint = getState(mintid).val;                                // zieht Wert aus State
                                    var maxt = getState(maxtid).val;
                                    var minf = getState(minfid).val;
                                    var maxf = getState(maxfid).val;
                                    var aktfid = "sonoff.0.BadSensor.SI7021_Humidity";      // Aktuelle Kellerfeuchte relativ
                                    var akttid = "sonoff.0.BadSensor.SI7021_Temperature";   // Aktuelle Kellertemperatur 
                                    var levelwa = "hm-rpc.0.MEQ051xxxx.1.LEVEL";        // HM Jalousieaktor Waschraum Level:      0 % = zu; 100 % auf
                                    var levelsi = "hm-rpc.0.MEQ039xxxx.1.LEVEL";        // HM Jalousieaktor Sicherungsraum Level: 0 % = zu; 100 % auf
                                    var aktf = getState(aktfid).val;
                                    var aktt = getState(akttid).val;
                                    var lueft = getState('Lueften.Lueften').val;        // Lüften möglich? Aus Script Toilette/Lueften
                                    //var mint = 12;       // Mindesttemperatur in °C für Toilette
                                    //var maxt = 25;      // Maximaltemperatur in °C für Toilette
                                    //var minf = 57;       // Schliessfeuchte in % (relativ)
                                    //var maxf = 63;       // Öffnungsfeuchte in % (relativ)
                                    // Fenster Waschraum
                                    function fensterwasch() {
                                      if (lueft === false || aktt <= mint || aktt >= maxt || aktf <= minf) setState(levelwa, 0); 
                                      else if (lueft === true && aktf >= maxf) setState(levelwa, 100);
                                    }
                                    // Fenster Sicherungsraum
                                    function fenstersich() {
                                      if (lueft === false || aktt <= mint || aktt >= maxt || aktf <= minf) setState(levelsi, 0);
                                      else if (lueft === true && aktf >= maxf) setState(levelsi, 100);
                                    }
                                    // Script Start und Auslöser
                                    fensterwasch();     
                                    fenstersich();
                                    on(aktfid, function (dp) {
                                      aktf = dp.state.val;
                                     fensterwasch();
                                     fenstersich();
                                    });
                                    on(akttid, function (dp) {
                                      aktt = dp.state.val;
                                     fensterwasch();
                                     fenstersich();
                                    });
                                    // Pushovernachricht über einen Fenstersensor
                                    // on({id: "hm-rpc.0.MEQ028xxxx.1.STATE"/*Fenstersensor Keller Waschraum.STATE*/, val: true, change: "ne"}, function() {     //Bei Änderung auf TRUE
                                      sendTo("pushover", "Fenster wurden geöffnet");                                                          // Sende Pushover Nachricht
                                    });
                                    // on({id: "hm-rpc.0.MEQ028xxxx.1.STATE"/*Fenstersensor Keller Waschraum.STATE*/, val: false, change: "ne"}, function() {
                                      sendTo("pushover", "Fenster wurden geschlossen");
                                    });
                                    


                                    // Ordner Toilette/Lueften
                                    // Prüft ob Lüften möglich ist
                                    // von paul53 übernommen und angepasst
                                    //http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A&start=20#p21506
                                    createState('Lueften.Lueften');      
                                    var tiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Temperatur");
                                    var taid = getIdByName("0_userdata.0.Taupunkt.Aussen.Temperatur");
                                    var xiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Feuchtegehalt");
                                    var xaid = getIdByName("0_userdata.0.Taupunkt.Aussen.Feuchtegehalt");
                                    var lid  = getIdByName("Lueften.Lueften");
                                    var ti = getState(tiid).val;  // Raumtemperatur in °C
                                    var ta = getState(taid).val;  // Aussentemperatur in °C
                                    var xi = getState(xiid).val;  // Raumfeuchtegehalt in g/kg
                                    var xa = getState(xaid).val;  // Aussenfeuchtegehalt in g/kg
                                    // Lüftung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                    function lueften() {
                                     if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= 10.0) setState(lid, true);
                                     else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= 9.5) setState(lid, false);
                                    
                                    }
                                    lueften();  // Script start
                                    on(xiid, function (dp) {
                                      xi = dp.state.val;
                                     lueften();
                                    });
                                    on(xaid, function (dp) {
                                      xa = dp.state.val;
                                     lueften();
                                    });
                                    on(tiid, function (dp) {
                                      ti = dp.state.val;
                                     lueften();
                                    });
                                    on(taid, function (dp) {
                                      ta = dp.state.val;
                                     lueften();
                                    });
                                    

                                    Wobei ich die Fenstersteuerung nicht im Einsatz hatte.

                                    ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                    ChaotC 1 Antwort Letzte Antwort
                                    0
                                    • ChaotC Chaot

                                      @darkiop Ich habe mir das heute nochmal rausgekramt.
                                      Aber ich bringe das Script nicht mehr zum laufen.
                                      Keine Ahnung warum.

                                      // von paul53 übernommen und angepasst
                                      // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A#p21476
                                      createState('0_userdata.0.Taupunkt.Aussen.Temperatur', 0);            // °C
                                      createState('0_userdata.0.Taupunkt.Aussen.rel_Feuchte', 0);           // %
                                      createState('0_userdata.0.Taupunkt.Aussen.Feuchtegehalt', 0);         // g/kg  (nicht g/m3 !)
                                      createState('0_userdata.0.Taupunkt.Aussen.Taupunkt', 0);              // °C
                                      createState('0_userdata.0.Taupunkt.Aussen.Enthalpie', 0);             // kJ/kg
                                      // Ordner Toilette/Aussen
                                      // Offsets
                                      var toffset = 0.0; // in K zur Korrektur, falls nötig
                                      var rhoffset = 0;  // in % zur Korrektur, falls nötig
                                      var tsid = "sonoff.0.BadSensor.BME280_Temperature";		// Sensor Aussen
                                      var hsid = "sonoff.0.BadSensor.BME280_Humidity";
                                      var tid = "0_userdata.0.Taupunkt.Aussen.Temperatur";
                                      var rhid = "0_userdata.0.Taupunkt.Aussen.rel_Feuchte";
                                      var xid = "0_userdata.0.Taupunkt.Aussen.Feuchtegehalt";
                                      var dpid = "0_userdata.0.Taupunkt.Aussen.Taupunkt";
                                      var enth = "0_userdata.0.Taupunkt.Aussen.Enthalpie";
                                      var t = getState(tsid).val + toffset; // Temperatur, korrigiert in °C
                                      var rh = getState(hsid).val + rhoffset; // rel. Feuchte, korrigiert in %
                                      var x;  // Feuchtegehalt in g/kg
                                      var dp; // Taupunkt in °C
                                      var  DP = require('dewpoint');
                                      // 70 m über NN
                                      var xdp = new DP(36); 
                                      function calc() {
                                        var y = xdp.Calc(t, rh);
                                        x = y.x;
                                        dp = y.dp;
                                        setState(xid, x);
                                        setState(dpid, dp);
                                      }
                                      function anzeige() {
                                       // Enthalpie berechnen
                                        var h = (1.00545 * t + (2.500827 + 0.00185894 * t) * x).toFixed(1);
                                        var tanz = t.toFixed(1);
                                        dp = dp.toFixed(1);
                                        var rhanz = rh.toFixed(0);
                                       x = x.toFixed(2);
                                         setState(tid, t);
                                        setState(rhid, rh);
                                        setState(xid, x);
                                        setState(dpid, dp);
                                        setState(enth, h);
                                      }
                                      function klima() {
                                       calc();
                                       anzeige();
                                      }
                                      klima(); // Script start
                                      on(tsid, function (dp) {
                                        t = dp.state.val + toffset; 
                                        setState(tid, t);
                                       klima();
                                      });
                                      on(hsid, function (dp) {
                                        rh = dp.state.val + rhoffset; 
                                        setState(rhid, rh); 
                                       klima();
                                      });
                                      


                                      // von paul53 übernommen und angepasst
                                      // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A#p21476
                                      createState('0_userdata.0.Taupunkt.Toilette.Temperatur', 0);            // °C
                                      createState('0_userdata.0.Taupunkt.Toilette.rel_Feuchte', 0);           // %
                                      createState('0_userdata.0.Taupunkt.Toilette.Feuchtegehalt', 0);         // g/kg  (nicht g/m3 !)
                                      createState('0_userdata.0.Taupunkt.Toilette.Taupunkt', 0);              // °C
                                      createState('0_userdata.0.Taupunkt.Toilette.Enthalpie', 0);             // kJ/kg
                                      // Ordner Toilette/Toilette
                                      // Offsets
                                      var toffset = 0.0; // in K zur Korrektur, falls nötig
                                      var rhoffset = 0;  // in % zur Korrektur, falls nötig
                                      var tsid = "sonoff.0.BadSensor.SI7021_Temperature"; // Toilette Temperatur
                                      var hsid = "sonoff.0.BadSensor.SI7021_Humidity";    // Toilette relative Feuchtigkeit
                                      var tid = "0_userdata.0.Taupunkt.Toilette.Temperatur";
                                      var rhid = "0_userdata.0.Taupunkt.Toilette.rel_Feuchte";
                                      var xid = "0_userdata.0.Taupunkt.Toilette.Feuchtegehalt";
                                      var dpid = "0_userdata.0.Taupunkt.Toilette.Taupunkt";
                                      var enth = "0_userdata.0.Taupunkt.Toilette.Enthalpie";
                                      var t = getState(tsid).val + toffset;           // Temperatur, korrigiert in °C
                                      var rh = getState(hsid).val + rhoffset;         // rel. Feuchte, korrigiert in %
                                      var x;  // Feuchtegehalt in g/kg
                                      var dp; // Taupunkt in °C
                                      var  DP = require('dewpoint');
                                      // 275 m über NN (Meter über dem Meeresspiegel)
                                      var xdp = new DP(275); 
                                      function calc() {
                                        var y = xdp.Calc(t, rh);
                                        x = y.x;
                                        dp = y.dp;
                                        setState(xid, x);
                                        setState(dpid, dp);
                                      }
                                      function anzeige() {
                                       // Enthalpie berechnen
                                        var h = (1.00545 * t + (2.500827 + 0.00185894 * t) * x).toFixed(1);
                                        dp = dp.toFixed(1);
                                        x = x.toFixed(2);
                                         setState(tid, t);
                                        setState(rhid, rh);
                                        setState(xid, x);
                                        setState(dpid, dp);
                                        setState(enth, h);
                                      }
                                      function klima() {
                                       calc();
                                       anzeige();
                                      }
                                      klima(); // Script start
                                      on(tsid, function (dp) {
                                        t = dp.state.val + toffset; 
                                        setState(tid, t);
                                       klima();
                                      });
                                      on(hsid, function (dp) {
                                        rh = dp.state.val + rhoffset; 
                                        setState(rhid, rh); 
                                       klima();
                                      });
                                      


                                      // Ordner Toilette/Fenstersteuerung
                                      createState('0_userdata.0.Taupunkt.Fenstersteuerung.Mindesttemperatur');              // 12   => in Objekte oder vis festlegen
                                      createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximaltemperatur');              // 25
                                      createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindestfeuchte');                  // 55
                                      createState('0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximalfeuchte');                 // 63
                                      var mintid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindesttemperatur"); // Holt sich State
                                      var maxtid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximaltemperatur");
                                      var minfid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Mindestfeuchte");
                                      var maxfid = getIdByName("0_userdata.0.Taupunkt.Fenstersteuerung.Fenstersteuerung.Maximalfeuchte");
                                      var mint = getState(mintid).val;                                // zieht Wert aus State
                                      var maxt = getState(maxtid).val;
                                      var minf = getState(minfid).val;
                                      var maxf = getState(maxfid).val;
                                      var aktfid = "sonoff.0.BadSensor.SI7021_Humidity";      // Aktuelle Kellerfeuchte relativ
                                      var akttid = "sonoff.0.BadSensor.SI7021_Temperature";   // Aktuelle Kellertemperatur 
                                      var levelwa = "hm-rpc.0.MEQ051xxxx.1.LEVEL";        // HM Jalousieaktor Waschraum Level:      0 % = zu; 100 % auf
                                      var levelsi = "hm-rpc.0.MEQ039xxxx.1.LEVEL";        // HM Jalousieaktor Sicherungsraum Level: 0 % = zu; 100 % auf
                                      var aktf = getState(aktfid).val;
                                      var aktt = getState(akttid).val;
                                      var lueft = getState('Lueften.Lueften').val;        // Lüften möglich? Aus Script Toilette/Lueften
                                      //var mint = 12;       // Mindesttemperatur in °C für Toilette
                                      //var maxt = 25;      // Maximaltemperatur in °C für Toilette
                                      //var minf = 57;       // Schliessfeuchte in % (relativ)
                                      //var maxf = 63;       // Öffnungsfeuchte in % (relativ)
                                      // Fenster Waschraum
                                      function fensterwasch() {
                                        if (lueft === false || aktt <= mint || aktt >= maxt || aktf <= minf) setState(levelwa, 0); 
                                        else if (lueft === true && aktf >= maxf) setState(levelwa, 100);
                                      }
                                      // Fenster Sicherungsraum
                                      function fenstersich() {
                                        if (lueft === false || aktt <= mint || aktt >= maxt || aktf <= minf) setState(levelsi, 0);
                                        else if (lueft === true && aktf >= maxf) setState(levelsi, 100);
                                      }
                                      // Script Start und Auslöser
                                      fensterwasch();     
                                      fenstersich();
                                      on(aktfid, function (dp) {
                                        aktf = dp.state.val;
                                       fensterwasch();
                                       fenstersich();
                                      });
                                      on(akttid, function (dp) {
                                        aktt = dp.state.val;
                                       fensterwasch();
                                       fenstersich();
                                      });
                                      // Pushovernachricht über einen Fenstersensor
                                      // on({id: "hm-rpc.0.MEQ028xxxx.1.STATE"/*Fenstersensor Keller Waschraum.STATE*/, val: true, change: "ne"}, function() {     //Bei Änderung auf TRUE
                                        sendTo("pushover", "Fenster wurden geöffnet");                                                          // Sende Pushover Nachricht
                                      });
                                      // on({id: "hm-rpc.0.MEQ028xxxx.1.STATE"/*Fenstersensor Keller Waschraum.STATE*/, val: false, change: "ne"}, function() {
                                        sendTo("pushover", "Fenster wurden geschlossen");
                                      });
                                      


                                      // Ordner Toilette/Lueften
                                      // Prüft ob Lüften möglich ist
                                      // von paul53 übernommen und angepasst
                                      //http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A&start=20#p21506
                                      createState('Lueften.Lueften');      
                                      var tiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Temperatur");
                                      var taid = getIdByName("0_userdata.0.Taupunkt.Aussen.Temperatur");
                                      var xiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Feuchtegehalt");
                                      var xaid = getIdByName("0_userdata.0.Taupunkt.Aussen.Feuchtegehalt");
                                      var lid  = getIdByName("Lueften.Lueften");
                                      var ti = getState(tiid).val;  // Raumtemperatur in °C
                                      var ta = getState(taid).val;  // Aussentemperatur in °C
                                      var xi = getState(xiid).val;  // Raumfeuchtegehalt in g/kg
                                      var xa = getState(xaid).val;  // Aussenfeuchtegehalt in g/kg
                                      // Lüftung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                      function lueften() {
                                       if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= 10.0) setState(lid, true);
                                       else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= 9.5) setState(lid, false);
                                      
                                      }
                                      lueften();  // Script start
                                      on(xiid, function (dp) {
                                        xi = dp.state.val;
                                       lueften();
                                      });
                                      on(xaid, function (dp) {
                                        xa = dp.state.val;
                                       lueften();
                                      });
                                      on(tiid, function (dp) {
                                        ti = dp.state.val;
                                       lueften();
                                      });
                                      on(taid, function (dp) {
                                        ta = dp.state.val;
                                       lueften();
                                      });
                                      

                                      Wobei ich die Fenstersteuerung nicht im Einsatz hatte.

                                      ChaotC Offline
                                      ChaotC Offline
                                      Chaot
                                      schrieb am zuletzt editiert von
                                      #18

                                      @Chaot Ok,
                                      habe den letzten Fehler gefunden.
                                      War im Script "Lueften" versteckt.

                                      // Ordner Toilette/Lueften
                                      // Prüft ob Lüften möglich ist
                                      // von paul53 übernommen und angepasst
                                      //http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A&start=20#p21506
                                      createState('0_userdata.0.Taupunkt.Lueften.Lueften');      
                                      var tiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Temperatur");
                                      var taid = getIdByName("0_userdata.0.Taupunkt.Aussen.Temperatur");
                                      var xiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Feuchtegehalt");
                                      var xaid = getIdByName("0_userdata.0.Taupunkt.Aussen.Feuchtegehalt");
                                      var lid  = getIdByName("0_userdata.0.Taupunkt.Lueften.Lueften");
                                      var ti = getState(tiid).val;  // Raumtemperatur in °C
                                      var ta = getState(taid).val;  // Aussentemperatur in °C
                                      var xi = getState(xiid).val;  // Raumfeuchtegehalt in g/kg
                                      var xa = getState(xaid).val;  // Aussenfeuchtegehalt in g/kg
                                      // Lüftung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                      function lueften() {
                                       if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= 10.0) setState(lid, true);
                                       else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= 9.5) setState(lid, false);
                                      
                                      }
                                      lueften();  // Script start
                                      on(xiid, function (dp) {
                                        xi = dp.state.val;
                                       lueften();
                                      });
                                      on(xaid, function (dp) {
                                        xa = dp.state.val;
                                       lueften();
                                      });
                                      on(tiid, function (dp) {
                                        ti = dp.state.val;
                                       lueften();
                                      });
                                      on(taid, function (dp) {
                                        ta = dp.state.val;
                                       lueften();
                                      });
                                      

                                      ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                      paul53P 1 Antwort Letzte Antwort
                                      0
                                      • ChaotC Chaot

                                        @Chaot Ok,
                                        habe den letzten Fehler gefunden.
                                        War im Script "Lueften" versteckt.

                                        // Ordner Toilette/Lueften
                                        // Prüft ob Lüften möglich ist
                                        // von paul53 übernommen und angepasst
                                        //http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=L%C3%BCftung%2A&start=20#p21506
                                        createState('0_userdata.0.Taupunkt.Lueften.Lueften');      
                                        var tiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Temperatur");
                                        var taid = getIdByName("0_userdata.0.Taupunkt.Aussen.Temperatur");
                                        var xiid = getIdByName("0_userdata.0.Taupunkt.Toilette.Feuchtegehalt");
                                        var xaid = getIdByName("0_userdata.0.Taupunkt.Aussen.Feuchtegehalt");
                                        var lid  = getIdByName("0_userdata.0.Taupunkt.Lueften.Lueften");
                                        var ti = getState(tiid).val;  // Raumtemperatur in °C
                                        var ta = getState(taid).val;  // Aussentemperatur in °C
                                        var xi = getState(xiid).val;  // Raumfeuchtegehalt in g/kg
                                        var xa = getState(xaid).val;  // Aussenfeuchtegehalt in g/kg
                                        // Lüftung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                        function lueften() {
                                         if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= 10.0) setState(lid, true);
                                         else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= 9.5) setState(lid, false);
                                        
                                        }
                                        lueften();  // Script start
                                        on(xiid, function (dp) {
                                          xi = dp.state.val;
                                         lueften();
                                        });
                                        on(xaid, function (dp) {
                                          xa = dp.state.val;
                                         lueften();
                                        });
                                        on(tiid, function (dp) {
                                          ti = dp.state.val;
                                         lueften();
                                        });
                                        on(taid, function (dp) {
                                          ta = dp.state.val;
                                         lueften();
                                        });
                                        

                                        paul53P Offline
                                        paul53P Offline
                                        paul53
                                        schrieb am zuletzt editiert von paul53
                                        #19

                                        @Chaot
                                        Wenn direkt die ID angegeben wird, darf nicht die Funktion getIdByName() verwendet werden.
                                        Mit createState() kann kein Datenpunkt unter 0_userdata.0 erzeugt werden.

                                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                        ChaotC 1 Antwort Letzte Antwort
                                        0
                                        • paul53P paul53

                                          @Chaot
                                          Wenn direkt die ID angegeben wird, darf nicht die Funktion getIdByName() verwendet werden.
                                          Mit createState() kann kein Datenpunkt unter 0_userdata.0 erzeugt werden.

                                          ChaotC Offline
                                          ChaotC Offline
                                          Chaot
                                          schrieb am zuletzt editiert von
                                          #20

                                          @paul53 Das habe ich mir schon fast gedacht.
                                          Ok, die Datenpunkte habe ich per Hand angelegt, weil ich schnell mal testen wollte ob der Rest vom Script fehlerfrei läuft.
                                          So wie es scheint scheint abber alles zu funktionieren.
                                          Ich hatte das damals nur als Lüftungsempfehlung im Einsatz und wollte dann noch einen automatischen Lüfter drüber steuern.
                                          Aber das habe ich dann wieder verworfen (warum weiß ich nicht mehr).
                                          Aktuell denke ich das ich das aber wieder in Angriff nehmen werde.

                                          ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          773

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe