本帖最后由 sunfang1cn 于 2021-2-16 23:07 编辑
之前根据论坛帖子 https://bbs.hassbian.com/thread-5634-1-1.html 的培正模块做了个智能电表,接入老房子的电箱,但是可能是某个地方焊接短路,某一天砰的一声巨响把整栋楼的电闸都跳掉了。前一阵子装修新房子,就打算买一个成品的智能电表直接放到强电箱中并且能够接入Home-Assistant。
论坛里面有推荐松下的KW4M的,https://bbs.hassbian.com/thread-6410-1-1.html ,不过有两个缺点:
1、不是标准的强电箱35mm导轨用尺寸,装进电箱有点麻烦
2、难买、小贵,某宝少数卖家有卖,400元左右
于是乎淘到了正泰的DDSU666,导轨式安装,支持modbus,有天猫店(天猫搜 "正泰导轨式电表 485" ),国产大厂品质也没啥问题,只要130元。
重点看如何接入home-assistant:
第一步:买一个RS485的网关,理论上任意的支持RS485转tcp协议的网关均可,我买的塔石物联网的TAS-WIFI-261 ,支持modbus rtu转MQTT。
第二步:连接好RS485网关和电表(24、25端口接485的A和B),网关接入好网络。
第三步:用485网关,或者nodered或者任意工具,每隔一段时间(例如5秒)通过网关发送查询指令(com口设置默认波特率9600,数据位8,奇偶校验N,停止位2)到电表,查询当前瞬时情况和累计总能耗分别要两次轮询指令(指令为16进制,已包含CRC校验码):
01 03 20 00 00 0A CE 0D
01 03 40 00 00 02 D1 CB
第四步:从modbus网关的接收端,接收和解析结果,可以直接用hass解析,但是我更熟悉nodejs,所以使用了nodered,工作流如下:
rs485EMdefault是从塔石物联网的网关接收modbus rtu返回数据的mqtt topic,如果你使用的网关是tcp接口的请自行更换。返回值解析的关键在两个function节点:
节点1.js
(4.4 KB, 下载次数: 237)
节点2.js
(4.4 KB, 下载次数: 121)
可以看到,两个解析节点的唯一区别是:
if (rawBuffer[2] != 0x1C) {
// 另一个节点为 if (rawBuffer[2] != 0x04) {
return { payload: { success: false, msg: 'is another' } };
}
原因在于,分两次轮询查询电表的不同寄存器区间,返回都在一个MQ中(用tcp同步查询的可能没这个问题),需要根据返回数据长度(寄存器数值个数)区分,做不同的处理。处理的结果以JSON格式分别写入两个新的mqtt topic供home-assistant使用。
第五步:home-assistant配置,configuration.yaml:
sensor:
- platform: mqtt
name: "power_s"
state_topic: "rs485EMDecoded"
value_template: "{{value_json['data'].power_s|round(3)*1000 }}"
unit_of_measurement: "W"
- platform: mqtt
name: "power_pf"
state_topic: "rs485EMDecoded"
value_template: "{{value_json['data'].pf|round(3) }}"
unit_of_measurement: " "
- platform: mqtt
name: "power_voltage"
state_topic: "rs485EMDecoded"
value_template: "{{value_json['data'].voltage|round(1) }}"
unit_of_measurement: "V"
- platform: mqtt
name: "power_current"
state_topic: "rs485EMDecoded"
value_template: "{{value_json['data'].current|round(3) }}"
unit_of_measurement: "A"
- platform: mqtt
state_topic: "rs485EMDecoded2"
name: "totalkwh"
unit_of_measurement: 'kwh'
value_template: "{{ value_json['data'].totalkwh|round(1) }}"
第六步:可以使用home-assistant 0.88之后自带的utility_meter 组件计算每日每月用电:
utility_meter:
monthly_electricity:
source: sensor.totalkwh
cycle: monthly
daily_electricityc:
source: sensor.totalkwh
cycle: daily
之后可以在lovelace ui或者其他的什么dashboard上配置前端组件了。
最终效果:
|