ElbeHeat: Heizungssteuerung für ein Ferienhaus mit tado und Airbnb ================================================================== Baue mir in einem Durchgang ein kleines Web-Tool, das meine tado-Heizung (Generation V3+) anhand von Buchungen steuert. Frag nur nach, wo ich selbst etwas tun muss (tado-Anmeldung, Freigaben). Rahmen ------ - Python, nur Standardbibliothek (plus tzdata), ein Docker-Container, davor Caddy mit Basic Auth. - Läuft auf einem kleinen Linux-Server, nicht auf meinem Laptop: eine Heizung darf nicht davon abhängen, ob ein Rechner wach ist. - Daten als JSON-Dateien in einem Datenordner, keine Datenbank. - Eine einzige Seite, zuerst fürs Handy gestaltet, hell und dunkel. - Sprache der Oberfläche: Deutsch. User Stories ------------ * Ferienhaus mit tado-Heizung, Gäste buchen über Airbnb oder privat * Als Gastgeber will ich * dass eine Buchung für heute das Haus sofort auf volle Leistung bringt (bis zum Check-in) * dass vor jeder Anreise vorgeheizt wird (z.B. ab 2 Tage vorher, 12 Uhr) * während des Aufenthalts eine Wohlfühltemperatur * pro Buchung eine eigene Zieltemperatur * Regeln als Sätze bearbeiten * wenn: jede Buchung / kurzfristig gebucht / Anreise in Monaten / an Tagen * dann: Temperatur oder volle Leistung * von / bis: Buchungseingang, Anreise, Abreise, Tage vorher oder nachher, Uhrzeit * dass Buchungen von selbst kommen * sofort aus der Airbnb-Bestätigungsmail * stündlich aus dem Airbnb-Kalender (auch Stornos) * von Hand als "Neue Buchung" für private Gäste * alle bearbeiten oder ignorieren können * jetzt * das ganze Haus auf __ Grad bringen * das ganze Haus auf 5 Grad bringen * alle Heizungen mit Kindersicherung versehen (wenn Gäste Kinder haben) * Kindersicherung deaktivieren * zurück zum Plan * festlegen, was ohne Buchung gilt (tado-Zeitplan oder feste Temperatur) * den Plan der nächsten Wochen sehen, mit Grund * sehen, ob Geräte nicht funktionieren * offline, Batterie schwach, nicht kalibriert * Ventil bleibt zu, obwohl es kalt ist * Ventil voll offen, aber der Raum wird nicht warm * einzelne Räume aus der Steuerung nehmen * einen Probebetrieb, bevor es echt schaltet * alles am Handy bedienen Akzeptanzkriterien und bekannte Fallen -------------------------------------- tado - Anmeldung per Geräte-Code: POST https://login.tado.com/oauth2/device_authorize (client_id der tado-Web-App, scope offline_access), dann Token-Endpunkt abfragen. Das Passwort sieht das Tool nie. - Die Seite zeigt Link und Code zum Kopieren und rät, ihn in einem privaten Fenster zu öffnen: ist der Browser noch mit einem anderen tado-Konto angemeldet, wird sonst still das falsche Haus verbunden. - Hat das Konto mehrere Häuser: Hausauswahl, und oben immer anzeigen, welches Haus gesteuert wird. - Der Refresh-Token rotiert bei jeder Erneuerung. Nur an einem Ort betreiben, beim Umzug verschieben. - Ohne Auto-Assist-Abo erlaubt tado 100 Aufrufe pro Tag. Also: Aufrufe zählen und anzeigen, nur bei einer Änderung schalten, das ganze Haus mit einem Sammelaufruf POST /api/v2/homes/{id}/overlay setzen (Rückfall Raum für Raum), Kindersicherung kostet ein Aufruf pro Thermostat. - Jede Einstellung als Overlay mit Timer bis zum nächsten Wechsel, höchstens 24 h, vorher erneuern. Fällt das Tool aus, kehrt die Heizung von selbst zum Zeitplan zurück und bleibt nicht auf 25 °C stehen. - Der erste Verbindungsaufbau nach einer Pause hängt manchmal: kurzer Timeout und ein zweiter Versuch. Ein Timeout beim Abfragen der Anmeldung zählt als "noch nicht bestätigt". Zeit - Intern in UTC rechnen, nur für die Anzeige in Europe/Berlin umwandeln. Ortszeit-Arithmetik über die Zeitumstellung hinweg liefert in Python falsche Stunden. - Zeitleiste exakt an den Regelgrenzen schneiden, nicht in Rasterschritten. - Lücken unter 6 Stunden zwischen zwei Buchungsfenstern durchheizen. - Vorrang: Jetzt-Befehl vor Buchungsregel vor Leerstand. Airbnb - Bestätigungsmail: Betreff "Buchung bestätigt - kommt am an". Im Text stehen "Check-in Check-out", beide Daten mit Wochentag und Jahr, darunter beide Uhrzeiten, dazu "BESTÄTIGUNGS-CODE HM........" und die Inserats-ID in einem /rooms/-Link. Mails zu anderen Inseraten ignorieren. - Storno: Betreff "Storniert: Buchung HM........ im Zeitraum ...". Eigene Reisen als Gast ignorieren. - iCal: nur Einträge "Reserved", keine Sperren. Uhrzeiten stehen nicht drin, Standardzeiten verwenden. Eine Buchung erst als storniert werten, wenn sie im Export schon einmal gesehen wurde: frische Buchungen aus der Mail tauchen dort erst Stunden später auf. Oberfläche - Sie schickt nur geänderte Felder, nie die ganze Konfiguration. Der Server lehnt Anfragen einer veralteten Seite ab ("bitte neu laden"), sonst überschreibt ein offen gelassener Tab still neuere Änderungen. - Die Konfiguration liegt im Datenordner. Eine einzeln in den Container eingehängte Datei lässt sich nicht atomar ersetzen (Errno 16). - Reihenfolge: aktueller Zustand, Buchungen, Neue Buchung, Jetzt, Geräte & Räume, Plan, Regeln, Einstellungen, Protokoll. Felder auf dem Handy immer mit Beschriftung darüber. - Zugang: Basic Auth über Caddy, Passwort nur als bcrypt-Hash im Caddyfile; der Mail-Webhook bleibt ohne Login, ist aber nur mit dem geheimen Pfadteil erreichbar. Fertig ist es, wenn ich mich mit tado verbinde, eine Buchung für heute eintrage und tado eine Minute später in allen gesteuerten Räumen die neue Temperatur mit Timer zeigt.