Temperaturgefuehrte Steuerung einer Midea PortaSplit
  • Python 90.2%
  • HTML 8.8%
  • Shell 0.8%
  • Dockerfile 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Lyra 81aced5fb1
docker compose build braucht seit dem Profil-Fix einen Dienstnamen
Kehrseite des Fixes zu Issue 2: seit jeder Dienst an einem Profil haengt,
waehlt ein nacktes 'docker compose build' keinen Dienst mehr aus - es baut
nichts und meldet trotzdem Erfolg (No services to build, Exit 0, nur als
Warnung auf stderr). Beim ersten Durchlauf faellt das nicht auf, weil run
und up ein fehlendes Image implizit bauen. Der Schaden entstand beim
Aktualisieren: nach git pull tat 'build' nichts, 'up -d' fand das alte
Image und baute ebenfalls nicht neu - es lief unbemerkt der alte Code
weiter, waehrend beide Befehle Erfolg meldeten (Issue 5, nachgestellt).

Die Anleitung ruft build jetzt ueberall mit Dienstnamen auf - der
aktiviert das zugehoerige Profil von selbst: docker compose build
klimacontrol, dazu klimacontrol-web bzw. klimacontrol-dryrun fuer
Statusseite und Testlauf. Der Kopf der docker-compose.yml nennt den
Fallstrick beim Profil-Kommentar, damit die naechste Aenderung an den
Profilen ihn mitdenkt.

Beide Pakete unveraendert, Repo-Release 0.14.1.
2026-08-22 00:33:53 +00:00
docs docker compose build braucht seit dem Profil-Fix einen Dienstnamen 2026-08-22 00:33:53 +00:00
klimacontrol Befunde aus dem Docker-Testlauf beheben (Issues 1 bis 4) 2026-08-21 22:59:31 +00:00
systemd Projektpruefung 2026-08-13 vollstaendig umgesetzt (klimacontrol 0.8.0, web 0.6.0) 2026-08-13 23:31:54 +02:00
tests Befunde aus dem Docker-Testlauf beheben (Issues 1 bis 4) 2026-08-21 22:59:31 +00:00
web Befunde aus dem Docker-Testlauf beheben (Issues 1 bis 4) 2026-08-21 22:59:31 +00:00
.env.example Projektpruefung 2026-08-13 vollstaendig umgesetzt (klimacontrol 0.8.0, web 0.6.0) 2026-08-13 23:31:54 +02:00
.gitattributes Temperaturgefuehrte Steuerung einer Midea PortaSplit 2026-08-05 20:53:25 +02:00
.gitignore Saisonpause: der Anlagen-Teil laesst sich stilllegen 2026-08-21 17:59:17 +00:00
CHANGELOG.md docker compose build braucht seit dem Profil-Fix einen Dienstnamen 2026-08-22 00:33:53 +00:00
CLAUDE.md Befunde aus dem Docker-Testlauf beheben (Issues 1 bis 4) 2026-08-21 22:59:31 +00:00
config.example.yaml Saisonpause: der Anlagen-Teil laesst sich stilllegen 2026-08-21 17:59:17 +00:00
docker-compose.yml docker compose build braucht seit dem Profil-Fix einen Dienstnamen 2026-08-22 00:33:53 +00:00
Dockerfile Temperaturgefuehrte Steuerung einer Midea PortaSplit 2026-08-05 20:53:25 +02:00
LICENSE Temperaturgefuehrte Steuerung einer Midea PortaSplit 2026-08-05 20:53:25 +02:00
pyproject.toml Version 0.2.0: Betrieb ohne externen Sensor, Doku aufgeteilt 2026-08-07 21:51:07 +02:00
README.md Befunde aus dem Docker-Testlauf beheben (Issues 1 bis 4) 2026-08-21 22:59:31 +00:00
requirements.txt Temperaturgefuehrte Steuerung einer Midea PortaSplit 2026-08-05 20:53:25 +02:00

klimacontrol

Temperaturgeführte Automatik für eine Midea PortaSplit. Als Führungsgröße dient wahlweise ein Shelly-Temperatursensor oder der Innenfühler der Anlage selbst. Läuft als eigenständiger Python-Dienst per systemd oder Docker — ohne Home Assistant.

Shelly Cloud API ──►┐
                    ├──►  Regel-Engine  ──►  Midea PortaSplit (lokal, TCP 6444)
AC-Innenfühler ────►┘     Hysterese
   (Rückfall)             Zeitfenster

Wofür das gut ist

  • Die Anlage schaltet nach der Raumtemperatur, nicht nach Uhrzeit oder Gefühl.
  • Eine harte Obergrenze schützt ein Tier in der Wohnung — auch wenn jemand die Anlage per Fernbedienung ausgeschaltet hat.

    Die Grenzen müssen zu deinem Tier passen. Was ein Hund verträgt, ist für ein Kaninchen, ein Meerschweinchen oder einen Vogel schon zu warm; Alter, Rasse, Fell und Gesundheitszustand verschieben das weiter. Die Werte in config.example.yaml sind ein Beispiel, keine Empfehlung — im Zweifel beim Tierarzt nachfragen. Und der Sensor muss dort hängen, wo das Tier sich tatsächlich aufhält, nicht im kühlsten Eck des Raums. Diese Software ersetzt kein Hinsehen: sie schaltet eine Klimaanlage, und die kann ausfallen, überlastet sein oder vom Stromnetz getrennt werden.

  • Der sparsame iECO-Modus bleibt aktiv, obwohl er sich sonst nur über die Midea-App einschalten lässt und bei jedem Stromausfall verlorengeht.
  • Meldungen per Discord, ntfy oder Threema, wenn es kritisch wird.

Die Weboberfläche mit Steuerung, Haustierschutz und Automatik

Die optionale Weboberfläche (web/) mit Beispieldaten — Zustand, Steuerung, Haustierschutz, Zeitfenster und Temperaturverlauf.

Wie es funktioniert

Sensor Ein Shelly liefert die Führungsgröße. Batteriebetriebene Sensoren schlafen und sind lokal nicht erreichbar — für sie wird die Shelly Cloud API abgefragt. Dauerhaft versorgte Geräte gehen direkt im LAN. Ohne Shelly regelt der Innenfühler der Anlage (provider: ac_indoor).
Rückfall Meldet der Shelly zu lange nichts, übernimmt der Innenfühler der PortaSplit. So schaltet die Automatik nicht ab, nur weil der Sensor gerade schweigt.
Klimaanlage Lokal über msmart-ng (TCP 6444). Token und Key werden einmalig über die Midea-Cloud geholt, danach läuft alles ohne Cloud.
Regelung Zweipunktregelung mit Hysterese und Zeitfenstern. Mindestlaufzeit und Mindestpause schützen den Kompressor.

Loslegen

git clone https://git.dynnet.de/draventec/klimacontrol.git
cd klimacontrol

cp -n .env.example .env
cp -n config.example.yaml config.yaml
chmod 600 .env

python -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m klimacontrol setup-midea --discover
.venv/bin/python -m klimacontrol setup-shelly-cloud --host shelly-XX-eu.shelly.cloud

Beide Setup-Befehle geben fertige Konfigurationszeilen aus. Danach prüfen und zur Sicherheit erst ohne Schalten laufen lassen:

.venv/bin/python -m klimacontrol check-config
.venv/bin/python -m klimacontrol run --dry-run

Der vollständige Weg — inklusive Docker, systemd-Dienst und Fehlersuche bei der Geräteerkennung — steht in docs/installation.md.

Dokumentation

Datei Inhalt
installation.md Einrichtung per venv/systemd oder Docker, Token holen, Shelly anbinden
konfiguration.md Alle Parameter, und wie man eine bestehende config.yaml ergänzt
regelung.md Handbedienung, Betriebsmodus, Laufzeitmessung, Außenvergleich
haustiermodus.md Schutzgrenze, die Zeitfenster und Handbedienung überstimmt
saisonpause.md Anlagenzugriff aussetzen, solange das Gerät abgebaut ist
ieco.md Den sparsamen Modus dauerhaft aktiv halten
benachrichtigungen.md Discord, ntfy, Threema — was wann gemeldet wird
betrieb.md Befehle, Logverhalten, Messverlauf, Neustart, Betriebshinweise

Befehle

Befehl Zweck
run Regelkreis dauerhaft ausführen (--dry-run schaltet nichts)
check-config Konfiguration prüfen, Zeitfenster und aktives Profil anzeigen
explain --temp 26 Nachvollziehen, was bei einer Temperatur passieren würde
pet-mode on|off|auto Haustiermodus umschalten, ohne Neustart
pause on|off|status Saisonpause: Anlagenzugriff aussetzen, Messverlauf läuft weiter
settings [--reset] Zur Laufzeit gesetzte Zeitfenster/Schutzgrenzen-Werte anzeigen oder verwerfen
test-alert Testnachricht an alle Meldekanäle
healthcheck Prüft, ob der letzte Zyklus frisch gelaufen ist
setup-midea PortaSplit finden, Token und Key holen
setup-shelly-cloud Cloud-Zugang prüfen, Geräte auflisten
setup-shelly / scan-shelly Shelly lokal abfragen oder im Netz suchen

Voraussetzungen

  • Python 3.10 oder neuer
  • Die PortaSplit muss einmalig über die MSmartHome-App eingerichtet und im WLAN sein. Danach wird die App nicht mehr gebraucht.
  • Der Rechner muss die Anlage auf TCP 6444 erreichen — keine Client-Isolation, keine VLAN-Trennung ohne passende Regel.
  • Optional ein Shelly-Temperatursensor, in der Shelly Cloud oder lokal erreichbar. Ohne ihn regelt der Innenfühler der Anlage — siehe Betrieb ohne externen Sensor.

Tests

python -m unittest discover -s tests -t .

580 Tests (Hauptdienst) plus 257 für die Web-Statusseite, ohne Netzwerk und ohne Hardware. Die Regel-Engine ist eine reine Funktion — Hysterese, Zeitfenster über Mitternacht, Sperrzeiten, Sensorausfall, Handbedienung und Schutzgrenze sind vollständig abgedeckt.

Die Tests kommen beim Klonen mit (96 kB) und sind auf dem Zielsystem nützlich: Nach einem git pull zeigen sie in einer Sekunde, ob die neue Fassung funktioniert — bevor der Dienst neu startet.

Version

python -m klimacontrol --version

Die laufende Version steht auch in der ersten Logzeile nach dem Start und in der Kopfzeile von check-config. Was sich geändert hat, steht im CHANGELOG.

Releases sind als Git-Tags markiert:

git fetch --tags
git tag -l                  # vorhandene Versionen
git log --oneline HEAD...v0.2.0    # was seit dem Tag dazukam

Lizenz

MIT