|
本帖最后由 msmmbl 于 2019-2-21 11:19 编辑
上次在这个贴子里面提到了KW4M,https://bbs.hassbian.com/forum.p ... 4&page=14#pid172776,收到一些站内消息询问怎么接入的。记录下过程:
首先,KW4M有几个型号,根据不同型号,有的是通信协议是MEWTOCOL,有的是Modbus。在这个网站上可以看到https://device.panasonic.cn/ac/c ... w4m/price/index.jsp。
可以看到,这个系列的产品,一共有4种型号,都是走的RS485,只是通信时候的数据格式不一样。我买的的NEWTOCOL协议的。下面的流程按照这个协议走。
首先下载这个产品的样本,https://device.panasonic.cn/ac/c ... .jsp?series_cd=1783
1. 硬件上,样本上提供了RS485的端子号,根据型号不同,用双绞线接出来。
双绞线另一端,我用了一个RS485转USB的模块,接到了树莓派。
这个步骤是建立了数据的连接,方法不是唯一的。我因为装修时候有埋线,所以这样操作。完成后,在树莓派中多了一个设备/dev/ttyUSB0(这个设备号如果只接了一个usb,就是这样,不然可能是/dev/ttyUSB1、/dev/ttyUSB2)
2. 软件层面
home-assistant本身提供了modbus的协议的组件(https://www.home-assistant.io/components/sensor.modbus/),但是我的KW4M是MEWTOCOL协议的,所以得自己搞通讯,home-assistant的串口模块不支持给串口直接发任意的数据(https://www.home-assistant.io/components/sensor.serial/),但是home-assistant的tcp sensor(https://www.home-assistant.io/components/sensor.tcp/)支持。所以,可以先将串口转化为tcp,这样就可以用home-assistant的tcp sensor间接和串口通讯了。
在树莓派上安装ser2net,这是一个将串口转换为tcp的一个工具
sudo apt-get install ser2net
编辑配置文件
/etc/ser2net.conf
主要是最后一行
3300:raw:600:/dev/ttyUSB0:19200 8DATABITS NONE 1STOPBIT
大概意思是,开放3300端口,将这个端口的数据,都转发到设备/dev/ttyUSB0,串口的速率是19200,8bit之类的,后面速率之类的在KW4M的设置界面都可以自己调整,貌似默认值就是我上面这样的。具体看下手册。这样搞完后,往树莓派的3300网络端口发数据,就相当于和KW4M通讯了。
完了后
sudo systemctl restart ser2net.service
或者重启下树莓派让配置生效
3. 配置home-assistant
例如,要读取当前的功率
sensor:
- platform: tcp
host: 192.168.11.7
name: Total Power Rate
port: 3300
payload: "%01#RDD001760017754\x0d"
value_template: "{{ [value[12], value[13], value[10], value[11] ,value[8], value[9] ,value[6], value[7]] | join | int(0, 16) / 100}}"
unit_of_measurement: kW
说下参数:
host:就是树莓派的IP地址
port:3300上面提到过了
payload:就是MEWTOCOL协议,关于这个,手册上有说明
% 数据的起始
01:站号,这个也可以在KW4M的界面设置,每个设备要设置成不同的站号,貌似默认不去动它就是01
# 代表后面跟着的是指令
RD 代表是“读取”指令
D0017600177: 代表是地址D00176,D00177,这两个地址也可以在手册27页中的表格查到,存的是"瞬时功率"
54 是Bcc校验码,就是把%01#RDD0017600177算出一个校验码出来,计算方法在手册26页有介绍,具体我好久没算了,暂时不回忆了。
\x0d 代表结束
value_template: 是对结果的解析,27页表格里面说,返回是32位数字,数字1代表0.01kW,如果没记错的话,大概返回是这样的格式:
%01$RDXXXXXXXX??\x0d,这个在手册28页“正常时候的响应"有说明,XXXXXXXX就是具体的32位的数字,用16进制表示的。低位在前面,高位在后面。
{{ [value[12], value[13], value[10], value[11] ,value[8], value[9] ,value[6], value[7]] | join | int(0, 16) / 100}}代表取出6~12这几个字符,也就是上面的XXXXXXXX,把它转换为数字,*0.01,这样就得到了kW数字。
差不多就是上面的过程。要去读其他数据也是类似的。下面是去读电量的配置。
- platform: tcp
host: 192.168.11.7
name: Total Power
port: 3300
payload: "%01#RDD001000010154\x0d"
value_template: "{{ [value[12], value[13], value[10], value[11] ,value[8], value[9] ,value[6], value[7]] | join | int(0, 16) / 100}}"
unit_of_measurement: kWh
其他数据,像电流什么的,我没有关心,写法是类似的。
P.S.,home-assistant在0.87版本中引入了utility meter,可以方便的按照月/日/年统计数据:https://www.home-assistant.io/components/utility_meter/,例如,按照月统计电量
utility_meter:
total_power_monthly:
source: sensor.total_power
cycle: monthly
差不多就是这样。
|
评分
-
查看全部评分
|