Ik had nog belooft met meer info over de werking van de control box te komen. Bij deze een lange post...
Inleiding
Het hybride warmtepomp systeem Aurea van Atlantic bestaat uit verschillende delen:
- Een Chofu AEYC-0643XU buitenunit met versimpelde (elektrische) aansluitingen ten opzichte van de basis versie. Dit is een al wat ouder model maar ‘made in Japan’. Dus wellicht niet de stilste en meest efficiënte, maar betrouwbaar en zonder kinderziekten.
- Een control box besturing unit die Atlantic vermoedelijk zelf heeft (laten) ontwikkelen. Dit is veruit de zwakste schakel in het systeem door wat onhandige ontwerpkeuzes, en lijdend voorwerp van dit topic.
- Een Plugwise Anna thermostaat met Smile gateway. Wat mij betreft een typische ‘slimme thermostaat’ die voor het doel voldoet.
- Installatiemateriaal met terugslagkleppen, vuilfilter, etc. De charme van dit systeem is de de relatief eenvoudige installatie. Installatie kostte me in m’n eentje een weekend.
Werking van de control box
Hardware
De control box bevat een printplaat met twee oude en eenvoudige Atmel microcontrollers waarop het controle systeem is gebaseerd. De een (IC1) doet de communicatie met de buitenunit, de ander (IC2) het Opentherm stuk. Ze communiceren ook met elkaar om data tussen Opentherm en buitenunit uit te wisselen. Ik heb al eerder het een en ander over de hardware geschreven en foto’s gepost. Zie
hier en
hier.
Lang verhaal kort. In de basis voldoet de hardware prima, het is alleen een verouderde en te simpele basis want er is geen software update mogelijk zonder chips te wisselen, en bv. dip switches om de gebruiker keuzes over gedrag van de warmtepomp te laten maken, zijn er niet (met uitzondering van aan/uit of Opentherm thermostaat).
De aansluiting waarmee communicatie met de buitenunit verloopt is apart. Je zou iets van RS485 als hardware met ModBus als protocol verwachten (dat ondersteunt de buitenunit ook in de standaarduitvoering!). Het is echter een combinatie van stroomvoorziening vanuit de buitenunit naar de control box en communicatie.
Fysiek is de verbinding met vier draden: Fase, Nul, Signaal en Aarde. Fase en nul voorzien de unit van stroom, en via een wat bijzondere manier (rood en zwart banaan chassisdeel op de printplaat voor een USB adapter) ook de Smile gateway en Anna thermostaat. De communicatie verloopt via de nul- (van buitenunit naar control box) en signaaldraad (control box naar buitenunit). Wat hier precies gebeurt heb ik verder niet bekeken, anders dan dat een multimeter aangaf dat spanningen enkele tientalen volt heen en weer sprongen. Daarom durfde ik m’n eenvoudige USB oscilloscoop met max. +/- 35V hier niet op aan te sluiten.
Dat was ook niet nodig want de Atmel microcontrollers werken op 5V en de omzetting naar deze spanning zit natuurlijk gewoon op de printplaat. Ik heb van dat deel een schema gemaakt. Helaas nog steeds in potlood-uitvoering dus ik zal het hier nog niet posten. Hieronder voor de volledigheid nog wel een keer de foto van de print:
De signalen van en naar de buitenunit worden met behulp van twee optocouplers (H11D1) gescheiden van netspanning. Degene met het signaal van de buitenunit (OK1) is via een 4.7 kOhm weerstand (R9) met IC1 verbonden, en dat IC stuurt zo’n opdrachten via een 1 kOhm weerstand (R14), een BC547 transistor (T2) en een 330 Ohm weesrtand (R10) naar de andere optocoupler (OK2).
Hier een overzicht van de aansluitingen op de microcontrollers:
Pin | IC1 | IC2 |
1 | Reset | Reset |
2 | IC2 pin3 | IC1 pin3 |
3 | IC2 pin2 | IC1 pin2 |
4 | NC | NC |
5 | NC | Opentherm in |
6 | NC | NC |
7 | VCC | VCC |
8 | GND | GND |
9 | X-tal | X-tal |
10 | X-tal | X-tal |
11 | NC | Opentherm uit |
12 | NC | NC |
13 | NC | GND |
14 | LED 1 | NC |
15 | NC | NC |
16 | Relais 1 | Relais 1 |
17 | NC | NC |
18 | Schakelaar-LED | NC |
19 | NC | NC |
20 | Schakelaar | VCC |
21 | Schakelaar | VCC |
22 | GND | NC |
23 | Schakelaar | NC |
24 | NC | NC |
25 | IC2 25 | IC1 25 |
26 | WP in (OK2) | NC |
27 | WP uit (OK1) | Schakelaar-LED |
28 | NC | NC |
Primair van belang zijn pin 26 en 27 van IC1 die bij resp. weerstand R14 (1 kOhm) en R9 (4.7 kOhm) zijn af te tappen omdat hiermee de communicatie met de buitenunit verloopt. Primair heb ik me hier op gericht om het protocol in kaart te gaan brengen. De communicatie tussen beide IC’s verloopt langs PAD1 (IC1 pin 3 naar IC2 pin 2) , PAD2 (pin 2 → 3) en PAD3 (GND).
Software
De software van de control box zit ‘geflashed’ in beide microcontrollers. In beginsel kan dit worden uitgelezen. Maar dat lijkt me een tamelijk kansloze missie. Het lock bit kan actief zijn waardoor uitlezen wordt geblokkeerd. Maar als uitlezen wel mogelijk, is doorgronden en aanpassen van het programma vermoedelijk erg moeilijk. We weten bv. al niet welke ontwikkelsoftware is gebruikt (logisch zou de ontwikkelsoftware van Atmel, nog onderdeel van Microchip, zijn). Gezien de taken (vier communicatielijnen managen) van deze relatief zwakke chips (ze draaien maar op 8 MHz en hebben slechts 8 kB flash geheugen, 512 bytes EEPROM en 1 kB RAM) is er ook een kans dat er complexe low level code is gebruikt.
Protocol
Ik heb dus wel de communicatie met een eenvoudige logic analyser bekeken. Dat geeft dit overzichtsbeeld. Signaal 1 en 2 is de communicatie tussen beide microcontroller. Die sturen dus iedere 5 s een bericht van een paar bytes. Er lijkt verder geen bijzonder afstemming te zijn.
Signaal 3 is de communicatie van de buitenunit (warmtepomp, WP) naar control box, en 4 is die in omgekeerde richting. Dit is op basis van een wat geavanceerder protocol:
/f/image/9TvyoRO4EzOiPWgWOvTs8dvV.png?f=fotoalbum_large)
Hier nog wat verder ingezoomd:
/f/image/YZOgW3HneltPu36lXDJXpZ7E.png?f=fotoalbum_large)
En nog wat verder (nu met 5 en 6 de inter-IC communicatie):
/f/image/oYLuftB0db72eF41dugr1IUA.png?f=fotoalbum_large)
Protocol opbouw
Dit is wat ik tot dusverre weet over dat protocol:
•
- Bits duren 1.5 ms. Dat betekent dat de communicatie op een ongebruikelijke 666 bps verloopt.
- Nemen we de control box (CB) als centrale eenheid dan is CB naar de warmtepomp (WP) ‘transmit (Tx), en WP → CB ‘receive’ (Rx).
- Uitgangspositie is dat beide datalijnen laag zijn.
- CB maakt Tx hoog
- WP reageert hier op door Rx hoog te maken
- 8 ms later begint de CB op Tx te zenden, dit wordt vrijwel direct door de WP op Rx teruggestuurd, wellicht om controle mogelijk te maken.
- De opbouw van het bericht van CB naar WP is voor zover ik kan nagaan als volgt:
- ◦ Eerste byte is altijd 19 hexadecimaal (25 in decimaal),
- ◦ Tweede is een volgnummer (0, 1, 2, of 3).
- ◦ Derde byte is de lengte van het totale bericht van de CB: Resp. 8, 12, 8 en 8 bytes
- ◦ Dan volgt de inhoud van 3 of 7 bytes
- ◦ Als laatste vermoedelijk twee bytes met een checksum
- Als de CB na 8 of 12 bytes klaar is, gaat de BU door met zenden op de Rx waarbij zaken als temperatuur aan- en afvoer en buitentemperatuur overgedragen zullen worden. Dit gebeurt overigens niet als de checksum van de CB communicatie niet klopt!
- De opbouw van het bericht van WP naar CB is:
- ◦ Byte 1: Startnummer (91 in hexadecimaal, dus 145 in decimaal)
- ◦ Byte 2: Volgnummer (achtereenvolgens 1, 0, 2 en 3)
- ◦ Byte 3: Lengte met resp. 13, 12, 18 en 20 bytes
- ◦ Inhoud van 8, 7, 13 en 15 bytes
- ◦ Laatste twee bytes vermoedelijk weer de checksum
- ◦ Als laatste nog een byte met ‘0’(die niet meetelt voor de lengte
- Vervolgens stuurt de CB weer het eerste bericht.
- De pauze tussen de berichten is steeds 98~100 ms. Omdat de berichten verschillende lengtes hebben, betekent dit dat de start niet met een vast interval is. Het lijkt er meer op dat de CB steeds wacht op een hoog worden van de Rx en dan na 8 ms gaat zenden.
Ik heb niet gevonden waar dit soort communicatie nu vandaan komt, behalve dat het lijkt op het
RFC 916: Reliable Asynchronous Transfer Protocol (RATP) wat terug gaat tot tenminste 1984(!).
Protocol inhoud
Dan de inhoud. Dit zijn voorbeelden van de vier berichten die de CB heeft verstuurt. In blauw en rood getallen die ik heb zie veranderen. In decimaal is het:
Het 4de en 5de byte van bericht ‘2’ zijn cruciaal. Byte 4 is 0 (uit) of 1 (aan) en byte 5 geeft het gevraagde vermogen, vermoedelijk tussen 0 en 12. Het is een lineaire lijn:
Verder heb ik tot dusverre geen andere getallen van CB naar WP gezien. Dat betekent dat de WP aansturen best eenvoudig is; alleen deze twee bytes hoeven te worden aangepast.
De WP stuurt meer terug. In decimaal:
:strip_exif()/f/image/IPo4qBY0XBNfl12ouDHWmSFK.png?f=user_large)
Ook hier weer in blauw getallen die veranderden. Dat zijn er dus best veel en vooralsnog heb ik geen idee wat het is. Het zijn geen voor de hand liggende getallen die bv. een watertemperatuur vertegenwoordigen.
Lastig tot dusverre is dat het me niet is gelukt te achterhalen hoe de checksum wordt berekend. Ideeën zijn welkom!
Alternatieve aansturing
Wat ik nu heb gedaan is een Arduino Mega2560 koppelen aan de communicatie tussen CB en WP. Het signaal vanaf de de WP wordt afgetapt, dat naar de WP heb ik onderbroken door 1 kant van R14 los te halen en hier voed ik een seriële uitgang van de Arduino op in.
Wat het programma nu op hoofdlijnen doet:
- Tenminste 80 ms wachten nadat WP Rx laag heeft gemaakt, tot deze 7.7 ms hoog is geweest (dit komt nauw)
- Dan beginnen met het versturen van het eerste bericht. Dit heb ik gewoon gekopieerd zoals ik het heb opgevangen
- Vervolgens weer 80 ms bij Rx is laag wachten tot Rx 7.7 ms hoog is geworden. Dan tweede bericht sturen
- Zelfde bij derde bericht, behalve dat ik hier bytes 4 en 5 vervang door aan/uit en het gewenste vermogen. Op dit moment kan ik dat lokaal met een rotary decoder instellen en aflezen met een OLED schermpje. Ik maak een voorselectie tussen 0 en 10 en activeer die dan door de draaiknop in te drukken.
- Als laatste het 4de bericht.
Verder heb ik al voorbereid om tegelijkertijd op een andere seriële poort Rx uit te lezen. Maar hier doe ik nog even niets mee.
Hoe verder?
Doel 1 is bereikt: Ik kan zelf beslissen met hoeveel vermogen de warmtepomp werkt. Alleen zal de CB nu nog wel de CV aan gaan sturen. Dan heb ik in mijn geval voorkomen door deze op alleen sanitair te zetten.
Uiteindelijk is een soort ‘man-in-the-middle’ nodig die de berichten over en weer ontvangt, daar waar nodig aanpast en doorstuurt
Verder ontrafelen van het protocol tussen CB en WP gaat echter nog best wat moeite kosten: Wat is wat en hoe wordt die checksum berekend.
Makkelijker kan zijn om die andere communicatie te manipuleren, nl. die tussen beide microcontrollers. Hier komt de interessant info als watertemperatuur en wellicht ook de buitentemperatuur voorbij. We weten op dit moment echter niet welke van de twee beslist of de CV of de WP wordt gebruikt.
Afluisteren van de communicatie is eenvoudig. Toen ik de print er toch uit had, heb ik alvast pinnen in de pads gesoldeerd. Maar ingrijpen op de communicatie vereist doorkrassen van printsporen.
De communicatie zelf lijkt een heel stuk eenvoudiger. In detail heb ik er nog niet naar gekeken. Maar iedere 5 s gaan er van het ene IC een paar bytes naar de ander, en een paar tienden later de andere kant. Zo op het eerste gezicht veel eenvoudiger dan wat er naar de WP gaat.
Wordt vervolgd...