- Python 90.2%
- HTML 8.8%
- Shell 0.8%
- Dockerfile 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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. |
||
| docs | ||
| klimacontrol | ||
| systemd | ||
| tests | ||
| web | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| config.example.yaml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| requirements.txt | ||
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.yamlsind 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 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
