diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 45ba7d7..17d9fe5 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -1,13 +1,15 @@
name: Docker Image CI
on:
- push:
- paths:
- - 'scripts/**'
- - 'Dockerfile-for-github-action'
- - 'requirements.txt'
- - 'example.env'
- - '.github/workflows/docker-image.yml'
+ release:
+ types: [published, unpublished, created, edited, released, deleted]
+ paths:
+ - 'scripts/**'
+ - 'Dockerfile-for-github-action'
+ - 'requirements.txt'
+ - 'example.env'
+ - '.github/workflows/docker-image.yml'
+
jobs:
@@ -16,29 +18,30 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- - name: Log into docker hub registry
- run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
-
- - name: Build and push Docker image
- run: |
- PLATFORMS=linux/arm64,linux/amd64
- DOCKER_IMAGE=arcw/sgcc_electricity
- docker buildx build --platform $PLATFORMS -t $DOCKER_IMAGE:latest -t $DOCKER_IMAGE:1.4.1 --file Dockerfile-for-github-action --push .
-
- # - name: pull Docker image
- # run: |
- # # PLATFORMS=linux/arm64,linux/amd64
- # docker pull --platform $PLATFORMS mongo:4.4.18
- # docker tag mongo:4.4.18 registry.cn-hangzhou.aliyuncs.com/arcw/mongo:4.4.18
-
- - name: Log into Aliyun hub registry and push Docker image
- run: |
- echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin registry.cn-hangzhou.aliyuncs.com
- PLATFORMS=linux/arm64,linux/amd64
- DOCKER_IMAGE=registry.cn-hangzhou.aliyuncs.com/arcw/sgcc_electricity
- docker buildx build --platform $PLATFORMS -t $DOCKER_IMAGE:latest -t $DOCKER_IMAGE:1.4.1 --file Dockerfile-for-github-action --push .
\ No newline at end of file
+ -name: Check out from Git
+ -uses: actions/checkout@v1
+ -name: Check if Git tag exists
+ run: echo "::set-env name=HEAD_TAG::$(git tag --points-at HEAD)"
+
+ - uses: actions/checkout@v3
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Log into docker hub registry
+ if: env.HEAD_TAG != ''
+ run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
+
+ - name: Build and push Docker image
+ if: env.HEAD_TAG != ''
+ run: |
+ PLATFORMS=linux/arm64,linux/amd64
+ DOCKER_IMAGE=arcw/sgcc_electricity
+ docker buildx build --build-arg VERSION=${{ steps.get_version.outputs.VERSION }} --platform $PLATFORMS -t $DOCKER_IMAGE:latest -t $DOCKER_IMAGE:${{ steps.get_version.outputs.VERSION }} --file Dockerfile-for-github-action --push .
+
+ - name: Log into Aliyun hub registry and push Docker image
+ if: env.HEAD_TAG != ''
+ run: |
+ echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin registry.cn-hangzhou.aliyuncs.com
+ PLATFORMS=linux/arm64,linux/amd64
+ DOCKER_IMAGE=registry.cn-hangzhou.aliyuncs.com/arcw/sgcc_electricity
+ docker buildx build --build-arg VERSION=${{ steps.get_version.outputs.VERSION }} --platform $PLATFORMS -t $DOCKER_IMAGE:latest -t $DOCKER_IMAGE:${{ steps.get_version.outputs.VERSION }} --file Dockerfile-for-github-action --push .
\ No newline at end of file
diff --git a/README.md b/README.md
index e5b1a9d..8bbd795 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,10 @@
**重要说明:**原作者@renhai-lab 已于2023年10将项目归档,原仓库不再更新。这个版本是在原仓库基础上更新的。在此向原作者表达谢意和致敬。验证码识别已经从最开始的在线商业API替换成离线神经网络检测版本,请使用本仓库的同学点个小星星,或者打赏鼓励。
+### 支付宝&微信 打赏码
+
+
+
+
+
# ⚡️国家电网电力获取
@@ -360,23 +366,17 @@ sensor:
- 增加近30天每日电量写入数据库(默认mongodb),其他数据库请自行配置。
- 添加配置默认增加近 7 天每日电量写入数据, 可修改为 30 天, 因为国网目前[「要签约智能交费才能看到30天的数据,不然就只能看到7天的」](https://github.com/ARC-MX/sgcc_electricity_new/issues/11#issuecomment-2158973048)
-- 将间歇执行设置为定时执行: JOB_START_TIME,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次。
+- 将间歇执行设置为定时执行: JOB_START_TIME,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序立即执行一次, 每12小时执行一次
- 给last_daily_usage增加present_date,用来确定更新的是哪一天的电量。一般查询的日期会晚一到两天。
- 对configuration.yaml中自定义实体部分修改。
-# 支付宝&微信 打赏码
-
-
-
-
-
# 重要修改通知
-2024-06-13:SQLite替换MongoDB,原因是python自带SQLite3,不需要额外安装,也不再需要MongoDB镜像
-
+2024-06-13:SQLite替换MongoDB,原因是python自带SQLite3,不需要额外安装,也不再需要MongoDB镜像。
+2024-07-03:新增每天定时执行两次,添加配置默认增加近 7 天每日电量写入数据, 可修改为 30 天。
TO-DO
- [X] 增加离线滑动验证码识别方案
-- [ ] 添加默认推送服务
+- [ ] 添加默认推送服务,电费余额不足提醒
- [ ] 。。。
diff --git a/example.env b/example.env
index 87151c2..72b0036 100644
--- a/example.env
+++ b/example.env
@@ -19,7 +19,7 @@ HASS_URL="http://localhost:8123/"
HASS_TOKEN="eyxxxxx"
## selenium运行参数
-# 任务开始时间,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次。
+# 任务开始时间,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次,每隔12小时执行一次。
JOB_START_TIME="07:00"
## 其他默认参数
@@ -30,8 +30,7 @@ RETRY_TIMES_LIMIT=5
# 登录超时时间,秒
LOGIN_EXPECTED_TIME=60
RETRY_WAIT_TIME_OFFSET_UNIT=10
- # 第一次运行等待时间,秒
-FIRST_SLEEP_TIME=10
+
## 日志级别
# 例如“DUBUG”可以查看出错情况
diff --git a/scripts/data_fetcher.py b/scripts/data_fetcher.py
index 36ebe9b..29aff0d 100644
--- a/scripts/data_fetcher.py
+++ b/scripts/data_fetcher.py
@@ -29,7 +29,7 @@
from onnx import ONNX
import platform
-DEBUG = False
+DEBUG = True
def __ease_out_expo(sep):
if sep == 1:
@@ -186,11 +186,11 @@ def __init__(self, username: str, password: str):
if enable_database_storage:
# 将数据存储到数据库
- logging.debug("enable_database_storage为true,将会储存到数据库")
+ logging.debug("enable_database_storage is true, we will store the data to the database.")
self.client = sqlite3.connect(os.getenv("DB_NAME"))
else:
self.client = None
- logging.info("enable_database_storage为false,不会储存到数据库")
+ logging.info("enable_database_storage is false, we will not store the data to the database.")
self.DRIVER_IMPLICITY_WAIT_TIME = int(os.getenv("DRIVER_IMPLICITY_WAIT_TIME"))
self.RETRY_TIMES_LIMIT = int(os.getenv("RETRY_TIMES_LIMIT"))
@@ -214,18 +214,18 @@ def connect_user_db(self, user_id):
# 创建数据库
self.connect = self.client
self.connect.cursor()
- logging.info(f"数据库: {os.getenv('DB_NAME')} 创建成功")
+ logging.info(f"Database of {os.getenv('DB_NAME')} created successfully.")
try:
# 创建表名
self.db_name = f"daily{user_id}"
sql = f"CREATE TABLE {self.db_name} (date DATE PRIMARY KEY NOT NULL, usage REAL NOT NULL);"
self.connect.execute(sql)
- logging.info(f"创建{self.db_name}成功")
+ logging.info(f"Table {self.db_name} created successfully")
except BaseException as e:
- logging.debug(f"表{self.db_name}已存在:{e}")
+ logging.debug(f"Table {self.db_name} already exists: {e}")
# 如果表已存在,则不会创建
except BaseException as e:
- logging.debug(f"表: {self.db_name} 表已存在:{e}")
+ logging.debug(f"Table: {self.db_name} already exists:{e}")
finally:
return self.connect
@@ -236,7 +236,7 @@ def insert_data(self, data:dict):
self.connect.execute(sql)
self.connect.commit()
except BaseException as e:
- logging.debug(f"数据更新失败:{e}")
+ logging.debug(f"Data update failed: {e}")
def fetch(self):
"""the entry, only retry logic here """
@@ -269,7 +269,7 @@ def _fetch(self):
logging.info(f"Login successfully on {LOGIN_URL}")
time.sleep(self.RETRY_WAIT_TIME_OFFSET_UNIT)
user_id_list = self._get_user_ids(driver)
- logging.info(f"将获取{len(user_id_list)}户数据,user_id: {user_id_list}")
+ logging.info(f"There are {len(user_id_list)} users in total, there user_id is: {user_id_list}")
time.sleep(self.RETRY_WAIT_TIME_OFFSET_UNIT)
balance_list = self._get_electric_balances(driver, user_id_list) #
time.sleep(self.RETRY_WAIT_TIME_OFFSET_UNIT)
@@ -279,7 +279,6 @@ def _fetch(self):
driver.quit()
logging.info("Webdriver quit after fetching data successfully.")
- logging.info("浏览器已退出")
return user_id_list, balance_list, last_daily_date_list, last_daily_usage_list, yearly_charge_list, yearly_usage_list, month_list, month_usage_list, month_charge_list
finally:
@@ -578,9 +577,9 @@ def save_usage_data(self, driver, user_id):
# 插入到数据库
try:
self.insert_data(dic)
- logging.info(f"{day}的用电量{usage}KWh已经成功存入数据库")
+ logging.info(f"The electricity consumption of {usage}KWh on {day} has been successfully deposited into the database")
except Exception as e:
- logging.debug(f"{day}的用电量存入数据库失败,可能已经存在: {str(e)}")
+ logging.debug(f"The electricity consumption of {day} failed to save to the database, which may already exist: {str(e)}")
self.connect.close()
diff --git a/scripts/main.py b/scripts/main.py
index ecd8679..398e08e 100644
--- a/scripts/main.py
+++ b/scripts/main.py
@@ -4,7 +4,7 @@
import sys
import time
import traceback
-from datetime import datetime
+from datetime import datetime,timedelta
import dotenv
import schedule
@@ -16,7 +16,7 @@
def main():
# 读取 .env 文件
- dotenv.load_dotenv()
+ dotenv.load_dotenv(verbose=True)
try:
PHONE_NUMBER = os.getenv("PHONE_NUMBER")
@@ -24,28 +24,25 @@ def main():
HASS_URL = os.getenv("HASS_URL")
HASS_TOKEN = os.getenv("HASS_TOKEN")
JOB_START_TIME = os.getenv("JOB_START_TIME")
- FIRST_SLEEP_TIME = int(os.getenv("FIRST_SLEEP_TIME"))
LOG_LEVEL = os.getenv("LOG_LEVEL")
+ VERSION = os.getenv("VERSION")
except Exception as e:
- logging.error(f"读取.env文件失败,程序将退出,错误信息为{e}")
+ logging.error(f"Failing to read the .env file, the program will exit with an error message: {e}.")
sys.exit()
logger_init(LOG_LEVEL)
- logging.info("程序开始,当前仓库版本为1.4.1,仓库地址为https://github.com/ARC-MX/sgcc_electricity_new.git")
+ logging.info(f"The current repository version is {VERSION}, and the repository address is https://github.com/ARC-MX/sgcc_electricity_new.git")
fetcher = DataFetcher(PHONE_NUMBER, PASSWORD)
updator = SensorUpdator(HASS_URL, HASS_TOKEN)
- logging.info(f"当前登录的用户名为: {PHONE_NUMBER},homeassistant地址为{HASS_URL},程序将在每天{JOB_START_TIME}执行")
- schedule.every().day.at(JOB_START_TIME).do(run_task, fetcher, updator)
+ logging.info(f"The current logged-in user name is {PHONE_NUMBER}, the homeassistant address is {HASS_URL}, and the program will be executed every day at {JOB_START_TIME}.")
- if datetime.now().time() < datetime.strptime(JOB_START_TIME, "%H:%M").time():
- logging.info(f"此次为首次运行,当前时间早于 JOB_START_TIME: {JOB_START_TIME},{JOB_START_TIME}再执行!")
- schedule.every().day.at(JOB_START_TIME).do(run_task, fetcher, updator)
- else:
- logging.info(f"此次为首次运行,等待时间(FIRST_SLEEP_TIME)为{FIRST_SLEEP_TIME}秒,可在.env中设置")
- time.sleep(FIRST_SLEEP_TIME)
- run_task(fetcher, updator)
+ next_run_time = datetime.strptime(JOB_START_TIME, "%H:%M") + timedelta(hours=12)
+ logging.info(f'Run job now! The next run will be at {JOB_START_TIME} and {next_run_time.strftime("%H:%M")} every day')
+ schedule.every().day.at(JOB_START_TIME).do(run_task, fetcher, updator)
+ schedule.every().day.at(next_run_time.strftime("%H:%M")).do(run_task, fetcher, updator)
+ run_task(fetcher, updator)
while True:
schedule.run_pending()
diff --git a/scripts/onnx.py b/scripts/onnx.py
index 6b8a778..6097781 100644
--- a/scripts/onnx.py
+++ b/scripts/onnx.py
@@ -220,7 +220,7 @@ def get_distance(self,image,draw=False):
prediction, org_img = self._inference(image)
boxes = self.get_boxes(prediction=prediction)
if len(boxes) == 0:
- print('没有发现物体')
+ print('No gaps were detected.')
return 0
else:
if draw: