ramses-rf 0.52.3__tar.gz → 0.52.4__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 (376) hide show
  1. ramses_rf-0.52.4/.github/workflows/check-cov.yml +131 -0
  2. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/workflows/check-lint.yml +1 -1
  3. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/workflows/check-test.yml +1 -1
  4. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/workflows/check-type.yml +1 -1
  5. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/workflows/publish-hatch.yml +1 -1
  6. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/PKG-INFO +2 -1
  7. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/README.md +1 -0
  8. ramses_rf-0.52.3/docs/source/binding_process_diagram.md → ramses_rf-0.52.4/docs/source/binding_process.md +3 -3
  9. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/index.rst +1 -1
  10. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/pyproject.toml +38 -0
  11. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/database.py +7 -3
  12. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/device/heat.py +1 -1
  13. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/entity_base.py +67 -26
  14. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/gateway.py +9 -9
  15. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/system/heat.py +1 -1
  16. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/version.py +1 -1
  17. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/const.py +1 -1
  18. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/parsers.py +57 -12
  19. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/protocol.py +2 -2
  20. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/ramses.py +9 -5
  21. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/transport.py +1 -0
  22. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/version.py +1 -1
  23. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/requirements/requirements.txt +1 -1
  24. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/requirements/requirements_dev.txt +6 -6
  25. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/requirements/requirements_docs.txt +1 -1
  26. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/helpers.py +4 -1
  27. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_01ff_wip.log +2 -1
  28. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22d0.log +2 -1
  29. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e04.log +1 -0
  30. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/device/test_hvac_ventilator.py +54 -0
  31. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_binding_fsm.py +1 -1
  32. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_database.py +4 -0
  33. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_dispatcher.py +2 -0
  34. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_entity_base.py +6 -0
  35. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_virt_network.py +7 -2
  36. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/__init__.py +3 -1
  37. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.github/dependabot.yml +0 -0
  39. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.gitignore +0 -0
  40. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/.pre-commit-config.yaml +0 -0
  41. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/LICENSE +0 -0
  42. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/README-developers.md +0 -0
  43. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/client.py +0 -0
  44. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/Makefile +0 -0
  45. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/make.bat +0 -0
  46. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/_static/ramses_rf_logo.png +0 -0
  47. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/conf.py +0 -0
  48. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/glossary.rst +0 -0
  49. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/modules.rst +0 -0
  50. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/ramses_cli.rst +0 -0
  51. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/ramses_rf.device.rst +0 -0
  52. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/ramses_rf.rst +0 -0
  53. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/ramses_rf.system.rst +0 -0
  54. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/ramses_tx.rst +0 -0
  55. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/docs/source/usage.md +0 -0
  56. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/misc/2411_parser.py +0 -0
  57. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/misc/fingerprints.log +0 -0
  58. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/misc/ser2net.yaml +0 -0
  59. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/misc/ti_3410/notes.sh +0 -0
  60. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/misc/ti_3410/ti_3410.fw +0 -0
  61. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/__init__.py +0 -0
  62. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/client.py +0 -0
  63. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/debug.py +0 -0
  64. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/discovery.py +0 -0
  65. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/utils/cat_slow.py +0 -0
  66. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_cli/utils/convert.py +0 -0
  67. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/__init__.py +0 -0
  68. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/binding_fsm.py +0 -0
  69. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/const.py +0 -0
  70. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/device/__init__.py +0 -0
  71. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/device/base.py +0 -0
  72. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/device/hvac.py +0 -0
  73. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/dispatcher.py +0 -0
  74. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/exceptions.py +0 -0
  75. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/helpers.py +0 -0
  76. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/py.typed +0 -0
  77. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/schemas.py +0 -0
  78. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/system/__init__.py +0 -0
  79. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/system/faultlog.py +0 -0
  80. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/system/schedule.py +0 -0
  81. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_rf/system/zones.py +0 -0
  82. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/__init__.py +0 -0
  83. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/address.py +0 -0
  84. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/command.py +0 -0
  85. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/exceptions.py +0 -0
  86. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/fingerprints.py +0 -0
  87. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/frame.py +0 -0
  88. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/gateway.py +0 -0
  89. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/helpers.py +0 -0
  90. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/logger.py +0 -0
  91. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/message.py +0 -0
  92. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/opentherm.py +0 -0
  93. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/packet.py +0 -0
  94. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/protocol_fsm.py +0 -0
  95. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/py.typed +0 -0
  96. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/schemas.py +0 -0
  97. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/typed_dicts.py +0 -0
  98. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/ramses_tx/typing.py +0 -0
  99. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_apis_mock.py +0 -0
  100. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_mock_faultlog.py +0 -0
  101. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_mock_schedule.py +0 -0
  102. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_packets_bad.py +0 -0
  103. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_performance_WIP.py +0 -0
  104. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/_test_state_mgt.py +0 -0
  105. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/common.py +0 -0
  106. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/__init__.py +0 -0
  107. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/command.py +0 -0
  108. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/const.py +0 -0
  109. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  110. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  111. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/transport.py +0 -0
  112. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/__init__.py +0 -0
  113. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  114. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  115. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  116. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  117. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  118. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  119. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  120. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  121. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  122. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  123. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  124. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  125. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  126. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  127. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  128. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  129. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
  130. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/devices/device_02.log +0 -0
  131. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/devices/device_04.log +0 -0
  132. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/devices/device_10.log +0 -0
  133. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/devices/device_13.log +0 -0
  134. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/devices/device_22.log +0 -0
  135. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  136. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  137. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  138. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  139. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  140. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  141. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  142. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  143. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  144. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  145. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  146. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  147. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  148. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  149. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  150. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  151. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  152. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  153. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  154. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  155. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  156. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  157. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  158. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  159. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  160. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  161. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  162. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  163. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  164. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  165. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  166. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  167. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  168. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  169. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/_gather.sh +0 -0
  170. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  171. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  172. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  173. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  174. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  175. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  176. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  177. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  178. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  179. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  180. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  181. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  182. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  183. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/20.log +0 -0
  184. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  185. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  186. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  187. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  188. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  189. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  190. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  191. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  192. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  193. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  194. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  195. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  196. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  197. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  198. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  199. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  200. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  201. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  202. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  203. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  204. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  205. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  206. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  207. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  208. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  209. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  210. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  211. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  212. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/logger/packet_in.log +0 -0
  213. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/logger/packet_out.log +0 -0
  214. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/logs/pkts_bad_000.log +0 -0
  215. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/logs/pkts_tba_000.log +0 -0
  216. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/logs/system_cache.json +0 -0
  217. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  218. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  219. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0001_wip.log +0 -0
  220. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0002.log +0 -0
  221. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0004_wip.log +0 -0
  222. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0005.log +0 -0
  223. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0006.log +0 -0
  224. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0008.log +0 -0
  225. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0009.log +0 -0
  226. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_000a.log +0 -0
  227. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_000c.log +0 -0
  228. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_000e.log +0 -0
  229. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_0418.log +0 -0
  230. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_042f.log +0 -0
  231. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1030.log +0 -0
  232. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1060.log +0 -0
  233. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_10d0.log +0 -0
  234. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_10e0.log +0 -0
  235. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1260.log +0 -0
  236. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1298.log +0 -0
  237. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_12a0.log +0 -0
  238. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_12c0.log +0 -0
  239. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1300.log +0 -0
  240. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1f09.log +0 -0
  241. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1fc9.log +0 -0
  242. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_1fd4.log +0 -0
  243. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2210.log +0 -0
  244. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22c9.log +0 -0
  245. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22d9.log +0 -0
  246. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e0.log +0 -0
  247. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e5.log +0 -0
  248. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e9.log +0 -0
  249. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f1.log +0 -0
  250. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f2.log +0 -0
  251. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f3.log +0 -0
  252. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f4.log +0 -0
  253. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f7.log +0 -0
  254. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2309.log +0 -0
  255. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2349.log +0 -0
  256. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2411_wip.log +0 -0
  257. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2e04.log +0 -0
  258. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_2e10_wip.log +0 -0
  259. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_30c9.log +0 -0
  260. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3110_wip.log +0 -0
  261. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3120.log +0 -0
  262. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_313e_wip.log +0 -0
  263. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3150.log +0 -0
  264. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_31d9.log +0 -0
  265. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_31da.log +0 -0
  266. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3200.log +0 -0
  267. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3210.log +0 -0
  268. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3220.log +0 -0
  269. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3222.log +0 -0
  270. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  271. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  272. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e01.log +0 -0
  273. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e02.log +0 -0
  274. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e15.log +0 -0
  275. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/_sched_002/packet.log +0 -0
  276. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  277. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/sched_001/packet.log +0 -0
  278. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/sched_001/schedule.json +0 -0
  279. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  280. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  281. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  282. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  283. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  284. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  285. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  286. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  287. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  288. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_000.json +0 -0
  289. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_000.log +0 -0
  290. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_001.json +0 -0
  291. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_001.log +0 -0
  292. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_002.json +0 -0
  293. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_002.log +0 -0
  294. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_010.json +0 -0
  295. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_010.log +0 -0
  296. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_011.json +0 -0
  297. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_011.log +0 -0
  298. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_012.json +0 -0
  299. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_012.log +0 -0
  300. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_013.json +0 -0
  301. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_013.log +0 -0
  302. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_014.json +0 -0
  303. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_014.log +0 -0
  304. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_300.json +0 -0
  305. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_300.log +0 -0
  306. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_301.json +0 -0
  307. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_301.log +0 -0
  308. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_302.json +0 -0
  309. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_302.log +0 -0
  310. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_303.json +0 -0
  311. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_303.log +0 -0
  312. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_304.json +0 -0
  313. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_304.log +0 -0
  314. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_310.json +0 -0
  315. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_310.log +0 -0
  316. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  317. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  318. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  319. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  320. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  321. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  322. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  323. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  324. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/config.json +0 -0
  325. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  326. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  327. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_simple/packet.log +0 -0
  328. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_simple/schema.json +0 -0
  329. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  330. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  331. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  332. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  333. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  334. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  335. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  336. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_api_faultlog.py +0 -0
  337. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_api_schedule.py +0 -0
  338. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_apis_binding.py +0 -0
  339. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_apis_common.py +0 -0
  340. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_apis_heat.py +0 -0
  341. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_apis_hvac.py +0 -0
  342. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_cli_utility.py +0 -0
  343. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_devices.py +0 -0
  344. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  345. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_eavesdrop_schema.py +0 -0
  346. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_helpers.py +0 -0
  347. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_parser_helpers.py +0 -0
  348. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_parsers.py +0 -0
  349. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_ramses_schema.py +0 -0
  350. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_schema_bits.py +0 -0
  351. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_schemas.py +0 -0
  352. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_systems.py +0 -0
  353. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests/test_vol_schemas.py +0 -0
  354. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/__init__.py +0 -0
  355. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/configs/config_heat.json +0 -0
  356. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/configs/config_hvac.json +0 -0
  357. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/conftest.py +0 -0
  358. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/device/__init__.py +0 -0
  359. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  360. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_api_faultlog.py +0 -0
  361. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_api_schedule.py +0 -0
  362. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_create_stack.py +0 -0
  363. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  364. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_protocol_fsm.py +0 -0
  365. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/test_use_regex.py +0 -0
  366. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/const.py +0 -0
  367. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  368. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  369. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_tx/__init__.py +0 -0
  370. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/tests_tx/test_command.py +0 -0
  371. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  372. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  373. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  374. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  375. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  376. {ramses_rf-0.52.3 → ramses_rf-0.52.4}/tests/wip/test_wip_cli.sh +0 -0
@@ -0,0 +1,131 @@
1
+ name: Coverage
2
+ # based on: https://github.com/marketplace/actions/code-coverage-summary
3
+
4
+ on:
5
+ push:
6
+ branches: [ "master" ]
7
+ paths: [
8
+ ".github/workflows/check-cov.yml",
9
+ "pyproject.toml",
10
+ "requirements/**",
11
+ "src/**.py",
12
+ "tests/**",
13
+ ]
14
+
15
+ pull_request:
16
+ branches: [ "master" ]
17
+ paths: [
18
+ ".github/workflows/check-cov.yml",
19
+ "pyproject.toml",
20
+ "requirements/**",
21
+ "src/**.py",
22
+ "tests/**",
23
+ ]
24
+
25
+ pull_request_target:
26
+ branches: [ "master" ]
27
+ paths: [
28
+ ".github/workflows/check-cov.yml",
29
+ "pyproject.toml",
30
+ "requirements/**",
31
+ "src/**.py",
32
+ "tests/**",
33
+ ]
34
+
35
+ schedule:
36
+ - cron: "0 7 * * 5"
37
+
38
+ workflow_dispatch:
39
+
40
+ permissions:
41
+ pull-requests: write
42
+
43
+ jobs:
44
+ coverage:
45
+ runs-on: ubuntu-latest
46
+
47
+ strategy:
48
+ fail-fast: false
49
+ matrix:
50
+ python-version: ["3.14"]
51
+
52
+ steps:
53
+ - uses: actions/checkout@v6
54
+
55
+ - name: Set up Python ${{ matrix.python-version }}
56
+ uses: actions/setup-python@v6
57
+ with:
58
+ python-version: ${{ matrix.python-version }}
59
+
60
+ - name: Install dependencies
61
+ run: |
62
+ python -m pip install --upgrade pip
63
+ pip install -r requirements/requirements_dev.txt
64
+
65
+ - name: Install the package (and its dependencies)
66
+ run: pip install -e .
67
+
68
+ - name: Run coverage with pytest
69
+ run: coverage run -m pytest
70
+
71
+ - name: Debug - Check if .coverage exists
72
+ run: test -f .coverage && echo ".coverage exists" || echo ".coverage does NOT exist"
73
+
74
+ - name: Display coverage report
75
+ run: coverage report
76
+
77
+ - name: Create coverage xml
78
+ run: coverage xml
79
+
80
+ - name: Create Code Coverage Report
81
+ # from: https://github.com/marketplace/actions/code-coverage-summary
82
+ uses: irongut/CodeCoverageSummary@v1.3.0
83
+ with:
84
+ filename: coverage.xml
85
+ badge: true
86
+ fail_below_min: true
87
+ format: markdown
88
+ hide_branch_rate: false
89
+ hide_complexity: true
90
+ indicators: true
91
+ output: both
92
+ thresholds: '60 80'
93
+
94
+ - name: Add Coverage PR Comment
95
+ # from: https://github.com/marketplace/actions/comment-pull-request
96
+ if: github.event_name == 'pull_request_target'
97
+ uses: thollander/actions-comment-pull-request@v3
98
+ with:
99
+ file-path: code-coverage-results.md
100
+ comment-tag: code-coverage-results.md # replaces existing by this name
101
+ mode: recreate
102
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103
+ # or: https://github.com/marketplace/actions/sticky-pull-request-comment
104
+ # if: github.event_name == 'pull_request'
105
+ # with:
106
+ # recreate: true
107
+ # path: code-coverage-results.md
108
+ # GITHUB_TOKEN is implicitly passed in
109
+
110
+ # - name: Create Coverage Badge
111
+ # # from: https://github.com/marketplace/actions/coverage-py-badge
112
+ # uses: tj-actions/coverage-badge-py@v2
113
+ # id: coverage-badge-py
114
+ # with:
115
+ # # Output path to write the
116
+ # # coverage badge.
117
+ # # Type: string
118
+ # # Default: "coverage.svg"
119
+ # output: 'misc/coverage-badge.svg'
120
+ #
121
+ # # Overwrite an existing coverage badge.
122
+ # # Type: boolean
123
+ # # Default: "true"
124
+ # overwrite: ''
125
+ #
126
+ # # Current working directory
127
+ # # Type: string
128
+ # # Default: "."
129
+ # working-directory: ''
130
+
131
+ - run: echo "🍏 This job's status is ${{ job.status }}."
@@ -31,7 +31,7 @@ jobs:
31
31
  python-version: ["3.13"]
32
32
 
33
33
  steps:
34
- - uses: actions/checkout@v5
34
+ - uses: actions/checkout@v6
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
37
  uses: actions/setup-python@v6
@@ -31,7 +31,7 @@ jobs:
31
31
  python-version: ["3.11", "3.12", "3.13"]
32
32
 
33
33
  steps:
34
- - uses: actions/checkout@v5
34
+ - uses: actions/checkout@v6
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
37
  uses: actions/setup-python@v6
@@ -31,7 +31,7 @@ jobs:
31
31
  python-version: ["3.13"]
32
32
 
33
33
  steps:
34
- - uses: actions/checkout@v5
34
+ - uses: actions/checkout@v6
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
37
  uses: actions/setup-python@v6
@@ -17,7 +17,7 @@ jobs:
17
17
  name: Build release to /dist
18
18
  runs-on: ubuntu-latest
19
19
  steps:
20
- - uses: actions/checkout@v5
20
+ - uses: actions/checkout@v6
21
21
 
22
22
  - name: Install hatch
23
23
  run: pipx install hatch
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramses_rf
3
- Version: 0.52.3
3
+ Version: 0.52.4
4
4
  Summary: A stateful RAMSES-II protocol decoder & analyser.
5
5
  Project-URL: Homepage, https://github.com/ramses-rf/ramses_rf
6
6
  Project-URL: Bug Tracker, https://github.com/ramses-rf/ramses_rf/issues
@@ -22,6 +22,7 @@ Description-Content-Type: text/markdown
22
22
  ![Linting](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-lint.yml/badge.svg)
23
23
  ![Typing](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-type.yml/badge.svg)
24
24
  ![Testing](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-test.yml/badge.svg)
25
+ [![Coverage](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml/badge.svg?event=push)](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml)
25
26
 
26
27
  ## Overview
27
28
 
@@ -1,6 +1,7 @@
1
1
  ![Linting](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-lint.yml/badge.svg)
2
2
  ![Typing](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-type.yml/badge.svg)
3
3
  ![Testing](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-test.yml/badge.svg)
4
+ [![Coverage](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml/badge.svg?event=push)](https://github.com/ramses-rf/ramses_rf/actions/workflows/check-cov.yml)
4
5
 
5
6
  ## Overview
6
7
 
@@ -1,4 +1,4 @@
1
- # RAMSES RF Binding Process Diagram
1
+ # RAMSES RF Binding Process
2
2
 
3
3
  ## Overview
4
4
  This diagram shows the binding finite state machine (FSM) for RAMSES RF devices, illustrating the complete process from initial state to binding completion.
@@ -38,8 +38,8 @@ stateDiagram-v2
38
38
  RespHasBoundAsRespondent
39
39
  end
40
40
 
41
- classDef supplicant fill:#006400,stroke:#ffffff,stroke-width:2px
42
- classDef respondent fill:#00008B,stroke:#ffffff,stroke-width:2px
41
+ classDef supplicant fill:#ff64dd,stroke:#ffffff,stroke-width:2px
42
+ classDef respondent fill:#55bb8B,stroke:#ffffff,stroke-width:2px
43
43
 
44
44
  class SuppSendOfferWaitForAccept,OfferSent,SuppIsReadyToSendConfirm,SuppHasBoundAsSupplicant supplicant
45
45
  class RespIsWaitingForOffer,OfferReceived,RespSendAcceptWaitForConfirm,RespHasBoundAsRespondent respondent
@@ -11,7 +11,7 @@ ramses_rf
11
11
 
12
12
  usage
13
13
  glossary
14
- binding_process_diagram
14
+ binding_process
15
15
 
16
16
  .. toctree::
17
17
  :maxdepth: 2
@@ -81,8 +81,46 @@
81
81
  asyncio_default_fixture_loop_scope = "function"
82
82
  asyncio_mode = "auto"
83
83
 
84
+ testpaths = [
85
+ "tests/"
86
+ ]
84
87
  norecursedirs = "deprecated/*"
85
88
 
89
+ # pytest-cov slows down our tests to 10 mins, so leave off.
90
+ # We run coverage in a separate workflow on python 3.13 only (fastest)
91
+ # pytest-cov coverage reporting. open htmlcov/index.html in a browser for details
92
+ # addopts = ["--cov=src", "--cov-fail-under=50", "--cov-report=xml", "--cov-report=term"]
93
+ # to create an interactive local HTML report, add: --cov-report=html
94
+ # to report missed lines during test writing, add: --cov-report=term-missing
95
+ # PyCharm might not hit a breakpoint. For debugging, disable -cov by adding:
96
+ # –no-cov"
97
+ # cov_report_term = "term-missing:skip-covered"
98
+
99
+ #
100
+ ### coverage #########################################################################
101
+
102
+ [tool.coverage.run]
103
+ core = "sysmon" # essential setting for speed on GitHub < 11 secs instead of >12 mins
104
+ branch = false # true takes a lot longer and can't be combined with sysmon
105
+ # patch = ["subprocess"]
106
+ source = [
107
+ "src",
108
+ "tests"
109
+ ]
110
+
111
+ [tool.coverage.report]
112
+ # Regexes for lines to exclude from consideration
113
+ exclude_also = [
114
+ # Don't complain if tests don't hit defensive assertion code:
115
+ "raise AssertionError",
116
+ "raise NotImplementedError",
117
+ ]
118
+ format = "text"
119
+ fail_under = 75
120
+ ignore_errors = true
121
+
122
+ [tool.coverage.html]
123
+ directory = "coverage_html"
86
124
 
87
125
  #
88
126
  ### mypy #############################################################################
@@ -130,11 +130,15 @@ class MessageIndex:
130
130
  def stop(self) -> None:
131
131
  """Stop the housekeeper loop."""
132
132
 
133
- if self._housekeeping_task and (not self._housekeeping_task.done()):
133
+ if (
134
+ self.maintain
135
+ and self._housekeeping_task
136
+ and (not self._housekeeping_task.done())
137
+ ):
134
138
  self._housekeeping_task.cancel() # stop the housekeeper
135
139
 
136
140
  self._cx.commit() # just in case
137
- # self._cx.close() # may still need to do queries after engine has stopped?
141
+ self._cx.close() # may still need to do queries after engine has stopped?
138
142
 
139
143
  @property
140
144
  def msgs(self) -> MsgDdT:
@@ -193,7 +197,7 @@ class MessageIndex:
193
197
  """
194
198
  dtm = dt_now - _cutoff # .isoformat(timespec="microseconds") < needed?
195
199
 
196
- self._cu.execute("SELECT dtm FROM messages WHERE dtm => ?", (dtm,))
200
+ self._cu.execute("SELECT dtm FROM messages WHERE dtm >= ?", (dtm,))
197
201
  rows = self._cu.fetchall() # fetch dtm of current messages to retain
198
202
 
199
203
  try: # make this operation atomic, i.e. update self._msgs only on success
@@ -450,7 +450,7 @@ class UfhController(Parent, DeviceHeat): # UFC (02):
450
450
  # )
451
451
  # self._send_cmd(cmd)
452
452
 
453
- elif msg.code == Code._0008: # relay_demand, TODO: use msgIndex DB?
453
+ elif msg.code == Code._0008: # relay_demand
454
454
  if msg.payload.get(SZ_DOMAIN_ID) == FC:
455
455
  self._relay_demand = msg
456
456
  else: # FA
@@ -224,7 +224,10 @@ class _MessageDB(_Entity):
224
224
 
225
225
  # As of 0.52.1 we use SQLite MessageIndex, see ramses_rf/database.py
226
226
  # _msgz_ (nested) was only used in this module. Note:
227
- # _msgz (now rebuilt from _msgs) also used in: client, base, device.heat
227
+ # _msgz (now rebuilt from _msgs) is also used in:
228
+ # - client.py: for code in device._msgz.values()
229
+ # - base.py: Code._1060 in self._msgz
230
+ # [x] device.heat (no longer used)
228
231
 
229
232
  def _handle_msg(self, msg: Message) -> None:
230
233
  """Store a msg in the DBs.
@@ -244,14 +247,14 @@ class _MessageDB(_Entity):
244
247
 
245
248
  if self._gwy.msg_db: # central SQLite MessageIndex
246
249
  _LOGGER.debug(
247
- "For %s (z_id %s) add msg %s, src %s, dst %s to msg_db.",
250
+ "For %s (_z_id %s) add msg %s, src %s, dst %s to msg_db.",
248
251
  self.id,
249
252
  self._z_id,
250
253
  msg,
251
254
  msg.src,
252
255
  msg.dst,
253
256
  )
254
- debug_code: Code = Code._3150
257
+ debug_code: Code = Code._3150 # for debugging only log these, pick your own
255
258
  if msg.code == debug_code and msg.src.id.startswith("01:"):
256
259
  _LOGGER.debug(
257
260
  "Added msg from %s with code %s to _gwy.msg_db. hdr=%s",
@@ -293,6 +296,7 @@ class _MessageDB(_Entity):
293
296
  def _msg_list(self) -> list[Message]:
294
297
  """Return a flattened list of all messages logged on this device."""
295
298
  # (only) used in gateway.py#get_state() and in tests/tests/test_eavesdrop_schema.py
299
+ # TODO remove _msg_list Q1 2026
296
300
  if self._gwy.msg_db:
297
301
  msg_list_qry: list[Message] = []
298
302
  code_list = self._msg_dev_qry()
@@ -303,16 +307,21 @@ class _MessageDB(_Entity):
303
307
  msg_list_qry.append(self._msgs[c])
304
308
  else:
305
309
  # evohome has these errors
306
- # _msg_list could not fetch self._msgs[7FFF] for 18:072981 (z_id 18:072981)
310
+ # _msg_list could not fetch self._msgs[7FFF] for 18:072981 (_z_id 18:072981)
307
311
  _LOGGER.debug(
308
- "_msg_list could not fetch self._msgs[%s] for %s (z_id %s)",
312
+ "_msg_list could not fetch self._msgs[%s] for %s (_z_id %s)",
309
313
  c,
310
314
  self.id,
311
315
  self._z_id,
312
316
  )
313
317
  return msg_list_qry
314
318
  # else create from legacy nested dict
315
- return [m for c in self._msgz.values() for v in c.values() for m in v.values()]
319
+ return [
320
+ msg
321
+ for code in self._msgz.values()
322
+ for ctx in code.values()
323
+ for msg in ctx.values()
324
+ ]
316
325
 
317
326
  def _add_record(
318
327
  self, address: Address, code: Code | None = None, verb: str = " I"
@@ -424,7 +433,7 @@ class _MessageDB(_Entity):
424
433
  **kwargs: Any,
425
434
  ) -> dict | list | None:
426
435
  """
427
- Query the message dict or the SQLite index for the most recent
436
+ Query the _msgz message dict or the SQLite MessageIndex for the most recent
428
437
  key: value pairs(s) for a given code.
429
438
 
430
439
  :param code: filter messages by Code or a tuple of Codes, optional
@@ -517,7 +526,7 @@ class _MessageDB(_Entity):
517
526
  or (idx == SZ_DOMAIN_ID)
518
527
  ), (
519
528
  f"full dict:{msg_dict}, payload:{msg.payload} < Coding error: key='{idx}', val='{val}'"
520
- ) # should not be there (TODO(eb): BUG but occurs when using SQLite MessageIndex)
529
+ ) # should not be there
521
530
 
522
531
  if (
523
532
  key == "*" or not key
@@ -535,21 +544,35 @@ class _MessageDB(_Entity):
535
544
  """
536
545
  Retrieve from the MessageIndex a list of Code keys involving this device.
537
546
 
538
- :return: list of Codes or empty list when query returned empty
547
+ :return: list of Codes or an empty list when the query returned empty
539
548
  """
540
549
 
541
550
  if self._gwy.msg_db:
542
551
  # SQLite query on MessageIndex
543
552
  res: list[Code] = []
544
- if self.id[_ID_SLICE:] == "_HW":
553
+
554
+ if len(self.id) == 9:
555
+ # fetch a ctl's message codes (add all its children?)
556
+ sql = """
557
+ SELECT code from messages WHERE
558
+ verb in (' I', 'RP')
559
+ AND (src = ? OR dst = ?)
560
+ AND ctx LIKE ?
561
+ """
562
+ _ctx_qry = "%"
563
+
564
+ elif self.id[_ID_SLICE:] == "_HW":
565
+ # fetch a DHW entity's message codes
545
566
  sql = """
546
567
  SELECT code from messages WHERE
547
568
  verb in (' I', 'RP')
548
569
  AND (src = ? OR dst = ?)
549
570
  AND (ctx IN ('FC', 'FA', 'F9', 'FA') OR plk LIKE ?)
550
571
  """
551
- _ctx_qry = "%dhw_idx%" # syntax error ?
572
+ _ctx_qry = "%dhw_idx%"
573
+
552
574
  else:
575
+ # fetch a zone's message codes
553
576
  sql = """
554
577
  SELECT code from messages WHERE
555
578
  verb in (' I', 'RP')
@@ -562,12 +585,12 @@ class _MessageDB(_Entity):
562
585
  sql, (self.id[:_ID_SLICE], self.id[:_ID_SLICE], _ctx_qry)
563
586
  ):
564
587
  _LOGGER.debug(
565
- "Fetched from index: %s for %s (z_id %s)",
588
+ "Fetched from index: %s for %s (_z_id %s)",
566
589
  rec[0],
567
590
  self.id,
568
591
  self._z_id,
569
592
  )
570
- # Example: "Fetched from index: code 1FD4 for 01:123456 (z_id 01)"
593
+ # Example: "Fetched from index: code 1FD4 for 01:123456 (_z_id 01)"
571
594
  res.append(Code(str(rec[0])))
572
595
  return res
573
596
  else:
@@ -743,7 +766,18 @@ class _MessageDB(_Entity):
743
766
  # for r in results:
744
767
  # print(r)
745
768
 
746
- if self.id[_ID_SLICE:] == "_HW":
769
+ if len(self.id) == 9:
770
+ # fetch a ctl's message dtms (add all its children?)
771
+ sql = """
772
+ SELECT dtm from messages WHERE
773
+ verb in (' I', 'RP')
774
+ AND (src = ? OR dst = ?)
775
+ AND ctx LIKE ?
776
+ """
777
+ _ctx_qry = "%"
778
+
779
+ elif self.id[_ID_SLICE:] == "_HW":
780
+ # fetch a DHW entity's message dtms
747
781
  sql = """
748
782
  SELECT dtm from messages WHERE
749
783
  verb in (' I', 'RP')
@@ -753,6 +787,7 @@ class _MessageDB(_Entity):
753
787
  _ctx_qry = "%dhw_idx%"
754
788
  # TODO add Children messages? self.ctl.dhw
755
789
  else:
790
+ # fetch a zone's message dtms
756
791
  sql = """
757
792
  SELECT dtm from messages WHERE
758
793
  verb in (' I', 'RP')
@@ -769,14 +804,14 @@ class _MessageDB(_Entity):
769
804
  }
770
805
  # if CTL, remove 3150, 3220 heat_demand, both are only stored on children
771
806
  # HACK
772
- if self.id[:3] == "01:" and self._SLUG == "CTL":
773
- # with next ON: 2 errors , both 1x UFC, 1x CTR
774
- # with next OFF: 4 errors, all CTR
775
- # if Code._3150 in _msg_dict: # Note: CTL can send a 3150 (see heat_ufc_00)
776
- # _msg_dict.pop(Code._3150) # keep, prefer to have 2 extra instead of missing 1
777
- if Code._3220 in _msg_dict:
778
- _msg_dict.pop(Code._3220)
779
- # _LOGGER.debug(f"Removed 3150/3220 from %s._msgs dict", self.id)
807
+ # if self.id[:3] == "01:" and self._SLUG == "CTL":
808
+ # with next ON: 2 errors , both 1x UFC, 1x CTR
809
+ # with next OFF: 4 errors, all CTR
810
+ # if Code._3150 in _msg_dict: # Note: CTL can send a 3150 (see heat_ufc_00)
811
+ # _msg_dict.pop(Code._3150) # keep, prefer to have 2 extra instead of missing 1
812
+ # if Code._3220 in _msg_dict:
813
+ # _msg_dict.pop(Code._3220)
814
+ # _LOGGER.debug(f"Removed 3150/3220 from %s._msgs dict", self.id)
780
815
  return _msg_dict
781
816
 
782
817
  @property
@@ -862,7 +897,6 @@ class _Discovery(_MessageDB):
862
897
  # return f"{data_id:02X}" # type: ignore[return-value]
863
898
 
864
899
  res: list[str] = []
865
- # look for the "sim" OT 3220 record initially added in OtbGateway.init
866
900
  if self._gwy.msg_db:
867
901
  # SQLite query for ctx field on MessageIndex
868
902
  sql = """
@@ -995,18 +1029,24 @@ class _Discovery(_MessageDB):
995
1029
  sql = """
996
1030
  SELECT dtm from messages WHERE
997
1031
  code = ?
998
- verb = ' I'
1032
+ AND verb = ' I'
999
1033
  AND ctx = 'True'
1000
1034
  AND (src = ? OR dst = ?)
1001
1035
  """
1002
- msgs += self._gwy.msg_db.qry(
1036
+ res = self._gwy.msg_db.qry(
1003
1037
  sql,
1004
1038
  (
1005
1039
  task[_SZ_COMMAND].code,
1006
1040
  self.tcs.id[:_ID_SLICE],
1007
1041
  self.tcs.id[:_ID_SLICE],
1008
1042
  ),
1009
- )[0] # expect 1 Message in returned tuple
1043
+ )
1044
+ if len(res) > 0:
1045
+ msgs += res[0] # expect 1 Message in returned tuple
1046
+ else:
1047
+ _LOGGER.debug(
1048
+ f"No msg found for hdr {hdr}, tesk code {task[_SZ_COMMAND].code}"
1049
+ )
1010
1050
  else: # TODO(eb) remove next Q1 2026
1011
1051
  msgs += [self.tcs._msgz[task[_SZ_COMMAND].code][I_][True]]
1012
1052
  # raise NotImplementedError
@@ -1145,6 +1185,7 @@ class Parent(Entity): # A System, Zone, DhwZone or a UfhController
1145
1185
  (incl. the DHW Zone), and also any UFH controllers.
1146
1186
 
1147
1187
  For a heating Zone, children are limited to a sensor, and a number of actuators.
1188
+
1148
1189
  For the DHW Zone, the children are limited to a sensor, a DHW valve, and/or a
1149
1190
  heating valve.
1150
1191
 
@@ -258,14 +258,6 @@ class Gateway(Engine):
258
258
  # return True
259
259
  return include_expired or not msg._expired
260
260
 
261
- msgs = [m for device in self.devices for m in device._msg_list]
262
-
263
- for system in self.systems:
264
- msgs.extend(list(system._msgs.values()))
265
- msgs.extend([m for z in system.zones for m in z._msgs.values()])
266
- # msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO: DHW
267
- # Related to/Fixes ramses_cc Issue 249 non-existing via-device _HW ?
268
-
269
261
  if self.msg_db:
270
262
  pkts = {
271
263
  f"{repr(msg._pkt)[:26]}": f"{repr(msg._pkt)[27:]}"
@@ -273,12 +265,20 @@ class Gateway(Engine):
273
265
  if wanted_msg(msg, include_expired=include_expired)
274
266
  }
275
267
  else: # deprecated, to be removed in Q1 2026
276
- # _LOGGER.warning("Missing MessageIndex")
268
+ msgs = [m for device in self.devices for m in device._msg_list]
269
+ # add systems._msgs and zones._msgs
270
+ for system in self.systems:
271
+ msgs.extend(list(system._msgs.values()))
272
+ msgs.extend([m for z in system.zones for m in z._msgs.values()])
273
+ # msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO: DHW
274
+ # Related to/Fixes ramses_cc Issue 249 non-existing via-device _HW ?
275
+
277
276
  pkts = { # BUG: assumes pkts have unique dtms: may be untrue for contrived logs
278
277
  f"{repr(msg._pkt)[:26]}": f"{repr(msg._pkt)[27:]}"
279
278
  for msg in msgs
280
279
  if wanted_msg(msg, include_expired=include_expired)
281
280
  }
281
+ # _LOGGER.warning("Missing MessageIndex")
282
282
 
283
283
  self._resume()
284
284
 
@@ -532,7 +532,7 @@ class MultiZone(SystemBase): # 0005 (+/- 000C?)
532
532
  schema = shrink(SCH_TCS_ZONES_ZON(schema))
533
533
 
534
534
  zon: Zone = self.zone_by_idx.get(zone_idx) # type: ignore[assignment]
535
- if zon is None:
535
+ if zon is None: # not found in tcs, create it
536
536
  zon = zone_factory(self, zone_idx, msg=msg, **schema) # type: ignore[unreachable]
537
537
  self.zone_by_idx[zon.idx] = zon
538
538
  self.zones.append(zon)
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.52.3"
3
+ __version__ = "0.52.4"
4
4
  VERSION = __version__
@@ -440,7 +440,7 @@ DEV_TYPE_MAP = attr_dict_factory(
440
440
  ), # CH/DHW devices instead of HVAC/other
441
441
  "HEAT_ZONE_SENSORS": ("00", "01", "03", "04", "12", "22", "34"),
442
442
  "HEAT_ZONE_ACTUATORS": ("00", "02", "04", "13"),
443
- "THM_DEVICES": ("03", "12", "22", "34"),
443
+ "THM_DEVICES": ("03", "12", "21", "22", "34"),
444
444
  "TRV_DEVICES": ("00", "04"),
445
445
  "CONTROLLERS": ("01", "02", "12", "22", "23", "34"), # potentially controllers
446
446
  "PROMOTABLE_SLUGS": (DevType.DEV, DevType.HEA, DevType.HVC),