家庭用电量及电费统计模块 (Home Assistant 、Node-RED、MQTT综合应
创作立场声明:本文所有商品为自费购入。
【写作说明】:看了 frLab的个人主页| 什么值得买 (smzdm.com) 的几篇关于 Home Assistant 的文章
Home Assistant 篇一:从Node-RED与微信推送谈起_NAS存储_什么值得买 (smzdm.com)
Home Assistant 篇二:群晖Docker安装Home Assistant_NAS存储_什么值得买 (smzdm.com)
Home Assistant 篇三:给HA插上翅膀——HACS与MQTT_NAS存储_什么值得买 (smzdm.com)
总想搞个事情出来,在网上找了些资料,感觉搞一个家庭用电量及电费统计模块很不错,又能就习一下Home Assistant和Node-RED,电路又很简单。
总用购买了五个配件:
peacefair品牌交流电压电流功率因数电能通信模块模组TTL串口通信-tmall.com锟斤拷猫 最好购买1000A开合式CT。我还买了TTL转USB线,但没有用到。首购金10元,到手 40元
CH340C下载烧录器ESP8266 ESP-01 ESP-01S WIFI模块下载器 调试器-tmall.com锟斤拷猫 最好购买ESP-01S+CH340C下载烧录器,烧录器以后还可以使用。17.5元
220V转5V9V12V400/500/700MA/1A隔离开关电源模块AC-DC降压模块-tmall.com锟斤拷猫 200V转5V电源模块,800ma应该够了,我买的是1A的。8元
LM2596S DC-DC直流可调降压电源模块稳压板3A 12/24转12/5/3.3V-tmall.com锟斤拷猫 降压模块3.3V输出,也可以购买5V转3.3V模块,5V转3.3V的模块应该还要便宜点。3.5元
40P彩色杜邦线 母对母 公对母 公对公 长10CM/20CM/30CM/40CM-tmall.com锟斤拷猫 还有这个母对母的杜邦线,家里有就没买了。2元。
还要电铬铁和焊锡丝,这个没有可以到但电子产品的借用一下,也可以自己购买,我个自家有就没算成本了。
总共花费71元。
给大家总体展示一下。
安装软件服务
首先安装 Home Assistant 、 Node-RED、QTT 和设置Node-RED的企业推送 参考 frLab 的三篇Home Assistant文章,我就不详细说了,上链接。
Home Assistant 篇一:从Node-RED与微信推送谈起,
Home Assistant 篇二:群晖Docker安装Home Assistant,
Home Assistant 篇三:给HA插上翅膀——HACS与MQTT。
硬件组装
购买硬件:
peacefair PZEM-004T 交流电压电流功率等信息测量通信模块。如果要测家庭总用电量请购买100A的,10A只能测2200W以下功率的电器。互感器CT最好购买开合式的,贵7元,这样就可以不用拆强电箱的进线。
CH340C下载烧录器+ESP-01S,CH340C下载烧录器不是必须购买,如果有一定基础可以自己用USB线烧录,以前有的可以重复使用。WIFI模块最好购买ESP-01S,ESP-01要多接两个电阻,接线也复杂很多。看电路图:
电源模块:因为peacefair PZEM-004T要5V输入,ESP-01S要3.3V输入,所有要有两个模块 220V转5V和5V转3.3V。也有些模块有5V和3.3V两种输出。
母对母杜邦线,接线用。
刷写固件:刷 Tasmota
下载固件 ota.tasmota.com/tasmota/release/ 或者 github.com 下载:tasmota-CN.bin ,这个是简体中文版
下载安信可烧录软件 开发工具清单 | 安信可科技 (ai-thinker.com) 下载第3个 “3、烧录WiFi固件工具:ESP_DOWNLOAD_TOOL”
把ESP-01S插上烧录器并接上电脑电脑
解压烧录软件并运行,运行后会自动安装驱动。如果没有安装就到 开发工具清单 | 安信可科技 (ai-thinker.com) 下载 "串口驱动",安装驱动后会出现一个COM设备
在烧录软件里选ESP8266,develop。
第一行选择刚下载的固件,并在前面打钩,在@后面输 0X000000,FLASH SIZE 选 8Mbit,COM:选刚刚在设备管理器上看到的COM口,我这是COM3,其它的看和我上面对比一下,也选一样的。
点START烧录固件。
显示完成表示烧录完成。到此tasmota刷写完成,关掉烧录软件。
配制WIFI :配制ESP-01S的WIFI
把烧录器和ESP-01S从电脑的USB接口上扯出,再从新插到电脑USB接口上,然后到手机上操作。
打开手机WIFI,搜索WIF 手机上会多一个tasmota开头的WIFI,后面的字母数字和我手机上的不一样。选择并连接。
连上后就会出现这个配置WIFi界面,如果没有出现,就到浏览器里面 输入 192.168.4.1 可以看到这个界面,在这里填上路由器或AP的WIF名称和密码。
点击保存,会跳转显示ESP-01S获取到的IP信息页面,因为显示时间比较短,没有截到图。
如果在上一步没有看到ESP-01S的IP,就到路由器DHCP客户端上去查看,一个以tasmota开头的设置。到路由器上查看DHCP客户端IP就不详说了,这个大家应该都会。
到电脑浏览器里输入ESP-01S的IP(我的是192.168.222.125),如果看到这个界面说明WIFI设置成功,可以到网页上设置了。
设置ESP-01S
填上安装的MQTT信息,安装MQTT可以看 Home Assistant 篇三:给HA插上翅膀——HACS与MQTT_NAS存储_什么值得买 (smzdm.com)
设置好后保存,保存后会重启。
保存后会重启,重启后到主菜单,上面会多出电压电流等信息,不过数据都是0,因为还没有接上PZE-004T。
现在设置好了,把ESP-01S和烧录器从电脑上扯下,再把ESP-01S从烧录器上拔下。
接线:
线路图,三根线线是因为与其它线在图线上相交,实际不相连接,所以用红色区分一下。
现在可以装到强电箱上去了。
这个是我已经装到强电箱上的,前面那个是我为写这个文章重买的一套
用电工胶把电源模块胶到PZE-004T的外壳上,把ESP-001S放到外里。
互感器我是套在入户零线上,因为火线空间太小不好装。
现在所有安装都完成了。
到 Home Assistant 里面添加MQTT插件
这装Home Assistant按 Home Assistant 篇二:群晖Docker安装Home Assistant_NAS存储_什么值得买 (smzdm.com) 这篇文章安装
添加集成
如果有需要可以把他们添加个中文别名,点想要修改的一行
到这Home Assistant就可以显示电压电流功率总用电量等信息了。
月初自动清零和显示电费信息
编辑 /config/configuration.yaml 文件,怎么找到这个文件请查看 Home Assistant 篇二:群晖Docker安装Home Assistant_NAS存储_什么值得买 (smzdm.com) ,添加以下代码,用来显示电费和月初1号0点清空总电量。
sensor:
#本月电费
- platform: template
sensors:
zong_dianfei:
value_template: >
{% set dianlian=states("sensor.tasmota_energy_total") | float %}
{% set onedianjia=0.588 %}
{% set twodianjia=0.05 %}
{% set threedianjia=0.25 %}
{% set onedianlian=200 %}
{% set twodianlian1=350 %}
{% set twodianlian2=450 %}
{% set two1month=[4,5,6,10,11,12] %}
{% if now().month in two1month %}
{% set twodianlian=twodianlian1 %}
{% else %}
{% set twodianlian=twodianlian2 %}
{% endif %}
{% if dianlian > twodianlian %}
{% set threedianfei= (dianlian - twodianlian) * threedianjia %}
{% else %}
{% set threedianfei=0 %}
{% endif %}
{% if dianlian > onedianlian %}
{% set twodianfei= (dianlian - onedianlian) * twodianjia %}
{% else %}
{% set twodianfei=0 %}
{% endif %}
{% set zong_dianfei=dianlian * onedianjia + twodianfei + threedianfei %}
{% if(zong_dianfei>0) %}
{{ zong_dianfei | round(2) }}
{% endif %}
friendly_name: 'zong_dianfei'
unit_of_measurement: "RMB"
#今日电费,本月电费-本月今天以前的电费
- platform: template
sensors:
jintian_dianfei:
value_template: >
{% set dianlian=states("sensor.tasmota_energy_total") | float %}
{% set jintiandianlian=states("sensor.tasmota_energy_today") | float %}
{% set onedianjia=0.588 %}
{% set twodianjia=0.05 %}
{% set threedianjia=0.25 %}
{% set onedianlian=200 %}
{% set twodianlian1=350 %}
{% set twodianlian2=450 %}
{% set two1month=[4,5,6,10,11,12] %}
{% if now().month in two1month %}
{% set twodianlian=twodianlian1 %}
{% else %}
{% set twodianlian=twodianlian2 %}
{% endif %}
{% if dianlian > twodianlian %}
{% set threedianfei= (dianlian - twodianlian) * threedianjia %}
{% else %}
{% set threedianfei=0 %}
{% endif %}
{% if dianlian > onedianlian %}
{% set twodianfei= (dianlian - onedianlian) * twodianjia %}
{% else %}
{% set twodianfei=0 %}
{% endif %}
{% set zongdianfei= dianlian * onedianjia + twodianfei + threedianfei %}
{% set before_dianliang= dianlian - jintiandianlian %}
{% if before_dianliang > twodianlian %}
{% set threedianfei= (before_dianliang - twodianlian) * threedianjia %}
{% else %}
{% set threedianfei=0 %}
{% endif %}
{% if before_dianliang > onedianlian %}
{% set twodianfei= (before_dianliang - onedianlian) * twodianjia %}
{% else %}
{% set twodianfei=0 %}
{% endif %}
{% set before_dianfei= before_dianliang * onedianjia + twodianfei + threedianfei %}
{% set jintian_dianfei=zongdianfei - before_dianfei %}
{% if(jintian_dianfei>0) %}
{{ jintian_dianfei | round(2) }}
{% endif %}
friendly_name: 'jintian_dianfei'
unit_of_measurement: "RMB"
#昨日电费,本月今天以前的电费-本月昨天以前的电费
- platform: template
sensors:
zuotian_dianfei:
value_template: >
{% set dianlian=states("sensor.tasmota_energy_total") | float %}
{% set jintiandianlian=states("sensor.tasmota_energy_today") | float %}
{% set zuotiandianlian=states("sensor.tasmota_energy_yesterday") | float %}
{% set onedianjia=0.588 %}
{% set twodianjia=0.05 %}
{% set threedianjia=0.25 %}
{% set onedianlian=200 %}
{% set twodianlian1=350 %}
{% set twodianlian2=450 %}
{% set two1month=[4,5,6,10,11,12] %}
{% if now().month in two1month %}
{% set twodianlian=twodianlian1 %}
{% else %}
{% set twodianlian=twodianlian2 %}
{% endif %}
{% set before_dianliang= dianlian - jintiandianlian %}
{% if before_dianliang > twodianlian %}
{% set threedianfei= (before_dianliang - twodianlian) * threedianjia %}
{% else %}
{% set threedianfei=0 %}
{% endif %}
{% if before_dianliang > onedianlian %}
{% set twodianfei= (before_dianliang - onedianlian) * twodianjia %}
{% else %}
{% set twodianfei=0 %}
{% endif %}
{% set before_dianfei= before_dianliang * onedianjia + twodianfei + threedianfei %}
{% set zuotian_before_dianliang= dianlian - jintiandianlian - zuotiandianlian %}
{% if zuotian_before_dianliang > twodianlian %}
{% set threedianfei= (zuotian_before_dianliang - twodianlian) * threedianjia %}
{% else %}
{% set threedianfei=0 %}
{% endif %}
{% if zuotian_before_dianliang > onedianlian %}
{% set twodianfei= (zuotian_before_dianliang - onedianlian) * twodianjia %}
{% else %}
{% set twodianfei=0 %}
{% endif %}
{% set zuotian_before_dianfei= zuotian_before_dianliang * onedianjia + twodianfei + threedianfei %}
{% set zuotian_dianfei = before_dianfei - zuotian_before_dianfei %}
{% if zuotian_dianfei>0 %}
{{ zuotian_dianfei | round(2) }}
{% endif %}
friendly_name: 'zuotian_dianfei'
unit_of_measurement: "RMB"
#计量清零
automation:
- id: 'monitor_clear'
alias: 月初清零电表
initial_state: true
hide_entity: false
trigger:
- platform: template
value_template: '{{ states("sensor.tasmota_energy_today") | round(3) == 0.000 }}'
condition:
- condition: template
value_template: '{{ (now().strftime("%d") | int) == 1 }}'
action:
- service: mqtt.publish
data:
topic: 'cmnd/sonoff/EnergyReset2'
payload: '0'
- service: mqtt.publish
data:
topic: 'cmnd/sonoff/EnergyReset3'
payload: '0'
里面的 0.588 为基本电价,0.05为二档电价-一档电价,0.25三档电价-二档电价,4,5,6,10,11,12这几个月为春秋季二档电量为350度,其它几个月为冬夏季二档电量为450度。如果不同就按照修改。
这样就可以每月1号0点把总电量清零变成月电量和显示电费了。
用 Node-RED 把用电信息推送到企业微信
Home Assistant 篇一:从Node-RED与微信推送谈起_NAS存储_什么值得买 (smzdm.com) 这篇已经告诉我们怎么用Node_RED把信息推送到企业微信,现在我们要做的就是Node-RED提取Home Assistant信息处理好后再推送。
Node-RED安装Home Assistant插件
登录安装好的Node-RED,再到节点管理添加 node-red-contrib-home-assistant-websocket 插件
安装node-red-contrib-home-assistant-websocket插件
导入以下流程
[
{
"id": "dcbd8ed9f4179814",
"type": "inject",
"z": "b58a7128aa4b97b4",
"name": "每天9点发送用电信息",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "00 09 * * *",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payloadType": "date",
"x": 460,
"y": 180,
"wires": [
[
"82a8fda3f504513e",
"1dc399c57821bd14",
"5cd3531c2512bffd",
"9f24f15912873f5b"
]
]
},
{
"id": "82a8fda3f504513e",
"type": "api-current-state",
"z": "b58a7128aa4b97b4",
"name": "昨天用电量",
"server": "e8349c19021c66e6",
"version": 2,
"outputs": 1,
"halt_if": "",
"halt_if_type": "num",
"halt_if_compare": "is",
"entity_id": "sensor.tasmota_energy_yesterday",
"state_type": "num",
"blockInputOverrides": false,
"outputProperties": [
{
"property": "payload1",
"propertyType": "msg",
"value": "",
"valueType": "entityState"
},
{
"property": "data1",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 690,
"y": 120,
"wires": [
[
"84eed89c4ae0a7e5"
]
]
},
{
"id": "96391bb46eab6444",
"type": "function",
"z": "b58a7128aa4b97b4",
"name": "",
"func": "nvar message=msg.payload;nnvar desc='本月已用电量:'+ message[2] + 'KWHrn';ndesc+='本月已用电费:'+ message[3] + '元rn';ndesc+='昨天用电量:'+ message[0] + 'KWHrn';ndesc+='昨天电费:'+ message[1] + '元';nnwechat = {n "touser" : "@all",n "msgtype": "textcard",n "textcard": {n "title": '家庭用电详情',n "description" : desc,n "url" : `Home Assistant网址和端口`,n "btntxt":"查看详情",n },n}nnmsg.payload = {};nmsg.payload = wechat;nnreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 770,
"y": 420,
"wires": [
[
"2252d013b647ef4f"
]
]
},
{
"id": "2252d013b647ef4f",
"type": "bizwechat-push",
"z": "b58a7128aa4b97b4",
"name": "",
"bizwechat": "c36787cd99e1d359",
"x": 900,
"y": 420,
"wires": [
[]
]
},
{
"id": "1dc399c57821bd14",
"type": "api-current-state",
"z": "b58a7128aa4b97b4",
"name": "昨天电费",
"server": "e8349c19021c66e6",
"version": 2,
"outputs": 1,
"halt_if": "",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "sensor.zuotian_dianfei",
"state_type": "num",
"blockInputOverrides": false,
"outputProperties": [
{
"property": "payload2",
"propertyType": "msg",
"value": "",
"valueType": "entityState"
},
{
"property": "data2",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 680,
"y": 160,
"wires": [
[
"84eed89c4ae0a7e5"
]
]
},
{
"id": "5cd3531c2512bffd",
"type": "api-current-state",
"z": "b58a7128aa4b97b4",
"name": "本月已用电量",
"server": "e8349c19021c66e6",
"version": 2,
"outputs": 1,
"halt_if": "",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "sensor.tasmota_energy_total",
"state_type": "num",
"blockInputOverrides": false,
"outputProperties": [
{
"property": "payload3",
"propertyType": "msg",
"value": "",
"valueType": "entityState"
},
{
"property": "data3",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 700,
"y": 200,
"wires": [
[
"84eed89c4ae0a7e5"
]
]
},
{
"id": "9f24f15912873f5b",
"type": "api-current-state",
"z": "b58a7128aa4b97b4",
"name": "本月已用电费",
"server": "e8349c19021c66e6",
"version": 2,
"outputs": 1,
"halt_if": "",
"halt_if_type": "str",
"halt_if_compare": "is",
"entity_id": "sensor.zong_dianfei",
"state_type": "num",
"blockInputOverrides": false,
"outputProperties": [
{
"property": "payload4",
"propertyType": "msg",
"value": "",
"valueType": "entityState"
},
{
"property": "data4",
"propertyType": "msg",
"value": "",
"valueType": "entity"
}
],
"override_topic": false,
"state_location": "payload",
"override_payload": "msg",
"entity_location": "data",
"override_data": "msg",
"x": 700,
"y": 240,
"wires": [
[
"84eed89c4ae0a7e5"
]
]
},
{
"id": "bbfb4fd669583aba",
"type": "debug",
"z": "b58a7128aa4b97b4",
"name": "",
"active": false,
"tosidebar": true,
"console": true,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 920,
"y": 300,
"wires": []
},
{
"id": "a7061ef619785c6a",
"type": "join",
"z": "b58a7128aa4b97b4",
"name": "合并成数组",
"mode": "custom",
"build": "array",
"property": "payload",
"propertyType": "msg",
"key": "topic",
"joiner": "n",
"joinerType": "str",
"accumulate": false,
"timeout": "",
"count": "4",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 430,
"y": 420,
"wires": [
[
"759804d789b42f8e",
"ea66b8ca18cc54ae"
]
]
},
{
"id": "84eed89c4ae0a7e5",
"type": "function",
"z": "b58a7128aa4b97b4",
"name": "合并",
"func": "nreturn { payload:[msg.payload1, msg.payload2,msg.payload3,msg.payload4]};n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 890,
"y": 180,
"wires": [
[
"a7061ef619785c6a"
]
]
},
{
"id": "759804d789b42f8e",
"type": "debug",
"z": "b58a7128aa4b97b4",
"name": "",
"active": false,
"tosidebar": true,
"console": true,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 800,
"y": 540,
"wires": []
},
{
"id": "ea66b8ca18cc54ae",
"type": "function",
"z": "b58a7128aa4b97b4",
"name": "合并成一个数组",
"func": "var redata=[0,0,0,0]nfor (var x in msg.payload)n{n var data=msg.payload[x];n for(var i =0;i<redata.length;i++){n if(data.length>=i-1 && data[i] && data[i]>0){n redata[i]=data[i];n }n }n}nreturn { payload:redata};n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 620,
"y": 420,
"wires": [
[
"bbfb4fd669583aba",
"96391bb46eab6444"
]
]
},
{
"id": "e8349c19021c66e6",
"type": "server",
"name": "Home Assistant",
"version": 1,
"legacy": false,
"addon": false,
"rejectUnauthorizedCerts": true,
"ha_boolean": "y|yes|true|on|home|open",
"connectionDelay": true,
"cacheJson": true
},
{
"id": "c36787cd99e1d359",
"type": "bizwechat-configurator",
"name": "企业微信推送",
"port": "3001",
"corpid": "",
"agentid": "",
"corpsecret": "",
"url": "",
"token": "",
"aeskey": "",
"client_id": "",
"client_secret": ""
}
]
导入后要把Home Assistant和企业微信的信息改成自己的。双击修改。
最后点部署。。。。
到此所有工作做完了。
最后
欢迎收藏、评论、点赞。























































tane274
ntpServer1 ntp3.aliyun.com
timezone +8
第一条是换成阿里云的NTP服务器,第二条是把时区改为东8区。
校验提示文案
沙糖桔杀手
校验提示文案
星逝z
校验提示文案
库克从多多进货
校验提示文案
faninx
校验提示文案
Woodrow
校验提示文案
柯柯的影子
校验提示文案
Oo野火燎原oO
校验提示文案
那个操心的司机
校验提示文案
maisi87
具体某个设备的耗电量,直接用小米智能插座,或者空调伴侣
校验提示文案
超级原子弹
校验提示文案
lzywww2002
校验提示文案
h2004
校验提示文案
vnbr
楼主的方案我之前在用,有个缺点就是变压模块容易电流啸叫,整体暴露在外也不安全(我当时自己套了热缩管)
新版有外壳,搭配dt06默认透传固件 无需刷固件 无强电暴露 整体更美观也更安全
校验提示文案
Acestar2
校验提示文案
Rayaya
校验提示文案
大耳怪
校验提示文案
值友8926825817
校验提示文案
值友2262959776
校验提示文案
是发发啊
校验提示文案
OneJune
校验提示文案
值友4247956193
校验提示文案
值友7246539116
校验提示文案
疯狂的假期
00:00:06.454 QPC: Reset
00:00:07.501 WIF: Connected
00:00:07.753 HTP: Web server active on tasmota-4C8C46-3142 with IP address 192.168.2.92
00:00:12.612 MQT: Attempting connection...
00:00:13.615 MQT: Connect failed to 去看看:1883, rc -5. Retry in 10 sec
05:51:55.324 MQT: Attempting connection...
05:51:56.327 MQT: Connect failed to 去看看:1883, rc -5. Retry in 20 sec
我现在烧录的tasmota版本是12.4,我也试过楼主帖子里面的10.0版本,同样报错,但错误代码是rc -2。MQTT服务器用windows的MQTT客户端验证是ok的,HA同样也能连上,看来就是ESP01连接不上,尝试过公网云服务器部署和局域网部署两种方法,都连不上,没招了。
校验提示文案
值友9553267450
校验提示文案
值友2062620727
校验提示文案
小母牛拉大锯
校验提示文案
值友6951489169
校验提示文案
尼陌
校验提示文案
aday168
校验提示文案
狗屎一刀斩
校验提示文案
值友3370523543
校验提示文案
东方小爽
校验提示文案
i小兴
校验提示文案
超级小吉祥
校验提示文案
值友6504167863
校验提示文案
值友6619149441
校验提示文案
Acestar2
校验提示文案
BigBubbleGum
校验提示文案
彬哥哥1989
校验提示文案