casambi-bt-revamped 0.3.12.dev13__tar.gz → 0.3.12.dev14__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.
- {casambi_bt_revamped-0.3.12.dev13/src/casambi_bt_revamped.egg-info → casambi_bt_revamped-0.3.12.dev14}/PKG-INFO +1 -1
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/setup.cfg +1 -1
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_client.py +55 -6
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_version.py +1 -1
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14/src/casambi_bt_revamped.egg-info}/PKG-INFO +1 -1
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/LICENSE +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/README.md +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/pyproject.toml +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/__init__.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_cache.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_casambi.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_classic_crypto.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_constants.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_discover.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_encryption.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_invocation.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_keystore.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_network.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_operation.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_switch_events.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_unit.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/errors.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/py.typed +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/casambi_bt_revamped.egg-info/SOURCES.txt +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/casambi_bt_revamped.egg-info/dependency_links.txt +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/casambi_bt_revamped.egg-info/requires.txt +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/casambi_bt_revamped.egg-info/top_level.txt +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/tests/test_classic_protocol.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/tests/test_legacy_protocol_handling.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/tests/test_switch_event_logs.py +0 -0
- {casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/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.
|
|
3
|
+
Version: 0.3.12.dev14
|
|
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.
|
|
3
|
+
version = 0.3.12.dev14
|
|
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
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_client.py
RENAMED
|
@@ -366,6 +366,24 @@ class CasambiClient:
|
|
|
366
366
|
f"Classic connection hash read failed/too short (len={0 if raw_hash is None else len(raw_hash)})."
|
|
367
367
|
)
|
|
368
368
|
self._classicConnHash8 = bytes(raw_hash[:8])
|
|
369
|
+
|
|
370
|
+
# Parse Android's extended connection hash fields for diagnostics.
|
|
371
|
+
# Offset 8: unitId, 9: flags_lo, 10: MTU, 11: protocolVersion, 12: flags_hi
|
|
372
|
+
if len(raw_hash) >= 13:
|
|
373
|
+
ext_unit_id = raw_hash[8]
|
|
374
|
+
ext_flags_lo = raw_hash[9]
|
|
375
|
+
ext_mtu = raw_hash[10]
|
|
376
|
+
ext_proto_ver = raw_hash[11]
|
|
377
|
+
ext_flags_hi = raw_hash[12]
|
|
378
|
+
self._logger.warning(
|
|
379
|
+
"[CASAMBI_CLASSIC_CONN_HASH_EXT] variant=legacy unitId=%d flags=0x%04x mtu=%d protocolVersion=%d raw=%s",
|
|
380
|
+
ext_unit_id,
|
|
381
|
+
(ext_flags_hi << 8) | ext_flags_lo,
|
|
382
|
+
ext_mtu,
|
|
383
|
+
ext_proto_ver,
|
|
384
|
+
b2a(bytes(raw_hash[:min(len(raw_hash), 20)])),
|
|
385
|
+
)
|
|
386
|
+
|
|
369
387
|
# Android seeds the command divider with a random byte on startup (u1.C1751c).
|
|
370
388
|
self._classicCmdDiv = int.from_bytes(os.urandom(1), "big") or 1
|
|
371
389
|
self._classicTxSeq = 0
|
|
@@ -516,6 +534,24 @@ class CasambiClient:
|
|
|
516
534
|
self._classicHeaderMode = "conformant"
|
|
517
535
|
self._classicHashSource = "ca52_0001"
|
|
518
536
|
self._classicConnHash8 = bytes(first[:8])
|
|
537
|
+
|
|
538
|
+
# Parse Android's extended connection hash fields for diagnostics.
|
|
539
|
+
# Offset 8: unitId, 9: flags_lo, 10: MTU, 11: protocolVersion, 12: flags_hi
|
|
540
|
+
if len(first) >= 13:
|
|
541
|
+
ext_unit_id = first[8]
|
|
542
|
+
ext_flags_lo = first[9]
|
|
543
|
+
ext_mtu = first[10]
|
|
544
|
+
ext_proto_ver = first[11]
|
|
545
|
+
ext_flags_hi = first[12]
|
|
546
|
+
self._logger.warning(
|
|
547
|
+
"[CASAMBI_CLASSIC_CONN_HASH_EXT] variant=conformant unitId=%d flags=0x%04x mtu=%d protocolVersion=%d raw=%s",
|
|
548
|
+
ext_unit_id,
|
|
549
|
+
(ext_flags_hi << 8) | ext_flags_lo,
|
|
550
|
+
ext_mtu,
|
|
551
|
+
ext_proto_ver,
|
|
552
|
+
b2a(bytes(first[:min(len(first), 20)])),
|
|
553
|
+
)
|
|
554
|
+
|
|
519
555
|
self._classicCmdDiv = int.from_bytes(os.urandom(1), "big") or 1
|
|
520
556
|
self._classicTxSeq = 0
|
|
521
557
|
|
|
@@ -1045,11 +1081,11 @@ class CasambiClient:
|
|
|
1045
1081
|
else:
|
|
1046
1082
|
return bytes([counter, unit_id & 0xFF, 1, dimmer & 0xFF])
|
|
1047
1083
|
|
|
1048
|
-
async def _sendClassic(self, command_bytes: bytes) -> None:
|
|
1084
|
+
async def _sendClassic(self, command_bytes: bytes, *, target_uuid: str | None = None) -> None:
|
|
1049
1085
|
self._checkState(ConnectionState.AUTHENTICATED)
|
|
1050
1086
|
if self._protocolMode != ProtocolMode.CLASSIC:
|
|
1051
1087
|
raise ProtocolError("Classic send called while not in Classic protocol mode.")
|
|
1052
|
-
tx_uuid = self._classicTxCharUuid or self._dataCharUuid
|
|
1088
|
+
tx_uuid = target_uuid or self._classicTxCharUuid or self._dataCharUuid
|
|
1053
1089
|
if not tx_uuid:
|
|
1054
1090
|
raise ProtocolError("Classic TX characteristic UUID not set.")
|
|
1055
1091
|
if self._classicConnHash8 is None:
|
|
@@ -1304,12 +1340,22 @@ class CasambiClient:
|
|
|
1304
1340
|
if offset is not None:
|
|
1305
1341
|
utc_offset_minutes = int(offset.total_seconds()) // 60
|
|
1306
1342
|
|
|
1343
|
+
# Determine time-sync target and command byte per Android AbstractC1717h.X():
|
|
1344
|
+
# - Non-conformant: write to CA51, command byte 10
|
|
1345
|
+
# - Conformant: write to 0002 (mapped CA51), command byte 7
|
|
1346
|
+
if self._classicHeaderMode == "conformant":
|
|
1347
|
+
timesync_uuid = CASA_CLASSIC_CONFORMANT_CA51_CHAR_UUID # 0002
|
|
1348
|
+
timesync_cmd = 7
|
|
1349
|
+
else:
|
|
1350
|
+
timesync_uuid = CASA_CLASSIC_HASH_CHAR_UUID # CA51
|
|
1351
|
+
timesync_cmd = 10
|
|
1352
|
+
|
|
1307
1353
|
# Build the time-sync payload.
|
|
1308
|
-
# Format: [
|
|
1354
|
+
# Format: [cmd][year:2BE][month:1][day:1][hour:1][min:1][sec:1]
|
|
1309
1355
|
# [tz_offset:2BE signed][dst_transition:4BE][dst_change:1]
|
|
1310
1356
|
# [timestamp1:3BE][timestamp2:3BE][zero:2][millis:3BE][extra:1]
|
|
1311
1357
|
payload = bytearray()
|
|
1312
|
-
payload.append(
|
|
1358
|
+
payload.append(timesync_cmd)
|
|
1313
1359
|
payload.extend(struct.pack(">H", now.year))
|
|
1314
1360
|
payload.append(now.month)
|
|
1315
1361
|
payload.append(now.day)
|
|
@@ -1337,13 +1383,16 @@ class CasambiClient:
|
|
|
1337
1383
|
payload.append((ts1 >> 24) & 0xFF) # writeByte(iK0 >> 24)
|
|
1338
1384
|
|
|
1339
1385
|
self._logger.warning(
|
|
1340
|
-
"[CASAMBI_CLASSIC_INIT] sending time-sync len=%d hex=%s",
|
|
1386
|
+
"[CASAMBI_CLASSIC_INIT] sending time-sync len=%d cmd=%d target_uuid=%s header_mode=%s hex=%s",
|
|
1341
1387
|
len(payload),
|
|
1388
|
+
timesync_cmd,
|
|
1389
|
+
timesync_uuid,
|
|
1390
|
+
self._classicHeaderMode,
|
|
1342
1391
|
b2a(bytes(payload)),
|
|
1343
1392
|
)
|
|
1344
1393
|
|
|
1345
1394
|
try:
|
|
1346
|
-
await self._sendClassic(bytes(payload))
|
|
1395
|
+
await self._sendClassic(bytes(payload), target_uuid=timesync_uuid)
|
|
1347
1396
|
self._logger.warning("[CASAMBI_CLASSIC_INIT] time-sync sent successfully")
|
|
1348
1397
|
except Exception:
|
|
1349
1398
|
self._logger.warning(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: casambi-bt-revamped
|
|
3
|
-
Version: 0.3.12.
|
|
3
|
+
Version: 0.3.12.dev14
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/__init__.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_cache.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_casambi.py
RENAMED
|
File without changes
|
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_constants.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_discover.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_encryption.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_invocation.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_keystore.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_network.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_operation.py
RENAMED
|
File without changes
|
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/_unit.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/errors.py
RENAMED
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/src/CasambiBt/py.typed
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/tests/test_classic_protocol.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{casambi_bt_revamped-0.3.12.dev13 → casambi_bt_revamped-0.3.12.dev14}/tests/test_unit_state_logs.py
RENAMED
|
File without changes
|