casambi-bt-revamped 0.3.12.dev15__tar.gz → 0.3.12.dev16__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 (31) hide show
  1. {casambi_bt_revamped-0.3.12.dev15/src/casambi_bt_revamped.egg-info → casambi_bt_revamped-0.3.12.dev16}/PKG-INFO +1 -1
  2. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/setup.cfg +1 -1
  3. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_client.py +39 -0
  4. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_version.py +1 -1
  5. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16/src/casambi_bt_revamped.egg-info}/PKG-INFO +1 -1
  6. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/LICENSE +0 -0
  7. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/README.md +0 -0
  8. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/pyproject.toml +0 -0
  9. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/__init__.py +0 -0
  10. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_cache.py +0 -0
  11. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_casambi.py +0 -0
  12. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_classic_crypto.py +0 -0
  13. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_constants.py +0 -0
  14. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_discover.py +0 -0
  15. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_encryption.py +0 -0
  16. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_invocation.py +0 -0
  17. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_keystore.py +0 -0
  18. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_network.py +0 -0
  19. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_operation.py +0 -0
  20. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_switch_events.py +0 -0
  21. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/_unit.py +0 -0
  22. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/errors.py +0 -0
  23. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/CasambiBt/py.typed +0 -0
  24. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/casambi_bt_revamped.egg-info/SOURCES.txt +0 -0
  25. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/casambi_bt_revamped.egg-info/dependency_links.txt +0 -0
  26. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/casambi_bt_revamped.egg-info/requires.txt +0 -0
  27. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/src/casambi_bt_revamped.egg-info/top_level.txt +0 -0
  28. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/tests/test_classic_protocol.py +0 -0
  29. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/tests/test_legacy_protocol_handling.py +0 -0
  30. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/tests/test_switch_event_logs.py +0 -0
  31. {casambi_bt_revamped-0.3.12.dev15 → casambi_bt_revamped-0.3.12.dev16}/tests/test_unit_state_logs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: casambi-bt-revamped
3
- Version: 0.3.12.dev15
3
+ Version: 0.3.12.dev16
4
4
  Summary: Forked Casambi Bluetooth client library with switch event support, use original if no special need. https://github.com/lkempf/casambi-bt
5
5
  Home-page: https://github.com/rankjie/casambi-bt
6
6
  Author: rankjie
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = casambi-bt-revamped
3
- version = 0.3.12.dev15
3
+ version = 0.3.12.dev16
4
4
  author = rankjie
5
5
  author_email = rankjie@gmail.com
6
6
  description = Forked Casambi Bluetooth client library with switch event support, use original if no special need. https://github.com/lkempf/casambi-bt
@@ -1624,6 +1624,39 @@ class CasambiClient:
1624
1624
  visitor_key = self._network.classicVisitorKey()
1625
1625
  manager_key = self._network.classicManagerKey()
1626
1626
 
1627
+ def _walk_classic_records(data: bytes) -> bool:
1628
+ """Check if data is a plausible Classic unit state record stream.
1629
+
1630
+ Walks the same record structure as _parseClassicUnitStates:
1631
+ - unit_id(1) + flags(1) + optional extras + state(state_len)
1632
+ - unit_id 0xF0 is a command response (no extras, state_len bytes consumed)
1633
+ Accepts if >=1 record parsed AND pos ends exactly at len(data).
1634
+ """
1635
+ pos = 0
1636
+ count = 0
1637
+ while pos + 3 <= len(data): # Match Android available()>=3
1638
+ unit_id = data[pos]
1639
+ flags = data[pos + 1]
1640
+ state_len = flags & 0x0F
1641
+ # 0 and 255 are Classic control bytes, not valid unit records
1642
+ # inside a record stream (handled at dispatch level).
1643
+ if unit_id == 0 or unit_id == 255:
1644
+ return False
1645
+ pos += 2
1646
+ if unit_id == 0xF0:
1647
+ # Command response: cmd_id(1) + seq(1) + payload(state_len-2).
1648
+ if state_len < 2:
1649
+ return False
1650
+ pos += state_len
1651
+ else:
1652
+ has_extra1 = (flags & 0x20) != 0
1653
+ has_extra2 = (flags & 0x40) != 0
1654
+ pos += int(has_extra1) + int(has_extra2) + state_len
1655
+ if pos > len(data):
1656
+ return False
1657
+ count += 1
1658
+ return count >= 1 and pos == len(data)
1659
+
1627
1660
  def _plausible_payload(payload: bytes) -> bool:
1628
1661
  if not payload:
1629
1662
  return False
@@ -1638,6 +1671,12 @@ class CasambiClient:
1638
1671
  rec_len = (payload[0] - 239) & 0xFF
1639
1672
  if 2 <= rec_len <= len(payload):
1640
1673
  return True
1674
+ # Classic unit state record stream or control byte.
1675
+ if self._protocolMode == ProtocolMode.CLASSIC:
1676
+ if payload[0] in (0, 255):
1677
+ return True
1678
+ if _walk_classic_records(payload):
1679
+ return True
1641
1680
  return False
1642
1681
 
1643
1682
  def _score(verified: bool | None, payload: bytes) -> int:
@@ -7,4 +7,4 @@ Avoid using importlib.metadata in hot paths by providing a static version string
7
7
  __all__ = ["__version__"]
8
8
 
9
9
  # NOTE: Must match `casambi-bt/setup.cfg` [metadata] version.
10
- __version__ = "0.3.12.dev15"
10
+ __version__ = "0.3.12.dev16"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: casambi-bt-revamped
3
- Version: 0.3.12.dev15
3
+ Version: 0.3.12.dev16
4
4
  Summary: Forked Casambi Bluetooth client library with switch event support, use original if no special need. https://github.com/lkempf/casambi-bt
5
5
  Home-page: https://github.com/rankjie/casambi-bt
6
6
  Author: rankjie