此方法已失效,请移步到homeassistant获取电费余额2.0
前言
homeassistant少个电费余额总感觉少点什么,之前的山东电网接口挂掉了,导致ha一个月没法查询电费余额,就此查找方法,发现很多小程序网页等都是各省定制化的,而且数据加密,无法获取电费,突发奇想找到95598网上营业厅,然后找到了下面的方法,就此分享
sgcc_electricity
容器地址:https://registry.hub.docker.com/r/dscao/sgcc_electricity
镜像加速拉取命令:docker pull dockerproxy.com/dscao/sgcc_electricity:latest
部署docker
以群晖部署docker为例,其他docker 举一反三哈
1.高级设置里面的,变量需要按下面填入:
PHONE_NUMBER # 填入国家电网手机号
PASSWORD # 填入国家电网密码
HASS_URL #HA局域网地址
HASS_TOKEN #令牌 ,点ha头像 拉到最下面创建填入即可
2.docker文件夹文件不需要关联,直接下一步
3.启动容器
4.ha里面会生成一个实体,实体注册表里面搜索95598就出来
实体属性
本应用在启动后和每隔8小时抓取一次数据,并在HA里更新以下一个实体及其六个属性:
sensor.electricity_95598:电费余额/上期账单金额
is_pay: 是否当期已结清
need_pay: 账单欠费金额(后付费用户)
last_electricity_usage:最近一天用电量
thismonth_electricity_usage: 本月用电量
yearly_electricity_usage: 今年以来用电量
yearly_electricity_charge: 今年以来电费
last_date: 数据更新的最后日期
总结
就此就结束了~,可以通过调用实体的属性来查询各类的账单/金额等等,如果容器异常,看一下日志~
手机app的网上国网的手机号和密码就行吗?山东怎么容器日志显示手机号密码错误,网上国网登录是没有问题的
@Scong_F 哪个省的
大佬,你这个我一直在用,但是这几天突然报错Webdriver quit abnormly, reason: Message: element not interactable,请问怎么解决啊
@dafeng 目前看,我的也有问题,一直没注意,等明天看一下什么原因导致的,如有更新,会更新
@dafeng 部署一下这个docker试一下,https://github.com/renhaiidea/sgcc_electricity/commits/main
@zyx 今天按这个github上的部署了一下,还是不行,这是错误提示:derr: Traceback (most recent call last):
stderr: File “/app/data_fetcher.py”, line 90, in fetch
stderr: return self._fetch()
stderr: File “/app/data_fetcher.py”, line 107, in _fetch
@dafeng 我目前还没有部署测试,待后续吧
@zyx 好的,辛苦大佬
请教,我已经配置成功了,也可以成功读数了。
但我想把每个实体(我有两个电表)的那6个属性都做成实体 ,谢谢
@maccalove 访问一下文章里面容器地址,里面有分户的配置
容器看到了3个账号 但是HA里面搜实体没有发现是要到 yaml设置么
@Giovanni 容器地址里面有多用户配置,按照配置载入ha就行了
感觉好像国家电网的验证码改成了拖动图片的方式验证了,现在都无法登录了
@sa 最近没看 不行的话 让子弹飞一会~
老哥,还维护吗,改滑动验证了,期待中。。。
@111 是的,最近准备重新写一下教程,目前已经修复了,新的docker,需要配合nodered
怎么联系你啊
@fengshuang 联系我有什么事情吗?
@zyx 我想让你帮我定制个
@fengshuang QQ:1833386663
测了下可以用,不过有时候会定位不到坐标位置,建议在fetch_data增加一个循环,定位不到位置就刷新一下验证码,然后重新定位,稳定性会提高不少
def fetch_data(self):
“””
…….
“””
self.loading_slide()
self.page.wait_for_selector(‘canvas’)
for i in range(5): #增加定位循环
slide_bg_img = self.page.evaluate(“() => document.querySelector(‘canvas’).toDataURL(‘image/png’)”)
slide_block_img = self.page.evaluate(
“() => document.querySelector(‘.slide-verify-block’).toDataURL(‘image/png’)”)
print(“2”)
# with open(‘slide_bg_img.png’, ‘wb’) as f:
# f.write(base64.b64decode(str(slide_bg_img).split(‘,’)[-1], altchars=None, validate=False))
# with open(‘slide_block_img.png’, ‘wb’) as f:
# f.write(base64.b64decode(str(slide_block_img).split(‘,’)[-1], altchars=None, validate=False))
slide_bg_img = sip.base64_to_img(slide_bg_img)
slide_block_img = sip.cutting_transparent_block(sip.base64_to_img(slide_block_img), offset=65)
Loc = sip.identify_gap(slide_bg_img, slide_block_img)
print(“3-“,Loc)
if Loc[0] == 0:
self.page.screenshot(path=’debug/debug_error_loc_{}.png’.format(i), full_page=True)
print(“3-获取坐标有误,重新获取”)
# 等待元素加载并可见
self.page.locator(“.slide-verify-refresh-icon”).wait_for(state=”visible”)
# 点击刷新验证码
self.page.locator(“.slide-verify-refresh-icon”).click()
time.sleep(1)
else:
print(“3-获取成功”)
break