Desenvolvimento

11 abr, 2017

Controle a umidade com um Raspberry Pi e dispositivos IoT

Publicidade

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