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)
- 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 🙂
Freiberuflicher IT Berater, Open Source Entwickler und begeisterter Smarthome Nutzer. Das hier ist mein Braindump für Technikthemen, die mich beschäftigen.
Ich habe vor kurzem meine Lüftungsanlagen optimieren lassen. Jetzt muss ich mal schauen, ob mein CO2-Sensor im openHub erreichbar ist. Ich möchte die Anlage auch anhand der CO2-Werte steuern. Ich werde es einmal ausprobieren.