Met een Raspberry Pi kun je heel eenvoudig en goedkoop Domotica in je huis implementeren. In deze blog leg ik uit wat je hiervoor moet doen.

Tegenwoordig zie je dat je steeds meer zaken met de computer en/of smartphone in je huis kan aansturen. Denk hierbij bijvoorbeeld aan de Philips HUE en Nefit Easy Thermostaat. Maar je kunt echter nog veel meer regelen. Dit alles valt onder de definitie van Domotica. Letterlijk betekent domotica het aansturen van elektrische toestellen in een huis door informatica en elektronica. In de praktijk gaat het echter veel verder. Het geïntegreerde systeem zorgt namelijk voor een verhoging van gemak, comfort, veiligheid en energiebewustzijn door waarneming, communicatie en flexibiliteit.

Zo kun je nog veel meer in je huis automatiseren. Denk hierbij bijvoorbeeld aan:

  • je deurbel automatiseren zodat je notificatie op je telefoon krijg als hierop wordt gedrukt
  • rolluiken en/of garagedeuren open/dicht doen
  • temperatuur/luchtvochtigheid meten
  • lampen/apparaten aan/uit zetten
  • IP camera’s besturen

Het wordt nog leuker als je acties kunt combineren. Een voorbeeld is dat als er op de deurbel wordt gedrukt je een notificatie krijg, er een lamp aan gaat en de IP camera automatisch een foto naar je telefoon stuurt. Nu zijn er veel kant-en-klare oplossingen zoals Homewizard maar het leek mij leuk om dit helemaal zelf uit te zoeken met een goedkopere oplossing. Je komt dan al snel bij een Raspberry Pi uit die je al voor Euro 25,= hebt. Je hebt verder nog een USB poweradapter en een SD kaartje nodig.

Update 25 december 2018
Aangezien Pimatic niet actief meer verder ontwikkeld wordt ben ik overgestapt op Domoticz. Zie deze blog van mij hoe je Domoticz installeert.

Als je de Raspberry PI hebt moet je hierop eerst een Operating System zetten. Een aanrader is het gratis Raspbian dat is gebasseerd op Linux Debian. Download hiervoor een Raspbian image vanaf deze lokatie. Vervolgens schrijf je met Win32DiskImage dit image op een SDCard.

Vanuit veiligheidsoogpunt staat in de laatste versie van Raspbian SSH standaard uitgeschakeld. Hierdoor kun je niet remote inloggen met Putty. Dit is eenvoudig op te lossen door, nadat je image hebt gezet op je SD kaart, een leeg bestand met de naam ‘ssh’ te zetten in de ‘boot’ partition (drive letter die je in Windows ziet).

Stop het SD kaartje in je Raspberry PI en sluit de USB power aan. Hierna kun je met Putty inloggen op je Raspberry PI met user-naam ‘pi’ en wachtwoord ‘raspberry’. Voer nu de volgende zaken eenmalig uit:

#sudo raspi-config
#sudo apt-get install rpi-update
#sudo rpi-update
#sudo reboot

Vergeet niet je standaard paswoord te veranderen met optie 2 in ‘raspi-config’. Update nu naar de laatste software:

#sudo apt-get update
#sudo apt-get upgrade
#sudo reboot

Installeer vi support zodat je files kunt editten:

#sudo apt-get install vim-nox

Vervolgens kun je nog wat handige software installeren. Om er voor te zorgen dat je tijd altijd actueel is moet je de volgende commando’s uitvoeren:

#sudo dpkg-reconfigure tzdata
#sudo apt-get install ntp ntpdate

Ook is het handig dat je Samba installeert zodat je eventueel altijd met een browser je files op je Raspberry Pi kunt benaderen:

#sudo apt-get install samba samba-client samba-common-bin
#sudo useradd some_user_name
#sudo smbpasswd -a some_user_name

Voeg nu de volgende regels toe aan de file ‘/etc/samba/smb.conf’

[Root]
browseable = yes
writeable = yes
path = /
revalidate = yes
comment = Share to Root
valid users = some_user_name
available = yes

Verder moet je samba opnieuw opstarten met het volgende commando:

#sudo /etc/init.d/samba restart

We hebben nu dus een werkend OS op de Raspberry PI staan. Nu moeten we nog wat extra hardware nodig om je diverse devices in je huis aan te sturen. Het populairst (en dus goedkoopst) zijn de zogenaamde KlikAanKlikUit (KAKU) modules. Deze werken op 433 MHz. Hiervoor moeten we nog een 433 MHz RF Transmitter en Receiver aanschaffen.

Voor een betere ontvangst en verzending van je 433 MHz signalen kun je beter gebruik maken van zogenaamde Superheterodyne RF Links.

Deze moet je op je GPIO connector van je Raspberry PI aansluiten. De GPIO heeft de volgende pin-verdeling:
Voor bovengenoemde 433 MHz RF Transmitter en Receiver doe je dit op de volgende pinnen:
Uiteindelijk ziet het er dan als volgt uit:

Update 22 januari 2016:
Beter sluit je de RF Receiver en RF Ontvanger apart aan via een Arduino om zo je Raspberry Pi CPU te ontlasten. Zie de volgende blog van mij hoe je dit doet.

Nu we dit allemaal in orde hebben moet je nog software hebben om de 433 MHz RF Transmitter/Receiver aan te sturen. Erg mooie software hiervoor is Pimatic. Op het forum van Gathering of Tweakers kun je een mooi topic hierover vinden. Met Pimatic kun je op een simpele manier allerlei zaken aansturen en op een simpele manier gecompliceerde regels instellen. Het mooie van Pimatic is dat er ontzettend veel plugins aanwezig zijn waardoor je allerlei leuke combinaties kunt maken:

  • Cron (voor het kunnen sturen op basis van tijd)
  • GPIO (voor het rechtstreeks aansturen van een GPIO, of kijken of deze wel of niet verbonden zijn)
  • pilight (Vrijwel alle devices van pilight kunnen geïmporteerd en bestuurd worden)
  • ping (is een device wel of niet bereikbaar?)
  • pushover (Stuur berichtjes middels de pushover API naar je telefoon)
  • Mail (Verstuur mail)
  • shell-execute (uitvoeren van CMD opdrachten)
  • sunrise (Een skala aan zonsop- en ondergang momenten op basis van locatie
  • sysinfo (monitor CPU temp, CPU load, memory load, disksize en pimatic DB size)
  • weather (Weersinformatie en voorspelling).

Vanuit Pimatic kun je automatisch controleren op updates en deze uitvoeren. Verder kun je per gebruiker instellen wat deze allemaal kunne doen. Zie de site van Pimatic voor meer informatie.

Het installeren van Pimatic is erg eenvoudig. Ten eerste moet je ‘nodes.js’ installeren zoals beschreven op de volgende link.

Pi Model A, B, B+ or Zero

wget https://nodejs.org/dist/v4.8.7/node-v4.8.7-linux-armv6l.tar.gz -P /tmp
cd /usr/local
sudo tar xzvf /tmp/node-v4.8.7-linux-armv6l.tar.gz --strip=1

Pi 2 Mode B or Pi 3 Model B

wget https://nodejs.org/dist/v4.8.7/node-v4.8.7-linux-armv7l.tar.gz -P /tmp
cd /usr/local
sudo tar xzvf /tmp/node-v4.8.7-linux-armv7l.tar.gz --strip=1

Om te controleren of dit goed is gegaan type je het volgende commando:

#/usr/bin/env node --version

Nu moet je Pimatic zelf nog installeren met de volgende commando’s:

#sudo apt-get install build-essential
#cd /home/pi
#mkdir pimatic-app
#npm install pimatic --prefix pimatic-app --production (let op: dit kan lang duren)

Copieer nu de default configuratie file:

#cd pimatic-app
#cp ./node_modules/pimatic/config_default.json ./config.json

Maak pimatic globaal beschikbaar met de volgende commando’s:

#cd ./node_modules/pimatic
#sudo npm link (let op: dit kan lang duren)

Om Pimatic voortaan automatisch te laten opstarten met je Raspberry Pi moet je de volgende commando’s uitvoeren:

#wget https://raw.github.com/pimatic/pimatic/master/install/pimatic-init-d
#sudo cp pimatic-init-d /etc/init.d/pimatic
#sudo chmod +x /etc/init.d/pimatic
#sudo chown root:root /etc/init.d/pimatic
#sudo update-rc.d pimatic defaults

Zoals gezegd maken de plugin Pimatic zo krachtig. Ik heb de volgende plugins geïnstalleerd:

#sudo npm install pimatic-cron
#sudo npm install pimatic-mobile-frontend
#sudo npm install pimatic-gpio
#sudo npm install pimatic-homeduino
#sudo npm install pimatic-log-reader
#sudo npm install pimatic-mail
#sudo npm install pimatic-pushover
#sudo npm install pimatic-shell-execute
#sudo npm install pimatic-sysinfo
#sudo npm install pimatic-weather

Soms is er de eerste keer een probleem met de sqlite3 database. Om er zeker van te zijn dat het goed gaat doe je het volgende:

#cd /home/pi/pimatic-app
#sudo rm -rf node_modules/sqlite3
#sudo npm install sqlite3

Je kunt nu handmatig de configuratie-file ‘/home/pi/pi-matic/config.json’ aanpassen naar jouw behoeften (denk hierbij aan poort-nummer, wachtwoord, devices, etc.). Zie vooral de site van Pimatic voor meer informatie hierover. Bij mij ziet de configuratie-file er ongeveer als volgt uit:

{
  "//": "Please only change this file when pimatic is NOT running else pimatic will overwrite your changes.",
  "settings": {
    "httpServer": {
      "enabled": true,
      "port": 8501
    },
    "database": {
      "deviceAttributeLogging": [
        {
          "deviceId": "*",
          "attributeName": "*",
          "expire": "7d",
          "type": "*"
        },
        {
          "deviceId": "*",
          "attributeName": "temperature",
          "expire": "1y",
          "type": "*"
        },
        {
          "deviceId": "*",
          "attributeName": "humidity",
          "expire": "1y",
          "type": "*"
        }
      ],
      "messageLogging": [
        {  
        "level": "*",
          "tags": [],
          "expire": "7d"
        }
      ]
    },
    "authentication": {
      "secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "httpsServer": {},
    "gui": {}
  },
  "plugins": [
    {
      "plugin": "cron"
    },
    {
      "plugin": "mobile-frontend",
      "theme": "graphite/water",
      "flat": false,
      "debug": false,
      "mode": "production"
    },
    {
       "plugin": "log-reader"
    },
    {
      "plugin": "shell-execute"
    },
    {
      "plugin": "pushover",
      "user": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
      "token": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    },
    {
      "plugin": "mail"
    },
    {
      "plugin": "sysinfo"
    },
    {
      "plugin": "weather"
    },
    {
      "plugin": "homeduino",
      "driver": "gpio",
      "driverOptions": {},
      "receiverPin": 1,
      "transmitterPin": 0
    },
    {
      "plugin": "gpio"
    },
    {
      "plugin": "sunrise"
    }
  ], 
  "devices": [
    {
      "class": "SystemSensor",
      "id": "syssensor",
      "name": "Systeem",
      "attributes": [
        {
          "name": "cpu"
        },
        {
          "name": "memory"
        },
        {
          "name": "temperature",
          "interval": 5000
        }
      ]
    },
    {
      "id": "weather",
      "class": "WeatherDevice",
      "name": "Huidig Weer Rijsbergen",
      "location": "Rijsbergen, Netherlands",
      "degreeType": "C",
      "timeout": 300000
    },
    {
      "id": "forecast",
      "class": "WeatherForecastDevice",
      "name": "Voorspelling Weer Rijsbergen",
      "location": "Rijsbergen, Netherlands",
      "degreeType": "C",
      "timeout": 300000,
      "day": 3
    },
    {
      "id": "rfswitch1",
      "name": "Stekker 1",
      "class": "HomeduinoRFSwitch",
      "protocols": [
        {
          "name": "switch1",
          "options": {
            "id": 42,
            "unit": 0
          }
        }
      ]
    },
    {
      "id": "rfswitch2",
      "name": "Stekker 2",
      "class": "HomeduinoRFSwitch",
      "protocols": [
        {
          "name": "switch1",
          "options": {
            "id": 43,
            "unit": 0
          }
        }
      ]
    },
    {
      "id": "rfswitch3",
      "name": "Slaapkamer Denise", 
      "class": "HomeduinoRFSwitch",
      "protocols": [
        {
          "name": "switch1",
          "options": {
            "id": 44,
            "unit": 0
          }
        }
      ]
    },
    {
      "id": "rfswitch4",
      "name": "Garagedeur",
      "class": "HomeduinoRFShutter",
      "protocols": [
        {
          "name": "switch1",
          "options": {
            "id": 45,
            "unit": 0
          }
        }
      ]
    },
    {
      "id": "dimmer",
      "name": "Dimmer",
      "class": "HomeduinoRFDimmer",
      "protocols": [
        {
          "name": "dimmer1",
          "options": {
            "id": 7654321,
            "unit": 0
          },
          "send": true,
          "receive": true
        }
      ]
    }
  ],
  "rules": [
    {
      "id": "pushover-stekker-1",
      "name": "Pushover Slaapkamer Denise on",
      "rule": "if Slaapkamer Denise is turned on then push title:\"Slaapkamer Denise\" message:\"Licht slaapkamer Denise is aan\" priority:1",
      "active": false,
      "logging": false
    },
    {
      "id": "pushover-stekker2",
      "name": "Pushover Slaapkamer Denise off",
      "rule": "if Slaapkamer Denise is turned off then push title:\"Slaapkamer Denise\" message:\"Licht slaapkamer Denise is uit\" priority:1",
      "active": false,
      "logging": false
    },
    {
      "id": "garagedeur",
      "name": "Garagedeur",
      "rule": "if $rfswitch4.position changes then push title:\"Garagedeur\" message:\"Garagedeur Trigger\" priority:1",
      "active": true,
      "logging": true
    }
  ],
  "pages": [
    {
      "id": "favourite",
      "name": "Favourites",
      "devices": [
        {
          "deviceId": "syssensor"
        },
        {
          "deviceId": "rfswitch4"
        },
        {
          "deviceId": "rfswitch1"
        },
        {
          "deviceId": "rfswitch2"
        },
        {
          "deviceId": "rfswitch3"
        },
        {
          "deviceId": "weather"
        },
        {
          "deviceId": "forecast"
        }
      ]
    }
  ],
  "groups": [
    {
      "id": "klikaanklikuit",
      "name": "KlikAanKlikUit",
      "devices": [
        "rfswitch1",
        "rfswitch2",
        "rfswitch3"
      ],
      "rules": [],
      "variables": []
    },
    {
      "id": "garage",
      "name": "Garage",
      "devices": [
        "rfswitch4"
      ],
      "rules": [],
      "variables": []
    },
    {
      "id": "weer",
      "name": "Weer",
      "devices": [
        "weather",
        "forecast"
      ],
      "rules": [],
      "variables": []
    },
    {
      "id": "systeem",
      "name": "Systeem",
      "devices": [
        "syssensor"
      ],
      "rules": [],
      "variables": []
    }
  ],
  "users": [
    {
      "username": "admin",
      "password": "xxxxxxx",
      "role": "admin"
    },
    {
      "username": "henri",
      "password": "xxxxxxx",
      "role": "user"
    }
  ],
  "roles": [
    {
      "name": "admin",
      "permissions": {
      "pages": "write",
      "rules": "write",
      "variables": "write",
      "messages": "write",
      "events": "write",
      "devices": "write",
      "groups": "write",
      "plugins": "write",
      "updates": "write",
      "controlDevices": true,
      "restart": true
    }
  },
  {
    "name": "user",
    "permissions": {
      "pages": "read",
      "rules": "none",
      "variables": "read",
      "messages": "none",
      "events": "none",
      "devices": "none",
      "groups": "none",
      "plugins": "none",
      "updates": "none",
      "controlDevices": true,
      "restart": false
    }
  }
],
"variables": []
}

Nu kun je tenslotte pimatic opstarten.

#sudo service pimatic start (let op: dit kan bij eerste keer lang duren)

Je kunt controleren hoe ver het opstarten is door de logfile te bekijken:

#tail -f /home/pi/pimatic-app/pimatic-daemon.log

Pimatic is pas klaar met opstarten als je het volgende in je logfile ziet:

[pimatic] listening for http-request on port xxxx...

Je kunt nu eindelijk Pimatic met een browser benaderen op je computer of smartphone. Bij mij ziet dit er nu als volgt uit:

Om te controleren of het werkte heb ik een een starterkit van KlikAanKlikUit gekocht voor Euro 15,= (met 20% kortingsbon van de Gamma).
Om je device aan te melden op het systeem stop je een stekker van de starterkit in het stopcontact en de eerste 5 seconden staat deze dan in ‘leer-modus’. Als je nu een ‘aan’ code stuurt met Pimatic dan zal deze geleerd worden door de stekker. Zo simpel is het. Dit werkte dan ook meteen de eerste keer goed. Je kunt nu dus met je smartphone apparaten en/of lampen aan en uit zetten.

In een volgende blog-post ga ik uitleggen hoe ik mijn garagedeur met Pimatic wil gaan aansturen.