ramses-rf 0.52.2__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.2 → ramses_rf-0.52.4}/.github/workflows/check-lint.yml +2 -2
  3. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.github/workflows/check-test.yml +2 -2
  4. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.github/workflows/check-type.yml +2 -2
  5. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.github/workflows/publish-hatch.yml +3 -3
  6. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/PKG-INFO +2 -1
  7. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/README.md +1 -0
  8. ramses_rf-0.52.4/docs/source/binding_process.md +159 -0
  9. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/conf.py +2 -0
  10. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/index.rst +1 -0
  11. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/usage.md +1 -1
  12. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/pyproject.toml +38 -0
  13. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/binding_fsm.py +18 -4
  14. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/database.py +9 -5
  15. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/device/heat.py +4 -7
  16. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/entity_base.py +150 -55
  17. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/gateway.py +9 -9
  18. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/system/heat.py +1 -1
  19. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/system/zones.py +1 -1
  20. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/version.py +1 -1
  21. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/const.py +1 -1
  22. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/gateway.py +3 -0
  23. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/logger.py +8 -0
  24. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/parsers.py +57 -12
  25. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/protocol.py +2 -2
  26. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/ramses.py +9 -5
  27. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/schemas.py +4 -0
  28. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/transport.py +15 -3
  29. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/version.py +1 -1
  30. {ramses_rf-0.52.2 → ramses_rf-0.52.4/requirements}/requirements.txt +1 -1
  31. {ramses_rf-0.52.2 → ramses_rf-0.52.4/requirements}/requirements_dev.txt +6 -6
  32. {ramses_rf-0.52.2 → ramses_rf-0.52.4/requirements}/requirements_docs.txt +2 -0
  33. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/helpers.py +4 -1
  34. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_01ff_wip.log +2 -1
  35. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22d0.log +2 -1
  36. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e04.log +1 -0
  37. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_systems.py +1 -4
  38. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/device/test_hvac_ventilator.py +54 -0
  39. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_binding_fsm.py +1 -1
  40. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_database.py +36 -0
  41. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_dispatcher.py +2 -0
  42. ramses_rf-0.52.4/tests/tests_rf/test_entity_base.py +234 -0
  43. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_virt_network.py +7 -2
  44. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/__init__.py +3 -1
  45. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  46. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.github/dependabot.yml +0 -0
  47. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.gitignore +0 -0
  48. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/.pre-commit-config.yaml +0 -0
  49. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/LICENSE +0 -0
  50. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/README-developers.md +0 -0
  51. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/client.py +0 -0
  52. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/Makefile +0 -0
  53. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/make.bat +0 -0
  54. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/_static/ramses_rf_logo.png +0 -0
  55. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/glossary.rst +0 -0
  56. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/modules.rst +0 -0
  57. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/ramses_cli.rst +0 -0
  58. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/ramses_rf.device.rst +0 -0
  59. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/ramses_rf.rst +0 -0
  60. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/ramses_rf.system.rst +0 -0
  61. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/docs/source/ramses_tx.rst +0 -0
  62. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/misc/2411_parser.py +0 -0
  63. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/misc/fingerprints.log +0 -0
  64. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/misc/ser2net.yaml +0 -0
  65. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/misc/ti_3410/notes.sh +0 -0
  66. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/misc/ti_3410/ti_3410.fw +0 -0
  67. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/__init__.py +0 -0
  68. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/client.py +0 -0
  69. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/debug.py +0 -0
  70. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/discovery.py +0 -0
  71. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/utils/cat_slow.py +0 -0
  72. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_cli/utils/convert.py +0 -0
  73. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/__init__.py +0 -0
  74. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/const.py +0 -0
  75. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/device/__init__.py +0 -0
  76. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/device/base.py +0 -0
  77. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/device/hvac.py +0 -0
  78. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/dispatcher.py +0 -0
  79. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/exceptions.py +0 -0
  80. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/helpers.py +0 -0
  81. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/py.typed +0 -0
  82. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/schemas.py +0 -0
  83. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/system/__init__.py +0 -0
  84. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/system/faultlog.py +0 -0
  85. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_rf/system/schedule.py +0 -0
  86. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/__init__.py +0 -0
  87. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/address.py +0 -0
  88. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/command.py +0 -0
  89. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/exceptions.py +0 -0
  90. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/fingerprints.py +0 -0
  91. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/frame.py +0 -0
  92. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/helpers.py +0 -0
  93. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/message.py +0 -0
  94. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/opentherm.py +0 -0
  95. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/packet.py +0 -0
  96. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/protocol_fsm.py +0 -0
  97. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/py.typed +0 -0
  98. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/typed_dicts.py +0 -0
  99. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/ramses_tx/typing.py +0 -0
  100. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_apis_mock.py +0 -0
  101. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_mock_faultlog.py +0 -0
  102. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_mock_schedule.py +0 -0
  103. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_packets_bad.py +0 -0
  104. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_performance_WIP.py +0 -0
  105. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/_test_state_mgt.py +0 -0
  106. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/common.py +0 -0
  107. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/__init__.py +0 -0
  108. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/command.py +0 -0
  109. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/const.py +0 -0
  110. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  111. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  112. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/deprecated/mocked_devices/transport.py +0 -0
  113. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/__init__.py +0 -0
  114. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  115. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  116. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  117. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  118. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  119. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  120. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  121. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  122. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  123. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  124. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  125. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  126. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  127. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  128. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  129. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  130. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
  131. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/devices/device_02.log +0 -0
  132. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/devices/device_04.log +0 -0
  133. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/devices/device_10.log +0 -0
  134. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/devices/device_13.log +0 -0
  135. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/devices/device_22.log +0 -0
  136. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  137. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  138. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  139. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  140. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  141. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  142. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  143. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  144. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  145. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  146. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  147. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  148. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  149. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  150. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  151. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  152. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  153. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  154. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  155. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  156. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  157. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  158. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  159. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  160. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  161. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  162. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  163. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  164. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  165. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  166. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  167. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  168. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  169. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  170. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/_gather.sh +0 -0
  171. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  172. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  173. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  174. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  175. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  176. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  177. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  178. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  179. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  180. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  181. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  182. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  183. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  184. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/20.log +0 -0
  185. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  186. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  187. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  188. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  189. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  190. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  191. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  192. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  193. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  194. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  195. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  196. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  197. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  198. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  199. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  200. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  201. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  202. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  203. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  204. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  205. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  206. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  207. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  208. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  209. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  210. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  211. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  212. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  213. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/logger/packet_in.log +0 -0
  214. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/logger/packet_out.log +0 -0
  215. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/logs/pkts_bad_000.log +0 -0
  216. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/logs/pkts_tba_000.log +0 -0
  217. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/logs/system_cache.json +0 -0
  218. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  219. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  220. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0001_wip.log +0 -0
  221. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0002.log +0 -0
  222. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0004_wip.log +0 -0
  223. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0005.log +0 -0
  224. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0006.log +0 -0
  225. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0008.log +0 -0
  226. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0009.log +0 -0
  227. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_000a.log +0 -0
  228. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_000c.log +0 -0
  229. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_000e.log +0 -0
  230. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_0418.log +0 -0
  231. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_042f.log +0 -0
  232. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1030.log +0 -0
  233. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1060.log +0 -0
  234. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_10d0.log +0 -0
  235. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_10e0.log +0 -0
  236. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1260.log +0 -0
  237. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1298.log +0 -0
  238. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_12a0.log +0 -0
  239. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_12c0.log +0 -0
  240. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1300.log +0 -0
  241. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1f09.log +0 -0
  242. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1fc9.log +0 -0
  243. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_1fd4.log +0 -0
  244. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2210.log +0 -0
  245. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22c9.log +0 -0
  246. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22d9.log +0 -0
  247. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e0.log +0 -0
  248. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e5.log +0 -0
  249. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22e9.log +0 -0
  250. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f1.log +0 -0
  251. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f2.log +0 -0
  252. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f3.log +0 -0
  253. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f4.log +0 -0
  254. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_22f7.log +0 -0
  255. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2309.log +0 -0
  256. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2349.log +0 -0
  257. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2411_wip.log +0 -0
  258. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2e04.log +0 -0
  259. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_2e10_wip.log +0 -0
  260. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_30c9.log +0 -0
  261. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3110_wip.log +0 -0
  262. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3120.log +0 -0
  263. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_313e_wip.log +0 -0
  264. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3150.log +0 -0
  265. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_31d9.log +0 -0
  266. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_31da.log +0 -0
  267. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3200.log +0 -0
  268. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3210.log +0 -0
  269. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3220.log +0 -0
  270. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3222.log +0 -0
  271. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  272. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  273. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e01.log +0 -0
  274. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e02.log +0 -0
  275. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/parsers/code_4e15.log +0 -0
  276. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/_sched_002/packet.log +0 -0
  277. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  278. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/sched_001/packet.log +0 -0
  279. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/sched_001/schedule.json +0 -0
  280. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  281. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  282. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  283. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  284. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  285. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  286. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  287. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  288. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  289. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_000.json +0 -0
  290. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_000.log +0 -0
  291. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_001.json +0 -0
  292. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_001.log +0 -0
  293. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_002.json +0 -0
  294. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_002.log +0 -0
  295. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_010.json +0 -0
  296. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_010.log +0 -0
  297. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_011.json +0 -0
  298. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_011.log +0 -0
  299. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_012.json +0 -0
  300. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_012.log +0 -0
  301. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_013.json +0 -0
  302. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_013.log +0 -0
  303. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_014.json +0 -0
  304. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_014.log +0 -0
  305. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_300.json +0 -0
  306. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_300.log +0 -0
  307. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_301.json +0 -0
  308. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_301.log +0 -0
  309. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_302.json +0 -0
  310. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_302.log +0 -0
  311. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_303.json +0 -0
  312. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_303.log +0 -0
  313. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_304.json +0 -0
  314. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_304.log +0 -0
  315. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_310.json +0 -0
  316. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/schemas/log_files/schema_310.log +0 -0
  317. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  318. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  319. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  320. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  321. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  322. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  323. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  324. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  325. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/config.json +0 -0
  326. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  327. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  328. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_simple/packet.log +0 -0
  329. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_simple/schema.json +0 -0
  330. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  331. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  332. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  333. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  334. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  335. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  336. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  337. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_api_faultlog.py +0 -0
  338. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_api_schedule.py +0 -0
  339. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_apis_binding.py +0 -0
  340. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_apis_common.py +0 -0
  341. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_apis_heat.py +0 -0
  342. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_apis_hvac.py +0 -0
  343. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_cli_utility.py +0 -0
  344. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_devices.py +0 -0
  345. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  346. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_eavesdrop_schema.py +0 -0
  347. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_helpers.py +0 -0
  348. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_parser_helpers.py +0 -0
  349. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_parsers.py +0 -0
  350. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_ramses_schema.py +0 -0
  351. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_schema_bits.py +0 -0
  352. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_schemas.py +0 -0
  353. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests/test_vol_schemas.py +0 -0
  354. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/__init__.py +0 -0
  355. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/configs/config_heat.json +0 -0
  356. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/configs/config_hvac.json +0 -0
  357. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/conftest.py +0 -0
  358. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/device/__init__.py +0 -0
  359. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  360. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_api_faultlog.py +0 -0
  361. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_api_schedule.py +0 -0
  362. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_create_stack.py +0 -0
  363. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  364. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_protocol_fsm.py +0 -0
  365. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/test_use_regex.py +0 -0
  366. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/const.py +0 -0
  367. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  368. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  369. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_tx/__init__.py +0 -0
  370. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/tests_tx/test_command.py +0 -0
  371. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  372. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  373. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  374. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  375. {ramses_rf-0.52.2 → ramses_rf-0.52.4}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  376. {ramses_rf-0.52.2 → 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
@@ -41,7 +41,7 @@ jobs:
41
41
  - name: Install dependencies
42
42
  run: |
43
43
  python -m pip install --upgrade pip
44
- pip install ruff # pip install -r requirements_dev.txt
44
+ pip install ruff # pip install -r requirements/requirements_dev.txt
45
45
 
46
46
  - name: Check with ruff
47
47
  run: ruff check --output-format=github .
@@ -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
@@ -41,7 +41,7 @@ jobs:
41
41
  - name: Install dependencies
42
42
  run: |
43
43
  python -m pip install --upgrade pip
44
- pip install -r requirements_dev.txt
44
+ pip install -r requirements/requirements_dev.txt
45
45
 
46
46
  - name: Install the package (and its dependencies)
47
47
  run: pip install -e .
@@ -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
@@ -41,7 +41,7 @@ jobs:
41
41
  - name: Install dependencies
42
42
  run: |
43
43
  python -m pip install --upgrade pip
44
- pip install -r requirements_dev.txt
44
+ pip install -r requirements/requirements_dev.txt
45
45
 
46
46
  - name: Install the package (its dependencies are needed for typing)
47
47
  run: pip install -e .
@@ -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
@@ -26,7 +26,7 @@ jobs:
26
26
  run: hatch build
27
27
 
28
28
  - name: Upload dist
29
- uses: actions/upload-artifact@v4
29
+ uses: actions/upload-artifact@v5
30
30
  with:
31
31
  name: dist
32
32
  path: dist/
@@ -40,7 +40,7 @@ jobs:
40
40
  url: https://pypi.org/project/ramses_rf
41
41
  steps:
42
42
  - name: Download dist
43
- uses: actions/download-artifact@v5
43
+ uses: actions/download-artifact@v6
44
44
  with:
45
45
  name: dist
46
46
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramses_rf
3
- Version: 0.52.2
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
 
@@ -0,0 +1,159 @@
1
+ # RAMSES RF Binding Process
2
+
3
+ ## Overview
4
+ This diagram shows the binding finite state machine (FSM) for RAMSES RF devices, illustrating the complete process from initial state to binding completion.
5
+
6
+ ## State Machine Diagram
7
+
8
+ ```mermaid
9
+ stateDiagram-v2
10
+ direction LR
11
+ [*] --> DevIsNotBinding
12
+ DevIsNotBinding --> InitiateBindingProcess : initiate_binding_process()
13
+ InitiateBindingProcess --> SuppSendOfferWaitForAccept
14
+ SuppSendOfferWaitForAccept --> OfferSent : _make_offer()
15
+ OfferSent --> SuppSendOfferWaitForAccept : wait_for_accept()
16
+ DevIsNotBinding --> RespIsWaitingForOffer : wait_for_binding_request()
17
+ RespIsWaitingForOffer --> OfferReceived : _wait_for_offer()
18
+ OfferReceived --> RespSendAcceptWaitForConfirm : _accept_offer()
19
+ RespSendAcceptWaitForConfirm --> SuppIsReadyToSendConfirm : wait_for_confirm()
20
+ SuppIsReadyToSendConfirm --> StateDecisionPoint : cast_confirm_accept()
21
+ StateDecisionPoint --> RespHasBoundAsRespondent : No addenda
22
+ StateDecisionPoint --> SuppHasBoundAsSupplicant : Yes addenda / Complete
23
+ RespHasBoundAsRespondent --> DevIsNotBinding
24
+ SuppHasBoundAsSupplicant --> DevIsNotBinding
25
+ DevIsNotBinding --> [*] : Binding Complete
26
+
27
+ subgraph Supplicant Role
28
+ SuppSendOfferWaitForAccept
29
+ OfferSent
30
+ SuppIsReadyToSendConfirm
31
+ SuppHasBoundAsSupplicant
32
+ end
33
+
34
+ subgraph Respondent Role
35
+ RespIsWaitingForOffer
36
+ OfferReceived
37
+ RespSendAcceptWaitForConfirm
38
+ RespHasBoundAsRespondent
39
+ end
40
+
41
+ classDef supplicant fill:#ff64dd,stroke:#ffffff,stroke-width:2px
42
+ classDef respondent fill:#55bb8B,stroke:#ffffff,stroke-width:2px
43
+
44
+ class SuppSendOfferWaitForAccept,OfferSent,SuppIsReadyToSendConfirm,SuppHasBoundAsSupplicant supplicant
45
+ class RespIsWaitingForOffer,OfferReceived,RespSendAcceptWaitForConfirm,RespHasBoundAsRespondent respondent
46
+ class Supplicant Role supplicant
47
+ class Respondent Role respondent
48
+
49
+ note right of DevIsNotBinding
50
+ Not binding<br/>Ready to start
51
+ end note
52
+
53
+ note right of SuppSendOfferWaitForAccept
54
+ Made Offer<br/>Waiting for Accept
55
+ end note
56
+
57
+ note right of RespIsWaitingForOffer
58
+ Waiting for Offer
59
+ end note
60
+
61
+ note right of RespSendAcceptWaitForConfirm
62
+ Sent Accept<br/>Waiting for Confirm
63
+ end note
64
+
65
+ note right of SuppIsReadyToSendConfirm
66
+ Received Accept<br/>Ready to send Confirm
67
+ end note
68
+
69
+ note right of StateDecisionPoint
70
+ If addenda: SendAddenda<br/>If no addenda: Complete
71
+ end note
72
+
73
+ note right of RespHasBoundAsRespondent
74
+ Binding Complete
75
+ end note
76
+
77
+ note right of SuppHasBoundAsSupplicant
78
+ Binding Complete<br/>Nothing more to do
79
+ end note
80
+ ```
81
+
82
+ ## Method Flow by Role
83
+
84
+ ### Supplicant Flow (Device initiating binding)
85
+ ```python
86
+ async def initiate_binding_process(self, offer_codes, confirm_code=None, ratify_cmd=None):
87
+ 1. _make_offer(offer_codes, oem_code) # Send Offer packet
88
+ 2. _wait_for_accept(tender) # Wait for Accept response
89
+ 3. _confirm_accept(accept, confirm_code) # Send Confirm packet
90
+ 4. _cast_addenda(accept, ratify_cmd) # Optional: Send Addenda
91
+
92
+ # Result: SuppHasBoundAsSupplicant state
93
+ ```
94
+
95
+ ### Respondent Flow (Device responding to binding)
96
+ ```python
97
+ async def wait_for_binding_request(self, accept_codes, idx="00", require_ratify=False):
98
+ 1. _wait_for_offer() # Wait for Offer packet
99
+ 2. _accept_offer(tender, accept_codes, idx) # Send Accept packet
100
+ 3. _wait_for_confirm(accept) # Wait for Confirm packet
101
+ 4. _wait_for_addenda(accept) # Optional: Wait for Addenda
102
+
103
+ # Result: RespHasBoundAsRespondent state
104
+ ```
105
+
106
+ ## State Details
107
+
108
+ | State | Role | Description | Key Methods |
109
+ |-------|------|-------------|-------------|
110
+ | `DevIsNotBinding` | Any | Initial/final state, not participating in binding | - |
111
+ | `RespIsWaitingForOffer` | Respondent | Waiting for binding offer from supplicant | `wait_for_offer()` |
112
+ | `RespSendAcceptWaitForConfirm` | Respondent | Sent Accept, waiting for Confirm | `cast_accept_offer()`, `wait_for_confirm()` |
113
+ | `RespIsWaitingForAddenda` | Respondent | Received Confirm, waiting for optional Addenda | `wait_for_addenda()` |
114
+ | `RespHasBoundAsRespondent` | Respondent | Binding completed successfully | ✅ **NEW LOGGING HERE** |
115
+ | `SuppSendOfferWaitForAccept` | Supplicant | Sent Offer, waiting for Accept | `cast_offer()`, `wait_for_accept()` |
116
+ | `SuppIsReadyToSendConfirm` | Supplicant | Received Accept, ready to send Confirm | `cast_confirm_accept()` |
117
+ | `SuppIsReadyToSendAddenda` | Supplicant | Sent Confirm, ready to send Addenda | `cast_addenda()` |
118
+ | `SuppHasBoundAsSupplicant` | Supplicant | Binding completed successfully | ✅ **NEW LOGGING HERE** |
119
+ | `DevHasFailedBinding` | Any | Binding failed, error state | - |
120
+
121
+ ## Binding Phases (Packet Types)
122
+
123
+ | Phase | Packet Type | Description | Direction |
124
+ |-------|-------------|-------------|-----------|
125
+ | `TENDER` | `1FC9` (I_) | Offer phase - initial binding proposal | Supplicant → Respondent |
126
+ | `ACCEPT` | `1FC9` (W_) | Accept phase - acceptance of offer | Respondent → Supplicant |
127
+ | `AFFIRM` | `1FC9` (I_) | Confirm phase - confirmation of acceptance | Supplicant → Respondent |
128
+ | `RATIFY` | `10E0` (I_) | Addenda phase - optional additional binding info | Either direction |
129
+
130
+ ## New Logging Implementation
131
+
132
+ The following log.info statements have been added at binding completion points:
133
+
134
+ ### 1. Constructor Logging (Immediate Confirmation)
135
+ - **`RespHasBoundAsRespondent.__init__()`**: Logs when respondent binding completes
136
+ - **`SuppHasBoundAsSupplicant.__init__()`**: Logs when supplicant binding completes
137
+
138
+ ### 2. State Transition Logging (Complete Flow)
139
+ - **`BindContextBase.set_state()`**: Logs the complete state transition to bound states, including:
140
+ - Previous state name
141
+ - New bound state name
142
+ - Final role (respondent/supplicant)
143
+
144
+ ## Example Log Output
145
+ ```
146
+ INFO:ramses_rf.binding_fsm:32:123456: Binding completed as respondent
147
+ INFO:ramses_rf.binding_fsm:37:789012: Binding completed as supplicant
148
+ INFO:ramses_rf.binding_fsm:32:123456: Binding process completed: RespSendAcceptWaitForConfirm -> RespHasBoundAsRespondent (role: BindRole.RESPONDENT)
149
+ ```
150
+
151
+ ## Error Handling
152
+ - **Timeout**: Binding fails if expected packets not received within timeout periods
153
+ - **Retry Limits**: Automatic failure after retry limits exceeded
154
+ - **Exception**: `BindingFlowFailed` raised on binding errors
155
+
156
+ ## Configuration Constants
157
+ - `CONFIRM_RETRY_LIMIT`: 3 (automatic binding after this many confirm sends)
158
+ - `CONFIRM_TIMEOUT_SECS`: 3 (automatic binding after this many seconds)
159
+ - `WAITING_TIMEOUT_SECS`: 5 (fail if no packet received within this time)
@@ -36,6 +36,7 @@ extensions = [
36
36
  "sphinx.ext.githubpages",
37
37
  "sphinx_design",
38
38
  "myst_parser", # to use Markdown inside reST
39
+ "sphinxcontrib.mermaid", # to show mermaid diagrams in docs
39
40
  ]
40
41
  pygments_style = "sphinx" # enable syntax highlighting
41
42
 
@@ -72,3 +73,4 @@ autosummary_generate_overwrite = True
72
73
  # Myst
73
74
  myst_enable_extensions = ["colon_fence"]
74
75
  myst_heading_anchors = 4
76
+ myst_fence_as_directive = ["mermaid"]
@@ -11,6 +11,7 @@ ramses_rf
11
11
 
12
12
  usage
13
13
  glossary
14
+ binding_process
14
15
 
15
16
  .. toctree::
16
17
  :maxdepth: 2
@@ -15,7 +15,7 @@ MyST [markup](https://myst-parser.readthedocs.io/en/latest/syntax/organising_con
15
15
 
16
16
  - Activate your virtual environment for ramses_rf as described in the [Wiki](https://github.com/ramses-rf/ramses_rf/blob/master/README-developers.md).
17
17
 
18
- - Install the extra required dependencies by running ``pip install -r requirements_docs.txt`` so you can build a local set.
18
+ - Install the extra required dependencies by running ``pip install -r requirements/requirements_docs.txt`` so you can build a local set.
19
19
 
20
20
  - Then, in a Terminal, enter `cd docs/` and run `sphinx-build -b html source build/html`.
21
21
 
@@ -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 #############################################################################
@@ -178,6 +178,8 @@ class BindContextBase:
178
178
  self, state: type[BindStateBase], result: asyncio.Future[Message] | None = None
179
179
  ) -> None:
180
180
  """Transition the State of the Context, and process the result, if any."""
181
+ # Ensure prev_state is always available, not only during debugging
182
+ prev_state = self._state
181
183
 
182
184
  # if False and result:
183
185
  # try:
@@ -185,10 +187,6 @@ class BindContextBase:
185
187
  # except exc.BindingError as err:
186
188
  # self._fut.set_result(err)
187
189
 
188
- if _DBG_MAINTAIN_STATE_CHAIN: # HACK for debugging
189
- # if prev_state in (None, )
190
- prev_state = self._state
191
-
192
190
  self._state = state(self)
193
191
  if not self.is_binding:
194
192
  self._is_respondent = None
@@ -197,6 +195,14 @@ class BindContextBase:
197
195
  elif state is SuppSendOfferWaitForAccept:
198
196
  self._is_respondent = False
199
197
 
198
+ # Log binding completion transitions
199
+ if isinstance(
200
+ self._state, (RespHasBoundAsRespondent, SuppHasBoundAsSupplicant)
201
+ ):
202
+ _LOGGER.info(
203
+ f"{self._dev.id}: Binding process completed: {type(prev_state).__name__} -> {state.__name__} (role: {self.role})"
204
+ )
205
+
200
206
  if _DBG_MAINTAIN_STATE_CHAIN: # HACK for debugging
201
207
  setattr(self._state, "_prev_state", prev_state) # noqa: B010
202
208
 
@@ -663,6 +669,10 @@ class RespHasBoundAsRespondent(BindStateBase):
663
669
 
664
670
  _attr_role = BindRole.IS_DORMANT
665
671
 
672
+ def __init__(self, context: BindContextBase) -> None:
673
+ super().__init__(context)
674
+ _LOGGER.info(f"{context._dev.id}: Binding completed as respondent")
675
+
666
676
 
667
677
  class RespIsWaitingForAddenda(_DevIsWaitingForMsg, BindStateBase):
668
678
  """Respondent has received a Confirm & is waiting for an Addenda."""
@@ -715,6 +725,10 @@ class SuppHasBoundAsSupplicant(BindStateBase):
715
725
 
716
726
  _attr_role = BindRole.IS_DORMANT
717
727
 
728
+ def __init__(self, context: BindContextBase) -> None:
729
+ super().__init__(context)
730
+ _LOGGER.info(f"{context._dev.id}: Binding completed as supplicant")
731
+
718
732
 
719
733
  class SuppIsReadyToSendAddenda(
720
734
  _DevIsReadyToSendCmd, BindStateBase
@@ -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
@@ -334,7 +338,7 @@ class MessageIndex:
334
338
  payload_keys(msg.payload),
335
339
  ),
336
340
  )
337
- _LOGGER.debug(f"Added {msg} to gwy.msg_db")
341
+ # _LOGGER.debug(f"Added {msg} to gwy.msg_db")
338
342
 
339
343
  return _old_msgs[0] if _old_msgs else None
340
344
 
@@ -435,7 +439,7 @@ class MessageIndex:
435
439
 
436
440
  def qry_dtms(self, **kwargs: bool | dt | str) -> list[Any]:
437
441
  """
438
- Select from the ImageIndex a list of dtms that match the provided arguments.
442
+ Select from the MessageIndex a list of dtms that match the provided arguments.
439
443
 
440
444
  :param kwargs: data table field names and criteria
441
445
  :return: list of unformatted dtms that match, useful for msg lookup, or an empty list if 0 matches
@@ -120,7 +120,7 @@ _LOGGER = logging.getLogger(__name__)
120
120
 
121
121
  class Actuator(DeviceHeat): # 3EF0, 3EF1 (for 10:/13:)
122
122
  # .I --- 13:109598 --:------ 13:109598 3EF0 003 00C8FF # event-driven, 00/C8
123
- # RP --- 13:109598 18:002563 --:------ 0008 002 00C8 # 00/C8, as abobe
123
+ # RP --- 13:109598 18:002563 --:------ 0008 002 00C8 # 00/C8, as above
124
124
  # RP --- 13:109598 18:002563 --:------ 3EF1 007 0000BF-00BFC8FF # 00/C8, as above
125
125
 
126
126
  # RP --- 10:048122 18:140805 --:------ 3EF1 007 007FFF-003C2A10 # 10:s only RP, always 7FFF
@@ -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
@@ -668,11 +668,8 @@ 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
- # should fix src/ramses_rf/database.py _add_record try/except when activating next line
672
671
  if self._gwy.msg_db:
673
- self._add_record(
674
- address=self.addr, code=Code._3220, verb="RP"
675
- ) # << essential?
672
+ self._add_record(address=self.addr, code=Code._3220, verb="RP")
676
673
  # adds a "sim" RP opentherm_msg to the SQLite MessageIndex with code _3220
677
674
  # causes exc when fetching ALL, when no "real" msg was added to _msgs_. We skip those.
678
675
  else:
@@ -1411,7 +1408,7 @@ class UfhCircuit(Child, Entity): # FIXME
1411
1408
  def __init__(self, ufc: UfhController, ufh_idx: str) -> None:
1412
1409
  super().__init__(ufc._gwy)
1413
1410
 
1414
- # FIXME: ZZZ entities must know their parent device ID and their own idx
1411
+ # FIXME: gwy.msg_db entities must know their parent device ID and their own idx
1415
1412
  self._z_id = ufc.id
1416
1413
  self._z_idx = ufh_idx
1417
1414