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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Skript] Absolute Feuchte berechnen

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

[Skript] Absolute Feuchte berechnen

Geplant Angeheftet Gesperrt Verschoben JavaScript
740 Beiträge 96 Kommentatoren 224.2k Aufrufe 81 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.
  • S Offline
    S Offline
    Solear
    schrieb am zuletzt editiert von
    #133

    @eric2905:

    Eine Frage beschäftigt mich aber noch ….

    Woran mache ich fest, das gelüftet werden sollte?

    Irgendwie habe ich die Logik dahinter noch nicht verstanden ... kann mir jemand das mal in einfachen Worten versuchen zu erklären?

    Dann baue ich das noch mit ein. `

    Du musst zunächst für dich selbst definieren, warum du wie lüften willst.

    Bei mir habe ich das System mit automatischen Fensteröffnern im Keller zur Entfeuchtung implementiert. Die Temperaturen sind mir dabei ziemlich egal, die Fenster sollen auch nicht immer offen sein wenn wenn absolute Feuchte draußen geringer als im Keller.

    Für mich habe ich definiert: Wenn im Keller die relative Feuchte über 70 % steigt, soll er lüften, und damit aufhören, wenn es unter 55 % fällt (damit es nicht permanent offen ist im WInter). Die absolute Feuchte nehme ich dann nur zur Berechnung, die zu haltende Mindesttemperatur orientiert sich am Taupunkt im Keller und eine maximale gibt es nicht, da es nie über 20 °C wird im Keller.

    Für Wohnräume sieht das vielleicht anders aus, da ist die Bandbreite bei 40 bis 60 % (zB).

    Meine Öffnungsdifferenz für den Keller beträgt 0,9 g/kg und die zum Schließen 0,3 g/kg. Mit 0,4/0,3 oder ähnliche Werte hatte ich das Problem, dass die Fenster im 10 Minutentakt auf und zu gegangen sind, deshalb habe ich die Öffnungsdifferenz erhöht, es muss also (absolut) deutlich trockener draußen sein um drin zu lüften.

    Es kommt natürlich auch daraus an wo die Sensoren stehen. Wenn die im Keller zwischen den Fenstern (also im Zug) stehen dann reagiert der schneller, steht der an einer Wand ohne Zug reagiert er deutlich langsamer, weil die Luft dort nicht so schnell ausgetauscht wird. Das muss mit rein in die Überlegungen und der Anpassung der Hysterese.

    Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein. DIe Temperatur berücksichtige ich gar nicht, außer es ist im Keller nahe der Taupunktgrenze oder es werden über 25 °C im Keller, dann deaktiviert sich die Öffnung und es schließt..

    Nachts ist es immer deutlich trockener (wenn es also kühler ist draußen). Im Winter kann man eigentlich immer den ganzen Tag lüften, es ist immer trockener draußen. Im Sommer gibt es tagsüber Probleme, das geht soweit, dass man tagelang bei schwülem Wetter die Kellerfeuchte nicht unter 80 % bekommt nur durch das Lüften. Ich baue mir deshalb noch eine Zeitprüfung ein, um wenn es morgens um 8 drin trockener als draußen ist, sollen die Fenster zugehen, damit nicht mit der Außenfeuchte die Innenfeuchte mit steigt (man sich also die feuchte Luft von außen reinholt). Geht ganz leicht, einfach mit on bei einer bestimmten Uhrzeit die Fenster schließen, wenn es drin trockener als draußen ist. Sobald die Macimalfeuchte im Keller danach erreicht wird, öffnet er wieder nach der Automatik.

    Wenn man nur die Fenster ab und zu manuell aufmachen möchte im Wohnraum, brauch man so etwas natürlich nicht. Bei elektrischen Lüftern oder automatischen Fenstern muss man aber etwas probieren und Erfahrnungswerte sammeln.

    Ich habe ja wegen dem Lüften mit iobroker angefangen und muss sagen, was besseres konnte mir nicht passieren, als iobroker zu entdecken. Tolle Software! Führt leider dazu, dass man den Rest des Hauses gleich mit anbindet :lol:

    iobroker als LXC unter Proxmox

    1 Antwort Letzte Antwort
    0
    • ruhr70R Offline
      ruhr70R Offline
      ruhr70
      schrieb am zuletzt editiert von
      #134

      super Beschreibung Solear.

      Und mit der Erklärung vom Paul habe ich ein Gefühl, wo der Fehler in meinem Skript liegt. Schaue ich mir nachher mal an.

      Bei der Definition der Räume habe ich eine "Zieltemperatur" definiert. Es müsste aber die Raumminimumtemperatur sein (Auskühlschutz). Kein Wunder, das es keine Lüftungsempfehlung gibt, wenn es draußen nur etwas kühler ist.

      Gesendet von iPhone mit Tapatalk

      Adapter: Fritzbox, Unify Circuit
      Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

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

        @Solear:

        Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein.

        Nein, die Kellerfeuchte steigt trotz Lüften, wenn der Feuchteeintrag aus den Wänden stärker ist als die Entfeuchtung durch die trocknere Aussenluft. Lüftet man dann nicht, steigt die Kellerfeuchte noch schneller.

        @Solear:

        DIe Temperatur berücksichtige ich gar nicht, außer es ist im Keller nahe der Taupunktgrenze oder es werden über 25 °C im Keller, dann deaktiviert sich die Öffnung und es schließt.

        Bei einer Kellerlüftung sollte man die Temperaturdifferenz Innen - Aussen tatsächlich nicht berücksichtigen, denn den Keller will man nicht durch Aussenluft kühlen, sondern nur entfeuchten. Mindestraumtemperatur (Winter) und Maximaltemperatur (Sommer) sollten berücksichtigt werden.

        Keller lüften,

        • wenn abs. Aussenfeuchte < abs. Kellerfeuchte - Hysterese (Entfeuchten)
        • UND Innentemperatur <= Kellertemperaturmaximum
        • UND Innentemperatur >= Kellertemperaturminimum + Hysterese (Auskühlschutz)

        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
        • S Offline
          S Offline
          Solear
          schrieb am zuletzt editiert von
          #136

          @paul53:

          @Solear:

          Man kann auch eine "Sperre" einbauen, nach den bisherigen Skripten ist es ja auch so, dass die Feuchte drin mit der Außenfeuchte ansteigen kann durch das lüften, so lange es drin immernoch feuchter als draußen ist (aber draußen steigt die Feuchte ja auch ab dem Morgen). Das kann evtl. ungeschickt sein. Nein, die Kellerfeuchte steigt ****trotz**** Lüften, wenn der Feuchteeintrag aus den Wänden stärker ist als die Entfeuchtung durch die trocknere Aussenluft. Lüftet man dann nicht, steigt die Kellerfeuchte noch schneller.

          Vielleicht habe ich mich falsch ausgedrückt,

          bei mir steigt ohne Lüften die Kellerfeuchte um 1-2 % je Stunde bis auf 80-90 %.

          Dadurch kann es sein, wenn die absolute Feuchte in den Morgenstunden draußen schneller steigt als drin die umgerechnet relative Feuchtigkeit, dass ich mir in den 3 Morgenstunden von draußen mehr Feuchte reinhole (aber alles noch unterhalb des Schwellwertes von 60 % im Keller) als die Kellerfeuchte ohne Lüften ansteigen würde. Deshalb kann es sich lohnen, früh die Fenster zu schließen. Dann steigt die Kellerfeuchte langsamer an von einem tieferen Wert aus.

          iobroker als LXC unter Proxmox

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

            @Solear:

            …dass ich mir in den 3 Morgenstunden von draußen mehr Feuchte reinhole (aber alles noch unterhalb des Schwellwertes von 60 % im Keller) als die Kellerfeuchte ohne Lüften ansteigen würde. Deshalb kann es sich lohnen, früh die Fenster zu schließen. Dann steigt die Kellerfeuchte langsamer an von einem tieferen Wert aus.

            Nein, dass kann nicht sein, wenn die Bedingung für das Lüften ist: Absolute Aussenfeuchte < absolute Innenfeuchte.

            Lass Dich nicht dadurch täuschen, dass die abs. Aussenfeuchte schneller steigt als die abs. Kellerfeuchte. Solange die Bedingung (s.o.) gilt, wird durch Lüftung entfeuchtet.

            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
            • S Offline
              S Offline
              Solear
              schrieb am zuletzt editiert von
              #138

              Mh, stimmt [emoji3] Na zum Glück habe ich den Timer für 8 Uhr noch nicht eingebaut [emoji41]

              Gesendet von iPhone mit Tapatalk

              iobroker als LXC unter Proxmox

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

                Das http://forum.iobroker.de/viewtopic.php?f=8&t=2666&p=23676&sid=2fa3b0af7f17bde5f1a4e7949ecb5792&sid=b8069d562410810f54c78eb16b004eee#p23676 habe ich um eine Kellerlüftung (als Kommentar) ergänzt.

                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
                • ruhr70R Offline
                  ruhr70R Offline
                  ruhr70
                  schrieb am zuletzt editiert von
                  #140

                  @lobomau:

                  @eric2905:

                  Hallo zusammen,

                  dann hier die letzte Version (Script und Widget).

                  Rückmeldungen sind absolut erbeten !!!

                  Gruß,

                  Eric `
                  Hat das seine Richtigkeit, dass die Belüftungsempfehlung false ist für das Bad? Kann ich bei dem abs. Feuchteunterschied gar nicht verstehen.

                  Und noch eine Anfängerfrage: diese Script Codes… schreibe ich das in das Feld CSS vom Script? Und dann muss es bestimmt das Script sein, dass gleich am Anfang vom Code steht, richtig? `

                  Hast Du das Skript noch so aktiv?

                  Wenn ja, kannst Du bitte den Zweig CONTROL mit aufklappen und die Werte dort posten (Temp_Zielwert und Aussensensor).

                  Ich habe die Formel im Skript überprüft und die Formel sieht eigentlich gut aus. Händisch geprüft, sollte im Ergebnis in der Tat "true" und nicht "false" rauskommen. Ich möchte nur sichergehen, was als Zieltemperatur und was als Außensensor eingetragen ist. Dann kann man noch die Luftqualität mit einbeziehen und und und

                  Ansonsten kann man das Thema beliebig kompliziert machen. Entgegen der Formel würde ich z.B. im Arbeitszimmer auch lüften, damit kühlere Luft von Außen reinkommt, wenn wiederum die Luft nicht schon zu trocken wäre (relative Luftfeuchtigkeit).

                  Als Vergleich die Lüftungsempfehlung bei mir aktuell:

                  filename="lüften.jpg" index="0">~~

                  Adapter: Fritzbox, Unify Circuit
                  Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

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

                    @ruhr70:

                    Entgegen der Formel würde ich z.B. im Arbeitszimmer auch lüften, damit kühlere Luft von Außen reinkommt, wenn wiederum die Luft nicht schon zu trocken wäre (relative Luftfeuchtigkeit).

                    Ja, im Arbeitszimmer würde ich auch Lüften. Die relative Luftfeuchte steigt durch das Lüften, da die Temperatur im Raum sinkt.

                    EDIT: Bei einem Raumfeuchtegehalt von 7 g/kg ist keine Entfeuchtung nötig, aber Kühlung bei über 27 °C.

                    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
                    • eric2905E Offline
                      eric2905E Offline
                      eric2905
                      schrieb am zuletzt editiert von
                      #142

                      Hi,

                      so nicht mehr, habe es aber noch da.

                      Werde es nachher mal aktivieren und einen Screenshot posten.

                      Bin noch nicht zu Hause und komme daher nicht dran.

                      Gruß,

                      Eric

                      Roses are red, violets are blue,

                      if I listen to metal, my neighbours do too

                      1 Antwort Letzte Antwort
                      0
                      • ruhr70R Offline
                        ruhr70R Offline
                        ruhr70
                        schrieb am zuletzt editiert von
                        #143

                        argh…

                        ein Fehler ist drin...

                        xi und xa werden nicht mit der absoluten Feuchtigkeit gefüttert, sondern mit der relativen Luftfeuchtigkeit.

                        Ich werde mir hinterher eh das Script vom eric krallen, möchte jetzt nur wissen, was falsch lief;-)

                        Adapter: Fritzbox, Unify Circuit
                        Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                        1 Antwort Letzte Antwort
                        0
                        • eric2905E Offline
                          eric2905E Offline
                          eric2905
                          schrieb am zuletzt editiert von
                          #144

                          Hi,

                          @ruhr70:

                          Hast Du das Skript noch so aktiv?

                          Wenn ja, kannst Du bitte den Zweig CONTROL mit aufklappen und die Werte dort posten (Temp_Zielwert und Aussensensor). `
                          so, hier die Screenshots - habe das Script aus meinem Posting nochmal gestartet.

                          355_raumklima_objekte.png

                          355_raumklima_vis.png

                          Gruß,

                          Eric

                          Roses are red, violets are blue,

                          if I listen to metal, my neighbours do too

                          1 Antwort Letzte Antwort
                          0
                          • ruhr70R Offline
                            ruhr70R Offline
                            ruhr70
                            schrieb am zuletzt editiert von
                            #145

                            Hi Eric,

                            danke! Aber ich meinte eigentlich Lobomau ;-), da das da so offensichtlich falsch war:

                            http://forum.iobroker.net/viewtopic.php … 100#p27581

                            Hab aber in der Tat einen Fehler gefunden, siehe etwas weiter oben. In xi und xa wurde mit der relativen Luftfeuchtigkeit für den Vergleich gerechnet und nicht mit der absoluten. :-(

                            Hier ist die korrigierte calc() Funktion (zeigt bei mir gerade in allen Räumen an, dass ich lüften soll:

                            ! ````
                            function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
                            var cobStr = (boolean) ? 'true' : 'false';
                            return cobStr;
                            }
                            ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
                            ! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
                            var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
                            ! t = makeNumber(t);
                            rh = makeNumber(rh);
                            ! var toffset = 0.0; // Offset in °C
                            var rhoffset = 0; // Offset in %
                            if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
                            var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
                            toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                            }
                            if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
                            var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
                            rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                            }
                            ! t = t + toffset;
                            rh = rh + rhoffset;
                            ! var y = xdp.Calc(t, rh);
                            var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
                            var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
                            ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
                            ! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
                            var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
                            var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
                            var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
                            var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
                            ! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
                            setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
                            setState(idt , t); // Sensor Temperatur inkl. Offset
                            setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
                            setState(ih , runden(h,2)); // Enthalpie
                            ! // Lüftungsempfehlung berechnen
                            // -------------------------------------------------------------------------
                            if(typeof raeume[raum].Aussensensor !=="undefined") {
                            var aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
                            var idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
                            //var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
                            var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
                            } else {
                            return;
                            }
                            ! var ti = t; // Raumtemperatur in °C
                            //var xi = rh; // Raumfeuchtegehalt in g/kg
                            var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
                            var ta = getState(idta).val; // Aussentemperatur in °C
                            var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
                            if (xa == 0) return;
                            ! var mi = defaultTemp; // Temperaturmittelwert auf Default
                            ! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
                            if(typeof raeume[raum].TEMP_Zielwert == "number") {
                            mi = raeume[raum].TEMP_Zielwert;
                            }
                            var mih = mi + 0.25; // Temperaturmittelwert hoch
                            var mit = mi - 0.25; // Temperaturmittelwert tief
                            ! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
                            ! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
                            // (bedingung ? then-ausdruck : else-ausdruck)
                            var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
                            var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
                            var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)

                            var b1ln = (xa >= (xi - 0.1))   ? true : false;   // Bedingnung 1 lüften negativ (Außenluft ist zu feucht)
                            var b2ln = (ta >= (ti - 0.1))   ? true : false;   // Bedingnung 2 lüften negativ (Außentemperatur zu warm)
                            var b3ln = (ti <= mit)          ? true : false;   // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur)
                            
                            if (b1lp && b2lp && b3lp) {
                                setState(idLueften, true);
                                if (debug) log(raum + ': **Lüftungsempfehlung**');
                            

                            ! } else if (b1ln || b2ln || b3ln) {
                            setState(idLueften, false);
                            if (debug) log(raum + ': Empfehlung Fenster zu');
                            }
                            else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
                            ! // lüften (und - Alle Bedingungen müssen erfüllt sein):
                            // #1 - Außenluft ist mind. 0,4 trockener als Innen
                            // #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
                            // #3 - Innentemperatur ist höher als die Zieltemperatur
                            ! // nicht lüften (oder):
                            // #1 - Außenluft ist zu feucht
                            // #2 - Außentemperatur zu warm
                            // #3 - Innentemperatur niedriger als Zieltemperatur
                            ! if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
                            if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
                            if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));

                            if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp);
                            

                            ! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
                            if (debug) log("" + raum + " --------------------------------------------");
                            }
                            ! ````

                            Die Variable debug wird am Anfang noch benötigt, da ich ein Logging eingebaut habe.

                            var debug = true;
                            
                            

                            Adapter: Fritzbox, Unify Circuit
                            Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                            1 Antwort Letzte Antwort
                            0
                            • lobomauL Offline
                              lobomauL Offline
                              lobomau
                              schrieb am zuletzt editiert von
                              #146

                              @ruhr70:

                              Hi Eric,

                              danke! Aber ich meinte eigentlich Lobomau ;-), da das da so offensichtlich falsch war: `
                              Ja, hatte ich noch aktiv. Grad reingeschaut in Control. Steht immer 0%, 0°C, 21°C. Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus…

                              Host: NUC8i3 mit Proxmox:

                              • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                              • Slave: Pi4
                              1 Antwort Letzte Antwort
                              0
                              • S Offline
                                S Offline
                                Solear
                                schrieb am zuletzt editiert von
                                #147

                                Warum benennt ihr eigentlich die Variablen nie vernünftig? Also etwas länger? [emoji3]

                                Gesendet von iPhone mit Tapatalk

                                iobroker als LXC unter Proxmox

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

                                  @Solear:

                                  Warum benennt ihr eigentlich die Variablen nie vernünftig?

                                  Die üblichen physikalischen Formel-Kurzzeichen sind vernünftig.

                                  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
                                  • lobomauL Offline
                                    lobomauL Offline
                                    lobomau
                                    schrieb am zuletzt editiert von
                                    #149

                                    @lobomau:

                                    …Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus... `
                                    Ist mir leider nicht geglückt die calc () function richtig einzutragen :(

                                    Host: NUC8i3 mit Proxmox:

                                    • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                                    • Slave: Pi4
                                    1 Antwort Letzte Antwort
                                    0
                                    • ruhr70R Offline
                                      ruhr70R Offline
                                      ruhr70
                                      schrieb am zuletzt editiert von
                                      #150

                                      @lobomau:

                                      @lobomau:

                                      …Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus... Ist mir leider nicht geglückt die calc () function richtig einzutragen :(

                                      Wenn Du magst, kannst Du es mit dem ganzen Skript noch einmal testen.

                                      Einfach ein anderen Pfad eintragen und nach dem Test Pfad und Skript löschen.

                                      ! ````
                                      // Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
                                      // gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
                                      // -----------------------------------------------------------------------------
                                      // benötigt in der Javascript das Modul "dewpoint"
                                      // (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
                                      // -----------------------------------------------------------------------------
                                      //
                                      // Formeln zur Berechnung der Luftfeuchtigkeit:
                                      // http://www.nabu-eibelshausen.de/Rechner/feuchte_luft_enthalpie.html
                                      //
                                      // Kalibrierung der Offsetwerte in einer für den Vergleich relevanten Umgebung
                                      // z.B. 22°C, 65% Luftfeuchte (nicht im Winter).
                                      //
                                      ! // TODO:
                                      //
                                      // - Zählen: Anzahl Lüftungsempfehlungen, Ausgabe in Datenpunkt
                                      //
                                      // - Verzicht auf das node module ""dewpoint"
                                      //
                                      // - Sonstige Werte:
                                      // - Ausgabe Dampfgewicht, Luftgewicht und Gesamtgewicht
                                      //
                                      // - Einstellungen Hysterese
                                      //
                                      // - differenziertere Lüftungsempfehlung
                                      //
                                      // - on() mit REGExp
                                      //
                                      // - Luftdruck alternativ vom Messgerät und nicht über Skript
                                      //
                                      // - keine Lüftungsempfehlung, bei relativer Luftfeuchtigkeit unter 40%. (macht das Sinn?)
                                      ! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
                                      ! // -----------------------------------------------------------------------------
                                      // Einstellungen Skriptverhalten
                                      // -----------------------------------------------------------------------------
                                      ! // Wichtig: // betrifft den CONTROL Zweig bei den Raumdatepunkten
                                      var skriptConf = true; // true: Raumwerte werden über das Skript geändert
                                      // false: Raumwerte werden über Objekte (oder VIS) geändert
                                      ! // eigene Parameter:
                                      var hunn = 39.87; // eigene Höhe über nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
                                      var defaultTemp = 19.00; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
                                      //var tempDeltaMin = 4.0; // Temperaturunterschied Auskühlschutz
                                      //var tempDeltaMax = 4.0; // Temperaturunterschied maximales aufheizen
                                      ! var debug = true;
                                      ! // Pfade für die Datenpunkte:
                                      var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
                                      ! var raumPfad = "Raum" +"."; // Pfad unterhalb des Haptpfads für die Räume
                                      var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums für Kontrollparameter
                                      ! var infoPfad = "Skriptinfos" +"."; // Pfad für globale Skriptparameter zur Info
                                      ! // -----------------------------------------------------------------------------
                                      // Räume mit Sensoren, Parametrisierung
                                      // -----------------------------------------------------------------------------
                                      var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
                                      // Sensoren Aussen
                                      "Balkon" : {
                                      "Sensor_TEMP" : "hm-rpc.0.FEQ0039183.1.TEMPERATURE" /Balkon gr. Klima:1.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.FEQ0039183.1.HUMIDITY" /Balkon gr. Klima:1.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0
                                      },
                                      "weatherunderground" : {
                                      "Sensor_TEMP" : "weatherunderground.0.current.temp_c"/Temperature/,
                                      "Sensor_HUM" : "weatherunderground.0.current.relative_humidity"/Relative humidity/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0
                                      },
                                      // Sensoren Innen
                                      "Bad" : {
                                      "Sensor_TEMP" : "hm-rpc.0.KEQ0175977.1.TEMPERATURE" /Bad Lana.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.KEQ0175977.1.HUMIDITY" /Bad Lana.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp, // oder Zieltemperatur in Form von: 20.00 angeben
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Arbeitszimmer" : {
                                      "Sensor_TEMP" : "hm-rpc.0.LEQ1072823.1.TEMPERATURE" /Arbeitszimmer Thermostat.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.LEQ1072823.1.HUMIDITY" /Arbeitszimmer Thermostat.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Arbeitszimmer-2" : {
                                      "Sensor_TEMP" : "javascript.1.WIFFI.Arbeitszimmer.wz_temp"/Temperatur/,
                                      "Sensor_HUM" : "javascript.1.WIFFI.Arbeitszimmer.wz_feuchte"/Luftfeuchte/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Katharina" : {
                                      "Sensor_TEMP" : "hm-rpc.0.KEQ0175649.1.TEMPERATURE" /Katharina Klima.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.KEQ0175649.1.HUMIDITY" /Katharina Klima.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Schlafzimmer" : {
                                      "Sensor_TEMP" : "hm-rpc.0.GEQ0071478.1.TEMPERATURE"/Schlafzimmer Klima:1.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.GEQ0071478.1.HUMIDITY"/Schlafzimmer Klima:1.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : 18.00,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Wohnzimmer" : {
                                      "Sensor_TEMP" : "hm-rpc.0.KEQ0850896.1.TEMPERATURE"/Wohnzimmer Klima.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.KEQ0850896.1.HUMIDITY"/Wohnzimmer Klima.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : 20.00,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Flur" : {
                                      "Sensor_TEMP" : "hm-rpc.0.KEQ0175954.1.TEMPERATURE"/Flur:1.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.KEQ0175954.1.HUMIDITY"/Flur:1.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp,
                                      "Aussensensor" : "Balkon"
                                      },
                                      "Gästebad" : {
                                      "Sensor_TEMP" : "hm-rpc.0.GEQ0071605.1.TEMPERATURE"/Gästebad Klima:1.TEMPERATURE/,
                                      "Sensor_HUM" : "hm-rpc.0.GEQ0071605.1.HUMIDITY"/Gästebad Klima:1.HUMIDITY/,
                                      "Sensor_TEMP_OFFSET" : 0.0,
                                      "Sensor_HUM_OFFSET" : 0,
                                      "TEMP_Zielwert" : defaultTemp,
                                      "Aussensensor" : "Balkon"
                                      }
                                      };
                                      ! // =============================================================================
                                      // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
                                      // =============================================================================
                                      ! var idSkriptinfoBar = pfad + infoPfad + "Luftdruck";
                                      var idSkriptinfoHunn = pfad + infoPfad + "Höhe_über_NN";
                                      ! // forceCreation = true, damit bei geändert eigener Höhe im Konfigurationsbereich der Datenpunkt neu geschrieben wird
                                      createState(idSkriptinfoBar, luftdruck(hunn), true, {
                                      name: 'mittlerer Luftdruck in bar',
                                      desc: 'mittlerer Luftdruck in bar, errechnet anhand der eigenen Höhe über NN',
                                      type: 'number',
                                      unit: 'bar',
                                      role: 'info'
                                      });
                                      ! createState(idSkriptinfoHunn, hunn, true, {
                                      name: 'Eigene Höhe über NN',
                                      desc: 'Eigene Höhe über NN (Normal Null), als Basis für den mittleren Luftdruck',
                                      type: 'number',
                                      unit: 'm',
                                      role: 'info'
                                      });
                                      ! var raumDatenpunkte = {
                                      "x" : {
                                      "DpName" : "Feuchtegehalt_Absolut",
                                      "init": 0,
                                      "dp": {
                                      "name": 'absoluter Feuchtegehalt',
                                      "desc": 'absoluter Feuchtegehalt, errechnet',
                                      "type": 'number',
                                      "role": 'value',
                                      "unit": 'g/kg'
                                      }
                                      },
                                      "rh" : {
                                      "DpName" : "relative_Luftfeuchtigkeit",
                                      "init": 0,
                                      "dp": {
                                      "name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
                                      "desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
                                      "type": 'number',
                                      "role": 'value',
                                      "unit": '%'
                                      }
                                      },
                                      "dp" : {
                                      "DpName" : "Taupunkt",
                                      "init": 0,
                                      "dp": {
                                      "name": 'Taupunkt',
                                      "desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
                                      "type": 'number',
                                      "role": 'value',
                                      "unit": '°C'
                                      }
                                      },
                                      "t" : {
                                      "DpName" : "Temperatur",
                                      "init": 0,
                                      "dp": {
                                      "name": 'gemessene Temperatur (inkl. Offset)',
                                      "desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
                                      "type": 'number',
                                      "role": 'value',
                                      "unit": '°C'
                                      }
                                      },
                                      "h" : {
                                      "DpName" : "Enthalpie",
                                      "init": 0,
                                      "dp": {
                                      "name": 'Enthalpie',
                                      "desc": 'Enthalpie',
                                      "type": 'number',
                                      "role": 'value',
                                      "unit": 'kJ/kg'
                                      }
                                      },
                                      "lüften" : {
                                      "DpName" : "Lüftungsempfehlung",
                                      //"init": false,
                                      "dp": {
                                      "name": 'Lüftungsempfehlung',
                                      "desc": 'Lüftungsempfehlung',
                                      "type": 'boolean',
                                      "role": 'value'
                                      }
                                      }
                                      };
                                      ! var raumControl = {
                                      "Sensor_TEMP_OFFSET" : {
                                      "DpName" : "Sensor_TEMP_OFFSET",
                                      "init": 0,
                                      "dp": {
                                      "name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                      "desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                      "type": 'number',
                                      "role": 'control.value',
                                      "unit": '°C'
                                      }
                                      },
                                      "Sensor_HUM_OFFSET" : {
                                      "DpName" : "Sensor_HUM_OFFSET",
                                      "init": 0,
                                      "dp": {
                                      "name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                      "desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                      "type": 'number',
                                      "role": 'control.value',
                                      "unit": '%'
                                      }
                                      },
                                      "TEMP_Zielwert" : {
                                      "DpName" : "TEMP_Zielwert",
                                      "init": 0,
                                      "dp": {
                                      "name": 'Temperatursteuerwert zum lüften',
                                      "desc": 'Temperatursteuerwert zum lüften',
                                      "type": 'number',
                                      "role": 'control.value',
                                      "unit": '°C'
                                      }
                                      },
                                      "Aussensensor" : {
                                      "DpName" : "Aussensensor",
                                      "init": "",
                                      "dp": {
                                      "name": 'Aussensensor, der zum Vergleich genommen wird',
                                      "desc": 'Aussensensor, der zum Vergleich genommen wird',
                                      "type": 'string',
                                      "role": 'control.value'
                                      }
                                      }
                                      };
                                      ! var xdp = new DP(hunn);
                                      ! var pbar = luftdruck(hunn); // individueller Luftdruck in bar (eigene Höhe)
                                      ! //------------------------------------------------------------------------------
                                      // Funktionen
                                      //------------------------------------------------------------------------------
                                      ! function createDp() {
                                      var name;
                                      var init;
                                      var forceCreation;
                                      var common;
                                      for (var raum in raeume) {
                                      for (var datenpunktID in raumDatenpunkte) {
                                      name = pfad + raumPfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
                                      init = raumDatenpunkte[datenpunktID].init;
                                      forceCreation = false; // Init der Datenpunkte wird nur beim ersten Star angelegt. Danach bleiben die Wert auch nach Skritpstart enthalten.
                                      common = raumDatenpunkte[datenpunktID].dp;
                                      createState(name, init , forceCreation, common);
                                      log("neuer Datenpunkt: " + name,"debug");
                                      }
                                      for (var control in raumControl) {
                                      name = pfad + raumPfad + raum + "." + controlPfad + raumControl[control].DpName;
                                      //init = raumControl[control].init;
                                      forceCreation = skriptConf;
                                      common = raumControl[control].dp;
                                      if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
                                      init = raeume[raum][raumControl[control].DpName];
                                      createState(name, init , forceCreation, common);
                                      }
                                      }
                                      }
                                      }
                                      ! function runden(wert,stellen) {
                                      return Math.round(wert * 10 * stellen) / (10 * stellen);
                                      }
                                      ! function luftdruck(hunn) {
                                      var pnn = 1013.25; // Mittlerer Luftdruck in hPa bei NN
                                      var p = pnn - (hunn / 8.0); // individueller Luftdruck in hPa (eigenen Höhe)
                                      return p / 1000; // Luftdruck von hPa in bar umrechnen
                                      }
                                      ! function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
                                      var cobStr = (boolean) ? 'true' : 'false';
                                      return cobStr;
                                      }
                                      ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
                                      ! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
                                      var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
                                      ! t = makeNumber(t);
                                      rh = makeNumber(rh);
                                      ! var toffset = 0.0; // Offset in °C
                                      var rhoffset = 0; // Offset in %
                                      if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
                                      var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
                                      toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                      }
                                      if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
                                      var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
                                      rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                      }
                                      ! t = t + toffset;
                                      rh = rh + rhoffset;
                                      ! var y = xdp.Calc(t, rh);
                                      var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
                                      var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
                                      ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
                                      ! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
                                      var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
                                      var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
                                      var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
                                      var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
                                      ! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
                                      setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
                                      setState(idt , t); // Sensor Temperatur inkl. Offset
                                      setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
                                      setState(ih , runden(h,2)); // Enthalpie
                                      ! // Lüftungsempfehlung berechnen
                                      // -------------------------------------------------------------------------
                                      var aussen;
                                      var idta, idxa;
                                      if(typeof raeume[raum].Aussensensor !=="undefined") {
                                      aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
                                      idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
                                      //var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
                                      idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
                                      } else {
                                      return;
                                      }
                                      ! var ti = t; // Raumtemperatur in °C
                                      //var xi = rh; // Raumfeuchtegehalt in g/kg
                                      var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
                                      var ta = getState(idta).val; // Aussentemperatur in °C
                                      var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
                                      if (xa == 0) return;
                                      ! var mi = defaultTemp; // Temperaturmittelwert auf Default
                                      ! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
                                      if(typeof raeume[raum].TEMP_Zielwert == "number") {
                                      mi = raeume[raum].TEMP_Zielwert;
                                      }
                                      var mih = mi + 0.25; // Temperaturmittelwert hoch
                                      var mit = mi - 0.25; // Temperaturmittelwert tief
                                      ! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
                                      ! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                      // (bedingung ? then-ausdruck : else-ausdruck)
                                      var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
                                      var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
                                      var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)

                                      var b1ln = (xa >= (xi - 0.1))   ? true : false;   // Bedingnung 1 lüften negativ (Außenluft ist zu feucht)
                                      var b2ln = (ta >= (ti - 0.1))   ? true : false;   // Bedingnung 2 lüften negativ (Außentemperatur zu warm)
                                      var b3ln = (ti <= mit)          ? true : false;   // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur)
                                      
                                      if (b1lp && b2lp && b3lp) {
                                          setState(idLueften, true);
                                          if (debug) log(raum + ': **Lüftungsempfehlung**');
                                      

                                      ! } else if (b1ln || b2ln || b3ln) {
                                      setState(idLueften, false);
                                      if (debug) log(raum + ': Empfehlung Fenster zu');
                                      }
                                      else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
                                      ! // lüften (und - Alle Bedingungen müssen erfüllt sein):
                                      // #1 - Außenluft ist mind. 0,4 trockener als Innen
                                      // #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
                                      // #3 - Innentemperatur ist höher als die Zieltemperatur
                                      ! // nicht lüften (oder):
                                      // #1 - Außenluft ist zu feucht
                                      // #2 - Außentemperatur zu warm
                                      // #3 - Innentemperatur niedriger als Zieltemperatur
                                      ! if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));
                                      if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
                                      if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
                                      if (debug) log(raum + ": Fenster zu (ein true reicht):");

                                      //if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp);
                                      if (debug) log(raum + ": Innentemperatur ist höher als die Zieltemperatur (b3lp): " + cob(b3lp));
                                      if (debug) log(raum + ": Außentemperatur ist mindestens 0,6 Grad kühler als innen (b2lp): " + cob(b2lp));
                                      if (debug) log(raum + ": Außenluft ist mind. 0,4° trockener als Innen (b1lp): " + cob(b1lp) + ": xa: " + xa + " <= (xi - 0.4) " + (xi - 0.4));
                                      if (debug) log(raum + ": Lüftungsempfehlung (alle Bedingungen auf true):");
                                      

                                      ! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
                                      if (debug) log("------ " + raum + " ------- Aussensensor: " + aussen + " -----------");
                                      }
                                      ! function calcDelayed(raum, delay) {
                                      setTimeout(function () {
                                      calc(raum);
                                      }, delay || 0);
                                      }
                                      ! function calcAll() {
                                      for (var raum in raeume) {
                                      //calc(raum);
                                      calcDelayed(raum,200);
                                      }
                                      }
                                      ! function makeNumber(wert) {
                                      if(isNaN(wert)) {
                                      wert = parseFloat(wert.match(/\d+[.|,]?\d+/g));
                                      }
                                      return wert;
                                      }
                                      ! /*
                                      on({id: idSensorTemperaturBad ,change:'ne'}, function (obj) {
                                      calc();
                                      });
                                      ! on({id: idSensorLuftfeuchteBad ,change:'ne'}, function (obj) {
                                      calc();
                                      });
                                      /
                                      ! // alle zwei Minuten neu berechnen
                                      schedule("
                                      /2 * * * *", function () {
                                      calcAll();
                                      });
                                      ! function main() {
                                      calcAll();
                                      //calcAll();
                                      }
                                      ! createDp(); // Datenpunkte anlegen
                                      setTimeout(main, 1500); // Zum Skriptstart ausführen
                                      ! ````

                                      Adapter: Fritzbox, Unify Circuit
                                      Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                                      1 Antwort Letzte Antwort
                                      0
                                      • lobomauL Offline
                                        lobomauL Offline
                                        lobomau
                                        schrieb am zuletzt editiert von
                                        #151

                                        @ruhr70:

                                        @lobomau:

                                        @lobomau:

                                        …Aber du hast ja einen Fehler gefunden. Das neue Script probiere ich mal aus... Ist mir leider nicht geglückt die calc () function richtig einzutragen :(

                                        Wenn Du magst, kannst Du es mit dem ganzen Skript noch einmal testen.

                                        Einfach ein anderen Pfad eintragen und nach dem Test Pfad und Skript löschen.

                                        ! ````
                                        // Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
                                        // gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
                                        // -----------------------------------------------------------------------------
                                        // benötigt in der Javascript das Modul "dewpoint"
                                        // (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
                                        // -----------------------------------------------------------------------------
                                        //
                                        // Formeln zur Berechnung der Luftfeuchtigkeit:
                                        // http://www.nabu-eibelshausen.de/Rechner/feuchte_luft_enthalpie.html
                                        //
                                        // Kalibrierung der Offsetwerte in einer für den Vergleich relevanten Umgebung
                                        // z.B. 22°C, 65% Luftfeuchte (nicht im Winter).
                                        //
                                        ! // TODO:
                                        //
                                        // - Zählen: Anzahl Lüftungsempfehlungen, Ausgabe in Datenpunkt
                                        //
                                        // - Verzicht auf das node module ""dewpoint"
                                        //
                                        // - Sonstige Werte:
                                        // - Ausgabe Dampfgewicht, Luftgewicht und Gesamtgewicht
                                        //
                                        // - Einstellungen Hysterese
                                        //
                                        // - differenziertere Lüftungsempfehlung
                                        //
                                        // - on() mit REGExp
                                        //
                                        // - Luftdruck alternativ vom Messgerät und nicht über Skript
                                        //
                                        // - keine Lüftungsempfehlung, bei relativer Luftfeuchtigkeit unter 40%. (macht das Sinn?)
                                        ! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
                                        ! // -----------------------------------------------------------------------------
                                        // Einstellungen Skriptverhalten
                                        // -----------------------------------------------------------------------------
                                        ! // Wichtig: // betrifft den CONTROL Zweig bei den Raumdatepunkten
                                        var skriptConf = true; // true: Raumwerte werden über das Skript geändert
                                        // false: Raumwerte werden über Objekte (oder VIS) geändert
                                        ! // eigene Parameter:
                                        var hunn = 39.87; // eigene Höhe über nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
                                        var defaultTemp = 19.00; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
                                        //var tempDeltaMin = 4.0; // Temperaturunterschied Auskühlschutz
                                        //var tempDeltaMax = 4.0; // Temperaturunterschied maximales aufheizen
                                        ! var debug = true;
                                        ! // Pfade für die Datenpunkte:
                                        var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
                                        ! var raumPfad = "Raum" +"."; // Pfad unterhalb des Haptpfads für die Räume
                                        var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums für Kontrollparameter
                                        ! var infoPfad = "Skriptinfos" +"."; // Pfad für globale Skriptparameter zur Info
                                        ! // -----------------------------------------------------------------------------
                                        // Räume mit Sensoren, Parametrisierung
                                        // -----------------------------------------------------------------------------
                                        var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
                                        // Sensoren Aussen
                                        "Balkon" : {
                                        "Sensor_TEMP" : "hm-rpc.0.FEQ0039183.1.TEMPERATURE" /Balkon gr. Klima:1.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.FEQ0039183.1.HUMIDITY" /Balkon gr. Klima:1.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0
                                        },
                                        "weatherunderground" : {
                                        "Sensor_TEMP" : "weatherunderground.0.current.temp_c"/Temperature/,
                                        "Sensor_HUM" : "weatherunderground.0.current.relative_humidity"/Relative humidity/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0
                                        },
                                        // Sensoren Innen
                                        "Bad" : {
                                        "Sensor_TEMP" : "hm-rpc.0.KEQ0175977.1.TEMPERATURE" /Bad Lana.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.KEQ0175977.1.HUMIDITY" /Bad Lana.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp, // oder Zieltemperatur in Form von: 20.00 angeben
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Arbeitszimmer" : {
                                        "Sensor_TEMP" : "hm-rpc.0.LEQ1072823.1.TEMPERATURE" /Arbeitszimmer Thermostat.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.LEQ1072823.1.HUMIDITY" /Arbeitszimmer Thermostat.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Arbeitszimmer-2" : {
                                        "Sensor_TEMP" : "javascript.1.WIFFI.Arbeitszimmer.wz_temp"/Temperatur/,
                                        "Sensor_HUM" : "javascript.1.WIFFI.Arbeitszimmer.wz_feuchte"/Luftfeuchte/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Katharina" : {
                                        "Sensor_TEMP" : "hm-rpc.0.KEQ0175649.1.TEMPERATURE" /Katharina Klima.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.KEQ0175649.1.HUMIDITY" /Katharina Klima.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Schlafzimmer" : {
                                        "Sensor_TEMP" : "hm-rpc.0.GEQ0071478.1.TEMPERATURE"/Schlafzimmer Klima:1.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.GEQ0071478.1.HUMIDITY"/Schlafzimmer Klima:1.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : 18.00,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Wohnzimmer" : {
                                        "Sensor_TEMP" : "hm-rpc.0.KEQ0850896.1.TEMPERATURE"/Wohnzimmer Klima.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.KEQ0850896.1.HUMIDITY"/Wohnzimmer Klima.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : 20.00,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Flur" : {
                                        "Sensor_TEMP" : "hm-rpc.0.KEQ0175954.1.TEMPERATURE"/Flur:1.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.KEQ0175954.1.HUMIDITY"/Flur:1.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp,
                                        "Aussensensor" : "Balkon"
                                        },
                                        "Gästebad" : {
                                        "Sensor_TEMP" : "hm-rpc.0.GEQ0071605.1.TEMPERATURE"/Gästebad Klima:1.TEMPERATURE/,
                                        "Sensor_HUM" : "hm-rpc.0.GEQ0071605.1.HUMIDITY"/Gästebad Klima:1.HUMIDITY/,
                                        "Sensor_TEMP_OFFSET" : 0.0,
                                        "Sensor_HUM_OFFSET" : 0,
                                        "TEMP_Zielwert" : defaultTemp,
                                        "Aussensensor" : "Balkon"
                                        }
                                        };
                                        ! // =============================================================================
                                        // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
                                        // =============================================================================
                                        ! var idSkriptinfoBar = pfad + infoPfad + "Luftdruck";
                                        var idSkriptinfoHunn = pfad + infoPfad + "Höhe_über_NN";
                                        ! // forceCreation = true, damit bei geändert eigener Höhe im Konfigurationsbereich der Datenpunkt neu geschrieben wird
                                        createState(idSkriptinfoBar, luftdruck(hunn), true, {
                                        name: 'mittlerer Luftdruck in bar',
                                        desc: 'mittlerer Luftdruck in bar, errechnet anhand der eigenen Höhe über NN',
                                        type: 'number',
                                        unit: 'bar',
                                        role: 'info'
                                        });
                                        ! createState(idSkriptinfoHunn, hunn, true, {
                                        name: 'Eigene Höhe über NN',
                                        desc: 'Eigene Höhe über NN (Normal Null), als Basis für den mittleren Luftdruck',
                                        type: 'number',
                                        unit: 'm',
                                        role: 'info'
                                        });
                                        ! var raumDatenpunkte = {
                                        "x" : {
                                        "DpName" : "Feuchtegehalt_Absolut",
                                        "init": 0,
                                        "dp": {
                                        "name": 'absoluter Feuchtegehalt',
                                        "desc": 'absoluter Feuchtegehalt, errechnet',
                                        "type": 'number',
                                        "role": 'value',
                                        "unit": 'g/kg'
                                        }
                                        },
                                        "rh" : {
                                        "DpName" : "relative_Luftfeuchtigkeit",
                                        "init": 0,
                                        "dp": {
                                        "name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
                                        "desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
                                        "type": 'number',
                                        "role": 'value',
                                        "unit": '%'
                                        }
                                        },
                                        "dp" : {
                                        "DpName" : "Taupunkt",
                                        "init": 0,
                                        "dp": {
                                        "name": 'Taupunkt',
                                        "desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
                                        "type": 'number',
                                        "role": 'value',
                                        "unit": '°C'
                                        }
                                        },
                                        "t" : {
                                        "DpName" : "Temperatur",
                                        "init": 0,
                                        "dp": {
                                        "name": 'gemessene Temperatur (inkl. Offset)',
                                        "desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
                                        "type": 'number',
                                        "role": 'value',
                                        "unit": '°C'
                                        }
                                        },
                                        "h" : {
                                        "DpName" : "Enthalpie",
                                        "init": 0,
                                        "dp": {
                                        "name": 'Enthalpie',
                                        "desc": 'Enthalpie',
                                        "type": 'number',
                                        "role": 'value',
                                        "unit": 'kJ/kg'
                                        }
                                        },
                                        "lüften" : {
                                        "DpName" : "Lüftungsempfehlung",
                                        //"init": false,
                                        "dp": {
                                        "name": 'Lüftungsempfehlung',
                                        "desc": 'Lüftungsempfehlung',
                                        "type": 'boolean',
                                        "role": 'value'
                                        }
                                        }
                                        };
                                        ! var raumControl = {
                                        "Sensor_TEMP_OFFSET" : {
                                        "DpName" : "Sensor_TEMP_OFFSET",
                                        "init": 0,
                                        "dp": {
                                        "name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                        "desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                        "type": 'number',
                                        "role": 'control.value',
                                        "unit": '°C'
                                        }
                                        },
                                        "Sensor_HUM_OFFSET" : {
                                        "DpName" : "Sensor_HUM_OFFSET",
                                        "init": 0,
                                        "dp": {
                                        "name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                        "desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                        "type": 'number',
                                        "role": 'control.value',
                                        "unit": '%'
                                        }
                                        },
                                        "TEMP_Zielwert" : {
                                        "DpName" : "TEMP_Zielwert",
                                        "init": 0,
                                        "dp": {
                                        "name": 'Temperatursteuerwert zum lüften',
                                        "desc": 'Temperatursteuerwert zum lüften',
                                        "type": 'number',
                                        "role": 'control.value',
                                        "unit": '°C'
                                        }
                                        },
                                        "Aussensensor" : {
                                        "DpName" : "Aussensensor",
                                        "init": "",
                                        "dp": {
                                        "name": 'Aussensensor, der zum Vergleich genommen wird',
                                        "desc": 'Aussensensor, der zum Vergleich genommen wird',
                                        "type": 'string',
                                        "role": 'control.value'
                                        }
                                        }
                                        };
                                        ! var xdp = new DP(hunn);
                                        ! var pbar = luftdruck(hunn); // individueller Luftdruck in bar (eigene Höhe)
                                        ! //------------------------------------------------------------------------------
                                        // Funktionen
                                        //------------------------------------------------------------------------------
                                        ! function createDp() {
                                        var name;
                                        var init;
                                        var forceCreation;
                                        var common;
                                        for (var raum in raeume) {
                                        for (var datenpunktID in raumDatenpunkte) {
                                        name = pfad + raumPfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
                                        init = raumDatenpunkte[datenpunktID].init;
                                        forceCreation = false; // Init der Datenpunkte wird nur beim ersten Star angelegt. Danach bleiben die Wert auch nach Skritpstart enthalten.
                                        common = raumDatenpunkte[datenpunktID].dp;
                                        createState(name, init , forceCreation, common);
                                        log("neuer Datenpunkt: " + name,"debug");
                                        }
                                        for (var control in raumControl) {
                                        name = pfad + raumPfad + raum + "." + controlPfad + raumControl[control].DpName;
                                        //init = raumControl[control].init;
                                        forceCreation = skriptConf;
                                        common = raumControl[control].dp;
                                        if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
                                        init = raeume[raum][raumControl[control].DpName];
                                        createState(name, init , forceCreation, common);
                                        }
                                        }
                                        }
                                        }
                                        ! function runden(wert,stellen) {
                                        return Math.round(wert * 10 * stellen) / (10 * stellen);
                                        }
                                        ! function luftdruck(hunn) {
                                        var pnn = 1013.25; // Mittlerer Luftdruck in hPa bei NN
                                        var p = pnn - (hunn / 8.0); // individueller Luftdruck in hPa (eigenen Höhe)
                                        return p / 1000; // Luftdruck von hPa in bar umrechnen
                                        }
                                        ! function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
                                        var cobStr = (boolean) ? 'true' : 'false';
                                        return cobStr;
                                        }
                                        ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
                                        ! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
                                        var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
                                        ! t = makeNumber(t);
                                        rh = makeNumber(rh);
                                        ! var toffset = 0.0; // Offset in °C
                                        var rhoffset = 0; // Offset in %
                                        if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
                                        var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
                                        toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                        }
                                        if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
                                        var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
                                        rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                        }
                                        ! t = t + toffset;
                                        rh = rh + rhoffset;
                                        ! var y = xdp.Calc(t, rh);
                                        var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
                                        var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
                                        ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
                                        ! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
                                        var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
                                        var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
                                        var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
                                        var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
                                        ! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
                                        setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
                                        setState(idt , t); // Sensor Temperatur inkl. Offset
                                        setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
                                        setState(ih , runden(h,2)); // Enthalpie
                                        ! // Lüftungsempfehlung berechnen
                                        // -------------------------------------------------------------------------
                                        var aussen;
                                        var idta, idxa;
                                        if(typeof raeume[raum].Aussensensor !=="undefined") {
                                        aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
                                        idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
                                        //var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
                                        idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
                                        } else {
                                        return;
                                        }
                                        ! var ti = t; // Raumtemperatur in °C
                                        //var xi = rh; // Raumfeuchtegehalt in g/kg
                                        var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
                                        var ta = getState(idta).val; // Aussentemperatur in °C
                                        var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
                                        if (xa == 0) return;
                                        ! var mi = defaultTemp; // Temperaturmittelwert auf Default
                                        ! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
                                        if(typeof raeume[raum].TEMP_Zielwert == "number") {
                                        mi = raeume[raum].TEMP_Zielwert;
                                        }
                                        var mih = mi + 0.25; // Temperaturmittelwert hoch
                                        var mit = mi - 0.25; // Temperaturmittelwert tief
                                        ! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
                                        ! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                        // (bedingung ? then-ausdruck : else-ausdruck)
                                        var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
                                        var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
                                        var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)

                                        var b1ln = (xa >= (xi - 0.1))   ? true : false;   // Bedingnung 1 lüften negativ (Außenluft ist zu feucht)
                                        var b2ln = (ta >= (ti - 0.1))   ? true : false;   // Bedingnung 2 lüften negativ (Außentemperatur zu warm)
                                        var b3ln = (ti <= mit)          ? true : false;   // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur)
                                        
                                        if (b1lp && b2lp && b3lp) {
                                            setState(idLueften, true);
                                            if (debug) log(raum + ': **Lüftungsempfehlung**');
                                        

                                        ! } else if (b1ln || b2ln || b3ln) {
                                        setState(idLueften, false);
                                        if (debug) log(raum + ': Empfehlung Fenster zu');
                                        }
                                        else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
                                        ! // lüften (und - Alle Bedingungen müssen erfüllt sein):
                                        // #1 - Außenluft ist mind. 0,4 trockener als Innen
                                        // #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
                                        // #3 - Innentemperatur ist höher als die Zieltemperatur
                                        ! // nicht lüften (oder):
                                        // #1 - Außenluft ist zu feucht
                                        // #2 - Außentemperatur zu warm
                                        // #3 - Innentemperatur niedriger als Zieltemperatur
                                        ! if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));
                                        if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
                                        if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
                                        if (debug) log(raum + ": Fenster zu (ein true reicht):");

                                        //if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp);
                                        if (debug) log(raum + ": Innentemperatur ist höher als die Zieltemperatur (b3lp): " + cob(b3lp));
                                        if (debug) log(raum + ": Außentemperatur ist mindestens 0,6 Grad kühler als innen (b2lp): " + cob(b2lp));
                                        if (debug) log(raum + ": Außenluft ist mind. 0,4° trockener als Innen (b1lp): " + cob(b1lp) + ": xa: " + xa + " <= (xi - 0.4) " + (xi - 0.4));
                                        if (debug) log(raum + ": Lüftungsempfehlung (alle Bedingungen auf true):");
                                        

                                        ! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
                                        if (debug) log("------ " + raum + " ------- Aussensensor: " + aussen + " -----------");
                                        }
                                        ! function calcDelayed(raum, delay) {
                                        setTimeout(function () {
                                        calc(raum);
                                        }, delay || 0);
                                        }
                                        ! function calcAll() {
                                        for (var raum in raeume) {
                                        //calc(raum);
                                        calcDelayed(raum,200);
                                        }
                                        }
                                        ! function makeNumber(wert) {
                                        if(isNaN(wert)) {
                                        wert = parseFloat(wert.match(/\d+[.|,]?\d+/g));
                                        }
                                        return wert;
                                        }
                                        ! /*
                                        on({id: idSensorTemperaturBad ,change:'ne'}, function (obj) {
                                        calc();
                                        });
                                        ! on({id: idSensorLuftfeuchteBad ,change:'ne'}, function (obj) {
                                        calc();
                                        });
                                        /
                                        ! // alle zwei Minuten neu berechnen
                                        schedule("
                                        /2 * * * *", function () {
                                        calcAll();
                                        });
                                        ! function main() {
                                        calcAll();
                                        //calcAll();
                                        }
                                        ! createDp(); // Datenpunkte anlegen
                                        setTimeout(main, 1500); // Zum Skriptstart ausführen
                                        ! ```` `
                                        Scheint auf den ersten Blick zu funktionieren. Weatherground ist noch nicht eingebunden, richtig? Muss man aber installieren, damit das Script läuft.
                                        1146_feuchte_l_ftung.gif

                                        Host: NUC8i3 mit Proxmox:

                                        • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                                        • Slave: Pi4
                                        1 Antwort Letzte Antwort
                                        0
                                        • eric2905E Offline
                                          eric2905E Offline
                                          eric2905
                                          schrieb am zuletzt editiert von
                                          #152

                                          Moin,

                                          @ruhr70:

                                          Wenn Du magst, kannst Du es mit dem ganzen Skript noch einmal testen.

                                          Einfach ein anderen Pfad eintragen und nach dem Test Pfad und Skript löschen.

                                          ! ````
                                          // Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
                                          // gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
                                          // -----------------------------------------------------------------------------
                                          // benötigt in der Javascript das Modul "dewpoint"
                                          // (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
                                          // -----------------------------------------------------------------------------
                                          //
                                          // Formeln zur Berechnung der Luftfeuchtigkeit:
                                          // http://www.nabu-eibelshausen.de/Rechner/feuchte_luft_enthalpie.html
                                          //
                                          // Kalibrierung der Offsetwerte in einer für den Vergleich relevanten Umgebung
                                          // z.B. 22°C, 65% Luftfeuchte (nicht im Winter).
                                          //
                                          ! // TODO:
                                          //
                                          // - Zählen: Anzahl Lüftungsempfehlungen, Ausgabe in Datenpunkt
                                          //
                                          // - Verzicht auf das node module ""dewpoint"
                                          //
                                          // - Sonstige Werte:
                                          // - Ausgabe Dampfgewicht, Luftgewicht und Gesamtgewicht
                                          //
                                          // - Einstellungen Hysterese
                                          //
                                          // - differenziertere Lüftungsempfehlung
                                          //
                                          // - on() mit REGExp
                                          //
                                          // - Luftdruck alternativ vom Messgerät und nicht über Skript
                                          //
                                          // - keine Lüftungsempfehlung, bei relativer Luftfeuchtigkeit unter 40%. (macht das Sinn?)
                                          ! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
                                          ! // -----------------------------------------------------------------------------
                                          // Einstellungen Skriptverhalten
                                          // -----------------------------------------------------------------------------
                                          ! // Wichtig: // betrifft den CONTROL Zweig bei den Raumdatepunkten
                                          var skriptConf = true; // true: Raumwerte werden über das Skript geändert
                                          // false: Raumwerte werden über Objekte (oder VIS) geändert
                                          ! // eigene Parameter:
                                          var hunn = 39.87; // eigene Höhe über nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
                                          var defaultTemp = 19.00; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
                                          //var tempDeltaMin = 4.0; // Temperaturunterschied Auskühlschutz
                                          //var tempDeltaMax = 4.0; // Temperaturunterschied maximales aufheizen
                                          ! var debug = true;
                                          ! // Pfade für die Datenpunkte:
                                          var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
                                          ! var raumPfad = "Raum" +"."; // Pfad unterhalb des Haptpfads für die Räume
                                          var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums für Kontrollparameter
                                          ! var infoPfad = "Skriptinfos" +"."; // Pfad für globale Skriptparameter zur Info
                                          ! // -----------------------------------------------------------------------------
                                          // Räume mit Sensoren, Parametrisierung
                                          // -----------------------------------------------------------------------------
                                          var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
                                          // Sensoren Aussen
                                          "Balkon" : {
                                          "Sensor_TEMP" : "hm-rpc.0.FEQ0039183.1.TEMPERATURE" /Balkon gr. Klima:1.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.FEQ0039183.1.HUMIDITY" /Balkon gr. Klima:1.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0
                                          },
                                          "weatherunderground" : {
                                          "Sensor_TEMP" : "weatherunderground.0.current.temp_c"/Temperature/,
                                          "Sensor_HUM" : "weatherunderground.0.current.relative_humidity"/Relative humidity/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0
                                          },
                                          // Sensoren Innen
                                          "Bad" : {
                                          "Sensor_TEMP" : "hm-rpc.0.KEQ0175977.1.TEMPERATURE" /Bad Lana.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.KEQ0175977.1.HUMIDITY" /Bad Lana.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp, // oder Zieltemperatur in Form von: 20.00 angeben
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Arbeitszimmer" : {
                                          "Sensor_TEMP" : "hm-rpc.0.LEQ1072823.1.TEMPERATURE" /Arbeitszimmer Thermostat.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.LEQ1072823.1.HUMIDITY" /Arbeitszimmer Thermostat.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Arbeitszimmer-2" : {
                                          "Sensor_TEMP" : "javascript.1.WIFFI.Arbeitszimmer.wz_temp"/Temperatur/,
                                          "Sensor_HUM" : "javascript.1.WIFFI.Arbeitszimmer.wz_feuchte"/Luftfeuchte/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Katharina" : {
                                          "Sensor_TEMP" : "hm-rpc.0.KEQ0175649.1.TEMPERATURE" /Katharina Klima.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.KEQ0175649.1.HUMIDITY" /Katharina Klima.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Schlafzimmer" : {
                                          "Sensor_TEMP" : "hm-rpc.0.GEQ0071478.1.TEMPERATURE"/Schlafzimmer Klima:1.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.GEQ0071478.1.HUMIDITY"/Schlafzimmer Klima:1.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : 18.00,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Wohnzimmer" : {
                                          "Sensor_TEMP" : "hm-rpc.0.KEQ0850896.1.TEMPERATURE"/Wohnzimmer Klima.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.KEQ0850896.1.HUMIDITY"/Wohnzimmer Klima.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : 20.00,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Flur" : {
                                          "Sensor_TEMP" : "hm-rpc.0.KEQ0175954.1.TEMPERATURE"/Flur:1.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.KEQ0175954.1.HUMIDITY"/Flur:1.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp,
                                          "Aussensensor" : "Balkon"
                                          },
                                          "Gästebad" : {
                                          "Sensor_TEMP" : "hm-rpc.0.GEQ0071605.1.TEMPERATURE"/Gästebad Klima:1.TEMPERATURE/,
                                          "Sensor_HUM" : "hm-rpc.0.GEQ0071605.1.HUMIDITY"/Gästebad Klima:1.HUMIDITY/,
                                          "Sensor_TEMP_OFFSET" : 0.0,
                                          "Sensor_HUM_OFFSET" : 0,
                                          "TEMP_Zielwert" : defaultTemp,
                                          "Aussensensor" : "Balkon"
                                          }
                                          };
                                          ! // =============================================================================
                                          // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
                                          // =============================================================================
                                          ! var idSkriptinfoBar = pfad + infoPfad + "Luftdruck";
                                          var idSkriptinfoHunn = pfad + infoPfad + "Höhe_über_NN";
                                          ! // forceCreation = true, damit bei geändert eigener Höhe im Konfigurationsbereich der Datenpunkt neu geschrieben wird
                                          createState(idSkriptinfoBar, luftdruck(hunn), true, {
                                          name: 'mittlerer Luftdruck in bar',
                                          desc: 'mittlerer Luftdruck in bar, errechnet anhand der eigenen Höhe über NN',
                                          type: 'number',
                                          unit: 'bar',
                                          role: 'info'
                                          });
                                          ! createState(idSkriptinfoHunn, hunn, true, {
                                          name: 'Eigene Höhe über NN',
                                          desc: 'Eigene Höhe über NN (Normal Null), als Basis für den mittleren Luftdruck',
                                          type: 'number',
                                          unit: 'm',
                                          role: 'info'
                                          });
                                          ! var raumDatenpunkte = {
                                          "x" : {
                                          "DpName" : "Feuchtegehalt_Absolut",
                                          "init": 0,
                                          "dp": {
                                          "name": 'absoluter Feuchtegehalt',
                                          "desc": 'absoluter Feuchtegehalt, errechnet',
                                          "type": 'number',
                                          "role": 'value',
                                          "unit": 'g/kg'
                                          }
                                          },
                                          "rh" : {
                                          "DpName" : "relative_Luftfeuchtigkeit",
                                          "init": 0,
                                          "dp": {
                                          "name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
                                          "desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
                                          "type": 'number',
                                          "role": 'value',
                                          "unit": '%'
                                          }
                                          },
                                          "dp" : {
                                          "DpName" : "Taupunkt",
                                          "init": 0,
                                          "dp": {
                                          "name": 'Taupunkt',
                                          "desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
                                          "type": 'number',
                                          "role": 'value',
                                          "unit": '°C'
                                          }
                                          },
                                          "t" : {
                                          "DpName" : "Temperatur",
                                          "init": 0,
                                          "dp": {
                                          "name": 'gemessene Temperatur (inkl. Offset)',
                                          "desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
                                          "type": 'number',
                                          "role": 'value',
                                          "unit": '°C'
                                          }
                                          },
                                          "h" : {
                                          "DpName" : "Enthalpie",
                                          "init": 0,
                                          "dp": {
                                          "name": 'Enthalpie',
                                          "desc": 'Enthalpie',
                                          "type": 'number',
                                          "role": 'value',
                                          "unit": 'kJ/kg'
                                          }
                                          },
                                          "lüften" : {
                                          "DpName" : "Lüftungsempfehlung",
                                          //"init": false,
                                          "dp": {
                                          "name": 'Lüftungsempfehlung',
                                          "desc": 'Lüftungsempfehlung',
                                          "type": 'boolean',
                                          "role": 'value'
                                          }
                                          }
                                          };
                                          ! var raumControl = {
                                          "Sensor_TEMP_OFFSET" : {
                                          "DpName" : "Sensor_TEMP_OFFSET",
                                          "init": 0,
                                          "dp": {
                                          "name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                          "desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                          "type": 'number',
                                          "role": 'control.value',
                                          "unit": '°C'
                                          }
                                          },
                                          "Sensor_HUM_OFFSET" : {
                                          "DpName" : "Sensor_HUM_OFFSET",
                                          "init": 0,
                                          "dp": {
                                          "name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                          "desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
                                          "type": 'number',
                                          "role": 'control.value',
                                          "unit": '%'
                                          }
                                          },
                                          "TEMP_Zielwert" : {
                                          "DpName" : "TEMP_Zielwert",
                                          "init": 0,
                                          "dp": {
                                          "name": 'Temperatursteuerwert zum lüften',
                                          "desc": 'Temperatursteuerwert zum lüften',
                                          "type": 'number',
                                          "role": 'control.value',
                                          "unit": '°C'
                                          }
                                          },
                                          "Aussensensor" : {
                                          "DpName" : "Aussensensor",
                                          "init": "",
                                          "dp": {
                                          "name": 'Aussensensor, der zum Vergleich genommen wird',
                                          "desc": 'Aussensensor, der zum Vergleich genommen wird',
                                          "type": 'string',
                                          "role": 'control.value'
                                          }
                                          }
                                          };
                                          ! var xdp = new DP(hunn);
                                          ! var pbar = luftdruck(hunn); // individueller Luftdruck in bar (eigene Höhe)
                                          ! //------------------------------------------------------------------------------
                                          // Funktionen
                                          //------------------------------------------------------------------------------
                                          ! function createDp() {
                                          var name;
                                          var init;
                                          var forceCreation;
                                          var common;
                                          for (var raum in raeume) {
                                          for (var datenpunktID in raumDatenpunkte) {
                                          name = pfad + raumPfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
                                          init = raumDatenpunkte[datenpunktID].init;
                                          forceCreation = false; // Init der Datenpunkte wird nur beim ersten Star angelegt. Danach bleiben die Wert auch nach Skritpstart enthalten.
                                          common = raumDatenpunkte[datenpunktID].dp;
                                          createState(name, init , forceCreation, common);
                                          log("neuer Datenpunkt: " + name,"debug");
                                          }
                                          for (var control in raumControl) {
                                          name = pfad + raumPfad + raum + "." + controlPfad + raumControl[control].DpName;
                                          //init = raumControl[control].init;
                                          forceCreation = skriptConf;
                                          common = raumControl[control].dp;
                                          if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
                                          init = raeume[raum][raumControl[control].DpName];
                                          createState(name, init , forceCreation, common);
                                          }
                                          }
                                          }
                                          }
                                          ! function runden(wert,stellen) {
                                          return Math.round(wert * 10 * stellen) / (10 * stellen);
                                          }
                                          ! function luftdruck(hunn) {
                                          var pnn = 1013.25; // Mittlerer Luftdruck in hPa bei NN
                                          var p = pnn - (hunn / 8.0); // individueller Luftdruck in hPa (eigenen Höhe)
                                          return p / 1000; // Luftdruck von hPa in bar umrechnen
                                          }
                                          ! function cob(boolean) { // Color Boolean (farbige ausgabe Boolean als String)
                                          var cobStr = (boolean) ? 'true' : 'false';
                                          return cobStr;
                                          }
                                          ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
                                          ! var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
                                          var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
                                          ! t = makeNumber(t);
                                          rh = makeNumber(rh);
                                          ! var toffset = 0.0; // Offset in °C
                                          var rhoffset = 0; // Offset in %
                                          if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
                                          var idtoffset = pfad + raumPfad+ raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
                                          toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                          }
                                          if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
                                          var idrhoffset = pfad + raumPfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
                                          rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
                                          }
                                          ! t = t + toffset;
                                          rh = rh + rhoffset;
                                          ! var y = xdp.Calc(t, rh);
                                          var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
                                          var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
                                          ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x; // Enthalpie berechnen
                                          ! var idx = pfad + raumPfad + raum + "." + raumDatenpunkte["x"].DpName;
                                          var iddp = pfad + raumPfad + raum + "." + raumDatenpunkte["dp"].DpName;
                                          var idt = pfad + raumPfad + raum + "." + raumDatenpunkte["t"].DpName;
                                          var idrh = pfad + raumPfad + raum + "." + raumDatenpunkte["rh"].DpName;
                                          var ih = pfad + raumPfad + raum + "." + raumDatenpunkte["h"].DpName;
                                          ! setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben
                                          setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben
                                          setState(idt , t); // Sensor Temperatur inkl. Offset
                                          setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset
                                          setState(ih , runden(h,2)); // Enthalpie
                                          ! // Lüftungsempfehlung berechnen
                                          // -------------------------------------------------------------------------
                                          var aussen;
                                          var idta, idxa;
                                          if(typeof raeume[raum].Aussensensor !=="undefined") {
                                          aussen = raeume[raum].Aussensensor; // aussen = "Raumname" des zugehörigen Aussensensors
                                          idta = pfad + raumPfad + aussen + "." + raumDatenpunkte["t"].DpName;
                                          //var idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["rh"].DpName;
                                          idxa = pfad + raumPfad + aussen + "." + raumDatenpunkte["x"].DpName;
                                          } else {
                                          return;
                                          }
                                          ! var ti = t; // Raumtemperatur in °C
                                          //var xi = rh; // Raumfeuchtegehalt in g/kg
                                          var xi = runden(x,2); // Raumfeuchtegehalt in g/kg
                                          var ta = getState(idta).val; // Aussentemperatur in °C
                                          var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
                                          if (xa == 0) return;
                                          ! var mi = defaultTemp; // Temperaturmittelwert auf Default
                                          ! //if(typeof raeume[raum].TEMP_Zielwert !=="undefined") {
                                          if(typeof raeume[raum].TEMP_Zielwert == "number") {
                                          mi = raeume[raum].TEMP_Zielwert;
                                          }
                                          var mih = mi + 0.25; // Temperaturmittelwert hoch
                                          var mit = mi - 0.25; // Temperaturmittelwert tief
                                          ! var idLueften = pfad + raumPfad + raum + "." + raumDatenpunkte["lüften"].DpName;
                                          ! // Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese
                                          // (bedingung ? then-ausdruck : else-ausdruck)
                                          var b1lp = (xa <= (xi - 0.4)) ? true : false; // Bedingnung 1 lüften positv (Außenluft ist mind. 0,4 trockener als Innen)
                                          var b2lp = (ta <= (ti - 0.6)) ? true : false; // Bedingnung 2 lüften positv (Außentemperatur ist mindestens 0,6 Grad kühler als innen)
                                          var b3lp = (ti >= mih) ? true : false; // Bedingnung 3 lüften positv (Innentemperatur ist höher als die Zieltemperatur)

                                          var b1ln = (xa >= (xi - 0.1))   ? true : false;   // Bedingnung 1 lüften negativ (Außenluft ist zu feucht)
                                          var b2ln = (ta >= (ti - 0.1))   ? true : false;   // Bedingnung 2 lüften negativ (Außentemperatur zu warm)
                                          var b3ln = (ti <= mit)          ? true : false;   // Bedingnung 3 lüften negativ (Innentemperatur niedriger als Zieltemperatur)
                                          
                                          if (b1lp && b2lp && b3lp) {
                                              setState(idLueften, true);
                                              if (debug) log(raum + ': **Lüftungsempfehlung**');
                                          

                                          ! } else if (b1ln || b2ln || b3ln) {
                                          setState(idLueften, false);
                                          if (debug) log(raum + ': Empfehlung Fenster zu');
                                          }
                                          else if (debug) log(raum + ': im Bereich der Hysterese (keine Änderung der Lüftungsempfehlung');
                                          ! // lüften (und - Alle Bedingungen müssen erfüllt sein):
                                          // #1 - Außenluft ist mind. 0,4 trockener als Innen
                                          // #2 - Außentemperatur ist mindestens 0,6 Grad kühler als innen
                                          // #3 - Innentemperatur ist höher als die Zieltemperatur
                                          ! // nicht lüften (oder):
                                          // #1 - Außenluft ist zu feucht
                                          // #2 - Außentemperatur zu warm
                                          // #3 - Innentemperatur niedriger als Zieltemperatur
                                          ! if (debug) log(raum + ": Außenluft ist zu feucht (b3ln): " + cob(b3ln));
                                          if (debug) log(raum + ": Außentemperatur zu warm (b2ln): " + cob(b2ln));
                                          if (debug) log(raum + ": Außenluft ist zu feucht (b1ln): " + cob(b1ln) + ": xa: " + xa + " >= (xi - 0.1) " + (xi - 0.1));
                                          if (debug) log(raum + ": Fenster zu (ein true reicht):");

                                          //if (debug) log(raum + ": b1lp: " + b1lp+ ", b2lp: " + b2lp+ ", b3lp: " + b3lp);
                                          if (debug) log(raum + ": Innentemperatur ist höher als die Zieltemperatur (b3lp): " + cob(b3lp));
                                          if (debug) log(raum + ": Außentemperatur ist mindestens 0,6 Grad kühler als innen (b2lp): " + cob(b2lp));
                                          if (debug) log(raum + ": Außenluft ist mind. 0,4° trockener als Innen (b1lp): " + cob(b1lp) + ": xa: " + xa + " <= (xi - 0.4) " + (xi - 0.4));
                                          if (debug) log(raum + ": Lüftungsempfehlung (alle Bedingungen auf true):");
                                          

                                          ! if (debug) log(raum + ", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"info");
                                          if (debug) log("------ " + raum + " ------- Aussensensor: " + aussen + " -----------");
                                          }
                                          ! function calcDelayed(raum, delay) {
                                          setTimeout(function () {
                                          calc(raum);
                                          }, delay || 0);
                                          }
                                          ! function calcAll() {
                                          for (var raum in raeume) {
                                          //calc(raum);
                                          calcDelayed(raum,200);
                                          }
                                          }
                                          ! function makeNumber(wert) {
                                          if(isNaN(wert)) {
                                          wert = parseFloat(wert.match(/\d+[.|,]?\d+/g));
                                          }
                                          return wert;
                                          }
                                          ! /*
                                          on({id: idSensorTemperaturBad ,change:'ne'}, function (obj) {
                                          calc();
                                          });
                                          ! on({id: idSensorLuftfeuchteBad ,change:'ne'}, function (obj) {
                                          calc();
                                          });
                                          /
                                          ! // alle zwei Minuten neu berechnen
                                          schedule("
                                          /2 * * * *", function () {
                                          calcAll();
                                          });
                                          ! function main() {
                                          calcAll();
                                          //calcAll();
                                          }
                                          ! createDp(); // Datenpunkte anlegen
                                          setTimeout(main, 1500); // Zum Skriptstart ausführen
                                          ! ```` `

                                          habe mir das Script mal eingebunden - sieht gut aus (JSON-Ausgabe kommt dann später - baue ich dann ein, wenn's recht ist).

                                          Aber, eine Sache bei der Lüftungsempfehlung habe ich noch gesehen:

                                          Wenn es keine Veränderung der LE gibt, bleibt die Variable, wie sie ist ==> am Anfang also NULL, was dann auch so im Objekt angezeigt wird ("null").

                                          Ggf. sollte man den Datenpunkt "Lüftungsempfehlung" mit "false" vorbelegen.

                                          Ich baue das mal für mich ein und teste ein wenig.

                                          Gruß,

                                          Eric

                                          Roses are red, violets are blue,

                                          if I listen to metal, my neighbours do too

                                          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

                                          670

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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