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