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/.