The goal was to create easy to use End to End control over power sockets using relay, including (and maybe mainly) Web GUI and automation.
As always I try to use existing solutions and rely as little as possible on specific platforms.
A Plug&Play solution and I just added sensor reading as ell.
I wanted to avoid installation of packages like openhab
I had some of building blocks working for sometime, but finding only now the missing two blocks:
1. Online control system (devicehub or Adafruit.IO)
2. Arduino Firmata
Scripts will be available on links
Step 1: Components
1. Raspberry Pi
2. Arduino UNO
3. Arduino 5V relay with any number of ports (example)
5. Optional temperature sensor (Example I used)
2. Web automation IFTTT
3. Mobile automation IFTTT and Automagic for Android (like Tasker)
4. I use my own webhooks to send commands to devicehub API will try to find independent solution later
All will be detailed in following steps
Step 2: Arduino and Firmata
The easy way to connect to relay is by using Arduino. And the easy way I found to use Arduino is by controlling it from Raspberry.
Connect the Arduino to the relay, I will use 2 ports relay here.
Arduino Relay connection
5V -> VCC
Ground -> Ground
D8 (or any other) In1
D9 (or any other) In2
On the other side of the relay there are three connections for every port, normally it will be COMM NO NC (common, normally open normally close).
Connecting COMM and NO will be normally open circle until 1 is sent to port, and the other way around.
I will not deal with Arduino code, all is done by Raspberry via Firmata firmware..
Upload Firmata firmware
1. Connect Arduino to PC
2. Open IDE go to examples choose Firmata->StandardFirmata and upload to board
That is all
You can check is all works by using Firmata test on Windows PC
You can check if all is working fine by sending 0 or 1 to the above pins, leds will be switched on or off on relay
Step 3: Devicehub
We will deal with devicehub before Raspberry as we need some data for script configuration
Again easy stuff (great work for devicehub guys)
1. Login or create free account, create project, you will be given Api key and project ID, note both
2. Add device, choose Raspberry as development board and Python as programming language.
3. You will be given UUID for the device, note it.
4. Add Actuator, choose whatever name you want (note it) make sure it is digital.
For our project, add two actuators LampA LampB
Note the fact you can make your device public and have publicly accessible dashboard (example)
Step 4: Now to Raspberry
I assume you have working Raspberry, if any of the packages on my script is looking for dependencies I am sure you can deal with it.
Raspberry can be connected to the Web via ethernet WIFI or even cellular modem, I use regular USB WIFI stick
Install pyfrmata library
SSH to Raspberry and type ls /dev
You will be given long list of devices
Connect the Arduino to Raspberry using serial cable
Repeat the ls/dev the newly added port either /dev/ttyACM and a number or /dev/tty/USB and a number
I assume you know how to use Python and editor
1. It looks for Arduino on the right port (from a list)
2. It makes sure There is internet connection (if run from cron on Raspberry it might be executed before network is established)
3. It reads port state from devicehub (mind the fact you have to change ports on the device you created for the first time, so it has initial value otherwise there will be an error).
4. Current state is stored locally so we can detect changes. Commands are sent to relay via Arduino
5. it loops forever comparing devicehub state to local, if changes are detected, a command will be sent to Arduino and change will be stored locally
Step 5: Webhooks
I used IFTTT to achieve web automation
Since devicehub expects JSON REST structure and I did not find a way to send it from browser I created my own web hooks
I have php script in my root web server directory
It calls Python script which takes the arguments and send to devicehub
Step 6: Automation
create your own IFTTT account
create recipe for triggering, like every day at XXXX
Create event with maker channel
Use the previous webhook
Install IFTTT do button
Create button to call maker channel with previous webhooks
Step 7: Sensor Reading
After I finished the guide I added description how to add sensor, temperature one, but anyone you can read by Raspberry or Arduino will do.
Mind the fact that if you read from Arduino using Firmata you have always to read several times till you get a some value.
I used this sensor for temperature, it's plug&play using Raspberry USB.
The installation guide can be found here
If you follow it you will be able to read temperature calling sudo temper-poll from command line
The output will be something like
Found 1 devices Device #0: 22.5°C 72.5°F
This below python function will return the right format (add to previous script)
You can add the read value to your devicehub dashboard (create analog sensor and add the follwing line to your script using my library
res = commands.getstatusoutput('sudo temper-poll')
return d.split(" ")[:-3]
Step 8: Viewing Sensor Data Online
The linked image shows the sensor data as displayed on device hub dashboard, but if all you need is to display without control use these two magnificent services
Dweet gives you the ability to upload data easily (real easy) and even accumulate
And the data can be displayed using gauges on freeboard like that one