ramses-rf 0.53.1__tar.gz → 0.53.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/PKG-INFO +1 -1
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/binding_process.md +2 -1
- ramses_rf-0.53.2/docs/source/modules.rst +97 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.rst +14 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/version.py +1 -1
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/version.py +1 -1
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements_docs.txt +1 -1
- ramses_rf-0.53.2/tests/tests_rf/test_virtual_rf.py +153 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/__init__.py +47 -29
- ramses_rf-0.53.2/tests/tests_rf/virtual_rf/const.py +114 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/virtual_rf.py +217 -199
- ramses_rf-0.53.1/docs/source/modules.rst +0 -9
- ramses_rf-0.53.1/tests/tests_rf/virtual_rf/const.py +0 -91
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/dependabot.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-cov.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-lint.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-test.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-type.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/publish-hatch.yml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.gitignore +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.pre-commit-config.yaml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/LICENSE +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/README-developers.md +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/README.md +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/client.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/Makefile +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/make.bat +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/_static/CC-BY-NC-SA-4.0.txt +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/_static/ramses_rf_logo.png +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/conf.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/glossary.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/index.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_cli.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.device.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.system.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_tx.rst +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/usage.md +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/2411_parser.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/fingerprints.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ser2net.yaml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ti_3410/notes.sh +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ti_3410/ti_3410.fw +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/pyproject.toml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/client.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/debug.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/discovery.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/py.typed +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/utils/cat_slow.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/utils/convert.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/binding_fsm.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/const.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/database.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/base.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/heat.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/hvac.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/dispatcher.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/entity_base.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/exceptions.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/gateway.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/py.typed +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/schemas.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/faultlog.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/heat.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/schedule.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/zones.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/address.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/command.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/const.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/exceptions.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/fingerprints.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/frame.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/gateway.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/logger.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/message.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/opentherm.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/packet.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/parsers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/protocol.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/protocol_fsm.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/py.typed +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/ramses.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/schemas.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/transport.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/typed_dicts.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/typing.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements.txt +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements_dev.txt +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_apis_mock.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_mock_faultlog.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_mock_schedule.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_packets_bad.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_performance_WIP.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_state_mgt.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/common.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/command.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/const.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/device_heat.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/transport.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/test_HA_MQTT/test_transport_callback.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/trv_ctl.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_02.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_04.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_10.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_13.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_22.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/_gather.sh +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/20.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logger/packet_in.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logger/packet_out.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/pkts_bad_000.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/pkts_tba_000.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/system_cache.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0001_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0002.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0004_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0005.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0006.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0008.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0009.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000a.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000c.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000e.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_01ff_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0418.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_042f.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1030.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1060.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_10d0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_10e0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1260.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1298.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_12a0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_12c0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1300.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1f09.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1fc9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1fd4.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2210.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22c9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22d0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22d9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e0.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e5.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f1.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f2.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f3.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f4.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f7.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2309.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2349.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2411_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2e04.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2e10_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_30c9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3110_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3120.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_313e_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3150.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_31d9.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_31da.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3200.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3210.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3220.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3222.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3ef0_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3ef1_wip.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e01.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e02.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e04.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e15.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/_sched_002/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/_sched_002/schedule.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_001/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_001/schedule.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_dhw/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_000.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_000.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_001.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_001.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_002.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_002.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_010.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_010.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_011.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_011.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_012.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_012.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_013.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_013.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_014.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_014.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_300.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_300.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_301.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_301.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_302.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_302.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_303.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_303.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_304.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_304.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_310.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_310.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/config.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/config.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/schema.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_simple/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_simple/schema.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_00/config.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/config.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_api_faultlog.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_api_schedule.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_binding.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_common.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_heat.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_hvac.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_cli_transport_factory.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_devices.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_eavesdrop_dev_class.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_eavesdrop_schema.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_parser_helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_parsers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_ramses_schema.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_schema_bits.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_schemas.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_systems.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_vol_schemas.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_cli_utility.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_client.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_debug.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_discovery.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/configs/config_heat.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/configs/config_hvac.json +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/conftest.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/device/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/device/test_hvac_ventilator.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_api_faultlog.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_api_schedule.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_binding_fsm.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_create_stack.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_database.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_dispatcher.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_entity_base.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_hgi_behaviors.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_protocol_fsm.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_use_regex.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_virt_network.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/helpers.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/__init__.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/test_command.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/test_const.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
- {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/test_wip_cli.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ramses_rf
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.2
|
|
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
|
|
@@ -7,7 +7,8 @@ This diagram shows the binding finite state machine (FSM) for RAMSES RF devices,
|
|
|
7
7
|
|
|
8
8
|
```mermaid
|
|
9
9
|
stateDiagram-v2
|
|
10
|
-
direction
|
|
10
|
+
direction TB
|
|
11
|
+
|
|
11
12
|
[*] --> DevIsNotBinding
|
|
12
13
|
DevIsNotBinding --> InitiateBindingProcess : initiate_binding_process()
|
|
13
14
|
InitiateBindingProcess --> SuppSendOfferWaitForAccept
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
ramses_rf/src/
|
|
2
|
+
==============
|
|
3
|
+
|
|
4
|
+
.. mermaid::
|
|
5
|
+
|
|
6
|
+
classDiagram
|
|
7
|
+
direction RL
|
|
8
|
+
|
|
9
|
+
namespace ramses_rf-dispatcher{
|
|
10
|
+
class Dispatcher{
|
|
11
|
+
+ create_device()
|
|
12
|
+
+ ..
|
|
13
|
+
+ process_msg()
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
namespace ramses_rf-database{
|
|
17
|
+
class Database {
|
|
18
|
+
- add(msg)
|
|
19
|
+
- ..
|
|
20
|
+
- qry(msg)
|
|
21
|
+
- ..
|
|
22
|
+
- rem(msg)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
namespace ramses_rf-device{
|
|
26
|
+
class heat
|
|
27
|
+
class hvac
|
|
28
|
+
}
|
|
29
|
+
namespace ramses_rf-gateway{
|
|
30
|
+
class hgi
|
|
31
|
+
}
|
|
32
|
+
namespace ramses_tx-message{
|
|
33
|
+
class Message {
|
|
34
|
+
- parse_message()
|
|
35
|
+
- ..
|
|
36
|
+
- parse_payload()
|
|
37
|
+
- ..
|
|
38
|
+
- validate_msg()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
namespace ramses_tx-command{
|
|
42
|
+
class Command{
|
|
43
|
+
- _from_attrs
|
|
44
|
+
- ..
|
|
45
|
+
- set_zone_config
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
namespace ramses_tx-gateway-engine{
|
|
49
|
+
class Engine {
|
|
50
|
+
- add_msg_handler()
|
|
51
|
+
- ..
|
|
52
|
+
- create_cmd()
|
|
53
|
+
- ..
|
|
54
|
+
- async_send_cmd()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
namespace ramses_tx-transport{
|
|
58
|
+
class Transport {
|
|
59
|
+
- MqttTransport
|
|
60
|
+
- ..
|
|
61
|
+
- PortTransport
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
namespace ramses_ESP{
|
|
65
|
+
class RF:::esp
|
|
66
|
+
class Serial:::esp
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Transport <|--|> Serial
|
|
70
|
+
Transport <|--|> RF
|
|
71
|
+
Transport <|--|> Engine
|
|
72
|
+
Engine <|--|> hgi
|
|
73
|
+
Database <|--|> hgi
|
|
74
|
+
Message <|--|> hgi
|
|
75
|
+
heat <|--|> hgi
|
|
76
|
+
hvac <|--|> hgi
|
|
77
|
+
Dispatcher <|--|> hvac
|
|
78
|
+
Dispatcher <|--|> heat
|
|
79
|
+
Dispatcher <|--|> Message
|
|
80
|
+
|
|
81
|
+
click Transport href "ramses_tx.html#module-ramses_tx.transport" "docs"
|
|
82
|
+
click Engine href "ramses_tx.html#module-ramses_tx.gateway" "docs"
|
|
83
|
+
click hgi href "ramses_rf.html#module-ramses_rf.gateway" "docs"
|
|
84
|
+
click Database href "ramses_rf.html#module-ramses_rf.database" "docs"
|
|
85
|
+
click Message href "ramses_tx.html#module-ramses_tx.message" "docs"
|
|
86
|
+
click heat href "ramses_rf.device.html#module-ramses_rf.device.heat" "docs"
|
|
87
|
+
click hvac href "ramses_rf.device.html#module-ramses_rf.device.hvac" "docs"
|
|
88
|
+
click Dispatcher href "ramses_rf.html#module-ramses_rf.dispatcher" "docs"
|
|
89
|
+
click Command href "ramses_tx.html#module-ramses_tx.command" "docs"
|
|
90
|
+
|
|
91
|
+
.. toctree::
|
|
92
|
+
:maxdepth: 2
|
|
93
|
+
:caption: Contents:
|
|
94
|
+
|
|
95
|
+
ramses_cli
|
|
96
|
+
ramses_rf
|
|
97
|
+
ramses_tx
|
|
@@ -32,6 +32,20 @@ ramses\_rf.const module
|
|
|
32
32
|
ramses\_rf.database module
|
|
33
33
|
--------------------------
|
|
34
34
|
|
|
35
|
+
.. mermaid::
|
|
36
|
+
erDiagram
|
|
37
|
+
msg_db ||--o{ device : query
|
|
38
|
+
|
|
39
|
+
msg_db {
|
|
40
|
+
TEXT(26)* dtm
|
|
41
|
+
TEXT(2) verb
|
|
42
|
+
TEXT(9) src
|
|
43
|
+
TEXT(9) dst
|
|
44
|
+
TEXT(4) code
|
|
45
|
+
TEXT() ctx
|
|
46
|
+
TEXT() hdr
|
|
47
|
+
}
|
|
48
|
+
|
|
35
49
|
.. automodule:: ramses_rf.database
|
|
36
50
|
:members:
|
|
37
51
|
:show-inheritance:
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Combined Unit tests for the VirtualRf harness.
|
|
4
|
+
|
|
5
|
+
Verifies PTY handling, I/O safety, and hardware gateway emulation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
from collections.abc import AsyncGenerator
|
|
10
|
+
from typing import Final
|
|
11
|
+
from unittest.mock import MagicMock, patch
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from .virtual_rf import virtual_rf as vrf_mod
|
|
16
|
+
from .virtual_rf.const import SCHEMA_3, HgiFwTypes
|
|
17
|
+
from .virtual_rf.virtual_rf import VirtualRf
|
|
18
|
+
|
|
19
|
+
# Constants
|
|
20
|
+
TEST_DATA: Final[bytes] = b"Hello World\r\n"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture
|
|
24
|
+
async def virtual_rf() -> AsyncGenerator[VirtualRf, None]:
|
|
25
|
+
"""
|
|
26
|
+
Fixture to provide a VirtualRf instance using the Async Context Manager.
|
|
27
|
+
|
|
28
|
+
:yield: An initialized VirtualRf instance.
|
|
29
|
+
"""
|
|
30
|
+
# Using 'async with' ensures __aenter__ and __aexit__ are tested
|
|
31
|
+
async with VirtualRf(num_ports=3) as vrf:
|
|
32
|
+
yield vrf
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.mark.asyncio
|
|
36
|
+
async def test_virtual_rf_lifecycle() -> None:
|
|
37
|
+
"""
|
|
38
|
+
Test the start and stop lifecycle via the Async Context Manager.
|
|
39
|
+
"""
|
|
40
|
+
# Test that __aenter__ and __aexit__ handle resources correctly
|
|
41
|
+
async with VirtualRf(num_ports=2) as vrf:
|
|
42
|
+
assert len(vrf.ports) == 2
|
|
43
|
+
assert len(vrf._master_to_port) == 2
|
|
44
|
+
|
|
45
|
+
# Verify cleanup occurred after context exit
|
|
46
|
+
assert len(vrf._master_to_port) == 0
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.mark.asyncio
|
|
50
|
+
async def test_broadcast_data(virtual_rf: VirtualRf) -> None:
|
|
51
|
+
"""
|
|
52
|
+
Test that data written to one PTY is broadcast to others.
|
|
53
|
+
"""
|
|
54
|
+
port_0 = virtual_rf.ports[0]
|
|
55
|
+
port_1 = virtual_rf.ports[1]
|
|
56
|
+
fd_0_master = virtual_rf._port_to_master[port_0]
|
|
57
|
+
|
|
58
|
+
mock_file_io = MagicMock()
|
|
59
|
+
original_io = virtual_rf._port_to_object[port_1]
|
|
60
|
+
virtual_rf._port_to_object[port_1] = mock_file_io
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
with patch.object(
|
|
64
|
+
virtual_rf._port_to_object[port_0], "read", return_value=TEST_DATA
|
|
65
|
+
):
|
|
66
|
+
virtual_rf._handle_data_ready(fd_0_master)
|
|
67
|
+
|
|
68
|
+
# Note: Broadcaster adds RSSI '000 ' if not a control frame
|
|
69
|
+
mock_file_io.write.assert_called_with(b"000 " + TEST_DATA)
|
|
70
|
+
|
|
71
|
+
finally:
|
|
72
|
+
virtual_rf._port_to_object[port_1] = original_io
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@pytest.mark.asyncio
|
|
76
|
+
async def test_blocking_io_handling(virtual_rf: VirtualRf) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Test handling of BlockingIOError during broadcast write.
|
|
79
|
+
"""
|
|
80
|
+
port_0 = virtual_rf.ports[0]
|
|
81
|
+
port_1 = virtual_rf.ports[1]
|
|
82
|
+
fd_0_master = virtual_rf._port_to_master[port_0]
|
|
83
|
+
|
|
84
|
+
mock_file_io = MagicMock()
|
|
85
|
+
mock_file_io.write.side_effect = BlockingIOError
|
|
86
|
+
original_io = virtual_rf._port_to_object[port_1]
|
|
87
|
+
virtual_rf._port_to_object[port_1] = mock_file_io
|
|
88
|
+
|
|
89
|
+
with patch.object(vrf_mod._LOGGER, "warning") as mock_log:
|
|
90
|
+
with patch.object(
|
|
91
|
+
virtual_rf._port_to_object[port_0], "read", return_value=TEST_DATA
|
|
92
|
+
):
|
|
93
|
+
virtual_rf._handle_data_ready(fd_0_master)
|
|
94
|
+
|
|
95
|
+
mock_log.assert_called_with(f"Buffer full writing to {port_1}, dropping packet")
|
|
96
|
+
|
|
97
|
+
virtual_rf._port_to_object[port_1] = original_io
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@pytest.mark.asyncio
|
|
101
|
+
async def test_gateway_emulation(virtual_rf: VirtualRf) -> None:
|
|
102
|
+
"""
|
|
103
|
+
Test hardware-specific emulation logic for different firmware types.
|
|
104
|
+
"""
|
|
105
|
+
# Setup different gateway profiles
|
|
106
|
+
virtual_rf.set_gateway(virtual_rf.ports[0], "18:111111", HgiFwTypes.EVOFW3)
|
|
107
|
+
virtual_rf.set_gateway(virtual_rf.ports[1], "18:222222", HgiFwTypes.EVOFW3_FTDI)
|
|
108
|
+
virtual_rf.set_gateway(virtual_rf.ports[2], "18:333333", HgiFwTypes.HGI_80)
|
|
109
|
+
|
|
110
|
+
# Test !V (Version) response for EVOFW3
|
|
111
|
+
for i in range(2):
|
|
112
|
+
port = virtual_rf.ports[i]
|
|
113
|
+
response = virtual_rf._proc_after_rx(port, b"!V")
|
|
114
|
+
assert response == b"# evofw3 0.7.1\r\n"
|
|
115
|
+
|
|
116
|
+
# Test HGI80 correctly ignores !V
|
|
117
|
+
hgi_port = virtual_rf.ports[2]
|
|
118
|
+
assert virtual_rf._proc_after_rx(hgi_port, b"!V") is None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@pytest.mark.asyncio
|
|
122
|
+
async def test_schema_3_integration(virtual_rf: VirtualRf) -> None:
|
|
123
|
+
"""
|
|
124
|
+
Verify that SCHEMA_3 (HVAC/Generic) initializes without errors.
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
# Test that the gateway from SCHEMA_3 can be attached
|
|
128
|
+
gwy_id = list(SCHEMA_3["known_list"].keys())[0] # 18:333333
|
|
129
|
+
|
|
130
|
+
# This should not raise LookupError or TypeError
|
|
131
|
+
virtual_rf.set_gateway(virtual_rf.ports[0], gwy_id)
|
|
132
|
+
|
|
133
|
+
assert virtual_rf.gateways[gwy_id] == virtual_rf.ports[0]
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@pytest.mark.asyncio
|
|
137
|
+
async def test_rapid_cycling_stress_test() -> None:
|
|
138
|
+
"""
|
|
139
|
+
Stress test: Rapidly start and stop the VirtualRf environment.
|
|
140
|
+
|
|
141
|
+
This ensures that:
|
|
142
|
+
1. File descriptors are not leaking.
|
|
143
|
+
2. Event loop readers are cleanly removed (no 'File descriptor bad' errors).
|
|
144
|
+
3. No race conditions occur during fast teardown/setup cycles.
|
|
145
|
+
"""
|
|
146
|
+
for _ in range(50):
|
|
147
|
+
async with VirtualRf(num_ports=2) as vrf:
|
|
148
|
+
# Verify ports allow basic IO immediately
|
|
149
|
+
assert len(vrf.ports) == 2
|
|
150
|
+
# Minimal sleep to let the loop turn once
|
|
151
|
+
await asyncio.sleep(0)
|
|
152
|
+
# Give the loop one final turn to settle the FDs from the context manager
|
|
153
|
+
await asyncio.sleep(0)
|
|
@@ -6,10 +6,9 @@ from unittest.mock import patch
|
|
|
6
6
|
|
|
7
7
|
from ramses_rf import Gateway
|
|
8
8
|
from ramses_rf.const import DEV_TYPE_MAP, DevType
|
|
9
|
-
from ramses_rf.database import MessageIndex
|
|
10
9
|
from ramses_rf.schemas import SZ_CLASS, SZ_KNOWN_LIST
|
|
11
10
|
|
|
12
|
-
from .const import HgiFwTypes
|
|
11
|
+
from .const import MAX_NUM_PORTS, HgiFwTypes
|
|
13
12
|
from .virtual_rf import VirtualRf
|
|
14
13
|
|
|
15
14
|
__all__ = ["HgiFwTypes", "VirtualRf", "rf_factory"]
|
|
@@ -38,34 +37,55 @@ def _get_hgi_id_for_schema(
|
|
|
38
37
|
|
|
39
38
|
Does not modify the schema.
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
Checks that only one Gateway is defined and ensures all 18: type devices
|
|
41
|
+
have an explicit HGI class defined.
|
|
42
|
+
|
|
43
|
+
If a Gateway (18:) device is present in the schema, it must have a defined class
|
|
44
|
+
of "HGI". If it does, its device_id is returned, along with its FW type (if
|
|
45
|
+
specified, or EVOFW3 is assumed).
|
|
46
|
+
|
|
47
|
+
If no Gateway device is present, one is created (18:000000), and its
|
|
48
|
+
details returned.
|
|
49
|
+
|
|
50
|
+
:param schema: The configuration schema.
|
|
51
|
+
:param port_idx: Index used to construct a default ID if none found.
|
|
52
|
+
:raises TypeError: If multiple gateways exist or an HGI device lacks a class.
|
|
53
|
+
:return: A tuple of (device_id, firmware_type).
|
|
44
54
|
"""
|
|
45
55
|
|
|
46
56
|
known_list: dict[str, Any] = schema.get(SZ_KNOWN_LIST, {})
|
|
47
57
|
|
|
48
|
-
|
|
58
|
+
# 1. Collect HGI IDs for validation
|
|
59
|
+
hgi_ids = [
|
|
60
|
+
device_id
|
|
61
|
+
for device_id, v in known_list.items()
|
|
62
|
+
if v.get(SZ_CLASS) == DevType.HGI
|
|
63
|
+
]
|
|
49
64
|
|
|
65
|
+
# 2. Validation: Multiple Gateways
|
|
50
66
|
if len(hgi_ids) > 1:
|
|
51
67
|
raise TypeError("Multiple Gateways per schema are not supported")
|
|
52
68
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
fw_type = known_list[hgi_id].get("_type", "EVOFW3")
|
|
56
|
-
|
|
57
|
-
elif [
|
|
69
|
+
# 3. Validation: Orphaned 18: devices (Gateways without a class)
|
|
70
|
+
if any(
|
|
58
71
|
k
|
|
59
72
|
for k, v in known_list.items()
|
|
60
|
-
if k[
|
|
61
|
-
|
|
62
|
-
raise TypeError("Any Gateway must have its class defined explicitly")
|
|
73
|
+
if k.startswith(DEV_TYPE_MAP[DevType.HGI]) and not v.get(SZ_CLASS)
|
|
74
|
+
):
|
|
75
|
+
raise TypeError("Any Gateway (18:) must have its class defined explicitly")
|
|
63
76
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
# 4. Logic: Return existing
|
|
78
|
+
if len(hgi_ids) == 1:
|
|
79
|
+
hgi_id = hgi_ids[0]
|
|
80
|
+
fw_type_name = known_list[hgi_id].get("fw_version", HgiFwTypes.EVOFW3.name)
|
|
81
|
+
return hgi_id, HgiFwTypes[fw_type_name]
|
|
67
82
|
|
|
68
|
-
|
|
83
|
+
# 5. Logic: Create default if none present (18:000000 for idx 0, 18:111111 for idx 1)
|
|
84
|
+
if port_idx == 0:
|
|
85
|
+
return GWY_ID_0, HgiFwTypes.EVOFW3
|
|
86
|
+
if port_idx == 1:
|
|
87
|
+
return GWY_ID_1, HgiFwTypes.EVOFW3
|
|
88
|
+
return f"18:{port_idx:06d}", HgiFwTypes.EVOFW3
|
|
69
89
|
|
|
70
90
|
|
|
71
91
|
@patch("ramses_tx.transport.MIN_INTER_WRITE_GAP", MIN_INTER_WRITE_GAP)
|
|
@@ -79,10 +99,8 @@ async def rf_factory(
|
|
|
79
99
|
virtual RF pool.
|
|
80
100
|
"""
|
|
81
101
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if len(schemas) > MAX_PORTS:
|
|
85
|
-
raise TypeError(f"Only a maximum of {MAX_PORTS} ports is supported")
|
|
102
|
+
if len(schemas) > MAX_NUM_PORTS:
|
|
103
|
+
raise TypeError(f"Only a maximum of {MAX_NUM_PORTS} ports is supported")
|
|
86
104
|
|
|
87
105
|
gwys = []
|
|
88
106
|
|
|
@@ -96,16 +114,16 @@ async def rf_factory(
|
|
|
96
114
|
hgi_id, fw_type = _get_hgi_id_for_schema(schema, idx)
|
|
97
115
|
|
|
98
116
|
# rf._create_port(idx) # REMOVED: Redundant and causes race condition
|
|
99
|
-
rf.set_gateway(rf.ports[idx], hgi_id, fw_type=
|
|
117
|
+
rf.set_gateway(rf.ports[idx], hgi_id, fw_type=fw_type)
|
|
100
118
|
|
|
101
119
|
with patch("ramses_tx.transport.comports", rf.comports):
|
|
102
120
|
gwy = Gateway(rf.ports[idx], **schema)
|
|
103
|
-
|
|
121
|
+
# gwy._engine.ptcl.qos.disable_qos = False # Hack for testing
|
|
104
122
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
gwy.
|
|
108
|
-
|
|
109
|
-
|
|
123
|
+
if start_gwys:
|
|
124
|
+
await gwy.start()
|
|
125
|
+
gwy.get_device(hgi_id)
|
|
126
|
+
|
|
127
|
+
gwys.append(gwy)
|
|
110
128
|
|
|
111
129
|
return rf, gwys
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Constants and type definitions for the virtual RF network.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Any, Final, NamedTuple
|
|
8
|
+
|
|
9
|
+
# Shared Constants
|
|
10
|
+
MAX_NUM_PORTS: Final = 6
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class HardwareProfile(NamedTuple):
|
|
14
|
+
"""
|
|
15
|
+
Metadata for a specific hardware gateway profile.
|
|
16
|
+
|
|
17
|
+
:param manufacturer: USB manufacturer name.
|
|
18
|
+
:param product: USB product name string.
|
|
19
|
+
:param vid: Vendor ID (e.g., 0x10AC).
|
|
20
|
+
:param pid: Product ID (e.g., 0x0102).
|
|
21
|
+
:param description: Human-readable device description.
|
|
22
|
+
:param serial_number: Unique hardware serial, if any.
|
|
23
|
+
:param interface: Specific interface name.
|
|
24
|
+
:param subsystem: The system subsystem (e.g., 'usb').
|
|
25
|
+
:param dev_path: Default system device path.
|
|
26
|
+
:param dev_by_id: The persistent 'by-id' system path.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
manufacturer: str
|
|
30
|
+
product: str
|
|
31
|
+
vid: int
|
|
32
|
+
pid: int
|
|
33
|
+
#
|
|
34
|
+
description: str
|
|
35
|
+
serial_number: str | None
|
|
36
|
+
interface: str | None
|
|
37
|
+
#
|
|
38
|
+
subsystem: str
|
|
39
|
+
dev_path: str
|
|
40
|
+
dev_by_id: str
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class HgiFwTypes(Enum):
|
|
44
|
+
"""
|
|
45
|
+
Supported firmware/hardware combinations for gateway emulation.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
EVOFW3 = HardwareProfile( # 8/16 MHz atmega32u4 (HW Uart)
|
|
49
|
+
manufacturer="SparkFun",
|
|
50
|
+
product="evofw3 atmega32u4",
|
|
51
|
+
vid=0x1B4F, # aka SparkFun Electronics
|
|
52
|
+
pid=0x9206,
|
|
53
|
+
#
|
|
54
|
+
description="evofw3 atmega32u4",
|
|
55
|
+
serial_number=None,
|
|
56
|
+
interface=None,
|
|
57
|
+
#
|
|
58
|
+
subsystem="usb-serial",
|
|
59
|
+
dev_path="/dev/ttyACM0", # is not a fixed value
|
|
60
|
+
dev_by_id="/dev/serial/by-id/usb-SparkFun_evofw3_atmega32u4-if00",
|
|
61
|
+
)
|
|
62
|
+
"""Standard SparkFun hardware (Atmega32u4), values are from real devices."""
|
|
63
|
+
|
|
64
|
+
EVOFW3_FTDI = HardwareProfile( # 16MHZ atmega328 (SW Uart)
|
|
65
|
+
manufacturer="FTDI",
|
|
66
|
+
product="FT232R USB UART",
|
|
67
|
+
vid=0x0403, # aka Future Technology Devices International Ltd.
|
|
68
|
+
pid=0x6001,
|
|
69
|
+
description="FT232R USB UART - FT232R USB UART",
|
|
70
|
+
serial_number="A50285BI",
|
|
71
|
+
interface="FT232R USB UART",
|
|
72
|
+
subsystem="usb-serial",
|
|
73
|
+
dev_path="/dev/ttyUSB0", # is not a fixed value
|
|
74
|
+
dev_by_id="/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A50285BI-if00-port0",
|
|
75
|
+
)
|
|
76
|
+
"""Alternative hardware using an FTDI chip (Atmega328P), values are from real devices."""
|
|
77
|
+
|
|
78
|
+
HGI_80 = HardwareProfile( # Honeywell HGI80 (partially contrived)
|
|
79
|
+
manufacturer="Texas Instruments",
|
|
80
|
+
product="TUSB3410 Boot Device",
|
|
81
|
+
vid=0x10AC, # aka Honeywell, Inc.
|
|
82
|
+
pid=0x0102,
|
|
83
|
+
description="TUSB3410 Boot Device", # contrived
|
|
84
|
+
serial_number="TUSB3410",
|
|
85
|
+
interface=None, # assumed
|
|
86
|
+
subsystem="usb",
|
|
87
|
+
dev_path="/dev/ttyUSB0", # is not a fixed value
|
|
88
|
+
dev_by_id="/dev/serial/by-id/usb-Texas_Instruments_TUSB3410_Boot_Device_TUSB3410-if00-port0",
|
|
89
|
+
)
|
|
90
|
+
"""Original Honeywell HGI80 hardware, partially contrived values."""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Schema constants for testing
|
|
94
|
+
SCHEMA_1: Final[dict[str, Any]] = {
|
|
95
|
+
"orphans_hvac": ["41:111111"],
|
|
96
|
+
"known_list": {
|
|
97
|
+
"18:111111": {"class": "HGI", "fw_version": "EVOFW3"},
|
|
98
|
+
"41:111111": {"class": "REM"},
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
SCHEMA_2: Final[dict[str, Any]] = {
|
|
103
|
+
"orphans_hvac": ["42:222222"],
|
|
104
|
+
"known_list": {
|
|
105
|
+
"18:222222": {"class": "HGI", "fw_version": "HGI_80"},
|
|
106
|
+
"42:222222": {"class": "FAN"},
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
SCHEMA_3: Final[dict[str, Any]] = {
|
|
111
|
+
"orphans_hvac": ["42:333333"],
|
|
112
|
+
"known_list": {"18:333333": {"class": "HGI"}, "42:333333": {"class": "FAN"}},
|
|
113
|
+
}
|
|
114
|
+
"""Schema added for specific HVAC functionality testing."""
|