pax_global_header00006660000000000000000000000064150367251120014514gustar00rootroot0000000000000052 comment=3dda47abb393d1883345b7e62b02dbb8b7eeda55 python-stiebel-eltron-0.2.0/000077500000000000000000000000001503672511200157625ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/.devcontainer.json000066400000000000000000000034121503672511200214140ustar00rootroot00000000000000// For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/python { "name": "Python 3", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/vscode/devcontainers/python:3.13", "postCreateCommand": "curl -LsSf https://astral.sh/uv/install.sh | sh && uv sync", // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Configure tool-specific properties. "customizations": { "vscode": { "extensions": [ "ms-python.python", "github.vscode-pull-request-github", "ryanluker.vscode-coverage-gutters", "ms-python.vscode-pylance", "charliermarsh.ruff" ], "settings": { "files.eol": "\n", "editor.tabSize": 4, "editor.formatOnPaste": true, "editor.formatOnSave": true, "editor.formatOnType": false, "files.trimTrailingWhitespace": true, "python.analysis.typeCheckingMode": "basic", "python.analysis.autoImportCompletions": true, "python.defaultInterpreterPath": "/usr/local/bin/python", "[python]": { "editor.defaultFormatter": "charliermarsh.ruff" } } } }, "remoteUser": "vscode", "features": {}, "remoteEnv": { "PATH": "${containerEnv:PATH}:/home/vscode/.local/bin" } }python-stiebel-eltron-0.2.0/.github/000077500000000000000000000000001503672511200173225ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/.github/workflows/000077500000000000000000000000001503672511200213575ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/.github/workflows/release-to-pypi.yml000066400000000000000000000024471503672511200251300ustar00rootroot00000000000000name: Release to PyPI # Trigger the workflow on new tag creation on: push: tags: - 'v*' # Triggers on version tags like v1.0.0, v0.1.1, etc. permissions: contents: read jobs: build-and-publish: runs-on: ubuntu-latest steps: # Check out the repository code - name: Checkout code uses: actions/checkout@v4 # Set up Python environment - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.12' # Install build dependencies - name: Install build dependencies run: | python -m pip install --upgrade pip python -m pip install build twine # Build wheel and source distributions - name: Build distributions run: | python -m build # Verify the distributions were created - name: Verify build artifacts run: | ls -la dist/ echo "Built packages:" ls dist/ # Check the distributions before upload - name: Check distributions run: | python -m twine check dist/* # Upload to PyPI using twine - name: Upload to PyPI env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} run: | python -m twine upload dist/*python-stiebel-eltron-0.2.0/.github/workflows/test-python-package.yml000066400000000000000000000012741503672511200257750ustar00rootroot00000000000000name: Test python package on: push: pull_request: branches: - master permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.12", "3.13"] steps: - uses: actions/checkout@v2 - name: Install uv uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --locked --all-extras --dev - name: Run tests run: | uv run pytest \ -qq \ --durations=10 \ -o console_output_style=count \ -p no:sugar \ test python-stiebel-eltron-0.2.0/.gitignore000066400000000000000000000024001503672511200177460ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ # ------------------------------------------ # Visual Studio Code .vscode/* python-stiebel-eltron-0.2.0/LICENSE000066400000000000000000000020551503672511200167710ustar00rootroot00000000000000MIT License Copyright (c) 2018 Martin Fuchs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. python-stiebel-eltron-0.2.0/MANIFEST.in000066400000000000000000000000311503672511200175120ustar00rootroot00000000000000include README.md LICENSEpython-stiebel-eltron-0.2.0/README.md000066400000000000000000000062171503672511200172470ustar00rootroot00000000000000

# python-stiebel-eltron Python API for interacting with the STIEBEL ELTRON ISG web gateway via modbus for controlling integral ventilation units and heat pumps. This module is based on the STIEBEL ELTRON [modbus user manual](https://www.stiebel-eltron.ch/content/dam/ste/ch/de/downloads/kundenservice/smart-home/Modbus/Modbus%20Bedienungsanleitung.pdf), but is not official, developed, supported or endorsed by Stiebel Eltron GmbH & Co. KG. For questions and other inquiries, use the issue tracker in this repo please. ## Requirements You need to have [Python](https://www.python.org) installed. * STIEBEL ELTRON Internet-Service Gateway [ISG WEB](https://www.stiebel-eltron.com/en/home/products-solutions/renewables/controller_energymanagement/internet_servicegateway/isg_web.html) with enabled [modbus module](https://www.stiebel-eltron.ch/de/home/service/smart-home/modbus.html) * You can call the STIEBEL ELTRON support, if your ISG does not have the modbus module enabled. They upgraded mine for free. * STIEBEL ELTRON heatpumpt (compatible). Successfully used devices: * LWZ504e * LWZ304 * Network connection to the ISG WEB ## Installation The package is available in the [Python Package Index](https://pypi.python.org/). ```bash $ pip install python-stiebel-eltron ``` ## Example usage of the module The sample below shows how to use this Python module (api for wpm heat pumps). ```python from pystiebeleltron.wpm import WpmStiebelEltronAPI, WpmSystemParametersRegisters api = WpmStiebelEltronAPI('IP_ADDRESS_ISG') await api.connect() await api.async_update() print("water comfort target temperature: {}".format(api.get_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE))) await api.close() ``` ## Example usage of the module The sample below shows how to use this Python module (old api for lwz heat pumps). ```python from pystiebeleltron import pystiebeleltron as pyse from pymodbus.client.sync import ModbusTcpClient as ModbusClient client = ModbusClient(host='IP_ADDRESS_ISG', port=502, timeout=2) client.connect() unit = pyse.StiebelEltronAPI(client, 1) unit.update() print("get_target_temp: {}".format(unit.get_target_temp)) client.close() ``` ## License ``python-stiebel-eltron`` is licensed under MIT, for more details check LICENSE. python-stiebel-eltron-0.2.0/api/000077500000000000000000000000001503672511200165335ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/api/README.md000066400000000000000000000010221503672511200200050ustar00rootroot00000000000000# API definition This folder contains the csv files which are describing the registers of the ISG modbus interface. The values in the cvs files are manually copied from the [Stiebel Eltron modbus documentation](https://www.stiebel-eltron.ch/content/dam/ste/ch/de/downloads/kundenservice/smart-home/Modbus/Modbus%20Bedienungsanleitung.pdf). The files can either be manually edited with your Code Editor (e.g. Visual Studio Code) or edited with a spreadsheet editor like LibreOffice or Excel. The encoding of the files is UTF-8. python-stiebel-eltron-0.2.0/api/energy_system_information.csv000066400000000000000000000003401503672511200245470ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 5001,SG READY OPERATING STATE,x,x,x,,1,4,6,,r, 5002,CONTROLLER IDENTIFICATION,x,x,x,,,,6,,, python-stiebel-eltron-0.2.0/api/lwz_energy_data.csv000066400000000000000000000035671503672511200224410ustar00rootroot00000000000000"Modbus Address",Object designation,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/read (w/r),Suffix 3001,HEAT METER HTG DAY,x,x,,0,65535,6,kWh,r, 3002,HEAT METER HTG TTL,x,x,,0,999,6,kWh,r,LOW 3003,HEAT METER HTG TTL,x,x,,0,65535,6,MWh,r,HI 3004,HEAT METER DHW DAY,x,x,,0,65535,6,kWh,r, 3005,HEAT METER DHW TTL,x,x,,0,999,6,kWh,r,LOW 3006,HEAT METER DHW TTL,x,x,,0,65535,6,MWh,r,HI 3007,HEAT M BOOST HTG TTL,x,x,,0,999,6,kWh,r,LOW 3008,HEAT M BOOST HTG TTL,x,x,,0,65535,6,MWh,r,HI 3009,HEAT M BOOST DHW TTL,x,x,,0,999,6,kWh,r,LOW 3010,HEAT M BOOST DHW,x,x,,0,65535,6,MWh,r,HI 3011,HEAT M RECOVERY DAY,x,,,0,65535,6,kWh,r, 3012,HEAT M RECOVERY TTL,x,x,,0,999,6,kWh,r,LOW 3013,HEAT M RECOVERY TTL,x,,,0,65535,6,MWh,r,HI 3014,HM SOLAR HTG DAY,x,,only for LWZ with solar capability,0,65535,6,kWh,r, 3015,HM SOLAR HTG TOTAL,x,,only for LWZ with solar capability,0,999,6,kWh,r,LOW 3016,HM SOLAR HTG TOTAL,x,,only for LWZ with solar capability,0,65535,6,MWh,r,HI 3017,HM SOLAR DHW DAY,x,,only for LWZ with solar capability,0,65535,6,kWh,r, 3018,HM SOLAR DWH TOTAL,x,,only for LWZ with solar capability,0,999,6,kWh,r,LOW 3019,HM SOLAR DWH TOTAL,x,,only for LWZ with solar capability,0,65535,6,MWh,r,HI 3020,HM COOLING TOTAL,x,,only for LWZ with cooling capacity,0,999,6,kWh,r,LOW 3021,HM COOLING TOTAL,x,,only for LWZ with cooling capacity,0,65535,6,MWh,r,HI 3022,PWR CON HTG DAY,x,x,,0,65535,6,kWh,r, 3023,PWR CON HTG TTL,x,x,,0,999,6,kWh,r,LOW 3024,PWR CON HTG TTL,x,x,,0,65535,6,MWh,r,HI 3025,PWR CON DHW DAY,x,x,,0,65535,6,kWh,r, 3026,PWR CON DHW TTL,x,x,,0,999,6,kWh,r,LOW 3027,PWR CON DHW TTL,x,x,,0,65535,6,MWh,r,HI 3028,COMPRESSOR HEATING,x,x,,0,65535,6,h,r, 3029,COMPRESSOR COOLING,x,,only for LWZ with cooling capacity,0,65535,6,h,r, 3030,COMPRESSOR DHW,x,x,,0,65535,6,h,r, 3031,ELEC BOOSTER HEATING,x,x,,0,65535,6,h,r, 3032,ELEC BOOSTER DHW,x,x,,0,65535,6,h,r, python-stiebel-eltron-0.2.0/api/lwz_energy_management_settings.csv000066400000000000000000000003651503672511200255550ustar00rootroot00000000000000Modbus address,Object designation ,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 4001,SWITCH SG READY ON AND OFF,x,x,,0,1,6,,r/w, 4002,SG READY INPUT 1,x,x,,0,1,6,,r/w, 4003,SG READY INPUT 2,x,x,,0,1,6,,r/w, python-stiebel-eltron-0.2.0/api/lwz_energy_system_information.csv000066400000000000000000000003161503672511200254460ustar00rootroot00000000000000Modbus address,Object designation ,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 5001,SG READY OPERATING STATE,x,x,,1,4,6,,r, 5002,CONTROLLER IDENTIFICATION,x,x,,,,6,,r, python-stiebel-eltron-0.2.0/api/lwz_system_parameters.csv000066400000000000000000000035171503672511200237210ustar00rootroot00000000000000"Modbus Address",Object designation,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/read (w/r),Suffix 1001,OPERATING MODE,x,x,,0,14,8,,r/w, 1002,ROOM TEMPERATURE DAY,x,x,"Set room heating, heating circuit 1",10,30,2,°C,r/w,HK1 1003,ROOM TEMPERATURE NIGHT,x,x,"Set room heating, heating circuit 1",10,30,2,°C,r/w,HK1 1004,MANUAL HC SET,x,x,Heating circuit 1,10,65,2,°C,r/w,HK1 1005,ROOM TEMPERATURE DAY,x,x,"Set room heating, heating circuit 2",10,30,2,°C,r/w,HK2 1006,ROOM TEMPERATURE NIGHT,,,"Set room heating, heating circuit 2",10,30,2,°C,r/w,HK2 1007,MANUAL HC SET,,,Heating circuit 2,10,65,2,°C,r/w,HK2 1008,GRADIENT,x,x,Heating curve heating circuit 1,0,5,7,,r/w,HK1 1009,LOW END,x,x,Heating curve heating circuit 1,0,20,2,°C,r/w,HK1 1010,GRADIENT,x,x,Heating curve heating circuit 2,0,5,7,,r/w,HK2 1011,LOW END,x,x,Heating curve heating circuit 2,0,20,2,°C,r/w,HK2 1012,DHW SET DAY,x,x,DHW,10,55,2,°C,r/w, 1013,DHW SET NIGHT,x,x,DHW,10,55,2,°C,r/w, 1014,DHW SET MANUAL,x,x,DHW,10,65,2,°C,r/w, 1015,MWM SET DAY,x,,only for LWZ 504,50,288,6,l,r/w, 1016,MWM SET NIGHT,x,,only for LWZ 504,50,288,6,l,r/w, 1017,MWM SET MANUAL,x,,only for LWZ 504,50,288,6,l,r/w, 1018,DAY STAGE,x,x,Ventilation,0,3,6,,r/w, 1019,NIGHT STAGE,x,x,Ventilation,0,3,6,,r/w, 1020,PARTY STAGE,x,x,Ventilation,0,3,6,,r/w, 1021,MANUAL STAGE,x,x,Ventilation,0,3,6,,r/w, 1022,ROOM TEMPERATURE DAY,x,,"HC 1 cooling, only for LWZ with cooling",10,30,2,°C,r/w,HK1 COOLING 1023,ROOM TEMPERATURE NIGHT,x,,"HC 1 cooling, only for LWZ with cooling",10,30,2,°C,r/w,HK1 COOLING 1024,ROOM TEMPERATURE DAY,x,,"HC 2 cooling, only for LWZ with cooling",10,30,2,°C,r/w,HK2 COOLING 1025,ROOM TEMPERATURE NIGHT,x,,"HC 2 cooling, only for LWZ with cooling",10,30,2,°C,r/w,HK2 COOLING 1026,RESET,x,,only for LWZ 504,0,1,6,,r/w, 1027,RESTART ISG,x,x,,0,2,6,,r/w, python-stiebel-eltron-0.2.0/api/lwz_system_state.csv000066400000000000000000000005551503672511200226750ustar00rootroot00000000000000"Modbus Address",Object designation,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/read (w/r),Suffix 2001,OPERATING STATUS,x,x,bit-coded,0,65535,6,,r, 2002,FAULT STATUS,x,x,System fault,0,1,6,,r, 2003,BUS STATUS,x,x,CAN bus status,-4,0,6,,r, 2004,DEFROST INITIATED,x,x,defrost signal,0,1,6,,r, 2005,OPERATING STATUS 2,x,x,bit-coded,0,65535,6,,r, python-stiebel-eltron-0.2.0/api/lwz_system_values.csv000066400000000000000000000035751503672511200230610ustar00rootroot00000000000000"Modbus Address",Object designation,LWZ,LWA,Comments,Min. value,Max. value,Data type,Unit,Write/read (w/r),Suffix 1,ACTUAL ROOM T HC1,x,x,Remote control value ,-20,60,2,°C,r, 2,SET ROOM TEMPERATURE HC1,x,x,,-20,60,2,°C,r, 3,RELATIVE HUMIDITY HC1,x,x,Remote control value ,0,100,2,%,r, 4,ACTUAL ROOM T HC2,x,x,Remote control value ,-20,60,2,°C,r, 5,SET ROOM TEMPERATURE HC2,x,x,,-20,60,2,°C,r, 6,RELATIVE HUMIDITY HC2,x,x,Remote control value ,0,100,2,%,r, 7,OUTSIDE TEMPERATURE,x,x,,-60,80,2,°C,r, 8,ACTUAL VALUE HC1,x,x,,0,90,2,°C,r, 9,SET VALUE HC1,x,x,,0,65,2,°C,r, 10,ACTUAL VALUE HC2,x,x,,0,90,2,°C,r, 11,SET VALUE HC2,x,x,,0,65,2,°C,r, 12,FLOW TEMPERATURE,x,x,,0,90,2,°C,r, 13,RETURN TEMPERATURE,x,x,,0,90,2,°C,r, 14,PRESSURE HTG CIRC,x,,only for LWZ 304/404/504/Trend,0,6,2,bar,r, 15,FLOW RATE ,x,,only for LWZ 304/404/504/Trend,,,2,l/min,r, 16,ACTUAL DHW T,x,x,,10,65,2,°C,r, 17,DHW SET TEMPERATURE,x,x,,10,65,2,°C,r, 18,VENTILATION AIR ACTUAL FAN SPEED,x,,,0,100,6,Hz,r, 19,VENTILATION AIR SET FLOW RATE,x,,,0,300,6,m³/h,r, 20,EXTRACT AIR ACTUAL FAN SPEED,x,x,,0,100,6,Hz,r, 21,EXTRACT AIR SET FLOW RATE,x,x,,0,300,6,m³/h,r, 22,EXTRACT AIR HUMIDITY,x,,only for LWZ 304/404/504/Trend,0,100,6,%,r, 23,EXTRACT AIR TEMP,x,,only for LWZ 504,0,65535,2,°C,r, 24,EXTRACT AIR DEW POINT,x,,only for LWZ 504,0,65535,2,°C,r, 25,DEW POINT TEMP HC1,x,,only for LWZ with cooling capacity,-40,30,2,°C,r, 26,DEW POINT TEMP HC2,x,,only for LWZ with cooling capacity,-40,30,2,°C,r, 27,COLLECTOR TEMPERATURE,x,,only for LWZ with solar capacity,-60,200,2,°C,r, 28,HOT GAS TEMPERATURE,x,x,,0,140,2,°C,r, 29,HIGH PRESSURE,x,x,,0,50,7,bar,r, 30,LOW PRESSURE,x,x,,0,25,7,bar,r, 31,COMPRESSOR STARTS,x,x,,0,65535,6,,r,HI 32,COMPRESSOR SPEED,x,,only for LWZ 504,0,240,2,Hz,r, 33,MIXED WATER AMOUNT,x,,only for LWZ 504,0,65535,6,l,r, 34,COMPRESSOR STARTS,x,x,,0,65535,6,,r,LOW python-stiebel-eltron-0.2.0/api/wpm_energy_data.csv000066400000000000000000000132631503672511200224220ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 3501,VD HEATING DAY,x,x,x,Amount of heat - all heat pumps,0,65535,6,kWh,r, 3502,VD HEATING TOTAL,x,x,x,Amount of heat - all heat pumps,0,999,6,kWh,r,LOW 3503,VD HEATING TOTAL,x,x,x,Amount of heat - all heat pumps,0,65535,6,MWh,r,HI 3504,VD DHW DAY,x,x,x,Amount of heat - all heat pumps,0,65535,6,kWh,r, 3505,VD DHW TOTAL,x,x,x,Amount of heat - all heat pumps,0,999,6,kWh,r,LOW 3506,VD DHW TOTAL,x,x,x,Amount of heat - all heat pumps,0,65535,6,MWh,r,HI 3507,NHZ HEATING TOTAL,x,x,x,Amount of heat - all heat pumps,0,999,6,kWh,r,LOW 3508,NHZ HEATING TOTAL,x,x,x,Amount of heat - all heat pumps,0,65535,6,MWh,r,HI 3509,NHZ DHW TOTAL,x,x,x,Amount of heat - all heat pumps,0,999,6,kWh,r,LOW 3510,NHZ DHW TOTAL,x,x,x,Amount of heat - all heat pumps,0,65535,6,MWh,r,HI 3511,VD HEATING DAY,x,x,x,Power consumption - all heat pumps,0,65535,6,kWh,r,CONSUMED 3512,VD HEATING TOTAL,x,x,x,Power consumption - all heat pumps,0,999,6,kWh,r,LOW CONSUMED 3513,VD HEATING TOTAL,x,x,x,Power consumption - all heat pumps,0,65535,6,MWh,r,HI CONSUMED 3514,VD DHW DAY,x,x,x,Power consumption - all heat pumps,0,65535,6,kWh,r,CONSUMED 3515,VD DHW TOTAL,x,x,x,Power consumption - all heat pumps,0,999,6,kWh,r,LOW CONSUMED 3516,VD DHW TOTAL,x,x,x,Power consumption - all heat pumps,0,65535,6,MWh,r,HI CONSUMED 3517,VD HEATING,,,x,Runtime,0,999,6,h,r, 3518,VD DHW,,,x,Runtime,0,999,6,h,r, 3519,VD COOLING,,,x,Runtime,0,999,6,h,r, 3520,NHZ 1,,,x,Runtime,0,999,6,h,r, 3521,NHZ 2,,,x,Runtime,0,999,6,h,r, 3522,NHZ 1_2,,,x,Runtime,0,999,6,h,r, 3523,VD HEATING DAY,x,x,,Amount of heat HP 1,0,65535,6,kWh,r,HP 1 3524,VD HEATING TOTAL,x,x,,Amount of heat HP 1,0,999,6,kWh,r,LOW HP 1 3525,VD HEATING TOTAL,x,x,,Amount of heat HP 1,0,65535,6,MWh,r,HI HP 1 3526,VD DHW DAY,x,x,,Amount of heat HP 1,0,65535,6,kWh,r,HP 1 3527,VD DHW TOTAL,x,x,,Amount of heat HP 1,0,999,6,kWh,r,LOW HP 1 3528,VD DHW TOTAL,x,x,,Amount of heat HP 1,0,65535,6,MWh,r,HI HP 1 3529,NHZ HEATING TOTAL,x,x,,Amount of heat HP 1,0,999,6,kWh,r,LOW HP 1 3530,NHZ HEATING TOTAL,x,x,,Amount of heat HP 1,0,65535,6,MWh,r,HI HP 1 3531,NHZ DHW TOTAL,x,x,,Amount of heat HP 1,0,999,6,kWh,r,LOW HP 1 3532,NHZ DHW TOTAL,x,x,,Amount of heat HP 1,0,65535,6,MWh,r,HI HP 1 3533,VD HEATING DAY,x,x,,Power consumption HP 1,0,65535,6,kWh,r,CONSUMED HP 1 3534,VD HEATING TOTAL,x,x,,Power consumption HP 1,0,999,6,kWh,r,LOW CONSUMED HP 1 3535,VD HEATING TOTAL,x,x,,Power consumption HP 1,0,65535,6,MWh,r,HI CONSUMED HP 1 3536,VD DHW DAY,x,x,,Power consumption HP 1,0,65535,6,kWh,r,CONSUMEDHP 1 3537,VD DHW TOTAL,x,x,,Power consumption HP 1,0,999,6,kWh,r,LOW CONSUMED HP 1 3538,VD DHW TOTAL,x,x,,Power consumption HP 1,0,65535,6,MWh,r,HI CONSUMED HP 1 3539,VD 1 HEATING,x,x,,Runtime HP 1,,,6,h,r,HP 1 3540,VD 2 HEATING,x,x,,Runtime HP 1,,,6,h,r,HP 1 3541,VD 1_2 HEATING,x,x,,Runtime HP 1,,,6,h,r,HP 1 3542,VD 1 DHW,x,x,,Runtime HP 1,,,6,h,r,HP 1 3543,VD 2 DHW,x,x,,Runtime HP 1,,,6,h,r,HP 1 3544,VD 1_2 DHW,x,x,,Runtime HP 1,,,6,h,r,HP 1 3545,VD COOLING x,x,x,,Runtime HP 1,,,6,h,r,HP 1 3546,NHZ 1,x,x,,Runtime reheating stage,,,6,h,r,REHEATING 3547,NHZ 2,x,x,,Runtime reheating stage,,,6,h,r,REHEATING 3548,NHZ 1_2,x,x,,Runtime reheating stage,,,6,h,r,REHEATING 3549,VD HEATING DAY,x,x,,Amount of heat HP 2,0,65535,6,kWh,r,HP 2 3550,VD HEATING TOTAL,x,x,,Amount of heat HP 2,0,999,6,kWh,r,LOW HP 2 3551,VD HEATING TOTAL,x,x,,Amount of heat HP 2,0,65535,6,MWh,r,HI HP 2 3552,VD DHW DAY,x,x,,Amount of heat HP 2,0,65535,6,kWh,r,HP 2 3553,VD DHW TOTAL,x,x,,Amount of heat HP 2,0,999,6,kWh,r,LOW HP 2 3554,VD DHW TOTAL,x,x,,Amount of heat HP 2,0,65535,6,MWh,r,HI HP 2 3555,VD HEATING DAY,x,x,,Power consumption HP 2,0,65535,6,kWh,r,CONSUMED HP 2 3556,VD HEATING TOTAL,x,x,,Power consumption HP 2,0,999,6,kWh,r,LOW CONSUMED HP 2 3557,VD HEATING TOTAL,x,x,,Power consumption HP 2,0,65535,6,MWh,r,HI CONSUMED HP 2 3558,VD DHW DAY,x,x,,Power consumption HP 2,0,65535,6,kWh,r,CONSUMED HP 2 3559,VD DHW TOTAL,x,x,,Power consumption HP 2,0,999,6,kWh,r,LOW CONSUMED HP 2 3560,VD DHW TOTAL,x,x,,Power consumption HP 2,0,65535,6,MWh,r,HI CONSUMED HP 2 3561,VD 1 HEATING,x,x,,Runtime HP 2,,,6,h,r,HP 2 3562,VD 2 HEATING,x,x,,Runtime HP 2,,,6,h,r,HP 2 3563,VD 1_2 HEATING,x,x,,Runtime HP 2,,,6,h,r,HP 2 3564,VD 1 DHW,x,x,,Runtime HP 2,,,6,h,r,HP 2 3565,VD 2 DHW,x,x,,Runtime HP 2,,,6,h,r,HP 2 3566,VD 1_2 DHW,x,x,,Runtime HP 2,,,6,h,r,HP 2 3567,VD COOLING,x,x,,Runtime HP 2,,,6,h,r,HP 2 3568,VD HEATING DAY,x,x,,Amount of heat HP 3,0,65535,6,kWh,r,HP 3 3569,VD HEATING TOTAL,x,x,,Amount of heat HP 3,0,999,6,kWh,r,LOW HP 3 3570,VD HEATING TOTAL,x,x,,Amount of heat HP 3,0,65535,6,MWh,r,HI HP 3 3571,VD DHW DAY,x,x,,Amount of heat HP 3,0,65535,6,kWh,r,HP 3 3572,VD DHW TOTAL,x,x,,Amount of heat HP 3,0,999,6,kWh,r,LOW HP 3 3573,VD DHW TOTAL,x,x,,Amount of heat HP 3,0,65535,6,MWh,r,HI HP 3 3574,VD HEATING DAY,x,x,,Power consumption HP 3,0,65535,6,kWh,r,CONSUMED HP 3 3575,VD HEATING TOTAL,x,x,,Power consumption HP 3,0,999,6,kWh,r,LOW CONSUMED HP 3 3576,VD HEATING TOTAL,x,x,,Power consumption HP 3,0,65535,6,MWh,r,HI CONSUMED HP 3 3577,VD DHW DAY,x,x,,Power consumption HP 3,0,65535,6,kWh,r,CONSUMED HP 3 3578,VD DHW TOTAL,x,x,,Power consumption HP 3,0,999,6,kWh,r,LOW CONSUMED HP 3 3579,VD DHW TOTAL,x,x,,Power consumption HP 3,0,65535,6,MWh,r,HI CONSUMED HP 3 3580,VD 1 HEATING,x,x,,Runtime HP 3,,,6,h,r,HP 3 3581,VD 2 HEATING,x,x,,Runtime HP 3,,,6,h,r,HP 3 3582,VD 1_2 HEATING,x,x,,Runtime HP 3,,,6,h,r,HP 3 3583,VD 1 DHW,x,x,,Runtime HP 3,,,6,h,r,HP 3 3584,VD 2 DHW,x,x,,Runtime HP 3,,,6,h,r,HP 3 3585,VD 1_2 DHW,x,x,,Runtime HP 3,,,6,h,r,HP 3 3586,VD COOLING,x,x,,Runtime HP 3,,,6,h,r,HP 3 python-stiebel-eltron-0.2.0/api/wpm_energy_management_settings.csv000066400000000000000000000004121503672511200255350ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 4001,SWITCH SG READY ON AND OFF,x,x,x,,0,1,6,,r/w, 4002,SG READY INPUT 1,x,x,x,,0,1,6,,r/w, 4003,SG READY INPUT 2,x,x,x,,0,1,6,,r/w, python-stiebel-eltron-0.2.0/api/wpm_energy_system_information.csv000066400000000000000000000003411503672511200254330ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 5001,SG READY OPERATING STATE,x,x,x,,1,4,6,,r, 5002,CONTROLLER IDENTIFICATION,x,x,x,,,,6,,r, python-stiebel-eltron-0.2.0/api/wpm_system_parameters.csv000066400000000000000000000030231503672511200237000ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 1501,OPERATING MODE,x,x,x,,0,5,8,,r/w, 1502,COMFORT TEMPERATURE,x,x,x,Heating circuit 1,5,30,2,°C,r/w,HK 1 1503,ECO TEMPERATURE,x,x,x,Heating circuit 1,5,30,2,°C,r/w,HK 1 1504,HEATING CURVE RISE,x,x,x,Heating circuit 1,0,3,7,,r/w,HK 1 1505,COMFORT TEMPERATURE,x,x,x,Heating circuit 2,5,30,2,°C,r/w,HK 2 1506,ECO TEMPERATURE,x,x,x,Heating circuit 2,5,30,2,°C,r/w,HK 2 1507,HEATING CURVE RISE,x,x,x,Heating circuit 2,0,3,7,,r/w,HK 2 1508,FIXED VALUE OPERATION,x,x,x,,20,70,2,°C,r/w, 1509,DUAL MODE TEMP HZG,,x,x,Observe apllication limits,-40,40,2,°C,r/w, 1510,COMFORT TEMPERATURE,x,x,x,DHW,10,60,2,°C,r/w, 1511,ECO TEMPERATURE,x,x,x,DHW,10,60,2,°C,r/w, 1512,DHW STAGES,x,x,x,,0,6,8,,r/w, 1513,DUAL MODE TEMP WW,x,x,x,DHW temperatures,-40,40,2,°C,r/w, 1514,SET FLOW TEMPERATURE,x,x,x,Area cooling,7,25,2,°C,r/w,AREA 1515,FLOW TEMP HYSTERESIS,,x,x,Area cooling,1,5,2,K,r/w,AREA 1516,SET ROOM TEMPERATURE,x,x,x,Area cooling,20,30,2,°C,r/w,AREA 1517,SET FLOW TEMPERATURE,x,x,x,Fan cooling,7,25,2,°C,r/w,FAN 1518,FLOW TEMP HYSTERESIS,,x,x,Fan cooling,1,5,2,K,r/w,FAN 1519,SET ROOM TEMPERATURE,x,x,x,Fan cooling,20,30,2,°C,r/w,FAN 1520,RESET,x,x,x,,1,3,6,,r/w, 1521,RESTART ISG,x,x,x,,0,2,6,,r/w, 1550,COMFORT TEMPERATURE,x,x,x,Heating circuit 1,5,30,2,°C,r/w,HK 3 1551,ECO TEMPERATURE,x,x,x,Heating circuit 1,5,30,2,°C,r/w,HK 3 1552,HEATING CURVE RISE,x,x,x,Heating circuit 1,0,3,7,,r/w,HK 3 python-stiebel-eltron-0.2.0/api/wpm_system_state.csv000066400000000000000000000045041503672511200226620ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 2501,OPERATING STATUS,x,x,x,bit-coded,,,6,,r, 2502,POWER OFF,x,x,x,,,,8,,r, 2503,OPERATING STATUS,,x,,bit-coded,,,6,,r,WPM 3 2504,FAULT STATUS,x,x,x,System fault,0,1,6,,r, 2505,BUS STATUS,x,x,x,,-4,0,6,,r, 2506,DEFROST INITIATED,x,x,,defrost initiated,0,1,6,,r, 2507,ACTIVE ERROR,x,x,x,Fault Number,0,65535,6,,r, 2508,MESSAGE NUMBER,x,,,Message number,0,65535,6,,r, 2509,HEATING CIRCUIT PUMP 1,x,,,WPM Status,0,1,6,,r, 2510,HEATING CIRCUIT PUMP 2,x,,,WPM Status,0,1,6,,r, 2511,HEATING CIRCUIT PUMP 3,x,,,WPM Status,0,1,6,,r, 2512,BUFFER CHARGING PUMP 1,x,,,WPM Status,0,1,6,,r, 2513,BUFFER CHARGING PUMP 2,x,,,WPM Status,0,1,6,,r, 2514,DHW CHARGING PUMP,x,,,WPM Status,0,1,6,,r, 2515,SOURCE PUMP,x,,,WPM Status,0,1,6,,r, 2516,FAULT OUTPUT,x,,,WPM Status,0,1,6,,r, 2517,DHW CIRCULATION PUMP,x,,,WPM Status,0,1,6,,r, 2518,WE 2 DHW,x,,,WPM Status,0,1,6,,r, 2519,WE 2 HEATING,x,,,WPM Status,0,1,6,,r, 2520,COOLING MODE,x,,,WPM Status,0,1,6,,r, 2521,MIXER OPEN HC2,x,,,WPM Status,0,1,6,,r, 2522,MIXER CLOSE HC2,x,,,WPM Status,0,1,6,,r, 2523,MIXER OPEN HC3,x,,,WPM Status,0,1,6,,r, 2524,MIXER CLOSE HC3,x,,,WPM Status,0,1,6,,r, 2525,NHZ 1 ,x,,,WPM Status,0,1,6,,r, 2526,NHZ 2,x,,,WPM Status,0,1,6,,r, 2527,NHZ 1 2,x,,,WPM Status,0,1,6,,r, 2528,HEATING CIRCUIT PUMP 4,x,,,WPM Status,0,1,6,,r, 2529,HEATING CIRCUIT PUMP 5,x,,,WPM Status,0,1,6,,r, 2530,BUFFER CHARGING PUMP 3,x,,,WPM Status,0,1,6,,r, 2531,BUFFER CHARGING PUMP 4,x,,,WPM Status,0,1,6,,r, 2532,BUFFER CHARGING PUMP 5,x,,,WPM Status,0,1,6,,r, 2533,BUFFER CHARGING PUMP 6,x,,,WPM Status,0,1,6,,r, 2534,DIFF CONTROLLER PUMP 1,x,,,WPM Status,0,1,6,,r, 2535,DIFF CONTROLLER PUMP 2,x,,,WPM Status,0,1,6,,r, 2536,POOL PUMP PRIMARY,x,,,WPM Status,0,1,6,,r, 2537,POOL PUMP SECONDARY,x,,,WPM Status,0,1,6,,r, 2538,MIXER OPEN HC4,x,,,WPM Status,0,1,6,,r, 2539,MIXER CLOSE HC4,x,,,WPM Status,0,1,6,,r, 2540,MIXER OPEN HC5,x,,,WPM Status,0,1,6,,r, 2541,MIXER CLOSE HC5,x,,,WPM Status,0,1,6,,r, 2542,COMPRESSOR 1,x,,,WPM Status,0,1,6,,r, 2543,COMPRESSOR 2,x,,,WPM Status,0,1,6,,r, 2544,COMPRESSOR 3,x,,,WPM Status,0,1,6,,r, 2545,COMPRESSOR 4,x,,,WPM Status,0,1,6,,r, 2546,COMPRESSOR 5,x,,,WPM Status,0,1,6,,r, 2547,COMPRESSOR 6,x,,,WPM Status,0,1,6,,r, python-stiebel-eltron-0.2.0/api/wpm_system_values.csv000066400000000000000000000150541503672511200230430ustar00rootroot00000000000000Modbus address,Object designation ,WPMsystem,WPM 3,WPM 3i,Comments,Min. value,Max. value,Data type,Unit,Write/ read (w/r),Suffix 501,ACTUAL TEMPERATURE FE7,x,x,x,,,,2,°C,r, 502,SET TEMPERATURE FE7,x,x,x,,,,2,°C,r, 503,ACTUAL TEMPERATURE FEK,,x,x,,,,2,°C,r, 504,SET TEMPERATURE FEK,,x,x,,,,2,°C,r, 505,RELATIVE HUMIDITY,,x,x,,,,2,%,r, 506,DEW POINT TEMPERATURE,,x,x,,-40,30,2,°C,r, 507,OUTSIDE TEMPERATURE,x,x,x,,-60,80,2,°C,r, 508,ACTUAL TEMPERATURE HK 1,x,x,x,,0,40,2,°C,r, 509,SET TEMPERATURE HK 1,,,x,,0,65,2,°C,r,WPM3I 510,SET TEMPERATURE HK 1,x,x,,,0,40,2,°C,r, 511,ACTUAL TEMPERATURE HK 2,x,x,x,,0,90,2,°C,r, 512,SET TEMPERATURE HK 2,x,x,x,,0,65,2,°C,r, 513,ACTUAL FLOW TEMPERATURE WP,x,x,x,"MFG, if available",,,2,°C,r, 514,ACTUAL FLOW TEMPERATURE NHZ,x,x,x,"MFG, if available",,,2,°C,r, 515,ACTUAL FLOW TEMPERATURE,x,x,x,,,,2,°C,r, 516,ACTUAL RETURN TEMPERATURE,x,x,x,,0,90,2,°C,r, 517,SET FIXED TEMPERATURE,x,x,x,,20,50,2,°C,r, 518,ACTUAL BUFFER TEMPERATURE,x,x,x,,0,90,2,°C,r, 519,SET BUFFER TEMPERATURE,x,x,x,,,,2,°C,r, 520,HEATING PRESSURE,x,x,x,,,,7,bar,r, 521,FLOW RATE,x,x,x,,,,7,l/min,r, 522,ACTUAL TEMPERATURE DHW,x,x,x,DHW,10,65,2,°C,r, 523,SET TEMPERATURE DHW,x,x,x,DHW,10,65,2,°C,r, 524,ACTUAL TEMPERATURE FAN,x,x,x,Cooling,,,2,K,r, 525,SET TEMPERATURE FAN,x,x,x,Cooling,7,25,2,K,r, 526,ACTUAL TEMPERATURE AREA,x,x,x,Cooling,,,2,K,r, 527,SET TEMPERATURE AREA,x,x,x,Cooling,,,2,K,r, 528,COLLECTOR TEMPERATURE,,x,,Solar thermal,0,90,2,°C,r, 529,CYLINDER TEMPERATURE,,x,,Solar thermal,0,90,2,°C,r, 530,RUNTIME,,x,,,,,6,h,r, 531,ACTUAL TEMPERATURE EXTERNAL,x,x,,External heat source,10,90,2,°C,r, 532,SET TEMPERATURE EXTERNAL,x,x,,External heat source,,,2,K,r, 533,APPLICATION LIMIT HZG,x,x,x,Lower heating limit,-40,40,2,°C,r, 534,APPLICATION LIMIT WW,x,x,x,Lower DHW limit,-40,40,2,°C,r, 535,RUNTIME,x,x,,External heat source,,,6,h,r,EHS 536,SOURCE TEMPERATURE,x,x,x,,,,2,°C,r, 537,MIN SOURCE TEMPERATURE,x,x,x,,-10,10,2,°C,r, 538,SOURCE PRESSURE,x,x,x,,,,7,bar,r, 539,HOT GAS TEMPERATURE,,,x,,,,2,°C,r, 540,HIGH PRESSURE,,,x,,,,2,bar,r, 541,LOW PRESSURE,,,x,,,,2,bar,r, 542,RETURN TEMPERATURE,x,x,,Heat pump 1,,,2,°C,r,HP1 543,FLOW TEMPERATURE,x,x,,Heat pump 1,,,2,°C,r,HP1 544,HOT GAS TEMPERATURE,x,x,,Heat pump 1,,,2,°C,r,HP1 545,LOW PRESSURE,x,x,,Heat pump 1,,,7,bar,r,HP1 546,MEAN PRESSURE,x,x,,Heat pump 1,,,7,bar,r,HP1 547,HIGH PRESSURE,x,x,,Heat pump 1,,,7,bar,r,HP1 548,WP WATER FLOW RATE,x,x,,Heat pump 1,,,2,l/min,r,HP1 549,RETURN TEMPERATURE,x,x,,Heat pump 2,,,2,°C,r,HP2 550,FLOW TEMPERATURE,x,x,,Heat pump 2,,,2,°C,r,HP2 551,HOT GAS TEMPERATURE,x,x,,Heat pump 2,,,2,°C,r,HP2 552,LOW PRESSURE,x,x,,Heat pump 2,,,7,bar,r,HP2 553,MEAN PRESSURE,x,x,,Heat pump 2,,,7,bar,r,HP2 554,HIGH PRESSURE,x,x,,Heat pump 2,,,7,bar,r,HP2 555,WP WATER FLOW RATE,x,x,,Heat pump 2,,,2,l/min,r,HP2 556,RETURN TEMPERATURE,x,x,,Heat pump 3,,,2,°C,r,HP3 557,FLOW TEMPERATURE,x,x,,Heat pump 3,,,2,°C,r,HP3 558,HOT GAS TEMPERATURE,x,x,,Heat pump 3,,,2,°C,r,HP3 559,LOW PRESSURE,x,x,,Heat pump 3,,,7,bar,r,HP3 560,MEAN PRESSURE,x,x,,Heat pump 3,,,7,bar,r,HP3 561,HIGH PRESSURE,x,x,,Heat pump 3,,,7,bar,r,HP3 562,WP WATER FLOW RATE,x,x,,Heat pump 3,,,2,l/min,r,HP3 563,RETURN TEMPERATURE,x,x,,Heat pump 4,,,2,°C,r,HP4 564,FLOW TEMPERATURE,x,x,,Heat pump 4,,,2,°C,r,HP4 565,HOT GAS TEMPERATURE,x,x,,Heat pump 4,,,2,°C,r,HP4 566,LOW PRESSURE,x,x,,Heat pump 4,,,7,bar,r,HP4 567,MEAN PRESSURE,x,x,,Heat pump 4,,,7,bar,r,HP4 568,HIGH PRESSURE,x,x,,Heat pump 4,,,7,bar,r,HP4 569,WP WATER FLOW RATE,x,x,,Heat pump 4,,,2,l/min,r,HP4 570,RETURN TEMPERATURE,x,x,,Heat pump 5,,,2,°C,r,HP5 571,FLOW TEMPERATURE,x,x,,Heat pump 5,,,2,°C,r,HP5 572,HOT GAS TEMPERATURE,x,x,,Heat pump 5,,,2,°C,r,HP5 573,LOW PRESSURE,x,x,,Heat pump 5,,,7,bar,r,HP5 574,MEAN PRESSURE,x,x,,Heat pump 5,,,7,bar,r,HP5 575,HIGH PRESSURE,x,x,,Heat pump 5,,,7,bar,r,HP5 576,WP WATER RATE,x,x,,Heat pump 5,,,2,l/min,r,HP5 577,RETURN TEMPERATURE,x,x,,Heat pump 6,,,2,°C,r,HP6 578,FLOW TEMPERATURE,x,x,,Heat pump 6,,,2,°C,r,HP6 579,HOT GAS,x,x,,Heat pump 6,,,2,°C,r,HP6 580,LOW PRESSURE,x,x,,Heat pump 6,,,7,bar,r,HP6 581,MEAN PRESSURE,x,x,,Heat pump 6,,,7,bar,r,HP6 582,HIGH PRESSURE,x,x,,Heat pump 6,,,7,bar,r,HP6 583,WP WATER FLOW RATE,x,x,,Heat pump 6,,,2,l/min,r,HP6 584,ACTUAL TEMPERATURE,x,,,"Room temperature, heating circuit 1",,,2,°C,r,ROOM TEMP HC1 585,SET TEMPERATURE,x,,,"Room temperature, heating circuit 1",,,2,°C,r,ROOM TEMP HC1 586,RELATIVE HUMIDITY,x,,,"Room temperature, heating circuit 1",,,2,%,r,ROOM TEMP HC1 587,DEW POINT TEMPERATURE,x,,,"Room temperature, heating circuit 1",,,2,°C,r,ROOM TEMP HC1 588,ACTUAL TEMPERATURE,x,,,"Room temperature, heating circuit 2",,,2,°C,r,ROOM TEMP HC2 589,SET TEMPERATURE,x,,,"Room temperature, heating circuit 2",,,2,°C,r,ROOM TEMP HC2 590,RELATIVE HUMIDITY,x,,,"Room temperature, heating circuit 2",,,2,%,r,ROOM TEMP HC2 591,DEW POINT TEMPERATURE,x,,,"Room temperature, heating circuit 2",,,2,°C,r,ROOM TEMP HC2 592,ACTUAL TEMPERATURE,x,,,"Room temperature, heating circuit 3",,,2,°C,r,ROOM TEMP HC3 593,SET TEMPERATURE,x,,,"Room temperature, heating circuit 3",,,2,°C,r,ROOM TEMP HC3 594,RELATIVE HUMIDITY,x,,,"Room temperature, heating circuit 3",,,2,%,r,ROOM TEMP HC3 595,DEW POINT TEMPERATURE,x,,,"Room temperature, heating circuit 3",,,2,°C,r,ROOM TEMP HC3 596,ACTUAL TEMPERATURE,x,,,"Room temperature, heating circuit 4",,,2,°C,r,ROOM TEMP HC4 597,SET TEMPERATURE,x,,,"Room temperature, heating circuit 4",,,2,°C,r,ROOM TEMP HC4 598,RELATIVE HUMIDITY,x,,,"Room temperature, heating circuit 4",,,2,%,r,ROOM TEMP HC4 599,DEW POINT TEMPERATURE,x,,,"Room temperature, heating circuit 4",,,2,°C,r,ROOM TEMP HC4 600,ACTUAL TEMPERATURE,x,,,"Room temperature, heating circuit 5",,,2,°C,r,ROOM TEMP HC5 601,SET TEMPERATURE,x,,,"Room temperature, heating circuit 5",,,2,°C,r,ROOM TEMP HC5 602,RELATIVE HUMIDITY,x,,,"Room temperature, heating circuit 5",,,2,%,r,ROOM TEMP HC5 603,DEW POINT TEMPERATURE,x,,,"Room temperature, heating circuit 5",,,2,°C,r,ROOM TEMP HC5 604,SET TEMPERATURE,x,,,"Room temperature, cooling circuit 1",,,2,°C,r,ROOM TEMP COOLING1 605,SET TEMPERATURE,x,,,"Room temperature, cooling circuit 2",,,2,°C,r,ROOM TEMP COOLING2 606,SET TEMPERATURE,x,,,"Room temperature, cooling circuit 3",,,2,°C,r,ROOM TEMP COOLING3 607,SET TEMPERATURE,x,,,"Room temperature, cooling circuit 4",,,2,°C,r,ROOM TEMP COOLING4 608,SET TEMPERATURE,x,,,"Room temperature, cooling circuit 5",,,2,°C,r,ROOM TEMP COOLING5 609,ACTUAL TEMPERATURE HK 3,x,,,,0,90,2,°C,r, 610,SET TEMPERATURE HK 3,x,,,,0,65,2,°C,r, python-stiebel-eltron-0.2.0/example.py000077500000000000000000000031311503672511200177700ustar00rootroot00000000000000#!/usr/bin/env python3 import time from pystiebeleltron import pystiebeleltron as pyse from pymodbus.client import ModbusTcpClient as ModbusClient host_ip = "192.168.1.20" host_port = 502 slave = 1 def test_function(mod, fun): """Executes the given function on the Stiebel Heatpump and prints the result.""" result = getattr(mod, fun) # Executes function directly, instead of giving back the function reference print("{}: {}".format(str(fun), str(result))) def execute_tests(unit): """Execute the provided tests.""" test_function(unit, "get_current_temp") test_function(unit, "get_current_humidity") test_function(unit, "get_target_temp") test_function(unit, "get_operation") test_function(unit, "get_filter_alarm_status") test_function(unit, "get_heating_status") test_function(unit, "get_cooling_status") # Test set_target_temp print("Setting temperature to 20.0") current_temp = unit.get_target_temp unit.set_target_temp(20.0) time.sleep(3) unit.update() mod_temp = unit.get_target_temp if mod_temp != 20.0: print("unit.set_target_temp failed!") if mod_temp != current_temp: unit.set_target_temp(current_temp) time.sleep(3) unit.update() print("get_target_temp: {}".format(unit.get_target_temp)) def main(): client = ModbusClient(host=host_ip, port=host_port, timeout=2) client.connect() unit = pyse.StiebelEltronAPI(client, slave) unit.update() execute_tests(unit) client.close() if __name__ == "__main__": main() python-stiebel-eltron-0.2.0/pyproject.toml000066400000000000000000000021661503672511200207030ustar00rootroot00000000000000[project] name = "pystiebeleltron" dynamic = ["version"] description = "Python API for interacting with the Stiebel Eltron ISG web gateway via Modbus for controlling integral ventilation units and heat pumps." readme = "README.md" authors = [ { name = "Manuel Stahl"}, { name = "'Martin Fuchs"} ] license = { file = "LICENSE" } classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] requires-python = ">=3.10,<3.14" dependencies = [ "pymodbus>=3.8.3", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [dependency-groups] dev = [ "jinja2>=3.1.6", "pytest>=8.3.5", "pytest-asyncio>=0.26.0", "pytest-mock>=3.14.0", "ruff>=0.9.6", ] [tool.hatch.build.targets.sdist] packages = ["pystiebeleltron"] [tool.hatch.build.targets.wheel] packages = ["pystiebeleltron"] [tool.hatch.version] path = "pystiebeleltron/__init__.py" [tool.ruff] line-length = 200 [tool.pytest.ini_options] pythonpath = [ ".", "src" ] testpaths = [ "test" ] python-stiebel-eltron-0.2.0/pystiebeleltron/000077500000000000000000000000001503672511200212065ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/pystiebeleltron/__init__.py000066400000000000000000000262321503672511200233240ustar00rootroot00000000000000import asyncio import logging from enum import Enum from dataclasses import dataclass from pymodbus.client import AsyncModbusTcpClient __version__ = "0.2.0" _LOGGER: logging.Logger = logging.getLogger(__package__) ENERGY_DATA_BLOCK_NAME = "Energy Data" VIRTUAL_REGISTER_OFFSET = 100000 VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET = 200000 class IsgRegisters(Enum): """ISG Register base class.""" class IsgRegistersNone(IsgRegisters): """Dummy registers.""" NONE = -1 class EnergyManagementSettingsRegisters(IsgRegisters): """Energy Management settings registers.""" SWITCH_SG_READY_ON_AND_OFF = 4001 SG_READY_INPUT_1 = 4002 SG_READY_INPUT_2 = 4003 class EnergySystemInformationRegisters(IsgRegisters): """Energy Management information registers.""" SG_READY_OPERATING_STATE = 5001 CONTROLLER_IDENTIFICATION = 5002 @dataclass class ModbusRegister: """Register data class.""" address: int name: str unit: str min: float | None max: float | None data_type: int key: IsgRegisters @property def is_virtual_register(self) -> bool: """Registers with an address above""" return self.address > VIRTUAL_REGISTER_OFFSET class RegisterType(Enum): """Register type enum.""" INPUT_REGISTER = 1 HOLDING_REGISTER = 2 @dataclass class ModbusRegisterBlock: """Register block data class.""" base_address: int count: int name: str registers: dict register_type: RegisterType ENERGY_MANAGEMENT_SETTINGS_REGISTERS = { EnergyManagementSettingsRegisters.SWITCH_SG_READY_ON_AND_OFF: ModbusRegister( address=4001, name="SWITCH SG READY ON AND OFF", unit="", min=0.0, max=1.0, data_type=6, key=EnergyManagementSettingsRegisters.SWITCH_SG_READY_ON_AND_OFF ), EnergyManagementSettingsRegisters.SG_READY_INPUT_1: ModbusRegister( address=4002, name="SG READY INPUT 1", unit="", min=0.0, max=1.0, data_type=6, key=EnergyManagementSettingsRegisters.SG_READY_INPUT_1 ), EnergyManagementSettingsRegisters.SG_READY_INPUT_2: ModbusRegister( address=4003, name="SG READY INPUT 2", unit="", min=0.0, max=1.0, data_type=6, key=EnergyManagementSettingsRegisters.SG_READY_INPUT_2 ), } ENERGY_SYSTEM_INFORMATION_REGISTERS = { EnergySystemInformationRegisters.SG_READY_OPERATING_STATE: ModbusRegister( address=5001, name="SG READY OPERATING STATE", unit="", min=1.0, max=4.0, data_type=6, key=EnergySystemInformationRegisters.SG_READY_OPERATING_STATE ), EnergySystemInformationRegisters.CONTROLLER_IDENTIFICATION: ModbusRegister( address=5002, name="CONTROLLER IDENTIFICATION", unit="", min=None, max=None, data_type=6, key=EnergySystemInformationRegisters.CONTROLLER_IDENTIFICATION ), } def get_register_descriptor(descriptors: list[ModbusRegister], address: int) -> ModbusRegister | None: """Find the descriptor with a given address.""" for descriptor in descriptors: if descriptor.address == address: return descriptor return None class StiebelEltronModbusError(Exception): """Exception during modbus communication.""" def __init(self) -> None: """Initialize the error.""" super().__init__("Data error on the modbus") class ControllerModel(Enum): """Controller model.""" LWZ = 103 LWZ_x04_SOL = 104 WPM_3 = 390 WPM_3i = 391 WPMsystem = 449 async def get_controller_model(host, port) -> ControllerModel: """Read the model of the controller. LWA and LWZ controllers have model ids 103 and 104. WPM controllers have 390, 391 or 449. """ client = AsyncModbusTcpClient(host=host, port=port) try: await client.connect() inverter_data = await client.read_input_registers( address=5001, count=1, slave=1, ) if not inverter_data.isError(): value = client.convert_from_registers(inverter_data.registers, client.DATATYPE.UINT16) if isinstance(value, int): return ControllerModel(value) raise StiebelEltronModbusError finally: client.close() class StiebelEltronAPI: """Stiebel Eltron API.""" def __init__( self, register_blocks: list[ModbusRegisterBlock], host: str, port: int = 502, slave: int = 1, ) -> None: """Initialize Stiebel Eltron communication.""" self._slave = slave self._lock = asyncio.Lock() self._host = host self._client: AsyncModbusTcpClient = AsyncModbusTcpClient(host=host, port=port) self._lock = asyncio.Lock() self._register_blocks = register_blocks self._data = {} self._previous_data = {} self._modbus_data = {} # store raw data from modbus for debug purpose async def close(self) -> None: """Disconnect client.""" _LOGGER.debug("Closing connection to %s", self._host) async with self._lock: self._client.close() async def connect(self) -> None: """Connect client.""" _LOGGER.debug("Connecting to %s", self._host) async with self._lock: await self._client.connect() @property def is_connected(self) -> bool: """Check modbus client connection status.""" if self._client is None: return False return self._client.connected @property def host(self) -> str: """Return the host address of the Stiebel Eltron ISG.""" return self._host def get_register_descriptor(self, register: IsgRegisters) -> ModbusRegister | None: """Get the descriptor of a register.""" for registerblock in self._register_blocks: descriptor = get_register_descriptor( list(registerblock.registers.values()), register.value, ) if descriptor is not None: return descriptor return None def get_register_value(self, register: IsgRegisters) -> float: """Get a value form the registers. The async_udpate needs to be called first.""" return self._data[register] def has_register_value(self, register: IsgRegisters) -> bool: """Check if a value for the registers has been read. The async_udpate needs to be called first.""" return register in self._data and self._data[register] is not None async def write_register_value(self, register: IsgRegisters, value: int | float) -> None: """Writes a modbus register.""" descriptor = self.get_register_descriptor(register) if descriptor is not None: async with self._lock: await self._client.write_register(descriptor.address - 1, value=self.convert_value_to_modbus(value, descriptor), slave=1) else: raise ValueError("invalid register") async def read_input_registers(self, slave, address, count): """Read input registers.""" _LOGGER.debug(f"Reading {count} input registers from {address} with slave {slave}") async with self._lock: return await self._client.read_input_registers(address, count=count, slave=slave) async def read_holding_registers(self, slave, address, count): """Read holding registers.""" _LOGGER.debug(f"Reading {count} holding registers from {address} with slave {slave}") async with self._lock: return await self._client.read_holding_registers(address, count=count, slave=slave) def convert_value_from_modbus(self, register, register_description: ModbusRegister) -> float | int | None: """Convert a modbus value to a python value.""" if register_description.data_type == 2: value = self._client.convert_from_registers([register], self._client.DATATYPE.INT16) if isinstance(value, int): if value == -32768: return None return float(value) * 0.1 elif register_description.data_type == 6: value = self._client.convert_from_registers([register], self._client.DATATYPE.UINT16) if isinstance(value, int): if value == 32768: return None return value elif register_description.data_type == 7: value = self._client.convert_from_registers([register], self._client.DATATYPE.INT16) if isinstance(value, int): if value == -32768: return None return value * 0.01 elif register_description.data_type == 8: value = self._client.convert_from_registers([register], self._client.DATATYPE.UINT16) if isinstance(value, int): if value == 32768: return None return value raise ValueError("invalid register.") def convert_value_to_modbus(self, value: int | float, register_description: ModbusRegister) -> int: """Convert a modbus value to a python value.""" if register_description.data_type == 2: register = self._client.convert_to_registers([int(value * 10)], self._client.DATATYPE.INT16) return register[0] elif register_description.data_type == 6: register = self._client.convert_to_registers([int(value)], self._client.DATATYPE.UINT16) return register[0] elif register_description.data_type == 7: register = self._client.convert_to_registers([int(value * 100)], self._client.DATATYPE.INT16) return register[0] elif register_description.data_type == 8: register = self._client.convert_to_registers([int(value)], self._client.DATATYPE.UINT16) return register[0] else: raise ValueError("invalid register type") async def async_update(self): """Request current values from heat pump.""" result: dict = {} for registerblock in self._register_blocks: heat_pump_data = None if registerblock.register_type == RegisterType.INPUT_REGISTER: heat_pump_data = await self.read_input_registers( slave=self._slave, address=registerblock.base_address, count=registerblock.count, ) elif registerblock.register_type == RegisterType.HOLDING_REGISTER: heat_pump_data = await self.read_holding_registers( slave=self._slave, address=registerblock.base_address, count=registerblock.count, ) if heat_pump_data is not None and not heat_pump_data.isError(): self._modbus_data[registerblock.name] = heat_pump_data for i in range(0, registerblock.count): descriptor = get_register_descriptor( list(registerblock.registers.values()), i + registerblock.base_address + 1, ) if descriptor is not None: result[descriptor.key] = self.convert_value_from_modbus(heat_pump_data.registers[i], descriptor) else: self._modbus_data[registerblock.name] = None self._previous_data = self._data self._data = result python-stiebel-eltron-0.2.0/pystiebeleltron/lwz.py000066400000000000000000000736041503672511200224060ustar00rootroot00000000000000"""Modbus api for stiebel eltron heat pumps. This file is generated. Do not modify it manually.""" from enum import Enum from . import ( ModbusRegister, ModbusRegisterBlock, StiebelEltronAPI, IsgRegisters, RegisterType, ENERGY_DATA_BLOCK_NAME, VIRTUAL_REGISTER_OFFSET, VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET, ENERGY_MANAGEMENT_SETTINGS_REGISTERS, ENERGY_SYSTEM_INFORMATION_REGISTERS, ) class LwzSystemValuesRegisters(IsgRegisters): ACTUAL_ROOM_T_HC1 = 1 SET_ROOM_TEMPERATURE_HC1 = 2 RELATIVE_HUMIDITY_HC1 = 3 ACTUAL_ROOM_T_HC2 = 4 SET_ROOM_TEMPERATURE_HC2 = 5 RELATIVE_HUMIDITY_HC2 = 6 OUTSIDE_TEMPERATURE = 7 ACTUAL_VALUE_HC1 = 8 SET_VALUE_HC1 = 9 ACTUAL_VALUE_HC2 = 10 SET_VALUE_HC2 = 11 FLOW_TEMPERATURE = 12 RETURN_TEMPERATURE = 13 PRESSURE_HTG_CIRC = 14 FLOW_RATE = 15 ACTUAL_DHW_T = 16 DHW_SET_TEMPERATURE = 17 VENTILATION_AIR_ACTUAL_FAN_SPEED = 18 VENTILATION_AIR_SET_FLOW_RATE = 19 EXTRACT_AIR_ACTUAL_FAN_SPEED = 20 EXTRACT_AIR_SET_FLOW_RATE = 21 EXTRACT_AIR_HUMIDITY = 22 EXTRACT_AIR_TEMP = 23 EXTRACT_AIR_DEW_POINT = 24 DEW_POINT_TEMP_HC1 = 25 DEW_POINT_TEMP_HC2 = 26 COLLECTOR_TEMPERATURE = 27 HOT_GAS_TEMPERATURE = 28 HIGH_PRESSURE = 29 LOW_PRESSURE = 30 COMPRESSOR_STARTS_HI = 31 COMPRESSOR_SPEED = 32 MIXED_WATER_AMOUNT = 33 COMPRESSOR_STARTS_LOW = 34 COMPRESSOR_STARTS = 100032 class LwzSystemParametersRegisters(IsgRegisters): OPERATING_MODE = 1001 ROOM_TEMPERATURE_DAY_HK1 = 1002 ROOM_TEMPERATURE_DAY_AND_TOTAL_HK1 = 201003 ROOM_TEMPERATURE_NIGHT_HK1 = 1003 MANUAL_HC_SET_HK1 = 1004 ROOM_TEMPERATURE_DAY_HK2 = 1005 ROOM_TEMPERATURE_DAY_AND_TOTAL_HK2 = 201006 ROOM_TEMPERATURE_NIGHT_HK2 = 1006 MANUAL_HC_SET_HK2 = 1007 GRADIENT_HK1 = 1008 LOW_END_HK1 = 1009 GRADIENT_HK2 = 1010 LOW_END_HK2 = 1011 DHW_SET_DAY = 1012 DHW_SET_DAY_AND_TOTAL = 201013 DHW_SET_NIGHT = 1013 DHW_SET_MANUAL = 1014 MWM_SET_DAY = 1015 MWM_SET_DAY_AND_TOTAL = 201016 MWM_SET_NIGHT = 1016 MWM_SET_MANUAL = 1017 DAY_STAGE = 1018 NIGHT_STAGE = 1019 PARTY_STAGE = 1020 MANUAL_STAGE = 1021 ROOM_TEMPERATURE_DAY_HK1_COOLING = 1022 ROOM_TEMPERATURE_DAY_AND_TOTAL_HK1_COOLING = 201023 ROOM_TEMPERATURE_NIGHT_HK1_COOLING = 1023 ROOM_TEMPERATURE_DAY_HK2_COOLING = 1024 ROOM_TEMPERATURE_DAY_AND_TOTAL_HK2_COOLING = 201025 ROOM_TEMPERATURE_NIGHT_HK2_COOLING = 1025 RESET = 1026 RESTART_ISG = 1027 class LwzSystemStateRegisters(IsgRegisters): OPERATING_STATUS = 2001 FAULT_STATUS = 2002 BUS_STATUS = 2003 DEFROST_INITIATED = 2004 OPERATING_STATUS_2 = 2005 class LwzEnergyDataRegisters(IsgRegisters): HEAT_METER_HTG_DAY = 3001 HEAT_METER_HTG_DAY_AND_TOTAL = 203002 HEAT_METER_HTG_TTL_LOW = 3002 HEAT_METER_HTG_TTL = 103002 HEAT_METER_HTG_TTL_HI = 3003 HEAT_METER_DHW_DAY = 3004 HEAT_METER_DHW_DAY_AND_TOTAL = 203005 HEAT_METER_DHW_TTL_LOW = 3005 HEAT_METER_DHW_TTL = 103005 HEAT_METER_DHW_TTL_HI = 3006 HEAT_M_BOOST_HTG_TTL_LOW = 3007 HEAT_M_BOOST_HTG_TTL = 103007 HEAT_M_BOOST_HTG_TTL_HI = 3008 HEAT_M_BOOST_DHW_TTL_LOW = 3009 HEAT_M_BOOST_DHW_TTL = 103009 HEAT_M_BOOST_DHW_HI = 3010 HEAT_M_RECOVERY_DAY = 3011 HEAT_M_RECOVERY_DAY_AND_TOTAL = 203012 HEAT_M_RECOVERY_TTL_LOW = 3012 HEAT_M_RECOVERY_TTL = 103012 HEAT_M_RECOVERY_TTL_HI = 3013 HM_SOLAR_HTG_DAY = 3014 HM_SOLAR_HTG_DAY_AND_TOTAL = 203015 HM_SOLAR_HTG_TOTAL_LOW = 3015 HM_SOLAR_HTG_TOTAL = 103015 HM_SOLAR_HTG_TOTAL_HI = 3016 HM_SOLAR_DHW_DAY = 3017 HM_SOLAR_DHW_DAY_AND_TOTAL = 203018 HM_SOLAR_DWH_TOTAL_LOW = 3018 HM_SOLAR_DWH_TOTAL = 103018 HM_SOLAR_DWH_TOTAL_HI = 3019 HM_COOLING_TOTAL_LOW = 3020 HM_COOLING_TOTAL = 103020 HM_COOLING_TOTAL_HI = 3021 PWR_CON_HTG_DAY = 3022 PWR_CON_HTG_DAY_AND_TOTAL = 203023 PWR_CON_HTG_TTL_LOW = 3023 PWR_CON_HTG_TTL = 103023 PWR_CON_HTG_TTL_HI = 3024 PWR_CON_DHW_DAY = 3025 PWR_CON_DHW_DAY_AND_TOTAL = 203026 PWR_CON_DHW_TTL_LOW = 3026 PWR_CON_DHW_TTL = 103026 PWR_CON_DHW_TTL_HI = 3027 COMPRESSOR_HEATING = 3028 COMPRESSOR_COOLING = 3029 COMPRESSOR_DHW = 3030 ELEC_BOOSTER_HEATING = 3031 ELEC_BOOSTER_DHW = 3032 LWZ_SYSTEM_VALUES_REGISTERS = { LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC1: ModbusRegister(address=1, name="ACTUAL ROOM T HC1", unit="°C", min=-20.0, max=60.0, data_type=2, key=LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC1), LwzSystemValuesRegisters.SET_ROOM_TEMPERATURE_HC1: ModbusRegister( address=2, name="SET ROOM TEMPERATURE HC1", unit="°C", min=-20.0, max=60.0, data_type=2, key=LwzSystemValuesRegisters.SET_ROOM_TEMPERATURE_HC1 ), LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC1: ModbusRegister( address=3, name="RELATIVE HUMIDITY HC1", unit="%", min=0.0, max=100.0, data_type=2, key=LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC1 ), LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC2: ModbusRegister(address=4, name="ACTUAL ROOM T HC2", unit="°C", min=-20.0, max=60.0, data_type=2, key=LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC2), LwzSystemValuesRegisters.SET_ROOM_TEMPERATURE_HC2: ModbusRegister( address=5, name="SET ROOM TEMPERATURE HC2", unit="°C", min=-20.0, max=60.0, data_type=2, key=LwzSystemValuesRegisters.SET_ROOM_TEMPERATURE_HC2 ), LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC2: ModbusRegister( address=6, name="RELATIVE HUMIDITY HC2", unit="%", min=0.0, max=100.0, data_type=2, key=LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC2 ), LwzSystemValuesRegisters.OUTSIDE_TEMPERATURE: ModbusRegister(address=7, name="OUTSIDE TEMPERATURE", unit="°C", min=-60.0, max=80.0, data_type=2, key=LwzSystemValuesRegisters.OUTSIDE_TEMPERATURE), LwzSystemValuesRegisters.ACTUAL_VALUE_HC1: ModbusRegister(address=8, name="ACTUAL VALUE HC1", unit="°C", min=0.0, max=90.0, data_type=2, key=LwzSystemValuesRegisters.ACTUAL_VALUE_HC1), LwzSystemValuesRegisters.SET_VALUE_HC1: ModbusRegister(address=9, name="SET VALUE HC1", unit="°C", min=0.0, max=65.0, data_type=2, key=LwzSystemValuesRegisters.SET_VALUE_HC1), LwzSystemValuesRegisters.ACTUAL_VALUE_HC2: ModbusRegister(address=10, name="ACTUAL VALUE HC2", unit="°C", min=0.0, max=90.0, data_type=2, key=LwzSystemValuesRegisters.ACTUAL_VALUE_HC2), LwzSystemValuesRegisters.SET_VALUE_HC2: ModbusRegister(address=11, name="SET VALUE HC2", unit="°C", min=0.0, max=65.0, data_type=2, key=LwzSystemValuesRegisters.SET_VALUE_HC2), LwzSystemValuesRegisters.FLOW_TEMPERATURE: ModbusRegister(address=12, name="FLOW TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=LwzSystemValuesRegisters.FLOW_TEMPERATURE), LwzSystemValuesRegisters.RETURN_TEMPERATURE: ModbusRegister(address=13, name="RETURN TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=LwzSystemValuesRegisters.RETURN_TEMPERATURE), LwzSystemValuesRegisters.PRESSURE_HTG_CIRC: ModbusRegister(address=14, name="PRESSURE HTG CIRC", unit="bar", min=0.0, max=6.0, data_type=2, key=LwzSystemValuesRegisters.PRESSURE_HTG_CIRC), LwzSystemValuesRegisters.FLOW_RATE: ModbusRegister(address=15, name="FLOW RATE ", unit="l/min", min=None, max=None, data_type=2, key=LwzSystemValuesRegisters.FLOW_RATE), LwzSystemValuesRegisters.ACTUAL_DHW_T: ModbusRegister(address=16, name="ACTUAL DHW T", unit="°C", min=10.0, max=65.0, data_type=2, key=LwzSystemValuesRegisters.ACTUAL_DHW_T), LwzSystemValuesRegisters.DHW_SET_TEMPERATURE: ModbusRegister(address=17, name="DHW SET TEMPERATURE", unit="°C", min=10.0, max=65.0, data_type=2, key=LwzSystemValuesRegisters.DHW_SET_TEMPERATURE), LwzSystemValuesRegisters.VENTILATION_AIR_ACTUAL_FAN_SPEED: ModbusRegister( address=18, name="VENTILATION AIR ACTUAL FAN SPEED", unit="Hz", min=0.0, max=100.0, data_type=6, key=LwzSystemValuesRegisters.VENTILATION_AIR_ACTUAL_FAN_SPEED ), LwzSystemValuesRegisters.VENTILATION_AIR_SET_FLOW_RATE: ModbusRegister( address=19, name="VENTILATION AIR SET FLOW RATE", unit="m³/h", min=0.0, max=300.0, data_type=6, key=LwzSystemValuesRegisters.VENTILATION_AIR_SET_FLOW_RATE ), LwzSystemValuesRegisters.EXTRACT_AIR_ACTUAL_FAN_SPEED: ModbusRegister( address=20, name="EXTRACT AIR ACTUAL FAN SPEED", unit="Hz", min=0.0, max=100.0, data_type=6, key=LwzSystemValuesRegisters.EXTRACT_AIR_ACTUAL_FAN_SPEED ), LwzSystemValuesRegisters.EXTRACT_AIR_SET_FLOW_RATE: ModbusRegister( address=21, name="EXTRACT AIR SET FLOW RATE", unit="m³/h", min=0.0, max=300.0, data_type=6, key=LwzSystemValuesRegisters.EXTRACT_AIR_SET_FLOW_RATE ), LwzSystemValuesRegisters.EXTRACT_AIR_HUMIDITY: ModbusRegister( address=22, name="EXTRACT AIR HUMIDITY", unit="%", min=0.0, max=100.0, data_type=6, key=LwzSystemValuesRegisters.EXTRACT_AIR_HUMIDITY ), LwzSystemValuesRegisters.EXTRACT_AIR_TEMP: ModbusRegister(address=23, name="EXTRACT AIR TEMP", unit="°C", min=0.0, max=65535.0, data_type=2, key=LwzSystemValuesRegisters.EXTRACT_AIR_TEMP), LwzSystemValuesRegisters.EXTRACT_AIR_DEW_POINT: ModbusRegister( address=24, name="EXTRACT AIR DEW POINT", unit="°C", min=0.0, max=65535.0, data_type=2, key=LwzSystemValuesRegisters.EXTRACT_AIR_DEW_POINT ), LwzSystemValuesRegisters.DEW_POINT_TEMP_HC1: ModbusRegister(address=25, name="DEW POINT TEMP HC1", unit="°C", min=-40.0, max=30.0, data_type=2, key=LwzSystemValuesRegisters.DEW_POINT_TEMP_HC1), LwzSystemValuesRegisters.DEW_POINT_TEMP_HC2: ModbusRegister(address=26, name="DEW POINT TEMP HC2", unit="°C", min=-40.0, max=30.0, data_type=2, key=LwzSystemValuesRegisters.DEW_POINT_TEMP_HC2), LwzSystemValuesRegisters.COLLECTOR_TEMPERATURE: ModbusRegister( address=27, name="COLLECTOR TEMPERATURE", unit="°C", min=-60.0, max=200.0, data_type=2, key=LwzSystemValuesRegisters.COLLECTOR_TEMPERATURE ), LwzSystemValuesRegisters.HOT_GAS_TEMPERATURE: ModbusRegister(address=28, name="HOT GAS TEMPERATURE", unit="°C", min=0.0, max=140.0, data_type=2, key=LwzSystemValuesRegisters.HOT_GAS_TEMPERATURE), LwzSystemValuesRegisters.HIGH_PRESSURE: ModbusRegister(address=29, name="HIGH PRESSURE", unit="bar", min=0.0, max=50.0, data_type=7, key=LwzSystemValuesRegisters.HIGH_PRESSURE), LwzSystemValuesRegisters.LOW_PRESSURE: ModbusRegister(address=30, name="LOW PRESSURE", unit="bar", min=0.0, max=25.0, data_type=7, key=LwzSystemValuesRegisters.LOW_PRESSURE), LwzSystemValuesRegisters.COMPRESSOR_STARTS_HI: ModbusRegister(address=31, name="COMPRESSOR STARTS", unit="", min=0.0, max=65535.0, data_type=6, key=LwzSystemValuesRegisters.COMPRESSOR_STARTS_HI), LwzSystemValuesRegisters.COMPRESSOR_SPEED: ModbusRegister(address=32, name="COMPRESSOR SPEED", unit="Hz", min=0.0, max=240.0, data_type=2, key=LwzSystemValuesRegisters.COMPRESSOR_SPEED), LwzSystemValuesRegisters.MIXED_WATER_AMOUNT: ModbusRegister(address=33, name="MIXED WATER AMOUNT", unit="l", min=0.0, max=65535.0, data_type=6, key=LwzSystemValuesRegisters.MIXED_WATER_AMOUNT), LwzSystemValuesRegisters.COMPRESSOR_STARTS_LOW: ModbusRegister( address=34, name="COMPRESSOR STARTS", unit="", min=0.0, max=65535.0, data_type=6, key=LwzSystemValuesRegisters.COMPRESSOR_STARTS_LOW ), } LWZ_SYSTEM_PARAMETERS_REGISTERS = { LwzSystemParametersRegisters.OPERATING_MODE: ModbusRegister(address=1001, name="OPERATING MODE", unit="", min=0.0, max=14.0, data_type=8, key=LwzSystemParametersRegisters.OPERATING_MODE), LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1: ModbusRegister( address=1002, name="ROOM TEMPERATURE DAY", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1 ), LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK1: ModbusRegister( address=1003, name="ROOM TEMPERATURE NIGHT", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK1 ), LwzSystemParametersRegisters.MANUAL_HC_SET_HK1: ModbusRegister(address=1004, name="MANUAL HC SET", unit="°C", min=10.0, max=65.0, data_type=2, key=LwzSystemParametersRegisters.MANUAL_HC_SET_HK1), LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK2: ModbusRegister( address=1005, name="ROOM TEMPERATURE DAY", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK2 ), LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK2: ModbusRegister( address=1006, name="ROOM TEMPERATURE NIGHT", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK2 ), LwzSystemParametersRegisters.MANUAL_HC_SET_HK2: ModbusRegister(address=1007, name="MANUAL HC SET", unit="°C", min=10.0, max=65.0, data_type=2, key=LwzSystemParametersRegisters.MANUAL_HC_SET_HK2), LwzSystemParametersRegisters.GRADIENT_HK1: ModbusRegister(address=1008, name="GRADIENT", unit="", min=0.0, max=5.0, data_type=7, key=LwzSystemParametersRegisters.GRADIENT_HK1), LwzSystemParametersRegisters.LOW_END_HK1: ModbusRegister(address=1009, name="LOW END", unit="°C", min=0.0, max=20.0, data_type=2, key=LwzSystemParametersRegisters.LOW_END_HK1), LwzSystemParametersRegisters.GRADIENT_HK2: ModbusRegister(address=1010, name="GRADIENT", unit="", min=0.0, max=5.0, data_type=7, key=LwzSystemParametersRegisters.GRADIENT_HK2), LwzSystemParametersRegisters.LOW_END_HK2: ModbusRegister(address=1011, name="LOW END", unit="°C", min=0.0, max=20.0, data_type=2, key=LwzSystemParametersRegisters.LOW_END_HK2), LwzSystemParametersRegisters.DHW_SET_DAY: ModbusRegister(address=1012, name="DHW SET DAY", unit="°C", min=10.0, max=55.0, data_type=2, key=LwzSystemParametersRegisters.DHW_SET_DAY), LwzSystemParametersRegisters.DHW_SET_NIGHT: ModbusRegister(address=1013, name="DHW SET NIGHT", unit="°C", min=10.0, max=55.0, data_type=2, key=LwzSystemParametersRegisters.DHW_SET_NIGHT), LwzSystemParametersRegisters.DHW_SET_MANUAL: ModbusRegister(address=1014, name="DHW SET MANUAL", unit="°C", min=10.0, max=65.0, data_type=2, key=LwzSystemParametersRegisters.DHW_SET_MANUAL), LwzSystemParametersRegisters.MWM_SET_DAY: ModbusRegister(address=1015, name="MWM SET DAY", unit="l", min=50.0, max=288.0, data_type=6, key=LwzSystemParametersRegisters.MWM_SET_DAY), LwzSystemParametersRegisters.MWM_SET_NIGHT: ModbusRegister(address=1016, name="MWM SET NIGHT", unit="l", min=50.0, max=288.0, data_type=6, key=LwzSystemParametersRegisters.MWM_SET_NIGHT), LwzSystemParametersRegisters.MWM_SET_MANUAL: ModbusRegister(address=1017, name="MWM SET MANUAL", unit="l", min=50.0, max=288.0, data_type=6, key=LwzSystemParametersRegisters.MWM_SET_MANUAL), LwzSystemParametersRegisters.DAY_STAGE: ModbusRegister(address=1018, name="DAY STAGE", unit="", min=0.0, max=3.0, data_type=6, key=LwzSystemParametersRegisters.DAY_STAGE), LwzSystemParametersRegisters.NIGHT_STAGE: ModbusRegister(address=1019, name="NIGHT STAGE", unit="", min=0.0, max=3.0, data_type=6, key=LwzSystemParametersRegisters.NIGHT_STAGE), LwzSystemParametersRegisters.PARTY_STAGE: ModbusRegister(address=1020, name="PARTY STAGE", unit="", min=0.0, max=3.0, data_type=6, key=LwzSystemParametersRegisters.PARTY_STAGE), LwzSystemParametersRegisters.MANUAL_STAGE: ModbusRegister(address=1021, name="MANUAL STAGE", unit="", min=0.0, max=3.0, data_type=6, key=LwzSystemParametersRegisters.MANUAL_STAGE), LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1_COOLING: ModbusRegister( address=1022, name="ROOM TEMPERATURE DAY", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1_COOLING ), LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK1_COOLING: ModbusRegister( address=1023, name="ROOM TEMPERATURE NIGHT", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK1_COOLING ), LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK2_COOLING: ModbusRegister( address=1024, name="ROOM TEMPERATURE DAY", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK2_COOLING ), LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK2_COOLING: ModbusRegister( address=1025, name="ROOM TEMPERATURE NIGHT", unit="°C", min=10.0, max=30.0, data_type=2, key=LwzSystemParametersRegisters.ROOM_TEMPERATURE_NIGHT_HK2_COOLING ), LwzSystemParametersRegisters.RESET: ModbusRegister(address=1026, name="RESET", unit="", min=0.0, max=1.0, data_type=6, key=LwzSystemParametersRegisters.RESET), LwzSystemParametersRegisters.RESTART_ISG: ModbusRegister(address=1027, name="RESTART ISG", unit="", min=0.0, max=2.0, data_type=6, key=LwzSystemParametersRegisters.RESTART_ISG), } LWZ_SYSTEM_STATE_REGISTERS = { LwzSystemStateRegisters.OPERATING_STATUS: ModbusRegister(address=2001, name="OPERATING STATUS", unit="", min=0.0, max=65535.0, data_type=6, key=LwzSystemStateRegisters.OPERATING_STATUS), LwzSystemStateRegisters.FAULT_STATUS: ModbusRegister(address=2002, name="FAULT STATUS", unit="", min=0.0, max=1.0, data_type=6, key=LwzSystemStateRegisters.FAULT_STATUS), LwzSystemStateRegisters.BUS_STATUS: ModbusRegister(address=2003, name="BUS STATUS", unit="", min=-4.0, max=0.0, data_type=6, key=LwzSystemStateRegisters.BUS_STATUS), LwzSystemStateRegisters.DEFROST_INITIATED: ModbusRegister(address=2004, name="DEFROST INITIATED", unit="", min=0.0, max=1.0, data_type=6, key=LwzSystemStateRegisters.DEFROST_INITIATED), LwzSystemStateRegisters.OPERATING_STATUS_2: ModbusRegister(address=2005, name="OPERATING STATUS 2", unit="", min=0.0, max=65535.0, data_type=6, key=LwzSystemStateRegisters.OPERATING_STATUS_2), } LWZ_ENERGY_DATA_REGISTERS = { LwzEnergyDataRegisters.HEAT_METER_HTG_DAY: ModbusRegister(address=3001, name="HEAT METER HTG DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_HTG_DAY), LwzEnergyDataRegisters.HEAT_METER_HTG_TTL_LOW: ModbusRegister( address=3002, name="HEAT METER HTG TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_HTG_TTL_LOW ), LwzEnergyDataRegisters.HEAT_METER_HTG_TTL_HI: ModbusRegister( address=3003, name="HEAT METER HTG TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_HTG_TTL_HI ), LwzEnergyDataRegisters.HEAT_METER_DHW_DAY: ModbusRegister(address=3004, name="HEAT METER DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_DHW_DAY), LwzEnergyDataRegisters.HEAT_METER_DHW_TTL_LOW: ModbusRegister( address=3005, name="HEAT METER DHW TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_DHW_TTL_LOW ), LwzEnergyDataRegisters.HEAT_METER_DHW_TTL_HI: ModbusRegister( address=3006, name="HEAT METER DHW TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_METER_DHW_TTL_HI ), LwzEnergyDataRegisters.HEAT_M_BOOST_HTG_TTL_LOW: ModbusRegister( address=3007, name="HEAT M BOOST HTG TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_BOOST_HTG_TTL_LOW ), LwzEnergyDataRegisters.HEAT_M_BOOST_HTG_TTL_HI: ModbusRegister( address=3008, name="HEAT M BOOST HTG TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_BOOST_HTG_TTL_HI ), LwzEnergyDataRegisters.HEAT_M_BOOST_DHW_TTL_LOW: ModbusRegister( address=3009, name="HEAT M BOOST DHW TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_BOOST_DHW_TTL_LOW ), LwzEnergyDataRegisters.HEAT_M_BOOST_DHW_HI: ModbusRegister(address=3010, name="HEAT M BOOST DHW", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_BOOST_DHW_HI), LwzEnergyDataRegisters.HEAT_M_RECOVERY_DAY: ModbusRegister(address=3011, name="HEAT M RECOVERY DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_RECOVERY_DAY), LwzEnergyDataRegisters.HEAT_M_RECOVERY_TTL_LOW: ModbusRegister( address=3012, name="HEAT M RECOVERY TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_RECOVERY_TTL_LOW ), LwzEnergyDataRegisters.HEAT_M_RECOVERY_TTL_HI: ModbusRegister( address=3013, name="HEAT M RECOVERY TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HEAT_M_RECOVERY_TTL_HI ), LwzEnergyDataRegisters.HM_SOLAR_HTG_DAY: ModbusRegister(address=3014, name="HM SOLAR HTG DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_HTG_DAY), LwzEnergyDataRegisters.HM_SOLAR_HTG_TOTAL_LOW: ModbusRegister( address=3015, name="HM SOLAR HTG TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_HTG_TOTAL_LOW ), LwzEnergyDataRegisters.HM_SOLAR_HTG_TOTAL_HI: ModbusRegister( address=3016, name="HM SOLAR HTG TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_HTG_TOTAL_HI ), LwzEnergyDataRegisters.HM_SOLAR_DHW_DAY: ModbusRegister(address=3017, name="HM SOLAR DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_DHW_DAY), LwzEnergyDataRegisters.HM_SOLAR_DWH_TOTAL_LOW: ModbusRegister( address=3018, name="HM SOLAR DWH TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_DWH_TOTAL_LOW ), LwzEnergyDataRegisters.HM_SOLAR_DWH_TOTAL_HI: ModbusRegister( address=3019, name="HM SOLAR DWH TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HM_SOLAR_DWH_TOTAL_HI ), LwzEnergyDataRegisters.HM_COOLING_TOTAL_LOW: ModbusRegister(address=3020, name="HM COOLING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.HM_COOLING_TOTAL_LOW), LwzEnergyDataRegisters.HM_COOLING_TOTAL_HI: ModbusRegister(address=3021, name="HM COOLING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.HM_COOLING_TOTAL_HI), LwzEnergyDataRegisters.PWR_CON_HTG_DAY: ModbusRegister(address=3022, name="PWR CON HTG DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_HTG_DAY), LwzEnergyDataRegisters.PWR_CON_HTG_TTL_LOW: ModbusRegister(address=3023, name="PWR CON HTG TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_HTG_TTL_LOW), LwzEnergyDataRegisters.PWR_CON_HTG_TTL_HI: ModbusRegister(address=3024, name="PWR CON HTG TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_HTG_TTL_HI), LwzEnergyDataRegisters.PWR_CON_DHW_DAY: ModbusRegister(address=3025, name="PWR CON DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_DHW_DAY), LwzEnergyDataRegisters.PWR_CON_DHW_TTL_LOW: ModbusRegister(address=3026, name="PWR CON DHW TTL", unit="kWh", min=0.0, max=999.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_DHW_TTL_LOW), LwzEnergyDataRegisters.PWR_CON_DHW_TTL_HI: ModbusRegister(address=3027, name="PWR CON DHW TTL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.PWR_CON_DHW_TTL_HI), LwzEnergyDataRegisters.COMPRESSOR_HEATING: ModbusRegister(address=3028, name="COMPRESSOR HEATING", unit="h", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.COMPRESSOR_HEATING), LwzEnergyDataRegisters.COMPRESSOR_COOLING: ModbusRegister(address=3029, name="COMPRESSOR COOLING", unit="h", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.COMPRESSOR_COOLING), LwzEnergyDataRegisters.COMPRESSOR_DHW: ModbusRegister(address=3030, name="COMPRESSOR DHW", unit="h", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.COMPRESSOR_DHW), LwzEnergyDataRegisters.ELEC_BOOSTER_HEATING: ModbusRegister( address=3031, name="ELEC BOOSTER HEATING", unit="h", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.ELEC_BOOSTER_HEATING ), LwzEnergyDataRegisters.ELEC_BOOSTER_DHW: ModbusRegister(address=3032, name="ELEC BOOSTER DHW", unit="h", min=0.0, max=65535.0, data_type=6, key=LwzEnergyDataRegisters.ELEC_BOOSTER_DHW), } class OperatingMode(Enum): """Enum for the operation mode of the heat pump.""" # AUTOMATIK AUTOMATIC = 11 # BEREITSCHAFT STANDBY = 1 # TAGBETRIEB DAY_MODE = 3 # ABSENKBETRIEB SETBACK_MODE = 4 # WARMWASSER DHW = 5 # HANDBETRIEB MANUAL_MODE = 14 # NOTBETRIEB EMERGENCY_OPERATION = 0 class LwzStiebelEltronAPI(StiebelEltronAPI): def __init__(self, host: str, port: int = 502, slave: int = 1) -> None: super().__init__( [ ModbusRegisterBlock(base_address=0, count=34, name="System Values", registers=LWZ_SYSTEM_VALUES_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=1000, count=27, name="System Parameters", registers=LWZ_SYSTEM_PARAMETERS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=2000, count=5, name="System State", registers=LWZ_SYSTEM_STATE_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=3000, count=32, name="Energy Data", registers=LWZ_ENERGY_DATA_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=4000, count=3, name="Energy Management Settings", registers=ENERGY_MANAGEMENT_SETTINGS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=5000, count=2, name="Energy System Information", registers=ENERGY_SYSTEM_INFORMATION_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ], host, port, slave, ) async def async_update(self): """Request current values from heat pump.""" await super().async_update() for registerblock in self._register_blocks: if registerblock.name == ENERGY_DATA_BLOCK_NAME: registers = [r.value for r in LwzEnergyDataRegisters] registers.sort() for register in registers: if register > VIRTUAL_REGISTER_OFFSET: if register > VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET: total_key = LwzEnergyDataRegisters(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET + VIRTUAL_REGISTER_OFFSET) day_key = LwzEnergyDataRegisters(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET - 1) total_value = self._data.get(total_key) day_value = self._data.get(day_key) if total_value is not None and day_value is not None: prev_value = self._previous_data.get(LwzEnergyDataRegisters(register)) if prev_value is not None: self._data[LwzEnergyDataRegisters(register)] = max(total_value + day_value, prev_value) else: self._data[LwzEnergyDataRegisters(register)] = total_value + day_value else: low_key = LwzEnergyDataRegisters(register - VIRTUAL_REGISTER_OFFSET) high_key = LwzEnergyDataRegisters(register - VIRTUAL_REGISTER_OFFSET + 1) high_value = self._data.get(high_key) low_value = self._data.get(low_key) if high_value is not None and low_value is not None: self._data[LwzEnergyDataRegisters(register)] = high_value * 1000 + low_value compressor_starts_high = self.get_register_value(LwzSystemValuesRegisters.COMPRESSOR_STARTS_HI) if compressor_starts_high is None or compressor_starts_high == 32768: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = 32768 else: compressor_starts_low = self.get_register_value(LwzSystemValuesRegisters.COMPRESSOR_STARTS_LOW) if compressor_starts_low is None: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = compressor_starts_high * 1000 else: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = compressor_starts_high * 1000 + compressor_starts_low def get_current_temp(self): """Get the current room temperature.""" return self.get_register_value(LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC1) def get_target_temp(self): """Get the target room temperature.""" return self.get_register_value(LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1) async def set_target_temp(self, temp): """Set the target room temperature (day)(HC1).""" await self.write_register_value(LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1, temp) def get_current_humidity(self): """Get the current room humidity.""" return self.get_register_value(LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC1) # Handle operation mode def get_operation(self) -> OperatingMode: """Return the current mode of operation.""" op_mode = int(self.get_register_value(LwzSystemParametersRegisters.OPERATING_MODE)) return OperatingMode(op_mode) async def set_operation(self, mode: OperatingMode): """Set the operation mode.""" await self.write_register_value(LwzSystemParametersRegisters.OPERATING_MODE, mode.value) def get_heating_status(self) -> bool: """Return heater status.""" return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & (1 << 2)) def get_cooling_status(self) -> bool: """Cooling status.""" return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & (1 << 3)) def get_filter_alarm_status(self) -> bool: """Return filter alarm.""" filter_mask = (1 << 8) | (1 << 12) | (1 << 13) return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & filter_mask) python-stiebel-eltron-0.2.0/pystiebeleltron/pystiebeleltron.py000066400000000000000000000310421503672511200250040ustar00rootroot00000000000000""" Connection to a Stiebel Eltron ModBus API. See API details: https://www.stiebel-eltron.de/content/dam/ste/de/de/home/services/Downloadlisten/ISG%20Modbus_Stiebel_Bedienungsanleitung.pdf Types of data: Data | Value | Multiplier | Multiplier | Signed | Step | Step type | range | for reading | for writing | | size 1 | size 5 -----|------------|-------------|-------------|--------|--------|------- 2 | -3276.8 to | 0.1 | 10 | Yes | 0.1 | 0.5 | 3276.7 | | | | | 6 | 0 to 65535 | 1 | 1 | No | 1 | 5 7 | -327.68 to | 0.01 | 100 | Yes | 0.01 | 0.05 | 327.67 | | | | | 8 | 0 to 255 | 1 | 1 | No | 1 | 5 """ from pymodbus.client.mixin import ModbusClientMixin # Error - sensor lead is missing or disconnected. ERROR_NOTAVAILABLE = -60 # Error - short circuit of the sensor lead. ERROR_SHORTCUT = -50 # Error - object unavailable. ERROR_OBJ_UNAVAILBLE = 0x8000 UNAVAILABLE_OBJECT = 32768 # Block 1 System values (Read input register) - page 29 B1_START_ADDR = 0 B1_REGMAP_INPUT = { # HC = Heating Circuit 'ACTUAL_ROOM_TEMPERATURE_HC1': {'addr': 0, 'type': 2, 'value': 0}, 'SET_ROOM_TEMPERATURE_HC1': {'addr': 1, 'type': 2, 'value': 0}, 'RELATIVE_HUMIDITY_HC1': {'addr': 2, 'type': 2, 'value': 0}, 'ACTUAL_ROOM_TEMPERATURE_HC2': {'addr': 3, 'type': 2, 'value': 0}, 'SET_ROOM_TEMPERATURE_HC2': {'addr': 4, 'type': 2, 'value': 0}, 'RELATIVE_HUMIDITY_HC2': {'addr': 5, 'type': 2, 'value': 0}, 'OUTSIDE_TEMPERATURE': {'addr': 6, 'type': 2, 'value': 0}, 'ACTUAL_VALUE_HC1': {'addr': 7, 'type': 2, 'value': 0}, 'SET_VALUE_HC1': {'addr': 8, 'type': 2, 'value': 0}, 'ACTUAL_VALUE_HC2': {'addr': 9, 'type': 2, 'value': 0}, 'SET_VALUE_HC2': {'addr': 10, 'type': 2, 'value': 0}, 'FLOW_TEMPERATURE': {'addr': 11, 'type': 2, 'value': 0}, 'RETURN_TEMPERATURE': {'addr': 12, 'type': 2, 'value': 0}, 'PRESSURE_HEATING_CIRCUIT': {'addr': 13, 'type': 2, 'value': 0}, 'FLOW_RATE': {'addr': 14, 'type': 2, 'value': 0}, 'ACTUAL_DHW_TEMPERATURE': {'addr': 15, 'type': 2, 'value': 0}, 'SET_DHW_TEMPERATURE': {'addr': 16, 'type': 2, 'value': 0}, 'VENTILATION_AIR_ACTUAL_FAN_SPEED': {'addr': 17, 'type': 6, 'value': 0}, 'VENTILATION_AIR_SET_FLOW_RATE': {'addr': 18, 'type': 6, 'value': 0}, 'EXTRACT_AIR_ACTUAL_FAN_SPEED': {'addr': 19, 'type': 6, 'value': 0}, 'EXTRACT_AIR_SET_FLOW_RATE': {'addr': 20, 'type': 6, 'value': 0}, 'EXTRACT_AIR_HUMIDITY': {'addr': 21, 'type': 6, 'value': 0}, 'EXTRACT_AIR_TEMPERATURE': {'addr': 22, 'type': 2, 'value': 0}, 'EXTRACT_AIR_DEW_POINT': {'addr': 23, 'type': 2, 'value': 0}, 'DEW_POINT_TEMPERATUR_HC1': {'addr': 24, 'type': 2, 'value': 0}, 'DEW_POINT_TEMPERATUR_HC2': {'addr': 25, 'type': 2, 'value': 0}, 'COLLECTOR_TEMPERATURE': {'addr': 26, 'type': 2, 'value': 0}, 'HOT_GAS_TEMPERATURE': {'addr': 27, 'type': 2, 'value': 0}, 'HIGH_PRESSURE': {'addr': 28, 'type': 7, 'value': 0}, 'LOW_PRESSURE': {'addr': 29, 'type': 7, 'value': 0}, 'COMPRESSOR_STARTS': {'addr': 30, 'type': 6, 'value': 0}, 'COMPRESSOR_SPEED': {'addr': 31, 'type': 2, 'value': 0}, 'MIXED_WATER_AMOUNT': {'addr': 32, 'type': 6, 'value': 0} } # Block 2 System parameters (Read/write holding register) - page 30 B2_START_ADDR = 1000 B2_REGMAP_HOLDING = { 'OPERATING_MODE': {'addr': 1000, 'type': 8, 'value': 0}, 'ROOM_TEMP_HEAT_DAY_HC1': {'addr': 1001, 'type': 2, 'value': 0}, 'ROOM_TEMP_HEAT_NIGHT_HC1': {'addr': 1002, 'type': 2, 'value': 0}, 'MANUAL_SET_TEMP_HC1': {'addr': 1003, 'type': 2, 'value': 0}, 'ROOM_TEMP_HEAT_DAY_HC2': {'addr': 1004, 'type': 2, 'value': 0}, 'ROOM_TEMP_HEAT_NIGHT_HC2': {'addr': 1005, 'type': 2, 'value': 0}, 'MANUAL_SET_TEAMP_HC2': {'addr': 1006, 'type': 2, 'value': 0}, 'GRADIENT_HC1': {'addr': 1007, 'type': 7, 'value': 0}, 'LOW_END_HC1': {'addr': 1008, 'type': 2, 'value': 0}, 'GRADIENT_HC2': {'addr': 1009, 'type': 7, 'value': 0}, 'LOW_END_HC2': {'addr': 1010, 'type': 2, 'value': 0}, 'DHW_TEMP_SET_DAY': {'addr': 1011, 'type': 2, 'value': 0}, 'DHW_TEMP_SET_NIGHT': {'addr': 1012, 'type': 2, 'value': 0}, 'DHW_TEMP_SET_MANUAL': {'addr': 1013, 'type': 2, 'value': 0}, 'MWM_SET_DAY': {'addr': 1014, 'type': 6, 'value': 0}, 'MWM_SET_NIGHT': {'addr': 1015, 'type': 6, 'value': 0}, 'MWM_SET_MANUAL': {'addr': 1016, 'type': 6, 'value': 0}, 'DAY_STAGE': {'addr': 1017, 'type': 6, 'value': 0}, 'NIGHT_STAGE': {'addr': 1018, 'type': 6, 'value': 0}, 'PARTY_STAGE': {'addr': 1019, 'type': 6, 'value': 0}, 'MANUAL_STAGE': {'addr': 1020, 'type': 6, 'value': 0}, 'ROOM_TEMP_COOL_DAY_HC1': {'addr': 1021, 'type': 2, 'value': 0}, 'ROOM_TEMP_COOL_NIGHT_HC1': {'addr': 1022, 'type': 2, 'value': 0}, 'ROOM_TEMP_COOL_DAY_HC2': {'addr': 1023, 'type': 2, 'value': 0}, 'ROOM_TEMP_COOL_NIGHT_HC2': {'addr': 1024, 'type': 2, 'value': 0}, 'RESET': {'addr': 1025, 'type': 6, 'value': 0}, 'RESTART_ISG': {'addr': 1026, 'type': 6, 'value': 0} } B2_OPERATING_MODE_READ = { # AUTOMATIK 11: 'AUTOMATIC', # BEREITSCHAFT 1: 'STANDBY', # TAGBETRIEB 3: 'DAY MODE', # ABSENKBETRIEB 4: 'SETBACK MODE', # WARMWASSER 5: 'DHW', # HANDBETRIEB 14: 'MANUAL MODE', # NOTBETRIEB 0: 'EMERGENCY OPERATION' } B2_OPERATING_MODE_WRITE = { value: key for key, value in B2_OPERATING_MODE_READ.items() } B2_RESET = { 'OFF': 0, 'ON': 1 } B2_RESTART_ISG = { 'OFF': 0, 'RESET': 1, 'MENU': 2 } # Block 3 System status (Read input register) - page 31 B3_START_ADDR = 2000 B3_REGMAP_INPUT = { 'OPERATING_STATUS': {'addr': 2000, 'type': 6, 'value': 0}, 'FAULT_STATUS': {'addr': 2001, 'type': 6, 'value': 0}, 'BUS_STATUS': {'addr': 2002, 'type': 6, 'value': 0} } B3_OPERATING_STATUS = { 'SWITCHING_PROGRAM_ENABLED': (1 << 0), 'COMPRESSOR': (1 << 1), 'HEATING': (1 << 2), 'COOLING': (1 << 3), 'DHW': (1 << 4), 'ELECTRIC_REHEATING': (1 << 5), 'SERVICE': (1 << 6), 'POWER-OFF': (1 << 7), 'FILTER': (1 << 8), 'VENTILATION': (1 << 9), 'HEATING_CIRCUIT_PUMP': (1 << 10), 'EVAPORATOR_DEFROST': (1 << 11), 'FILTER_EXTRACT_AIR': (1 << 12), 'FILTER_VENTILATION_AIR': (1 << 13), 'HEAT-UP_PROGRAM': (1 << 14) } B3_FAULT_STATUS = { 'NO_FAULT': 0, 'FAULT': 1 } B3_BUS_STATUS = { 'STATUS OK': 0, 'STATUS ERROR': -1, 'ERROR-PASSIVE': -2, 'BUS-OFF': -3, 'PHYSICAL-ERROR': -4 } class StiebelEltronAPI(): """Stiebel Eltron API.""" def __init__(self, conn: ModbusClientMixin, slave=1, update_on_read=False): """Initialize Stiebel Eltron communication.""" self._conn = conn self._block_1_input_regs = B1_REGMAP_INPUT self._block_2_holding_regs = B2_REGMAP_HOLDING self._block_3_input_regs = B3_REGMAP_INPUT self._slave = slave self._update_on_read = update_on_read def update(self): """Request current values from heat pump.""" ret = True try: block_1_result_input = self._conn.read_input_registers( slave=self._slave, address=B1_START_ADDR, count=len(self._block_1_input_regs)).registers block_2_result_holding = self._conn.read_holding_registers( slave=self._slave, address=B2_START_ADDR, count=len(self._block_2_holding_regs)).registers block_3_result_input = self._conn.read_input_registers( slave=self._slave, address=B3_START_ADDR, count=len(self._block_3_input_regs)).registers except AttributeError: # The unit does not reply reliably ret = False print("Modbus read failed") else: for v in self._block_1_input_regs.values(): v['value'] = block_1_result_input[v['addr'] - B1_START_ADDR] for v in self._block_2_holding_regs.values(): v['value'] = block_2_result_holding[v['addr'] - B2_START_ADDR] for v in self._block_3_input_regs.values(): v['value'] = block_3_result_input[v['addr'] - B3_START_ADDR] return ret def get_conv_val(self, name: str): """Read and convert value. Args: name: Name of value to be read. Returns: Actual value or None. """ value_entry = self._block_1_input_regs.get(name) if value_entry is None: value_entry = self._block_2_holding_regs.get(name) if value_entry is None: value_entry = self._block_3_input_regs.get(name) if value_entry is None: return None if value_entry['type'] == 2: return value_entry['value'] * 0.1 if value_entry['type'] == 7: return value_entry['value'] * 0.01 return value_entry['value'] # def get_raw_input_register(self, name): # """Get raw register value by name.""" # if self._update_on_read: # self.update() # return self._block_1_input_regs[name] # def get_raw_holding_register(self, name): # """Get raw register value by name.""" # if self._update_on_read: # self.update() # return self._block_2_holding_regs[name] # def set_raw_holding_register(self, name, value): # """Write to register by name.""" # self._conn.write_register( # slave=self._slave, # address=(self._holding_regs[name]['addr']), # value=value) # Handle room temperature & humidity def get_current_temp(self): """Get the current room temperature.""" if self._update_on_read: self.update() return self.get_conv_val('ACTUAL_ROOM_TEMPERATURE_HC1') def get_target_temp(self): """Get the target room temperature.""" if self._update_on_read: self.update() return self.get_conv_val('ROOM_TEMP_HEAT_DAY_HC1') def set_target_temp(self, temp: float): """Set the target room temperature (day)(HC1).""" self._conn.write_register( slave=self._slave, address=( self._block_2_holding_regs['ROOM_TEMP_HEAT_DAY_HC1']['addr']), value=round(temp * 10.0)) def get_current_humidity(self): """Get the current room humidity.""" if self._update_on_read: self.update() return self.get_conv_val('RELATIVE_HUMIDITY_HC1') # Handle operation mode def get_operation(self): """Return the current mode of operation.""" if self._update_on_read: self.update() op_mode = self.get_conv_val('OPERATING_MODE') return B2_OPERATING_MODE_READ.get(op_mode, 'UNKNOWN') def set_operation(self, mode: str): """Set the operation mode.""" self._conn.write_register( slave=self._slave, address=(self._block_2_holding_regs['OPERATING_MODE']['addr']), value=B2_OPERATING_MODE_WRITE.get(mode)) # Handle device status def get_heating_status(self): """Return heater status.""" if self._update_on_read: self.update() return bool(self.get_conv_val('OPERATING_STATUS') & B3_OPERATING_STATUS['HEATING']) def get_cooling_status(self): """Cooling status.""" if self._update_on_read: self.update() return bool(self.get_conv_val('OPERATING_STATUS') & B3_OPERATING_STATUS['COOLING']) def get_filter_alarm_status(self): """Return filter alarm.""" if self._update_on_read: self.update() filter_mask = (B3_OPERATING_STATUS['FILTER'] | B3_OPERATING_STATUS['FILTER_EXTRACT_AIR'] | B3_OPERATING_STATUS['FILTER_VENTILATION_AIR']) return bool(self.get_conv_val('OPERATING_STATUS') & filter_mask) python-stiebel-eltron-0.2.0/pystiebeleltron/wpm.py000066400000000000000000002067111503672511200223720ustar00rootroot00000000000000"""Modbus api for stiebel eltron heat pumps. This file is generated. Do not modify it manually.""" from . import ( ModbusRegister, ModbusRegisterBlock, StiebelEltronAPI, IsgRegisters, RegisterType, ENERGY_DATA_BLOCK_NAME, VIRTUAL_REGISTER_OFFSET, ENERGY_MANAGEMENT_SETTINGS_REGISTERS, ENERGY_SYSTEM_INFORMATION_REGISTERS, VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET, ) class WpmSystemValuesRegisters(IsgRegisters): ACTUAL_TEMPERATURE_FE7 = 501 SET_TEMPERATURE_FE7 = 502 ACTUAL_TEMPERATURE_FEK = 503 SET_TEMPERATURE_FEK = 504 RELATIVE_HUMIDITY = 505 DEW_POINT_TEMPERATURE = 506 OUTSIDE_TEMPERATURE = 507 ACTUAL_TEMPERATURE_HK_1 = 508 SET_TEMPERATURE_HK_1_WPM3I = 509 SET_TEMPERATURE_HK_1 = 510 ACTUAL_TEMPERATURE_HK_2 = 511 SET_TEMPERATURE_HK_2 = 512 ACTUAL_FLOW_TEMPERATURE_WP = 513 ACTUAL_FLOW_TEMPERATURE_NHZ = 514 ACTUAL_FLOW_TEMPERATURE = 515 ACTUAL_RETURN_TEMPERATURE = 516 SET_FIXED_TEMPERATURE = 517 ACTUAL_BUFFER_TEMPERATURE = 518 SET_BUFFER_TEMPERATURE = 519 HEATING_PRESSURE = 520 FLOW_RATE = 521 ACTUAL_TEMPERATURE_DHW = 522 SET_TEMPERATURE_DHW = 523 ACTUAL_TEMPERATURE_FAN = 524 SET_TEMPERATURE_FAN = 525 ACTUAL_TEMPERATURE_AREA = 526 SET_TEMPERATURE_AREA = 527 COLLECTOR_TEMPERATURE = 528 CYLINDER_TEMPERATURE = 529 RUNTIME = 530 ACTUAL_TEMPERATURE_EXTERNAL = 531 SET_TEMPERATURE_EXTERNAL = 532 APPLICATION_LIMIT_HZG = 533 APPLICATION_LIMIT_WW = 534 RUNTIME_EHS = 535 SOURCE_TEMPERATURE = 536 MIN_SOURCE_TEMPERATURE = 537 SOURCE_PRESSURE = 538 HOT_GAS_TEMPERATURE = 539 HIGH_PRESSURE = 540 LOW_PRESSURE = 541 RETURN_TEMPERATURE_HP1 = 542 FLOW_TEMPERATURE_HP1 = 543 HOT_GAS_TEMPERATURE_HP1 = 544 LOW_PRESSURE_HP1 = 545 MEAN_PRESSURE_HP1 = 546 HIGH_PRESSURE_HP1 = 547 WP_WATER_FLOW_RATE_HP1 = 548 RETURN_TEMPERATURE_HP2 = 549 FLOW_TEMPERATURE_HP2 = 550 HOT_GAS_TEMPERATURE_HP2 = 551 LOW_PRESSURE_HP2 = 552 MEAN_PRESSURE_HP2 = 553 HIGH_PRESSURE_HP2 = 554 WP_WATER_FLOW_RATE_HP2 = 555 RETURN_TEMPERATURE_HP3 = 556 FLOW_TEMPERATURE_HP3 = 557 HOT_GAS_TEMPERATURE_HP3 = 558 LOW_PRESSURE_HP3 = 559 MEAN_PRESSURE_HP3 = 560 HIGH_PRESSURE_HP3 = 561 WP_WATER_FLOW_RATE_HP3 = 562 RETURN_TEMPERATURE_HP4 = 563 FLOW_TEMPERATURE_HP4 = 564 HOT_GAS_TEMPERATURE_HP4 = 565 LOW_PRESSURE_HP4 = 566 MEAN_PRESSURE_HP4 = 567 HIGH_PRESSURE_HP4 = 568 WP_WATER_FLOW_RATE_HP4 = 569 RETURN_TEMPERATURE_HP5 = 570 FLOW_TEMPERATURE_HP5 = 571 HOT_GAS_TEMPERATURE_HP5 = 572 LOW_PRESSURE_HP5 = 573 MEAN_PRESSURE_HP5 = 574 HIGH_PRESSURE_HP5 = 575 WP_WATER_RATE_HP5 = 576 RETURN_TEMPERATURE_HP6 = 577 FLOW_TEMPERATURE_HP6 = 578 HOT_GAS_HP6 = 579 LOW_PRESSURE_HP6 = 580 MEAN_PRESSURE_HP6 = 581 HIGH_PRESSURE_HP6 = 582 WP_WATER_FLOW_RATE_HP6 = 583 ACTUAL_TEMPERATURE_ROOM_TEMP_HC1 = 584 SET_TEMPERATURE_ROOM_TEMP_HC1 = 585 RELATIVE_HUMIDITY_ROOM_TEMP_HC1 = 586 DEW_POINT_TEMPERATURE_ROOM_TEMP_HC1 = 587 ACTUAL_TEMPERATURE_ROOM_TEMP_HC2 = 588 SET_TEMPERATURE_ROOM_TEMP_HC2 = 589 RELATIVE_HUMIDITY_ROOM_TEMP_HC2 = 590 DEW_POINT_TEMPERATURE_ROOM_TEMP_HC2 = 591 ACTUAL_TEMPERATURE_ROOM_TEMP_HC3 = 592 SET_TEMPERATURE_ROOM_TEMP_HC3 = 593 RELATIVE_HUMIDITY_ROOM_TEMP_HC3 = 594 DEW_POINT_TEMPERATURE_ROOM_TEMP_HC3 = 595 ACTUAL_TEMPERATURE_ROOM_TEMP_HC4 = 596 SET_TEMPERATURE_ROOM_TEMP_HC4 = 597 RELATIVE_HUMIDITY_ROOM_TEMP_HC4 = 598 DEW_POINT_TEMPERATURE_ROOM_TEMP_HC4 = 599 ACTUAL_TEMPERATURE_ROOM_TEMP_HC5 = 600 SET_TEMPERATURE_ROOM_TEMP_HC5 = 601 RELATIVE_HUMIDITY_ROOM_TEMP_HC5 = 602 DEW_POINT_TEMPERATURE_ROOM_TEMP_HC5 = 603 SET_TEMPERATURE_ROOM_TEMP_COOLING1 = 604 SET_TEMPERATURE_ROOM_TEMP_COOLING2 = 605 SET_TEMPERATURE_ROOM_TEMP_COOLING3 = 606 SET_TEMPERATURE_ROOM_TEMP_COOLING4 = 607 SET_TEMPERATURE_ROOM_TEMP_COOLING5 = 608 ACTUAL_TEMPERATURE_HK_3 = 609 SET_TEMPERATURE_HK_3 = 610 class WpmSystemParametersRegisters(IsgRegisters): OPERATING_MODE = 1501 COMFORT_TEMPERATURE_HK_1 = 1502 ECO_TEMPERATURE_HK_1 = 1503 HEATING_CURVE_RISE_HK_1 = 1504 COMFORT_TEMPERATURE_HK_2 = 1505 ECO_TEMPERATURE_HK_2 = 1506 HEATING_CURVE_RISE_HK_2 = 1507 FIXED_VALUE_OPERATION = 1508 DUAL_MODE_TEMP_HZG = 1509 COMFORT_TEMPERATURE = 1510 ECO_TEMPERATURE = 1511 DHW_STAGES = 1512 DUAL_MODE_TEMP_WW = 1513 SET_FLOW_TEMPERATURE_AREA = 1514 FLOW_TEMP_HYSTERESIS_AREA = 1515 SET_ROOM_TEMPERATURE_AREA = 1516 SET_FLOW_TEMPERATURE_FAN = 1517 FLOW_TEMP_HYSTERESIS_FAN = 1518 SET_ROOM_TEMPERATURE_FAN = 1519 RESET = 1520 RESTART_ISG = 1521 COMFORT_TEMPERATURE_HK_3 = 1550 ECO_TEMPERATURE_HK_3 = 1551 HEATING_CURVE_RISE_HK_3 = 1552 class WpmSystemStateRegisters(IsgRegisters): OPERATING_STATUS = 2501 POWER_OFF = 2502 OPERATING_STATUS_WPM_3 = 2503 FAULT_STATUS = 2504 BUS_STATUS = 2505 DEFROST_INITIATED = 2506 ACTIVE_ERROR = 2507 MESSAGE_NUMBER = 2508 HEATING_CIRCUIT_PUMP_1 = 2509 HEATING_CIRCUIT_PUMP_2 = 2510 HEATING_CIRCUIT_PUMP_3 = 2511 BUFFER_CHARGING_PUMP_1 = 2512 BUFFER_CHARGING_PUMP_2 = 2513 DHW_CHARGING_PUMP = 2514 SOURCE_PUMP = 2515 FAULT_OUTPUT = 2516 DHW_CIRCULATION_PUMP = 2517 WE_2_DHW = 2518 WE_2_HEATING = 2519 COOLING_MODE = 2520 MIXER_OPEN_HC2 = 2521 MIXER_CLOSE_HC2 = 2522 MIXER_OPEN_HC3 = 2523 MIXER_CLOSE_HC3 = 2524 NHZ_1 = 2525 NHZ_2 = 2526 NHZ_1_2 = 2527 HEATING_CIRCUIT_PUMP_4 = 2528 HEATING_CIRCUIT_PUMP_5 = 2529 BUFFER_CHARGING_PUMP_3 = 2530 BUFFER_CHARGING_PUMP_4 = 2531 BUFFER_CHARGING_PUMP_5 = 2532 BUFFER_CHARGING_PUMP_6 = 2533 DIFF_CONTROLLER_PUMP_1 = 2534 DIFF_CONTROLLER_PUMP_2 = 2535 POOL_PUMP_PRIMARY = 2536 POOL_PUMP_SECONDARY = 2537 MIXER_OPEN_HC4 = 2538 MIXER_CLOSE_HC4 = 2539 MIXER_OPEN_HC5 = 2540 MIXER_CLOSE_HC5 = 2541 COMPRESSOR_1 = 2542 COMPRESSOR_2 = 2543 COMPRESSOR_3 = 2544 COMPRESSOR_4 = 2545 COMPRESSOR_5 = 2546 COMPRESSOR_6 = 2547 class WpmEnergyDataRegisters(IsgRegisters): VD_HEATING_DAY = 3501 VD_HEATING_DAY_AND_TOTAL = 203502 VD_HEATING_TOTAL_LOW = 3502 VD_HEATING_TOTAL = 103502 VD_HEATING_TOTAL_HI = 3503 VD_DHW_DAY = 3504 VD_DHW_DAY_AND_TOTAL = 203505 VD_DHW_TOTAL_LOW = 3505 VD_DHW_TOTAL = 103505 VD_DHW_TOTAL_HI = 3506 NHZ_HEATING_TOTAL_LOW = 3507 NHZ_HEATING_TOTAL = 103507 NHZ_HEATING_TOTAL_HI = 3508 NHZ_DHW_TOTAL_LOW = 3509 NHZ_DHW_TOTAL = 103509 NHZ_DHW_TOTAL_HI = 3510 VD_HEATING_DAY_CONSUMED = 3511 VD_HEATING_DAY_AND_TOTAL_CONSUMED = 203512 VD_HEATING_TOTAL_LOW_CONSUMED = 3512 VD_HEATING_TOTAL_CONSUMED = 103512 VD_HEATING_TOTAL_HI_CONSUMED = 3513 VD_DHW_DAY_CONSUMED = 3514 VD_DHW_DAY_AND_TOTAL_CONSUMED = 203515 VD_DHW_TOTAL_LOW_CONSUMED = 3515 VD_DHW_TOTAL_CONSUMED = 103515 VD_DHW_TOTAL_HI_CONSUMED = 3516 VD_HEATING = 3517 VD_DHW = 3518 VD_COOLING = 3519 NHZ_1 = 3520 NHZ_2 = 3521 NHZ_1_2 = 3522 VD_HEATING_DAY_HP_1 = 3523 VD_HEATING_DAY_AND_TOTAL_HP_1 = 203524 VD_HEATING_TOTAL_LOW_HP_1 = 3524 VD_HEATING_TOTAL_HP_1 = 103524 VD_HEATING_TOTAL_HI_HP_1 = 3525 VD_DHW_DAY_HP_1 = 3526 VD_DHW_DAY_AND_TOTAL_HP_1 = 203527 VD_DHW_TOTAL_LOW_HP_1 = 3527 VD_DHW_TOTAL_HP_1 = 103527 VD_DHW_TOTAL_HI_HP_1 = 3528 NHZ_HEATING_TOTAL_LOW_HP_1 = 3529 NHZ_HEATING_TOTAL_HP_1 = 103529 NHZ_HEATING_TOTAL_HI_HP_1 = 3530 NHZ_DHW_TOTAL_LOW_HP_1 = 3531 NHZ_DHW_TOTAL_HP_1 = 103531 NHZ_DHW_TOTAL_HI_HP_1 = 3532 VD_HEATING_DAY_CONSUMED_HP_1 = 3533 VD_HEATING_DAY_AND_TOTAL_CONSUMED_HP_1 = 203534 VD_HEATING_TOTAL_LOW_CONSUMED_HP_1 = 3534 VD_HEATING_TOTAL_CONSUMED_HP_1 = 103534 VD_HEATING_TOTAL_HI_CONSUMED_HP_1 = 3535 VD_DHW_DAY_CONSUMEDHP_1 = 3536 VD_DHW_DAY_AND_TOTAL_CONSUMEDHP_1 = 203537 VD_DHW_TOTAL_LOW_CONSUMED_HP_1 = 3537 VD_DHW_TOTAL_CONSUMED_HP_1 = 103537 VD_DHW_TOTAL_HI_CONSUMED_HP_1 = 3538 VD_1_HEATING_HP_1 = 3539 VD_2_HEATING_HP_1 = 3540 VD_1_2_HEATING_HP_1 = 3541 VD_1_DHW_HP_1 = 3542 VD_2_DHW_HP_1 = 3543 VD_1_2_DHW_HP_1 = 3544 VD_COOLING_x_HP_1 = 3545 NHZ_1_REHEATING = 3546 NHZ_2_REHEATING = 3547 NHZ_1_2_REHEATING = 3548 VD_HEATING_DAY_HP_2 = 3549 VD_HEATING_DAY_AND_TOTAL_HP_2 = 203550 VD_HEATING_TOTAL_LOW_HP_2 = 3550 VD_HEATING_TOTAL_HP_2 = 103550 VD_HEATING_TOTAL_HI_HP_2 = 3551 VD_DHW_DAY_HP_2 = 3552 VD_DHW_DAY_AND_TOTAL_HP_2 = 203553 VD_DHW_TOTAL_LOW_HP_2 = 3553 VD_DHW_TOTAL_HP_2 = 103553 VD_DHW_TOTAL_HI_HP_2 = 3554 VD_HEATING_DAY_CONSUMED_HP_2 = 3555 VD_HEATING_DAY_AND_TOTAL_CONSUMED_HP_2 = 203556 VD_HEATING_TOTAL_LOW_CONSUMED_HP_2 = 3556 VD_HEATING_TOTAL_CONSUMED_HP_2 = 103556 VD_HEATING_TOTAL_HI_CONSUMED_HP_2 = 3557 VD_DHW_DAY_CONSUMED_HP_2 = 3558 VD_DHW_DAY_AND_TOTAL_CONSUMED_HP_2 = 203559 VD_DHW_TOTAL_LOW_CONSUMED_HP_2 = 3559 VD_DHW_TOTAL_CONSUMED_HP_2 = 103559 VD_DHW_TOTAL_HI_CONSUMED_HP_2 = 3560 VD_1_HEATING_HP_2 = 3561 VD_2_HEATING_HP_2 = 3562 VD_1_2_HEATING_HP_2 = 3563 VD_1_DHW_HP_2 = 3564 VD_2_DHW_HP_2 = 3565 VD_1_2_DHW_HP_2 = 3566 VD_COOLING_HP_2 = 3567 VD_HEATING_DAY_HP_3 = 3568 VD_HEATING_DAY_AND_TOTAL_HP_3 = 203569 VD_HEATING_TOTAL_LOW_HP_3 = 3569 VD_HEATING_TOTAL_HP_3 = 103569 VD_HEATING_TOTAL_HI_HP_3 = 3570 VD_DHW_DAY_HP_3 = 3571 VD_DHW_DAY_AND_TOTAL_HP_3 = 203572 VD_DHW_TOTAL_LOW_HP_3 = 3572 VD_DHW_TOTAL_HP_3 = 103572 VD_DHW_TOTAL_HI_HP_3 = 3573 VD_HEATING_DAY_CONSUMED_HP_3 = 3574 VD_HEATING_DAY_AND_TOTAL_CONSUMED_HP_3 = 203575 VD_HEATING_TOTAL_LOW_CONSUMED_HP_3 = 3575 VD_HEATING_TOTAL_CONSUMED_HP_3 = 103575 VD_HEATING_TOTAL_HI_CONSUMED_HP_3 = 3576 VD_DHW_DAY_CONSUMED_HP_3 = 3577 VD_DHW_DAY_AND_TOTAL_CONSUMED_HP_3 = 203578 VD_DHW_TOTAL_LOW_CONSUMED_HP_3 = 3578 VD_DHW_TOTAL_CONSUMED_HP_3 = 103578 VD_DHW_TOTAL_HI_CONSUMED_HP_3 = 3579 VD_1_HEATING_HP_3 = 3580 VD_2_HEATING_HP_3 = 3581 VD_1_2_HEATING_HP_3 = 3582 VD_1_DHW_HP_3 = 3583 VD_2_DHW_HP_3 = 3584 VD_1_2_DHW_HP_3 = 3585 VD_COOLING_HP_3 = 3586 WPM_SYSTEM_VALUES_REGISTERS = { WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FE7: ModbusRegister( address=501, name="ACTUAL TEMPERATURE FE7", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FE7 ), WpmSystemValuesRegisters.SET_TEMPERATURE_FE7: ModbusRegister(address=502, name="SET TEMPERATURE FE7", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_FE7), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FEK: ModbusRegister( address=503, name="ACTUAL TEMPERATURE FEK", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FEK ), WpmSystemValuesRegisters.SET_TEMPERATURE_FEK: ModbusRegister(address=504, name="SET TEMPERATURE FEK", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_FEK), WpmSystemValuesRegisters.RELATIVE_HUMIDITY: ModbusRegister(address=505, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE: ModbusRegister( address=506, name="DEW POINT TEMPERATURE", unit="°C", min=-40.0, max=30.0, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE ), WpmSystemValuesRegisters.OUTSIDE_TEMPERATURE: ModbusRegister( address=507, name="OUTSIDE TEMPERATURE", unit="°C", min=-60.0, max=80.0, data_type=2, key=WpmSystemValuesRegisters.OUTSIDE_TEMPERATURE ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_1: ModbusRegister( address=508, name="ACTUAL TEMPERATURE HK 1", unit="°C", min=0.0, max=40.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_1 ), WpmSystemValuesRegisters.SET_TEMPERATURE_HK_1_WPM3I: ModbusRegister( address=509, name="SET TEMPERATURE HK 1", unit="°C", min=0.0, max=65.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_HK_1_WPM3I ), WpmSystemValuesRegisters.SET_TEMPERATURE_HK_1: ModbusRegister( address=510, name="SET TEMPERATURE HK 1", unit="°C", min=0.0, max=40.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_HK_1 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_2: ModbusRegister( address=511, name="ACTUAL TEMPERATURE HK 2", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_2 ), WpmSystemValuesRegisters.SET_TEMPERATURE_HK_2: ModbusRegister( address=512, name="SET TEMPERATURE HK 2", unit="°C", min=0.0, max=65.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_HK_2 ), WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE_WP: ModbusRegister( address=513, name="ACTUAL FLOW TEMPERATURE WP", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE_WP ), WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE_NHZ: ModbusRegister( address=514, name="ACTUAL FLOW TEMPERATURE NHZ", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE_NHZ ), WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE: ModbusRegister( address=515, name="ACTUAL FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_FLOW_TEMPERATURE ), WpmSystemValuesRegisters.ACTUAL_RETURN_TEMPERATURE: ModbusRegister( address=516, name="ACTUAL RETURN TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_RETURN_TEMPERATURE ), WpmSystemValuesRegisters.SET_FIXED_TEMPERATURE: ModbusRegister( address=517, name="SET FIXED TEMPERATURE", unit="°C", min=20.0, max=50.0, data_type=2, key=WpmSystemValuesRegisters.SET_FIXED_TEMPERATURE ), WpmSystemValuesRegisters.ACTUAL_BUFFER_TEMPERATURE: ModbusRegister( address=518, name="ACTUAL BUFFER TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_BUFFER_TEMPERATURE ), WpmSystemValuesRegisters.SET_BUFFER_TEMPERATURE: ModbusRegister( address=519, name="SET BUFFER TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_BUFFER_TEMPERATURE ), WpmSystemValuesRegisters.HEATING_PRESSURE: ModbusRegister(address=520, name="HEATING PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HEATING_PRESSURE), WpmSystemValuesRegisters.FLOW_RATE: ModbusRegister(address=521, name="FLOW RATE", unit="l/min", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.FLOW_RATE), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_DHW: ModbusRegister( address=522, name="ACTUAL TEMPERATURE DHW", unit="°C", min=10.0, max=65.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_DHW ), WpmSystemValuesRegisters.SET_TEMPERATURE_DHW: ModbusRegister(address=523, name="SET TEMPERATURE DHW", unit="°C", min=10.0, max=65.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_DHW), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FAN: ModbusRegister( address=524, name="ACTUAL TEMPERATURE FAN", unit="K", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FAN ), WpmSystemValuesRegisters.SET_TEMPERATURE_FAN: ModbusRegister(address=525, name="SET TEMPERATURE FAN", unit="K", min=7.0, max=25.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_FAN), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_AREA: ModbusRegister( address=526, name="ACTUAL TEMPERATURE AREA", unit="K", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_AREA ), WpmSystemValuesRegisters.SET_TEMPERATURE_AREA: ModbusRegister( address=527, name="SET TEMPERATURE AREA", unit="K", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_AREA ), WpmSystemValuesRegisters.COLLECTOR_TEMPERATURE: ModbusRegister( address=528, name="COLLECTOR TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.COLLECTOR_TEMPERATURE ), WpmSystemValuesRegisters.CYLINDER_TEMPERATURE: ModbusRegister( address=529, name="CYLINDER TEMPERATURE", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.CYLINDER_TEMPERATURE ), WpmSystemValuesRegisters.RUNTIME: ModbusRegister(address=530, name="RUNTIME", unit="h", min=None, max=None, data_type=6, key=WpmSystemValuesRegisters.RUNTIME), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_EXTERNAL: ModbusRegister( address=531, name="ACTUAL TEMPERATURE EXTERNAL", unit="°C", min=10.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_EXTERNAL ), WpmSystemValuesRegisters.SET_TEMPERATURE_EXTERNAL: ModbusRegister( address=532, name="SET TEMPERATURE EXTERNAL", unit="K", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_EXTERNAL ), WpmSystemValuesRegisters.APPLICATION_LIMIT_HZG: ModbusRegister( address=533, name="APPLICATION LIMIT HZG", unit="°C", min=-40.0, max=40.0, data_type=2, key=WpmSystemValuesRegisters.APPLICATION_LIMIT_HZG ), WpmSystemValuesRegisters.APPLICATION_LIMIT_WW: ModbusRegister( address=534, name="APPLICATION LIMIT WW", unit="°C", min=-40.0, max=40.0, data_type=2, key=WpmSystemValuesRegisters.APPLICATION_LIMIT_WW ), WpmSystemValuesRegisters.RUNTIME_EHS: ModbusRegister(address=535, name="RUNTIME", unit="h", min=None, max=None, data_type=6, key=WpmSystemValuesRegisters.RUNTIME_EHS), WpmSystemValuesRegisters.SOURCE_TEMPERATURE: ModbusRegister(address=536, name="SOURCE TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SOURCE_TEMPERATURE), WpmSystemValuesRegisters.MIN_SOURCE_TEMPERATURE: ModbusRegister( address=537, name="MIN SOURCE TEMPERATURE", unit="°C", min=-10.0, max=10.0, data_type=2, key=WpmSystemValuesRegisters.MIN_SOURCE_TEMPERATURE ), WpmSystemValuesRegisters.SOURCE_PRESSURE: ModbusRegister(address=538, name="SOURCE PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.SOURCE_PRESSURE), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE: ModbusRegister(address=539, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE), WpmSystemValuesRegisters.HIGH_PRESSURE: ModbusRegister(address=540, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HIGH_PRESSURE), WpmSystemValuesRegisters.LOW_PRESSURE: ModbusRegister(address=541, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.LOW_PRESSURE), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP1: ModbusRegister( address=542, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP1 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP1: ModbusRegister(address=543, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP1), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP1: ModbusRegister( address=544, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP1 ), WpmSystemValuesRegisters.LOW_PRESSURE_HP1: ModbusRegister(address=545, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP1), WpmSystemValuesRegisters.MEAN_PRESSURE_HP1: ModbusRegister(address=546, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP1), WpmSystemValuesRegisters.HIGH_PRESSURE_HP1: ModbusRegister(address=547, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP1), WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP1: ModbusRegister( address=548, name="WP WATER FLOW RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP1 ), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP2: ModbusRegister( address=549, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP2 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP2: ModbusRegister(address=550, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP2), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP2: ModbusRegister( address=551, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP2 ), WpmSystemValuesRegisters.LOW_PRESSURE_HP2: ModbusRegister(address=552, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP2), WpmSystemValuesRegisters.MEAN_PRESSURE_HP2: ModbusRegister(address=553, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP2), WpmSystemValuesRegisters.HIGH_PRESSURE_HP2: ModbusRegister(address=554, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP2), WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP2: ModbusRegister( address=555, name="WP WATER FLOW RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP2 ), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP3: ModbusRegister( address=556, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP3 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP3: ModbusRegister(address=557, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP3), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP3: ModbusRegister( address=558, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP3 ), WpmSystemValuesRegisters.LOW_PRESSURE_HP3: ModbusRegister(address=559, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP3), WpmSystemValuesRegisters.MEAN_PRESSURE_HP3: ModbusRegister(address=560, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP3), WpmSystemValuesRegisters.HIGH_PRESSURE_HP3: ModbusRegister(address=561, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP3), WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP3: ModbusRegister( address=562, name="WP WATER FLOW RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP3 ), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP4: ModbusRegister( address=563, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP4 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP4: ModbusRegister(address=564, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP4), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP4: ModbusRegister( address=565, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP4 ), WpmSystemValuesRegisters.LOW_PRESSURE_HP4: ModbusRegister(address=566, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP4), WpmSystemValuesRegisters.MEAN_PRESSURE_HP4: ModbusRegister(address=567, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP4), WpmSystemValuesRegisters.HIGH_PRESSURE_HP4: ModbusRegister(address=568, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP4), WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP4: ModbusRegister( address=569, name="WP WATER FLOW RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP4 ), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP5: ModbusRegister( address=570, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP5 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP5: ModbusRegister(address=571, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP5), WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP5: ModbusRegister( address=572, name="HOT GAS TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_TEMPERATURE_HP5 ), WpmSystemValuesRegisters.LOW_PRESSURE_HP5: ModbusRegister(address=573, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP5), WpmSystemValuesRegisters.MEAN_PRESSURE_HP5: ModbusRegister(address=574, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP5), WpmSystemValuesRegisters.HIGH_PRESSURE_HP5: ModbusRegister(address=575, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP5), WpmSystemValuesRegisters.WP_WATER_RATE_HP5: ModbusRegister(address=576, name="WP WATER RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_RATE_HP5), WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP6: ModbusRegister( address=577, name="RETURN TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RETURN_TEMPERATURE_HP6 ), WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP6: ModbusRegister(address=578, name="FLOW TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.FLOW_TEMPERATURE_HP6), WpmSystemValuesRegisters.HOT_GAS_HP6: ModbusRegister(address=579, name="HOT GAS", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.HOT_GAS_HP6), WpmSystemValuesRegisters.LOW_PRESSURE_HP6: ModbusRegister(address=580, name="LOW PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.LOW_PRESSURE_HP6), WpmSystemValuesRegisters.MEAN_PRESSURE_HP6: ModbusRegister(address=581, name="MEAN PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.MEAN_PRESSURE_HP6), WpmSystemValuesRegisters.HIGH_PRESSURE_HP6: ModbusRegister(address=582, name="HIGH PRESSURE", unit="bar", min=None, max=None, data_type=7, key=WpmSystemValuesRegisters.HIGH_PRESSURE_HP6), WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP6: ModbusRegister( address=583, name="WP WATER FLOW RATE", unit="l/min", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.WP_WATER_FLOW_RATE_HP6 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC1: ModbusRegister( address=584, name="ACTUAL TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC1 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC1: ModbusRegister( address=585, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC1 ), WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC1: ModbusRegister( address=586, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC1 ), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC1: ModbusRegister( address=587, name="DEW POINT TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC1 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC2: ModbusRegister( address=588, name="ACTUAL TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC2 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC2: ModbusRegister( address=589, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC2 ), WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC2: ModbusRegister( address=590, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC2 ), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC2: ModbusRegister( address=591, name="DEW POINT TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC2 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC3: ModbusRegister( address=592, name="ACTUAL TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC3 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC3: ModbusRegister( address=593, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC3 ), WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC3: ModbusRegister( address=594, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC3 ), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC3: ModbusRegister( address=595, name="DEW POINT TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC3 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC4: ModbusRegister( address=596, name="ACTUAL TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC4 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC4: ModbusRegister( address=597, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC4 ), WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC4: ModbusRegister( address=598, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC4 ), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC4: ModbusRegister( address=599, name="DEW POINT TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC4 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC5: ModbusRegister( address=600, name="ACTUAL TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_ROOM_TEMP_HC5 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC5: ModbusRegister( address=601, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_HC5 ), WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC5: ModbusRegister( address=602, name="RELATIVE HUMIDITY", unit="%", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.RELATIVE_HUMIDITY_ROOM_TEMP_HC5 ), WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC5: ModbusRegister( address=603, name="DEW POINT TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.DEW_POINT_TEMPERATURE_ROOM_TEMP_HC5 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING1: ModbusRegister( address=604, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING1 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING2: ModbusRegister( address=605, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING2 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING3: ModbusRegister( address=606, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING3 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING4: ModbusRegister( address=607, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING4 ), WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING5: ModbusRegister( address=608, name="SET TEMPERATURE", unit="°C", min=None, max=None, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_ROOM_TEMP_COOLING5 ), WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_3: ModbusRegister( address=609, name="ACTUAL TEMPERATURE HK 3", unit="°C", min=0.0, max=90.0, data_type=2, key=WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_HK_3 ), WpmSystemValuesRegisters.SET_TEMPERATURE_HK_3: ModbusRegister( address=610, name="SET TEMPERATURE HK 3", unit="°C", min=0.0, max=65.0, data_type=2, key=WpmSystemValuesRegisters.SET_TEMPERATURE_HK_3 ), } WPM_SYSTEM_PARAMETERS_REGISTERS = { WpmSystemParametersRegisters.OPERATING_MODE: ModbusRegister(address=1501, name="OPERATING MODE", unit="", min=0.0, max=5.0, data_type=8, key=WpmSystemParametersRegisters.OPERATING_MODE), WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_1: ModbusRegister( address=1502, name="COMFORT TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_1 ), WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_1: ModbusRegister( address=1503, name="ECO TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_1 ), WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_1: ModbusRegister( address=1504, name="HEATING CURVE RISE", unit="", min=0.0, max=3.0, data_type=7, key=WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_1 ), WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_2: ModbusRegister( address=1505, name="COMFORT TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_2 ), WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_2: ModbusRegister( address=1506, name="ECO TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_2 ), WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_2: ModbusRegister( address=1507, name="HEATING CURVE RISE", unit="", min=0.0, max=3.0, data_type=7, key=WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_2 ), WpmSystemParametersRegisters.FIXED_VALUE_OPERATION: ModbusRegister( address=1508, name="FIXED VALUE OPERATION", unit="°C", min=20.0, max=70.0, data_type=2, key=WpmSystemParametersRegisters.FIXED_VALUE_OPERATION ), WpmSystemParametersRegisters.DUAL_MODE_TEMP_HZG: ModbusRegister( address=1509, name="DUAL MODE TEMP HZG", unit="°C", min=-40.0, max=40.0, data_type=2, key=WpmSystemParametersRegisters.DUAL_MODE_TEMP_HZG ), WpmSystemParametersRegisters.COMFORT_TEMPERATURE: ModbusRegister( address=1510, name="COMFORT TEMPERATURE", unit="°C", min=10.0, max=60.0, data_type=2, key=WpmSystemParametersRegisters.COMFORT_TEMPERATURE ), WpmSystemParametersRegisters.ECO_TEMPERATURE: ModbusRegister(address=1511, name="ECO TEMPERATURE", unit="°C", min=10.0, max=60.0, data_type=2, key=WpmSystemParametersRegisters.ECO_TEMPERATURE), WpmSystemParametersRegisters.DHW_STAGES: ModbusRegister(address=1512, name="DHW STAGES", unit="", min=0.0, max=6.0, data_type=8, key=WpmSystemParametersRegisters.DHW_STAGES), WpmSystemParametersRegisters.DUAL_MODE_TEMP_WW: ModbusRegister( address=1513, name="DUAL MODE TEMP WW", unit="°C", min=-40.0, max=40.0, data_type=2, key=WpmSystemParametersRegisters.DUAL_MODE_TEMP_WW ), WpmSystemParametersRegisters.SET_FLOW_TEMPERATURE_AREA: ModbusRegister( address=1514, name="SET FLOW TEMPERATURE", unit="°C", min=7.0, max=25.0, data_type=2, key=WpmSystemParametersRegisters.SET_FLOW_TEMPERATURE_AREA ), WpmSystemParametersRegisters.FLOW_TEMP_HYSTERESIS_AREA: ModbusRegister( address=1515, name="FLOW TEMP HYSTERESIS", unit="K", min=1.0, max=5.0, data_type=2, key=WpmSystemParametersRegisters.FLOW_TEMP_HYSTERESIS_AREA ), WpmSystemParametersRegisters.SET_ROOM_TEMPERATURE_AREA: ModbusRegister( address=1516, name="SET ROOM TEMPERATURE", unit="°C", min=20.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.SET_ROOM_TEMPERATURE_AREA ), WpmSystemParametersRegisters.SET_FLOW_TEMPERATURE_FAN: ModbusRegister( address=1517, name="SET FLOW TEMPERATURE", unit="°C", min=7.0, max=25.0, data_type=2, key=WpmSystemParametersRegisters.SET_FLOW_TEMPERATURE_FAN ), WpmSystemParametersRegisters.FLOW_TEMP_HYSTERESIS_FAN: ModbusRegister( address=1518, name="FLOW TEMP HYSTERESIS", unit="K", min=1.0, max=5.0, data_type=2, key=WpmSystemParametersRegisters.FLOW_TEMP_HYSTERESIS_FAN ), WpmSystemParametersRegisters.SET_ROOM_TEMPERATURE_FAN: ModbusRegister( address=1519, name="SET ROOM TEMPERATURE", unit="°C", min=20.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.SET_ROOM_TEMPERATURE_FAN ), WpmSystemParametersRegisters.RESET: ModbusRegister(address=1520, name="RESET", unit="", min=1.0, max=3.0, data_type=6, key=WpmSystemParametersRegisters.RESET), WpmSystemParametersRegisters.RESTART_ISG: ModbusRegister(address=1521, name="RESTART ISG", unit="", min=0.0, max=2.0, data_type=6, key=WpmSystemParametersRegisters.RESTART_ISG), WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_3: ModbusRegister( address=1550, name="COMFORT TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.COMFORT_TEMPERATURE_HK_3 ), WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_3: ModbusRegister( address=1551, name="ECO TEMPERATURE", unit="°C", min=5.0, max=30.0, data_type=2, key=WpmSystemParametersRegisters.ECO_TEMPERATURE_HK_3 ), WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_3: ModbusRegister( address=1552, name="HEATING CURVE RISE", unit="", min=0.0, max=3.0, data_type=7, key=WpmSystemParametersRegisters.HEATING_CURVE_RISE_HK_3 ), } WPM_SYSTEM_STATE_REGISTERS = { WpmSystemStateRegisters.OPERATING_STATUS: ModbusRegister(address=2501, name="OPERATING STATUS", unit="", min=None, max=None, data_type=6, key=WpmSystemStateRegisters.OPERATING_STATUS), WpmSystemStateRegisters.POWER_OFF: ModbusRegister(address=2502, name="POWER OFF", unit="", min=None, max=None, data_type=8, key=WpmSystemStateRegisters.POWER_OFF), WpmSystemStateRegisters.OPERATING_STATUS_WPM_3: ModbusRegister(address=2503, name="OPERATING STATUS", unit="", min=None, max=None, data_type=6, key=WpmSystemStateRegisters.OPERATING_STATUS_WPM_3), WpmSystemStateRegisters.FAULT_STATUS: ModbusRegister(address=2504, name="FAULT STATUS", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.FAULT_STATUS), WpmSystemStateRegisters.BUS_STATUS: ModbusRegister(address=2505, name="BUS STATUS", unit="", min=-4.0, max=0.0, data_type=6, key=WpmSystemStateRegisters.BUS_STATUS), WpmSystemStateRegisters.DEFROST_INITIATED: ModbusRegister(address=2506, name="DEFROST INITIATED", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.DEFROST_INITIATED), WpmSystemStateRegisters.ACTIVE_ERROR: ModbusRegister(address=2507, name="ACTIVE ERROR", unit="", min=0.0, max=65535.0, data_type=6, key=WpmSystemStateRegisters.ACTIVE_ERROR), WpmSystemStateRegisters.MESSAGE_NUMBER: ModbusRegister(address=2508, name="MESSAGE NUMBER", unit="", min=0.0, max=65535.0, data_type=6, key=WpmSystemStateRegisters.MESSAGE_NUMBER), WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_1: ModbusRegister( address=2509, name="HEATING CIRCUIT PUMP 1", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_1 ), WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_2: ModbusRegister( address=2510, name="HEATING CIRCUIT PUMP 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_2 ), WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_3: ModbusRegister( address=2511, name="HEATING CIRCUIT PUMP 3", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_3 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_1: ModbusRegister( address=2512, name="BUFFER CHARGING PUMP 1", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_1 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_2: ModbusRegister( address=2513, name="BUFFER CHARGING PUMP 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_2 ), WpmSystemStateRegisters.DHW_CHARGING_PUMP: ModbusRegister(address=2514, name="DHW CHARGING PUMP", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.DHW_CHARGING_PUMP), WpmSystemStateRegisters.SOURCE_PUMP: ModbusRegister(address=2515, name="SOURCE PUMP", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.SOURCE_PUMP), WpmSystemStateRegisters.FAULT_OUTPUT: ModbusRegister(address=2516, name="FAULT OUTPUT", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.FAULT_OUTPUT), WpmSystemStateRegisters.DHW_CIRCULATION_PUMP: ModbusRegister(address=2517, name="DHW CIRCULATION PUMP", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.DHW_CIRCULATION_PUMP), WpmSystemStateRegisters.WE_2_DHW: ModbusRegister(address=2518, name="WE 2 DHW", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.WE_2_DHW), WpmSystemStateRegisters.WE_2_HEATING: ModbusRegister(address=2519, name="WE 2 HEATING", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.WE_2_HEATING), WpmSystemStateRegisters.COOLING_MODE: ModbusRegister(address=2520, name="COOLING MODE", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COOLING_MODE), WpmSystemStateRegisters.MIXER_OPEN_HC2: ModbusRegister(address=2521, name="MIXER OPEN HC2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_OPEN_HC2), WpmSystemStateRegisters.MIXER_CLOSE_HC2: ModbusRegister(address=2522, name="MIXER CLOSE HC2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_CLOSE_HC2), WpmSystemStateRegisters.MIXER_OPEN_HC3: ModbusRegister(address=2523, name="MIXER OPEN HC3", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_OPEN_HC3), WpmSystemStateRegisters.MIXER_CLOSE_HC3: ModbusRegister(address=2524, name="MIXER CLOSE HC3", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_CLOSE_HC3), WpmSystemStateRegisters.NHZ_1: ModbusRegister(address=2525, name="NHZ 1 ", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.NHZ_1), WpmSystemStateRegisters.NHZ_2: ModbusRegister(address=2526, name="NHZ 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.NHZ_2), WpmSystemStateRegisters.NHZ_1_2: ModbusRegister(address=2527, name="NHZ 1 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.NHZ_1_2), WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_4: ModbusRegister( address=2528, name="HEATING CIRCUIT PUMP 4", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_4 ), WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_5: ModbusRegister( address=2529, name="HEATING CIRCUIT PUMP 5", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.HEATING_CIRCUIT_PUMP_5 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_3: ModbusRegister( address=2530, name="BUFFER CHARGING PUMP 3", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_3 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_4: ModbusRegister( address=2531, name="BUFFER CHARGING PUMP 4", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_4 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_5: ModbusRegister( address=2532, name="BUFFER CHARGING PUMP 5", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_5 ), WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_6: ModbusRegister( address=2533, name="BUFFER CHARGING PUMP 6", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.BUFFER_CHARGING_PUMP_6 ), WpmSystemStateRegisters.DIFF_CONTROLLER_PUMP_1: ModbusRegister( address=2534, name="DIFF CONTROLLER PUMP 1", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.DIFF_CONTROLLER_PUMP_1 ), WpmSystemStateRegisters.DIFF_CONTROLLER_PUMP_2: ModbusRegister( address=2535, name="DIFF CONTROLLER PUMP 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.DIFF_CONTROLLER_PUMP_2 ), WpmSystemStateRegisters.POOL_PUMP_PRIMARY: ModbusRegister(address=2536, name="POOL PUMP PRIMARY", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.POOL_PUMP_PRIMARY), WpmSystemStateRegisters.POOL_PUMP_SECONDARY: ModbusRegister(address=2537, name="POOL PUMP SECONDARY", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.POOL_PUMP_SECONDARY), WpmSystemStateRegisters.MIXER_OPEN_HC4: ModbusRegister(address=2538, name="MIXER OPEN HC4", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_OPEN_HC4), WpmSystemStateRegisters.MIXER_CLOSE_HC4: ModbusRegister(address=2539, name="MIXER CLOSE HC4", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_CLOSE_HC4), WpmSystemStateRegisters.MIXER_OPEN_HC5: ModbusRegister(address=2540, name="MIXER OPEN HC5", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_OPEN_HC5), WpmSystemStateRegisters.MIXER_CLOSE_HC5: ModbusRegister(address=2541, name="MIXER CLOSE HC5", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.MIXER_CLOSE_HC5), WpmSystemStateRegisters.COMPRESSOR_1: ModbusRegister(address=2542, name="COMPRESSOR 1", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_1), WpmSystemStateRegisters.COMPRESSOR_2: ModbusRegister(address=2543, name="COMPRESSOR 2", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_2), WpmSystemStateRegisters.COMPRESSOR_3: ModbusRegister(address=2544, name="COMPRESSOR 3", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_3), WpmSystemStateRegisters.COMPRESSOR_4: ModbusRegister(address=2545, name="COMPRESSOR 4", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_4), WpmSystemStateRegisters.COMPRESSOR_5: ModbusRegister(address=2546, name="COMPRESSOR 5", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_5), WpmSystemStateRegisters.COMPRESSOR_6: ModbusRegister(address=2547, name="COMPRESSOR 6", unit="", min=0.0, max=1.0, data_type=6, key=WpmSystemStateRegisters.COMPRESSOR_6), } WPM_ENERGY_DATA_REGISTERS = { WpmEnergyDataRegisters.VD_HEATING_DAY: ModbusRegister(address=3501, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW: ModbusRegister(address=3502, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI: ModbusRegister(address=3503, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI), WpmEnergyDataRegisters.VD_DHW_DAY: ModbusRegister(address=3504, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW: ModbusRegister(address=3505, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI: ModbusRegister(address=3506, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI), WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_LOW: ModbusRegister(address=3507, name="NHZ HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_LOW), WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_HI: ModbusRegister(address=3508, name="NHZ HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_HI), WpmEnergyDataRegisters.NHZ_DHW_TOTAL_LOW: ModbusRegister(address=3509, name="NHZ DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_DHW_TOTAL_LOW), WpmEnergyDataRegisters.NHZ_DHW_TOTAL_HI: ModbusRegister(address=3510, name="NHZ DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_DHW_TOTAL_HI), WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED: ModbusRegister( address=3511, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED: ModbusRegister( address=3512, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED: ModbusRegister( address=3513, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED ), WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED: ModbusRegister(address=3514, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED: ModbusRegister( address=3515, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED ), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED: ModbusRegister( address=3516, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED ), WpmEnergyDataRegisters.VD_HEATING: ModbusRegister(address=3517, name="VD HEATING", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING), WpmEnergyDataRegisters.VD_DHW: ModbusRegister(address=3518, name="VD DHW", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW), WpmEnergyDataRegisters.VD_COOLING: ModbusRegister(address=3519, name="VD COOLING", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_COOLING), WpmEnergyDataRegisters.NHZ_1: ModbusRegister(address=3520, name="NHZ 1", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_1), WpmEnergyDataRegisters.NHZ_2: ModbusRegister(address=3521, name="NHZ 2", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_2), WpmEnergyDataRegisters.NHZ_1_2: ModbusRegister(address=3522, name="NHZ 1_2", unit="h", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_1_2), WpmEnergyDataRegisters.VD_HEATING_DAY_HP_1: ModbusRegister(address=3523, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_HP_1), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_1: ModbusRegister( address=3524, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_1 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_1: ModbusRegister( address=3525, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_1 ), WpmEnergyDataRegisters.VD_DHW_DAY_HP_1: ModbusRegister(address=3526, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_HP_1), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_1: ModbusRegister(address=3527, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_1), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_1: ModbusRegister(address=3528, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_1), WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_LOW_HP_1: ModbusRegister( address=3529, name="NHZ HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_LOW_HP_1 ), WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_HI_HP_1: ModbusRegister( address=3530, name="NHZ HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_HEATING_TOTAL_HI_HP_1 ), WpmEnergyDataRegisters.NHZ_DHW_TOTAL_LOW_HP_1: ModbusRegister(address=3531, name="NHZ DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_DHW_TOTAL_LOW_HP_1), WpmEnergyDataRegisters.NHZ_DHW_TOTAL_HI_HP_1: ModbusRegister(address=3532, name="NHZ DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.NHZ_DHW_TOTAL_HI_HP_1), WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_1: ModbusRegister( address=3533, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_1 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_1: ModbusRegister( address=3534, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_1 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_1: ModbusRegister( address=3535, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_1 ), WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMEDHP_1: ModbusRegister(address=3536, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMEDHP_1), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_1: ModbusRegister( address=3537, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_1 ), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_1: ModbusRegister( address=3538, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_1 ), WpmEnergyDataRegisters.VD_1_HEATING_HP_1: ModbusRegister(address=3539, name="VD 1 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_HEATING_HP_1), WpmEnergyDataRegisters.VD_2_HEATING_HP_1: ModbusRegister(address=3540, name="VD 2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_HEATING_HP_1), WpmEnergyDataRegisters.VD_1_2_HEATING_HP_1: ModbusRegister(address=3541, name="VD 1_2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_HEATING_HP_1), WpmEnergyDataRegisters.VD_1_DHW_HP_1: ModbusRegister(address=3542, name="VD 1 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_DHW_HP_1), WpmEnergyDataRegisters.VD_2_DHW_HP_1: ModbusRegister(address=3543, name="VD 2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_DHW_HP_1), WpmEnergyDataRegisters.VD_1_2_DHW_HP_1: ModbusRegister(address=3544, name="VD 1_2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_DHW_HP_1), WpmEnergyDataRegisters.VD_COOLING_x_HP_1: ModbusRegister(address=3545, name="VD COOLING x", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_COOLING_x_HP_1), WpmEnergyDataRegisters.NHZ_1_REHEATING: ModbusRegister(address=3546, name="NHZ 1", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.NHZ_1_REHEATING), WpmEnergyDataRegisters.NHZ_2_REHEATING: ModbusRegister(address=3547, name="NHZ 2", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.NHZ_2_REHEATING), WpmEnergyDataRegisters.NHZ_1_2_REHEATING: ModbusRegister(address=3548, name="NHZ 1_2", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.NHZ_1_2_REHEATING), WpmEnergyDataRegisters.VD_HEATING_DAY_HP_2: ModbusRegister(address=3549, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_HP_2), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_2: ModbusRegister( address=3550, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_2 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_2: ModbusRegister( address=3551, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_2 ), WpmEnergyDataRegisters.VD_DHW_DAY_HP_2: ModbusRegister(address=3552, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_HP_2), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_2: ModbusRegister(address=3553, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_2), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_2: ModbusRegister(address=3554, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_2), WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_2: ModbusRegister( address=3555, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_2: ModbusRegister( address=3556, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_2: ModbusRegister( address=3557, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED_HP_2: ModbusRegister( address=3558, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_2: ModbusRegister( address=3559, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_2: ModbusRegister( address=3560, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_2 ), WpmEnergyDataRegisters.VD_1_HEATING_HP_2: ModbusRegister(address=3561, name="VD 1 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_HEATING_HP_2), WpmEnergyDataRegisters.VD_2_HEATING_HP_2: ModbusRegister(address=3562, name="VD 2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_HEATING_HP_2), WpmEnergyDataRegisters.VD_1_2_HEATING_HP_2: ModbusRegister(address=3563, name="VD 1_2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_HEATING_HP_2), WpmEnergyDataRegisters.VD_1_DHW_HP_2: ModbusRegister(address=3564, name="VD 1 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_DHW_HP_2), WpmEnergyDataRegisters.VD_2_DHW_HP_2: ModbusRegister(address=3565, name="VD 2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_DHW_HP_2), WpmEnergyDataRegisters.VD_1_2_DHW_HP_2: ModbusRegister(address=3566, name="VD 1_2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_DHW_HP_2), WpmEnergyDataRegisters.VD_COOLING_HP_2: ModbusRegister(address=3567, name="VD COOLING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_COOLING_HP_2), WpmEnergyDataRegisters.VD_HEATING_DAY_HP_3: ModbusRegister(address=3568, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_HP_3), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_3: ModbusRegister( address=3569, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_HP_3 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_3: ModbusRegister( address=3570, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_HP_3 ), WpmEnergyDataRegisters.VD_DHW_DAY_HP_3: ModbusRegister(address=3571, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_HP_3), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_3: ModbusRegister(address=3572, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_HP_3), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_3: ModbusRegister(address=3573, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_HP_3), WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_3: ModbusRegister( address=3574, name="VD HEATING DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_DAY_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_3: ModbusRegister( address=3575, name="VD HEATING TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_LOW_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_3: ModbusRegister( address=3576, name="VD HEATING TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_HEATING_TOTAL_HI_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED_HP_3: ModbusRegister( address=3577, name="VD DHW DAY", unit="kWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_DAY_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_3: ModbusRegister( address=3578, name="VD DHW TOTAL", unit="kWh", min=0.0, max=999.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_LOW_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_3: ModbusRegister( address=3579, name="VD DHW TOTAL", unit="MWh", min=0.0, max=65535.0, data_type=6, key=WpmEnergyDataRegisters.VD_DHW_TOTAL_HI_CONSUMED_HP_3 ), WpmEnergyDataRegisters.VD_1_HEATING_HP_3: ModbusRegister(address=3580, name="VD 1 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_HEATING_HP_3), WpmEnergyDataRegisters.VD_2_HEATING_HP_3: ModbusRegister(address=3581, name="VD 2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_HEATING_HP_3), WpmEnergyDataRegisters.VD_1_2_HEATING_HP_3: ModbusRegister(address=3582, name="VD 1_2 HEATING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_HEATING_HP_3), WpmEnergyDataRegisters.VD_1_DHW_HP_3: ModbusRegister(address=3583, name="VD 1 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_DHW_HP_3), WpmEnergyDataRegisters.VD_2_DHW_HP_3: ModbusRegister(address=3584, name="VD 2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_2_DHW_HP_3), WpmEnergyDataRegisters.VD_1_2_DHW_HP_3: ModbusRegister(address=3585, name="VD 1_2 DHW", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_1_2_DHW_HP_3), WpmEnergyDataRegisters.VD_COOLING_HP_3: ModbusRegister(address=3586, name="VD COOLING", unit="h", min=None, max=None, data_type=6, key=WpmEnergyDataRegisters.VD_COOLING_HP_3), } class WpmStiebelEltronAPI(StiebelEltronAPI): def __init__(self, host: str, port: int = 502, slave: int = 1) -> None: super().__init__( [ ModbusRegisterBlock(base_address=500, count=110, name="System Values", registers=WPM_SYSTEM_VALUES_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=1500, count=52, name="System Parameters", registers=WPM_SYSTEM_PARAMETERS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=2500, count=47, name="System State", registers=WPM_SYSTEM_STATE_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=3500, count=86, name="Energy Data", registers=WPM_ENERGY_DATA_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ModbusRegisterBlock(base_address=4000, count=3, name="Energy Management Settings", registers=ENERGY_MANAGEMENT_SETTINGS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=5000, count=2, name="Energy System Information", registers=ENERGY_SYSTEM_INFORMATION_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ], host, port, slave, ) async def async_update(self): """Request current values from heat pump.""" await super().async_update() for registerblock in self._register_blocks: if registerblock.name == ENERGY_DATA_BLOCK_NAME: registers = [r.value for r in WpmEnergyDataRegisters] registers.sort() for register in registers: if register > VIRTUAL_REGISTER_OFFSET: if register > VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET: total_key = WpmEnergyDataRegisters(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET + VIRTUAL_REGISTER_OFFSET) day_key = WpmEnergyDataRegisters(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET - 1) total_value = self._data.get(total_key) day_value = self._data.get(day_key) if total_value is not None and day_value is not None: prev_value = self._previous_data.get(WpmEnergyDataRegisters(register)) if prev_value is not None: self._data[WpmEnergyDataRegisters(register)] = max(total_value + day_value, prev_value) else: self._data[WpmEnergyDataRegisters(register)] = total_value + day_value else: low_key = WpmEnergyDataRegisters(register - VIRTUAL_REGISTER_OFFSET) high_key = WpmEnergyDataRegisters(register - VIRTUAL_REGISTER_OFFSET + 1) high_value = self._data.get(high_key) low_value = self._data.get(low_key) if high_value is not None and low_value is not None: self._data[WpmEnergyDataRegisters(register)] = high_value * 1000 + low_value python-stiebel-eltron-0.2.0/scripts/000077500000000000000000000000001503672511200174515ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/scripts/gen.sh000077500000000000000000000001061503672511200205560ustar00rootroot00000000000000#!/bin/sh uv run scripts/generate.py uvx ruff format pystiebeleltron python-stiebel-eltron-0.2.0/scripts/generate.py000066400000000000000000000107731503672511200216250ustar00rootroot00000000000000"""Generate python files to access the stiebel eltron heat pumps.""" from pathlib import Path import csv from dataclasses import dataclass from jinja2 import Environment, FileSystemLoader, Template, select_autoescape from pystiebeleltron import RegisterType ENERGY_DATA_BLOCK_NAME = "Energy Data" @dataclass class ModbusFile: """Register file class.""" name: str path: Path register_type: RegisterType def python_name(name: str, suffix: str = "") -> str: """Generate a valid python variable name.""" if suffix == "": result = name.strip() else: result = name + "_" + suffix.strip() return result.replace(" ", "_") def python_class_name(name: str) -> str: """Generate a valid python variable name.""" return name.replace(" ", "") def float_or_none(value: str) -> float | None: """Calculate a float value or none.""" if value == "": return None return float(value) def get_base_address(registers: list) -> int: """Get the base address from a register block.""" result = 35000 for register in registers: result = min(result, int(register[0])) return result - 1 def get_block_len(registers: list) -> int: """Get the base address from a register block.""" base = 35000 highest = 0 for register in registers: base = min(base, int(register[0])) highest = max(highest, int(register[0])) return highest - base + 1 def generate_heatpump( root_path: Path, template: Template, modbus_files: list[ModbusFile], heatpump_type: str, ): """Generate the python file for a heat pump.""" register_blocks = [] for modbus_file in modbus_files: with modbus_file.path.open("r") as f: reader = csv.reader(f) data = list(reader) api_data = data[1:] register_blocks.append( { "name": modbus_file.name, "count": get_block_len(api_data), "base_address": get_base_address(api_data), "register_block": api_data, "register_type": modbus_file.register_type, } ) generated_content = template.render(registers=register_blocks, heatpump_type=heatpump_type) generated_path = root_path / f"pystiebeleltron/{heatpump_type.lower()}.py" with generated_path.open("w") as f: f.write(generated_content) def main() -> None: """Generate the python files.""" root = Path.cwd() scripts_path = Path(__file__).parent env = Environment( loader=FileSystemLoader(str(scripts_path / "templates")), autoescape=select_autoescape(), ) env.globals.update(python_name=python_name, python_class_name=python_class_name, float_or_none=float_or_none, ENERGY_DATA_BLOCK_NAME=ENERGY_DATA_BLOCK_NAME) wpm_template = env.get_template("wpmtemplate.j2") wpm_modbus_files = [ ModbusFile( name="System Values", path=root / "api/wpm_system_values.csv", register_type=RegisterType.INPUT_REGISTER, ), ModbusFile( name="System Parameters", path=root / "api/wpm_system_parameters.csv", register_type=RegisterType.HOLDING_REGISTER, ), ModbusFile( name="System State", path=root / "api/wpm_system_state.csv", register_type=RegisterType.INPUT_REGISTER, ), ModbusFile( name="Energy Data", path=root / "api/wpm_energy_data.csv", register_type=RegisterType.INPUT_REGISTER, ), ] generate_heatpump(root, wpm_template, wpm_modbus_files, "Wpm") lwz_template = env.get_template("lwztemplate.j2") lwz_modbus_files = [ ModbusFile( name="System Values", path=root / "api/lwz_system_values.csv", register_type=RegisterType.INPUT_REGISTER, ), ModbusFile( name="System Parameters", path=root / "api/lwz_system_parameters.csv", register_type=RegisterType.HOLDING_REGISTER, ), ModbusFile( name="System State", path=root / "api/lwz_system_state.csv", register_type=RegisterType.INPUT_REGISTER, ), ModbusFile( name="Energy Data", path=root / "api/lwz_energy_data.csv", register_type=RegisterType.INPUT_REGISTER, ), ] generate_heatpump(root, lwz_template, lwz_modbus_files, "Lwz") if __name__ == "__main__": main() print("Done!") python-stiebel-eltron-0.2.0/scripts/templates/000077500000000000000000000000001503672511200214475ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/scripts/templates/lwztemplate.j2000066400000000000000000000172411503672511200242610ustar00rootroot00000000000000"""Modbus api for stiebel eltron heat pumps. This file is generated. Do not modify it manually.""" from enum import Enum from . import ModbusRegister, ModbusRegisterBlock, StiebelEltronAPI, IsgRegisters, RegisterType, ENERGY_DATA_BLOCK_NAME, VIRTUAL_REGISTER_OFFSET, VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET, ENERGY_MANAGEMENT_SETTINGS_REGISTERS, ENERGY_SYSTEM_INFORMATION_REGISTERS {% for registerblock in registers %} class {{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers(IsgRegisters): {% for register in registerblock["register_block"] %} {{python_name(register[1], register[10])}} = {{register[0]}}{%if registerblock["name"]=="Energy Data" and register[10][:3]=="LOW" %} {{python_name(register[1], register[10][3:].strip())}} = {{register[0] | int + 100000}} {% endif %}{%if register[1][-3:]=="DAY" %} {{python_name(register[1]+"_AND_TOTAL", register[10].strip())}} = {{register[0] | int + 200001}} {% endif %} {% endfor %} {%if registerblock["name"]=="System Values"%}COMPRESSOR_STARTS = 100032{% endif %} {% endfor %} {% for registerblock in registers %} {{heatpump_type.upper()}}_{{python_name(registerblock["name"]).upper()}}_REGISTERS = { {% for register in registerblock["register_block"] %} {{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers.{{python_name(register[1], register[10])}}: ModbusRegister(address={{register[0]}}, name="{{register[1]}}", unit="{{register[8]}}", min={{float_or_none(register[5])}}, max={{float_or_none(register[6])}}, data_type={{register[7]}}, key={{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers.{{python_name(register[1], register[10])}}),{% endfor %} } {% endfor %} class OperatingMode(Enum): """Enum for the operation mode of the heat pump.""" # AUTOMATIK AUTOMATIC = 11 # BEREITSCHAFT STANDBY = 1 # TAGBETRIEB DAY_MODE = 3 # ABSENKBETRIEB SETBACK_MODE = 4 # WARMWASSER DHW = 5 # HANDBETRIEB MANUAL_MODE = 14 # NOTBETRIEB EMERGENCY_OPERATION = 0 class {{heatpump_type}}StiebelEltronAPI(StiebelEltronAPI): def __init__(self, host: str, port: int = 502, slave: int = 1) -> None: super().__init__([ {% for registerblock in registers %} ModbusRegisterBlock(base_address={{registerblock["base_address"]}}, count={{registerblock["count"]}}, name="{{registerblock["name"]}}", registers={{heatpump_type.upper()}}_{{python_name(registerblock["name"]).upper()}}_REGISTERS, register_type={{registerblock["register_type"]}}),{% endfor %} ModbusRegisterBlock(base_address=4000, count=3, name="Energy Management Settings", registers=ENERGY_MANAGEMENT_SETTINGS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=5000, count=2, name="Energy System Information", registers=ENERGY_SYSTEM_INFORMATION_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ], host, port, slave) async def async_update(self): """Request current values from heat pump.""" await super().async_update() for registerblock in self._register_blocks: if registerblock.name == ENERGY_DATA_BLOCK_NAME: registers = [r.value for r in {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers] registers.sort() for register in registers: if register > VIRTUAL_REGISTER_OFFSET: if register > VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET: total_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET + VIRTUAL_REGISTER_OFFSET) day_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET - 1) total_value = self._data.get(total_key) day_value = self._data.get(day_key) if total_value is not None and day_value is not None: prev_value = self._previous_data.get({{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)) if prev_value is not None: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = max(total_value + day_value, prev_value) else: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = total_value + day_value else: low_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_REGISTER_OFFSET) high_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_REGISTER_OFFSET + 1) high_value = self._data.get(high_key) low_value = self._data.get(low_key) if high_value is not None and low_value is not None: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = high_value * 1000 + low_value compressor_starts_high = self.get_register_value(LwzSystemValuesRegisters.COMPRESSOR_STARTS_HI) if compressor_starts_high is None or compressor_starts_high == 32768: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = 32768 else: compressor_starts_low = self.get_register_value(LwzSystemValuesRegisters.COMPRESSOR_STARTS_LOW) if compressor_starts_low is None: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = compressor_starts_high * 1000 else: self._data[LwzSystemValuesRegisters.COMPRESSOR_STARTS] = compressor_starts_high * 1000 + compressor_starts_low def get_current_temp(self): """Get the current room temperature.""" return self.get_register_value(LwzSystemValuesRegisters.ACTUAL_ROOM_T_HC1) def get_target_temp(self): """Get the target room temperature.""" return self.get_register_value(LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1) async def set_target_temp(self, temp): """Set the target room temperature (day)(HC1).""" await self.write_register_value(LwzSystemParametersRegisters.ROOM_TEMPERATURE_DAY_HK1, temp) def get_current_humidity(self): """Get the current room humidity.""" return self.get_register_value(LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC1) # Handle operation mode def get_operation(self) -> OperatingMode: """Return the current mode of operation.""" op_mode = int(self.get_register_value(LwzSystemParametersRegisters.OPERATING_MODE)) return OperatingMode(op_mode) async def set_operation(self, mode: OperatingMode): """Set the operation mode.""" await self.write_register_value(LwzSystemParametersRegisters.OPERATING_MODE, mode.value) def get_heating_status(self) -> bool: """Return heater status.""" return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & (1 << 2)) def get_cooling_status(self) -> bool: """Cooling status.""" return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & (1 << 3)) def get_filter_alarm_status(self) -> bool: """Return filter alarm.""" filter_mask = (1 << 8) | (1 << 12) | (1 << 13) return bool(int(self.get_register_value(LwzSystemStateRegisters.OPERATING_STATUS)) & filter_mask) python-stiebel-eltron-0.2.0/scripts/templates/wpmtemplate.j2000066400000000000000000000115261503672511200242500ustar00rootroot00000000000000"""Modbus api for stiebel eltron heat pumps. This file is generated. Do not modify it manually.""" from . import ModbusRegister, ModbusRegisterBlock, StiebelEltronAPI, IsgRegisters, RegisterType, ENERGY_DATA_BLOCK_NAME, VIRTUAL_REGISTER_OFFSET, ENERGY_MANAGEMENT_SETTINGS_REGISTERS, ENERGY_SYSTEM_INFORMATION_REGISTERS, VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET {% for registerblock in registers %} class {{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers(IsgRegisters): {% for register in registerblock["register_block"] %} {{python_name(register[1], register[11])}} = {{register[0]}} {%if registerblock["name"]=="Energy Data" and register[11][:3]=="LOW" %} {{python_name(register[1], register[11][3:].strip())}} = {{register[0] | int + 100000}}{% endif %} {%if register[1][-3:]=="DAY" %} {{python_name(register[1]+"_AND_TOTAL", register[11].strip())}} = {{register[0] | int + 200001}} {% endif %} {% endfor %} {% endfor %} {% for registerblock in registers %} {{heatpump_type.upper()}}_{{python_name(registerblock["name"]).upper()}}_REGISTERS = { {% for register in registerblock["register_block"] %} {{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers.{{python_name(register[1], register[11])}}: ModbusRegister(address={{register[0]}}, name="{{register[1]}}", unit="{{register[9]}}", min={{float_or_none(register[6])}}, max={{float_or_none(register[7])}}, data_type={{register[8]}}, key={{heatpump_type}}{{python_class_name(registerblock["name"])}}Registers.{{python_name(register[1], register[11])}}),{% endfor %} } {% endfor %} class {{heatpump_type}}StiebelEltronAPI(StiebelEltronAPI): def __init__(self, host: str, port: int = 502, slave: int = 1) -> None: super().__init__([ {% for registerblock in registers %} ModbusRegisterBlock(base_address={{registerblock["base_address"]}}, count={{registerblock["count"]}}, name="{{registerblock["name"]}}", registers={{heatpump_type.upper()}}_{{python_name(registerblock["name"]).upper()}}_REGISTERS, register_type={{registerblock["register_type"]}}),{% endfor %} ModbusRegisterBlock(base_address=4000, count=3, name="Energy Management Settings", registers=ENERGY_MANAGEMENT_SETTINGS_REGISTERS, register_type=RegisterType.HOLDING_REGISTER), ModbusRegisterBlock(base_address=5000, count=2, name="Energy System Information", registers=ENERGY_SYSTEM_INFORMATION_REGISTERS, register_type=RegisterType.INPUT_REGISTER), ], host, port, slave) async def async_update(self): """Request current values from heat pump.""" await super().async_update() for registerblock in self._register_blocks: if registerblock.name == ENERGY_DATA_BLOCK_NAME: registers = [r.value for r in {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers] registers.sort() for register in registers: if register > VIRTUAL_REGISTER_OFFSET: if register > VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET: total_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET + VIRTUAL_REGISTER_OFFSET) day_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_TOTAL_AND_DAY_REGISTER_OFFSET - 1) total_value = self._data.get(total_key) day_value = self._data.get(day_key) if total_value is not None and day_value is not None: prev_value = self._previous_data.get({{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)) if prev_value is not None: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = max(total_value + day_value, prev_value) else: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = total_value + day_value else: low_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_REGISTER_OFFSET) high_key = {{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register - VIRTUAL_REGISTER_OFFSET + 1) high_value = self._data.get(high_key) low_value = self._data.get(low_key) if high_value is not None and low_value is not None: self._data[{{heatpump_type}}{{python_class_name(ENERGY_DATA_BLOCK_NAME)}}Registers(register)] = high_value * 1000 + low_value python-stiebel-eltron-0.2.0/test/000077500000000000000000000000001503672511200167415ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/test/__init__.py000066400000000000000000000000001503672511200210400ustar00rootroot00000000000000python-stiebel-eltron-0.2.0/test/mock_modbus_server.py000066400000000000000000000161321503672511200232060ustar00rootroot00000000000000#!/bin/env python """ Pymodbus Asynchronous Server Example -------------------------------------------------------------------------- The asynchronous server is a high performance implementation using the twisted library as its backend. This allows it to scale to many thousands of nodes which can be helpful for testing monitoring software. """ # --------------------------------------------------------------------------- # # import the various server implementations # --------------------------------------------------------------------------- # from pymodbus.server import StartTcpServer, ServerStop from pymodbus.device import ModbusDeviceIdentification from pymodbus.datastore import ModbusSequentialDataBlock from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext class MockModbusServer(object): # --------------------------------------------------------------------------- # # configure the service logging # --------------------------------------------------------------------------- # import logging FORMAT = ('%(asctime)-15s %(threadName)-15s' ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s') logging.basicConfig(format=FORMAT) log = logging.getLogger() log.setLevel(logging.DEBUG) def run_async_server(self): # ----------------------------------------------------------------------- # # initialize your data store # ----------------------------------------------------------------------- # # The datastores only respond to the addresses that they are initialized to # Therefore, if you initialize a DataBlock to addresses from 0x00 to 0xFF, # a request to 0x100 will respond with an invalid address exception. # This is because many devices exhibit this kind of behavior (but not all) # # block = ModbusSequentialDataBlock(0x00, [0]*0xff) # # Continuing, you can choose to use a sequential or a sparse DataBlock in # your data context. The difference is that the sequential has no gaps in # the data while the sparse can. Once again, there are devices that exhibit # both forms of behavior:: # # block = ModbusSparseDataBlock({0x00: 0, 0x05: 1}) # block = ModbusSequentialDataBlock(0x00, [0]*5) # # Alternately, you can use the factory methods to initialize the DataBlocks # or simply do not pass them to have them initialized to 0x00 on the full # address range:: # # store = ModbusSlaveContext(di = ModbusSequentialDataBlock.create()) # store = ModbusSlaveContext() # # Finally, you are allowed to use the same DataBlock reference for every # table or you you may use a seperate DataBlock for each table. # This depends if you would like functions to be able to access and modify # the same data or not:: # # block = ModbusSequentialDataBlock(0x00, [0]*0xff) # store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) # # The server then makes use of a server context that allows the server to # respond with different slave contexts for different unit ids. By default # it will return the same context for every unit id supplied (broadcast # mode). # However, this can be overloaded by setting the single flag to False # and then supplying a dictionary of unit id to context mapping:: # # slaves = { # 0x01: ModbusSlaveContext(...), # 0x02: ModbusSlaveContext(...), # 0x03: ModbusSlaveContext(...), # } # context = ModbusServerContext(slaves=slaves, single=False) # # The slave context can also be initialized in zero_mode which means that a # request to address(0-7) will map to the address (0-7). The default is # False which is based on section 4.4 of the specification, so address(0-7) # will map to (1-8):: # # store = ModbusSlaveContext(..., zero_mode=True) # ----------------------------------------------------------------------- # store = ModbusSlaveContext( hr=ModbusSequentialDataBlock(0, [0]*3000), ir=ModbusSequentialDataBlock(0, [0]*3000)) self.context = ModbusServerContext(slaves=store, single=True) # ----------------------------------------------------------------------- # # initialize the server information # ----------------------------------------------------------------------- # # If you don't set this or any fields, they are defaulted to empty strings. # ----------------------------------------------------------------------- # identity = ModbusDeviceIdentification() identity.VendorName = 'Pymodbus' identity.ProductCode = 'PM' identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' identity.ProductName = 'Pymodbus Server' identity.ModelName = 'Pymodbus Server' identity.MajorMinorRevision = '1.5' # ----------------------------------------------------------------------- # # run the server you want # ----------------------------------------------------------------------- # # TCP Server StartTcpServer(self.context, identity=identity, address=("localhost", 5020)) def stop_async_server(self): ServerStop() def update_context(self, register, address, values): """ Update values of the active context. It should be noted that there is a race condition for the update. :param register: Type of register to update, 3: holding register 4: input register :param address: The starting address of the value to be changed :param values: List of values """ assert register == 3 or register == 4 slave_id = 0x00 old_values = self.context[slave_id].getValues(register, address, count=1) self.log.debug("Change value at address {} from {} to {}".format( address, old_values, values)) self.context[slave_id].setValues(register, address, values) def update_holding_register(self, address, value): """ Update value of a holding register. :param address: Address to update :param value: Value to save """ self.log.debug("Update holding register: {}:{}".format(address, int(value))) self.update_context(3, address, [int(value)]) def update_input_register(self, address, value): """ Update value of an input register. :param address: Address to update :param value: Value to save """ self.log.debug("Update input register: {}:{}".format(address, int(value))) self.update_context(4, address, [int(value)]) if __name__ == "__main__": mms = MockModbusServer() mms.run_async_server() python-stiebel-eltron-0.2.0/test/test_pystiebeleltron.py000066400000000000000000000065741503672511200236120ustar00rootroot00000000000000#!/usr/bin/env python import os import time import pytest # Import modbus mockup server requirements from threading import Thread from test.mock_modbus_server import MockModbusServer as ModbusServer # Import client requirementss from pymodbus.client import ModbusTcpClient as ModbusClient from pystiebeleltron import pystiebeleltron as pyse # Modbus server connection details host_ip = "127.0.0.1" #"192.168.1.20" host_port = 5020 #502 slave = 1 class TestStiebelEltronApi: #__slots__ = 'api' @pytest.fixture(scope="module") def pymb_s(self, request): mb_s = ModbusServer() # Cleanup after last test did run (will run as well, if something fails in setup). def fin(): stop_thread = Thread(target=mb_s.stop_async_server, name="StopReactor") stop_thread.start() if stop_thread.is_alive(): stop_thread.join() if mms_thread.is_alive(): mms_thread.join() request.addfinalizer(fin) # Start Mock Modbus server mms_thread = Thread(target=mb_s.run_async_server, name="MockModbusServer") mms_thread.start() time.sleep(0.1) return mb_s @pytest.fixture(scope="module") def pyse_api(self, request, pymb_s): # parameter pymb_s leads to call of fixture mb_c = ModbusClient(host=host_ip, port=host_port, timeout=2) api = pyse.StiebelEltronAPI(mb_c, slave, update_on_read=True) # Cleanup after last test (will run as well, if setup fails). def fin(): mb_c.close() time.sleep(0.5) request.addfinalizer(fin) # Connect Modbus client connected = mb_c.connect() assert connected # Read values from device (server) success = api.update() assert success return api def test_temperature_read(self, pyse_api, pymb_s): pymb_s.update_input_register(0, 21.5*10) assert pyse_api.get_current_temp() == 21.5 pymb_s.update_holding_register(1001, 22.5*10) assert pyse_api.get_target_temp() == 22.5 def test_temperature_write(self, pyse_api): temperature = 22.5 pyse_api.set_target_temp(temperature) time.sleep(3) assert pyse_api.get_target_temp() == temperature def test_operation(self, pyse_api): operation = 'DHW' pyse_api.set_operation(operation) time.sleep(3) assert pyse_api.get_operation() == operation def test_humidity(self, pyse_api, pymb_s): humidity = 49.5 pymb_s.update_input_register(2, humidity*10) assert pyse_api.get_current_humidity() == humidity def test_statuses(self, pyse_api, pymb_s): pymb_s.update_input_register(2000, 0x0004) assert pyse_api.get_heating_status() is True assert pyse_api.get_cooling_status() is False assert pyse_api.get_filter_alarm_status() is False pymb_s.update_input_register(2000, 0x0008) assert pyse_api.get_heating_status() is False assert pyse_api.get_cooling_status() is True assert pyse_api.get_filter_alarm_status() is False pymb_s.update_input_register(2000, 0x2100) assert pyse_api.get_heating_status() is False assert pyse_api.get_cooling_status() is False assert pyse_api.get_filter_alarm_status() is True python-stiebel-eltron-0.2.0/test/test_stiebel_eltron.py000066400000000000000000000046331503672511200233720ustar00rootroot00000000000000import pytest from pystiebeleltron.lwz import LwzEnergyDataRegisters, LwzStiebelEltronAPI, LwzSystemValuesRegisters, OperatingMode from pystiebeleltron.wpm import WpmEnergyDataRegisters, WpmStiebelEltronAPI, WpmSystemValuesRegisters from pymodbus.pdu.register_message import ( ReadInputRegistersResponse, ) async def read_registers(client, address: int, *, count: int = 1, slave: int = 0, no_response_expected: bool = False) -> ReadInputRegistersResponse: """Read a slice from the input register.""" return ReadInputRegistersResponse(address=address, count=count, registers=list(range(count))) @pytest.mark.asyncio() async def test_wpm(mocker): api = WpmStiebelEltronAPI("localhost") mock_connect = mocker.patch("pymodbus.client.AsyncModbusTcpClient.connect") mock_close = mocker.patch("pymodbus.client.AsyncModbusTcpClient.close") mocker.patch("pymodbus.client.AsyncModbusTcpClient.read_holding_registers", read_registers) mocker.patch("pymodbus.client.AsyncModbusTcpClient.read_input_registers", read_registers) await api.connect() mock_connect.assert_called_once() await api.async_update() assert api.get_register_value(WpmSystemValuesRegisters.ACTUAL_TEMPERATURE_FEK) == 0.2 assert api.get_register_value(WpmEnergyDataRegisters.VD_HEATING_DAY_AND_TOTAL_CONSUMED) == 12021 await api.close() mock_close.assert_called_once() @pytest.mark.asyncio() async def test_lwz(mocker): api = LwzStiebelEltronAPI("localhost") mock_connect = mocker.patch("pymodbus.client.AsyncModbusTcpClient.connect") mock_close = mocker.patch("pymodbus.client.AsyncModbusTcpClient.close") mocker.patch("pymodbus.client.AsyncModbusTcpClient.read_holding_registers", read_registers) mocker.patch("pymodbus.client.AsyncModbusTcpClient.read_input_registers", read_registers) await api.connect() mock_connect.assert_called_once() await api.async_update() assert api.get_register_value(LwzSystemValuesRegisters.RELATIVE_HUMIDITY_HC1) == 0.2 assert api.get_register_value(LwzEnergyDataRegisters.HEAT_METER_HTG_DAY_AND_TOTAL) == 2001 assert api.get_current_humidity() == 0.2 assert api.get_current_temp() == 0.0 assert api.get_target_temp() == 0.1 assert api.get_operation() == OperatingMode.EMERGENCY_OPERATION assert api.get_register_value(LwzSystemValuesRegisters.COMPRESSOR_STARTS) == 30033 await api.close() mock_close.assert_called_once() python-stiebel-eltron-0.2.0/uv.lock000066400000000000000000001174301503672511200172740ustar00rootroot00000000000000version = 1 revision = 2 requires-python = ">=3.10, <3.14" [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "exceptiongroup" version = "1.2.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883, upload-time = "2024-07-12T22:26:00.161Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453, upload-time = "2024-07-12T22:25:58.476Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] [[package]] name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload-time = "2024-10-18T15:20:51.44Z" }, { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload-time = "2024-10-18T15:20:52.426Z" }, { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload-time = "2024-10-18T15:20:53.578Z" }, { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload-time = "2024-10-18T15:20:55.06Z" }, { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload-time = "2024-10-18T15:20:55.906Z" }, { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload-time = "2024-10-18T15:20:57.189Z" }, { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload-time = "2024-10-18T15:20:58.235Z" }, { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload-time = "2024-10-18T15:20:59.235Z" }, { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload-time = "2024-10-18T15:21:00.307Z" }, { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload-time = "2024-10-18T15:21:01.122Z" }, { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, ] [[package]] name = "pymodbus" version = "3.9.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/9f/434efbc3edd1445efca2c17d24877010746d65783ddbb937de753de6bec7/pymodbus-3.9.2.tar.gz", hash = "sha256:2d08ab7bf6d1abc55a87f4faa3a7b04f74d7310b8c9771c3d66ee5fccf2e25ac", size = 163040, upload-time = "2025-04-18T15:24:36.377Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4c/7e/ae151f2750fb604247088774634fea321a178fb898cf8e961879825f9e41/pymodbus-3.9.2-py3-none-any.whl", hash = "sha256:292dcf859d6f232c30abc9753c1f0b7804771fd9c749641b32831de01b360b30", size = 165153, upload-time = "2025-04-18T15:24:34.428Z" }, ] [[package]] name = "pystiebeleltron" source = { editable = "." } dependencies = [ { name = "pymodbus" }, ] [package.dev-dependencies] dev = [ { name = "jinja2" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-mock" }, { name = "ruff" }, ] [package.metadata] requires-dist = [{ name = "pymodbus", specifier = ">=3.8.3" }] [package.metadata.requires-dev] dev = [ { name = "jinja2", specifier = ">=3.1.6" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-asyncio", specifier = ">=0.26.0" }, { name = "pytest-mock", specifier = ">=3.14.0" }, { name = "ruff", specifier = ">=0.9.6" }, ] [[package]] name = "pytest" version = "8.3.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, ] [[package]] name = "pytest-asyncio" version = "0.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload-time = "2025-03-25T06:22:28.883Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload-time = "2025-03-25T06:22:27.807Z" }, ] [[package]] name = "pytest-mock" version = "3.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814, upload-time = "2024-03-21T22:14:04.964Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863, upload-time = "2024-03-21T22:14:02.694Z" }, ] [[package]] name = "ruff" version = "0.11.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f5/e7/e55dda1c92cdcf34b677ebef17486669800de01e887b7831a1b8fdf5cb08/ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517", size = 4132134, upload-time = "2025-05-09T16:19:41.511Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fb/71/75dfb7194fe6502708e547941d41162574d1f579c4676a8eb645bf1a6842/ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c", size = 10335453, upload-time = "2025-05-09T16:18:58.2Z" }, { url = "https://files.pythonhosted.org/packages/74/fc/ad80c869b1732f53c4232bbf341f33c5075b2c0fb3e488983eb55964076a/ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722", size = 11072566, upload-time = "2025-05-09T16:19:01.432Z" }, { url = "https://files.pythonhosted.org/packages/87/0d/0ccececef8a0671dae155cbf7a1f90ea2dd1dba61405da60228bbe731d35/ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1", size = 10435020, upload-time = "2025-05-09T16:19:03.897Z" }, { url = "https://files.pythonhosted.org/packages/52/01/e249e1da6ad722278094e183cbf22379a9bbe5f21a3e46cef24ccab76e22/ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de", size = 10593935, upload-time = "2025-05-09T16:19:06.455Z" }, { url = "https://files.pythonhosted.org/packages/ed/9a/40cf91f61e3003fe7bd43f1761882740e954506c5a0f9097b1cff861f04c/ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7", size = 10172971, upload-time = "2025-05-09T16:19:10.261Z" }, { url = "https://files.pythonhosted.org/packages/61/12/d395203de1e8717d7a2071b5a340422726d4736f44daf2290aad1085075f/ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2", size = 11748631, upload-time = "2025-05-09T16:19:12.307Z" }, { url = "https://files.pythonhosted.org/packages/66/d6/ef4d5eba77677eab511644c37c55a3bb8dcac1cdeb331123fe342c9a16c9/ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271", size = 12409236, upload-time = "2025-05-09T16:19:15.006Z" }, { url = "https://files.pythonhosted.org/packages/c5/8f/5a2c5fc6124dd925a5faf90e1089ee9036462118b619068e5b65f8ea03df/ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65", size = 11881436, upload-time = "2025-05-09T16:19:17.063Z" }, { url = "https://files.pythonhosted.org/packages/39/d1/9683f469ae0b99b95ef99a56cfe8c8373c14eba26bd5c622150959ce9f64/ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6", size = 13982759, upload-time = "2025-05-09T16:19:19.693Z" }, { url = "https://files.pythonhosted.org/packages/4e/0b/c53a664f06e0faab596397867c6320c3816df479e888fe3af63bc3f89699/ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70", size = 11541985, upload-time = "2025-05-09T16:19:21.831Z" }, { url = "https://files.pythonhosted.org/packages/23/a0/156c4d7e685f6526a636a60986ee4a3c09c8c4e2a49b9a08c9913f46c139/ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381", size = 10465775, upload-time = "2025-05-09T16:19:24.401Z" }, { url = "https://files.pythonhosted.org/packages/43/d5/88b9a6534d9d4952c355e38eabc343df812f168a2c811dbce7d681aeb404/ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787", size = 10170957, upload-time = "2025-05-09T16:19:27.08Z" }, { url = "https://files.pythonhosted.org/packages/f0/b8/2bd533bdaf469dc84b45815ab806784d561fab104d993a54e1852596d581/ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd", size = 11143307, upload-time = "2025-05-09T16:19:29.462Z" }, { url = "https://files.pythonhosted.org/packages/2f/d9/43cfba291788459b9bfd4e09a0479aa94d05ab5021d381a502d61a807ec1/ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b", size = 11603026, upload-time = "2025-05-09T16:19:31.569Z" }, { url = "https://files.pythonhosted.org/packages/22/e6/7ed70048e89b01d728ccc950557a17ecf8df4127b08a56944b9d0bae61bc/ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a", size = 10548627, upload-time = "2025-05-09T16:19:33.657Z" }, { url = "https://files.pythonhosted.org/packages/90/36/1da5d566271682ed10f436f732e5f75f926c17255c9c75cefb77d4bf8f10/ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964", size = 11634340, upload-time = "2025-05-09T16:19:35.815Z" }, { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] python-stiebel-eltron-0.2.0/wpm-example.py000077500000000000000000000030511503672511200205720ustar00rootroot00000000000000#!/usr/bin/env python3 import asyncio from pystiebeleltron.wpm import WpmStiebelEltronAPI, WpmSystemParametersRegisters, WpmSystemValuesRegisters host_ip = "192.168.1.20" async def main(): api = WpmStiebelEltronAPI(host_ip, 502) await api.connect() await api.async_update() for k, v in api._data.items(): if v is not None: print(f"{k.name} ({k.value}): {v}") outside_temp = api.get_register_value(WpmSystemValuesRegisters.OUTSIDE_TEMPERATURE) print(f"The current outside temperature is {outside_temp} °C") comfort_temp = api.get_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE) print(f"The current water comfort temperature is {comfort_temp} °C") # Test set_target_temp print("Setting temperature to 50.0") await api.write_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE, 50) await asyncio.sleep(3) await api.async_update() mod_temp = api.get_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE) if mod_temp != 50.0: print("setting the water comfort temperature failed!") if mod_temp != comfort_temp: await api.write_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE, comfort_temp) await asyncio.sleep(3) await api.async_update() print(f"get_target_temp: {api.get_register_value(WpmSystemParametersRegisters.COMFORT_TEMPERATURE)}") await api.close() if __name__ == "__main__": loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(main())