设为首页收藏labplus社区产品资料库
6
积分值+2
3
掌控币+1
0  关注
0  粉丝
1  帖子
哦哦
2019年09月05日

#物联网应用#掌控板接入黑群晖(homeassistant mqtt HomeKit)Siri控制Led灯

环境:

黑群晖

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:

视频效果1

视频效果2

要完成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()

3

点赞

1698 次阅读3 人赞