From 2ae206122308be9968d11fbaf7caebf4ed63ec1e Mon Sep 17 00:00:00 2001 From: ARC-MX Date: Sun, 29 Dec 2024 17:25:22 +0800 Subject: [PATCH] update image OS --- .github/workflows/docker-image.yml | 2 +- Dockerfile | 35 ------------- Dockerfile-for-github-action | 22 +------- docker-compose.yml | 2 +- requirements.txt | 12 ++--- scripts/data_fetcher.py | 65 ++++++++++++----------- test.yaml | 84 ------------------------------ 7 files changed, 46 insertions(+), 176 deletions(-) delete mode 100644 Dockerfile delete mode 100644 test.yaml diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 960f9ff..a2d0ecc 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -5,7 +5,7 @@ on: inputs: username: description: 'version of this branch' - default: 'v1.6.0' + default: 'v1.6.1' required: true type: string paths: diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 72d8c15..0000000 --- a/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM python:3.9-bullseye as build - -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 - -WORKDIR /app - -COPY scripts/* /app/ -COPY ./requirements.txt /tmp/requirements.txt - -RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list \ - && apt-get --allow-releaseinfo-change update \ - && apt-get install -y --no-install-recommends jq chromium chromium-driver tzdata\ - && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ - && dpkg-reconfigure --frontend noninteractive tzdata \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get clean - -RUN cd /tmp \ - && pip config --global set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \ - && pip config --global set install.trusted-host pypi.tuna.tsinghua.edu.cn \ - && python3 -m pip install --upgrade pip \ - && PIP_ROOT_USER_ACTION=ignore pip install onnxruntime==1.17.3 \ - && PIP_ROOT_USER_ACTION=ignore pip install \ - --disable-pip-version-check \ - --no-cache-dir \ - -r requirements.txt \ - && rm -rf /tmp/* \ - && pip cache purge \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /var/log/* - -ENV LANG C.UTF-8 - -CMD ["python"] \ No newline at end of file diff --git a/Dockerfile-for-github-action b/Dockerfile-for-github-action index e5527d5..b46a05a 100644 --- a/Dockerfile-for-github-action +++ b/Dockerfile-for-github-action @@ -1,4 +1,4 @@ -FROM python:3.9.19-slim-bullseye as build +FROM python:3.11.11-slim-bookworm as build ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 @@ -6,6 +6,7 @@ ENV PYTHONUNBUFFERED=1 ARG TARGETARCH ARG VERSION ENV VERSION=${VERSION} +ENV PYTHON_IN_DOCKER='PYTHON_IN_DOCKER' COPY scripts/* /app/ WORKDIR /app @@ -17,25 +18,6 @@ RUN apt-get --allow-releaseinfo-change update \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean -# RUN cd /tmp \ -# && python3 -m pip install --upgrade pip \ - # && echo '#!/bin/bash\n \ - # if [ "$TARGETARCH" = "arm" ]; then\n \ - # cd /tmp\n \ - # curl -O -L https://github.com/maxisoft/pytorch-arm/releases/download/v1.0.0/numpy-1.23.5-cp39-cp39-linux_armv7l.whl\n \ - # curl -v -o onnxruntime-1.16.0-cp39-cp39-linux_armv7l.whl https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux/blob/master/wheels/bullseye/onnxruntime-1.16.0-cp39-cp39-linux_armv7l.whl\n \ - # PIP_ROOT_USER_ACTION=ignore pip3 install numpy-1.23.5-cp39-cp39-linux_armv7l.whl\n \ - # PIP_ROOT_USER_ACTION=ignore pip3 install onnxruntime-1.16.0-cp39-cp39-linux_armv7l.whl\n \ - # else\n \ - # cd /tmp\n \ - # PIP_ROOT_USER_ACTION=ignore pip3 install numpy==1.23.5 onnxruntime==1.17.3 \n \ - # fi \n' > ./targetArch.sh \ - # && bash ./targetArch.sh \ - # && rm -rf /tmp/* \ - # && pip cache purge \ - # && rm -rf /var/lib/apt/lists/* \ - # && rm -rf /var/log/* - COPY ./requirements.txt /tmp/requirements.txt RUN cd /tmp \ diff --git a/docker-compose.yml b/docker-compose.yml index b4a2093..6bf84d1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: - CONTAINER_TIMEZONE=Asia/Shanghai restart: unless-stopped # volumes: - # - ./:/app/homeassistant.db # if you want to read homeassistant.db + # - ./:/data # if you want to read homeassistant.db, homeassistant.db is in the container at /data/ command: python3 main.py networks: diff --git a/requirements.txt b/requirements.txt index 05b4ae5..b7eb999 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ requests==2.31.0 -selenium==4.5.0 -schedule==1.1.0 -Pillow==9.2.0 -undetected_chromedriver==3.4.7 -onnxruntime==1.17.3 -numpy==1.24.3 +selenium==4.19.0 +schedule==1.2.1 +Pillow==10.1.0 +undetected_chromedriver==3.5.4 +onnxruntime==1.18.1 +numpy==1.26.2 python-dotenv python-dateutil \ No newline at end of file diff --git a/scripts/data_fetcher.py b/scripts/data_fetcher.py index 3fdc774..deb5717 100644 --- a/scripts/data_fetcher.py +++ b/scripts/data_fetcher.py @@ -161,6 +161,8 @@ def connect_user_db(self, user_id): try: # 创建数据库 DB_NAME = os.getenv("DB_NAME", "homeassistant.db") + if 'PYTHON_IN_DOCKER' in os.environ: + DB_NAME = "/data/" + DB_NAME self.connect = sqlite3.connect(DB_NAME) self.connect.cursor() logging.info(f"Database of {DB_NAME} created successfully.") @@ -174,17 +176,20 @@ def connect_user_db(self, user_id): # 如果表已存在,则不会创建 except sqlite3.Error as e: logging.debug(f"Create db or Table error:{e}") - finally: - return self.connect + return False + return True def insert_data(self, data:dict): - # 创建索引 - try: - sql = f"INSERT OR REPLACE INTO {self.table_name} VALUES(strftime('%Y-%m-%d','{data['date']}'),{data['usage']});" - self.connect.execute(sql) - self.connect.commit() - except BaseException as e: - logging.debug(f"Data update failed: {e}") + if self.connect is None: + logging.error("Database connection is not established.") + return + # 创建索引 + try: + sql = f"INSERT OR REPLACE INTO {self.table_name} VALUES(strftime('%Y-%m-%d','{data['date']}'),{data['usage']});" + self.connect.execute(sql) + self.connect.commit() + except BaseException as e: + logging.debug(f"Data update failed: {e}") def _get_webdriver(self): chrome_options = Options() @@ -216,7 +221,7 @@ def _login(self, driver, phone_code = False): self._click_button(driver, By.XPATH, '//*[@id="login_box"]/div[1]/div[1]/div[3]/span') input_elements = driver.find_elements(By.CLASS_NAME, "el-input__inner") input_elements[2].send_keys(self._username) - logging.info(f"input_elements username : {self._username}.\r") + logging.info(f"input_elements username : {self._username}\r") self._click_button(driver, By.XPATH, '//*[@id="login_box"]/div[2]/div[2]/form/div[1]/div[2]/div[2]/div/a') code = input("Input your phone verification code: ") input_elements[3].send_keys(code) @@ -231,9 +236,9 @@ def _login(self, driver, phone_code = False): # input username and password input_elements = driver.find_elements(By.CLASS_NAME, "el-input__inner") input_elements[0].send_keys(self._username) - logging.info(f"input_elements username : {self._username}.\r") + logging.info(f"input_elements username : {self._username}\r") input_elements[1].send_keys(self._password) - logging.info(f"input_elements password : {self._password}.\r") + logging.info(f"input_elements password : {self._password}\r") # click login button self._click_button(driver, By.CLASS_NAME, "el-button.el-button--primary") @@ -540,23 +545,25 @@ def save_daily_usage_data(self, driver, user_id): "//*[@id='pane-second']/div[2]/div[2]/div[1]/div[3]/table/tbody/tr") # 用电量值列表 # 连接数据库集合 - self.connect_user_db(user_id) - - # 将用电量保存为字典 - for i in days_element: - day = i.find_element(By.XPATH, "td[1]/div").text - usage = i.find_element(By.XPATH, "td[2]/div").text - if usage != "": - dic = {'date': day, 'usage': float(usage)} - # 插入到数据库 - try: - self.insert_data(dic) - 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"The electricity consumption of {day} failed to save to the database, which may already exist: {str(e)}") - else: - logging.info(f"The electricity consumption of {usage} get nothing") - self.connect.close() + if self.connect_user_db(user_id): + # 将用电量保存为字典 + for i in days_element: + day = i.find_element(By.XPATH, "td[1]/div").text + usage = i.find_element(By.XPATH, "td[2]/div").text + if usage != "": + dic = {'date': day, 'usage': float(usage)} + # 插入到数据库 + try: + self.insert_data(dic) + 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"The electricity consumption of {day} failed to save to the database, which may already exist: {str(e)}") + else: + logging.info(f"The electricity consumption of {usage} get nothing") + self.connect.close() + else: + logging.info("The database creation failed and the data was not written correctly.") + return if __name__ == "__main__": with open("bg.jpg", "rb") as f: diff --git a/test.yaml b/test.yaml deleted file mode 100644 index 661fd1f..0000000 --- a/test.yaml +++ /dev/null @@ -1,84 +0,0 @@ -template: - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.electricity_charge_balance_9954 - sensor: - - name: electricity_charge_balance_entity_9954 - unique_id: electricity_charge_balance_entity_9954 - state: "{{ states('sensor.electricity_charge_balance_9954') }}" - state_class: total - unit_of_measurement: "CNY" - device_class: monetary - restore_state: true - - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.last_electricity_usage_9954 - sensor: - - name: last_electricity_usage_entity_9954 - unique_id: last_electricity_usage_entity_9954 - state: "{{ states('sensor.last_electricity_usage_9954') }}" - state_class: measurement - unit_of_measurement: "kWh" - device_class: energy - restore_state: true - - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.month_electricity_usage_9954 - sensor: - - name: month_electricity_usage_entity_9954 - unique_id: month_electricity_usage_entity_9954 - state: "{{ states('sensor.month_electricity_usage_9954') }}" - state_class: measurement - unit_of_measurement: "kWh" - device_class: energy - restore_state: true - - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.month_electricity_charge_9954 - sensor: - - name: month_electricity_charge_entity_9954 - unique_id: month_electricity_charge_entity_9954 - state: "{{ states('sensor.month_electricity_charge_9954') }}" - state_class: measurement - unit_of_measurement: "CNY" - device_class: monetary - restore_state: true - - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.yearly_electricity_usage_9954 - sensor: - - name: yearly_electricity_usage_entity_9954 - unique_id: yearly_electricity_usage_entity_9954 - state: "{{ states('sensor.yearly_electricity_usage_9954') }}" - state_class: total_increasing - unit_of_measurement: "kWh" - device_class: energy - restore_state: true - - - trigger: - - platform: event - event_type: state_changed - event_data: - entity_id: sensor.yearly_electricity_charge_9954 - sensor: - - name: yearly_electricity_charge_entity_9954 - unique_id: yearly_electricity_charge_entity_9954 - state: "{{ states('sensor.yearly_electricity_charge_9954') }}" - state_class: total_increasing - unit_of_measurement: "CNY" - device_class: monetary - restore_state: true \ No newline at end of file