ramses-rf 0.52.3__tar.gz → 0.52.5__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.5/.github/workflows/check-cov.yml +131 -0
  2. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-lint.yml +1 -1
  3. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-test.yml +1 -1
  4. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/check-type.yml +1 -1
  5. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/workflows/publish-hatch.yml +3 -3
  6. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/PKG-INFO +2 -1
  7. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/README.md +1 -0
  8. ramses_rf-0.52.3/docs/source/binding_process_diagram.md → ramses_rf-0.52.5/docs/source/binding_process.md +3 -3
  9. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/index.rst +1 -1
  10. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/pyproject.toml +38 -0
  11. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/client.py +1 -0
  12. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/debug.py +1 -1
  13. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/utils/convert.py +2 -2
  14. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/database.py +47 -20
  15. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/base.py +14 -3
  16. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/heat.py +2 -2
  17. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/hvac.py +24 -21
  18. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/entity_base.py +70 -29
  19. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/gateway.py +30 -19
  20. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/schemas.py +1 -1
  21. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/heat.py +1 -1
  22. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/zones.py +22 -2
  23. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/version.py +1 -1
  24. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/address.py +21 -6
  25. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/command.py +18 -2
  26. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/const.py +1 -1
  27. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/helpers.py +30 -10
  28. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/message.py +11 -5
  29. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/packet.py +13 -5
  30. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/parsers.py +1096 -28
  31. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/protocol.py +95 -20
  32. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/ramses.py +9 -5
  33. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/transport.py +31 -6
  34. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/version.py +1 -1
  35. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements.txt +1 -1
  36. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements_dev.txt +6 -6
  37. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/requirements/requirements_docs.txt +3 -2
  38. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/helpers.py +4 -1
  39. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_01ff_wip.log +2 -1
  40. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22d0.log +2 -1
  41. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e04.log +1 -0
  42. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_heat.py +3 -3
  43. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_schemas.py +2 -1
  44. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/device/test_hvac_ventilator.py +54 -0
  45. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_binding_fsm.py +1 -1
  46. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_database.py +9 -0
  47. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_dispatcher.py +2 -0
  48. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_entity_base.py +6 -0
  49. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_protocol_fsm.py +3 -0
  50. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_virt_network.py +7 -2
  51. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/__init__.py +3 -1
  52. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  53. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.github/dependabot.yml +0 -0
  54. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.gitignore +0 -0
  55. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/.pre-commit-config.yaml +0 -0
  56. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/LICENSE +0 -0
  57. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/README-developers.md +0 -0
  58. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/client.py +0 -0
  59. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/Makefile +0 -0
  60. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/make.bat +0 -0
  61. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/_static/ramses_rf_logo.png +0 -0
  62. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/conf.py +0 -0
  63. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/glossary.rst +0 -0
  64. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/modules.rst +0 -0
  65. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_cli.rst +0 -0
  66. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.device.rst +0 -0
  67. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.rst +0 -0
  68. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_rf.system.rst +0 -0
  69. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/ramses_tx.rst +0 -0
  70. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/docs/source/usage.md +0 -0
  71. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/2411_parser.py +0 -0
  72. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/fingerprints.log +0 -0
  73. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ser2net.yaml +0 -0
  74. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ti_3410/notes.sh +0 -0
  75. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/misc/ti_3410/ti_3410.fw +0 -0
  76. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/__init__.py +0 -0
  77. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/discovery.py +0 -0
  78. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_cli/utils/cat_slow.py +0 -0
  79. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/__init__.py +0 -0
  80. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/binding_fsm.py +0 -0
  81. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/const.py +0 -0
  82. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/device/__init__.py +0 -0
  83. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/dispatcher.py +0 -0
  84. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/exceptions.py +0 -0
  85. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/helpers.py +0 -0
  86. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/py.typed +0 -0
  87. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/__init__.py +0 -0
  88. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/faultlog.py +0 -0
  89. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_rf/system/schedule.py +0 -0
  90. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/__init__.py +0 -0
  91. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/exceptions.py +0 -0
  92. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/fingerprints.py +0 -0
  93. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/frame.py +0 -0
  94. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/gateway.py +0 -0
  95. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/logger.py +0 -0
  96. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/opentherm.py +0 -0
  97. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/protocol_fsm.py +0 -0
  98. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/py.typed +0 -0
  99. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/schemas.py +0 -0
  100. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/typed_dicts.py +0 -0
  101. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/ramses_tx/typing.py +0 -0
  102. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_apis_mock.py +0 -0
  103. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_mock_faultlog.py +0 -0
  104. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_mock_schedule.py +0 -0
  105. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_packets_bad.py +0 -0
  106. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_performance_WIP.py +0 -0
  107. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/_test_state_mgt.py +0 -0
  108. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/common.py +0 -0
  109. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/__init__.py +0 -0
  110. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/command.py +0 -0
  111. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/const.py +0 -0
  112. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  113. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  114. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/deprecated/mocked_devices/transport.py +0 -0
  115. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/__init__.py +0 -0
  116. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  117. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  118. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  119. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  120. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  121. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  122. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  123. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  124. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  125. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  126. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  127. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  128. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  129. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  130. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  131. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  132. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
  133. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_02.log +0 -0
  134. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_04.log +0 -0
  135. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_10.log +0 -0
  136. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_13.log +0 -0
  137. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/devices/device_22.log +0 -0
  138. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  139. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  140. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  141. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  142. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  143. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  144. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  145. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  146. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  147. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  148. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  149. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  150. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  151. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  152. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  153. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  154. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  155. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  156. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  157. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  158. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  159. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  160. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  161. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  162. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  163. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  164. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  165. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  166. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  167. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  168. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  169. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  170. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  171. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  172. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/_gather.sh +0 -0
  173. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  174. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  175. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  176. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  177. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  178. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  179. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  180. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  181. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  182. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  183. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  184. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  185. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  186. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/20.log +0 -0
  187. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  188. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  189. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  190. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  191. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  192. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  193. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  194. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  195. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  196. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  197. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  198. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  199. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  200. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  201. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  202. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  203. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  204. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  205. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  206. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  207. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  208. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  209. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  210. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  211. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  212. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  213. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  214. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  215. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logger/packet_in.log +0 -0
  216. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logger/packet_out.log +0 -0
  217. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/pkts_bad_000.log +0 -0
  218. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/pkts_tba_000.log +0 -0
  219. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/logs/system_cache.json +0 -0
  220. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  221. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  222. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0001_wip.log +0 -0
  223. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0002.log +0 -0
  224. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0004_wip.log +0 -0
  225. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0005.log +0 -0
  226. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0006.log +0 -0
  227. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0008.log +0 -0
  228. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0009.log +0 -0
  229. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000a.log +0 -0
  230. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000c.log +0 -0
  231. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_000e.log +0 -0
  232. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_0418.log +0 -0
  233. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_042f.log +0 -0
  234. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1030.log +0 -0
  235. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1060.log +0 -0
  236. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_10d0.log +0 -0
  237. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_10e0.log +0 -0
  238. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1260.log +0 -0
  239. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1298.log +0 -0
  240. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_12a0.log +0 -0
  241. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_12c0.log +0 -0
  242. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1300.log +0 -0
  243. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1f09.log +0 -0
  244. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1fc9.log +0 -0
  245. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_1fd4.log +0 -0
  246. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2210.log +0 -0
  247. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22c9.log +0 -0
  248. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22d9.log +0 -0
  249. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e0.log +0 -0
  250. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e5.log +0 -0
  251. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22e9.log +0 -0
  252. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f1.log +0 -0
  253. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f2.log +0 -0
  254. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f3.log +0 -0
  255. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f4.log +0 -0
  256. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_22f7.log +0 -0
  257. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2309.log +0 -0
  258. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2349.log +0 -0
  259. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2411_wip.log +0 -0
  260. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2e04.log +0 -0
  261. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_2e10_wip.log +0 -0
  262. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_30c9.log +0 -0
  263. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3110_wip.log +0 -0
  264. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3120.log +0 -0
  265. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_313e_wip.log +0 -0
  266. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3150.log +0 -0
  267. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_31d9.log +0 -0
  268. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_31da.log +0 -0
  269. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3200.log +0 -0
  270. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3210.log +0 -0
  271. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3220.log +0 -0
  272. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3222.log +0 -0
  273. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  274. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  275. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e01.log +0 -0
  276. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e02.log +0 -0
  277. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/parsers/code_4e15.log +0 -0
  278. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/_sched_002/packet.log +0 -0
  279. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  280. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_001/packet.log +0 -0
  281. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_001/schedule.json +0 -0
  282. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  283. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  284. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  285. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  286. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  287. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  288. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  289. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  290. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  291. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_000.json +0 -0
  292. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_000.log +0 -0
  293. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_001.json +0 -0
  294. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_001.log +0 -0
  295. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_002.json +0 -0
  296. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_002.log +0 -0
  297. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_010.json +0 -0
  298. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_010.log +0 -0
  299. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_011.json +0 -0
  300. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_011.log +0 -0
  301. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_012.json +0 -0
  302. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_012.log +0 -0
  303. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_013.json +0 -0
  304. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_013.log +0 -0
  305. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_014.json +0 -0
  306. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_014.log +0 -0
  307. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_300.json +0 -0
  308. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_300.log +0 -0
  309. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_301.json +0 -0
  310. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_301.log +0 -0
  311. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_302.json +0 -0
  312. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_302.log +0 -0
  313. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_303.json +0 -0
  314. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_303.log +0 -0
  315. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_304.json +0 -0
  316. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_304.log +0 -0
  317. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_310.json +0 -0
  318. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/schemas/log_files/schema_310.log +0 -0
  319. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  320. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  321. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  322. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  323. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  324. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  325. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  326. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  327. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/config.json +0 -0
  328. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  329. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  330. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_simple/packet.log +0 -0
  331. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_simple/schema.json +0 -0
  332. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  333. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  334. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  335. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  336. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  337. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  338. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  339. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_api_faultlog.py +0 -0
  340. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_api_schedule.py +0 -0
  341. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_binding.py +0 -0
  342. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_common.py +0 -0
  343. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_apis_hvac.py +0 -0
  344. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_cli_utility.py +0 -0
  345. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_devices.py +0 -0
  346. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  347. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_eavesdrop_schema.py +0 -0
  348. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_helpers.py +0 -0
  349. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_parser_helpers.py +0 -0
  350. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_parsers.py +0 -0
  351. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_ramses_schema.py +0 -0
  352. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_schema_bits.py +0 -0
  353. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_systems.py +2 -2
  354. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests/test_vol_schemas.py +0 -0
  355. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/__init__.py +0 -0
  356. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/configs/config_heat.json +0 -0
  357. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/configs/config_hvac.json +0 -0
  358. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/conftest.py +0 -0
  359. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/device/__init__.py +0 -0
  360. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  361. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_api_faultlog.py +0 -0
  362. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_api_schedule.py +0 -0
  363. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_create_stack.py +0 -0
  364. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  365. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/test_use_regex.py +0 -0
  366. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/const.py +0 -0
  367. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  368. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  369. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_tx/__init__.py +0 -0
  370. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/tests_tx/test_command.py +0 -0
  371. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  372. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  373. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  374. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  375. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  376. {ramses_rf-0.52.3 → ramses_rf-0.52.5}/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
@@ -26,7 +26,7 @@ jobs:
26
26
  run: hatch build
27
27
 
28
28
  - name: Upload dist
29
- uses: actions/upload-artifact@v5
29
+ uses: actions/upload-artifact@v6
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@v6
43
+ uses: actions/download-artifact@v7
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.3
3
+ Version: 0.52.5
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 #############################################################################
@@ -588,6 +588,7 @@ def main() -> None:
588
588
  print(" - event_loop_policy set for win32") # do before asyncio.run()
589
589
  asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
590
590
 
591
+ profile = None
591
592
  try:
592
593
  if _PROFILE_LIBRARY:
593
594
  profile = cProfile.Profile()
@@ -9,7 +9,7 @@ DEBUG_PORT = 5678
9
9
 
10
10
 
11
11
  def start_debugging(wait_for_client: bool) -> None:
12
- import debugpy # type: ignore[import-untyped]
12
+ import debugpy
13
13
 
14
14
  debugpy.listen(address=(DEBUG_ADDR, DEBUG_PORT))
15
15
  print(f" - Debugging is enabled, listening on: {DEBUG_ADDR}:{DEBUG_PORT}")
@@ -17,7 +17,7 @@ parser.add_argument("-i", "--input-file", type=argparse.FileType("r"), default="
17
17
  args = parser.parse_args()
18
18
 
19
19
 
20
- def convert_json_to_yaml(data: dict) -> str:
20
+ def convert_json_to_yaml(data: dict) -> None:
21
21
  """Convert from json (client.py -C config.json) to yaml (HA configuration.yaml)."""
22
22
  (config, schema, include, exclude) = load_config("/dev/ttyMOCK", None, **data)
23
23
 
@@ -37,7 +37,7 @@ def convert_json_to_yaml(data: dict) -> str:
37
37
  print(yaml.dump({"ramses_cc": result}, sort_keys=False))
38
38
 
39
39
 
40
- def convert_yaml_to_json(data: dict) -> str:
40
+ def convert_yaml_to_json(data: dict) -> None:
41
41
  """Convert from yaml (HA configuration.yaml) to json (client.py -C config.json)."""
42
42
 
43
43
  result = data["ramses_cc"]
@@ -30,7 +30,7 @@ from collections import OrderedDict
30
30
  from datetime import datetime as dt, timedelta as td
31
31
  from typing import TYPE_CHECKING, Any, NewType
32
32
 
33
- from ramses_tx import CODES_SCHEMA, Code, Message
33
+ from ramses_tx import CODES_SCHEMA, RQ, Code, Message, Packet
34
34
 
35
35
  if TYPE_CHECKING:
36
36
  DtmStrT = NewType("DtmStrT", str)
@@ -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:
@@ -151,7 +155,7 @@ class MessageIndex:
151
155
  - verb " I", "RQ" etc.
152
156
  - src message origin address
153
157
  - dst message destination address
154
- - code packet code aka command class e.g. _0005, _31DA
158
+ - code packet code aka command class e.g. 0005, 31DA
155
159
  - ctx message context, created from payload as index + extra markers (Heat)
156
160
  - hdr packet header e.g. 000C|RP|01:223036|0208 (see: src/ramses_tx/frame.py)
157
161
  - plk the keys stored in the parsed payload, separated by the | char
@@ -183,7 +187,7 @@ class MessageIndex:
183
187
 
184
188
  async def _housekeeping_loop(self) -> None:
185
189
  """Periodically remove stale messages from the index,
186
- unless `self.maintain` is False."""
190
+ unless `self.maintain` is False - as in (most) tests."""
187
191
 
188
192
  async def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
189
193
  """
@@ -191,9 +195,10 @@ class MessageIndex:
191
195
  :param dt_now: current timestamp
192
196
  :param _cutoff: the oldest timestamp to retain, default is 24 hours ago
193
197
  """
194
- dtm = dt_now - _cutoff # .isoformat(timespec="microseconds") < needed?
198
+ msgs = None
199
+ dtm = dt_now - _cutoff
195
200
 
196
- self._cu.execute("SELECT dtm FROM messages WHERE dtm => ?", (dtm,))
201
+ self._cu.execute("SELECT dtm FROM messages WHERE dtm >= ?", (dtm,))
197
202
  rows = self._cu.fetchall() # fetch dtm of current messages to retain
198
203
 
199
204
  try: # make this operation atomic, i.e. update self._msgs only on success
@@ -208,6 +213,10 @@ class MessageIndex:
208
213
  self._msgs = msgs
209
214
  finally:
210
215
  self._lock.release()
216
+ if msgs:
217
+ _LOGGER.debug(
218
+ "MessageIndex size was: %d, now: %d", len(rows), len(msgs)
219
+ )
211
220
 
212
221
  while True:
213
222
  self._last_housekeeping = dt.now()
@@ -242,13 +251,17 @@ class MessageIndex:
242
251
  else:
243
252
  # _msgs dict requires a timestamp reformat
244
253
  dtm: DtmStrT = msg.dtm.isoformat(timespec="microseconds") # type: ignore[assignment]
254
+ # add msg to self._msgs dict
245
255
  self._msgs[dtm] = msg
246
256
 
247
257
  finally:
248
258
  pass # self._lock.release()
249
259
 
250
260
  if (
251
- dup and msg.src is not msg.dst and not msg.dst.id.startswith("18:") # HGI
261
+ dup
262
+ and (msg.src is not msg.dst)
263
+ and not msg.dst.id.startswith("18:") # HGI
264
+ and msg.verb != RQ # these may come very quickly
252
265
  ): # when src==dst, expect to add duplicate, don't warn
253
266
  _LOGGER.debug(
254
267
  "Overwrote dtm (%s) for %s: %s (contrived log?)",
@@ -256,8 +269,6 @@ class MessageIndex:
256
269
  msg._pkt._hdr,
257
270
  dup[0]._pkt,
258
271
  )
259
- if old is not None:
260
- _LOGGER.debug("Old msg replaced: %s", old)
261
272
 
262
273
  return old
263
274
 
@@ -270,7 +281,8 @@ class MessageIndex:
270
281
  :param verb: two letter verb str to use
271
282
  """
272
283
  # Used by OtbGateway init, via entity_base.py
273
- dtm: DtmStrT = dt.strftime(dt.now(), "%Y-%m-%dT%H:%M:%S") # type: ignore[assignment]
284
+ _now: dt = dt.now()
285
+ dtm: DtmStrT = _now.isoformat(timespec="microseconds") # type: ignore[assignment]
274
286
  hdr = f"{code}|{verb}|{src}|00" # dummy record has no contents
275
287
 
276
288
  dup = self._delete_from(hdr=hdr)
@@ -283,7 +295,7 @@ class MessageIndex:
283
295
  self._cu.execute(
284
296
  sql,
285
297
  (
286
- dtm,
298
+ _now,
287
299
  verb,
288
300
  src,
289
301
  src,
@@ -295,6 +307,14 @@ class MessageIndex:
295
307
  )
296
308
  except sqlite3.Error:
297
309
  self._cx.rollback()
310
+ else:
311
+ # also add dummy 3220 msg to self._msgs dict to allow maintenance loop
312
+ msg: Message = Message._from_pkt(
313
+ Packet(
314
+ _now, f"... {verb} --- {src} --:------ {src} {code} 005 0000000000"
315
+ )
316
+ )
317
+ self._msgs[dtm] = msg
298
318
 
299
319
  if dup: # expected when more than one heat system in schema
300
320
  _LOGGER.debug("Replaced record with same hdr: %s", hdr)
@@ -355,7 +375,7 @@ class MessageIndex:
355
375
  if not bool(msg) ^ bool(kwargs):
356
376
  raise ValueError("Either a Message or kwargs should be provided, not both")
357
377
  if msg:
358
- kwargs["dtm"] = msg.dtm # .isoformat(timespec="microseconds")
378
+ kwargs["dtm"] = msg.dtm
359
379
 
360
380
  msgs = None
361
381
  try: # make this operation atomic, i.e. update self._msgs only on success
@@ -406,7 +426,7 @@ class MessageIndex:
406
426
  raise ValueError("Either a Message or kwargs should be provided, not both")
407
427
 
408
428
  if msg:
409
- kwargs["dtm"] = msg.dtm # .isoformat(timespec="microseconds")
429
+ kwargs["dtm"] = msg.dtm
410
430
 
411
431
  return self._select_from(**kwargs)
412
432
 
@@ -428,10 +448,15 @@ class MessageIndex:
428
448
  :returns: a tuple of qualifying messages
429
449
  """
430
450
 
431
- return tuple(
432
- self._msgs[row[0].isoformat(timespec="microseconds")]
433
- for row in self.qry_dtms(**kwargs)
434
- )
451
+ # CHANGE: Use a list comprehension with a check to avoid KeyError
452
+ res: list[Message] = []
453
+ for row in self.qry_dtms(**kwargs):
454
+ ts: DtmStrT = row[0].isoformat(timespec="microseconds")
455
+ if ts in self._msgs:
456
+ res.append(self._msgs[ts])
457
+ else:
458
+ _LOGGER.debug("MessageIndex timestamp %s not in device messages", ts)
459
+ return tuple(res)
435
460
 
436
461
  def qry_dtms(self, **kwargs: bool | dt | str) -> list[Any]:
437
462
  """
@@ -483,6 +508,7 @@ class MessageIndex:
483
508
  # _msgs stamp format: 2022-09-08T13:40:52.447364
484
509
  if ts in self._msgs:
485
510
  lst.append(self._msgs[ts])
511
+ # _LOGGER.debug("MessageIndex ts %s added to qry.lst", ts) # too frequent
486
512
  else: # happens in tests with artificial msg from heat
487
513
  _LOGGER.info("MessageIndex timestamp %s not in device messages", ts)
488
514
  return tuple(lst)
@@ -546,8 +572,9 @@ class MessageIndex:
546
572
  if ts in self._msgs:
547
573
  # if include_expired or not self._msgs[ts].HAS_EXPIRED: # not working
548
574
  lst.append(self._msgs[ts])
549
- else: # happens in tests with dummy msg from heat init
550
- _LOGGER.info("MessageIndex ts %s not in device messages", ts)
575
+ _LOGGER.debug("MessageIndex ts %s added to all.lst", ts)
576
+ else: # happens in tests and real evohome setups with dummy msg from heat init
577
+ _LOGGER.debug("MessageIndex ts %s not in device messages", ts)
551
578
  return tuple(lst)
552
579
 
553
580
  def clr(self) -> None:
@@ -87,9 +87,10 @@ class DeviceBase(Entity):
87
87
  return self.id < other.id # type: ignore[no-any-return]
88
88
 
89
89
  def _update_traits(self, **traits: Any) -> None:
90
- """Update a device with new schema attrs.
90
+ """Update a device with new schema attributes.
91
91
 
92
- Raise an exception if the new schema is not a superset of the existing schema.
92
+ :param traits: The traits to apply (e.g., alias, class, faked)
93
+ :raises TypeError: If the device is not fakeable but 'faked' is set.
93
94
  """
94
95
 
95
96
  traits = shrink(SCH_TRAITS(traits))
@@ -342,7 +343,17 @@ class Fakeable(DeviceBase):
342
343
  idx: IndexT = "00",
343
344
  require_ratify: bool = False,
344
345
  ) -> tuple[Packet, Packet, Packet, Packet | None]:
345
- """Listen for a binding and return the Offer, or raise an exception."""
346
+ """Listen for a binding and return the Offer packets.
347
+
348
+ :param accept_codes: The codes allowed for this binding
349
+ :type accept_codes: Iterable[Code]
350
+ :param idx: The index to bind to, defaults to "00"
351
+ :type idx: IndexT
352
+ :param require_ratify: Whether a ratification step is required, defaults to False
353
+ :type require_ratify: bool
354
+ :return: A tuple of the four binding transaction packets
355
+ :rtype: tuple[Packet, Packet, Packet, Packet | None]
356
+ """
346
357
 
347
358
  if not self._bind_context:
348
359
  raise TypeError(f"{self}: Faking not enabled")
@@ -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
@@ -669,7 +669,7 @@ class OtbGateway(Actuator, HeatDemand): # OTB (10): 3220 (22D9, others)
669
669
 
670
670
  # TODO(eb): cleanup
671
671
  if self._gwy.msg_db:
672
- self._add_record(address=self.addr, code=Code._3220, verb="RP")
672
+ self._add_record(id=self.id, code=Code._3220, verb="RP")
673
673
  # adds a "sim" RP opentherm_msg to the SQLite MessageIndex with code _3220
674
674
  # causes exc when fetching ALL, when no "real" msg was added to _msgs_. We skip those.
675
675
  else:
@@ -921,27 +921,30 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A], 2411
921
921
 
922
922
  :return: string describing fan mode, speed
923
923
  """
924
- if self._gwy.msg_db:
925
- # Use SQLite query on MessageIndex. res_rate/res_mode not exposed yet
926
- sql = f"""
927
- SELECT code from messages WHERE verb in (' I', 'RP')
928
- AND (src = ? OR dst = ?)
929
- AND (plk LIKE '%{SZ_FAN_MODE}%')
930
- """
931
- res_mode: list = self._msg_qry(sql)
932
- # SQLite query on MessageIndex
933
- _LOGGER.debug(f"{res_mode} # FAN_MODE FETCHED from MessageIndex")
934
-
935
- sql = f"""
936
- SELECT code from messages WHERE verb in (' I', 'RP')
937
- AND (src = ? OR dst = ?)
938
- AND (plk LIKE '%{SZ_FAN_RATE}%')
939
- """
940
- res_rate: list = self._msg_qry(sql)
941
- # SQLite query on MessageIndex
942
- _LOGGER.debug(
943
- f"{res_rate} # FAN_RATE FETCHED from MessageIndex"
944
- ) # DEBUG always empty?
924
+ # if self._gwy.msg_db:
925
+ # Use SQLite query on MessageIndex. res_rate/res_mode not exposed yet
926
+ # working fine in 0.52.4, no need to specify code, only payload key
927
+ # sql = f"""
928
+ # SELECT code from messages WHERE verb in (' I', 'RP')
929
+ # AND (src = ? OR dst = ?)
930
+ # AND (plk LIKE '%{SZ_FAN_MODE}%')
931
+ # """
932
+ # res_mode: list = self._msg_qry(sql)
933
+ # # SQLite query on MessageIndex
934
+ # _LOGGER.debug(
935
+ # f"# Fetched FAN_MODE for {self.id} from MessageIndex: {res_mode}"
936
+ # )
937
+
938
+ # sql = f"""
939
+ # SELECT code from messages WHERE verb in (' I', 'RP')
940
+ # AND (src = ? OR dst = ?)
941
+ # AND (plk LIKE '%{SZ_FAN_RATE}%')
942
+ # """
943
+ # res_rate: list = self._msg_qry(sql)
944
+ # # SQLite query on MessageIndex
945
+ # _LOGGER.debug(
946
+ # f"# Fetched FAN_RATE for {self.id} from MessageIndex: {res_rate}"
947
+ # )
945
948
 
946
949
  if Code._31D9 in self._msgs:
947
950
  # was a dict by Code