文章目录
之前在 smzdm 上看一些物联网的文章时,看到 Domoticz 这个平台,好像还蛮符合我的需求的,文章里还介绍了使用 RMBridge 来使用 Domoticz 来控制 RM Pro。
但是 RMBridge 并不是特别方便,需要一直跑一个 Android 来作为指令中转,于是在 GitHub 上去找找看有没有其他项目来支持 BroadLink 的 RM 设备,然后就找到了 python-broadlink 这个项目。
在研究 python-broadlink 的代码过程中,发现它同时还支持 BroadLink 的 A1 空气质量监测仪,刚好我就有一个 A1 设备,于是准备试试看能不能把 A1 的数据更新到 Domoticz 平台上。
最终的效果如下图所示:
准备工作
因为我有一个 DSM,并且 Domoticz 有现成的 DSM Package,所以所有工作都是基于 DSM 完成的,需要的软件如下:
- DSM 6
- Domoticz v3.5876
- python-broadlink
创建设备及虚拟传感器
安装完 Domoticz 后,需要创建虚拟设备以及虚拟传感器来接受数据。
在“设置》硬件”中创建一个虚拟设备,只用来创建虚拟传感器:
在刚刚创建的 BroadLink A1 设备上,选创建虚拟传感器,并选择“温度+湿度”:
使用同样的方式来创建两个“文本”类型的虚拟传感器,用来显示光照和声音。
创建完虚拟传感器后,可以在“设置》设备”中看到刚刚创建的虚拟传感器,这里需要记住的是“Idx”这一档,这在后面的代码中需要用到:
在 DSM 上部署更新脚本
先在 DSM 中创建一个共享文件夹 domoticz,用于存放相关的代码文件。
下载 python-broadlink 项目代码,将 broadlink 目录上传至 domoticz 共享文件夹中。
使用 DSM 文本编辑器,在 domoticz 共享文件夹中创建一个新的文件 broadlink-a1.py,内容如下:
#!/usr/bin/python # -*- encoding: utf-8 -*- A1_IP = '1.1.1.1' # 修改为 BroadLink A1 IP A1_MAC = '00:00:00:00:00:00' # 修改为 BroadLink A1 MAC 地址 DOMOTICZ_IP = '1.1.1.1' # 修改为 Domoticz 服务器 IP DOMOTICZ_PORT = 8084 # 修改为 Domoticz 服务端口 DEV_HUM_TEMP_IDX = 1 # 修改为“温度+湿度”虚拟传感器Idx DEV_NOISE_IDX = 2 # 修改为“声音”虚拟传感器Idx DEV_LIGHT_IDX = 3 #修改为“光照”虚拟传感器Idx import broadlink import requests import urllib a1 = broadlink.a1((A1_IP, 80), A1_MAC) a1.auth() data = a1.check_sensors_raw() hum = data['humidity'] hum_stat = 0 if 45 < = hum <= 60: hum_stat = 1 elif hum < 40: hum_stat = 2 elif hum > 70: hum_stat = 3 # update temp and hum url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%0.1f;%0.1f;%d" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_HUM_TEMP_IDX, data['temperature'], hum, hum_stat) requests.get(url) # update noise db = '未知' noise = data['noise'] if noise == 0: db = '寂静' elif noise == 1: db = '正常' elif noise == 2: db = '吵闹' db = urllib.quote(db) url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%s" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_NOISE_IDX, db) requests.get(url) # update light light = data['light'] lux = '未知' if light == 0: lux = '黑暗' elif light == 1: lux = '昏暗' elif light == 2: lux = '正常' elif light == 3: lux = '明亮' lux = urllib.quote(lux) url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%s" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_LIGHT_IDX, lux) requests.get(url)
请注意需要修改对应 BroadLink A1 的 IP 以及 MAC 地址,以及 Domoticz 安装服务器的地址和端口,如果是以 DSM Package 的形式安装的,那么 IP 与 DSM 的 IP 同样,端口默认为 8084。
之后 domoticz 共享文件的目录应该是这样的:
添加计划任务定时更新 A1 数据
为了能定时更新 A1 数据到 Domoticz,需要在 DSM 中添加一个计划任务,按时运行 broadlink-a1.py 这个脚本。
在 DSM 的“控制面板”中找到“任务计划”,添加一个“计划的任务》用户定义的脚本”,将任务设置为每5分钟运行一次,并且任务设置中运行命令按如下设置:
为了测试脚本是否正确,可以在保存完任务后,选中刚刚创建的任务手动运行一次,如果数据正常上传到 Domoticz 的服务器,那么在 Domoticz 的“设置》设置”中可以看到对应虚拟传感器的最后通讯时间为刚刚运行任务的时间。
如果任务正确运行,也可以在 Domoticz 的温度面板中,也可以看到虚拟传感器会显示正确的温度以及湿度。
至此,所有工作已经完成,Domoticz 可以实时显示 A1 的数据并且记录曲线。
参考资料
- 开源IoT平台domoticz与百搭wifi模块esp8266 篇二:domoticz与broadlink的联接
- python-broadlink by mjg59
- Domoticz API/JSON URL's
--- EOF ---
各种报错啊大神。是不是提前安装好一些依赖啊?比如 pycrypto
装完python套件之后好了 :lol: