2022年9月

之前买了两个贝壳物联的WIFI继电器,自己改造成了智能插座,贝壳物联可以轻松接入天猫精灵来语言控制 ,但不能连入米家,用小爱来控制,并实现与米家智能设备的场景联动,于是研究了一番,实现了目标。

解决方案:采用巴法云MQTT+服务器端PYTHON脚本的方式。

巴法云MQTT可以轻松接入天猫、小爱、HOMEASSISTANT,很赞的平台。我们在巴法云创建一个MQTT主题 命名为 dataideng002,昵称为大台灯,然后用PYTHON来订阅MQTT主题 ,在收到消息后,处理并转发指令到贝壳物联的TCP服务器。代码很简单,参考如下:

需要注意的是,贝壳物联需要用一个不在线的设备进行登录,然后用指令控制在线的设备。音箱发送的开关指令分别是on,off,需要转换成贝壳物联的play,stop。

 #!/usr/bin/python
# -*- coding:utf-8 -*

import sys
import importlib
importlib.reload(sys)


import paho.mqtt.client as mqtt
import socket
import time
import json

#bemfa
HOST = "bemfa.com"
PORT = 9501
client_id = "你的ID"

#bigiot
#must be modified===
DEVICEID='21910'
APIKEY='85727e700'
#modify end=========
host="www.bigiot.net"
port=8181

#bemfa
#连接并订阅
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("dataideng002")         # 订阅消息

#消息接收
def on_message(client, userdata, msg):
    #转发到beike
    message = str(msg.payload.decode('utf-8'))
    if message == "on":
        message = "play"
    if message == "off":
        message = "stop"    
    if msg.topic == "dataideng002":
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(2)

        # connect to remote host
        try:
            s.connect((host, port))
        except:
            print ('Unable to connect')

        print ('Connected to remote host. Start sending messages')
        checkinBytes = bytes('{\"M\":\"checkin\",\"ID\":\"27716\",\"K\":\"1111111\"}\n', encoding='utf8')
        s.sendall(checkinBytes)
        time.sleep(1)
        #play stop
        checkinBytes = bytes('{\"M\":\"say\",\"ID\":\"D21910\",\"C\":\"' + message + '\"}\n', encoding='utf8')
        s.sendall(checkinBytes)
        time.sleep(1)
        s.close()


#订阅成功
def on_subscribe(client, userdata, mid, granted_qos):
    print("On Subscribed: qos = %d" % granted_qos)

# 失去连接
def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection %s" % rc)

#bemfa
client = mqtt.Client(client_id)
client.username_pw_set("userName", "passwd")
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
client.loop_forever()

#bigiot
#connect bigiot

另外的解决方案,1.购买现成的米家断路器、插座等产品 2.自己编写WIFI模块的程序不连入贝壳物联,直接用MQTT对接巴法云,就不需要在服务器上常驻一个中间PYTHON脚本。可以在HOMEASSISTANT中建立MQTT LIGHT实体,在HOMEASSISTANT中实现控制、联动等更高级更灵活的应用。

关于米家联动

现在已经支持在米家app里通过“第三方设备”功能巴法云来接入,可以通过小爱AI音箱声控开关灯,但是,因为这个是第三方设备,无法物理接入米家app,没办法与智能锁联动,实现晚上进门自动开灯。
办法总比困难多,小爱音箱新增的“自定义指令”使得梦想成为现实,可以完美把第三方设备接入米家App实现联动,具体如下:
1、利用小爱音箱的的“自定义指令”‘’功能实现“曲线救国”
2、智能场景如下:

条件:
1)智能门锁正常打开
2)多功能网关亮度暗
执行:
1)小爱音箱自定义指令:打开大台灯
原理解析:
“自定义指令”的效果和对着小爱AI音箱说是完全一致的,因此,通过这这个“自定义指令”功能,可以实现对任何第三方设备的联动。这个功能可以说是一个“万金油”,可以把所有第三方设备都接入到米家app。