ramses-rf 0.52.3__tar.gz → 0.52.5__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.52.5/.github/workflows/check-cov.yml +131 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-lint.yml +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-test.yml +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-type.yml +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/publish-hatch.yml +3 -3
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/PKG-INFO +2 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/README.md +1 -0
- ramses_rf-0.52.3/docs/source/binding_process_diagram.md → ramses_rf-0.52.5/docs/source/binding_process.md +3 -3
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/index.rst +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/pyproject.toml +38 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/client.py +1 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/debug.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/utils/convert.py +2 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/database.py +47 -20
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/base.py +14 -3
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/heat.py +2 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/hvac.py +24 -21
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/entity_base.py +70 -29
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/gateway.py +30 -19
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/schemas.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/heat.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/zones.py +22 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/version.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/address.py +21 -6
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/command.py +18 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/const.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/helpers.py +30 -10
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/message.py +11 -5
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/packet.py +13 -5
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/parsers.py +1096 -28
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/protocol.py +95 -20
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/ramses.py +9 -5
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/transport.py +31 -6
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/version.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements.txt +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements_dev.txt +6 -6
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements_docs.txt +3 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/helpers.py +4 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_01ff_wip.log +2 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22d0.log +2 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e04.log +1 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_heat.py +3 -3
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_schemas.py +2 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/device/test_hvac_ventilator.py +54 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_binding_fsm.py +1 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_database.py +9 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_dispatcher.py +2 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_entity_base.py +6 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_protocol_fsm.py +3 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_virt_network.py +7 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/__init__.py +3 -1
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/dependabot.yml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.gitignore +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.pre-commit-config.yaml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/LICENSE +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/README-developers.md +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/client.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/Makefile +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/make.bat +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/_static/ramses_rf_logo.png +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/conf.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/glossary.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/modules.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_cli.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.device.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.system.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_tx.rst +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/usage.md +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/2411_parser.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/fingerprints.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ser2net.yaml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ti_3410/notes.sh +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ti_3410/ti_3410.fw +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/discovery.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/utils/cat_slow.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/binding_fsm.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/const.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/dispatcher.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/exceptions.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/helpers.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/py.typed +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/faultlog.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/schedule.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/exceptions.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/fingerprints.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/frame.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/gateway.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/logger.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/opentherm.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/protocol_fsm.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/py.typed +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/schemas.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/typed_dicts.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/typing.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_apis_mock.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_mock_faultlog.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_mock_schedule.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_packets_bad.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_performance_WIP.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_state_mgt.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/common.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/command.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/const.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/device_heat.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/transport.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/trv_ctl.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_02.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_04.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_10.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_13.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_22.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/_gather.sh +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/20.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logger/packet_in.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logger/packet_out.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/pkts_bad_000.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/pkts_tba_000.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/system_cache.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0001_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0002.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0004_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0005.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0006.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0008.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0009.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000a.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000c.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000e.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0418.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_042f.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1030.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1060.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_10d0.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_10e0.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1260.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1298.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_12a0.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_12c0.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1300.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1f09.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1fc9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1fd4.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2210.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22c9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22d9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e0.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e5.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f1.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f2.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f3.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f4.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f7.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2309.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2349.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2411_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2e04.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2e10_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_30c9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3110_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3120.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_313e_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3150.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_31d9.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_31da.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3200.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3210.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3220.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3222.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3ef0_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3ef1_wip.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e01.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e02.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e15.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/_sched_002/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/_sched_002/schedule.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_001/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_001/schedule.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_dhw/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_000.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_000.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_001.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_001.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_002.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_002.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_010.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_010.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_011.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_011.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_012.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_012.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_013.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_013.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_014.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_014.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_300.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_300.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_301.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_301.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_302.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_302.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_303.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_303.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_304.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_304.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_310.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_310.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/config.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/config.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/schema.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_simple/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_simple/schema.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_00/config.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/config.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_api_faultlog.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_api_schedule.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_binding.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_common.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_hvac.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_cli_utility.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_devices.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_eavesdrop_dev_class.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_eavesdrop_schema.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_helpers.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_parser_helpers.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_parsers.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_ramses_schema.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_schema_bits.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_systems.py +2 -2
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_vol_schemas.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/configs/config_heat.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/configs/config_hvac.json +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/conftest.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/device/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_api_faultlog.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_api_schedule.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_create_stack.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_hgi_behaviors.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_use_regex.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/const.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/helpers.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_tx/__init__.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_tx/test_command.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
- {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/test_wip_cli.sh +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
name: Coverage
|
|
2
|
+
# based on: https://github.com/marketplace/actions/code-coverage-summary
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [ "master" ]
|
|
7
|
+
paths: [
|
|
8
|
+
".github/workflows/check-cov.yml",
|
|
9
|
+
"pyproject.toml",
|
|
10
|
+
"requirements/**",
|
|
11
|
+
"src/**.py",
|
|
12
|
+
"tests/**",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
pull_request:
|
|
16
|
+
branches: [ "master" ]
|
|
17
|
+
paths: [
|
|
18
|
+
".github/workflows/check-cov.yml",
|
|
19
|
+
"pyproject.toml",
|
|
20
|
+
"requirements/**",
|
|
21
|
+
"src/**.py",
|
|
22
|
+
"tests/**",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
pull_request_target:
|
|
26
|
+
branches: [ "master" ]
|
|
27
|
+
paths: [
|
|
28
|
+
".github/workflows/check-cov.yml",
|
|
29
|
+
"pyproject.toml",
|
|
30
|
+
"requirements/**",
|
|
31
|
+
"src/**.py",
|
|
32
|
+
"tests/**",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
schedule:
|
|
36
|
+
- cron: "0 7 * * 5"
|
|
37
|
+
|
|
38
|
+
workflow_dispatch:
|
|
39
|
+
|
|
40
|
+
permissions:
|
|
41
|
+
pull-requests: write
|
|
42
|
+
|
|
43
|
+
jobs:
|
|
44
|
+
coverage:
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
|
|
47
|
+
strategy:
|
|
48
|
+
fail-fast: false
|
|
49
|
+
matrix:
|
|
50
|
+
python-version: ["3.14"]
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v6
|
|
54
|
+
|
|
55
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
56
|
+
uses: actions/setup-python@v6
|
|
57
|
+
with:
|
|
58
|
+
python-version: ${{ matrix.python-version }}
|
|
59
|
+
|
|
60
|
+
- name: Install dependencies
|
|
61
|
+
run: |
|
|
62
|
+
python -m pip install --upgrade pip
|
|
63
|
+
pip install -r requirements/requirements_dev.txt
|
|
64
|
+
|
|
65
|
+
- name: Install the package (and its dependencies)
|
|
66
|
+
run: pip install -e .
|
|
67
|
+
|
|
68
|
+
- name: Run coverage with pytest
|
|
69
|
+
run: coverage run -m pytest
|
|
70
|
+
|
|
71
|
+
- name: Debug - Check if .coverage exists
|
|
72
|
+
run: test -f .coverage && echo ".coverage exists" || echo ".coverage does NOT exist"
|
|
73
|
+
|
|
74
|
+
- name: Display coverage report
|
|
75
|
+
run: coverage report
|
|
76
|
+
|
|
77
|
+
- name: Create coverage xml
|
|
78
|
+
run: coverage xml
|
|
79
|
+
|
|
80
|
+
- name: Create Code Coverage Report
|
|
81
|
+
# from: https://github.com/marketplace/actions/code-coverage-summary
|
|
82
|
+
uses: irongut/CodeCoverageSummary@v1.3.0
|
|
83
|
+
with:
|
|
84
|
+
filename: coverage.xml
|
|
85
|
+
badge: true
|
|
86
|
+
fail_below_min: true
|
|
87
|
+
format: markdown
|
|
88
|
+
hide_branch_rate: false
|
|
89
|
+
hide_complexity: true
|
|
90
|
+
indicators: true
|
|
91
|
+
output: both
|
|
92
|
+
thresholds: '60 80'
|
|
93
|
+
|
|
94
|
+
- name: Add Coverage PR Comment
|
|
95
|
+
# from: https://github.com/marketplace/actions/comment-pull-request
|
|
96
|
+
if: github.event_name == 'pull_request_target'
|
|
97
|
+
uses: thollander/actions-comment-pull-request@v3
|
|
98
|
+
with:
|
|
99
|
+
file-path: code-coverage-results.md
|
|
100
|
+
comment-tag: code-coverage-results.md # replaces existing by this name
|
|
101
|
+
mode: recreate
|
|
102
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
103
|
+
# or: https://github.com/marketplace/actions/sticky-pull-request-comment
|
|
104
|
+
# if: github.event_name == 'pull_request'
|
|
105
|
+
# with:
|
|
106
|
+
# recreate: true
|
|
107
|
+
# path: code-coverage-results.md
|
|
108
|
+
# GITHUB_TOKEN is implicitly passed in
|
|
109
|
+
|
|
110
|
+
# - name: Create Coverage Badge
|
|
111
|
+
# # from: https://github.com/marketplace/actions/coverage-py-badge
|
|
112
|
+
# uses: tj-actions/coverage-badge-py@v2
|
|
113
|
+
# id: coverage-badge-py
|
|
114
|
+
# with:
|
|
115
|
+
# # Output path to write the
|
|
116
|
+
# # coverage badge.
|
|
117
|
+
# # Type: string
|
|
118
|
+
# # Default: "coverage.svg"
|
|
119
|
+
# output: 'misc/coverage-badge.svg'
|
|
120
|
+
#
|
|
121
|
+
# # Overwrite an existing coverage badge.
|
|
122
|
+
# # Type: boolean
|
|
123
|
+
# # Default: "true"
|
|
124
|
+
# overwrite: ''
|
|
125
|
+
#
|
|
126
|
+
# # Current working directory
|
|
127
|
+
# # Type: string
|
|
128
|
+
# # Default: "."
|
|
129
|
+
# working-directory: ''
|
|
130
|
+
|
|
131
|
+
- run: echo "🍏 This job's status is ${{ job.status }}."
|
|
@@ -17,7 +17,7 @@ jobs:
|
|
|
17
17
|
name: Build release to /dist
|
|
18
18
|
runs-on: ubuntu-latest
|
|
19
19
|
steps:
|
|
20
|
-
- uses: actions/checkout@
|
|
20
|
+
- uses: actions/checkout@v6
|
|
21
21
|
|
|
22
22
|
- name: Install hatch
|
|
23
23
|
run: pipx install hatch
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
run: hatch build
|
|
27
27
|
|
|
28
28
|
- name: Upload dist
|
|
29
|
-
uses: actions/upload-artifact@
|
|
29
|
+
uses: actions/upload-artifact@v6
|
|
30
30
|
with:
|
|
31
31
|
name: dist
|
|
32
32
|
path: dist/
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
url: https://pypi.org/project/ramses_rf
|
|
41
41
|
steps:
|
|
42
42
|
- name: Download dist
|
|
43
|
-
uses: actions/download-artifact@
|
|
43
|
+
uses: actions/download-artifact@v7
|
|
44
44
|
with:
|
|
45
45
|
name: dist
|
|
46
46
|
path: dist/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ramses_rf
|
|
3
|
-
Version: 0.52.
|
|
3
|
+
Version: 0.52.5
|
|
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
|
|
@@ -22,6 +22,7 @@ Description-Content-Type: text/markdown
|
|
|
22
22
|

|
|
23
23
|

|
|
24
24
|

|
|
25
|
+
[](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml)
|
|
25
26
|
|
|
26
27
|
## Overview
|
|
27
28
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|

|
|
2
2
|

|
|
3
3
|

|
|
4
|
+
[](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml)
|
|
4
5
|
|
|
5
6
|
## Overview
|
|
6
7
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# RAMSES RF Binding Process
|
|
1
|
+
# RAMSES RF Binding Process
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
This diagram shows the binding finite state machine (FSM) for RAMSES RF devices, illustrating the complete process from initial state to binding completion.
|
|
@@ -38,8 +38,8 @@ stateDiagram-v2
|
|
|
38
38
|
RespHasBoundAsRespondent
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
classDef supplicant fill:#
|
|
42
|
-
classDef respondent fill:#
|
|
41
|
+
classDef supplicant fill:#ff64dd,stroke:#ffffff,stroke-width:2px
|
|
42
|
+
classDef respondent fill:#55bb8B,stroke:#ffffff,stroke-width:2px
|
|
43
43
|
|
|
44
44
|
class SuppSendOfferWaitForAccept,OfferSent,SuppIsReadyToSendConfirm,SuppHasBoundAsSupplicant supplicant
|
|
45
45
|
class RespIsWaitingForOffer,OfferReceived,RespSendAcceptWaitForConfirm,RespHasBoundAsRespondent respondent
|
|
@@ -81,8 +81,46 @@
|
|
|
81
81
|
asyncio_default_fixture_loop_scope = "function"
|
|
82
82
|
asyncio_mode = "auto"
|
|
83
83
|
|
|
84
|
+
testpaths = [
|
|
85
|
+
"tests/"
|
|
86
|
+
]
|
|
84
87
|
norecursedirs = "deprecated/*"
|
|
85
88
|
|
|
89
|
+
# pytest-cov slows down our tests to 10 mins, so leave off.
|
|
90
|
+
# We run coverage in a separate workflow on python 3.13 only (fastest)
|
|
91
|
+
# pytest-cov coverage reporting. open htmlcov/index.html in a browser for details
|
|
92
|
+
# addopts = ["--cov=src", "--cov-fail-under=50", "--cov-report=xml", "--cov-report=term"]
|
|
93
|
+
# to create an interactive local HTML report, add: --cov-report=html
|
|
94
|
+
# to report missed lines during test writing, add: --cov-report=term-missing
|
|
95
|
+
# PyCharm might not hit a breakpoint. For debugging, disable -cov by adding:
|
|
96
|
+
# –no-cov"
|
|
97
|
+
# cov_report_term = "term-missing:skip-covered"
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
### coverage #########################################################################
|
|
101
|
+
|
|
102
|
+
[tool.coverage.run]
|
|
103
|
+
core = "sysmon" # essential setting for speed on GitHub < 11 secs instead of >12 mins
|
|
104
|
+
branch = false # true takes a lot longer and can't be combined with sysmon
|
|
105
|
+
# patch = ["subprocess"]
|
|
106
|
+
source = [
|
|
107
|
+
"src",
|
|
108
|
+
"tests"
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
[tool.coverage.report]
|
|
112
|
+
# Regexes for lines to exclude from consideration
|
|
113
|
+
exclude_also = [
|
|
114
|
+
# Don't complain if tests don't hit defensive assertion code:
|
|
115
|
+
"raise AssertionError",
|
|
116
|
+
"raise NotImplementedError",
|
|
117
|
+
]
|
|
118
|
+
format = "text"
|
|
119
|
+
fail_under = 75
|
|
120
|
+
ignore_errors = true
|
|
121
|
+
|
|
122
|
+
[tool.coverage.html]
|
|
123
|
+
directory = "coverage_html"
|
|
86
124
|
|
|
87
125
|
#
|
|
88
126
|
### mypy #############################################################################
|
|
@@ -588,6 +588,7 @@ def main() -> None:
|
|
|
588
588
|
print(" - event_loop_policy set for win32") # do before asyncio.run()
|
|
589
589
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
|
590
590
|
|
|
591
|
+
profile = None
|
|
591
592
|
try:
|
|
592
593
|
if _PROFILE_LIBRARY:
|
|
593
594
|
profile = cProfile.Profile()
|
|
@@ -9,7 +9,7 @@ DEBUG_PORT = 5678
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def start_debugging(wait_for_client: bool) -> None:
|
|
12
|
-
import debugpy
|
|
12
|
+
import debugpy
|
|
13
13
|
|
|
14
14
|
debugpy.listen(address=(DEBUG_ADDR, DEBUG_PORT))
|
|
15
15
|
print(f" - Debugging is enabled, listening on: {DEBUG_ADDR}:{DEBUG_PORT}")
|
|
@@ -17,7 +17,7 @@ parser.add_argument("-i", "--input-file", type=argparse.FileType("r"), default="
|
|
|
17
17
|
args = parser.parse_args()
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def convert_json_to_yaml(data: dict) ->
|
|
20
|
+
def convert_json_to_yaml(data: dict) -> None:
|
|
21
21
|
"""Convert from json (client.py -C config.json) to yaml (HA configuration.yaml)."""
|
|
22
22
|
(config, schema, include, exclude) = load_config("/dev/ttyMOCK", None, **data)
|
|
23
23
|
|
|
@@ -37,7 +37,7 @@ def convert_json_to_yaml(data: dict) -> str:
|
|
|
37
37
|
print(yaml.dump({"ramses_cc": result}, sort_keys=False))
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
def convert_yaml_to_json(data: dict) ->
|
|
40
|
+
def convert_yaml_to_json(data: dict) -> None:
|
|
41
41
|
"""Convert from yaml (HA configuration.yaml) to json (client.py -C config.json)."""
|
|
42
42
|
|
|
43
43
|
result = data["ramses_cc"]
|
|
@@ -30,7 +30,7 @@ from collections import OrderedDict
|
|
|
30
30
|
from datetime import datetime as dt, timedelta as td
|
|
31
31
|
from typing import TYPE_CHECKING, Any, NewType
|
|
32
32
|
|
|
33
|
-
from ramses_tx import CODES_SCHEMA, Code, Message
|
|
33
|
+
from ramses_tx import CODES_SCHEMA, RQ, Code, Message, Packet
|
|
34
34
|
|
|
35
35
|
if TYPE_CHECKING:
|
|
36
36
|
DtmStrT = NewType("DtmStrT", str)
|
|
@@ -130,11 +130,15 @@ class MessageIndex:
|
|
|
130
130
|
def stop(self) -> None:
|
|
131
131
|
"""Stop the housekeeper loop."""
|
|
132
132
|
|
|
133
|
-
if
|
|
133
|
+
if (
|
|
134
|
+
self.maintain
|
|
135
|
+
and self._housekeeping_task
|
|
136
|
+
and (not self._housekeeping_task.done())
|
|
137
|
+
):
|
|
134
138
|
self._housekeeping_task.cancel() # stop the housekeeper
|
|
135
139
|
|
|
136
140
|
self._cx.commit() # just in case
|
|
137
|
-
|
|
141
|
+
self._cx.close() # may still need to do queries after engine has stopped?
|
|
138
142
|
|
|
139
143
|
@property
|
|
140
144
|
def msgs(self) -> MsgDdT:
|
|
@@ -151,7 +155,7 @@ class MessageIndex:
|
|
|
151
155
|
- verb " I", "RQ" etc.
|
|
152
156
|
- src message origin address
|
|
153
157
|
- dst message destination address
|
|
154
|
-
- code packet code aka command class e.g.
|
|
158
|
+
- code packet code aka command class e.g. 0005, 31DA
|
|
155
159
|
- ctx message context, created from payload as index + extra markers (Heat)
|
|
156
160
|
- hdr packet header e.g. 000C|RP|01:223036|0208 (see: src/ramses_tx/frame.py)
|
|
157
161
|
- plk the keys stored in the parsed payload, separated by the | char
|
|
@@ -183,7 +187,7 @@ class MessageIndex:
|
|
|
183
187
|
|
|
184
188
|
async def _housekeeping_loop(self) -> None:
|
|
185
189
|
"""Periodically remove stale messages from the index,
|
|
186
|
-
unless `self.maintain` is False."""
|
|
190
|
+
unless `self.maintain` is False - as in (most) tests."""
|
|
187
191
|
|
|
188
192
|
async def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
|
|
189
193
|
"""
|
|
@@ -191,9 +195,10 @@ class MessageIndex:
|
|
|
191
195
|
:param dt_now: current timestamp
|
|
192
196
|
:param _cutoff: the oldest timestamp to retain, default is 24 hours ago
|
|
193
197
|
"""
|
|
194
|
-
|
|
198
|
+
msgs = None
|
|
199
|
+
dtm = dt_now - _cutoff
|
|
195
200
|
|
|
196
|
-
self._cu.execute("SELECT dtm FROM messages WHERE dtm
|
|
201
|
+
self._cu.execute("SELECT dtm FROM messages WHERE dtm >= ?", (dtm,))
|
|
197
202
|
rows = self._cu.fetchall() # fetch dtm of current messages to retain
|
|
198
203
|
|
|
199
204
|
try: # make this operation atomic, i.e. update self._msgs only on success
|
|
@@ -208,6 +213,10 @@ class MessageIndex:
|
|
|
208
213
|
self._msgs = msgs
|
|
209
214
|
finally:
|
|
210
215
|
self._lock.release()
|
|
216
|
+
if msgs:
|
|
217
|
+
_LOGGER.debug(
|
|
218
|
+
"MessageIndex size was: %d, now: %d", len(rows), len(msgs)
|
|
219
|
+
)
|
|
211
220
|
|
|
212
221
|
while True:
|
|
213
222
|
self._last_housekeeping = dt.now()
|
|
@@ -242,13 +251,17 @@ class MessageIndex:
|
|
|
242
251
|
else:
|
|
243
252
|
# _msgs dict requires a timestamp reformat
|
|
244
253
|
dtm: DtmStrT = msg.dtm.isoformat(timespec="microseconds") # type: ignore[assignment]
|
|
254
|
+
# add msg to self._msgs dict
|
|
245
255
|
self._msgs[dtm] = msg
|
|
246
256
|
|
|
247
257
|
finally:
|
|
248
258
|
pass # self._lock.release()
|
|
249
259
|
|
|
250
260
|
if (
|
|
251
|
-
dup
|
|
261
|
+
dup
|
|
262
|
+
and (msg.src is not msg.dst)
|
|
263
|
+
and not msg.dst.id.startswith("18:") # HGI
|
|
264
|
+
and msg.verb != RQ # these may come very quickly
|
|
252
265
|
): # when src==dst, expect to add duplicate, don't warn
|
|
253
266
|
_LOGGER.debug(
|
|
254
267
|
"Overwrote dtm (%s) for %s: %s (contrived log?)",
|
|
@@ -256,8 +269,6 @@ class MessageIndex:
|
|
|
256
269
|
msg._pkt._hdr,
|
|
257
270
|
dup[0]._pkt,
|
|
258
271
|
)
|
|
259
|
-
if old is not None:
|
|
260
|
-
_LOGGER.debug("Old msg replaced: %s", old)
|
|
261
272
|
|
|
262
273
|
return old
|
|
263
274
|
|
|
@@ -270,7 +281,8 @@ class MessageIndex:
|
|
|
270
281
|
:param verb: two letter verb str to use
|
|
271
282
|
"""
|
|
272
283
|
# Used by OtbGateway init, via entity_base.py
|
|
273
|
-
|
|
284
|
+
_now: dt = dt.now()
|
|
285
|
+
dtm: DtmStrT = _now.isoformat(timespec="microseconds") # type: ignore[assignment]
|
|
274
286
|
hdr = f"{code}|{verb}|{src}|00" # dummy record has no contents
|
|
275
287
|
|
|
276
288
|
dup = self._delete_from(hdr=hdr)
|
|
@@ -283,7 +295,7 @@ class MessageIndex:
|
|
|
283
295
|
self._cu.execute(
|
|
284
296
|
sql,
|
|
285
297
|
(
|
|
286
|
-
|
|
298
|
+
_now,
|
|
287
299
|
verb,
|
|
288
300
|
src,
|
|
289
301
|
src,
|
|
@@ -295,6 +307,14 @@ class MessageIndex:
|
|
|
295
307
|
)
|
|
296
308
|
except sqlite3.Error:
|
|
297
309
|
self._cx.rollback()
|
|
310
|
+
else:
|
|
311
|
+
# also add dummy 3220 msg to self._msgs dict to allow maintenance loop
|
|
312
|
+
msg: Message = Message._from_pkt(
|
|
313
|
+
Packet(
|
|
314
|
+
_now, f"... {verb} --- {src} --:------ {src} {code} 005 0000000000"
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
self._msgs[dtm] = msg
|
|
298
318
|
|
|
299
319
|
if dup: # expected when more than one heat system in schema
|
|
300
320
|
_LOGGER.debug("Replaced record with same hdr: %s", hdr)
|
|
@@ -355,7 +375,7 @@ class MessageIndex:
|
|
|
355
375
|
if not bool(msg) ^ bool(kwargs):
|
|
356
376
|
raise ValueError("Either a Message or kwargs should be provided, not both")
|
|
357
377
|
if msg:
|
|
358
|
-
kwargs["dtm"] = msg.dtm
|
|
378
|
+
kwargs["dtm"] = msg.dtm
|
|
359
379
|
|
|
360
380
|
msgs = None
|
|
361
381
|
try: # make this operation atomic, i.e. update self._msgs only on success
|
|
@@ -406,7 +426,7 @@ class MessageIndex:
|
|
|
406
426
|
raise ValueError("Either a Message or kwargs should be provided, not both")
|
|
407
427
|
|
|
408
428
|
if msg:
|
|
409
|
-
kwargs["dtm"] = msg.dtm
|
|
429
|
+
kwargs["dtm"] = msg.dtm
|
|
410
430
|
|
|
411
431
|
return self._select_from(**kwargs)
|
|
412
432
|
|
|
@@ -428,10 +448,15 @@ class MessageIndex:
|
|
|
428
448
|
:returns: a tuple of qualifying messages
|
|
429
449
|
"""
|
|
430
450
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
451
|
+
# CHANGE: Use a list comprehension with a check to avoid KeyError
|
|
452
|
+
res: list[Message] = []
|
|
453
|
+
for row in self.qry_dtms(**kwargs):
|
|
454
|
+
ts: DtmStrT = row[0].isoformat(timespec="microseconds")
|
|
455
|
+
if ts in self._msgs:
|
|
456
|
+
res.append(self._msgs[ts])
|
|
457
|
+
else:
|
|
458
|
+
_LOGGER.debug("MessageIndex timestamp %s not in device messages", ts)
|
|
459
|
+
return tuple(res)
|
|
435
460
|
|
|
436
461
|
def qry_dtms(self, **kwargs: bool | dt | str) -> list[Any]:
|
|
437
462
|
"""
|
|
@@ -483,6 +508,7 @@ class MessageIndex:
|
|
|
483
508
|
# _msgs stamp format: 2022-09-08T13:40:52.447364
|
|
484
509
|
if ts in self._msgs:
|
|
485
510
|
lst.append(self._msgs[ts])
|
|
511
|
+
# _LOGGER.debug("MessageIndex ts %s added to qry.lst", ts) # too frequent
|
|
486
512
|
else: # happens in tests with artificial msg from heat
|
|
487
513
|
_LOGGER.info("MessageIndex timestamp %s not in device messages", ts)
|
|
488
514
|
return tuple(lst)
|
|
@@ -546,8 +572,9 @@ class MessageIndex:
|
|
|
546
572
|
if ts in self._msgs:
|
|
547
573
|
# if include_expired or not self._msgs[ts].HAS_EXPIRED: # not working
|
|
548
574
|
lst.append(self._msgs[ts])
|
|
549
|
-
|
|
550
|
-
|
|
575
|
+
_LOGGER.debug("MessageIndex ts %s added to all.lst", ts)
|
|
576
|
+
else: # happens in tests and real evohome setups with dummy msg from heat init
|
|
577
|
+
_LOGGER.debug("MessageIndex ts %s not in device messages", ts)
|
|
551
578
|
return tuple(lst)
|
|
552
579
|
|
|
553
580
|
def clr(self) -> None:
|
|
@@ -87,9 +87,10 @@ class DeviceBase(Entity):
|
|
|
87
87
|
return self.id < other.id # type: ignore[no-any-return]
|
|
88
88
|
|
|
89
89
|
def _update_traits(self, **traits: Any) -> None:
|
|
90
|
-
"""Update a device with new schema
|
|
90
|
+
"""Update a device with new schema attributes.
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
:param traits: The traits to apply (e.g., alias, class, faked)
|
|
93
|
+
:raises TypeError: If the device is not fakeable but 'faked' is set.
|
|
93
94
|
"""
|
|
94
95
|
|
|
95
96
|
traits = shrink(SCH_TRAITS(traits))
|
|
@@ -342,7 +343,17 @@ class Fakeable(DeviceBase):
|
|
|
342
343
|
idx: IndexT = "00",
|
|
343
344
|
require_ratify: bool = False,
|
|
344
345
|
) -> tuple[Packet, Packet, Packet, Packet | None]:
|
|
345
|
-
"""Listen for a binding and return the Offer
|
|
346
|
+
"""Listen for a binding and return the Offer packets.
|
|
347
|
+
|
|
348
|
+
:param accept_codes: The codes allowed for this binding
|
|
349
|
+
:type accept_codes: Iterable[Code]
|
|
350
|
+
:param idx: The index to bind to, defaults to "00"
|
|
351
|
+
:type idx: IndexT
|
|
352
|
+
:param require_ratify: Whether a ratification step is required, defaults to False
|
|
353
|
+
:type require_ratify: bool
|
|
354
|
+
:return: A tuple of the four binding transaction packets
|
|
355
|
+
:rtype: tuple[Packet, Packet, Packet, Packet | None]
|
|
356
|
+
"""
|
|
346
357
|
|
|
347
358
|
if not self._bind_context:
|
|
348
359
|
raise TypeError(f"{self}: Faking not enabled")
|
|
@@ -450,7 +450,7 @@ class UfhController(Parent, DeviceHeat): # UFC (02):
|
|
|
450
450
|
# )
|
|
451
451
|
# self._send_cmd(cmd)
|
|
452
452
|
|
|
453
|
-
elif msg.code == Code._0008: # relay_demand
|
|
453
|
+
elif msg.code == Code._0008: # relay_demand
|
|
454
454
|
if msg.payload.get(SZ_DOMAIN_ID) == FC:
|
|
455
455
|
self._relay_demand = msg
|
|
456
456
|
else: # FA
|
|
@@ -669,7 +669,7 @@ class OtbGateway(Actuator, HeatDemand): # OTB (10): 3220 (22D9, others)
|
|
|
669
669
|
|
|
670
670
|
# TODO(eb): cleanup
|
|
671
671
|
if self._gwy.msg_db:
|
|
672
|
-
self._add_record(
|
|
672
|
+
self._add_record(id=self.id, code=Code._3220, verb="RP")
|
|
673
673
|
# adds a "sim" RP opentherm_msg to the SQLite MessageIndex with code _3220
|
|
674
674
|
# causes exc when fetching ALL, when no "real" msg was added to _msgs_. We skip those.
|
|
675
675
|
else:
|
|
@@ -921,27 +921,30 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A], 2411
|
|
|
921
921
|
|
|
922
922
|
:return: string describing fan mode, speed
|
|
923
923
|
"""
|
|
924
|
-
if self._gwy.msg_db:
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
924
|
+
# if self._gwy.msg_db:
|
|
925
|
+
# Use SQLite query on MessageIndex. res_rate/res_mode not exposed yet
|
|
926
|
+
# working fine in 0.52.4, no need to specify code, only payload key
|
|
927
|
+
# sql = f"""
|
|
928
|
+
# SELECT code from messages WHERE verb in (' I', 'RP')
|
|
929
|
+
# AND (src = ? OR dst = ?)
|
|
930
|
+
# AND (plk LIKE '%{SZ_FAN_MODE}%')
|
|
931
|
+
# """
|
|
932
|
+
# res_mode: list = self._msg_qry(sql)
|
|
933
|
+
# # SQLite query on MessageIndex
|
|
934
|
+
# _LOGGER.debug(
|
|
935
|
+
# f"# Fetched FAN_MODE for {self.id} from MessageIndex: {res_mode}"
|
|
936
|
+
# )
|
|
937
|
+
|
|
938
|
+
# sql = f"""
|
|
939
|
+
# SELECT code from messages WHERE verb in (' I', 'RP')
|
|
940
|
+
# AND (src = ? OR dst = ?)
|
|
941
|
+
# AND (plk LIKE '%{SZ_FAN_RATE}%')
|
|
942
|
+
# """
|
|
943
|
+
# res_rate: list = self._msg_qry(sql)
|
|
944
|
+
# # SQLite query on MessageIndex
|
|
945
|
+
# _LOGGER.debug(
|
|
946
|
+
# f"# Fetched FAN_RATE for {self.id} from MessageIndex: {res_rate}"
|
|
947
|
+
# )
|
|
945
948
|
|
|
946
949
|
if Code._31D9 in self._msgs:
|
|
947
950
|
# was a dict by Code
|