Interessnt, was hast denn für schwellenwerte genommen? Kannst mal deine config posten? Danke
Ankündigung
Einklappen
Keine Ankündigung bisher.
Lüftungsmanagement (lohnt sich Lüften)
Einklappen
X
-
Also, der Aussensensor ist bei mir ein IPWE von ELV:
Meine Innensensoren sind Enocean: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.*)]" }
Dann brauchts noch eine Rule, die alles berechnet und die absolute Feuchtigkeit aussen mir der innen vergleicht: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)
Mit den Schwellwerten muss ich noch Erfahrung sammeln, die sind aber schon ganz brauchbar.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
Schöne Grüße,
thoern
Kommentar
-
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:
Du hast da schließende Klammern an mäßig/mittel/hoch. Vermutlich sind die zuviel, oder?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") }
Gruß Staehler
Kommentar
-
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.Zitat von staehler Beitrag anzeigenDu hast da schließende Klammern an mäßig/mittel/hoch. Vermutlich sind die zuviel, oder?
Gruß Staehler
Update: Habe gleich den Post 17 mit dem korrigierten Code aktualisiert
Danke nochmals und Gruß,
Thomas
Kommentar
-
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.
Was mache ich falsch?Code:var org.openhab.core.types.State Schlafzimmer_lueften_alt if (Schlafzimmer_lueften.state == Schlafzimmer_lueften_alt)
Gibt es da noch eine elegantere Lösung!?
Danke schon mal!
Gruß
MM
Kommentar
-
Versuchs mal damit:
Ich merke mir den Status (effectivity) in der Variable Lueftungseffektivitaetund nur wenn die sich ändert (z.B. Lueftungseffektivitaet.state != "hoch") wird eine Meldung erzeugt.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) }
Kommentar
-
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
-
Hi Burkhard,
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 …Zitat von bwknx Beitrag anzeigenHat jemand dies schon auf einem Eibport umgesetzt ? Ist der 'Mathe-Job' hierfür geeignet ?
Gruß,
Thomas E.-E.Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)
Kommentar
-
ist ja auch kein Problem … wollte nur die Erwartungshaltung "justieren" ;-)Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)
Kommentar
-
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:Sowohl sendCommand als auch postUpdate scheinen keine Änderung zu bewirken. Das Item habe ich so konfiguriert.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
Item:
Code://Lüftung String Kellerlueftung "Lüftungseffektivität [%s]" <contact>
Kommentar
-
Nein, die korrekte Zuweisung muss so aussehen:wahlweise auchCode:postUpdate (Kellerlueftung, 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.Code:Kellerlueftung.postUpdate(OPEN)
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.
- Likes 1
Kommentar


Kommentar