From 9d6f2d28c1c1e499dfcea3e90166e656d66165e5 Mon Sep 17 00:00:00 2001 From: Mortdecai Date: Fri, 23 Oct 2026 00:35:01 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20handoff=20=E2=80=94=20pairing=20prompt?= =?UTF-8?q?=20/=20IP=20drift=20/=20zombie=20bridge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- .../2026-10-23-pairing-prompt-ip-drift.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .claude/handoffs/2026-10-23-pairing-prompt-ip-drift.md diff --git a/.claude/handoffs/2026-10-23-pairing-prompt-ip-drift.md b/.claude/handoffs/2026-10-23-pairing-prompt-ip-drift.md new file mode 100644 index 0000000..07e7e67 --- /dev/null +++ b/.claude/handoffs/2026-10-23-pairing-prompt-ip-drift.md @@ -0,0 +1,15 @@ +# Handoff: pairing prompt on every IP change + zombie bridge + +## Findings (2026-10-23) +- bscpylgtv keys pairings by IP in `/home/seth/.aiopylgtv.sqlite`; TV drifted through 11 IPs → a new on-TV prompt each time. +- A missed prompt made `lgtv.sh off` hang 60s → the TimeoutExpired raised in paho's on_message killed the MQTT thread; the poll loop kept the process "healthy" → silent zombie. +- Blocking 60s in the callback also starves keepalive → broker drops the connection → commands sent during the block are lost (the ON that "didn't work"). + +## Fixes (deployed, pushed) +- lgtv.sh: if there's no key for the current IP, use the newest stored key. +- lgtv_mqtt.py: commands run on a single worker thread and catch all exceptions. +- Omada reservation f8:01:b4:2a:26:ed → .20 is set, but the TV took .45 anyway; **why it didn't apply is unknown**. With the key fallback, drift no longer matters. + +## Open +- Untested: whether the TV accepts an old key from a new IP without prompting. Find out the next time the IP changes. +- Polls report ON at .45 while Seth says the screen is off — the TV may keep :3000 open in network standby for a while. Watch whether HA state lags.