本帖最后由 sephrioth 于 2023-2-7 10:14 编辑
2023.02.07 更新为dscao 大佬的写法
--------------------------------------------
说明下,这个是通过模拟, 如果需要精确,请使用对应的智能电表接入(但是这种接入无法区分设备),或者每个设备上都加一个能检测功率的智能插座(也不太现实)...
首先,我们需要你想监测的设备的大概功率,然后通过HA来获取设备开机时间进行计算, 我这里用我家里的 iMac 台式机举例
查了下,手上这台 iMac 的待机功率75w,正常功率是150-200w, 所以待机功率没法忽略(很多设备待机就几w的可以忽略不计)
创建两个 history_statistics sensor 来计算开机/待机的时间
sensor:
- platform: history_stats
name: Stats iMac
entity_id: binary_sensor.imac #你要监控的设备 entity_id
state:
- 'on' #监控开机状态
type: time
start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}" #从0点开始
end: "{{ now() }}" #到现在经过了多久
- platform: history_stats
name: Stats iMac Off
entity_id: binary_sensor.imac #你要监控的设备 entity_id
state:
- 'off' #监控待机状态
type: time
start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
end: "{{ now() }}"
然后创建一个 template 的 sensor 来计算功耗
template:
- sensor:
- name: "Energy iMac"
unique_id: energy_imac
state_class: total_increasing #状态类型为 total_increasing
device_class: energy #设备类型为能源
unit_of_measurement: 'kWh' #单位为千瓦
state: >
{% set x = states('sensor.stats_imac') | float %} # 这里的entity 就是上面创建的监控开机时间的sensor,值赋给 x
{% set y = states('sensor.stats_imac_off') | float %} # 这里的entity 就是上面创建的监控待机时间的sensor,值赋给 y
{{ (x*0.15)|round(3) + (y*0.075)|round(3) }} # 开机功率算150w,因为这个sensor单位是千瓦,所以也就是 0.15,待机功率计算为 0.075
{% endif %}
attributes:
last_reset: '2023-01-01T00:00:00+00:00'
最后把这个sensor添加到能源面板,在电网数据那里添加后就可以看到每个小时的能耗分布, 在单独设备那里添加后可以看设备当前的总能耗, 我这里设备比较多,大概就长这样
在独立设备那里大概长这样
最后可以根据实际电网数据进行一些微调, 我现在和实际耗电的误差大概在3-5% 之间。
-----------------------------------
本来教程差不多可以结束了,最后再附送下如何加入价格计算。
楼主本人在魔都,电费是晚上10点到早上6点是谷用电, 其余时间是峰用电; 然后魔都还有个年度阶梯,但是这个数据在电网那边更新延迟的厉害,没法实时,所以我就打算手动调整了, 毕竟一年最多也就调2次
针对峰用电和谷用电创建 input_select
input_select:
electric_price_level:
name: 'Price'
options: #用电的3档价格
- 0.617,0.317
- 0.623,0.31
- 0.977,0.487
icon: mdi:currency-cny
然后再生成一个 template sensor 来根据时间来判断当前是峰用电还是谷用电, 先准备好系统的 time 这个sensor
template:
- sensor:
- name: "Electric Price"
unique_id: sensor_electric_price
icon: mdi:home-lightning-bolt
unit_of_measurement: 'CNY/kWh'
state: >
{% set current_hour = strptime(states('sensor.time'), "%H:%M").hour %} #获取当前时间
{% if current_hour > 6 and current_hour < 22 %} #如果是在6点后, 22点前
{{ states('input_select.electric_price_level').split(",")[0]|float }} #使用峰用电价格
{% else %}
{{ states('input_select.electric_price_level').split(",")[1]|float }}
{% endif %}
然后在能源配置页面, 电网数据那里, 编辑你刚刚添加的设备, 选择 use an entity with current price, 然后选中刚刚新增的这个 sensor, 就可以了
这样你就可以在能源面板看到当天的电费了
最后提醒一句就是, 相关的 entities 必须要记录在 record 中, 如果你排除了就没有数据了 |