加湿器(AC100)制御をアップデート

部屋の加湿器をMQTTで制御してます。

これまでの制御としては、「部屋が暗くなったら、OFF」にしてました。

自分で設定した振る舞いですし、結構便利だったのですが、
長時間、部屋で作業していると湿度が高くなりすぎて、ドアがベタベタになっていたことに気づきました。

せっかく、照度センサーだけではなく湿度センサーも動かしているということで、あまりにも湿度が高くなった場合にも、電源をOFFにしようかと

考察

自分の体感では、70%を超えたら、すこしベタベタするのと思えました。
なので、70%を超えたらOFFにすれば良いかなぁと考えたのですが、そういえば、今使っているDHT11の精度ってどれくらいだろ?という疑問が。
精度があまり良くないのであれば、複数回計測してからの制御が良いかと。

こちらのページを参考にさせていただいたところ、DHT11は、精度±5%とのことなので、3回連続で70%を超えているようならOFFにすることに。

センサーは、10秒毎に測定値を送っていますので、「30秒超えて70%を超える湿度が計測されていたら」という条件と読み替えることができますが、ただ、確実に10秒ごとに送られてきているかをチェックしていないので、あくまで「連続3回の測定で70%を超えていたら」という条件です。

部屋の加湿器なので、そんなにシビアに検討してないです。もともと、「3回」も「70%」も肌感覚ですから。

コード

import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish

def on_connect(mqttc, obj, flags, rc):
    print("rc: "+str(rc))

def on_message(mqttc, obj, msg):
    if (msg.topic == "homie/sensor/properties/brightness"):
        brightness = int(msg.payload.decode('utf-8'))
        print("brightness")
        print(brightness)
        if ( brightness > 500 ):
            # room is dark, ok to turn off the ac100
            print("send turn OFF")
            mqttc.publish("homie/ac100/properties/ac100relay/set", "false")
    if (msg.topic == "homie/sensor/properties/humidity"):
        humidity = float(msg.payload.decode('utf-8'))
        print("humidity")
        print(humidity)
        print(on_message.humidOverCriteria)
        if (humidity > 69):
            on_message.humidOverCriteria += 1
            if (on_message.humidOverCriteria > 3) :
                # room has enough humidity, ok to turn off the AC100
                print("send turn OFF")
                mqttc.publish("homie/ac100/properties/ac100relay/set", "false")
                on_message.humidOverCriteria = 0
        else:
            on_message.humidOverCriteria = 0
            print("reset")
    #print(str(msg.payload))

    #print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

def on_publish(mqttc, obj, mid):
    print("mid: "+str(mid))

def on_subscribe(mqttc, obj, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_log(mqttc, obj, level, string):
    print(string)

# If you want to use a specific client id, use
# mqttc = mqtt.Client("client-id")
# but note that the client id must be unique on the broker. Leaving the client
# id parameter empty will generate a random id for you.
#mqttc = mqtt.Client(transport="websockets")
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# Uncomment to enable debug messages
# mqttc.on_log = on_log
mqttc.connect("mqtt-server", 1883, 60)
mqttc.subscribe("homie/sensor/properties/brightness", 0)
mqttc.subscribe("homie/sensor/properties/humidity", 0)
#mqttc.connect("mqtt.eclipse.org", 1883, 60)
#mqttc.subscribe("#", 0)

on_message.humidOverCriteria = 0

mqttc.loop_forever()

まとめ

自分の環境では、それなりにうまく動いてそうです。ただ、長期的に見てどうなのかは、もう少し運用してみて改良しようかと思います。
ローカルPCの開発環境とDockerでの実行環境を分けておいて便利だったかも。
ちなみに、久しぶりにPythonを使ったのですが、静的変数を忘れていて、すこしハマりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です