34 Commits

Author SHA1 Message Date
Sebastian Muszynski
a6d882de4a Fix ble_client build issue (#70)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-07-21 18:33:07 +02:00
Sebastian Muszynski
8cb0f29c7d Drop Python 3.10 support (#69) 2025-07-21 15:20:25 +02:00
Sebastian Muszynski
79c0236050 Complete dump config (#68)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-07-09 09:56:33 +02:00
Sebastian Muszynski
f10cae1824 Centralize component schema declarations (#67)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-07-08 07:19:34 +02:00
Sebastian Muszynski
5b72c21170 Use main per default
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-07-07 13:49:00 +02:00
Sebastian Muszynski
f9d8ff54c0 Bump component version
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-07-05 21:05:40 +02:00
Sebastian Muszynski
57d74094eb Make entity names unique (#65)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-06-25 23:35:54 +02:00
Sebastian Muszynski
db22f3a54a Make CI build verbose (#66) 2025-06-25 17:29:50 +02:00
Sebastian Muszynski
c6c75a19d0 Use defaults (#64)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-06-21 22:08:19 +02:00
Sebastian Muszynski
c76f01eb1f Fix *.*_SCHEMA deprecations (#63)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-05-25 18:38:56 +02:00
Sebastian Muszynski
aad083cd39 Improve triple charger controller support (#59) 2025-05-25 18:24:49 +02:00
Sebastian Muszynski
8bf35a2f6f Update minimum python version to 3.10 (#62)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-05-22 09:28:56 +02:00
Sebastian Muszynski
5dc30e99fe Adopt structure of the ESPHome CI (#61)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / Bundle external component and ESPHome (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check ruff (push) Has been cancelled
CI / Check flake8 (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Check pyupgrade (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check clang-format (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Validate example configurations (push) Has been cancelled
CI / Build example configurations (push) Has been cancelled
2025-05-03 15:57:05 +02:00
Sebastian Muszynski
eeede3e32e Migrate to actions/cache@v4 (#60)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2025-03-03 11:00:53 +01:00
Sebastian Muszynski
1fbbb5a9da Fix controller temperature (#58)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
See #43
2025-02-21 21:17:27 +01:00
Sebastian Muszynski
1d705f4271 Use ruff format at the CI (#57) 2025-02-21 14:22:47 +01:00
Sebastian Muszynski
8e3c94a72a Add platform binary_sensor to the auto loader
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2025-01-19 21:03:03 +01:00
Sebastian Muszynski
9aa26b3c9d Unregister BLE notifications on disconnect (#56)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2025-01-18 09:42:11 +01:00
Sebastian Muszynski
91a7913e8b Disable active BLE scans to save some power and RF pollution (#54)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2024-10-21 13:57:14 +02:00
Sebastian Muszynski
67d70a72ea Use binary sensor schema (#53) 2024-10-21 13:28:00 +02:00
Sebastian Muszynski
98d0326f68 Improve pre-commit hooks (#50) 2024-10-21 13:21:54 +02:00
Sebastian Muszynski
75f0a1da4b Validate all YAML configurations (#49)
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2024-08-01 11:24:35 +02:00
Sebastian Muszynski
788a5855d5 Update pre-commit hooks
Some checks failed
CI / yamllint (push) Has been cancelled
CI / lint-clang-format (push) Has been cancelled
CI / lint-clang-tidy (push) Has been cancelled
CI / lint-python (push) Has been cancelled
CI / esphome-config (push) Has been cancelled
CI / esphome-compile (push) Has been cancelled
2024-07-28 21:51:57 +02:00
Sebastian Muszynski
ac7516f143 Simplify yamllint configuration 2024-07-28 21:47:13 +02:00
Sebastian Muszynski
036ce247e3 Add FUNDING.yml 2024-07-16 10:38:01 +02:00
Sebastian Muszynski
9db23fcf4c Bump python version to 3.12 2024-06-21 08:09:06 +02:00
Sebastian Muszynski
98a0f0bf1e Add minimum required ESPHome version 2024-06-21 06:50:33 +02:00
Sebastian Muszynski
d1a917a1c7 Specify OTA platform 2024-06-20 21:41:59 +02:00
Sebastian Muszynski
0e50d94972 Fix minimum required ESPHome version 2024-05-10 09:49:14 +02:00
Sebastian Muszynski
44f7d5794f Fix lint-clang-format job (#47) 2024-03-06 18:01:33 +01:00
Sebastian Muszynski
8540227e75 Fix lint-clang-tidy job 2024-01-14 08:55:44 +01:00
Sebastian Muszynski
6b6fc54783 Drop pexpect install 2023-11-20 16:56:10 +01:00
Sebastian Muszynski
0d0def1a81 Fix pio init 2023-08-26 14:50:47 +02:00
Sebastian Muszynski
961fcd0bdd Increase rx_timeout 2023-06-25 16:03:29 +02:00
36 changed files with 1911 additions and 586 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
buy_me_a_coffee: syssi

View File

@@ -0,0 +1,38 @@
name: Restore Python
inputs:
python-version:
description: Python version to restore
required: true
type: string
cache-key:
description: Cache key to use
required: true
type: string
outputs:
python-version:
description: Python version restored
value: ${{ steps.python.outputs.python-version }}
runs:
using: "composite"
steps:
- name: Set up Python ${{ inputs.python-version }}
id: python
uses: actions/setup-python@v5.6.0
with:
python-version: ${{ inputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
with:
path: venv
# yamllint disable-line rule:line-length
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{ inputs.cache-key }}
- name: Create Python virtual environment
shell: bash
run: |
python -m venv venv
source venv/bin/activate
python --version
cd esphome
pip install -r requirements.txt -r requirements_test.txt
pip install -e .

View File

@@ -4,220 +4,465 @@ on: # yamllint disable-line rule:truthy
push:
branches:
- main
pull_request:
schedule:
- cron: 0 12 * * *
permissions:
contents: read
env:
FORCE_COLOR: 1
DEFAULT_PYTHON: "3.11"
PYUPGRADE_TARGET: "--py311-plus"
concurrency:
# yamllint disable-line rule:line-length
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
yamllint:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v1
- name: yaml-lint
uses: ibiqlik/action-yamllint@v3
- uses: actions/checkout@v4
- name: Run yamllint
uses: frenck/action-yamllint@v1
with:
config_file: .yamllint
config: .yamllint
lint-clang-format:
env:
esphome_directory: esphome
runs-on: ubuntu-latest
# cpp lint job runs with esphome-lint docker image so that clang-format-*
# doesn't have to be installed
container: esphome/esphome-lint:latest
bundle:
name: Bundle external component and ESPHome
runs-on: ubuntu-24.04
outputs:
repo-hash: ${{ github.sha }}
steps:
- uses: actions/checkout@v2
# Set up the pio project so that the cpp checks know how files are compiled
# (build flags, libraries etc)
- name: Check out this project
uses: actions/checkout@v4.1.7
- name: 💣 Clone esphome project
run: git clone https://github.com/esphome/esphome.git
- name: 💣 Copy component into the esphome project
- name: Check out code from ESPHome project
uses: actions/checkout@v4.1.7
with:
repository: esphome/esphome
ref: dev
path: esphome
- name: Copy external component into the esphome project
run: |
cd esphome
cp -r ../components/* esphome/components/
git config user.name "ci"
git config user.email "ci@github.com"
git add .
git commit -a -m "Add external component"
working-directory: ${{ env.esphome_directory }}
ln -sf ../venv venv
- name: Set up platformio environment
run: pio init --ide atom
working-directory: ${{ env.esphome_directory }}
- name: Archive prepared repository
uses: pyTooling/upload-artifact@v4
with:
name: bundle
path: .
include-hidden-files: true
retention-days: 1
common:
name: Create common environment
runs-on: ubuntu-24.04
needs: bundle
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Generate cache-key
id: cache-key
run: echo key="${{ hashFiles('esphome/requirements.txt', 'esphome/requirements_test.txt') }}" >> $GITHUB_OUTPUT
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@v4.2.3
with:
path: venv
# yamllint disable-line rule:line-length
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{ steps.cache-key.outputs.key }}
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
python -m venv venv
. venv/bin/activate
python --version
cd esphome
pip install -r requirements.txt -r requirements_test.txt
pip install -e .
ruff:
name: Check ruff
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Run Ruff
run: |
. venv/bin/activate
ruff format esphome tests
- name: Suggested changes
run: script/ci-suggest-changes
if: always()
flake8:
name: Check flake8
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Run flake8
run: |
. venv/bin/activate
flake8 esphome
- name: Suggested changes
run: script/ci-suggest-changes
if: always()
pylint:
name: Check pylint
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Run pylint
run: |
. venv/bin/activate
pylint -f parseable --persistent=n esphome
- name: Suggested changes
run: script/ci-suggest-changes
if: always()
pyupgrade:
name: Check pyupgrade
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Run pyupgrade
run: |
. venv/bin/activate
pyupgrade ${{ env.PYUPGRADE_TARGET }} `find esphome -name "*.py" -type f`
- name: Suggested changes
run: script/ci-suggest-changes
if: always()
ci-custom:
name: Run script/ci-custom
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Register matcher
run: echo "::add-matcher::.github/workflows/matchers/ci-custom.json"
- name: Do not suggest to move consts
run: |
sed -i 's#if len(uses) < 3:#if len(uses) < 8:#' script/ci-custom.py
git update-index --assume-unchanged script/ci-custom.py
- name: Run script/ci-custom
run: |
. ../venv/bin/activate
script/ci-custom.py
clang-format:
name: Check clang-format
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Install clang-format
run: |
. venv/bin/activate
pip install clang-format -c requirements_dev.txt
- name: Run clang-format
run: script/clang-format -i
working-directory: ${{ env.esphome_directory }}
- name: Suggest changes
run: script/ci-suggest-changes
working-directory: ${{ env.esphome_directory }}
lint-clang-tidy:
env:
esphome_directory: esphome
runs-on: ubuntu-latest
# cpp lint job runs with esphome-lint docker image so that clang-format-*
# doesn't have to be installed
container: esphome/esphome-lint:latest
steps:
- uses: actions/checkout@v2
- name: 💣 Clone esphome project
run: git clone https://github.com/esphome/esphome.git
- name: 💣 Copy component into the esphome project
run: |
cp -r ../components/* esphome/components/
git config user.name "ci"
git config user.email "ci@github.com"
git add .
git commit -a -m "Add external component"
working-directory: ${{ env.esphome_directory }}
. venv/bin/activate
script/clang-format -i
- name: Suggested changes
run: script/ci-suggest-changes
if: always()
# Set up the pio project so that the cpp checks know how files are compiled
# (build flags, libraries etc)
- name: Set up platformio environment
run: pio init --ide atom
working-directory: ${{ env.esphome_directory }}
clang-tidy:
name: ${{ matrix.name }}
runs-on: ubuntu-24.04
needs:
- bundle
- common
defaults:
run:
working-directory: esphome
strategy:
fail-fast: false
max-parallel: 2
matrix:
include:
- id: clang-tidy
name: Run script/clang-tidy for ESP8266
options: --environment esp8266-arduino-tidy --grep USE_ESP8266
pio_cache_key: tidyesp8266
- id: clang-tidy
name: Run script/clang-tidy for ESP32 Arduino 1/4
options: --environment esp32-arduino-tidy --split-num 4 --split-at 1
pio_cache_key: tidyesp32
- id: clang-tidy
name: Run script/clang-tidy for ESP32 Arduino 2/4
options: --environment esp32-arduino-tidy --split-num 4 --split-at 2
pio_cache_key: tidyesp32
- id: clang-tidy
name: Run script/clang-tidy for ESP32 Arduino 3/4
options: --environment esp32-arduino-tidy --split-num 4 --split-at 3
pio_cache_key: tidyesp32
- id: clang-tidy
name: Run script/clang-tidy for ESP32 Arduino 4/4
options: --environment esp32-arduino-tidy --split-num 4 --split-at 4
pio_cache_key: tidyesp32
- id: clang-tidy
name: Run script/clang-tidy for ESP32 IDF
options: --environment esp32-idf-tidy --grep USE_ESP_IDF
pio_cache_key: tidyesp32-idf
steps:
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
name: bundle
path: .
- name: Update index to make "git diff-index" happy
run: git update-index -q --really-refresh
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Cache platformio
if: github.ref == 'refs/heads/dev'
uses: actions/cache@v4.2.3
with:
path: ~/.platformio
key: platformio-${{ matrix.pio_cache_key }}
- name: Cache platformio
if: github.ref != 'refs/heads/dev'
uses: actions/cache/restore@v4.2.3
with:
path: ~/.platformio
key: platformio-${{ matrix.pio_cache_key }}
- name: Register problem matchers
run: |
echo "::add-matcher::.github/workflows/matchers/clang-tidy.json"
echo "::add-matcher::.github/workflows/matchers/gcc.json"
# Can be removed as soon as esphome-lint container is fixed
- name: Add missing pexpect
run: pip install pexpect
- name: Run lint-cpp
run: script/lint-cpp -c
working-directory: ${{ env.esphome_directory }}
- name: Suggest changes
echo "::add-matcher::.github/workflows/matchers/clang-tidy.json"
- name: Run 'pio run --list-targets -e esp32-idf-tidy'
if: matrix.name == 'Run script/clang-tidy for ESP32 IDF'
run: |
. venv/bin/activate
mkdir -p .temp
pio run --list-targets -e esp32-idf-tidy
- name: Run clang-tidy
run: |
. venv/bin/activate
script/clang-tidy --all-headers --fix ${{ matrix.options }} ../components
env:
# Also cache libdeps, store them in a ~/.platformio subfolder
PLATFORMIO_LIBDEPS_DIR: ~/.platformio/libdeps
- name: Suggested changes
run: script/ci-suggest-changes
working-directory: ${{ env.esphome_directory }}
lint-python:
env:
esphome_directory: esphome
# Don't use the esphome-lint docker image because it may contain outdated requirements.
# This way, all dependencies are cached via the cache action.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Cache pip modules
uses: actions/cache@v1
with:
path: ~/.cache/pip
key: esphome-pip-3.9-${{ hashFiles('setup.py') }}
restore-keys: |
esphome-pip-3.9-
- name: 💣Clone esphome project
run: git clone https://github.com/esphome/esphome.git
- name: 💣Copy component into the esphome project
run: |
cp -r ../components/* esphome/components/
git config user.name "ci"
git config user.email "ci@github.com"
git add .
git commit -a -m "Add external component"
working-directory: ${{ env.esphome_directory }}
- name: Add missing requirements
run: pip3 install setuptools wheel
- name: Set up python environment
run: VIRTUAL_ENV=false script/setup
working-directory: ${{ env.esphome_directory }}
- name: Register problem matchers
run: |
echo "::add-matcher::.github/workflows/matchers/ci-custom.json"
echo "::add-matcher::.github/workflows/matchers/lint-python.json"
echo "::add-matcher::.github/workflows/matchers/python.json"
- name: Lint Custom
run: script/ci-custom.py -c
working-directory: ${{ env.esphome_directory }}
- name: Lint Python
run: script/lint-python -c
working-directory: ${{ env.esphome_directory }}
# yamllint disable-line rule:line-length
if: always()
esphome-config:
runs-on: ubuntu-latest
name: Validate example configurations
runs-on: ubuntu-24.04
needs:
- bundle
- common
steps:
- name: ⤵️ Check out configuration from GitHub
uses: actions/checkout@v2
- name: Setup Python 3.9
uses: actions/setup-python@v1
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
python-version: 3.9
- name: Install dependencies
name: bundle
path: .
- name: Restore Python
uses: ./.github/actions/restore-python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Register matcher
run: echo "::add-matcher::.github/workflows/matchers/esphome-config.json"
- name: Validate example configurations
run: |
python -m pip install --upgrade pip setuptools wheel
pip install esphome
pip list
esphome version
- name: Write secrets.yaml
shell: bash
run: 'echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml'
- name: Write tests/secrets.yaml
shell: bash
run: 'echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > tests/secrets.yaml'
- run: |
esphome -s external_components_source components config esp32-ble-example-faker.yaml
- run: |
esphome -s external_components_source components config esp8266-solar-charger-example-faker.yaml
esphome -s external_components_source components config esp8266-charger-example-faker.yaml
esphome -s external_components_source components config esp8266-charging-converter-example-faker.yaml
esphome -s external_components_source components config esp8266-smart-shunt-example-faker.yaml
esphome -s external_components_source components config esp8266-triple-charger-example-faker.yaml
- run: |
esphome -s external_components_source ../components config tests/esp8266-fake-charger.yaml
esphome -s external_components_source ../components config tests/esp8266-fake-charging-converter.yaml
esphome -s external_components_source ../components config tests/esp8266-fake-solar-charger.yaml
. venv/bin/activate
echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml
for YAML in esp*.yaml; do
esphome -s external_components_source components config $YAML
done
- name: Validate test configurations
run: |
. venv/bin/activate
echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > tests/secrets.yaml
for YAML in tests/esp*.yaml; do
esphome -s external_components_source ../components config $YAML
done
esphome-compile:
runs-on: ubuntu-latest
needs: [esphome-config]
name: Build example configurations
runs-on: ubuntu-24.04
needs:
- bundle
- common
steps:
- name: ⤵️ Check out configuration from GitHub
uses: actions/checkout@v2
- name: Cache .esphome
uses: actions/cache@v2
- name: Download prepared repository
uses: pyTooling/download-artifact@v4
with:
path: .esphome
key: esphome-compile-esphome-${{ hashFiles('*.yaml') }}
restore-keys: esphome-compile-esphome-
- name: Cache .pioenvs
uses: actions/cache@v2
name: bundle
path: .
- name: Restore Python
uses: ./.github/actions/restore-python
with:
path: .pioenvs
key: esphome-compile-pioenvs-${{ hashFiles('*.yaml') }}
restore-keys: esphome-compile-pioenvs-
- name: Set up Python 3.9
uses: actions/setup-python@v1
with:
python-version: 3.9
- name: Install dependencies
python-version: ${{ env.DEFAULT_PYTHON }}
cache-key: ${{ needs.common.outputs.cache-key }}
- name: Compile example configurations
run: |
python -m pip install --upgrade pip setuptools wheel
pip install esphome
pip list
esphome version
- name: Register problem matchers
. venv/bin/activate
echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml
for YAML in esp*faker.yaml; do
esphome -s external_components_source components compile $YAML
done
- name: Compile test configurations
run: |
echo "::add-matcher::.github/workflows/matchers/gcc.json"
echo "::add-matcher::.github/workflows/matchers/python.json"
- name: Write secrets.yaml
shell: bash
run: 'echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml'
- run: |
esphome -s external_components_source components compile esp32-ble-example-faker.yaml
- run: |
esphome -s external_components_source components compile esp8266-solar-charger-example-faker.yaml
esphome -s external_components_source components compile esp8266-charger-example-faker.yaml
esphome -s external_components_source components compile esp8266-charging-converter-example-faker.yaml
esphome -s external_components_source components compile esp8266-smart-shunt-example-faker.yaml
esphome -s external_components_source components compile esp8266-triple-charger-example-faker.yaml
. venv/bin/activate
echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > tests/secrets.yaml
esphome -s external_components_source ../components compile tests/esp32c6-compatibility-test.yaml

View File

@@ -0,0 +1,14 @@
{
"problemMatcher": [
{
"owner": "esphome-config",
"severity": "warning",
"pattern": [
{
"regexp": "^WARNING Using `([^`]+)` is deprecated and will be removed(.*)$",
"message": 1
}
]
}
]
}

View File

@@ -1,28 +1,45 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
# See https://github.com/rytilahti/python-miio/blob/master/.pre-commit-config.yaml
repos:
- repo: https://github.com/ambv/black
rev: 22.1.0
- repo: https://github.com/pre-commit/mirrors-isort
rev: v5.10.1
hooks:
- id: isort
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.5.5
hooks:
# Run the linter.
- id: ruff
args: [--fix]
# Run the formatter.
- id: ruff-format
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 24.4.2
hooks:
- id: black
args:
- --safe
- --quiet
files: ^((components|esphome|script|tests)/.+)?[^/]+\.py$
- repo: https://gitlab.com/pycqa/flake8
rev: 3.9.2
- repo: https://github.com/PyCQA/flake8
rev: 7.1.0
hooks:
- id: flake8
additional_dependencies:
- flake8-docstrings==1.5.0
- pydocstyle==5.1.1
files: ^(components|esphome|tests)/.+\.py$
- repo: https://github.com/asottile/pyupgrade
rev: v2.31.0
rev: v3.19.1
hooks:
- id: pyupgrade
args: [--py38-plus]
- repo: https://github.com/pocc/pre-commit-hooks
rev: v1.3.5
args: [--py311-plus]
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.35.1
hooks:
- id: yamllint
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v13.0.1
hooks:
- id: clang-format
types_or: [c, c++]

View File

@@ -6,16 +6,9 @@ yaml-files:
- '.yamllint'
ignore: |
/.cache/
esphome/**/*.pio*
config/automations.yaml
config/known_devices.yaml
config/scenes.yaml
config/google_calendars.yaml
config/custom_components/scheduler
config/custom_components/xiaomi_cloud_map_extractor
config/custom_components/zha_map
config/custom_components/hacs
.clang-format
.esphome/
tests/.esphome/
rules:
braces:

View File

@@ -1,6 +1,6 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import uart
import esphome.config_validation as cv
from esphome.const import CONF_ID, CONF_THROTTLE
CODEOWNERS = ["@syssi"]
@@ -15,6 +15,12 @@ CONF_RX_TIMEOUT = "rx_timeout"
votronic_ns = cg.esphome_ns.namespace("votronic")
Votronic = votronic_ns.class_("Votronic", cg.PollingComponent, uart.UARTDevice)
VOTRONIC_COMPONENT_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_VOTRONIC_ID): cv.use_id(Votronic),
}
)
CONFIG_SCHEMA = (
cv.Schema(
{

View File

@@ -1,9 +1,9 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import binary_sensor
from esphome.const import CONF_ICON, CONF_ID
import esphome.config_validation as cv
from esphome.const import CONF_ID
from . import CONF_VOTRONIC_ID, Votronic
from . import CONF_VOTRONIC_ID, VOTRONIC_COMPONENT_SCHEMA
DEPENDENCIES = ["votronic"]
@@ -11,87 +11,97 @@ CODEOWNERS = ["@syssi"]
CONF_CHARGING = "charging"
CONF_DISCHARGING = "discharging"
CONF_CONTROLLER_ACTIVE = "controller_active"
CONF_CURRENT_REDUCTION = "current_reduction"
CONF_AES_ACTIVE = "aes_active"
CONF_CHARGER_CHARGING = "charger_charging"
CONF_CHARGER_DISCHARGING = "charger_discharging"
CONF_CHARGER_CONTROLLER_ACTIVE = "charger_controller_active"
CONF_CHARGER_CURRENT_REDUCTION = "charger_current_reduction"
CONF_CHARGER_AES_ACTIVE = "charger_aes_active"
CONF_CHARGING_CONVERTER_CHARGING = "charging_converter_charging"
CONF_CHARGING_CONVERTER_DISCHARGING = "charging_converter_discharging"
CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE = "charging_converter_controller_active"
CONF_CHARGING_CONVERTER_CURRENT_REDUCTION = "charging_converter_current_reduction"
CONF_CHARGING_CONVERTER_AES_ACTIVE = "charging_converter_aes_active"
CONF_PV_CONTROLLER_ACTIVE = "pv_controller_active"
CONF_PV_CURRENT_REDUCTION = "pv_current_reduction"
CONF_PV_AES_ACTIVE = "pv_aes_active"
ICON_CHARGING = "mdi:battery-charging"
ICON_DISCHARGING = "mdi:power-plug"
ICON_CONTROLLER_ACTIVE = "mdi:power"
ICON_CURRENT_REDUCTION = "mdi:car-speed-limiter"
ICON_AES_ACTIVE = "mdi:export"
ICON_PV_CONTROLLER_ACTIVE = "mdi:power"
ICON_PV_CURRENT_REDUCTION = "mdi:car-speed-limiter"
ICON_PV_AES_ACTIVE = "mdi:export"
BINARY_SENSORS = [
CONF_CHARGING,
CONF_DISCHARGING,
CONF_CONTROLLER_ACTIVE,
CONF_CURRENT_REDUCTION,
CONF_AES_ACTIVE,
CONF_CHARGER_CHARGING,
CONF_CHARGER_DISCHARGING,
CONF_CHARGER_CONTROLLER_ACTIVE,
CONF_CHARGER_CURRENT_REDUCTION,
CONF_CHARGER_AES_ACTIVE,
CONF_CHARGING_CONVERTER_CHARGING,
CONF_CHARGING_CONVERTER_DISCHARGING,
CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE,
CONF_CHARGING_CONVERTER_CURRENT_REDUCTION,
CONF_CHARGING_CONVERTER_AES_ACTIVE,
CONF_PV_CONTROLLER_ACTIVE,
CONF_PV_CURRENT_REDUCTION,
CONF_PV_AES_ACTIVE,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_COMPONENT_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_ID): cv.use_id(Votronic),
cv.Optional(CONF_CHARGING): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CHARGING): cv.icon,
}
cv.Optional(CONF_CHARGING): binary_sensor.binary_sensor_schema(
icon="mdi:battery-charging",
),
cv.Optional(CONF_DISCHARGING): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_DISCHARGING): cv.icon,
}
cv.Optional(CONF_DISCHARGING): binary_sensor.binary_sensor_schema(
icon="mdi:power-plug",
),
cv.Optional(CONF_CONTROLLER_ACTIVE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CONTROLLER_ACTIVE): cv.icon,
}
cv.Optional(CONF_CHARGER_CHARGING): binary_sensor.binary_sensor_schema(
icon="mdi:battery-charging",
),
cv.Optional(CONF_CURRENT_REDUCTION): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CURRENT_REDUCTION): cv.icon,
}
cv.Optional(CONF_CHARGER_DISCHARGING): binary_sensor.binary_sensor_schema(
icon="mdi:power-plug",
),
cv.Optional(CONF_AES_ACTIVE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_AES_ACTIVE): cv.icon,
}
cv.Optional(CONF_CHARGER_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema(
icon="mdi:power",
),
cv.Optional(CONF_CHARGER_CURRENT_REDUCTION): binary_sensor.binary_sensor_schema(
icon="mdi:car-speed-limiter",
),
cv.Optional(CONF_CHARGER_AES_ACTIVE): binary_sensor.binary_sensor_schema(
icon="mdi:export",
),
cv.Optional(
CONF_PV_CONTROLLER_ACTIVE
): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_PV_CONTROLLER_ACTIVE): cv.icon,
}
CONF_CHARGING_CONVERTER_CHARGING
): binary_sensor.binary_sensor_schema(
icon="mdi:battery-charging",
),
cv.Optional(
CONF_PV_CURRENT_REDUCTION
): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_PV_CURRENT_REDUCTION): cv.icon,
}
CONF_CHARGING_CONVERTER_DISCHARGING
): binary_sensor.binary_sensor_schema(
icon="mdi:power-plug",
),
cv.Optional(CONF_PV_AES_ACTIVE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_PV_AES_ACTIVE): cv.icon,
}
cv.Optional(
CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE
): binary_sensor.binary_sensor_schema(
icon="mdi:power",
),
cv.Optional(
CONF_CHARGING_CONVERTER_CURRENT_REDUCTION
): binary_sensor.binary_sensor_schema(
icon="mdi:car-speed-limiter",
),
cv.Optional(
CONF_CHARGING_CONVERTER_AES_ACTIVE
): binary_sensor.binary_sensor_schema(
icon="mdi:export",
),
cv.Optional(CONF_PV_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema(
icon="mdi:power",
),
cv.Optional(CONF_PV_CURRENT_REDUCTION): binary_sensor.binary_sensor_schema(
icon="mdi:car-speed-limiter",
),
cv.Optional(CONF_PV_AES_ACTIVE): binary_sensor.binary_sensor_schema(
icon="mdi:export",
),
}
)

View File

@@ -1,6 +1,6 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import sensor
import esphome.config_validation as cv
from esphome.const import (
CONF_BATTERY_VOLTAGE,
CONF_CURRENT,
@@ -21,7 +21,7 @@ from esphome.const import (
UNIT_WATT,
)
from . import CONF_VOTRONIC_ID, Votronic
from . import CONF_VOTRONIC_ID, VOTRONIC_COMPONENT_SCHEMA
DEPENDENCIES = ["votronic"]
@@ -32,20 +32,46 @@ CONF_SECONDARY_BATTERY_VOLTAGE = "secondary_battery_voltage"
CONF_BATTERY_CAPACITY_REMAINING = "battery_capacity_remaining"
CONF_STATE_OF_CHARGE = "state_of_charge"
# CONF_CURRENT = "current"
# CONF_POWER = "power"
CONF_BATTERY_NOMINAL_CAPACITY = "battery_nominal_capacity"
CONF_PV_VOLTAGE = "pv_voltage"
CONF_PV_CURRENT = "pv_current"
CONF_BATTERY_STATUS_BITMASK = "battery_status_bitmask"
CONF_PV_BATTERY_STATUS_BITMASK = "pv_battery_status_bitmask"
CONF_CHARGING_CONTROLLER_STATUS_BITMASK = "charging_controller_status_bitmask"
CONF_PV_CONTROLLER_STATUS_BITMASK = "pv_controller_status_bitmask"
CONF_CHARGED_CAPACITY = "charged_capacity"
CONF_CHARGED_ENERGY = "charged_energy"
CONF_PV_VOLTAGE = "pv_voltage"
CONF_PV_CURRENT = "pv_current"
CONF_PV_BATTERY_STATUS_BITMASK = "pv_battery_status_bitmask"
CONF_PV_CONTROLLER_STATUS_BITMASK = "pv_controller_status_bitmask"
CONF_PV_POWER = "pv_power"
CONF_CHARGING_MODE_SETTING_ID = "charging_mode_setting_id"
CONF_CONTROLLER_TEMPERATURE = "controller_temperature"
CONF_PV_MODE_SETTING_ID = "pv_mode_setting_id"
CONF_PV_CONTROLLER_TEMPERATURE = "pv_controller_temperature"
CONF_CHARGER_CURRENT = "charger_current"
CONF_CHARGER_POWER = "charger_power"
CONF_CHARGER_LOAD = "charger_load"
CONF_CHARGER_BATTERY_STATUS_BITMASK = "charger_battery_status_bitmask"
CONF_CHARGER_CONTROLLER_STATUS_BITMASK = "charger_controller_status_bitmask"
CONF_CHARGER_MODE_SETTING_ID = "charger_mode_setting_id"
CONF_CHARGER_CONTROLLER_TEMPERATURE = "charger_controller_temperature"
CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE = "charging_converter_battery_voltage"
CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE = (
"charging_converter_secondary_battery_voltage"
)
CONF_CHARGING_CONVERTER_CURRENT = "charging_converter_current"
CONF_CHARGING_CONVERTER_POWER = "charging_converter_power"
CONF_CHARGING_CONVERTER_LOAD = "charging_converter_load"
CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE = (
"charging_converter_controller_temperature"
)
CONF_CHARGING_CONVERTER_MODE_SETTING_ID = "charging_converter_mode_setting_id"
CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK = (
"charging_converter_battery_status_bitmask"
)
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK = (
"charging_converter_controller_status_bitmask"
)
ICON_BATTERY_CAPACITY_REMAINING = "mdi:battery-50"
ICON_STATE_OF_CHARGE = "mdi:battery-50"
ICON_CURRENT_DC = "mdi:current-dc"
@@ -55,7 +81,7 @@ ICON_BATTERY_STATUS_BITMASK = "mdi:alert-circle-outline"
ICON_PV_BATTERY_STATUS_BITMASK = "mdi:alert-circle-outline"
ICON_CHARGING_CONTROLLER_STATUS_BITMASK = "mdi:alert-circle-outline"
ICON_PV_CONTROLLER_STATUS_BITMASK = "mdi:alert-circle-outline"
ICON_CHARGING_MODE_SETTING_ID = "mdi:car-battery"
ICON_MODE_SETTING_ID = "mdi:car-battery"
UNIT_AMPERE_HOURS = "Ah"
@@ -67,21 +93,34 @@ SENSORS = [
CONF_CURRENT,
CONF_POWER,
CONF_BATTERY_NOMINAL_CAPACITY,
CONF_BATTERY_STATUS_BITMASK,
CONF_CHARGER_LOAD,
CONF_CHARGER_BATTERY_STATUS_BITMASK,
CONF_CHARGER_CONTROLLER_STATUS_BITMASK,
CONF_CHARGER_MODE_SETTING_ID,
CONF_CHARGER_CURRENT,
CONF_CHARGER_POWER,
CONF_CHARGER_CONTROLLER_TEMPERATURE,
CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE,
CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE,
CONF_CHARGING_CONVERTER_CURRENT,
CONF_CHARGING_CONVERTER_POWER,
CONF_CHARGING_CONVERTER_LOAD,
CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE,
CONF_CHARGING_CONVERTER_MODE_SETTING_ID,
CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK,
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK,
CONF_PV_VOLTAGE,
CONF_PV_CURRENT,
CONF_PV_POWER,
CONF_BATTERY_STATUS_BITMASK,
CONF_PV_MODE_SETTING_ID,
CONF_PV_BATTERY_STATUS_BITMASK,
CONF_CHARGING_CONTROLLER_STATUS_BITMASK,
CONF_PV_CONTROLLER_STATUS_BITMASK,
CONF_CHARGING_MODE_SETTING_ID,
CONF_CONTROLLER_TEMPERATURE,
CONF_PV_CONTROLLER_TEMPERATURE,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_COMPONENT_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_ID): cv.use_id(Votronic),
cv.Optional(CONF_BATTERY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_EMPTY,
@@ -131,6 +170,150 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_BATTERY_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_BATTERY_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGER_CURRENT): sensor.sensor_schema(
unit_of_measurement=UNIT_AMPERE,
icon=ICON_CURRENT_DC,
accuracy_decimals=3,
device_class=DEVICE_CLASS_CURRENT,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGER_POWER): sensor.sensor_schema(
unit_of_measurement=UNIT_WATT,
icon=ICON_EMPTY,
accuracy_decimals=2,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGER_LOAD): sensor.sensor_schema(
unit_of_measurement=UNIT_PERCENT,
icon=ICON_STATE_OF_CHARGE,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGER_BATTERY_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_BATTERY_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGER_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGER_MODE_SETTING_ID): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_MODE_SETTING_ID,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_PV_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_PV_CONTROLLER_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGER_CONTROLLER_TEMPERATURE): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_EMPTY,
accuracy_decimals=2,
device_class=DEVICE_CLASS_VOLTAGE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(
CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE
): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_EMPTY,
accuracy_decimals=2,
device_class=DEVICE_CLASS_VOLTAGE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGING_CONVERTER_LOAD): sensor.sensor_schema(
unit_of_measurement=UNIT_PERCENT,
icon=ICON_STATE_OF_CHARGE,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGING_CONVERTER_CURRENT): sensor.sensor_schema(
unit_of_measurement=UNIT_AMPERE,
icon=ICON_CURRENT_DC,
accuracy_decimals=3,
device_class=DEVICE_CLASS_CURRENT,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CHARGING_CONVERTER_POWER): sensor.sensor_schema(
unit_of_measurement=UNIT_WATT,
icon=ICON_EMPTY,
accuracy_decimals=2,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(
CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK
): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_BATTERY_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK
): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGING_CONVERTER_MODE_SETTING_ID): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_MODE_SETTING_ID,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(
CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE
): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_PV_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_EMPTY,
@@ -152,14 +335,6 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_BATTERY_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_BATTERY_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_PV_BATTERY_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_PV_BATTERY_STATUS_BITMASK,
@@ -168,38 +343,14 @@ CONFIG_SCHEMA = cv.Schema(
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGING_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema(
cv.Optional(CONF_PV_MODE_SETTING_ID): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK,
icon=ICON_MODE_SETTING_ID,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_PV_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_PV_CONTROLLER_STATUS_BITMASK,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CHARGING_MODE_SETTING_ID): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_CHARGING_MODE_SETTING_ID,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_CONTROLLER_TEMPERATURE): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
),
cv.Optional(CONF_PV_CONTROLLER_TEMPERATURE): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
icon=ICON_EMPTY,

View File

@@ -1,70 +1,78 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import text_sensor
from esphome.const import CONF_ICON, CONF_ID
import esphome.config_validation as cv
from esphome.const import CONF_ID
from . import CONF_VOTRONIC_ID, Votronic
from . import CONF_VOTRONIC_ID, VOTRONIC_COMPONENT_SCHEMA
DEPENDENCIES = ["votronic"]
CODEOWNERS = ["@syssi"]
CONF_BATTERY_STATUS = "battery_status"
CONF_PV_BATTERY_STATUS = "pv_battery_status"
CONF_CHARGING_CONTROLLER_STATUS = "charging_controller_status"
CONF_PV_CONTROLLER_STATUS = "pv_controller_status"
CONF_CHARGING_MODE_SETTING = "charging_mode_setting"
ICON_BATTERY_STATUS = "mdi:alert-circle-outline"
ICON_PV_BATTERY_STATUS = "mdi:alert-circle-outline"
ICON_CHARGING_CONTROLLER_STATUS = "mdi:heart-pulse"
ICON_PV_CONTROLLER_STATUS = "mdi:heart-pulse"
ICON_CHARGING_MODE_SETTING = "mdi:car-battery"
CONF_CHARGER_MODE_SETTING = "charger_mode_setting"
CONF_CHARGER_CONTROLLER_STATUS = "charger_controller_status"
CONF_CHARGER_BATTERY_STATUS = "charger_battery_status"
CONF_CHARGING_CONVERTER_MODE_SETTING = "charging_converter_mode_setting"
CONF_CHARGING_CONVERTER_BATTERY_STATUS = "charging_converter_battery_status"
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS = "charging_converter_controller_status"
CONF_PV_MODE_SETTING = "pv_mode_setting"
CONF_PV_BATTERY_STATUS = "pv_battery_status"
CONF_PV_CONTROLLER_STATUS = "pv_controller_status"
TEXT_SENSORS = [
CONF_BATTERY_STATUS,
CONF_CHARGER_MODE_SETTING,
CONF_CHARGER_CONTROLLER_STATUS,
CONF_CHARGER_BATTERY_STATUS,
CONF_CHARGING_CONVERTER_MODE_SETTING,
CONF_CHARGING_CONVERTER_BATTERY_STATUS,
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS,
CONF_PV_MODE_SETTING,
CONF_PV_BATTERY_STATUS,
CONF_CHARGING_CONTROLLER_STATUS,
CONF_PV_CONTROLLER_STATUS,
CONF_CHARGING_MODE_SETTING,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_COMPONENT_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_ID): cv.use_id(Votronic),
cv.Optional(CONF_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_BATTERY_STATUS): cv.icon,
}
cv.Optional(CONF_BATTERY_STATUS): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:alert-circle-outline"
),
cv.Optional(CONF_PV_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_PV_BATTERY_STATUS): cv.icon,
}
cv.Optional(CONF_CHARGER_MODE_SETTING): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:car-battery"
),
cv.Optional(CONF_CHARGER_CONTROLLER_STATUS): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:heart-pulse"
),
cv.Optional(CONF_CHARGER_BATTERY_STATUS): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:alert-circle-outline"
),
cv.Optional(
CONF_CHARGING_CONTROLLER_STATUS
): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(
CONF_ICON, default=ICON_CHARGING_CONTROLLER_STATUS
): cv.icon,
}
CONF_CHARGING_CONVERTER_BATTERY_STATUS
): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:car-battery"
),
cv.Optional(CONF_PV_CONTROLLER_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_PV_CONTROLLER_STATUS): cv.icon,
}
cv.Optional(
CONF_CHARGING_CONVERTER_CONTROLLER_STATUS
): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:heart-pulse"
),
cv.Optional(CONF_CHARGING_MODE_SETTING): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_CHARGING_MODE_SETTING): cv.icon,
}
cv.Optional(
CONF_CHARGING_CONVERTER_MODE_SETTING
): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:car-battery"
),
cv.Optional(CONF_PV_MODE_SETTING): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:car-battery"
),
cv.Optional(CONF_PV_BATTERY_STATUS): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:alert-circle-outline"
),
cv.Optional(CONF_PV_CONTROLLER_STATUS): text_sensor.text_sensor_schema(
text_sensor.TextSensor, icon="mdi:heart-pulse"
),
}
)

View File

@@ -133,8 +133,10 @@ void Votronic::on_votronic_data(const std::vector<uint8_t> &data) {
this->decode_solar_charger_data_(data);
break;
case VOTRONIC_FRAME_TYPE_CHARGER:
this->decode_charger_data_(data);
break;
case VOTRONIC_FRAME_TYPE_CHARGING_CONVERTER:
this->decode_charger_data_(frame_type, data);
this->decode_charging_converter_data_(data);
break;
case VOTRONIC_FRAME_TYPE_BATTERY_COMPUTER_INFO1:
this->decode_battery_computer_info1_data_(data);
@@ -171,7 +173,7 @@ void Votronic::decode_solar_charger_data_(const std::vector<uint8_t> &data) {
};
ESP_LOGI(TAG, "Solar charger data received");
ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
@@ -191,12 +193,14 @@ void Votronic::decode_solar_charger_data_(const std::vector<uint8_t> &data) {
// 11 1 0x15 Reserved
this->publish_state_(this->pv_controller_temperature_sensor_, (float) data[11]);
// 12 1 0x03 Charging mode setting (dip switches)
this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
this->publish_state_(this->pv_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->pv_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
// 13 1 0x00 Battery Controller Status Bitmask
ESP_LOGI(TAG, "PV - Battery Controller Status: 0x%02X", data[13]);
this->publish_state_(this->pv_battery_status_bitmask_sensor_, data[13]);
this->publish_state_(this->pv_battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13]));
// 14 1 0x00 PV Controller Status Bitmask
ESP_LOGI(TAG, "PV - Controller Status: 0x%02X", data[14]);
this->publish_state_(this->pv_controller_status_bitmask_sensor_, data[14]);
this->publish_state_(this->pv_controller_status_text_sensor_,
this->solar_charger_status_bitmask_to_string_(data[14]));
@@ -205,7 +209,7 @@ void Votronic::decode_solar_charger_data_(const std::vector<uint8_t> &data) {
this->publish_state_(this->pv_aes_active_binary_sensor_, (data[14] & (1 << 5)));
}
void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector<uint8_t> &data) {
void Votronic::decode_charger_data_(const std::vector<uint8_t> &data) {
const uint32_t now = millis();
if (now - this->last_charger_data_ < this->throttle_) {
return;
@@ -217,7 +221,7 @@ void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector
};
ESP_LOGI(TAG, "Charger data received");
ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
@@ -229,29 +233,83 @@ void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector
this->publish_state_(this->secondary_battery_voltage_sensor_, votronic_get_16bit(4) * 0.01f);
// 6 2 0x78 0x00 Charging Current A S16 100mA/Bit
float current = (float) ((int16_t) votronic_get_16bit(6)) * 0.1f;
this->publish_state_(this->current_sensor_, current);
this->publish_state_(this->power_sensor_, current * battery_voltage);
this->publish_state_(this->charging_binary_sensor_, (current > 0.0f));
this->publish_state_(this->discharging_binary_sensor_, (current < 0.0f));
this->publish_state_(this->charger_current_sensor_, current);
this->publish_state_(this->charger_power_sensor_, current * battery_voltage);
this->publish_state_(this->charger_charging_binary_sensor_, (current > 0.0f));
this->publish_state_(this->charger_discharging_binary_sensor_, (current < 0.0f));
// 8 1 0x00 Reserved
// 9 1 0x00 Reserved
// 10 1 0xA0 Charging Power % 0-100% 1%/Bit
this->publish_state_(this->state_of_charge_sensor_, (float) data[10]);
this->publish_state_(this->charger_load_sensor_, (float) data[10]);
// 11 1 0x15 Controller temperature
this->publish_state_(this->controller_temperature_sensor_, (float) data[11]);
this->publish_state_(this->charger_controller_temperature_sensor_, data[11] * 0.1f);
// 12 1 0x03 Charging mode setting (dip switches)
this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
this->publish_state_(this->charger_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->charger_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
// 13 1 0x00 Battery Controller Status Bitmask
this->publish_state_(this->battery_status_bitmask_sensor_, data[13]);
this->publish_state_(this->battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13]));
ESP_LOGI(TAG, "Charger - Battery Controller Status: 0x%02X", data[13]);
this->publish_state_(this->charger_battery_status_bitmask_sensor_, data[13]);
this->publish_state_(this->charger_battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13]));
// 14 1 0x00 Charging Controller Status Bitmask
this->publish_state_(this->charging_controller_status_bitmask_sensor_, data[14]);
this->publish_state_(this->charging_controller_status_text_sensor_,
ESP_LOGI(TAG, "Charger - Controller Status: 0x%02X", data[14]);
this->publish_state_(this->charger_controller_status_bitmask_sensor_, data[14]);
this->publish_state_(this->charger_controller_status_text_sensor_, this->charger_status_bitmask_to_string_(data[14]));
this->publish_state_(this->charger_controller_active_binary_sensor_, (data[14] & (1 << 3)));
this->publish_state_(this->charger_current_reduction_binary_sensor_, (data[14] & (1 << 4)));
this->publish_state_(this->charger_aes_active_binary_sensor_, (data[14] & (1 << 5)));
}
void Votronic::decode_charging_converter_data_(const std::vector<uint8_t> &data) {
const uint32_t now = millis();
if (now - this->last_charger_data_ < this->throttle_) {
return;
}
this->last_charger_data_ = now;
auto votronic_get_16bit = [&](size_t i) -> uint16_t {
return (uint16_t(data[i + 1]) << 8) | (uint16_t(data[i + 0]) << 0);
};
ESP_LOGI(TAG, "Charging converter data received");
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
// 1 1 0x3A Frame Type
// 2 2 0xA0 0x05 Battery Voltage V U16 10mV/Bit
float battery_voltage = votronic_get_16bit(2) * 0.01f;
this->publish_state_(this->charging_converter_battery_voltage_sensor_, battery_voltage);
// 4 2 0xA4 0x06 Second Battery Voltage V U16 10mV/Bit
this->publish_state_(this->charging_converter_secondary_battery_voltage_sensor_, votronic_get_16bit(4) * 0.01f);
// 6 2 0x78 0x00 Charging Current A S16 100mA/Bit
float current = (float) ((int16_t) votronic_get_16bit(6)) * 0.1f;
this->publish_state_(this->charging_converter_current_sensor_, current);
this->publish_state_(this->charging_converter_power_sensor_, current * battery_voltage);
this->publish_state_(this->charging_converter_charging_binary_sensor_, (current > 0.0f));
this->publish_state_(this->charging_converter_discharging_binary_sensor_, (current < 0.0f));
// 8 1 0x00 Reserved
// 9 1 0x00 Reserved
// 10 1 0xA0 Charging Power % 0-100% 1%/Bit
this->publish_state_(this->charging_converter_load_sensor_, (float) data[10]);
// 11 1 0x15 Controller temperature
this->publish_state_(this->charging_converter_controller_temperature_sensor_, data[11] * 0.1f);
// 12 1 0x03 Charging mode setting (dip switches)
this->publish_state_(this->charging_converter_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->charging_converter_mode_setting_text_sensor_,
this->charging_mode_setting_to_string_(data[12]));
// 13 1 0x00 Battery Controller Status Bitmask
ESP_LOGI(TAG, "Charging Converter - Battery Controller Status: 0x%02X", data[13]);
this->publish_state_(this->charging_converter_battery_status_bitmask_sensor_, data[13]);
this->publish_state_(this->charging_converter_battery_status_text_sensor_,
this->battery_status_bitmask_to_string_(data[13]));
// 14 1 0x00 Charging Controller Status Bitmask
ESP_LOGI(TAG, "Charging Converter - Controller Status: 0x%02X", data[14]);
this->publish_state_(this->charging_converter_controller_status_bitmask_sensor_, data[14]);
this->publish_state_(this->charging_converter_controller_status_text_sensor_,
this->charger_status_bitmask_to_string_(data[14]));
this->publish_state_(this->controller_active_binary_sensor_, (data[14] & (1 << 3)));
this->publish_state_(this->current_reduction_binary_sensor_, (data[14] & (1 << 4)));
this->publish_state_(this->aes_active_binary_sensor_, (data[14] & (1 << 5)));
this->publish_state_(this->charging_converter_controller_active_binary_sensor_, (data[14] & (1 << 3)));
this->publish_state_(this->charging_converter_current_reduction_binary_sensor_, (data[14] & (1 << 4)));
this->publish_state_(this->charging_converter_aes_active_binary_sensor_, (data[14] & (1 << 5)));
}
void Votronic::decode_battery_computer_info1_data_(const std::vector<uint8_t> &data) {
@@ -269,7 +327,7 @@ void Votronic::decode_battery_computer_info1_data_(const std::vector<uint8_t> &d
// 0xAA 0xCA 0x03 0x05 0x0F 0x05 0xC7 0x01 0x20 0x00 0x63 0x00 0x7B 0xFE 0xFF 0x39
ESP_LOGI(TAG, "Battery computer info1 data received");
ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
@@ -313,7 +371,7 @@ void Votronic::decode_battery_computer_info2_data_(const std::vector<uint8_t> &d
// 0xAA 0xDA 0x00 0x00 0x00 0x00 0xF8 0x11 0x5E 0x07 0x00 0x00 0x2F 0x04 0x02 0x43
ESP_LOGI(TAG, "Battery computer info2 data received");
ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
@@ -343,8 +401,8 @@ void Votronic::decode_battery_computer_info2_data_(const std::vector<uint8_t> &d
// LiFePo4 14.4V 14.4 84 184
// LiFePo4 14.6V 14.6 86 186
// LiFePo4 14.8V 14.8 88 188
this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]);
this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
// this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]);
// this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12]));
// 13 1 0x04
this->publish_state_(this->battery_status_bitmask_sensor_, data[13]);
this->publish_state_(this->battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13]));
@@ -369,7 +427,7 @@ void Votronic::decode_battery_computer_info3_data_(const std::vector<uint8_t> &d
// 0xAA 0xFA 0x2F 0x00 0x00 0x00 0xD2 0x02 0x00 0x0A 0x00 0x00 0x28 0xD0 0x00 0xF7
ESP_LOGI(TAG, "Battery computer info3 data received");
ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str());
// Byte Len Payload Description Unit Precision
// 0 1 0xAA Sync Byte
@@ -403,9 +461,19 @@ void Votronic::dump_config() {
LOG_BINARY_SENSOR("", "Charging", this->charging_binary_sensor_);
LOG_BINARY_SENSOR("", "Discharging", this->discharging_binary_sensor_);
LOG_BINARY_SENSOR("", "Controller active", this->controller_active_binary_sensor_);
LOG_BINARY_SENSOR("", "Current reduction", this->current_reduction_binary_sensor_);
LOG_BINARY_SENSOR("", "AES active", this->aes_active_binary_sensor_);
LOG_BINARY_SENSOR("", "Charger controller active", this->charger_controller_active_binary_sensor_);
LOG_BINARY_SENSOR("", "Charger current reduction", this->charger_current_reduction_binary_sensor_);
LOG_BINARY_SENSOR("", "Charger AES active", this->charger_aes_active_binary_sensor_);
LOG_BINARY_SENSOR("", "Charging converter charging", this->charging_converter_charging_binary_sensor_);
LOG_BINARY_SENSOR("", "Charging converter discharging", this->charging_converter_discharging_binary_sensor_);
LOG_BINARY_SENSOR("", "Charging converter controller active",
this->charging_converter_controller_active_binary_sensor_);
LOG_BINARY_SENSOR("", "Charging converter current reduction",
this->charging_converter_current_reduction_binary_sensor_);
LOG_BINARY_SENSOR("", "Charging converter AES active", this->charging_converter_aes_active_binary_sensor_);
LOG_BINARY_SENSOR("", "PV controller active", this->pv_controller_active_binary_sensor_);
LOG_BINARY_SENSOR("", "PV current reduction", this->pv_current_reduction_binary_sensor_);
LOG_BINARY_SENSOR("", "PV AES active", this->pv_aes_active_binary_sensor_);
@@ -413,26 +481,52 @@ void Votronic::dump_config() {
LOG_SENSOR("", "Battery voltage", this->battery_voltage_sensor_);
LOG_SENSOR("", "Secondary battery voltage", this->secondary_battery_voltage_sensor_);
LOG_SENSOR("", "Battery capacity remaining", this->battery_capacity_remaining_sensor_);
LOG_SENSOR("", "Battery nominal capacity", this->battery_nominal_capacity_sensor_);
LOG_SENSOR("", "State of charge", this->state_of_charge_sensor_);
LOG_SENSOR("", "Current", this->current_sensor_);
LOG_SENSOR("", "Power", this->power_sensor_);
LOG_SENSOR("", "Battery nominal capacity", this->battery_nominal_capacity_sensor_);
LOG_SENSOR("", "Battery status bitmask", this->battery_status_bitmask_sensor_);
LOG_SENSOR("", "PV voltage", this->pv_voltage_sensor_);
LOG_SENSOR("", "PV current", this->pv_current_sensor_);
LOG_SENSOR("", "PV power", this->pv_power_sensor_);
LOG_SENSOR("", "Battery status bitmask", this->battery_status_bitmask_sensor_);
LOG_SENSOR("", "PV battery status bitmask", this->pv_battery_status_bitmask_sensor_);
LOG_SENSOR("", "Charging Controller status bitmask", this->charging_controller_status_bitmask_sensor_);
LOG_SENSOR("", "PV Controller status bitmask", this->pv_controller_status_bitmask_sensor_);
LOG_SENSOR("", "Charging mode setting ID", this->charging_mode_setting_id_sensor_);
LOG_SENSOR("", "Controller temperature", this->controller_temperature_sensor_);
LOG_SENSOR("", "PV controller temperature", this->pv_controller_temperature_sensor_);
LOG_SENSOR("", "Charger battery status bitmask", this->charger_battery_status_bitmask_sensor_);
LOG_SENSOR("", "Charger Controller status bitmask", this->charger_controller_status_bitmask_sensor_);
LOG_SENSOR("", "Charger mode setting ID", this->charger_mode_setting_id_sensor_);
LOG_SENSOR("", "Charger controller temperature", this->charger_controller_temperature_sensor_);
LOG_SENSOR("", "Charger load", this->charger_load_sensor_);
LOG_SENSOR("", "Charging converter battery voltage", this->charging_converter_battery_voltage_sensor_);
LOG_SENSOR("", "Charging converter secondary battery voltage",
this->charging_converter_secondary_battery_voltage_sensor_);
LOG_SENSOR("", "Charging converter load", this->charging_converter_load_sensor_);
LOG_SENSOR("", "Charging converter current", this->charging_converter_current_sensor_);
LOG_SENSOR("", "Charging converter power", this->charging_converter_power_sensor_);
LOG_SENSOR("", "Charging converter battery status bitmask", this->charging_converter_battery_status_bitmask_sensor_);
LOG_SENSOR("", "Charging converter controller status bitmask",
this->charging_converter_controller_status_bitmask_sensor_);
LOG_SENSOR("", "Charging converter mode setting ID", this->charging_converter_mode_setting_id_sensor_);
LOG_SENSOR("", "Charging converter controller temperature", this->charging_converter_controller_temperature_sensor_);
LOG_SENSOR("", "Charging converter state of charge", this->charging_converter_state_of_charge_sensor_);
LOG_SENSOR("", "PV Mode Setting ID", this->pv_mode_setting_id_sensor_);
LOG_TEXT_SENSOR("", "Battery status", this->battery_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charger battery status", this->charger_battery_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charger controller status", this->charger_controller_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charger mode setting", this->charger_mode_setting_text_sensor_);
LOG_TEXT_SENSOR("", "Charging converter battery status", this->charging_converter_battery_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charging converter controller status", this->charging_converter_controller_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charging converter mode setting", this->charging_converter_mode_setting_text_sensor_);
LOG_TEXT_SENSOR("", "PV battery status", this->pv_battery_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charging controller status", this->charging_controller_status_text_sensor_);
LOG_TEXT_SENSOR("", "PV controller status", this->pv_controller_status_text_sensor_);
LOG_TEXT_SENSOR("", "Charging mode setting", this->charging_mode_setting_text_sensor_);
LOG_TEXT_SENSOR("", "PV Mode Setting", this->pv_mode_setting_text_sensor_);
this->check_uart_settings(1000);
}

View File

@@ -22,14 +22,22 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
void set_discharging_binary_sensor(binary_sensor::BinarySensor *discharging_binary_sensor) {
discharging_binary_sensor_ = discharging_binary_sensor;
}
void set_controller_active_binary_sensor(binary_sensor::BinarySensor *controller_active_binary_sensor) {
controller_active_binary_sensor_ = controller_active_binary_sensor;
void set_charger_charging_binary_sensor(binary_sensor::BinarySensor *charger_charging_binary_sensor) {
charger_charging_binary_sensor_ = charger_charging_binary_sensor;
}
void set_aes_active_binary_sensor(binary_sensor::BinarySensor *aes_active_binary_sensor) {
aes_active_binary_sensor_ = aes_active_binary_sensor;
void set_charger_discharging_binary_sensor(binary_sensor::BinarySensor *charger_discharging_binary_sensor) {
charger_discharging_binary_sensor_ = charger_discharging_binary_sensor;
}
void set_current_reduction_binary_sensor(binary_sensor::BinarySensor *current_reduction_binary_sensor) {
current_reduction_binary_sensor_ = current_reduction_binary_sensor;
void set_charger_controller_active_binary_sensor(
binary_sensor::BinarySensor *charger_controller_active_binary_sensor) {
charger_controller_active_binary_sensor_ = charger_controller_active_binary_sensor;
}
void set_charger_aes_active_binary_sensor(binary_sensor::BinarySensor *charger_aes_active_binary_sensor) {
charger_aes_active_binary_sensor_ = charger_aes_active_binary_sensor;
}
void set_charger_current_reduction_binary_sensor(
binary_sensor::BinarySensor *charger_current_reduction_binary_sensor) {
charger_current_reduction_binary_sensor_ = charger_current_reduction_binary_sensor;
}
void set_pv_controller_active_binary_sensor(binary_sensor::BinarySensor *pv_controller_active_binary_sensor) {
pv_controller_active_binary_sensor_ = pv_controller_active_binary_sensor;
@@ -40,6 +48,26 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
void set_pv_current_reduction_binary_sensor(binary_sensor::BinarySensor *pv_current_reduction_binary_sensor) {
pv_current_reduction_binary_sensor_ = pv_current_reduction_binary_sensor;
}
void set_charging_converter_charging_binary_sensor(
binary_sensor::BinarySensor *charging_converter_charging_binary_sensor) {
charging_converter_charging_binary_sensor_ = charging_converter_charging_binary_sensor;
}
void set_charging_converter_discharging_binary_sensor(
binary_sensor::BinarySensor *charging_converter_discharging_binary_sensor) {
charging_converter_discharging_binary_sensor_ = charging_converter_discharging_binary_sensor;
}
void set_charging_converter_controller_active_binary_sensor(
binary_sensor::BinarySensor *charging_converter_controller_active_binary_sensor) {
charging_converter_controller_active_binary_sensor_ = charging_converter_controller_active_binary_sensor;
}
void set_charging_converter_current_reduction_binary_sensor(
binary_sensor::BinarySensor *charging_converter_current_reduction_binary_sensor) {
charging_converter_current_reduction_binary_sensor_ = charging_converter_current_reduction_binary_sensor;
}
void set_charging_converter_aes_active_binary_sensor(
binary_sensor::BinarySensor *charging_converter_aes_active_binary_sensor) {
charging_converter_aes_active_binary_sensor_ = charging_converter_aes_active_binary_sensor;
}
void set_battery_voltage_sensor(sensor::Sensor *battery_voltage_sensor) {
battery_voltage_sensor_ = battery_voltage_sensor;
@@ -52,6 +80,14 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
}
void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; }
void set_power_sensor(sensor::Sensor *power_sensor) { power_sensor_ = power_sensor; }
void set_charger_current_sensor(sensor::Sensor *charger_current_sensor) {
charger_current_sensor_ = charger_current_sensor;
}
void set_charger_power_sensor(sensor::Sensor *charger_power_sensor) { charger_power_sensor_ = charger_power_sensor; }
void set_charger_load_sensor(sensor::Sensor *charger_load_sensor) { charger_load_sensor_ = charger_load_sensor; }
void set_charger_battery_status_bitmask_sensor(sensor::Sensor *charger_battery_status_bitmask_sensor) {
charger_battery_status_bitmask_sensor_ = charger_battery_status_bitmask_sensor;
}
void set_pv_voltage_sensor(sensor::Sensor *pv_voltage_sensor) { pv_voltage_sensor_ = pv_voltage_sensor; }
void set_pv_current_sensor(sensor::Sensor *pv_current_sensor) { pv_current_sensor_ = pv_current_sensor; }
void set_pv_power_sensor(sensor::Sensor *pv_power_sensor) { pv_power_sensor_ = pv_power_sensor; }
@@ -61,42 +97,94 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
void set_pv_battery_status_bitmask_sensor(sensor::Sensor *pv_battery_status_bitmask_sensor) {
pv_battery_status_bitmask_sensor_ = pv_battery_status_bitmask_sensor;
}
void set_charging_controller_status_bitmask_sensor(sensor::Sensor *charging_controller_status_bitmask_sensor) {
charging_controller_status_bitmask_sensor_ = charging_controller_status_bitmask_sensor;
void set_charger_controller_status_bitmask_sensor(sensor::Sensor *charger_controller_status_bitmask_sensor) {
charger_controller_status_bitmask_sensor_ = charger_controller_status_bitmask_sensor;
}
void set_pv_controller_status_bitmask_sensor(sensor::Sensor *pv_controller_status_bitmask_sensor) {
pv_controller_status_bitmask_sensor_ = pv_controller_status_bitmask_sensor;
}
void set_charging_mode_setting_id_sensor(sensor::Sensor *charging_mode_setting_id_sensor) {
charging_mode_setting_id_sensor_ = charging_mode_setting_id_sensor;
void set_charger_mode_setting_id_sensor(sensor::Sensor *charger_mode_setting_id_sensor) {
charger_mode_setting_id_sensor_ = charger_mode_setting_id_sensor;
}
void set_controller_temperature_sensor(sensor::Sensor *controller_temperature_sensor) {
controller_temperature_sensor_ = controller_temperature_sensor;
void set_charger_battery_status_text_sensor(text_sensor::TextSensor *charger_battery_status_text_sensor) {
charger_battery_status_text_sensor_ = charger_battery_status_text_sensor;
}
void set_charger_controller_temperature_sensor(sensor::Sensor *charger_controller_temperature_sensor) {
charger_controller_temperature_sensor_ = charger_controller_temperature_sensor;
}
void set_pv_controller_temperature_sensor(sensor::Sensor *pv_controller_temperature_sensor) {
pv_controller_temperature_sensor_ = pv_controller_temperature_sensor;
}
void set_pv_mode_setting_id_sensor(sensor::Sensor *pv_mode_setting_id_sensor) {
pv_mode_setting_id_sensor_ = pv_mode_setting_id_sensor;
}
void set_battery_capacity_remaining_sensor(sensor::Sensor *battery_capacity_remaining_sensor) {
battery_capacity_remaining_sensor_ = battery_capacity_remaining_sensor;
}
void set_battery_nominal_capacity_sensor(sensor::Sensor *battery_nominal_capacity_sensor) {
battery_nominal_capacity_sensor_ = battery_nominal_capacity_sensor;
}
void set_charging_converter_battery_voltage_sensor(sensor::Sensor *charging_converter_battery_voltage_sensor) {
charging_converter_battery_voltage_sensor_ = charging_converter_battery_voltage_sensor;
}
void set_charging_converter_secondary_battery_voltage_sensor(
sensor::Sensor *charging_converter_secondary_battery_voltage_sensor) {
charging_converter_secondary_battery_voltage_sensor_ = charging_converter_secondary_battery_voltage_sensor;
}
void set_charging_converter_current_sensor(sensor::Sensor *charging_converter_current_sensor) {
charging_converter_current_sensor_ = charging_converter_current_sensor;
}
void set_charging_converter_power_sensor(sensor::Sensor *charging_converter_power_sensor) {
charging_converter_power_sensor_ = charging_converter_power_sensor;
}
void set_charging_converter_load_sensor(sensor::Sensor *charging_converter_load_sensor) {
charging_converter_load_sensor_ = charging_converter_load_sensor;
}
void set_charging_converter_controller_temperature_sensor(
sensor::Sensor *charging_converter_controller_temperature_sensor) {
charging_converter_controller_temperature_sensor_ = charging_converter_controller_temperature_sensor;
}
void set_charging_converter_mode_setting_id_sensor(sensor::Sensor *charging_converter_mode_setting_id_sensor) {
charging_converter_mode_setting_id_sensor_ = charging_converter_mode_setting_id_sensor;
}
void set_charging_converter_battery_status_bitmask_sensor(
sensor::Sensor *charging_converter_battery_status_bitmask_sensor) {
charging_converter_battery_status_bitmask_sensor_ = charging_converter_battery_status_bitmask_sensor;
}
void set_charging_converter_controller_status_bitmask_sensor(
sensor::Sensor *charging_converter_controller_status_bitmask_sensor) {
charging_converter_controller_status_bitmask_sensor_ = charging_converter_controller_status_bitmask_sensor;
}
void set_battery_status_text_sensor(text_sensor::TextSensor *battery_status_text_sensor) {
battery_status_text_sensor_ = battery_status_text_sensor;
}
void set_pv_mode_setting_text_sensor(text_sensor::TextSensor *pv_mode_setting_text_sensor) {
pv_mode_setting_text_sensor_ = pv_mode_setting_text_sensor;
}
void set_pv_battery_status_text_sensor(text_sensor::TextSensor *pv_battery_status_text_sensor) {
pv_battery_status_text_sensor_ = pv_battery_status_text_sensor;
}
void set_charging_controller_status_text_sensor(text_sensor::TextSensor *charging_controller_status_text_sensor) {
charging_controller_status_text_sensor_ = charging_controller_status_text_sensor;
void set_charger_controller_status_text_sensor(text_sensor::TextSensor *charger_controller_status_text_sensor) {
charger_controller_status_text_sensor_ = charger_controller_status_text_sensor;
}
void set_pv_controller_status_text_sensor(text_sensor::TextSensor *pv_controller_status_text_sensor) {
pv_controller_status_text_sensor_ = pv_controller_status_text_sensor;
}
void set_charging_mode_setting_text_sensor(text_sensor::TextSensor *charging_mode_setting_text_sensor) {
charging_mode_setting_text_sensor_ = charging_mode_setting_text_sensor;
void set_charger_mode_setting_text_sensor(text_sensor::TextSensor *charger_mode_setting_text_sensor) {
charger_mode_setting_text_sensor_ = charger_mode_setting_text_sensor;
}
void set_charging_converter_mode_setting_text_sensor(
text_sensor::TextSensor *charging_converter_mode_setting_text_sensor) {
charging_converter_mode_setting_text_sensor_ = charging_converter_mode_setting_text_sensor;
}
void set_charging_converter_battery_status_text_sensor(
text_sensor::TextSensor *charging_converter_battery_status_text_sensor) {
charging_converter_battery_status_text_sensor_ = charging_converter_battery_status_text_sensor;
}
void set_charging_converter_controller_status_text_sensor(
text_sensor::TextSensor *charging_converter_controller_status_text_sensor) {
charging_converter_controller_status_text_sensor_ = charging_converter_controller_status_text_sensor;
}
void on_votronic_data(const std::vector<uint8_t> &data);
@@ -106,9 +194,19 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
protected:
binary_sensor::BinarySensor *charging_binary_sensor_;
binary_sensor::BinarySensor *discharging_binary_sensor_;
binary_sensor::BinarySensor *controller_active_binary_sensor_;
binary_sensor::BinarySensor *aes_active_binary_sensor_;
binary_sensor::BinarySensor *current_reduction_binary_sensor_;
binary_sensor::BinarySensor *charger_charging_binary_sensor_;
binary_sensor::BinarySensor *charger_discharging_binary_sensor_;
binary_sensor::BinarySensor *charger_controller_active_binary_sensor_;
binary_sensor::BinarySensor *charger_aes_active_binary_sensor_;
binary_sensor::BinarySensor *charger_current_reduction_binary_sensor_;
binary_sensor::BinarySensor *charging_converter_charging_binary_sensor_;
binary_sensor::BinarySensor *charging_converter_discharging_binary_sensor_;
binary_sensor::BinarySensor *charging_converter_controller_active_binary_sensor_;
binary_sensor::BinarySensor *charging_converter_current_reduction_binary_sensor_;
binary_sensor::BinarySensor *charging_converter_aes_active_binary_sensor_;
binary_sensor::BinarySensor *pv_controller_active_binary_sensor_;
binary_sensor::BinarySensor *pv_aes_active_binary_sensor_;
binary_sensor::BinarySensor *pv_current_reduction_binary_sensor_;
@@ -118,24 +216,50 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
sensor::Sensor *state_of_charge_sensor_;
sensor::Sensor *current_sensor_;
sensor::Sensor *power_sensor_;
sensor::Sensor *pv_voltage_sensor_;
sensor::Sensor *pv_current_sensor_;
sensor::Sensor *pv_power_sensor_;
sensor::Sensor *battery_status_bitmask_sensor_;
sensor::Sensor *pv_battery_status_bitmask_sensor_;
sensor::Sensor *charging_controller_status_bitmask_sensor_;
sensor::Sensor *pv_controller_status_bitmask_sensor_;
sensor::Sensor *charging_mode_setting_id_sensor_;
sensor::Sensor *controller_temperature_sensor_;
sensor::Sensor *pv_controller_temperature_sensor_;
sensor::Sensor *battery_capacity_remaining_sensor_;
sensor::Sensor *battery_nominal_capacity_sensor_;
sensor::Sensor *charger_current_sensor_;
sensor::Sensor *charger_power_sensor_;
sensor::Sensor *charger_load_sensor_;
sensor::Sensor *charger_controller_temperature_sensor_;
sensor::Sensor *charger_mode_setting_id_sensor_;
sensor::Sensor *charger_battery_status_bitmask_sensor_;
sensor::Sensor *charger_controller_status_bitmask_sensor_;
sensor::Sensor *charging_converter_battery_voltage_sensor_;
sensor::Sensor *charging_converter_secondary_battery_voltage_sensor_;
sensor::Sensor *charging_converter_current_sensor_;
sensor::Sensor *charging_converter_power_sensor_;
sensor::Sensor *charging_converter_load_sensor_;
sensor::Sensor *charging_converter_state_of_charge_sensor_;
sensor::Sensor *charging_converter_controller_temperature_sensor_;
sensor::Sensor *charging_converter_mode_setting_id_sensor_;
sensor::Sensor *charging_converter_battery_status_bitmask_sensor_;
sensor::Sensor *charging_converter_controller_status_bitmask_sensor_;
sensor::Sensor *pv_voltage_sensor_;
sensor::Sensor *pv_current_sensor_;
sensor::Sensor *pv_power_sensor_;
sensor::Sensor *pv_battery_status_bitmask_sensor_;
sensor::Sensor *pv_controller_status_bitmask_sensor_;
sensor::Sensor *pv_controller_temperature_sensor_;
sensor::Sensor *pv_mode_setting_id_sensor_;
text_sensor::TextSensor *battery_status_text_sensor_;
text_sensor::TextSensor *charger_mode_setting_text_sensor_;
text_sensor::TextSensor *charger_battery_status_text_sensor_;
text_sensor::TextSensor *charger_controller_status_text_sensor_;
text_sensor::TextSensor *charging_converter_mode_setting_text_sensor_;
text_sensor::TextSensor *charging_converter_battery_status_text_sensor_;
text_sensor::TextSensor *charging_converter_controller_status_text_sensor_;
text_sensor::TextSensor *pv_mode_setting_text_sensor_;
text_sensor::TextSensor *pv_battery_status_text_sensor_;
text_sensor::TextSensor *charging_controller_status_text_sensor_;
text_sensor::TextSensor *pv_controller_status_text_sensor_;
text_sensor::TextSensor *charging_mode_setting_text_sensor_;
std::vector<uint8_t> rx_buffer_;
uint32_t last_byte_{0};
@@ -148,7 +272,8 @@ class Votronic : public uart::UARTDevice, public PollingComponent {
uint16_t rx_timeout_{150};
void decode_solar_charger_data_(const std::vector<uint8_t> &data);
void decode_charger_data_(const uint8_t &frame_type, const std::vector<uint8_t> &data);
void decode_charger_data_(const std::vector<uint8_t> &data);
void decode_charging_converter_data_(const std::vector<uint8_t> &data);
void decode_battery_computer_info1_data_(const std::vector<uint8_t> &data);
void decode_battery_computer_info2_data_(const std::vector<uint8_t> &data);
void decode_battery_computer_info3_data_(const std::vector<uint8_t> &data);

View File

@@ -1,9 +1,9 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import ble_client
import esphome.config_validation as cv
from esphome.const import CONF_ID, CONF_THROTTLE
AUTO_LOAD = ["sensor", "text_sensor"]
AUTO_LOAD = ["binary_sensor", "sensor", "text_sensor"]
CODEOWNERS = ["@syssi"]
MULTI_CONF = True
@@ -27,10 +27,18 @@ CONFIG_SCHEMA = (
.extend(cv.polling_component_schema("2s"))
)
# Centralized schema for subcomponents
VOTRONIC_BLE_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_VOTRONIC_BLE_ID): cv.use_id(VotronicBle),
}
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await ble_client.register_ble_node(var, config)
cg.add_define("USE_ESP32_BLE_DEVICE")
cg.add(var.set_throttle(config[CONF_THROTTLE]))

View File

@@ -1,9 +1,9 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import binary_sensor
from esphome.const import CONF_ICON, CONF_ID
import esphome.config_validation as cv
from esphome.const import CONF_ID
from . import CONF_VOTRONIC_BLE_ID, VotronicBle
from . import CONF_VOTRONIC_BLE_ID, VOTRONIC_BLE_SCHEMA
DEPENDENCIES = ["votronic_ble"]
@@ -29,38 +29,22 @@ BINARY_SENSORS = [
CONF_AES_ACTIVE,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_BLE_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_BLE_ID): cv.use_id(VotronicBle),
cv.Optional(CONF_CHARGING): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CHARGING): cv.icon,
}
cv.Optional(CONF_CHARGING): binary_sensor.binary_sensor_schema(
binary_sensor.BinarySensor, icon=ICON_CHARGING
),
cv.Optional(CONF_DISCHARGING): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_DISCHARGING): cv.icon,
}
cv.Optional(CONF_DISCHARGING): binary_sensor.binary_sensor_schema(
binary_sensor.BinarySensor, icon=ICON_DISCHARGING
),
cv.Optional(CONF_CONTROLLER_ACTIVE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CONTROLLER_ACTIVE): cv.icon,
}
cv.Optional(CONF_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema(
binary_sensor.BinarySensor, icon=ICON_CONTROLLER_ACTIVE
),
cv.Optional(CONF_CURRENT_REDUCTION): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_CURRENT_REDUCTION): cv.icon,
}
cv.Optional(CONF_CURRENT_REDUCTION): binary_sensor.binary_sensor_schema(
binary_sensor.BinarySensor, icon=ICON_CURRENT_REDUCTION
),
cv.Optional(CONF_AES_ACTIVE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
cv.Optional(CONF_ICON, default=ICON_AES_ACTIVE): cv.icon,
}
cv.Optional(CONF_AES_ACTIVE): binary_sensor.binary_sensor_schema(
binary_sensor.BinarySensor, icon=ICON_AES_ACTIVE
),
}
)

View File

@@ -1,6 +1,6 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import sensor
import esphome.config_validation as cv
from esphome.const import (
CONF_BATTERY_VOLTAGE,
CONF_CURRENT,
@@ -20,7 +20,7 @@ from esphome.const import (
UNIT_WATT_HOURS,
)
from . import CONF_VOTRONIC_BLE_ID, VotronicBle
from . import CONF_VOTRONIC_BLE_ID, VOTRONIC_BLE_SCHEMA
DEPENDENCIES = ["votronic_ble"]
@@ -71,9 +71,8 @@ SENSORS = [
CONF_CHARGED_ENERGY,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_BLE_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_BLE_ID): cv.use_id(VotronicBle),
cv.Optional(CONF_BATTERY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_EMPTY,

View File

@@ -1,9 +1,9 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import text_sensor
from esphome.const import CONF_ICON, CONF_ID
import esphome.config_validation as cv
from esphome.const import CONF_ID
from . import CONF_VOTRONIC_BLE_ID, VotronicBle
from . import CONF_VOTRONIC_BLE_ID, VOTRONIC_BLE_SCHEMA
DEPENDENCIES = ["votronic_ble"]
@@ -20,20 +20,15 @@ TEXT_SENSORS = [
CONF_PV_CONTROLLER_STATUS,
]
CONFIG_SCHEMA = cv.Schema(
CONFIG_SCHEMA = VOTRONIC_BLE_SCHEMA.extend(
{
cv.GenerateID(CONF_VOTRONIC_BLE_ID): cv.use_id(VotronicBle),
cv.Optional(CONF_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_BATTERY_STATUS): cv.icon,
}
cv.Optional(CONF_BATTERY_STATUS): text_sensor.text_sensor_schema(
class_=text_sensor.TextSensor,
icon=ICON_BATTERY_STATUS,
),
cv.Optional(CONF_PV_CONTROLLER_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(text_sensor.TextSensor),
cv.Optional(CONF_ICON, default=ICON_PV_CONTROLLER_STATUS): cv.icon,
}
cv.Optional(CONF_PV_CONTROLLER_STATUS): text_sensor.text_sensor_schema(
class_=text_sensor.TextSensor,
icon=ICON_PV_CONTROLLER_STATUS,
),
}
)

View File

@@ -37,6 +37,24 @@ void VotronicBle::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t
this->publish_state_(this->charged_energy_sensor_, NAN);
this->publish_state_(this->pv_power_sensor_, NAN);
if (this->char_battery_computer_handle_ != 0) {
auto status = esp_ble_gattc_unregister_for_notify(
this->parent()->get_gattc_if(), this->parent()->get_remote_bda(), this->char_battery_computer_handle_);
if (status) {
ESP_LOGW(TAG, "esp_ble_gattc_unregister_for_notify failed, status=%d", status);
}
}
this->char_battery_computer_handle_ = 0;
if (this->char_solar_charger_handle_ != 0) {
auto status = esp_ble_gattc_unregister_for_notify(
this->parent()->get_gattc_if(), this->parent()->get_remote_bda(), this->char_solar_charger_handle_);
if (status) {
ESP_LOGW(TAG, "esp_ble_gattc_unregister_for_notify failed, status=%d", status);
}
}
this->char_solar_charger_handle_ = 0;
break;
}
case ESP_GATTC_SEARCH_CMPL_EVT: {

View File

@@ -0,0 +1,126 @@
AA.7A.30.05.08.05.00.00.00.00.00.96.52.28.00.AE
AA.1A.30.05.37.07.0A.00.00.E0.96.0D.52.20.09.15
AA.1A.30.05.9D.06.0A.00.00.E0.96.0D.52.20.09.BE
AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF
AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF
AA.1A.30.05.0C.06.0A.00.00.E0.96.0D.52.20.09.2F
AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF
AA.1A.30.05.2F.07.0B.00.00.E0.96.0D.52.20.09.0C
AA.1A.30.05.C6.07.0B.00.00.E0.96.0D.52.20.09.E5
AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF
AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF
AA.1A.2F.05.50.08.00.00.00.E0.96.0D.52.20.11.70
AA.3A.30.05.08.05.0A.00.00.01.11.96.52.28.0C.F8
AA.7A.37.05.11.05.00.00.00.00.00.96.52.28.00.B0
AA.1A.38.05.64.08.00.00.00.E0.96.0D.52.20.11.53
AA.1A.39.05.4C.08.00.00.00.E0.96.0E.52.20.11.79
AA.3A.39.05.26.05.D4.00.00.01.61.96.52.28.0C.71
AA.3A.3A.05.26.05.D5.00.00.01.63.96.52.28.0C.71
AA.1A.3A.05.4A.08.00.00.00.E0.96.0E.52.20.11.7C
AA.7A.3B.05.25.05.00.00.00.00.00.96.52.28.00.88
AA.1A.3B.05.52.08.00.00.00.E0.96.0F.52.20.11.64
AA.1A.3C.05.55.08.00.00.00.E0.96.0F.52.20.11.64
AA.3A.3C.05.2E.05.D5.00.00.01.60.96.52.28.0C.7C
AA.1A.3D.05.4F.08.00.00.00.E0.96.0F.52.20.11.7F
AA.7A.3D.05.51.05.00.00.00.00.00.96.52.28.00.FA
AA.3A.3E.05.52.05.D7.00.00.01.5E.96.52.28.0C.3E
AA.1A.3D.05.56.08.00.00.00.E0.96.10.52.20.11.79
AA.3A.3E.05.54.05.D7.00.00.01.5E.96.52.28.0C.38
AA.1A.3E.05.5D.08.00.00.00.E0.96.10.52.20.11.71
AA.1A.3F.05.6F.08.00.00.00.E0.96.11.52.20.11.43
AA.7A.40.05.58.05.00.00.00.00.00.96.52.28.00.8E
AA.1A.41.05.55.08.00.00.00.E0.96.12.52.20.11.04
AA.3A.44.05.59.05.D3.00.00.01.61.96.52.28.0C.74
AA.1A.44.05.44.08.00.00.00.E0.96.14.52.20.11.16
AA.1A.44.05.3F.08.00.00.00.E0.96.14.52.20.11.6D
AA.7A.45.05.59.05.00.00.00.00.00.96.52.28.00.8A
AA.3A.45.05.58.05.D2.00.00.01.61.96.52.28.0C.75
AA.1A.45.05.3E.08.00.00.00.E0.96.14.52.20.11.6D
AA.7A.46.05.58.05.00.00.00.00.00.96.52.28.00.88
AA.1A.46.05.3C.08.00.00.00.E0.96.15.52.20.11.6D
AA.1A.46.05.3E.08.00.00.00.E0.96.15.52.20.11.6F
AA.3A.46.05.58.05.D1.00.00.01.61.96.52.28.0C.75
AA.1A.47.05.55.08.00.00.00.E0.96.15.52.20.11.05
AA.3A.47.05.58.05.D0.00.00.01.61.96.52.28.0C.75
AA.3A.47.05.58.05.D0.00.00.01.61.96.52.28.0C.75
AA.1A.47.05.63.08.00.00.00.E0.96.16.52.20.11.30
AA.1A.48.05.4D.08.00.00.00.E0.96.16.52.20.11.11
AA.3A.48.05.58.05.CF.00.00.01.61.96.52.28.0C.65
AA.7A.48.05.58.05.00.00.00.00.00.96.52.28.00.86
AA.1A.48.05.48.08.00.00.00.E0.96.17.52.20.11.15
AA.3A.4A.05.58.05.CE.00.00.01.61.96.52.28.0C.66
AA.1A.4A.05.4F.08.00.00.00.E0.96.19.52.20.11.1E
AA.1A.4B.05.95.08.00.00.00.E0.96.19.52.20.11.C5
AA.3A.4B.05.57.05.CD.00.00.01.62.96.52.28.0C.68
AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85
AA.1A.4B.05.AA.08.00.00.00.E0.96.19.52.20.11.FA
AA.1A.4B.05.85.08.00.00.00.E0.96.19.52.20.11.D5
AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85
AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85
AA.1A.4B.05.88.08.00.00.00.E0.96.19.52.20.11.D8
AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85
AA.1A.4B.05.58.08.00.00.00.E0.96.1A.52.20.11.0B
AA.1A.4B.05.83.08.00.00.00.E0.96.1A.52.20.11.D0
AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85
AA.3A.4B.05.58.05.CC.00.00.01.61.96.52.28.0C.65
AA.1A.4B.05.58.08.00.00.00.E0.96.1A.52.20.11.0B
AA.7A.4C.05.58.05.00.00.00.00.00.96.52.28.00.82
AA.1A.4C.05.45.08.00.00.00.E0.96.1A.52.20.11.11
AA.1A.4C.05.A6.08.00.00.00.E0.96.1C.52.20.11.F4
AA.7A.4C.05.58.05.00.00.00.00.00.96.52.28.00.82
AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83
AA.1A.4D.05.9B.08.00.00.00.E0.96.1C.52.20.11.C8
AA.3A.4D.05.58.05.CC.00.00.01.62.96.52.28.0C.60
AA.1A.4D.05.A6.08.00.00.00.E0.96.1C.52.20.11.F5
AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83
AA.1A.4D.05.7D.08.00.00.00.E0.96.1D.52.20.11.2F
AA.3A.4D.05.58.05.CC.00.00.01.61.96.52.28.0C.63
AA.1A.4D.05.8B.08.00.00.00.E0.96.1D.52.20.11.D9
AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83
AA.1A.4D.05.A4.08.00.00.00.E0.96.1D.52.20.11.F6
AA.1A.4D.05.63.08.00.00.00.E0.96.1D.52.20.11.31
AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83
AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83
AA.1A.4D.05.64.08.00.00.00.E0.96.1E.52.20.11.35
AA.3A.4E.05.58.05.CC.00.00.01.62.96.52.28.0C.63
AA.1A.4D.05.5B.08.00.00.00.E0.96.1E.52.20.11.0A
AA.3A.4D.05.58.05.CC.00.00.01.62.96.52.28.0C.60
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.55.08.00.00.00.E0.96.1F.52.20.11.06
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.52.08.00.00.00.E0.96.1F.52.20.11.01
AA.1A.4E.05.4F.08.00.00.00.E0.96.1F.52.20.11.1C
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.59.08.00.00.00.E0.96.1F.52.20.11.0A
AA.1A.4E.05.72.08.00.00.00.E0.96.20.52.20.11.1E
AA.3A.4E.05.59.05.CC.00.00.01.63.96.52.28.0C.63
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.5E.08.00.00.00.E0.96.20.52.20.11.32
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.55.08.00.00.00.E0.96.20.52.20.11.39
AA.3A.4E.05.59.05.CC.00.00.01.62.96.52.28.0C.62
AA.1A.4E.05.59.08.00.00.00.E0.96.20.52.20.11.35
AA.3A.4E.05.59.05.CC.00.00.01.63.96.52.28.0C.63
AA.1A.4E.05.9F.08.00.00.00.E0.96.20.52.20.11.F3
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.1A.4E.05.4C.08.00.00.00.E0.96.22.52.20.11.22
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.1A.4E.05.4C.08.00.00.00.E0.96.22.52.20.11.22
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.1A.4E.05.4D.08.00.00.00.E0.96.23.52.20.11.22
AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81
AA.1A.4E.05.61.08.00.00.00.E0.96.23.52.20.11.0E
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.1A.4E.05.7F.08.00.00.00.E0.96.23.52.20.11.10
AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65
AA.1A.4E.05.8E.08.00.00.00.E0.96.23.52.20.11.E1
AA.1A.4E.05.9F.08.00.00.00.E0.96.23.52.20.11.F0
AA.3A.4E.05.5A.05.CB.00.00.01.62.96.52.28.0C.66
AA.1A.4E.05.9E.08.00.00.00.E0.96.23.52.20.11.F1
AA.3A.4F.05.59.05.CB.00.00.01.62.96.52.28.0C.64
AA.7A.4F.05.59.05.00.00.00.00.00.96.52.28.00.80
AA.1A.4E.05.99.08.00.00.00.E0.96.23.52.20.11.F6
AA.1A.4E.05.74.08.00.00.00.E0.96.23.52.20.11.1B
AA.3A.4E.05.59.05.CB.00.00.01.63.96.52.28.0C.64

View File

@@ -0,0 +1,59 @@
AA.1A.54.05.83.08.00.00.00.E0.97.32.52.20.01.F6
AA.7A.54.05.4A.05.2B.01.00.00.63.97.52.28.0C.CC
AA.1A.54.05.85.08.00.00.00.E0.97.32.52.20.01.F0
AA.3A.54.05.49.05.00.00.00.01.00.97.52.28.00.CB
AA.1A.54.05.85.08.00.00.00.E0.97.32.52.20.01.F0
AA.7A.53.05.49.05.2B.01.00.00.64.97.52.28.0C.CF
AA.1A.53.05.83.08.00.00.00.E0.97.33.52.20.01.F0
AA.1A.54.05.85.08.00.00.00.E0.97.33.52.20.01.F1
AA.3A.54.05.49.05.00.00.00.01.00.97.52.28.00.CB
AA.1A.54.05.83.08.00.00.00.E0.97.33.52.20.01.F7
AA.7A.54.05.49.05.2C.01.00.00.63.97.52.28.0C.C8
AA.7A.53.05.49.05.2C.01.00.00.63.97.52.28.0C.CF
AA.1A.54.05.7D.08.00.00.00.E0.97.33.52.20.01.09
AA.1A.54.05.0D.08.00.00.00.E0.97.33.52.20.01.79
AA.7A.55.05.4C.05.2B.01.00.00.64.97.52.28.0C.CC
AA.1A.56.05.1B.08.00.00.00.E0.97.34.52.20.01.6A
AA.7A.55.05.4C.05.2B.01.00.00.64.97.52.28.0C.CC
AA.1A.56.05.5B.08.00.00.00.E0.97.34.52.20.01.2A
AA.3A.56.05.4C.05.00.00.00.01.00.97.52.28.00.CC
AA.7A.56.05.4A.05.2B.01.00.00.63.97.52.28.0C.CE
AA.1A.56.05.7D.08.00.00.00.E0.97.34.52.20.01.0C
AA.7A.56.05.4B.05.2B.01.00.00.63.97.52.28.0C.CF
AA.1A.56.05.83.08.00.00.00.E0.97.34.52.20.01.F2
AA.1A.56.05.87.08.00.00.00.E0.97.34.52.20.01.F6
AA.3A.56.05.4B.05.00.00.00.01.00.97.52.28.00.CB
AA.7A.56.05.4B.05.2B.01.00.00.63.97.52.28.0C.CF
AA.1A.56.05.87.08.00.00.00.E0.97.34.52.20.01.F6
AA.1A.56.05.88.08.00.00.00.E0.97.34.52.20.01.F9
AA.7A.56.05.4A.05.2C.01.00.00.64.97.52.28.0C.CE
AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9
AA.1A.56.05.8A.08.00.00.00.E0.97.34.52.20.01.FB
AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9
AA.1A.56.05.8B.08.00.00.00.E0.97.34.52.20.01.FA
AA.1A.56.05.8A.08.00.00.00.E0.97.34.52.20.01.FB
AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9
AA.1A.56.05.88.08.00.00.00.E0.97.35.52.20.01.F8
AA.3A.56.05.47.05.00.00.00.01.00.97.52.28.00.C7
AA.1A.56.05.88.08.00.00.00.E0.97.35.52.20.01.F8
AA.1A.56.05.85.08.00.00.00.E0.97.34.52.20.01.F4
AA.7A.56.05.49.05.2B.01.00.00.64.97.52.28.0C.CA
AA.1A.49.05.83.08.10.00.00.E0.97.35.52.20.09.F4
AA.3A.49.05.35.05.00.00.00.01.00.97.52.28.00.AA
AA.3A.46.05.30.05.00.00.00.01.00.97.52.28.00.A0
AA.1A.46.05.BD.06.0A.00.00.E0.97.34.52.20.09.D0
AA.1A.44.05.82.08.00.00.00.E0.97.32.52.20.11.F7
AA.3A.44.05.2B.05.00.00.00.01.00.97.52.28.0C.B5
AA.1A.43.05.80.08.00.00.00.E0.97.31.52.20.11.F1
AA.7A.43.05.2A.05.00.00.00.00.00.97.52.28.00.FE
AA.3A.46.05.2E.05.41.00.00.01.29.97.52.28.0C.DA
AA.1A.46.05.82.08.00.00.00.E0.97.30.52.20.11.F7
AA.3A.4B.05.34.05.C7.00.00.01.64.97.52.28.0C.06
AA.1A.4C.05.82.08.00.00.00.E0.97.30.52.20.11.FD
AA.7A.4C.05.33.05.00.00.00.00.00.97.52.28.00.E8
AA.1A.4C.05.80.08.00.00.00.E0.97.2F.52.20.11.E0
AA.1A.4D.05.80.08.00.00.00.E0.97.2F.52.20.11.E1
AA.1A.4E.05.7F.08.00.00.00.E0.97.2F.52.20.11.1D
AA.3A.4E.05.37.05.D1.00.00.01.64.97.52.28.0C.16
AA.1A.4D.05.7F.08.00.00.00.E0.97.2F.52.20.11.1E
AA.1A.4D.05.80.08.00.00.00.E0.97.2F.52.20.11.E1

View File

@@ -1,15 +1,16 @@
substitutions:
name: votronic
device_description: "Monitor a votronic device via BLE"
external_components_source: github://syssi/esphome-votronic@drop-patched-ble-stack
external_components_source: github://syssi/esphome-votronic@main
mac_address: 60:A4:23:91:8F:55
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp32:
board: wemos_d1_mini32
@@ -25,6 +26,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -43,19 +45,8 @@ esp32_ble:
io_capability: keyboard_only
esp32_ble_tracker:
on_ble_advertise:
then:
- lambda: |-
if (x.get_name().rfind("votronic", 0) == 0) {
ESP_LOGI("ble_adv", "New Votronic BLE controller found");
ESP_LOGI("ble_adv", " Name: %s", x.get_name().c_str());
ESP_LOGI("ble_adv", " MAC address: %s", x.address_str().c_str());
ESP_LOGD("ble_adv", " Advertised service UUIDs:");
for (auto uuid : x.get_service_uuids()) {
ESP_LOGD("ble_adv", " - %s", uuid.to_string().c_str());
}
}
scan_parameters:
active: false
ble_client:
- mac_address: ${mac_address}

View File

@@ -5,9 +5,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp32:
board: wemos_d1_mini32
@@ -19,6 +20,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -29,6 +31,8 @@ api:
reboot_timeout: 0s
esp32_ble_tracker:
scan_parameters:
active: true
on_ble_advertise:
then:
- lambda: |-

View File

@@ -9,9 +9,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -25,6 +26,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -58,12 +60,17 @@ binary_sensor:
name: "${name} charging"
discharging:
name: "${name} discharging"
controller_active:
name: "${name} controller active"
current_reduction:
name: "${name} current reduction"
aes_active:
name: "${name} aes active"
charger_charging:
name: "${name} charger charging"
charger_discharging:
name: "${name} charger discharging"
charger_controller_active:
name: "${name} charger controller active"
charger_current_reduction:
name: "${name} charger current reduction"
charger_aes_active:
name: "${name} charger aes active"
sensor:
- platform: votronic
@@ -76,23 +83,28 @@ sensor:
name: "${name} current"
power:
name: "${name} power"
state_of_charge:
name: "${name} state of charge"
controller_temperature:
name: "${name} controller temperature"
charging_mode_setting_id:
name: "${name} charging mode setting id"
charger_current:
name: "${name} charger current"
charger_power:
name: "${name} charger power"
charger_load:
name: "${name} charger load"
charger_controller_temperature:
name: "${name} charger controller temperature"
charger_mode_setting_id:
name: "${name} charger mode setting id"
battery_status_bitmask:
name: "${name} battery status bitmask"
charging_controller_status_bitmask:
name: "${name} charging controller status bitmask"
charger_controller_status_bitmask:
name: "${name} charger controller status bitmask"
text_sensor:
- platform: votronic
votronic_id: votronic0
charging_mode_setting:
name: "${name} charging mode setting"
charger_mode_setting:
name: "${name} charger mode setting"
battery_status:
name: "${name} battery status"
charging_controller_status:
name: "${name} charging controller status"
charger_controller_status:
name: "${name} charger controller status"

View File

@@ -9,9 +9,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -25,6 +26,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -54,16 +56,16 @@ votronic:
binary_sensor:
- platform: votronic
votronic_id: votronic0
charging:
name: "${name} charging"
discharging:
name: "${name} discharging"
controller_active:
name: "${name} controller active"
current_reduction:
name: "${name} current reduction"
aes_active:
name: "${name} aes active"
charging_converter_charging:
name: "${name} charging converter charging"
charging_converter_discharging:
name: "${name} charging converter discharging"
charging_converter_controller_active:
name: "${name} charging converter controller active"
charging_converter_current_reduction:
name: "${name} charging converter current reduction"
charging_converter_aes_active:
name: "${name} charging converter aes active"
sensor:
- platform: votronic
@@ -78,21 +80,32 @@ sensor:
name: "${name} power"
state_of_charge:
name: "${name} state of charge"
controller_temperature:
name: "${name} controller temperature"
charging_mode_setting_id:
name: "${name} charging mode setting id"
battery_status_bitmask:
name: "${name} battery status bitmask"
charging_controller_status_bitmask:
name: "${name} charging controller status bitmask"
charging_converter_battery_voltage:
name: "${name} charging converter battery voltage"
charging_converter_secondary_battery_voltage:
name: "${name} charging converter secondary battery voltage"
charging_converter_current:
name: "${name} charging converter current"
charging_converter_power:
name: "${name} charging converter power"
charging_converter_load:
name: "${name} charging converter load"
charging_converter_controller_temperature:
name: "${name} charging converter controller temperature"
charging_converter_mode_setting_id:
name: "${name} charging converter mode setting id"
charging_converter_battery_status_bitmask:
name: "${name} charging converter battery status bitmask"
charging_converter_controller_status_bitmask:
name: "${name} charging converter controller status bitmask"
text_sensor:
- platform: votronic
votronic_id: votronic0
charging_mode_setting:
name: "${name} charging mode setting"
battery_status:
name: "${name} battery status"
charging_controller_status:
name: "${name} charging controller status"
charging_converter_mode_setting:
name: "${name} charging converter mode setting"
charging_converter_battery_status:
name: "${name} charging converter battery status"
charging_converter_controller_status:
name: "${name} charging converter controller status"

View File

@@ -9,9 +9,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -25,6 +26,8 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
# If you use Home Assistant please remove this `mqtt` section and uncomment the native `api` component!
@@ -73,15 +76,15 @@ sensor:
name: "${name} battery nominal capacity"
state_of_charge:
name: "${name} state of charge"
charging_mode_setting_id:
name: "${name} charging mode setting id"
charger_mode_setting_id:
name: "${name} charger mode setting id"
battery_status_bitmask:
name: "${name} battery status bitmask"
text_sensor:
- platform: votronic
votronic_id: votronic0
charging_mode_setting:
name: "${name} charging mode setting"
charger_mode_setting:
name: "${name} charger mode setting"
battery_status:
name: "${name} battery status"

View File

@@ -9,9 +9,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -25,6 +26,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -58,6 +60,7 @@ binary_sensor:
name: "${name} charging"
discharging:
name: "${name} discharging"
pv_controller_active:
name: "${name} pv controller active"
pv_current_reduction:
@@ -78,8 +81,8 @@ sensor:
name: "${name} pv power"
pv_controller_temperature:
name: "${name} pv controller temperature"
charging_mode_setting_id:
name: "${name} charging mode setting id"
pv_mode_setting_id:
name: "${name} pv mode setting id"
pv_battery_status_bitmask:
name: "${name} pv battery status bitmask"
pv_controller_status_bitmask:
@@ -88,8 +91,8 @@ sensor:
text_sensor:
- platform: votronic
votronic_id: votronic0
charging_mode_setting:
name: "${name} charging mode setting"
pv_mode_setting:
name: "${name} pv mode setting"
pv_battery_status:
name: "${name} pv battery status"
pv_controller_status:

View File

@@ -1,4 +1,4 @@
<<: !include esp8266-solar-charger-example.yaml
<<: !include esp8266-triple-charger-example.yaml
logger:
level: VERY_VERBOSE

View File

@@ -1,32 +1,58 @@
<<: !include esp8266-solar-charger-example-debug.yaml
<<: !include esp8266-triple-charger-example-debug.yaml
interval:
- interval: 6s
- interval: 10s
then:
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x1A, 0x2F, 0x05, 0xC1, 0x06, 0x00, 0x00, 0x00, 0xE0, 0xA5, 0x18, 0x56, 0x20, 0x01, 0xDD
0xAA, 0x3A, 0xFD, 0x04, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9A, 0x52, 0x28, 0x00, 0xDF
});
id(votronic0).on_votronic_data({
0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A
});
id(votronic0).on_votronic_data({
0xAA, 0x3A, 0x2E, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA3, 0x56, 0x28, 0x00, 0x1C
});
id(votronic0).on_votronic_data({
0xAA, 0x7A, 0x2E, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x56, 0x28, 0x00, 0x5D
});
- delay: 2s
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x1A, 0x2F, 0x05, 0xBF, 0x06, 0x00, 0x00, 0x00, 0xE0, 0xA2, 0x19, 0x56, 0x20, 0x01, 0xA5
0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x1A, 0xFD, 0x04, 0x94, 0x05, 0x01, 0x00, 0x00, 0xE0, 0x9A, 0x11, 0x52, 0x20, 0x09, 0x63
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x7A, 0xFD, 0x04, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x52, 0x28, 0x00, 0x9E
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x3A, 0x09, 0x05, 0x02, 0x05, 0xC8, 0x00, 0x00, 0x01, 0x64, 0x9A, 0x52, 0x28, 0x0C, 0x70
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x3A, 0x2F, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA2, 0x56, 0x28, 0x00, 0x1C
0xAA, 0x1A, 0x0A, 0x05, 0xDD, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x9A, 0x12, 0x52, 0x20, 0x11, 0xC4
});
- delay: 1s
- lambda: |-
id(votronic0).on_votronic_data({
0xAA, 0x7A, 0x2F, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x56, 0x28, 0x00, 0x5D
0xAA, 0x7A, 0x0C, 0x05, 0x19, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x52, 0x28, 0x00, 0x8F
});

View File

@@ -4,14 +4,15 @@ substitutions:
external_components_source: github://syssi/esphome-votronic@main
tx_pin: GPIO4
rx_pin: GPIO5
rx_timeout: 150ms
rx_timeout: 600ms
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -25,6 +26,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG
@@ -58,12 +60,29 @@ binary_sensor:
name: "${name} charging"
discharging:
name: "${name} discharging"
controller_active:
name: "${name} controller active"
current_reduction:
name: "${name} current reduction"
aes_active:
name: "${name} aes active"
charger_charging:
name: "${name} charger charging"
charger_discharging:
name: "${name} charger discharging"
charger_controller_active:
name: "${name} charger controller active"
charger_current_reduction:
name: "${name} charger current reduction"
charger_aes_active:
name: "${name} charger aes active"
charging_converter_charging:
name: "${name} charging converter charging"
charging_converter_discharging:
name: "${name} charging converter discharging"
charging_converter_controller_active:
name: "${name} charging converter controller active"
charging_converter_current_reduction:
name: "${name} charging converter current reduction"
charging_converter_aes_active:
name: "${name} charging converter aes active"
pv_controller_active:
name: "${name} pv controller active"
pv_current_reduction:
@@ -76,32 +95,82 @@ sensor:
votronic_id: votronic0
battery_voltage:
name: "${name} battery voltage"
pv_voltage:
name: "${name} pv voltage"
pv_current:
name: "${name} pv current"
pv_power:
name: "${name} pv power"
controller_temperature:
name: "${name} controller temperature"
charging_mode_setting_id:
name: "${name} charging mode setting id"
current:
name: "${name} current"
power:
name: "${name} power"
battery_status_bitmask:
name: "${name} battery status bitmask"
charger_current:
name: "${name} charger current"
charger_power:
name: "${name} charger power"
charger_load:
name: "${name} charger load"
charger_controller_temperature:
name: "${name} charger controller temperature"
charger_mode_setting_id:
name: "${name} charger mode setting id"
charger_battery_status_bitmask:
name: "${name} charger battery status bitmask"
charger_controller_status_bitmask:
name: "${name} charger controller status bitmask"
charging_converter_battery_voltage:
name: "${name} charging converter battery voltage"
charging_converter_secondary_battery_voltage:
name: "${name} charging converter secondary battery voltage"
charging_converter_current:
name: "${name} charging converter current"
charging_converter_power:
name: "${name} charging converter power"
charging_converter_load:
name: "${name} charging converter load"
charging_converter_controller_temperature:
name: "${name} charging converter controller temperature"
charging_converter_mode_setting_id:
name: "${name} charging converter mode setting id"
charging_converter_battery_status_bitmask:
name: "${name} charging converter battery status bitmask"
charging_converter_controller_status_bitmask:
name: "${name} charging converter controller status bitmask"
pv_controller_status_bitmask:
name: "${name} pv controller status bitmask"
pv_controller_temperature:
name: "${name} pv controller temperature"
pv_battery_status_bitmask:
name: "${name} pv battery status bitmask"
pv_voltage:
name: "${name} pv voltage"
pv_current:
name: "${name} pv current"
pv_power:
name: "${name} pv power"
text_sensor:
- platform: votronic
votronic_id: votronic0
charging_mode_setting:
name: "${name} charging mode setting"
battery_status:
name: "${name} battery status"
charger_mode_setting:
name: "${name} charger mode setting"
charger_battery_status:
name: "${name} charger battery status"
charger_controller_status:
name: "${name} charger controller status"
charging_converter_mode_setting:
name: "${name} charging converter mode setting"
charging_converter_battery_status:
name: "${name} charging converter battery status"
charging_converter_controller_status:
name: "${name} charging converter controller status"
pv_mode_setting:
name: "${name} pv mode setting"
pv_controller_status:
name: "${name} pv controller status"
pv_battery_status:

58
setup.cfg Normal file
View File

@@ -0,0 +1,58 @@
[flake8]
max-line-length = 120
# Following 4 for black compatibility
# E501: line too long
# W503: Line break occurred before a binary operator
# E203: Whitespace before ':'
# D202 No blank lines allowed after function docstring
# TODO fix flake8
# D100 Missing docstring in public module
# D101 Missing docstring in public class
# D102 Missing docstring in public method
# D103 Missing docstring in public function
# D104 Missing docstring in public package
# D105 Missing docstring in magic method
# D107 Missing docstring in __init__
# D200 One-line docstring should fit on one line with quotes
# D205 1 blank line required between summary line and description
# D209 Multi-line docstring closing quotes should be on a separate line
# D400 First line should end with a period
# D401 First line should be in imperative mood
ignore =
E501,
W503,
E203,
D202,
D100,
D101,
D102,
D103,
D104,
D105,
D107,
D200,
D205,
D209,
D400,
D401,
[isort]
# https://github.com/timothycrosley/isort
# https://github.com/timothycrosley/isort/wiki/isort-Settings
# splits long import on multiple lines indented by 4 spaces
multi_line_output = 3
include_trailing_comma=True
force_grid_wrap=0
use_parentheses=True
line_length=88
indent = " "
# will group `import x` and `from x import` of the same module.
force_sort_within_sections = true
sections = FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
default_section = THIRDPARTY
known_first_party = custom_components,tests
forced_separate = tests
combine_as_imports = true

View File

@@ -0,0 +1,247 @@
substitutions:
name: esp32c6-compatibility-test
device0: device0
device1: device1
device_description: "Verify the project builds from source on ESP32C6"
external_components_source: github://syssi/esphome-votronic@main
mac_address: 60:A4:23:91:8F:55
esphome:
name: ${name}
comment: ${device_description}
min_version: 2025.6.0
esp32:
board: esp32-c6-devkitc-1
variant: esp32c6
framework:
type: esp-idf
external_components:
- source: ${external_components_source}
refresh: 0s
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ota:
platform: esphome
logger:
level: VERY_VERBOSE
api:
reboot_timeout: 0s
ble_client:
- mac_address: ${mac_address}
id: client0
on_passkey_request:
then:
- ble_client.passkey_reply:
id: client0
passkey: 173928
votronic_ble:
- ble_client_id: client0
id: votronic0
throttle: 5s
#
#
#
uart:
- id: uart_0
baud_rate: 1000
tx_pin: GPIO16
rx_pin: GPIO17
votronic:
- id: votronic1
uart_id: uart_0
rx_timeout: 150ms
throttle: 2s
#
#
#
binary_sensor:
- platform: votronic_ble
votronic_ble_id: votronic0
charging:
name: "${device0} charging"
discharging:
name: "${device0} discharging"
controller_active:
name: "${device0} controller active"
current_reduction:
name: "${device0} current reduction"
aes_active:
name: "${device0} aes active"
- platform: votronic
votronic_id: votronic1
charging:
name: "${device1} charging"
discharging:
name: "${device1} discharging"
charger_charging:
name: "${device1} charger charging"
charger_discharging:
name: "${device1} charger discharging"
charger_controller_active:
name: "${device1} charger controller active"
charger_current_reduction:
name: "${device1} charger current reduction"
charger_aes_active:
name: "${device1} charger aes active"
charging_converter_charging:
name: "${device1} charging converter charging"
charging_converter_discharging:
name: "${device1} charging converter discharging"
charging_converter_controller_active:
name: "${device1} charging converter controller active"
charging_converter_current_reduction:
name: "${device1} charging converter current reduction"
charging_converter_aes_active:
name: "${device1} charging converter aes active"
pv_controller_active:
name: "${device1} pv controller active"
pv_current_reduction:
name: "${device1} pv current reduction"
pv_aes_active:
name: "${device1} pv aes active"
sensor:
- platform: votronic_ble
votronic_ble_id: votronic0
# Battery computer
battery_voltage:
name: "${device0} battery voltage"
secondary_battery_voltage:
name: "${device0} secondary battery voltage"
battery_capacity_remaining:
name: "${device0} battery capacity remaining"
state_of_charge:
name: "${device0} state of charge"
current:
name: "${device0} current"
power:
name: "${device0} power"
battery_nominal_capacity:
name: "${device0} battery nominal capacity"
# Solar charger
pv_voltage:
name: "${device0} pv voltage"
pv_current:
name: "${device0} pv current"
battery_status_bitmask:
name: "${device0} battery status bitmask"
pv_controller_status_bitmask:
name: "${device0} pv controller status bitmask"
charged_capacity:
name: "${device0} charged capacity"
charged_energy:
name: "${device0} charged energy"
pv_power:
name: "${device0} pv power"
- platform: votronic
votronic_id: votronic1
battery_voltage:
name: "${device1} battery voltage"
current:
name: "${device1} current"
power:
name: "${device1} power"
battery_status_bitmask:
name: "${device1} battery status bitmask"
charger_current:
name: "${device1} charger current"
charger_power:
name: "${device1} charger power"
charger_load:
name: "${device1} charger load"
charger_controller_temperature:
name: "${device1} charger controller temperature"
charger_mode_setting_id:
name: "${device1} charger mode setting id"
charger_battery_status_bitmask:
name: "${device1} charger battery status bitmask"
charger_controller_status_bitmask:
name: "${device1} charger controller status bitmask"
charging_converter_battery_voltage:
name: "${device1} charging converter battery voltage"
charging_converter_secondary_battery_voltage:
name: "${device1} charging converter secondary battery voltage"
charging_converter_current:
name: "${device1} charging converter current"
charging_converter_power:
name: "${device1} charging converter power"
charging_converter_load:
name: "${device1} charging converter load"
charging_converter_controller_temperature:
name: "${device1} charging converter controller temperature"
charging_converter_mode_setting_id:
name: "${device1} charging converter mode setting id"
charging_converter_battery_status_bitmask:
name: "${device1} charging converter battery status bitmask"
charging_converter_controller_status_bitmask:
name: "${device1} charging converter controller status bitmask"
pv_controller_status_bitmask:
name: "${device1} pv controller status bitmask"
pv_controller_temperature:
name: "${device1} pv controller temperature"
pv_battery_status_bitmask:
name: "${device1} pv battery status bitmask"
pv_voltage:
name: "${device1} pv voltage"
pv_current:
name: "${device1} pv current"
pv_power:
name: "${device1} pv power"
text_sensor:
- platform: votronic_ble
votronic_ble_id: votronic0
battery_status:
name: "${device0} battery status"
pv_controller_status:
name: "${device0} pv controller status"
- platform: votronic
votronic_id: votronic1
battery_status:
name: "${device1} battery status"
charger_mode_setting:
name: "${device1} charger mode setting"
charger_battery_status:
name: "${device1} charger battery status"
charger_controller_status:
name: "${device1} charger controller status"
charging_converter_mode_setting:
name: "${device1} charging converter mode setting"
charging_converter_battery_status:
name: "${device1} charging converter battery status"
charging_converter_controller_status:
name: "${device1} charging converter controller status"
pv_mode_setting:
name: "${device1} pv mode setting"
pv_controller_status:
name: "${device1} pv controller status"
pv_battery_status:
name: "${device1} pv battery status"

View File

@@ -10,9 +10,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -22,6 +23,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG

View File

@@ -7,9 +7,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -19,6 +20,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG

View File

@@ -7,9 +7,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -19,6 +20,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG

View File

@@ -7,9 +7,10 @@ substitutions:
esphome:
name: ${name}
comment: ${device_description}
min_version: 2024.6.0
project:
name: "syssi.esphome-votronic"
version: 3.0.0
version: 3.1.0
esp8266:
board: d1_mini
@@ -19,6 +20,7 @@ wifi:
password: !secret wifi_password
ota:
platform: esphome
logger:
level: DEBUG

View File

@@ -23,7 +23,7 @@ ESPHome component to monitor votronic devices via BLE or Display Link
## Requirements
* [ESPHome 2022.12.0 or higher](https://github.com/esphome/esphome/releases).
* [ESPHome 2024.6.0 or higher](https://github.com/esphome/esphome/releases).
* Generic ESP32 board
## Installation

View File

@@ -22,7 +22,7 @@ ESPHome component to monitor votronic devices via Display Link
## Requirements
* [ESPHome 2022.12.0 or higher](https://github.com/esphome/esphome/releases).
* [ESPHome 2024.6.0 or higher](https://github.com/esphome/esphome/releases).
* A wire with RJ11 western connector
* Generic ESP32 or ESP8266 board