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.
Files changed (387) hide show
  1. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/PKG-INFO +1 -1
  2. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/binding_process.md +2 -1
  3. ramses_rf-0.53.2/docs/source/modules.rst +97 -0
  4. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.rst +14 -0
  5. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/version.py +1 -1
  6. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/version.py +1 -1
  7. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements_docs.txt +1 -1
  8. ramses_rf-0.53.2/tests/tests_rf/test_virtual_rf.py +153 -0
  9. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/__init__.py +47 -29
  10. ramses_rf-0.53.2/tests/tests_rf/virtual_rf/const.py +114 -0
  11. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/virtual_rf.py +217 -199
  12. ramses_rf-0.53.1/docs/source/modules.rst +0 -9
  13. ramses_rf-0.53.1/tests/tests_rf/virtual_rf/const.py +0 -91
  14. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/dependabot.yml +0 -0
  16. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-cov.yml +0 -0
  17. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-lint.yml +0 -0
  18. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-test.yml +0 -0
  19. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/check-type.yml +0 -0
  20. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.github/workflows/publish-hatch.yml +0 -0
  21. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.gitignore +0 -0
  22. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/.pre-commit-config.yaml +0 -0
  23. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/LICENSE +0 -0
  24. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/README-developers.md +0 -0
  25. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/README.md +0 -0
  26. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/client.py +0 -0
  27. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/Makefile +0 -0
  28. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/make.bat +0 -0
  29. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/_static/CC-BY-NC-SA-4.0.txt +0 -0
  30. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/_static/ramses_rf_logo.png +0 -0
  31. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/conf.py +0 -0
  32. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/glossary.rst +0 -0
  33. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/index.rst +0 -0
  34. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_cli.rst +0 -0
  35. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.device.rst +0 -0
  36. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_rf.system.rst +0 -0
  37. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/ramses_tx.rst +0 -0
  38. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/docs/source/usage.md +0 -0
  39. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/2411_parser.py +0 -0
  40. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/fingerprints.log +0 -0
  41. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ser2net.yaml +0 -0
  42. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ti_3410/notes.sh +0 -0
  43. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/misc/ti_3410/ti_3410.fw +0 -0
  44. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/pyproject.toml +0 -0
  45. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/__init__.py +0 -0
  46. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/client.py +0 -0
  47. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/debug.py +0 -0
  48. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/discovery.py +0 -0
  49. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/py.typed +0 -0
  50. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/utils/cat_slow.py +0 -0
  51. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_cli/utils/convert.py +0 -0
  52. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/__init__.py +0 -0
  53. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/binding_fsm.py +0 -0
  54. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/const.py +0 -0
  55. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/database.py +0 -0
  56. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/__init__.py +0 -0
  57. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/base.py +0 -0
  58. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/heat.py +0 -0
  59. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/device/hvac.py +0 -0
  60. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/dispatcher.py +0 -0
  61. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/entity_base.py +0 -0
  62. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/exceptions.py +0 -0
  63. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/gateway.py +0 -0
  64. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/helpers.py +0 -0
  65. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/py.typed +0 -0
  66. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/schemas.py +0 -0
  67. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/__init__.py +0 -0
  68. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/faultlog.py +0 -0
  69. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/heat.py +0 -0
  70. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/schedule.py +0 -0
  71. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_rf/system/zones.py +0 -0
  72. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/__init__.py +0 -0
  73. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/address.py +0 -0
  74. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/command.py +0 -0
  75. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/const.py +0 -0
  76. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/exceptions.py +0 -0
  77. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/fingerprints.py +0 -0
  78. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/frame.py +0 -0
  79. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/gateway.py +0 -0
  80. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/helpers.py +0 -0
  81. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/logger.py +0 -0
  82. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/message.py +0 -0
  83. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/opentherm.py +0 -0
  84. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/packet.py +0 -0
  85. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/parsers.py +0 -0
  86. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/protocol.py +0 -0
  87. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/protocol_fsm.py +0 -0
  88. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/py.typed +0 -0
  89. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/ramses.py +0 -0
  90. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/schemas.py +0 -0
  91. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/transport.py +0 -0
  92. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/typed_dicts.py +0 -0
  93. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/ramses_tx/typing.py +0 -0
  94. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements.txt +0 -0
  95. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/requirements/requirements_dev.txt +0 -0
  96. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_apis_mock.py +0 -0
  97. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_mock_faultlog.py +0 -0
  98. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_mock_schedule.py +0 -0
  99. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_packets_bad.py +0 -0
  100. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_performance_WIP.py +0 -0
  101. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/_test_state_mgt.py +0 -0
  102. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/common.py +0 -0
  103. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/__init__.py +0 -0
  104. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/command.py +0 -0
  105. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/const.py +0 -0
  106. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  107. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  108. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/deprecated/mocked_devices/transport.py +0 -0
  109. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/test_HA_MQTT/test_transport_callback.py +0 -0
  110. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/__init__.py +0 -0
  111. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  112. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  113. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  114. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  115. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  116. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  117. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  118. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  119. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  120. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  121. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  122. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  123. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  124. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  125. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  126. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  127. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
  128. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_02.log +0 -0
  129. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_04.log +0 -0
  130. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_10.log +0 -0
  131. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_13.log +0 -0
  132. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/devices/device_22.log +0 -0
  133. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  134. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  135. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  136. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  137. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  138. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  139. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  140. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  141. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  142. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  143. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  144. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  145. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  146. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  147. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  148. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  149. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  150. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  151. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  152. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  153. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  154. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  155. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  156. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  157. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  158. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  159. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  160. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  161. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  162. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  163. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  164. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  165. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  166. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  167. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/_gather.sh +0 -0
  168. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  169. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  170. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  171. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  172. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  173. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  174. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  175. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  176. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  177. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  178. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  179. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  180. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  181. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/20.log +0 -0
  182. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  183. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  184. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  185. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  186. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  187. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  188. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  189. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  190. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  191. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  192. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  193. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  194. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  195. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  196. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  197. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  198. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  199. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  200. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  201. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  202. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  203. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  204. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  205. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  206. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  207. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  208. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  209. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  210. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/helpers.py +0 -0
  211. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logger/packet_in.log +0 -0
  212. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logger/packet_out.log +0 -0
  213. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/pkts_bad_000.log +0 -0
  214. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/pkts_tba_000.log +0 -0
  215. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/logs/system_cache.json +0 -0
  216. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  217. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  218. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0001_wip.log +0 -0
  219. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0002.log +0 -0
  220. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0004_wip.log +0 -0
  221. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0005.log +0 -0
  222. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0006.log +0 -0
  223. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0008.log +0 -0
  224. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0009.log +0 -0
  225. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000a.log +0 -0
  226. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000c.log +0 -0
  227. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_000e.log +0 -0
  228. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_01ff_wip.log +0 -0
  229. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_0418.log +0 -0
  230. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_042f.log +0 -0
  231. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1030.log +0 -0
  232. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1060.log +0 -0
  233. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_10d0.log +0 -0
  234. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_10e0.log +0 -0
  235. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1260.log +0 -0
  236. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1298.log +0 -0
  237. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_12a0.log +0 -0
  238. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_12c0.log +0 -0
  239. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1300.log +0 -0
  240. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1f09.log +0 -0
  241. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1fc9.log +0 -0
  242. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_1fd4.log +0 -0
  243. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2210.log +0 -0
  244. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22c9.log +0 -0
  245. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22d0.log +0 -0
  246. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22d9.log +0 -0
  247. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e0.log +0 -0
  248. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e5.log +0 -0
  249. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22e9.log +0 -0
  250. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f1.log +0 -0
  251. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f2.log +0 -0
  252. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f3.log +0 -0
  253. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f4.log +0 -0
  254. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_22f7.log +0 -0
  255. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2309.log +0 -0
  256. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2349.log +0 -0
  257. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2411_wip.log +0 -0
  258. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2e04.log +0 -0
  259. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_2e10_wip.log +0 -0
  260. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_30c9.log +0 -0
  261. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3110_wip.log +0 -0
  262. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3120.log +0 -0
  263. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_313e_wip.log +0 -0
  264. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3150.log +0 -0
  265. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_31d9.log +0 -0
  266. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_31da.log +0 -0
  267. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3200.log +0 -0
  268. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3210.log +0 -0
  269. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3220.log +0 -0
  270. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3222.log +0 -0
  271. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  272. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  273. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e01.log +0 -0
  274. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e02.log +0 -0
  275. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e04.log +0 -0
  276. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/parsers/code_4e15.log +0 -0
  277. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/_sched_002/packet.log +0 -0
  278. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  279. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_001/packet.log +0 -0
  280. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_001/schedule.json +0 -0
  281. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  282. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  283. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  284. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  285. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  286. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  287. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  288. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  289. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  290. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_000.json +0 -0
  291. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_000.log +0 -0
  292. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_001.json +0 -0
  293. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_001.log +0 -0
  294. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_002.json +0 -0
  295. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_002.log +0 -0
  296. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_010.json +0 -0
  297. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_010.log +0 -0
  298. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_011.json +0 -0
  299. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_011.log +0 -0
  300. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_012.json +0 -0
  301. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_012.log +0 -0
  302. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_013.json +0 -0
  303. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_013.log +0 -0
  304. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_014.json +0 -0
  305. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_014.log +0 -0
  306. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_300.json +0 -0
  307. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_300.log +0 -0
  308. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_301.json +0 -0
  309. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_301.log +0 -0
  310. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_302.json +0 -0
  311. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_302.log +0 -0
  312. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_303.json +0 -0
  313. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_303.log +0 -0
  314. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_304.json +0 -0
  315. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_304.log +0 -0
  316. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_310.json +0 -0
  317. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/schemas/log_files/schema_310.log +0 -0
  318. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  319. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  320. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  321. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  322. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  323. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  324. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  325. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  326. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/config.json +0 -0
  327. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  328. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  329. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_simple/packet.log +0 -0
  330. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_simple/schema.json +0 -0
  331. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  332. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  333. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  334. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  335. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  336. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  337. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  338. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_api_faultlog.py +0 -0
  339. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_api_schedule.py +0 -0
  340. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_binding.py +0 -0
  341. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_common.py +0 -0
  342. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_heat.py +0 -0
  343. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_apis_hvac.py +0 -0
  344. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_cli_transport_factory.py +0 -0
  345. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_devices.py +0 -0
  346. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  347. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_eavesdrop_schema.py +0 -0
  348. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_helpers.py +0 -0
  349. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_parser_helpers.py +0 -0
  350. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_parsers.py +0 -0
  351. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_ramses_schema.py +0 -0
  352. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_schema_bits.py +0 -0
  353. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_schemas.py +0 -0
  354. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_systems.py +0 -0
  355. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests/test_vol_schemas.py +0 -0
  356. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_cli_utility.py +0 -0
  357. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_client.py +0 -0
  358. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_debug.py +0 -0
  359. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_cli/test_discovery.py +0 -0
  360. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/__init__.py +0 -0
  361. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/configs/config_heat.json +0 -0
  362. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/configs/config_hvac.json +0 -0
  363. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/conftest.py +0 -0
  364. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/device/__init__.py +0 -0
  365. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/device/test_hvac_ventilator.py +0 -0
  366. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  367. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_api_faultlog.py +0 -0
  368. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_api_schedule.py +0 -0
  369. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_binding_fsm.py +0 -0
  370. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_create_stack.py +0 -0
  371. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_database.py +0 -0
  372. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_dispatcher.py +0 -0
  373. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_entity_base.py +0 -0
  374. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  375. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_protocol_fsm.py +0 -0
  376. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_use_regex.py +0 -0
  377. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/test_virt_network.py +0 -0
  378. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  379. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/__init__.py +0 -0
  380. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/test_command.py +0 -0
  381. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/tests_tx/test_const.py +0 -0
  382. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  383. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  384. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  385. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  386. {ramses_rf-0.53.1 → ramses_rf-0.53.2}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  387. {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.1
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 LR
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:
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.53.1"
3
+ __version__ = "0.53.2"
4
4
  VERSION = __version__
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (transport layer)."""
2
2
 
3
- __version__ = "0.53.1"
3
+ __version__ = "0.53.2"
4
4
  VERSION = __version__
@@ -1,5 +1,5 @@
1
1
  # Requirements to build the code documentation from the source code
2
- # - last checked/updated: 2026-01-11 (c.f. HA 2026.1.0)
2
+ # - last checked/updated: 2026-01-16 (c.f. HA 2026.1.0)
3
3
 
4
4
  # libraries required to build with sphinx
5
5
  # - pip list | grep -E 'sphinx'
@@ -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
- If a Gateway (18:) device is present in the schema, it must have a defined class of
42
- "HGI". Otherwise, the Gateway device_id is derived from the serial port ordinal
43
- (port_idx, 0-5).
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
- hgi_ids = [k for k, v in known_list.items() if v.get(SZ_CLASS) == DevType.HGI]
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
- elif len(hgi_ids) == 1:
54
- hgi_id = hgi_ids[0]
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[:2] == DEV_TYPE_MAP.HGI and not v.get(SZ_CLASS)
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
- else:
65
- hgi_id = f"18:{str(port_idx) * 6}"
66
- fw_type = "EVOFW3"
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
- return hgi_id, fw_type
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
- MAX_PORTS = 6 # 18:666666 is not a valid device_id, but 18:000000 is OK
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=HgiFwTypes.__members__[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
- gwys.append(gwy)
121
+ # gwy._engine.ptcl.qos.disable_qos = False # Hack for testing
104
122
 
105
- if start_gwys:
106
- await gwy.start()
107
- gwy.msg_db = MessageIndex(maintain=False)
108
- assert gwy._transport is not None # mypy
109
- gwy._transport._extra["virtual_rf"] = rf
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."""