« Heizung, Lüftung, Klima

Maico WS 320 - Home Assistant Implementierung - Seite 9 teilen

23.10.2022 -6.7.2026    177 Antworten    23 Autoren 177 2026-07-06T17:56:10+02:00    9 Empfehlungen
Zusammenfassung
 1  2 ... 3  4  5  6  7  8  9 
  •  mampfgnom
  •   Bronze-Award
23.10.2022
186
Hallo,
wie bereits in diesem Beitrag ( https://www.energiesparhaus.at/forum-berhans-smarthome-projekt/65520_3#688057 ) angekündigt, möchte ich gerne meine Home Assistant (HA) Implementierung für meine Maico WS 320 vorstellen. Bei mir läuft ein RaspPi mit HA und über die Modbus TCP Schnittstelle lese ich die Maico aus und ändere per Knopfdruck den Betriebsmodus und die Lüfterstufe. Aktuell sieht das ganze wie folgt aus:


2022/20221023215201.jpg

 
Wir sehen in der oberen Grafik die Maico mit ihren 4 Kanälen, 3 Filter und viele Betriebsparameter. Im unteren Bereich befinden sich Buttons zum Wechsel der Betriebsart und zum Einstellen der Lüfterstufe. ACHTUNG - die Buttons schreiben Modbus Register, verwendet die zugehörigen Codeschnipsel auf eigene Verantwortung.
Alle angezeigten Werte werden über Modbus Register ausgelesen und teilweise daraus berechnet (z.B. Wärmerückgewinnung). Das Hintergrundbild hat mir Schorschi81 zur Verfügung gestellt und ich habe es auf meine Anlage angepasst. Die Bilder der drei Filter habe ich per Screenshot von leitwolfs Homepage entnommen, ich hoffe das gibt keine Probleme mit Copyright.

Sensoren

Wie kriegen wir das umgesetzt? Ich gehe davon aus, dass HA läuft und die Maico per LAN mit dem Netzwerk verbunden ist. In die configuration.yaml kommt dann folgendes:

https://drive.google.com/file/d/1v_koLB_hQvF0GdJXUwa2f6-bCt4CeSUx/view?usp=sharing

GUI

Als nächstes erzeugt euch ein neues Dashbord und geht auf „Karte hinzufügen“ --> „Manuell“. Dann fügt ihr folgenden Code ein:

https://drive.google.com/file/d/1vZWlK_PpW5CVA_g5ubIznu-wGzd9C_58/view?usp=sharing

Darin wird auf ein image mit dem Pfad „/local/skizze_kwl.png“ verwiesen. Der Ordner „/local/“ meint den Ordner „www“ in eurem HA /config Pfad. Also da wo eure configuration.yaml liegt, erstellt ihr euch einen Ordner „www“ falls der noch nicht existiert und kopiert dort hin euer Hintergrundbild.
Ich wünsche euch viel Spaß beim Ausprobieren. Sollten Fragen offen bleiben, will ich gerne versuchen sie zu beantworten, aber ich bin selber absoluter Neuling in HA.
 

  •  torsten2k6
25.5.2026  (#161)
Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :) 

1
  •  taliesin
  •   Gold-Award
26.5.2026  (#162)

zitat..
Valen schrieb: Also meine Variante läuft über NodeRed in HA.

Ah wusste nicht, dass das geht, dann semper ich schon nicht mehr.


1
  •  r4id91
27.5.2026  (#163)

zitat..
Schorschi81 schrieb:

Gibts eigentlich eine Liste mit den Hinweis-/Fehlermeldungen? 

Im ipsymcom-forum hat jemand folgendes herrausgefunden:
https://community.symcon.de/t/modbus-vorlage-maico-kwl-320-470-und-andere/138436/2

Sollte sich also mit den Fehler- und Hinweiscodes vom KNX Dokument decken:
https://www.maico-ventilatoren.com/fileadmin/media/service/Downloads/Software/18-12-03-Dokumentation_KNX_Interface_KWL-Steuerung__ab_FW-Version_V1.2.0.pdf

Man muss halt nur Bitweise abfragen.


1
  •  Schorschi81
27.5.2026  (#164)
Also ich habe meine Anlage per Modbus TCP in HA eingebunden und der Hinweis-Code für den "Bypass offen" ist dort 16 und im verlinkten KNX Dokument ist er 5. Passt also nicht ganz zusammen.

1
  •  r4id91
27.5.2026  (#165)
Nun das passt sehr gut zusammen. In den beiden Halb-Worten des Modbus Registers, sind die Fehler und Hinweise bitcodiert. 
Bit5 = Dezimal 16

1
  •  Valen
28.5.2026  (#166)

zitat..
torsten2k6 schrieb:

Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :)

Guten Morgen,

ich hab meine Variante mal hochgeladen

https://github.com/markusrektor-hub/MaicoWS300_HomeAssistant_Steuerung

Bitte gerne Kommentieren und auf Fehler hinweisen.

1
  •  Schorschi81
28.5.2026  (#167)

zitat..
r4id91 schrieb:

Nun das passt sehr gut zusammen. In den beiden Halb-Worten des Modbus Registers, sind die Fehler und Hinweise bitcodiert. 
Bit5 = Dezimal 16

Again what learned. 😄

1
  •  torsten2k6
28.5.2026  (#168)

zitat..
Valen schrieb:

──────..
torsten2k6 schrieb:

Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :)
───────────────

Guten Morgen,

ich hab meine Variante mal hochgeladen

https://github.com/markusrektor-hub/MaicoWS300_HomeAssistant_Steuerung

Bitte gerne Kommentieren und auf Fehler hinweisen.

Vielen Dank, ich werde es probieren. 


1
  •  r4id91
28.5.2026  (#169)
Hallo @mampfgnom
Danke für die Bereitstellung deines Codes. Ich hätte aber noch einige Anmerkrungen:

1.

zitat..
mampfgnom schrieb:

- name: "kwl_t_raumbus"
  unit_of_measurement: °C
  slave: 1
  address: 707
  input_type: holding
  data_type: int16
  precision: 1
  scale: 0.1

Die Stelle ist etwas unsauber, da 707 kein Read Register ist und nur beschrieben werden kann.
Liefert die Maico denn einen sauberen Wert zurück oder steht da auch mal nach einem Neustart "unknown" o.ä. drauf?
Du nimmst diesen Wert ja und schreibst ihn zyklisch zurück.
Ich würde den gewünschten T-Raum-Bus-Wert in HA selbst speichern und einen input_number-Helper verwenden.

---------------------------
2.

zitat..
mampfgnom schrieb:
[ref]mampfgnom:69816_8#880984[/ref]

{{(states('sensor.kwl_t_raumbus') | float(21.0))*10 | int(210)}}
[ref]mampfgnom:69816_8#880984[/ref]{{ ((states('sensor.kwl_t_raum_max') | float) + 1.0)*10 | int(260) }}
[ref]mampfgnom:69816_8#880984[/ref]{{ ((states('sensor.kwl_t_raum_soll') | float) - 1.0)*10 | int(210) }}

Ist nicht sauber, da ungünstig geklammert. Richtig wäre:
{{ ((states('sensor.kwl_t_raumbus') | float(21.0)) * 10) | int }}Der relevante Fallback ist ja schon float(21.0) und nicht int(210)

---------------------------
3.

zitat..
mampfgnom schrieb: alias: kwl_bypass_auto_open
description: ""
trigger:
- platform: time_pattern
hours: /1

Der Öffner läuft jede Stunde. Schließen hast du aber alle 5 Minuten. Das ist asymetrisch, wenn die Innenfeuchte steigt und außen gerade trocken ist, kann es bis zu einer Stunde dauern, bis der Bypass öffnet. Oder ist das eine gezielte Zeithysterese?

---------------------------
4.
In deiner Erklärung sagst du:

zitat..
mampfgnom schrieb: Wir wollen den Bypass natürlich nicht auf immer und ewig schließen. Deswegen prüfen wir zusätzlich die absoluten Feuchten außen und innen. Der Bypass darf nur aufgehen, wenn H_out < H_in! Das ist die wichtigeste Regel! Wenn die relative Feuchtigkeit innen einen akzeptablen Grenzwert übersteigt (zB 55%), dann darf der Bypass öffnen. 

und weiter auch:

zitat..
mampfgnom schrieb: Gerade in den Sommermonaten mit schwülem Klima hat es draußen schnell eine sehr hohe relative Feuchtigkeit. Wenn die Außentemperatur dann leicht unter der Innentemperatur liegt, ist die absolute Feuchtigkeit außen deutlich höher als innen. Der Bypass geht auf und die ganze Feuchtigkeit wandert ungebremst ins Haus.

Im Code hast du das aber Oder verknüpft:

zitat..
mampfgnom schrieb:

- condition: or
   conditions:
      - condition: numeric_state
            entity_id: sensor.aqara_04_humidity_2
            above: 55
      - condition: numeric_state
             entity_id: sensor.kwl_t_ab
             below: sensor.kwl_t_raum_soll
             above: sensor.kwl_t_raum_max

D.h. sobald die Temperaturen passen, wird die relative Feuchtigkeit nicht berücksichtigt.

Weiterhin noch eine Frage. 
Du beschreibst ja 707. Wird da kwl_t_ab auf diesen Wert gesetzt? 
Dann verstehe ich die condition von oben nicht, denn diese besagt ja: 
kwl_t_ab > kwl_t_raum_max
UND
kwl_t_ab < kwl_t_raum_soll
Das ist nur erfüllbar, wenn kwl_t_raum_max kleiner ist als kwl_t_raum_soll
---------------------------
5.
Bei der relativen Feuchte hast du eine Hysterese von 5%. Bei den absoluten Feuchtewerten jedoch nicht.


1
  •  torsten2k6
28.5.2026  (#170)

zitat..
Valen schrieb:

──────..
torsten2k6 schrieb:

Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :)
───────────────

Guten Morgen,

ich hab meine Variante mal hochgeladen

https://github.com/markusrektor-hub/MaicoWS300_HomeAssistant_Steuerung

Bitte gerne Kommentieren und auf Fehler hinweisen.

Wie bekommst du denn die Rest API zum Laufen? Ich habe in dem node "Konfiguration speichern" den Long-living Access Token" hinterlegt und die haURL auf dem "Standard Wert" http://homeassistant.local:8123" belassen, weil bei mir NodeRed als Add-on auf dem HA läuft. Muss ich sonst noch was tun? Ich kriege leider keine Antwort von dem Server / Port


1
  •  r4id91
29.5.2026  (#171)
Der NodeRed Container kann .local /mDNS nicht auflösen. Probier mal die direkte IP Adresse oder besser auf
://supervisor/core setzten.  


1
  •  torsten2k6
31.5.2026  (#172)

zitat..
Valen schrieb:

──────..
torsten2k6 schrieb:

Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :)
───────────────

Guten Morgen,

ich hab meine Variante mal hochgeladen

https://github.com/markusrektor-hub/MaicoWS300_HomeAssistant_Steuerung

Bitte gerne Kommentieren und auf Fehler hinweisen.

Hi Valen, 

bin noch nicht ganz durch und glaube auch, dass es noch nicht 100 % bei mir funktioniert aber 2 Dinge sind mir bisher aufgefallen:

1. In der "maico.yaml" (in der du den Modbus initialisierst) hast du in der Variable "Maico T-Raum max." einen "min. value" und einen max value" definiert. 

        min_value: 180
        max_value: 300

Das ist grundsätzlich kein Problem ABER wenn du mit 

scale= 0.1 dann versuchst die Werte in Celsius umzurechnen (aus 180 wird dann z. B. 18 Grad Celsius) dann bist du AUSSERHALB des min_value und max_value. Somit akzeptiert das Home Assistant nicht und es führt dazu, dass der sensor.maico_t_raum_max immer mindestens 180 anzeigt - das natürlich ein völlig falsche Wert ist. D. h. du musst das min_value und max_value heraus nehmen. Darüber hinaus empfehle ich dir noch das Statement

precision: 1 

zu setzen, ansonsten kriegst du halt nur ganzzahlige Temperaturwert (24 statt 24.2 Grad bei einem Wert von 242 z. B.) was ja auch falsch ist.

2. In deinem Node-Red Flow ist der "STEP 1c: Register 707 — Raumtemperatur" mit keinem Ausgang verbunden. Der sensor.maico_t_raum_bus wird also nie geschrieben. Ich habe dahinter jetzt eine eigene Strecke mit HA RestAPI und REst API Status gehängt. Ich denke so hast du es auch ursprünglich mal geplant (wie man deinem Kommentar entnehmen kann: 

// Verkabelung: Step 1 (Sensordaten) → Step 1c → eigener HTTP Request Node

3. Wie hast du die "Forecasts" in Home Assistant implementiert? Bei mir kommen da aktuell logischerweise keine Daten an. Du liest in deinem Flow ja nur folgendes aus:

var shadingStatus = global.get('shading_status') || {};
var dwdForecast = shadingStatus.forecastTemp || null;
var forecastDetails = flow.get('dwd_forecast_details') || {};

data.forecast = {
    maxTemp:       dwdForecast,
    condition:     forecastDetails.condition || null,
    precipitation: forecastDetails.precipitation || 0,
    cloudCover:    shadingStatus.cloudCover || null,
    source:        dwdForecast ? 'shading_global' : 'none'
};

Ich habe da bei mir jetzt einen Subflow die KI schreiben lassen, die es sich aus der DWD Wetterenität aus  /api/services/weather/get_forecasts

holt. Unter anderem habe ich den Flow bei mir auch so umgeschrieben, dass er alle Räume einbezieht und für die Berechnung der absolute Feuchte und des Taupunkts immer den "schlechtesten" Raum als Referenz nimmt und nicht das Kinderzimmer. Wenn du möchtest, kann ich dir die flows.json auch mal hochladen.


1
  •  Valen
1.6.2026  (#173)

zitat..
torsten2k6 schrieb:

──────..
Valen schrieb:

──────..
torsten2k6 schrieb:

Ja, würde mich freuen wenn du mir da was zur Verfügung stellen könntest. Die Entitäten anpassen kriege ich dann schon noch hin :)
───────────────

Guten Morgen,

ich hab meine Variante mal hochgeladen

https://github.com/markusrektor-hub/MaicoWS300_HomeAssistant_Steuerung

Bitte gerne Kommentieren und auf Fehler hinweisen.
───────────────

Hi Valen, 

bin noch nicht ganz durch und glaube auch, dass es noch nicht 100 % bei mir funktioniert aber 2 Dinge sind mir bisher aufgefallen:

1. In der "maico.yaml" (in der du den Modbus initialisierst) hast du in der Variable "Maico T-Raum max." einen "min. value" und einen max value" definiert. 

        min_value: 180
        max_value: 300

Das ist grundsätzlich kein Problem ABER wenn du mit 

scale= 0.1 dann versuchst die Werte in Celsius umzurechnen (aus 180 wird dann z. B. 18 Grad Celsius) dann bist du AUSSERHALB des min_value und max_value. Somit akzeptiert das Home Assistant nicht und es führt dazu, dass der sensor.maico_t_raum_max immer mindestens 180 anzeigt - das natürlich ein völlig falsche Wert ist. D. h. du musst das min_value und max_value heraus nehmen. Darüber hinaus empfehle ich dir noch das Statement

precision: 1 

zu setzen, ansonsten kriegst du halt nur ganzzahlige Temperaturwert (24 statt 24.2 Grad bei einem Wert von 242 z. B.) was ja auch falsch ist.

2. In deinem Node-Red Flow ist der "STEP 1c: Register 707 — Raumtemperatur" mit keinem Ausgang verbunden. Der sensor.maico_t_raum_bus wird also nie geschrieben. Ich habe dahinter jetzt eine eigene Strecke mit HA RestAPI und REst API Status gehängt. Ich denke so hast du es auch ursprünglich mal geplant (wie man deinem Kommentar entnehmen kann: 

// Verkabelung: Step 1 (Sensordaten) → Step 1c → eigener HTTP Request Node

3. Wie hast du die "Forecasts" in Home Assistant implementiert? Bei mir kommen da aktuell logischerweise keine Daten an. Du liest in deinem Flow ja nur folgendes aus:

var shadingStatus = global.get('shading_status') || {};
var dwdForecast = shadingStatus.forecastTemp || null;
var forecastDetails = flow.get('dwd_forecast_details') || {};

data.forecast = {
    maxTemp:       dwdForecast,
    condition:     forecastDetails.condition || null,
    precipitation: forecastDetails.precipitation || 0,
    cloudCover:    shadingStatus.cloudCover || null,
    source:        dwdForecast ? 'shading_global' : 'none'
};

Ich habe da bei mir jetzt einen Subflow die KI schreiben lassen, die es sich aus der DWD Wetterenität aus 

/api/services/weather/get_forecasts

holt. Unter anderem habe ich den Flow bei mir auch so umgeschrieben, dass er alle Räume einbezieht und für die Berechnung der absolute Feuchte und des Taupunkts immer den "schlechtesten" Raum als Referenz nimmt und nicht das Kinderzimmer. Wenn du möchtest, kann ich dir die flows.json auch mal hochladen.

Hi Torsten2k6,

zu1.) ja danke für den Hinweis die Datei hatte ich so übernomme, ich meine die wäre glaub auch hier mal verlinkt worden. Aber deine Anmerkungen nehme ich gerne auf und passe das auch bei mir an.

zu2.) ja das hatte aus NodeRed bei mir nicht so gut funktioniert daher läuft das aktuell über eine HA-Automation. Damit ich mir das nochmal ansehe hatte ich das als Merker drin gelassen.

zu3.) ich hab einen weiteren Flow für ein Rolladen Verschattungssystem, dort werden die Variablen schon gebildet und hier einfach mitbenutzt. Letztendlich liest er den DWD Forecast aus HA ein zieht aus dem String die Werte rein.

// DWD Daily Forecast (WICHTIG für Tagesprognose!)
let forecastSource = 'Fallback (aktuelle Temp)';
if (msg.dailyForecast && msg.dailyForecast['weather.viersen']) {
    const dailyForecasts = msg.dailyForecast['weather.viersen'].forecast;
    const today = new Date().toISOString().split('T')[0];
    const todayForecast = dailyForecasts.find(f => f.datetime && f.datetime.startsWith(today));
   
    if (todayForecast && todayForecast.temperature) {
        forecastMaxTemp = parseFloat(todayForecast.temperature);
        forecastSource = 'DWD Daily Forecast';
        node.log(`📈 ✅ DWD Tagesprognose: Max ${forecastMaxTemp}°C`);
       
        const forecastMinTemp = parseFloat(todayForecast.templow) || 0;
        const forecastCondition = todayForecast.condition || 'unknown';
        const forecastPrecipitation = parseFloat(todayForecast.precipitation)  || 0;
       
        node.log(`📈 Weitere Prognose: Min ${forecastMinTemp}°C, ${forecastCondition}, Regen ${forecastPrecipitation}mm`);
       
        flow.set('dwd_forecast_details', {
            maxTemp: forecastMaxTemp,
            minTemp: forecastMinTemp,
            condition: forecastCondition,
            precipitation: forecastPrecipitation,
            timestamp: new Date().toISOString()
        });
    } else {
        node.warn('❌ Keine heutige DWD Daily Forecast gefunden');
    }
} else {
    node.warn('❌ Keine DWD Daily Forecast Daten vom Service erhalten');
}





1
  •  theoldphilip
22.6.2026  (#174)
Hallo zusammen,

nur falls es jemand braucht oder interessiert.
ich habe das ganze mal in ein Modul gepackt. Primär für mich, gebt mir aber sehr gerne Feedback. 😉

https://github.com/theoldphilip/homeassistant-maico-kwl

Gruss Philip


1
  •  taliesin
  •   Gold-Award
5.7.2026  (#175)
Ein paar Fragen:
  • sind irgendwelche Register der Maico persistent, d.h. bleiben über einen Reset (Stromausfall) erhalten?
  • Ist das Beschreiben von Register 155 (Volumenstrom Nennlüftung) beliebig erlaubt? Wenn die Maico sich das merken würde, wäre ev. ein Speicherdefekt möglich (ja ich weiß nur wenn es blöd implementiert ist).
  • Wenn auf Nennlüftung gestellt ist, wird dann der Volumenstrom angepasst, wenn man das Register schreibt.
  • ich sehe in @ndecker 's code keinen Ausführungs-code (vielleicht einfach übersehen), speziell die Bypassklappe würde mich interessieren. Eventuell auf der anderen Seite des MQTT brokers?
  • Es wird nirgends auf manuellen Modus geschaltet, vermutlich auch ein Teil, der nicht im Node-RED ist.

Edit, ein paar Sachen dürfte ich jetzt gesehen haben:
  • pushCmd interfaced offensichtlich zum HA und dort werden die Sachen dann auf modbus geschoben?
  • dort steht auch, dass man den Volumenstrom der Nennlüftung schnell ändern darf, steht das auch irgendwo in einer Maico-Doku?


1
  •  taliesin
  •   Gold-Award
6.7.2026  (#176)
Die Sachen beantworte ich jetzt selbst.

Zum persistenten Speichern:
1. die Einstellung (web-UI) bleiben erhalten (logisch)
2. die Lüftungsstufe bleibt erhalten, auch der eingestellte Volumenstrom (r155)

Der Volumenstrom wird angepasst, wenn man r155 schreibt (war zu erwarten)

Die Bypassklappe ist kein Wunderwerk der Technik, sie schließt zwar den Überstromkanal von Ab- auf Fortluft vernünftig (bypass zu), aber schließt den Kanal über den WT nicht vollständig. Da dieser Pfad aber deutlich mehr Widerstand aufweist wird das nur einen geringen Effekt haben. Die Klappenkonstruktion ist halt dämlich, eine rotierende Klappe bei der die Auflage nicht radial angeordnet ist, ist halt Krampf. Eventuell klebe ich noch eine (schräge) Gegendichtung ein. Der Endpunkt wird ja beim Starten ermittelt (Klappe auf und zu).

Die Temperaturfühler in den 4 ports sind ziemlich ungenau, bei externer Regelung könnte man im uneingebauten Zustand (offene Leitungen) eine 'Kalibrierung' durchführen, also entweder zumindest alle auf gleiche Temperatur setzen oder wirklich mit einem eigenen Messgerät zusätzlich messen.

Bei mir gegenüber einer Referenz (ca. +/-0.1K), Taußen +0.1K, Tzuluft -0.7K, Tabluft +0.6K, Tfortluft +0.3K.

Aus meiner Sicht ist daher nicht ganz klar ob man über r155 fein regeln sollte, das Register wird persistent gehalten, es heißt noch nicht, dass das wirklich ein Problem ist, aber es gibt solche Fälle. Das Umstellen der Lüfterstufe wird zwar auch gesichert, aber dort ändern sich die Werte seltener.

Antwortet Maico auf Fragen? Oder braucht man da einen Spezialdraht (@leitwolf)?

1
  •  schaaff
6.7.2026  (#177)

zitat..
theoldphilip schrieb:

Hallo zusammen,

nur falls es jemand braucht oder interessiert.
ich habe das ganze mal in ein Modul gepackt. Primär für mich, gebt mir aber sehr gerne Feedback. 😉

https://github.com/theoldphilip/homeassistant-maico-kwl

Gruss Philip

Lieber Philip, vielen Dank für deine großartige Pioniersarbeit hier! Ich habe mich erstmal durch Docker Updates, HomeAssistant Updates, HACS usw. gequält aber jetzt scheint es installiert. Ich werden mich bei Rückfragen, Feedback oder issues über github melden.
 
Vielen Dank erneut,

Martin


1


Beitrag schreiben / Werbung ausblenden?
Einloggen

 Kostenlos registrieren [Mehr Infos]

Nächstes Thema: Wärmepumpe dimensionieren und Konfiguration entscheiden