Tenho um interruptor Wemo e um sensor de temperatura/umidade BeeWi. Eu os usei em projetos anteriores. Hoje eu quero um nível de umidade de controle em uma sala. A ideia é ligar/desligar um desumidificador (conectado ao interruptor Wemo), dependendo da umidade (do sensor BeeWi). Vamos começar.
Eu tenho um script (nó) que lê a umidade do 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);
Agora eu tenho outro script para controlar o interruptor. Um script Python usando biblioteca ouimeaux:
#!/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)
E isso é tudo. Agora só preciso configurar o meu crontab do Raspberry Pi e executar o script a cada minuto:
*/1 * * * * /mnt/media/projects/hum/dehumidifier.py ff:ff:ff:ff:ff:ff Switch1 50
O projeto está disponível na minha conta do GitHub.
Atualmente, eu estou envolvido com Arduino e IoT, então eu quero fazer algo semelhante com coisas do Arduino mais baratas.
***
Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2017/04/03/control-humidity-with-a-raspberry-pi-and-iot-devices/.




