I’ve got a Wemo switch and a BeeWi temperature/humidity sensor. I’ve use them in previous projects. Today I want a control humidity level in a room. The idea is switch on/off a dehumidifier (plugged to Wemo switch) depending on the humidity (from BeeWi sensor). Let’s start.
I’ve got one script (node) that reads humidity from the sensor (via BTLE)
#!/usr/bin/env node noble = require('noble'); var status = false; var address = process.argv[2]; if (!address) { console.log('Usage "./reader.py <sensor mac address>"'); process.exit(); } function hexToInt(hex) { var num, maxVal; if (hex.length % 2 !== 0) { hex = "0" + hex; } num = parseInt(hex, 16); maxVal = Math.pow(2, hex.length / 2 * 8); if (num > maxVal / 2 - 1) { num = num - maxVal; } return num; } noble.on('stateChange', function(state) { status = (state === 'poweredOn'); }); noble.on('discover', function(peripheral) { if (peripheral.address == address) { var data = peripheral.advertisement.manufacturerData.toString('hex'); console.log(Math.min(100,parseInt(data.substr(14, 2),16))); noble.stopScanning(); process.exit(); } }); noble.on('scanStop', function() { noble.stopScanning(); }); setTimeout(function() { noble.stopScanning(); noble.startScanning(); }, 3000);
Now I’ve got another script to control the switch. A Python script using ouimeaux library
#!/usr/bin/env python from ouimeaux.environment import Environment from subprocess import check_output import sys import os threshold = 3 def action(switch): humidity = int(check_output(["%s/reader.js" % os.path.dirname(sys.argv[0]), sensorMac])) if "Switch1" == switch.name: botton = expected - threshold isOn = False if switch.get_state() == 0 else True log = "" if isOn and humidity < botton: switch.basicevent.SetBinaryState(BinaryState=0) log = "humidity < %s Switch to OFF" % botton elif not isOn and humidity > expected: switch.basicevent.SetBinaryState(BinaryState=1) log = "humidity > %s Switch to ON" % expected print "Humidity: %s Switch is OK (%s) %s" % (humidity, 'On' if isOn else 'Off', log) if __name__ == '__main__': try: sensorMac = sys.argv[1] mySwitch = sys.argv[2] expected = int(sys.argv[3]) except: print 'Usage "./dehumidifier.py <sensorMac> <switch name> <expected humidity>"' sys.exit() env = Environment(action) env.start() env.discover(seconds=3)
And that’s all. Now I only need to configure my Raspberry Pi’s crontab and run the script each minute
*/1 * * * * /mnt/media/projects/hum/dehumidifier.py ff:ff:ff:ff:ff:ff Switch1 50
Project is available in my github account.
Nowadays I’m involved with Arduino and iot, so I wand to do something similar with cheaper Arduino stuff.
2 thoughts on “Control humidity with a Raspberry Pi and IoT devices”