Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

内蒙古电费查询

简体中文 | English

hacs_badge version

查询内蒙古住户的电费余额、历史电量电费与每日电量情况

数据说明

当前版本的数据来自蒙电e家app 接口。

仓库中仍然保留了早期的 energy_api.py 作为历史参考,但公众号相关接口目前已弃用,不再参与实际取数。

根据公众号中的说法

查询余额为结算系统余额=上月度结转电费+本月缴纳电费,实际电费余额以表计显示为准。

所以,余额不是实时余额,仅供参考。

安装

HACS (推荐)

可以通过在HACS中搜索插件名IMPC Energy进行安装

手动安装

这里下载最新版本

把压缩包内容解压到custom_components/impc_energy文件夹下

安装后需要重启hass

配置

当前版本使用蒙电e家账号登录进行配置,不再手动输入户号。

  • 进入 设置 -> 设备与服务 -> 添加集成(右下角)

  • 在弹出的对话框中搜索 IMPC Energy 并点击

    image

  • 在弹出的配置向导中输入蒙电e家的用户名和密码

  • 集成会自动调用getUser接口,获取该账号下绑定的全部户号,并为每个户号各创建一个配置条目

  • 每个条目的名称直接使用接口返回的地址/户名(yhmc)

  • 等待配置完成

  • 系统会自动生成实体名称, 如有需要可自行修改

如果后续 token 失效,Home Assistant 会提示重新认证,此时重新输入一次密码即可刷新该账号下所有条目的登录凭证。

旧版本迁移指南

如果您从 v0.X.X 旧版本升级到 v1.X.X 及以上版本,可能需要注意以下事项:

  • 旧版本配置文件配置方式已被移除,请改用图形界面添加。
  • 由于entity_idunique_id的问题,旧版实体与新版不兼容,需要删除旧版实体。
  • 需要删除配置文件中的impc_energy配置
  • 如果无法删除旧版实体,请尝试删除旧版IMPC Energy集成,重启HomeAssistant,再重新安装。

传感器

插件会为每个户号创建 4 个传感器:电费余额历史电费阶梯电费每日电量 image image

电费余额是结算余额,所以理论上数值一个月才会改变一次(交了电费也可能改变,没有测试) image

过去 12 个月的历史数据(用电量与电费)放到了一个传感器里 "历史"实体中展示的数据是本期电费 image

阶梯电费实体会默认查询上一个月的阶梯电费信息。

阶梯电费示意图

实体状态(state)为该月总电费,额外属性中包含:

  • query_month:查询年月,格式 YYYYMM
  • current_tier:当前阶梯档位
  • current_price:当前阶梯电价
  • total_consumption:总电量
  • total_bill:总电费
  • tier_spread_bill:阶梯差额电费
  • price_name:电价名称
  • price_code:电价编码
  • tiers:阶梯明细数组,适合卡片和图表直接读取

每日电量会展示最近 30 天的每日用电量 image

有时会有负值是因为接口返回的就是负数, 不知道为什么

卡片配置

利用图表卡片 apexcharts-card 可以实现如下的效果:

image image

(x轴步长没有生效可能是这个图表库的问题)

type: vertical-stack
cards:
 - type: horizontal-stack
 cards:
 - type: markdown
 content: |-
 {% set home=states.sensor.impc_energy_01xxxxxxx70_balance %}
 ### {{home.state}}
 当前余额(元)
 - type: markdown
 content: |-
 {% set home=states.sensor.impc_energy_0110xxxxxx970_history %}
 ### {{home.attributes['current']['bill']}}
 本期总电费(元)
 - type: markdown
 content: |-
 {% set home=states.sensor.impc_energy_011xxxxxxx970_history %}
 ### {{home.attributes['current']['consumption']}}
 本期总电量(kW⋅h)
 - type: custom:apexcharts-card
 header:
 show: true
 title: 用电历史
 show_states: false
 colorize_states: true
 graph_span: 1y
 span:
 offset: '-1month'
 apex_config:
 legend:
 position: top
 xaxis:
 stepSize: 1
 tooltip:
 enabled: false
 labels:
 datetimeFormatter:
 year: ''
 month: M月
 tooltip:
 x:
 format: yyyy年M月
 series:
 - name: 历史电量
 entity: sensor.impc_energy_01xxxxxxxxx70_history
 type: column
 color: 3498DB
 unit: kW⋅h
 show:
 datalabels: false
 legend_value: false
 data_generator: |
 const data=[];
 const attributes=entity.attributes;
 for(let item in attributes){
 if(item.length==6&&item.startsWith("20")){
 //202403
 const timeStr=`${item.slice(0, 4)}-${item.slice(-2)}-01T00:00:00`;
 const dataObj=new Date(timeStr);
 data.push([dataObj.getTime(),attributes[item]["consumption"]]);
 }
 }
 //console.log("data1", data);
 return data;
 - name: 历史电费
 entity: sensor.impc_energy_011xxxxxx970_history
 color: FF9F0b
 unit: 
 extend_to: false
 show:
 datalabels: false
 legend_value: false
 data_generator: |
 const data=[];
 const attributes=entity.attributes;
 for(let item in attributes){
 if(item.length==6&&item.startsWith("20")){
 //202403
 const timeStr=`${item.slice(0, 4)}-${item.slice(-2)}-01T00:00:00`;
 const dataObj=new Date(timeStr);
 data.push([dataObj.getTime(),attributes[item]["bill"]]);
 }
 }
 //console.log("data2", data);
 return data;

 - type: custom:apexcharts-card
 header:
 show: true
 title: 每日用电
 show_states: false
 colorize_states: true
 graph_span: 30d
 apex_config:
 legend:
 position: top
 xaxis:
 stepSize: 1
 tooltip:
 enabled: false
 labels:
 datetimeFormatter:
 year: ''
 month: ''
 day: d日
 tooltip:
 x:
 format: yyyy年MM月dd日
 series:
 - name: 日用电量
 entity: sensor.impc_energy_011xxxxxx970_daily_consumption
 color: 4D55CC
 unit: kW⋅h
 show:
 datalabels: false
 legend_value: false
 data_generator: |
 const data=[];
 const attributes=entity.attributes;
 for(let item in attributes){
 if(item&&item.startsWith("20")){
 //2024-03-01
 const timeStr=`${item}T00:00:00`;
 const dataObj=new Date(timeStr);
 data.push([dataObj.getTime(),attributes[item]]);
 //data.push([item, attributes[item]]);
 }
 }
 console.log("data3", data);
 return data;

阶梯电费卡片示例

以下示例假设阶梯电费实体为 sensor.impc_energy_0110072xxxxx_tiered_bill

type: vertical-stack
cards:
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ## 阶梯用电一览表
 查询月份:**{{ e.attributes.query_month[:4] }}/{{ e.attributes.query_month[4:6] }}**

 - type: grid
 columns: 2
 square: false
 cards:
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ### 当前阶梯档位
 **{{ e.attributes.current_tier }} 档**
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ### 当前阶梯电价
 **{{ e.attributes.current_price }} 元/度**
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ### 总电量
 **{{ e.attributes.total_consumption }} kWh**
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ### 总电费
 **{{ e.state }} 元**
 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 ### 阶梯差额电费
 **{{ e.attributes.tier_spread_bill }} 元**

 - type: markdown
 content: |-
 {% set e = states.sensor.impc_energy_0110072xxxxx_tiered_bill %}
 {% set tiers = e.attributes.tiers if e and e.attributes.tiers is defined else [] %}

 ### 阶梯明细

 {% for item in tiers %}
 - **{{ item.tier_name }}**:{{ item.consumption }} kWh / {{ item.price }} 元/度 / {{ item.bill }} 元
 {% endfor %}

考虑到 apexcharts-card 更适合时间序列,当前版本的阶梯电费示例采用更稳定的摘要卡 + 明细列表方案,而不再强依赖类目柱状图。

其他

没有找到现成能用的,就自己写一个吧。

我是搞Java的,Python勉强能看懂,但是还是有些蛋疼的 (╯‵しろいしかく′)╯(┻━┻

这里鸣谢 @involute 大神,参考了他帖子中的代码

同样感谢大神@Aaron Godfrey 提供的插件开发教程

About

通过内蒙古电力公众号查询电量电费的Home Assistant插件

Topics

Resources

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /