个人家庭用电量查询-基于Docker和Homeassistant

2023-10-18 16:30

本文主要是介绍个人家庭用电量查询-基于Docker和Homeassistant,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mini-graph-card

本应用可以帮助你将国网的电费、用电量数据接入homeassistant,实现实时追踪家庭用电量情况;并且可以将每日用电量保存到数据库,历史有迹可循。具体提供两类数据:

  1. 在homeassistant以实体显示:

    实体entity_id说明
    sensor.last_electricity_usage最近一天用电量,单位KWH、度。属性含present_date(查询电量代表的日期)
    sensor.electricity_charge_balance预付费显示电费余额,反之显示上月应交电费,单位元
    sensor.yearly_electricity_usage今年总用电量,单位KWH、度。
    sensor.yearly_electricity_charge今年总用电费用,单位元
  2. 可选,近三十天每日用电量数据(mongodb数据库),例如:

在这里插入图片描述

一、适用范围

  1. 适用于除南方电网覆盖省份外的用户。即除广东、广西、云南、贵州、海南等省份的用户外,均可使用本应用获取电力、电费数据。

  2. 不管是通过哪种哪种安装的homeassistant,只要可以运行python,有约1G硬盘空间和500M运行内存,都可以采用本仓库部署。

本镜像支持架构:

  • linux/amd64:适用于 x86-64(amd64)架构的 Linux 系统,例如windows电脑。
  • linux/arm64:适用于 ARMv8 架构的 Linux 系统,例如树莓派,N1盒子。
  • linux/arm/v7:适用于 ARMv7 架构的 Linux 系统,例如玩客云。
  • 其他架构移步github仓库自行build。

二、实现流程

通过python的selenium包获取国家电网的数据,通过homeassistant的提供的REST API将采用POST请求将实体状态更新到homeassistant。

三、安装

1)方法一(推荐):docker镜像部署,速度快

  1. 安装docker和homeassistant,Homeassistant极简安装法。

  2. 创建项目文件夹

   mkdir sgcc_electricitycd sgcc_electricity 
  1. 创建环境变量文件
   vim .env

参考以下文件编写.env文件

# 以下项都需要修改
# 国网登录信息
PHONE_NUMBER="xxx" # 修改为自己的登录账号
PASSWORD="xxxx" # 修改为自己的登录密码# 数据库配置
ENABLE_DATABASE_STORAGE=True # or False 不启用数据库储存每日用电量数据。
# 数据库可以填已有的mongodb数据库
MONGO_URL="mongodb://USERNAME:PASSWORD@mongo-for-sgcc:27017/" # 数据库地址 修改USERNAME PASSWORD和mongo-for-sgcc和mongo容器名称一致 
DB_NAME="homeassistant" # 数据库名,默认为homeassistant
# COLLECTION_NAME默认为electricity_daily_usage_{国网用户id},不支持修改。# homeassistant配置
HASS_URL="http://localhost:8123/" # 改为你的localhost为你的homeassistant地址HASS_TOKEN="eyxxxxx" # homeassistant的长期令牌# selenium运行参数
JOB_START_TIME="07:00" # 任务开始时间,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次。## 其他默认参数
DRIVER_IMPLICITY_WAIT_TIME=60 # 浏览器默认等待时间,秒。
RETRY_TIMES_LIMIT=5 # 登录重试次数
LOGIN_EXPECTED_TIME=60 # 登录超时时间,秒
RETRY_WAIT_TIME_OFFSET_UNIT=10 
FIRST_SLEEP_TIME=10 # 第一次运行等待时间,秒# 日志级别
LOG_LEVEL="INFO" # 例如“DUBUG”可以查看出错情况
  1. 编写docker-compose.yml文件
version: "3"services:app:env_file:- .envdepends_on:- mongoimage: renhai/sgcc_electricity:latest # armv7 32架构的镜像为armv7-latestcontainer_name: sgcc_electricitynetworks:sgcc_network:environment:- SET_CONTAINER_TIMEZONE=true- CONTAINER_TIMEZONE=Asia/Shanghairestart: unless-stoppedcommand: python3 main.py# 默认将近30天数据写入mongo数据库,方便查询mongo:image: mongo:4.4.18restart: alwayscontainer_name: mongo-for-sgccnetworks:sgcc_network:environment:MONGO_INITDB_ROOT_USERNAME: USERNAME # 修改为自己的用户名MONGO_INITDB_ROOT_PASSWORD: PASSWORD # 修改为自己的密码MONGODB_DATABASE: "homeassistant" # 修改为自己的数据库名,和.env中的数据库名一致CONTAINER_TIMEZONE: Asia/Shanghaivolumes:- ./db:/data/dbnetworks:sgcc_network:
  1. 运行

    docker compose up --build 
    # 或者后台运行
    docker compose up -d --build
    

### 2)方法二:本地自行构建容器1. 克隆仓库```bashgit clone https://github.com/renhaiidea/sgcc_electricity.gitcd sgcc_electricity
  1. 参考example.env编写.env文件

    cp example.env ./env
    
  2. 查阅docker-compose文件,默认不需要修改

  3. 运行

    docker compose up --build 
    # 或者后台运行
    docker compose up -d --build
    

3)方法三,不安装docker,安装python环境后直接运行:

克隆仓库之后,参考Dockerfile的命令,自行配置安装chrome浏览器和selenium浏览器驱动,安装mongodb,将example.env文件复制为.env文件到scripts文件夹下,到然后运行mian.py文件。

四、配置与使用

1)第一次运行需要创建并填写.env文件,按文件说明进行填写。

2)(可选)修改实体

填写homeassistant的配置文件

由于采用REST API方式创建sensor,没有做实体注册,无法在webui里编辑。如果需要,你可以在configuration.yaml下增加如下配置后重启HA,这样你就可在webUI编辑对应的实体了,这样含有_entity后缀的实体就可以进行修改了。

  • 如果你有一个户号,参照以下配置:
# Example configuration.yaml entry
# 文件中只能有一个template
template:# 参考文档: https://www.home-assistant.io/integrations/template- trigger:- platform: eventevent_type: "state_changed"event_data:entity_id: sensor.electricity_charge_balancesensor:- name: electricity_charge_balance_entityunique_id: electricity_charge_balance_entitystate: "{{ states('sensor.electricity_charge_balance') }}"state_class: measurementunit_of_measurement: "CNY"device_class: monetary- trigger:- platform: eventevent_type: "state_changed"event_data:entity_id: sensor.last_electricity_usagesensor:- name: 最近一天用电量unique_id: last_electricity_usage_entitystate: "{{ states('sensor.last_electricity_usage') }}"attributes:present_date: "{{ state_attr('sensor.last_electricity_usage', 'present_date') }}"last_updated: "{{ state_attr('sensor.last_electricity_usage', 'last_updated') }}"state_class: totalunit_of_measurement: "kWh"device_class: energy- trigger:- platform: eventevent_type: "state_changed"event_data:entity_id: sensor.yearly_electricity_usagesensor:- name: yearly_electricity_usage_entityunique_id: yearly_electricity_usage_entitystate: "{{ states('sensor.yearly_electricity_usage') }}"state_class: total_increasingunit_of_measurement: "kWh"device_class: energy- trigger:- platform: eventevent_type: "state_changed"event_data:entity_id: sensor.yearly_electricity_chargesensor:- name: yearly_electricity_charge_entityunique_id: yearly_electricity_charge_entitystate: "{{ states('sensor.yearly_electricity_charge') }}"state_class: total_increasingunit_of_measurement: "CNY"device_class: monetary
  • 如果你有多个户号,每个户号参照configuration.yaml配置。

    **注:如果你有一个户号,在HA里就是以上实体名;**如果你有多个户号,实体名称还要加 “_户号”后缀,举例:sensor.last_electricity_usage_1234567890

❗️进行自定义操作之后,请使用带entity的实体。比如使用sensor.last_electricity_usage_entity_1234567890而不是sensor.last_electricity_usage_1234567890。

3)(可选)ha内数据展示

结合mini-graph-card 和mushroom实现效果:

image-20230731111757106.png
type: custom:mini-graph-card
entities:- entity: sensor.last_electricity_usage_entityname: 国网每日用电量aggregate_func: firstshow_state: trueshow_points: true
group_by: date
hour24: true
hours_to_show: 240

4)(可选)配合用电阶梯,实现实时电价。

image-20230729172257731

具体操作:

修改homeassistant.yml文件然后重启或重载配置文件,注意当前阶梯中的sensor.yearly_electricity_usage_entity要根据你的实际情况修改:

# 文件中只能有一个sensor
sensor:# 实时电价- platform: template #平台名称sensors: #传感器列表real_time_electricity_price: #实体名称:只能用小写,下划线unique_id: "real_time_electricity_price" #UID(必须)friendly_name:  '实时电价' #在前端显示的传感器昵称(可选)unit_of_measurement: "CNY/kWh" #传感器数值的单位(可选)icon_template: mdi:currency-jpy #默认图标value_template: > #定义一个获取传感器状态的模板(必须)下面的6和22是指6点和22点,"1""2""3"是指阶梯123,6个价格分别是3个阶梯的峰谷价格{% if now().strftime("%H")| int >= 6 and now().strftime("%H")|int < 22 and states("sensor.current_ladder")=="1" %}0.617{%elif now().strftime("%H")| int >= 6 and now().strftime("%H")|int < 22 and states("sensor.current_ladder")=="2" %}0.677{%elif now().strftime("%H")| int >= 6 and now().strftime("%H")|int < 22 and states("sensor.current_ladder")=="3" %}0.977{% elif states("sensor.current_ladder")=="1" %}0.307{% elif states("sensor.current_ladder")=="2" %}0.337{% elif states("sensor.current_ladder")=="3" %}0.487{% endif %}# 当前阶梯- platform: templatesensors:current_ladder:unique_id: "current_ladder"friendly_name:  '当前阶梯'unit_of_measurement: "级"icon_template: mdi:elevation-risevalue_template: > #这里是上海的三个阶梯数值,第2阶梯3120,第三阶梯4800{% if states("sensor.yearly_electricity_usage_entity") | float <= 3120 %}1{% elif states("sensor.yearly_electricity_usage_entity") | float >3120 and states("sensor.yearly_electricity_usage_entity") | float <= 4800 %}2{% else %}3{% endif %}

可以在能源面板进行配置,对可以统计电量的设备实现分阶梯计算用电量。

tip:打开ha>仪表盘>能源>添加用电数据>实时电价实体-选择real_time_electricity_price。

image-20230731111953612.png

5)电量通知

可以使用homeassistant内置通知或者其他通知服务,比如pushdeer。

写在最后

原作者:https://github.com/louisslee/sgcc_electricity,原始README_origin.md。

有人同步过:https://github.com/liantianji/sgcc_electricity

我的自定义部分包括:

增加的部分:

  • 增加近30天每日电量写入数据库(默认mongodb),其他数据库请自行配置。
  • 将间歇执行设置为定时执行: JOB_START_TIME,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次。
  • 给last_daily_usage增加present_date,用来确定更新的是哪一天的电量。一般查询的日期会晚一到两天。
  • 对configuration.yaml中自定义实体部分修改。

TO-DO

  • 增加多种执行方式
  • 添加默认推送服务
  • 添加多数据库支持
  • 。。。

这篇关于个人家庭用电量查询-基于Docker和Homeassistant的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233792

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析