Home Automation #3 - MIAUW!

Posted by Sander van Kasteel on June 02, 2015 · 1687 words, 12 mins read

Categories:

In de afgelopen paar weken ben ik flink bezig geweest met programmeren van de webinterface en de daarbij behorende backend. Maar het belangrijkste van alles! Het project heeft een codenaam gekregen, namelijk Project Skittles. De reden dat het Project Skittles heet is eigenlijk heel simpel, ik wist niks beters en mijn kat heet ook zo ;)

skittles

Allereerst ben ik begonnen met maken van de webinterface en het toevoegen van een webserver aan het gehele pakket. Mijn eerste idee om mijn gehele automatiseringssysteem in PHP te schrijven, is in het water gevallen omdat de ESP8266 geen HTTP request kan hebben door de beperkte buffergrootte waardoor er corruptie van de data ontstaat en daarnaast vond ik dit een goed excuus om mijn roestige Python kennis bij te spijkeren. Dus heb ik er toen voor gekozen om zelf een simpel TCP protocol te gaan bedenken en implementeren. Sinds de vorige "versie" van het gehele systeem heb ik nog niks echt veranderd aan de implementatie van het protocol.

Om het systeem beheerbaar te maken via HTTP, heb ik besloten om CherryPy mee te leveren. CherryPy is een Python module die het mogelijk maakt om een HTTP server op te bouwen en te configureren naar jouw eisen / wensen. Als template engine heb ik gekozen voor Jinja 2, voor de HTML layout heb ik gekozen voor Bootstrap en grafische elementen heb ik gekozen voor Font Awesome. De reden dat ik gekozen heb voor Bootstrap is omdat Bootstrap mij super makkelijk een responsive layout geeft en ik me dus geen zorgen meer hoef te maken over CSS, verschillende resoluties etc etc.

In de vorige "versie" van mijn server, werden alle statussen weggeschreven in files en eigenlijk vond ik eigenlijk toch niet zo heel erg handig dus heb ik besloten om alles weg te schrijven in een MySQL database.

En dit is dan het eind resultaat van mijn Bootstrap "webdesign". Webdesign staat met een reden in quotes want ik ben verre van een webdesigner ;)lights

Screenshot from 2015-06-02 10-21-04

Dit zijn op dit moment de enige 2 pagina's die beschikbaar zijn en enigzins werken. De werking zal verder worden uitgewerkt zodra ik het systeem verder uitgedacht heb. Op de 'lampen' pagina, is het mogelijk om lampen aan en uit te zetten, maar nog niet verwijderen en/of toevoegen. Het toevoegen en/of verwijderen van lampen moet nog gebeuren de MySQL database. Het aan/uitzetten van lampen gebeurt via AJAX.

De data die op dit moment zichtbaar is op de 'temperatuur' pagina, is op dit moment allemaal test data en doet in mijn systeem nog helemaal niks want ik heb daarvoor nog niet de juiste onderdelen.

Ik ben mij vooral aan het focussen geweest op de API en een bijbehorende Android app. De API is op dit moment poepje simpel.

GET /api/lights
Deze functie retourneert een array met Javascript objecten met daarin de naam en de huidige status. De huidige status is een boolean, dus deze kan alleen maar aan of uit zijn (true of false).

[
      {
            'name': 'kitchen',
            'status': 'false'
      },
      {
            'name': 'gang',
            'status': 'false'
      },
      {
            'name': 'kamer',
            'status': 'false'
      }
]

POST /api/light/update
Met deze functie kan je een lamp een nieuwe status geven. Deze functie heeft op dit moment geen return, ook niet bij een fout.
Bijvoorbeeld;

POST

{
    'lightname' : 'kitchen',
    'status' : 'true'
}

POST /api/temperature
Met deze functie kan je de huidige temperatuur opvragen binnen een kamer en zal bij succes een JSON object retourneren. De temperaturen die geretourneerd worden zijn in Celsius.
POST

{
    'room' : 'gang'
}

RETURN

{
    'room': 'gang',
    'temperature': 20.5
}

GET /api
Met deze functie kan je kijken of de API en daarmee ook de server nog online is. Deze functies retourneert een JSON object indien succesvol.

{
      'miauw': 'said skittles'
}

En dat zijn op dit moment de API functies. In de loop van de tijd wil de API nog verder gaan uitbreiden. Maar voor het moment voldoet dit wel. Met deze beperkte API set, ben ik al wel in staat geweest om een Android app te ontwikkelen. Hieronder zie je een screenshot tijdens de ontwikkeling van de huidige versie. Screenshot from 2015-05-26 16-22-01

Inmiddels is Android app qua ontwikkeling al wat verder gevorderd en is het inmiddels mogelijk om de status van de lampen te bekijken en te veranderen. Uiteraard hoort daar ook een demotje bij, zie hiervoor het onderstaande YouTube filmpje.

Nu het project verder en verder begint te komen, wordt het tijd om weer eens wat inkopen te gaan doen. Allereerst heb ik een voeding nodig om de hele boel te voorzien van stroom. Mijn eerste gedachte was om zelf een voeding te gaan ontwerpen op basis van de HLK-PM01. Voor de mensen die de HLK-PM01 niet kennen, het is een gereguleerde power module die het mogelijk maakt om 1 keer van 230 Volt AC naar 5 Volt DC te gaan. Dus dan hoef je niet zelf te gaan knutselen om een bruggelijkrichter (bridge rectifier in het Engels) te gaan bouwen en alle bijbehorende beveiliging. Het enige nadeel is de prijs. De module alleen al is op eBay te vinden voor ~ 6 dollar en dan moet er nog overspanning en kortsluiting beveiliging bij. Nog een beperking van de HLK-PM01 de output is beperkt tot 5V @ 600 mA. Na een kort rekensommetje is 600 mA toch wat aan de krappe kant, aangezien ik op ongeveer 550 mA uitkom met al mijn onderdelen (inclusief veiligheidsmarge). Dus heb ik besloten om een kant en klare voeding in China te kopen.

Na wat zoekwerk kwam ik uit op deze voeding, typenummer XK-1205DC. De verkoper beweert dat deze gereguleerde voeding maximaal 4 A kan leveren (nominaal tussen de 2 en 4 A) en deze voeding is ook nog eens een stuk goedkoper dan den HLK-PM01. De XK-1205DC kost namelijk slechts $ 3,83 (ten tijde van schrijven). Dus ik ben benieuwd wat ik voor dat bedrag ga krijgen ;). Zolang die al 1000mA of meer kan leveren ben ik al tevreden.

Als 230V relay heb ik gekozen voor de Songle SRD-05VDC-SL. Dit is een relais bedoelt voor het gebruik in Arduino en andere micro processoren omgeving. Hij heeft 1 digitale input waarmee je de relais kan laten schakelen tussen aan en uit.

Daarnaast heb ik nog een aantal andere dingen besteld vanuit China een DHT22 (temperatuur en luchtvochtigheid meter), een HC-SR501 PIR sensor (een sensor bedoelt voor het detecteren van beweging) en een setje van 2x 28BYJ-48 stepper motor inclusief ULN2003 driver board. Mijn plan is om deze stepper motors te gaan gebruiken voor het openen en dichtdoen van mijn gordijnen. Ik weet niet of ze daar krachtig genoeg voor zijn en hoe ik dit mechanisch ga aanpakken.

Maar het leukste komt nog. Al een flinke tijd droom ik van het hebben van een oscilloscoop, alleen iedere keer als ik op Marktplaats kijk staan ze er voor of belachelijk veel geld op. 200 euro voor een 2de hands analoge Tektronix (exclusief probes) en dan kan ik net zo goed een Owon / Rigol voor ~ 300 euro kopen of als ik ze goedkoper vind, dan zijn het meestal compleet afgetrapte Hameg / Philips oscilloscopen en die kosten dan nog tussen de 75 en 125 euro waarvan de werking nog maar te betwijfelen valt. En dat vind ik voor een stuk gereedschap waarvan ik betwijfel of ik hem ook echt vaak zal gebruiken redelijk aan de prijzige kant.

Nu was ik gisteren middag even aan het rondspeuren op Banggood.com en vond ik een kit van een oscilloscoop voor €21.63 . Om precies te zijn is dit de JYE Tech DSO 138. Stiekem heeft dit wel mijn interesse gewekt. Het is een oscilloscoop kit met een maximale analoge bandbreedte van 200 Khz, maximaal 1 miljioen samples per seconde, een maximale peak-to-peak input van 50V, triggering en DC,AC en GND coupling. Nu weet ik zelf dat het geen vervanging is voor een echt oscilloscoop maar voor het geld, vind ik het best grappig. Dus die heb ik ook nog besteld en dan kan ik die gelijk ook even op de pijnbank / reviewbank leggen ;)

Maar zodra al deze onderdelen binnen zijn, kan ik mijn huidige prototype eens verder gaan uitbouwen en hopelijk snel gaan verwerken tot echt werkende module inclusief professioneel gefabriceerde PCB en behuizing.

Tot die tijd staat er echter nog genoeg op mijn ToDo lijst. Zo wil ik alle componenten binnen Project Skittles kunnen toekennen aan een ruimte. Bijvoorbeeld "lamp x" hoort bij ruimte "gang". Daarnaast staan er nog een paar dingen op het lijstje. De mogelijkheid tot bijvoorbeeld het updaten van de temperatuur vanaf het TCP protocol. Ik wil ook nog leuke grafiekjes kunnen genereren zoals gemiddelde brandtijd van lamp x per dag, gemiddelde temperatuur per dag etc etc. Ondersteuning voor LED strips. Al met al genoeg te doen dus!

Mocht je geïnteresseerd zijn in de source en eventueel kritiek hebben op mijn Python, bijna alles staat op Github. Het enige wat op dit moment nog niet op Github staat, is de Arduino code voor de "appliances" (de Arduino module). Maar die zal ik in de loop van de dag online zetten.

Ik hoop dat dit lange verhaal een beetje leuk was om te lezen en tot de volgende keer! :)