Kategorien
Haustechnik

openHAB: Lüftungsanlage anhand des CO2 Wertes steuern

In diesem Beitrag wird erklärt, wie ihr mit openHAB eine Lüftungsanlage anhand des CO2 Wertes steuert. Ich verwende als Hardware die Maico Push/Pull 45 Lüftungsanlage und einen Netatmo CO2 Sensor, das Vorgehen lässt sich aber auch auf andere Systeme übertragen.

Version

Zum Zeitpunkt des Erscheinens dieses Artikels ist die Version openHAB 3.0.1 aktuell. Solltet ihr das hier später lesen, hat sich vielleicht schon mit einer neuen Version etwas geändert. Hinterlasst einfach einen Kommentar, ich aktualisiere die Anleitung dann.

Verwendetes Material / Lizenzen

  • Lüftungsgeräte Maico PushPull 45 RC (z.B. bei flachkanalmarkt.de ca. 480 EUR)
  • Homematic CCU3 (z.B. bei amazon.de, ca. 140 EUR)
    • EnOcean USB 300 Gateway (z.B. bei amazon.de, ca. 57 EUR)
    • CUxD EnOcean Lizenz (von piotek.de, ca. 40 EUR)
  • Netatmo Wetterstation (z.B. bei amazon.de, ca. 155 EUR)
    • ggf. zusätzliches Innenmodul für die Station (z.B. bei amazon.de, ca. 65 EUR)
  • Raspberry Pi für openHAB (z.B. der Raspberry Pi 4 mit 4GB RAM bei amazon.de als Komplettkit, ca. 95 EUR. Die 8GB RAM Version macht aktuell noch Probleme und wird nicht empfohlen).
    • Eine für den Raspberry Pi geeignete microSD Karte, am besten mit 16GB oder mehr Speicher. Alleine 2020 habe ich 5 günstige Karten wegen Schreib-/ Lesefehlern verloren und verwende nun nur noch die Samsung PRO Endurance 64GB (z.B. bei amazon.de, ca. 14 EUR).
    • Kartenleser für die microSD Karte (z.B. Transcend TS-RDF9K2 bei amazon.de, ca. 14 EUR).

Wie gesagt, es funktioniert auch analog mit anderen Lüftungsgeräten, die eine Anbindung an openHAB haben oder ohne Homematic mit direkter Anbindung des Maico Gerätes an openHAB. Oder mit anderen CO2 Sensoren. Oder oder oder.

Vorbedingungen

Voraussetzung ist, dass die Lüftungsanlage und der CO2 Sensor bereits in openHAB erreichbar ist. In meinem Fall habe ich die Lüftungsanlage über die Homematic CCU3 eingebunden, was einfach daran liegt, dass ich Homematic schon länger verwende als openHAB. Die Einrichtung dort ist alles andere als trivial und ich habe sie auch hier in einem eigenen Artikel beschrieben. Homematic wiederum ist dann über das Homematic Binding an openHAB angebunden. Die Netatmo Sensoren sind direkt in openHAB mit dem entsprechenden Binding angebunden.

Items

Für die Steuerung der Anlage stehen bei mir daher folgende Items zur Verfügung.

Lüftungsanlage:

 Group    e_EG_Buero_Lueftung                     "Lüftungsanlage"                (r_EG_Buero)                ["Fan"]
 Number    EG_Buero_Lueftung_Stufe_Ist             "Aktuelle Stufe [%d]"           (e_EG_Buero_Lueftung)       ["Measurement"]     { channel="homematic:GATEWAY-EXTRAS-CCU3:ccu3:GWE00000000:1#Lueftung-BueroSchlafzimmer-Ist" }
 Number    EG_Buero_Lueftung_Stufe_Soll            "Eingestellte Stufe [%d]"       (e_EG_Buero_Lueftung)       ["Control"]         { channel="homematic:GATEWAY-EXTRAS-CCU3:ccu3:GWE00000000:1#Lueftung-BueroSchlafzimmer-Soll" }
 Dimmer    EG_Buero_Lueftung_Stufe_Soll_Prozent    "Eingestellte Stufe [%d %%]"                                                    { ga="Fan" [ name="Büro Lüfter", speeds="0=aus:null,20=eins,40=default:zwei,60=drei,80=vier,100=maximal:fuenf", lang="de", ordered=true ] }
 Switch    EG_Buero_Lueftung_Automatik             "Automatikmodus (CO2)"          (e_EG_Buero_Lueftung)       ["Switch"]

Netatmo:

 Group                    e_EG_Buero_Netatmo                                  "Netatmo"                                  (r_EG_Buero)                                                    ["Sensor"]
 Number:Dimensionless    EG_Buero_Netatmo_CO2                                "CO2 Gehalt [%.0f ppm]"                        (e_EG_Buero_Netatmo, u_Persist_Change)                          ["Measurement", "CO2"]          { channel="netatmo:NAModule4:api:*****:Co2" }
 Number:Temperature        EG_Buero_Netatmo_Temperatur                         "Temperatur [%.1f °C]"                     (e_EG_Buero_Netatmo, u_Persist_Change)                          ["Measurement", "Temperature"]  { channel="netatmo:NAModule4:api:*****:Temperature" }
 Number:Dimensionless    EG_Buero_Netatmo_Luftfeuchtigkeit                   "Luftfeuchtigkeit [%.0f rF]"                  (e_EG_Buero_Netatmo, u_Persist_Change)                          ["Measurement", "Humidity"]     { channel="netatmo:NAModule4:api:*****:Humidity" }

Wichtig zur Steuerung sind hier nur EG_Buero_Lueftung_Stufe_Soll, EG_Buero_Lueftung_Automatik und EG_Buero_Netatmo_CO2. Die anderen habe ich nur zur Vollständigkeit mit aufgeführt.

Regeln

Bei einem kleinen Brainstorming ist für mich die folgende Logik als erster Versuch herausgekommen. Ich stelle mir die Steuerung der Lüftung so vor:

  • Wenn das Fenster im Büro zu ist und der Schlafmodus deaktiviert (die Anlage ist mit dem Schlafzimmer gekoppelt und leider recht laut), dann läuft die Anlage im Automatikbetrieb. Andernfalls ist sie ausgeschaltet.
  • Wenn sie im Automatikbetrieb läuft, wird alle 5 Minuten (also um :00, :05, :10, …) der CO2 Wert geprüft.
  • Wenn der Wert über 900 ist, wird die Lüftungsstufe erhöht, maximal aber auf Stufe 4 (das ist eine gerade noch erträgliche Lautstärke tagsüber).
  • Wenn der Wert unter 700 ist wird eine Stufe abgesenkt, minimal aber auf Stufe 1 (das komplette Ausschalten macht ein recht lautes Geräusch da die Luftzufuhr dann abgesperrt wird, daher die “1” als Mindestlevel).

In openHAB habe ich das mit folgenden Regeln umgesetzt:

Aktivieren/Deaktivieren des Automatikmodus

rule "Lüftung - deaktivieren - Büro/Schlafzimmer"

when
  Item EG_Buero_Fenster_Offen changed or
  Item System_Variable_Schlafmodus changed

then
  logDebug("co2", "Führe Regel 'Lüftung (de)aktivieren Büro/Schlafzimmer' aus.")
  if (EG_Buero_Fenster_Offen.state == CLOSED && System_Variable_Schlafmodus.state == OFF) {
    logInfo("co2", "Lüftungsanlage Büro/Schlafzimmer wird in den Automatikmodus geschaltet.")
    EG_Buero_Lueftung_Automatik.sendCommand(ON)
  } else {
    logInfo("co2", "Lüftungsanlage Büro/Schlafzimmer wird ausgeschaltet.")
    EG_Buero_Lueftung_Automatik.sendCommand(OFF)
    EG_Buero_Lueftung_Stufe_Soll.sendCommand(0)
  }
end

Steuerung anhand des aktuellen CO2 Wertes

rule "Lüftung - An CO2 Wert anpassen - Büro/Schlafzimmer"

when 
  Time cron "0 0/5 * * * ?"  // every 5 minutes

then
  logDebug("co2", "Führe Regel 'CO2 Büro/Schlafzimmer' aus.")
  if (EG_Kueche_Lueftung_Automatik.state != ON || EG_Wohnen_Lueftung_Automatik.state != ON) {
    logDebug("co2", "Automatik Modus für Küche/Wohnzimmer deaktiviert. Keine Aktion.")
    return
  }

  val minLevel = 1
  val maxLevel = 4
  val setPointLow = 700
  val setPointHigh = 900
  val currentValue = (EG_Buero_Netatmo_CO2.state as Number).intValue
  val currentLevel = (EG_Buero_Lueftung_Stufe_Soll.state as Number).intValue

  logDebug("co2", "CO2 gehalt aktuell:" + currentValue)
  logDebug("co2", "Zielwert (low):" + setPointLow)
  logDebug("co2", "Zielwert (high):" + setPointHigh)
  if (currentValue < setPointLow) {
    if (currentLevel > minLevel) {
      logDebug("co2", "CO2 Wert unter Zielwert, reduziere Lüftungsstufe.")
      EG_Buero_Lueftung_Stufe_Soll.sendCommand(currentLevel - 1)
    } else {
      logDebug("co2", "CO2 Wert unter Zielwert, Level aber bereits auf Minimum. Keine Aktion.")
    }
  } else if (currentValue > setPointHigh) {
    if (currentLevel < maxLevel) {
      logDebug("co2", "CO2 Wert über Zielwert, erhöhe Lüftungsstufe.")
      EG_Buero_Lueftung_Stufe_Soll.sendCommand(currentLevel + 1)
    } else {
      logDebug("co2", "CO2 Wert über Zielwert, Level aber bereits auf Maximum. Keine Aktion.")
    }
  }
 end

Schlusswort

Ich freue mich über eure Kommentare, ob euch der Beitrag weitergeholfen hat. Schreibt auch gerne, wenn ihr Fragen habt oder doch etwas unklar geblieben ist. Oder wenn ihr aufbauend darauf spannende weitere Automatisierungs-Projekte umsetzen konntet 🙂

Wenn diese Seite für dich hilfreich war und du dich bei mir bedanken möchtest, dann freue ich mich ganz außerordentlich darüber, wenn du für deinen nächsten Einkauf bei amazon.de über diesen Link gehst. Ich bekomme dann eine kleine Provision, für dich kostet es keinen Cent extra. Wenn du mir lieber direkt etwas zukommen lassen möchtest, dann kannst du das hier.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.