Ankündigung

Einklappen
Keine Ankündigung bisher.

Lüftungsmanagement (lohnt sich Lüften)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Interessnt, was hast denn für schwellenwerte genommen? Kannst mal deine config posten? Danke

    Kommentar


      #17
      Also, der Aussensensor ist bei mir ein IPWE von ELV:

      Code:
      /* DOTALL is active for Regex => . is also a wild char for line feeds (\n) */
      Number IPWETemp     "Temperatur: [%.1f °C]"     <temperature>   (IPWE)   { http="<[ipweCache:300000:REGEX(.*?Kombi.*?<td.*td>.*?<td.*td>.*?<td.*>\\s*?(-?\\d.*) .C.*)]" }
      Number IPWEDewPoint    "Taupunkt: [%.1f °C]"                    <temperature>   (IPWE)
      Number IPWEHumidity "Luftfeuchtigkeit: [%s %%]" <humidity_rel>  (IPWE)   { http="<[ipweCache:300000:REGEX(.*?Kombi.*?<td.*td>.*?<td.*td>.*?<td.*td>.*?<td.*>\\s*?(\\d.*) %.*)]" }
      Number IPWEHumidityAbs "Luftfeuchtigkeit Abs: [%.1f g/m³]"      <humidity_rel>  (IPWE)
      Number IPWEWind     "Windstärke: [%.1f km\\h]"  <wind>          (IPWE)   { http="<[ipweCache:120000:REGEX(.*?Kombi.*?<td.*td>.*?<td.*td>.*?<td.*td>.*?<td.*td>.*?<td.*>\\s*?(\\d.*) km.*)]" }
      Meine Innensensoren sind Enocean:

      Code:
      Number EO_01811E6C_Temperature  "01811E6C Temperatur [%.1f °C]"         <temperature>  (Enocean)    {aleoncean="REMOTEID=01:81:1E:6C,TYPE=RD_A5-04-01,PARAMETER=TEMPERATURE_CELSIUS"}
      Number EO_01811E6C_DewPoint     "01811E6C Taupunkt [%.1f °C]"           <temperature>  (Enocean)
      Number EO_01811E6C_Humidity     "01811E6C Humidity [%.1f %%]"           <humidity_rel> (Enocean)    {aleoncean="REMOTEID=01:81:1E:6C,TYPE=RD_A5-04-01,PARAMETER=HUMIDITY_PERCENT"}
      Number EO_01811E6C_HumidityAbs  "01811E6C Humidity Abs [%.1f g/m³]"     <humidity_rel> (Enocean)
      DateTime EO_01811E6C_LastUpdate "01811E6C [%1$ta %1$tR]"                <clock>        (Enocean)
      String EO_01811E6C_Lueftungseff "0180FE98 Lüftungseffektivität [%s]"    <contact>      (Enocean)
      Dann brauchts noch eine Rule, die alles berechnet und die absolute Feuchtigkeit aussen mir der innen vergleicht:

      Code:
      rule "Calculate absolute humidity and dew point for 01811E6C"
              when
                      Item EO_01811E6C_Temperature changed or
                      Item EO_01811E6C_Humidity changed
              then
                      // Absolute Humidity
                      // dv = 216.7*(RH/100.0*6.112*exp(17.62*t/(243.12+t))/ (273.15+t));
      
                      // Dew Point
                      // H = (log10(RH)-2.0)/0.4343+(17.62*t)/(243.12+t);
                      // td = 243.12*H/(17.62-H);
      
                      var Number  t = EO_01811E6C_Temperature.state as DecimalType
                      var Number RH = EO_01811E6C_Humidity.state as DecimalType
                      var Number dv = 0
                      dv = 216.7 * (RH / 100.0 * 6.112 * Math::exp((17.62 * t / (243.12+t)).doubleValue) / (273.15 + t ))
                      postUpdate(EO_01811E6C_HumidityAbs, (dv))
      
                      var Number  H = 0
                      var Number td = 0
                      H = (Math::log10(RH.doubleValue) - 2.0) / 0.4343 + (17.62 * t) / (243.12 + t)
                      td = 243.12 * H / (17.62 - H)
                      postUpdate(EO_01811E6C_DewPoint, (td))
                      // Last Update:
                      postUpdate(EO_01811E6C_LastUpdate, new DateTimeType())
      
                      // Lueftungseffektivität ermitteln
                      var String effectivity = "keine"
                      if (dv > IPWEHumidityAbs.state && dv <= 1.3 * IPWEHumidityAbs.state) {
                                 effectivity = "mäßig"
                      }  else if (dv > 1.3 * IPWEHumidityAbs.state && dv <= 1.5 * IPWEHumidityAbs.state) {
                                 effectivity = "mittel"
                      } else {
                                 effectivity = "hoch"
                      }
                      postUpdate(EO_01811E6C_Lueftungseff, effectivity)
      end
      Mit den Schwellwerten muss ich noch Erfahrung sammeln, die sind aber schon ganz brauchbar.

      Schöne Grüße,
      thoern

      Kommentar


        #18
        Hi Thomas,

        gut Idee, werde ich auch so einführen, allerdings mit dem Taupunkt, da aktuell noch keine Feuchtemessung bei mir im Keller möglich ist ...
        Wahrscheinlich hast Du es schon selbst gesehen:
        Code:
        if (dv > IPWEHumidityAbs.state && dv <= 1.3 * IPWEHumidityAbs.state) {
                                    effectivity = "mäßig")                 
        }  else if (dv > 1.3 * IPWEHumidityAbs.state && dv <= 1.5 * IPWEHumidityAbs.state) {
                                    effectivity = "mittel")                
        } else {
                                    effectivity = "hoch")                 }
        Du hast da schließende Klammern an mäßig/mittel/hoch. Vermutlich sind die zuviel, oder?

        Gruß Staehler

        Kommentar


          #19
          Zitat von staehler Beitrag anzeigen
          Du hast da schließende Klammern an mäßig/mittel/hoch. Vermutlich sind die zuviel, oder?

          Gruß Staehler
          Danke für den Hinweis. Die waren tatsächlich zuviel. Seltsam, die Rule hat trotzdem einwandfrei funktioniert. Ich habe zum Schreiben der Rule den vi verwendet, im Designer wäre es vermutlich aufgefallen.

          Update: Habe gleich den Post 17 mit dem korrigierten Code aktualisiert

          Danke nochmals und Gruß,
          Thomas

          Kommentar


            #20
            Hi zusammen,

            mittlerweile funktioniert mein Lüftungsmanagement richtig gut und ich habe auf einen Blick eine Übersicht. Optimal wäre nun noch via Notifymyandroid oder email mit mitzuteilen wenn sich die "Lüftungssituation" ändert.

            Ich hatte probiert mit einer Rule das zu machen die immer aufgerufen wird wenn sich die "Lüften-günstig-Variable" ändert, das funktioniert auch, allerdings wird in der Berechnung die Variable immer wieder neu gesetzt was openhab als änderung interpretiert und die Rule ausführt (mit entsprechender Benachrichtigung) - also etwas viel des guten.

            Ich möchte nun vergleichen ob sich seit dem letzten mal tatsächlich eine Änderung ergeben hat. Ich habe mit dazu eine Hilfsvariable angelegt aber irgendwie bekomme ich das nicht hin, dass der Vergleich des "Lüften-Günstig-Schalters" mit der Hilfsvariable klappt.

            Code:
            var org.openhab.core.types.State Schlafzimmer_lueften_alt
            if (Schlafzimmer_lueften.state == Schlafzimmer_lueften_alt)
            Was mache ich falsch?
            Gibt es da noch eine elegantere Lösung!?

            Danke schon mal!

            Gruß
            MM

            Kommentar


              #21
              Versuchs mal damit:
              Code:
                  var String effectivity
                  if (td_in <= td_out && Lueftungseffektivitaet.state != "keine") {
                      effectivity = "keine"
                      sendNotification("emailadresse", "Kellerfenster schließen, Lüftungseffizienz ist schlecht.")
                      if (TVWohnzimmerSchalten.state==ON) sendXbmcNotification("ipadresse",3005,"Hinweis","Kellerfenster schließen, Lüftungseffizienz ist schlecht.")
                      postUpdate(Lueftungseffektivitaet, effectivity)
                  } else if (td_in > td_out && td_in-1 <= td_out && Lueftungseffektivitaet.state != "mäßig") {
                      effectivity = "mäßig"
                      postUpdate(Lueftungseffektivitaet, effectivity)
                  } else if (td_in-1 > td_out && td_in-2 <= td_out && Lueftungseffektivitaet.state != "mittel") {
                      effectivity = "mittel"
                      sendNotification("emailadresse", "Keller Lüftungseffektivität: mittel")
                      if (TVWohnzimmerSchalten.state==ON) sendXbmcNotification("ipadresse",3005,"Hinweis","Keller lüften, Lüftungseffizienz ist mittel.")
                      postUpdate(Lueftungseffektivitaet, effectivity)
                  } else if (td_in-3 > td_out && Lueftungseffektivitaet.state != "hoch") {
                      effectivity = "hoch"
                      sendNotification("emailadresse", "Keller Lüftungseffektivität: hoch")
                      if (TVWohnzimmerSchalten.state==ON) sendXbmcNotification("ipadresse",3005,"Hinweis","Keller lüften, Lüftungseffizienz ist hoch.")
                      postUpdate(Lueftungseffektivitaet, effectivity)               
                  }
              Ich merke mir den Status (effectivity) in der Variable Lueftungseffektivitaetund nur wenn die sich ändert (z.B. Lueftungseffektivitaet.state != "hoch") wird eine Meldung erzeugt.

              Kommentar


                #22
                Lüftungsmanagement mit EibPort

                Hallo und einen guten Start ins neue Jahr !

                ich stehe gerade vor der gleichen Aufgabe "Lüftungsmanagement für den Keller".
                Die aufgezeigte Lösung mit der Berechnung und dem Vergleich der absoluten Luftfeuchtigkeit für innen und außen sollte auch bei mir sehr gut passen.
                Hat jemand dies schon auf einem Eibport umgesetzt ? Ist der 'Mathe-Job' hierfür geeignet ?

                Danke und Gruß
                Burkhard

                Kommentar


                  #23
                  Hi Burkhard,

                  Zitat von bwknx Beitrag anzeigen
                  Hat jemand dies schon auf einem Eibport umgesetzt ? Ist der 'Mathe-Job' hierfür geeignet ?
                  in diesem (Unter)Forum wirst Du vermutlich wenige User finden, die den Eibport nutzen. Du solltest sie vielleicht lieber im "großen" Forum stellen. Da kannst Du natürlich gerne auf diesen Thread verweisen …

                  Gruß,

                  Thomas E.-E.
                  Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                  Kommentar


                    #24
                    Thema für Hauptforum

                    Hi Thomas,

                    Danke für Deinen Hinweis.
                    Ich bin über die Sufu auf diesen sehr interessanten Thread gestoßen, ohne vor dem antworten auf das Unterforum zu achten.

                    Burkhard

                    Kommentar


                      #25
                      ist ja auch kein Problem … wollte nur die Erwartungshaltung "justieren" ;-)
                      Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                      Kommentar


                        #26
                        Vielen Dank für dieses Beispiel, ich konnte es gut übernehmen. Aber wie schaffe ich, dass ein Item, das ich dann auf Openhab darstellen kann je nach Feuchtigkeitsstatus einen Wert zugewiesen bekommt? Da Item bleibt bei mir immer nur ein - Bindestrich.

                        Rule:
                        Code:
                        import org.openhab.core.persistence.*
                        import org.openhab.core.library.*
                        import org.openhab.core.items.*
                        import org.openhab.core.library.types.*
                        import org.openhab.model.script.actions.*
                        import org.joda.time.*
                        import java.lang.Math.*
                        
                        
                        rule "Luftfeuchte"
                            when
                             Item KG_Temp changed or
                             Item KG_Feuchte changed or
                             Item Netatmo_Outdoor_Temperature changed or
                             Item Netatmo_Outdoor_Humidity changed or
                             System started
                           then
                            // Variablen
                            var Number temp_in = KG_Temp.state as DecimalType        //Innentemperatur in Grad Celsius
                            var Number temp_out = Netatmo_Outdoor_Temperature.state as DecimalType                //Außentemperatur in Grad Celsius
                        
                            var Number abs_hum_in = 0
                            var Number abs_hum_out = 0
                            var Number td_in = 0
                            var Number td_out = 0
                            
                            var Number rel_hum_in = KG_Feuchte.state as DecimalType            //relative Feuchte Innen
                            var Number rel_hum_out = Netatmo_Outdoor_Humidity.state as DecimalType            //relative Feuchte Außen
                            
                                // Konstanten
                            val gas_const = 8314.3
                            val mol = 18.016
                            var Number ab = 0
                            var Number sdd = 0
                            var Number dd = 0
                            var Number v = 0
                            var Number a_out = 0
                            var Number b_out = 0
                            
                            // Parameter a, b
                            // wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
                            // wenn T<0:  a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
                        
                            val a_in=7.5
                            val b_in=237.3        
                            if (temp_out >= 0) {
                                a_out=7.5
                                b_out=237.3    
                            } else {
                                a_out=7.6
                                b_out=240.7        
                            }
                            
                            // Formeln
                            // Sättingungsdampfdruck:    SDD = 6.1078 * 10^((a*temp)/(b+temp))
                            // Dampfdruck:                DD = rel_hum * 100 / SDD
                            // Absolute Feuchte:        AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
                            // Taupunkt:                TD = b*v/(a-v) mit v = log10(DD / 6.1078)
                            
                            // absolute Innenfeuchte
                            ab = ((a_in * temp_in) / (b_in + temp_in)).doubleValue()
                            sdd = 6.1078 * Math::pow(10, ((a_in * temp_in) / (b_in + temp_in)).doubleValue())
                            dd = rel_hum_in / 100 * sdd
                            v = Math::log10((dd/6.1078).doubleValue())
                            abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd / (temp_in + 273.15)
                            
                            // absolute Außenfeuchte
                            ab = ((a_out * temp_out) / (b_out + temp_out)).doubleValue()
                            sdd = 6.1078 * Math::pow(10, ((a_out * temp_out) / (b_out + temp_out)).doubleValue())
                            dd = rel_hum_out / 100 * sdd
                            v = Math::log10((dd/6.1078).doubleValue())
                            abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd / (temp_out + 273.15)
                        
                            logInfo("Luftfeuchte", "Abs. Luftfeuchte - in: " + abs_hum_in + " g/m3, out: " + abs_hum_out + " g/m3")
                        
                            if (abs_hum_in > abs_hum_out) // && (Kellerlueftung.state == OPEN) //wenn innen feuchter als außen, dann lüften
                               
                            {
                             // lüften, Fenster öffnen
                                logInfo("Luftfeuchte", "Keller lüften")
                            //sendCommand(Kellerlueftung, CLOSED)
                            postUpdate(Kellerlueftung,"CLOSED")
                         
                            } else if ((abs_hum_in <= abs_hum_out) // && (Kellerlueftung.state == CLOSED)
                             {
                                // nicht lüften, Fenster schließen
                                logInfo("Luftfeuchte", "Kellerfenster schließen")
                            // sendCommand(Kellerlueftung, OPEN)
                            postUpdate(Kellerlueftung,"OPEN")    
                            }
                        
                            
                        end
                        Sowohl sendCommand als auch postUpdate scheinen keine Änderung zu bewirken. Das Item habe ich so konfiguriert.

                        Item:
                        Code:
                        //Lüftung
                        String Kellerlueftung "Lüftungseffektivität [%s]"    <contact>

                        Kommentar


                          #27
                          Ich würde mal auf

                          postUpdate (Kellerlueftung.state, "OPEN") tippen.

                          Das ".state" sehe ich in deinem Code nicht.

                          Grüße
                          Mitch

                          Kommentar


                            #28
                            Nein, die korrekte Zuweisung muss so aussehen:
                            Code:
                            postUpdate (Kellerlueftung, OPEN)
                            wahlweise auch
                            Code:
                            Kellerlueftung.postUpdate(OPEN)
                            Begründung: Bei der ersten Variante wird eine Action aufgerufen, vor dem Komma wird das Item übergeben, welches manipuliert werden soll, hinter dem Komma der zuzuweisende State. Bei der zweiten Variante wird das Item als Objekt betrachtet und dementsprechend die vorhandene Methode verwendet, um den State zuzuweisen. Die beiden Varianten sollten sich weitgehend identisch verhalten und tun dies meist auch, die zweite Variante ist aber vollständiger implementiert, oder anders ausgedrückt: es gibt da weniger Ärger. Im vorliegenden Fall werden aber beide Varianten funktionieren, so org.openhab.model.script.actions.* auch importiert sind.

                            Der eigentlich springende Punkt ist aber, dass in diesem Fall kein "String" zugewiesen werden darf, sondern zwingend ein STATE, der auch zwingend ohne Anführungszeichen angegeben werden muss!
                            Zuletzt geändert von udo1toni; 29.01.2016, 19:35.

                            Kommentar


                              #29
                              Vielen Dank, funktioniert....

                              Kommentar

                              Lädt...
                              X