Note: I'm migrating from gonzalo123.com to here. When I finish I'll swap the DNS to here. The "official" blog will be always gonzalo123.com

      Control humidity with a Raspberry Pi and IoT devices

      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.

      comments powered by Disqus