Real-time (AWS IoT MQTT) connection hardening
We validated the integration's AWS IoT client against Home Assistant core's own MQTT client. The transport mechanics already matched (event-loop contract, TLS stricter than core's, bounded timeouts, shutdown wiring). The reconnect policy and a few detection gaps did not, and this release closes them:
- Never gives up. A network or AWS outage longer than ~3.7 hours used to stop the reconnect loop for good, leaving real-time updates off until a manual reload. The client now retries forever with backoff (capped at 5 minutes), like Home Assistant core does. The repair issue still appears after 50 consecutive failures, and now clears itself when the connection comes back.
- Flaps back off. A session that dies within a minute of connecting counts as a failure, so two Home Assistant installs sharing one Govee account (AWS IoT kicks the older session off) no longer reconnect every 5 seconds forever with a warning each time.
- Refused subscriptions are detected. AWS IoT keeps the session up but answers a policy-refused subscription with a failure code; the client used to sit "connected" with nothing arriving. It now treats that as a failed attempt.
- Commands are acknowledged. MQTT publishes are QoS 1 with a 10 s acknowledgement timeout. On a half-open socket the old QoS 0 publish "succeeded" for minutes while the command never arrived and the REST fallback was skipped.
- Credential rotation reaches the transport. A re-login with rotated certificate material restarts the client; a client that never started because login failed at boot is started once a refresh succeeds; the give-up path attempts a throttled re-login itself.
- Startup login failures are visible. A non-2FA login failure now raises the "Govee MQTT disconnected" repair instead of leaving an install indistinguishable from one without account login. The repair text leads with the remedy (wait, then reload, then Reconfigure) and the README gains a troubleshooting row.
- TLS context built once per credential set; certificate and key temp files removed immediately after loading. Legacy
msg-wrapped status pushes are unwrapped instead of dropped. Quieter logs: first failure at WARNING, the rest of a streak at DEBUG.
First unit tests for the connection loop (scripted broker sessions) are included.