ramses-rf 0.51.2__tar.gz → 0.51.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/PKG-INFO +1 -1
  2. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/device/hvac.py +2 -2
  3. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/entity_base.py +4 -1
  4. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/version.py +1 -1
  5. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/parsers.py +15 -6
  6. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/ramses.py +1 -1
  7. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/transport.py +74 -11
  8. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/version.py +1 -1
  9. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_ventura.log +19 -4
  10. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_042f.log +3 -0
  11. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_10e0.log +1 -0
  12. ramses_rf-0.51.4/tests/tests/parsers/code_1f09.log +4 -0
  13. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1fc9.log +2 -0
  14. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2210.log +4 -0
  15. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_apis_hvac.py +73 -3
  16. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/dependabot.yml +0 -0
  18. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/workflows/check-lint.yml +0 -0
  19. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/workflows/check-test.yml +0 -0
  20. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/workflows/check-type.yml +0 -0
  21. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.github/workflows/publish-hatch.yml +0 -0
  22. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.gitignore +0 -0
  23. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/.pre-commit-config.yaml +0 -0
  24. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/LICENSE +0 -0
  25. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/README-developers.md +0 -0
  26. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/README.md +0 -0
  27. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/client.py +0 -0
  28. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/misc/fingerprints.log +0 -0
  29. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/misc/ser2net.yaml +0 -0
  30. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/misc/ti_3410/notes.sh +0 -0
  31. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/misc/ti_3410/ti_3410.fw +0 -0
  32. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/pyproject.toml +0 -0
  33. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/__init__.py +0 -0
  34. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/client.py +0 -0
  35. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/debug.py +0 -0
  36. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/discovery.py +0 -0
  37. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/utils/cat_slow.py +0 -0
  38. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_cli/utils/convert.py +0 -0
  39. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/__init__.py +0 -0
  40. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/binding_fsm.py +0 -0
  41. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/const.py +0 -0
  42. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/database.py +0 -0
  43. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/device/__init__.py +0 -0
  44. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/device/base.py +0 -0
  45. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/device/heat.py +0 -0
  46. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/dispatcher.py +0 -0
  47. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/exceptions.py +0 -0
  48. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/gateway.py +0 -0
  49. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/helpers.py +0 -0
  50. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/py.typed +0 -0
  51. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/schemas.py +0 -0
  52. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/system/__init__.py +0 -0
  53. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/system/faultlog.py +0 -0
  54. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/system/heat.py +0 -0
  55. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/system/schedule.py +0 -0
  56. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_rf/system/zones.py +0 -0
  57. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/__init__.py +0 -0
  58. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/address.py +0 -0
  59. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/command.py +0 -0
  60. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/const.py +0 -0
  61. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/exceptions.py +0 -0
  62. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/fingerprints.py +0 -0
  63. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/frame.py +0 -0
  64. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/gateway.py +0 -0
  65. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/helpers.py +0 -0
  66. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/logger.py +0 -0
  67. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/message.py +0 -0
  68. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/opentherm.py +0 -0
  69. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/packet.py +0 -0
  70. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/protocol.py +0 -0
  71. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/protocol_fsm.py +0 -0
  72. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/py.typed +0 -0
  73. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/schemas.py +0 -0
  74. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/typed_dicts.py +0 -0
  75. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/ramses_tx/typing.py +0 -0
  76. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/requirements.txt +0 -0
  77. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/requirements_dev.txt +0 -0
  78. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_apis_mock.py +0 -0
  79. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_mock_faultlog.py +0 -0
  80. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_mock_schedule.py +0 -0
  81. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_packets_bad.py +0 -0
  82. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_performance_WIP.py +0 -0
  83. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/_test_state_mgt.py +0 -0
  84. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/common.py +0 -0
  85. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/__init__.py +0 -0
  86. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/command.py +0 -0
  87. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/const.py +0 -0
  88. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/device_heat.py +0 -0
  89. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/device_hvac.py +0 -0
  90. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/deprecated/mocked_devices/transport.py +0 -0
  91. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/__init__.py +0 -0
  92. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/ctl_bdr_91t.log +0 -0
  93. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/dts_ctl_sensor.log +0 -0
  94. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/hcw_ctl_sensor.log +0 -0
  95. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/rnd_ctl_sensor.log +0 -0
  96. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/rnd_ctl_sensor.yaml +0 -0
  97. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/heat/trv_ctl.log +0 -0
  98. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/co2_fan_itho.json +0 -0
  99. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/co2_fan_itho.log +0 -0
  100. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/co2_fan_itho.yaml +0 -0
  101. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/dis_fan_orcon.json +0 -0
  102. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/dis_fan_orcon.log +0 -0
  103. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_climarad.log +0 -0
  104. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_nuaire.json +0 -0
  105. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_nuaire.log +0 -0
  106. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_nuaire.yaml +0 -0
  107. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/bindings/hvac/rem_fan_vasco.log +0 -0
  108. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/devices/device_02.log +0 -0
  109. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/devices/device_04.log +0 -0
  110. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/devices/device_10.log +0 -0
  111. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/devices/device_13.log +0 -0
  112. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/devices/device_22.log +0 -0
  113. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_off.json +0 -0
  114. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_dev_class/hvac/known_list_eavesdrop_on.json +0 -0
  115. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_dev_class/hvac/packet.log +0 -0
  116. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/packet.log +0 -0
  117. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_off.json +0 -0
  118. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_long/schema_eavesdrop_on.json +0 -0
  119. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/packet.log +0 -0
  120. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_off.json +0 -0
  121. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_trv_actuator_mixed/schema_eavesdrop_on.json +0 -0
  122. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_ufh_circuits/packet.log +0 -0
  123. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_off.json +0 -0
  124. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/_ufh_circuits/schema_eavesdrop_on.json +0 -0
  125. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/app_cntrl/packet.log +0 -0
  126. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_off.json +0 -0
  127. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/app_cntrl/schema_eavesdrop_on.json +0 -0
  128. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/trv_actuators/packet.log +0 -0
  129. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_off.json +0 -0
  130. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/trv_actuators/schema_eavesdrop_on.json +0 -0
  131. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_000/packet.log +0 -0
  132. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_off.json +0 -0
  133. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_000/schema_eavesdrop_on.json +0 -0
  134. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_001/packet.log +0 -0
  135. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_off.json +0 -0
  136. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_001/schema_eavesdrop_on.json +0 -0
  137. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_002/packet.log +0 -0
  138. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_off.json +0 -0
  139. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_002/schema_eavesdrop_on.json +0 -0
  140. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_003/packet.log +0 -0
  141. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_off.json +0 -0
  142. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_003/schema_eavesdrop_on.json +0 -0
  143. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_004/packet.log +0 -0
  144. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_off.json +0 -0
  145. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/eavesdrop_schema/zone_sensors_004/schema_eavesdrop_on.json +0 -0
  146. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/10e0_xxxx.log +0 -0
  147. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/_gather.sh +0 -0
  148. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/01_EvoTouch_Colour.log +0 -0
  149. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/01_Evo_Color.log +0 -0
  150. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/01_IONA_RAI_Prototype.log +0 -0
  151. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/02_HCE80_V3.10_061117..log +0 -0
  152. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/04_HR92 Radiator Ctrl_.log +0 -0
  153. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/08_Jasper_EIM.log +0 -0
  154. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/10_R8810A_Bridge.log +0 -0
  155. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/10_R8820.log +0 -0
  156. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/30_Internet_Gateway.log +0 -0
  157. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/31_Jasper_Stat_TXXX.log +0 -0
  158. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/heat/34_T87RF2025.log +0 -0
  159. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/18_BRDG-02A55.log +0 -0
  160. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/18_HRA82.log +0 -0
  161. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/20.log +0 -0
  162. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/21_CCU-12T20.log +0 -0
  163. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMC-07RP01.log +0 -0
  164. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMC-15RP01.log +0 -0
  165. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMC-17RP01.log +0 -0
  166. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMN-07LM01.log +0 -0
  167. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMN-15LF01.log +0 -0
  168. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMN-17LMP01.log +0 -0
  169. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMS-15C16.log +0 -0
  170. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/29_VMS-17HB01.log +0 -0
  171. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/30_BRDG-02EM23.log +0 -0
  172. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/30_BRDG-02JAS01.log +0 -0
  173. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMC-15RPS34.log +0 -0
  174. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS64.log +0 -0
  175. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMD-15RMS86.log +0 -0
  176. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMD-17RPS01.log +0 -0
  177. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMN-23LM33.log +0 -0
  178. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMN-23LMH23.log +0 -0
  179. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMS-15CM17.log +0 -0
  180. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMS-23C33.log +0 -0
  181. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMS-23HB33.log +0 -0
  182. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/32_VMZ-15V13.log +0 -0
  183. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/37_VMD-07RPS13.log +0 -0
  184. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/37_VMI-15MC01log +0 -0
  185. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/37_VMI-15WSJ53.log +0 -0
  186. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/37_VMS-02J52.log +0 -0
  187. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/37_VMS-12C39.log +0 -0
  188. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/99_CVE-RF.log +0 -0
  189. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/fingerprints/hvac/99_VMS-17C01.log +0 -0
  190. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/helpers.py +0 -0
  191. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/logger/packet_in.log +0 -0
  192. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/logger/packet_out.log +0 -0
  193. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/logs/pkts_bad_000.log +0 -0
  194. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/logs/pkts_tba_000.log +0 -0
  195. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/logs/system_cache.json +0 -0
  196. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parser_helpers/pkt_addr_set.log +0 -0
  197. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parser_helpers/pkt_dev_class.log +0 -0
  198. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0001_wip.log +0 -0
  199. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0002.log +0 -0
  200. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0004_wip.log +0 -0
  201. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0005.log +0 -0
  202. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0006.log +0 -0
  203. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0009.log +0 -0
  204. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_000a.log +0 -0
  205. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_000c.log +0 -0
  206. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_000e.log +0 -0
  207. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_01ff_wip.log +0 -0
  208. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_0418.log +0 -0
  209. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1030.log +0 -0
  210. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1060.log +0 -0
  211. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_10d0.log +0 -0
  212. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1260.log +0 -0
  213. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1298.log +0 -0
  214. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_12a0.log +0 -0
  215. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_12c0.log +0 -0
  216. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_1300.log +0 -0
  217. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22c9.log +0 -0
  218. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22d0.log +0 -0
  219. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22d9.log +0 -0
  220. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22e0.log +0 -0
  221. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22e5.log +0 -0
  222. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22e9.log +0 -0
  223. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22f1.log +0 -0
  224. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22f2.log +0 -0
  225. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22f3.log +0 -0
  226. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22f4.log +0 -0
  227. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_22f7.log +0 -0
  228. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2309.log +0 -0
  229. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2349.log +0 -0
  230. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2411_wip.log +0 -0
  231. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2e04.log +0 -0
  232. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_2e10_wip.log +0 -0
  233. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_30c9.log +0 -0
  234. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3110_wip.log +0 -0
  235. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3120.log +0 -0
  236. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_313e_wip.log +0 -0
  237. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3150.log +0 -0
  238. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_31d9.log +0 -0
  239. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_31da.log +0 -0
  240. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3200.log +0 -0
  241. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3210.log +0 -0
  242. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3220.log +0 -0
  243. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3222.log +0 -0
  244. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3ef0_wip.log +0 -0
  245. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_3ef1_wip.log +0 -0
  246. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_4e01.log +0 -0
  247. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_4e02.log +0 -0
  248. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_4e04.log +0 -0
  249. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/parsers/code_4e15.log +0 -0
  250. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/_sched_002/packet.log +0 -0
  251. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/_sched_002/schedule.json +0 -0
  252. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/sched_001/packet.log +0 -0
  253. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/sched_001/schedule.json +0 -0
  254. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/sched_dhw/packet.log +0 -0
  255. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schedules/sched_dhw/schedule.json +0 -0
  256. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_100.json +0 -0
  257. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_101.json +0 -0
  258. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_102.json +0 -0
  259. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_103.json +0 -0
  260. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_104.json +0 -0
  261. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_105.json +0 -0
  262. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/jsn_files/schema_108.json +0 -0
  263. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_000.json +0 -0
  264. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_000.log +0 -0
  265. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_001.json +0 -0
  266. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_001.log +0 -0
  267. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_002.json +0 -0
  268. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_002.log +0 -0
  269. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_010.json +0 -0
  270. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_010.log +0 -0
  271. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_011.json +0 -0
  272. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_011.log +0 -0
  273. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_012.json +0 -0
  274. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_012.log +0 -0
  275. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_013.json +0 -0
  276. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_013.log +0 -0
  277. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_014.json +0 -0
  278. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_014.log +0 -0
  279. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_300.json +0 -0
  280. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_300.log +0 -0
  281. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_301.json +0 -0
  282. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_301.log +0 -0
  283. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_302.json +0 -0
  284. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_302.log +0 -0
  285. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_303.json +0 -0
  286. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_303.log +0 -0
  287. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_304.json +0 -0
  288. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_304.log +0 -0
  289. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_310.json +0 -0
  290. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/schemas/log_files/schema_310.log +0 -0
  291. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_heat_trv_00/config.json +0 -0
  292. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_heat_trv_00/packet.log +0 -0
  293. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_heat_trv_00/schema.json +0 -0
  294. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_hvac_nuaire/config.json +0 -0
  295. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_hvac_nuaire/known_list.json +0 -0
  296. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_hvac_nuaire/packet.log +0 -0
  297. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_hvac_nuaire/schema.json +0 -0
  298. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/_hvac_nuaire/status.json +0 -0
  299. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_otb_00/config.json +0 -0
  300. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_otb_00/packet.log +0 -0
  301. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_otb_00/schema.json +0 -0
  302. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_simple/packet.log +0 -0
  303. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_simple/schema.json +0 -0
  304. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_ufc_00/config.json +0 -0
  305. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_ufc_00/packet.log +0 -0
  306. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_ufc_01/packet.log +0 -0
  307. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_zxdavb/config.json +0 -0
  308. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_zxdavb/known_list.json +0 -0
  309. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_zxdavb/packet.log +0 -0
  310. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/systems/heat_zxdavb/schema.json +0 -0
  311. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_api_faultlog.py +0 -0
  312. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_api_schedule.py +0 -0
  313. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_apis_binding.py +0 -0
  314. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_apis_common.py +0 -0
  315. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_apis_heat.py +0 -0
  316. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_cli_utility.py +0 -0
  317. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_devices.py +0 -0
  318. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_eavesdrop_dev_class.py +0 -0
  319. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_eavesdrop_schema.py +0 -0
  320. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_helpers.py +0 -0
  321. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_parser_helpers.py +0 -0
  322. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_parsers.py +0 -0
  323. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_ramses_schema.py +0 -0
  324. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_schema_bits.py +0 -0
  325. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_schemas.py +0 -0
  326. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_systems.py +0 -0
  327. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests/test_vol_schemas.py +0 -0
  328. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/__init__.py +0 -0
  329. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/configs/config_heat.json +0 -0
  330. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/configs/config_hvac.json +0 -0
  331. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/conftest.py +0 -0
  332. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/logs/test_api_faultlog.log +0 -0
  333. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_api_faultlog.py +0 -0
  334. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_api_schedule.py +0 -0
  335. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_binding_fsm.py +0 -0
  336. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_create_stack.py +0 -0
  337. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_hgi_behaviors.py +0 -0
  338. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_protocol_fsm.py +0 -0
  339. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_use_regex.py +0 -0
  340. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/test_virt_network.py +0 -0
  341. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/virtual_rf/__init__.py +0 -0
  342. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/virtual_rf/const.py +0 -0
  343. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/virtual_rf/helpers.py +0 -0
  344. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_rf/virtual_rf/virtual_rf.py +0 -0
  345. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_tx/__init__.py +0 -0
  346. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/tests_tx/test_command.py +0 -0
  347. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/wip/_test_eavesdrop_dhw_sensor.py +0 -0
  348. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/wip/_test_eavesdrop_htg_control.py +0 -0
  349. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/wip/_test_eavesdrop_ufc_circuits.py +0 -0
  350. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/wip/_test_eavesdrop_zone_sensors.py +0 -0
  351. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/tests/wip/_test_eavesdrop_zone_type.py +0 -0
  352. {ramses_rf-0.51.2 → ramses_rf-0.51.4}/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.2
3
+ Version: 0.51.4
4
4
  Summary: A stateful RAMSES-II protocol decoder & analyser.
5
5
  Project-URL: Homepage, https://github.com/ramses-rf/ramses_rf
6
6
  Project-URL: Bug Tracker, https://github.com/ramses-rf/ramses_rf/issues
@@ -382,7 +382,7 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
382
382
  :return: bypass position as percentage: 0.0 (closed) or 1.0 (open), on error: "x_faulted"
383
383
  """
384
384
  # if both packets exist and both have the key, returns the most recent
385
- return self._msg_value([Code._22F7, Code._31DA], key=SZ_BYPASS_POSITION)
385
+ return self._msg_value((Code._22F7, Code._31DA), key=SZ_BYPASS_POSITION)
386
386
 
387
387
  @property
388
388
  def bypass_state(self) -> str | None:
@@ -474,7 +474,7 @@ class HvacVentilator(FilterChange): # FAN: RP/31DA, I/31D[9A]
474
474
  if v := self._msgs[Code._12A0].payload[0].get(SZ_INDOOR_HUMIDITY):
475
475
  assert isinstance(v, (float | type(None)))
476
476
  return v
477
- return self._msg_value([Code._12A0, Code._31DA], key=SZ_INDOOR_HUMIDITY)
477
+ return self._msg_value((Code._12A0, Code._31DA), key=SZ_INDOOR_HUMIDITY)
478
478
 
479
479
  @property
480
480
  def indoor_temp(self) -> float | None:
@@ -300,7 +300,10 @@ class _MessageDB(_Entity):
300
300
  if isinstance(code, str | tuple): # a code or a tuple of codes
301
301
  return self._msg_value_code(code, *args, **kwargs)
302
302
  # raise RuntimeError
303
- return self._msg_value_msg(code, *args, **kwargs) # assume is a Message
303
+ assert isinstance(code, Message), (
304
+ f"Invalid format: _msg_value({code})"
305
+ ) # catch invalidly formatted code, only Message
306
+ return self._msg_value_msg(code, *args, **kwargs)
304
307
 
305
308
  def _msg_value_code(
306
309
  self,
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.51.2"
3
+ __version__ = "0.51.4"
4
4
  VERSION = __version__
@@ -1382,18 +1382,27 @@ def parser_1fd4(payload: str, msg: Message) -> PayDictT._1FD4:
1382
1382
  def parser_2210(payload: str, msg: Message) -> dict[str, Any]:
1383
1383
  try:
1384
1384
  assert msg.verb in (RP, I_) or payload == "00"
1385
- assert payload[10:12] == payload[38:40] and payload[10:12] in (
1385
+ assert payload[10:12] == payload[38:40] and payload[
1386
+ 10:12
1387
+ ] in ( # auto requested fan speed step?
1386
1388
  "58",
1389
+ "64",
1387
1390
  "96",
1388
1391
  "FF",
1389
- ), f"expected (58|96|FF), not {payload[10:12]}"
1392
+ ), f"expected req.speed? (58|64|96|FF), not {payload[10:12]}"
1390
1393
  assert payload[20:22] == payload[48:50] and payload[20:22] in (
1391
1394
  "00",
1392
1395
  "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:]}"
1396
+ ), f"expected byte 10 (00|03), not {payload[20:22]}"
1397
+ assert payload[78:80] in ("00", "02"), (
1398
+ f"expected byte 39 (00|02), not {payload[78:80]}"
1399
+ )
1400
+ assert payload[80:82] in ("01", "08"), (
1401
+ f"expected byte 40 (01|08), not {payload[80:82]}"
1402
+ )
1403
+ assert payload[82:] in ("00", "40"), (
1404
+ f"expected byte 41- (00|40), not {payload[82:]}"
1405
+ )
1397
1406
 
1398
1407
  except AssertionError as err:
1399
1408
  _LOGGER.warning(f"{msg!r} < {_INFORM_DEV_MSG} ({err})")
@@ -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
@@ -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,
@@ -1160,14 +1177,27 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1160
1177
  ) -> None:
1161
1178
  _LOGGER.warning(f"MQTT disconnected: {reason_code.getName()}")
1162
1179
 
1180
+ was_connected = self._connected
1163
1181
  self._connected = False
1164
1182
 
1183
+ # If we were previously connected and had established communication,
1184
+ # notify that the device is now offline
1185
+ if was_connected and hasattr(self, "_topic_sub") and self._topic_sub:
1186
+ device_topic = self._topic_sub[:-3] # Remove "/rx" suffix
1187
+ _LOGGER.warning(f"{self}: the MQTT device is offline: {device_topic}")
1188
+
1189
+ # Pause writing since device is offline
1190
+ if hasattr(self, "_protocol"):
1191
+ self._protocol.pause_writing()
1192
+
1165
1193
  # Only attempt reconnection if we didn't deliberately disconnect
1166
1194
  if not self._closing and not reason_code.is_failure:
1167
1195
  # This was an unexpected disconnect, schedule reconnection
1196
+ _LOGGER.debug("MQTT unexpected disconnect - scheduling reconnection")
1168
1197
  self._schedule_reconnect()
1169
1198
  elif reason_code.is_failure and not self._closing:
1170
1199
  # Connection failed, also schedule reconnection
1200
+ _LOGGER.debug("MQTT connection failed - scheduling reconnection")
1171
1201
  self._schedule_reconnect()
1172
1202
 
1173
1203
  def _create_connection(self, msg: mqtt.MQTTMessage) -> None:
@@ -1191,7 +1221,12 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1191
1221
 
1192
1222
  self.client.subscribe(self._topic_sub, qos=self._mqtt_qos)
1193
1223
 
1194
- self._make_connection(gwy_id=msg.topic[-9:]) # type: ignore[arg-type]
1224
+ # Only call connection_made on first connection, not reconnections
1225
+ if not self._connection_established:
1226
+ self._connection_established = True
1227
+ self._make_connection(gwy_id=msg.topic[-9:]) # type: ignore[arg-type]
1228
+ else:
1229
+ _LOGGER.info("MQTT reconnected - protocol connection already established")
1195
1230
 
1196
1231
  # NOTE: self._frame_read() invoked from here
1197
1232
  def _on_message(
@@ -1211,23 +1246,51 @@ class MqttTransport(_FullTransport, _MqttTransportAbstractor):
1211
1246
  _LOGGER.info("Rx: %s", msg.payload)
1212
1247
 
1213
1248
  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()
1249
+ if msg.payload == b"offline":
1250
+ # Check if this offline message is for our current device
1251
+ if (
1252
+ hasattr(self, "_topic_sub")
1253
+ and self._topic_sub
1254
+ and msg.topic == self._topic_sub[:-3]
1255
+ ) or not hasattr(self, "_topic_sub"):
1256
+ _LOGGER.warning(
1257
+ f"{self}: the ESP device is offline (via LWT): {msg.topic}"
1258
+ )
1259
+ # Don't set _connected = False here - that's for MQTT connection, not ESP device
1260
+ if hasattr(self, "_protocol"):
1261
+ self._protocol.pause_writing()
1220
1262
 
1221
1263
  # BUG: using create task (self._loop.ct() & asyncio.ct()) causes the
1222
1264
  # BUG: event look to close early
1223
1265
  elif msg.payload == b"online":
1224
1266
  _LOGGER.info(
1225
- f"{self}: the MQTT device is online: {self._topic_sub[:-3]}"
1267
+ f"{self}: the ESP device is online (via status): {msg.topic}"
1226
1268
  )
1227
1269
  self._create_connection(msg)
1228
1270
 
1229
1271
  return
1230
1272
 
1273
+ # Handle data messages - if we don't have connection established yet but get data,
1274
+ # we can infer the gateway from the topic
1275
+ if not self._connection_established and msg.topic.endswith("/rx"):
1276
+ # Extract gateway ID from topic like "RAMSES/GATEWAY/18:123456/rx"
1277
+ topic_parts = msg.topic.split("/")
1278
+ if len(topic_parts) >= 3 and topic_parts[-2] not in ("+", "*"):
1279
+ gateway_id = topic_parts[-2] # Should be something like "18:123456"
1280
+ _LOGGER.info(
1281
+ f"Inferring gateway connection from data topic: {gateway_id}"
1282
+ )
1283
+
1284
+ # Set up topics and connection
1285
+ self._topic_pub = f"{'/'.join(topic_parts[:-1])}/tx"
1286
+ self._topic_sub = msg.topic
1287
+ self._extra[SZ_ACTIVE_HGI] = gateway_id
1288
+
1289
+ # Mark as connected and establish protocol connection
1290
+ self._connected = True
1291
+ self._connection_established = True
1292
+ self._make_connection(gwy_id=gateway_id) # type: ignore[arg-type]
1293
+
1231
1294
  try:
1232
1295
  payload = json.loads(msg.payload)
1233
1296
  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.2"
3
+ __version__ = "0.51.4"
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 # {}
@@ -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
 
@@ -100,6 +100,7 @@
100
100
  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
101
 
102
102
  # oem_code '65' - ClimaRad HVAC
103
+ 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
104
  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
105
  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
106
  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
@@ -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']]}
@@ -15,3 +15,7 @@
15
15
 
16
16
  # Orcon RF15 control unit (log from remyderuysscher via ramses_cc issue 65)
17
17
  2022-06-26T00:00:00.000001 ... RP --- 32:155021 18:071957 --:------ 2210 042 00FF00FFFFFF0000000000FFFFFFFFFF00FFFFFF0000000000FFFFFFFFFFFFFFFF000000000000020800 # {'unknown_10': 'FF', 'unknown_20': '00', 'unknown_78': '02', 'unknown_80': '08', 'unknown_82': '00'}
18
+ # Orcon HRC-400-EcoMax (log from AbeltjeNL via ramses_rf issue 247) unknown_10=64 when showering/auto, normally=FF
19
+ 2025-08-19T19:39:30.000000 074 RP --- 32:139370 18:025584 --:------ 2210 042 00FF00FFFF640000000003FFFFFFFFFF00FFFF640000000003FFFFFFFFFFFFFFFF000000000000000800 # {'unknown_10': '64', 'unknown_20': '03', 'unknown_78': '00', 'unknown_80': '08', 'unknown_82': '00'}
20
+ 2025-08-19T19:39:30.910438 074 RP --- 32:139370 18:025584 --:------ 2210 042 00FF00FFFFFF0000000000FFFFFFFFFF00FFFFFF0000000000FFFFFFFFFFFFFFFF000000000000000800 # {'unknown_10': 'FF', 'unknown_20': '00', 'unknown_78': '00', 'unknown_80': '08', 'unknown_82': '00'}
21
+ 2025-08-19T20:09:31.032118 074 RP --- 32:139370 18:025584 --:------ 2210 042 00FF00FFFFFF0000000000FFFFFFFFFF00FFFFFF0000000000FFFFFFFFFFFFFFFF000000000000000800 # {'unknown_10': 'FF', 'unknown_20': '00', 'unknown_78': '00', 'unknown_80': '08', 'unknown_82': '00'}
@@ -11,7 +11,7 @@ from ramses_tx.packet import Packet
11
11
 
12
12
 
13
13
  def _test_api(api: Callable, packets: dict[str]) -> None: # NOTE: incl. addr_set check
14
- """Test a verb|code pair that has a Command constructor."""
14
+ """Test a verb|code pair that has a Command constructor, src and dst."""
15
15
 
16
16
  for pkt_line, kwargs in packets.items():
17
17
  pkt = _create_pkt_from_frame(pkt_line)
@@ -22,6 +22,20 @@ def _test_api(api: Callable, packets: dict[str]) -> None: # NOTE: incl. addr_se
22
22
  _test_api_from_msg(api, msg)
23
23
 
24
24
 
25
+ def _test_api_one(
26
+ api: Callable, packets: dict[str]
27
+ ) -> None: # NOTE: incl. addr_set check
28
+ """Test a verb|code pair that has a Command constructor and src, but no dst."""
29
+
30
+ for pkt_line, kwargs in packets.items():
31
+ pkt = _create_pkt_from_frame(pkt_line)
32
+
33
+ msg = Message(pkt)
34
+
35
+ _test_api_one_from_kwargs(api, pkt, **kwargs)
36
+ _test_api_one_from_msg(api, msg)
37
+
38
+
25
39
  def _create_pkt_from_frame(pkt_line: str) -> Packet:
26
40
  """Create a pkt from a pkt_line and assert their frames match."""
27
41
 
@@ -31,7 +45,8 @@ def _create_pkt_from_frame(pkt_line: str) -> Packet:
31
45
 
32
46
 
33
47
  def _test_api_from_msg(api: Callable, msg: Message) -> Command:
34
- """Create a cmd from a msg and assert they're equal (*also* asserts payload)."""
48
+ """Create a cmd from a msg with a src_id, and assert they're equal
49
+ (*also* asserts payload)."""
35
50
 
36
51
  cmd: Command = api(
37
52
  msg.dst.id,
@@ -44,12 +59,39 @@ def _test_api_from_msg(api: Callable, msg: Message) -> Command:
44
59
  return cmd
45
60
 
46
61
 
62
+ def _test_api_one_from_msg(api: Callable, msg: Message) -> Command:
63
+ """Create a cmd from a msg and assert they're equal (*also* asserts payload)."""
64
+
65
+ cmd: Command = api(
66
+ msg.dst.id,
67
+ **{k: v for k, v in msg.payload.items()}, # if k[:1] != "_"},
68
+ # requirement turned off as it skips required item like _unknown_fan_info_flags
69
+ )
70
+
71
+ assert cmd == msg._pkt # must have exact same addr set
72
+
73
+ return cmd
74
+
75
+
47
76
  def _test_api_from_kwargs(api: Callable, pkt: Packet, **kwargs: Any) -> None:
77
+ """
78
+ Test comparing a created packet to an expected result.
79
+
80
+ :param api: Command lookup by Verb|Code
81
+ :param pkt: expected result to match
82
+ :param kwargs: arguments for the Command
83
+ """
48
84
  cmd = api(HRU, src_id=REM, **kwargs)
49
85
 
50
86
  assert str(cmd) == str(pkt)
51
87
 
52
88
 
89
+ def _test_api_one_from_kwargs(api: Callable, pkt: Packet, **kwargs: Any) -> None:
90
+ cmd = api(HRU, **kwargs)
91
+
92
+ assert str(cmd) == str(pkt)
93
+
94
+
53
95
  def test_set() -> None:
54
96
  for test_pkts in (SET_22F1_KWARGS, SET_22F7_KWARGS):
55
97
  pkt = list(test_pkts)[0]
@@ -57,7 +99,7 @@ def test_set() -> None:
57
99
  _test_api(api, test_pkts)
58
100
 
59
101
 
60
- HRU = "32:155617"
102
+ HRU = "32:155617" # also used as a FAN
61
103
  REM = "37:171871"
62
104
  NUL = "--:------"
63
105
 
@@ -108,3 +150,31 @@ SET_22F7_KWARGS = {
108
150
  f"002 W --- {REM} {HRU} {NUL} 22F7 002 0000": {"bypass_mode": "off"},
109
151
  f"002 W --- {REM} {HRU} {NUL} 22F7 002 00C8": {"bypass_mode": "on"},
110
152
  }
153
+
154
+
155
+ # new tests
156
+ def test_get() -> None:
157
+ for test_pkts in (GET_12A0_KWARGS, GET_1298_KWARGS):
158
+ pkt = list(test_pkts)[0]
159
+ api = CODE_API_MAP[f"{pkt[4:6]}|{pkt[41:45]}"]
160
+ _test_api_one(api, test_pkts)
161
+
162
+
163
+ GET_12A0_KWARGS = {
164
+ f"000 I --- {HRU} {NUL} {HRU} 12A0 002 00EF": {
165
+ "indoor_humidity": None
166
+ }, # shouldn't be OK
167
+ #
168
+ f"082 I --- {HRU} {NUL} {HRU} 12A0 002 0037": {"indoor_humidity": 0.55},
169
+ }
170
+
171
+ GET_1298_KWARGS = {
172
+ f"064 I --- {HRU} {NUL} {HRU} 1298 003 000322": {"co2_level": 802},
173
+ }
174
+
175
+ # TODO Add tests to get states from 31DA
176
+ # (verifies SQLite refactoring)
177
+ # set up HVAC system first from messages
178
+ #
179
+ # Example: current_temperature(self) in ramses_cc.climate.py
180
+ # simulates requesting Climate self._device.indoor_temp from a system
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes