Block Home actions during fixture transitions

This commit is contained in:
Gabriel Brown
2026-08-17 17:27:43 -04:00
parent 9a99c6064e
commit 2130d6a1a5
3 changed files with 95 additions and 3 deletions
@@ -168,6 +168,8 @@ Singleton {
} }
function enqueueAction(action: var): void { function enqueueAction(action: var): void {
if (root.fixtureTransitionDraining)
return;
if (!action || (action.kind !== "toggle" && action.kind !== "brightness")) if (!action || (action.kind !== "toggle" && action.kind !== "brightness"))
return; return;
if (typeof action.entityId !== "string" || action.entityId === "" || root.isBusy(action.entityId)) if (typeof action.entityId !== "string" || action.entityId === "" || root.isBusy(action.entityId))
+3
View File
@@ -276,6 +276,9 @@ ShellRoot {
entityErrors: HomeAssistant.entityErrors, entityErrors: HomeAssistant.entityErrors,
actionProcessRunning: HomeAssistant.actionProcessRunning, actionProcessRunning: HomeAssistant.actionProcessRunning,
actionStreamFinished: HomeAssistant.actionStreamFinished, actionStreamFinished: HomeAssistant.actionStreamFinished,
fixtureTransitionDraining: HomeAssistant.fixtureTransitionDraining,
queuedActionCount: HomeAssistant.actionQueue.length,
actionActive: HomeAssistant.activeAction !== null,
lastError: HomeAssistant.lastError lastError: HomeAssistant.lastError
}); });
} }
@@ -3,10 +3,30 @@
set -euo pipefail set -euo pipefail
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
config_path="$repo_dir/config/dot/quickshell"
state_home="$(mktemp -d /tmp/panama-control-center-state.XXXXXX)" state_home="$(mktemp -d /tmp/panama-control-center-state.XXXXXX)"
source_config_path="$repo_dir/config/dot/quickshell"
config_path="$state_home/quickshell"
helper_log="$state_home/home-helper.log"
shell_log="$state_home/quickshell.log" shell_log="$state_home/quickshell.log"
: >"$helper_log"
cp -a "$source_config_path" "$config_path"
cat >"$config_path/scripts/panama-home-assistant" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' "$*" >>"$PANAMA_HOME_HELPER_LOG"
case "${1:-}" in
catalog)
printf '%s\n' '{"ok":false,"error":"test-helper"}'
;;
toggle|brightness)
printf '%s\n' '{"ok":true}'
;;
esac
EOF
chmod +x "$config_path/scripts/panama-home-assistant"
fail() { fail() {
printf 'Control Center services contract: %s\n' "$1" >&2 printf 'Control Center services contract: %s\n' "$1" >&2
exit 1 exit 1
@@ -14,6 +34,7 @@ fail() {
qs_for_test() { qs_for_test() {
QS_CONFIG_PATH="$config_path" XDG_STATE_HOME="$state_home" \ QS_CONFIG_PATH="$config_path" XDG_STATE_HOME="$state_home" \
PANAMA_HOME_HELPER_LOG="$helper_log" \
qs -p "$config_path" "$@" qs -p "$config_path" "$@"
} }
@@ -220,12 +241,39 @@ wait_for_home_status '
qs_for_test ipc call home-assistant fixture process-no-output >/dev/null qs_for_test ipc call home-assistant fixture process-no-output >/dev/null
qs_for_test ipc call home-assistant fixture process-slow-actions >/dev/null qs_for_test ipc call home-assistant fixture process-slow-actions >/dev/null
qs_for_test ipc call home-assistant brightness light.fixture_desk 57 >/dev/null qs_for_test ipc call home-assistant brightness light.fixture_desk 57 >/dev/null
wait_for_home_status ' jq -e '
.phase == "ready" and .fixture == true and
.fixtureTransitionDraining == true and
.busy == false and .busy == false and
.busyEntityIds == [] and .busyEntityIds == [] and
.pendingBrightness == {} and .pendingBrightness == {} and
.entityErrors == {} and .entityErrors == {} and
.queuedActionCount == 0 and
.actionActive == false and
.actionProcessRunning == false and
(.entities[] |
select(.id == "light.fixture_desk") |
.active == true and .brightnessPct == 24)
' <<<"$(qs_for_test ipc call home-assistant status)" >/dev/null \
|| fail 'nested fixture transition accepted an action during its drain'
wait_for_home_status '
.fixture == true and
.fixtureTransitionDraining == false and
.busy == false and
.queuedActionCount == 0 and
.actionActive == false and
.actionProcessRunning == false
' 'nested fixture transition did not install the latest stable fixture'
qs_for_test ipc call home-assistant brightness light.fixture_desk 57 >/dev/null
wait_for_home_status '
.phase == "ready" and
.fixtureTransitionDraining == false and
.busy == false and
.busyEntityIds == [] and
.pendingBrightness == {} and
.entityErrors == {} and
.queuedActionCount == 0 and
.actionActive == false and
(.entities[] | (.entities[] |
select(.id == "light.fixture_living") | select(.id == "light.fixture_living") |
.active == false and .brightnessPct == 36) and .active == false and .brightnessPct == 36) and
@@ -234,6 +282,45 @@ wait_for_home_status '
.active == true and .brightnessPct == 57) .active == true and .brightnessPct == 57)
' 'nested fixture transitions released the drain or corrupted the latest action' ' 'nested fixture transitions released the drain or corrupted the latest action'
qs_for_test ipc call home-assistant fixture process-delayed-exit >/dev/null
qs_for_test ipc call home-assistant brightness light.fixture_living 88 >/dev/null
wait_for_home_status '
.fixture == true and
.busyEntityIds == ["light.fixture_living"] and
.pendingBrightness["light.fixture_living"] == 88 and
.actionProcessRunning == false and
.actionStreamFinished == true
' 'reset-to-live setup did not reach its process drain window'
qs_for_test ipc call home-assistant reset >/dev/null
qs_for_test ipc call home-assistant toggle light.fixture_hall >/dev/null
qs_for_test ipc call home-assistant brightness light.fixture_living 63 >/dev/null
jq -e '
.fixture == true and
.fixtureTransitionDraining == true and
.busy == false and
.busyEntityIds == [] and
.pendingBrightness == {} and
.entityErrors == {} and
.queuedActionCount == 0 and
.actionActive == false and
.actionProcessRunning == false
' <<<"$(qs_for_test ipc call home-assistant status)" >/dev/null \
|| fail 'reset-to-live drain accepted an action from the old fixture'
wait_for_home_status '
.fixture == false and
.fixtureTransitionDraining == false and
.busy == false and
.busyEntityIds == [] and
.pendingBrightness == {} and
.entityErrors == {} and
.queuedActionCount == 0 and
.actionActive == false and
.actionProcessRunning == false
' 'reset-to-live left stale fixture action state or started a replacement process'
if rg '^(toggle|brightness)( |$)' "$helper_log" >&2; then
fail 'reset-to-live issued a stale fixture action to the live helper'
fi
qs_for_test ipc call home-assistant fixture missing-selected >/dev/null qs_for_test ipc call home-assistant fixture missing-selected >/dev/null
jq -e ' jq -e '
.fixture == true and .fixture == true and