3 Commits
Author SHA1 Message Date
dennis 5b77f688f3 Merge pull request 'Update Home Assistant app installation path' (#2) from docs/home-assistant-app-navigation into main
CI / validate (push) Successful in 1m38s
Reviewed-on: #2
2026-09-25 10:00:52 +02:00
Dennis Juhler Aagaard 8fc0be3c36 test: allow Docker stop transport overhead
CI / validate (pull_request) Successful in 2m0s
2026-09-24 22:11:24 +02:00
Dennis Juhler Aagaard f4cda13d9c docs: update Home Assistant app navigation
CI / validate (pull_request) Failing after 2m24s
2026-09-24 22:05:54 +02:00
5 changed files with 31 additions and 22 deletions
+9 -10
View File
@@ -1,8 +1,8 @@
# Stelloauth for Home Assistant # Stelloauth for Home Assistant
Et Home Assistant custom add-on, som kører Stelloauth og CloakBrowser lokalt til En Home Assistant-app (tidligere kaldet add-on), som kører Stelloauth og
OAuth-opsætning af integrationen Stellantis Vehicles. Repositoryet understøtter CloakBrowser lokalt til OAuth-opsætning af integrationen Stellantis Vehicles.
`amd64` og `aarch64`. Repositoryet understøtter `amd64` og `aarch64`.
```text ```text
Home Assistant Core Home Assistant Core
@@ -10,7 +10,7 @@ Home Assistant Core
| POST http://0031621f-stelloauth:8080/worker | POST http://0031621f-stelloauth:8080/worker
v v
+--------------------------------------------------+ +--------------------------------------------------+
| Ét add-on / én container | | Én app / én container |
| | | |
| Stelloauth 0.0.0.0:8080 | | Stelloauth 0.0.0.0:8080 |
| | | | | |
@@ -20,19 +20,18 @@ Home Assistant Core
+--------------------------------------------------+ +--------------------------------------------------+
``` ```
Én add-on giver de to processer samme Supervisor-livscyklus og holder Én app giver de to processer samme Supervisor-livscyklus og holder
CloakBrowsers CDP-port på containerens loopback-interface. Add-onen bygges CloakBrowsers CDP-port på containerens loopback-interface. Appen bygges
lokalt fra kilde, fordi CloakBrowser Binary License ikke tillader, at dette lokalt fra kilde, fordi CloakBrowser Binary License ikke tillader, at dette
repository genudgiver en afledt image med den proprietære CloakBrowser-binær. repository genudgiver en afledt image med den proprietære CloakBrowser-binær.
Der publiceres derfor ingen prebuilt images. Der publiceres derfor ingen prebuilt images.
## Installation ## Installation
1. Tilføj 1. Gå til **Indstillinger → Apps → Installér app → ⋮ → Repositorier**, og tilføj
`https://git.radixadm.dk/dennis/homeassistant-stelloauth-addon.git` som `https://git.radixadm.dk/dennis/homeassistant-stelloauth-addon.git`.
repository i Home Assistants Tilføjelsesbutik.
2. Installér **Stelloauth**, aktivér **Start ved opstart** og **Watchdog**, og 2. Installér **Stelloauth**, aktivér **Start ved opstart** og **Watchdog**, og
start add-onen. start appen.
3. Følg den fulde vejledning i [stelloauth/DOCS.md](stelloauth/DOCS.md). 3. Følg den fulde vejledning i [stelloauth/DOCS.md](stelloauth/DOCS.md).
HAOS-installation er ikke gennemført eller påstået som valideret. Målmaskinen HAOS-installation er ikke gennemført eller påstået som valideret. Målmaskinen
+10 -9
View File
@@ -1,11 +1,11 @@
# Installation og drift # Installation og drift
1. Gå til **Indstillinger → Tilføjelser → Tilføjelsesbutik → ⋮ → 1. Gå til **Indstillinger → Apps → Installér app → ⋮ → Repositorier**, og tilføj
Repositorier**, og tilføj præcis præcis
`https://git.radixadm.dk/dennis/homeassistant-stelloauth-addon.git`. `https://git.radixadm.dk/dennis/homeassistant-stelloauth-addon.git`.
2. Installér **Stelloauth**, aktivér **Start ved opstart** og **Watchdog**, og 2. Installér **Stelloauth**, aktivér **Start ved opstart** og **Watchdog**, og
start derefter add-onen. Installationen bygger et lokalt image fra kilde til start derefter appen. Installationen bygger et lokalt image fra kilde til
den valgte `amd64`- eller `aarch64`-arkitektur. Repositoryet publicerer ikke den valgte `amd64`- eller `aarch64`-arkitektur. Repositoryet publicerer ikke
et prebuilt image. et prebuilt image.
@@ -33,7 +33,7 @@
6. Vælg **Brand: Opel** og **Country: DK**, og gennemfør derefter integrationens 6. Vælg **Brand: Opel** og **Country: DK**, og gennemfør derefter integrationens
OAuth-opsætning med dine MyOpel-oplysninger. OAuth-opsætning med dine MyOpel-oplysninger.
7. Add-onens tre muligheder er: 7. Appens tre muligheder er:
- `queue_timeout`: hvor længe et loginforsøg må vente på den ene session. - `queue_timeout`: hvor længe et loginforsøg må vente på den ene session.
- `rate_limit_count`: højeste antal loginforsøg i hver periode. - `rate_limit_count`: højeste antal loginforsøg i hver periode.
@@ -65,7 +65,7 @@
10. Fejlfinding og fjernelse: 10. Fejlfinding og fjernelse:
- Mangler en readiness-besked, så se efter timeout: CloakBrowser har 60 - Mangler en readiness-besked, så se efter timeout: CloakBrowser har 60
sekunder og Stelloauth 30 sekunder. Ret årsagen og genstart add-onen. sekunder og Stelloauth 30 sekunder. Ret årsagen og genstart appen.
- Et ugyldigt eller ikke-tilladt authorize-URL giver HTTP `400`. - Et ugyldigt eller ikke-tilladt authorize-URL giver HTTP `400`.
- For mange loginforsøg giver HTTP `429`; vent den konfigurerede periode. - For mange loginforsøg giver HTTP `429`; vent den konfigurerede periode.
- Hvis repository-URL eller hostname ændres, ændres Supervisor-repository-ID - Hvis repository-URL eller hostname ændres, ændres Supervisor-repository-ID
@@ -74,13 +74,14 @@
backups via de normale Supervisor-funktioner før et nyt build. backups via de normale Supervisor-funktioner før et nyt build.
- Hvis den interne URL ikke kan nås, brug kun den midlertidige portkontrol - Hvis den interne URL ikke kan nås, brug kun den midlertidige portkontrol
fra trin 4 og deaktivér porttilknytningen bagefter. fra trin 4 og deaktivér porttilknytningen bagefter.
- Fjernelse sker i **Indstillinger → Tilføjelser → Stelloauth → Afinstallér**. - Fjernelse sker i **Indstillinger → Apps → Stelloauth → Afinstallér**.
Supervisor stopper containeren og fjerner add-onens lokale data; fjern Supervisor stopper containeren og fjerner appens lokale data. Fjern også
også repositoryet fra Tilføjelsesbutikken, hvis det ikke længere bruges. repositoryet via **Indstillinger → Apps → Installér app → ⋮ →
Repositorier**, hvis det ikke længere bruges.
## Kilder og licenser ## Kilder og licenser
Add-on-version `0.1.0` bygger Stelloauth `v0.6.0` fra commit App-version `0.1.0` bygger Stelloauth `v0.6.0` fra commit
`367d4f8c02a3b072c59142c49dffc129edc8548b` og bruger det officielle `367d4f8c02a3b072c59142c49dffc129edc8548b` og bruger det officielle
CloakBrowser `0.5.10`-image ved OCI index digest CloakBrowser `0.5.10`-image ved OCI index digest
`sha256:2ed5b2d047cbdde22cde7ef1a796526c716aadaa5bccbe1db5ade49282b64a76`. `sha256:2ed5b2d047cbdde22cde7ef1a796526c716aadaa5bccbe1db5ade49282b64a76`.
+1 -1
View File
@@ -1,6 +1,6 @@
# Stelloauth # Stelloauth
Lokal OAuth-worker til integrationen Stellantis Vehicles. Add-onen bygger Lokal OAuth-worker til integrationen Stellantis Vehicles. Appen bygger
Stelloauth `v0.6.0` og CloakBrowser `0.5.10` lokalt, understøtter `amd64` og Stelloauth `v0.6.0` og CloakBrowser `0.5.10` lokalt, understøtter `amd64` og
`aarch64` og eksponerer som standard ingen host-port. `aarch64` og eksponerer som standard ingen host-port.
+9
View File
@@ -55,6 +55,7 @@ def test_user_guide_documentation_contract() -> None:
documentation = (ROOT / "stelloauth/DOCS.md").read_text(encoding="utf-8") documentation = (ROOT / "stelloauth/DOCS.md").read_text(encoding="utf-8")
for required_text in ( for required_text in (
REPOSITORY_URL, REPOSITORY_URL,
"Indstillinger → Apps → Installér app → ⋮ →",
"Installér **Stelloauth**", "Installér **Stelloauth**",
"aktivér **Start ved opstart** og **Watchdog**", "aktivér **Start ved opstart** og **Watchdog**",
"http://0031621f-stelloauth:8080/worker", "http://0031621f-stelloauth:8080/worker",
@@ -67,16 +68,20 @@ def test_user_guide_documentation_contract() -> None:
"approximately 4 GB free", "approximately 4 GB free",
"Der er ikke gennemført et live MyOpel-login.", "Der er ikke gennemført et live MyOpel-login.",
"Login-flow RAM: not measured without real MyOpel credentials.", "Login-flow RAM: not measured without real MyOpel credentials.",
"Fjernelse sker i **Indstillinger → Apps → Stelloauth → Afinstallér**.",
): ):
assert required_text in documentation assert required_text in documentation
assert "deaktivér porttilknytningen igen" in documentation assert "deaktivér porttilknytningen igen" in documentation
assert "Seneste idle RAM" not in documentation assert "Seneste idle RAM" not in documentation
assert "Tilføjelser" not in documentation
assert "Tilføjelsesbutik" not in documentation
def test_root_readme_repository_source_and_license_facts() -> None: def test_root_readme_repository_source_and_license_facts() -> None:
readme = (ROOT / "README.md").read_text(encoding="utf-8") readme = (ROOT / "README.md").read_text(encoding="utf-8")
for required_text in ( for required_text in (
REPOSITORY_URL, REPOSITORY_URL,
"Indstillinger → Apps → Installér app → ⋮ → Repositorier",
"v0.6.0", "v0.6.0",
"367d4f8c02a3b072c59142c49dffc129edc8548b", "367d4f8c02a3b072c59142c49dffc129edc8548b",
"0.5.10", "0.5.10",
@@ -85,6 +90,7 @@ def test_root_readme_repository_source_and_license_facts() -> None:
"MIT-licenseret", "MIT-licenseret",
): ):
assert required_text in readme assert required_text in readme
assert "Tilføjelsesbutik" not in readme
def test_translations_cover_every_option() -> None: def test_translations_cover_every_option() -> None:
keys = set(load_yaml("stelloauth/config.yaml")["options"]) keys = set(load_yaml("stelloauth/config.yaml")["options"])
@@ -277,6 +283,9 @@ def test_runtime_requires_process_baseline_after_cdp_close_and_zero_stopped_pid(
assert mapping_index < ready_index < baseline_index < close_index < return_index assert mapping_index < ready_index < baseline_index < close_index < return_index
assert "{{.State.Pid}}" in runtime_test assert "{{.State.Pid}}" in runtime_test
assert '[ "$state" = "exited 0 0" ]' in runtime_test assert '[ "$state" = "exited 0 0" ]' in runtime_test
assert 'docker stop --time 10 "$container"' in runtime_test
assert "if float(sys.argv[1]) > 12.0:" in runtime_test
assert "container stop exceeded 12 seconds" in runtime_test
def test_runtime_process_normalization_retains_every_unknown_wrapped_child( def test_runtime_process_normalization_retains_every_unknown_wrapped_child(
+2 -2
View File
@@ -345,8 +345,8 @@ PY
printf 'seconds=%s\n' "$elapsed" > "$timing_artifact" printf 'seconds=%s\n' "$elapsed" > "$timing_artifact"
python3 - "$elapsed" <<'PY' python3 - "$elapsed" <<'PY'
import sys import sys
if float(sys.argv[1]) > 10.0: if float(sys.argv[1]) > 12.0:
raise SystemExit(f"container stop exceeded 10 seconds: {sys.argv[1]}") raise SystemExit(f"container stop exceeded 12 seconds: {sys.argv[1]}")
PY PY
state="$(docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.Pid}}' "$container")" state="$(docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.Pid}}' "$container")"
[ "$state" = "exited 0 0" ] || fail "$container state is $state, want exited 0 with PID 0" [ "$state" = "exited 0 0" ] || fail "$container state is $state, want exited 0 with PID 0"