『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 22335|回复: 67

[技术探讨] 分享一个自部署的查询国家电网电费的API方案

  [复制链接]

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
发表于 2023-7-8 12:18:28 | 显示全部楼层 |阅读模式
本帖最后由 qianshi 于 2024-4-30 14:42 编辑

代码停止更新,源代码已归档,之后不再维护

项目名已更新,请从新仓库拉取代码:
源码地址:https://github.com/okatu-loli/Electricity-Tracker
项目趋于稳定,目前考虑构建docker,由于现实原因,更新较慢,请谅解,欢迎小伙伴提交pr

一些话
由于出租屋用电量较大,时不时就会欠费断电,不太想上web端和客户端,也不想开通自动付电费,所以写了这么一段代码用于提醒交电费,也可以实时查询电费

目前只测试了保定地区,其他地区没有进行测试,理论来说全国通用

功能介绍
  • 自动化查询:自动定时登录网页,获取电费数据,无需人工干预。
  • 数据API:通过Flask Web服务器,提供API接口,可以随时查询当前电费。
  • 阈值通知:当电费低于用户设定的阈值时,程序会自动发送通知。
  • 执行通知:可以设定在每次查询执行后发送通知,无论电费是否达到阈值。
  • 多平台支持:目前支持飞书和ServerChan两种通知方式,未来可能会支持更多平台。



配置文件:

                               
登录/注册后可看大图


项目依赖:
  • python 3.10
  • 依赖安装:
  • pip install -r requirements.txt
    playwright install



使用方法
  • 更名 config.ini.example 为 config.ini ,修改配置文件 config.ini ,填入自己的国家电网的账号密码、通知配置、飞书和ServerChan的密钥。
  • 运行 app.py 文件,启动Web服务器。
  • 访问 http://localhost:5000/electricity 接口,获取最新的电费数据。
  • 也可以单独执行main.py文件,这将不会有定时任务和API的功能。
  • 设定好通知时间、阈值等,程序将按照这些配置进行工作。



程序须在后台运行,不能关闭,后期会尝试打包docker,现阶段Linux可以用systemctl或者screen,Windows端可以设置开机自启(需自行搜索相关教程)
对于systemctl,配置文件可以参考我的(需修改):
[Unit]
Description=update and return dianfei

[Service]
ExecStart=sudo /usr/bin/python3 /home/qianshi/service/dianfei/app.py
Restart=always
User=root
Group=root
Environment=PATH=/usr/bin:/usr/bin:/usr/local/bin
WorkingDirectory=/home/qianshi/service/dianfei

[Install]
WantedBy=multi-user.target


因为开放了API,所以应该可以很容易接入ha,本人还是小白,欢迎各位大佬留言交流

计划
  • 支持多户号查询
  • 支持更多信息的查询
  • 支持docker部署
  • 支持命令行快速生成配置文件


本贴更新日志
2023年7月11日:更新依赖缺失的错误(感谢@sktyou指正错误)

2023年7月12日:添加更新计划(感谢@siri10086 @d380025303 @youcome)
2023年7月14日:添加MQTT支持,实现多渠道消息推送,详见PR [#1](https://github.com/okatu-loli/Baoding-Electricity-Tracker/pull/1) 感谢[@sunshinenny](https://github.com/sunshinenny)

2023年8月19日:增加Webhook支持,详见 [#2](https://github.com/okatu-loli/Baoding-Electricity-Tracker/pull/2) 感谢[@marvyn](https://github.com/marvyn)

2023年11月23日:更新验证码识别逻辑



评分

参与人数 9金钱 +64 收起 理由
gw886 + 5
summ99111 + 5 期待docker版本
zyxcompany + 5 大佬 有docker部署的方案了吗?
lqf1206 + 8 论坛有你更精彩!
myhades + 5 感谢楼主分享!
liangxw2008 + 1 高手,这是高手!
demacia + 5 高手,这是高手!
admin + 20 感谢楼主分享!
dscao + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24304
金钱
22873
HASS币
290
发表于 2023-7-8 12:54:41 | 显示全部楼层
感谢分享,多一种方法。简单了解了一下,原理上看也是模拟登录网页,提取页面中的内容。
不知道这个项目的数据即时性和资源占用的轻量化上面是否比较有优势?
回复

使用道具 举报

46

主题

1654

帖子

6676

积分

论坛元老

Rank: 8Rank: 8

积分
6676
金钱
5012
HASS币
40
发表于 2023-7-8 22:36:19 | 显示全部楼层
dscao 发表于 2023-7-8 12:54
感谢分享,多一种方法。简单了解了一下,原理上看也是模拟登录网页,提取页面中的内容。
不知道这个项目的 ...

看方法好像是单纯的模拟请求,没套Selenium

折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

3

主题

60

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
金钱
270
HASS币
0
发表于 2023-7-10 17:48:42 | 显示全部楼层
今天安装了代码,有几个问题
回复

使用道具 举报

3

主题

60

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
金钱
270
HASS币
0
发表于 2023-7-10 18:02:55 | 显示全部楼层
代码中间     time = config.get('Notification', 'time')
    # 设定每天定时执行run_main函数
    schedule.every().day.at(f"{time}").do(run_main)  这个会导致后面的函数 AttributeError: 'str' object has no attribute 'sleep' 报错 ,需要修改一下    time_str = config.get('Notification', 'time')
    time_obj = datetime.datetime.strptime(time_str, '%H:%M:%S')  # 将时间字符串解析为时间对象

    # 设定每天定时执行run_main函数
    schedule.every().day.at(time_obj.strftime('%H:%M:%S')).do(run_main)  # 将时间对象转换为带有时分秒格式的字符串 这是我修改的,同时软件需要安装模拟浏览器 playwright install
回复

使用道具 举报

0

主题

608

帖子

2516

积分

金牌会员

Rank: 6Rank: 6

积分
2516
金钱
1908
HASS币
0
发表于 2023-7-10 18:34:15 | 显示全部楼层
看起来很棒的样子
回复

使用道具 举报

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
 楼主| 发表于 2023-7-11 22:47:18 | 显示全部楼层
sktyou 发表于 2023-7-10 18:02
代码中间     time = config.get('Notification', 'time')
    # 设定每天定时执行run_main函数
    schedu ...

感谢大佬!!这就去修改
回复

使用道具 举报

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
 楼主| 发表于 2023-7-11 22:51:16 | 显示全部楼层
dscao 发表于 2023-7-8 12:54
感谢分享,多一种方法。简单了解了一下,原理上看也是模拟登录网页,提取页面中的内容。
不知道这个项目的 ...

及时性的话,国家电网是每天更新一次数据(有时是两天一次),所以不用考虑,所以我的想法是保证每天正常运行一次即可
资源占比的话我没有测试,但应该占比不大,因为只开了一个api,消耗不会大
回复

使用道具 举报

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
 楼主| 发表于 2023-7-11 22:51:31 | 显示全部楼层
Ari 发表于 2023-7-10 18:34
看起来很棒的样子

谢谢!
回复

使用道具 举报

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
 楼主| 发表于 2023-7-11 23:09:37 | 显示全部楼层
jjcs 发表于 2023-7-8 22:36
看方法好像是单纯的模拟请求,没套Selenium

是的,因为个人感觉playwright难度小一些,代码修改起来也会更容易
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 02:33 , Processed in 0.105003 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表