ga('send', 'pageview');
Categories
Blogg Teknik

Olas äventyr i hemautomatisering – del 1

Jag har länge haft en förkärlek för att programmera saker som påverkar oss i den fysiska världen, det som numera kallas för Internet of Things. CRUD-appar i all ära, men det är något speciellt med att trycka på en bluetooth-knapp och se hur gardinerna i sovrummet drar upp sig själva, eller hur fläkten startar precis när rummet börjar kännas kvalmigt.

Tack vare Moore’s lag och olika makroekonomiska faktorer som jag inte vågar spekulera om så har mikrodatorer blivit små, energisnåla och billiga. Även på mjukvarusidan har trösklarna minskat enormt, tack vare aktörer som Arduino och Raspberry Pi Foundation vilka skapat ny hårdvara, operativsystem och verktyg med målet att både vara lättillgängliga för nybörjare och användbara för entusiaster. Där man tidigare varit tvungen att skapa mosaik-liknande kretskort fyllda av komponenter för att lösa enkla uppgifter räcker det idag ofta med en mikrodator, några kablar och några sensorer eller motorer.

Det tog mig själv ett tag innan jag fick upp ögonen för hur lätt det blivit att komma igång med hemautomatisering, men när jag väl gjort det så öppnades slussarna och jag påbörjade en mängd olika projekt. I denna artikel vill jag presentera några av mina äventyr i hemautomatisering för att hjälpa dig, käre läsare, att nå samma insikt.

Projekt: Fjärrstyrda gardiner

I ett tidigare boende märkte jag att det var lättare att vakna om jag fick in solljus i sovrummet på morgonen. Samtidigt blev det svårt att sova om det blev för ljust för tidigt på morgonen. Jag var också ovillig (läs: lat) att gå upp och öppna gardinerna när jag just vaknat. Utrustad med dessa krav kom jag då fram till en lösning: en gardin som kunde öppnas och stängas av en liten och tyst motor styrd av en mikrodator som kan aktiveras med en knapp liggandes på mitt nattduksbord.

Rullgardiner som hissas upp och ned med ett snöre är ökända för att fastna och trassla ihop sig, så jag började med att byta ut gardinen mot en horisontell gardin. Gardinstången där bestod av en skena på vilken gardinkrokar rullar med små hjul. Genom att fästa ett snöre i alla hjulen och snurra det runt en linda kopplad till en stegmotor så fick jag en konstruktion som kan dra ihop alla gardinkrokar för att öppna gardinen och sprida ut alla gardinkrokar för att stänga gardinen. Stegmotorer brukar kombineras med en styrkrets (eng. driver) som i sin tur kan styras från en mikrodator. Jag kopplade in en Arduino Uno (senare ersatt med en Arduino Nano för att spara plats) som stod för både strömförsörjning och styrning av styrkrets och stegmotor. Jag kopplade sedan in Arduinon i en Raspberry Pi med USB och kommunicerade mellan dom med ett serieprotokoll. Programmet i sin tur lyssnade både på Bluetooth efter knapptryckningar från en Flic knapp och exponerade en enkel webbsida som jag kunde gå in på med mobil eller dator för att detaljstyra gardinerna vid behov.

På mjukvarusidan programmerade jag Arduino:n med C++ och använde ett färdigt bibliotek (Stepper) för att kommunicera med motorns styrkrets. Hela koden blev 35 rader lång, med den viktigaste biten i fokus nedan:

void loop() {
  int stepsToTake;
  if (Serial.available()) {
    char ch = Serial.read();
    switch(ch) {
      case 'w':
        stepsToTake = STEPS_PER_OUTPUT_REVOLUTION; // Rotate CW 1 turn
        small_stepper.setSpeed(500);
        small_stepper.step(stepsToTake);
        delay(100);
        break;
      case 'q':
        stepsToTake = -STEPS_PER_OUTPUT_REVOLUTION; // Rotate CCW 1 turn
        small_stepper.setSpeed(500);
        small_stepper.step(stepsToTake);
        delay(100);
        break;
    }
  }
}

På Raspberry Pi:n skrev jag två Python-program, varav det ena använde webbramverket Bottle för webb-servern och biblioteket “serial” för seriekommunikationen medan det andra använde aioflic för bluetooth-kommunikation med Flic-knappen och requests för HTTP. Den koden blev något längre på 65 rader och 81 rader, men är fortfarande ganska kortfattad.

Projektet fungerade riktigt bra och det blev en ritual att varje morgon vakna och trycka på knappen för att sedan vänta medan gardinerna sakta öppnades och släppte in dagsljuset. Tekniken gick dock framåt med stormsteg efter att jag byggt klart projektet och hade jag gjort samma sak idag så hade jag förenklat projektet genom att ta bort Raspberry Pi:n och ersätta Arduino Nano:n med en moderna Wemos D1 Mini som kommer med WiFi och Bluetooth inbyggt. Numera har även IKEA lanserat en automatisk rullgardin med tillhörande fjärrkontroll, vilket också är ett utmärkt alternativ.

Projekt: Automatisk fläkt

Ett annat behov som dök upp i hemmet var att mitt arbetsrum ofta blev mycket varmt då solen låg på större delen av dagen. Jag hade en enkel bordsfläkt som var effektiv, men det var ibland lätt att glömma bort att sätta på den när värmen i rummet steg. Min lösning blev då att koppla en liten temperatursensor till GPIO-pinnarna på en Raspberry Pi utrustad med en Telldus-USB-antenn som kommunicerade med en Nexa-stickkontakt kopplad till fläkten.

På mjukvarusidan så skrev jag ett Python-program på Raspberry Pi:n som använder biblioteket RPi.GPIO för att varje minut läsa av temperatursensorn. Om temperaturen överstiger ett tröskelvärde på 25°C under tre sammanhängande avläsningar så skickas en startsignal till Nexa-stickkontakten genom Telldus-antennen med hjälp av biblioteket tellcore-py. Den aktiverar då stickkontakten som fläkten är inkopplad i och den startar. Om temperaturen däremot understiger 25°C tre mätningar i rad så kommer en stoppsignal skickas till Nexa-kontakten och fläkten stannar.

from tellcore.telldus import TelldusCore

def activateFan():
    core = TelldusCore()
    for device in core.devices():
        if "Fan control device" == device.name:
            device.turn_on()

def deactivateFan():
    core = TelldusCore()
    for device in core.devices():
        if "Fan control device" == device.name:
            device.turn_off()

Även detta blev ett enkelt men effektivt projekt och såväl kod som hårdvara kunde återanvändas till andra typer av apparater som kan starta bara dom får ström genom en fjärrstyrd kontakt. Numera har dock Telldus ändrat sitt utbud av produkter, så en modern variant av detta projekt skulle troligen behöva en annan apparat för att styra Nexa-kontakten. Dock så finns det numera även WiFi-ansluta stickkontakter som kan uppnå samma resultat, vilket skulle förenklat detta projekt betydligt.

Koden för dessa två projekt är fritt tillgänglig och publicerade under öppna licenser. Du kan hitta dom under dessa två länkar:

Andra delen av mina äventyr kommer om en vecka, då även med min slutsats kring dessa projekt. Hoppas du vill läsa vidare då!

By Ola Rende

Backendutvecklare, fullstackutvecklare

Leave a Reply

Your email address will not be published. Required fields are marked *