ramses-rf 0.51.5__tar.gz → 0.51.6__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 (354) hide show
  1. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/workflows/check-lint.yml +1 -1
  2. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/workflows/check-test.yml +1 -1
  3. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/workflows/check-type.yml +1 -1
  4. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/PKG-INFO +2 -2
  5. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/README.md +1 -1
  6. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/client.py +0 -1
  7. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/database.py +39 -24
  8. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/device/base.py +2 -2
  9. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/device/hvac.py +5 -4
  10. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/dispatcher.py +2 -2
  11. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/entity_base.py +28 -37
  12. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/gateway.py +8 -16
  13. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/system/zones.py +4 -2
  14. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/version.py +1 -1
  15. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/__init__.py +1 -1
  16. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/address.py +1 -1
  17. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/command.py +111 -3
  18. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/const.py +1 -1
  19. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/gateway.py +1 -1
  20. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/helpers.py +63 -24
  21. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/logger.py +26 -23
  22. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/message.py +1 -1
  23. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/parsers.py +6 -2
  24. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/ramses.py +3 -1
  25. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/typed_dicts.py +3 -2
  26. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/version.py +1 -1
  27. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_packets_bad.py +3 -3
  28. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/helpers.py +4 -4
  29. ramses_rf-0.51.6/tests/tests/parsers/code_1fd4.log +3 -0
  30. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3110_wip.log +1 -1
  31. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3120.log +6 -3
  32. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_31da.log +112 -112
  33. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3ef0_wip.log +4 -0
  34. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_apis_binding.py +1 -1
  35. ramses_rf-0.51.6/tests/tests/test_apis_hvac.py +358 -0
  36. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_eavesdrop_dev_class.py +15 -14
  37. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_eavesdrop_schema.py +6 -6
  38. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_schemas.py +4 -4
  39. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_systems.py +1 -1
  40. ramses_rf-0.51.5/tests/tests/test_apis_hvac.py +0 -180
  41. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  42. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/dependabot.yml +0 -0
  43. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.github/workflows/publish-hatch.yml +0 -0
  44. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.gitignore +0 -0
  45. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/.pre-commit-config.yaml +0 -0
  46. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/LICENSE +0 -0
  47. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/README-developers.md +0 -0
  48. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/client.py +0 -0
  49. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/misc/fingerprints.log +0 -0
  50. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/misc/ser2net.yaml +0 -0
  51. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/misc/ti_3410/notes.sh +0 -0
  52. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/misc/ti_3410/ti_3410.fw +0 -0
  53. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/pyproject.toml +0 -0
  54. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/__init__.py +0 -0
  55. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/debug.py +0 -0
  56. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/discovery.py +0 -0
  57. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/utils/cat_slow.py +0 -0
  58. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_cli/utils/convert.py +0 -0
  59. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/__init__.py +0 -0
  60. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/binding_fsm.py +0 -0
  61. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/const.py +0 -0
  62. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/device/__init__.py +0 -0
  63. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/device/heat.py +0 -0
  64. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/exceptions.py +0 -0
  65. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/helpers.py +0 -0
  66. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/py.typed +0 -0
  67. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/schemas.py +0 -0
  68. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/system/__init__.py +0 -0
  69. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/system/faultlog.py +0 -0
  70. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/system/heat.py +0 -0
  71. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_rf/system/schedule.py +0 -0
  72. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/exceptions.py +0 -0
  73. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/fingerprints.py +0 -0
  74. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/frame.py +0 -0
  75. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/opentherm.py +0 -0
  76. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/packet.py +0 -0
  77. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/protocol.py +0 -0
  78. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/protocol_fsm.py +0 -0
  79. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/py.typed +0 -0
  80. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/schemas.py +0 -0
  81. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/transport.py +0 -0
  82. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/ramses_tx/typing.py +0 -0
  83. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/requirements.txt +0 -0
  84. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/requirements_dev.txt +0 -0
  85. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_apis_mock.py +0 -0
  86. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_mock_faultlog.py +0 -0
  87. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_mock_schedule.py +0 -0
  88. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_performance_WIP.py +0 -0
  89. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/_test_state_mgt.py +0 -0
  90. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/common.py +0 -0
  91. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/__init__.py +0 -0
  92. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/command.py +0 -0
  93. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/const.py +0 -0
  94. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  95. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  96. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/deprecated/mocked_devices/transport.py +0 -0
  97. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/__init__.py +0 -0
  98. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  99. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  100. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  101. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  102. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  103. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  104. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  105. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  106. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  107. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  108. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  109. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  110. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  111. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  112. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  113. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  114. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/bindings/hvac/rem_fan_ventura.log +0 -0
  115. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/devices/device_02.log +0 -0
  116. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/devices/device_04.log +0 -0
  117. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/devices/device_10.log +0 -0
  118. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/devices/device_13.log +0 -0
  119. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/devices/device_22.log +0 -0
  120. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  121. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  122. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  123. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  124. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  125. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  126. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  127. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  128. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  129. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  130. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  131. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  132. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  133. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  134. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  135. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  136. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  137. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  138. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  139. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  140. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  141. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  142. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  143. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  144. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  145. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  146. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  147. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  148. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  149. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  150. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  151. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  152. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  153. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  154. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/_gather.sh +0 -0
  155. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  156. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  157. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  158. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  159. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  160. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  161. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  162. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  163. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  164. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  165. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  166. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  167. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  168. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/20.log +0 -0
  169. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  170. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  171. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  172. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  173. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  174. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  175. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  176. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  177. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  178. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  179. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  180. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  181. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  182. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  183. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  184. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  185. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  186. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  187. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  188. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  189. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  190. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  191. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  192. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  193. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  194. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  195. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  196. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  197. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/logger/packet_in.log +0 -0
  198. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/logger/packet_out.log +0 -0
  199. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/logs/pkts_bad_000.log +0 -0
  200. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/logs/pkts_tba_000.log +0 -0
  201. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/logs/system_cache.json +0 -0
  202. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  203. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  204. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0001_wip.log +0 -0
  205. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0002.log +0 -0
  206. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0004_wip.log +0 -0
  207. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0005.log +0 -0
  208. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0006.log +0 -0
  209. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0009.log +0 -0
  210. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_000a.log +0 -0
  211. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_000c.log +0 -0
  212. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_000e.log +0 -0
  213. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_01ff_wip.log +0 -0
  214. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_0418.log +0 -0
  215. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_042f.log +0 -0
  216. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1030.log +0 -0
  217. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1060.log +0 -0
  218. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_10d0.log +0 -0
  219. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_10e0.log +0 -0
  220. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1260.log +0 -0
  221. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1298.log +0 -0
  222. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_12a0.log +0 -0
  223. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_12c0.log +0 -0
  224. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1300.log +0 -0
  225. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1f09.log +0 -0
  226. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_1fc9.log +0 -0
  227. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2210.log +0 -0
  228. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22c9.log +0 -0
  229. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22d0.log +0 -0
  230. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22d9.log +0 -0
  231. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22e0.log +0 -0
  232. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22e5.log +0 -0
  233. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22e9.log +0 -0
  234. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22f1.log +0 -0
  235. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22f2.log +0 -0
  236. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22f3.log +0 -0
  237. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22f4.log +0 -0
  238. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_22f7.log +0 -0
  239. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2309.log +0 -0
  240. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2349.log +0 -0
  241. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2411_wip.log +0 -0
  242. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2e04.log +0 -0
  243. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_2e10_wip.log +0 -0
  244. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_30c9.log +0 -0
  245. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_313e_wip.log +0 -0
  246. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3150.log +0 -0
  247. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_31d9.log +0 -0
  248. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3200.log +0 -0
  249. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3210.log +0 -0
  250. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3220.log +0 -0
  251. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3222.log +0 -0
  252. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  253. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_4e01.log +0 -0
  254. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_4e02.log +0 -0
  255. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_4e04.log +0 -0
  256. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/parsers/code_4e15.log +0 -0
  257. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/_sched_002/packet.log +0 -0
  258. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  259. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/sched_001/packet.log +0 -0
  260. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/sched_001/schedule.json +0 -0
  261. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  262. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  263. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  264. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  265. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  266. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  267. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  268. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  269. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  270. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_000.json +0 -0
  271. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_000.log +0 -0
  272. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_001.json +0 -0
  273. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_001.log +0 -0
  274. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_002.json +0 -0
  275. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_002.log +0 -0
  276. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_010.json +0 -0
  277. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_010.log +0 -0
  278. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_011.json +0 -0
  279. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_011.log +0 -0
  280. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_012.json +0 -0
  281. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_012.log +0 -0
  282. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_013.json +0 -0
  283. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_013.log +0 -0
  284. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_014.json +0 -0
  285. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_014.log +0 -0
  286. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_300.json +0 -0
  287. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_300.log +0 -0
  288. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_301.json +0 -0
  289. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_301.log +0 -0
  290. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_302.json +0 -0
  291. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_302.log +0 -0
  292. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_303.json +0 -0
  293. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_303.log +0 -0
  294. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_304.json +0 -0
  295. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_304.log +0 -0
  296. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_310.json +0 -0
  297. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/schemas/log_files/schema_310.log +0 -0
  298. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  299. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  300. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  301. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  302. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  303. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  304. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  305. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  306. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_otb_00/config.json +0 -0
  307. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  308. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  309. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_simple/packet.log +0 -0
  310. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_simple/schema.json +0 -0
  311. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  312. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  313. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  314. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  315. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  316. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  317. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  318. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_api_faultlog.py +0 -0
  319. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_api_schedule.py +0 -0
  320. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_apis_common.py +0 -0
  321. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_apis_heat.py +0 -0
  322. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_cli_utility.py +0 -0
  323. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_devices.py +0 -0
  324. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_helpers.py +0 -0
  325. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_parser_helpers.py +0 -0
  326. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_parsers.py +0 -0
  327. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_ramses_schema.py +0 -0
  328. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_schema_bits.py +0 -0
  329. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests/test_vol_schemas.py +0 -0
  330. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/__init__.py +0 -0
  331. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/configs/config_heat.json +0 -0
  332. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/configs/config_hvac.json +0 -0
  333. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/conftest.py +0 -0
  334. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  335. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_api_faultlog.py +0 -0
  336. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_api_schedule.py +0 -0
  337. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_binding_fsm.py +0 -0
  338. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_create_stack.py +0 -0
  339. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  340. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_protocol_fsm.py +0 -0
  341. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_use_regex.py +0 -0
  342. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/test_virt_network.py +0 -0
  343. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/virtual_rf/__init__.py +0 -0
  344. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/virtual_rf/const.py +0 -0
  345. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  346. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  347. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_tx/__init__.py +0 -0
  348. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/tests_tx/test_command.py +0 -0
  349. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  350. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  351. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  352. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  353. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  354. {ramses_rf-0.51.5 → ramses_rf-0.51.6}/tests/wip/test_wip_cli.sh +0 -0
@@ -34,7 +34,7 @@ jobs:
34
34
  - uses: actions/checkout@v5
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
- uses: actions/setup-python@v5
37
+ uses: actions/setup-python@v6
38
38
  with:
39
39
  python-version: ${{ matrix.python-version }}
40
40
 
@@ -34,7 +34,7 @@ jobs:
34
34
  - uses: actions/checkout@v5
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
- uses: actions/setup-python@v5
37
+ uses: actions/setup-python@v6
38
38
  with:
39
39
  python-version: ${{ matrix.python-version }}
40
40
 
@@ -34,7 +34,7 @@ jobs:
34
34
  - uses: actions/checkout@v5
35
35
 
36
36
  - name: Set up Python ${{ matrix.python-version }}
37
- uses: actions/setup-python@v5
37
+ uses: actions/setup-python@v6
38
38
  with:
39
39
  python-version: ${{ matrix.python-version }}
40
40
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramses_rf
3
- Version: 0.51.5
3
+ Version: 0.51.6
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
@@ -67,6 +67,6 @@ pip install -e .
67
67
 
68
68
  The CLI is called ``client.py`` and is included in the code root.
69
69
  It has options to monitor and parse Ramses-II traffic to screen or a log file, and to parse a file containing Ramses-II messages to the screen.
70
- See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/The-client.py-command-line) for instructions.
70
+ See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/2.-The-client.py-command-line) for instructions.
71
71
 
72
72
  For code development, some more setup is required. Please follow the steps in our [Developer's Resource](README-developers.md)
@@ -46,6 +46,6 @@ pip install -e .
46
46
 
47
47
  The CLI is called ``client.py`` and is included in the code root.
48
48
  It has options to monitor and parse Ramses-II traffic to screen or a log file, and to parse a file containing Ramses-II messages to the screen.
49
- See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/The-client.py-command-line) for instructions.
49
+ See the [client.py CLI wiki page](https://github.com/ramses-rf/ramses_rf/wiki/2.-The-client.py-command-line) for instructions.
50
50
 
51
51
  For code development, some more setup is required. Please follow the steps in our [Developer's Resource](README-developers.md)
@@ -483,7 +483,6 @@ async def async_main(command: str, lib_kwargs: dict, **kwargs: Any) -> None:
483
483
  print(f"{COLORS.get(msg.verb)}{dtm} {msg}"[:con_cols])
484
484
 
485
485
  serial_port, lib_kwargs = normalise_config(lib_kwargs)
486
- assert isinstance(lib_kwargs.get(SZ_INPUT_FILE), str)
487
486
 
488
487
  if kwargs["restore_schema"]:
489
488
  print(" - restoring client schema from a HA cache...")
@@ -29,6 +29,22 @@ class Params(TypedDict):
29
29
  _LOGGER = logging.getLogger(__name__)
30
30
 
31
31
 
32
+ def _setup_db_adapters() -> None:
33
+ """Set up the database adapters and converters."""
34
+
35
+ def adapt_datetime_iso(val: dt) -> str:
36
+ """Adapt datetime.datetime to timezone-naive ISO 8601 datetime."""
37
+ return val.isoformat(timespec="microseconds")
38
+
39
+ sqlite3.register_adapter(dt, adapt_datetime_iso)
40
+
41
+ def convert_datetime(val: bytes) -> dt:
42
+ """Convert ISO 8601 datetime to datetime.datetime object."""
43
+ return dt.fromisoformat(val.decode())
44
+
45
+ sqlite3.register_converter("dtm", convert_datetime)
46
+
47
+
32
48
  class MessageIndex:
33
49
  """A simple in-memory SQLite3 database for indexing messages."""
34
50
 
@@ -40,7 +56,7 @@ class MessageIndex:
40
56
  self._cx = sqlite3.connect(":memory:") # Connect to a SQLite DB in memory
41
57
  self._cu = self._cx.cursor() # Create a cursor
42
58
 
43
- self._setup_db_adapters() # dtm adapter/converter
59
+ _setup_db_adapters() # dtm adapter/converter
44
60
  self._setup_db_schema()
45
61
 
46
62
  self._lock = asyncio.Lock()
@@ -76,23 +92,19 @@ class MessageIndex:
76
92
  """Return the messages in the index in a threadsafe way."""
77
93
  return self._msgs
78
94
 
79
- def _setup_db_adapters(self) -> None:
80
- """Setup the database adapters and converters."""
81
-
82
- def adapt_datetime_iso(val: dt) -> str:
83
- """Adapt datetime.datetime to timezone-naive ISO 8601 datetime."""
84
- return val.isoformat(timespec="microseconds")
85
-
86
- sqlite3.register_adapter(dt, adapt_datetime_iso)
87
-
88
- def convert_datetime(val: bytes) -> dt:
89
- """Convert ISO 8601 datetime to datetime.datetime object."""
90
- return dt.fromisoformat(val.decode())
95
+ def _setup_db_schema(self) -> None:
96
+ """Set up the message database schema.
91
97
 
92
- sqlite3.register_converter("dtm", convert_datetime)
98
+ Fields:
93
99
 
94
- def _setup_db_schema(self) -> None:
95
- """Setup the dayabase schema."""
100
+ - dtm message timestamp
101
+ - verb _I, RQ etc.
102
+ - src message origin address
103
+ - dst message destination address
104
+ - code packet code aka command class e.g. _0005, _31DA
105
+ - ctx message context, created from payload as index + extra markers (Heat)
106
+ - hdr packet header e.g. 000C|RP|01:223036|0208 (see: src/ramses_tx/frame.py)
107
+ """
96
108
 
97
109
  self._cu.execute(
98
110
  """
@@ -120,14 +132,14 @@ class MessageIndex:
120
132
  async def _housekeeping_loop(self) -> None:
121
133
  """Periodically remove stale messages from the index."""
122
134
 
123
- def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
135
+ async def housekeeping(dt_now: dt, _cutoff: td = td(days=1)) -> None:
124
136
  dtm = (dt_now - _cutoff).isoformat(timespec="microseconds")
125
137
 
126
138
  self._cu.execute("SELECT dtm FROM messages WHERE dtm => ?", (dtm,))
127
139
  rows = self._cu.fetchall()
128
140
 
129
141
  try: # make this operation atomic, i.e. update self._msgs only on success
130
- # await self._lock.acquire()
142
+ await self._lock.acquire()
131
143
  self._cu.execute("DELETE FROM messages WHERE dtm < ?", (dtm,))
132
144
  msgs = OrderedDict({row[0]: self._msgs[row[0]] for row in rows})
133
145
  self._cx.commit()
@@ -137,19 +149,19 @@ class MessageIndex:
137
149
  else:
138
150
  self._msgs = msgs
139
151
  finally:
140
- pass # self._lock.release()
152
+ self._lock.release()
141
153
 
142
154
  while True:
143
155
  self._last_housekeeping = dt.now()
144
156
  await asyncio.sleep(3600)
145
- housekeeping(self._last_housekeeping)
157
+ await housekeeping(self._last_housekeeping)
146
158
 
147
159
  def add(self, msg: Message) -> Message | None:
148
160
  """Add a single message to the index.
149
161
 
150
162
  Returns any message that was removed because it had the same header.
151
163
 
152
- Throws a warning is there is a duplicate dtm.
164
+ Throws a warning if there is a duplicate dtm.
153
165
  """ # TODO: eventually, may be better to use SqlAlchemy
154
166
 
155
167
  dup: tuple[Message, ...] = tuple() # avoid UnboundLocalError
@@ -204,7 +216,9 @@ class MessageIndex:
204
216
 
205
217
  return msgs[0] if msgs else None
206
218
 
207
- def rem(self, msg: Message | None = None, **kwargs: str) -> tuple[Message, ...]:
219
+ def rem(
220
+ self, msg: Message | None = None, **kwargs: str
221
+ ) -> tuple[Message, ...] | None:
208
222
  """Remove a set of message(s) from the index.
209
223
 
210
224
  Returns any messages that were removed.
@@ -215,6 +229,7 @@ class MessageIndex:
215
229
  if msg:
216
230
  kwargs["dtm"] = msg.dtm.isoformat(timespec="microseconds")
217
231
 
232
+ msgs = None
218
233
  try: # make this operation atomic, i.e. update self._msgs only on success
219
234
  # await self._lock.acquire()
220
235
  msgs = self._delete_from(**kwargs)
@@ -277,8 +292,8 @@ class MessageIndex:
277
292
  def all(self, include_expired: bool = False) -> tuple[Message, ...]:
278
293
  """Return all messages from the index."""
279
294
 
280
- # self.cursor.execute("SELECT * FROM messages")
281
- # return [self._megs[row[0]] for row in self.cursor.fetchall()]
295
+ # self._cu.execute("SELECT * FROM messages")
296
+ # return tuple(self._msgs[row[0]] for row in self._cu.fetchall())
282
297
 
283
298
  return tuple(
284
299
  m for m in self._msgs.values() if include_expired or not m._expired
@@ -62,7 +62,7 @@ class DeviceBase(Entity):
62
62
 
63
63
  # FIXME: ZZZ entities must know their parent device ID and their own idx
64
64
  self._z_id = dev_addr.id # the responsible device is itself
65
- self._z_idx = None # depends upon it's location in the schema
65
+ self._z_idx = None # depends upon its location in the schema
66
66
 
67
67
  self.id: DeviceIdT = dev_addr.id
68
68
 
@@ -95,7 +95,7 @@ class DeviceBase(Entity):
95
95
 
96
96
  if traits.get(SZ_FAKED): # class & alias are done elsewhere
97
97
  if not isinstance(self, Fakeable):
98
- raise TypeError(f"Device is not fakable: {self} (traits={traits})")
98
+ raise TypeError(f"Device is not fakeable: {self} (traits={traits})")
99
99
  self._make_fake()
100
100
 
101
101
  self._scheme = traits.get(SZ_SCHEME)
@@ -449,10 +449,10 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
449
449
  def fan_info(self) -> str | None:
450
450
  """
451
451
  Extract fan info description from _31D9 or _31DA message payload, e.g. "speed 2, medium".
452
- By its name, the result is automatically displayed in HA Climate UI.
452
+ By its name, the result is picked up by a sensor in HA Climate UI.
453
453
  Some manufacturers (Orcon, Vasco) include the fan mode (auto, manual), others don't (Itho).
454
454
 
455
- :return: a string describing mode, speed
455
+ :return: a string describing fan mode, speed
456
456
  """
457
457
  if Code._31D9 in self._msgs:
458
458
  # Itho, Vasco D60 and ClimaRad (MiniBox fan) send mode/speed in _31D9
@@ -466,9 +466,10 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
466
466
  @property
467
467
  def indoor_humidity(self) -> float | None:
468
468
  """
469
- Extract humidity value from _12A0 or _31DA JSON message payload
469
+ Extract indoor_humidity from MessageIndex _12A0 or _31DA payload
470
+ Just a demo for SQLite query helper at the moment.
470
471
 
471
- :return: percentage <= 1.0
472
+ :return: float RH value from 0.0 to 1.0 = 100%
472
473
  """
473
474
  if Code._12A0 in self._msgs and isinstance(
474
475
  self._msgs[Code._12A0].payload, list
@@ -268,8 +268,8 @@ def process_msg(gwy: Gateway, msg: Message) -> None:
268
268
 
269
269
  else:
270
270
  logger_xxxx(msg)
271
- if gwy._zzz:
272
- gwy._zzz.add(msg)
271
+ if gwy.msg_db:
272
+ gwy.msg_db.add(msg)
273
273
 
274
274
 
275
275
  # TODO: this needs cleaning up (e.g. handle intervening packet)
@@ -190,7 +190,7 @@ class _MessageDB(_Entity):
190
190
  def __init__(self, gwy: Gateway) -> None:
191
191
  super().__init__(gwy)
192
192
 
193
- self._msgs_: dict[Code, Message] = {} # code, should be code/ctx? ?deprecate
193
+ self._msgs_: dict[Code, Message] = {} # code, should be code/ctx?
194
194
  self._msgz_: dict[
195
195
  Code, dict[VerbT, dict[bool | str | None, Message]]
196
196
  ] = {} # code/verb/ctx, should be code/ctx/verb?
@@ -205,19 +205,19 @@ class _MessageDB(_Entity):
205
205
  ):
206
206
  return # ZZZ: don't store these
207
207
 
208
+ # Store msg by code in flat self._msgs_ Dict (deprecated since 0.50.3)
208
209
  if msg.verb in (I_, RP):
209
210
  self._msgs_[msg.code] = msg
210
211
 
211
212
  if msg.code not in self._msgz_:
213
+ # Store msg verb + ctx by code in nested self._msgz_ Dict (deprecated)
212
214
  self._msgz_[msg.code] = {msg.verb: {msg._pkt._ctx: msg}}
213
215
  elif msg.verb not in self._msgz_[msg.code]:
216
+ # Same, 1 level deeper
214
217
  self._msgz_[msg.code][msg.verb] = {msg._pkt._ctx: msg}
215
- else: # if not self._gwy._zzz:
218
+ else:
219
+ # Same, replacing previous message
216
220
  self._msgz_[msg.code][msg.verb][msg._pkt._ctx] = msg
217
- # elif (
218
- # self._msgz[msg.code][msg.verb][msg._pkt._ctx] is not msg
219
- # ): # MsgIdx ensures this
220
- # assert False # TODO: remove
221
221
 
222
222
  @property
223
223
  def _msg_db(self) -> list[Message]: # flattened version of _msgz[code][verb][indx]
@@ -228,7 +228,7 @@ class _MessageDB(_Entity):
228
228
  - a compound ctx (e.g. 0005/000C/0418)
229
229
  - True (an array of elements, each with its own idx),
230
230
  - False (no idx, is usu. 00),
231
- - None (not deteminable, rare)
231
+ - None (not determinable, rare)
232
232
  """
233
233
  return [m for c in self._msgz.values() for v in c.values() for m in v.values()]
234
234
 
@@ -239,8 +239,8 @@ class _MessageDB(_Entity):
239
239
 
240
240
  obj: _MessageDB
241
241
 
242
- if self._gwy._zzz:
243
- self._gwy._zzz.rem(msg)
242
+ if self._gwy.msg_db: # central SQLite MessageIndex
243
+ self._gwy.msg_db.rem(msg)
244
244
 
245
245
  entities: list[_MessageDB] = []
246
246
  if isinstance(msg.src, Device):
@@ -261,8 +261,8 @@ class _MessageDB(_Entity):
261
261
  def _get_msg_by_hdr(self, hdr: HeaderT) -> Message | None:
262
262
  """Return a msg, if any, that matches a header."""
263
263
 
264
- # if self._gwy._zzz:
265
- # msgs = self._gwy._zzz.get(hdr=hdr)
264
+ # if self._gwy.msg_db: # central SQLite MessageIndex
265
+ # msgs = self._gwy.msg_db.get(hdr=hdr)
266
266
  # return msgs[0] if msgs else None
267
267
 
268
268
  msg: Message
@@ -394,19 +394,29 @@ class _MessageDB(_Entity):
394
394
 
395
395
  @property
396
396
  def _msgs(self) -> dict[Code, Message]:
397
- if not self._gwy._zzz:
397
+ """
398
+ Get a flat Dict af all I/RP messages logged with this device as src or dst.
399
+
400
+ :return: nested Dict of messages by Code
401
+ """
402
+ if not self._gwy.msg_db: # no central SQLite MessageIndex
398
403
  return self._msgs_
399
404
 
400
405
  sql = """
401
406
  SELECT dtm from messages WHERE verb in (' I', 'RP') AND (src = ? OR dst = ?)
402
407
  """
403
- return { # ? use context instead?
404
- m.code: m for m in self._gwy._zzz.qry(sql, (self.id[:9], self.id[:9]))
408
+ return { # ? use ctx (context) instead of just the address?
409
+ m.code: m for m in self._gwy.msg_db.qry(sql, (self.id[:9], self.id[:9]))
405
410
  } # e.g. 01:123456_HW
406
411
 
407
412
  @property
408
413
  def _msgz(self) -> dict[Code, dict[VerbT, dict[bool | str | None, Message]]]:
409
- if not self._gwy._zzz:
414
+ """
415
+ Get a nested Dict of all I/RP messages logged with this device as src or dst.
416
+
417
+ :return: Dict of messages, nested by Code, Verb, Context
418
+ """
419
+ if not self._gwy.msg_db: # no central SQLite MessageIndex
410
420
  return self._msgz_
411
421
 
412
422
  msgs_1: dict[Code, dict[VerbT, dict[bool | str | None, Message]]] = {}
@@ -437,7 +447,7 @@ class _Discovery(_MessageDB):
437
447
  self._supported_cmds_ctx: dict[str, bool | None] = {}
438
448
 
439
449
  if not gwy.config.disable_discovery:
440
- # self._start_discovery_poller() # Can't use derived classes dont exist yet
450
+ # self._start_discovery_poller() # Can't use derived classes don't exist yet
441
451
  gwy._loop.call_soon(self._start_discovery_poller)
442
452
 
443
453
  @property # TODO: needs tidy up
@@ -464,7 +474,7 @@ class _Discovery(_MessageDB):
464
474
  def _to_data_id(msg_id: MsgId | str) -> OtDataId:
465
475
  return int(msg_id, 16) # type: ignore[return-value]
466
476
 
467
- def _to_msg_id(data_id: OtDataId | int) -> MsgId:
477
+ def _to_msg_id(data_id: OtDataId | int) -> MsgId: # not used
468
478
  return f"{data_id:02X}" # type: ignore[return-value]
469
479
 
470
480
  return {
@@ -639,7 +649,7 @@ class _Discovery(_MessageDB):
639
649
  task[_SZ_NEXT_DUE] = msg.dtm + task[_SZ_INTERVAL]
640
650
 
641
651
  if task[_SZ_NEXT_DUE] > dt_now:
642
- continue # if (most recent) last_msg is is not yet due...
652
+ continue # if (most recent) last_msg is not yet due...
643
653
 
644
654
  # since we may do I/O, check if the code|msg_id is deprecated
645
655
  task[_SZ_NEXT_DUE] = dt_now + task[_SZ_INTERVAL] # might undeprecate later
@@ -733,25 +743,6 @@ class Parent(Entity): # A System, Zone, DhwZone or a UfhController
733
743
  self.child_by_id: dict[str, Child] = {}
734
744
  self.childs: list[Child] = []
735
745
 
736
- # def _handle_msg(self, msg: Message) -> None:
737
- # def eavesdrop_ufh_circuits():
738
- # if msg.code == Code._22C9:
739
- # # .I --- 02:044446 --:------ 02:044446 22C9 024 00-076C0A28-01 01-06720A28-01 02-06A40A28-01 03-06A40A2-801 # NOTE: fragments
740
- # # .I --- 02:044446 --:------ 02:044446 22C9 006 04-07D00A28-01 # [{'ufh_idx': '04',...
741
- # circuit_idxs = [c[SZ_UFH_IDX] for c in msg.payload]
742
-
743
- # for cct_idx in circuit_idxs:
744
- # self.get_circuit(cct_idx, msg=msg)
745
-
746
- # # BUG: this will fail with > 4 circuits, as uses two pkts for this msg
747
- # # if [c for c in self.child_by_id if c not in circuit_idxs]:
748
- # # raise CorruptStateError
749
-
750
- # super()._handle_msg(msg)
751
-
752
- # if self._gwy.config.enable_eavesdrop:
753
- # eavesdrop_ufh_circuits()
754
-
755
746
  @property
756
747
  def zone_idx(self) -> str:
757
748
  """Return the domain id.
@@ -129,7 +129,7 @@ class Gateway(Engine):
129
129
  self.devices: list[Device] = []
130
130
  self.device_by_id: dict[DeviceIdT, Device] = {}
131
131
 
132
- self._zzz: MessageIndex | None = None # MessageIndex()
132
+ self.msg_db: MessageIndex | None = None # MessageIndex()
133
133
 
134
134
  def __repr__(self) -> str:
135
135
  if not self.ser_name:
@@ -196,8 +196,8 @@ class Gateway(Engine):
196
196
  async def stop(self) -> None:
197
197
  """Stop the Gateway and tidy up."""
198
198
 
199
- if self._zzz:
200
- self._zzz.stop()
199
+ if self.msg_db:
200
+ self.msg_db.stop()
201
201
  await super().stop()
202
202
 
203
203
  def _pause(self, *args: Any) -> None:
@@ -255,10 +255,10 @@ class Gateway(Engine):
255
255
  msgs.extend([m for z in system.zones for m in z._msgs.values()])
256
256
  # msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO
257
257
 
258
- if self._zzz:
258
+ if self.msg_db:
259
259
  pkts = {
260
260
  f"{repr(msg._pkt)[:26]}": f"{repr(msg._pkt)[27:]}"
261
- for msg in self._zzz.all(include_expired=True)
261
+ for msg in self.msg_db.all(include_expired=True)
262
262
  if wanted_msg(msg, include_expired=include_expired)
263
263
  }
264
264
 
@@ -405,7 +405,7 @@ class Gateway(Engine):
405
405
  _LOGGER.warning(f"The device is not fakeable: {dev}")
406
406
 
407
407
  # TODO: the exact order of the following may need refining...
408
- # TODO: some will be done my devices themselves?
408
+ # TODO: some will be done by devices themselves?
409
409
 
410
410
  # if schema: # Step 2: Only controllers have a schema...
411
411
  # dev._update_schema(**schema) # TODO: schema/traits
@@ -422,7 +422,7 @@ class Gateway(Engine):
422
422
  self,
423
423
  device_id: DeviceIdT,
424
424
  create_device: bool = False,
425
- ) -> Device:
425
+ ) -> Device | Fakeable:
426
426
  """Create a faked device."""
427
427
 
428
428
  if not is_valid_dev_id(device_id):
@@ -437,7 +437,7 @@ class Gateway(Engine):
437
437
  dev._make_fake()
438
438
  return dev
439
439
 
440
- raise TypeError(f"The device is not fakable: {device_id}")
440
+ raise TypeError(f"The device is not fakeable: {device_id}")
441
441
 
442
442
  @property
443
443
  def tcs(self) -> Evohome | None:
@@ -547,14 +547,6 @@ class Gateway(Engine):
547
547
 
548
548
  def _msg_handler(self, msg: Message) -> None:
549
549
  """A callback to handle messages from the protocol stack."""
550
- # TODO: Remove this
551
- # # HACK: if CLI, double-logging with client.py proc_msg() & setLevel(DEBUG)
552
- # if (log_level := _LOGGER.getEffectiveLevel()) < logging.INFO:
553
- # _LOGGER.info(msg)
554
- # elif log_level <= logging.INFO and not (
555
- # msg.verb == RQ and msg.src.type == DEV_TYPE_MAP.HGI
556
- # ):
557
- # _LOGGER.info(msg)
558
550
 
559
551
  super()._msg_handler(msg)
560
552
 
@@ -699,8 +699,10 @@ class Zone(ZoneSchedule):
699
699
  def name(self) -> str | None: # 0004
700
700
  """Return the name of the zone."""
701
701
 
702
- if self._gwy._zzz:
703
- msgs = self._gwy._zzz.get(code=Code._0004, src=self._z_id, ctx=self._z_idx)
702
+ if self._gwy.msg_db:
703
+ msgs = self._gwy.msg_db.get(
704
+ code=Code._0004, src=self._z_id, ctx=self._z_idx
705
+ )
704
706
  return msgs[0].payload.get(SZ_NAME) if msgs else None
705
707
 
706
708
  return self._msg_value(Code._0004, key=SZ_NAME) # type: ignore[no-any-return]
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.51.5"
3
+ __version__ = "0.51.6"
4
4
  VERSION = __version__
@@ -138,7 +138,7 @@ if TYPE_CHECKING:
138
138
  async def set_pkt_logging_config(**config: Any) -> Logger:
139
139
  """
140
140
  Set up ramses packet logging to a file or port.
141
- Must runs async in executor to prevent HA blocking call opening packet log file (issue #200)
141
+ Must run async in executor to prevent HA blocking call opening packet log file (issue #200)
142
142
 
143
143
  :param config: if file_name is included, opens packet_log file
144
144
  :return: a logging.Logger
@@ -45,7 +45,7 @@ class Address:
45
45
  # device_id = NON_DEVICE_ID
46
46
 
47
47
  self.id = device_id # TODO: check is a valid id...
48
- self.type = device_id[:2] # dex, NOTE: remove last
48
+ self.type = device_id[:2] # dex, drops 2nd part, incl. ":"
49
49
  self._hex_id: str = None # type: ignore[assignment]
50
50
 
51
51
  if not self.is_valid(device_id):