HR20

Aus Wiki Sensornetze
Wechseln zu: Navigation, Suche

Installation der openHR20 Software inkl. Anschluss eines RFM12 Funkchips. Anschließende Erweiterung um 6LoWPAN.

Einführung

Das Heizkörperthermostat HR20 von Honeywell/Rondostat ist ein elektronisches Thermostat, welches Heizkörperventile ansteuert um die Raumtemperatur zu regeln. Der besondere Vorteil dabei ist, dass die Solltemperatur nicht nur manuell einstellbar ist, sondern zu vorgegeben Zeiten per Schaltuhr geändert werden kann. So ist es möglich die Solltemperatur z.B an Arbeitstagen individuell zu senken wenn kein Mensch im Haus ist und wieder automatisch zu erhöhen, wenn man nach Hause kommt. So kann man viel Energie sparen ohne auf Komfort zu verzichten. Der Nachteil ist, dass die Einstellung der Schaltzeiten auf zwei Intervalle pro Wochentag beschränkt ist und ein Umprogrammieren sehr aufwändig ist. Insbesondere, wenn man in einer Wohnung mehrere Heizkörper mit den Thermostaten ausstattet.
Wünschenswert wäre es, wenn eine zentrale Steuerung die Thermostate programmieren könnte. Auch wäre es von Vorteil, wenn die Ist-Temperatur an anderer Stelle im Raum gemessen würde, um den Messfehler in der Nähe der Heizung auszugleichen. Ziel ist es das Thermostat um eine solche Kommunikationsschnittstelle zu erweitern. Die Kommunikation sollte hierbei frei wählbar sein, sie kann kabelgebunden mittels RS232 oder über Funk via RFM12 erfolgen.

Technische Daten des HR20

  • Atmel ATmega 169P
    • CPU 8-bit AVR
    • Flash size 16 Kbytes
    • EEPROM size 512 bytes
    • SRAM size 1 Kbytes
    • VCC range 1,8 - 5,5 V
  • Ventilsteuerung über Motor
  • Regelbereich: 5-30°C bzw On/Off

Die komplette Analyse des HR20 wurde bereits von Dario erledigt. Siehe Hr20-analyse.pdf

Installation openHR20 Software auf dem HR20 Thermostat

Benötigte Hard- und Software

  • HR20-Thermostat
  • PC-System (in unserem Fall ein Windows 7 64 Bit Professional)
  • JTAG-Programmer (Wir verwenden einen AVR DRAGON)
  • 1x In-Circuit USB-A UART Bridge
  • 1x USB-A auf USB-B Kabel (Um den AVR DRAGON mit dem PC zu verbinden)
  • 2x selbstgebaute Kabel, mit jeweils einem 2x5 Pfostenstecker auf jeder Seite (Bau der Kabel siehe Punkt 3.3)
  • 1x selbstgebautes Kabel, erste Seite einen 2x5 Pfostenstecker, andere Seite direkt angelötet an In-Circuit USB-A UART Bridge
  • Kleinteile (2x5 Pfostenstecker, Draht, Streifenrasterplatine, Flachbandkabel 10-Adrig, usw.)

Bau der benötigten Verbindungskabel

Steckplan

Auf dem nebenstehenden Bild sieht man den Aufbau der Schaltung.

Zum schnelleren Auf- und Abbau der Schaltung haben wir uns entschlossen ein Verbindungsboard zu bauen (siehe Nr.5 auf dem Bild). Dies ist aber nicht zwingend erforderlich.

Aus der folgenden Tabelle kann entnommen werden, welche Pins vom HR20 mit dem Dragon und dem USBtoRS232 verbunden werden müssen.


Pinbelegung des HR20
Bezeichnung HR20 AVR Dragon USBtoRS232
TCK 4 1 -
TDO 5 3 -
VCC 9 4 -
TMS 3 5 -
Reset 1 6 -
TDI 8 9 -
GND 10 2+10 GND
TxD 6 - TxD
RxD 7 - RxD
PE2 - - -

OpenHR20 Varianten

Die OpenHR20 Firmware wird in verschiedenen Varianten angeboten, für die meisten wird bereits eine vorkompilierte hex-Datei angeboten.

  • original_* - Ohne RFM12-Funkmodul
  • rfm_int_* - RFM12 Chip wird intern angelötet
  • rfm_ext_* - RFM12 Chip wird über den 2x5 Pin-Block angeschlossen (solange RFM12 angeschlossen ist, kann nicht mit dem JTAG-Programmer programmiert werden; Abstecken des RFM12-Funkchips stellt die Funktion wieder her)
  • thermotronic_* - thermotronic HW


  • *_sww - offene Fenster werden softwareseitig erkannt
  • *_hww - offene Fenster werden hardwareseitig erkannt (Anschluss an den Pins, siehe ReadMe.txt)

Flashen des HR20

Das Flashen des HR20 wird in diesem Artikel ausführlich beschrieben.

Kommunikation mittels RS232-Schnittstelle

Nach dem Flashen kann man mittels der COM-Schnittstelle mit dem HR20 Thermostat kommunizieren.
Da die meisten neuen Notebooks und auch PCs keine COM-Schnittstelle mehr besitzen, entschieden wir uns zur Verwendung eines USBtoRS232 Adapters.
Wir verwendeten: In-Circuit USB-A UART Bridge

Die serielle Kommunikation verwendet folgende Parameter:


Bezeichnung Wert
Baudrate 9600
Datenbits 8
Paritätsbit None
Stopbit 1

Die Pinbelegung entnehmen Sie bitte aus dieser Tabelle

Nachdem der Computer mit dem HR20 Thermostat verbunden wurde, kann man eine Verbindung herstellen.

Bei Windows:

  • Einfach eine Terminal-Software seiner Wahl verwenden (Bsp.:HTerm, Terminal, etc.)
  • Den COM-Port wählen,den Windows beim Anstecken des USBToRS232-Gerätes neu installiert hat (Probleme bei Windows 7 64Bit, siehe dazu 3.5 Auftretende Probleme)
  • Einstellungen aus der Tabelle (siehe oben) verwenden.

Bei Linux:

  • Wer Linux nutzt, sollte es schon selber hinbekommen ^^
  • ansonsten kann man auch folgendes Python-Script benutzen: Download

Sobald die Verbindung hergestellt wurde, kann man mittels Befehlen das HR20-Thermostat programmieren, bzw. Werte auslesen (Befehle siehe Punkt 5: Befehle zur Kommunikation mit dem HR20-Thermostat)

Entstehung OpenHR20ware

Da diese Art der Programmierung aber sehr lange dauert und eher kryptisch wirkt, entschlossen wir uns eine einfach zu bedienende Software zu schreiben, die uns das Konfigurieren des Thermostats erleichtern sollte.

--> Die Software OpenHR20ware war geboren (Details findet man in folgenden Wiki-Eintrag: Link)

Auftretende Probleme

  • Wir hatten zum Anfang Probleme den HR20 mittels JTAG-Programmer zu flashenen, da wir einzelne Kabel verwendet Bild.png haben. Dadurch kam es zu Problemen beim Aufspielen der OpenHR20-Software. Diese äußerten sich unter anderem durch folgende Fehler:
    • EEPROM Fehler auf dem HR20
    • Auslesen der falschen Device-ID im Atmel Studio 6.0
    • Setzen der Fuse und Lock-Bits nicht möglich


  • Auch bei der Kommunikation über die RS-232 Schnittstelle traten Fehler auf. Laut Foreneinträgen bei mikrocontroller.net kann man einen PL2302 Chip (Bsp:Handykabel eines Siemens S25) zur Verbindung des HR20 mit dem PC verwenden. Wir benutzten ein RS-232-auf-USB-Kabel von Equip, da dies über einen PL2303 Chip verfügt. Damit konnte aber keine brauchbare Kommunikation mit dem HR20 hergestellt werden. Fehler:
    • Empfang von unbrauchbaren Zeichenketten
    • Nach Messung mit dem Oszilloskop stellten wir fest, dass das RS-232-auf-USB-Kabel 5V-Pegel verwendet. Der HR20 hingegen arbeitet mit einem Pegel von 3,3V für die Kommunikation über die RS_232 Schnittstelle. Die Pegel waren also nicht kompatibel.
  • Daher hätten wir jetzt noch einen Pegelwandler (Bsp. MAX2323) benötigt. Ob dieser schon in den zu kaufenden Handykabel enthalten ist, konnten wir nicht herausfinden. Daher entschieden wir uns die Kommunikation mit dem PL2303 Chip aufzugeben und etwas anders zu nehmen.
  • Nach Absprache mit unserem Projektleiter gab er uns den USB-Adapter In-Circuit USB-A UART Bridge. Dieses Gerät stellt eine USB zu RS-232 Schnittstelle bereit und arbeitet mit 3,3V.


  • Ein weiteres Problem bestand in den nicht signierten Treibern für dieses Gerät.
    Denn für dieses Gerät muss man sich seinen eigenen Treiber mittels Software erstellen. Leider sind diese Treiber nicht signiert, und somit ist eine Installation und Nutzung dieser unter Windows 7 64Bit theoretisch nicht möglich.
  • Dennoch gibt es einen Weg das Gerät zu nutzen.
  • Wenn man beim booten F8 drückt und den Punkt 'Treiber Signatur nicht erzwingen' auswählt. Diese Aktion muss man aber immer wiederholen, wenn man das Gerät verwenden möchte.(bei jedem Neustart)
  • oder man versetzt das Windows in den Testmode:
Bcdedit.exe -set TESTSIGNING ON
Dabei muss man aber die Konsole(cmd) über Administratorrechte ausführen

Anschluss des RFM12 Funkchips

Allgemeines

Der Anschluss eines RFM12 Chips ist intern bzw extern möglich (Übersicht Varianten). Wir wählten die externe Methode. Damit einhergehend werden die JTAG-Pins durch die "RFMizierte" Firmware nicht unnutzbar, sondern werden nur zur Laufzeit in IO-Ports verwandelt. Nach dem Trennen des RFM12-Chips könnnen die Pins wieder zum Flashen der Software mittels JTAG genutzt werden. Die serielle Kommunikation funktioniert auch, wenn das Thermostat mit dem Funkchip verbunden ist, da die RxD/TxD-Pins nicht verwendet werden.

Zur Kommunikation über Funk wird natürlich auch ein Master benötigt, der an einen PC angeschlossen ist. So kann vom PC aus über den Master ein Kommando ans Thermostat gesendet werden.

Zum Projekt OpenHR20 gehört auch der Bauplan und ein passender Mastercode. Da wir aber über andere Hardware verfügten, musste der Mastercode erst angepasst werden (Lesen sie hierzu folgenden Artikel: Link)

Informationen zum Paketablaufplan

Allgemein

Wenn man die RFM-Version von OpenHR20 auf das Thermostat flasht, dann wartet nach der Adjustierung (Ad1, Ad2, Ad3) das Thermostat auf das Sync-Paket vom Master, um sich mit diesem zu synchronisieren. Sollte dieses Paket nicht innerhalb einer bestimmten Zeit am Thermostat ankommen, so meldet das Thermostat einen "E4" Fehler und lauscht nicht mehr nach dem Sync-Paket. Um ein erneutes Empfangen von Sync-Paketen zu ermöglichen, muss das Thermostat neu gestartet werden (Entfernen und Wiedereinsetzen der Batterien).

Nachdem das Sync-Paket empfangen wurde und das Thermostat die aktuelle Zeit bekommen hat, ist er bereit über Funk mit dem Master zu kommunizieren.

Reihenfolge

Der Master gibt jede Sekunde eine Meldung per USB(RS232) an den Master PC. Dabei ist 1 minute in 60 Timeslots unterteilt, Wobei Timeslot 0 und 30 für das Senden des Sync Paketes Reserviert ist.

Ausgabe am Master-PC Timeslot Definition
N0? 00 Sync Paket wird gesendet (Automatisch vom Master)
01? 01 Master sendet wenn es einen Befehl für Geräteadresse 01 gibt an diesem Timeslot
02? 02 Master sendet wenn es einen Befehl für Geräteadresse 02 gibt an diesem Timeslot
... ... ...
1d? 29 Master sendet wenn es einen Befehl für Geräteadresse 1d gibt an diesem Timeslot
N1? 30 Sync-Paket wird gesendet (Automatisch vom Master)
keine Ausgabe 31-59 sind für Anfragen von den HR20 reserviert
N0? 00 Es geht wieder von vorne los

Beim Start des Master, sprich wenn er noch keine Uhrzeit vom Master-PC bekommen hat, bekommt man diese Ausgabe bei N0?: RTC? Das bedeutet das man dem Master zu diesem Zeitpunkt die Aktuelle Uhrzeit Übermitteln muss, damit er selber die Aktuelle Uhrzeit hat(Und anfängt zu senden)

Wenn der Master in einem Takt von 1 min keine Befehle zum senden vom Master-PC erhält, muss man dem Master zum Zeitpunkt N0? und N1? folgendes Kommando vom MAster-PC schicken: "O0000" (--> ist ein großes o mit 4 Nullen)

Sollte es ein Kommando zum versenden geben, dann muss man dem Master zum Zeitpunkt N0? folgendes Kommando schicken: "P00000200" wobei dieses Kommando nur für einen Befehl gilt, sollte man mehrere Befehle zum Master schicken(innerhalt 1min) so ändert sich dieses Kommando, leider haben wir noch nicht in erfahrung bringen können wie die genaue Struktur aussieht, da es Keine Dokumentation dazu gibt, und wir uns die bisher bekannten Informationen mühevoll aus einem schlecht Kommentierten und Programmierten PHP Skript entnehmen mussten, dass einer der Entwickler des OpenHR20 Projektes geschrieben hat.

Dieses bisherige Wissen Implementierten wir in unsere Software "OpenHR20ware" dabei war drauf zu achten das unsere Software die Ausgaben(N0?, 11?,RTC?,...) des Masters Auswertete und richtig reagiert(Bsp.: Senden der konkreten Uhrzeit zum Zeitpunkt RTC?)

Beispiel

  • Man steckt den Master an, startet unsere Software, danach wählt man den gewünschten Port an dem der Master Angeschlossen ist(ACM0)
  • Danach drückt man auf Verbinden, dadurch wird die aktuelle Uhrzeit und Datum zum passendem Zeitpuntk gesendet --> Master sendet nun halbminütlich das Sync-Paket
  • Danach Startet man den Thermostat und wartet bis er das Sync-Paket empfangen hat(erkennt man daran das er die Aktuelle Uhrzeit hat)
  • In unsere Software kann man nun die Geräteadresse des Thermostats eingeben(damit der aAster weis wer den befehl bekommt)
  • Danach drücke ich in unserer Software auf Modus ändern (von Automatisch auf Manuell).
  • Diesen Befehl speichert unsere Software zwischen und wartet bis Master beim passenden Timeslot ist, wenn das der fall ist sendet unsere Software den Befehlt an den Master, der wiederum es wieter an das Thermostat leitet.

Wegen Zeitmangel haben wir nur diese eine Funktion(Modus Wechsel) in unser Programm Implementiert, damit sie per Funk funktioniert.

Informationen zum SynchronisationsPaket/ Datenpaket

Für beide Pakettypen gibt es bereits ein PFD Dokument in dem der Aufbau speziell definiert ist(Link)

Befehle zur Kommunikation mit dem HR20-Thermostat

Alle Kommandos haben die Form X[Parameter]<CR>, wobei X der Kommandoname ist und immer aus einem Großbuchstaben besteht. Alle Befehle enthalten keine Leerzeichen und enden mit einem Carriage Return. In den meisten Programmiersprachen (u.a C, Java, Python) wird dies mit dem Steuerzeichen /r erreicht.


Anzeigen der Versionsinformationen

Befehl:

 V 

Antwort:

 V:OpenHR20 [V.V] [Datum] [mm:hh:ss] [Rel_X.X] 

Bedeutung:

[V.V] Versionsnummer
[Datum] Monat Tag Jahr
[mm:hh:ss] Uhrzeit (mm...Minute, hh...Stunde, ss...Sekunde)
[Release] Release-Nummer


Beispiel:

 V:OpenHR20 1.0 Feb 16 2011 01:28:33 Rel_1.0 


Statusbericht anzeigen

Befehl:

 D 

Antwort:

  D: [dW] [DD.MM.YY] [mm:hh:ss] [A] V: [VV] I: [IIII] S: [SSSS] B: [BBBB] Is: [IsIs] [X] [W]

Bedeutung:

[dW] Wochentag (Montag = d1, Dienstag = d2 usw.)
[DD.MM.YY] aktuelles Datum
[mm:hh:ss] aktuelle Uhrzeit (mm...Minute, hh...Stunde, ss...Sekunde)
[A] Modus (A... Automatik, M...Manuell)
[VV] aktuelle Ventilposition in %
[IIII] aktuelle Temperatur (2368 entspricht 23,68 °C)
[SSSS] gewünschte Temperatur
[BBBB] Batteriespannung in mV
[IsIs]  ?
[X] X...Statusbericht vom Nutzer angefordert
kein X... automatisch erzeugter Statusbericht
[W] Fenster ist geöffnet


Beispiel:

 D: d5 01.01.10 12:26:50 A V: 30 I: 2094 S: 1700 B: 2964 Is: f928 X 


Wert einer Debug-Variable anzeigen

Anhand Debug-Variablen kann man Werte, wie z.B. die Motorposition, erkennen. Eine genauere Übersicht über die Debug-Variablen findet sich in den Quellen des Projekts in der Datei watch.c. Diese Variablen sind für das eigentliche Installieren eher uninteressant und müssen in der Regel nicht betrachtet werden.

Befehl:

 T[aa] 

Antwort:

 T[aa]=vvvv 

Bedeutung:

[aa] Nummer der anzuzeigenden Variable
[vvvv] Wert der Variable


Beispiel:

 Eingabe: T00
 Ausgabe: T[00]=085f 


Anzeigen der Konfigurationsbytes

Mithilfe der Konfigurationsbytes kann das HR20-Thermostat individuell angepasst werden. So ist es z.B. möglich die Energiespartemperatur, Frostschutztemperatur, usw. zu ändern, sowie die Geräteadresse des Thermostats anzupassen. Die genauen Adressen der Konfigurationsbytes können aus den Projektquellen aus der Datei eeprom.h entnommen werden.

Befehl:

 G[aa] 

Antwort: G[aa]=vv

Bedeutung:

[aa] hexadezimale Adresse des Konfigurationsbytes (siehe eeprom.h)
[vv] Wert des Konfigurationsbytes


Beispiel:

 Eingabe: G13
 Ausgabe: G[13]=96 


Setzen der Konfigurationsbytes

Befehl:

 S[aa][vv] 

Antwort:

 S[aa]=[vv] 

Bedeutung:

[aa] hexadezimale Adresse des Konfigurationsbytes (siehe eeprom.h)
[vv] Wert des Konfigurationsbytes


Beispiel:

Eingabe: S1396
Ausgabe: S[13]=2d 


Anzeigen der Heizintervalle

Befehl:

R[a][b] 

Antwort:

  R[a][b]=[c][ddd] 

Bedeutung:

[a] Tag (1 entspricht Montag, ..., 7 entspricht Sonntag)
[b] Speicherslot (0-7)
[c] Modus
0... Frostschutzmodus
1... Energiesparmodus
2... Komfort
3... Superkomfort
[ddd] Zeit (Minuten seit 00:00 in hexadezimalem Format)


Beispiel:

//Heizintervalle für Montag

R[10]=21a4     //Komfortmodus,     0x1a4 =  420 Minuten seit Mitternacht -> entspricht 7:00 Uhr
R[11]=121c     //Energiesparmodus, 0x21c =  540 M.s.M -> entspricht 9:00 Uhr
R[12]=23c0     //Komfortmodus,     0x3c0 =  960 M.s.M -> entspricht 16:00 Uhr
R[13]=14ec     //Energiesparmodus, 0x4ec = 1260 -> entspricht 21:00 Uhr
R[14]=2fff     //Komfortmodus,     0xfff =  not used
R[15]=1fff     //Energiesparmodus, 0xfff =  not used
...


Einstellen der Heizintervalle

Befehl:

 W[a][b][c][ddd] 

Antwort:

 W[a][b]=[c][ddd] 

Bedeutung:

[a] Tag (1 entspricht Montag, ..., 7 entspricht Sonntag)
[b] Speicherslot (0-7)
[c] Modus
0... Frostschutzmodus
1... Energiesparmodus
2... Komfort
3... Superkomfort
[ddd] Zeit (Minuten seit 00:00 in hexadezimalem Format)


Beispiel:

W1011a4    //Montag, Slot0, Energiesparmodus,1a4 = 420 -> 7:00 Uhr 


Thermostat neustarten

Befehl:

 B1324 


Setzen des Datums

Befehl:

 Y[yy][mm][dd] 


Antwort:

Als Antwort erhält man einen normalen Statusbericht (siehe oben ''Statusbericht anzeigen'')


Bedeutung:

[yy] Jahr (hexadezimal)
[mm] Monat (hexadezimal)
[dd] Tag (hexadezimal)

Beispiel:

Y0a060a     //setzt Datum auf 10.06.2010


Setzen der Uhrzeit

Befehl:

 H[hh][mm][ss]


Antwort:

Auch hier erhält man einen normalen Statusbericht als Antwort vom Thermostat (siehe oben ''Statusbericht anzeigen'')


Bedeutung:

[hh] Stunden (hexadezimal)
[mm] Minuten (hexadezimal)
[ss] Sekunden (hexadezimal)


Beispiel:

H0b0b0b      //Setzt die Uhrzeit auf 11:11:11


Setzen der Temperatur

Befehl:

 A[xx] 


Antwort:

Auch hier erhält man einen normalen Statusbericht als Antwort vom Thermostat (siehe oben ''Statusbericht anzeigen'')


Berechnung des Parameters:

Der gewünschte Temperaturwert in °C muss mit 2 multipliziert werden und anschließend in eine hexadezimale Zahl umgewandelt werden.


Beispiel:

Die gewünschte Temperatur beträgt 20°C:
20*2 = 40 entspricht 0x28

A28


Setzen der Modi

Befehl:

 M[xx] 

Antwort:

Auch hier erhält man einen normalen Statusbericht als Antwort vom Thermostat (siehe oben ''Statusbericht anzeigen'')


Bedeutung:

 [xx] kennzeichnet den Modus des Thermostats (00... manuell, 01... automatisch) 


Beispiel:

M00     //manuell
M01     //automatisch

6LoWPAN

Nach Absprache mit Herr Prof. Vogt wurde die anpassung an das 6LoWPAN aufgegeben. Wer sich trotzdem dafür interessiert, für den Lohnt sich ein Blick bei einem anderen ProjektLink

Zusatzinformationen

Hier finden Sie allegemeines Wissen, das in die Struktur unseres Artikels nicht reingepasst hat.

Geräteadresse am Thermostat einstellen

  • Mann drückt ca 3sek. lang die 3 Tasten des Thermostats danach ist man im Konfigmenü
  • auf der Linke seite findet man das zu ändernde Konfigbyte(wahl mittels Rad)
  • auf der der rechten Seite(durch druck auf "prog" gelangt man dahin) stehen die Werte in Hexadezimal
  • Die Bedeutung der Konfigbytes und dessen maximal/minimal Werte, findet man in der Datei: eeprom des OpenHR20 Projektes
  • Bsp bei einem Thermostat mit geflashter RFMfizierten SOftware ist das Konfigbyte "2b" die Geräteadresse, hier kann man zwischen 00 bis 1d wählen