Home Control

Home Control System

De opzet

Er is natuurlijk al van alles te krijgen om je huis te automatiseren (Home Control, ofwel 'Domotica'). Maar, vaak duur, lastig op te zetten, en niet altijd energiezuinig (bovendien, 1 Watt continue kost ongeveer €2.50, een 100 Watt PC i de gangkast kost dus zo'n €250 per jaar aan stroom). En, zelf doen is veel leuker... Vandaar dat ik zelf wat aan het hobbyen ben geslagen. Helaas, door tijdsgebrek ligt het voornamelijk stil.

Langzaam begint er toch een echt home control netwerk te ontstaan. Hierbij wordt niet alles direct door het centrale brein (de Raspberry) bestuurd, maar heb ik 'lokale intelligentie'; slimme kleine nodes gebaseerd op de AVR ATtiny. Deze hangen dan via een 3-draads seriele bus aan de Raspberry (Ethernet is veel te 'zwaar' voor dit doel). Je kan het het best vergelijken met hoe een lichaam werkt: de raspberry is het centrale brein, maar een heleboel taken worden lokaal door reflexen afgehandeld, en de zintuigen zijn daarmee verbonden. Voordeel is dat deze reflexen doorlopen ook als het brein tijdelijk met iets anders bezig is (of plat ligt).

Een voorbeeld hiervan is de afzuiging in de douche: een ATtiny is een lokale node, met daarop als zintuig een I2C temperatuursensor aan de warmwatertoevoer (handiger dan via de lamp). Als er gedoucht wordt wordt de leiding warm, en schakelt de ATtiny zelfstandig de afzuiger aan via een solid state schakelaar: de reflexreactie van de ATtiny. De ATtiny regelt ook de nalooptijd: hoe lang moet de ventilator doorlopen als er gestopt is met douchen. Maar, dit alles wordt ook doorgegeven aan het brein, en dat kan bijvoorbeeld besluiten de reflex te onderdrukken, of de nalooptijd aan te passen afhankelijk van het seizoen. Ook is het geheugen in het brein: de temperatuur wordt hier gelogd (en nu en dan centraal opgevraagd).

Ik heb over de opbouw van het systeem en het netwerk een lezing gehouden op 20 augustus 2013 bij EmSE (Embedded Systems Eindhoven, een hobby-club); hier de Home Control presentatie (pdf).

De 'brains'

De intelligentie van het systeem wordt geregeld door een raspberry Pi. Deze zit via Ethernet ook aan het internet, en vormt zo ook de link naar de buitenwereld. Bovendien staat deze toch al aan, omdat er ook allerlei andere services op draaien, zoals de file server en de SSH toegang.

De 'ruggegraat' (netwerk)

Het netwerk wordt gevormd door een seriele bus op 9600 bits per seconde. Aan de kant van de Raspberry is deze optisch gekoppeld, zodat een stoorpiek (b.v. door blikseminslag in de buurt) niet ook de Raspberry opblaast. In principe kan de bus (en de optische koppeling) hogere snelheden aan, maar is tot nu toe niet nodig.

De bus bestaat uit drie draden; een voor 'aarde', een voor de +5 Volt voeding, en een voor de communicatie (zogeheten multi-drop/wired-or: alle nodes hangen voor zowel lezen als schrijven aan dezelfde lijn). Er gaat een simpel protocol overheen, waarbij de Raspberry als master een commando verstuurd, en de geaddresseerde node een antwoord geeft, beiden volgens het onderstaande formaat:

<1:type,len><1:address><N:message><1:checkbyte>

De reflexen

Naast de centrale intelligentie zijn er de slimme nodes gebaseerd op de AVR ATtiny (en later de NXP LPC81x), direct aangesloten op het seriele netwerk. Zou ook via een optische koppeling kunnen, maar ach, ze zijn zo goedkoop.

De zintuigen

En aan de nodes zitten de 'zintuigen', meestal via I²C. Dit zijn bijvoorbeeld de LM75 I²C temperatuursensoren zoals al beschreven op mijn Raspberry hardware pagina. Ook zitten hier de 'spieren', actuatoren, aan die het resltaat weer naar de buitenwereld teruggeven, bijvoorbeeld een solid state relais om de afzuiging aan te schakele (ook weer optisch gescheiden, je wilt geen 220 Volt op je netwerk).

Toepassingen

Als voorbeeld van enkele toepassingen die al draaien:

  • Badkamerafzuiging: via een I2C temperatuursensor op de warmwaterleiding wordt gezien dat er gedouched wordt, en wordt de afzuiger aangezet. Via een timer in software draait deze nog een instelbare tijd door na het douchen. Loopt volledig autonoom, maar de Raspberry kan wel de uitlooptijd instellen en de temperaturen monitoren.
  • C.V. pomp van de vloerverwarming: hier heb ik de 'domme' pomp (draaide altijd) vervangen door een slimme node, met temperatuursensoren op de aan- en afvoer-leidingen. Een slim algoritme zet aan de hand van de temperaturen (via een optisch gekoppeld solid state relais) de pomp aan. Ook zorgt deze er voor dat de pomp elke dag in ieder geval even draait, ook als er die dag geen warmtevraag was (zet dan de pomp even aan). Ook weer autonoom, maar de Raspberry kan de zaak in de gaten houden en bijregelen.

Beiden zijn dus vrij autonoom: als de Raspberry om wat voor reden zou crashen, gaat de vloerverwarming en zo gewoon door, hoogstens wat minder slim.

De implementatie

De nodes

'Kernel' interrupt gestuurd voor korte taken
- Serial Rx interrupt
- Wake-up processor bij compleet bericht
- Filtering op adres al in interrupt (state machine)
- Serial Tx interrupt
- Verstuurt reply-message
- Timer interrupt (1 kHz)
- Real-time clock (½ Hz), time-outs
Free running main program control loop
- I2C afhandeling indien nodig
- Slapen als er niets te doen is (wake-up @ irq)
Complete framework in 'C' (lege app) ~ 1 kByte Flash