ramses-rf 0.51.3__tar.gz → 0.51.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 (353) hide show
  1. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/PKG-INFO +1 -1
  2. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/const.py +2 -0
  3. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/device/hvac.py +14 -0
  4. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/dispatcher.py +6 -6
  5. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/entity_base.py +1 -1
  6. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/system/heat.py +3 -3
  7. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/system/zones.py +3 -3
  8. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/version.py +1 -1
  9. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/const.py +2 -0
  10. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/helpers.py +1 -1
  11. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/parsers.py +28 -14
  12. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/ramses.py +1 -1
  13. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/transport.py +87 -20
  14. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/version.py +1 -1
  15. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_ventura.log +19 -4
  16. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/10e0_xxxx.log +2 -1
  17. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/34_T87RF2025.log +2 -1
  18. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +4 -1
  19. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +1 -1
  20. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +1 -1
  21. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_042f.log +3 -0
  22. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_10e0.log +9 -5
  23. ramses_rf-0.51.5/tests/tests/parsers/code_1f09.log +4 -0
  24. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1fc9.log +2 -0
  25. ramses_rf-0.51.5/tests/tests/parsers/code_2210.log +26 -0
  26. ramses_rf-0.51.3/tests/tests/parsers/code_2210.log +0 -17
  27. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  28. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/dependabot.yml +0 -0
  29. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/workflows/check-lint.yml +0 -0
  30. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/workflows/check-test.yml +0 -0
  31. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/workflows/check-type.yml +0 -0
  32. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.github/workflows/publish-hatch.yml +0 -0
  33. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.gitignore +0 -0
  34. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/.pre-commit-config.yaml +0 -0
  35. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/LICENSE +0 -0
  36. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/README-developers.md +0 -0
  37. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/README.md +0 -0
  38. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/client.py +0 -0
  39. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/misc/fingerprints.log +0 -0
  40. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/misc/ser2net.yaml +0 -0
  41. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/misc/ti_3410/notes.sh +0 -0
  42. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/misc/ti_3410/ti_3410.fw +0 -0
  43. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/pyproject.toml +0 -0
  44. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/__init__.py +0 -0
  45. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/client.py +0 -0
  46. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/debug.py +0 -0
  47. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/discovery.py +0 -0
  48. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/utils/cat_slow.py +0 -0
  49. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_cli/utils/convert.py +0 -0
  50. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/__init__.py +0 -0
  51. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/binding_fsm.py +0 -0
  52. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/database.py +0 -0
  53. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/device/__init__.py +0 -0
  54. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/device/base.py +0 -0
  55. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/device/heat.py +0 -0
  56. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/exceptions.py +0 -0
  57. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/gateway.py +0 -0
  58. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/helpers.py +0 -0
  59. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/py.typed +0 -0
  60. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/schemas.py +0 -0
  61. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/system/__init__.py +0 -0
  62. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/system/faultlog.py +0 -0
  63. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_rf/system/schedule.py +0 -0
  64. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/__init__.py +0 -0
  65. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/address.py +0 -0
  66. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/command.py +0 -0
  67. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/exceptions.py +0 -0
  68. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/fingerprints.py +0 -0
  69. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/frame.py +0 -0
  70. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/gateway.py +0 -0
  71. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/logger.py +0 -0
  72. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/message.py +0 -0
  73. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/opentherm.py +0 -0
  74. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/packet.py +0 -0
  75. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/protocol.py +0 -0
  76. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/protocol_fsm.py +0 -0
  77. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/py.typed +0 -0
  78. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/schemas.py +0 -0
  79. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/typed_dicts.py +0 -0
  80. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/ramses_tx/typing.py +0 -0
  81. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/requirements.txt +0 -0
  82. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/requirements_dev.txt +0 -0
  83. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_apis_mock.py +0 -0
  84. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_mock_faultlog.py +0 -0
  85. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_mock_schedule.py +0 -0
  86. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_packets_bad.py +0 -0
  87. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_performance_WIP.py +0 -0
  88. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/_test_state_mgt.py +0 -0
  89. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/common.py +0 -0
  90. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/__init__.py +0 -0
  91. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/command.py +0 -0
  92. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/const.py +0 -0
  93. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  94. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  95. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/deprecated/mocked_devices/transport.py +0 -0
  96. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/__init__.py +0 -0
  97. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  98. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  99. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  100. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  101. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  102. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  103. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  104. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  105. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  106. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  107. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  108. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  109. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  110. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  111. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  112. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  113. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/devices/device_02.log +0 -0
  114. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/devices/device_04.log +0 -0
  115. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/devices/device_10.log +0 -0
  116. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/devices/device_13.log +0 -0
  117. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/devices/device_22.log +0 -0
  118. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  119. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  120. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  121. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  122. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  123. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  124. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  125. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  126. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  127. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  128. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  129. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  130. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  131. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  132. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  133. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  134. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  135. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  136. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  137. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  138. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  139. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  140. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  141. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  142. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  143. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  144. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  145. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  146. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  147. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  148. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  149. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  150. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  151. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/_gather.sh +0 -0
  152. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  153. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  154. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  155. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  156. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  157. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  158. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  159. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  160. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  161. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  162. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  163. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  164. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/20.log +0 -0
  165. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  166. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  167. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  168. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  169. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  170. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  171. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  172. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  173. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  174. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  175. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  176. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  177. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  178. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  179. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  180. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  181. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  182. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  183. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  184. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  185. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  186. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  187. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  188. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  189. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  190. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/helpers.py +0 -0
  191. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/logger/packet_in.log +0 -0
  192. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/logger/packet_out.log +0 -0
  193. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/logs/pkts_bad_000.log +0 -0
  194. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/logs/pkts_tba_000.log +0 -0
  195. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/logs/system_cache.json +0 -0
  196. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  197. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  198. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0001_wip.log +0 -0
  199. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0002.log +0 -0
  200. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0004_wip.log +0 -0
  201. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0005.log +0 -0
  202. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0006.log +0 -0
  203. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0009.log +0 -0
  204. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_000a.log +0 -0
  205. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_000c.log +0 -0
  206. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_000e.log +0 -0
  207. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_01ff_wip.log +0 -0
  208. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_0418.log +0 -0
  209. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1030.log +0 -0
  210. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1060.log +0 -0
  211. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_10d0.log +0 -0
  212. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1260.log +0 -0
  213. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1298.log +0 -0
  214. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_12a0.log +0 -0
  215. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_12c0.log +0 -0
  216. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_1300.log +0 -0
  217. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22c9.log +0 -0
  218. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22d0.log +0 -0
  219. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22d9.log +0 -0
  220. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22e0.log +0 -0
  221. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22e5.log +0 -0
  222. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22e9.log +0 -0
  223. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22f1.log +0 -0
  224. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22f2.log +0 -0
  225. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22f3.log +0 -0
  226. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22f4.log +0 -0
  227. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_22f7.log +0 -0
  228. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_2309.log +0 -0
  229. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_2349.log +0 -0
  230. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_2411_wip.log +0 -0
  231. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_2e04.log +0 -0
  232. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_2e10_wip.log +0 -0
  233. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_30c9.log +0 -0
  234. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3110_wip.log +0 -0
  235. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3120.log +0 -0
  236. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_313e_wip.log +0 -0
  237. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3150.log +0 -0
  238. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_31d9.log +0 -0
  239. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_31da.log +0 -0
  240. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3200.log +0 -0
  241. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3210.log +0 -0
  242. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3220.log +0 -0
  243. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3222.log +0 -0
  244. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  245. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  246. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_4e01.log +0 -0
  247. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_4e02.log +0 -0
  248. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_4e04.log +0 -0
  249. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/parsers/code_4e15.log +0 -0
  250. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/_sched_002/packet.log +0 -0
  251. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  252. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/sched_001/packet.log +0 -0
  253. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/sched_001/schedule.json +0 -0
  254. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  255. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  256. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  257. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  258. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  259. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  260. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  261. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  262. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  263. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_000.json +0 -0
  264. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_000.log +0 -0
  265. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_001.json +0 -0
  266. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_001.log +0 -0
  267. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_002.json +0 -0
  268. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_002.log +0 -0
  269. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_010.json +0 -0
  270. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_010.log +0 -0
  271. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_011.json +0 -0
  272. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_011.log +0 -0
  273. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_012.json +0 -0
  274. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_012.log +0 -0
  275. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_013.json +0 -0
  276. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_013.log +0 -0
  277. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_014.json +0 -0
  278. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_014.log +0 -0
  279. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_300.json +0 -0
  280. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_300.log +0 -0
  281. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_301.json +0 -0
  282. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_301.log +0 -0
  283. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_302.json +0 -0
  284. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_302.log +0 -0
  285. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_303.json +0 -0
  286. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_303.log +0 -0
  287. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_304.json +0 -0
  288. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_304.log +0 -0
  289. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_310.json +0 -0
  290. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/schemas/log_files/schema_310.log +0 -0
  291. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  292. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  293. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  294. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  295. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  296. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  297. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  298. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  299. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_otb_00/config.json +0 -0
  300. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  301. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  302. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_simple/packet.log +0 -0
  303. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_simple/schema.json +0 -0
  304. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  305. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  306. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  307. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  308. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  309. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  310. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  311. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_api_faultlog.py +0 -0
  312. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_api_schedule.py +0 -0
  313. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_apis_binding.py +0 -0
  314. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_apis_common.py +0 -0
  315. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_apis_heat.py +0 -0
  316. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_apis_hvac.py +0 -0
  317. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_cli_utility.py +0 -0
  318. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_devices.py +0 -0
  319. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  320. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_eavesdrop_schema.py +0 -0
  321. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_helpers.py +0 -0
  322. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_parser_helpers.py +0 -0
  323. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_parsers.py +0 -0
  324. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_ramses_schema.py +0 -0
  325. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_schema_bits.py +0 -0
  326. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_schemas.py +0 -0
  327. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_systems.py +0 -0
  328. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests/test_vol_schemas.py +0 -0
  329. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/__init__.py +0 -0
  330. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/configs/config_heat.json +0 -0
  331. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/configs/config_hvac.json +0 -0
  332. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/conftest.py +0 -0
  333. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  334. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_api_faultlog.py +0 -0
  335. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_api_schedule.py +0 -0
  336. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_binding_fsm.py +0 -0
  337. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_create_stack.py +0 -0
  338. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  339. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_protocol_fsm.py +0 -0
  340. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_use_regex.py +0 -0
  341. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/test_virt_network.py +0 -0
  342. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/virtual_rf/__init__.py +0 -0
  343. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/virtual_rf/const.py +0 -0
  344. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  345. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  346. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_tx/__init__.py +0 -0
  347. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/tests_tx/test_command.py +0 -0
  348. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  349. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  350. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  351. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  352. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  353. {ramses_rf-0.51.3 → ramses_rf-0.51.5}/tests/wip/test_wip_cli.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramses_rf
3
- Version: 0.51.3
3
+ Version: 0.51.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
@@ -61,6 +61,8 @@ from ramses_tx.const import ( # noqa: F401
61
61
  SZ_REMAINING_DAYS as SZ_REMAINING_DAYS,
62
62
  SZ_REMAINING_MINS as SZ_REMAINING_MINS,
63
63
  SZ_REMAINING_PERCENT as SZ_REMAINING_PERCENT,
64
+ SZ_REQ_REASON as SZ_REQ_REASON,
65
+ SZ_REQ_SPEED as SZ_REQ_SPEED,
64
66
  SZ_SCHEDULE as SZ_SCHEDULE,
65
67
  SZ_SENSOR as SZ_SENSOR,
66
68
  SZ_SETPOINT as SZ_SETPOINT,
@@ -31,6 +31,8 @@ from ramses_rf.const import (
31
31
  SZ_REMAINING_DAYS,
32
32
  SZ_REMAINING_MINS,
33
33
  SZ_REMAINING_PERCENT,
34
+ SZ_REQ_REASON,
35
+ SZ_REQ_SPEED,
34
36
  SZ_SPEED_CAPABILITIES,
35
37
  SZ_SUPPLY_FAN_SPEED,
36
38
  SZ_SUPPLY_FLOW,
@@ -506,6 +508,18 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
506
508
  def remaining_mins(self) -> int | None:
507
509
  return self._msg_value(Code._31DA, key=SZ_REMAINING_MINS)
508
510
 
511
+ @property
512
+ def request_fan_speed(self) -> float | None:
513
+ return self._msg_value(Code._2210, key=SZ_REQ_SPEED)
514
+
515
+ @property
516
+ def request_src(self) -> str | None:
517
+ """
518
+ Orcon, others?
519
+ :return: source sensor of auto speed request: IDL, CO2 or HUM
520
+ """
521
+ return self._msg_value(Code._2210, key=SZ_REQ_REASON)
522
+
509
523
  @property
510
524
  def speed_cap(self) -> int | None:
511
525
  return self._msg_value(Code._31DA, key=SZ_SPEED_CAPABILITIES)
@@ -91,7 +91,7 @@ def _create_devices_from_addrs(gwy: Gateway, this: Message) -> None:
91
91
  if not gwy.config.enable_eavesdrop:
92
92
  return
93
93
 
94
- if not isinstance(this.dst, Device) and this.src is not gwy.hgi: # type: ignore[unreachable]
94
+ if not isinstance(this.dst, Device) and this.src != gwy.hgi: # type: ignore[unreachable]
95
95
  with contextlib.suppress(LookupError):
96
96
  this.dst = gwy.get_device(this.dst.id) # type: ignore[assignment]
97
97
 
@@ -188,9 +188,9 @@ def process_msg(gwy: Gateway, msg: Message) -> None:
188
188
  def logger_xxxx(msg: Message) -> None:
189
189
  if _DBG_FORCE_LOG_MESSAGES:
190
190
  _LOGGER.warning(msg)
191
- elif msg.src is not gwy.hgi or (msg.code != Code._PUZZ and msg.verb != RQ):
191
+ elif msg.src != gwy.hgi or (msg.code != Code._PUZZ and msg.verb != RQ):
192
192
  _LOGGER.info(msg)
193
- elif msg.src is not gwy.hgi or msg.verb != RQ:
193
+ elif msg.src != gwy.hgi or msg.verb != RQ:
194
194
  _LOGGER.info(msg)
195
195
  elif _LOGGER.getEffectiveLevel() == logging.DEBUG:
196
196
  _LOGGER.info(msg)
@@ -215,7 +215,7 @@ def process_msg(gwy: Gateway, msg: Message) -> None:
215
215
  if (
216
216
  msg.src._SLUG != DevType.HGI # avoid: msg.src.id != gwy.hgi.id
217
217
  and msg.verb != I_
218
- and msg.dst is not msg.src
218
+ and msg.dst != msg.src
219
219
  ):
220
220
  # HGI80 can do what it likes
221
221
  # receiving an I isn't currently in the schema & so can't yet be tested
@@ -234,10 +234,10 @@ def process_msg(gwy: Gateway, msg: Message) -> None:
234
234
  # TODO: only be for fully-faked (not Fakable) dst (it picks up via RF if not)
235
235
 
236
236
  if msg.code == Code._1FC9 and msg.payload[SZ_PHASE] == SZ_OFFER:
237
- devices = [d for d in gwy.devices if d is not msg.src and d._is_binding]
237
+ devices = [d for d in gwy.devices if d != msg.src and d._is_binding]
238
238
 
239
239
  elif msg.dst == ALL_DEV_ADDR: # some offers use dst=63:, so after 1FC9 offer
240
- devices = [d for d in gwy.devices if d is not msg.src and d.is_faked]
240
+ devices = [d for d in gwy.devices if d != msg.src and d.is_faked]
241
241
 
242
242
  elif msg.dst is not msg.src and isinstance(msg.dst, Fakeable): # type: ignore[unreachable]
243
243
  # to eavesdrop pkts from other devices, but relevant to this device
@@ -387,7 +387,7 @@ class _MessageDB(_Entity):
387
387
  codes = {
388
388
  k: (CODES_SCHEMA[k][SZ_NAME] if k in CODES_SCHEMA else None)
389
389
  for k in sorted(self._msgs)
390
- if self._msgs[k].src is (self if hasattr(self, "addr") else self.ctl)
390
+ if self._msgs[k].src == (self if hasattr(self, "addr") else self.ctl)
391
391
  }
392
392
 
393
393
  return {"_sent": list(codes.keys())}
@@ -193,19 +193,19 @@ class SystemBase(Parent, Entity): # 3B00 (multi-relay)
193
193
  this.code in (Code._22D9, Code._3220) and this.verb == RQ
194
194
  ): # TODO: RPs too?
195
195
  # dst could be an Address...
196
- if this.src is self.ctl and isinstance(this.dst, OtbGateway): # type: ignore[unreachable]
196
+ if this.src == self.ctl and isinstance(this.dst, OtbGateway): # type: ignore[unreachable]
197
197
  app_cntrl = this.dst # type: ignore[unreachable]
198
198
 
199
199
  elif this.code == Code._3EF0 and this.verb == RQ:
200
200
  # dst could be an Address...
201
- if this.src is self.ctl and isinstance(
201
+ if this.src == self.ctl and isinstance(
202
202
  this.dst, # type: ignore[unreachable]
203
203
  BdrSwitch | OtbGateway,
204
204
  ):
205
205
  app_cntrl = this.dst # type: ignore[unreachable]
206
206
 
207
207
  elif this.code == Code._3B00 and this.verb == I_ and prev is not None:
208
- if this.src is self.ctl and isinstance(prev.src, BdrSwitch): # type: ignore[unreachable]
208
+ if this.src == self.ctl and isinstance(prev.src, BdrSwitch): # type: ignore[unreachable]
209
209
  if prev.code == this.code and prev.verb == this.verb: # type: ignore[unreachable]
210
210
  app_cntrl = prev.src
211
211
 
@@ -266,7 +266,7 @@ class DhwZone(ZoneSchedule): # CS92A
266
266
  # self._get_dhw(sensor=this.dst)
267
267
 
268
268
  assert (
269
- msg.src is self.ctl
269
+ msg.src == self.ctl
270
270
  and msg.code in (Code._0005, Code._000C, Code._10A0, Code._1260, Code._1F41)
271
271
  or msg.payload.get(SZ_DOMAIN_ID) in (F9, FA)
272
272
  or msg.payload.get(SZ_ZONE_IDX) == "HW"
@@ -633,13 +633,13 @@ class Zone(ZoneSchedule):
633
633
  self._update_schema(**{SZ_CLASS: ZON_ROLE_MAP[ZoneRole.UFH]})
634
634
 
635
635
  assert (
636
- msg.src is self.ctl or msg.src.type == DEV_TYPE_MAP.UFC
636
+ msg.src == self.ctl or msg.src.type == DEV_TYPE_MAP.UFC
637
637
  ) and ( # DEX
638
638
  isinstance(msg.payload, dict)
639
639
  or [d for d in msg.payload if d.get(SZ_ZONE_IDX) == self.idx]
640
640
  ), f"msg inappropriately routed to {self}"
641
641
 
642
- assert (msg.src is self.ctl or msg.src.type == DEV_TYPE_MAP.UFC) and ( # DEX
642
+ assert (msg.src == self.ctl or msg.src.type == DEV_TYPE_MAP.UFC) and ( # DEX
643
643
  isinstance(msg.payload, list)
644
644
  or msg.code == Code._0005
645
645
  or msg.payload.get(SZ_ZONE_IDX) == self.idx
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.51.3"
3
+ __version__ = "0.51.5"
4
4
  VERSION = __version__
@@ -88,6 +88,8 @@ SZ_REL_HUMIDITY: Final = "rel_humidity"
88
88
  SZ_REMAINING_DAYS: Final = "days_remaining"
89
89
  SZ_REMAINING_MINS: Final = "remaining_mins"
90
90
  SZ_REMAINING_PERCENT: Final = "percent_remaining"
91
+ SZ_REQ_REASON: Final = "req_reason"
92
+ SZ_REQ_SPEED: Final = "req_speed"
91
93
  SZ_SUPPLY_FAN_SPEED: Final = "supply_fan_speed"
92
94
  SZ_SUPPLY_FLOW: Final = "supply_flow"
93
95
  SZ_SUPPLY_TEMP: Final = "supply_temp"
@@ -757,7 +757,7 @@ def parse_fan_info(value: HexStr2) -> PayDictT.FAN_INFO:
757
757
  }
758
758
 
759
759
 
760
- # 31DA[38:40]
760
+ # 31DA[38:40], also 2210
761
761
  def parse_exhaust_fan_speed(value: HexStr2) -> PayDictT.EXHAUST_FAN_SPEED:
762
762
  """Return the exhaust fan speed (% of max speed)."""
763
763
  return _parse_fan_speed(SZ_EXHAUST_FAN_SPEED, value) # type: ignore[return-value]
@@ -72,6 +72,7 @@ from .const import (
72
72
  SZ_RELAY_DEMAND,
73
73
  SZ_REMAINING_DAYS,
74
74
  SZ_REMAINING_PERCENT,
75
+ SZ_REQ_REASON,
75
76
  SZ_SETPOINT,
76
77
  SZ_SETPOINT_BOUNDS,
77
78
  SZ_SYSTEM_MODE,
@@ -1378,29 +1379,42 @@ def parser_1fd4(payload: str, msg: Message) -> PayDictT._1FD4:
1378
1379
  return {"ticker": int(payload[2:], 16)}
1379
1380
 
1380
1381
 
1381
- # WIP: unknown, HVAC
1382
+ # WIP: HVAC auto requests (confirmed for Orcon, others?)
1382
1383
  def parser_2210(payload: str, msg: Message) -> dict[str, Any]:
1383
1384
  try:
1384
1385
  assert msg.verb in (RP, I_) or payload == "00"
1385
- assert payload[10:12] == payload[38:40] and payload[10:12] in (
1386
- "58",
1387
- "96",
1388
- "FF",
1389
- ), f"expected (58|96|FF), not {payload[10:12]}"
1386
+ assert payload[10:12] == payload[38:40], (
1387
+ f"expected byte 19 {payload[10:12]}, not {payload[38:40]}"
1388
+ ) # auto requested fan speed %. Identical [38:40] is for supply?
1390
1389
  assert payload[20:22] == payload[48:50] and payload[20:22] in (
1391
- "00",
1392
- "03",
1393
- ), f"expected (00|03), not {payload[10:12]}"
1394
- assert payload[78:80] in ("00", "02"), f"expected (00|02), not {payload[78:80]}"
1395
- assert payload[80:82] in ("01", "08"), f"expected (01|08), not {payload[80:82]}"
1396
- assert payload[82:] in ("00", "40"), f"expected (00|40), not {payload[82:]}"
1390
+ "00", # idle
1391
+ "02", # requested by CO2 level/sensor
1392
+ "03", # requested by humidity level/sensor
1393
+ ), f"expected req_reason (00|02|03), not {payload[20:22]}"
1394
+ assert payload[78:80] in ("00", "02"), (
1395
+ f"expected byte 39 (00|02), not {payload[78:80]}"
1396
+ )
1397
+ assert payload[80:82] in ("01", "08"), (
1398
+ f"expected byte 40 (01|08), not {payload[80:82]}"
1399
+ )
1400
+ assert payload[82:] in ("00", "40"), (
1401
+ f"expected byte 41- (00|40), not {payload[82:]}"
1402
+ )
1397
1403
 
1398
1404
  except AssertionError as err:
1399
1405
  _LOGGER.warning(f"{msg!r} < {_INFORM_DEV_MSG} ({err})")
1400
1406
 
1407
+ _req = "IDL"
1408
+ if payload[20:22] == "02":
1409
+ _req = "CO2"
1410
+ elif payload[20:22] == "03":
1411
+ _req = "HUM"
1412
+
1401
1413
  return {
1402
- "unknown_10": payload[10:12],
1403
- "unknown_20": payload[20:22],
1414
+ **parse_exhaust_fan_speed(
1415
+ payload[10:12]
1416
+ ), # for Orcon: 29 hex == 41 decimal divided by 2 gives 20.5 (%)
1417
+ SZ_REQ_REASON: _req,
1404
1418
  "unknown_78": payload[78:80],
1405
1419
  "unknown_80": payload[80:82],
1406
1420
  "unknown_82": payload[82:],
@@ -1059,7 +1059,7 @@ _DEV_KLASSES_HVAC: dict[str, dict[Code, dict[VerbT, Any]]] = {
1059
1059
  Code._12C8: {I_: {}},
1060
1060
  Code._1470: {RP: {}},
1061
1061
  Code._1F09: {I_: {}, RP: {}},
1062
- Code._1FC9: {W_: {}},
1062
+ Code._1FC9: {I_: {}, W_: {}},
1063
1063
  Code._2210: {I_: {}, RP: {}},
1064
1064
  Code._22E0: {RP: {}},
1065
1065
  Code._22E5: {RP: {}},
@@ -778,7 +778,8 @@ class FileTransport(_ReadTransport, _FileTransportAbstractor):
778
778
  while not self._reading:
779
779
  await asyncio.sleep(0.001)
780
780
  self._frame_read(dtm_str, pkt_line)
781
- # await asyncio.sleep(0) # NOTE: big performance penalty if delay >0
781
+ await asyncio.sleep(0)
782
+ # NOTE: instable without, big performance penalty if delay >0
782
783
 
783
784
  elif isinstance(self._pkt_source, str): # file_name, used in client parse
784
785
  # open file file_name before reading
@@ -794,7 +795,8 @@ class FileTransport(_ReadTransport, _FileTransportAbstractor):
794
795
  ] != "#":
795
796
  self._frame_read(dtm_pkt_line[:26], dtm_pkt_line[27:])
796
797
  # this is where the parsing magic happens!
797
- # await asyncio.sleep(0) # NOTE: big performance penalty if delay >0
798
+ await asyncio.sleep(0)
799
+ # NOTE: instable without, big performance penalty if delay >0
798
800
  except FileNotFoundError as err:
799
801
  _LOGGER.warning(f"Correct the packet file name; {err}")
800
802
  elif isinstance(self._pkt_source, TextIOWrapper): # used by client monitor
@@ -804,7 +806,8 @@ class FileTransport(_ReadTransport, _FileTransportAbstractor):
804
806
  # can be blank lines in annotated log files
805
807
  if (dtm_pkt_line := dtm_pkt_line.strip()) and dtm_pkt_line[:1] != "#":
806
808
  self._frame_read(dtm_pkt_line[:26], dtm_pkt_line[27:])
807
- await asyncio.sleep(0) # NOTE: big performance penalty if delay >0
809
+ await asyncio.sleep(0)
810
+ # NOTE: instable without, big performance penalty if delay >0
808
811
  else:
809
812
  raise exc.TransportSourceInvalid(
810
813
  f"Packet source is not dict, TextIOWrapper or str: {self._pkt_source:!r}"
@@ -1035,6 +1038,7 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1035
1038
 
1036
1039
  self._connected = False
1037
1040
  self._connecting = False
1041
+ self._connection_established = False # Track if initial connection was made
1038
1042
  self._extra[SZ_IS_EVOFW3] = True
1039
1043
 
1040
1044
  # Reconnection settings
@@ -1069,7 +1073,7 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1069
1073
  self._connecting = True
1070
1074
  try:
1071
1075
  self.client.connect_async(
1072
- self._broker_url.hostname, # type: ignore[arg-type]
1076
+ str(self._broker_url.hostname or "localhost"),
1073
1077
  self._broker_url.port or 1883,
1074
1078
  60,
1075
1079
  )
@@ -1136,8 +1140,21 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1136
1140
  self._reconnect_task.cancel()
1137
1141
  self._reconnect_task = None
1138
1142
 
1143
+ # Subscribe to base topic to see 'online' messages
1139
1144
  self.client.subscribe(self._topic_base) # hope to see 'online' message
1140
1145
 
1146
+ # Also subscribe to data topics with wildcard for reliability after reconnect
1147
+ # This ensures we get data even if we miss the 'online' message
1148
+ if self._topic_base.endswith("/+"):
1149
+ data_wildcard = self._topic_base.replace("/+", "/+/rx")
1150
+ self.client.subscribe(data_wildcard, qos=self._mqtt_qos)
1151
+ _LOGGER.debug(f"Subscribed to data wildcard: {data_wildcard}")
1152
+
1153
+ # If we already have specific topics, re-subscribe to them
1154
+ if hasattr(self, "_topic_sub") and self._topic_sub:
1155
+ self.client.subscribe(self._topic_sub, qos=self._mqtt_qos)
1156
+ _LOGGER.debug(f"Re-subscribed to specific topic: {self._topic_sub}")
1157
+
1141
1158
  def _on_connect_fail(
1142
1159
  self,
1143
1160
  client: mqtt.Client,
@@ -1155,19 +1172,36 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1155
1172
  self,
1156
1173
  client: mqtt.Client,
1157
1174
  userdata: Any,
1158
- reason_code: Any,
1159
- properties: Any | None,
1175
+ *args: Any,
1176
+ **kwargs: Any,
1160
1177
  ) -> None:
1161
- _LOGGER.warning(f"MQTT disconnected: {reason_code.getName()}")
1178
+ # Handle different paho-mqtt callback signatures
1179
+ reason_code = args[0] if len(args) >= 1 else None
1180
+
1181
+ reason_name = (
1182
+ reason_code.getName()
1183
+ if reason_code is not None and hasattr(reason_code, "getName")
1184
+ else str(reason_code)
1185
+ )
1186
+ _LOGGER.warning(f"MQTT disconnected: {reason_name}")
1162
1187
 
1188
+ was_connected = self._connected
1163
1189
  self._connected = False
1164
1190
 
1191
+ # If we were previously connected and had established communication,
1192
+ # notify that the device is now offline
1193
+ if was_connected and hasattr(self, "_topic_sub") and self._topic_sub:
1194
+ device_topic = self._topic_sub[:-3] # Remove "/rx" suffix
1195
+ _LOGGER.warning(f"{self}: the MQTT device is offline: {device_topic}")
1196
+
1197
+ # Pause writing since device is offline
1198
+ if hasattr(self, "_protocol"):
1199
+ self._protocol.pause_writing()
1200
+
1165
1201
  # Only attempt reconnection if we didn't deliberately disconnect
1166
- if not self._closing and not reason_code.is_failure:
1167
- # This was an unexpected disconnect, schedule reconnection
1168
- self._schedule_reconnect()
1169
- elif reason_code.is_failure and not self._closing:
1170
- # Connection failed, also schedule reconnection
1202
+
1203
+ if not self._closing:
1204
+ # Schedule reconnection for any disconnect (unexpected or failure)
1171
1205
  self._schedule_reconnect()
1172
1206
 
1173
1207
  def _create_connection(self, msg: mqtt.MQTTMessage) -> None:
@@ -1191,7 +1225,12 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1191
1225
 
1192
1226
  self.client.subscribe(self._topic_sub, qos=self._mqtt_qos)
1193
1227
 
1194
- self._make_connection(gwy_id=msg.topic[-9:]) # type: ignore[arg-type]
1228
+ # Only call connection_made on first connection, not reconnections
1229
+ if not self._connection_established:
1230
+ self._connection_established = True
1231
+ self._make_connection(gwy_id=msg.topic[-9:]) # type: ignore[arg-type]
1232
+ else:
1233
+ _LOGGER.info("MQTT reconnected - protocol connection already established")
1195
1234
 
1196
1235
  # NOTE: self._frame_read() invoked from here
1197
1236
  def _on_message(
@@ -1211,23 +1250,51 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1211
1250
  _LOGGER.info("Rx: %s", msg.payload)
1212
1251
 
1213
1252
  if msg.topic[-3:] != "/rx": # then, e.g. 'RAMSES/GATEWAY/18:017804'
1214
- if msg.payload == b"offline" and self._topic_sub.startswith(msg.topic):
1215
- _LOGGER.warning(
1216
- f"{self}: the MQTT device is offline: {self._topic_sub[:-3]}"
1217
- )
1218
- self._connected = False
1219
- self._protocol.pause_writing()
1253
+ if msg.payload == b"offline":
1254
+ # Check if this offline message is for our current device
1255
+ if (
1256
+ hasattr(self, "_topic_sub")
1257
+ and self._topic_sub
1258
+ and msg.topic == self._topic_sub[:-3]
1259
+ ) or not hasattr(self, "_topic_sub"):
1260
+ _LOGGER.warning(
1261
+ f"{self}: the ESP device is offline (via LWT): {msg.topic}"
1262
+ )
1263
+ # Don't set _connected = False here - that's for MQTT connection, not ESP device
1264
+ if hasattr(self, "_protocol"):
1265
+ self._protocol.pause_writing()
1220
1266
 
1221
1267
  # BUG: using create task (self._loop.ct() & asyncio.ct()) causes the
1222
1268
  # BUG: event look to close early
1223
1269
  elif msg.payload == b"online":
1224
1270
  _LOGGER.info(
1225
- f"{self}: the MQTT device is online: {self._topic_sub[:-3]}"
1271
+ f"{self}: the ESP device is online (via status): {msg.topic}"
1226
1272
  )
1227
1273
  self._create_connection(msg)
1228
1274
 
1229
1275
  return
1230
1276
 
1277
+ # Handle data messages - if we don't have connection established yet but get data,
1278
+ # we can infer the gateway from the topic
1279
+ if not self._connection_established and msg.topic.endswith("/rx"):
1280
+ # Extract gateway ID from topic like "RAMSES/GATEWAY/18:123456/rx"
1281
+ topic_parts = msg.topic.split("/")
1282
+ if len(topic_parts) >= 3 and topic_parts[-2] not in ("+", "*"):
1283
+ gateway_id = topic_parts[-2] # Should be something like "18:123456"
1284
+ _LOGGER.info(
1285
+ f"Inferring gateway connection from data topic: {gateway_id}"
1286
+ )
1287
+
1288
+ # Set up topics and connection
1289
+ self._topic_pub = f"{'/'.join(topic_parts[:-1])}/tx"
1290
+ self._topic_sub = msg.topic
1291
+ self._extra[SZ_ACTIVE_HGI] = gateway_id
1292
+
1293
+ # Mark as connected and establish protocol connection
1294
+ self._connected = True
1295
+ self._connection_established = True
1296
+ self._make_connection(gwy_id=gateway_id) # type: ignore[arg-type]
1297
+
1231
1298
  try:
1232
1299
  payload = json.loads(msg.payload)
1233
1300
  except json.JSONDecodeError:
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (transport layer)."""
2
2
 
3
- __version__ = "0.51.3"
3
+ __version__ = "0.51.5"
4
4
  VERSION = __version__
@@ -6,15 +6,30 @@
6
6
 
7
7
 
8
8
  ####################################################################################################
9
- # 1. For reference, 10E0s (if any), oem_code='65' (Note: REM/FAN won't RP|10E0):
9
+ # 1A. For reference, 10E0s (if any), oem_code='65' (Note: REM/FAN won't RP|10E0):
10
10
  2024-10-16T21:32:07.084793 073 I --- 29:123150 63:262142 --:------ 10E0 029 000001C8410D0165FFFFFFFFFFFF0D0407DF564D4E2D30374C4D303100 # {'description': 'VMN-07LM01', 'manufacturer_sub_id': 'C8', 'product_id': '41', 'date_1': '2015-04-13', 'date_2': '0000-00-00', 'oem_code': '65'} # ClimaRad 4-button remote
11
11
  2024-10-09T11:50:24.287879 123 I --- 37:153226 63:262142 --:------ 10E0 038 000001C8830C0A65FEFFFFFFFFFF110C07E4564D442D30375250533133000000000000000000 # {'description': 'VMD-07RPS13', 'manufacturer_sub_id': 'C8', 'product_id': '83', 'date_1': '2020-12-17', 'date_2': '0000-00-00', 'oem_code': '65'} # ClimaRad VenturaV1x
12
-
12
+ 2025-08-22T01:24:57.945961 058 I --- 18:154951 63:262142 --:------ 10E0 038 000001C8490F0065FEFEFFFFFFFF120607E4425244472D303252313300000000000000000000 # {'description': 'BRDG-02R13', 'manufacturer_sub_id': 'C8', 'product_id': '49', 'date_1': '2020-06-18', 'date_2': '0000-00-00', 'oem_code': '65'} # Airios RF Bridge, set for ClimaRad oem 65
13
13
 
14
14
 
15
15
  ####################################################################################################
16
- # 2. The handshake - faked in ramses_rf (NB: FAN|W|1FC9|00):
17
- # actual remote 1FC9 packet gets no response. Ventura is known to only bind to a CO2 sensor
16
+ # 2A. The handshake - Ventura/slave to RF Bridge (oem 65)
17
+ # Ventura in binding mode: press 2 buttons above Auto for 4 secs > flashing red symbol
18
+ # RF Bridge only active after 15 minutes power on (firmware update period)
19
+ 2025-08-17T15:43:38.086338 064 I --- 18:154951 --:------ 18:154951 1FC9 018 0022F44A5D476510E04A5D47001FC94A5D47 # {'phase': 'offer', 'bindings': [['00', '22F4', '18:154951'], ['65', '10E0', '18:154951'], ['00', '1FC9', '18:154951']]}
20
+
21
+ 2025-08-17T15:43:39.118990 061 W --- 37:153226 18:154951 --:------ 1FC9 012 0031D996568A00230996568A # {'phase': 'accept', 'bindings': [['00', '31D9', '37:153226'], ['00', '2309', '37:153226']]}
22
+ # system sync from bridge, unrelated?:
23
+ 2025-08-17T15:44:55.418472 061 I --- 18:154951 --:------ 18:154951 1F09 003 0006B3 # {}
24
+ # second 1FC9 from slave
25
+ 2025-08-17T15:46:04.045829 060 I --- 37:153226 --:------ 37:153226 1FC9 030 0031D996568A0031E096568A002E1096568A6510E096568A001FC996568A # {}
26
+
27
+ # A subsequent slave|I|10E0 *is required* for a successful bind???:
28
+ 2025-08-17T15:46:40.363292 059 I --- 37:153226 63:262142 --:------ 10E0 038 000001C8830C0A65FEFFFFFFFFFF110C07E4564D442D30375250533133000000000000000000 # {'oem_code': '65', 'manufacturer_sub_id': 'C8', 'product_id': '83', 'date_1': '2020-12-17', 'date_2': '0000-00-00', 'description': 'VMD-07RPS13'}
29
+
30
+
31
+ # 2B. The handshake - REM faked in ramses_rf to Ventura (NB: FAN|W|1FC9|00):
32
+ # actual REM 1FC9 packet gets no response. Ventura is known to only bind to a CO2 sensor or an RF Bridge (oem 65)
18
33
  2024-11-09T18:33:29.744238 ... I --- 29:123160 --:------ 29:123160 1FC9 018 0022F175E1180010E075E118001FC975E118
19
34
  # extended 1FC9. Added 1298 and 22F4, got response from HRU
20
35
  2024-11-09T18:32:41.837359 000 I --- 29:123160 --:------ 29:123160 1FC9 024 00129875E1180022F175E1180022F475E118001FC975E118 # {}
@@ -193,8 +193,9 @@
193
193
  2021-07-10T10:47:13.404100 ... RP --- 32:168090 18:000730 --:------ 10E0 038 000001C85802016CFFFFFFFFFFFF0C0707E0564D532D32334842333300000000000000000000
194
194
  2021-10-11T14:21:14.518500 ... I --- 32:168240 63:262142 --:------ 10E0 038 000001C85803016CFFFFFFFFFFFF0C0907E0564D532D32334842333300000000000000000000
195
195
  2022-01-01T00:00:00.000000 000 I --- 32:172522 63:262142 --:------ 10E0 029 000001C85901016CFFFFFFFFFFFF1F0507E0564D4E2D32334C4D333300 # {'description': 'VMN-23LM33', 'date_2': '0000-00-00', 'date_1': '2016-05-31', 'manufacturer_sub_id': 'C8', 'product_id': '59', 'oem_code': '6C'} # '_signature': '0001C85901016CFFFF',
196
- 2022-02-19T18:00:35.234656 062 I --- 32:206250 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300 # VMN-23LMH23
196
+ 2022-02-19T18:00:35.234656 062 I --- 32:206250 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300 # {'description': 'VMN-23LMH23', 'manufacturer_sub_id': 'C8', 'product_id': '5A', 'oem_code': '6C', 'date_1': '2016-06-01', 'date_2': '0000-00-00'}
197
197
  2022-11-10T20:43:45.452809 060 I --- 32:236773 63:262142 --:------ 10E0 030 000001C85F0E0267FFFFFFFFFFFFFFFFFFFF564D432D3135525053333400 # {'description': 'VMC-15RPS34', 'date_2': '0000-00-00', 'date_1': '0000-00-00', 'manufacturer_sub_id': 'C8', 'product_id': '5F', 'oem_code': '67'} # Orcon MVS-15?
198
+ 2024-03-04T16:54:24.502000 ... I --- 29:206851 63:262142 --:------ 10E0 029 000001C826090367FFFFFFFFFFFFFFFFFFFF564D432D31355250303100 # {'description': 'VMC-15RP01', 'manufacturer_sub_id': 'C8', 'oem_code': '67', 'product_id': '26', 'date_1': '0000-00-00', 'date_2': '0000-00-00'} # Orcon MVS-15RHB fan
198
199
  2021-12-20T08:24:09.117900 ... I --- 34:021943 63:262142 --:------ 10E0 038 000001C8380A0100F1FF0C0107E1030B07DE5438375246323032350000000000000000000000
199
200
  2021-11-08T15:26:00.654600 ... I --- 34:041323 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1E0407E4030507E15438375246323032350000000000000000000000
200
201
  2019-12-22T14:26:07.736118 045 I --- 34:044201 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1D0807E2030507E15438375246323032350000000000000000000000
@@ -1,6 +1,7 @@
1
+ # Honeywell Round thermostat, oem_code '00' / sub-id 'C8' - heat
1
2
 
2
3
  2022-08-20T12:03:31.051414 ... I --- 34:018143 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1B0107E4030507E15438375246323032350000000000000000000000
3
- 2021-12-20T08:24:09.117900 ... I --- 34:021943 63:262142 --:------ 10E0 038 000001C8380A0100F1FF0C0107E1030B07DE5438375246323032350000000000000000000000
4
+ 2021-12-20T08:24:09.117900 ... I --- 34:021943 63:262142 --:------ 10E0 038 000001C8380A0100F1FF0C0107E1030B07DE5438375246323032350000000000000000000000 # {'description': 'T87RF2025', 'manufacturer_sub_id': 'C8', 'product_id': '38', 'oem_code': '00', 'date_1': '2014-11-03', 'date_2': '2017-01-12'}
4
5
  2021-11-08T15:26:00.654600 ... I --- 34:041323 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1E0407E4030507E15438375246323032350000000000000000000000
5
6
  2019-12-22T14:26:07.736118 045 I --- 34:044201 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1D0807E2030507E15438375246323032350000000000000000000000
6
7
  2019-12-22T13:26:13.854200 ... I --- 34:044203 63:262142 --:------ 10E0 038 000001C8380F0100F1FF1D0807E2030507E15438375246323032350000000000000000000000
@@ -1,5 +1,8 @@
1
1
 
2
- 2023-01-26T08:47:34.307872 ... I --- 29:207706 63:262142 --:------ 10E0 029 000001C8260D0467FFFFFFFFFFFFFFFFFFFF564D432D31355250303100 # 10E0| I|29:207706
2
+ 2023-01-26T08:47:34.307872 ... I --- 29:207706 63:262142 --:------ 10E0 029 000001C8260D0467FFFFFFFFFFFFFFFFFFFF564D432D31355250303100 # 10E0| I|29:207706
3
3
  2022-02-05T08:05:56.604400 ... I --- 29:215374 63:262142 --:------ 10E0 029 000001C8260A0367FFFFFFFFFFFFFFFFFFFF564D432D31355250303100
4
4
  2022-08-16T20:07:50.411731 080 I --- 29:226075 63:262142 --:------ 10E0 029 000001C8260D0467FFFFFFFFFFFFFFFFFFFF564D432D31355250303100
5
5
  2021-07-01T13:00:09.215900 ... I --- 29:237552 63:262142 --:------ 10E0 029 000001C8260D0467FFFFFFFFFFFFFFFFFFFF564D432D31355250303100
6
+
7
+ # Orcon MVS-15RHB fan from Hans-Mep
8
+ 2024-03-04T16:54:24.502000 ... I --- 29:206851 63:262142 --:------ 10E0 029 000001C826090367FFFFFFFFFFFFFFFFFFFF564D432D31355250303100 # {'description': 'VMC-15RP01', 'manufacturer_sub_id': 'C8', 'oem_code': '67', 'product_id': '26', 'date_1': '0000-00-00', 'date_2': '0000-00-00'} # Orcon MVS-15RHB fan
@@ -1,4 +1,4 @@
1
-
1
+ # Orcon HRU VMD-15RMS86
2
2
  2021-10-26T21:51:43.143100 ... I --- 32:132125 63:262142 --:------ 10E0 038 000001C8950B0A67FEFFFFFFFFFF150107E5564D442D3135524D533836000000000000000000
3
3
  2022-08-21T10:23:55.127583 076 RP --- 32:134446 37:171685 --:------ 10E0 038 000001C8950B0A67FEFFFFFFFFFF150107E5564D442D3135524D533836000000000000000000
4
4
  2022-08-18T23:09:54.528026 ... I --- 32:143293 63:262142 --:------ 10E0 038 000001C8950B0A67FEFFFFFFFFFF150107E5564D442D3135524D533836000000000000000000 # 10E0| I|32:143293
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  # Confirmed:
6
- 2022-02-19T18:00:35.234656 062 I --- 32:206250 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300
6
+ 2022-02-19T18:00:35.234656 062 I --- 32:206250 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300 # {'description': 'VMN-23LMH23', 'manufacturer_sub_id': 'C8', 'product_id': '5A', 'oem_code': '6C', 'date_1': '2016-06-01', 'date_2': '0000-00-00'}
7
7
  2023-04-27T16:21:21.263244 ... I --- 32:208628 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300
8
8
 
9
9
 
@@ -9,6 +9,9 @@
9
9
  2024-01-01T12:00:00.000000 --- I --- 32:168090 --:------ 32:168090 042F 009 000000100F00105050
10
10
  2024-01-01T12:00:00.000000 --- I --- 32:166025 --:------ 32:166025 042F 009 00050E0B0C00111470
11
11
 
12
+ # Airios RF Bridge BRDG-02R13
13
+ 2025-08-22T01:24:57.744252 058 I --- 18:154951 --:------ 18:154951 042F 009 0003020B0B000F0000 # {'counter_1': '0x0302', 'counter_3': '0x0B0B', 'counter_5': '0x000F', 'unknown_7': '0x0000'}
14
+
12
15
 
13
16
  ### HVAC, see: https://github.com/ramses-rf/ramses_rf/pull/135
14
17
 
@@ -8,10 +8,9 @@
8
8
 
9
9
 
10
10
  # The payload changes as the firmware is updated & date_2 is updated
11
- 2019-12-21T18:29:44.104610 057 RP --- 01:145038 18:056026 --:------ 10E0 038 000002FF0163FFFFFFFF140B07E1010807DD45766F20436F6C6F720000000000000000000000 # {'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2017-11-20', 'description': 'Evo Color'}
12
- 2020-05-14T15:41:48.743111 045 RP --- 01:145038 18:013393 --:------ 10E0 038 000002FF0163FFFFFFFF640307E4010807DD45766F20436F6C6F720000000000000000000000 # {'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2020-03-04', 'description': 'Evo Color'}
13
- 2021-01-25T23:23:00.520205 051 RP --- 01:145038 18:140805 --:------ 10E0 038 000002FF0163FFFFFFFF0B0807E4010807DD45766F20436F6C6F720000000000000000000000 # {'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2020-08-11', 'description': 'Evo Color'}
14
-
11
+ 2019-12-21T18:29:44.104610 057 RP --- 01:145038 18:056026 --:------ 10E0 038 000002FF0163FFFFFFFF140B07E1010807DD45766F20436F6C6F720000000000000000000000 # {'description': 'Evo Color', 'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2017-11-20'}
12
+ 2020-05-14T15:41:48.743111 045 RP --- 01:145038 18:013393 --:------ 10E0 038 000002FF0163FFFFFFFF640307E4010807DD45766F20436F6C6F720000000000000000000000 # {'description': 'Evo Color', 'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2020-03-04'}
13
+ 2021-01-25T23:23:00.520205 051 RP --- 01:145038 18:140805 --:------ 10E0 038 000002FF0163FFFFFFFF0B0807E4010807DD45766F20436F6C6F720000000000000000000000 # {'description': 'Evo Color', 'oem_code': 'FF', 'manufacturer_sub_id': 'FF', 'product_id': '01', 'date_1': '2013-08-01', 'date_2': '2020-08-11'}
15
14
 
16
15
  #
17
16
  # oem_code 'FF' - Honeywell/Resideo CH/DHW
@@ -82,6 +81,8 @@
82
81
 
83
82
 
84
83
  #
84
+ # oem_code '00' / sub-id 'C8' - heat
85
+ 2021-12-20T08:24:09.117900 ... I --- 34:021943 63:262142 --:------ 10E0 038 000001C8380A0100F1FF0C0107E1030B07DE5438375246323032350000000000000000000000 # {'description': 'T87RF2025', 'manufacturer_sub_id': 'C8', 'product_id': '38', 'oem_code': '00', 'date_1': '2014-11-03', 'date_2': '2017-01-12'}
85
86
  # oem_code '00' / sub-id 'C9', 30:069468 is a BUVA Boxstream
86
87
  2023-11-04T12:34:14.007611 062 I --- 30:068457 63:262142 --:------ 10E0 038 000001C9001B0000FEFEFFFFFFFF0E0507E2425244472D30324A415330310000000000000000 # {'description': 'BRDG-02JAS01', 'manufacturer_sub_id': 'C9', 'product_id': '00', 'date_2': '0000-00-00', 'date_1': '2018-05-14', 'oem_code': '00'}
87
88
  2022-01-01T00:00:00.000000 000 I --- 30:069468 63:262142 --:------ 10E0 038 000001C9001B0000FEFEFFFFFFFF0E0507E2425244472D30324A415330310000000000000000 # {'description': 'BRDG-02JAS01', 'manufacturer_sub_id': 'C9', 'product_id': '00', 'date_1': '2018-05-14', 'date_2': '0000-00-00', 'oem_code': '00'} # BUVA Boxstrea,
@@ -100,6 +101,7 @@
100
101
  2022-11-03T22:50:34.060486 ... I --- 37:255297 63:262142 --:------ 10E0 038 00000100290A0201FFFFFFFFFFFF140407E5564D532D31324842313600000000000000000000 # {'description': 'VMS-12HB16', 'manufacturer_sub_id': '00', 'product_id': '29', 'date_2': '0000-00-00', 'date_1': '2021-04-20', 'oem_code': '01'} #
101
102
 
102
103
  # oem_code '65' - ClimaRad HVAC
104
+ 2025-08-22T01:24:57.945961 058 I --- 18:154951 63:262142 --:------ 10E0 038 000001C8490F0065FEFEFFFFFFFF120607E4425244472D303252313300000000000000000000 # {'description': 'BRDG-02R13', 'manufacturer_sub_id': 'C8', 'product_id': '49', 'date_1': '2020-06-18', 'date_2': '0000-00-00', 'oem_code': '65'} # Airios RF Bridge, set for ClimaRad oem 65
103
105
  2024-10-09T11:50:24.287879 123 I --- 37:153226 63:262142 --:------ 10E0 038 000001C8830C0A65FEFFFFFFFFFF110C07E4564D442D30375250533133000000000000000000 # {'description': 'VMD-07RPS13', 'manufacturer_sub_id': 'C8', 'product_id': '83', 'date_1': '2020-12-17', 'date_2': '0000-00-00', 'oem_code': '65'} # ClimaRad VenturaV1x
104
106
  2024-10-16T18:43:52.761437 087 I --- 29:099029 63:262142 --:------ 10E0 029 000001C81D150765FFFFFFFFFFFFFFFFFFFF564D432D30375250303100 # {'description': 'VMC-07RP01', 'manufacturer_sub_id': 'C8', 'product_id': '1D', 'date_1': '0000-00-00', 'date_2': '0000-00-00', 'oem_code': '65'} # ClimaRad MiniBox Fan
105
107
  2024-10-16T21:32:07.084793 073 I --- 29:123150 63:262142 --:------ 10E0 029 000001C8410D0165FFFFFFFFFFFF0D0407DF564D4E2D30374C4D303100 # {'description': 'VMN-07LM01', 'manufacturer_sub_id': 'C8', 'product_id': '41', 'date_1': '2015-04-13', 'date_2': '0000-00-00', 'oem_code': '65'} # ClimaRad 4-button remote
@@ -121,12 +123,14 @@
121
123
  2019-11-27T22:39:00.000000 ... I --- 32:139773 63:262142 --:------ 10E0 038 000001C8A2050367FEFFFFFFFFFF1D0807E6564D442D3135524D5338362D3200000000000000 # {'description': 'VMD-15RMS86-2', 'manufacturer_sub_id': 'C8', 'product_id': 'A2', 'oem_code': '67', 'date_1': '2022-08-29', 'date_2': '0000-00-00'} # {"_SLUG": "HRU", "make": "Orcon", "model": "HRC 425"}
122
124
  2019-11-27T22:39:00.000000 ... I --- 32:137102 63:262142 --:------ 10E0 030 000001C85E0B0567FFFFFFFFFFFFFFFFFFFF564D442D3135525053373500 # {'description': 'VMD-15RPS75', 'manufacturer_sub_id': 'C8', 'product_id': '5E', 'oem_code': '67', 'date_1': '0000-00-00', 'date_2': '0000-00-00'} # {"_SLUG": "HRU", "make": "Orcon", "model": "HRC 235"}
123
125
 
126
+ 2024-03-04T16:54:24.502000 ... I --- 29:206851 63:262142 --:------ 10E0 029 000001C826090367FFFFFFFFFFFFFFFFFFFF564D432D31355250303100 # {'description': 'VMC-15RP01', 'manufacturer_sub_id': 'C8', 'oem_code': '67', 'product_id': '26', 'date_1': '0000-00-00', 'date_2': '0000-00-00'} # Orcon MVS-15RHB fan
127
+
124
128
  # oem_code '6C' - Nuaire HVAC
125
129
  2019-11-27T22:39:12.877929 061 RP --- 30:082155 18:013393 --:------ 10E0 038 000001C90011006CFEFFFFFFFFFF090907E0425244472D30324A415330310000000000000000 # {'description': 'BRDG-02JAS01', 'manufacturer_sub_id': 'C9', 'product_id': '00', 'oem_code': '6C', 'date_2': '0000-00-00', 'date_1': '2016-09-09'} # {"_SLUG": "PIV", "make": "Nuaire", "model": "Drimaster Eco-Heat-HC"}
126
130
  2023-04-13T10:43:39.077524 073 I --- 30:098165 63:262142 --:------ 10E0 038 000001C9001D006CFEFEFFFFFFFF120707E3425244472D30324A415330310000000000000000 # {'description': 'BRDG-02JAS01', 'manufacturer_sub_id': 'C9', 'product_id': '00', 'oem_code': '6C', 'date_2': '0000-00-00', 'date_1': '2019-07-18'} # {"_SLUG": "PIV", "make": "Nuaire", "model": "Drimaster Eco-Heat-HC"}
127
131
  2021-10-24T15:45:16.525879 055 I --- 32:168090 63:262142 --:------ 10E0 038 000001C85802016CFFFFFFFFFFFF0C0707E0564D532D32334842333300000000000000000000 # {'description': 'VMS-23HB33', 'manufacturer_sub_id': 'C8', 'product_id': '58', 'oem_code': '6C', 'date_2': '0000-00-00', 'date_1': '2016-07-12'} # {"_SLUG": "HUM", "make": "Nuaire", "model": "Drimaster RelHum Sensor"}
128
132
  2022-01-01T00:00:00.000000 000 I --- 32:172522 63:262142 --:------ 10E0 029 000001C85901016CFFFFFFFFFFFF1F0507E0564D4E2D32334C4D333300 # {'description': 'VMN-23LM33', 'manufacturer_sub_id': 'C8', 'product_id': '59', 'oem_code': '6C', 'date_2': '0000-00-00', 'date_1': '2016-05-31'} # {"_SLUG": "???", "make": "Nuaire", "model": None}
129
-
133
+ 2022-02-19T18:00:35.234656 062 I --- 32:206250 63:262142 --:------ 10E0 030 000001C85A01016CFFFFFFFFFFFF010607E0564D4E2D32334C4D48323300 # {'description': 'VMN-23LMH23', 'manufacturer_sub_id': 'C8', 'product_id': '5A', 'oem_code': '6C', 'date_1': '2016-06-01', 'date_2': '0000-00-00'}
130
134
 
131
135
  #
132
136
  # WIP
@@ -0,0 +1,4 @@
1
+ # system sync
2
+
3
+ # Airios RF Bridge
4
+ 2025-08-17T15:44:55.418472 061 I --- 18:154951 --:------ 18:154951 1F09 003 0006B3 # {'remaining_seconds': 171.5, '_next_sync': '15:47:46'}
@@ -123,3 +123,5 @@
123
123
  2024-11-09T18:33:29.759645 ... W --- 37:153226 29:123160 --:------ 1FC9 012 0031D996568A00230996568A # {'phase': 'accept', 'bindings': [['00', '31D9', '37:153226'], ['00', '2309', '37:153226']]} # 2309 reports a constant , set?
124
124
  2024-11-09T18:33:29.763814 ... I --- 29:123160 37:153226 --:------ 1FC9 001 00 # {'phase': 'confirm', 'bindings': [['00']]}
125
125
  2024-11-11T14:36:41.745628 ... I --- 29:123160 37:153226 --:------ 1FC9 006 001FC975E118 # {'phase': 'confirm', 'bindings': [['00', '1FC9', '29:123160']]} # made up by ramses_rf, config was "21"
126
+ # ClimaRad Ventura V1x reply binding to RF Bridge
127
+ 2025-08-17T14:36:00.000000 ... I --- 37:153226 --:------ 37:153226 1FC9 030 0031D996568A0031E096568A002E1096568A6510E096568A001FC996568A # {'phase': 'offer', 'bindings': [['00', '31D9', '37:153226'], ['00', '31E0', '37:153226'], ['00', '2E10', '37:153226'], ['65', '10E0', '37:153226'], ['00', '1FC9', '37:153226']]}