Add Hot Spring Connected Spa integration

Unofficial cloud integration for Watkins/Hot Spring "Connected Spa" hot tubs.
Reverse-engineered from the official Android app.

- climate entity (setpoint + current water temp) via heater/control
- sensors: water temperature, salt output level, salt cartridge
- REST (JWT) login + spa discovery; mTLS fetch of rotating HiveMQ broker creds;
  MQTT subscribe (telemetry) / publish (control)
- config flow prompts for account email + password (stored encrypted, never in repo)
- no secrets committed: vendor mTLS client cert is loaded from host PEM files
  (see README); .gitignore blocks pem/p12/der/key/env

Fixes bug-41mqxddz7zeh

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F6B8b3iYNv6QUftK2FDfYb
This commit is contained in:
Hank Mueller
2026-09-01 14:22:37 +00:00
co-authored by Claude Opus 5
commit 8cda06f7f3
17 changed files with 1006 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
{
"config": {
"step": {
"user": {
"title": "Hot Spring Connected Spa",
"description": "Sign in with your Hot Spring Spas app account. The mutual-TLS client certificate must already be present on the host (see the integration README).",
"data": {
"email": "E-mail",
"password": "Password",
"cert_dir": "Certificate directory"
}
}
},
"error": {
"invalid_auth": "Invalid e-mail or password.",
"cannot_connect": "Could not reach the Hot Spring cloud.",
"missing_certs": "The client certificate files were not found in the certificate directory.",
"unknown": "Unexpected error."
},
"abort": {
"already_configured": "This spa account is already configured."
}
},
"entity": {
"sensor": {
"water_temperature": { "name": "Water temperature" },
"salt_output_level": { "name": "Salt output level" },
"cartridge": { "name": "Salt cartridge" }
}
}
}