部屋の加湿器を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を使ったのですが、静的変数を忘れていて、すこしハマりました。
Sponsor Link