环境:
黑群晖
Docker安装 Home Assistant 0.98.2
Docker安装 EMQ X Broker 3.2.2(mqtt代理 国产开源)(Hbmqtt 已经被Home Assistant 0.92遗弃)
HomeKit不用单独安装,Home Assistant 已经集成
开启homekit的方法就是在homeassistant的配置文件里添加
homekit:
要完成HomeAssistant对一个MQTT设备的信息展现或控制,需要HomeAssistant与MQTT设备就两个方面达成一致:
主题位置(topic)
主题位置表明双方在哪里进行通讯。
比如,一盏灯的命令主题(command_topic),表示HomeAssistant会将开关命令发送到这儿,而灯会到这儿读取命令进行开关操作;比如,一个温度计的状态主题(state_topic),表示温度计会将温度值发送到这儿,HomeAssistant会从这儿读取温度展现在前端。
一个设备可能包含多个主题位置。例如,温湿度传感器的温度和湿度可以分在两个主题位置,灯的状态和控制命令一般也会分在不同的主题位置。
信息内容(payload)
信息内容表示双方用什么信息代表什么含义。
比如,开关灯命令,可以是”ON/OFF”,也可以是”on/off”,”true/false”,”1/0″……
HomeAssistant配置项中payload_XXXX代表对信息内容的配置。
下面我们以一盏简单的灯(仅实现了开关命令控制),来说明MQTT设备的配置和逻辑:
light:
- platform: mqtt
name: "灯"
state_topic: "hachina/hardware/led01/state"
command_topic: "hachina/hardware/led01/switch"
payload_on: "on"
payload_off: "off"
被控端(灯)将状态发布到主题“hachina/hardware/led01/state”中,控制端(HomeAssistant)订阅这个主题,用于当前状态显示;控制端(Home Assistant)将控制命令发布到主题“hachina/hardware/led01/switch”中,被控端(灯)订阅这个主题,根据其内容进行实际的开关动作。
双方以”on”代表开,以”off”代表关。
没有保存图形 直接烧录了代码
顺便问一下 代码怎么转成图形???
from mpython import *
import time
import network
from umqtt.simple import MQTTClient
from machine import Timer
import ubinascii
my_wifi = wifi()
my_wifi.connectWiFi("B-LINK", "12345678")
mqtt = MQTTClient("mqttjs_3c4a92297e", "192.168.16.238", 1883, "", "", 60)
try:
mqtt.connect()
print('Connected')
except:
print('Disconnected')
def mqtt_topic_68616368696e612f68617264776172652f6c656430312f737769746368(_msg):
if _msg == "on":
rgb.fill( (int(255/30), int(255/30), int(255/30)) )
rgb.write()
time.sleep_ms(1)
mqtt.publish("hachina/hardware/led01/state", "on")
oled.fill_rect(0, 0, 128, 16, 0)
oled.DispChar((str(_msg)), 0, 0, 1)
oled.show()
if _msg == "off":
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
mqtt.publish("hachina/hardware/led01/state", "off")
oled.fill_rect(0, 0, 128, 16, 0)
oled.DispChar((str(_msg)), 0, 0, 1)
oled.show()
def mqtt_callback(topic, msg):
try:
topic = topic.decode('utf-8', 'ignore')
_msg = msg.decode('utf-8', 'ignore')
eval('mqtt_topic_' + bytes.decode(ubinascii.hexlify(topic)) + '("' + _msg + '")')
except: print((topic, msg))
mqtt.set_callback(mqtt_callback)
mqtt.subscribe("hachina/hardware/led01/switch")
def timer14_tick(_):
mqtt.ping()
tim14 = Timer(14)
tim14.init(period=20000, mode=Timer.PERIODIC, callback=timer14_tick)
rgb[0] = (int(0/30), int(0/30), int(255/30))
rgb.write()
time.sleep_ms(1)
rgb[1] = (int(0/30), int(255/30), int(0/30))
rgb.write()
time.sleep_ms(1)
rgb[2] = (int(255/30), int(0/30), int(0/30))
rgb.write()
time.sleep_ms(1)
mqtt.publish("hachina/hardware/led01/state", "on")
while True:
mqtt.wait_msg()
点赞