1
0
Fork 0
This repository has been archived on 2024-03-28. You can view files and clone it, but cannot push or open issues or pull requests.
miotAirpurifierBridge/miotAirpurifierBridge.py

114 lines
4.3 KiB
Python
Raw Normal View History

2020-04-01 21:15:04 +02:00
import os
import time
from datetime import datetime
import paho.mqtt.client as paho
import miio
## Logging to con
def log(level, msg):
if ( level <= loglevel ):
now = datetime.now()
print(now.strftime("%Y-%m-%dT%H:%M:%S") + " " + str(level) + " " + msg)
## Receive the airpurifiers status and write it to mqtt
def updateMqttStateTopic():
log(3, "Starting update of state-topic.")
apStatus = ap.status()
now = datetime.now()
mqttClient.publish(mqtt_stateTopic + "TIMESTAMP", now.strftime("%Y-%m-%dT%H:%M:%S"))
mqttClient.publish(mqtt_stateTopic + "airQualityIndex", apStatus.aqi)
mqttClient.publish(mqtt_stateTopic + "airQualityIndexAvg", apStatus.average_aqi)
mqttClient.publish(mqtt_stateTopic + "airTemperatureC", apStatus.temperature)
mqttClient.publish(mqtt_stateTopic + "airRelHumidityPercent", apStatus.humidity)
mqttClient.publish(mqtt_stateTopic + "fanMotorSpeed", apStatus.motor_speed)
mqttClient.publish(mqtt_stateTopic + "fanLevel", apStatus.fan_level)
mqttClient.publish(mqtt_stateTopic + "fanFavoriteSetLevel", apStatus.favorite_level)
mqttClient.publish(mqtt_stateTopic + "filterUsedHours", apStatus.filter_hours_used)
mqttClient.publish(mqtt_stateTopic + "filterRemainingPercent", apStatus.filter_life_remaining)
mqttClient.publish(mqtt_stateTopic + "filterRfidProductId", apStatus.filter_rfid_product_id)
mqttClient.publish(mqtt_stateTopic + "filterRfidTag", apStatus.filter_rfid_tag)
mqttClient.publish(mqtt_stateTopic + "filterType", apStatus.filter_type.name)
mqttClient.publish(mqtt_stateTopic + "deviceBuzzerEnabled", apStatus.buzzer)
mqttClient.publish(mqtt_stateTopic + "deviceLedBrightnes", apStatus.led_brightness.name)
mqttClient.publish(mqtt_stateTopic + "deviceChildLockActive", apStatus.child_lock)
mqttClient.publish(mqtt_stateTopic + "devicePowerOn", apStatus.is_on)
mqttClient.publish(mqtt_stateTopic + "devicePower", apStatus.power)
mqttClient.publish(mqtt_stateTopic + "deviceMode", apStatus.mode.name)
mqttClient.publish(mqtt_stateTopic + "statPurifiedVolumeM3", apStatus.purify_volume)
mqttClient.publish(mqtt_stateTopic + "statTimeActive", apStatus.use_time)
# mqttClient.publish(mqtt_stateTopic + "deviceBuzzerSetVolume", apStatus.buzzer_volume)
# mqttClient.publish(mqtt_stateTopic + "deviceLedEnabled", apStatus.led)
log(3, "Update of state-topic finished.")
## MQTT broker disconnected
def on_mqttDisconnect(client, userdata, rc):
log(1, "MQTT broker disconnected")
## MQTT broker connected
def on_mqttConnect(client, userdata, flags, rc):
log(1, "MQTT broker connected")
## MQTT Subscription Loop Callback Function
def on_mqttMessage(client, userdata, message):
mqttMsgData = message.payload.decode("utf-8")
mqttMsgTopic = message.topic
log(2, "RECEIVED: " + mqttMsgTopic + ":" + mqttMsgData)
if ( mqttMsgTopic == mqtt_cmdTopic+"devicePower" ):
2020-04-01 21:15:04 +02:00
if (mqttMsgData == "on"):
ap.on()
log(2, "ACTION: Power On")
elif (mqttMsgData == "off"):
ap.off()
log(2, "ACTION: Power Off")
## Force update of STATE after switching things
time.sleep(5)
updateMqttStateTopic()
## --------------------------------------------------------------------------------------------------
## Get confiuration
configfile = os.getenv('airpurifierConfigFile', 'airpurifier.conf')
exec(open(configfile).read())
log(1, "---------------- Starting Air Purifier Bridge ----------------")
log(1, "Loaded confguration file: " + configfile)
## The airpurifier object
ap = miio.airpurifier_miot.AirPurifierMiot(ip=miot_ip, token=miot_token)
## The MQTT Client object
mqttClient = paho.Client("airPurifierBridge")
log(1, "Connecting to MQTT broker " + mqtt_ip)
mqttClient.connect(mqtt_ip)
time.sleep(5)
## Subscribe to mqtt command topics and start the loop
mqtt_cmdTopic = mqtt_topic + "/CMD/"
mqttClient.subscribe(mqtt_cmdTopic+"power")
mqttClient.on_message = on_mqttMessage
mqttClient.on_connect = on_mqttConnect
mqttClient.on_disconnect = on_mqttDisconnect
log(1, "Starting the subscription loop on " + mqtt_cmdTopic)
mqttClient.loop_start()
## State Update Loop
mqtt_stateTopic = mqtt_topic + "/STATE/"
log(1, "Starting the state update loop on " + mqtt_stateTopic)
while True:
updateMqttStateTopic()
time.sleep(update_interval)