homeassistant获取电费余额2.0

10,485次阅读
28 条评论

共计 3758 个字符,预计需要花费 10 分钟才能阅读完成。

前言

之前用的大佬的 docker 也是模拟操作去获取余额元素然后生成 ha 的实体,获取电网时添加了滑动验证码,原作者不再继续维护,现有千石酱大佬制作的 docker,特此感谢千石酱分享,经过我做了延时的优化,目前已稳定运行 2 个月,此次部署还是以群晖为例,使用此教程前首先部署 nodered(百度一大堆,不再重复撰写),通过 nodered get 控制容器任务运行,抓取余额数值生成实体

docker 镜像

okatuloli-electricity-tr...ker(v0-0-1).syno.tar

https://www.alipan.com/s/vcEsWQuqE4e 提取码: y21t

安装部署

1. 导入镜像

1) 首先有一台可以运行 docker 的机器

2) 导入以上的 docker 镜像,群晖可通过 docker – 映像 – 新增 – 从文件添加

3) 导入成功后完成第一步

2. 部署 docker

1) 首先在 docker 文件夹创建一个映射文件夹,起名 electricity,electricity 文件夹内创建文件夹 debug,用于测试截图放入,把以下文件复制到文件夹内

Electricity-Tracker-master.zip https://www.alipan.com/s/CUeEvG5274e 提取码: mw88

2) 放入后,编辑 config.ini 文件,username/password 账号密码填写自己的,保存即可

3) 以群晖为例,导入的镜像双击进行部署

homeassistant 获取电费余额 2.0

存储空间映射本地文件夹,以下为例

homeassistant 获取电费余额 2.0

容器端口 5000,自己对应端口一个即可,默认 5000 也可以,不要跟群晖或其他服务冲突

4) 部署完毕后运行 docker

使用方法

1. 强制更新电费(get 请求):

http://IP: 端口 /getelectricity

2. 获取最新电费(post 请求):

http://IP: 端口 /electricity

nodered

homeassistant 获取电费余额 2.0

通过接口 2 获取到电费信息,自己送到 ha 也可以,这个不局限于 nodered,以上是 nodered 流程图很简单

json 自行替换局域网请求地址

nodered 流

[
{
"id": "38779186405936d7",
"type": "tab",
"label": "电费",
"disabled": false,
"info": "",
"env": []
},
{
"id": "38ef0eaf5cb549ca",
"type": "inject",
"z": "38779186405936d7",
"name": "获取金额传送 ha",
"props": [],
"repeat": "",
"crontab":"30 12 * * *",
"once": false,
"onceDelay": 0.1,
"topic":"",
"x": 330,
"y": 320,
"wires": [
[
"7d0f63506e84a788"
]
]
},
{
"id": "7d0f63506e84a788",
"type": "http request",
"z": "38779186405936d7",
"name": "",
"method":"GET",
"ret":"txt",
"paytoqs":"ignore",
"url":"http://10.0.0.101:5000/electricity",
"tls":"",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType":"",
"senderr": false,
"headers": [],
"x": 500,
"y": 320,
"wires": [
[
"ed8f9e6df1266058"
]
]
},
{
"id": "ed8f9e6df1266058",
"type": "json",
"z": "38779186405936d7",
"name": "",
"property":"payload",
"action":"",
"pretty": false,
"x": 690,
"y": 320,
"wires": [
[
"9ec9700618b91aef",
"96790ef81083e8e2"
]
]
},
{
"id": "9ec9700618b91aef",
"type": "debug",
"z": "38779186405936d7",
"name": "debug 1",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload.data.expense",
"targetType": "msg",
"statusVal": "",
"statusType":"auto",
"x": 920,
"y": 240,
"wires": []
},
{
"id": "96790ef81083e8e2",
"type": "ha-sensor",
"z": "38779186405936d7",
"name": "输出电费",
"entityConfig": "493ba168cb0b5e6f",
"version": 0,
"state": "payload.data.expense",
"stateType": "msg",
"attributes": [
{
"property": "consBal",
"value": "payload.data.expense",
"valueType": "msg"
}
],
"inputOverride": "allow",
"outputProperties": [],
"x": 920,
"y": 420,
"wires": [
[]
]
},
{
"id": "fb93ce1b71aab09d",
"type": "inject",
"z": "38779186405936d7",
"name": "强制更新电费",
"props": [],
"repeat": "",
"crontab":"00 12 * * *",
"once": false,
"onceDelay": 0.1,
"topic":"",
"x": 320,
"y": 180,
"wires": [
[
"6bbefa8981ab9026"
]
]
},
{
"id": "6bbefa8981ab9026",
"type": "http request",
"z": "38779186405936d7",
"name": "",
"method":"POST",
"ret":"txt",
"paytoqs":"ignore",
"url":"http://10.0.0.101:5000/getelectricity",
"tls":"",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType":"",
"senderr": false,
"headers": [],
"x": 500,
"y": 180,
"wires": [
[]
]
},
{
"id": "493ba168cb0b5e6f",
"type": "ha-entity-config",
"server": "4195dd0343dfc562",
"deviceConfig": "",
"name":" 电费 ",
"version":"6",
"entityType":"sensor",
"haConfig": [
{
"property": "name",
"value": ""
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_category",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": ""
},
{
"property": "state_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "4195dd0343dfc562",
"type": "server",
"name": "Home Assistant",
"version": 5,
"addon": false,
"rejectUnauthorizedCerts": true,
"ha_boolean": "y|yes|true|on|home|open",
"connectionDelay": true,
"cacheJson": true,
"heartbeat": false,
"heartbeatInterval": "30",
"areaSelector": "friendlyName",
"deviceSelector": "friendlyName",
"entitySelector": "friendlyName",
"statusSeparator": "at:",
"statusYear": "hidden",
"statusMonth": "short",
"statusDay": "numeric",
"statusHourCycle": "h23",
"statusTimeFormat": "h:m",
"enableGlobalContextStore": true
}
]

常见问题

待完善~

正文完
 7
zyx
版权声明:本站原创文章,由 zyx 于2024-03-01发表,共计3758字。
转载说明:所有文章未经授权禁止转载、摘编、复制或建立镜像
评论(28 条评论)
111 评论达人 LV.1
2024-03-05 10:09:38 回复

不知道为啥群晖DOCKER 镜像导入失败,从本地或者上传到DSM再导入都提示 无法执行此操作

 Windows  Chrome  日本东京都东京
    zyx 博主
    2024-03-05 15:01:15 回复

    @111 群晖版本多少 我7.1导出的

     Macintosh  Safari  中国山东省济南市电信
      111 评论达人 LV.1
      2024-03-05 15:03:21 回复

      @zyx 7.2.1

       Windows  Chrome  日本东京都东京
        zyx 博主
        2024-03-05 15:15:26 回复

        @111 那看来是docker版本的问题 7.2的docker和7.1不一致 直接用ssh拉一下 命令:docker pull okatuloli/electricity-tracker:v0.0.1

         Macintosh  Safari  中国香港阿里云
          111 评论达人 LV.1
          2024-03-05 19:47:49 回复

          @zyx 感谢,node流方便共享一个吗?

           iPhone  Safari  日本东京都东京
,,, 评论达人 LV.1
2024-03-15 12:32:48 回复

有详细教程吗?大佬!!

 Linux  MiuiBrowser  中国陕西省榆林市联通
    zyx 博主
    2024-03-15 13:07:53 回复

    @,,, 我感觉够详细了啊 部署卡在哪里了?

     Macintosh  Safari  中国山东省济南市电信
      ,,, 评论达人 LV.1
      2024-03-16 10:59:16 回复

      @zyx Docker部署完,使用方法网页咋打不开呢,咋样确认我已经部署好可用了。有视频教程么啊,大佬!!

       Linux  MiuiBrowser  中国陕西省榆林市电信
        zyx 博主
        2024-03-16 12:49:08 回复

        @,,, 需要先强制刷新电费 使用方法 1 需要get请求,方法2 post请求

         Macintosh  Safari  中国山东省济南市电信
          ,,, 评论达人 LV.1
          2024-03-16 15:07:23 回复

          @zyx Nodered流再分享一下,大佬。

           Linux  MiuiBrowser  中国陕西省榆林市电信
          zyx 博主
          2024-03-17 14:31:29 回复

          @,,, 已更新文章中

           Macintosh  Safari  中国山东省济南市电信
          ,,, 评论达人 LV.1
          2024-03-17 11:30:22 回复

          @zyx 失效了,老板

           Linux  MiuiBrowser  中国陕西省榆林市电信
评论达人 LV.1
2024-03-20 12:42:39 回复

强制更新电费(get 请求): 提示服务器无反应;
还有就是 HA中node没有生产实体是怎么回事啊

 Windows  Chrome  美国弗吉尼亚阿什本
    zyx 博主
    2024-03-20 13:03:40 回复

    @飞 1.get以后docker回去执行,看docker日志看一下有没有抓有输出日志
    2.node对接ha 先去百度一下怎么创建然后再传余额

     Macintosh  Safari  中国山东省济南市电信
会魔法的油条 评论达人 LV.1
2024-03-31 19:10:03 回复

docker的镜像没了呀,能再发下吗

 Windows  Chrome  日本
    zyx 博主
    2024-04-01 17:40:07 回复

    @会魔法的油条 这个教程现在已经不行了,官网的滑动验证码做修改了,现在验证界面过不了

     Macintosh  Safari  中国山东省济南市电信
会魔法的油条 评论达人 LV.1
2024-03-31 19:12:17 回复

哦,看错了,不好意思

 Windows  Chrome  日本
会魔法的油条 评论达人 LV.1
2024-03-31 23:33:08 回复

root@Docker:~# docker run -it –name=xxxxx -v /opt/docker/electricity-tracker/config.ini:/usr/scr/app/config.ini -v /opt/docker/electricity-tracker/electricity_scraper.py:/usr/scr/app/scraper/electricity_scraper.py -v /opt/docker/electricity-tracker/main.py:/usr/scr/app/main.py -v /opt/docker/electricity-tracker/debug/:/usr/scr/app/debug electricity-tracker /bin/bash
root@7f57f15b1844:/usr/src/app# ls
__pycache__ config debug.png main.py requirements.txt
app.py config.ini.example electricity.db notifier scraper
为啥映射config.ini文件还是没有呢,文件权限也给了,现在就报找不到配置文件的time参数,也起不来,大神有没有遇到过这种情况呢?

 Windows  Chrome  日本
会魔法的油条 评论达人 LV.1
2024-04-02 15:51:33 回复

测了下可以用,不过有时候会定位不到坐标位置,建议在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

 Windows  Chrome  亚太地区亚太地区
    zyx 博主
    2024-04-02 15:52:30 回复

    @会魔法的油条 :beer: 那挺好的,改天我也修改一下,感谢提供代码!

     Macintosh  Safari  中国香港阿里云
      会魔法的油条 评论达人 LV.1
      2024-04-02 18:55:02 回复

      @zyx 另外要把滑动距离+6,现在是打不到位置,差一点,距离公式没研究,就直接加了下

       Windows  Chrome  亚太地区亚太地区
        zyx 博主
        2024-04-02 20:28:38 回复

        @会魔法的油条 可以,稳定性怎么样现在

         Macintosh  Safari  中国山东省济南市电信
          会魔法的油条 评论达人 LV.1
          2024-04-02 20:56:53 回复

          @zyx 没法试太多次,不过成功概率还是蛮高的

           Android  SamsungBrowser  中国天津天津市联通
          zyx 博主
          2024-04-03 21:11:55 回复

          @会魔法的油条 可以 试过了成功率还可以

           Macintosh  Safari  中国山东省济南市电信
          会魔法的油条 评论达人 LV.1
          2024-04-08 15:25:44 回复

          @zyx :cool: :lol:

           Windows  Chrome  亚太地区亚太地区
socekin 评论达人 LV.1
2024-04-14 15:43:32 回复

查询到的金额是当月的费用吗?为啥接口返回的金额,与国网账户下面的不一致

 Macintosh  Chrome  中国上海上海市电信
    zyx 博主
    2024-04-16 13:53:04 回复

    @socekin 是不是没有拿到数据,检查一下docker日志

     Macintosh  Safari  中国山东省济南市电信
      socekin 评论达人 LV.1
      2024-04-18 21:12:06 回复

      @zyx * Debug mode: off
      * Serving Flask app ‘app’

      访问http://IP:端口/electricity,日志里只有两条数据

       Macintosh  Chrome  中国上海上海市电信