Commit graph

1,214 commits

Author SHA1 Message Date
Bas Nijholt
53c1ee976d
Merge bd6e724030 into b2ca188df3 2026-10-19 17:28:54 +02:00
Franck Nijhof
b2ca188df3 Add local brand assets
Add local brand assets for Home Assistant 2026.3 and newer.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-19 08:22:30 -07:00
allcontributors[bot]
283fec08ae
docs: add FezVrasta as a contributor for translation (#1612)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-22 16:05:46 -07:00
renovate[bot]
3aab53f277
⬆️ Update docker/setup-qemu-action action to v4.4.0 (#1608)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 16:05:07 -07:00
pre-commit-ci[bot]
7b1052f8be
[pre-commit.ci] pre-commit autoupdate (#1603)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.16.6 → v0.16.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.16.6...v0.16.8)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-09-22 16:05:04 -07:00
allcontributors[bot]
9e582c656e
docs: add SGXander as a contributor for code, bug, and test (#1611)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-22 16:03:36 -07:00
renovate[bot]
8418b691a1
⬆️ Update docker/setup-buildx-action action to v4.4.1 (#1607)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 16:03:20 -07:00
renovate[bot]
c2936b95cf
⬆️ Update docker/build-push-action action to v7.4.0 (#1606)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 16:03:17 -07:00
renovate[bot]
b2a51c8238
⬆️ Update astral-sh/setup-uv action to v10.2.0 (#1602)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-22 16:03:14 -07:00
Federico Zivolo
dcf649bb4c
Add missing {webapp_url}/{docs_url} placeholders to 7 translations (#1600)
Home Assistant validates that a localized string declares the same
placeholders as its English source. The options flow description gained
{webapp_url} and {docs_url}, but et, it, nb, pt-BR, ru, sv and uk were
never updated, so every HA start logs:

  Validation of translation placeholders for localized (it) string
  component.adaptive_lighting.options.step.init.description failed:
  (set() != {'webapp_url', 'docs_url'})

Translate the two trailing sentences in each locale so the placeholder
sets match en.json.


Claude-Session: https://claude.ai/code/session_018YKyX9K8sWprUYuvuaV5R7

Co-authored-by: Federico Zivolo <43.dram_filmier@icloud.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 16:03:11 -07:00
SGXander
12323cc357
Fix missing solar_midnight event when derived solar noon crosses 12:00 UTC (#1599) (#1609)
* Anchor derived solar midnight in the night it belongs to (#1599)

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: SGXander <SGXander@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-09-22 16:03:07 -07:00
Bas Nijholt
bd6e724030 Normalize turn-off transitions during light recovery 2026-09-08 05:06:26 -07:00
Bas Nijholt
c2d9ea3e51 Merge remote-tracking branch 'origin/main' into fix/unavailable-light-recovery
# Conflicts:
#	custom_components/adaptive_lighting/switch.py
#	tests/test_switch.py
2026-09-08 05:04:34 -07:00
Ahmad Tawakol
7d0f4b610a
Fix TypeError when 'light.turn_off' is called with a string transition (#1589)
* Fix TypeError when 'light.turn_off' is called with a string transition

`EVENT_CALL_SERVICE` carries the *raw* service data, not the data
`light.turn_off`'s schema produced for the service handler, so its
`vol.Coerce(float)` never reaches `AdaptiveLightingManager`. A caller
passing `transition: "2"` — a template rendering to a string, or any
JSON payload where the value was quoted — therefore stores a `str` in
`turn_off_event`.

Both places that derive a delay from it compare it against an int:

    delay = max(transition or 0, TURNING_OFF_DELAY)  # during turn-off
    delay = max(transition, TURNING_OFF_DELAY)       # just_turned_off

which raises `TypeError: '>' not supported between instances of 'int'
and 'str'`. Because `just_turned_off` runs inside the state-change
listener task, the exception is swallowed: it surfaces only as
"Error doing job: Task exception was never retrieved (task: None)",
while the light quietly stops being adapted after that turn-off.

Read the transition through a helper that coerces to float. Schema
validation runs before the event fires, so whatever reaches the helper
is coercible.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Normalize turn-off transitions with the light service validator

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-08 14:03:07 +02:00
Ahmad Tawakol
da749bcf61
Add a .dockerignore (#1591)
tests/README.md has developers clone Home Assistant core into ./core, but
Docker does not read .gitignore, so `COPY . /app/` shipped that ~300MB
checkout into the build context and into the image on every build.

It also changed what the build did. With /app/core already present as a
real directory, `ln -s /core /app/core` linked *inside* it — leaving a
stray /app/core/core -> /core — and scripts/setup-dependencies then
installed from the copied host checkout rather than the image's own
pinned clone.

Excluding core/ (plus local virtualenvs, VCS state and caches) takes the
build context from 412MB to 4.6MB and the image from 2.34GB to 2.1GB, and
makes a build with a local ./core behave like a clean one: /app/core is
the intended symlink to /core.

This does remove an accident. An image built while a local ./core existed
happened to run without `-v $(pwd):/app`, because the copied checkout
carried relative symlinks that still resolved inside /app. A clean-checkout
build never had that property — there the symlinks setup-symlinks writes
into /core dangle — and tests/README.md requires the mount either way.

479 passed, unchanged.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 14:02:51 +02:00
Ahmad Tawakol
3e78ac7e21
Make scripts/setup-symlinks idempotent (#1590)
`ln -fs` dereferences an existing symlink to a directory and creates the
new link *inside* it, so running the script a second time left two stray
symlinks in the working tree instead of replacing the existing ones:

    tests/tests -> ../../../tests/
    custom_components/adaptive_lighting/adaptive_lighting
        -> ../../../custom_components/adaptive_lighting

Neither path is gitignored, so `git add -A` commits them.

Add `-n` so an existing symlink is treated as a file and replaced.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 14:02:45 +02:00
pre-commit-ci[bot]
51ea83dba3
[pre-commit.ci] pre-commit autoupdate (#1592)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.16.5 → v0.16.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.16.5...v0.16.6)

* test: avoid mired rounding boundary

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-08 14:02:08 +02:00
allcontributors[bot]
7c445af63b
docs: add ahmadtawakol as a contributor for code, bug, and maintenance (#1595)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-08 13:54:05 +02:00
Bas Nijholt
2f37b6ea40
Fix pending adaptations after light or profile removal (#1587) 2026-09-07 09:03:03 +02:00
Bas Nijholt
ee835c98c7 Test sibling recovery preserves group turn-off intent 2026-09-06 23:48:48 -07:00
Bas Nijholt
9f4089f3d8 Resume eligible light adaptation after availability returns 2026-09-06 23:40:31 -07:00
Bas Nijholt
f148b40807 Merge branch 'fix/pending-adaptation-cancellation' into fix/unavailable-light-recovery
# Conflicts:
#	custom_components/adaptive_lighting/switch.py
#	tests/test_switch.py
2026-09-06 23:32:36 -07:00
Bas Nijholt
87a30972a7 Merge remote-tracking branch 'origin/main' into fix/unavailable-light-recovery 2026-09-06 23:31:16 -07:00
Bas Nijholt
e6dce70163 Fix pending adaptations after light or profile removal 2026-09-06 23:30:42 -07:00
Bas Nijholt
34356a6b56
ci: validate README TOC before merging (#1586) 2026-09-07 08:01:35 +02:00
Bas Nijholt
d1d2383c04 Merge main after turn-off fix 2026-09-06 22:41:49 -07:00
Bas Nijholt
a936519866
fix: track mixed targets during light turn-off (#1584) 2026-09-07 07:41:28 +02:00
Bas Nijholt
97133597e3 docs: refresh generated recovery troubleshooting 2026-09-06 14:21:33 -07:00
Bas Nijholt
3b93032519 Preserve turn-off intent during light recovery 2026-09-06 14:18:45 -07:00
Bas Nijholt
d8fdd75696 Merge turn-off target tracking fix 2026-09-06 14:14:16 -07:00
Bas Nijholt
da75a16d36 Handle lights recovering from unavailable 2026-09-06 14:13:29 -07:00
Bas Nijholt
69df1fa0a4 fix: track mixed targets during light turn-off 2026-09-06 14:10:22 -07:00
Bas Nijholt
3a27c346b9
test: preserve physical dimming across repeated turn-on calls (#1583)
* test: cover repeated bare turn-on after physical dim

* test: preserve reported color temperature baseline
2026-09-06 22:38:35 +02:00
Bas Nijholt
2299161690
docs: clarify persistent sleep mode and daytime dimming (#1582)
* docs: clarify persistent sleep mode state

* docs: clarify when adaptation targets are available
2026-09-06 22:38:30 +02:00
Bas Nijholt
77183ee3eb
docs: explain physical turn-ons that require reloading (#1581)
* docs: explain physical turn-ons that require reloading

* docs: list options that require takeover control
2026-09-06 22:38:25 +02:00
Bas Nijholt
7f7fec4e34
chore: release v1.32.0 (#1580) v1.32.0 2026-09-06 22:06:43 +02:00
Bas Nijholt
c5d216ea6f
fix: synchronize sleep mode and mixed-light split timing (#1579)
* fix: synchronize sleep mode and mixed-light split timing

* docs: refresh generated sleep automation example
2026-09-06 21:50:32 +02:00
Leonhard Hesse
aa84eda871
feat: add expand_light_groups option (#1462)
* feat: add expand_light_groups option

Some light group entities act as a proxy that must receive a single combined
`light.turn_on` call to function correctly — virtual mixers like
<https://github.com/mion00/color-temperature-light-mixer> for instance,
that blend a warm and a cold white channel into one entity. In such setups the
individual member entities only expose `ColorMode.BRIGHTNESS`, so sending
separate per-member commands bypasses the mixing logic.

Setting `expand_light_groups: false` keeps the group entity in `self.lights`
instead of expanding it to its members. Adaptation commands go to the group,
and the interceptor no longer skips group entities for that switch.

Default is `true` — no behaviour change for existing configurations.

* tests: regression test for expand_light_groups=False

_switches_with_lights was expanding the incoming entity_id globally,
causing the switch to never be found when expand_light_groups=False

* Resolve group targets consistently across adaptation paths

* Discard delayed group events after target changes

* Stabilize delayed group target regression test

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 21:13:35 +02:00
Alistair Galbraith
9e29a21197
Add manual_control_on_external_turn_on option (#1490)
* feat: add `adapt_only_on_ha_turn_on` to skip adapting externally turned-on lights

When a light turns on from `off` via a source outside Home Assistant — a
physical wall switch or a hub/manufacturer scene (e.g. Lutron) — and
`detect_non_ha_changes` is enabled, Adaptive Lighting adapts the light on the
resulting `off` → `on` event, overriding the brightness/color the external
source just set. Disabling `detect_non_ha_changes` avoids this but also stops
detection of manual changes to already-on lights; the two behaviors were
coupled to a single flag.

Add `adapt_only_on_ha_turn_on` (default `false`, requires `take_over_control`).
When enabled, an `off` → `on` transition with no matching HA `light.turn_on`
context is marked `manual_control` and left untouched, independent of
`detect_non_ha_changes`, decoupling the two behaviors.

The off→on guard reduces to the previous expression when the option is `false`,
so existing configurations are unaffected. Includes a parametrized regression
test, docs, and regenerated strings/services/README via
scripts/update-generated-content.

Refs #435

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Shorten generated turn-on option description

* Document shared turn-on policy limitations

* Name external turn-on policy after manual-control behavior

* Clarify settings needed to adapt unmatched turn-ons

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 21:02:30 +02:00
Bas Nijholt
11bd5cf2aa
Pause brightness at minimum using existing manual-control resets (#1578) 2026-09-06 20:46:14 +02:00
Bas Nijholt
f7b50b12d9
Add validated blueprints for common automation examples (#1577)
* Add minimum brightness automation and blueprint

* Ignore independent profile event order in test

* Add tested blueprints for sleep, schedules, and daylight
2026-09-06 19:59:56 +02:00
allcontributors[bot]
e2a3aae416
docs: add lehneres as a contributor for ideas (#1576)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 19:14:21 +02:00
allcontributors[bot]
51f2878b16
docs: add timstallmann as a contributor for code (#1574)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 19:13:44 +02:00
allcontributors[bot]
d09b15a138
docs: add hesseleo as a contributor for code (#1573)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 19:13:13 +02:00
allcontributors[bot]
46d07388ba
docs: add alistairg as a contributor for code (#1572)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 19:12:41 +02:00
Bas Nijholt
3231a1ac27
Add on-demand Home Assistant diagnostics (#1575)
* Add privacy-safe config entry diagnostics

* Clarify accumulated diagnostics values
2026-09-06 19:11:55 +02:00
allcontributors[bot]
ba2b7a3e44
docs: add jaynis as a contributor for code (#1571)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 19:09:30 +02:00
Bas Nijholt
cda1c2db33
Track manual changes across shared light profiles (#1569) 2026-09-06 19:09:26 +02:00
Bas Nijholt
1d50165eb1
Cancel transition timers when the last profile unloads (#1567) 2026-09-06 17:20:07 +02:00
Bas Nijholt
87486f9eb3
Set conservative line and branch coverage floors for stable HA versions (#1566) 2026-09-06 17:18:47 +02:00