ramses-rf 0.53.0__tar.gz → 0.53.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/workflows/check-cov.yml +2 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/PKG-INFO +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/conf.py +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/misc/2411_parser.py +2 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/pyproject.toml +2 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/__init__.py +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/client.py +15 -5
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/discovery.py +12 -28
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/database.py +6 -3
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/device/heat.py +7 -5
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/entity_base.py +7 -3
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/gateway.py +4 -3
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/system/zones.py +3 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/version.py +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/const.py +3 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/gateway.py +3 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/helpers.py +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/message.py +29 -16
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/parsers.py +2 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/transport.py +7 -4
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/version.py +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/requirements/requirements.txt +2 -2
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/requirements/requirements_dev.txt +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/requirements/requirements_docs.txt +1 -1
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/helpers.py +3 -4
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_api_schedule.py +19 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_cli_transport_factory.py +6 -11
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_systems.py +102 -6
- ramses_rf-0.53.1/tests/tests_cli/test_client.py +656 -0
- ramses_rf-0.53.1/tests/tests_cli/test_debug.py +53 -0
- ramses_rf-0.53.1/tests/tests_cli/test_discovery.py +282 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_binding_fsm.py +3 -0
- ramses_rf-0.53.1/tests/tests_tx/test_const.py +50 -0
- ramses_rf-0.53.0/tests/tests_cli/test_client.py +0 -140
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/dependabot.yml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/workflows/check-lint.yml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/workflows/check-test.yml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/workflows/check-type.yml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.github/workflows/publish-hatch.yml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.gitignore +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/.pre-commit-config.yaml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/LICENSE +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/README-developers.md +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/README.md +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/client.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/Makefile +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/make.bat +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/_static/CC-BY-NC-SA-4.0.txt +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/_static/ramses_rf_logo.png +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/binding_process.md +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/glossary.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/index.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/modules.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/ramses_cli.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/ramses_rf.device.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/ramses_rf.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/ramses_rf.system.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/ramses_tx.rst +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/docs/source/usage.md +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/misc/fingerprints.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/misc/ser2net.yaml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/misc/ti_3410/notes.sh +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/misc/ti_3410/ti_3410.fw +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/debug.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/py.typed +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/utils/cat_slow.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_cli/utils/convert.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/binding_fsm.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/const.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/device/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/device/base.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/device/hvac.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/dispatcher.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/exceptions.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/helpers.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/py.typed +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/schemas.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/system/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/system/faultlog.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/system/heat.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_rf/system/schedule.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/address.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/command.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/exceptions.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/fingerprints.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/frame.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/logger.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/opentherm.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/packet.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/protocol.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/protocol_fsm.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/py.typed +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/ramses.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/schemas.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/typed_dicts.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/ramses_tx/typing.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_apis_mock.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_mock_faultlog.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_mock_schedule.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_packets_bad.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_performance_WIP.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/_test_state_mgt.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/common.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/command.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/const.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/device_heat.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/deprecated/mocked_devices/transport.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/test_HA_MQTT/test_transport_callback.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/heat/trv_ctl.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/devices/device_02.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/devices/device_04.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/devices/device_10.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/devices/device_13.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/devices/device_22.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/_gather.sh +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/20.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/logger/packet_in.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/logger/packet_out.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/logs/pkts_bad_000.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/logs/pkts_tba_000.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/logs/system_cache.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0001_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0002.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0004_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0005.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0006.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0008.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0009.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_000a.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_000c.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_000e.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_01ff_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_0418.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_042f.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1030.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1060.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_10d0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_10e0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1260.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1298.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_12a0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_12c0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1300.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1f09.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1fc9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_1fd4.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2210.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22c9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22d0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22d9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22e0.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22e5.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22e9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22f1.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22f2.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22f3.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22f4.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_22f7.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2309.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2349.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2411_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2e04.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_2e10_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_30c9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3110_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3120.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_313e_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3150.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_31d9.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_31da.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3200.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3210.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3220.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3222.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3ef0_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_3ef1_wip.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_4e01.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_4e02.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_4e04.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/parsers/code_4e15.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/_sched_002/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/_sched_002/schedule.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/sched_001/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/sched_001/schedule.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/sched_dhw/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_000.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_000.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_001.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_001.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_002.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_002.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_010.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_010.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_011.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_011.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_012.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_012.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_013.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_013.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_014.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_014.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_300.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_300.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_301.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_301.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_302.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_302.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_303.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_303.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_304.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_304.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_310.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/schemas/log_files/schema_310.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_heat_trv_00/config.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_otb_00/config.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_otb_00/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_otb_00/schema.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_simple/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_simple/schema.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_ufc_00/config.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_zxdavb/config.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_api_faultlog.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_apis_binding.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_apis_common.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_apis_heat.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_apis_hvac.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_devices.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_eavesdrop_dev_class.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_eavesdrop_schema.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_helpers.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_parser_helpers.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_parsers.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_ramses_schema.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_schema_bits.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_schemas.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests/test_vol_schemas.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_cli/test_cli_utility.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/configs/config_heat.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/configs/config_hvac.json +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/conftest.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/device/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/device/test_hvac_ventilator.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_api_faultlog.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_api_schedule.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_create_stack.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_database.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_dispatcher.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_entity_base.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_hgi_behaviors.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_protocol_fsm.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_use_regex.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/test_virt_network.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/virtual_rf/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/virtual_rf/const.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/virtual_rf/helpers.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_tx/__init__.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/tests_tx/test_command.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
- {ramses_rf-0.53.0 → ramses_rf-0.53.1}/tests/wip/test_wip_cli.sh +0 -0
|
@@ -89,7 +89,7 @@ jobs:
|
|
|
89
89
|
hide_complexity: true
|
|
90
90
|
indicators: true
|
|
91
91
|
output: both
|
|
92
|
-
thresholds: '
|
|
92
|
+
thresholds: '80 90'
|
|
93
93
|
|
|
94
94
|
- name: Add Coverage PR Comment
|
|
95
95
|
# from: https://github.com/marketplace/actions/comment-pull-request
|
|
@@ -99,7 +99,7 @@ jobs:
|
|
|
99
99
|
file-path: code-coverage-results.md
|
|
100
100
|
comment-tag: code-coverage-results.md # replaces existing by this name
|
|
101
101
|
mode: recreate
|
|
102
|
-
|
|
102
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
103
103
|
# or: https://github.com/marketplace/actions/sticky-pull-request-comment
|
|
104
104
|
# if: github.event_name == 'pull_request'
|
|
105
105
|
# with:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ramses_rf
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.1
|
|
4
4
|
Summary: A stateful RAMSES-II protocol decoder & analyser.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ramses-rf/ramses_rf
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/ramses-rf/ramses_rf/issues
|
|
@@ -16,7 +16,7 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
16
16
|
# Parameter definitions
|
|
17
17
|
# Add parameters that we know how to parse (or parts of it)
|
|
18
18
|
|
|
19
|
-
Known_2411_PARAMS = {
|
|
19
|
+
Known_2411_PARAMS: dict[str, Any] = {
|
|
20
20
|
# TODO: add params that were decoded.
|
|
21
21
|
# "000007": {
|
|
22
22
|
# "name": "base_vent_enabled",
|
|
@@ -461,7 +461,7 @@ def decode_2411_message(raw_message: str, verb: str = "RP") -> dict[str, Any]:
|
|
|
461
461
|
"""
|
|
462
462
|
|
|
463
463
|
class MockMessage:
|
|
464
|
-
def __init__(self, verb):
|
|
464
|
+
def __init__(self, verb: str) -> None:
|
|
465
465
|
self.verb = verb
|
|
466
466
|
|
|
467
467
|
result = parser_2411(raw_message, MockMessage(verb))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#
|
|
2
2
|
### project ##########################################################################
|
|
3
|
-
# last checked/updated:
|
|
3
|
+
# last checked/updated: 2026-01-11
|
|
4
4
|
#
|
|
5
5
|
|
|
6
6
|
[project]
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"Topic :: Home Automation",
|
|
39
39
|
"Programming Language :: Python :: 3.13",
|
|
40
40
|
]
|
|
41
|
-
requires-python = ">=3.11" # HA core >=3.13.2
|
|
41
|
+
requires-python = ">=3.11" # HA core >=3.13.2, TODO set to >=3.12 Feb. 2026 (issue #384)
|
|
42
42
|
dependencies = [
|
|
43
43
|
"colorlog>=6.9.0", # latest
|
|
44
44
|
"paho-mqtt>=2.1.0", # latest
|
|
@@ -23,7 +23,7 @@ from ramses_rf.schemas import (
|
|
|
23
23
|
SZ_ENABLE_EAVESDROP,
|
|
24
24
|
SZ_REDUCE_PROCESSING,
|
|
25
25
|
)
|
|
26
|
-
from ramses_tx import is_valid_dev_id
|
|
26
|
+
from ramses_tx import is_valid_dev_id
|
|
27
27
|
from ramses_tx.logger import CONSOLE_COLS, DEFAULT_DATEFMT, DEFAULT_FMT
|
|
28
28
|
from ramses_tx.schemas import (
|
|
29
29
|
SZ_DISABLE_QOS,
|
|
@@ -607,15 +607,25 @@ async def async_main(command: str, lib_kwargs: dict[str, Any], **kwargs: Any) ->
|
|
|
607
607
|
]
|
|
608
608
|
lib_kwargs = lib_kwargs | state["schema"]
|
|
609
609
|
|
|
610
|
+
# Explicitly extract input_file if present to ensure it's passed as a named arg
|
|
611
|
+
input_file = lib_kwargs.pop(SZ_INPUT_FILE, None)
|
|
612
|
+
|
|
610
613
|
# if serial_port == "/dev/ttyMOCK":
|
|
611
614
|
# from tests.deprecated.mocked_rf import MockGateway # FIXME: for test/dev
|
|
612
615
|
# gwy = MockGateway(serial_port, **lib_kwargs)
|
|
613
616
|
# else:
|
|
617
|
+
|
|
618
|
+
# Instantiate Gateway, note: transport_factory is the default, so we don't need to pass it
|
|
614
619
|
gwy = Gateway(
|
|
615
|
-
serial_port,
|
|
620
|
+
serial_port,
|
|
621
|
+
input_file=input_file,
|
|
622
|
+
**lib_kwargs,
|
|
616
623
|
) # passes action to gateway
|
|
617
624
|
|
|
618
|
-
if
|
|
625
|
+
if (
|
|
626
|
+
int(lib_kwargs.get(SZ_CONFIG, {}).get(SZ_REDUCE_PROCESSING, 0))
|
|
627
|
+
< DONT_CREATE_MESSAGES
|
|
628
|
+
):
|
|
619
629
|
# library will not send MSGs to STDOUT, so we'll send PKTs instead
|
|
620
630
|
colorama_init(autoreset=True) # WIP: remove strip=True
|
|
621
631
|
gwy.add_msg_handler(handle_msg)
|
|
@@ -678,7 +688,7 @@ cli.add_command(execute)
|
|
|
678
688
|
cli.add_command(listen)
|
|
679
689
|
|
|
680
690
|
|
|
681
|
-
def main() -> None:
|
|
691
|
+
def main() -> None: # pragma: no cover
|
|
682
692
|
"""Entry point for the CLI.
|
|
683
693
|
|
|
684
694
|
Parses arguments, sets up the event loop (including Windows-specific policies),
|
|
@@ -718,5 +728,5 @@ def main() -> None:
|
|
|
718
728
|
print(" - finished ramses_rf.\r\n")
|
|
719
729
|
|
|
720
730
|
|
|
721
|
-
if __name__ == "__main__":
|
|
731
|
+
if __name__ == "__main__": # pragma: no cover
|
|
722
732
|
main()
|
|
@@ -17,10 +17,6 @@ from ramses_rf.device import Fakeable
|
|
|
17
17
|
from ramses_tx import CODES_SCHEMA, Command, DeviceIdT, Priority
|
|
18
18
|
from ramses_tx.opentherm import OTB_DATA_IDS
|
|
19
19
|
|
|
20
|
-
# Beware, none of this is reliable - it is all subject to random change
|
|
21
|
-
# However, these serve as examples how to use the other modules
|
|
22
|
-
|
|
23
|
-
|
|
24
20
|
from ramses_rf.const import ( # noqa: F401, isort: skip, pylint: disable=unused-import
|
|
25
21
|
I_,
|
|
26
22
|
RP,
|
|
@@ -44,22 +40,19 @@ SCAN_FULL: Final = "scan_full"
|
|
|
44
40
|
SCAN_HARD: Final = "scan_hard"
|
|
45
41
|
SCAN_XXXX: Final = "scan_xxxx"
|
|
46
42
|
|
|
47
|
-
# DEVICE_ID_REGEX = re.compile(DEVICE_ID_REGEX.ANY)
|
|
48
|
-
|
|
49
|
-
|
|
50
43
|
_LOGGER = logging.getLogger(__name__)
|
|
51
44
|
|
|
52
45
|
|
|
53
46
|
def script_decorator(fnc: Callable[..., Any]) -> Callable[..., Any]:
|
|
54
47
|
@functools.wraps(fnc)
|
|
55
|
-
def wrapper(gwy: Gateway, *args: Any, **kwargs: Any) -> None:
|
|
48
|
+
async def wrapper(gwy: Gateway, *args: Any, **kwargs: Any) -> None:
|
|
56
49
|
gwy.send_cmd(
|
|
57
50
|
Command._puzzle(message="Script begins:"),
|
|
58
51
|
priority=Priority.HIGHEST,
|
|
59
52
|
num_repeats=3,
|
|
60
53
|
)
|
|
61
54
|
|
|
62
|
-
fnc(gwy, *args, **kwargs)
|
|
55
|
+
await fnc(gwy, *args, **kwargs)
|
|
63
56
|
|
|
64
57
|
gwy.send_cmd(
|
|
65
58
|
Command._puzzle(message="Script done."),
|
|
@@ -67,8 +60,6 @@ def script_decorator(fnc: Callable[..., Any]) -> Callable[..., Any]:
|
|
|
67
60
|
num_repeats=3,
|
|
68
61
|
)
|
|
69
62
|
|
|
70
|
-
return None
|
|
71
|
-
|
|
72
63
|
return wrapper
|
|
73
64
|
|
|
74
65
|
|
|
@@ -93,7 +84,12 @@ def spawn_scripts(gwy: Gateway, **kwargs: Any) -> list[asyncio.Task[None]]:
|
|
|
93
84
|
_LOGGER.warning(f"Script: {kwargs[EXEC_SCR][0]}() - unknown script")
|
|
94
85
|
else:
|
|
95
86
|
_LOGGER.info(f"Script: {kwargs[EXEC_SCR][0]}().- starts...")
|
|
96
|
-
|
|
87
|
+
# script_poll_device returns a list of tasks, others return a coroutine
|
|
88
|
+
result = script(gwy, kwargs[EXEC_SCR][1])
|
|
89
|
+
if isinstance(result, list):
|
|
90
|
+
tasks.extend(result)
|
|
91
|
+
else:
|
|
92
|
+
tasks.append(asyncio.create_task(result))
|
|
97
93
|
|
|
98
94
|
gwy._tasks.extend(tasks)
|
|
99
95
|
return tasks
|
|
@@ -104,14 +100,6 @@ async def exec_cmd(gwy: Gateway, **kwargs: Any) -> None:
|
|
|
104
100
|
await gwy.async_send_cmd(cmd, priority=Priority.HIGH, wait_for_reply=True)
|
|
105
101
|
|
|
106
102
|
|
|
107
|
-
# @script_decorator
|
|
108
|
-
# async def script_scan_001(gwy: Gateway, dev_id: DeviceIdT):
|
|
109
|
-
# _LOGGER.warning("scan_001() invoked - expect a lot of nonsense")
|
|
110
|
-
# for idx in range(0x10):
|
|
111
|
-
# gwy.send_cmd(Command.from_attrs(W_, dev_id, Code._000E, f"{idx:02X}0050"))
|
|
112
|
-
# gwy.send_cmd(Command.from_attrs(RQ, dev_id, Code._000E, f"{idx:02X}00C8"))
|
|
113
|
-
|
|
114
|
-
|
|
115
103
|
async def get_faults(
|
|
116
104
|
gwy: Gateway, ctl_id: DeviceIdT, start: int = 0, limit: int = 0x3F
|
|
117
105
|
) -> None:
|
|
@@ -199,7 +187,7 @@ def script_poll_device(gwy: Gateway, dev_id: DeviceIdT) -> list[asyncio.Task[Non
|
|
|
199
187
|
async def script_scan_disc(gwy: Gateway, dev_id: DeviceIdT) -> None:
|
|
200
188
|
_LOGGER.warning("scan_disc() invoked...")
|
|
201
189
|
|
|
202
|
-
await gwy.get_device(dev_id).discover()
|
|
190
|
+
await gwy.get_device(dev_id).discover()
|
|
203
191
|
|
|
204
192
|
|
|
205
193
|
@script_decorator
|
|
@@ -340,9 +328,7 @@ async def script_scan_otb_hard(gwy: Gateway, dev_id: DeviceIdT) -> None:
|
|
|
340
328
|
|
|
341
329
|
|
|
342
330
|
@script_decorator
|
|
343
|
-
async def script_scan_otb_map(
|
|
344
|
-
gwy: Gateway, dev_id: DeviceIdT
|
|
345
|
-
) -> None: # Tested only upon a R8820A
|
|
331
|
+
async def script_scan_otb_map(gwy: Gateway, dev_id: DeviceIdT) -> None:
|
|
346
332
|
_LOGGER.warning("script_scan_otb_map invoked - expect a lot of nonsense")
|
|
347
333
|
|
|
348
334
|
RAMSES_TO_OPENTHERM = {
|
|
@@ -364,9 +350,7 @@ async def script_scan_otb_map(
|
|
|
364
350
|
|
|
365
351
|
|
|
366
352
|
@script_decorator
|
|
367
|
-
async def script_scan_otb_ramses(
|
|
368
|
-
gwy: Gateway, dev_id: DeviceIdT
|
|
369
|
-
) -> None: # Tested only upon a R8820A
|
|
353
|
+
async def script_scan_otb_ramses(gwy: Gateway, dev_id: DeviceIdT) -> None:
|
|
370
354
|
_LOGGER.warning("script_scan_otb_ramses invoked - expect a lot of nonsense")
|
|
371
355
|
|
|
372
356
|
_CODES = (
|
|
@@ -394,7 +378,7 @@ async def script_scan_otb_ramses(
|
|
|
394
378
|
Code._3223,
|
|
395
379
|
Code._3EF0, # rel. modulation level / RelativeModulationLevel (also, below)
|
|
396
380
|
Code._3EF1, # rel. modulation level / RelativeModulationLevel
|
|
397
|
-
)
|
|
381
|
+
)
|
|
398
382
|
|
|
399
383
|
for c in _CODES:
|
|
400
384
|
gwy.send_cmd(Command.from_attrs(RQ, dev_id, c, "00"), priority=Priority.LOW)
|
|
@@ -272,18 +272,21 @@ class MessageIndex:
|
|
|
272
272
|
|
|
273
273
|
return old
|
|
274
274
|
|
|
275
|
-
def add_record(
|
|
275
|
+
def add_record(
|
|
276
|
+
self, src: str, code: str = "", verb: str = "", payload: str = "00"
|
|
277
|
+
) -> None:
|
|
276
278
|
"""
|
|
277
279
|
Add a single record to the MessageIndex with timestamp `now()` and no Message contents.
|
|
278
280
|
|
|
279
281
|
:param src: device id to use as source address
|
|
280
282
|
:param code: device id to use as destination address (can be identical)
|
|
281
283
|
:param verb: two letter verb str to use
|
|
284
|
+
:param payload: payload str to use
|
|
282
285
|
"""
|
|
283
|
-
# Used by OtbGateway init, via entity_base.py
|
|
286
|
+
# Used by OtbGateway init, via entity_base.py (code=_3220)
|
|
284
287
|
_now: dt = dt.now()
|
|
285
288
|
dtm: DtmStrT = _now.isoformat(timespec="microseconds") # type: ignore[assignment]
|
|
286
|
-
hdr = f"{code}|{verb}|{src}|
|
|
289
|
+
hdr = f"{code}|{verb}|{src}|{payload}"
|
|
287
290
|
|
|
288
291
|
dup = self._delete_from(hdr=hdr)
|
|
289
292
|
|
|
@@ -668,11 +668,13 @@ class OtbGateway(Actuator, HeatDemand): # OTB (10): 3220 (22D9, others)
|
|
|
668
668
|
self._child_id = FC # NOTE: domain_id
|
|
669
669
|
|
|
670
670
|
# TODO(eb): cleanup
|
|
671
|
-
if self._gwy.msg_db:
|
|
672
|
-
self._add_record(
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
671
|
+
if not self._gwy.msg_db:
|
|
672
|
+
# self._add_record(
|
|
673
|
+
# id=self.id, code=Code._3220, verb="RP", payload="00C0060101"
|
|
674
|
+
# ) # is parsed but pollutes the client.py
|
|
675
|
+
# adds a "sim" RP opentherm_msg to the SQLite MessageIndex with code _3220
|
|
676
|
+
# causes exc when fetching ALL, when no "real" msg was added to _msgs_. We skip those.
|
|
677
|
+
# else:
|
|
676
678
|
self._msgz[Code._3220] = {RP: {}} # No ctx! (not None)
|
|
677
679
|
|
|
678
680
|
# lf._use_ot = self._gwy.config.use_native_ot
|
|
@@ -324,12 +324,16 @@ class _MessageDB(_Entity):
|
|
|
324
324
|
]
|
|
325
325
|
|
|
326
326
|
def _add_record(
|
|
327
|
-
self,
|
|
327
|
+
self,
|
|
328
|
+
id: DeviceIdT,
|
|
329
|
+
code: Code | None = None,
|
|
330
|
+
verb: str = " I",
|
|
331
|
+
payload: str = "00",
|
|
328
332
|
) -> None:
|
|
329
333
|
"""Add a (dummy) record to the central SQLite MessageIndex."""
|
|
330
|
-
# used by heat.py init
|
|
334
|
+
# used by heat.py.OtbGateway init
|
|
331
335
|
if self._gwy.msg_db:
|
|
332
|
-
self._gwy.msg_db.add_record(id, code=str(code), verb=verb)
|
|
336
|
+
self._gwy.msg_db.add_record(id, code=str(code), verb=verb, payload=payload)
|
|
333
337
|
# else:
|
|
334
338
|
# _LOGGER.warning("Missing MessageIndex")
|
|
335
339
|
# raise NotImplementedError
|
|
@@ -107,7 +107,7 @@ class Gateway(Engine):
|
|
|
107
107
|
|
|
108
108
|
:param port_name: The serial port name (e.g., '/dev/ttyUSB0') or None if using a file.
|
|
109
109
|
:type port_name: str | None
|
|
110
|
-
:param input_file: Path to a packet log file for playback, defaults to None.
|
|
110
|
+
:param input_file: Path to a packet log file for playback/parsing, defaults to None.
|
|
111
111
|
:type input_file: str | None, optional
|
|
112
112
|
:param port_config: Configuration dictionary for the serial port, defaults to None.
|
|
113
113
|
:type port_config: PortConfigT | None, optional
|
|
@@ -224,9 +224,10 @@ class Gateway(Engine):
|
|
|
224
224
|
)
|
|
225
225
|
|
|
226
226
|
# initialize SQLite index, set in _tx/Engine
|
|
227
|
-
if self._sqlite_index: # TODO(eb): default to
|
|
227
|
+
if self._sqlite_index: # TODO(eb): default to True in Q1 2026
|
|
228
228
|
_LOGGER.info("Ramses RF starts SQLite MessageIndex")
|
|
229
|
-
|
|
229
|
+
# if activated in ramses_cc > Engine or set in tests
|
|
230
|
+
self.create_sqlite_message_index()
|
|
230
231
|
|
|
231
232
|
# temporarily turn on discovery, remember original state
|
|
232
233
|
self.config.disable_discovery, disable_discovery = (
|
|
@@ -689,7 +689,7 @@ class Zone(ZoneSchedule):
|
|
|
689
689
|
|
|
690
690
|
@property
|
|
691
691
|
def heating_type(self) -> str | None:
|
|
692
|
-
"""
|
|
692
|
+
"""Get the type of the zone/DHW (e.g. electric_zone, stored_dhw)."""
|
|
693
693
|
|
|
694
694
|
if self._SLUG is None: # isinstance(self, ???)
|
|
695
695
|
return None
|
|
@@ -697,12 +697,13 @@ class Zone(ZoneSchedule):
|
|
|
697
697
|
|
|
698
698
|
@property
|
|
699
699
|
def name(self) -> str | None: # 0004
|
|
700
|
-
"""
|
|
700
|
+
"""Get the name of the zone."""
|
|
701
701
|
|
|
702
702
|
if self._gwy.msg_db:
|
|
703
703
|
msgs = self._gwy.msg_db.get(
|
|
704
704
|
code=Code._0004, src=self._z_id, ctx=self._z_idx
|
|
705
705
|
)
|
|
706
|
+
_LOGGER.debug(f"Pick Zone.name from: {msgs}[0])") # DEBUG issue #317
|
|
706
707
|
return msgs[0].payload.get(SZ_NAME) if msgs else None
|
|
707
708
|
|
|
708
709
|
return self._msg_value(Code._0004, key=SZ_NAME) # type: ignore[no-any-return]
|
|
@@ -276,7 +276,9 @@ class AttrDict(dict): # type: ignore[type-arg]
|
|
|
276
276
|
return self._forward[name[1:]]
|
|
277
277
|
elif name.isupper() and name.lower() in self._reverse: # map.DHW_SENSOR -> "0D"
|
|
278
278
|
return self[name.lower()]
|
|
279
|
-
|
|
279
|
+
raise AttributeError(
|
|
280
|
+
f"'{type(self).__name__}' object has no attribute '{name}'"
|
|
281
|
+
)
|
|
280
282
|
|
|
281
283
|
def _hex(self, key: str) -> str:
|
|
282
284
|
"""Return the key/ID (2-byte hex string) of the two-way dict (e.g. '04').
|
|
@@ -114,7 +114,9 @@ class Engine:
|
|
|
114
114
|
self._include,
|
|
115
115
|
self._exclude,
|
|
116
116
|
)
|
|
117
|
-
self._sqlite_index = kwargs.pop(
|
|
117
|
+
self._sqlite_index = kwargs.pop(
|
|
118
|
+
SZ_SQLITE_INDEX, False
|
|
119
|
+
) # TODO Q1 2026: default True
|
|
118
120
|
self._log_all_mqtt = kwargs.pop(SZ_LOG_ALL_MQTT, False)
|
|
119
121
|
self._kwargs: dict[str, Any] = kwargs # HACK
|
|
120
122
|
|
|
@@ -149,7 +149,7 @@ def timestamp() -> float:
|
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
def dt_now() -> dt:
|
|
152
|
-
"""
|
|
152
|
+
"""Get the current datetime as a local/naive datetime object.
|
|
153
153
|
|
|
154
154
|
This is slower, but potentially more accurate, than dt.now(), and is used mainly for
|
|
155
155
|
packet timestamps.
|
|
@@ -70,22 +70,24 @@ class MessageBase:
|
|
|
70
70
|
self.verb: VerbT = pkt.verb
|
|
71
71
|
self.seqn: str = (
|
|
72
72
|
pkt.seqn
|
|
73
|
-
) # the msg is part of a set for
|
|
73
|
+
) # the msg is part of a set for a Code, received in order
|
|
74
74
|
self.code: Code = pkt.code
|
|
75
75
|
self.len: int = pkt._len
|
|
76
76
|
|
|
77
|
-
self._payload = self._validate(
|
|
78
|
-
self._pkt.payload
|
|
79
|
-
) # ? may raise InvalidPacketError
|
|
77
|
+
self._payload = self._validate(self._pkt.payload) # ? may raise PacketInvalid
|
|
80
78
|
|
|
81
79
|
self._str: str = None # type: ignore[assignment]
|
|
82
80
|
|
|
83
81
|
def __repr__(self) -> str:
|
|
84
|
-
"""
|
|
82
|
+
"""
|
|
83
|
+
:return: an unambiguous string representation of this object.
|
|
84
|
+
"""
|
|
85
85
|
return str(self._pkt) # repr or str?
|
|
86
86
|
|
|
87
87
|
def __str__(self) -> str:
|
|
88
|
-
"""
|
|
88
|
+
"""
|
|
89
|
+
:return: a brief readable string representation of this object.
|
|
90
|
+
"""
|
|
89
91
|
|
|
90
92
|
def ctx(pkt: Packet) -> str:
|
|
91
93
|
ctx = {True: "[..]", False: "", None: "??"}.get(pkt._ctx, pkt._ctx) # type: ignore[arg-type]
|
|
@@ -128,17 +130,22 @@ class MessageBase:
|
|
|
128
130
|
return self.dtm < other.dtm
|
|
129
131
|
|
|
130
132
|
def _name(self, addr: Address) -> str:
|
|
131
|
-
"""
|
|
133
|
+
"""
|
|
134
|
+
:return: a friendly name for an Address, or a Device.
|
|
135
|
+
"""
|
|
132
136
|
return f" {addr.id}" # can't do 'CTL:123456' instead of ' 01:123456'
|
|
133
137
|
|
|
134
138
|
@property
|
|
135
139
|
def payload(self): # type: ignore[no-untyped-def] # FIXME -> dict | list:
|
|
136
|
-
"""
|
|
140
|
+
"""
|
|
141
|
+
:return: the payload.
|
|
142
|
+
"""
|
|
137
143
|
return self._payload
|
|
138
144
|
|
|
139
145
|
@property
|
|
140
146
|
def _has_payload(self) -> bool:
|
|
141
|
-
"""
|
|
147
|
+
"""
|
|
148
|
+
:return: False if there is no payload (may falsely return True).
|
|
142
149
|
|
|
143
150
|
The message (i.e. the raw payload) may still have an idx.
|
|
144
151
|
"""
|
|
@@ -234,7 +241,7 @@ class MessageBase:
|
|
|
234
241
|
return {}
|
|
235
242
|
|
|
236
243
|
# TODO: also 000C (but is a complex idx)
|
|
237
|
-
# TODO: also 3150 (when not domain
|
|
244
|
+
# TODO: also 3150 (when not domain; will be array in that case)
|
|
238
245
|
if self.code in (Code._000A, Code._2309) and self.src.type == DEV_TYPE_MAP.UFC:
|
|
239
246
|
assert isinstance(self._pkt._idx, str) # mypy hint
|
|
240
247
|
return {IDX_NAMES[Code._22C9]: self._pkt._idx}
|
|
@@ -250,7 +257,7 @@ class MessageBase:
|
|
|
250
257
|
"""Validate a message packet payload, and parse it if valid.
|
|
251
258
|
|
|
252
259
|
:return: a dict containing key: value pairs, or a list of those created from the payload
|
|
253
|
-
:raises
|
|
260
|
+
:raises PacketInvalid exception if it is not valid.
|
|
254
261
|
"""
|
|
255
262
|
|
|
256
263
|
try: # parse the payload
|
|
@@ -292,7 +299,7 @@ class MessageBase:
|
|
|
292
299
|
|
|
293
300
|
|
|
294
301
|
class Message(MessageBase):
|
|
295
|
-
"""Extend the Message class, so is useful to a stateful Gateway.
|
|
302
|
+
"""Extend the Message class, so it is useful to a stateful Gateway.
|
|
296
303
|
|
|
297
304
|
Adds _expired attr to the Message class.
|
|
298
305
|
"""
|
|
@@ -303,7 +310,7 @@ class Message(MessageBase):
|
|
|
303
310
|
# .HAS_DIED = 1.0 # fraction_expired >= 1.0 (is expected lifespan)
|
|
304
311
|
IS_EXPIRING = 0.8 # fraction_expired >= 0.8 (and < HAS_EXPIRED)
|
|
305
312
|
|
|
306
|
-
_gwy: Gateway
|
|
313
|
+
_gwy: Gateway | None = None
|
|
307
314
|
_fraction_expired: float | None = None
|
|
308
315
|
|
|
309
316
|
@classmethod
|
|
@@ -318,13 +325,19 @@ class Message(MessageBase):
|
|
|
318
325
|
|
|
319
326
|
@property
|
|
320
327
|
def _expired(self) -> bool:
|
|
321
|
-
"""
|
|
328
|
+
"""
|
|
329
|
+
:return: True if the message is dated, False otherwise
|
|
330
|
+
"""
|
|
322
331
|
# fraction_expired = (dt_now - self.dtm - _TD_SECONDS_003) / self._pkt._lifespan
|
|
323
332
|
# TODO: keep none >7d, even 10E0, etc.
|
|
324
333
|
|
|
325
334
|
def fraction_expired(lifespan: td) -> float:
|
|
326
|
-
"""
|
|
327
|
-
return
|
|
335
|
+
"""
|
|
336
|
+
:return: the packet's age as fraction of its 'normal' life span.
|
|
337
|
+
"""
|
|
338
|
+
if self._gwy: # self._gwy is set in ramses_tx.gateway.Engine._msg_handler
|
|
339
|
+
return (self._gwy._dt_now() - self.dtm - _TD_SECS_003) / lifespan
|
|
340
|
+
return (dt.now() - self.dtm - _TD_SECS_003) / lifespan
|
|
328
341
|
|
|
329
342
|
# 1. Look for easy win...
|
|
330
343
|
if self._fraction_expired is not None:
|
|
@@ -3291,13 +3291,13 @@ def parser_3220(payload: str, msg: Message) -> dict[str, Any]:
|
|
|
3291
3291
|
"FFFF",
|
|
3292
3292
|
), f"OpenTherm: Invalid msg-type|data-value: {ot_type}|{payload[6:10]}"
|
|
3293
3293
|
|
|
3294
|
-
# HACK: These OT data id can pop in/out of 47AB, which is an invalid value
|
|
3294
|
+
# HACK: These OT data id's can pop in/out of 47AB, which is an invalid value
|
|
3295
3295
|
if payload[6:] == "47AB" and ot_id in (0x12, 0x13, 0x19, 0x1A, 0x1B, 0x1C):
|
|
3296
3296
|
ot_value[SZ_VALUE] = None
|
|
3297
3297
|
# HACK: This OT data id can be 1980, which is an invalid value
|
|
3298
3298
|
if payload[6:] == "1980" and ot_id: # CH pressure is 25.5 bar!
|
|
3299
3299
|
ot_value[SZ_VALUE] = None
|
|
3300
|
-
# HACK: Done above, not in OT.decode_frame() as
|
|
3300
|
+
# HACK: Done above, not in OT.decode_frame() as values aren't in the OT specification
|
|
3301
3301
|
|
|
3302
3302
|
if ot_type not in _LIST:
|
|
3303
3303
|
assert ot_type in (
|
|
@@ -772,7 +772,7 @@ class _ReadTransport(_BaseTransport):
|
|
|
772
772
|
if self._closing is True: # raise, or warn & return?
|
|
773
773
|
raise exc.TransportError("Transport is closing or has closed")
|
|
774
774
|
|
|
775
|
-
# TODO: can we switch to call_soon now QoS has been refactored?
|
|
775
|
+
# TODO: can we switch to call_soon now that QoS has been refactored?
|
|
776
776
|
# NOTE: No need to use call_soon() here, and they may break Qos/Callbacks
|
|
777
777
|
# NOTE: Thus, excepts need checking
|
|
778
778
|
try: # below could be a call_soon?
|
|
@@ -783,7 +783,7 @@ class _ReadTransport(_BaseTransport):
|
|
|
783
783
|
_LOGGER.error("%s < exception from msg layer: %s", pkt, err)
|
|
784
784
|
|
|
785
785
|
async def write_frame(self, frame: str, disable_tx_limits: bool = False) -> None:
|
|
786
|
-
"""
|
|
786
|
+
"""Transmit a frame via the underlying handler (e.g. serial port, MQTT).
|
|
787
787
|
|
|
788
788
|
:param frame: The frame to write.
|
|
789
789
|
:type frame: str
|
|
@@ -811,7 +811,7 @@ class _FullTransport(_ReadTransport): # asyncio.Transport
|
|
|
811
811
|
self._transmit_times: deque[dt] = deque(maxlen=_MAX_TRACKED_TRANSMITS)
|
|
812
812
|
|
|
813
813
|
def _dt_now(self) -> dt:
|
|
814
|
-
"""
|
|
814
|
+
"""Get a precise datetime, using the current dtm.
|
|
815
815
|
|
|
816
816
|
:return: Current datetime.
|
|
817
817
|
:rtype: dt
|
|
@@ -1945,7 +1945,7 @@ async def transport_factory(
|
|
|
1945
1945
|
:type port_name: SerPortNameT | None, optional
|
|
1946
1946
|
:param port_config: Configuration dictionary for serial port, defaults to None.
|
|
1947
1947
|
:type port_config: PortConfigT | None, optional
|
|
1948
|
-
:param packet_log: Path to a file containing packet logs for playback, defaults to None.
|
|
1948
|
+
:param packet_log: Path to a file containing packet logs for playback/parsing, defaults to None.
|
|
1949
1949
|
:type packet_log: str | None, optional
|
|
1950
1950
|
:param packet_dict: Dictionary of packets for playback, defaults to None.
|
|
1951
1951
|
:type packet_dict: dict[str, str] | None, optional
|
|
@@ -2024,6 +2024,9 @@ async def transport_factory(
|
|
|
2024
2024
|
)
|
|
2025
2025
|
|
|
2026
2026
|
if len([x for x in (packet_dict, packet_log, port_name) if x is not None]) != 1:
|
|
2027
|
+
_LOGGER.warning(
|
|
2028
|
+
f"Input: packet_dict: {packet_dict}, packet_log: {packet_log}, port_name: {port_name}"
|
|
2029
|
+
)
|
|
2027
2030
|
raise exc.TransportSourceInvalid(
|
|
2028
2031
|
"Packet source must be exactly one of: packet_dict, packet_log, port_name"
|
|
2029
2032
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# Requirements to use the library via its CLI
|
|
2
|
-
# - last checked/updated:
|
|
1
|
+
# Requirements to use the library via its CLI client.py
|
|
2
|
+
# - last checked/updated: 2026-01-11 (c.f. HA 2026.1.0)
|
|
3
3
|
#
|
|
4
4
|
|
|
5
5
|
# library requirements (dependencies) are in pyproject.toml
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Requirements to dev/test the source code
|
|
2
|
-
# - last checked/updated:
|
|
2
|
+
# - last checked/updated: 2026-01-11 (c.f. HA 2026.1.0)
|
|
3
3
|
# - HA core reqs: https://github.com/home-assistant/core/blob/dev/requirements.txt
|
|
4
4
|
|
|
5
5
|
# for using the ramses_rf library with CLI
|
|
@@ -72,9 +72,6 @@ def assert_expected_set(gwy: Gateway, expected: dict) -> None:
|
|
|
72
72
|
assert_expected(gwy.status, expected.get("status"))
|
|
73
73
|
assert_expected(gwy.known_list, expected.get("known_list"))
|
|
74
74
|
|
|
75
|
-
if gwy.msg_db:
|
|
76
|
-
gwy.msg_db.stop() # close sqlite3 connection
|
|
77
|
-
|
|
78
75
|
|
|
79
76
|
def assert_raises(exception: type[Exception], fnc: Callable, *args: Any) -> None:
|
|
80
77
|
try:
|
|
@@ -87,7 +84,8 @@ def assert_raises(exception: type[Exception], fnc: Callable, *args: Any) -> None
|
|
|
87
84
|
|
|
88
85
|
async def load_test_gwy(dir_name: Path, **kwargs: Any) -> Gateway:
|
|
89
86
|
"""Create a system state from a packet log (using an optional configuration)."""
|
|
90
|
-
|
|
87
|
+
# TODO(eb): default sqlite_index to True Q1 2026
|
|
88
|
+
_sqlite_index = kwargs.pop("_sqlite_index", False)
|
|
91
89
|
kwargs = SCH_GLOBAL_CONFIG({k: v for k, v in kwargs.items() if k[:1] != "_"})
|
|
92
90
|
|
|
93
91
|
try:
|
|
@@ -101,6 +99,7 @@ async def load_test_gwy(dir_name: Path, **kwargs: Any) -> Gateway:
|
|
|
101
99
|
|
|
102
100
|
path = f"{dir_name}/packet.log"
|
|
103
101
|
gwy = Gateway(None, input_file=path, **kwargs)
|
|
102
|
+
gwy._sqlite_index = _sqlite_index # TODO(eb): remove legacy Q2 2026
|
|
104
103
|
await gwy.start()
|
|
105
104
|
|
|
106
105
|
await gwy._protocol.wait_for_connection_lost() # until packet log is EOF
|