Automatisera belysningen

Jag har sedan en tid tillbaka funderat på hur man kan automatisera belysningen i lägenheten. Egentligen borde det inte vara så svårt, tekniken finns ju redan och är busenkel. Efter lite experiment visade det sig också vara fallet – det är enkelt.

Så vad vill jag automatisera?

  • När solen går ner ska lamporna i fönstren tändas. Timer till all ära men det är för omständligt att behöva gå runt och ändra tiden på flera ställen. Det behövs ett centralt system, speciellt i ett land som Sverige där dagens läng ändras i rasande takt på hösten och våren. Vidare vill man att alla lampor ska tänds samtidigt, nämligen när solen går ner.
  • När man kommer hem ska man inte behövas mötas av mörker. Det skall lysa i lägenheten även om ingen är hemma men samtidigt ska lamporna inte lysa i onödan. Dvs. straxt innan man kommer hem ska hallampan tändas.
  • Jag tycker att det ska vara mörkt i hela lägenheten när man kollar på film. Jag vet att det är lite delad mening om denna uppfattning men jag tycker om känslan som man får när man är på bio; det är totalt mörker i de mörka scenerna och i de ljusa scenerna blir man nästan bländad. Jag glömmer aldrig känslan när jag såg Matrix (revolution eller reloaded) på bio och biosalongen var totalt kolsvart till följd av den dystra och tröstlösa känslan som regissören försökte förmedla, tills nästa scenväxling när hela salongen lystes upp av en förvånansvärt ljus och vit bioduk. Detta är en känsla som jag vill återskapa hemma. När man sedan slutar kolla på filmen ska lamporna tändas igen (förutsatt att solen har gått ner).

Jag har valt att använda mig av tellstick tillsammans med en raspberry pi som står på dygnet runt. Hur man sätter upp detta system kan man läsa här:

Om vi börjar med att lamporna ska tändas när solen går ner. Man skulle kunna lösa detta genom att ett script kollar om solen har gått ner med jämna mellanrum. Ex:

PHP:

// PHP has to much functionality for its own good
time() < date_sunset(time(), SUNFUNCS_RET_TIMESTAMP)

Python:

from astral import Astral

astral = Astral()
astral.solar_depression = 'civil'
city = astral['Stockholm']
sunset_time = city.sun(date=datetime.datetime.now(), local=True)['sunset']
now = datetime.datetime.now(pytz.timezone(city.timezone))
return now > sunset_time

Dock resulterar detta i att man måste spara ett state som avgör om lamporna har tänds (så att tellstick enheten inte konstant skickar ut signaler om att lamorna ska tändas). Detta skulle man självfallet enkelt kunna lösa igenom att skapa en evighets loop tillsammans med sleep (eller en databas). Jag har dock valt att förenkla det hela genom att använda mig av IFTTT. Tyvärr stödjer inte IFTTT webhooks vilket gör att det inte finns något naturligt sätt att kommunicera med min raspberry pi. Lyckligtvis finns det personer som har stött på problemet innan mig och som har löst det. IFTTT har stöd för att skapa inlägg i wordpress bloggar och stödjer därför xmlrpc och genom att skapa ett fejkat xmlrpc-gränssnitt kan man skicka olika anrop till diverse webbaserade enheter.

Det första som behövs är alltså att skapa ett webb-api för tellstick. Detta valde jag att göra i python och med ramverket flask. Ex:

$ virtualenv tellstick_server # setup python:
$ source tellstick_server/bin/activate
$ pip install Flask Astral
$ mkdir tellstick_server/www
$ touch tellstick_server/www/app.py

Min app.py ser ut som följande:

Sedan kan man skapa ett recept i IFTTT som liknar detta: IFTTT Recipe: Turn on lights on sunset connects weather to wordpress

Eftersom vi nu har en fungerande länk mellan IFTTT och raspberry pi kan man fortsätta använda IFTTT för att tända lampan/lamporna när man kommer hem: IFTTT Recipe: Turn on hallway lamp when I come home connects android-location to wordpress

Man kan även lägga till ett recept för att släcka vissa lampor när man lämnar lägenheten: IFTTT Recipe: Turn off hallway lamp when I leave home connects android-location to wordpress

Jag använder XBMC för att titta på film och serier. Tur nog har XBMC ett ganska bra gränssnitt för att skapa plugin (även om de inte följer PEP8. En sak om många kanske inte känner till är att man kan exekvera kod vid uppstart av XBMC utan att behöva skapa ett helt plugin. När XBMC startas exekveras .xbmc/autoexec.py (för linux) i en XBMC context vilket innebär att man bland annat har tillgång till xbmc biblioteket.

Min .xbmc/autoexec.py ser ut på följande vis:

execfile("custom/path/XBMC_light.py")

Och min XBMC_light.py ser ut som följande:

Där har ni det. Hur man med ganska enkla metoder kan automatisera belysningen hemma.