ramses-rf 0.51.5__tar.gz → 0.51.7__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.51.5 → ramses_rf-0.51.7}/.github/workflows/check-lint.yml +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.github/workflows/check-test.yml +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.github/workflows/check-type.yml +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.pre-commit-config.yaml +4 -4
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/PKG-INFO +2 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/README-developers.md +11 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/README.md +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/client.py +0 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/database.py +39 -24
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/device/base.py +2 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/device/hvac.py +5 -4
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/dispatcher.py +2 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/entity_base.py +28 -37
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/gateway.py +8 -16
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/helpers.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/system/zones.py +4 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/version.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/__init__.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/address.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/command.py +111 -3
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/const.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/gateway.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/helpers.py +67 -31
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/logger.py +0 -24
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/message.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/parsers.py +27 -21
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/ramses.py +3 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/transport.py +44 -3
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/typed_dicts.py +3 -2
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/version.py +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/requirements_dev.txt +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_packets_bad.py +3 -3
- ramses_rf-0.51.7/tests/tests/devices/device_02.log +12 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/10e0_xxxx.log +19 -16
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +2 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +1 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/helpers.py +4 -4
- ramses_rf-0.51.7/tests/tests/parsers/code_0008.log +3 -0
- ramses_rf-0.51.7/tests/tests/parsers/code_1fd4.log +3 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22d0.log +3 -0
- ramses_rf-0.51.7/tests/tests/parsers/code_22f3.log +24 -0
- ramses_rf-0.51.7/tests/tests/parsers/code_30c9.log +16 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3110_wip.log +1 -1
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3120.log +6 -3
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3150.log +3 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_31da.log +116 -116
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3ef0_wip.log +4 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_apis_binding.py +1 -1
- ramses_rf-0.51.7/tests/tests/test_apis_hvac.py +358 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_eavesdrop_dev_class.py +15 -14
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_eavesdrop_schema.py +6 -6
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_schemas.py +4 -4
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_systems.py +1 -1
- ramses_rf-0.51.5/tests/tests/devices/device_02.log +0 -7
- ramses_rf-0.51.5/tests/tests/parsers/code_22f3.log +0 -17
- ramses_rf-0.51.5/tests/tests/parsers/code_30c9.log +0 -14
- ramses_rf-0.51.5/tests/tests/test_apis_hvac.py +0 -180
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.github/dependabot.yml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.github/workflows/publish-hatch.yml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/.gitignore +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/LICENSE +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/client.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/misc/fingerprints.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/misc/ser2net.yaml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/misc/ti_3410/notes.sh +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/misc/ti_3410/ti_3410.fw +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/pyproject.toml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/debug.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/discovery.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/utils/cat_slow.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_cli/utils/convert.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/binding_fsm.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/const.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/device/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/device/heat.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/exceptions.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/py.typed +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/schemas.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/system/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/system/faultlog.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/system/heat.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_rf/system/schedule.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/exceptions.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/fingerprints.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/frame.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/opentherm.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/packet.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/protocol.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/protocol_fsm.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/py.typed +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/schemas.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/ramses_tx/typing.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/requirements.txt +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_apis_mock.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_mock_faultlog.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_mock_schedule.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_performance_WIP.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/_test_state_mgt.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/common.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/command.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/const.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/device_heat.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/deprecated/mocked_devices/transport.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/heat/trv_ctl.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/devices/device_04.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/devices/device_10.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/devices/device_13.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/devices/device_22.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/_gather.sh +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/20.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/logger/packet_in.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/logger/packet_out.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/logs/pkts_bad_000.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/logs/pkts_tba_000.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/logs/system_cache.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0001_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0002.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0004_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0005.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0006.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0009.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_000a.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_000c.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_000e.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_01ff_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_0418.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_042f.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1030.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1060.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_10d0.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_10e0.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1260.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1298.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_12a0.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_12c0.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1300.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1f09.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_1fc9.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2210.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22c9.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22d9.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22e0.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22e5.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22e9.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22f1.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22f2.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22f4.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_22f7.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2309.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2349.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2411_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2e04.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_2e10_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_313e_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_31d9.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3200.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3210.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3220.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3222.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_3ef1_wip.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_4e01.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_4e02.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_4e04.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/parsers/code_4e15.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/_sched_002/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/_sched_002/schedule.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/sched_001/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/sched_001/schedule.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/sched_dhw/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_000.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_000.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_001.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_001.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_002.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_002.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_010.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_010.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_011.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_011.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_012.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_012.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_013.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_013.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_014.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_014.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_300.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_300.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_301.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_301.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_302.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_302.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_303.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_303.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_304.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_304.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_310.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/schemas/log_files/schema_310.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_heat_trv_00/config.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_otb_00/config.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_otb_00/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_otb_00/schema.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_simple/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_simple/schema.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_ufc_00/config.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_zxdavb/config.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_api_faultlog.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_api_schedule.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_apis_common.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_apis_heat.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_cli_utility.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_devices.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_helpers.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_parser_helpers.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_parsers.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_ramses_schema.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_schema_bits.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests/test_vol_schemas.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/configs/config_heat.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/configs/config_hvac.json +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/conftest.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_api_faultlog.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_api_schedule.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_binding_fsm.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_create_stack.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_hgi_behaviors.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_protocol_fsm.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_use_regex.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/test_virt_network.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/virtual_rf/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/virtual_rf/const.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/virtual_rf/helpers.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_tx/__init__.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/tests_tx/test_command.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
- {ramses_rf-0.51.5 → ramses_rf-0.51.7}/tests/wip/test_wip_cli.sh +0 -0
|
@@ -3,9 +3,9 @@ exclude: ^(.secrets|docs|misc|tests/deprecated)/
|
|
|
3
3
|
|
|
4
4
|
repos:
|
|
5
5
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
6
|
-
rev: v0.
|
|
6
|
+
rev: v0.13.0
|
|
7
7
|
hooks:
|
|
8
|
-
- id: ruff
|
|
8
|
+
- id: ruff-check # linter
|
|
9
9
|
- id: ruff-format # formatter
|
|
10
10
|
|
|
11
11
|
- repo: https://github.com/cdce8p/python-typing-update
|
|
@@ -24,7 +24,7 @@ repos:
|
|
|
24
24
|
files: ^(src|tests)/.+\.py$
|
|
25
25
|
|
|
26
26
|
- repo: https://github.com/codespell-project/codespell
|
|
27
|
-
rev: v2.
|
|
27
|
+
rev: v2.4.1
|
|
28
28
|
hooks:
|
|
29
29
|
- id: codespell
|
|
30
30
|
args:
|
|
@@ -35,7 +35,7 @@ repos:
|
|
|
35
35
|
exclude: ^(tests/.+/fixtures|tests/.+/snapshots)/
|
|
36
36
|
|
|
37
37
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
38
|
-
rev:
|
|
38
|
+
rev: v6.0.0
|
|
39
39
|
hooks:
|
|
40
40
|
- id: check-executables-have-shebangs
|
|
41
41
|
# id: check-json # don't enable this one
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ramses_rf
|
|
3
|
-
Version: 0.51.
|
|
3
|
+
Version: 0.51.7
|
|
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
|
|
@@ -67,6 +67,6 @@ pip install -e .
|
|
|
67
67
|
|
|
68
68
|
The CLI is called ``client.py`` and is included in the code root.
|
|
69
69
|
It has options to monitor and parse Ramses-II traffic to screen or a log file, and to parse a file containing Ramses-II messages to the screen.
|
|
70
|
-
See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/The-client.py-command-line) for instructions.
|
|
70
|
+
See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/2.-The-client.py-command-line) for instructions.
|
|
71
71
|
|
|
72
72
|
For code development, some more setup is required. Please follow the steps in our [Developer's Resource](README-developers.md)
|
|
@@ -48,7 +48,12 @@ pip install -r requirements_dev.txt
|
|
|
48
48
|
Repeat this after a release update and also when dev_requirements change in master.
|
|
49
49
|
|
|
50
50
|
### Install pre-commit hook
|
|
51
|
-
|
|
51
|
+
First, verify the installed pre-commit version (compare to requirements_dev.txt):
|
|
52
|
+
```
|
|
53
|
+
pre-commit --version
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Install the repo's pre-commit hook:
|
|
52
57
|
```
|
|
53
58
|
pre-commit install
|
|
54
59
|
```
|
|
@@ -56,5 +61,9 @@ pre-commit install
|
|
|
56
61
|
Running `pre-commit run` will only check staged files before a commit, while
|
|
57
62
|
`pre-commit run -a` will check all files.
|
|
58
63
|
|
|
64
|
+
Your IDE should automatically activate the pre-commit check when you try to commit.
|
|
65
|
+
The rules for pre-commit are in git in `.pre-commit-config.yaml`.
|
|
66
|
+
Check [issue 170](https://github.com/ramses-rf/ramses_rf/issues/170) when you run into troubles here.
|
|
67
|
+
|
|
59
68
|
## More
|
|
60
|
-
For more hints, see the [How to submit a PR wiki page](https://github.com/ramses-rf/
|
|
69
|
+
For more hints, see the [How to submit a PR wiki page](https://github.com/ramses-rf/ramses_cc/wiki/7.-How-to-submit-a-PR)
|
|
@@ -46,6 +46,6 @@ pip install -e .
|
|
|
46
46
|
|
|
47
47
|
The CLI is called ``client.py`` and is included in the code root.
|
|
48
48
|
It has options to monitor and parse Ramses-II traffic to screen or a log file, and to parse a file containing Ramses-II messages to the screen.
|
|
49
|
-
See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/The-client.py-command-line) for instructions.
|
|
49
|
+
See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/2.-The-client.py-command-line) for instructions.
|
|
50
50
|
|
|
51
51
|
For code development, some more setup is required. Please follow the steps in our [Developer's Resource](README-developers.md)
|
|
@@ -483,7 +483,6 @@ async def async_main(command: str, lib_kwargs: dict, **kwargs: Any) -> None:
|
|
|
483
483
|
print(f"{COLORS.get(msg.verb)}{dtm} {msg}"[:con_cols])
|
|
484
484
|
|
|
485
485
|
serial_port, lib_kwargs = normalise_config(lib_kwargs)
|
|
486
|
-
assert isinstance(lib_kwargs.get(SZ_INPUT_FILE), str)
|
|
487
486
|
|
|
488
487
|
if kwargs["restore_schema"]:
|
|
489
488
|
print(" - restoring client schema from a HA cache...")
|
|
@@ -29,6 +29,22 @@ class Params(TypedDict):
|
|
|
29
29
|
_LOGGER = logging.getLogger(__name__)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def _setup_db_adapters() -> None:
|
|
33
|
+
"""Set up the database adapters and converters."""
|
|
34
|
+
|
|
35
|
+
def adapt_datetime_iso(val: dt) -> str:
|
|
36
|
+
"""Adapt datetime.datetime to timezone-naive ISO 8601 datetime."""
|
|
37
|
+
return val.isoformat(timespec="microseconds")
|
|
38
|
+
|
|
39
|
+
sqlite3.register_adapter(dt, adapt_datetime_iso)
|
|
40
|
+
|
|
41
|
+
def convert_datetime(val: bytes) -> dt:
|
|
42
|
+
"""Convert ISO 8601 datetime to datetime.datetime object."""
|
|
43
|
+
return dt.fromisoformat(val.decode())
|
|
44
|
+
|
|
45
|
+
sqlite3.register_converter("dtm", convert_datetime)
|
|
46
|
+
|
|
47
|
+
|
|
32
48
|
class MessageIndex:
|
|
33
49
|
"""A simple in-memory SQLite3 database for indexing messages."""
|
|
34
50
|
|
|
@@ -40,7 +56,7 @@ class MessageIndex:
|
|
|
40
56
|
self._cx = sqlite3.connect(":memory:") # Connect to a SQLite DB in memory
|
|
41
57
|
self._cu = self._cx.cursor() # Create a cursor
|
|
42
58
|
|
|
43
|
-
|
|
59
|
+
_setup_db_adapters() # dtm adapter/converter
|
|
44
60
|
self._setup_db_schema()
|
|
45
61
|
|
|
46
62
|
self._lock = asyncio.Lock()
|
|
@@ -76,23 +92,19 @@ class MessageIndex:
|
|
|
76
92
|
"""Return the messages in the index in a threadsafe way."""
|
|
77
93
|
return self._msgs
|
|
78
94
|
|
|
79
|
-
def
|
|
80
|
-
"""
|
|
81
|
-
|
|
82
|
-
def adapt_datetime_iso(val: dt) -> str:
|
|
83
|
-
"""Adapt datetime.datetime to timezone-naive ISO 8601 datetime."""
|
|
84
|
-
return val.isoformat(timespec="microseconds")
|
|
85
|
-
|
|
86
|
-
sqlite3.register_adapter(dt, adapt_datetime_iso)
|
|
87
|
-
|
|
88
|
-
def convert_datetime(val: bytes) -> dt:
|
|
89
|
-
"""Convert ISO 8601 datetime to datetime.datetime object."""
|
|
90
|
-
return dt.fromisoformat(val.decode())
|
|
95
|
+
def _setup_db_schema(self) -> None:
|
|
96
|
+
"""Set up the message database schema.
|
|
91
97
|
|
|
92
|
-
|
|
98
|
+
Fields:
|
|
93
99
|
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
- dtm message timestamp
|
|
101
|
+
- verb _I, RQ etc.
|
|
102
|
+
- src message origin address
|
|
103
|
+
- dst message destination address
|
|
104
|
+
- code packet code aka command class e.g. _0005, _31DA
|
|
105
|
+
- ctx message context, created from payload as index + extra markers (Heat)
|
|
106
|
+
- hdr packet header e.g. 000C|RP|01:223036|0208 (see: src/ramses_tx/frame.py)
|
|
107
|
+
"""
|
|
96
108
|
|
|
97
109
|
self._cu.execute(
|
|
98
110
|
"""
|
|
@@ -120,14 +132,14 @@ class MessageIndex:
|
|
|
120
132
|
async def _housekeeping_loop(self) -> None:
|
|
121
133
|
"""Periodically remove stale messages from the index."""
|
|
122
134
|
|
|
123
|
-
def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
|
|
135
|
+
async def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
|
|
124
136
|
dtm = (dt_now - _cutoff).isoformat(timespec="microseconds")
|
|
125
137
|
|
|
126
138
|
self._cu.execute("SELECT dtm FROM messages WHERE dtm => ?", (dtm,))
|
|
127
139
|
rows = self._cu.fetchall()
|
|
128
140
|
|
|
129
141
|
try: # make this operation atomic, i.e. update self._msgs only on success
|
|
130
|
-
|
|
142
|
+
await self._lock.acquire()
|
|
131
143
|
self._cu.execute("DELETE FROM messages WHERE dtm < ?", (dtm,))
|
|
132
144
|
msgs = OrderedDict({row[0]: self._msgs[row[0]] for row in rows})
|
|
133
145
|
self._cx.commit()
|
|
@@ -137,19 +149,19 @@ class MessageIndex:
|
|
|
137
149
|
else:
|
|
138
150
|
self._msgs = msgs
|
|
139
151
|
finally:
|
|
140
|
-
|
|
152
|
+
self._lock.release()
|
|
141
153
|
|
|
142
154
|
while True:
|
|
143
155
|
self._last_housekeeping = dt.now()
|
|
144
156
|
await asyncio.sleep(3600)
|
|
145
|
-
housekeeping(self._last_housekeeping)
|
|
157
|
+
await housekeeping(self._last_housekeeping)
|
|
146
158
|
|
|
147
159
|
def add(self, msg: Message) -> Message | None:
|
|
148
160
|
"""Add a single message to the index.
|
|
149
161
|
|
|
150
162
|
Returns any message that was removed because it had the same header.
|
|
151
163
|
|
|
152
|
-
Throws a warning
|
|
164
|
+
Throws a warning if there is a duplicate dtm.
|
|
153
165
|
""" # TODO: eventually, may be better to use SqlAlchemy
|
|
154
166
|
|
|
155
167
|
dup: tuple[Message, ...] = tuple() # avoid UnboundLocalError
|
|
@@ -204,7 +216,9 @@ class MessageIndex:
|
|
|
204
216
|
|
|
205
217
|
return msgs[0] if msgs else None
|
|
206
218
|
|
|
207
|
-
def rem(
|
|
219
|
+
def rem(
|
|
220
|
+
self, msg: Message | None = None, **kwargs: str
|
|
221
|
+
) -> tuple[Message, ...] | None:
|
|
208
222
|
"""Remove a set of message(s) from the index.
|
|
209
223
|
|
|
210
224
|
Returns any messages that were removed.
|
|
@@ -215,6 +229,7 @@ class MessageIndex:
|
|
|
215
229
|
if msg:
|
|
216
230
|
kwargs["dtm"] = msg.dtm.isoformat(timespec="microseconds")
|
|
217
231
|
|
|
232
|
+
msgs = None
|
|
218
233
|
try: # make this operation atomic, i.e. update self._msgs only on success
|
|
219
234
|
# await self._lock.acquire()
|
|
220
235
|
msgs = self._delete_from(**kwargs)
|
|
@@ -277,8 +292,8 @@ class MessageIndex:
|
|
|
277
292
|
def all(self, include_expired: bool = False) -> tuple[Message, ...]:
|
|
278
293
|
"""Return all messages from the index."""
|
|
279
294
|
|
|
280
|
-
# self.
|
|
281
|
-
# return
|
|
295
|
+
# self._cu.execute("SELECT * FROM messages")
|
|
296
|
+
# return tuple(self._msgs[row[0]] for row in self._cu.fetchall())
|
|
282
297
|
|
|
283
298
|
return tuple(
|
|
284
299
|
m for m in self._msgs.values() if include_expired or not m._expired
|
|
@@ -62,7 +62,7 @@ class DeviceBase(Entity):
|
|
|
62
62
|
|
|
63
63
|
# FIXME: ZZZ entities must know their parent device ID and their own idx
|
|
64
64
|
self._z_id = dev_addr.id # the responsible device is itself
|
|
65
|
-
self._z_idx = None # depends upon
|
|
65
|
+
self._z_idx = None # depends upon its location in the schema
|
|
66
66
|
|
|
67
67
|
self.id: DeviceIdT = dev_addr.id
|
|
68
68
|
|
|
@@ -95,7 +95,7 @@ class DeviceBase(Entity):
|
|
|
95
95
|
|
|
96
96
|
if traits.get(SZ_FAKED): # class & alias are done elsewhere
|
|
97
97
|
if not isinstance(self, Fakeable):
|
|
98
|
-
raise TypeError(f"Device is not
|
|
98
|
+
raise TypeError(f"Device is not fakeable: {self} (traits={traits})")
|
|
99
99
|
self._make_fake()
|
|
100
100
|
|
|
101
101
|
self._scheme = traits.get(SZ_SCHEME)
|
|
@@ -449,10 +449,10 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
|
|
|
449
449
|
def fan_info(self) -> str | None:
|
|
450
450
|
"""
|
|
451
451
|
Extract fan info description from _31D9 or _31DA message payload, e.g. "speed 2, medium".
|
|
452
|
-
By its name, the result is
|
|
452
|
+
By its name, the result is picked up by a sensor in HA Climate UI.
|
|
453
453
|
Some manufacturers (Orcon, Vasco) include the fan mode (auto, manual), others don't (Itho).
|
|
454
454
|
|
|
455
|
-
:return: a string describing mode, speed
|
|
455
|
+
:return: a string describing fan mode, speed
|
|
456
456
|
"""
|
|
457
457
|
if Code._31D9 in self._msgs:
|
|
458
458
|
# Itho, Vasco D60 and ClimaRad (MiniBox fan) send mode/speed in _31D9
|
|
@@ -466,9 +466,10 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
|
|
|
466
466
|
@property
|
|
467
467
|
def indoor_humidity(self) -> float | None:
|
|
468
468
|
"""
|
|
469
|
-
Extract
|
|
469
|
+
Extract indoor_humidity from MessageIndex _12A0 or _31DA payload
|
|
470
|
+
Just a demo for SQLite query helper at the moment.
|
|
470
471
|
|
|
471
|
-
:return:
|
|
472
|
+
:return: float RH value from 0.0 to 1.0 = 100%
|
|
472
473
|
"""
|
|
473
474
|
if Code._12A0 in self._msgs and isinstance(
|
|
474
475
|
self._msgs[Code._12A0].payload, list
|
|
@@ -190,7 +190,7 @@ class _MessageDB(_Entity):
|
|
|
190
190
|
def __init__(self, gwy: Gateway) -> None:
|
|
191
191
|
super().__init__(gwy)
|
|
192
192
|
|
|
193
|
-
self._msgs_: dict[Code, Message] = {} # code, should be code/ctx?
|
|
193
|
+
self._msgs_: dict[Code, Message] = {} # code, should be code/ctx?
|
|
194
194
|
self._msgz_: dict[
|
|
195
195
|
Code, dict[VerbT, dict[bool | str | None, Message]]
|
|
196
196
|
] = {} # code/verb/ctx, should be code/ctx/verb?
|
|
@@ -205,19 +205,19 @@ class _MessageDB(_Entity):
|
|
|
205
205
|
):
|
|
206
206
|
return # ZZZ: don't store these
|
|
207
207
|
|
|
208
|
+
# Store msg by code in flat self._msgs_ Dict (deprecated since 0.50.3)
|
|
208
209
|
if msg.verb in (I_, RP):
|
|
209
210
|
self._msgs_[msg.code] = msg
|
|
210
211
|
|
|
211
212
|
if msg.code not in self._msgz_:
|
|
213
|
+
# Store msg verb + ctx by code in nested self._msgz_ Dict (deprecated)
|
|
212
214
|
self._msgz_[msg.code] = {msg.verb: {msg._pkt._ctx: msg}}
|
|
213
215
|
elif msg.verb not in self._msgz_[msg.code]:
|
|
216
|
+
# Same, 1 level deeper
|
|
214
217
|
self._msgz_[msg.code][msg.verb] = {msg._pkt._ctx: msg}
|
|
215
|
-
else:
|
|
218
|
+
else:
|
|
219
|
+
# Same, replacing previous message
|
|
216
220
|
self._msgz_[msg.code][msg.verb][msg._pkt._ctx] = msg
|
|
217
|
-
# elif (
|
|
218
|
-
# self._msgz[msg.code][msg.verb][msg._pkt._ctx] is not msg
|
|
219
|
-
# ): # MsgIdx ensures this
|
|
220
|
-
# assert False # TODO: remove
|
|
221
221
|
|
|
222
222
|
@property
|
|
223
223
|
def _msg_db(self) -> list[Message]: # flattened version of _msgz[code][verb][indx]
|
|
@@ -228,7 +228,7 @@ class _MessageDB(_Entity):
|
|
|
228
228
|
- a compound ctx (e.g. 0005/000C/0418)
|
|
229
229
|
- True (an array of elements, each with its own idx),
|
|
230
230
|
- False (no idx, is usu. 00),
|
|
231
|
-
- None (not
|
|
231
|
+
- None (not determinable, rare)
|
|
232
232
|
"""
|
|
233
233
|
return [m for c in self._msgz.values() for v in c.values() for m in v.values()]
|
|
234
234
|
|
|
@@ -239,8 +239,8 @@ class _MessageDB(_Entity):
|
|
|
239
239
|
|
|
240
240
|
obj: _MessageDB
|
|
241
241
|
|
|
242
|
-
if self._gwy.
|
|
243
|
-
self._gwy.
|
|
242
|
+
if self._gwy.msg_db: # central SQLite MessageIndex
|
|
243
|
+
self._gwy.msg_db.rem(msg)
|
|
244
244
|
|
|
245
245
|
entities: list[_MessageDB] = []
|
|
246
246
|
if isinstance(msg.src, Device):
|
|
@@ -261,8 +261,8 @@ class _MessageDB(_Entity):
|
|
|
261
261
|
def _get_msg_by_hdr(self, hdr: HeaderT) -> Message | None:
|
|
262
262
|
"""Return a msg, if any, that matches a header."""
|
|
263
263
|
|
|
264
|
-
# if self._gwy.
|
|
265
|
-
# msgs = self._gwy.
|
|
264
|
+
# if self._gwy.msg_db: # central SQLite MessageIndex
|
|
265
|
+
# msgs = self._gwy.msg_db.get(hdr=hdr)
|
|
266
266
|
# return msgs[0] if msgs else None
|
|
267
267
|
|
|
268
268
|
msg: Message
|
|
@@ -394,19 +394,29 @@ class _MessageDB(_Entity):
|
|
|
394
394
|
|
|
395
395
|
@property
|
|
396
396
|
def _msgs(self) -> dict[Code, Message]:
|
|
397
|
-
|
|
397
|
+
"""
|
|
398
|
+
Get a flat Dict af all I/RP messages logged with this device as src or dst.
|
|
399
|
+
|
|
400
|
+
:return: nested Dict of messages by Code
|
|
401
|
+
"""
|
|
402
|
+
if not self._gwy.msg_db: # no central SQLite MessageIndex
|
|
398
403
|
return self._msgs_
|
|
399
404
|
|
|
400
405
|
sql = """
|
|
401
406
|
SELECT dtm from messages WHERE verb in (' I', 'RP') AND (src = ? OR dst = ?)
|
|
402
407
|
"""
|
|
403
|
-
return { # ? use context instead?
|
|
404
|
-
m.code: m for m in self._gwy.
|
|
408
|
+
return { # ? use ctx (context) instead of just the address?
|
|
409
|
+
m.code: m for m in self._gwy.msg_db.qry(sql, (self.id[:9], self.id[:9]))
|
|
405
410
|
} # e.g. 01:123456_HW
|
|
406
411
|
|
|
407
412
|
@property
|
|
408
413
|
def _msgz(self) -> dict[Code, dict[VerbT, dict[bool | str | None, Message]]]:
|
|
409
|
-
|
|
414
|
+
"""
|
|
415
|
+
Get a nested Dict of all I/RP messages logged with this device as src or dst.
|
|
416
|
+
|
|
417
|
+
:return: Dict of messages, nested by Code, Verb, Context
|
|
418
|
+
"""
|
|
419
|
+
if not self._gwy.msg_db: # no central SQLite MessageIndex
|
|
410
420
|
return self._msgz_
|
|
411
421
|
|
|
412
422
|
msgs_1: dict[Code, dict[VerbT, dict[bool | str | None, Message]]] = {}
|
|
@@ -437,7 +447,7 @@ class _Discovery(_MessageDB):
|
|
|
437
447
|
self._supported_cmds_ctx: dict[str, bool | None] = {}
|
|
438
448
|
|
|
439
449
|
if not gwy.config.disable_discovery:
|
|
440
|
-
# self._start_discovery_poller() # Can't use derived classes
|
|
450
|
+
# self._start_discovery_poller() # Can't use derived classes don't exist yet
|
|
441
451
|
gwy._loop.call_soon(self._start_discovery_poller)
|
|
442
452
|
|
|
443
453
|
@property # TODO: needs tidy up
|
|
@@ -464,7 +474,7 @@ class _Discovery(_MessageDB):
|
|
|
464
474
|
def _to_data_id(msg_id: MsgId | str) -> OtDataId:
|
|
465
475
|
return int(msg_id, 16) # type: ignore[return-value]
|
|
466
476
|
|
|
467
|
-
def _to_msg_id(data_id: OtDataId | int) -> MsgId:
|
|
477
|
+
def _to_msg_id(data_id: OtDataId | int) -> MsgId: # not used
|
|
468
478
|
return f"{data_id:02X}" # type: ignore[return-value]
|
|
469
479
|
|
|
470
480
|
return {
|
|
@@ -639,7 +649,7 @@ class _Discovery(_MessageDB):
|
|
|
639
649
|
task[_SZ_NEXT_DUE] = msg.dtm + task[_SZ_INTERVAL]
|
|
640
650
|
|
|
641
651
|
if task[_SZ_NEXT_DUE] > dt_now:
|
|
642
|
-
continue # if (most recent) last_msg is
|
|
652
|
+
continue # if (most recent) last_msg is not yet due...
|
|
643
653
|
|
|
644
654
|
# since we may do I/O, check if the code|msg_id is deprecated
|
|
645
655
|
task[_SZ_NEXT_DUE] = dt_now + task[_SZ_INTERVAL] # might undeprecate later
|
|
@@ -733,25 +743,6 @@ class Parent(Entity): # A System, Zone, DhwZone or a UfhController
|
|
|
733
743
|
self.child_by_id: dict[str, Child] = {}
|
|
734
744
|
self.childs: list[Child] = []
|
|
735
745
|
|
|
736
|
-
# def _handle_msg(self, msg: Message) -> None:
|
|
737
|
-
# def eavesdrop_ufh_circuits():
|
|
738
|
-
# if msg.code == Code._22C9:
|
|
739
|
-
# # .I --- 02:044446 --:------ 02:044446 22C9 024 00-076C0A28-01 01-06720A28-01 02-06A40A28-01 03-06A40A2-801 # NOTE: fragments
|
|
740
|
-
# # .I --- 02:044446 --:------ 02:044446 22C9 006 04-07D00A28-01 # [{'ufh_idx': '04',...
|
|
741
|
-
# circuit_idxs = [c[SZ_UFH_IDX] for c in msg.payload]
|
|
742
|
-
|
|
743
|
-
# for cct_idx in circuit_idxs:
|
|
744
|
-
# self.get_circuit(cct_idx, msg=msg)
|
|
745
|
-
|
|
746
|
-
# # BUG: this will fail with > 4 circuits, as uses two pkts for this msg
|
|
747
|
-
# # if [c for c in self.child_by_id if c not in circuit_idxs]:
|
|
748
|
-
# # raise CorruptStateError
|
|
749
|
-
|
|
750
|
-
# super()._handle_msg(msg)
|
|
751
|
-
|
|
752
|
-
# if self._gwy.config.enable_eavesdrop:
|
|
753
|
-
# eavesdrop_ufh_circuits()
|
|
754
|
-
|
|
755
746
|
@property
|
|
756
747
|
def zone_idx(self) -> str:
|
|
757
748
|
"""Return the domain id.
|
|
@@ -129,7 +129,7 @@ class Gateway(Engine):
|
|
|
129
129
|
self.devices: list[Device] = []
|
|
130
130
|
self.device_by_id: dict[DeviceIdT, Device] = {}
|
|
131
131
|
|
|
132
|
-
self.
|
|
132
|
+
self.msg_db: MessageIndex | None = None # MessageIndex()
|
|
133
133
|
|
|
134
134
|
def __repr__(self) -> str:
|
|
135
135
|
if not self.ser_name:
|
|
@@ -196,8 +196,8 @@ class Gateway(Engine):
|
|
|
196
196
|
async def stop(self) -> None:
|
|
197
197
|
"""Stop the Gateway and tidy up."""
|
|
198
198
|
|
|
199
|
-
if self.
|
|
200
|
-
self.
|
|
199
|
+
if self.msg_db:
|
|
200
|
+
self.msg_db.stop()
|
|
201
201
|
await super().stop()
|
|
202
202
|
|
|
203
203
|
def _pause(self, *args: Any) -> None:
|
|
@@ -255,10 +255,10 @@ class Gateway(Engine):
|
|
|
255
255
|
msgs.extend([m for z in system.zones for m in z._msgs.values()])
|
|
256
256
|
# msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO
|
|
257
257
|
|
|
258
|
-
if self.
|
|
258
|
+
if self.msg_db:
|
|
259
259
|
pkts = {
|
|
260
260
|
f"{repr(msg._pkt)[:26]}": f"{repr(msg._pkt)[27:]}"
|
|
261
|
-
for msg in self.
|
|
261
|
+
for msg in self.msg_db.all(include_expired=True)
|
|
262
262
|
if wanted_msg(msg, include_expired=include_expired)
|
|
263
263
|
}
|
|
264
264
|
|
|
@@ -405,7 +405,7 @@ class Gateway(Engine):
|
|
|
405
405
|
_LOGGER.warning(f"The device is not fakeable: {dev}")
|
|
406
406
|
|
|
407
407
|
# TODO: the exact order of the following may need refining...
|
|
408
|
-
# TODO: some will be done
|
|
408
|
+
# TODO: some will be done by devices themselves?
|
|
409
409
|
|
|
410
410
|
# if schema: # Step 2: Only controllers have a schema...
|
|
411
411
|
# dev._update_schema(**schema) # TODO: schema/traits
|
|
@@ -422,7 +422,7 @@ class Gateway(Engine):
|
|
|
422
422
|
self,
|
|
423
423
|
device_id: DeviceIdT,
|
|
424
424
|
create_device: bool = False,
|
|
425
|
-
) -> Device:
|
|
425
|
+
) -> Device | Fakeable:
|
|
426
426
|
"""Create a faked device."""
|
|
427
427
|
|
|
428
428
|
if not is_valid_dev_id(device_id):
|
|
@@ -437,7 +437,7 @@ class Gateway(Engine):
|
|
|
437
437
|
dev._make_fake()
|
|
438
438
|
return dev
|
|
439
439
|
|
|
440
|
-
raise TypeError(f"The device is not
|
|
440
|
+
raise TypeError(f"The device is not fakeable: {device_id}")
|
|
441
441
|
|
|
442
442
|
@property
|
|
443
443
|
def tcs(self) -> Evohome | None:
|
|
@@ -547,14 +547,6 @@ class Gateway(Engine):
|
|
|
547
547
|
|
|
548
548
|
def _msg_handler(self, msg: Message) -> None:
|
|
549
549
|
"""A callback to handle messages from the protocol stack."""
|
|
550
|
-
# TODO: Remove this
|
|
551
|
-
# # HACK: if CLI, double-logging with client.py proc_msg() & setLevel(DEBUG)
|
|
552
|
-
# if (log_level := _LOGGER.getEffectiveLevel()) < logging.INFO:
|
|
553
|
-
# _LOGGER.info(msg)
|
|
554
|
-
# elif log_level <= logging.INFO and not (
|
|
555
|
-
# msg.verb == RQ and msg.src.type == DEV_TYPE_MAP.HGI
|
|
556
|
-
# ):
|
|
557
|
-
# _LOGGER.info(msg)
|
|
558
550
|
|
|
559
551
|
super()._msg_handler(msg)
|
|
560
552
|
|
|
@@ -699,8 +699,10 @@ class Zone(ZoneSchedule):
|
|
|
699
699
|
def name(self) -> str | None: # 0004
|
|
700
700
|
"""Return the name of the zone."""
|
|
701
701
|
|
|
702
|
-
if self._gwy.
|
|
703
|
-
msgs = self._gwy.
|
|
702
|
+
if self._gwy.msg_db:
|
|
703
|
+
msgs = self._gwy.msg_db.get(
|
|
704
|
+
code=Code._0004, src=self._z_id, ctx=self._z_idx
|
|
705
|
+
)
|
|
704
706
|
return msgs[0].payload.get(SZ_NAME) if msgs else None
|
|
705
707
|
|
|
706
708
|
return self._msg_value(Code._0004, key=SZ_NAME) # type: ignore[no-any-return]
|
|
@@ -138,7 +138,7 @@ if TYPE_CHECKING:
|
|
|
138
138
|
async def set_pkt_logging_config(**config: Any) -> Logger:
|
|
139
139
|
"""
|
|
140
140
|
Set up ramses packet logging to a file or port.
|
|
141
|
-
Must
|
|
141
|
+
Must run async in executor to prevent HA blocking call opening packet log file (issue #200)
|
|
142
142
|
|
|
143
143
|
:param config: if file_name is included, opens packet_log file
|
|
144
144
|
:return: a logging.Logger
|
|
@@ -45,7 +45,7 @@ class Address:
|
|
|
45
45
|
# device_id = NON_DEVICE_ID
|
|
46
46
|
|
|
47
47
|
self.id = device_id # TODO: check is a valid id...
|
|
48
|
-
self.type = device_id[:2] # dex,
|
|
48
|
+
self.type = device_id[:2] # dex, drops 2nd part, incl. ":"
|
|
49
49
|
self._hex_id: str = None # type: ignore[assignment]
|
|
50
50
|
|
|
51
51
|
if not self.is_valid(device_id):
|