ramses-rf 0.51.9__py3-none-any.whl → 0.52.1__py3-none-any.whl

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.
ramses_rf/gateway.py CHANGED
@@ -129,7 +129,7 @@ class Gateway(Engine):
129
129
  self.devices: list[Device] = []
130
130
  self.device_by_id: dict[DeviceIdT, Device] = {}
131
131
 
132
- self.msg_db: MessageIndex | None = None # MessageIndex()
132
+ self.msg_db: MessageIndex | None = None
133
133
 
134
134
  def __repr__(self) -> str:
135
135
  if not self.ser_name:
@@ -173,6 +173,12 @@ class Gateway(Engine):
173
173
  **self._packet_log,
174
174
  )
175
175
 
176
+ # initialize SQLite index, set in _tx/Engine
177
+ if self._sqlite_index: # TODO(eb): default to ON in Q4 2025
178
+ _LOGGER.info("Ramses RF starts SQLite MessageIndex")
179
+ self.create_sqlite_message_index() # if activated in ramses_cc > Engine
180
+
181
+ # temporarily turn on discovery, remember original state
176
182
  self.config.disable_discovery, disable_discovery = (
177
183
  True,
178
184
  self.config.disable_discovery,
@@ -184,6 +190,7 @@ class Gateway(Engine):
184
190
  if cached_packets:
185
191
  await self._restore_cached_packets(cached_packets)
186
192
 
193
+ # reset discovery to original state
187
194
  self.config.disable_discovery = disable_discovery
188
195
 
189
196
  if (
@@ -193,6 +200,9 @@ class Gateway(Engine):
193
200
  ):
194
201
  initiate_discovery(self.devices, self.systems)
195
202
 
203
+ def create_sqlite_message_index(self) -> None:
204
+ self.msg_db = MessageIndex() # start the index
205
+
196
206
  async def stop(self) -> None:
197
207
  """Stop the Gateway and tidy up."""
198
208
 
@@ -248,12 +258,13 @@ class Gateway(Engine):
248
258
  # return True
249
259
  return include_expired or not msg._expired
250
260
 
251
- msgs = [m for device in self.devices for m in device._msg_db]
261
+ msgs = [m for device in self.devices for m in device._msg_list]
252
262
 
253
263
  for system in self.systems:
254
264
  msgs.extend(list(system._msgs.values()))
255
265
  msgs.extend([m for z in system.zones for m in z._msgs.values()])
256
- # msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO
266
+ # msgs.extend([m for z in system.dhw for m in z._msgs.values()]) # TODO: DHW
267
+ # Related to/Fixes ramses_cc Issue 249 non-existing via-device _HW ?
257
268
 
258
269
  if self.msg_db:
259
270
  pkts = {
@@ -261,8 +272,8 @@ class Gateway(Engine):
261
272
  for msg in self.msg_db.all(include_expired=True)
262
273
  if wanted_msg(msg, include_expired=include_expired)
263
274
  }
264
-
265
- else:
275
+ else: # deprecated, to be removed in Q1 2026
276
+ # _LOGGER.warning("Missing MessageIndex")
266
277
  pkts = { # BUG: assumes pkts have unique dtms: may be untrue for contrived logs
267
278
  f"{repr(msg._pkt)[:26]}": f"{repr(msg._pkt)[27:]}"
268
279
  for msg in msgs
@@ -359,7 +370,7 @@ class Gateway(Engine):
359
370
  """
360
371
 
361
372
  def check_filter_lists(dev_id: DeviceIdT) -> None: # may: LookupError
362
- """Raise an LookupError if a device_id is filtered out by a list."""
373
+ """Raise a LookupError if a device_id is filtered out by a list."""
363
374
 
364
375
  if dev_id in self._unwanted: # TODO: shouldn't invalidate a msg
365
376
  raise LookupError(f"Can't create {dev_id}: it is unwanted or invalid")
ramses_rf/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (application layer)."""
2
2
 
3
- __version__ = "0.51.9"
3
+ __version__ = "0.52.1"
4
4
  VERSION = __version__
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramses_rf
3
- Version: 0.51.9
3
+ Version: 0.52.1
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
@@ -1,25 +1,25 @@
1
1
  ramses_cli/__init__.py,sha256=uvGzWqOf4avvgzxJNSLFWEelIWqSZ-AeLAZzg5x58bc,397
2
- ramses_cli/client.py,sha256=vbKS3KVPiGsDWLp5cR3SVBtXrs-TinzlxSbTgcb4G2k,19724
2
+ ramses_cli/client.py,sha256=NTLhHhTiYmp7nyE3vqIFR9zjwfot1wdIT7QuMUgubD0,20350
3
3
  ramses_cli/debug.py,sha256=vgR0lOHoYjWarN948dI617WZZGNuqHbeq6Tc16Da7b4,608
4
- ramses_cli/discovery.py,sha256=81XbmpNiCpUHVZBwo2g1eRwyJG-wZhpSsc44G3hHlFA,12972
4
+ ramses_cli/discovery.py,sha256=MWoahBnAAVzfK2S7EDLsY2WYqN_ZK9L-lktrj8_4cb0,12978
5
5
  ramses_cli/utils/cat_slow.py,sha256=AhUpM5gnegCitNKU-JGHn-DrRzSi-49ZR1Qw6lxe_t8,607
6
6
  ramses_cli/utils/convert.py,sha256=D_YiCyX5na9pgC-_NhBlW9N1dgRKUK-uLtLBfofjzZM,1804
7
7
  ramses_rf/__init__.py,sha256=VG3E9GHbtC6lx6E1DMQJeFitHnydMKJyPxQBethdrzg,1193
8
8
  ramses_rf/binding_fsm.py,sha256=uZAOl3i19KCXqqlaLJWkEqMMP7NJBhVPW3xTikQD1fY,25996
9
9
  ramses_rf/const.py,sha256=L3z31CZ-xqno6oZp_h-67CB_5tDDqTwSWXsqRtsjMcs,5460
10
- ramses_rf/database.py,sha256=eaD34qyYmjg1AZ5mU78CcjwSbEbjLSVzRXlSoZLtmbI,17264
11
- ramses_rf/dispatcher.py,sha256=7DNJ5nLpMnaJTCXhm_BLEAnMnYWlvh1XPdkMP_ucBGg,11290
12
- ramses_rf/entity_base.py,sha256=Byt8mFRUKETNiKHaL0cNaMywjLcopDG3Sldiy1Q7lAo,39213
10
+ ramses_rf/database.py,sha256=aQntZW-ARiJ8GFVeT5T4LLWMeshs_lw_tnNet_S146U,20785
11
+ ramses_rf/dispatcher.py,sha256=UqilAoL6T85ZFPkcpvcfuidNbusONngQoCVWHV6vOzk,11277
12
+ ramses_rf/entity_base.py,sha256=T3NCo41l6KDqip6ptLdYn2b7pmGit37NgAHoBvhT42s,56063
13
13
  ramses_rf/exceptions.py,sha256=mt_T7irqHSDKir6KLaf6oDglUIdrw0S40JbOrWJk5jc,3657
14
- ramses_rf/gateway.py,sha256=s2bhkUzR42mzL4lZ1crTBsEWMOMGI8tpuHN1UZdAB74,20564
14
+ ramses_rf/gateway.py,sha256=AEgVKoW1I3D8zYIkQfMnC6CN3TV1gxamfIaXRQ2IUSk,21216
15
15
  ramses_rf/helpers.py,sha256=TNk_QkpIOB3alOp1sqnA9LOzi4fuDCeapNlW3zTzNas,4250
16
16
  ramses_rf/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  ramses_rf/schemas.py,sha256=UhvRhV4nZ3kvrLLM3wwIguQUIjIgd_AKvp2wkTSpNEA,13468
18
- ramses_rf/version.py,sha256=NXm_d5LEm9kUTuOqMEH3o0RLs7W6Ahdv2527DIwmnJc,125
18
+ ramses_rf/version.py,sha256=X_vGsHP_Eb6ovijJi7zzwEWH5kud2r0V1sImKWLqKv4,125
19
19
  ramses_rf/device/__init__.py,sha256=sUbH5dhbYFXSoM_TPFRutpRutBRpup7_cQ9smPtDTy8,4858
20
- ramses_rf/device/base.py,sha256=WGkBTUNjRUEe-phxdtdiXVCZnTi6-i1i_YT6g689UTM,17450
21
- ramses_rf/device/heat.py,sha256=2sCsggySVcuTzyXDmgWy76QbhlU5MQWSejy3zgI5BDE,54242
22
- ramses_rf/device/hvac.py,sha256=SY2FpO54k4y5E7MYWyjMMRbBDqRLWgB8Cvk9lAOFkyY,44653
20
+ ramses_rf/device/base.py,sha256=Yx0LZwMEb49naY8FolZ8HEBFb6XCPQBTVN_TWyO2nKg,17777
21
+ ramses_rf/device/heat.py,sha256=UmZuA-5czrfoClVEeUAPWgze5obWNQpYI7ZPQpVJB6s,54704
22
+ ramses_rf/device/hvac.py,sha256=0iQt9yFXgapaaiLWimGYF1Mh2c_TR58JyaYvWU1nSdE,45605
23
23
  ramses_rf/system/__init__.py,sha256=uZLKio3gLlBzePa2aDQ1nxkcp1YXOGrn6iHTG8LiNIw,711
24
24
  ramses_rf/system/faultlog.py,sha256=GdGmVGT3137KsTlV_nhccgIFEmYu6DFsLTn4S-8JSok,12799
25
25
  ramses_rf/system/heat.py,sha256=3jaFEChU-HlWCRMY1y7u09s7AH4hT0pC63hnqwdmZOc,39223
@@ -32,24 +32,24 @@ ramses_tx/const.py,sha256=pnxq5upXvLUizv9Ye_I1llD9rAa3wddHgsSkc91AIUc,30300
32
32
  ramses_tx/exceptions.py,sha256=FJSU9YkvpKjs3yeTqUJX1o3TPFSe_B01gRGIh9b3PNc,2632
33
33
  ramses_tx/fingerprints.py,sha256=nfftA1E62HQnb-eLt2EqjEi_la0DAoT0wt-PtTMie0s,11974
34
34
  ramses_tx/frame.py,sha256=GzNsXr15YLeidJYGtk_xPqsZQh4ehDDlUCtT6rTDhT8,22046
35
- ramses_tx/gateway.py,sha256=Z2TLysmTsi6wc2LEvbF-mL141aesdcWEFRCm0zheR0I,11267
35
+ ramses_tx/gateway.py,sha256=8o9NyEAyIui3B6HA0R8o64u4U8NZFlNl0TQ6rhwMoCk,11369
36
36
  ramses_tx/helpers.py,sha256=J4OCRckp3JshGQTvvqEskFjB1hPS7uA_opVsuIqmZds,32915
37
37
  ramses_tx/logger.py,sha256=qYbUoNPnPaFWKVsYvLG6uTVuPTdZ8HsMzBbGx0DpBqc,10177
38
- ramses_tx/message.py,sha256=LnzLVMmdV1oNHbdoldCAFW3lESgOqzPWWDsHed5K7iI,13391
38
+ ramses_tx/message.py,sha256=-moQ8v3HVlNSl-x3U0DDfDcj8WQ7vLqclMNxsohbmnw,13449
39
39
  ramses_tx/opentherm.py,sha256=58PXz9l5x8Ou6Fm3y-R_UnGHCYahoi2RKIDdYStUMzk,42378
40
40
  ramses_tx/packet.py,sha256=_qHiPFWpQpKueZOgf1jJ93Y09iZjo3LZWStLglVkXg4,7370
41
- ramses_tx/parsers.py,sha256=g0vKu1vDXjjp_kV_iipeGL5M8XYi67AE3c97IZX00Qk,110888
41
+ ramses_tx/parsers.py,sha256=e6IwVEMLv2EL8gbZaM2s-qA3E2AN8dCwdIgfEbFo730,111029
42
42
  ramses_tx/protocol.py,sha256=9R3aCzuiWEyXmugmB5tyR_RhBlgfnpUXj7AsMP9BzzU,28867
43
43
  ramses_tx/protocol_fsm.py,sha256=ZKtehCr_4TaDdfdlfidFLJaOVTYtaEq5h4tLqNIhb9s,26827
44
44
  ramses_tx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- ramses_tx/ramses.py,sha256=DujcZe4WelHvPNKYfoz9YWmXNoCayV5UsAkiu8Y6vms,53432
46
- ramses_tx/schemas.py,sha256=18IPRdoCWXpcRg4v8Z1ehTnRronQPYGrf4AvRL-1OD0,12932
45
+ ramses_tx/ramses.py,sha256=NG81GBNZlap-Gi9ac-r6OFE-KaHvXsgPDWy-I2Irr-4,53698
46
+ ramses_tx/schemas.py,sha256=IYCDH0jp3446Gtl_378aBmWyXN90e-uYudfkZkOKR24,13147
47
47
  ramses_tx/transport.py,sha256=bGprlfuuwBgQ1bmBRSrcicuk7s-jVqyuKpZCfQ-sSpw,58469
48
48
  ramses_tx/typed_dicts.py,sha256=w-0V5t2Q3GiNUOrRAWiW9GtSwbta_7luME6GfIb1zhI,10869
49
49
  ramses_tx/typing.py,sha256=eF2SlPWhNhEFQj6WX2AhTXiyRQVXYnFutiepllYl2rI,5042
50
- ramses_tx/version.py,sha256=F7K6xGXIUnJDASKlhAoABr7EZ8WnHdqeUfJqZuvdczY,123
51
- ramses_rf-0.51.9.dist-info/METADATA,sha256=ITVv4OBf_zE3S2iCQ9Eqci8EuceqtCIfr9oyK5lE_Sw,4000
52
- ramses_rf-0.51.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
- ramses_rf-0.51.9.dist-info/entry_points.txt,sha256=NnyK29baOCNg8DinPYiZ368h7MTH7bgTW26z2A1NeIE,50
54
- ramses_rf-0.51.9.dist-info/licenses/LICENSE,sha256=-Kc35W7l1UkdiQ4314_yVWv7vDDrg7IrJfMLUiq6Nfs,1074
55
- ramses_rf-0.51.9.dist-info/RECORD,,
50
+ ramses_tx/version.py,sha256=Wf50ZhDvYDcZoyYmD6Yu8apfRhpvbfMyTBj_GYjoYbw,123
51
+ ramses_rf-0.52.1.dist-info/METADATA,sha256=7mrN8yPSMpAdK4-lYvWCmhKyRLrJgr2WQE4px21H7t0,4000
52
+ ramses_rf-0.52.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
+ ramses_rf-0.52.1.dist-info/entry_points.txt,sha256=NnyK29baOCNg8DinPYiZ368h7MTH7bgTW26z2A1NeIE,50
54
+ ramses_rf-0.52.1.dist-info/licenses/LICENSE,sha256=-Kc35W7l1UkdiQ4314_yVWv7vDDrg7IrJfMLUiq6Nfs,1074
55
+ ramses_rf-0.52.1.dist-info/RECORD,,
ramses_tx/gateway.py CHANGED
@@ -37,6 +37,7 @@ from .schemas import (
37
37
  SZ_PACKET_LOG,
38
38
  SZ_PORT_CONFIG,
39
39
  SZ_PORT_NAME,
40
+ SZ_SQLITE_INDEX,
40
41
  PktLogConfigT,
41
42
  PortConfigT,
42
43
  select_device_filter_mode,
@@ -112,6 +113,7 @@ class Engine:
112
113
  self._include,
113
114
  self._exclude,
114
115
  )
116
+ self._sqlite_index = kwargs.pop(SZ_SQLITE_INDEX, False) # default True?
115
117
  self._kwargs: dict[str, Any] = kwargs # HACK
116
118
 
117
119
  self._engine_lock = Lock() # FIXME: threading lock, or asyncio lock?
ramses_tx/message.py CHANGED
@@ -96,7 +96,9 @@ class MessageBase:
96
96
 
97
97
  if self.src.id == self._addrs[0].id: # type: ignore[unreachable]
98
98
  name_0 = self._name(self.src)
99
- name_1 = "" if self.dst == self.src else self._name(self.dst)
99
+ name_1 = (
100
+ "" if self.dst is self.src else self._name(self.dst)
101
+ ) # use 'is', issue_cc 318
100
102
  else:
101
103
  name_0 = ""
102
104
  name_1 = self._name(self.src)
ramses_tx/parsers.py CHANGED
@@ -1955,6 +1955,8 @@ def parser_2411(payload: str, msg: Message) -> dict[str, Any]:
1955
1955
  "max_value": parser(payload[26:34][-length:]), # type: ignore[operator]
1956
1956
  "precision": parser(payload[34:42][-length:]), # type: ignore[operator]
1957
1957
  "_value_42": payload[42:],
1958
+ # Flexible footer - capture everything after precision
1959
+ # eg. older Orcon models may have a footer of 2 bytes
1958
1960
  }
1959
1961
  )
1960
1962
  except AssertionError as err:
ramses_tx/ramses.py CHANGED
@@ -478,10 +478,10 @@ CODES_SCHEMA: dict[Code, dict[str, Any]] = { # rf_unknown
478
478
  },
479
479
  Code._2411: { # fan_params, HVAC
480
480
  SZ_NAME: "fan_params",
481
- I_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}([0-9A-F]{8}){4}[0-9A-F]{4}$",
481
+ I_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}([0-9A-F]{8}){4}[0-9A-F]{2,6}$", # Allow 2-6 byte footer
482
482
  RQ: r"^(00|01|15|16|17|21)00[0-9A-F]{2}((00){19})?$",
483
- RP: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}(([0-9A-F]{8}){3}[0-9A-F]{4})?$",
484
- W_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}(([0-9A-F]{8}){3}[0-9A-F]{4})?$",
483
+ RP: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}([0-9A-F]{8}){3}[0-9A-F]{2,6}$", # 4 blocks + footer
484
+ W_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}([0-9A-F]{8}){3}[0-9A-F]{2,6}$", # Same as RP
485
485
  },
486
486
  Code._2420: { # unknown_2420, from OTB
487
487
  SZ_NAME: "message_2420",
@@ -1267,6 +1267,14 @@ _22F1_SCHEMES: dict[str, dict[str, str]] = {
1267
1267
 
1268
1268
  # unclear if true for only Orcon/*all* models
1269
1269
  _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1270
+ "01": { # all?
1271
+ SZ_DESCRIPTION: "Support",
1272
+ SZ_MIN_VALUE: 0xFF, # None?
1273
+ SZ_MAX_VALUE: 0xFF,
1274
+ SZ_PRECISION: 1,
1275
+ SZ_DATA_TYPE: "00",
1276
+ SZ_DATA_UNIT: "",
1277
+ },
1270
1278
  "31": { # slot 09 (FANs produced after 2021)
1271
1279
  SZ_DESCRIPTION: "Time to change filter (days)",
1272
1280
  SZ_MIN_VALUE: 0,
ramses_tx/schemas.py CHANGED
@@ -338,7 +338,6 @@ SCH_GLOBAL_TRAITS_DICT, SCH_TRAITS = sch_global_traits_dict_factory()
338
338
  #
339
339
  # Device lists (Engine configuration)
340
340
 
341
-
342
341
  DeviceIdT = NewType("DeviceIdT", str) # TypeVar('DeviceIdT', bound=str) #
343
342
  DevIndexT = NewType("DevIndexT", str)
344
343
  DeviceListT: TypeAlias = dict[DeviceIdT, DeviceTraitsT]
@@ -397,10 +396,14 @@ def select_device_filter_mode(
397
396
 
398
397
  #
399
398
  # 5/5: Gateway (engine) configuration
399
+
400
400
  SZ_DISABLE_SENDING: Final = "disable_sending"
401
401
  SZ_DISABLE_QOS: Final = "disable_qos"
402
402
  SZ_ENFORCE_KNOWN_LIST: Final[str] = f"enforce_{SZ_KNOWN_LIST}"
403
403
  SZ_EVOFW_FLAG: Final = "evofw_flag"
404
+ SZ_SQLITE_INDEX: Final = (
405
+ "sqlite_index" # temporary 0.52.x SQLite dev config option in ramses_cc
406
+ )
404
407
  SZ_USE_REGEX: Final = "use_regex"
405
408
 
406
409
  SCH_ENGINE_DICT = {
@@ -408,10 +411,13 @@ SCH_ENGINE_DICT = {
408
411
  vol.Optional(SZ_DISABLE_QOS, default=None): vol.Any(
409
412
  None, # None is selective QoS (e.g. QoS only for bindings, schedule, etc.)
410
413
  bool,
411
- ), # in long term, this default to be True (and no None)
414
+ ), # in the long term, this default to be True (not None)
412
415
  vol.Optional(SZ_ENFORCE_KNOWN_LIST, default=False): bool,
413
416
  vol.Optional(SZ_EVOFW_FLAG): vol.Any(None, str),
414
417
  # vol.Optional(SZ_PORT_CONFIG): SCH_SERIAL_PORT_CONFIG,
418
+ vol.Optional(
419
+ SZ_SQLITE_INDEX, default=False
420
+ ): bool, # temporary 0.52.x dev config option
415
421
  vol.Optional(SZ_USE_REGEX): dict, # vol.All(ConvertNullToDict(), dict),
416
422
  vol.Optional(SZ_COMMS_PARAMS): SCH_COMMS_PARAMS,
417
423
  }
ramses_tx/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (transport layer)."""
2
2
 
3
- __version__ = "0.51.9"
3
+ __version__ = "0.52.1"
4
4
  VERSION = __version__