www.mikrocontroller.net

Heizungssteuerung mit Honeywell HR20

von DarioC

Inhaltsverzeichnis

[bearbeiten] Wie alles begann

Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel Honeywell Rondostat HR20E per AVR steuern und konfigurieren gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird.

Den Thread dazu kann der interessierte Leser hier nachlesen

[bearbeiten] Projektziel

Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.

Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.

[bearbeiten] Phase 1

Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:

  • Temperaturregelung
  • Echtzeituhr
  • Ausnutzen der Sleep Funktion
  • Anzeige Soll-Temperatur und der Uhrzeit
  • Einstellung der Soll-Temperatur
  • Uhrzeitgesteuerte Einstellung der Soll-Temperatur
  • Fenster-Offen-Erkennung
  • Ventilfreispülungsfunktion

[bearbeiten] Phase 2

Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:

  • Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle
  • Abfrage der Messwerte und Parameter über externe Schnittstelle
  • Vernetzung der Thermostaten untereinander
  • Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)
  • Erweiterung der Anzeige um
  • Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.

[bearbeiten] Lizenz

Die Software wird unter GPL v2 gestellt.

[bearbeiten] Subversion Repository

Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org

[bearbeiten] Zugangsdaten

Repository Location: https://OpenSVN.csie.org/hr20
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20
TRAC: https://opensvn.csie.org/traccgi/hr20

[bearbeiten] Policy

Anonymous check out ist erlaubt.
Wer was committen will muss freigeschaltet werden.
Dazu brauche ich ein Usernamen, Passwort und eine Mailadresse, dann kann ich das einrichten.
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern.
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.

[bearbeiten] Entwickler

Entwickler svn Status
darioc angelegt: rw
louk angelegt: rw
jsachs angelegt: rw

[bearbeiten] Verzeichnisstruktur

Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:

/doc Für alles an Dokumenten, die selbst erstellt wurden.

Specs, die man im Internet bekommen kann gehören hier nicht rein,
die machen das alles nur unnötig gross und das auschecken dauert länger.

/playground Wie der Name schon sagt, zum rumspielen und testen.

Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind
und (derzeit) noch nicht Teil des Programmes sind.

/source Hier kommt die Applikation rein mit allen Modulen und makefiles.

Bitte haltet das Repository sauber und checkt nur Dateien ein,
die auch Sinn machen, "thumbs.db" oder andere Temp-Dateien gehören hier nicht rein.

[bearbeiten] SVN Client und Anleitung

Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei hier runterladen kann.
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.

[bearbeiten] Analyse der Hardware

Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version als PDF hier oder hier im SVN.

[bearbeiten] Benötigte Module

Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen.
Diese dient dazu später die Aufgaben zu verteilen:

Module Function Developer Status
LCD Display Driver:
  • Init Display - DONE
  • Set Segments - DONE
  • Print HEX, DEC, TEMP, DayofWeek - DONE
  • Blink - DONE
  • e.t.c
dario DONE
LCD Simulation Simulation for display in AVR Studio:
  • Defining Display - DONE
  • Assign Segments to register bits - DONE
  • Providing samplecode - DONE
louk 95%
RTC Time and Date Handler
  • init timer - DONE
  • use IRQ with 32kHz crystal - DONE
  • handle time and date - DONE
    • daylight saving - DONE
    • consult leapyear - DONE
  • calc day of week out of date - DONE
  • Only one Byte for Year -> (2000 to 2255)
  • Day of week timer with callback - DONE

TODO

  • Tick counter (seconds since reboot) - OPEN
    • used to detect long keypress
    • used to detect motor blocked
    • used for additional timer
  • Additional timer based on tick counter value - OPEN
  • corretion for external Crystal - OPEN
  • calibrate internal RC - DONE, but not tested
dario 95%
COM COM-Driver
  • menue (Debug und Steuerung)
    • show and set desired temperature
    • show and set Time and Date
    • show actual temperature
    • show (and set) actual valveposition
    • show and set timetable and temperatures
  • optional
    • adressierung of HR20 (for BUS, RF)
    • authentication end encryption
jsachs

active

(50%)
CONFIG Save Config in EEPROM
  • driver for EEPROM access
  • save values to EEPROM
  • load values from EEPROM
MENU Control Menu State Machine
  • show values on display
  • functionality:
    • show and set desired temperature
    • show and set time and date
    • show actual temperature
    • show actual valveposition
    • show and set timetable and temperatures
MAIN Main Loop
  • init everything
    • global vars - DONE
    • rtc - DONE
    • lcd - DONE
    • motor - DONE
    • tempsensor
  • get keystate - DONE (ISR in main.c)
    • debounce - not needed
    • multi keypress (needed for hidden menue?) - can be checked by main loop
  • get position of wheel (incremental counter) - DONE (ISR in main.c)

TODO

  • call menue
  • detect longer keypress / double click - needed?
dario (70%)
MOTOR Motor-Driver
  • set desired valveposition - DONE
    • quick, asympthotic, quiet - DONE (speed can be chosen)
  • callibrate for Valve - DONE
    • optimised (less motor consumption depending on desired final position) - DONE
  • Stop motor if not turning (blocked) - DONE

TODO

  • stop calibration if valve is removed - OPEN
  • Genereate ERROR if motor is not turning (blocked or low energy) - OPEN
dario (95%)
ADC ADC-Driver (measure Temp and U_Bat)
  • init Sensor - DONE
  • start A/D conversion (Temp and U_Bat) - DONE
  • calc temperature in 1/100 degree Celsius - DONE
  • calc battery voltage in mV - DONE
  • calibration for sensor (needed?) - DONE
  • IRQ driven (IRQ generated by RTC or LCD, called from main.c)
dario (95%)
PID PID Algorithm
  • calculate desired valveposition out of
    • last valveposition(s)
    • last temperature(s)
    • actual temperature
LOG Datalogger
  • Operating Hours
    • motor in action
    • ODOmeter
    • since Battery Exchange
  • Errors
  • Logfiles (only with additional hardware)
UID Unique ID for identification
BOOT Bootloader

we need a bootloader so that the developers can flash the software without a JTAG cable and without disassembling the HR20.
I have a working XModem bootloader. We should discuss if we want to use it.
Still need some size optimisation

jsachs

(95%)

[bearbeiten] API Beschreibung

Das Projekt wird mit doxygen dokumentiert, die API-Beschreibung kann aus dem Source-Code generiert werden.

[bearbeiten] UART Protokoll

Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern. An dem externen Stecker liegt schon die Serielle Schnittstelle an. Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen. Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.

[bearbeiten] Nachrichten

Folgede Anforderungen werden an das Nachrichtenformat gestellt.

  • Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)
  • Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)
  • Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.
  • Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.

[bearbeiten] Protokoll Umfang

Folgende Befehle sollten verfügbar sein:

  • Soll Temperatur setzen und lesen
  • Programm Manuell / Auto Umschaltung, setzen und lesen
  • Datum / Zeit Einstellung, setzen und lesen
  • Sommer Winterzeit setzen und lesen
  • Programm für die Wochentage 1-7, vermute hier auch 2 Zeiten pro Tag wie beim Original ?
  • Temperatur für Absenk Temperatur und Normal Temperatur setzen und lesen
  • Version lesen
  • Batteriespannung (Zustand) lesen
  • Ventilstellung setzen und lesen
  • Kalibrierung auslösen
  • Bootloader starten für Update über RS232


Generell sollten alle Veränderungen automatisch gemeldet werden (Notify) um ein Polling zu vermeiden.<br

[bearbeiten] 1. Vorschlag

Byte1: Befehl Byte2: Länge Daten Byte3: Daten Maximal 16 oder 32 Byte, wegen Buffergröße.

Beispiel: Befehle:

  • 00 OK
  • 01 Gettime
  • 02 Get SollTemp
  • 03 Get IstTemp
  • 04 Get Ventilpos
  • 81 Settime
  • 82 Set SollTemp
  • 83 n/a
  • 84 n/a
  • FF NOK
-> 81,03,12,30,17  
<- 00
-> 01,00
<- time: 12:30:17
-> 02,00
<- soll: 20.0
-> 03,00
<- ist: 19.95

Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:

[bearbeiten] 2. Vorschlag

  • Einfaches ASCII Protokoll.
  • Die Kommandos müssen kurz aber Aussagekräftig sein.
  • Alle Strings müssen im Flash liegen um Speicher zu sparen.
  • Rückmeldungen und Notifys müssen eindeutig unterscheidbar sein

Eine kleine Protokollbeschreibung ist im SVN zusammengepackt unter "doc/protokoll/".

Beispiel :
"!VER\r" -> "$VER-1.2.17"
"?TEMP\r" -> "$TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r"
"!SET-TIME=17:30:55\" -> "$SET-TIME=OK\r"
Notify: "@TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r"

Der Aufbau ist ja im SVN Erklärt.
Der Aufwand fürs Parsen hält sich mehr als in grenzen.
Die Strings alle ins Flash.

Der Bootloader ist hier außen vor. Der wird nur per Kommando angestoßen und fährt dann ein eigenes Protokoll. Hier würde ich XModem vorschlagen. Kompakt und mit Prüfsumme. Zum Upload kann jedes Terminalprogramm genutzt werden.
"BOOTLOAD\r" -> "BOOTLOAD-OK\r" dann sendet der Controller die XModem start Sequenz und es geht los.

[bearbeiten] 3. Vorschlag

[bearbeiten] 4. Vorschlag

[bearbeiten] Bootloader

Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.

[bearbeiten] Anforderungen

  • Einfaches Update ohne öffnen des HR20E
  • Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software
  • HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten
  • Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)

[bearbeiten] Vorschlag 1

X-Modem Protokoll (mit CRC)
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.
Größe ist hier kleiner 1kb und wohl verkraftbar.

Vorteil:

  • etablierte Technik
  • von anderen Herstellern Verwendet
  • wird von den meisten Terminal Programmen unterstützt
  • Gesichert durch Checksumme

Nachteil:

  • Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig

[bearbeiten] Entwicklungsumgebung

[bearbeiten] Sonstiges

[bearbeiten] Altes Protokoll

Hier hat mal einer ein Protokoll eingegeben. Das scheint aber nicht zu der Version 2.04 zu passen. Ich habe es nicht gelöscht, falls es jemanden interessiert.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net