Compare commits

..

553 commits

Author SHA1 Message Date
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
34356a6b56
ci: validate README TOC before merging (#1586) 2026-09-07 08:01:35 +02:00
Bas Nijholt
a936519866
fix: track mixed targets during light turn-off (#1584) 2026-09-07 07:41:28 +02: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) 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
Bas Nijholt
472796215b
Implement collapsible sections for options flow (#1313)
* Implement collapsible sections for options flow

Replace single-form options flow with collapsible sections:
- Basic options always visible (9 fields)
- Advanced options in collapsed section (collapsed by default)
- Single form, no multi-step navigation needed

Changes:
- const.py: Add BASIC_OPTIONS set defining which options are basic
- config_flow.py: Use section() from data_entry_flow to wrap advanced options
- strings.json: Restructure with sections.advanced for section translations
- tests: Update to handle nested section input format

* Update README.md, strings.json, and services.yaml

* Fix: Use vol.Required for section to render properly

* Fix section structure: separate basic and advanced fields in strings.json

* Remove accidentally added files

* Add local directories to gitignore

* Update README.md, strings.json, and services.yaml

* Preserve options behavior with collapsible sections

* Test serialized advanced options section

* fix: preserve config metadata when retrying options

* fix: keep options form defaults serializable

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-06 17:18:42 +02:00
Bas Nijholt
c19715dadd
Publish line and branch coverage reports in CI (#1564)
* Report line and branch coverage in CI

* docs: explain coverage reports and behavioral tests

* Calculate coverage percentages from counts for older versions
2026-09-06 17:09:35 +02:00
Bas Nijholt
42c7cd696f
Add focused manual-control and lifecycle regression tests (#1565) 2026-09-06 17:07:53 +02:00
allcontributors[bot]
5632256087
docs: add abkslm as a contributor for bug (#1563)
* docs: update README.md

* docs: update .all-contributorsrc

* Keep contributor names in their original encoding

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 16:56:29 +02:00
allcontributors[bot]
e8c300cf75
docs: add zpriddy as a contributor for ideas (#1562)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 16:54:03 +02:00
Bas Nijholt
bbe5f3837d
Fix autoreset timer renewal for unchanged physical light states (#1561)
* fix: preserve manual-control timeout across polls

* fix: update manual baseline after adaptive writes

* fix: seed manual baseline from tracked changes
2026-09-06 14:25:24 +02:00
Bas Nijholt
c8de38f779
Fix missing follow-up commands during multi-light interception (#1560)
* fix: adapt every member during split multi-light interception

* test: detect template light color-mode storage directly
2026-09-06 14:03:08 +02:00
Bas Nijholt
1f137d2b36
Fix causal context links for intercepted calls (#1559) 2026-09-06 13:50:55 +02:00
allcontributors[bot]
9525d2f243
docs: add GollyJer as a contributor for bug (#1558)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 13:40:04 +02:00
allcontributors[bot]
6e7febee8f
docs: add Mariuss811 as a contributor for bug (#1557)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 13:40:01 +02:00
Bas Nijholt
08e3b817a3
docs: add automation alternatives for custom lighting profiles (#1535)
* docs: add automation alternatives for custom lighting profiles

* docs: make automation restart behavior explicit

* docs: validate automation examples in Home Assistant

* docs: clarify automation prerequisites

* test: exercise automation startup lifecycle
2026-09-06 13:08:17 +02:00
Adam DeMuri
623dd65aef
Register service actions in async_setup for Bronze tier compliance (#1403)
* Register service actions in async_setup for Bronze tier compliance

- Move 'apply' and 'set_manual_control' service registration from async_setup_entry to async_setup.
- Move service handlers to module-level functions in switch.py.
- Update apply_service_schema to support dynamic defaults for transition duration.
- Clean up related unused imports and fix Python 3.10 syntax compatibility.

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

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

* Clean up and add tests

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

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

* Fix lint errors

* Automated update of generated docs

* Re-add types

* Make transition not required again

* fix: validate global service targets

* fix: document optional apply transition

* fix: derive service docs from schema markers

* docs: clarify service target options

* fix: preserve entity service target handling

---------

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-06 13:04:18 +02:00
allcontributors[bot]
ac0336fe34
docs: add protyposis as a contributor for ideas (#1556)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:55:26 +02:00
allcontributors[bot]
00185e75e0
docs: add 00schteven as a contributor for ideas (#1555)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:54:51 +02:00
allcontributors[bot]
6254b56dab
docs: add b-rad15 as a contributor for ideas (#1554)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:54:18 +02:00
allcontributors[bot]
f97e502cbc
docs: add jrbergen as a contributor for ideas (#1553)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:53:46 +02:00
allcontributors[bot]
17b0aa1103
docs: add GollyJer as a contributor for ideas (#1552)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:53:12 +02:00
allcontributors[bot]
8fb22adc45
docs: add BenoitAnastay as a contributor for ideas (#1551)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:52:39 +02:00
allcontributors[bot]
dda664ac7e
docs: add djurny as a contributor for ideas (#1550)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:52:07 +02:00
allcontributors[bot]
6fdbffc7fc
docs: add haasn as a contributor for ideas (#1549)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:51:34 +02:00
allcontributors[bot]
1969a8cdff
docs: add mrbillpapas as a contributor for ideas (#1548)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:50:53 +02:00
allcontributors[bot]
288d9d344a
docs: add rhtenhove as a contributor for code (#1547)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 12:37:02 +02:00
rhtenhove
722779d59b
Allow opting out of manual-control reset on sleep changes (#1063)
* Disable manual control reset on sleep mode change

* adapt test to new behavior

* fix comment

* add switch + test

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

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

* Update auto-generated content

* fix: preserve existing sleep-toggle reset defaults

* fix: keep cancelling stale adaptations on sleep changes

---------

Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 12:35:45 +02:00
Bas Nijholt
ecf2403422
fix: publish manual-control state when it changes (#1538) 2026-09-06 12:32:40 +02:00
Bas Nijholt
a04a533f45
ci: support one year of Home Assistant releases (#1546) 2026-09-06 12:17:22 +02:00
allcontributors[bot]
0003655828
docs: add chewth91 as a contributor for bug (#1545)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:59:17 +02:00
allcontributors[bot]
508959fff3
docs: add bisquit2003 as a contributor for bug (#1544)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:58:24 +02:00
Bas Nijholt
d6ddd3f27e
docs: credit Weblate-only translators (#1543) 2026-09-06 11:52:39 +02:00
allcontributors[bot]
95ccc02789
docs: add sergeybelozorov as a contributor for translation (#1542)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:49:57 +02:00
allcontributors[bot]
8056fcc5f8
docs: add rutgerkra as a contributor for translation (#1541)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:49:26 +02:00
allcontributors[bot]
3df5787019
docs: add LukTyn as a contributor for translation (#1540)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:48:49 +02:00
allcontributors[bot]
397b50d492
docs: add belkin as a contributor for translation (#1539)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:48:19 +02:00
Bas Nijholt
72128f07ae
Restore missing Russian option labels (#1534)
* feat: restore missing Russian option labels

Restore the translated option labels from PR #1277 that are still absent on current main. Existing Russian values and stale descriptions remain untouched.

Co-authored-by: belozorov_sv <belozorov_sv@magnit.ru>

* fix: drop ambiguous Russian brightness timing labels

---------

Co-authored-by: belozorov_sv <belozorov_sv@magnit.ru>
2026-09-06 11:46:49 +02:00
Bas Nijholt
4973f79c3a
Restore missing Weblate translations (#1533)
* feat: restore missing Weblate translations

Import only translated keys absent from current main whose English source is unchanged. Existing locale values and stale hard-coded URL descriptions remain untouched.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NataN <natan.ns.ns@gmail.com>
Co-authored-by: Allan Himidi-Rattenborg <allanrlang@gmail.com>
Co-authored-by: Hans Henrik Juhl <hans@kopula.dk>
Co-authored-by: Belkin Fahri <belkinfahri@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
Co-authored-by: Lukas Tynovsky <LukTyn@gmail.com>
Co-authored-by: Rutger <r.kraaijer@gmail.com>
Co-authored-by: Yllelder <yllelder@gmail.com>
Co-authored-by: Hosted Weblate user 144010 <jf.cosse@users.noreply.hosted.weblate.org>
Co-authored-by: Loïc R <loicdu81@gmail.com>
Co-authored-by: Maxime Bailleul <mexx.bailleul@gmail.com>
Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Co-authored-by: Esspel <eric.soderstrom06@gmail.com>
Co-authored-by: Max <max.bengtzen@icloud.com>

* fix: omit inaccurate restored translations

Drop the imported strings flagged by review for semantic omissions or visible translation errors. English fallback remains available for these keys.

* fix: drop unclear Brazilian Portuguese imports

---------

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NataN <natan.ns.ns@gmail.com>
Co-authored-by: Allan Himidi-Rattenborg <allanrlang@gmail.com>
Co-authored-by: Hans Henrik Juhl <hans@kopula.dk>
Co-authored-by: Belkin Fahri <belkinfahri@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
Co-authored-by: Lukas Tynovsky <LukTyn@gmail.com>
Co-authored-by: Rutger <r.kraaijer@gmail.com>
Co-authored-by: Yllelder <yllelder@gmail.com>
Co-authored-by: Hosted Weblate user 144010 <jf.cosse@users.noreply.hosted.weblate.org>
Co-authored-by: Loïc R <loicdu81@gmail.com>
Co-authored-by: Maxime Bailleul <mexx.bailleul@gmail.com>
Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Co-authored-by: Esspel <eric.soderstrom06@gmail.com>
Co-authored-by: Max <max.bengtzen@icloud.com>
2026-09-06 11:46:44 +02:00
Bas Nijholt
187185698e
Add test_expand_light_groups (#319)
* Add test_expand_light_groups

* Add imports

* import

---------

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
2026-09-06 11:42:55 +02:00
pre-commit-ci[bot]
4c1140c517
[pre-commit.ci] pre-commit autoupdate (#1229)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0)
- [github.com/astral-sh/ruff-pre-commit: v0.11.13 → v0.16.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.13...v0.16.5)
- https://github.com/psf/blackhttps://github.com/psf/black-pre-commit-mirror
- [github.com/psf/black-pre-commit-mirror: 25.1.0 → 26.5.1](https://github.com/psf/black-pre-commit-mirror/compare/25.1.0...26.5.1)

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

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

* ci: preserve Ruff lint baseline

---------

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-06 11:38:40 +02:00
Bas Nijholt
6b7dbc3a66
Add Lonsonho ZB-RGBCW to troubleshooting (#756)
* Add Lonsonho ZB-RGBCW to troubleshooting

* add link
2026-09-06 11:36:51 +02:00
allcontributors[bot]
92c071f4f3
docs: add frankysan as a contributor for translation (#1537)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:36:23 +02:00
allcontributors[bot]
179cb2ef30
docs: add MSL-DA as a contributor for translation (#1536)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 11:35:48 +02:00
frankysan
cd1e653da5
Minor update to Swedish translation (#1412)
Removed a superfluous "Swedish: " from the description of the manual control option.

Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 11:35:11 +02:00
Jan
c9d9c75b14
Enhance Danish translation description for adaptive lighting (#1488)
* Enhance Danish translation description for adaptive lighting

Updated the description in the Danish translation for adaptive lighting settings to include documentation and webapp URLs.

* Update custom_components/adaptive_lighting/translations/da.json

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 11:35:07 +02:00
Adam DeMuri
4b0638a4d8
Only run the validate_hacs CI action on the upstream repo. (#1423)
This avoids running this action on forks, since they likely won't have
issues or topics enabled, and shouldn't need them.

Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 11:35:02 +02:00
renovate[bot]
548e5048ec
⬆️ Pin dependencies (#1475)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-06 11:34:59 +02:00
Bas Nijholt
28f0fe8c58
test: keep split-command brightness checks deterministic (#1532) 2026-09-06 10:58:20 +02:00
Bas Nijholt
fdce4c9102
fix: keep adaptation updates from restarting manual-control timers (#1525)
* Fix autoreset timeout during partial adaptation

* Test manual timeout renewal for mixed light requests
2026-09-06 10:45:08 +02:00
Marijn Eken
8f78233e11
docs: clarify that UI setup needs no YAML entry (#1031)
* Fixed outdated info in README.md

The README says to always add an adaptive_lighting: entry in the YAML, where this seems to be no longer needed (or even preferred).

* docs: clarify YAML is optional for UI setup

---------

Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 10:43:37 +02:00
allcontributors[bot]
edc8f70996
docs: add davidgeiger as a contributor for bug (#1529)
* 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 10:38:49 +02:00
allcontributors[bot]
ee12752927
docs: add callistoprime as a contributor for bug (#1528)
* 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 10:37:50 +02:00
allcontributors[bot]
66e6d5ff5f
docs: add kasiom as a contributor for translation (#1527)
* 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 10:36:25 +02:00
Bas Nijholt
efa64d01be
fix: allow negative service offsets (#1524) 2026-09-06 10:35:35 +02:00
Bas Nijholt
17d9b39700
fix: restore Czech options placeholders (#1523) 2026-09-06 10:35:30 +02:00
allcontributors[bot]
c03a19c5a3
docs: add marijneken as a contributor for doc (#1526)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 10:34:44 +02:00
Bas Nijholt
c7339678a6
ci: check out the workflow commit during test setup (#1522) 2026-09-06 10:32:01 +02:00
proscar87
a2186ecf22
perf: stagger periodic adaptation updates (#1500)
Spread recurring updates with a deterministic per-switch offset while keeping turn-on adaptation immediate. Register the delayed listener on Home Assistant's event loop and cover cancellation, reconfiguration, and cadence with real timer tests.

Closes #939.

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2026-09-06 01:12:28 -07:00
mueslo
68c0e4db69
fix: preserve Home Assistant area target exclusions (#1511)
* Exclude 'service' lights (entity_category) from area intercept turn-on

Fixes #1510

When Adaptive Lighting intercepts an area/label-targeted light.turn_on, the
intercept rewrites the call to target only the managed lights (see
modify_service_data), so Home Assistant's own handler turns on only those.
AL then re-issues light.turn_on for the remaining 'skipped' (unmanaged)
entities so they still come on.

The problem: HA excludes entities with an entity_category (config/diagnostic,
e.g. the Home Assistant Voice LED ring) from area/label expansion, but AL's
re-issue did not, so AL was the sole thing turning these service lights on.

Changes:
- Keep re-issuing skipped lights so unmanaged normal lights still come on,
  but filter out 'service' lights (entity_category set) from that re-issue.
- Add _is_service_light helper (registry-based) and divert a *managed*
  service light to 'skipped' in _separate_entity_ids, so it is excluded from
  the intercept turn-on while still being adapted when on.

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

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

* Add toggle regression test for service light exclusion from area intercept

Mirrors test_service_light_excluded_from_area_intercept_turn_on but uses
light.toggle: a service light (entity_category set) in an area must remain
off when AL intercepts an area toggle. The managed lights still toggle on.

Refs #1510, PR #1511.

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

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

* Only exclude service lights from indirect (area/device/label) expansion

Previously _is_service_light filtered service lights unconditionally, which
also excluded a service light explicitly named in `entity_id`. Home
Assistant only excludes such lights from indirect area/device/label expansion
and turns them on when directly targeted, so AL must mirror that: service
lights are now excluded from the intercept/re-issue only when not directly
targeted (`direct_entity_ids`).

Adds a regression test for the direct-target case.

Refs #1510, PR #1511.

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

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

* Use if/elif/else for indirect service-light exclusion; inline check

Address review: collapse the two separate `if is_service`/"if not
is_service" into an `if/elif/else` chain (ruff PLR5501) and inline the
service check as `self._is_service_light(...) and entity_id not in
direct_entity_ids`, which conceptually is `is_indirect_service`.
Matches HA's indirect-only exclusion and keeps the flow simple.

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

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

* Filter service lights directly in _get_entity_list expansion

Move service-light filtering to the single expansion site
AdaptiveLightingManager._get_entity_list. Area/device expansion is the
only place where HA excludes entity_category lights, so filtering there
mirrors HA and makes the later direct_entity_ids / skipped_normal guards
unnecessary. Explicit entity_id targets bypass expansion and therefore
still turn on service lights, matching HA.

Fully reverts the direct_entity_ids / skipped_normal addition per review.

---------

Co-authored-by: mueslo <mueslo@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2026-09-06 01:04:50 -07:00
Jared Jensen
e453541a78
feat: expose per-attribute manual-control state (#1469)
Adds two new read-only state attributes on the AdaptiveSwitch entity:

- manual_control_brightness: list of light entity_ids whose brightness
  axis is currently in manual override (i.e. AL is paused for brightness
  on those lights).
- manual_control_color: same, for the color axis.

These mirror the existing 'manual_control' attribute (which is a
union of both axes) but expose the LightControlAttributes bitfield
that AL already tracks internally per-light.

Why: the existing 'manual_control' state attribute and the
adaptive_lighting.manual_control event are useful, but neither lets
a template or dashboard see which axis is paused without subscribing
to events. This is especially important with take_over_control_mode:
pause_changed, where one axis can be manual while the other still
adapts. Now a Lovelace card or template sensor can display
brightness/color manual state directly via state_attr().

Test: extends test_manual_control to assert the new attributes
reflect the bitfield correctly.

No new platform, no breaking changes.

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2026-09-06 00:59:38 -07:00
allcontributors[bot]
61896eb86a
docs: credit mueslo for code contributions (#1521)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 00:55:27 -07:00
allcontributors[bot]
9b0f03045b
docs: credit jaredjxyz for code contributions (#1520)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 00:54:58 -07:00
Bas Nijholt
cc99067c73
fix: keep adapting during polar night and midnight sun (#1489)
Handle missing polar sunrise and sunset with a shared fallback. Bound offsets between actual solar anchors while preserving the daily lighting cycle and configured time behavior.

Co-authored-by: Oscar Pacheco <oscar@gigadefense.com.mx>
2026-09-06 00:23:21 -07:00
proscar87
55f871fd0c
Adopt has_entity_name to fix duplicated entity ids on HA 2026.4+ (#1499)
* Adopt has_entity_name to fix duplicated entity ids on HA 2026.4+

Since HA core 2026.4 (PR 166246) composes entity names as device name +
entity name, and only strips the device prefix when the entity name
starts with it. Adaptive Lighting's names ('Adaptive Lighting Sleep
Mode: stairs' on device 'Adaptive Lighting: stairs') never match, so
new installs get ids like
switch.adaptive_lighting_stairs_adaptive_lighting_sleep_mode_stairs.

Adopt has_entity_name: the main switch takes the device name
('Adaptive Lighting: <name>'), the simple switches use their role
('Sleep Mode', 'Adapt Brightness', 'Adapt Color'). Unique ids are
unchanged, so existing installs keep their entity ids via the registry.

Fixes #1459

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

* Test the new entity ids and that existing ones survive

The renamed constants were defined but never asserted, so neither the
fresh-install ids nor the registry-preservation claim were covered.

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

* test: keep the apply-service test light on

Avoid generating brightness zero in the attribute-change helper, which turns the light off and makes the test depend on the current adaptive brightness.

---------

Co-authored-by: proscar87 <proscar87@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2026-09-06 09:18:49 +02:00
proscar87
67d4a2f657
fix: clamp() collapsed to minimum when min_brightness > max_brightness (#1507)
* fix: clamp() collapsed to minimum when min_brightness > max_brightness

A user can intentionally set min_brightness > max_brightness (or the
equivalent for color temperature) for an inverted timescale -- e.g. a
porch light that should be brighter at night than during the day.
clamp()'s max(minimum, min(value, maximum)) assumed minimum <= maximum;
when inverted, min(value, maximum) is always <= maximum < minimum, so
max(minimum, ...) always returns minimum. linear and tanh brightness
modes -- both of which end in a clamp(brightness, min_brightness,
max_brightness) call -- got stuck returning one fixed value regardless
of the time of day.

Fixes #1421

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

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

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

* test: accept current Home Assistant brightness validation errors

Keep asserting the maximum brightness limit without depending on the validation library's dictionary-path wording.

---------

Co-authored-by: Oscar Pacheco <proscar@MacBook-Pro-de-Oscar.local>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2026-09-06 00:10:21 -07:00
Dennis Dekker
c620d1480a
fix: re-adapt lights right after the auto-reset timer fires (#1506)
When the auto-reset timer fired, its callback called manager.reset(),
which pops the timer and calls timer.cancel() - cancelling the very task
that was running the callback. The manual_control flag was cleared, but
the re-adaptation that should follow was silently cancelled, so the light
only changed on the next interval pass (with the normal transition).

_AsyncSingleShotTimer.cancel() now never cancels the task that is
currently running its own callback. The trailing assert in the callback
is removed because it is reachable now and could trip when a new manual
change comes in while the re-adaptation is still running. The existing
auto-reset test also checks that a light.turn_on with the 'autoreset'
context is sent.

Fixes #1233

Co-authored-by: Dennis-Dekker <>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 07:01:50 +00:00
Samson Brock
68c66a0ff3
Fix options flow changes silently discarded for pre-refactor UI entries (#1504)
* Fix options flow changes being silently discarded for UI-configured entries

validate() merges config_entry.options then config_entry.data, on the
assumption that data only ever holds YAML-imported settings (which should
win) or, for UI-created entries, just the entry name (harmless to apply
last).

That assumption doesn't hold for entries created before data/options were
split: their data still carries the full settings snapshot from initial
setup. Applying it after options means any change made through the options
flow for a key that already exists in data (e.g. adding a light) is
silently ignored, even though the options flow reports success and the
entry reloads without error.

Reproduced on a real entry: added a light via the options flow, entry
reloaded cleanly, but the light was never picked up by the switch's
service-call interceptor ("No switch found for entity_id=...") because
data still held the old light list and clobbered the updated options.

Fix: only let data win over options for genuinely YAML-imported entries
(config_entry.source == SOURCE_IMPORT), matching the existing use of that
check elsewhere in this file. For UI-configured entries, apply options
last so changes made through the options flow actually take effect.

* Add focused tests for the data/options merge order in validate()

Covers both source-specific contracts the merge logic relies on, per
review feedback on this PR:

- SOURCE_USER: options must win over data (this PR's actual fix - proven
  to fail against the pre-fix code, verified locally by reverting
  switch.py and re-running).
- SOURCE_IMPORT: data must keep winning over options (the existing,
  intentional YAML-precedence behavior - unchanged by this PR, verified
  to already pass against the pre-fix code too).

Verified against a real Home Assistant instance's test harness
(pytest-homeassistant-custom-component + the actual installed
homeassistant package), not just reasoned about statically.

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 00:00:02 -07:00
Corey Peruffo
6d46b82313
fix: use quantization-aware comparison in skip_redundant_commands filter (#1513)
* fix: use quantization-aware comparison in skip_redundant_commands filter

_remove_redundant_attributes() compared target values against light state
with exact equality, but many targets can never round-trip exactly through
a device with coarser resolution:

- brightness: HA's 0-255 scale vs the 0-99 Z-Wave Multilevel Switch scale
  leaves 156 of 255 targets that never converge (e.g. 230 -> 89 -> 229),
- color_temp_kelvin: the kelvin -> mired -> kelvin round trip leaves most
  kelvin targets off by up to ~21 K at 6500 K (e.g. 5500 -> 182 -> 5495).

Such attributes survived the filter and were re-sent every interval
forever, which on larger Z-Wave meshes is enough to jam the controller.

Compare brightness with a tolerance of 2 (the exact worst case of the
0-99 scale) and color temperature in mired space, where devices actually
quantize and where the comparison is exact at every kelvin value. Both
are far below the manual-control detection thresholds
(BRIGHTNESS_CHANGE = 25, COLOR_TEMP_CHANGE = 100), so they cannot mask a
genuine user change.

Fixes #1512

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017P2wLQYGQH6npY5op5CKVD

* fix: tolerate one mired to cover both floor- and round-based conversions

The previous exact mired equality assumed round-based kelvin<->mired
conversion, but HA core's color_temperature_kelvin_to_mired() and
color_temperature_mired_to_kelvin() both use math.floor, under which a
target like 5500 K comes back as 5524 K in a different rounded mired
bucket and would never be filtered. Flooring in the comparison instead
would merely flip the failure onto integrations that round.

Comparing with a tolerance of one mired converges for both conversion
schemes (verified by brute force over 1000-10000 K: zero stuck targets
under either pipeline) and can hide at most ~2 mireds, far below the
~5.5 mired just-noticeable difference for color temperature.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017P2wLQYGQH6npY5op5CKVD

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 06:53:06 +00:00
renovate[bot]
5df9b30d32
⬆️ Update actions/checkout action to v7 (#1479)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2026-09-06 08:45:48 +02:00
allcontributors[bot]
cc93af84de
docs: add proscar87 as a contributor for code (#1519)
* 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 <basnijholt@gmail.com>
2026-09-06 08:37:57 +02:00
allcontributors[bot]
efee60cb9a
docs: add Dennis-Dekker as a contributor for code (#1518)
* 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 <basnijholt@gmail.com>
2026-09-06 08:37:34 +02:00
allcontributors[bot]
dce34134b6
docs: add imwithsam as a contributor for code (#1517)
* 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 <basnijholt@gmail.com>
2026-09-06 08:37:09 +02:00
allcontributors[bot]
a9fd62a110
docs: add cperuffo3 as a contributor for code (#1516)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-09-06 08:35:50 +02:00
renovate[bot]
19dd9723a3
⬆️ Update python to v3.14.7 (#1419) 2026-09-06 08:30:13 +02:00
renovate[bot]
afb447c4e8
⬆️ Update pytz to v2026 (#1436) 2026-09-06 08:29:53 +02:00
renovate[bot]
928d57f8be
⬆️ Update actions/setup-python action to v7 (#1493) 2026-09-06 08:28:58 +02:00
renovate[bot]
f3af35f95e
⬆️ Update astral-sh/setup-uv action to v10 (#1501) 2026-09-06 08:28:48 +02:00
renovate[bot]
4a87b5ef54
⬆️ Update astral-sh/setup-uv action to v9 (#1496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-29 14:02:37 -07:00
Bas Nijholt
7afdf5bc5c
Update manifest.json to v1.31.0 (#1486) 2026-07-07 09:38:26 -07:00
Bas Nijholt
3638fb3013
fix: don't cancel adaptation when a light group turns on via a member with a reused context (#1483)
* fix: don't cancel adaptation when a light group turns on via a member with a reused context (#1378)

When a member of a light group is turned on (e.g., by a motion sensor
automation) while the group is off, the group turns on as a side effect,
but Home Assistant may reuse the context of the earlier turn_off call for
the group's state change. just_turned_off() saw matching context IDs and
treated the state change as a polling artifact, cancelling adaptation.

- Check whether the off->on state change comes from a light.turn_on call
  before the matching-context polling-artifact check, so automations that
  turn a light off and back on with a single (automation) context adapt
  correctly.
- For light groups, allow adaptation when a member's turn_on event falls
  between the group's on->off and off->on state changes, bounded on both
  sides so stale member events are never treated as explanatory.
- Document that integration-level groups (e.g., Zigbee2MQTT groups) should
  not be nested inside HA Light Groups managed by Adaptive Lighting.

* fix: time-bound the same-context turn_on check instead of reordering

Address review findings:

- Reordering the turn_on-service check above the matching-context check
  reintroduced stale-event false negatives: turn_on_event entries are never
  cleaned up, so a 'turn_on -> delay -> turn_off(transition)' automation
  (one shared context) would defeat the polling-artifact guard and AL could
  turn a light back on right after it was turned off. Restore main's check
  order and instead add a time-bounded own-turn_on check inside the
  matching-context branch, symmetric with the group-member check. This
  also avoids emitting the 'should not happen' warning for self-context
  polling artifacts.
- Add a regression test for the stale same-context turn_on case.
- Add an end-to-end test driving the event-bus listeners for the #1378
  scenario (group kept in manager.lights, as in the reported setups).
- Docs: drop the inaccurate 'expands only one level deep' claim; explain
  that integration-level groups cannot be expanded and nested groups make
  tracking unpredictable.
2026-07-02 08:08:14 -07:00
Bas Nijholt
d4d3d50ada
fix: replace deprecated get_astral_location with get_astral_observer (#1482)
* fix: replace deprecated get_astral_location with get_astral_observer (#1481)

HA 2026.7 deprecates homeassistant.helpers.sun.get_astral_location
(removal planned for 2027.7) in favor of get_astral_observer, causing a
deprecation warning in the HA logs.

- Switch SunEvents/SunLightSettings from astral.location.Location to
  astral.Observer, using the astral.sun module functions (which return
  UTC times by default, matching the previous local=False calls).
- Use get_astral_observer in switch.py, with a fallback for HA < 2026.7
  that constructs the Observer directly from the HA config.
- Update tests and the webapp simulator accordingly.

* ci: handle removal of requirements_test_all.txt in HA 2026.8 dev

HA core removed requirements_test_all.txt (home-assistant/core#171530),
which made test_dependencies.py crash with FileNotFoundError and broke
the dev pytest job and the Docker builds. Fall back to
requirements_all.txt, which carries the same per-integration
'# homeassistant.components.x' annotations. Also extend the
aiohasupervisor pin lookup in scripts/setup-dependencies accordingly.

* test: support modern template light config for HA 2026.6+

HA 2026.6 removed the legacy `light: platform: template` YAML format
(home-assistant/core#169615), so setup_lights found no template platform
on HA dev and every test using it failed with IndexError. Detect legacy
support at runtime (PLATFORM_SCHEMA presence) and fall back to the
modern `template:` config format. The group platform is set up before
the template integration in the modern path, because setting up
`template` also sets up the `light` domain, which would make a later
async_setup_component(hass, LIGHT_DOMAIN, ...) a no-op.
2026-07-01 23:00:35 -07:00
renovate[bot]
ddaf851be3
⬆️ Update release-drafter/release-drafter action to v7
Squash merge Renovate GitHub Actions update.

Validation:
- Fixed PR-time Release Drafter v7 execution by using dry-run for pull_request events.
- GitHub Actions checks for PR #1445 passed before merge.
2026-04-24 14:55:04 -07:00
renovate[bot]
89b5e9a14f
⬆️ Update docker/setup-qemu-action action to v4
Squash merge Renovate GitHub Actions update.

Validation:
- GitHub Actions checks for PR #1438 passed before merge.
2026-04-24 14:23:26 -07:00
Florian
830c5589f7
fix: reduce log verbosity for self-triggered off-to-on warning (#1433) (#1434)
* fix: reduce log verbosity for self-triggered off-to-on warning (#1433)

Move full event object dump from warning to debug level in
_off_to_on_state_event_is_from_turn_on() (switch.py:2717).

For lights with large effect_list attributes (e.g. Govee lights
with 130+ effects), the warning dumped the entire Event object
including both old_state and new_state, creating log entries
thousands of characters long.

The warning now logs only entity_id and context.id, while the
full event remains available at debug level for troubleshooting.

Fixes #1433

* fix: correct indentation for _LOGGER.debug block

* fix: correct indentation for _LOGGER.warning and _LOGGER.debug

* fix: remove unintended encoding corruption, keep only log level change

Reset switch.py to main and re-apply only the intended change:
move the full event object from warning to debug level in
_off_to_on_state_event_is_from_turn_on().

Addresses reviewer feedback about unintended Unicode corruption
(→ and ≈ characters were corrupted to mojibake).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Florian Horner <florianhorner@Mac.fritz.box>
Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
2026-04-24 13:30:18 -07:00
renovate[bot]
7dcad99d81
⬆️ Update docker/setup-buildx-action action to v4 (#1439)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 13:13:53 -07:00
renovate[bot]
cb4eb7ef49
⬆️ Update actions/deploy-pages action to v5 (#1453)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 13:13:34 -07:00
renovate[bot]
17e43e0427
⬆️ Update astral-sh/setup-uv action to v8 (#1468)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 13:13:15 -07:00
Florian
b787c533bf
fix: make setup-dependencies portable on macOS (#1463)
Two issues prevented the script from running on macOS without manual intervention:

1. `sed -i` requires a backup suffix on macOS BSD sed. Replace with a
   portable `grep -v | mv` idiom that works on both macOS and Linux.

2. `python` is not in PATH on macOS by default. Replace with `python3`.

Co-authored-by: Florian Horner <florianhorner@macbook-pro-von-florian.tail6f28f8.ts.net>
Co-authored-by: Bas Nijholt <basnijholt@users.noreply.github.com>
2026-04-24 13:12:20 -07:00
renovate[bot]
c8c31be573
⬆️ Update actions/upload-pages-artifact action to v5 (#1467)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 13:12:01 -07:00
renovate[bot]
86091de0e7
⬆️ Update docker/login-action action to v4 (#1437)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 12:00:21 -07:00
renovate[bot]
31762ba78d
⬆️ Update docker/metadata-action action to v6 (#1440)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 12:00:10 -07:00
renovate[bot]
0a305a7a4c
⬆️ Update docker/build-push-action action to v7 (#1441)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-24 11:59:38 -07:00
Bas Nijholt
c4b8e28ea8
fix: restore hassfest and Home Assistant CI
## Summary
- fix hassfest validation by replacing raw options-description URLs with Home Assistant translation placeholders
- extend the pytest CI matrix to cover the latest patch release for each Home Assistant month, plus dev
- align CI/dev container Python versions and tests with newer Home Assistant behavior

## Validation
- GitHub Actions pytest matrix passed for 2024.12.5 through 2026.4.3 plus dev
- Docker passed for linux/amd64 and linux/arm64
- hassfest, HACS validation, pre-commit, pre-commit.ci, markdown-code-runner, docs build, and Release Drafter passed
2026-04-24 11:31:53 -07:00
Roee Hendel
6cebe14a69
fix: merge last_service_data across split calls to fix detect_non_ha_changes with separate_turn_on_commands (#1426)
* test: regression test — AL must not override manual brightness with separate_turn_on_commands

End-to-end scenario: user adjusts brightness via a directly-bound Zigbee
switch (e.g. IKEA RODRET).  No HA service call is made; ZHA reports the new
brightness via async_update_entity.  On the next adaptation interval AL must
detect the change and stop overriding the user's brightness.

The test verifies the user-visible symptom: after two adaptation cycles
following a simulated direct-Zigbee brightness change, the light's brightness
must still be the manually set value — not AL's own target.

NOTE: this test FAILS on the current code.  It is committed here to document
the bug before the fix is applied in the next commit.

* fix: merge last_service_data across split calls to fix detect_non_ha_changes with separate_turn_on_commands

When separate_turn_on_commands=True, each adaptation cycle makes two
light.turn_on calls (brightness, then color_temp).  Previously each call
overwrote last_service_data[light], so after the cycle only the color_temp
key remained.  _attributes_have_changed() then saw old_brightness=None and
silently skipped the brightness comparison, so a manually-set brightness was
never detected and AL kept overriding it.

Fix: merge instead of overwrite so all split-call attributes accumulate:

    self.manager.last_service_data[light] = {
        **self.manager.last_service_data.get(light, {}),
        **service_data,
    }

* test: add intermediate assertions to regression test

Two assertions were promised in the PR description but missing:
1. After the force-adapt, assert that last_service_data contains BOTH
   brightness AND color — directly proving the merge fix works.
2. After the first non-forced update, assert that BRIGHTNESS is in
   manual_control — proving detection fired, not just that the final
   state is right.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

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

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

* refactor: remove spurious comments, trim test docstring and assertions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: strip verbose comments from test, trim assert messages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

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

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

* test: add message to bare assert
2026-03-16 15:54:53 -07:00
Bas Nijholt
f9ccc946ee
Migrate to markdown-code-runner's built-in include_section() (#1417) 2026-01-26 09:01:50 +01:00
renovate[bot]
74a795d907
⬆️ Update actions/checkout action to v6.0.2 (#1411)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-22 23:02:25 +00:00
allcontributors[bot]
e9f7d4925f
docs: add Esspel as a contributor for translation (#1409)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-01-20 03:20:18 -08:00
allcontributors[bot]
ec33670b3f
docs: add Yllelder as a contributor for translation (#1408)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-01-20 03:19:00 -08:00
allcontributors[bot]
2fdc2a1636
docs: add NatanDosAnjos as a contributor for translation (#1407)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-01-20 03:18:04 -08:00
allcontributors[bot]
7317c2966d
docs: add ademuri as a contributor for code (#1406) 2026-01-20 07:36:36 +00:00
Adam DeMuri
5b7153a9a1 Automated update of docs/troubleshooting.md 2026-01-20 01:10:17 +00:00
Adam DeMuri
d964c861d5 Fix the markdown-code-runner workflow.
This fixes the workflow to work for pull requests in addition to pushes:
- Correctly determines the repository and branch
- For pull requests, if there are changes, fails with a message to make
  the changes locally
- Extracts the commands to update generated files into a script
2026-01-20 01:10:17 +00:00
Adam DeMuri
f7a7226fdb
Fix Docker warning by removing unbound variable (#1400) 2026-01-19 17:03:40 +00:00
Adam DeMuri
e656dd31b0
Fix coverage. (#1404) 2026-01-19 17:03:20 +00:00
Adam DeMuri
ae719a676d Add core/ to .gitignore 2026-01-17 08:34:46 +01:00
allcontributors[bot]
d60ba75014
docs: add andrei-lazarov as a contributor for doc (#1397) 2026-01-14 19:28:08 +01:00
Andrei LAZAROV
da732ae1a1
📝 Update readme: Modern lights are routers (#1396) 2026-01-14 19:27:19 +01:00
Mario Guggenberger
844afc081a
build: fix tasks not executing in dev container (#1394) 2026-01-13 11:32:17 +01:00
renovate[bot]
fcff6d48ec
⬆️ Update astral-sh/setup-uv action to v7 (#1392) 2026-01-13 09:07:28 +01:00
renovate[bot]
093376dbed
⬆️ Update actions/setup-python action to v6 (#1390) 2026-01-13 09:06:58 +01:00
renovate[bot]
455040e532
⬆️ Update actions/checkout action to v6 (#1389) 2026-01-13 09:06:42 +01:00
Bas Nijholt
eb25df01d5
Enable custom analytics provider for Plausible (#1388) 2026-01-12 23:50:55 +01:00
renovate[bot]
9480211e1b ⬆️ Update python to v3.14.2 2026-01-12 23:49:27 +01:00
renovate[bot]
a1ddbc000f ⬆️ Pin dependencies 2026-01-12 23:46:08 +01:00
Bas Nijholt
cbbcabdd1f
Add documentation site with Zensical framework (#1385)
* Add documentation site with Zensical framework

Create comprehensive documentation site for adaptive-lighting.nijho.lt:

- Add zensical.toml configuration with Material theme (amber/orange)
- Create docs_gen.py module for extracting README sections via markers
- Add section markers to README.md for content reuse
- Create documentation pages:
  - index.md: Home with features overview
  - getting-started.md: Installation and quick setup
  - configuration.md: Auto-generated config options table
  - services.md: Auto-generated service documentation
  - automation-examples.md: Real-world automation recipes
  - troubleshooting.md: Common issues and solutions
  - see-also.md: External resources and links
  - advanced/brightness-modes.md: Brightness mode deep dive
  - advanced/manual-control.md: Manual control system docs
  - advanced/sleep-mode.md: Sleep mode configuration
- Add GitHub Actions workflow for building and deploying to Pages
- Add custom CSS with sun-themed styling
- Add CNAME for custom domain

Uses markdown-code-runner to auto-generate content from code schemas
and extract README sections for single-source documentation.

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

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

* Remove duplicated content from docs, make pages thin wrappers

- troubleshooting.md: Remove manually written "Additional Tips" section
- automation-examples.md: Remove duplicate "Additional Examples" section
- configuration.md: Remove duplicate "Option Categories" tables
- sleep-mode.md: Simplify to reference main config, remove duplicate examples
- docs_gen.py: Remove unused get_troubleshooting() and get_sleep_mode_intro()

This reduces duplication risk by keeping README as single source of truth.
Docs pages now primarily pull content via markdown-code-runner.

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

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

* Integrate webapp (simulator) into docs workflow

- Merge deploy-webapp.yml into docs.yml workflow
- Build simulator and place at /simulator/ subdirectory
- Update docs links to use relative paths to simulator
- Remove separate deploy-webapp.yml to avoid conflicts

The combined workflow now:
1. Builds docs with zensical
2. Builds webapp with shinylive
3. Copies webapp to site/simulator/
4. Deploys everything to GitHub Pages

Simulator will be at adaptive-lighting.nijho.lt/simulator/

* Fix pre-commit and CI issues

- Add site_name to zensical.toml (required by MkDocs)
- Fix RET504 in docs_gen.py (unnecessary assignment before return)
- Remove docs/run_markdown_code_runner.py (lint issues, not needed for CI)

* Fix _docs_helpers.py import error in CI

- Add try/except for relative vs absolute imports in _docs_helpers.py
- Remove silent error handling in docs workflow (fail on error)

The relative import fails when markdown-code-runner executes the code
directly via sys.path.insert. The fallback to absolute import fixes this.

* Temporarily enable deployment from feature branch

* Add tabulate dependency for pandas to_markdown()

* Fix theme configuration for proper light/dark mode

- Restructure zensical.toml to match working agent-cli config
- Add three-way palette toggle (system/light/dark)
- Use proper [project.theme] structure
- Simplify extra.css to not override theme colors
- Add Inter font for text, JetBrains Mono for code

* Add Plausible analytics and fix homepage navigation

- Add custom analytics override for plausible.nijho.lt tracking
- Remove hide:navigation from index.md to show menu on homepage

* Remove temporary feature branch deployment settings

Revert to main-only deployment for docs workflow before merging.

* Revert "Remove temporary feature branch deployment settings"

This reverts commit c568694837.

* Add markdown-gfm-admonition for GitHub-style admonitions

The zensical build was failing silently because gfm_admonition extension
was not installed. Add the dependency to pyproject.toml and docs workflow.

* Use uv sync for documentation dependencies

Switch from manual pip installs to uv sync with pyproject.toml for cleaner
dependency management and reproducible builds.

* Fix markdown rendering inside details blocks

Enable md_in_html extension and add markdown="1" attribute to <details>
tags so markdown content inside them is properly rendered.

* Remove emojis from manually written documentation

Keep emojis in auto-generated content from README, but remove from
manually maintained docs in favor of clean text and Material icons.

* Enable attr_list extension for button styling

* Improve pyproject.toml and use GitHub-style admonitions

- Add accurate project metadata (version, authors, classifiers, URLs)
- Organize dependency groups: docs, dev, test
- Add tool configs for ruff, mypy, pytest
- Convert MkDocs-style admonitions (!!! tip) to GitHub-style (> [!TIP])
- Use docs group in CI workflow

* Add homeassistant and ulid-transform as runtime dependencies

Remove speculative test dependencies since tests run inside HA core.

* Simplify docs_gen.py - remove wrapper functions

Use readme_section() directly in docs instead of 10 one-liner wrappers.
Changed default strip_heading to True since that's the common case.

* Populate empty OUTPUT sections with markdown-code-runner

* Add markdown-code-runner workflow for auto-updating docs

- Add docs/run_markdown_code_runner.py script to process all docs
- Add GitHub workflow to run on push/PR and auto-commit changes

* Exclude README.md from markdown-code-runner workflow

README.md contains code blocks that import from
homeassistant.components.adaptive_lighting, which only exists
when running inside Home Assistant core, not in a regular venv.

* Update auto-generated docs

* Use editable install for markdown-code-runner workflow

- Add setuptools.packages.find config pointing to custom_components
- Remove sys.path.insert manipulation from all docs files
- Update imports to use adaptive_lighting.* package paths
- Install package with `uv pip install -e .` in workflow
- Remove deprecated license classifier (PEP 639)

* Consolidate markdown-code-runner into single workflow

- Remove separate markdown-code-runner.yml workflow
- Update update-readme.yml to handle all markdown files (docs + README)
- Rename workflow to "Update auto-generated content"
- Update README imports to use adaptive_lighting package path

* Rename workflow to markdown-code-runner

* Remove accidentally committed files

* Remove redundant markdown-code-runner from docs workflow

* Fix: use uv pip install instead of uv add in CI

* Add webapp deps (astral, shinylive) to docs group

* Remove unused install_dependencies action

* Update to latest action versions (uv@v5, upload-pages-artifact@v4)

* Remove try/except import fallback in _docs_helpers.py

* Restore install_dependencies action (used by pytest)

* Simplify docs workflow: run on all pushes/PRs

* Simplify mcr workflow paths; revert install_dependencies to main

* Remove redundant cp+sed for webapp (file already in repo)

* Fix mcr push: pull --rebase before push

* Fix mcr: checkout PR branch instead of detached HEAD

* Update auto-generated content

* Switch from setuptools to hatch build system

Replace [tool.setuptools.packages.find] with [tool.hatch.build.targets.wheel]
for hatchling compatibility.

* Update auto-generated content

* Move homeassistant deps to docs group

This is a HA custom component, not a pip package. The homeassistant
dependency is only needed for docs building, not as a project dependency.

* Update auto-generated content

* Remove PyPI-only metadata from pyproject.toml

* Remove arbitrary version constraints from dependency groups

* Update auto-generated content

* Remove unused troubleshooting section markers from README

* Remove temporary feature branch settings from docs workflow

* Use GitHub admonition syntax for warning in change_switch_settings section

* Update auto-generated content
2026-01-12 23:39:57 +01:00
Bas Nijholt
e0f812d406
Bump to v1.30.1 (#1384) 2026-01-12 13:46:19 +01:00
Bas Nijholt
e61a018616
Fix regression: lights not adapting when turned on by automation (#1380)
## Summary

- Fixes regression in v1.30.0 where lights turned on by automations were incorrectly marked as "manually controlled"
- Makes `adapt_only_on_bare_turn_on` respect individual attribute tracking from #1356

## Root Cause

PR #1356 added a call to `update_manually_controlled_from_event()` in the `turn_on_off_event_listener.on()` handler for ALL `light.turn_on` events, including when turning a light on from OFF state.

When an automation turns on a light with brightness/color attributes, this incorrectly marked the light as "manually controlled", preventing Adaptive Lighting from adapting it.

## Fix

1. Only call `update_manually_controlled_from_event()` when the light was **already ON** before the turn_on event. Turning on from OFF is handled by `_respond_to_off_to_on_event()`.

2. Make `adapt_only_on_bare_turn_on` respect `take_over_control_mode`:
   - With `PAUSE_CHANGED`: Only pause adaptation of specified attributes, continue adapting unspecified ones
   - With `PAUSE_ALL`: Pause all adaptation (existing behavior)

## Expected Behavior After Fix

| Scenario | `adapt_only_on_bare_turn_on` | `take_over_control_mode` | Result |
|----------|------------------------------|--------------------------|--------|
| Turn on from OFF with brightness | `false` | Either | NOT manually controlled |
| Turn on from OFF with brightness | `true` | `PAUSE_ALL` | All adaptation paused |
| Turn on from OFF with brightness | `true` | `PAUSE_CHANGED` | Only brightness paused, color adapts |
| Turn on from OFF without attributes | Either | Either | NOT manually controlled |
| Change brightness while ON | Either | Either | Brightness manually controlled |

## Test plan

- [x] Turn on light via automation with brightness/color (`adapt_only_on_bare_turn_on=false`) - should adapt
- [x] Turn on light via scene (`adapt_only_on_bare_turn_on=true`, `PAUSE_ALL`) - should pause all adaptation
- [x] Turn on light with brightness only (`adapt_only_on_bare_turn_on=true`, `PAUSE_CHANGED`) - should adapt color
- [x] Both intercept=True and intercept=False paths tested for consistency
- [x] CI tests pass

Fixes #1378

Co-authored-by: Mario Guggenberger <mg@protyposis.net>
2026-01-12 13:40:55 +01:00
Bas Nijholt
49f9da14fe
docs: clarify Docker test setup requirements (#1383) 2026-01-11 21:57:52 +01:00
Bas Nijholt
f95093e1dc Bump to v1.30.0 2026-01-05 12:43:07 -08:00
Mario Guggenberger
f84ee445b7
Individual manual control of brightness and color (#1356)
* refactor: introduce light control parameter enum

* refactor: replace manual control flag with parameter enum

* test: update deprecated color temp attribute

* build: set execution bits on task scripts

* feat: individual manual control of brightness and color

* test: add tests for individual manual control evaluation

* fix: sequential manual changes not always detected

If multiple attributes of a light were changed within an interval, only the last change was detected because the check in the interval only used the latest event. For example, if there was a brightness change and a following color change, only the color attribute was detected as manually controlled. To fix this, the manual control attribute flags are now set directly from the event handler so that all events are processed.

* fix: invalid service description

* docs: fix missing space in config description

* refactor: pluralize multivalued bitmask enum name
2025-12-22 22:55:16 -08:00
Weblate (bot)
2f599d6e1b
Translations update from Hosted Weblate (#1331)
* Translated using Weblate (German)

Currently translated at 100.0% (156 of 156 strings)

Co-authored-by: Anton <ihrkenntmichnicht@posteo.de>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/de/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Catalan)

Currently translated at 100.0% (156 of 156 strings)

Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ca/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Anton <ihrkenntmichnicht@posteo.de>
Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
2025-12-12 14:00:30 -08:00
renovate[bot]
828f73d481
⬆️ Update actions/checkout action to v6 (#1352)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-12 13:59:40 -08:00
lenucksi
9c7a95f696
fix(ci): fix broken Docker workflow and modernize (#1318)
* fix(ci): fix broken Docker workflow and modernize

## Critical Bug Fixes

1. **Fix broken push condition** (CRITICAL):
   - Old: `push: ${{ github.ref == 'refs/heads/master' }}`
   - Problem: Branch renamed to `main`, so images NEVER pushed
   - New: `push: ${{ github.event_name != 'pull_request' }}`
   - Result: Docker images will actually be published again

2. **Add missing checkout step**:
   - Build was failing because source code wasn't checked out
   - Required for Docker build context

## Modernization Improvements

3. **Migrate to GitHub Container Registry (GHCR)**:
   - Old: DockerHub with `DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` secrets
   - New: GHCR with built-in `GITHUB_TOKEN`
   - Benefits: No external account required, better integration

4. **Add semantic versioning**:
   - Automatically tags releases: `v1.2.3`, `v1.2`, `v1`, `latest`
   - Supports version tags (v*), branches, and PRs
   - Uses docker/metadata-action for automatic tagging

5. **Add GitHub Actions caching**:
   - Uses `type=gha` cache for faster builds
   - Reduces build times and GitHub Actions minutes

6. **Security: Digest pinning**:
   - All actions pinned to commit SHAs
   - Prevents supply chain attacks via tag manipulation
   - Follows security best practices

7. **Add explicit permissions**:
   - Minimal required permissions (contents: read, packages: write)
   - Follows principle of least privilege

8. **Add workflow triggers**:
   - Tags (v*) for releases
   - Pull requests for testing
   - Manual dispatch for on-demand builds

## Testing

- Workflow syntax validated
- Push logic tested with different event types
- Compatible with existing Docker build process

🤖 Generated with [Claude Code](https://claude.com/claude-code)

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

* refactor(ci): simplify docker workflow

- Use version tags instead of SHA pins for readability
- Remove verbose step names (action names are self-documenting)
- Compact YAML formatting
- Fix actions/checkout to v4 (v6 doesn't exist)

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-12-12 13:49:45 -08:00
Mario Guggenberger
79973fb71d
chore(devcontainer): fix Pylance resolution of HA core modules (#1343) 2025-12-12 13:38:35 -08:00
Mario Guggenberger
5886eee04c
Code cleanup (#1348) 2025-12-12 13:37:42 -08:00
Bas Nijholt
ce7dadebdd
ci: workaround aiodns/pycares compatibility issue (#1351)
Upgrade aiodns after installing dependencies to fix compatibility
issue with pycares.

See: https://github.com/aio-libs/aiodns/issues/214
2025-12-12 13:29:46 -08:00
Bas Nijholt
94b91a0ddc
fix: use correct entity and context in service interceptor (#1349) 2025-12-12 13:05:01 -08:00
Bas Nijholt
dc61bd191c
Bump to v1.29.0 2025-12-09 23:58:19 -08:00
Bas Nijholt
0180fa4a93
feat: use EntitySelector for light entity selection with search support (#1335)
Replace cv.multi_select with HA's EntitySelector for the lights field
in the options flow. This provides:

- Built-in search/typing to find entities faster
- Better UX with HA's native entity picker
- Improved handling of renamed entities

Closes #1208
2025-12-09 23:51:17 -08:00
renovate[bot]
37ef65586d
⬆️ Update python to v3.14.2 (#1251)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-09 23:31:41 -08:00
renovate[bot]
97ecbb17a0
⬆️ Update actions/checkout action to v6.0.1 (#1328)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-09 23:31:17 -08:00
renovate[bot]
ef15d5cd48
⬆️ Update peter-evans/create-pull-request action to v8 (#1334)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-09 23:31:05 -08:00
allcontributors[bot]
ea623ce604
docs: add edgimar as a contributor for code (#1330)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-12-05 04:15:38 -08:00
edgimar
4aeb50bfe3
feat: add option to duplicate existing lighting instance (#1329)
* feat: add option to duplicate existing lighting instance

A menu step in the config flow was added that allows a user to create a
new instance or duplicate the options of an existing one.

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

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

* Add type annotation, tests, and translations for duplicate feature

- Add type annotation for source_options class attribute
- Add menu step translations to en.json
- Add tests for menu display, new instance creation, and duplication

* Simplify source_options access with class-level default

---------
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-12-05 04:15:24 -08:00
renovate[bot]
886c77bcc2
⬆️ Update actions/setup-python action to v6 (#1327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-30 22:54:08 -08:00
Weblate (bot)
2f03e00dc6
Translated using Weblate (Danish) (#1326)
Currently translated at 94.1% (144 of 153 strings)


Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/da/
Translation: Adaptive Lighting/Adaptive Lighting

Co-authored-by: Hans Henrik Juhl <hans@kopula.dk>
2025-11-30 22:53:52 -08:00
lenucksi
077e086424
fix(ci): correct branch name and path in update-readme workflow (#1321) 2025-11-30 08:22:57 -08:00
allcontributors[bot]
f04c91b54b
docs: add lenucksi as a contributor for code (#1325) 2025-11-30 08:18:36 -08:00
renovate[bot]
1be701994b
⬆️ Pin python to 3.12.12 (#1323) 2025-11-30 08:16:24 -08:00
renovate[bot]
fb6e96c878
⬆️ Update actions/checkout action to v6 (#1324) 2025-11-30 08:16:05 -08:00
lenucksi
7a5ad22c62
fix(devcontainer): install uv and add venv cleanup (#1317) 2025-11-30 08:14:27 -08:00
Lenucksi
cc25a50401 ci: add automated weekly test matrix updates
Add automation to keep the pytest test matrix up-to-date with latest
Home Assistant Core releases:

1. **Weekly Automation**: New workflow updates test matrix automatically
2. **Version Fetcher**: Python script queries GitHub API for latest HA Core releases
3. **PR Creation**: Automatically creates PRs when new versions are available

## Benefits
- No more manual updates when new HA Core versions are released
- Automatic tracking of new HA Core releases
- Reduces maintenance burden

## Background
This builds on commit a982acb which fixed mypy-dev pinning. While upstream
now installs latest mypy-dev automatically, the test matrix versions still
need manual updates. This automation solves that remaining manual task.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 08:09:19 -08:00
lenucksi
894d0025cd
fix(ci): add branch filter to TOC generator workflow (#1320) 2025-11-30 08:06:21 -08:00
Bas Nijholt
80fb93b9f6
Fix propcache dependency (revert to functools) (#1314) 2025-11-28 16:43:52 -08:00
Bas Nijholt
1968e1a9a6
Bump to v1.28.0 (#1310) 2025-11-27 12:42:20 -08:00
allcontributors[bot]
2391d99539 docs: update .all-contributorsrc 2025-11-27 12:03:04 -08:00
allcontributors[bot]
bba7bb8350 docs: update README.md 2025-11-27 12:03:04 -08:00
Dobby
19d30430bb
Friendly names (#1258) 2025-11-27 12:01:05 -08:00
Bas Nijholt
a982acb384
Stop pinning mypy-dev versions since old releases get deleted from PyPI (#1308) 2025-11-27 12:00:47 -08:00
Bas Nijholt
d95f0d4bc6
Fix xfail and skipped tests to properly pass (#1307) 2025-11-27 18:52:11 +00:00
Weblate (bot)
8ff3babae2
Translations update from Hosted Weblate (#1228)
* Translated using Weblate (Galician)

Currently translated at 50.3% (77 of 153 strings)

Translated using Weblate (Galician)

Currently translated at 49.0% (75 of 153 strings)

Translated using Weblate (Galician)

Currently translated at 46.4% (71 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/gl/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Turkish)

Currently translated at 100.0% (153 of 153 strings)

Added translation using Weblate (Turkish)

Co-authored-by: Furkan Kaya <fkaya.personal@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/tr/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 56.8% (87 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael do Amaral Porciuncula <rafael.do.amaralp@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt_BR/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Danish)

Currently translated at 90.1% (138 of 153 strings)

Translated using Weblate (Danish)

Currently translated at 88.8% (136 of 153 strings)

Translated using Weblate (Danish)

Currently translated at 88.8% (136 of 153 strings)

Translated using Weblate (Danish)

Currently translated at 88.8% (136 of 153 strings)

Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Hans Henrik Juhl <hans@kopula.dk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/da/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Russian)

Currently translated at 99.3% (152 of 153 strings)

Co-authored-by: Athish Athish <athisha660@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ru/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/uk/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Japanese)

Currently translated at 48.3% (74 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: M.Sugahara <equaaqua@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ja/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/hu/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Slovenian)

Currently translated at 71.2% (109 of 153 strings)

Added translation using Weblate (Slovenian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Tim Music <tim.music98@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sl/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Co-authored-by: Furkan Kaya <fkaya.personal@gmail.com>
Co-authored-by: Rafael do Amaral Porciuncula <rafael.do.amaralp@gmail.com>
Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Hans Henrik Juhl <hans@kopula.dk>
Co-authored-by: Athish Athish <athisha660@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: M.Sugahara <equaaqua@hotmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Tim Music <tim.music98@gmail.com>
2025-11-27 10:15:06 -08:00
allcontributors[bot]
d7aa3439d5
docs: add therealmate as a contributor for translation (#1306) 2025-11-27 10:14:16 -08:00
allcontributors[bot]
d12394dc03
docs: add plageoj as a contributor for translation (#1305) 2025-11-27 10:13:53 -08:00
allcontributors[bot]
0ddb79b03f
docs: add maksim2005UKR as a contributor for translation (#1304) 2025-11-27 10:13:26 -08:00
allcontributors[bot]
ce16be20b5
docs: add Athishbalu as a contributor for translation (#1303) 2025-11-27 10:13:01 -08:00
allcontributors[bot]
c37e992be9
docs: add hhjuhl as a contributor for translation (#1302) 2025-11-27 10:12:38 -08:00
allcontributors[bot]
5274a3fefa
docs: add Rafael4A as a contributor for translation (#1301) 2025-11-27 10:11:53 -08:00
allcontributors[bot]
edefdbf3b8
docs: add Wijt as a contributor for translation (#1300)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-11-27 10:11:31 -08:00
Bas Nijholt
4feaf2c291
Add bidirectional color mode change detection (issue #1275) (#1299)
Extract _has_color_mode_changed() function that checks original attributes
BEFORE conversion, enabling detection of all mode switches:
- color_temp → RGB ✓
- color_temp → XY ✓
- RGB → color_temp ✓
- RGB → XY ✓
- XY → color_temp ✓
- XY → RGB ✓

This improves on PR #1282 by detecting mode changes in both directions.
2025-11-27 10:02:50 -08:00
allcontributors[bot]
41e13bc944
docs: add DataGhost as a contributor for code (#1298)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-11-27 09:57:41 -08:00
DataGhost
afd7b935d7
Check for external light mode (temperature vs rgb) switch (#1282) 2025-11-27 09:54:14 -08:00
allcontributors[bot]
3d3d246918
docs: add ams2990 as a contributor for code (#1297)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-11-27 09:36:04 -08:00
ams2990
32719eabae
Fix some type hint issues (#1280) 2025-11-27 09:35:09 -08:00
renovate[bot]
561749ac06
⬆️ Update actions/setup-python action to v6 (#1261)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 09:34:46 -08:00
renovate[bot]
f6321afeae
⬆️ Update actions/upload-pages-artifact action to v4 (#1259)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 09:30:26 -08:00
renovate[bot]
9244ff39fe
⬆️ Update astral-sh/setup-uv action to v7 (#1271)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 09:30:12 -08:00
Bas Nijholt
68e243c87e
Fix infinite loop when disabling SimpleSwitch entities (#1296)
* Add regression tests for SimpleSwitch initial state bug

Adds tests that verify SimpleSwitch._state is set immediately in __init__
rather than waiting for async_added_to_hass(). These tests currently FAIL
because _state is None after __init__, which causes an infinite loop in
_setup_listeners when the entity is disabled (since async_added_to_hass
is never called for disabled entities).

Regression tests for: https://github.com/basnijholt/adaptive-lighting/issues/1264

* Fix infinite loop when disabling SimpleSwitch entities

The issue was that SimpleSwitch._state was initialized to None in __init__,
but only set to a boolean value in async_added_to_hass(). When an entity
is disabled, async_added_to_hass() is never called, so _state stayed None.

The _setup_listeners() method has a while loop that waits for
_state is not None for all SimpleSwitch children (sleep_mode_switch,
adapt_brightness_switch, adapt_color_switch). With _state stuck at None,
this created an infinite loop.

The fix sets _state to initial_state directly in __init__ instead of
waiting for async_added_to_hass() to set it. The async_added_to_hass()
will still properly restore state from the last session or set based
on initial_state as before.

Fixes: https://github.com/basnijholt/adaptive-lighting/issues/1264
2025-11-27 09:30:01 -08:00
renovate[bot]
1556de8c4f
⬆️ Update mcr.microsoft.com/devcontainers/python Docker tag to v3 (#1292)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 09:27:38 -08:00
renovate[bot]
b34cc1ffaa
⬆️ Update actions/checkout action to v6 (#1288)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 09:27:27 -08:00
Bas Nijholt
6f846c26ca
Fix race condition where timer.start_time is None while is_running() is True (#1295)
When start() creates a task with asyncio.create_task(), the task is scheduled
but not immediately executed. This means is_running() returns True (task exists
and not done), but start_time is still None because _run() hasn't executed yet.

This causes a TypeError when comparing event.time_fired > timer.start_time.

Fix by setting start_time in start() before creating the task.

Fixes #1272
2025-11-27 09:27:13 -08:00
allcontributors[bot]
95a8f34000
docs: add Tommatheussen as a contributor for code (#1294) 2025-11-27 09:17:12 -08:00
Bas Nijholt
e8af7a485e
Bump to 1.27.0 for fixes in 2025.12 (#1293) 2025-11-27 09:06:41 -08:00
Tom Matheussen
af5a7151aa
Fix HA 2025.12 breaking (#1291) 2025-11-27 08:05:30 -08:00
Bas Nijholt
0a2d2e9fb5
Properly fix the webapp 2025-07-21 15:49:55 -07:00
Bas Nijholt
f45fa66390
Revert "Remove app requirements"
This reverts commit 3c86a6e28b.
2025-07-21 15:44:37 -07:00
Bas Nijholt
3c86a6e28b Remove app requirements 2025-07-21 15:38:56 -07:00
Bas Nijholt
8e75144e5d
Fix webapp Pyodide compatibility: pin matplotlib and contourpy versions (#1242)
* Fix webapp README: correct pip install command

The README had incorrect syntax for pip install. Changed from
`pip install requirements.txt` to `pip install -r requirements.txt`.

* Fix webapp Pyodide compatibility: pin matplotlib and contourpy versions

The webapp uses Shinylive which runs Python in the browser via Pyodide.
Pyodide only supports specific versions of packages that have C extensions.
Pin matplotlib to 3.8.4 and contourpy to 1.3.1 to match Pyodide's available versions.

This fixes the "Can't find a pure Python 3 wheel for 'contourpy==1.3.2'" error
when loading the webapp.
2025-07-21 15:22:11 -07:00
Zachary McCord
86460f6948
webapp: add missing requirements and instructions for local run (#1235) 2025-07-13 14:45:30 -07:00
Bas Nijholt
762900262f
Fix Docker build 2025-06-15 22:33:35 -07:00
Bas Nijholt
5d7599e33b
Revert "Fix Docker build"
This reverts commit ab29fb080c.
2025-06-15 22:28:12 -07:00
Bas Nijholt
ab29fb080c
Fix Docker build 2025-06-15 22:26:05 -07:00
Bas Nijholt
a8e35ae216
Release v1.26.0 (#1227) 2025-06-15 22:20:53 -07:00
Bas Nijholt
b1aca6408d
Skip broken test (#1226)
Also see https://github.com/basnijholt/adaptive-lighting/pull/1159
2025-06-15 22:16:31 -07:00
Bas Nijholt
cb67a4cb9c
Fix test_light_switch_in_specific_area (#1225) 2025-06-15 22:12:48 -07:00
Bas Nijholt
5f02e9de75
Bump min supported version to 2025.12 (#1224) 2025-06-15 21:57:08 -07:00
pre-commit-ci[bot]
8035ea3ed1
[pre-commit.ci] pre-commit autoupdate (#1163)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.8.4 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.4...v0.11.13)
- [github.com/psf/black: 24.10.0 → 25.1.0](https://github.com/psf/black/compare/24.10.0...25.1.0)

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

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

* fix pre-commit

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-06-15 21:55:36 -07:00
renovate[bot]
e08a752514
⬆️ Update actions/setup-python action to v5.6.0 (#1171)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-15 21:49:44 -07:00
renovate[bot]
106d4733fe
⬆️ Pin python to 3.13.5 (#1181)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-15 21:49:31 -07:00
allcontributors[bot]
33c1d2eb6b
docs: add TermeHansen as a contributor for code (#1223)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:48:37 -07:00
allcontributors[bot]
ab934b0d03
docs: add jawilson as a contributor for code (#1222)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:48:03 -07:00
Jeff Wilson
2623aafa61
Remove deprecated @bind_hass (#1207)
* remove @bind_hass decorator

* attempt to pass hass

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

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

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-06-15 21:47:26 -07:00
Rasmus Lundsgaard
6cb99e80b0
suggested fix for HA2025 deprecation warnings (#1168)
* suggested fix for HA2025 deprecation warnings

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

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

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-06-15 21:47:06 -07:00
allcontributors[bot]
ff84a46aed
docs: add defaultpage as a contributor for translation (#1216)
* 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 <basnijholt@gmail.com>
2025-06-15 21:46:11 -07:00
allcontributors[bot]
4510ebdca7
docs: add bittin as a contributor for translation (#1221)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:42:54 -07:00
allcontributors[bot]
14e898bc8e
docs: add rezaalmanda as a contributor for translation (#1220)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:42:34 -07:00
allcontributors[bot]
f5ee0aa58d
docs: add mrpiotr-dev as a contributor for translation (#1219)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:42:08 -07:00
allcontributors[bot]
fd5cef7901
docs: add helderfmf as a contributor for translation (#1218)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:41:50 -07:00
allcontributors[bot]
1ddd34a230
docs: add yeaxi as a contributor for translation (#1217)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:41:09 -07:00
allcontributors[bot]
3a4d2ff3d8
docs: add amelenty as a contributor for translation (#1215)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:40:16 -07:00
allcontributors[bot]
afc399e613
docs: add tinutac as a contributor for translation (#1214)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:39:48 -07:00
allcontributors[bot]
1232bcc2d5
docs: add xuars as a contributor for translation (#1213)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-06-15 21:39:06 -07:00
Weblate (bot)
640b634074
Translations update from Hosted Weblate (#1160)
* Translated using Weblate (Galician)

Currently translated at 46.4% (71 of 153 strings)

Translated using Weblate (Galician)

Currently translated at 45.0% (69 of 153 strings)

Added translation using Weblate (Galician)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/gl/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Tamil)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ta/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Romanian)

Currently translated at 57.5% (88 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: tinutac <tinutac@yahoo.co.uk>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ro/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Ukrainian)

Currently translated at 79.7% (122 of 153 strings)

Translated using Weblate (Ukrainian)

Currently translated at 61.4% (94 of 153 strings)

Translated using Weblate (Ukrainian)

Currently translated at 59.4% (91 of 153 strings)

Translated using Weblate (Ukrainian)

Currently translated at 58.8% (90 of 153 strings)

Co-authored-by: Ada Melentyeva <ada.melentyeva@gmail.com>
Co-authored-by: Artem <artem@molotov.work>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rostyslav Dudka <rostislav.dudka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/uk/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Catalan)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ca/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Portuguese)

Currently translated at 66.0% (101 of 153 strings)

Co-authored-by: Helder Ferreira <esponjaman@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Polish)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Piotr Laszczkowski <swistach@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/id/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Dutch)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: renout <weblate@renout.nl>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Spanish)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/es/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (French)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Swedish)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sv/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Finnish)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fi/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gmkeebiy <gmkeebiy@sharklasers.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/zh_Hans/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: tinutac <tinutac@yahoo.co.uk>
Co-authored-by: Ada Melentyeva <ada.melentyeva@gmail.com>
Co-authored-by: Artem <artem@molotov.work>
Co-authored-by: Rostyslav Dudka <rostislav.dudka@gmail.com>
Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
Co-authored-by: Helder Ferreira <esponjaman@gmail.com>
Co-authored-by: Piotr Laszczkowski <swistach@gmail.com>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: renout <weblate@renout.nl>
Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Co-authored-by: gmkeebiy <gmkeebiy@sharklasers.com>
2025-06-15 21:38:10 -07:00
Bas Nijholt
ded439e6f7
Fix Docker setup and CI installation (#1212) 2025-06-15 21:31:51 -07:00
Alex Whiteside
da4f3c16eb
Added a HACS button for quicker install path via Google/Github (#1211) 2025-06-15 18:54:59 -07:00
pre-commit-ci[bot]
9aee234955
[pre-commit.ci] pre-commit autoupdate (#972)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/pre-commit/pre-commit-hooks: v4.5.0 → v5.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v5.0.0)
- [github.com/astral-sh/ruff-pre-commit: v0.3.5 → v0.8.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.5...v0.8.4)
- [github.com/psf/black: 24.3.0 → 24.10.0](https://github.com/psf/black/compare/24.3.0...24.10.0)

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

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

* Fix issues

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2025-01-01 23:28:15 -08:00
Bas Nijholt
935b913bc7
Fix test_proactive_adaptation_with_separate_commands (#1158) 2025-01-01 22:49:58 -08:00
Bas Nijholt
69c3e3503c
Release v1.25.0 (#1157) 2025-01-01 20:02:46 -08:00
Bas Nijholt
72eb848a79
Fix setting config_entry directly in ≥2024.12 (#1155)
* Fix setting config_entry directly in ≥2024.12

FAILED tests/components/adaptive_lighting/test_config_flow.py::test_incorrect_options - RuntimeError: Detected that integration 'adaptive_lighting' sets option flow config_entry explicitly, which is deprecated at homeassistant/components/adaptive_lighting/config_flow.py, line 86: self.config_entry = config_entry. Please create a bug report at https://github.com/home-assistant/core/issues?q=is%3Aopen+is%3Aissue+label%3A%22integration%3A+adaptive_lighting%22

* compatiblity
2025-01-01 16:46:11 -08:00
Weblate (bot)
32482c4e04
Translated using Weblate (Catalan) (#1153)
Currently translated at 91.5% (140 of 153 strings)



Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ca/
Translation: Adaptive Lighting/Adaptive Lighting

Co-authored-by: Enric Pagès i Gassull <enricpages@hotmail.com>
2025-01-01 16:37:23 -08:00
allcontributors[bot]
e6888cdc78
docs: add enpaga as a contributor for translation (#1156)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-01 16:37:08 -08:00
Bas Nijholt
ad4e7bd775
Add 2025.1.0b5 to testing (#1154) 2025-01-01 16:34:35 -08:00
Bas Nijholt
9a2466cc6f
Use markdown-code-runner==2.1.0 (#1152)
* Use `markdown-code-runner==2.1.0`

* Use correct arg

* uv run

* Update README.md, strings.json, and services.yaml
2025-01-01 16:19:08 -08:00
Bas Nijholt
f8719994a6
use uv, fix devcontainer, and drop support for HA ≤2023.6 (#1151)
* Update .devcontainer

* Drop support for ≤2023.6

* Add .vscode/settings.json

* Use async_process_ha_core_config

* Fix for HA ≤2023.10

* pop normalized_name

* Add comments

* use . instead of source

* set pytest args

* set country

* use py3.13 for dev branch of core

* set country in test_adaptive_lighting_time_zones_with_default_settings

* Add comment
2025-01-01 16:11:22 -08:00
Bas Nijholt
60d07ecd02
Add FUNDING.yml (#1150) 2025-01-01 14:37:22 -08:00
renovate[bot]
cdd8ca3952
⬆️ Update mcr.microsoft.com/vscode/devcontainers/python Docker tag to v3.13 (#1137)
* ⬆️ Update mcr.microsoft.com/vscode/devcontainers/python Docker tag to v3.13

* Update README.md, strings.json, and services.yaml

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-01 14:26:53 -08:00
allcontributors[bot]
06dab257e3
docs: add Sara492 as a contributor for translation (#1149)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-01 14:22:50 -08:00
Weblate (bot)
2b6c42d4a8
Translations update from Hosted Weblate (#1145)
* Translated using Weblate (Croatian)

Currently translated at 47.7% (73 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: dex girl <saraciric73@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/hr/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Korean)

Currently translated at 99.3% (152 of 153 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ko/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: dex girl <saraciric73@gmail.com>
2025-01-01 14:22:24 -08:00
Daniel
bf7d109c98
fix: async entry setup (#1141)
* Update __init__.py

* Update strings.json
2025-01-01 14:19:31 -08:00
Márton Maráz
2e2b9e55ef
Fix trailing spaces in const.py: restore correct one, remove incorrect one (#1148)
* Fix trailing spaces in const.py: restore correct one, remove incorrect one

* Also remove trailing space from translations/en.json

* Also remove trailing space from strings.json
2025-01-01 14:18:54 -08:00
allcontributors[bot]
66561058ec
docs: add marazmarci as a contributor for code (#1147)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-01-01 12:23:22 -08:00
Márton Maráz
6d517fc913
Remove trailing space from string in const.py (#1146) 2025-01-01 12:22:38 -08:00
Bas Nijholt
b3e4d09b6b
Include core 2024.9.3 until 2024.12.0 in the tests (#1130) 2024-12-07 11:29:05 -08:00
Bas Nijholt
66b93eb3de
Add webapp/__init__.py (#1129) 2024-12-05 14:55:25 -08:00
Bas Nijholt
52d36d5ebc Merge remote-tracking branch 'weblate/main' 2024-12-05 14:43:04 -08:00
Bas Nijholt
8fb9493a40
Fix Shiny WebApp (#1127)
* Use requirements.txt.in

* Include webapp/color_and_brightness.py

* Fix Shiny WebApp

* Install shinylive in CI
2024-12-05 14:35:19 -08:00
Bas Nijholt
c12b54e265 Use uv pip compile 2024-12-05 11:55:44 -08:00
renovate[bot]
4739863fb2
⬆️ Update actions/checkout action to v4 (#1106)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:49:56 +02:00
renovate[bot]
6b567565ab
⬆️ Update linkify-it-py to v2.0.3 (#1082)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:51 +02:00
renovate[bot]
5bd1adf3d2
⬆️ Update mdit-py-plugins to v0.4.2 (#1083)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:45 +02:00
renovate[bot]
0ba1fa554b
⬆️ Update pre-commit/action action to v3.0.1 (#1084)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:40 +02:00
renovate[bot]
32e3bbdeba
⬆️ Update python-multipart to v0.0.19 (#1085)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:26 +02:00
renovate[bot]
cee0ae56c4
⬆️ Update sniffio to v1.3.1 (#1086)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:19 +02:00
renovate[bot]
c2d699555e
⬆️ Update uc-micro-py to v1.0.3 (#1087)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:13 +02:00
renovate[bot]
56497176df
⬆️ Update shinyswatch to v0.8.0 (#1100)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:48:06 +02:00
renovate[bot]
d8255b2bad
⬆️ Update actions/checkout action to v3.6.0 (#1088)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:47:44 +02:00
renovate[bot]
ed434e6b48
⬆️ Update anyio to v4.7.0 (#1091)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:57 +02:00
renovate[bot]
0c8feba1cf
⬆️ Update asgiref to v3.8.1 (#1092)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:51 +02:00
renovate[bot]
af09a6f3a3
⬆️ Update htmltools to v0.6.0 (#1093)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:46 +02:00
renovate[bot]
8c5d65f955
⬆️ Update idna to v3.10 (#1094)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:38 +02:00
renovate[bot]
8b5a48f4ee
⬆️ Update python Docker tag to v3.13 (#1096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:26 +02:00
renovate[bot]
5450e0d3ad
⬆️ Update shinylive to v0.7.1 (#1099)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:46:17 +02:00
renovate[bot]
186da900aa
⬆️ Update starlette to v0.41.3 (#1101)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:45:39 +02:00
renovate[bot]
d5f992a12d
⬆️ Update typing-extensions to v4.12.2 (#1102)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:45:31 +02:00
renovate[bot]
dfac56ca89
⬆️ Update uvicorn to v0.32.1 (#1103)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:44:52 +02:00
renovate[bot]
aab8d1bd6d
⬆️ Update actions/configure-pages action to v5 (#1107)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:44:39 +02:00
renovate[bot]
9082ab349d
⬆️ Update actions/deploy-pages action to v4 (#1108)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:43:52 +02:00
renovate[bot]
577e6b2138
⬆️ Update actions/setup-python action to v5 (#1109)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:43:09 +02:00
renovate[bot]
e4f5163f16
⬆️ Update actions/upload-pages-artifact action to v3 (#1111)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:42:48 +02:00
renovate[bot]
57c36133f7
⬆️ Update docker/build-push-action action to v6 (#1113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:42:14 +02:00
renovate[bot]
dd1090cf52
⬆️ Update docker/login-action action to v3 (#1114)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:42:07 +02:00
renovate[bot]
b8306c2b21
⬆️ Update docker/setup-buildx-action action to v3 (#1115)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:54 +02:00
renovate[bot]
584368c1a4
⬆️ Update docker/setup-qemu-action action to v3 (#1116)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:49 +02:00
renovate[bot]
0d29b1d60c
⬆️ Update packaging to v24 (#1117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:41 +02:00
renovate[bot]
7d418be392
⬆️ Update pytz to v2024 (#1118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:34 +02:00
renovate[bot]
2a24c519fe
⬆️ Update release-drafter/release-drafter action to v6 (#1119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:23 +02:00
renovate[bot]
8855f3313e
⬆️ Update shiny to v1 (#1121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:41:15 +02:00
renovate[bot]
2a3acd5206
⬆️ Update ubuntu to v24 (#1122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:40:36 +02:00
renovate[bot]
3811df7c57
⬆️ Update watchfiles to v1 (#1123)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:40:26 +02:00
renovate[bot]
7e98bdd46a
⬆️ Update websockets to v14 (#1124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 21:31:36 +02:00
allcontributors[bot]
33a7f56a31
docs: add Ricky-Tigg as a contributor for translation (#1120)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-05 21:29:38 +02:00
allcontributors[bot]
4e2f02fbc2
docs: add pbassut as a contributor for translation (#1110)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-05 21:28:58 +02:00
allcontributors[bot]
4006fe0b15
docs: add immeteor2 as a contributor for translation (#1105)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-05 21:28:32 +02:00
allcontributors[bot]
54f4307649
docs: add Thunderstrike116 as a contributor for translation (#1095)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-05 21:28:01 +02:00
Weblate (bot)
111d9fc6b1
Translations update from Hosted Weblate (#1016)
* Translated using Weblate (Tamil)

Currently translated at 100.0% (153 of 153 strings)

Added translation using Weblate (Tamil)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ta/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Greek)

Currently translated at 44.4% (68 of 153 strings)

Added translation using Weblate (Greek)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Thunderstrike116 <thunderstrike116@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/el/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Japanese)

Currently translated at 49.0% (75 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Meteor2 <ryumeteor175@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ja/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Portuguese)

Currently translated at 60.7% (93 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Patrick Bassut <patrick@bassut.com.br>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Dutch)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: brietman <brietman@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Finnish)

Currently translated at 99.3% (152 of 153 strings)

Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fi/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Slovak)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milan Šalka <salka.milan@googlemail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sk/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: Thunderstrike116 <thunderstrike116@gmail.com>
Co-authored-by: Meteor2 <ryumeteor175@gmail.com>
Co-authored-by: Patrick Bassut <patrick@bassut.com.br>
Co-authored-by: brietman <brietman@gmail.com>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Co-authored-by: Milan Šalka <salka.milan@googlemail.com>
2024-12-05 21:27:50 +02:00
allcontributors[bot]
5c6fc91c66
docs: add TamilNeram as a contributor for translation (#1089)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-12-05 21:27:19 +02:00
renovate[bot]
43015d1df1
⬆️ Update starlette to v0.40.0 [SECURITY] (#1080)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 11:20:12 -08:00
renovate[bot]
9a190e625a
⬆️ Update idna to v3.7 [SECURITY] (#1079)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 11:20:07 -08:00
renovate[bot]
09e0473457
⬆️ Update python-multipart to v0.0.18 [SECURITY] (#1078)
* ⬆️ Update python-multipart to v0.0.18 [SECURITY]

* Update README.md, strings.json, and services.yaml

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-05 11:20:00 -08:00
Bas Nijholt
8899d0f5f4
Add Mend Renovate bot (#1077)
* Add Mend Renovate bot

* Add extends
2024-12-05 11:14:08 -08:00
chpego
ccf465251c
Update bug-report.md (#1046)
fix url
2024-10-06 22:42:03 -07:00
allcontributors[bot]
981cc420ec
docs: add brietman as a contributor for translation (#1042) 2024-08-25 12:24:23 -07:00
Bas Nijholt
ac37b50330
Update manifest.json with version 2024-08-25 11:34:34 -07:00
Bas Nijholt
7d265e9928
Add more versions to testing matrix (#1040)
* Add more versions to testing matrix

* Update mypy-dev dep

* fix sed
2024-08-25 11:21:01 -07:00
rwjack
fc46ed73b6
Fix #1017 (#1038) 2024-08-25 11:03:13 -07:00
allcontributors[bot]
318d921b91
docs: add MizterB as a contributor for code (#1039) 2024-08-25 09:00:56 -07:00
MizterB
d3b2d00bf1
Treat Hue groups as individual lights (#1037) 2024-08-25 09:00:14 -07:00
Weblate (bot)
8e8c520dad
Translated using Weblate (Romanian) (#997) 2024-06-06 08:22:10 -07:00
allcontributors[bot]
ca0c79e3df
docs: add lachezar-gizdov as a contributor for translation (#1013) 2024-06-06 08:18:44 -07:00
Lucho Gizdov
7987a4a825
Add Translations file for Bulgarian (#987) 2024-06-06 08:15:25 -07:00
allcontributors[bot]
5aa763fef3
docs: add Marck as a contributor for code (#1005) 2024-05-20 08:23:12 -07:00
Bas Nijholt
5a55299628
Bump to 1.22.0 (#1004) 2024-05-20 08:17:41 -07:00
Bas Nijholt
a0476632a5
Bump to 1.21.4 2024-05-20 08:15:00 -07:00
Marck
36115327da
Added light dependencies (#1003) 2024-05-20 08:14:11 -07:00
allcontributors[bot]
18d0186e33
docs: add MrEbbinghaus as a contributor for code (#1000) 2024-05-15 09:08:49 -07:00
Björn Ebbinghaus
618e2ccf4a
Add service to group switches (#998) 2024-05-15 09:07:59 -07:00
Bas Nijholt
01f639f5bb
Use after_dependencies to fix #950 (#999)
* Use `after_dependencies` to fix #950

* Sort manifest.json

* sort
2024-05-15 09:02:37 -07:00
Bas Nijholt
b1f8df6f14
Bump to 1.21.2 in manifest.json (#995) 2024-05-13 08:51:23 -07:00
allcontributors[bot]
cb289a0548
docs: add rVlad93 as a contributor for translation (#994)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-13 08:50:34 -07:00
allcontributors[bot]
470b245c6e
docs: add rafaeltmiranda as a contributor for translation (#993)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-13 08:50:07 -07:00
Weblate (bot)
514bb4de2a
Translations update from Hosted Weblate (#981)
* Added translation using Weblate (Romanian)

Co-authored-by: Vlad Radu <metal_nerve@yahoo.com>

* Translated using Weblate (Portuguese)

Currently translated at 56.8% (87 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael Miranda <tmirandarafael@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Vlad Radu <metal_nerve@yahoo.com>
Co-authored-by: Rafael Miranda <tmirandarafael@gmail.com>
2024-05-13 08:49:43 -07:00
allcontributors[bot]
82f2b8f82e
docs: add erdnaxela02 as a contributor for code (#992) 2024-05-12 11:33:39 -07:00
Frosh
b746e5f19c
Remove deprecated 'run_immediately' (#991) 2024-05-12 11:32:46 -07:00
Bas Nijholt
1a2cd7399d
Fix for HA <= 2024.3, closes #973 (#974)
* Fix for HA <= 2024.3, closes #973

* Link
2024-04-08 23:59:18 -07:00
Bas Nijholt
edf0427131
Update version in manifest.json (1.21.0) (#971) 2024-04-07 14:25:47 +02:00
pre-commit-ci[bot]
d427b18b48
[pre-commit.ci] pre-commit autoupdate (#935)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.2.1 → v0.3.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.1...v0.3.5)
- [github.com/psf/black: 24.2.0 → 24.3.0](https://github.com/psf/black/compare/24.2.0...24.3.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2024-04-07 14:22:22 +02:00
Bas Nijholt
d23f6ec63a
Fix test_proactive_adaptation_with_separate_commands (#970)
* Add link script

* Set run_immediately=False

* Add await hass.async_block_till_done()

* Use scripts/link

* Rename scripts

* Links in devcontainer

* Install from setup script
2024-04-07 14:01:05 +02:00
Bas Nijholt
47cbda5c5e
Add versions to matrix and fix area test (#967) 2024-04-06 19:05:18 +02:00
Weblate (bot)
a36b0c3430
Translations update from Hosted Weblate (#946)
* Translated using Weblate (Croatian)

Currently translated at 44.4% (68 of 153 strings)

Added translation using Weblate (Croatian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: scuricvladimir <scuric.vladimir@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/hr/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Afrikaans)

Currently translated at 49.0% (75 of 153 strings)

Added translation using Weblate (Afrikaans)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Pieter Bezuidenhout <piter.bezuidenhout@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/af/
Translation: Adaptive Lighting/Adaptive Lighting

* Added translation using Weblate (Chinese (Traditional))

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: chris lin <san800682596@gmail.com>

---------

Co-authored-by: scuricvladimir <scuric.vladimir@gmail.com>
Co-authored-by: Pieter Bezuidenhout <piter.bezuidenhout@gmail.com>
Co-authored-by: chris lin <san800682596@gmail.com>
2024-04-06 04:06:17 -07:00
allcontributors[bot]
6dae5641a2
docs: add san80068259 as a contributor for translation (#966)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-06 04:05:48 -07:00
allcontributors[bot]
7eb2d00ab9
docs: add Welsyntoffie as a contributor for translation (#965)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-06 04:05:28 -07:00
allcontributors[bot]
14bb0b4c5f
docs: add scuricvladimir as a contributor for translation (#964)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-04-06 04:04:46 -07:00
Bas Nijholt
a388656448
Remove --use-pep517 from pip install and change Python version in devcontainer (#963)
* Remove --use-pep517 from pip install

* Update Python version of devcontainer
2024-04-06 11:31:30 +02:00
Bas Nijholt
2f31b42cb2
Fix devcontainer and testing Dockerfile (#962)
* Fix permissions for `scripts/setup`

* Add new script

* Use script

* Update Dockerfile

* Rename and clone

* Perms

* Fix

* fi
2024-04-06 11:25:47 +02:00
Bas Nijholt
9eae1501d3
Test HA core v2023.6 until v2024.2 (#942)
* Test HA core v2023.6 until v2024.2

* Use Python 3.12

* Add components.ffmpeg

* Revert "VS Code Dev Container (dev & test environment) (#605)"

This reverts commit 6283158ff7.

* Fix

* revert

* fi

* simplify

* Fix

* fixes

* fix

* rev

* Rename test

* fix

* fix all

* fix

* revert
2024-04-06 10:14:54 +02:00
Bas Nijholt
e4e1aa7d37
Use Python 3.12 in .github/workflows/update-readme.yml (#961) 2024-04-06 10:13:13 +02:00
Bas Nijholt
f2a124c30f
Update Ruff to be used in tests (#943)
* Update Ruff config

* Rerun ruff
2024-03-03 15:09:18 -08:00
allcontributors[bot]
36a5a51405
docs: add JonathanKang as a contributor for code (#941)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-03-03 11:38:58 -08:00
Jonathan Kang
8fe532748a
Do not adapt lights that are turned on with an effect (#844)
* Do not adapt lights that are turned on with an effect

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

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

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2024-03-03 11:38:31 -08:00
allcontributors[bot]
b02c3f8024
docs: add droans as a contributor for code (#937)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-21 13:10:39 -08:00
droans
92aa50411a
Test that switch is on before updating time listeners (#936)
Co-authored-by: Michael Carroll <mjoecarroll@gmail.com>
2024-02-21 13:10:00 -08:00
saya6k
bc8c94081a
add Korean translation (#923)
* add Korean translation

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

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

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

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

* fix

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2024-02-17 11:03:14 -08:00
Bas Nijholt
30e1c8d190
Revert translations deleted by @mstefany (#933) 2024-02-17 11:00:52 -08:00
Weblate (bot)
9fbc5ec0ad
Translations update from Hosted Weblate (#879)
* Translated using Weblate (Danish)

Currently translated at 85.6% (131 of 153 strings)

Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/da/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Russian)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mr Snake <andressnake@mail.ru>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ru/
Translation: Adaptive Lighting/Adaptive Lighting

* Added translation using Weblate (Bengali)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jarif Ansath Aorko <jarif.aorko@gmail.com>

* Translated using Weblate (Japanese)

Currently translated at 48.3% (74 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: pantan-cymk <remendne@pentrens.jp>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ja/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Czech)

Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Štefany <m.stefany89@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/cs/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Szalay Ádám <szalay.4d4m@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/hu/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (153 of 153 strings)

Added translation using Weblate (Indonesian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ivan D. Firmansyah <ivandhuha@gmail.com>
Co-authored-by: sayaivan <ivandhuha@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/id/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (French)

Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (French)

Currently translated at 84.9% (130 of 153 strings)

Co-authored-by: Florent Cardoen <f.cardoen@me.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Finnish)

Currently translated at 56.8% (87 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mikko Eloranta <mikko.a.eloranta@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fi/
Translation: Adaptive Lighting/Adaptive Lighting

* Added translation using Weblate (Korean)

Co-authored-by: saya6k <saya6k@me.com>

* Translated using Weblate (Slovak)

Currently translated at 98.0% (150 of 153 strings)

Translated using Weblate (Slovak)

Currently translated at 98.0% (150 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Štefany <m.stefany89@gmail.com>
Co-authored-by: Unambiguous <weblate@m.qwy.ooo>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sk/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 58.1% (89 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jan-Sigurd Sørensen <jansigurd@gmail.com>
Co-authored-by: Stian Lindvik <slindvik@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nb_NO/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Mr Snake <andressnake@mail.ru>
Co-authored-by: Jarif Ansath Aorko <jarif.aorko@gmail.com>
Co-authored-by: pantan-cymk <remendne@pentrens.jp>
Co-authored-by: Martin Štefany <m.stefany89@gmail.com>
Co-authored-by: Szalay Ádám <szalay.4d4m@gmail.com>
Co-authored-by: Ivan D. Firmansyah <ivandhuha@gmail.com>
Co-authored-by: Florent Cardoen <f.cardoen@me.com>
Co-authored-by: Mikko Eloranta <mikko.a.eloranta@gmail.com>
Co-authored-by: saya6k <saya6k@me.com>
Co-authored-by: Unambiguous <weblate@m.qwy.ooo>
Co-authored-by: Jan-Sigurd Sørensen <jansigurd@gmail.com>
Co-authored-by: Stian Lindvik <slindvik@gmail.com>
2024-02-17 10:56:12 -08:00
allcontributors[bot]
a1ce600db1
docs: add saya6k as a contributor for translation (#932)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:52:33 -08:00
allcontributors[bot]
e6ea8eee7d
docs: add moemeli as a contributor for translation (#931)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:52:10 -08:00
allcontributors[bot]
ef54669e9a
docs: add Fllorent0D as a contributor for translation (#930)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:51:33 -08:00
allcontributors[bot]
8e1a89efdf
docs: add sayaivan as a contributor for translation (#929)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:51:06 -08:00
allcontributors[bot]
d991a99b83
docs: add 4D4M-Github as a contributor for translation (#928)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:50:40 -08:00
allcontributors[bot]
bd20939a48
docs: add hungrymachine1 as a contributor for translation (#927)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:49:26 -08:00
allcontributors[bot]
cf672a2c51
docs: add MrSnakeSPb as a contributor for translation (#926)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:48:47 -08:00
allcontributors[bot]
9d72f03343
docs: add EF01 as a contributor for translation (#925)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:47:56 -08:00
allcontributors[bot]
44b517155f
docs: add jansigu as a contributor for translation (#924)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-02-17 10:47:14 -08:00
pre-commit-ci[bot]
087b445c5a
[pre-commit.ci] pre-commit autoupdate (#922)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.2.0 → v0.2.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.0...v0.2.1)
- [github.com/psf/black: 24.1.1 → 24.2.0](https://github.com/psf/black/compare/24.1.1...24.2.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-02-12 14:59:44 -08:00
pre-commit-ci[bot]
95a59438b6
[pre-commit.ci] pre-commit autoupdate (#882)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.6 → v0.2.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.6...v0.2.0)
- [github.com/psf/black: 23.11.0 → 24.1.1](https://github.com/psf/black/compare/23.11.0...24.1.1)

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

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

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-02-05 14:13:13 -08:00
Bas Nijholt
a47f7ce49f
Add requirements-locked.txt for WebApp (#897) 2024-01-05 17:51:10 -08:00
Bas Nijholt
99cbe75f30
Pin compatible requirements (#896) 2024-01-05 17:38:29 -08:00
Nilesh
9f8eb97cfc
Fix webapp not loading (#895) 2024-01-05 17:20:19 -08:00
Bas Nijholt
3118e6f308
pin click in requirements.txt 2023-12-20 07:15:20 -08:00
Bas Nijholt
88a8a6d00e
pin shiny in requirements.txt (#887) 2023-12-20 07:12:52 -08:00
allcontributors[bot]
4de96afcd0
docs: add baylanger as a contributor for doc (#885) 2023-12-18 20:11:21 -08:00
Pierre Belanger
1601a22dc2
README.md - Add note to access UI (#884) 2023-12-18 20:08:29 -08:00
pre-commit-ci[bot]
1bb52379e6
[pre-commit.ci] pre-commit autoupdate (#826)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.1 → v0.1.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.1...v0.1.6)
- [github.com/psf/black: 23.10.0 → 23.11.0](https://github.com/psf/black/compare/23.10.0...23.11.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-12-09 01:13:02 -08:00
allcontributors[bot]
6ff114b855
docs: add yousaf465 as a contributor for translation (#876)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:49:21 -08:00
allcontributors[bot]
e3ca3aa081
docs: add pantan-cymk as a contributor for translation (#875)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:48:16 -08:00
allcontributors[bot]
7c85895f31
docs: add Luki72 as a contributor for translation (#874)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:47:56 -08:00
allcontributors[bot]
4fbf9ead90
docs: add quenthal as a contributor for translation (#873)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:47:37 -08:00
allcontributors[bot]
556cde6c42
docs: add mstefany as a contributor for translation (#872)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:47:08 -08:00
allcontributors[bot]
96558c2c69
docs: add pastukhov as a contributor for translation (#870)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-08 22:46:34 -08:00
Weblate (bot)
c3e4b77c7f
Translations update from Hosted Weblate (#867)
* Translated using Weblate (Russian)

Currently translated at 80.3% (123 of 153 strings)

Co-authored-by: Artem Pastukhov <artem.pastukhov@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ru/
Translation: Adaptive Lighting/Adaptive Lighting

* Added translation using Weblate (Japanese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: pantan-cymk <remendne@pentrens.jp>

* Translated using Weblate (Hungarian)

Currently translated at 48.3% (74 of 153 strings)

Added translation using Weblate (Hungarian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: LUKÁCS Miklós <luki1972@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/hu/
Translation: Adaptive Lighting/Adaptive Lighting

* Added translation using Weblate (Finnish)

Co-authored-by: Eero Konttaniemi <eero.konttaniemi@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>

* Translated using Weblate (Slovak)

Currently translated at 56.8% (87 of 153 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Štefany <m.stefany89@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sk/
Translation: Adaptive Lighting/Adaptive Lighting

* Translated using Weblate (Urdu)

Currently translated at 100.0% (153 of 153 strings)

Added translation using Weblate (Urdu)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: yousaf465 <yousaf465@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ur/
Translation: Adaptive Lighting/Adaptive Lighting

---------

Co-authored-by: Artem Pastukhov <artem.pastukhov@gmail.com>
Co-authored-by: pantan-cymk <remendne@pentrens.jp>
Co-authored-by: LUKÁCS Miklós <luki1972@gmail.com>
Co-authored-by: Eero Konttaniemi <eero.konttaniemi@gmail.com>
Co-authored-by: Martin Štefany <m.stefany89@gmail.com>
Co-authored-by: yousaf465 <yousaf465@gmail.com>
2023-12-08 22:46:12 -08:00
allcontributors[bot]
a247a02b37
docs: add kylebjordahl as a contributor for bug, and code (#866)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-07 23:58:14 -08:00
Bas Nijholt
bb29bcc6c5
Update manifest.json (#862) 2023-12-07 23:52:02 -08:00
allcontributors[bot]
4d4da04eb7
docs: add pbaart as a contributor for translation (#865)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-07 23:51:46 -08:00
allcontributors[bot]
5f2a67edd8
docs: add theclue as a contributor for translation (#864)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-07 23:51:11 -08:00
allcontributors[bot]
8dfef6d65b
docs: add olekbruks as a contributor for translation (#863)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-12-07 23:48:51 -08:00
Hosted Weblate
8c6689cdf2 Translated using Weblate (Dutch)
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Pepijn Baart <pepijn+git@badslipper.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-12-07 23:44:13 -08:00
Hosted Weblate
6271dda2cf Translated using Weblate (Italian)
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Gabriele Baldassarre <gabriele@gabrielebaldassarre.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/it/
Translation: Adaptive Lighting/Adaptive Lighting
2023-12-07 23:44:13 -08:00
Hosted Weblate
f3c1bdb0bd Translated using Weblate (Polish)
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Olek Bruks <olekbruks_git@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-12-07 23:44:13 -08:00
allcontributors[bot]
e8bd39f6d4
docs: add kylebjordahl as a contributor for code (#848) 2023-11-19 17:22:37 -08:00
Kyle Bjordahl
dce2a35147
Protect for None attributes after HA core change (#846) 2023-11-19 17:21:05 -08:00
pre-commit-ci[bot]
98a48ec071
[pre-commit.ci] pre-commit autoupdate (#821)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.0.292 → v0.1.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.292...v0.1.1)
- [github.com/psf/black: 23.9.1 → 23.10.0](https://github.com/psf/black/compare/23.9.1...23.10.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-10-23 14:02:43 -07:00
allcontributors[bot]
4d1108a3cf
docs: add Z-weapon as a contributor for translation (#816)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-10-18 21:58:02 -07:00
allcontributors[bot]
47f7a6e68e
docs: add fbloemhof as a contributor for translation (#815)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-10-18 21:57:47 -07:00
allcontributors[bot]
3f54647ba0
docs: add michaelkmoch as a contributor for translation (#814)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-10-18 21:57:20 -07:00
Hosted Weblate
dc98e4b933 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Z-weapon <Z-weapon@live.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/zh_Hans/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-18 21:56:45 -07:00
Hosted Weblate
3162c0ab32 Translated using Weblate (Swedish)
Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (Swedish)

Currently translated at 92.1% (141 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: fmarcu <fmarcu@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sv/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-18 21:56:45 -07:00
Hosted Weblate
8bb2ed1de2 Translated using Weblate (Dutch)
Currently translated at 76.4% (117 of 153 strings)

Co-authored-by: Fred <github@freakstar.nl>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-18 21:56:45 -07:00
Hosted Weblate
1a74f4f4bd Translated using Weblate (Czech)
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Michael Kmoch <michael.kmoch@seznam.cz>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/cs/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-18 21:56:45 -07:00
Weblate (bot)
29b2cc76ca
Translated using Weblate (Portuguese) (#806)
Currently translated at 56.8% (87 of 153 strings)


Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt/
Translation: Adaptive Lighting/Adaptive Lighting

Co-authored-by: Luis Caetano <luixcaetano@gmail.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-10-10 11:07:06 -07:00
pre-commit-ci[bot]
2f19dc22f8
[pre-commit.ci] pre-commit autoupdate (#770)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.5.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.5.0)
- [github.com/astral-sh/ruff-pre-commit: v0.0.284 → v0.0.292](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.284...v0.0.292)
- [github.com/psf/black: 23.7.0 → 23.9.1](https://github.com/psf/black/compare/23.7.0...23.9.1)

* Fix suggestion

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-10-10 17:45:53 +00:00
allcontributors[bot]
304ec8d722
docs: add fmarcu as a contributor for translation (#804)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-10-04 13:53:52 -07:00
allcontributors[bot]
fed52d2cc1
docs: add luixcaetano as a contributor for translation (#803)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-10-04 13:53:32 -07:00
Hosted Weblate
b6d891019f Translated using Weblate (Swedish)
Currently translated at 70.5% (108 of 153 strings)

Co-authored-by: fmarcu <fmarcu@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/sv/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-04 13:52:50 -07:00
Hosted Weblate
276dd9e582 Translated using Weblate (Portuguese)
Currently translated at 49.0% (75 of 153 strings)

Added translation using Weblate (Portuguese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Luis Caetano <luixcaetano@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pt/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-04 13:52:50 -07:00
Hosted Weblate
e08fc141cf Translated using Weblate (Czech)
Currently translated at 54.9% (84 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Vyleta <vyleta.spam@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/cs/
Translation: Adaptive Lighting/Adaptive Lighting
2023-10-04 13:52:50 -07:00
allcontributors[bot]
9c72952ed0
docs: add Arie6414 as a contributor for translation (#793)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-09-23 10:19:26 -07:00
Hosted Weblate
6502dae19f Translated using Weblate (Dutch)
Currently translated at 73.8% (113 of 153 strings)

Co-authored-by: Arie6414 <arjenvdbelt@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-09-23 10:19:15 -07:00
Weblate (bot)
5cd060a37c
Translated using Weblate (Ukrainian) (#788)
Currently translated at 55.5% (85 of 153 strings)


Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/uk/
Translation: Adaptive Lighting/Adaptive Lighting

Co-authored-by: Fujitsu Chrome <fujitsu.chrome@gmail.com>
2023-09-12 13:58:33 -07:00
Bas Nijholt
a7791a7478
Add note (#786) 2023-09-03 17:28:35 -07:00
allcontributors[bot]
c0e7eab402
docs: add lightrabbit as a contributor for translation (#784)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-31 15:11:18 -07:00
lightrabbit
c978c43f38
Add Simplified Chinese translation (#775)
* Add Simplified Chinese translation

* Update zh-Hans.json

Remove unexisted word and fix some titles.
2023-08-31 14:57:42 -07:00
Hosted Weblate
f085c47b63 Translated using Weblate (French)
Currently translated at 73.2% (112 of 153 strings)

Co-authored-by: Julien Quiévreux <julien.quievreux@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-30 21:57:24 -07:00
Hosted Weblate
c0d28ab4c5 Translated using Weblate (Italian)
Currently translated at 58.1% (89 of 153 strings)

Co-authored-by: Vladimir Cravero <vladimircravero@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/it/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-30 21:57:24 -07:00
allcontributors[bot]
7a19ac7ace
docs: add letroll as a contributor for translation (#782)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-30 20:47:07 -07:00
allcontributors[bot]
570c5cde2b
docs: add wilcomir as a contributor for translation (#781)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-30 20:42:06 -07:00
allcontributors[bot]
f3044efca9
docs: add KilFer as a contributor for translation (#778)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-28 19:25:32 -07:00
allcontributors[bot]
f7f3c8fd25
docs: add MirCore as a contributor for translation (#777)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-28 19:25:06 -07:00
allcontributors[bot]
5144fab7a3 docs: update .all-contributorsrc 2023-08-28 19:24:31 -07:00
allcontributors[bot]
e332b225f8 docs: update README.md 2023-08-28 19:24:31 -07:00
Hosted Weblate
e8cbc6a8d2 Translated using Weblate (Spanish)
Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (Spanish)

Currently translated at 47.0% (72 of 153 strings)

Added translation using Weblate (Spanish)

Co-authored-by: Fernando Belaza <fernando@belaza.me>
Co-authored-by: Gerard Rubio <gerard.rubio+weblate@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/es/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
dd0b45f623 Translated using Weblate (German)
Currently translated at 100.0% (153 of 153 strings)

Translated using Weblate (German)

Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mirco Hülsemann <mhuelse@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/de/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
27d0c47d0a Translated using Weblate (Dutch)
Currently translated at 69.2% (106 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kees <bikeso2057@dusyum.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
08a61767ad Translated using Weblate (Polish)
Currently translated at 100.0% (153 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Łukasz Marek <lukasz.marek1986@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
8b0616f184 Translated using Weblate (Italian)
Currently translated at 56.2% (86 of 153 strings)

Co-authored-by: Enrico Gambini <enrico1036@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/it/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
badf53427c Translated using Weblate (Catalan)
Currently translated at 60.1% (92 of 153 strings)

Added translation using Weblate (Catalan)

Co-authored-by: Gerard Rubio <gerard.rubio+weblate@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/ca/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-28 19:23:58 -07:00
Hosted Weblate
a4f435f662 Translated using Weblate (Polish)
Currently translated at 85.6% (131 of 153 strings)

Co-authored-by: Łukasz Marek <lukasz.marek1986@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-20 11:43:44 -07:00
Hosted Weblate
2ab247243d Translated using Weblate (French)
Currently translated at 67.9% (104 of 153 strings)

Translated using Weblate (French)

Currently translated at 67.9% (104 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Loïc R <loicdu81@gmail.com>
Co-authored-by: Maxime Bailleul <mexx.bailleul@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-19 10:40:05 -07:00
Hosted Weblate
e86744c6a3 Translated using Weblate (Dutch)
Currently translated at 68.6% (105 of 153 strings)

Co-authored-by: Bas Rutjes <bas@rutjes.online>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-19 10:40:05 -07:00
Hosted Weblate
be440b9641 Translated using Weblate (Polish)
Currently translated at 76.4% (117 of 153 strings)

Translated using Weblate (Polish)

Currently translated at 69.2% (106 of 153 strings)

Translated using Weblate (Polish)

Currently translated at 65.3% (100 of 153 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Łukasz Marek <lukasz.marek1986@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-19 10:40:05 -07:00
allcontributors[bot]
a10f7e2550
docs: add Mexx62 as a contributor for translation (#765)
* 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>
2023-08-18 23:43:27 -07:00
allcontributors[bot]
d6d7c4aee9
docs: add michelbalzer as a contributor for translation (#764)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-18 11:34:22 -07:00
allcontributors[bot]
3042ac85ef
docs: add lukerix as a contributor for translation (#763)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-18 11:31:53 -07:00
Hosted Weblate
c53816224c Translated using Weblate (French)
Currently translated at 54.9% (84 of 153 strings)

Co-authored-by: Maxime Bailleul <mexx.bailleul@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-18 11:22:51 -07:00
Hosted Weblate
65b82b605e Translated using Weblate (Polish)
Currently translated at 64.0% (98 of 153 strings)

Co-authored-by: Łukasz Marek <lukasz.marek1986@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/pl/
Translation: Adaptive Lighting/Adaptive Lighting
2023-08-18 11:22:51 -07:00
Weblate (bot)
857ac10856
Translations update from Hosted Weblate (#761)
* Translated using Weblate (Dutch)

Currently translated at 57.5% (88 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

* Translated using Weblate (Dutch)

Currently translated at 58.1% (89 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

* Translated using Weblate (Dutch)

Currently translated at 62.0% (95 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-08-17 19:45:24 -07:00
Weblate (bot)
239aae8ed7
Translated using Weblate (Dutch) (#760)
* Translated using Weblate (Dutch)

Currently translated at 57.5% (88 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

* Translated using Weblate (Dutch)

Currently translated at 58.1% (89 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-08-17 14:43:44 -07:00
Weblate (bot)
3757a66829
Translated using Weblate (German) (#758)
Currently translated at 55.5% (85 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/de/

Co-authored-by: Michel Balzer <hallo@michelbalzer.de>
2023-08-16 21:04:59 -07:00
Bas Nijholt
2211aa07b5
Revert "Translations update from Hosted Weblate (de, nl, fr) (#755)" (#757)
This reverts commit 627c7a120c.
2023-08-15 23:16:17 -07:00
Weblate (bot)
627c7a120c
Translations update from Hosted Weblate (de, nl, fr) (#755)
* Translated using Weblate (German)

Currently translated at 0.0% (0 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/de/

* Translated using Weblate (French)

Currently translated at 0.0% (0 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/fr/

* Translated using Weblate (Dutch)

Currently translated at 56.8% (87 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-08-15 20:02:47 -07:00
Weblate (bot)
93cfda427a
Translations update from Hosted Weblate (#754)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/

* Translated using Weblate (Dutch)

Currently translated at 24.1% (37 of 153 strings)

Translation: Adaptive Lighting/Adaptive Lighting
Translate-URL: https://hosted.weblate.org/projects/adaptive-lighting/adaptive-lighting/nl/

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-08-15 19:09:55 -07:00
Bas Nijholt
7e84ed0a84
Use WebLate for translations (#753)
* Add license

* lunk

* chore(docs): update TOC

* fix

---------

Co-authored-by: basnijholt <basnijholt@users.noreply.github.com>
2023-08-15 17:09:18 -07:00
Bas Nijholt
792bed8cf6 Bump to 1.19.1 in manifest.json 2023-08-15 15:25:29 -07:00
pre-commit-ci[bot]
7a7baafcb3
[pre-commit.ci] pre-commit autoupdate (#748)
* [pre-commit.ci] pre-commit autoupdate

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

* Ruff fixes

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-08-15 15:25:19 -07:00
Bas Nijholt
0e23e906da
Fix #745, first time YAML setup (#752)
* Check whether this is the first time setup

* Keep list

* simplify

* no UI tracking
2023-08-15 14:47:43 -07:00
Bas Nijholt
e9b7988868
Fix skipped path in multi light intercept (#751)
* Fix skipped path in multi light intercept

* Deepcopy to make sure that _service_interceptor_turn_on_single_light_handler doesn't moddify

* fix
2023-08-15 12:52:39 -07:00
Bas Nijholt
68feb3d931
Make instantaneous light.turn_on adaptation configurable with intercept (#750)
* Make intercept configurable

* Update README.md, strings.json, and services.yaml

* import

* skip

* split

* do not pass config_entry

* add to conf

* Update README.md, strings.json, and services.yaml

* spacing

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-15 12:23:56 -07:00
allcontributors[bot]
f540057093
docs: add KTibow as a contributor for design (#747)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-08-14 13:49:15 -07:00
Kendell R
f881b4b32d
Use new logo (#746) 2023-08-14 13:41:34 -07:00
Bas Nijholt
0723280a89
Fix sleep_mode + sleep_rgb_or_color_temp == "color_temp" in webapp (#740)
Thanks to @danielbrunt57 for reporting here
2023-08-11 00:00:16 +00:00
Bas Nijholt
9112bb9f73
Bump to 1.19.0 in manifest.json (#734) 2023-08-09 19:06:48 -07:00
Bas Nijholt
5b7ee44629
Fix length of descriptions in UI (config flow) (#732)
* Fix length of strings in UI

* Update README.md, strings.json, and services.yaml

* fix

* add desc

* Update README.md, strings.json, and services.yaml

* mention webapp

* Add desc

* link

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-10 00:17:25 +00:00
Bas Nijholt
487756b345 Add full changelog to releases 2023-08-09 15:01:00 -07:00
Bas Nijholt
750acc9784 Add release-drafter config 2023-08-09 14:57:34 -07:00
Bas Nijholt
0d387d4bcd
Add release-drafter GitHub Action (#731) 2023-08-09 14:56:08 -07:00
Bas Nijholt
435b2ce5d0
Fix adapt_only_on_bare_turn_on and apply does not result in manual_control (#729)
* Fix adapt_only_on_bare_turn_on and apply does not result in manual_control

Closes #723

* fix style
2023-08-09 21:48:18 +00:00
Bas Nijholt
da5147a583
Bump to 1.19.0b5 in manifest.json (#728) 2023-08-09 13:56:00 -07:00
Bas Nijholt
597e050ab2
Prevent light.turn_on of light that was just turned off (#727)
Closes #726
2023-08-09 13:54:18 -07:00
Bas Nijholt
b06d38eb24 Add mp4 link in README 2023-08-08 18:03:17 -07:00
Bas Nijholt
db5f9d623c
Mention app more prominently and improve style (#725)
* Mention app more prominently

* Use dark-mode

* add setuptools

* no cyber

* no not run on PR

* Ruff fixes

* Add link

* remove unused deps
2023-08-08 17:34:35 -07:00
Bas Nijholt
f8e7880a96
Split up SunLightSettings and improve https://basnijholt.github.io/adaptive-lighting/ (#719)
* Split up SunLightSettings

* Renames

* factor out SunEvents

* more renames

* rewrite

* rewrite more

* simpler

* refactor

* refact

* raise

* refact

* rename

* move method

* clean

* Move to new module 'sun.py'

* make sun independent of HA

* rename

* Move to webapp/homeassistant_util_color.py

* Rework app

* Add link

* new plotting

* app changes

* fix tests

* test clean

* tz fixes

* fix

* use sed

* verbose

* fix tz

* fix

* tiem
2023-08-08 21:31:17 +00:00
pre-commit-ci[bot]
61d51cbf1e
[pre-commit.ci] pre-commit autoupdate (#722)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.0.281 → v0.0.282](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.281...v0.0.282)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-08-07 22:20:28 -07:00
Bas Nijholt
00ec76a467
Bump to 1.19.0b4 in manifest.json (#718) 2023-08-06 19:21:39 -07:00
Bas Nijholt
ef1546b6b9
Fix min_sunrise_time and max_sunset_time (#717)
Closes #714
2023-08-07 02:21:16 +00:00
Bas Nijholt
69355b8c3a
Small WebApp improvements (#716)
* Small WebApp improvements

* Add link
2023-08-07 00:20:58 +00:00
Bas Nijholt
943a6360c7
Add simple webapp to play with different parameters (#715)
* Add simple webapp to play with different parameters

* ignore
2023-08-06 16:42:56 -07:00
Bas Nijholt
104664d358
Bump to 1.19.0b3 in manifest.json (#713) 2023-08-06 11:21:54 -07:00
Bas Nijholt
cb9ae39ee4
Fix adaptive_lighting.change_switch_settings service (#712)
* Fix adaptive_lighting.change_switch_settings service

Closes #623

* filter defaults

* fix mutable

* Revert debugging logs
2023-08-06 11:15:14 -07:00
Bas Nijholt
d2c6811e63
Bump to 1.19.0b2 in manifest.json (#710) 2023-08-05 23:06:27 -07:00
Benjamin Auquite
fec50ad526
Adapt lights simultaneously instead of one by one (#529)
* Update switch.py

* Update test_switch.py

* Revert "Update test_switch.py"

This reverts commit 87ea5243b9.

* remove unnecessary create_task

* remove unneeded len()

* Revert "remove unnecessary create_task"

This reverts commit 2c5da6d739.

* use `hass.async_create_task`

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-08-05 21:19:18 -07:00
Bas Nijholt
d44cb66148
Add adapt_only_on_bare_turn_on which instantly triggers manual_control when turning on with brightness or color (#709) 2023-08-05 20:56:32 -07:00
Bas Nijholt
3f17738bd1
Add warning about Zigbee groups (#708) 2023-08-05 16:48:35 -07:00
Bas Nijholt
72419cb60f
Add a min_sunrise_time and max_sunset_time (#707) 2023-08-05 22:08:45 +00:00
Bas Nijholt
11a4489cb5
Bump to 1.19.0b1 manifest.json (#706) 2023-08-05 14:42:40 -07:00
Bas Nijholt
51a18f2afb
Allow adaptive_lighting.apply to turn on lights and do not issue log message (#705) 2023-08-05 20:59:58 +00:00
Bas Nijholt
e3a84ffd96
Logging fixes in significant_changes (#704) 2023-08-05 13:52:54 -07:00
Bas Nijholt
a1cec19351
feat: add different brightness ramping mechanisms (#699)
* feat: add different brightness ramping mechanisms

* Rephrase

* Fix curves

* update images

* link to other graphs

* update images
2023-08-05 20:14:21 +00:00
Bas Nijholt
9a7cff9d6a
feat: change the order of options in config flow (#700)
* Change the order of options in config flow

* Update README.md, strings.json, and services.yaml

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-04 21:45:12 +00:00
Bas Nijholt
1ef7ed507e
Implement call intercept for multiple lights (#679)
* Implement call intercept for multiple lights

* remove comment

* skip if no eids

* add comment

* fix type

* Fix skipped

* indentation

* Add logging and fix error

* Fix for HA ≤2023.04

* simplify

* remove unused ignores

* Debug mode

* Add test

* Make test failing

* rename switch

* rename lights

* Fix tests

* Rename lights in tests

* Remove unused dependencies

* Improve tests

* More tests

* Remove the DEBUG_MODE

* Add doc-string

* Extra test

* assert

* extra test

* Comments

* fix

* fix

* expand light groups

* more logging

* sort

* Revert is_proactively_adapting checks
This reverts commit 39fd8f2be0.

* simplify the mapping

* Revert "Revert is_proactively_adapting checks"

This reverts commit 18803e8e50.

* test

* no light groups

* do not expand

* Do not expand_light_groups in intercept

* more logging

* Fix

* add comment

* Add multi_light_intercept config option

* Update README.md, strings.json, and services.yaml

* add light group

* fix platform

* add simple test

* turn off again

* Test without take over control

* improve test and fix it in one way

* Fixes

* add cleanup fixture

* format

* Update test_switch.py

* add __str__

* remove unneeded call

* simplify service_data construction

* Generalize is_our_context

* Fix multi_light_intercept: false

* add comments

* add docs

* Update README.md, strings.json, and services.yaml

* Add feature line

* move function

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-03 17:47:09 -07:00
Bas Nijholt
4251ccacc5
Bump to 1.18.3 in manifest.json (#698) 2023-08-04 00:46:19 +00:00
Bas Nijholt
b80b253fa1
Warning when calling light.turn_on with brightness=0 (#678)
* Do not update the call when calling light.turn_on with brightness=0

* Simplify

* issue warning instead
2023-08-02 23:12:13 -07:00
Bas Nijholt
e0e04da0f6
Before scheduling turn_on do a last-minute check if lights are off (#671)
* Before scheduling turn_on do a last-minute check if lights are off

* Pass force

* add comment

* fix for proactive

* commetn

* No default for force

* rm newline

* no force

* Return bool
2023-08-02 23:11:45 -07:00
Bas Nijholt
53ed220fa0
Bail adapting if on event equals off event context (#696)
* Bail adapting if on event equals off event context
Should prevent this (I saw in my logs)
```
2023-08-02 21:49:56.516 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'light.turn_off('['light.philips_go', 'light.bed_led', 'light.bamboo']', transition=10.0)' event with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:49:56.637 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'on' → 'off' event for 'light.bamboo' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:49:56.672 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'on' → 'off' event for 'light.bed_led' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:49:56.747 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'on' → 'off' event for 'light.philips_go' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.501 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected a 'light.philips_go' 'state_changed' event: '{'min_color_temp_kelvin': 2000, 'max_color_temp_kelvin': 6666, 'min_mireds': 150, 'max_mireds': 500, 'effect_list': ['blink', 'breathe', 'okay', 'channel_change', 'candle', 'fireplace', 'colorloop', 'finish_effect', 'stop_effect', 'stop_hue_effect'], 'supported_color_modes': ['color_temp', 'xy'], 'color_mode': <ColorMode.XY: 'xy'>, 'brightness': 10, 'hs_color': (0.0, 100.0), 'rgb_color': (255, 0, 0), 'xy_color': (0.701, 0.299), 'friendly_name': 'Philips Go', 'supported_features': <LightEntityFeature.EFFECT|FLASH|TRANSITION: 44>}' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.502 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'off' → 'on' event for 'light.philips_go' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.502 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] is_proactively_adapting_context='False', context_id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.502 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] just_turned_off: Waiting with adjusting 'light.philips_go' for 6.240101
2023-08-02 21:50:00.528 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected a 'light.bed_led' 'state_changed' event: '{'min_color_temp_kelvin': 2000, 'max_color_temp_kelvin': 6535, 'min_mireds': 153, 'max_mireds': 500, 'effect_list': ['blink', 'breathe', 'okay', 'channel_change', 'candle', 'fireplace', 'colorloop', 'finish_effect', 'stop_effect', 'stop_hue_effect'], 'supported_color_modes': ['color_temp', 'xy'], 'color_mode': <ColorMode.XY: 'xy'>, 'brightness': 10, 'hs_color': (10.824, 100.0), 'rgb_color': (255, 46, 0), 'xy_color': (0.689, 0.309), 'friendly_name': 'Bed LED', 'supported_features': <LightEntityFeature.EFFECT|FLASH|TRANSITION: 44>}' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.529 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'off' → 'on' event for 'light.bed_led' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.529 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] is_proactively_adapting_context='False', context_id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.529 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] just_turned_off: Waiting with adjusting 'light.bed_led' for 6.129017
2023-08-02 21:50:00.561 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected a 'light.bamboo' 'state_changed' event: '{'min_color_temp_kelvin': 2000, 'max_color_temp_kelvin': 6535, 'min_mireds': 153, 'max_mireds': 500, 'effect_list': ['blink', 'breathe', 'okay', 'channel_change', 'candle', 'fireplace', 'colorloop', 'finish_effect', 'stop_effect', 'stop_hue_effect'], 'supported_color_modes': ['color_temp', 'xy'], 'color_mode': <ColorMode.XY: 'xy'>, 'brightness': 10, 'hs_color': (299.434, 83.137), 'rgb_color': (253, 43, 255), 'xy_color': (0.382, 0.159), 'friendly_name': 'Bamboo', 'supported_features': <LightEntityFeature.EFFECT|FLASH|TRANSITION: 44>}' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.562 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] Detected an 'off' → 'on' event for 'light.bamboo' with context.id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.562 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] is_proactively_adapting_context='False', context_id='01H6WVP8RJF4JZ78SFD98YA0RG'
2023-08-02 21:50:00.562 DEBUG (MainThread) [custom_components.adaptive_lighting.switch] just_turned_off: Waiting with adjusting 'light.bamboo' for 6.072956
```

* log instead
2023-08-02 22:59:01 -07:00
Bas Nijholt
807f7109d4
Require take_over_control for to ignore non-turn_on state off -> on event (#695) 2023-08-03 00:59:44 +00:00
badboybeyer
8d13f13873
bug: fix bug in comment in readme (#693) 2023-08-02 08:09:34 -07:00
Bas Nijholt
e513393653
Keep on and off state tracking in Manager and listen to toggle (#689)
* Keep on and off state tracking in Manager

* Move manual_control code

* add todo

* check is_on

* Track toggle

* handle toggle

* fix debug

* test

* add comment

* better log

* Fix comment

* log

* test

* get

* check

* cancel early

* rephrase

* add assert

* Remove check
2023-07-31 18:40:32 -07:00
pre-commit-ci[bot]
da2e27d738
[pre-commit.ci] pre-commit autoupdate (#691)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.0.280 → v0.0.281](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.280...v0.0.281)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-07-31 18:15:36 -07:00
Bas Nijholt
aa9f69a7bb
Set last_service_data in the right place (#652)
* Set last_service_data in the right place

* Do not get but access key

* rename
2023-07-31 17:52:53 -07:00
Bas Nijholt
d588a5984a
Refactor _update_attrs_and_maybe_adapt_lights (#688)
* Do not call self.manager.significant_change when not needed

* refact

* fix

* fix

* Add more logging to tests

* remove
2023-07-31 04:57:30 +00:00
Bas Nijholt
1842ac9bd5
Do not assert but issue a warning (#687)
* Do not assert but issue a warning

* bump to 1.18.2
2023-07-30 13:28:58 -07:00
Bas Nijholt
e98f0dfa55 Bump to 1.18.1 2023-07-30 13:11:30 -07:00
Bas Nijholt
f4d872a540
Make sure that SimpleSwitches are added before AdaptiveSwitch (#686) 2023-07-30 20:01:08 +00:00
Bas Nijholt
2e25af3125
Do not intercept effect and flash calls (#685)
* Do not intercept effect and flash calls

* log

* Do not intercept flash
2023-07-30 19:32:59 +00:00
Bas Nijholt
2b35ee1e5e
Mark as manually controlled when using flash, effect, or RGBW(W) (#684)
* Mark as manually controlled when using flash or effect

* Add comment

* Add RGBW and RGBWW
2023-07-30 18:49:40 +00:00
Bas Nijholt
68985199f6
Rename lights in tests (#681)
* Rename lights in tests

* Remove unused dependencies
2023-07-30 04:48:45 +00:00
Bas Nijholt
8322e516ba
Add link to repo in README 2023-07-28 18:41:41 -07:00
Bas Nijholt
8967747f31
Release 1.18.0 (fixes lights accidentally turning on 🚀🎉) (#676) 2023-07-28 17:25:50 -07:00
Bas Nijholt
f28c031551
Fix alias in FUNDING.yml (#677) 2023-07-28 17:20:01 -07:00
Bas Nijholt
5c897f76da
More typing fixes (#675) 2023-07-29 00:17:26 +00:00
Bas Nijholt
5fa74a838f
Typing fixes (#674)
* Typing fixes

* Ignore tyoe
2023-07-28 16:55:46 -07:00
Bas Nijholt
416f1eb2f1
Rename maybe_cancel_adjusting to just_turned_off (#673) 2023-07-28 22:22:16 +00:00
Bas Nijholt
89c90adde0
Only start adapting on light.turn_on when detect_non_ha_changes: false to prevent unwanted light turn ons (#663)
* Fixes in maybe_cancel_adjusting to possibly fix accidental turn on

* simplify logic in maybe_cancel_adjusting

* Add logging statements

* only control if turn_on called

* more logs

* add TODO

* Add _state_event_is_from_our_turn_on

* Ignore off->on state switches that are not accociated with light.turn_on

* improve logging

* rename

* Update docs

* Update README.md, strings.json, and services.yaml

* Add caution message to README

* Change order of emojis

* Update README.md, strings.json, and services.yaml

* Check that platform is not None

* log the call

* fix args

* Do not re-add already added configs

* Do not re-add already added configs

* Use async_remove

* remove unused code

* [pre-commit.ci] pre-commit autoupdate (#627)

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.0.279 → v0.0.280](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.279...v0.0.280)
- [github.com/psf/black: 23.3.0 → 23.7.0](https://github.com/psf/black/compare/23.3.0...23.7.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>

* Extra logging statement

* Add to README

* log context_id

* return right indent

* move comment

* Skip on self.manager.is_proactively_adapting

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-07-28 15:17:17 -07:00
Bas Nijholt
f23aeb269b Bump to 1.17.5 2023-07-27 18:09:37 -07:00
Bas Nijholt
9d6f93538f
Do not create multiple AdaptiveLightingManager instances (#672)
I didn't realize that setdefault always executes the default.
2023-07-28 01:01:06 +00:00
Bas Nijholt
f699486fd0
Only cancel ongoing adaptation calls if still running (#668) 2023-07-27 17:34:56 -07:00
pre-commit-ci[bot]
a6e987438d
[pre-commit.ci] pre-commit autoupdate (#627)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.0.279 → v0.0.280](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.279...v0.0.280)
- [github.com/psf/black: 23.3.0 → 23.7.0](https://github.com/psf/black/compare/23.3.0...23.7.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-07-27 17:22:12 +00:00
Bas Nijholt
9e15d1bd22
Update to 1.17.4 in manifest.json (#670) 2023-07-27 16:51:59 +00:00
Bas Nijholt
c64d9cefbe
Delete AdaptiveLighting instances that have been removed from YAML (#669)
* Do not re-add already added configs

* Use async_remove
2023-07-26 23:40:54 -07:00
Bas Nijholt
1cda675bbe
Add @bind_hass to functions (#667) 2023-07-26 15:01:29 -07:00
Bas Nijholt
e9297d562f
Cleanup after add_to_platform_abort is called, try-except intercept, update strings.json, fixes #658 (#659)
* Cleanup after add_to_platform_abort is called, fixes #658

* Add note

* try-catch because of priv

* Catch all exceptions

* Bump to 1.17.3 in manifest.json

* assert that hass is not None

* Rename _light_event_action -> _light_state_event_action

* update .github/update-strings.py

* Update README.md, strings.json, and services.yaml

* update name

* Fixes

* Update README.md, strings.json, and services.yaml

* Add name

* Do not add name

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-26 12:52:03 -07:00
Bas Nijholt
8696092879
Avoid adapting lights with nothing in service_data, closes #661 (#662) 2023-07-26 02:17:11 +00:00
Bas Nijholt
f9b6753e6d
Ensure that interpolation is in [0, 1], fixes #624 (#660)
* Ensure that interpolation is in [0, 1], fixes #624

* Bump to 1.17.1

* Add assert

* Interpolate via HSV space

* Add test
2023-07-25 10:46:34 -07:00
Bas Nijholt
7650a1b3e6
Bump to 1.17.0 in manifest.json (#657) 2023-07-23 21:44:17 +00:00
Bas Nijholt
bb84684bce
Style with ruff and logging (#643)
* Formatting with ruff

* more logging

* Require on_only

* Different implementation

* More ruff

* Remove new logging statements

* Remove 'pylint: disable=protected'

* style

* fixes

* ruff

* Switch to ruff

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

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

* Fix .github

* Fix

* Add ignores

* fix arg

* fix B905

* Fix D

* Fix more

* Fix more

* order

* use path

* moer path

* Remove unused ignores

* fix tes deps

* fix typo

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-07-23 14:24:22 -07:00
Bas Nijholt
97f388608a
With transition_until_sleep and sleep_rgb, after sunset, use RGB colors (#656)
* With transition_until_sleep and sleep_rgb, after sunset, use RGB colors

Closes #624

* Add comment

* Add test
2023-07-23 13:40:03 -07:00
Bas Nijholt
c1528ec10a
Refactor, simplify code, rename, and set minimal HA core ≥2022.11 (#655)
* Rename TurnOnOffListener to AdaptiveLightingManager

* Bump Python version

* Refactor and unify methods that are called once

* Simplify adaptation_utils.py

* Improve readability in adaptation_utils.py

* More renames

* Simplify

* More renames and simplifications

* fix test

* simplify _supported_features

* rename

* walrus

* drop old astral support

* Only support HA  ≥2021.06

* Require 2016.06

* Try 2023.1

* even more old versions

* test

* more versions

* verify that only ≥2022.11 works

* named args

* setdefault

* no astral v1

* var

* simplify

* no need to pass adapt_brightness and adapt_color

* Add comment
2023-07-22 21:19:01 -07:00
Bas Nijholt
69592938db
Rename TurnOnOffListener to AdaptiveLightingManager (#654)
* Rename TurnOnOffListener to AdaptiveLightingManager

* Bump Python version
2023-07-22 17:57:49 -07:00
Bas Nijholt
fee90250ee
Better logging and prevent KeyError in state_changed_event_listener (#650)
* Better logging

* Remove useless and erroneous logging statement

* Bump to 1.16.3
2023-07-22 12:34:20 -07:00
Bas Nijholt
db40b9af6b
Only build Docker image on main (#648) 2023-07-21 18:08:43 -07:00
Bas Nijholt
52c7e4b1d5
Bump to v1.16.2 in manifest.json (#647) 2023-07-21 14:56:44 -07:00
Mario Guggenberger
30a310c514
fix: overlapping adaptations (#646)
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-07-21 14:54:38 -07:00
Bas Nijholt
49857632cc
Fix multiple switches controlling one light (reactive path) (#644)
* Fix multiple switches controlling one light

* WIP

* Keep length in AdaptationData

* Do not proceed if there is nothing to do

* Simplify

* Set tasks correctly

* log more

* WIP

* realize that intercept and double switch not possible

* Remove which from find_switch_for_lights

* Rephrase

* Check which one to cancel

* length -> max_length

* Implement test_two_switches_for_single_light

* Clean up

* Simplify is_color_brightness_or_both

* Improve test

* no wait

* logging

* just block

* make test such that it fails on main
2023-07-21 14:46:18 -07:00
Bas Nijholt
2575f4ec30
Only adapt if switch if on in _service_interceptor_turn_on_handler (#642)
* Do not adapt if switch is off in _service_interceptor_turn_on_handler

* Bump to 1.16.1
2023-07-20 17:12:41 -07:00
Bas Nijholt
6c001b4132
Update version to 1.16.0 in manifest.json (#640) 2023-07-20 14:42:36 -07:00
Bas Nijholt
19d503b4d7
Revert supported_features from #565 and #575, fixes #601 (#637) 2023-07-20 13:59:19 -07:00
Bas Nijholt
fd5f6bf310
Pass on lights that are not managed by AL, closes #638 (#639)
* Pass on lights that are not managed by AL, closes #638

* Rename exception
2023-07-20 11:53:38 -07:00
Bas Nijholt
1b31b26938
Add @protyposis to codeowners (#636) 2023-07-20 08:53:11 -07:00
Bas Nijholt
1133f0defa
Find adaptive_switch in TurnOnOffListener (#635)
* Find adaptive_switch in TurnOnOffListener

* remove unused argument

* Bump to 1.15.1
2023-07-20 08:52:14 -07:00
Mario Guggenberger
1cedb3fbc7
chore: bump manifest version to 1.15.0 (#634) 2023-07-19 18:53:42 +02:00
Mario Guggenberger
ed80bd7829
feat: service call adaptation (#628)
* feat: service call adaptation

* feat: toggle-on service call adaptation

* feat: prefer service call transition
2023-07-19 09:10:21 +02:00
pre-commit-ci[bot]
d16a9a5751
[pre-commit.ci] pre-commit autoupdate (#620)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/asottile/pyupgrade: v3.6.0 → v3.7.0](https://github.com/asottile/pyupgrade/compare/v3.6.0...v3.7.0)

* Update README.md, strings.json, and services.yaml

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-02 15:32:44 -07:00
Mario Guggenberger
72e140e293
feat: skip redundant adaptation commands (#615)
* feat: skip redundant adaptation commands

* update README

* style

* Remove "experimental"

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-07-02 15:26:07 -07:00
Mario Guggenberger
36c656b795
docs: Ikea light config recommendations (#614) 2023-06-14 09:39:47 -07:00
pre-commit-ci[bot]
42edd5eb8f
[pre-commit.ci] pre-commit autoupdate (#587)
updates:
- [github.com/asottile/pyupgrade: v3.3.2 → v3.6.0](https://github.com/asottile/pyupgrade/compare/v3.3.2...v3.6.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-06-12 17:43:18 -07:00
Bas Nijholt
68d500bd12
Update manifest.json (#613) 2023-06-12 16:13:29 -07:00
Mario Guggenberger
6283158ff7
VS Code Dev Container (dev & test environment) (#605)
* build: dev container

Add a VS Code Dev Container from the blueprint at bceaae212f

* build: dev container test setup

Add support for unit testing in the dev container environment with debugging and code coverage.

* ci: adjust to dev container test restructuring

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

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

* ci: fix coverage collection

* build: add dummy light to HA config

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

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

* build: update dev container to Python 3.11 (for HA 2023.6)

* Add VS Code tasks

* Use pre-commit hooks for linting

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

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

* Unpin HA version

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-06-11 15:33:07 -07:00
Mario Guggenberger
12dae4b6a6
fix: 2023.6 compatibility (#607)
* fix: 2023.6.0 compatibility

* ci: test with Python 3.11 against 2023.6.0b4

* Set 2023.06.0

* Bump to 2023.06.1

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-06-11 14:12:37 -07:00
Bas Nijholt
90b8d6089d
Bump to 1.13.0 in manifest.json (#610) 2023-06-08 16:09:57 -07:00
Mario Guggenberger
2c8a45604a
feat: brightness prioritization (#598)
* feat: optional brightness prioritization

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

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

* Remove config flag and change default split order

* Fix test

* Fix edge case

* Add tests

* Backwards compatiblity

* Fix another edge case

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-06-08 16:01:19 -07:00
Bas Nijholt
4683f083f6
Update version to 1.12.0 in manifest.json (#596) 2023-05-22 12:16:40 -07:00
allcontributors[bot]
bf3b709ba6
docs: add protyposis as a contributor for code (#597) 2023-05-21 13:35:45 -07:00
Mario Guggenberger
2033fcebe9
fix: lights unexpectedly turn back on after switch-off (#590) 2023-05-21 10:36:16 -07:00
Bas Nijholt
29e54185e3
Add "See also" to README (#591)
* Add "See also" section

* Add date

* chore(docs): update TOC

* Add YouTube videos

* Add components.cloud

* verbose loggin

---------

Co-authored-by: basnijholt <basnijholt@users.noreply.github.com>
2023-05-12 11:36:24 -07:00
pre-commit-ci[bot]
9caf645093
[pre-commit.ci] pre-commit autoupdate (#584)
updates:
- [github.com/asottile/pyupgrade: v3.3.1 → v3.3.2](https://github.com/asottile/pyupgrade/compare/v3.3.1...v3.3.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-05-01 16:56:03 -07:00
Benjamin Auquite
47c5ea93e0
Add test_supported_features and fix the problem introduced in #565 (#575)
* Update test_switch.py

* Update test_switch.py

* test is now done.

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

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

* fix the test only.

test is backwards compatible with the old method.

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

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

* fix _supported_to_attributes

everything works now.

* pre-commit fixes

cannot fix the `function too complex` problem.

* ignore test_switch.py in `pre-commit-config.yaml`

* Add ignore C901 to test_supported_features

* remove commented out code

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-27 12:56:49 -07:00
Benjamin Auquite
adf0d0cf30
Auto reload YAML config changes (#573)
* Update __init__.py

* Update __init__.py

* skip installing codecov

* remove in CI

* test 2023.4.6

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-26 19:10:52 -07:00
Benjamin Auquite
a888afd6dc
Refactor _supported_features (#565)
* initial commit

* change features to dict

* another slight refactor
2023-04-10 10:07:31 -07:00
Benjamin Auquite
e30b7debe5
Refactor _adapt_lights into _update_manual_control_and_maybe_adapt (#513)
* Add auto_reset_manual_control with async timer

* cherry-pick wait for transition stuff

* Update switch.py

* merge wait_for_transition

* Update switch.py

* not renamed in this branch yet.

* Update switch.py

* update tests

* Update switch.py

* Update switch.py

* merge related fix

* cleanup

* Revert "cleanup"

This reverts commit 3aa2f3242b.

* 0.1 sometimes fails the test

* not in this pr yet

* Update switch.py

* Update switch.py

* Update switch.py

* Update switch.py

* Update README.md, strings.json, and services.yaml

* slight refactor

* Update switch.py

* Update switch.py

* Possible refactor of _update_attrs_and_maybe_adapt_lights

* cleaned up

* Revert "cleaned up"

This reverts commit 441cb1ff5c.

* Possible refactor of _update_attrs_and_maybe_adapt_lights (#537)

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>

* Revert "Revert "cleaned up""

This reverts commit 11b268148b.

* remove bad merge conflict

* revert permissions

* Bump to 1.11.0

* Undo unrelated test changes

* 'else' instead of 'continue'

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-04-08 18:54:06 -07:00
Bas Nijholt
fe7bdd3940
Add auto_reset_time_remaining attribute (#558)
* Add auto_reset_time_remaining attribute

* fix attr

* Add test
2023-04-08 05:39:08 -05:00
Bas Nijholt
39e9d0e74f
Update issue templates (#557) 2023-04-07 19:40:36 -05:00
Bas Nijholt
c0c363136b
Test multiple Home Assistant releases and the dev branch (#552)
* Test for multiple Home Assistant versions

* Install ulid-transform

* remove unnecessary unsafe `async_set` from test

* Skip test_state_change_handlers in <2023.4

* Revert "Skip test_state_change_handlers in <2023.4"

This reverts commit 8d01b6ec4e.

---------

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
2023-04-06 16:36:57 -07:00
Benjamin Auquite
a01fec0211
Bump to 1.10.1 (#551)
* Update manifest.json

* undo merge mistake

* Version 1.10.1
2023-04-06 13:29:32 -07:00
Bas Nijholt
59877a0343
Make sure context_id is 26 chars and partially conform to ULID standard (#550) 2023-04-06 12:37:02 -07:00
Benjamin Auquite
cb967aeeb7
Create intentionally over-redundant state_change tests and fix #541 (#544)
* add transition_timer test and debug

* syntax error

* test

* Update switch.py

* Revert "test"

This reverts commit b8009e0a1a.

* Update test_switch.py

* add `create_transition_events` to tests.

nearly done

* tests are done!

* pop is for dictionaries

* Update test_switch.py

* combine the tests

* pin markdown-code-runner

* Pin with '=='

* Update test_switch.py

* pin in the correct place 😅

* Update test_switch.py

* Use timer.is_running

* Update test_switch.py

* ensure timer is running in tests

* this passes the test

* Update test_switch.py

* Do not create new list when not needed

* Remove empty deps

* Remove CONF_ULID_MAX_LENGTH (which is not configurable)

* this shouldn't pass the test but it does.

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-06 13:53:23 -05:00
Benjamin Auquite
03a2d9cbf6
Fix RGB Color Temp Swaps (#514)
* cherry pick from 486

* Refactor `_add_missing_attributes`

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-05 18:39:31 -05:00
Benjamin Auquite
f5abf034c4
Fix the docker tests instructions (#543)
* Tested on multiple hardware

Turns out windows 10 and 11 can't use `$(pwd):/app` OR `%cd%:/app` in PowerShell (which replaced cmd prompt), so I looked up the docs and made the necessary changes (again, sorry!)

These changes have been tested on all terminal environments except macOS (the docs say it'll work there)

* allow use of --exitfirst for faster debug

* Remove install in actions

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-05 09:13:57 -07:00
Benjamin Auquite
4fcf238360
Update README.md on transition_until_sleep parameter (#539)
* Update README.md

I believe you changed the config option's name after I posted the graph, so I renamed the config option there too.

There was also a deleted user on the contributions list so I went ahead and removed that too.

* chore(docs): update TOC

* Update README.md

---------

Co-authored-by: th3w1zard1 <th3w1zard1@users.noreply.github.com>
2023-04-04 20:52:54 -07:00
allcontributors[bot]
744e43f4bf
docs: add th3w1zard1 as a contributor for maintenance (#538)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-04-04 08:54:54 -07:00
Benjamin Auquite
e4d06476fd
Add windows command for Docker test instructions (#536)
* ( Tiny Change ) Add windows command for dockertest

You said it earlier but the correct command for running the Docker image on windows is:
```bash
docker run -v %cd%:/app basnijholt/adaptive-lighting:latest
```

* Update README.md

---------

Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-04-03 23:47:08 -07:00
allcontributors[bot]
be0735002c
docs: add th3w1zard1 as a contributor for bug (#534)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-04-03 21:59:14 -07:00
pre-commit-ci[bot]
981287edb9
[pre-commit.ci] pre-commit autoupdate (#531)
updates:
- [github.com/psf/black: 23.1.0 → 23.3.0](https://github.com/psf/black/compare/23.1.0...23.3.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 17:30:07 -07:00
Benjamin Auquite
c7f44e472f
Correctly wait for transitions (#510)
* Add auto_reset_manual_control with async timer

* cherry-pick wait for transition stuff

* Update switch.py

* not renamed in this branch yet.

* Update switch.py

* update tests

* Update switch.py

* merge related fix

* cleanup

* Revert "cleanup"

This reverts commit 3aa2f3242b.

* Update switch.py

* Update switch.py

* Update switch.py

* Small refactor

* Move test to old position for better diffs

* Revert "Small refactor"

This reverts commit b986b3f77c.

* Update README.md

* fix the test

last_state_change isn't updated quick enough.

* #510 changes (#516)

* Change (WIP)

* Update test_switch.py

* Refactor

* Revert "Revert "Small refactor""

This reverts commit 3731c99936.

* Update README.md

* Fix the test

* Bump to 1.9.0 (#518)

* Basic community fixes PR (#460)

* Fixes #423

#423

* Do not adapt lights turned on with custom payloads.

* Update switch.py

* Issue fixes

#423, #378, #403, #449

* quickly test #274

* Revert feature requests, this branch only has fixes.

Reverted FR 274

* pre-commit fix

* Create automerge.yaml

* test

* Delete automerge.yaml

My bad.

* Fix #460 and #408

* see @basnijholt 's comment in #450.

* @basnijholt requested changes.

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>

* Undo accidental changes introduced in #509, but adds the changes from #460 (#521)

* Release 1.9.1 (#522)

* Bump to 1.9.1

* Add CODEOWNERS

---------

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* No need to wrap the reset

* Remove unused attrs

* Shorter log message

* revert unrelated tests change

* remove unused function

* Use patch

* Bump to 1.10.0

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-04-03 17:04:06 -07:00
Bas Nijholt
b730c7cc90
Add scripts to auto update en.json, strings.json and services.yaml (#520)
* Add scripts to auto update strings.json and services.yaml

* Run services

* simplify

* Run strings

* rerun

* revert

* allow unicode

* Add CODEOWNERS

* Update CODEOWNERS

* set CONF_USE_DEFAULTS docs

* add field_name

* Auto run scripts

* Update desc

* Update README.md, strings.json, and services.yaml

* double quotes

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

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

* Update README.md, strings.json, and services.yaml

* Add newline

* sync changes between en.json and strings.json

* Update README.md, strings.json, and services.yaml

* double quotes

* fix

* Update README.md, strings.json, and services.yaml

* Add comments

* Remove comments

* shorter

* Update README.md, strings.json, and services.yaml

* Rephrase

* Update README.md, strings.json, and services.yaml

* remove key from desc

---------

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 14:59:14 -07:00
Bas Nijholt
26974c8fd5
Simplify if-statement, (small #460 fix) (#526) 2023-04-03 13:32:38 -05:00
Bas Nijholt
d768a1e825
Release 1.9.1 (#522)
* Bump to 1.9.1

* Add CODEOWNERS
2023-04-03 02:07:05 -07:00
Bas Nijholt
0958feb744
Undo accidental changes introduced in #509, but adds the changes from #460 (#521) 2023-04-03 03:47:01 -05:00
Benjamin Auquite
c6a6cd323f
Basic community fixes PR (#460)
* Fixes #423

#423

* Do not adapt lights turned on with custom payloads.

* Update switch.py

* Issue fixes

#423, #378, #403, #449

* quickly test #274

* Revert feature requests, this branch only has fixes.

Reverted FR 274

* pre-commit fix

* Create automerge.yaml

* test

* Delete automerge.yaml

My bad.

* Fix #460 and #408

* see @basnijholt 's comment in #450.

* @basnijholt requested changes.

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
2023-04-03 08:02:06 +00:00
Bas Nijholt
87391e6d24
Bump to 1.9.0 (#518) 2023-04-03 01:01:58 -07:00
Bas Nijholt
19fcb1d6b9
Automatically generate more service tables in the README (#509)
* Automatically sync more data

* Automatically generate apply table

* Generate manual control

* Add manual control docs

* Update README.md

* Move docs functions to separate file

* Update code

* simple

* no path

* link paths

* Fix link

* missed

* cd core

* Update README.md

* Allow alternative docs

* update readme

* More special

* Fx

* Update README.md

* Remove common descriptions

* Update README.md

* Update README.md

* Rephrase

* Update README.md

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-04-03 00:58:39 -07:00
allcontributors[bot]
cdc3585a66
docs: add igiannakas as a contributor for code (#517)
* docs: update README.md

* docs: update .all-contributorsrc

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2023-04-03 07:58:20 +00:00
igiannakas
9caf3048f1
Continue to adapt color temperature down to the sleep temperature after sunset (#87)
* Update switch.py

Continue to adapt color temperature down to the sleep temperature after sunset. Results in a gradually warming light during the night time rather than a fixed color temperature throughout the night time.

* Run pre-commit

* Merge branch 'master' into pr/87

* add config option bool `adapt_until_sleep` defaulting to `false`

---------

Co-authored-by: Bas Nijholt <bas@nijho.lt>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
2023-04-03 07:27:07 +00:00
Benjamin Auquite
c915bda9b9
Autoreset_Control_Time - small changes (#515)
* small changes

* Update README.md

* trivial comment change

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bas Nijholt <basnijholt@gmail.com>
2023-04-03 06:57:12 +00:00
Bas Nijholt
ea2a6b0173
Add auto_reset_manual_control with async timer (#487)
* Add auto_reset_manual_control with async timer

* Add failing test

* Debugging

* Refactor find_switch_for_lights

* Revert changes in is_manually_controlled

* style

* Fix test_manual_control

* add types

* fixes

* dict

* make all tests pass

* text

* Rework find_switch_for_lights

* Style

* Better check

* revert, do in other test!

* No need to log when raising

* Add type hint

* Suggestion https://github.com/basnijholt/adaptive-lighting/pull/488/files#r1152408541 by @th3w1zard1

* Small fixes

* document new config everywhere (#496)

* chore(docs): update TOC

* undo change

* fi

* Update README.md

* Update README.md

* chore(docs): update TOC

* Update README.md

* Use markdown-code-runner

* Remove

* Use markdown-code-runner instead of packaged solution

* fix comment

* Only commit when needed

---------

Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: basnijholt <basnijholt@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-04-03 02:22:23 +00:00
137 changed files with 33263 additions and 2450 deletions

File diff suppressed because it is too large Load diff

40
.devcontainer.json Normal file
View file

@ -0,0 +1,40 @@
{
"name": "basnijholt/adaptive_lighting",
"image": "mcr.microsoft.com/devcontainers/python:3-3.13",
"postCreateCommand": "./scripts/setup-devcontainer && . .venv/bin/activate",
"forwardPorts": [
8123
],
"portsAttributes": {
"8123": {
"label": "Home Assistant",
"onAutoForward": "notify"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"github.vscode-pull-request-github",
"ryanluker.vscode-coverage-gutters",
"ms-python.vscode-pylance"
],
"settings": {
"files.eol": "\n",
"editor.tabSize": 4,
"python.pythonPath": "/usr/bin/python3",
"python.analysis.autoSearchPaths": false,
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"python.formatting.provider": "black",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
"editor.formatOnType": true,
"files.trimTrailingWhitespace": true
}
}
},
"remoteUser": "vscode",
"features": {}
}

28
.dockerignore Normal file
View file

@ -0,0 +1,28 @@
# The Home Assistant core checkout. tests/README.md has you clone it to ./core,
# but the Dockerfile clones its own copy to /core and links /app/core to it.
# Without this entry `COPY . /app/` ships ~300MB into every build and leaves
# /app/core as a real directory, so `ln -s /core /app/core` links *inside* it
# rather than creating the intended symlink.
core/
# Local virtualenvs
.venv/
venv/
env/
ENV/
# Not used by the build
.git/
.vscode/
.idea/
# Caches and test output
__pycache__/
*.py[cod]
.pytest_cache/
.ruff_cache/
.mypy_cache/
htmlcov/
.coverage
.coverage.*
coverage.xml

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
* text=auto eol=lf

1
.github/CODEOWNERS vendored Normal file
View file

@ -0,0 +1 @@
* @basnijholt

2
.github/FUNDING.yml vendored
View file

@ -1 +1 @@
github: [basnijholz, RubenKelevra] github: [basnijholt]

View file

@ -1,17 +1,63 @@
--- ---
name: 'Bug Report' name: Bug Report
about: 'Report a bug in adaptive-lighting.' about: Report a bug in adaptive-lighting.
labels: kind/bug, need/triage title: ''
labels: kind/bug, kind/feature, need/triage
assignees: ''
--- ---
#### Version information: # Home Assistant Adaptive Lighting Issue Template
## Bug Reports
If you need help with using or configuring Adaptive Lighting, please [open a Q&A discussion thread here](https://github.com/basnijholt/adaptive-lighting/discussions/new?category=q-a) instead.
### Before submitting a bug report, please follow these troubleshooting steps:
Please confirm that you have completed the following steps:
- [ ] I have updated to the [latest Adaptive Lighting version](https://github.com/basnijholt/adaptive-lighting/releases) available in [HACS](https://hacs.xyz/).
- [ ] I have reviewed the [Troubleshooting Section](https://github.com/basnijholt/adaptive-lighting#sos-troubleshooting) in the [README](https://github.com/basnijholt/adaptive-lighting#readme).
- [ ] (If using Zigbee2MQTT) I have read the [Zigbee2MQTT troubleshooting guide](https://github.com/basnijholt/adaptive-lighting#zigbee2mqtt) in the [README](https://github.com/basnijholt/adaptive-lighting#readme).
- [ ] I have checked the [V2 Roadmap](https://github.com/basnijholt/adaptive-lighting/discussions/291) and [open issues](https://github.com/basnijholt/adaptive-lighting/issues) to ensure my issue isn't a duplicate.
#### Description: ### Required information for bug reports:
<!-- This is where you get to tell us what went wrong. When doing so, please make sure to include *all* relevant information.
Please try to include: Please include the following information in your issue.
* What you were doing when you experienced the bug.
* Any error messages you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas). *Issues missing this information may not be addressed.*
* When possible, steps to reliably produce the bug.
--> 1. **Debug logs** captured while the issue occurred. [See here for instructions on enabling debug logging](https://github.com/basnijholt/adaptive-lighting#troubleshooting):
```
```
2. [Your Adaptive Lighting configuration](https://github.com/basnijholt/adaptive-lighting#gear-configuration):
```
```
3. (If using Zigbee2MQTT), provide your configuration files (**remove all personal information before posting**):
- `devices.yaml`
- `groups.yaml`
- `configuration.yaml` ⚠️; **Warning** _**REMOVE ALL of the PERSONAL INFORMATION BELOW before posting**_ ⚠️;
- mqtt: `server`:
- mqtt: `user`:
- mqtt: `password`:
- advanced: `pan_id`:
- advanced: `network_key`:
- anything in `log_syslog` if you use this
- Brand and model number of problematic light(s)
```
```
4. Describe the bug and how to reproduce it:
5. Steps to reproduce the behavior:

View file

@ -1,7 +1,10 @@
--- ---
name: 'Documentation Issue' name: Documentation Issue
about: 'Report missing, erroneous docs, broken links or propose new docs' about: Report missing, erroneous docs, broken links or propose new docs
title: ''
labels: kind/docs_issue, need/triage labels: kind/docs_issue, need/triage
assignees: ''
--- ---
#### Location #### Location

View file

@ -1,5 +1,8 @@
--- ---
name: 'Enhancement' name: Enhancement
about: 'Suggest an improvement to an existing feature.' about: Suggest an improvement to an existing feature.
title: ''
labels: kind/enhancement, need/triage labels: kind/enhancement, need/triage
assignees: ''
--- ---

View file

@ -1,5 +1,8 @@
--- ---
name: 'Feature' name: Feature
about: 'Suggest a new feature' about: Suggest a new feature
title: ''
labels: kind/feature, need/triage labels: kind/feature, need/triage
assignees: ''
--- ---

6
.github/release-drafter.yml vendored Normal file
View file

@ -0,0 +1,6 @@
template: |
## Whats Changed
$CHANGES
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION

38
.github/renovate.json vendored Normal file
View file

@ -0,0 +1,38 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"rebaseWhen": "behind-base-branch",
"dependencyDashboard": true,
"labels": [
"dependencies",
"no-stale"
],
"commitMessagePrefix": "⬆️",
"commitMessageTopic": "{{depName}}",
"prBodyDefinitions": {
"Release": "yes"
},
"packageRules": [
{
"matchManagers": [
"github-actions"
],
"addLabels": [
"github_actions"
],
"rangeStrategy": "pin"
},
{
"matchManagers": [
"github-actions"
],
"matchUpdateTypes": [
"minor",
"patch"
],
"automerge": true
}
],
"extends": [
"config:recommended"
]
}

27
.github/update-services.py vendored Normal file
View file

@ -0,0 +1,27 @@
"""Creates a services.yaml file with the latest docs."""
import sys
from pathlib import Path
import yaml
sys.path.append(str(Path(__file__).parent.parent))
from custom_components.adaptive_lighting import const
services_filename = Path("custom_components") / "adaptive_lighting" / "services.yaml"
with open(services_filename) as f: # noqa: PTH123
services = yaml.safe_load(f)
for service_name, dct in services.items():
_docs = {"set_manual_control": const.DOCS_MANUAL_CONTROL, "apply": const.DOCS_APPLY}
alternative_docs = _docs.get(service_name, const.DOCS)
for field_name, field in dct["fields"].items():
description = alternative_docs.get(field_name, const.DOCS[field_name])
field["description"] = description
comment = "# This file is auto-generated by .github/update-services.py."
with services_filename.open("w") as f:
f.write(comment + "\n")
yaml.dump(services, f, sort_keys=False, width=1000, allow_unicode=True)

117
.github/update-strings.py vendored Normal file
View file

@ -0,0 +1,117 @@
"""Update strings.json and en.json from const.py."""
import json
import sys
from copy import deepcopy
from pathlib import Path
import homeassistant.helpers.config_validation as cv
import yaml
sys.path.append(str(Path(__file__).parent.parent))
from custom_components.adaptive_lighting import const
folder = Path("custom_components") / "adaptive_lighting"
strings_fname = folder / "strings.json"
en_fname = folder / "translations" / "en.json"
translation_fnames = (folder / "translations").glob("*.json")
with strings_fname.open() as f:
strings = json.load(f)
def _partition_options(values):
"""Partition option translations into basic and advanced dictionaries."""
basic = {
key: values[key]
for key, _, _ in const.VALIDATION_TUPLES
if key in const.BASIC_OPTIONS and key in values
}
advanced = {
key: values[key]
for key, _, _ in const.VALIDATION_TUPLES
if key not in const.BASIC_OPTIONS and key in values
}
return basic, advanced
def _migrate_translation_options(step):
"""Move translated advanced options under the advanced section."""
sections = step.setdefault("sections", {})
advanced = sections.setdefault("advanced", {})
for key in ("data", "data_description"):
values = {**advanced.get(key, {}), **step.get(key, {})}
step[key], advanced[key] = _partition_options(values)
# Set "options"
data = {}
data_description = {}
for k, _, typ in const.VALIDATION_TUPLES:
desc = const.DOCS[k]
if len(desc) > 40 and typ not in (bool, cv.entity_ids):
data[k] = k
data_description[k] = desc
else:
data[k] = f"{k}: {desc}"
basic_data, advanced_data = _partition_options(data)
basic_descriptions, advanced_descriptions = _partition_options(data_description)
options_step = strings["options"]["step"]["init"]
options_step["data"] = basic_data
options_step["data_description"] = basic_descriptions
options_step["sections"] = {
"advanced": {
"name": "Advanced settings",
"description": "Additional settings for fine-tuning Adaptive Lighting.",
"data": advanced_data,
"data_description": advanced_descriptions,
},
}
# Set "services"
services_filename = Path("custom_components") / "adaptive_lighting" / "services.yaml"
with open(services_filename) as f: # noqa: PTH123
services = yaml.safe_load(f)
services_json = {}
for service_name, dct in services.items():
services_json[service_name] = {
"name": service_name,
"description": dct["description"],
"fields": {},
}
for field_name, field in dct["fields"].items():
services_json[service_name]["fields"][field_name] = {
"description": field["description"],
"name": field_name,
}
strings["services"] = services_json
# Write changes to strings.json
with strings_fname.open("w") as f:
json.dump(strings, f, indent=2, ensure_ascii=False)
f.write("\n")
# Sync changes from strings.json to en.json
with en_fname.open() as f:
en = json.load(f)
en["config"]["step"]["user"] = strings["config"]["step"]["user"]
en["options"]["step"]["init"] = deepcopy(options_step)
en["services"] = services_json
with en_fname.open("w") as f:
json.dump(en, f, indent=2, ensure_ascii=False)
f.write("\n")
# Keep translated labels and descriptions when moving advanced options into a section.
for translation_fname in translation_fnames:
if translation_fname == en_fname:
continue
with translation_fname.open() as f:
translation = json.load(f)
if "options" not in translation:
continue
_migrate_translation_options(translation["options"]["step"]["init"])
with translation_fname.open("w") as f:
json.dump(translation, f, indent=2, ensure_ascii=False)
f.write("\n")

View file

@ -1,33 +1,50 @@
name: docker name: Docker
on: on:
push: push:
branches: branches: [main]
- "master" tags: ['v*']
pull_request: pull_request:
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs: jobs:
docker: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy: strategy:
matrix: matrix:
platform: platform: [linux/amd64, linux/arm64]
- linux/amd64
- linux/arm64
steps: steps:
- name: Set up QEMU - uses: actions/checkout@v7.0.1
uses: docker/setup-qemu-action@v2 - uses: docker/setup-qemu-action@v4.3.0
- name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4.3.0
uses: docker/setup-buildx-action@v2 - uses: docker/login-action@v4.6.0
- name: Login to Docker Hub
uses: docker/login-action@v2
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} registry: ${{ env.REGISTRY }}
password: ${{ secrets.DOCKERHUB_TOKEN }} username: ${{ github.actor }}
- name: Build and push password: ${{ secrets.GITHUB_TOKEN }}
uses: docker/build-push-action@v4 - id: meta
uses: docker/metadata-action@v6.2.0
with: with:
# Only push on the master branch images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
push: ${{ github.ref == 'refs/heads/master' }} tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest,enable={{is_default_branch}}
- uses: docker/build-push-action@v7.3.0
with:
context: .
platforms: ${{ matrix.platform }} platforms: ${{ matrix.platform }}
tags: ${{ secrets.DOCKERHUB_USERNAME }}/adaptive-lighting:latest push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

64
.github/workflows/docs.yml vendored Normal file
View file

@ -0,0 +1,64 @@
name: Documentation
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7.0.1
- name: Set up Python
uses: actions/setup-python@v7.0.0
with:
python-version: '3.14.7'
- name: Install uv
uses: astral-sh/setup-uv@v10.0.1
- name: Install dependencies
run: uv sync --group docs
- name: Build documentation
run: uv run zensical build
- name: Build webapp (simulator)
run: uv run shinylive export webapp webapp-site
- name: Integrate webapp into docs
run: |
# Copy webapp into docs site at /simulator/
mkdir -p site/simulator
cp -r webapp-site/* site/simulator/
echo "Webapp integrated at site/simulator/"
- name: Upload artifact
uses: actions/upload-pages-artifact@v5.0.0
with:
path: ./site
deploy:
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5.0.1

View file

@ -11,5 +11,5 @@ jobs:
validate_hassfest: validate_hassfest:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v3.0.2" - uses: "actions/checkout@v7.0.1"
- uses: home-assistant/actions/hassfest@master - uses: home-assistant/actions/hassfest@master

View file

@ -1,36 +1,41 @@
name: 'Install Dependencies' name: 'Install Dependencies'
description: 'Install Home Assistant and test dependencies' description: 'Install Home Assistant and test dependencies'
inputs: inputs:
python_version: python-version:
description: 'Python version' description: 'Python version'
required: true required: true
default: '3.10' default: '3.10'
core-version:
description: 'Home Assistant core version'
required: false
default: 'dev'
runs: runs:
using: "composite" using: "composite"
steps: steps:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v3 uses: actions/checkout@v7.0.1
with: with:
repository: ${{ github.repository }} repository: ${{ github.repository }}
ref: ${{ github.ref }} ref: ${{ github.sha }}
persist-credentials: false persist-credentials: false
fetch-depth: 0 fetch-depth: 0
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v3 uses: actions/checkout@v7.0.1
with: with:
repository: home-assistant/core repository: home-assistant/core
path: core path: core
- name: Set up Python ${{ inputs.python_version }} ref: ${{ inputs.core-version }}
- name: Set up Python ${{ inputs.python-version }}
id: python id: python
uses: actions/setup-python@v4.1.0 uses: actions/setup-python@v7.0.0
with: with:
python-version: ${{ inputs.python_version }} python-version: ${{ inputs.python-version }}
- name: Set up UV
uses: astral-sh/setup-uv@v10.0.1
- name: Install dependencies - name: Install dependencies
shell: bash shell: bash
run: | run: |
echo "::warning::### WARNING! Deprecation warnings muted with option '--use-pep517' please address this at some point in pytest.yaml. ###" uv venv --python ${{ inputs.python-version }}
pip install -r core/requirements.txt --use-pep517 ./scripts/setup-dependencies
pip install -r core/requirements_test.txt --use-pep517 ./scripts/setup-symlinks
pip install -e core/ --use-pep517
pip install $(python test_dependencies.py) --use-pep517

View file

@ -11,7 +11,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v7.0.1
with: with:
ref: main ref: main
fetch-depth: 0 fetch-depth: 0

View file

@ -0,0 +1,48 @@
name: markdown-code-runner
on:
push:
branches:
- main
pull_request:
jobs:
markdown-code-runner:
runs-on: ubuntu-latest
steps:
- name: Check out code from GitHub
uses: actions/checkout@v7.0.1
with:
repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
ref: ${{ github.head_ref || github.ref }}
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v7.0.0
with:
python-version: "3.14.7"
- name: Install uv
uses: astral-sh/setup-uv@v10.0.1
- name: Update generated content
run: ./scripts/update-generated-content
- name: Check for changes
run: |
if [ -n "$(git status --porcelain)" ]; then
if [ "${{ github.event_name }}" == "pull_request" ]; then
echo "::error::Auto-generated files are not up to date. Please run './scripts/update-generated-content' locally and push the changes."
exit 1
else
echo "Changes detected, committing and pushing..."
git add -u .
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git commit -m "Update auto-generated content"
git pull --rebase
git push
fi
else
echo "No changes detected."
fi

View file

@ -9,6 +9,6 @@ jobs:
pre-commit: pre-commit:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v7.0.1
- uses: actions/setup-python@v3 - uses: actions/setup-python@v7.0.0
- uses: pre-commit/action@v3.0.0 - uses: pre-commit/action@v3.0.1

View file

@ -8,50 +8,117 @@ on:
jobs: jobs:
pytest: pytest:
name: Run pytest name: Run pytest
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 60 timeout-minutes: 60
strategy: strategy:
fail-fast: false
matrix: matrix:
python-version: ["3.10"] include:
- core-version: "2025.9.4"
python-version: "3.13"
- core-version: "2025.10.4"
python-version: "3.13"
- core-version: "2025.11.3"
python-version: "3.13"
- core-version: "2025.12.5"
python-version: "3.13"
- core-version: "2026.1.3"
python-version: "3.13"
- core-version: "2026.2.3"
python-version: "3.13"
- core-version: "2026.3.4"
python-version: "3.14.2"
- core-version: "2026.4.4"
python-version: "3.14.2"
- core-version: "2026.5.4"
python-version: "3.14.2"
- core-version: "2026.6.4"
python-version: "3.14.2"
- core-version: "2026.7.4"
python-version: "3.14.2"
- core-version: "2026.8.3"
python-version: "3.14.2"
- core-version: "2026.9.1"
python-version: "3.14.2"
- core-version: "dev"
python-version: "3.14.2"
steps: steps:
- name: Check out code from GitHub - name: Check out code from GitHub
uses: actions/checkout@v3 uses: actions/checkout@v7.0.1
- name: Install Home Assistant - name: Install Home Assistant
uses: ./.github/workflows/install_dependencies uses: ./.github/workflows/install_dependencies
with: with:
python_version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
core-version: ${{ matrix.core-version }}
- name: Click here for troubleshooting steps if tests break again.
run: |
echo "::notice::### If tests fail, try these debug steps: ###"
echo "::notice::### 1. Replace '-qq' from .github/workflow/pytest.yaml. with '-v' for extra verbosity. ###"
echo "::notice::### 2. Push or run action again. ###"
echo "::notice::### 3. Check for any log messages in github actions resembling the following using CTRL+F ###
echo "::notice::### 4. ERROR:homeassistant.setup:Setup failed for 'component': Unable to import component: No module named ''module'' ###"
echo "::notice::### 5. add 'component'.'module' (without the '') from the above log into the 'required' list inside of 'test_dependencies.py' ###"
echo "::notice::### 6. Try again! If more issues persist they should be easily solvable by reading the verbose logs now. ###"
- name: Run pytest - name: Run pytest
id: pytest
timeout-minutes: 60 timeout-minutes: 60
run: | run: |
export PYTHONPATH=${PYTHONPATH}:${PWD}
source .venv/bin/activate
cd core cd core
# Link homeassitant.components.adaptive_lighting
cd homeassistant/components
ln -fs ../../../custom_components/adaptive_lighting adaptive_lighting
cd -
# Link adaptive_lighting tests
cd tests/components/
ln -fs ../../../tests adaptive_lighting
cd -
python3 -X dev -m pytest \ python3 -X dev -m pytest \
-vvv \
-qq \ -qq \
--timeout=9 \ --timeout=9 \
--durations=10 \ --durations=10 \
--cov="homeassistant" \ --cov=homeassistant.components.adaptive_lighting \
--cov-branch \
--cov-report=term-missing \
--cov-report=xml \ --cov-report=xml \
--cov-report=json \
--cov-report=html \
-o console_output_style=count \ -o console_output_style=count \
-p no:sugar \ -p no:sugar \
tests/components/adaptive_lighting tests/components/adaptive_lighting
- name: Write coverage summary
if: ${{ !cancelled() }}
env:
CORE_VERSION: ${{ matrix.core-version }}
PYTHON_VERSION: ${{ matrix.python-version }}
PYTEST_OUTCOME: ${{ steps.pytest.outcome }}
run: |
{
echo "### Coverage: Home Assistant ${CORE_VERSION}, Python ${PYTHON_VERSION}"
echo
if [[ -f core/coverage.json ]]; then
echo "| Metric | Executed | Total | Coverage |"
echo "| --- | ---: | ---: | ---: |"
jq -r '
def percent(covered; total):
if total == 0 then 100 else (covered / total * 10000 | round) / 100 end;
.totals
| "| Lines | \(.covered_lines) | \(.num_statements) | \(percent(.covered_lines; .num_statements))% |\n"
+ "| Branches | \(.covered_branches) | \(.num_branches) | \(percent(.covered_branches; .num_branches))% |"
' core/coverage.json
else
echo "Coverage JSON was not generated. See the pytest step for details."
fi
} >> "${GITHUB_STEP_SUMMARY}"
if [[ ! -f core/coverage.json && "${PYTEST_OUTCOME}" == "success" ]]; then
exit 1
fi
if [[ "${CORE_VERSION}" != "dev" && "${PYTEST_OUTCOME}" == "success" ]]; then
echo "Required coverage: 89% lines and 80% branches." >> "${GITHUB_STEP_SUMMARY}"
if ! jq -e '.totals | .covered_lines * 100 >= .num_statements * 89
and .covered_branches * 100 >= .num_branches * 80' core/coverage.json > /dev/null; then
echo "::error::Coverage must be at least 89% lines and 80% branches."
exit 1
fi
fi
- name: Upload coverage reports
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7.0.1
with:
name: coverage-${{ matrix.core-version }}-py${{ matrix.python-version }}
path: |
core/coverage.xml
core/coverage.json
core/htmlcov/
if-no-files-found: warn

24
.github/workflows/release-drafter.yml vendored Normal file
View file

@ -0,0 +1,24 @@
name: Release Drafter
on:
push:
branches:
- main
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: read
jobs:
update_release_draft:
permissions:
contents: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v7.7.0
with:
dry-run: ${{ github.event_name == 'pull_request' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -1,10 +0,0 @@
on: push
name: TOC Generator
jobs:
generateTOC:
name: TOC Generator
runs-on: ubuntu-latest
steps:
- uses: technote-space/toc-generator@v4
with:
TOC_TITLE: ""

View file

@ -1,43 +0,0 @@
name: Update README.md
on:
push:
branches:
- master
paths:
- "README.md"
- "custom_components/adaptive_lighting/const.py"
- "github/workflows/update-readme.yml"
pull_request:
jobs:
update_readme:
runs-on: ubuntu-latest
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3
- name: Install Home Assistant
uses: ./.github/workflows/install_dependencies
with:
python_version: "3.10"
- name: Install pandas and tabulate
run: |
pip install markdown-code-runner pandas tabulate
- name: Run markdown-code-runner
run: markdown-code-runner --debug README.md
- name: Commit updated README.md
run: |
git add README.md
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git diff --quiet && git diff --staged --quiet || git commit -m "Update README.md"
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.head_ref }}

View file

@ -0,0 +1,59 @@
name: Update Test Matrix
on:
schedule:
# Run weekly on Monday at 9:00 UTC
- cron: "0 9 * * 1"
workflow_dispatch: # Allow manual trigger
permissions:
contents: write
pull-requests: write
jobs:
update-matrix:
name: Update HA Core versions in test matrix
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v7.0.1
- name: Set up Python
uses: actions/setup-python@v7.0.0
with:
python-version: "3.14.7"
- name: Update test matrix
run: python scripts/update-test-matrix.py
- name: Check for changes
id: changes
run: |
if git diff --quiet .github/workflows/pytest.yaml; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
echo "Detected changes:"
git diff .github/workflows/pytest.yaml
fi
- name: Create Pull Request
if: steps.changes.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v8.1.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "ci: update HA Core test matrix versions"
title: "ci: Update Home Assistant Core test matrix"
body: |
This PR automatically updates the pytest workflow to test against the latest Home Assistant Core versions.
## Changes
- Updated HA Core versions in the test matrix to include latest patch releases
---
🤖 Generated automatically by the update-test-matrix workflow
branch: update-test-matrix
delete-branch: true
labels: |
automation
ci

View file

@ -10,8 +10,9 @@ on:
jobs: jobs:
validate_hacs: validate_hacs:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
if: github.repository == 'basnijholt/adaptive-lighting' # Don't run on forked repos
steps: steps:
- uses: "actions/checkout@v2" - uses: "actions/checkout@v7.0.1"
- name: HACS validation - name: HACS validation
uses: "hacs/action@main" uses: "hacs/action@main"
with: with:

11
.gitignore vendored
View file

@ -127,3 +127,14 @@ dmypy.json
# Pyre type checker # Pyre type checker
.pyre/ .pyre/
# IDEs
.vscode
.idea
# Home Assistant configuration
config/*
!config/configuration.yaml
# Home Assistant core
core/

View file

@ -1,26 +1,24 @@
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 rev: v6.0.0
hooks: hooks:
- id: check-added-large-files - id: check-added-large-files
- id: trailing-whitespace - id: trailing-whitespace
- id: end-of-file-fixer - id: end-of-file-fixer
- id: mixed-line-ending - id: mixed-line-ending
args: ["--fix=lf"] args: ["--fix=lf"]
- repo: https://github.com/pycqa/flake8 - repo: https://github.com/thlorenz/doctoc
rev: 6.0.0 rev: v2.5.0
hooks: hooks:
- id: flake8 - id: doctoc
- repo: https://github.com/psf/black files: ^README[^/]*\.md$
rev: 23.1.0 args: ["--notitle"]
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.16.6
hooks:
- id: ruff
args: ["--fix"]
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 26.5.1
hooks: hooks:
- id: black - id: black
- repo: https://github.com/asottile/pyupgrade
rev: v3.3.1
hooks:
- id: pyupgrade
args: ["--py39-plus"]
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort

62
.ruff.toml Normal file
View file

@ -0,0 +1,62 @@
# The contents of this file is based on https://github.com/home-assistant/core/blob/dev/pyproject.toml
target-version = "py312"
[lint]
select = ["ALL"]
# All the ones without a comment were the ones that are currently violated
# by the codebase. The plan is to fix them all (when sensible) and then enable them.
ignore = [
"ANN",
"ANN401", # Dynamically typed expressions (typing.Any) are disallowed in {name}
"CPY001", # Missing copyright notice at top of file
"D401", # First line of docstring should be in imperative mood
"E501", # line too long
"FBT001", # Boolean positional arg in function definition
"FBT002", # Boolean default value in function definition
"FIX004", # Line contains HACK, consider resolving the issue
"PERF203", # `try`-`except` within a loop incurs performance overhead
"PLC0415", # `import` should be at the top-level of a file
"PLR0913", # Too many arguments to function call (N > 5)
"PLR0917", # Too many positional arguments
"PLR2004", # Magic value used in comparison, consider replacing X with a constant variable
"RUF059", # Unpacked variable is never used
"S101", # Use of assert detected
"SLF001", # Private member accessed
"UP017", # Use datetime.UTC alias
"UP042", # Replace str, Enum inheritance with StrEnum
]
[lint.per-file-ignores]
"tests/*.py" = [
"ARG001", # Unused function argument: `call`
"D100", # Missing docstring in public module
"D103", # Missing docstring in public function
"D205", # 1 blank line required between summary line and description
"D400", # First line should end with a period
"D415", # First line should end with a period, question mark, or
"DTZ001", # The use of `datetime.datetime()` without `tzinfo`
"ERA001", # Found commented-out code
"FBT003", # Boolean positional value in function call
"FIX002", # Line contains TODO, consider resolving the issue
"G004", # Logging statement uses f-string
"PLR0915", # Too many statements (94 > 50)
"PT004", # Fixture `cleanup` does not return anything, add leading underscore
"PT007", # Wrong values type in `@pytest.mark.parametrize` expected `list` of
"S311", # Standard pseudo-random generators are not suitable for cryptographic
"TD002", # Missing author in TODO; try: `# TODO(<author_name>): ...` or `# TODO
"TD003", # Missing issue link on the line following this TODO
]
".github/*py" = ["INP001"]
"webapp/homeassistant_util_color.py" = ["ALL"]
"webapp/app.py" = ["INP001", "DTZ011", "A002"]
"custom_components/adaptive_lighting/homeassistant_util_color.py" = ["ALL"]
[lint.flake8-pytest-style]
fixture-parentheses = false
[lint.pyupgrade]
keep-runtime-typing = true
[lint.mccabe]
max-complexity = 25

23
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,23 @@
{
"files.associations": {
"*.yaml": "home-assistant"
},
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
"python.testing.pytestEnabled": true,
"python.testing.pytestArgs": [
"-vvv",
"-qq",
"--timeout=9",
"--durations=10",
"--cov=homeassistant",
"--cov-report=xml",
"-o",
"console_output_style=count",
"-p",
"no:sugar",
"core/tests/components/adaptive_lighting"
],
"python.analysis.extraPaths": [
"${workspaceFolder}/core"
]
}

17
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,17 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Run Home Assistant on port 8123",
"type": "shell",
"command": "scripts/develop",
"problemMatcher": []
},
{
"label": "Lint (run pre-commit hooks)",
"type": "shell",
"command": "scripts/lint",
"problemMatcher": []
}
]
}

View file

@ -1,41 +1,41 @@
# See tests/README.md for instructions on how to run the tests. # See tests/README.md for instructions on how to run the tests.
# tl;dr: # tl;dr:
# Run the following command in the adaptive-lighting repo folder to run the tests: # 1. Clone HA core into ./core: git clone --depth 1 https://github.com/home-assistant/core.git core
# docker run -v $(pwd):/app basnijholt/adaptive-lighting:latest # 2. Setup symlinks: ./scripts/setup-symlinks
# 3. Run tests (mount entire repo, not individual dirs, or symlinks break):
# docker run -v $(pwd):/app basnijholt/adaptive-lighting:latest
# Optionally build the image yourself with: # Optionally build the image yourself with:
# docker build -t basnijholt/adaptive-lighting:latest . # docker build -t basnijholt/adaptive-lighting:latest .
FROM python:3.11-buster FROM ghcr.io/astral-sh/uv:debian
RUN apt-get update && \ # Install build dependencies for Python extensions
DEBIAN_FRONTEND=noninteractive apt-get install -y \ RUN apt-get update && apt-get install -y --no-install-recommends \
git \ python3-dev \
build-essential libssl-dev libffi-dev python3-dev \ build-essential \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Clone home-assistant/core # Clone home-assistant/core
RUN git clone --depth 1 https://github.com/home-assistant/core.git /core RUN git clone --depth 1 --branch dev https://github.com/home-assistant/core.git /core
# Install home-assistant/core dependencies # Copy the Adaptive Lighting repository
RUN pip3 install -r /core/requirements.txt --use-pep517 && \ COPY . /app/
pip3 install -r /core/requirements_test.txt --use-pep517 && \
pip3 install -e /core/ --use-pep517
# Clone the Adaptive Lighting repository
RUN git clone https://github.com/basnijholt/adaptive-lighting.git /app
# Setup symlinks in core # Setup symlinks in core
RUN ln -s /app/custom_components/adaptive_lighting /core/homeassistant/components/adaptive_lighting && \ RUN ln -s /core /app/core && /app/scripts/setup-symlinks
ln -s /app/tests /core/tests/components/adaptive_lighting && \
# For test_dependencies.py
ln -s /core /app/core
# Install dependencies of components that Adaptive Lighting depends on # Install home-assistant/core dependencies
RUN pip3 install $(python3 /app/test_dependencies.py) --use-pep517 RUN mkdir -p /.venv
ENV UV_PROJECT_ENVIRONMENT=/.venv UV_PYTHON=3.14.2 PATH="/.venv/bin:$PATH"
RUN uv venv
RUN /app/scripts/setup-dependencies
WORKDIR /core WORKDIR /app/core
# Make 'custom_components/adaptive_lighting' imports available to tests
ENV PYTHONPATH="/app"
ENTRYPOINT ["python3", \ ENTRYPOINT ["python3", \
# Enable Python development mode # Enable Python development mode
@ -48,8 +48,8 @@ ENTRYPOINT ["python3", \
"--timeout=9", \ "--timeout=9", \
# Print the 10 slowest tests # Print the 10 slowest tests
"--durations=10", \ "--durations=10", \
# Measure code coverage for the 'homeassistant' package # Measure code coverage for the 'homeassistant.components.adaptive_lighting' component
"--cov='homeassistant'", \ "--cov=homeassistant.components.adaptive_lighting", \
# Generate an XML report of the code coverage # Generate an XML report of the code coverage
"--cov-report=xml", \ "--cov-report=xml", \
# Generate an HTML report of the code coverage # Generate an HTML report of the code coverage

1035
README.md

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,112 @@
blueprint:
name: "Adaptive Lighting: limit brightness in daylight"
description: >-
Lower a profile's maximum brightness in strong daylight and restore the
chosen normal maximum when daylight falls. Separate lux thresholds prevent
repeated changes near a single threshold. Use a sensor not significantly
affected by the controlled lights. Keep the daylight maximum at or above
the profile's minimum unless you want an inverted brightness curve.
Startup waits up to five minutes for a numeric sensor reading; a reading
between the thresholds leaves the configured maximum unchanged.
domain: automation
homeassistant:
min_version: "2025.9.0"
input:
adaptive_switch:
name: Adaptive Lighting profile
description: Select the main profile switch, not a sleep or adaptation switch.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
illuminance_sensor:
name: Illuminance sensor
selector:
entity:
filter:
domain: sensor
device_class: illuminance
high_lux:
name: Strong daylight threshold
description: Must be greater than the low daylight threshold.
default: 300
selector:
number:
min: 0
max: 200000
mode: box
unit_of_measurement: lx
low_lux:
name: Low daylight threshold
default: 200
selector:
number:
min: 0
max: 200000
mode: box
unit_of_measurement: lx
daylight_maximum:
name: Maximum brightness in strong daylight
default: 30
selector:
number:
min: 1
max: 100
mode: box
unit_of_measurement: "%"
normal_maximum:
name: Normal maximum brightness
default: 100
selector:
number:
min: 1
max: 100
mode: box
unit_of_measurement: "%"
mode: restart
variables:
illuminance_sensor: !input illuminance_sensor
high_lux: !input high_lux
low_lux: !input low_lux
triggers:
- trigger: numeric_state
entity_id: !input illuminance_sensor
above: !input high_lux
- trigger: numeric_state
entity_id: !input illuminance_sensor
below: !input low_lux
- trigger: homeassistant
event: start
id: startup
conditions:
- condition: template
value_template: "{{ high_lux > low_lux }}"
actions:
- if:
- condition: trigger
id: startup
then:
- wait_template: "{{ is_number(states(illuminance_sensor)) }}"
timeout: "00:05:00"
continue_on_timeout: false
- choose:
- conditions:
- condition: numeric_state
entity_id: !input illuminance_sensor
above: !input high_lux
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: !input adaptive_switch
max_brightness: !input daylight_maximum
- conditions:
- condition: numeric_state
entity_id: !input illuminance_sensor
below: !input low_lux
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: !input adaptive_switch
max_brightness: !input normal_maximum

View file

@ -0,0 +1,123 @@
blueprint:
name: "Adaptive Lighting: pause brightness at minimum"
description: >-
Mark one light's brightness as manually controlled when its calculated
brightness target crosses down to the configured minimum. Set the profile's
take_over_control_mode to pause_changed to keep adapting color; pause_all
pauses both. Existing manual color control is preserved. Uses the normal
manual-control resets, including turning the light off and any configured
autoreset_control_seconds timeout. Runs once per downward crossing, so a
reset while the target remains low does not immediately pause it again.
Waits up to five minutes for reported brightness to reach the rounded
0255 minimum before pausing. This does not prove physical fade completion. Does not
change power or adaptation switches. Select an individual light managed by
the profile. Shared profiles retain their usual manual-control behavior.
domain: automation
homeassistant:
min_version: "2025.9.0"
input:
adaptive_switch:
name: Adaptive Lighting profile
description: Select the main Adaptive Lighting switch, not a sleep or adaptation switch.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
brightness_switch:
name: Adapt brightness switch
description: Select the adapt brightness switch belonging to the same profile.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
light_entity:
name: Light
description: Select one light managed by this profile. Create an automation for each light.
selector:
entity:
filter:
domain: light
minimum_pct:
name: Minimum brightness
description: Match the profile's min_brightness setting. Update this if that setting changes.
default: 1
selector:
number:
min: 1
max: 100
step: 1
unit_of_measurement: "%"
mode: box
mode: single
variables:
adaptive_switch: !input adaptive_switch
light_entity: !input light_entity
minimum_pct: !input minimum_pct
minimum: "{{ (minimum_pct * 255 / 100) | round(0) }}"
brightness_switch: !input brightness_switch
triggers:
- trigger: state
entity_id: !input adaptive_switch
attribute: brightness_pct
conditions:
- condition: state
entity_id: !input adaptive_switch
state: "on"
- condition: state
entity_id: !input brightness_switch
state: "on"
- condition: template
value_template: >-
{% set before = trigger.from_state.attributes.get('brightness_pct')
if trigger.from_state else none %}
{% set after = trigger.to_state.attributes.get('brightness_pct')
if trigger.to_state else none %}
{{ is_number(before) and is_number(after)
and (before | float * 255 / 100) | round(0) > minimum
and (after | float * 255 / 100) | round(0) <= minimum }}
- condition: state
entity_id: !input light_entity
state: "on"
- condition: template
value_template: >-
{{ light_entity not in (state_attr(adaptive_switch, 'manual_control_brightness') or []) }}
actions:
- variables:
light_session: "{{ states[light_entity].last_changed.isoformat() }}"
profile_session: "{{ states[adaptive_switch].last_changed.isoformat() }}"
brightness_session: "{{ states[brightness_switch].last_changed.isoformat() }}"
- wait_template: >-
{% set target = state_attr(adaptive_switch, 'brightness_pct') %}
{{ not is_state(light_entity, 'on') or not is_state(adaptive_switch, 'on')
or not is_state(brightness_switch, 'on')
or states[light_entity].last_changed.isoformat() != light_session
or states[adaptive_switch].last_changed.isoformat() != profile_session
or states[brightness_switch].last_changed.isoformat() != brightness_session
or not is_number(target) or (target | float * 255 / 100) | round(0) > minimum
or light_entity in (state_attr(adaptive_switch, 'manual_control_brightness') or [])
or (state_attr(light_entity, 'brightness') | float(256)) <= minimum }}
timeout: "00:05:00"
continue_on_timeout: false
- condition: template
value_template: >-
{% set target = state_attr(adaptive_switch, 'brightness_pct') %}
{{ is_state(light_entity, 'on') and is_state(adaptive_switch, 'on')
and is_state(brightness_switch, 'on')
and states[light_entity].last_changed.isoformat() == light_session
and states[adaptive_switch].last_changed.isoformat() == profile_session
and states[brightness_switch].last_changed.isoformat() == brightness_session
and is_number(target) and (target | float * 255 / 100) | round(0) <= minimum
and (state_attr(light_entity, 'brightness') | float(256)) <= minimum
and light_entity not in
(state_attr(adaptive_switch, 'manual_control_brightness') or []) }}
- action: adaptive_lighting.set_manual_control
data:
entity_id: !input adaptive_switch
lights: !input light_entity
manual_control: >-
{{ true if light_entity in
(state_attr(adaptive_switch, 'manual_control_color') or [])
else 'brightness' }}

View file

@ -0,0 +1,57 @@
blueprint:
name: "Adaptive Lighting: scheduled profile"
description: >-
Apply fixed brightness and color temperature from a Schedule helper's
brightness_pct and color_temp_kelvin attributes. Uses step changes, not
interpolation. Missing attributes fall back to 1% and 2000 K. Outside an
active block, restores ALL configured profile settings. Use this only if
other automations do not also change runtime settings on this profile.
Reapplies the active block on Home Assistant startup. Updates settings
while the profile is off without enabling it; preserves manual control.
domain: automation
homeassistant:
min_version: "2025.9.0"
input:
adaptive_switch:
name: Adaptive Lighting profile
description: Select the main profile switch, not a sleep or adaptation switch.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
schedule_entity:
name: Schedule helper
description: Add brightness_pct (1100) and color_temp_kelvin to each block's Additional data.
selector:
entity:
filter:
domain: schedule
mode: restart
variables:
schedule_entity: !input schedule_entity
triggers:
- trigger: state
entity_id: !input schedule_entity
- trigger: homeassistant
event: start
actions:
- choose:
- conditions:
- condition: state
entity_id: !input schedule_entity
state: "on"
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: !input adaptive_switch
min_brightness: "{{ state_attr(schedule_entity, 'brightness_pct') | int(1) }}"
max_brightness: "{{ state_attr(schedule_entity, 'brightness_pct') | int(1) }}"
min_color_temp: "{{ state_attr(schedule_entity, 'color_temp_kelvin') | int(2000) }}"
max_color_temp: "{{ state_attr(schedule_entity, 'color_temp_kelvin') | int(2000) }}"
default:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: !input adaptive_switch
use_defaults: configuration

View file

@ -0,0 +1,42 @@
blueprint:
name: "Adaptive Lighting: synchronize sleep mode"
description: >-
Keep the selected Adaptive Lighting sleep-mode switches in sync with an
input boolean, including its restored state at Home Assistant startup.
Unknown or unavailable helper states are ignored. Select only sleep-mode
switches, not the main profile or adaptation switches.
domain: automation
homeassistant:
min_version: "2025.9.0"
input:
sleep_helper:
name: Sleep-mode helper
selector:
entity:
filter:
domain: input_boolean
sleep_switches:
name: Adaptive Lighting sleep-mode switches
selector:
entity:
multiple: true
filter:
domain: switch
integration: adaptive_lighting
triggers:
- trigger: state
entity_id: !input sleep_helper
- trigger: homeassistant
event: start
variables:
sleep_helper: !input sleep_helper
sleep_mode: "{{ states(sleep_helper) }}"
conditions:
- condition: template
value_template: "{{ sleep_mode in ['on', 'off'] }}"
actions:
- action: "switch.turn_{{ sleep_mode }}"
target:
entity_id: !input sleep_switches
mode: restart

View file

@ -0,0 +1,87 @@
blueprint:
name: "Adaptive Lighting: turn off at minimum brightness"
description: >-
Turn one light off when its Adaptive Lighting target crosses down into the
chosen minimum brightness range. Compares rounded 0255 commands, not the
bulb's physical dimming limit or transition completion. Skips lights currently
marked as manually controlled. Changing sleep mode clears manual control by
default; set reset_manual_control_on_sleep_mode_change to false in your
profile to preserve it. Does not turn lights back on or repeatedly turn them off
while the target stays low. Startup at the minimum does not trigger it.
Sleep mode can trigger it if its target crosses the chosen minimum.
Select a light managed by the chosen profile and its matching brightness switch.
domain: automation
homeassistant:
min_version: "2025.9.0"
input:
adaptive_switch:
name: Adaptive Lighting profile
description: Select the main Adaptive Lighting switch, not a sleep or adaptation switch.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
brightness_switch:
name: Adapt brightness switch
description: Select the adapt brightness switch belonging to the same profile.
selector:
entity:
filter:
domain: switch
integration: adaptive_lighting
light_entity:
name: Light
description: Select one light managed by this profile. Create an automation for each light.
selector:
entity:
filter:
domain: light
minimum_pct:
name: Minimum brightness
description: Match the profile's min_brightness setting. Update this if that setting changes.
default: 1
selector:
number:
min: 1
max: 100
step: 1
unit_of_measurement: "%"
mode: box
mode: single
variables:
adaptive_switch: !input adaptive_switch
light_entity: !input light_entity
minimum_pct: !input minimum_pct
triggers:
- trigger: state
entity_id: !input adaptive_switch
attribute: brightness_pct
conditions:
- condition: state
entity_id: !input adaptive_switch
state: "on"
- condition: state
entity_id: !input brightness_switch
state: "on"
- condition: template
value_template: >-
{% set minimum = (minimum_pct * 255 / 100) | round(0) %}
{% set before = trigger.from_state.attributes.get('brightness_pct')
if trigger.from_state else none %}
{% set after = trigger.to_state.attributes.get('brightness_pct')
if trigger.to_state else none %}
{{ is_number(before) and is_number(after)
and (before | float * 255 / 100) | round(0) > minimum
and (after | float * 255 / 100) | round(0) <= minimum }}
- condition: state
entity_id: !input light_entity
state: "on"
- condition: template
value_template: >-
{{ light_entity not in (state_attr(adaptive_switch, 'manual_control') or []) }}
actions:
- action: light.turn_off
target:
entity_id: !input light_entity

19
config/configuration.yaml Normal file
View file

@ -0,0 +1,19 @@
# https://www.home-assistant.io/integrations/default_config/
default_config:
# https://www.home-assistant.io/integrations/logger/
logger:
default: info
logs:
custom_components.adaptive_lighting: debug
light:
- platform: template
lights:
dummylight:
friendly_name: "Dummy Light"
turn_on:
turn_off:
set_level:
set_temperature:
supports_transition_template: "{{ true }}"

98
custom_components/adaptive_lighting/__init__.py Executable file → Normal file
View file

@ -1,20 +1,33 @@
"""Adaptive Lighting integration in Home-Assistant.""" """Adaptive Lighting integration in Home-Assistant."""
import logging import logging
from functools import partial
from typing import Any from typing import Any
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import CONF_SOURCE
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.reload import async_setup_reload_service
import voluptuous as vol import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import CONF_SOURCE, Platform
from homeassistant.core import Event, HomeAssistant
from homeassistant.helpers import service
from .const import ( from .const import (
_DOMAIN_SCHEMA, _DOMAIN_SCHEMA, # pyright: ignore[reportPrivateUsage]
ATTR_TURN_ON_OFF_LISTENER, ATTR_ADAPTIVE_LIGHTING_MANAGER,
CONF_NAME, CONF_NAME,
DOMAIN, DOMAIN,
SERVICE_APPLY,
SERVICE_CHANGE_SWITCH_SETTINGS,
SERVICE_SET_MANUAL_CONTROL,
SET_MANUAL_CONTROL_SCHEMA,
UNDO_UPDATE_LISTENER, UNDO_UPDATE_LISTENER,
apply_service_schema,
change_switch_settings_schema,
)
from .switch import (
handle_apply_service,
handle_change_switch_settings,
handle_set_manual_control_service,
) )
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -22,7 +35,7 @@ _LOGGER = logging.getLogger(__name__)
PLATFORMS = ["switch"] PLATFORMS = ["switch"]
def _all_unique_names(value): def _all_unique_names(value: list[dict[str, Any]]) -> list[dict[str, Any]]:
"""Validate that all entities have a unique profile name.""" """Validate that all entities have a unique profile name."""
hosts = [device[CONF_NAME] for device in value] hosts = [device[CONF_NAME] for device in value]
schema = vol.Schema(vol.Unique()) schema = vol.Schema(vol.Unique())
@ -36,55 +49,92 @@ CONFIG_SCHEMA = vol.Schema(
) )
async def async_setup(hass: HomeAssistant, config: dict[str, Any]): async def reload_configuration_yaml(event: Event) -> None:
"""Reload configuration.yaml."""
hass: HomeAssistant | None = event.data.get("hass")
if hass is not None:
await hass.services.async_call("homeassistant", "check_config", {})
else:
_LOGGER.error("HomeAssistant instance not found in event data.")
async def async_setup(hass: HomeAssistant, config: dict[str, Any]) -> bool:
"""Import integration from config.""" """Import integration from config."""
# This will reload any changes the user made to any YAML configurations. hass.services.async_register(
await async_setup_reload_service(hass, DOMAIN, PLATFORMS) domain=DOMAIN,
service=SERVICE_APPLY,
service_func=partial(handle_apply_service, hass),
schema=apply_service_schema(),
)
hass.services.async_register(
domain=DOMAIN,
service=SERVICE_SET_MANUAL_CONTROL,
service_func=partial(handle_set_manual_control_service, hass),
schema=SET_MANUAL_CONTROL_SCHEMA,
)
if register_platform_service := getattr(
service,
"async_register_platform_entity_service",
None,
):
register_platform_service(
hass,
DOMAIN,
SERVICE_CHANGE_SWITCH_SETTINGS,
entity_domain=Platform.SWITCH,
func=handle_change_switch_settings,
schema=change_switch_settings_schema(),
)
if DOMAIN in config: if DOMAIN in config:
for entry in config[DOMAIN]: for entry in config[DOMAIN]:
hass.async_create_task( hass.async_create_task(
hass.config_entries.flow.async_init( hass.config_entries.flow.async_init(
DOMAIN, context={CONF_SOURCE: SOURCE_IMPORT}, data=entry DOMAIN,
) context={CONF_SOURCE: SOURCE_IMPORT},
data=entry,
),
) )
return True return True
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry): async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
"""Set up the component.""" """Set up the component."""
data = hass.data.setdefault(DOMAIN, {}) data = hass.data.setdefault(DOMAIN, {})
# This will reload any changes the user made to any YAML configurations.
# Called during 'quick reload' or hass.reload_config_entry
hass.bus.async_listen("hass.config.entry_updated", reload_configuration_yaml)
undo_listener = config_entry.add_update_listener(async_update_options) undo_listener = config_entry.add_update_listener(async_update_options)
data[config_entry.entry_id] = {UNDO_UPDATE_LISTENER: undo_listener} data[config_entry.entry_id] = {UNDO_UPDATE_LISTENER: undo_listener}
for platform in PLATFORMS: await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(config_entry, platform)
)
return True return True
async def async_update_options(hass, config_entry: ConfigEntry): async def async_update_options(hass: HomeAssistant, config_entry: ConfigEntry) -> None:
"""Update options.""" """Update options."""
await hass.config_entries.async_reload(config_entry.entry_id) await hass.config_entries.async_reload(config_entry.entry_id)
async def async_unload_entry(hass, config_entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
unload_ok = await hass.config_entries.async_forward_entry_unload( unload_ok = await hass.config_entries.async_forward_entry_unload(
config_entry, "switch" config_entry,
"switch",
) )
data = hass.data[DOMAIN] data = hass.data[DOMAIN]
data[config_entry.entry_id][UNDO_UPDATE_LISTENER]() data[config_entry.entry_id][UNDO_UPDATE_LISTENER]()
if unload_ok: if unload_ok:
data.pop(config_entry.entry_id) data.pop(config_entry.entry_id)
if len(data) == 1 and ATTR_TURN_ON_OFF_LISTENER in data: if len(data) == 1 and ATTR_ADAPTIVE_LIGHTING_MANAGER in data:
# no more config_entries # no more config_entries
turn_on_off_listener = data.pop(ATTR_TURN_ON_OFF_LISTENER) manager = data.pop(ATTR_ADAPTIVE_LIGHTING_MANAGER)
turn_on_off_listener.remove_listener() manager.disable()
turn_on_off_listener.remove_listener2()
if not data: if not data:
hass.data.pop(DOMAIN) hass.data.pop(DOMAIN)

View file

@ -0,0 +1,116 @@
from typing import Any
import homeassistant.helpers.config_validation as cv
import pandas as pd
import voluptuous as vol
from homeassistant.helpers import selector
from .const import (
DOCS,
DOCS_APPLY,
DOCS_MANUAL_CONTROL,
SET_MANUAL_CONTROL_SCHEMA,
VALIDATION_TUPLES,
apply_service_schema,
)
def _format_voluptuous_instance(instance: vol.All) -> str:
coerce_type = None
min_val = None
max_val = None
for validator in instance.validators:
if isinstance(validator, vol.Coerce):
coerce_type = validator.type.__name__
elif isinstance(validator, vol.Clamp | vol.Range):
min_val = validator.min
max_val = validator.max
if min_val is not None and max_val is not None:
return f"`{coerce_type}` {min_val}-{max_val}"
if min_val is not None:
return f"`{coerce_type} > {min_val}`"
if max_val is not None:
return f"`{coerce_type} < {max_val}`"
return f"`{coerce_type}`"
def _type_to_str(type_: Any) -> str: # noqa: PLR0911
"""Convert a (voluptuous) type to a string."""
if type_ == cv.entity_ids:
return "list of `entity_id`s"
if type_ in (bool, int, float, str):
return f"`{type_.__name__}`"
if type_ == cv.boolean:
return "bool"
if isinstance(type_, vol.All):
return _format_voluptuous_instance(type_)
if isinstance(type_, vol.Any):
return " or ".join(_type_to_str(t) for t in type_.validators)
if isinstance(type_, vol.In):
return f"one of `{type_.container}`"
if isinstance(type_, selector.SelectSelector):
return f"one of `{type_.config['options']}`"
if isinstance(type_, selector.ColorRGBSelector):
return "RGB color"
msg = f"Unknown type: {type_}"
raise ValueError(msg)
def generate_config_markdown_table() -> str:
rows: list[dict[str, str]] = []
for k, default, type_ in VALIDATION_TUPLES:
description = DOCS[k]
row = {
"Variable name": f"`{k}`",
"Description": description,
"Default": f"`{default}`",
"Type": _type_to_str(type_),
}
rows.append(row)
df = pd.DataFrame(rows)
return df.to_markdown(index=False)
def _schema_to_dict(schema: vol.Schema) -> dict[str, tuple[bool, Any]]:
result: dict[str, tuple[bool, Any]] = {}
for key, value in schema.schema.items():
if isinstance(key, vol.Required | vol.Optional):
required = isinstance(key, vol.Required) and key.default == vol.UNDEFINED
result[key.schema] = (required, value)
return result
def _generate_service_markdown_table(
schema: vol.Schema,
alternative_docs: dict[str, str] | None = None,
) -> str:
rows: list[dict[str, str]] = []
for k, (required, type_) in _schema_to_dict(schema).items():
if alternative_docs is not None and k in alternative_docs:
description = alternative_docs[k]
else:
description = DOCS[k]
row = {
"Service data attribute": f"`{k}`",
"Description": description,
"Required": "" if required else "",
"Type": _type_to_str(type_),
}
rows.append(row)
df = pd.DataFrame(rows)
return df.to_markdown(index=False)
def generate_apply_markdown_table() -> str:
return _generate_service_markdown_table(apply_service_schema(), DOCS_APPLY)
def generate_set_manual_control_markdown_table() -> str:
return _generate_service_markdown_table(
SET_MANUAL_CONTROL_SCHEMA,
DOCS_MANUAL_CONTROL,
)

View file

@ -0,0 +1,384 @@
"""Utility functions for adaptation commands."""
import logging
from collections.abc import AsyncGenerator
from dataclasses import dataclass
from enum import IntFlag, auto
from typing import Any
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ATTR_BRIGHTNESS_PCT,
ATTR_BRIGHTNESS_STEP,
ATTR_BRIGHTNESS_STEP_PCT,
ATTR_COLOR_NAME,
ATTR_COLOR_TEMP_KELVIN,
ATTR_EFFECT,
ATTR_FLASH,
ATTR_HS_COLOR,
ATTR_RGB_COLOR,
ATTR_RGBW_COLOR,
ATTR_RGBWW_COLOR,
ATTR_TRANSITION,
ATTR_XY_COLOR,
)
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import Context, HomeAssistant, State
_LOGGER = logging.getLogger(__name__)
COLOR_ATTRS = { # Should ATTR_PROFILE be in here?
ATTR_COLOR_NAME,
ATTR_COLOR_TEMP_KELVIN,
ATTR_HS_COLOR,
ATTR_RGB_COLOR,
ATTR_XY_COLOR,
ATTR_RGBW_COLOR,
ATTR_RGBWW_COLOR,
}
BRIGHTNESS_ATTRS = {
ATTR_BRIGHTNESS,
ATTR_BRIGHTNESS_PCT,
ATTR_BRIGHTNESS_STEP,
ATTR_BRIGHTNESS_STEP_PCT,
}
# Worst-case rounding error when Home Assistant's 0-255 brightness scale
# round-trips through a device with coarser resolution (e.g., the 0-99 Z-Wave
# Multilevel Switch scale). A light cannot report back a value more precise than
# its own scale, so exact equality would never hold for such targets and
# 'skip_redundant_commands' would keep sending them forever. The tolerance sits
# far below the manual-control-detection threshold (BRIGHTNESS_CHANGE = 25), so
# it cannot mask a genuine user change.
BRIGHTNESS_TOLERANCE = 2
ServiceData = dict[str, Any]
class LightControlAttributes(IntFlag):
"""Attributes of lights that the adaptation engine can control."""
NONE = 0
BRIGHTNESS = auto()
COLOR = auto()
ALL = BRIGHTNESS | COLOR
def __str__(self) -> str:
"""Return a string representation of the attributes."""
if self == LightControlAttributes.NONE:
return "NONE"
return "|".join(
member.name
for member in type(self)
if member is not LightControlAttributes.NONE
and member in self
and member.name is not None
)
def has_any(self) -> bool:
"""Determine whether any attribute is selected."""
return self != LightControlAttributes.NONE
def has_none(self) -> bool:
"""Determine whether no attribute is selected."""
return self == LightControlAttributes.NONE
def has_all(self) -> bool:
"""Determine whether all attributes are selected."""
return (self & LightControlAttributes.ALL) == LightControlAttributes.ALL
def _split_service_call_data(service_data: ServiceData) -> list[ServiceData]:
"""Splits the service data by the adapted attributes.
i.e., into separate data items for brightness and color.
"""
common_attrs = {ATTR_ENTITY_ID}
common_data = {k: service_data[k] for k in common_attrs if k in service_data}
attributes_split_sequence = [BRIGHTNESS_ATTRS, COLOR_ATTRS]
service_datas: list[dict[str, Any]] = []
for attributes in attributes_split_sequence:
split_data = {
attribute: service_data[attribute]
for attribute in attributes
if service_data.get(attribute)
}
if split_data:
service_datas.append(common_data | split_data)
# Distribute the transition duration across all service calls
if service_datas and (transition := service_data.get(ATTR_TRANSITION)) is not None:
transition /= len(service_datas)
for _service_data in service_datas:
_service_data[ATTR_TRANSITION] = transition
return service_datas
def _is_attribute_satisfied(key: str, value: Any, attributes: dict[str, Any]) -> bool:
"""Whether the light's current state already satisfies this target value."""
if key not in attributes:
return False
current = attributes[key]
if not isinstance(current, (int, float)) or not isinstance(value, (int, float)):
return value == current
if key == ATTR_BRIGHTNESS:
return abs(value - current) <= BRIGHTNESS_TOLERANCE
if key == ATTR_COLOR_TEMP_KELVIN and value > 0 and current > 0:
# Compare in mired space: most integrations quantize color temperature
# to whole mireds, and the kelvin error of that quantization grows
# quadratically with kelvin (~21 K at 6500 K, ~50 K at 10000 K), so no
# fixed kelvin tolerance fits the whole range. The tolerance of one
# mired absorbs the difference between conversion schemes: HA core's
# helpers floor (e.g. 5500 K -> 181 mired -> 5524 K) while some
# integrations round (5500 K -> 182 mired -> 5495 K), and no exact
# equality converges for both. One mired is far below the ~5.5 mired
# just-noticeable difference for color temperature.
return abs(round(1_000_000 / value) - round(1_000_000 / current)) <= 1
return value == current
def _remove_redundant_attributes(
service_data: ServiceData,
state: State,
) -> ServiceData:
"""Filter service data by removing attributes already satisfied by the state.
Removes all attributes from service call data whose values are already present
in the target entity's state. Quantized attributes (brightness, color temp) are
compared with a small tolerance: a light whose resolution is coarser than Home
Assistant's cannot report back the exact value it was given, so exact equality
would never hold and the attribute would never be filtered.
"""
attributes: dict[str, Any] = dict(state.attributes)
return {
k: v
for k, v in service_data.items()
if not _is_attribute_satisfied(k, v, attributes)
}
def _has_relevant_service_data_attributes(service_data: ServiceData) -> bool:
"""Determines whether the service data justifies an adaptation service call.
A service call is not justified for data which does not contain any entries that
change relevant attributes of an adapting entity, e.g., brightness or color.
"""
common_attrs = {ATTR_ENTITY_ID, ATTR_TRANSITION}
return any(attr not in common_attrs for attr in service_data)
async def _create_service_call_data_iterator(
hass: HomeAssistant,
service_datas: list[ServiceData],
filter_by_state: bool,
) -> AsyncGenerator[ServiceData]:
"""Enumerates and filters a list of service datas on the fly.
If filtering is enabled, every service data is filtered by the current state of
the related entity and only returned if it contains relevant data that justifies
a service call.
The main advantage of this generator over a list is that it applies the filter
at the time when the service data is read instead of up front. This gives greater
flexibility because entity states can change while the items are iterated.
"""
for service_data in service_datas:
if filter_by_state and (entity_id := service_data.get(ATTR_ENTITY_ID)):
current_entity_state = hass.states.get(entity_id)
# Filter data to remove attributes that equal the current state
if current_entity_state is not None:
service_data = _remove_redundant_attributes( # noqa: PLW2901
service_data,
state=current_entity_state,
)
# Emit service data if it still contains relevant attributes (else try next)
if _has_relevant_service_data_attributes(service_data):
yield service_data
else:
yield service_data
@dataclass
class AdaptationData:
"""Holds all data required to execute an adaptation."""
entity_id: str
context: Context
sleep_time: float
service_call_datas: AsyncGenerator[ServiceData]
force: bool
max_length: int
attributes: LightControlAttributes
initial_sleep: bool = False
async def next_service_call_data(self) -> ServiceData | None:
"""Return data for the next service call, or none if no more data exists."""
return await anext(self.service_call_datas, None)
def __str__(self) -> str:
"""Return a string representation of the data."""
return (
f"{self.__class__.__name__}("
f"entity_id={self.entity_id}, "
f"context_id={self.context.id}, "
f"sleep_time={self.sleep_time}, "
f"force={self.force}, "
f"max_length={self.max_length}, "
f"attributes={self.attributes}, "
f"initial_sleep={self.initial_sleep}"
")"
)
class NoColorOrBrightnessInServiceDataError(Exception):
"""Exception raised when no color or brightness attributes are found in service data."""
def _identify_light_control_attributes(
service_data: ServiceData,
) -> LightControlAttributes:
"""Extract the 'which' attribute from the service data."""
has_brightness = ATTR_BRIGHTNESS in service_data
has_color = any(attr in service_data for attr in COLOR_ATTRS)
parameters = LightControlAttributes.NONE
if has_brightness:
parameters |= LightControlAttributes.BRIGHTNESS
if has_color:
parameters |= LightControlAttributes.COLOR
if parameters == LightControlAttributes.NONE:
msg = f"Invalid service_data, no brightness or color attributes found: {service_data=}"
raise NoColorOrBrightnessInServiceDataError(msg)
return parameters
def prepare_adaptation_data(
hass: HomeAssistant,
entity_id: str,
context: Context,
transition: float | None,
split_delay: float,
service_data: ServiceData,
split: bool,
filter_by_state: bool,
force: bool,
already_applied: LightControlAttributes = LightControlAttributes.NONE,
) -> AdaptationData:
"""Prepares a data object carrying all data required to execute an adaptation."""
_LOGGER.debug(
"Preparing adaptation data for %s with service data %s",
entity_id,
service_data,
)
service_datas = _split_service_call_data(service_data) if split else [service_data]
service_datas_length = len(service_datas)
if transition is not None:
transition_duration_per_data = transition / max(1, service_datas_length)
sleep_time = transition_duration_per_data + split_delay
else:
sleep_time = split_delay
# Keep the original split timing, but omit attributes carried by an
# intercepted turn-on shared with other lights. Do this before state
# filtering: members can have different brightness/color already satisfied.
applied_attrs = (
BRIGHTNESS_ATTRS
if LightControlAttributes.BRIGHTNESS in already_applied
else set()
) | (COLOR_ATTRS if LightControlAttributes.COLOR in already_applied else set())
if applied_attrs:
service_datas = [
{key: value for key, value in data.items() if key not in applied_attrs}
for data in service_datas
]
service_datas = [
data
for data in service_datas
if _has_relevant_service_data_attributes(data)
]
service_data_iterator = _create_service_call_data_iterator(
hass,
service_datas,
filter_by_state,
)
attributes = _identify_light_control_attributes(service_data)
return AdaptationData(
entity_id=entity_id,
context=context,
sleep_time=sleep_time,
service_call_datas=service_data_iterator,
force=force,
max_length=len(service_datas),
attributes=attributes & ~already_applied,
)
def manual_control_event_attribute_to_flags(
manual_control_attribute: bool | str,
) -> LightControlAttributes:
"""Convert manual control event data to light control attributes."""
if isinstance(manual_control_attribute, bool) and manual_control_attribute:
return LightControlAttributes.ALL
if manual_control_attribute == "brightness":
return LightControlAttributes.BRIGHTNESS
if manual_control_attribute == "color":
return LightControlAttributes.COLOR
return LightControlAttributes.NONE
def has_brightness_attribute(
service_data: ServiceData,
) -> bool:
"""Determine whether the service data contains brightness attributes."""
return any(attr in BRIGHTNESS_ATTRS for attr in service_data)
def has_color_attribute(
service_data: ServiceData,
) -> bool:
"""Determine whether the service data contains color attributes."""
return any(attr in COLOR_ATTRS for attr in service_data)
def has_effect_attribute(
service_data: ServiceData,
) -> bool:
"""Determine whether the service data contains effect attributes."""
return ATTR_FLASH in service_data or ATTR_EFFECT in service_data
def get_light_control_attributes(
service_data: ServiceData,
) -> LightControlAttributes:
"""Get the light control attributes affected by the service call data."""
parameters = LightControlAttributes.NONE
if has_brightness_attribute(service_data):
parameters |= LightControlAttributes.BRIGHTNESS
if has_color_attribute(service_data):
parameters |= LightControlAttributes.COLOR
if has_effect_attribute(service_data):
parameters |= LightControlAttributes.BRIGHTNESS
parameters |= LightControlAttributes.COLOR
return parameters

View file

@ -0,0 +1,610 @@
"""Switch for the Adaptive Lighting integration."""
from __future__ import annotations
import bisect
import colorsys
import datetime
import logging
import math
from dataclasses import dataclass
from datetime import UTC, timedelta
from enum import Enum
from functools import cached_property, partial
from typing import Any, Literal, cast
import astral.sun
from homeassistant.util.color import (
color_RGB_to_xy,
color_temperature_to_rgb,
color_xy_to_hs,
)
class SunEvent(str, Enum):
"""A set of sun events that happen during a day."""
# Same as homeassistant.const.SUN_EVENT_SUNRISE and homeassistant.const.SUN_EVENT_SUNSET
# We re-define them here to not depend on homeassistant in this file.
SUNRISE = "sunrise"
SUNSET = "sunset"
NOON = "solar_noon"
MIDNIGHT = "solar_midnight"
_ORDER = (SunEvent.SUNRISE, SunEvent.NOON, SunEvent.SUNSET, SunEvent.MIDNIGHT)
_ALLOWED_ORDERS = {_ORDER[i:] + _ORDER[:i] for i in range(len(_ORDER))}
# On polar days without a sunrise/sunset, synthetic sun events are placed this
# far from solar noon (polar night) or solar midnight (midnight sun), giving a
# 1-hour synthetic "day" or "night" so the adaptation cycle keeps working.
_POLAR_SUN_EVENT_OFFSET = timedelta(minutes=30)
_POLAR_SUN_EVENT_EPSILON = timedelta(seconds=1)
utcnow: partial[datetime.datetime] = partial(datetime.datetime.now, UTC)
utcnow.__doc__ = "Get now in UTC time."
_LOGGER = logging.getLogger(__name__)
@dataclass(frozen=True)
class SunEvents:
"""Track the state of the sun and associated light settings."""
name: str
astral_observer: astral.Observer
sunrise_time: datetime.time | None
min_sunrise_time: datetime.time | None
max_sunrise_time: datetime.time | None
sunset_time: datetime.time | None
min_sunset_time: datetime.time | None
max_sunset_time: datetime.time | None
sunrise_offset: datetime.timedelta = datetime.timedelta()
sunset_offset: datetime.timedelta = datetime.timedelta()
timezone: datetime.tzinfo = UTC
def _astral_sunrise_or_sunset(
self,
dt: datetime.date,
event: Literal[SunEvent.SUNRISE, SunEvent.SUNSET],
offset: datetime.timedelta,
) -> datetime.datetime:
"""Return the astral sunrise/sunset, with a fallback for polar regions.
Above the polar circle the sun never crosses the horizon during polar
night and midnight sun, and `astral` raises a `ValueError` (see #1485).
On such days, synthesize a 1-hour "day" around solar noon (polar night)
or a 1-hour "night" around solar midnight (midnight sun), so the
adaptation cycle keeps working. The `(min/max)_(sunrise/sunset)_time`
options are applied on top of these synthetic times and can be used to
shape the resulting schedule. Configured offsets are limited to the
surrounding solar midnight/noon interval so they cannot invert the
required event order.
"""
astral_event = (
astral.sun.sunrise if event == SunEvent.SUNRISE else astral.sun.sunset
)
try:
return astral_event(self.astral_observer, dt) + offset
except ValueError:
noon = astral.sun.noon(self.astral_observer, dt)
midnight = astral.sun.midnight(self.astral_observer, dt)
next_midnight = astral.sun.midnight(
self.astral_observer,
dt + timedelta(days=1),
)
noon_elevation = astral.sun.elevation(self.astral_observer, noon)
midnight_elevation = astral.sun.elevation(self.astral_observer, midnight)
# The sum of the sun's highest and lowest elevation of the day is
# ≈2x the solar declination, so its sign robustly distinguishes
# midnight sun from polar night, even on the boundary days where
# one elevation hovers around the horizon.
if noon_elevation + midnight_elevation > 0:
# Midnight sun: the sun stays above the horizon all day.
synthetic = (
midnight + _POLAR_SUN_EVENT_OFFSET
if event == SunEvent.SUNRISE
else next_midnight - _POLAR_SUN_EVENT_OFFSET
)
else:
# Polar night: the sun stays below the horizon all day.
sign = -1 if event == SunEvent.SUNRISE else 1
synthetic = noon + sign * _POLAR_SUN_EVENT_OFFSET
lower, upper = (
(midnight, noon) if event == SunEvent.SUNRISE else (noon, next_midnight)
)
return min(
max(synthetic + offset, lower + _POLAR_SUN_EVENT_EPSILON),
upper - _POLAR_SUN_EVENT_EPSILON,
)
def sunrise(self, dt: datetime.date) -> datetime.datetime:
"""Return the (adjusted) sunrise time for the given datetime."""
sunrise = (
self._astral_sunrise_or_sunset(
dt,
SunEvent.SUNRISE,
self.sunrise_offset,
)
if self.sunrise_time is None
else self._replace_time(dt, self.sunrise_time) + self.sunrise_offset
)
if self.min_sunrise_time is not None:
min_sunrise = self._replace_time(dt, self.min_sunrise_time)
sunrise = max(min_sunrise, sunrise)
if self.max_sunrise_time is not None:
max_sunrise = self._replace_time(dt, self.max_sunrise_time)
sunrise = min(max_sunrise, sunrise)
return sunrise
def sunset(self, dt: datetime.date) -> datetime.datetime:
"""Return the (adjusted) sunset time for the given datetime."""
sunset = (
self._astral_sunrise_or_sunset(
dt,
SunEvent.SUNSET,
self.sunset_offset,
)
if self.sunset_time is None
else self._replace_time(dt, self.sunset_time) + self.sunset_offset
)
if self.min_sunset_time is not None:
min_sunset = self._replace_time(dt, self.min_sunset_time)
sunset = max(min_sunset, sunset)
if self.max_sunset_time is not None:
max_sunset = self._replace_time(dt, self.max_sunset_time)
sunset = min(max_sunset, sunset)
return sunset
def _replace_time(
self,
dt: datetime.date,
time: datetime.time,
) -> datetime.datetime:
date_time = datetime.datetime.combine(dt, time)
dt_with_tz = date_time.replace(tzinfo=self.timezone)
return dt_with_tz.astimezone(UTC)
def noon_and_midnight(
self,
dt: datetime.datetime,
sunset: datetime.datetime | None = None,
sunrise: datetime.datetime | None = None,
) -> tuple[datetime.datetime, datetime.datetime]:
"""Return the (adjusted) noon and midnight times for the given datetime."""
if (
self.sunrise_time is None
and self.sunset_time is None
and self.min_sunrise_time is None
and self.max_sunrise_time is None
and self.min_sunset_time is None
and self.max_sunset_time is None
):
solar_noon = astral.sun.noon(self.astral_observer, dt)
solar_midnight = astral.sun.midnight(self.astral_observer, dt)
return solar_noon, solar_midnight
if sunset is None:
sunset = self.sunset(dt)
if sunrise is None:
sunrise = self.sunrise(dt)
middle = abs(sunset - sunrise) / 2
if sunset > sunrise:
noon = sunrise + middle
midnight = noon + timedelta(hours=12) * (1 if noon.hour < 12 else -1)
else:
midnight = sunset + middle
noon = midnight + timedelta(hours=12) * (1 if midnight.hour < 12 else -1)
return noon, midnight
def sun_events(self, dt: datetime.datetime) -> list[tuple[SunEvent, float]]:
"""Get the four sun event's timestamps at 'dt'."""
sunrise = self.sunrise(dt)
sunset = self.sunset(dt)
solar_noon, solar_midnight = self.noon_and_midnight(dt, sunset, sunrise)
events: list[tuple[SunEvent, float]] = [
(SunEvent.SUNRISE, sunrise.timestamp()),
(SunEvent.SUNSET, sunset.timestamp()),
(SunEvent.NOON, solar_noon.timestamp()),
(SunEvent.MIDNIGHT, solar_midnight.timestamp()),
]
self._validate_sun_event_order(events)
return events
def _validate_sun_event_order(self, events: list[tuple[SunEvent, float]]) -> None:
"""Check if the sun events are in the expected order."""
events = sorted(events, key=lambda x: x[1])
events_names, _ = zip(*events, strict=True)
if events_names not in _ALLOWED_ORDERS:
msg = (
f"{self.name}: The sun events {events_names} are not in the expected"
" order. The Adaptive Lighting integration will not work!"
" This might happen if your sunrise/sunset offset is too large or"
" your manually set sunrise/sunset time is past/before noon/midnight."
)
_LOGGER.error(msg)
raise ValueError(msg)
def prev_and_next_events(
self,
dt: datetime.datetime,
) -> list[tuple[SunEvent, float]]:
"""Get the previous and next sun event."""
events = [
event
for days in [-1, 0, 1]
for event in self.sun_events(dt + timedelta(days=days))
]
events = sorted(events, key=lambda x: x[1])
i_now = bisect.bisect([ts for _, ts in events], dt.timestamp())
return events[i_now - 1 : i_now + 1]
def sun_position(self, dt: datetime.datetime) -> float:
"""Calculate the position of the sun, between [-1, 1]."""
target_ts = dt.timestamp()
(_, prev_ts), (next_event, next_ts) = self.prev_and_next_events(dt)
h, x = (
(prev_ts, next_ts)
if next_event in (SunEvent.SUNSET, SunEvent.SUNRISE)
else (next_ts, prev_ts)
)
# k = -1 between sunset and sunrise (sun below horizon)
# k = 1 between sunrise and sunset (sun above horizon)
k = 1 if next_event in (SunEvent.SUNSET, SunEvent.NOON) else -1
return k * (1 - ((target_ts - h) / (h - x)) ** 2)
def closest_event(
self,
dt: datetime.datetime,
) -> tuple[Literal[SunEvent.SUNRISE, SunEvent.SUNSET], float]:
"""Get the closest sunset or sunrise event."""
(prev_event, prev_ts), (next_event, next_ts) = self.prev_and_next_events(dt)
if SunEvent.SUNRISE in (prev_event, next_event):
ts_event = prev_ts if prev_event == SunEvent.SUNRISE else next_ts
return SunEvent.SUNRISE, ts_event
if SunEvent.SUNSET in (prev_event, next_event):
ts_event = prev_ts if prev_event == SunEvent.SUNSET else next_ts
return SunEvent.SUNSET, ts_event
msg = "No sunrise or sunset event found."
raise ValueError(msg)
@dataclass(frozen=True)
class SunLightSettings:
"""Track the state of the sun and associated light settings."""
name: str
astral_observer: astral.Observer
adapt_until_sleep: bool
max_brightness: int
max_color_temp: int
min_brightness: int
min_color_temp: int
sleep_brightness: int
sleep_rgb_or_color_temp: Literal["color_temp", "rgb_color"]
sleep_color_temp: int
sleep_rgb_color: tuple[int, int, int]
sunrise_time: datetime.time | None
min_sunrise_time: datetime.time | None
max_sunrise_time: datetime.time | None
sunset_time: datetime.time | None
min_sunset_time: datetime.time | None
max_sunset_time: datetime.time | None
brightness_mode_time_dark: datetime.timedelta
brightness_mode_time_light: datetime.timedelta
brightness_mode: Literal["default", "linear", "tanh"] = "default"
sunrise_offset: datetime.timedelta = datetime.timedelta()
sunset_offset: datetime.timedelta = datetime.timedelta()
timezone: datetime.tzinfo = UTC
@cached_property
def sun(self) -> SunEvents:
"""Return the SunEvents object."""
return SunEvents(
name=self.name,
astral_observer=self.astral_observer,
sunrise_time=self.sunrise_time,
sunrise_offset=self.sunrise_offset,
min_sunrise_time=self.min_sunrise_time,
max_sunrise_time=self.max_sunrise_time,
sunset_time=self.sunset_time,
sunset_offset=self.sunset_offset,
min_sunset_time=self.min_sunset_time,
max_sunset_time=self.max_sunset_time,
timezone=self.timezone,
)
def _brightness_pct_default(self, dt: datetime.datetime) -> float:
"""Calculate the brightness percentage using the default method."""
sun_position = self.sun.sun_position(dt)
if sun_position > 0:
return self.max_brightness
delta_brightness = self.max_brightness - self.min_brightness
return (delta_brightness * (1 + sun_position)) + self.min_brightness
def _brightness_pct_tanh(self, dt: datetime.datetime) -> float:
event, ts_event = self.sun.closest_event(dt)
dark = self.brightness_mode_time_dark.total_seconds()
light = self.brightness_mode_time_light.total_seconds()
if event == SunEvent.SUNRISE:
brightness = scaled_tanh(
dt.timestamp() - ts_event,
x1=-dark,
x2=+light,
y1=0.05, # be at 5% of range at x1
y2=0.95, # be at 95% of range at x2
y_min=self.min_brightness,
y_max=self.max_brightness,
)
elif event == SunEvent.SUNSET:
brightness = scaled_tanh(
dt.timestamp() - ts_event,
x1=-light, # shifted timestamp for the start of sunset
x2=+dark, # shifted timestamp for the end of sunset
y1=0.95, # be at 95% of range at the start of sunset
y2=0.05, # be at 5% of range at the end of sunset
y_min=self.min_brightness,
y_max=self.max_brightness,
)
else:
msg = "Unsupported sun event"
raise ValueError(msg)
return clamp(brightness, self.min_brightness, self.max_brightness)
def _brightness_pct_linear(self, dt: datetime.datetime) -> float:
event, ts_event = self.sun.closest_event(dt)
# at ts_event - dt_start, brightness == start_brightness
# at ts_event + dt_end, brightness == end_brightness
dark = self.brightness_mode_time_dark.total_seconds()
light = self.brightness_mode_time_light.total_seconds()
if event == SunEvent.SUNRISE:
brightness = lerp(
dt.timestamp() - ts_event,
x1=-dark,
x2=+light,
y1=self.min_brightness,
y2=self.max_brightness,
)
elif event == SunEvent.SUNSET:
brightness = lerp(
dt.timestamp() - ts_event,
x1=-light,
x2=+dark,
y1=self.max_brightness,
y2=self.min_brightness,
)
else:
msg = "Unsupported sun event"
raise ValueError(msg)
return clamp(brightness, self.min_brightness, self.max_brightness)
def brightness_pct(self, dt: datetime.datetime, is_sleep: bool) -> float | None:
"""Calculate the brightness in %."""
if is_sleep:
return self.sleep_brightness
assert self.brightness_mode in ("default", "linear", "tanh")
if self.brightness_mode == "default":
return self._brightness_pct_default(dt)
if self.brightness_mode == "linear":
return self._brightness_pct_linear(dt)
if self.brightness_mode == "tanh":
return self._brightness_pct_tanh(dt)
return None
def color_temp_kelvin(self, sun_position: float) -> int:
"""Calculate the color temperature in Kelvin."""
if sun_position > 0:
delta = self.max_color_temp - self.min_color_temp
ct = (delta * sun_position) + self.min_color_temp
return 5 * round(ct / 5) # round to nearest 5
if sun_position == 0 or not self.adapt_until_sleep:
return self.min_color_temp
if self.adapt_until_sleep and sun_position < 0:
delta = abs(self.min_color_temp - self.sleep_color_temp)
ct = (delta * abs(1 + sun_position)) + self.sleep_color_temp
return 5 * round(ct / 5) # round to nearest 5
msg = "Should not happen"
raise ValueError(msg)
def brightness_and_color(
self,
dt: datetime.datetime,
is_sleep: bool,
) -> dict[str, Any]:
"""Calculate the brightness and color."""
sun_position = self.sun.sun_position(dt)
rgb_color: tuple[int, int, int]
# Variable `force_rgb_color` is needed for RGB color after sunset (if enabled)
force_rgb_color = False
brightness_pct = self.brightness_pct(dt, is_sleep)
if is_sleep:
color_temp_kelvin = self.sleep_color_temp
rgb_color = self.sleep_rgb_color
elif (
self.sleep_rgb_or_color_temp == "rgb_color"
and self.adapt_until_sleep
and sun_position < 0
):
# Feature requested in
# https://github.com/basnijholt/adaptive-lighting/issues/624
# This will result in a perceptible jump in color at sunset and sunrise
# because the `color_temperature_to_rgb` function is not 100% accurate.
min_color_rgb = color_temperature_to_rgb(self.min_color_temp)
rgb_color = lerp_color_hsv(
min_color_rgb,
self.sleep_rgb_color,
sun_position,
)
color_temp_kelvin = self.color_temp_kelvin(sun_position)
force_rgb_color = True
else:
color_temp_kelvin = self.color_temp_kelvin(sun_position)
r, g, b = color_temperature_to_rgb(color_temp_kelvin)
rgb_color = (round(r), round(g), round(b))
# backwards compatibility for versions < 1.3.1 - see #403
color_temp_mired: float = math.floor(1000000 / color_temp_kelvin)
xy_color: tuple[float, float] = color_RGB_to_xy(*rgb_color)
hs_color: tuple[float, float] = color_xy_to_hs(*xy_color)
return {
"brightness_pct": brightness_pct,
"color_temp_kelvin": color_temp_kelvin,
"color_temp_mired": color_temp_mired,
"rgb_color": rgb_color,
"xy_color": xy_color,
"hs_color": hs_color,
"sun_position": sun_position,
"force_rgb_color": force_rgb_color,
}
def get_settings(
self,
is_sleep: bool,
transition: float | None,
) -> dict[str, float | int | tuple[float, float] | tuple[float, float, float]]:
"""Get all light settings.
Calculating all values takes <0.5ms.
"""
dt = utcnow() + timedelta(seconds=transition or 0)
return self.brightness_and_color(dt, is_sleep)
def find_a_b(x1: float, x2: float, y1: float, y2: float) -> tuple[float, float]:
"""Compute the values of 'a' and 'b' for a scaled and shifted tanh function.
Given two points (x1, y1) and (x2, y2), this function calculates the coefficients 'a' and 'b'
for a tanh function of the form y = 0.5 * (tanh(a * (x - b)) + 1) that passes through these points.
The derivation is as follows:
1. Start with the equation of the tanh function:
y = 0.5 * (tanh(a * (x - b)) + 1)
2. Rearrange the equation to isolate tanh:
tanh(a * (x - b)) = 2*y - 1
3. Take the inverse tanh (or artanh) on both sides to solve for 'a' and 'b':
a * (x - b) = artanh(2*y - 1)
4. Plug in the points (x1, y1) and (x2, y2) to get two equations.
Using these, we can solve for 'a' and 'b' as:
a = (artanh(2*y2 - 1) - artanh(2*y1 - 1)) / (x2 - x1)
b = x1 - (artanh(2*y1 - 1) / a)
Parameters
----------
x1
x-coordinate of the first point.
x2
x-coordinate of the second point.
y1
y-coordinate of the first point (should be between 0 and 1).
y2
y-coordinate of the second point (should be between 0 and 1).
Returns
-------
a
Coefficient 'a' for the tanh function.
b
Coefficient 'b' for the tanh function.
Notes
-----
The values of y1 and y2 should lie between 0 and 1, inclusive.
"""
a = (math.atanh(2 * y2 - 1) - math.atanh(2 * y1 - 1)) / (x2 - x1)
b = x1 - (math.atanh(2 * y1 - 1) / a)
return a, b
def scaled_tanh(
x: float,
x1: float,
x2: float,
y1: float = 0.05,
y2: float = 0.95,
y_min: float = 0.0,
y_max: float = 100.0,
) -> float:
"""Apply a scaled and shifted tanh function to a given input.
This function represents a transformation of the tanh function that scales and shifts
the output to lie between y_min and y_max. For values of 'x' close to 'x1' and 'x2'
(used to calculate 'a' and 'b'), the output of this function will be close to 'y_min'
and 'y_max', respectively.
The equation of the function is as follows:
y = y_min + (y_max - y_min) * 0.5 * (tanh(a * (x - b)) + 1)
Parameters
----------
x
The input to the function.
x1
x-coordinate of the first point.
x2
x-coordinate of the second point.
y1
y-coordinate of the first point (should be between 0 and 1). Defaults to 0.05.
y2
y-coordinate of the second point (should be between 0 and 1). Defaults to 0.95.
y_min
The minimum value of the output range. Defaults to 0.
y_max
The maximum value of the output range. Defaults to 100.
Returns
-------
float: The output of the function, which lies in the range [y_min, y_max].
"""
a, b = find_a_b(x1, x2, y1, y2)
return y_min + (y_max - y_min) * 0.5 * (math.tanh(a * (x - b)) + 1)
def lerp_color_hsv(
rgb1: tuple[float, float, float],
rgb2: tuple[float, float, float],
t: float,
) -> tuple[int, int, int]:
"""Linearly interpolate between two RGB colors in HSV color space."""
t = abs(t)
assert 0 <= t <= 1
# Convert RGB to HSV
hsv1 = colorsys.rgb_to_hsv(*[x / 255.0 for x in rgb1])
hsv2 = colorsys.rgb_to_hsv(*[x / 255.0 for x in rgb2])
# Linear interpolation in HSV space
hsv = (
hsv1[0] + t * (hsv2[0] - hsv1[0]),
hsv1[1] + t * (hsv2[1] - hsv1[1]),
hsv1[2] + t * (hsv2[2] - hsv1[2]),
)
# Convert back to RGB
rgb = tuple(round(x * 255) for x in colorsys.hsv_to_rgb(*hsv))
assert all(0 <= x <= 255 for x in rgb), f"Invalid RGB color: {rgb}"
return cast("tuple[int, int, int]", rgb)
def lerp(x: float, x1: float, x2: float, y1: float, y2: float) -> float:
"""Linearly interpolate between two values."""
return y1 + (x - x1) * (y2 - y1) / (x2 - x1)
def clamp(value: float, minimum: float, maximum: float) -> float:
"""Clamp value between minimum and maximum.
`minimum` is not assumed to be <= `maximum`: a user may intentionally
configure `min_brightness > max_brightness` (or the equivalent for color
temperature) for an inverted timescale (#1421). Sort the bounds first so
that case clamps against the real lower/upper bound instead of
collapsing to `minimum` for every input.
"""
low, high = (minimum, maximum) if minimum <= maximum else (maximum, minimum)
return max(low, min(value, high))

View file

@ -1,37 +1,81 @@
"""Config flow for Adaptive Lighting integration.""" """Config flow for Adaptive Lighting integration."""
import logging
from homeassistant import config_entries import logging
from typing import Any
import voluptuous as vol
from homeassistant import config_entries, data_entry_flow
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import callback from homeassistant.core import callback
import homeassistant.helpers.config_validation as cv from homeassistant.helpers.selector import EntitySelector, EntitySelectorConfig
import voluptuous as vol
from .const import ( # pylint: disable=unused-import from .const import ( # pylint: disable=unused-import
BASIC_OPTIONS,
CONF_LIGHTS, CONF_LIGHTS,
DOMAIN, DOMAIN,
EXTRA_VALIDATION, EXTRA_VALIDATION,
NONE_STR, NONE_STR,
VALIDATION_TUPLES, VALIDATION_TUPLES,
) )
from .switch import _supported_features, validate from .switch import validate
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
OPTIONS_FLOW_DESCRIPTION_PLACEHOLDERS = {
"webapp_url": "https://basnijholt.github.io/adaptive-lighting",
"docs_url": "https://github.com/basnijholt/adaptive-lighting#readme",
}
ADVANCED_OPTIONS_SECTION = "advanced"
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Adaptive Lighting.""" """Handle a config flow for Adaptive Lighting."""
VERSION = 1 VERSION = 1
async def async_step_user(self, user_input=None): source_options: dict[str, Any] | None = None
async def async_step_user(self, user_input: dict[str, Any] | None = None):
"""Handle the initial step.""" """Handle the initial step."""
errors = {} if user_input is None and self._async_current_entries():
return await self.async_step_menu()
return await self.async_step_wait_for_name(user_input)
async def async_step_menu(self, user_input: dict[str, Any] | None = None):
"""Handle the menu step."""
if user_input is not None:
if user_input["action"] != "new":
entry_id = user_input["action"]
entry = self.hass.config_entries.async_get_entry(entry_id)
if entry:
self.source_options = dict(entry.options)
return await self.async_step_wait_for_name()
entries = self._async_current_entries()
options = {"new": "Create new instance"}
for entry in entries:
options[entry.entry_id] = f"Duplicate '{entry.title}'"
return self.async_show_form(
step_id="menu",
data_schema=vol.Schema(
{vol.Required("action", default="new"): vol.In(options)},
),
)
async def async_step_wait_for_name(self, user_input: dict[str, Any] | None = None):
"""Handle the name step."""
errors: dict[str, str] = {}
if user_input is not None: if user_input is not None:
await self.async_set_unique_id(user_input[CONF_NAME]) await self.async_set_unique_id(user_input[CONF_NAME])
self._abort_if_unique_id_configured() self._abort_if_unique_id_configured()
return self.async_create_entry(title=user_input[CONF_NAME], data=user_input) options = self.source_options
return self.async_create_entry(
title=user_input[CONF_NAME],
data=user_input,
options=options,
)
return self.async_show_form( return self.async_show_form(
step_id="user", step_id="user",
@ -39,23 +83,33 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
errors=errors, errors=errors,
) )
async def async_step_import(self, user_input=None): async def async_step_import(self, user_input: dict[str, Any] | None = None):
"""Handle configuration by yaml file.""" """Handle configuration by YAML file."""
if user_input is None:
return self.async_abort(reason="no_data")
await self.async_set_unique_id(user_input[CONF_NAME]) await self.async_set_unique_id(user_input[CONF_NAME])
# Keep a list of switches that are configured via YAML
data = self.hass.data.setdefault(DOMAIN, {})
data.setdefault("__yaml__", set()).add(self.unique_id)
for entry in self._async_current_entries(): for entry in self._async_current_entries():
if entry.unique_id == self.unique_id: if entry.unique_id == self.unique_id:
self.hass.config_entries.async_update_entry(entry, data=user_input) self.hass.config_entries.async_update_entry(entry, data=user_input)
self._abort_if_unique_id_configured() self._abort_if_unique_id_configured()
return self.async_create_entry(title=user_input[CONF_NAME], data=user_input) return self.async_create_entry(title=user_input[CONF_NAME], data=user_input)
@staticmethod @staticmethod
@callback @callback
def async_get_options_flow(config_entry): def async_get_options_flow(
config_entry: config_entries.ConfigEntry, # noqa: ARG004
) -> "OptionsFlowHandler":
"""Get the options flow for this handler.""" """Get the options flow for this handler."""
return OptionsFlowHandler(config_entry) return OptionsFlowHandler()
def validate_options(user_input, errors): def validate_options(user_input: dict[str, Any], errors: dict[str, str]) -> None:
"""Validate the options in the OptionsFlow. """Validate the options in the OptionsFlow.
This is an extra validation step because the validators This is an extra validation step because the validators
@ -75,44 +129,74 @@ def validate_options(user_input, errors):
class OptionsFlowHandler(config_entries.OptionsFlow): class OptionsFlowHandler(config_entries.OptionsFlow):
"""Handle a option flow for Adaptive Lighting.""" """Handle a option flow for Adaptive Lighting."""
def __init__(self, config_entry: config_entries.ConfigEntry): def _flatten_section_input(self, user_input: dict[str, Any]) -> dict[str, Any]:
"""Initialize options flow.""" """Flatten section input by merging nested 'advanced' dict into top level."""
self.config_entry = config_entry flat_input: dict[str, Any] = {}
for key, value in user_input.items():
if key == ADVANCED_OPTIONS_SECTION and isinstance(value, dict):
flat_input.update(value)
else:
flat_input[key] = value
return flat_input
async def async_step_init(self, user_input=None): async def async_step_init(self, user_input: dict[str, Any] | None = None):
"""Handle options flow.""" """Handle options flow with collapsible sections."""
conf = self.config_entry conf = self.config_entry
data = validate(conf) data = validate(conf)
form_data = {**conf.data, **conf.options}
if conf.source == config_entries.SOURCE_IMPORT: if conf.source == config_entries.SOURCE_IMPORT:
return self.async_show_form(step_id="init", data_schema=None) return self.async_show_form(
errors = {} step_id="init",
data_schema=None,
description_placeholders=OPTIONS_FLOW_DESCRIPTION_PLACEHOLDERS,
)
errors: dict[str, str] = {}
if user_input is not None: if user_input is not None:
validate_options(user_input, errors) flat_input = self._flatten_section_input(user_input)
validate_options(flat_input, errors)
if not errors: if not errors:
return self.async_create_entry(title="", data=user_input) return self.async_create_entry(title="", data=flat_input)
data.update(flat_input)
form_data.update(flat_input)
all_lights = [ # Validate that all configured lights still exist
light all_lights = set(self.hass.states.async_entity_ids("light"))
for light in self.hass.states.async_entity_ids("light")
if _supported_features(self.hass, light)
]
for configured_light in data[CONF_LIGHTS]: for configured_light in data[CONF_LIGHTS]:
if configured_light not in all_lights: if configured_light not in all_lights:
errors = {CONF_LIGHTS: "entity_missing"} errors[CONF_LIGHTS] = "entity_missing"
_LOGGER.error( _LOGGER.error(
"%s: light entity %s is configured, but was not found", "%s: light entity %s is configured, but was not found",
data[CONF_NAME], data[CONF_NAME],
configured_light, configured_light,
) )
all_lights.append(configured_light)
to_replace = {CONF_LIGHTS: cv.multi_select(sorted(all_lights))}
options_schema = {} to_replace: dict[str, Any] = {
CONF_LIGHTS: EntitySelector(
EntitySelectorConfig(
domain="light",
multiple=True,
),
),
}
basic_schema: dict[vol.Marker, Any] = {}
advanced_schema: dict[vol.Marker, Any] = {}
for name, default, validation in VALIDATION_TUPLES: for name, default, validation in VALIDATION_TUPLES:
key = vol.Optional(name, default=conf.options.get(name, default)) key = vol.Optional(name, default=form_data.get(name, default))
value = to_replace.get(name, validation) schema = basic_schema if name in BASIC_OPTIONS else advanced_schema
options_schema[key] = value schema[key] = to_replace.get(name, validation)
full_schema = {
**basic_schema,
vol.Required(ADVANCED_OPTIONS_SECTION): data_entry_flow.section(
vol.Schema(advanced_schema),
data_entry_flow.SectionConfig(collapsed=True),
),
}
return self.async_show_form( return self.async_show_form(
step_id="init", data_schema=vol.Schema(options_schema), errors=errors step_id="init",
data_schema=vol.Schema(full_schema),
errors=errors,
description_placeholders=OPTIONS_FLOW_DESCRIPTION_PLACEHOLDERS,
) )

View file

@ -1,9 +1,14 @@
"""Constants for the Adaptive Lighting integration.""" """Constants for the Adaptive Lighting integration."""
from homeassistant.components.light import VALID_TRANSITION from datetime import timedelta
from homeassistant.helpers import selector from enum import Enum
from typing import Any
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
import voluptuous as vol import voluptuous as vol
from homeassistant.components.light import VALID_TRANSITION
from homeassistant.const import CONF_ENTITY_ID
from homeassistant.helpers import selector
ICON_MAIN = "mdi:theme-light-dark" ICON_MAIN = "mdi:theme-light-dark"
ICON_BRIGHTNESS = "mdi:brightness-4" ICON_BRIGHTNESS = "mdi:brightness-4"
@ -11,27 +16,35 @@ ICON_COLOR_TEMP = "mdi:sun-thermometer"
ICON_SLEEP = "mdi:sleep" ICON_SLEEP = "mdi:sleep"
DOMAIN = "adaptive_lighting" DOMAIN = "adaptive_lighting"
SUN_EVENT_NOON = "solar_noon"
SUN_EVENT_MIDNIGHT = "solar_midnight"
DOCS = {}
class TakeOverControlMode(Enum):
"""Modes for pausing adaptation when control of a light is taken over externally."""
PAUSE_ALL = "pause_all"
PAUSE_CHANGED = "pause_changed"
DOCS = {CONF_ENTITY_ID: "Entity ID of the switch. 📝"}
CONF_NAME, DEFAULT_NAME = "name", "default" CONF_NAME, DEFAULT_NAME = "name", "default"
DOCS[CONF_NAME] = "Display name for this switch. 📝" DOCS[CONF_NAME] = "Display name for this switch. 📝"
CONF_LIGHTS, DEFAULT_LIGHTS = "lights", [] CONF_LIGHTS, DEFAULT_LIGHTS = "lights", []
DOCS[CONF_LIGHTS] = ( DOCS[CONF_LIGHTS] = "List of light entity_ids to be controlled (may be empty). 🌟"
"List of light entities to be controlled by Adaptive " "Lighting (may be empty). 🌟"
)
CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES = ( CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES = (
"detect_non_ha_changes", "detect_non_ha_changes",
False, False,
) )
DOCS[CONF_DETECT_NON_HA_CHANGES] = ( DOCS[CONF_DETECT_NON_HA_CHANGES] = (
"Detect non-`light.turn_on` state changes and stop adapting lights. " "Detects and halts adaptations for non-`light.turn_on` state changes. "
"Requires `take_over_control`. 🕵️" "Needs `take_over_control` enabled. 🕵️ "
"Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result "
"in lights turning on unexpectedly. "
"Note that this calls `homeassistant.update_entity` every `interval`! "
"Disable this feature if you encounter such issues."
) )
CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES = ( CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES = (
@ -45,11 +58,14 @@ DOCS[CONF_INCLUDE_CONFIG_IN_ATTRIBUTES] = (
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1 CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1
DOCS[CONF_INITIAL_TRANSITION] = ( DOCS[CONF_INITIAL_TRANSITION] = (
"Duration of the first transition when lights turn " "from `off` to `on`. ⏲️" "Duration of the first transition when lights turn "
"from `off` to `on` in seconds. ⏲️"
) )
CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION = "sleep_transition", 1 CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION = "sleep_transition", 1
DOCS[CONF_SLEEP_TRANSITION] = "Duration of transition when 'sleep mode' is toggled. 😴" DOCS[CONF_SLEEP_TRANSITION] = (
'Duration of transition when "sleep mode" is toggled in seconds. 😴'
)
CONF_INTERVAL, DEFAULT_INTERVAL = "interval", 90 CONF_INTERVAL, DEFAULT_INTERVAL = "interval", 90
DOCS[CONF_INTERVAL] = "Frequency to adapt the lights, in seconds. 🔄" DOCS[CONF_INTERVAL] = "Frequency to adapt the lights, in seconds. 🔄"
@ -72,10 +88,33 @@ DOCS[CONF_ONLY_ONCE] = (
"(`false`). 🔄" "(`false`). 🔄"
) )
CONF_ADAPT_ONLY_ON_BARE_TURN_ON, DEFAULT_ADAPT_ONLY_ON_BARE_TURN_ON = (
"adapt_only_on_bare_turn_on",
False,
)
DOCS[CONF_ADAPT_ONLY_ON_BARE_TURN_ON] = (
"When turning lights on initially. If set to `true`, AL adapts only if `light.turn_on` is "
"invoked without specifying color or brightness. ❌🌈 "
"This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. "
"If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. "
"Needs `take_over_control` enabled. 🕵️"
)
CONF_MANUAL_CONTROL_ON_EXTERNAL_TURN_ON, DEFAULT_MANUAL_CONTROL_ON_EXTERNAL_TURN_ON = (
"manual_control_on_external_turn_on",
False,
)
DOCS[CONF_MANUAL_CONTROL_ON_EXTERNAL_TURN_ON] = (
"Treat turn-ons without a matching Home Assistant `light.turn_on` context as "
"manual control. Normal manual-control resets apply. Still allows "
"`detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️"
)
CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR = "prefer_rgb_color", False CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR = "prefer_rgb_color", False
DOCS[ DOCS[CONF_PREFER_RGB_COLOR] = (
CONF_PREFER_RGB_COLOR "Whether to prefer RGB color adjustment over "
] = "Use RGB color adjustment instead of native light color temperature. 🌈" "light color temperature when possible. 🌈"
)
CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS = ( CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS = (
"separate_turn_on_commands", "separate_turn_on_commands",
@ -87,114 +126,255 @@ DOCS[CONF_SEPARATE_TURN_ON_COMMANDS] = (
) )
CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1 CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1
DOCS[CONF_SLEEP_BRIGHTNESS] = "Brightness of lights in sleep mode. 😴" DOCS[CONF_SLEEP_BRIGHTNESS] = "Brightness percentage of lights in sleep mode. 😴"
CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP = "sleep_color_temp", 1000 CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP = "sleep_color_temp", 1000
DOCS[CONF_SLEEP_COLOR_TEMP] = ( DOCS[CONF_SLEEP_COLOR_TEMP] = (
"Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is " "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is "
"`color_temp`). 😴" "`color_temp`) in Kelvin. 😴"
) )
CONF_SLEEP_RGB_COLOR, DEFAULT_SLEEP_RGB_COLOR = "sleep_rgb_color", [255, 56, 0] CONF_SLEEP_RGB_COLOR, DEFAULT_SLEEP_RGB_COLOR = "sleep_rgb_color", [255, 56, 0]
DOCS[CONF_SLEEP_RGB_COLOR] = ( DOCS[CONF_SLEEP_RGB_COLOR] = (
"RGB color in sleep mode (used when " "`sleep_rgb_or_color_temp` is 'rgb_color'). 🌈" 'RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is "rgb_color"). 🌈'
) )
CONF_SLEEP_RGB_OR_COLOR_TEMP, DEFAULT_SLEEP_RGB_OR_COLOR_TEMP = ( CONF_SLEEP_RGB_OR_COLOR_TEMP, DEFAULT_SLEEP_RGB_OR_COLOR_TEMP = (
"sleep_rgb_or_color_temp", "sleep_rgb_or_color_temp",
"color_temp", "color_temp",
) )
DOCS[ DOCS[CONF_SLEEP_RGB_OR_COLOR_TEMP] = (
CONF_SLEEP_RGB_OR_COLOR_TEMP 'Use either `"rgb_color"` or `"color_temp"` in sleep mode. 🌙'
] = "Use either `'rgb_color'` or `'color_temp'` in sleep mode. 🌙" )
CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0 CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0
DOCS[CONF_SUNRISE_OFFSET] = "Adjust sunrise time with a positive or negative offset. ⏰" DOCS[CONF_SUNRISE_OFFSET] = (
"Adjust sunrise time with a positive or negative offset in seconds. ⏰"
)
CONF_SUNRISE_TIME = "sunrise_time" CONF_SUNRISE_TIME = "sunrise_time"
DOCS[CONF_SUNRISE_TIME] = "Set a fixed time for sunrise. 🌅" DOCS[CONF_SUNRISE_TIME] = "Set a fixed time (HH:MM:SS) for sunrise. 🌅"
CONF_MIN_SUNRISE_TIME = "min_sunrise_time"
DOCS[CONF_MIN_SUNRISE_TIME] = (
"Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅"
)
CONF_MAX_SUNRISE_TIME = "max_sunrise_time" CONF_MAX_SUNRISE_TIME = "max_sunrise_time"
DOCS[CONF_MAX_SUNRISE_TIME] = ( DOCS[CONF_MAX_SUNRISE_TIME] = (
"Set the latest virtual sunrise time, allowing" " for earlier real sunrises. 🌅" "Set the latest virtual sunrise time (HH:MM:SS), allowing"
" for earlier sunrises. 🌅"
) )
CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0 CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0
DOCS[CONF_SUNSET_OFFSET] = "Adjust sunset time with a positive or negative offset. ⏰" DOCS[CONF_SUNSET_OFFSET] = (
"Adjust sunset time with a positive or negative offset in seconds. ⏰"
)
CONF_SUNSET_TIME = "sunset_time" CONF_SUNSET_TIME = "sunset_time"
DOCS[CONF_SUNSET_TIME] = "Set a fixed time for sunset. 🌇" DOCS[CONF_SUNSET_TIME] = "Set a fixed time (HH:MM:SS) for sunset. 🌇"
CONF_MIN_SUNSET_TIME = "min_sunset_time" CONF_MIN_SUNSET_TIME = "min_sunset_time"
DOCS[CONF_MIN_SUNSET_TIME] = ( DOCS[CONF_MIN_SUNSET_TIME] = (
"Set the earliest virtual sunset time, allowing" " for later real sunsets. 🌇" "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇"
)
CONF_MAX_SUNSET_TIME = "max_sunset_time"
DOCS[CONF_MAX_SUNSET_TIME] = (
"Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇"
)
CONF_BRIGHTNESS_MODE, DEFAULT_BRIGHTNESS_MODE = "brightness_mode", "default"
DOCS[CONF_BRIGHTNESS_MODE] = (
"Brightness mode to use. Possible values are `default`, `linear`, and `tanh` "
"(uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈"
)
CONF_BRIGHTNESS_MODE_TIME_DARK, DEFAULT_BRIGHTNESS_MODE_TIME_DARK = (
"brightness_mode_time_dark",
900,
)
DOCS[CONF_BRIGHTNESS_MODE_TIME_DARK] = (
"(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down "
"the brightness before/after sunrise/sunset. 📈📉"
)
CONF_BRIGHTNESS_MODE_TIME_LIGHT, DEFAULT_BRIGHTNESS_MODE_TIME_LIGHT = (
"brightness_mode_time_light",
3600,
)
DOCS[CONF_BRIGHTNESS_MODE_TIME_LIGHT] = (
"(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down "
"the brightness after/before sunrise/sunset. 📈📉."
) )
CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL = "take_over_control", True CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL = "take_over_control", True
DOCS[CONF_TAKE_OVER_CONTROL] = ( DOCS[CONF_TAKE_OVER_CONTROL] = (
"Disable Adaptive Lighting if another source calls `light.turn_on` while lights " "Pause adaptation of individual lights and hand over (manual) control to other sources that "
"are on and being adapted. Note that this calls `homeassistant.update_entity` " "issue `light.turn_on` calls for lights that are on. 🔒"
"every `interval`! 🔒" )
CONF_TAKE_OVER_CONTROL_MODE, DEFAULT_TAKE_OVER_CONTROL_MODE = (
"take_over_control_mode",
TakeOverControlMode.PAUSE_ALL.value,
)
DOCS[CONF_TAKE_OVER_CONTROL_MODE] = (
"The adaptation pausing mode when other sources change brightness and/or color of lights. "
"`pause_all` always pauses both brightness and color adaptation. "
"`pause_changed` pauses the adaptation of only the changed attributes and continues adapting "
"unchanged attributes, e.g., continues color adaptation when only brightness was changed."
) )
CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 45 CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 45
DOCS[CONF_TRANSITION] = "Duration of transition when lights change, in seconds. 🕑" DOCS[CONF_TRANSITION] = "Duration of transition when lights change, in seconds. 🕑"
CONF_ADAPT_UNTIL_SLEEP, DEFAULT_ADAPT_UNTIL_SLEEP = (
"transition_until_sleep",
False,
)
DOCS[CONF_ADAPT_UNTIL_SLEEP] = (
"When enabled, Adaptive Lighting will treat sleep settings as the minimum, "
"transitioning to these values after sunset. 🌙"
)
CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY = "adapt_delay", 0 CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY = "adapt_delay", 0
DOCS[CONF_ADAPT_DELAY] = ( DOCS[CONF_ADAPT_DELAY] = (
"Wait time (seconds) between light turn on and Adaptive Lighting applying " "Wait time (seconds) between light turn on and Adaptive Lighting applying "
"changes. Helps avoid flickering. ⏲️" "changes. Might help to avoid flickering. ⏲️"
) )
CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY = "send_split_delay", 0 CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY = "send_split_delay", 0
DOCS[CONF_SEND_SPLIT_DELAY] = ( DOCS[CONF_SEND_SPLIT_DELAY] = (
"Wait time (milliseconds) between commands when using `separate_turn_on_commands`. " "Delay (ms) between `separate_turn_on_commands` for lights that don't support "
"Helps ensure correct handling. ⏲️" "simultaneous brightness and color setting. ⏲️"
)
CONF_AUTORESET_CONTROL, DEFAULT_AUTORESET_CONTROL = "autoreset_control_seconds", 0
DOCS[CONF_AUTORESET_CONTROL] = (
"Automatically reset the manual control after a number of seconds. "
"Set to 0 to disable. ⏲️"
)
(
CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
DEFAULT_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
) = ("reset_manual_control_on_sleep_mode_change", True)
DOCS[CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE] = (
"Reset manual control when the sleep mode switch is toggled. "
"Set to `false` to preserve manual control across sleep mode changes. 😴"
)
CONF_SKIP_REDUNDANT_COMMANDS, DEFAULT_SKIP_REDUNDANT_COMMANDS = (
"skip_redundant_commands",
False,
)
DOCS[CONF_SKIP_REDUNDANT_COMMANDS] = (
"Skip sending adaptation commands whose target state already "
"equals the light's known state. Minimizes network traffic and improves the "
"adaptation responsivity in some situations. 📉"
"Disable if physical light states get out of sync with HA's recorded state."
)
CONF_INTERCEPT, DEFAULT_INTERCEPT = "intercept", True
DOCS[CONF_INTERCEPT] = (
"Intercept and adapt `light.turn_on` calls to enabling instantaneous color "
"and brightness adaptation. 🏎️ Disable for lights that do not "
"support `light.turn_on` with color and brightness."
)
CONF_MULTI_LIGHT_INTERCEPT, DEFAULT_MULTI_LIGHT_INTERCEPT = (
"multi_light_intercept",
True,
)
DOCS[CONF_MULTI_LIGHT_INTERCEPT] = (
"Intercept and adapt `light.turn_on` calls that target multiple lights. ➗"
"⚠️ This might result in splitting up a single `light.turn_on` call "
"into multiple calls, e.g., when lights are in different switches. "
"Requires `intercept` to be enabled."
)
CONF_EXPAND_LIGHT_GROUPS, DEFAULT_EXPAND_LIGHT_GROUPS = "expand_light_groups", True
DOCS[CONF_EXPAND_LIGHT_GROUPS] = (
"Expand light groups to their members (`true`, default). Set `false` to send "
"commands to the group and track manual control for the group. Explicit member "
"targets in services stay individual targets."
) )
SLEEP_MODE_SWITCH = "sleep_mode_switch" SLEEP_MODE_SWITCH = "sleep_mode_switch"
ADAPT_COLOR_SWITCH = "adapt_color_switch" ADAPT_COLOR_SWITCH = "adapt_color_switch"
ADAPT_BRIGHTNESS_SWITCH = "adapt_brightness_switch" ADAPT_BRIGHTNESS_SWITCH = "adapt_brightness_switch"
ATTR_TURN_ON_OFF_LISTENER = "turn_on_off_listener" ATTR_ADAPTIVE_LIGHTING_MANAGER = "manager"
UNDO_UPDATE_LISTENER = "undo_update_listener" UNDO_UPDATE_LISTENER = "undo_update_listener"
NONE_STR = "None" NONE_STR = "None"
ATTR_ADAPT_COLOR = "adapt_color" ATTR_ADAPT_COLOR = "adapt_color"
DOCS[ATTR_ADAPT_COLOR] = "Whether to adapt the color on supporting lights. 🌈"
ATTR_ADAPT_BRIGHTNESS = "adapt_brightness" ATTR_ADAPT_BRIGHTNESS = "adapt_brightness"
DOCS[ATTR_ADAPT_BRIGHTNESS] = "Whether to adapt the brightness of the light. 🌞"
SERVICE_SET_MANUAL_CONTROL = "set_manual_control" SERVICE_SET_MANUAL_CONTROL = "set_manual_control"
CONF_MANUAL_CONTROL = "manual_control" CONF_MANUAL_CONTROL = "manual_control"
DOCS[CONF_MANUAL_CONTROL] = "Whether to manually control the lights. 🔒"
SERVICE_APPLY = "apply" SERVICE_APPLY = "apply"
CONF_TURN_ON_LIGHTS = "turn_on_lights" CONF_TURN_ON_LIGHTS = "turn_on_lights"
DOCS[CONF_TURN_ON_LIGHTS] = "Whether to turn on lights that are currently off. 🔆"
SERVICE_CHANGE_SWITCH_SETTINGS = "change_switch_settings" SERVICE_CHANGE_SWITCH_SETTINGS = "change_switch_settings"
CONF_USE_DEFAULTS = "use_defaults" CONF_USE_DEFAULTS = "use_defaults"
DOCS[CONF_USE_DEFAULTS] = (
"Sets the default values not specified in this service call. Options: "
'"current" (default, retains current values), "factory" (resets to '
'documented defaults), or "configuration" (reverts to switch config defaults). ⚙️'
)
TURNING_OFF_DELAY = 5 TURNING_OFF_DELAY = 5
DOCS_MANUAL_CONTROL = {
CONF_ENTITY_ID: "The `entity_id` of the switch in which to (un)mark the "
"light as being `manually controlled`. 📝",
CONF_LIGHTS: "entity_id(s) of lights, if not specified, all lights in the "
"switch are selected. 💡",
CONF_MANUAL_CONTROL: 'Whether to add ("true") or remove ("false") all '
'adapted attributes of the light from the "manual_control" list, or the '
"name of an attribute for selective addition. 🔒",
}
def int_between(min_int, max_int): DOCS_APPLY = {
CONF_ENTITY_ID: "The `entity_id` of the switch with the settings to apply. 📝",
CONF_LIGHTS: "A light (or list of lights) to apply the settings to. 💡",
}
# Basic options shown at top level in options flow (not in collapsed section)
BASIC_OPTIONS: set[str] = {
CONF_LIGHTS,
CONF_MIN_BRIGHTNESS,
CONF_MAX_BRIGHTNESS,
CONF_MIN_COLOR_TEMP,
CONF_MAX_COLOR_TEMP,
CONF_SLEEP_BRIGHTNESS,
CONF_SLEEP_COLOR_TEMP,
CONF_TRANSITION,
CONF_INTERVAL,
}
def int_between(min_int: int, max_int: int) -> vol.All:
"""Return an integer between 'min_int' and 'max_int'.""" """Return an integer between 'min_int' and 'max_int'."""
return vol.All(vol.Coerce(int), vol.Range(min=min_int, max=max_int)) return vol.All(vol.Coerce(int), vol.Range(min=min_int, max=max_int))
VALIDATION_TUPLES = [ VALIDATION_TUPLES: list[tuple[str, Any, Any]] = [
(CONF_LIGHTS, DEFAULT_LIGHTS, cv.entity_ids), (CONF_LIGHTS, DEFAULT_LIGHTS, cv.entity_ids), # type: ignore[arg-type]
(CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR, bool),
(CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES, bool),
(CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION, VALID_TRANSITION),
(CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION, VALID_TRANSITION),
(CONF_TRANSITION, DEFAULT_TRANSITION, VALID_TRANSITION),
(CONF_INTERVAL, DEFAULT_INTERVAL, cv.positive_int), (CONF_INTERVAL, DEFAULT_INTERVAL, cv.positive_int),
(CONF_TRANSITION, DEFAULT_TRANSITION, VALID_TRANSITION),
(CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION, VALID_TRANSITION),
(CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS, int_between(1, 100)), (CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS, int_between(1, 100)),
(CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS, int_between(1, 100)), (CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS, int_between(1, 100)),
(CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP, int_between(1000, 10000)), (CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP, int_between(1000, 10000)),
(CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP, int_between(1000, 10000)), (CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP, int_between(1000, 10000)),
(CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR, bool),
(CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS, int_between(1, 100)), (CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS, int_between(1, 100)),
( (
CONF_SLEEP_RGB_OR_COLOR_TEMP, CONF_SLEEP_RGB_OR_COLOR_TEMP,
DEFAULT_SLEEP_RGB_OR_COLOR_TEMP, DEFAULT_SLEEP_RGB_OR_COLOR_TEMP,
selector.SelectSelector( selector.SelectSelector( # type: ignore[arg-type]
selector.SelectSelectorConfig( selector.SelectSelectorConfig(
options=["color_temp", "rgb_color"], options=["color_temp", "rgb_color"],
multiple=False, multiple=False,
@ -206,24 +386,80 @@ VALIDATION_TUPLES = [
( (
CONF_SLEEP_RGB_COLOR, CONF_SLEEP_RGB_COLOR,
DEFAULT_SLEEP_RGB_COLOR, DEFAULT_SLEEP_RGB_COLOR,
selector.ColorRGBSelector(selector.ColorRGBSelectorConfig()), selector.ColorRGBSelector(selector.ColorRGBSelectorConfig()), # type: ignore[arg-type]
), ),
(CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION, VALID_TRANSITION),
(CONF_ADAPT_UNTIL_SLEEP, DEFAULT_ADAPT_UNTIL_SLEEP, bool),
(CONF_SUNRISE_TIME, NONE_STR, str), (CONF_SUNRISE_TIME, NONE_STR, str),
(CONF_MIN_SUNRISE_TIME, NONE_STR, str),
(CONF_MAX_SUNRISE_TIME, NONE_STR, str), (CONF_MAX_SUNRISE_TIME, NONE_STR, str),
(CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET, int), (CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET, int),
(CONF_SUNSET_TIME, NONE_STR, str), (CONF_SUNSET_TIME, NONE_STR, str),
(CONF_MIN_SUNSET_TIME, NONE_STR, str), (CONF_MIN_SUNSET_TIME, NONE_STR, str),
(CONF_MAX_SUNSET_TIME, NONE_STR, str),
(CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET, int), (CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET, int),
(CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE, bool), (
CONF_BRIGHTNESS_MODE,
DEFAULT_BRIGHTNESS_MODE,
selector.SelectSelector( # type: ignore[arg-type]
selector.SelectSelectorConfig(
options=["default", "linear", "tanh"],
multiple=False,
mode=selector.SelectSelectorMode.DROPDOWN,
),
),
),
(CONF_BRIGHTNESS_MODE_TIME_DARK, DEFAULT_BRIGHTNESS_MODE_TIME_DARK, int),
(CONF_BRIGHTNESS_MODE_TIME_LIGHT, DEFAULT_BRIGHTNESS_MODE_TIME_LIGHT, int),
(CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL, bool), (CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL, bool),
(
CONF_TAKE_OVER_CONTROL_MODE,
DEFAULT_TAKE_OVER_CONTROL_MODE,
selector.SelectSelector( # type: ignore[arg-type]
selector.SelectSelectorConfig(
options=[
TakeOverControlMode.PAUSE_ALL.value,
TakeOverControlMode.PAUSE_CHANGED.value,
],
multiple=False,
mode=selector.SelectSelectorMode.DROPDOWN,
),
),
),
(CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES, bool), (CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES, bool),
(
CONF_AUTORESET_CONTROL,
DEFAULT_AUTORESET_CONTROL,
int_between(0, 365 * 24 * 60 * 60), # 1 year max
),
(CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE, bool),
(CONF_ADAPT_ONLY_ON_BARE_TURN_ON, DEFAULT_ADAPT_ONLY_ON_BARE_TURN_ON, bool),
(
CONF_MANUAL_CONTROL_ON_EXTERNAL_TURN_ON,
DEFAULT_MANUAL_CONTROL_ON_EXTERNAL_TURN_ON,
bool,
),
(
CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
DEFAULT_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
bool,
),
(CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS, bool), (CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS, bool),
(CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY, int_between(0, 10000)), (CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY, int_between(0, 10000)),
(CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, cv.positive_float), (CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, cv.positive_float),
(
CONF_SKIP_REDUNDANT_COMMANDS,
DEFAULT_SKIP_REDUNDANT_COMMANDS,
bool,
),
(CONF_INTERCEPT, DEFAULT_INTERCEPT, bool),
(CONF_MULTI_LIGHT_INTERCEPT, DEFAULT_MULTI_LIGHT_INTERCEPT, bool),
(CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES, bool),
(CONF_EXPAND_LIGHT_GROUPS, DEFAULT_EXPAND_LIGHT_GROUPS, bool),
] ]
def timedelta_as_int(value): def timedelta_as_int(value: timedelta) -> float:
"""Convert a `datetime.timedelta` object to an integer. """Convert a `datetime.timedelta` object to an integer.
This integer can be serialized to json but a timedelta cannot. This integer can be serialized to json but a timedelta cannot.
@ -233,18 +469,22 @@ def timedelta_as_int(value):
# conf_option: (validator, coerce) tuples # conf_option: (validator, coerce) tuples
# these validators cannot be serialized but can be serialized when coerced by coerce. # these validators cannot be serialized but can be serialized when coerced by coerce.
EXTRA_VALIDATION = { EXTRA_VALIDATION: dict[str, tuple[Any, Any]] = {
CONF_INTERVAL: (cv.time_period, timedelta_as_int), CONF_INTERVAL: (cv.time_period, timedelta_as_int),
CONF_SUNRISE_OFFSET: (cv.time_period, timedelta_as_int), CONF_SUNRISE_OFFSET: (cv.time_period, timedelta_as_int),
CONF_SUNRISE_TIME: (cv.time, str), CONF_SUNRISE_TIME: (cv.time, str),
CONF_MIN_SUNRISE_TIME: (cv.time, str),
CONF_MAX_SUNRISE_TIME: (cv.time, str), CONF_MAX_SUNRISE_TIME: (cv.time, str),
CONF_SUNSET_OFFSET: (cv.time_period, timedelta_as_int), CONF_SUNSET_OFFSET: (cv.time_period, timedelta_as_int),
CONF_SUNSET_TIME: (cv.time, str), CONF_SUNSET_TIME: (cv.time, str),
CONF_MIN_SUNSET_TIME: (cv.time, str), CONF_MIN_SUNSET_TIME: (cv.time, str),
CONF_MAX_SUNSET_TIME: (cv.time, str),
CONF_BRIGHTNESS_MODE_TIME_LIGHT: (cv.time_period, timedelta_as_int),
CONF_BRIGHTNESS_MODE_TIME_DARK: (cv.time_period, timedelta_as_int),
} }
def maybe_coerce(key, validation): def maybe_coerce(key: str, validation: Any) -> vol.All | Any:
"""Coerce the validation into a json serializable type.""" """Coerce the validation into a json serializable type."""
validation, coerce = EXTRA_VALIDATION.get(key, (validation, None)) validation, coerce = EXTRA_VALIDATION.get(key, (validation, None))
if coerce is not None: if coerce is not None:
@ -252,7 +492,7 @@ def maybe_coerce(key, validation):
return validation return validation
def replace_none_str(value, replace_with=None): def replace_none_str(value: Any, replace_with: Any | None = None) -> Any:
"""Replace "None" -> replace_with.""" """Replace "None" -> replace_with."""
return value if value != NONE_STR else replace_with return value if value != NONE_STR else replace_with
@ -266,59 +506,45 @@ _DOMAIN_SCHEMA = vol.Schema(
{ {
vol.Optional(key, default=replace_none_str(default, vol.UNDEFINED)): validation vol.Optional(key, default=replace_none_str(default, vol.UNDEFINED)): validation
for key, default, validation in _yaml_validation_tuples for key, default, validation in _yaml_validation_tuples
} },
) )
def _format_voluptuous_instance(instance): def apply_service_schema() -> vol.Schema:
coerce_type = None """Return the schema for the apply service."""
min_val = None return vol.Schema(
max_val = None {
vol.Optional(CONF_ENTITY_ID): cv.entity_ids, # type: ignore[arg-type]
for validator in instance.validators: vol.Optional(CONF_LIGHTS, default=[]): cv.entity_ids, # type: ignore[arg-type]
if isinstance(validator, vol.Coerce): vol.Optional(CONF_TRANSITION): VALID_TRANSITION,
coerce_type = validator.type.__name__ vol.Optional(ATTR_ADAPT_BRIGHTNESS, default=True): cv.boolean,
elif isinstance(validator, (vol.Clamp, vol.Range)): vol.Optional(ATTR_ADAPT_COLOR, default=True): cv.boolean,
min_val = validator.min vol.Optional(CONF_PREFER_RGB_COLOR, default=False): cv.boolean,
max_val = validator.max vol.Optional(CONF_TURN_ON_LIGHTS, default=False): cv.boolean,
},
if min_val is not None and max_val is not None: )
return f"`{coerce_type}` {min_val}-{max_val}"
elif min_val is not None:
return f"`{coerce_type} > {min_val}`"
elif max_val is not None:
return f"`{coerce_type} < {max_val}`"
else:
return f"`{coerce_type}`"
def generate_markdown_table(): def change_switch_settings_schema() -> dict[vol.Marker, Any]:
import pandas as pd """Return the schema for the change_switch_settings service."""
args: dict[vol.Marker, Any] = {
vol.Optional(CONF_USE_DEFAULTS, default="current"): cv.string,
}
# Modifying these after init isn't possible
skip = (CONF_INTERVAL, CONF_NAME, CONF_LIGHTS)
for k, _, valid in VALIDATION_TUPLES:
if k not in skip:
args[vol.Optional(k)] = valid
return args
rows = []
for k, default, type_ in VALIDATION_TUPLES:
description = DOCS[k]
if type_ == cv.entity_ids:
type_ = "list of `entity_id`s"
elif type_ in (bool, int, float, str):
type_ = f"`{type_.__name__}`"
elif isinstance(type_, vol.All):
type_ = _format_voluptuous_instance(type_)
elif isinstance(type_, vol.In):
type_ = f"one of `{type_.container}`"
elif isinstance(type_, selector.SelectSelector):
type_ = f"one of `{type_.config['options']}`"
elif isinstance(type_, selector.ColorRGBSelector):
type_ = "RGB color"
else:
raise ValueError(f"Unknown type: {type_}")
row = {
"Variable name": f"`{k}`",
"Description": description,
"Default": f"`{default}`",
"Type": type_,
}
rows.append(row)
df = pd.DataFrame(rows) SET_MANUAL_CONTROL_SCHEMA = vol.Schema(
return df.to_markdown(index=False) {
vol.Optional(CONF_ENTITY_ID): cv.entity_ids, # type: ignore[arg-type]
vol.Optional(CONF_LIGHTS, default=[]): cv.entity_ids, # type: ignore[arg-type]
vol.Optional(CONF_MANUAL_CONTROL, default=True): vol.Any(
cv.boolean,
vol.In(["brightness", "color"]),
),
},
)

View file

@ -0,0 +1,131 @@
"""Diagnostics support for Adaptive Lighting."""
from typing import Any
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ATTR_COLOR_TEMP_KELVIN,
ATTR_RGB_COLOR,
ATTR_TRANSITION,
)
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import STATE_OFF, STATE_ON, STATE_UNAVAILABLE, STATE_UNKNOWN
from homeassistant.core import HomeAssistant
from .adaptation_utils import LightControlAttributes
from .const import (
ADAPT_BRIGHTNESS_SWITCH,
ADAPT_COLOR_SWITCH,
ATTR_ADAPTIVE_LIGHTING_MANAGER,
DOMAIN,
SLEEP_MODE_SWITCH,
)
from .switch import AdaptiveLightingManager, AdaptiveSwitch
_REPORTABLE_LIGHT_STATES = {
STATE_OFF,
STATE_ON,
STATE_UNAVAILABLE,
STATE_UNKNOWN,
}
_TARGET_ATTRIBUTES = (
ATTR_BRIGHTNESS,
ATTR_COLOR_TEMP_KELVIN,
ATTR_RGB_COLOR,
ATTR_TRANSITION,
)
def _last_adaptation_values(
manager: AdaptiveLightingManager,
light: str,
) -> dict[str, Any] | None:
"""Return latest retained value for each allowlisted adaptation attribute.
Values may come from different commands because the manager merges partial
service data per attribute.
"""
service_data = manager.last_service_data.get(light)
if service_data is None:
return None
target = {
attribute: (
list(service_data[attribute])
if attribute == ATTR_RGB_COLOR
else service_data[attribute]
)
for attribute in _TARGET_ATTRIBUTES
if attribute in service_data
}
return target or None
def _autoreset_seconds(
manager: AdaptiveLightingManager,
light: str,
) -> float | None:
"""Return remaining time for a running global manual-control reset."""
timer = manager.auto_reset_manual_control_timers.get(light)
if timer is None or not timer.is_running():
return None
remaining = timer.remaining_time()
return round(remaining, 3) if remaining > 0 else None
async def async_get_config_entry_diagnostics(
hass: HomeAssistant,
config_entry: ConfigEntry,
) -> dict[str, Any]:
"""Return an allowlisted, on-demand snapshot for one config entry."""
domain_data = hass.data.get(DOMAIN)
if not isinstance(domain_data, dict):
return {"loaded": False}
entry_data = domain_data.get(config_entry.entry_id)
manager = domain_data.get(ATTR_ADAPTIVE_LIGHTING_MANAGER)
if not isinstance(entry_data, dict) or not isinstance(
manager,
AdaptiveLightingManager,
):
return {"loaded": False}
switch = entry_data.get(SWITCH_DOMAIN)
if not isinstance(switch, AdaptiveSwitch):
return {"loaded": False}
lights: dict[str, Any] = {}
for index, light in enumerate(sorted(switch.lights), start=1):
state = hass.states.get(light)
state_value = "missing"
if state is not None:
state_value = (
state.state
if state.state in _REPORTABLE_LIGHT_STATES
else STATE_UNKNOWN
)
manual_control = manager.get_manual_control_attributes(light)
lights[f"light_{index}"] = {
"state": state_value,
"global_manager_manual_control": {
"brightness": bool(
manual_control & LightControlAttributes.BRIGHTNESS,
),
"color": bool(manual_control & LightControlAttributes.COLOR),
},
"global_manager_autoreset_seconds": _autoreset_seconds(manager, light),
"global_manager_last_adaptation_values": _last_adaptation_values(
manager,
light,
),
}
return {
"loaded": True,
"profile_switches": {
"profile": switch.is_on,
"adapt_brightness": entry_data[ADAPT_BRIGHTNESS_SWITCH].is_on,
"adapt_color": entry_data[ADAPT_COLOR_SWITCH].is_on,
"sleep_mode": entry_data[SLEEP_MODE_SWITCH].is_on,
},
"manager_fact_scope": "global_shared_across_profiles",
"lights": lights,
}

View file

@ -0,0 +1,35 @@
"""Documentation generation utilities for Adaptive Lighting.
Provides functions to transform content for the documentation site.
Used by markdown-code-runner to generate documentation pages from README content.
"""
from __future__ import annotations
import re
def _transform_readme_links(content: str) -> str:
"""Transform README internal links to docs site links."""
# Map README anchors to doc pages
link_map = {
"#gear-configuration": "configuration.md",
"#memo-options": "configuration.md#all-options",
"#hammer_and_wrench-services": "services.md",
"#adaptive_lightingapply": "services.md#adaptive_lightingapply",
"#adaptive_lightingset_manual_control": "services.md#adaptive_lightingset_manual_control",
"#adaptive_lightingchange_switch_settings": "services.md#adaptive_lightingchange_switch_settings",
"#robot-automation-examples": "automation-examples.md",
"#sos-troubleshooting": "troubleshooting.md",
"#exclamation-common-problems--solutions": "troubleshooting.md#common-problems-solutions",
"#bar_chart-graphs": "advanced/brightness-modes.md#graphs",
"#bulb-features": "index.md#features",
"#control_knobs-regain-manual-control": "advanced/manual-control.md",
"#eyes-see-also": "see-also.md",
}
for old_link, new_link in link_map.items():
content = content.replace(f"]({old_link})", f"]({new_link})")
# Remove ToC link pattern [[ToC](#...)]
return re.sub(r"\[\[ToC\]\([^)]+\)\]", "", content)

View file

@ -0,0 +1,107 @@
"""Utility functions for HA core."""
import logging
from collections.abc import Awaitable, Callable
from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.helpers.target import async_extract_referenced_entity_ids
from homeassistant.util.read_only_dict import ReadOnlyDict
try:
from homeassistant.helpers.target import TargetSelection
except ImportError: # Compatibility with older Home Assistant releases
from homeassistant.helpers.target import TargetSelectorData as TargetSelection
from .adaptation_utils import ServiceData
_LOGGER = logging.getLogger(__name__)
def target_entities(
hass: HomeAssistant,
service_data: ServiceData,
) -> set[str]:
"""Resolve all directly and indirectly targeted entities without groups."""
selected = async_extract_referenced_entity_ids(
hass,
TargetSelection(service_data),
expand_group=False,
)
return selected.referenced | selected.indirectly_referenced
def setup_service_call_interceptor(
hass: HomeAssistant,
domain: str,
service: str,
intercept_func: Callable[[ServiceCall, ServiceData], Awaitable[None] | None],
) -> Callable[[], None]:
"""Inject a function into a registered service call to preprocess service data.
The injected interceptor function receives the service call and a writeable data dictionary
(the data of the service call is read-only) before the service call is executed.
"""
try:
# HACK: Access protected attribute of HA service registry.
# This is necessary to replace a registered service handler with our
# proxy handler to intercept calls.
registered_services = (
hass.services._services # pylint: disable=protected-access # type: ignore[attr-defined]
)
except AttributeError as error:
msg = (
"Intercept failed because registered services are no longer"
" accessible (internal API may have changed)"
)
raise RuntimeError(msg) from error
if domain not in registered_services or service not in registered_services[domain]:
msg = f"Intercept failed because service {domain}.{service} is not registered"
raise RuntimeError(msg)
existing_service = registered_services[domain][service]
async def service_func_proxy(call: ServiceCall) -> None:
try:
# Convert read-only data to writeable dictionary for modification by interceptor
data = dict(call.data)
# Call interceptor
result = intercept_func(call, data)
if result is not None:
await result
# Convert data back to read-only
call.data = ReadOnlyDict(data)
except Exception:
# Blindly catch all exceptions to avoid breaking light.turn_on
_LOGGER.exception(
"Error for call '%s' in service_func_proxy",
call.data,
)
# Call original service handler with processed data
import asyncio
target = existing_service.job.target
if asyncio.iscoroutinefunction(target):
await target(call)
else:
target(call)
hass.services.async_register(
domain,
service,
service_func_proxy,
existing_service.schema,
)
def remove() -> None:
# Remove the interceptor by reinstalling the original service handler
hass.services.async_register(
domain,
service,
existing_service.job.target,
existing_service.schema,
)
return remove

View file

@ -0,0 +1,98 @@
"""Helper functions for the Adaptive Lighting custom components."""
from __future__ import annotations
import base64
import math
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from homeassistant.core import HomeAssistant
def clamp(value: float, minimum: float, maximum: float) -> float:
"""Clamp value between minimum and maximum."""
return max(minimum, min(value, maximum))
def int_to_base36(num: int) -> str:
"""Convert an integer to its base-36 representation using numbers and uppercase letters.
Base-36 encoding uses digits 0-9 and uppercase letters A-Z, providing a case-insensitive
alphanumeric representation. The function takes an integer `num` as input and returns
its base-36 representation as a string.
Parameters
----------
num
The integer to convert to base-36.
Returns
-------
str
The base-36 representation of the input integer.
Examples
--------
>>> num = 123456
>>> base36_num = int_to_base36(num)
>>> print(base36_num)
'2N9'
"""
alphanumeric_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if num == 0:
return alphanumeric_chars[0]
base36_str = ""
base = len(alphanumeric_chars)
while num:
num, remainder = divmod(num, base)
base36_str = alphanumeric_chars[remainder] + base36_str
return base36_str
def short_hash(string: str, length: int = 4) -> str:
"""Create a hash of 'string' with length 'length'."""
return base64.b32encode(string.encode()).decode("utf-8").zfill(length)[:length]
def remove_vowels(input_str: str, length: int = 4) -> str:
"""Remove vowels from a string and return a string of length 'length'."""
vowels = "aeiouAEIOU"
output_str = "".join([char for char in input_str if char not in vowels])
return output_str.zfill(length)[:length]
def color_difference_redmean(
rgb1: tuple[float, float, float],
rgb2: tuple[float, float, float],
) -> float:
"""Distance between colors in RGB space (redmean metric).
The maximal distance between (255, 255, 255) and (0, 0, 0) 765.
Sources:
- https://en.wikipedia.org/wiki/Color_difference#Euclidean
- https://www.compuphase.com/cmetric.htm
"""
r_hat = (rgb1[0] + rgb2[0]) / 2
delta_r, delta_g, delta_b = (
(col1 - col2) for col1, col2 in zip(rgb1, rgb2, strict=True)
)
red_term = (2 + r_hat / 256) * delta_r**2
green_term = 4 * delta_g**2
blue_term = (2 + (255 - r_hat) / 256) * delta_b**2
return math.sqrt(red_term + green_term + blue_term)
def get_friendly_name(hass: HomeAssistant, entity_id: str) -> str:
"""Retrieve the friendly name of an entity."""
state = hass.states.get(entity_id)
if state and hasattr(state, "attributes"):
attributes: dict[str, Any] = dict(getattr(state, "attributes", {}))
return attributes.get("friendly_name", entity_id)
return entity_id

View file

@ -1,12 +1,12 @@
{ {
"domain": "adaptive_lighting", "domain": "adaptive_lighting",
"name": "Adaptive Lighting", "name": "Adaptive Lighting",
"codeowners": ["@basnijholt", "@RubenKelevra", "@th3w1zard1"], "codeowners": ["@basnijholt", "@RubenKelevra", "@th3w1zard1", "@protyposis"],
"config_flow": true, "config_flow": true,
"dependencies": [], "dependencies": ["light"],
"documentation": "https://github.com/basnijholt/adaptive-lighting#readme", "documentation": "https://github.com/basnijholt/adaptive-lighting#readme",
"iot_class": "calculated", "iot_class": "calculated",
"issue_tracker": "https://github.com/basnijholt/adaptive-lighting/issues", "issue_tracker": "https://github.com/basnijholt/adaptive-lighting/issues",
"requirements": [], "requirements": ["ulid-transform"],
"version": "1.8.0" "version": "1.32.0"
} }

316
custom_components/adaptive_lighting/services.yaml Executable file → Normal file
View file

@ -1,250 +1,270 @@
# This file is auto-generated by .github/update-services.py.
apply: apply:
description: Applies the current Adaptive Lighting settings to lights. description: Applies the current Adaptive Lighting settings to lights.
fields: fields:
entity_id: entity_id:
description: entity_id of the Adaptive Lighting switch. If not specified, the current Adaptive Lighting switch will be used. description: The `entity_id` of the switch with the settings to apply. 📝
example: switch.adaptive_lighting_default
selector: selector:
entity: entity:
integration: adaptive_lighting integration: adaptive_lighting
domain: switch domain: switch
multiple: false multiple: false
lights: lights:
description: entity_id(s) of lights, if not specified, all lights in the switch are selected. description: A light (or list of lights) to apply the settings to. 💡
example: light.bedroom_ceiling
selector: selector:
entity: entity:
domain: light domain: light
multiple: true multiple: true
transition: transition:
description: Transition of the lights. description: Duration of transition when lights change, in seconds. 🕑
example: 10 example: 10
selector: selector:
text: text: null
adapt_brightness: adapt_brightness:
description: "Adapt the 'brightness', default: true" description: Whether to adapt the brightness of the light. 🌞
example: true example: true
selector: selector:
boolean: boolean: null
adapt_color: adapt_color:
description: "Adapt the color_temp/color_rgb, default: true" description: Whether to adapt the color on supporting lights. 🌈
example: true example: true
selector: selector:
boolean: boolean: null
prefer_rgb_color: prefer_rgb_color:
description: "Prefer to use color_rgb over color_temp if possible, default: false" description: Whether to prefer RGB color adjustment over light color temperature when possible. 🌈
example: false example: false
selector: selector:
boolean: boolean: null
turn_on_lights: turn_on_lights:
description: "Turn on the lights that are off, default: false" description: Whether to turn on lights that are currently off. 🔆
example: false example: false
selector: selector:
boolean: boolean: null
set_manual_control: set_manual_control:
description: Mark whether a light is 'manually controlled'. description: Mark whether a light is 'manually controlled'.
fields: fields:
entity_id: entity_id:
description: entity_id of the Adaptive Lighting switch. If not specified, the current Adaptive Lighting switch will be used. description: The `entity_id` of the switch in which to (un)mark the light as being `manually controlled`. 📝
example: switch.adaptive_lighting_default
selector: selector:
entity: entity:
integration: adaptive_lighting integration: adaptive_lighting
domain: switch domain: switch
multiple: false multiple: false
lights: lights:
description: entity_id(s) of lights, if not specified, all lights in the switch are selected. description: entity_id(s) of lights, if not specified, all lights in the switch are selected. 💡
example: light.bedroom_ceiling
selector: selector:
entity: entity:
domain: light domain: light
multiple: true multiple: true
manual_control: manual_control:
description: "Whether to add ('true') or remove ('false') the light from the 'manual_control' list, default: true" description: Whether to add ("true") or remove ("false") all adapted attributes of the light from the "manual_control" list, or the name of an attribute for selective addition. 🔒
example: true example: true
default: true default: true
selector: selector:
boolean: boolean: null
change_switch_settings: change_switch_settings:
description: "Change any settings you'd like in the switch. All options here are the same as in the config flow." description: Change any settings you'd like in the switch. All options here are the same as in the config flow.
target:
entity:
integration: adaptive_lighting
domain: switch
fields: fields:
entity_id:
description: "entity_id of the Adaptive Lighting switch."
required: true
selector:
entity:
domain: switch
use_defaults: use_defaults:
description: "(default: 'current' for current settings) You can set this to 'factory', 'configuration', or 'current' to reset the variables not being set with this service call. 'current' leaves them as is, 'configuration' resets to whatever already initializes at startup, 'factory' resets to the default values listed in the documentation." description: 'Sets the default values not specified in this service call. Options: "current" (default, retains current values), "factory" (resets to documented defaults), or "configuration" (reverts to switch config defaults). ⚙️'
example: "current" example: current
required: false required: false
default: "current" default: current
selector: selector:
select: select:
options: options:
- "current" - current
- "configuration" - configuration
- "factory" - factory
include_config_in_attributes: include_config_in_attributes:
description: "include_config_in_attributes: All config options will be listed as attributes under the adaptive-lighting switch this integration creates. (default: false)" description: Show all options as attributes on the switch in Home Assistant when set to `true`. 📝
required: false required: false
selector: selector:
boolean: boolean: null
turn_on_lights: turn_on_lights:
description: "Turn on the lights that are off, default: false" description: Whether to turn on lights that are currently off. 🔆
example: false example: false
required: false required: false
selector: selector:
boolean: boolean: null
initial_transition: initial_transition:
description: "initial_transition: When lights turn 'off' to 'on'. (seconds)" description: Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️
example: 1 example: 1
required: false required: false
selector: selector:
text: text: null
sleep_transition: sleep_transition:
description: "sleep_transition: When 'sleep_state' changes. (seconds)" description: Duration of transition when "sleep mode" is toggled in seconds. 😴
example: 1 example: 1
required: false required: false
selector: selector:
text: text: null
max_brightness: max_brightness:
description: "max_brightness: Highest brightness of lights during a cycle. (%)" description: Maximum brightness percentage. 💡
required: false required: false
example: 100 example: 100
selector: selector:
text: text: null
max_color_temp: max_color_temp:
description: "max_color_temp: Coldest hue of the color temperature cycle. (Kelvin)" description: Coldest color temperature in Kelvin. ❄️
required: false required: false
example: 5500 example: 5500
selector: selector:
text: text: null
min_brightness: min_brightness:
description: "min_brightness: Lowest brightness of lights during a cycle. (%)" description: Minimum brightness percentage. 💡
required: false required: false
example: 1 example: 1
selector: selector:
text: text: null
min_color_temp: min_color_temp:
description: "min_color_temp, Warmest hue of the color temperature cycle. (Kelvin)" description: Warmest color temperature in Kelvin. 🔥
required: false required: false
example: 2000 example: 2000
selector: selector:
text: text: null
only_once: only_once:
description: "only_once: Only adapt the lights when turning them on." description: Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄
example: false example: false
required: false required: false
selector: selector:
boolean: boolean: null
prefer_rgb_color: prefer_rgb_color:
description: "prefer_rgb_color: Use 'rgb_color' rather than 'color_temp' when possible." description: Whether to prefer RGB color adjustment over light color temperature when possible. 🌈
required: false required: false
example: false example: false
selector: selector:
boolean: boolean: null
separate_turn_on_commands: expand_light_groups:
description: "separate_turn_on_commands: Separate the commands for each attribute (color, brightness, etc.) in 'light.turn_on' (required for some lights)." description: Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets.
required: false
example: false
selector:
boolean:
send_split_delay:
description: "send_split_delay: wait between commands (milliseconds), when separate_turn_on_commands is used. May ensure that both commands are handled by the bulb correctly."
required: false
example: 0
selector:
boolean:
sleep_brightness:
description: "sleep_brightness, Brightness setting for Sleep Mode. (%)"
required: false
example: 1
selector:
text:
sleep_rgb_or_color_temp:
description: "sleep_rgb_or_color_temp, use 'rgb_color' or 'color_temp'"
required: false
example: "color_temp"
selector:
select:
options:
- "rgb_color"
- "color_temp"
sleep_rgb_color:
description: "sleep_rgb_color, in RGB"
required: false
selector:
color_rgb:
sleep_color_temp:
description: "sleep_color_temp: Color temperature setting for Sleep Mode. (Kelvin)"
required: false
example: 1000
selector:
text:
sunrise_offset:
description: sunrise_offset, in +/- seconds (integer)
required: false
example: 0
selector:
number:
min: 0
max: 86300
sunrise_time:
description: sunrise_time, in 'HH:MM:SS' format (if 'None', it uses the actual sunrise time at your location)
required: false
example: ""
selector:
time:
sunset_offset:
description: sunset_offset, in +/- seconds (integer)
required: false
example: ""
selector:
number:
min: 0
max: 86300
sunset_time:
description: sunset_time, in 'HH:MM:SS' format (if 'None', it uses the actual sunset time at your location)
example: ""
required: false
selector:
time:
max_sunrise_time:
description: "max_sunrise_time: Manual override of the maximum sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)"
example: ""
required: false
selector:
time:
min_sunset_time:
description: "min_sunset_time: Manual override of the minimum sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)"
example: ""
required: false
selector:
time:
take_over_control:
description: "take_over_control: If anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on."
required: false required: false
example: true example: true
selector: selector:
boolean: boolean: null
detect_non_ha_changes: separate_turn_on_commands:
description: "detect_non_ha_changes: detects all >10% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)" description: Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀
required: false required: false
example: false example: false
selector: selector:
boolean: boolean: null
transition: send_split_delay:
description: "Transition time when applying a change to the lights (seconds)" description: Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️
required: false
example: 45
selector:
text:
adapt_delay:
description: "adapt_delay: wait time between light turn on (seconds), and Adaptive Lights applying changes to the light state. May avoid flickering."
required: false required: false
example: 0 example: 0
selector: selector:
text: boolean: null
sleep_brightness:
description: Brightness percentage of lights in sleep mode. 😴
required: false
example: 1
selector:
text: null
sleep_rgb_or_color_temp:
description: Use either `"rgb_color"` or `"color_temp"` in sleep mode. 🌙
required: false
example: color_temp
selector:
select:
options:
- rgb_color
- color_temp
sleep_rgb_color:
description: RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is "rgb_color"). 🌈
required: false
selector:
color_rgb: null
sleep_color_temp:
description: Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴
required: false
example: 1000
selector:
text: null
sunrise_offset:
description: Adjust sunrise time with a positive or negative offset in seconds. ⏰
required: false
example: 0
selector:
number:
min: -86400
max: 86300
sunrise_time:
description: Set a fixed time (HH:MM:SS) for sunrise. 🌅
required: false
example: ''
selector:
time: null
sunset_offset:
description: Adjust sunset time with a positive or negative offset in seconds. ⏰
required: false
example: ''
selector:
number:
min: -86400
max: 86300
sunset_time:
description: Set a fixed time (HH:MM:SS) for sunset. 🌇
example: ''
required: false
selector:
time: null
max_sunrise_time:
description: Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅
example: ''
required: false
selector:
time: null
min_sunset_time:
description: Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇
example: ''
required: false
selector:
time: null
take_over_control:
description: Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒
required: false
example: true
selector:
boolean: null
take_over_control_mode:
description: The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.
required: false
example: pause_changed
selector:
select:
options:
- pause_all
- pause_changed
detect_non_ha_changes:
description: 'Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an ''on'' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.'
required: false
example: false
selector:
boolean: null
manual_control_on_external_turn_on:
description: Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️
required: false
example: false
selector:
boolean: null
transition:
description: Duration of transition when lights change, in seconds. 🕑
required: false
example: 45
selector:
text: null
adapt_delay:
description: Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️
required: false
example: 0
selector:
text: null
autoreset_control_seconds:
description: Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️
required: false
example: 0
selector:
text: null

View file

@ -2,11 +2,18 @@
"config": { "config": {
"step": { "step": {
"user": { "user": {
"title": "Choose a name for the Adaptive Lighting", "title": "Choose a name for the Adaptive Lighting instance",
"description": "Every instance can contain multiple lights!", "description": "Every instance can contain multiple lights!",
"data": { "data": {
"name": "Name" "name": "Name"
} }
},
"menu": {
"title": "Create or Duplicate",
"description": "Do you want to create a new instance or duplicate an existing one?",
"data": {
"action": "Action"
}
} }
}, },
"abort": { "abort": {
@ -17,35 +24,85 @@
"step": { "step": {
"init": { "init": {
"title": "Adaptive Lighting options", "title": "Adaptive Lighting options",
"description": "All settings for a Adaptive Lighting component. The option names correspond with the YAML settings. No options are shown if you have this entry defined in YAML.", "description": "Configure an Adaptive Lighting component. Option names align with the YAML settings. If you've defined this entry in YAML, no options will appear here. For interactive graphs that demonstrate parameter effects, visit [this web app]({webapp_url}). For further details, see the [official documentation]({docs_url}).",
"data": { "data": {
"lights": "lights", "lights": "lights: List of light entity_ids to be controlled (may be empty). 🌟",
"initial_transition": "initial_transition: When lights turn 'off' to 'on'. (seconds)", "interval": "interval",
"include_config_in_attributes": "include_config_in_attributes: All config options will be listed as attributes under the adaptive-lighting switch this integration creates. (default: false)", "transition": "transition",
"sleep_transition": "sleep_transition: When 'sleep_state' changes. (seconds)", "min_brightness": "min_brightness: Minimum brightness percentage. 💡",
"interval": "interval: Time between switch updates. (seconds)", "max_brightness": "max_brightness: Maximum brightness percentage. 💡",
"max_brightness": "max_brightness: Highest brightness of lights during a cycle. (%)", "min_color_temp": "min_color_temp: Warmest color temperature in Kelvin. 🔥",
"max_color_temp": "max_color_temp: Coldest hue of the color temperature cycle. (Kelvin)", "max_color_temp": "max_color_temp: Coldest color temperature in Kelvin. ❄️",
"min_brightness": "min_brightness: Lowest brightness of lights during a cycle. (%)", "sleep_brightness": "sleep_brightness",
"min_color_temp": "min_color_temp, Warmest hue of the color temperature cycle. (Kelvin)", "sleep_color_temp": "sleep_color_temp"
"only_once": "only_once: Only adapt the lights when turning them on.", },
"prefer_rgb_color": "prefer_rgb_color: Use 'rgb_color' rather than 'color_temp' when possible.", "data_description": {
"separate_turn_on_commands": "separate_turn_on_commands: Separate the commands for each attribute (color, brightness, etc.) in 'light.turn_on' (required for some lights).", "interval": "Frequency to adapt the lights, in seconds. 🔄",
"send_split_delay": "send_split_delay: wait between commands (milliseconds), when separate_turn_on_commands is used. May ensure that both commands are handled by the bulb correctly.", "transition": "Duration of transition when lights change, in seconds. 🕑",
"sleep_brightness": "sleep_brightness, Brightness setting for Sleep Mode. (%)", "sleep_brightness": "Brightness percentage of lights in sleep mode. 😴",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, use 'rgb_color' or 'color_temp'", "sleep_color_temp": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴"
"sleep_rgb_color": "sleep_rgb_color, in RGB", },
"sleep_color_temp": "sleep_color_temp: Color temperature setting for Sleep Mode. (Kelvin)", "sections": {
"sunrise_offset": "sunrise_offset: How long before(-) or after(+) to define the sunrise point of the cycle (+/- seconds)", "advanced": {
"sunrise_time": "sunrise_time: Manual override of the sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "name": "Advanced settings",
"max_sunrise_time": "max_sunrise_time: Manual override of the maximum sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "description": "Additional settings for fine-tuning Adaptive Lighting.",
"sunset_offset": "sunset_offset: How long before(-) or after(+) to define the sunset point of the cycle (+/- seconds)", "data": {
"sunset_time": "sunset_time: Manual override of the sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)", "initial_transition": "initial_transition",
"min_sunset_time": "min_sunset_time: Manual override of the minimum sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)", "prefer_rgb_color": "prefer_rgb_color: Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"take_over_control": "take_over_control: If anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on.", "sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp",
"detect_non_ha_changes": "detect_non_ha_changes: detects all >10% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)", "sleep_rgb_color": "sleep_rgb_color",
"transition": "Transition time when applying a change to the lights (seconds)", "sleep_transition": "sleep_transition",
"adapt_delay": "adapt_delay: wait time between light turn on (seconds), and Adaptive Lights applying changes to the light state. May avoid flickering." "transition_until_sleep": "transition_until_sleep: When enabled, Adaptive Lighting will treat sleep settings as the minimum, transitioning to these values after sunset. 🌙",
"sunrise_time": "sunrise_time",
"min_sunrise_time": "min_sunrise_time",
"max_sunrise_time": "max_sunrise_time",
"sunrise_offset": "sunrise_offset",
"sunset_time": "sunset_time",
"min_sunset_time": "min_sunset_time",
"max_sunset_time": "max_sunset_time",
"sunset_offset": "sunset_offset",
"brightness_mode": "brightness_mode",
"brightness_mode_time_dark": "brightness_mode_time_dark",
"brightness_mode_time_light": "brightness_mode_time_light",
"take_over_control": "take_over_control: Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
"take_over_control_mode": "take_over_control_mode",
"detect_non_ha_changes": "detect_non_ha_changes: Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
"autoreset_control_seconds": "autoreset_control_seconds",
"only_once": "only_once: Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: When turning lights on initially. If set to `true`, AL adapts only if `light.turn_on` is invoked without specifying color or brightness. ❌🌈 This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. Needs `take_over_control` enabled. 🕵️",
"manual_control_on_external_turn_on": "manual_control_on_external_turn_on: Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️",
"reset_manual_control_on_sleep_mode_change": "reset_manual_control_on_sleep_mode_change: Reset manual control when the sleep mode switch is toggled. Set to `false` to preserve manual control across sleep mode changes. 😴",
"separate_turn_on_commands": "separate_turn_on_commands: Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
"send_split_delay": "send_split_delay",
"adapt_delay": "adapt_delay",
"skip_redundant_commands": "skip_redundant_commands: Skip sending adaptation commands whose target state already equals the light's known state. Minimizes network traffic and improves the adaptation responsivity in some situations. 📉Disable if physical light states get out of sync with HA's recorded state.",
"intercept": "intercept: Intercept and adapt `light.turn_on` calls to enabling instantaneous color and brightness adaptation. 🏎️ Disable for lights that do not support `light.turn_on` with color and brightness.",
"multi_light_intercept": "multi_light_intercept: Intercept and adapt `light.turn_on` calls that target multiple lights. ➗⚠️ This might result in splitting up a single `light.turn_on` call into multiple calls, e.g., when lights are in different switches. Requires `intercept` to be enabled.",
"include_config_in_attributes": "include_config_in_attributes: Show all options as attributes on the switch in Home Assistant when set to `true`. 📝",
"expand_light_groups": "expand_light_groups: Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets."
},
"data_description": {
"initial_transition": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
"sleep_rgb_or_color_temp": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
"sleep_rgb_color": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
"sleep_transition": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
"sunrise_time": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
"min_sunrise_time": "Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅",
"max_sunrise_time": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
"sunrise_offset": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
"sunset_time": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
"min_sunset_time": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
"max_sunset_time": "Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇",
"sunset_offset": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
"brightness_mode": "Brightness mode to use. Possible values are `default`, `linear`, and `tanh` (uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness before/after sunrise/sunset. 📈📉",
"brightness_mode_time_light": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness after/before sunrise/sunset. 📈📉.",
"take_over_control_mode": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
"autoreset_control_seconds": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
"send_split_delay": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
"adapt_delay": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️"
}
}
} }
} }
}, },
@ -53,5 +110,189 @@
"option_error": "Invalid option", "option_error": "Invalid option",
"entity_missing": "One or more selected light entities are missing from Home Assistant" "entity_missing": "One or more selected light entities are missing from Home Assistant"
} }
},
"services": {
"apply": {
"name": "apply",
"description": "Applies the current Adaptive Lighting settings to lights.",
"fields": {
"entity_id": {
"description": "The `entity_id` of the switch with the settings to apply. 📝",
"name": "entity_id"
},
"lights": {
"description": "A light (or list of lights) to apply the settings to. 💡",
"name": "lights"
},
"transition": {
"description": "Duration of transition when lights change, in seconds. 🕑",
"name": "transition"
},
"adapt_brightness": {
"description": "Whether to adapt the brightness of the light. 🌞",
"name": "adapt_brightness"
},
"adapt_color": {
"description": "Whether to adapt the color on supporting lights. 🌈",
"name": "adapt_color"
},
"prefer_rgb_color": {
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"name": "prefer_rgb_color"
},
"turn_on_lights": {
"description": "Whether to turn on lights that are currently off. 🔆",
"name": "turn_on_lights"
}
}
},
"set_manual_control": {
"name": "set_manual_control",
"description": "Mark whether a light is 'manually controlled'.",
"fields": {
"entity_id": {
"description": "The `entity_id` of the switch in which to (un)mark the light as being `manually controlled`. 📝",
"name": "entity_id"
},
"lights": {
"description": "entity_id(s) of lights, if not specified, all lights in the switch are selected. 💡",
"name": "lights"
},
"manual_control": {
"description": "Whether to add (\"true\") or remove (\"false\") all adapted attributes of the light from the \"manual_control\" list, or the name of an attribute for selective addition. 🔒",
"name": "manual_control"
}
}
},
"change_switch_settings": {
"name": "change_switch_settings",
"description": "Change any settings you'd like in the switch. All options here are the same as in the config flow.",
"fields": {
"use_defaults": {
"description": "Sets the default values not specified in this service call. Options: \"current\" (default, retains current values), \"factory\" (resets to documented defaults), or \"configuration\" (reverts to switch config defaults). ⚙️",
"name": "use_defaults"
},
"include_config_in_attributes": {
"description": "Show all options as attributes on the switch in Home Assistant when set to `true`. 📝",
"name": "include_config_in_attributes"
},
"turn_on_lights": {
"description": "Whether to turn on lights that are currently off. 🔆",
"name": "turn_on_lights"
},
"initial_transition": {
"description": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
"name": "initial_transition"
},
"sleep_transition": {
"description": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
"name": "sleep_transition"
},
"max_brightness": {
"description": "Maximum brightness percentage. 💡",
"name": "max_brightness"
},
"max_color_temp": {
"description": "Coldest color temperature in Kelvin. ❄️",
"name": "max_color_temp"
},
"min_brightness": {
"description": "Minimum brightness percentage. 💡",
"name": "min_brightness"
},
"min_color_temp": {
"description": "Warmest color temperature in Kelvin. 🔥",
"name": "min_color_temp"
},
"only_once": {
"description": "Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
"name": "only_once"
},
"prefer_rgb_color": {
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"name": "prefer_rgb_color"
},
"expand_light_groups": {
"description": "Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets.",
"name": "expand_light_groups"
},
"separate_turn_on_commands": {
"description": "Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
"name": "separate_turn_on_commands"
},
"send_split_delay": {
"description": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
"name": "send_split_delay"
},
"sleep_brightness": {
"description": "Brightness percentage of lights in sleep mode. 😴",
"name": "sleep_brightness"
},
"sleep_rgb_or_color_temp": {
"description": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
"name": "sleep_rgb_or_color_temp"
},
"sleep_rgb_color": {
"description": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
"name": "sleep_rgb_color"
},
"sleep_color_temp": {
"description": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴",
"name": "sleep_color_temp"
},
"sunrise_offset": {
"description": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
"name": "sunrise_offset"
},
"sunrise_time": {
"description": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
"name": "sunrise_time"
},
"sunset_offset": {
"description": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
"name": "sunset_offset"
},
"sunset_time": {
"description": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
"name": "sunset_time"
},
"max_sunrise_time": {
"description": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
"name": "max_sunrise_time"
},
"min_sunset_time": {
"description": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
"name": "min_sunset_time"
},
"take_over_control": {
"description": "Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
"name": "take_over_control"
},
"take_over_control_mode": {
"description": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
"name": "take_over_control_mode"
},
"detect_non_ha_changes": {
"description": "Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
"name": "detect_non_ha_changes"
},
"manual_control_on_external_turn_on": {
"description": "Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️",
"name": "manual_control_on_external_turn_on"
},
"transition": {
"description": "Duration of transition when lights change, in seconds. 🕑",
"name": "transition"
},
"adapt_delay": {
"description": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️",
"name": "adapt_delay"
},
"autoreset_control_seconds": {
"description": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
"name": "autoreset_control_seconds"
}
}
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,44 @@
This license **only** applies to all files in `custom_components/adaptive_lighting/translations/` in the Adaptive Lighting repository.
For these translations we wave copyright and related rights through the CC0 1.0 Universal license.
# Creative Commons CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
### Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
1. **Copyright and Related Rights.** A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
2. **Waiver.** To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
3. **Public License Fallback.** Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
4. **Limitations and Disclaimers.**
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.

View file

@ -0,0 +1,46 @@
{
"services": {
"apply": {
"description": "Pas die huidige Adaptive Lighting-instellings op ligte toe.",
"fields": {
"lights": {
"description": "'n Lig (of lys van ligte) om die instellings op toe te pas. 💡"
}
}
},
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Pas ligte net aan wanneer hulle aangeskakel is (`true`) of hou aan om dit aan te pas (`false`)"
},
"sunrise_offset": {
"description": "Pas sonsopkomstyd aan met 'n positiewe of negatiewe afwyking in sekondes. ⏰"
},
"sunset_offset": {
"description": "Pas sonsondergangtyd aan met 'n positiewe of negatiewe afwyking in sekondes. ⏰"
}
}
}
},
"options": {
"step": {
"init": {
"title": "Aanpasbare beligting opsies",
"data": {},
"data_description": {},
"sections": {
"advanced": {
"data": {
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Wanneer ligte aanvanklik aangeskakel word. As dit op \"true\" gestel is, pas AL slegs aan as \"light.turn_on\" opgeroep word sonder om kleur of helderheid te spesifiseer. ❌🌈 Dit verhoed bv. aanpassing wanneer 'n toneel geaktiveer word. As `onwaar`, pas AL aan ongeag die teenwoordigheid van kleur of helderheid in die aanvanklike `diens_data`. Moet `oorname_beheer` geaktiveer moet word. 🕵️ "
},
"data_description": {
"sunrise_offset": "Pas sonsopkomstyd aan met 'n positiewe of negatiewe afwyking in sekondes. ⏰",
"sunset_offset": "Pas sonsondergangtyd aan met 'n positiewe of negatiewe afwyking in sekondes. ⏰"
}
}
}
}
}
},
"title": "Aanpasbare beligting"
}

View file

@ -0,0 +1,284 @@
{
"title": "Адаптивно осветление",
"config": {
"step": {
"user": {
"title": "Изберете име за инстанцията на Адаптивно осветление",
"description": "Всяка инстанция може да съдържа множество лампи!",
"data": {
"name": "Име"
}
},
"menu": {
"title": "Създай или дублирай",
"description": "Искате ли да създадете нов екземпляр или да дублирате съществуващ?",
"data": {
"action": "Действие"
}
}
},
"abort": {
"already_configured": "Това устройство е вече конфигурирано"
}
},
"options": {
"step": {
"init": {
"title": "Настройки на Адаптивно осветление",
"description": "Конфигурирайте компонент за Адаптивно осветление. Имената на опциите съвпадат с настройките на YAML. Ако сте дефинирали този запис в YAML, няма да се появят опции тук. За интерактивни графики, които демонстрират ефектите на параметрите, посетете [това уеб приложение]({webapp_url}). За повече подробности, вижте [официалната документация]({docs_url}).",
"data": {
"lights": "lights: Списък от entity_ids на лампи за контрол (може да е празен). 🌟",
"interval": "интервал",
"transition": "преход",
"min_brightness": "min_brightness: Минимален процент на яркост. 💡",
"max_brightness": "max_brightness: Максимален процент на яркост. 💡",
"min_color_temp": "min_color_temp: Най-топла цветова температура в Келвини. 🔥",
"max_color_temp": "max_color_temp: Най-студена цветова температура в Келвини. ❄️",
"sleep_brightness": "яркост при сън",
"sleep_color_temp": "цветова температура при сън"
},
"data_description": {
"interval": "Честота за адаптиране на лампите, в секунди. 🔄",
"transition": "Продължителност на прехода, когато лампите се променят, в секунди. 🕑",
"sleep_brightness": "Процент на яркостта на лампите в режим на сън. 😴",
"sleep_color_temp": "Цветова температура в режим на сън (използва се, когато \"sleep_rgb_or_color_temp\" е \"color_temp\") в Келвин. 😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "начален преход",
"prefer_rgb_color": "prefer_rgb_color: Дали да се предпочита RGB цветова корекция пред температура на светлината, когато е възможно. 🌈",
"sleep_rgb_or_color_temp": "RGB или цветова температура при сън",
"sleep_rgb_color": "RGB цвят при сън",
"sleep_transition": "преход при сън",
"transition_until_sleep": "transition_until_sleep: Когато е активирано, Adaptive Lighting ще третира настройките за сън като минимум, преминавайки към тези стойности след залез. 🌙",
"sunrise_time": "време на изгрев",
"min_sunrise_time": "минимално време на изгрев",
"max_sunrise_time": "максимално време на изгрев",
"sunrise_offset": "отместване на изгрева",
"sunset_time": "време на залез",
"min_sunset_time": "минимално време на залез",
"max_sunset_time": "максимално време на залез",
"sunset_offset": "отместване на залеза",
"brightness_mode": "режим на яркост",
"brightness_mode_time_dark": "време на режим на яркост при тъмно",
"brightness_mode_time_light": "време на режим на яркост при светло",
"take_over_control": "take_over_control: Деактивира Adaptive Lighting, ако друг източник извика \"light.turn_on\", докато лампите са включени и се адаптират. Имайте предвид, че това извиква \"homeassistant.update_entity\" на всеки \"interval\"! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Открива и спира адаптации за промени в състоянието, които не са \"light.turn_on\". Изисква \"take_over_control\" активиран. 🕵️ Внимание: ⚠️ Някои лампиможе лъжливо да указват 'включено' състояние, което може да доведе до неочаквано включване на лампите. Деактивирайте тази функция, ако се сблъскате с такива проблеми.",
"autoreset_control_seconds": "секунди за автоматично нулиране на контрола",
"only_once": "only_once: Адаптира лампите само когато са включени (\"true\") или продължава да ги адаптира (\"false\"). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: При първоначално включване на лампите. Ако е зададено на \"true\", Адаптивно Осветление се адаптира само ако е извикано \"light.turn_on\" без указване на цвят или яркост. ❌🌈 Това например предотвратява адаптация при активиране на сцена. Ако е \"false\", Адаптивно Осветление се адаптира независимо от наличието на цвят или яркост в първоначалните \"service_data\". Изисква \"take_over_control\" активиран. 🕵️ ",
"separate_turn_on_commands": "separate_turn_on_commands: Използва отделни \"light.turn_on\" команди за цвят и яркост, необходими за някои типове светлини. 🔀",
"send_split_delay": "забавяне при изпращане на разделени",
"adapt_delay": "забавяне при адаптация",
"skip_redundant_commands": "skip_redundant_commands: Пропуска изпращането на команди за адаптация, чиято целева състояние вече е равно на известното състояние на светлината. Минимизира мрежовия трафик и подобрява отговорността на адаптацията в някои ситуации. 📉Деактивирайте, ако физическите състояния на лампите се разминават с записаното състояние на HA.",
"intercept": "intercept: Прихваща и адаптира \"light.turn_on\" повиквания, позволявайки моментална адаптация на цвета и яркостта. 🏎️ Деактивирайте за светлини, които не поддържат \"light.turn_on\" с цвят и яркост.",
"multi_light_intercept": "multi_light_intercept: Прихваща и адаптира \"light.turn_on\" повиквания, които целят множество светлини. ➗⚠️ Това може да доведе до разделяне на едно \"light.turn_on\" повикване на множество повиквания, например когато лампите са в различни превключватели. Изисква \"intercept\" да бъде активиран.",
"include_config_in_attributes": "include_config_in_attributes: Показва всички опции като атрибути на ключа в Home Assistant, когато е зададено на \"true\". 📝"
},
"data_description": {
"initial_transition": "Продължителност на първия преход, когато лампите преминават от \"off\" на \"on\" в секунди. ⏲️",
"sleep_rgb_or_color_temp": "Използвайте или \"\"rgb_color\"\" или \"\"color_temp\"\" в режим на сън. 🌙",
"sleep_rgb_color": "RGB цвят в режим на сън (използва се, когато \"sleep_rgb_or_color_temp\" е \"rgb_color\"). 🌈",
"sleep_transition": "Продължителност на прехода, когато се превключва \"режим на сън\" в секунди. 😴",
"sunrise_time": "Задайте фиксирано време (HH:MM:SS) за изгрев. 🌅",
"min_sunrise_time": "Задайте най-ранното виртуално време за изгрев (HH:MM:SS), позволяващо по-късни изгреви. 🌅",
"max_sunrise_time": "Задайте най-късното виртуално време за изгрев (HH:MM:SS), позволяващо по-ранни изгреви. 🌅",
"sunrise_offset": "Регулирайте времето на изгрев с положителен или отрицателен отместване в секунди. ⏰",
"sunset_time": "Задайте фиксирано време (HH:MM:SS) за залез. 🌇",
"min_sunset_time": "Задайте най-ранното виртуално време за залез (HH:MM:SS), позволяващо по-късни залези. 🌇",
"max_sunset_time": "Задайте най-късното виртуално време за залез (HH:MM:SS), позволяващо по-ранни залези. 🌇",
"sunset_offset": "Регулирайте времето на залез с положителен или отрицателен отместване в секунди. ⏰",
"brightness_mode": "Режим на яркост за използване. Възможни стойности са \"default\", \"linear\" и \"tanh\" (използва \"brightness_mode_time_dark\" и \"brightness_mode_time_light\"). 📈",
"brightness_mode_time_dark": "(Игнорира се, ако \"brightness_mode='default'\") Продължителност в секунди за увеличаване/намаляване на яркостта преди/след изгрев/залез. 📈📉",
"brightness_mode_time_light": "(Игнорира се, ако \"brightness_mode='default'\") Продължителност в секунди за увеличаване/намаляване на яркостта след/преди изгрев/залез. 📈📉.",
"autoreset_control_seconds": "Автоматично нулиране на ръчния контрол след определен брой секунди. Задайте на 0 за деактивиране. ⏲️",
"send_split_delay": "Забавяне (ms) между \"separate_turn_on_commands\" за светлини, които не поддържат едновременна настройка на яркост и цвят. ⏲️",
"adapt_delay": "Време за изчакване (секунди) между включване на светлината и прилагане на промени от Адаптивно Осветление. Може да помогне за избягване на трептене. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Невалидна опция",
"entity_missing": "Една или повече избрани entity-та на лампилипсват от Home Assistant"
}
},
"services": {
"apply": {
"name": "приложи",
"description": "Прилага текущите настройки за Адаптивно осветление към лампите",
"fields": {
"entity_id": {
"description": "entity_id на ключа с настройките за прилагане. 📝",
"name": "entity_id"
},
"lights": {
"description": "Светлина (или списък от светлини), към които да се приложат настройките. 💡",
"name": "lights"
},
"transition": {
"description": "Продължителност на прехода, когато лампите се променят, в секунди. 🕑",
"name": "transition"
},
"adapt_brightness": {
"description": "Дали да се адаптира яркостта на светлината. 🌞",
"name": "adapt_brightness"
},
"adapt_color": {
"description": "Дали да се адаптира цветът на лампите, които го поддържат. 🌈",
"name": "adapt_color"
},
"prefer_rgb_color": {
"description": "Дали да се предпочита RGB цветова корекция пред температура на светлината, когато е възможно. 🌈",
"name": "prefer_rgb_color"
},
"turn_on_lights": {
"description": "Дали да се включат лампите, които в момента са изключени. 🔆",
"name": "turn_on_lights"
}
}
},
"set_manual_control": {
"name": "set_manual_control",
"description": "Маркирай дали дадена светлина е с 'ръчно контролиранe'.",
"fields": {
"entity_id": {
"description": "entity_id на ключа, в който да се маркира или демаркира светлината като ръчно контролирана. 📝",
"name": "entity_id"
},
"lights": {
"description": "entity_id(та) на лампите, ако не са посочени, всички лампи в ключа се избират. 💡",
"name": "lights"
},
"manual_control": {
"description": "Дали да се добави (\"true\") или премахне (\"false\") светлината от списъка \"manual_control\". 🔒",
"name": "manual_control"
}
}
},
"change_switch_settings": {
"name": "change_switch_settings",
"description": "Променете всички настройки, които искате в ключа. Всички опции тук са същите като в потока на конфигурацията.",
"fields": {
"entity_id": {
"description": "Entity ID на ключа. 📝",
"name": "entity_id"
},
"use_defaults": {
"description": "Задава стойностите по подразбиране, които не са посочени в този обаждане на услугата. Опции: \"current\" (по подразбиране, запазва текущите стойности), \"factory\" (нулира до документирани стойности по подразбиране) или \"configuration\" (връща към стойностите по подразбиране на конфигурацията на превключвателя). ⚙️",
"name": "use_defaults"
},
"include_config_in_attributes": {
"description": "Показва всички опции като атрибути на ключа в Home Assistant, когато е зададено на \"true\". 📝",
"name": "include_config_in_attributes"
},
"turn_on_lights": {
"description": "Дали да се включат лампите, които в момента са изключени. 🔆",
"name": "turn_on_lights"
},
"initial_transition": {
"description": "Продължителност на първия преход, когато лампите преминават от 'изключено' на 'включено' в секунди. ⏲️",
"name": "initial_transition"
},
"sleep_transition": {
"description": "Продължителност на прехода, когато се превключва \"режим на сън\" в секунди. 😴",
"name": "sleep_transition"
},
"max_brightness": {
"description": "Максимален процент на яркост. 💡",
"name": "max_brightness"
},
"max_color_temp": {
"description": "Най-студена цветова температура в Келвини. ❄️",
"name": "max_color_temp"
},
"min_brightness": {
"description": "Минимален процент на яркост. 💡",
"name": "min_brightness"
},
"min_color_temp": {
"description": "Най-топла цветова температура в Келвини. 🔥",
"name": "min_color_temp"
},
"only_once": {
"description": "Адаптира лампите само когато са включени ('true') или продължава да ги адаптира ('false'). 🔄",
"name": "only_once"
},
"prefer_rgb_color": {
"description": "Дали да се предпочита RGB цветова корекция пред температура на светлината, когато е възможно. 🌈",
"name": "prefer_rgb_color"
},
"separate_turn_on_commands": {
"description": "Използвайте отделни light.turn_on повиквания за цвят и яркост, необходими за някои типове светлини. 🔀",
"name": "separate_turn_on_commands"
},
"send_split_delay": {
"description": "Забавяне (милисекунди) между \"separate_turn_on_commands\" за лампи, които не поддържат едновременна настройка на яркост и цвят. ⏲️",
"name": "send_split_delay"
},
"sleep_brightness": {
"description": "Процент на яркостта на лампите в режим на сън. 😴",
"name": "sleep_brightness"
},
"sleep_rgb_or_color_temp": {
"description": "Използвай \"rgb_color\" или \"color_temp\" в режим на сън. 🌙",
"name": "sleep_rgb_or_color_temp"
},
"sleep_rgb_color": {
"description": "RGB цвят в режим на сън (използва се, когато sleep_rgb_or_color_temp е \"rgb_color\"). 🌈",
"name": "sleep_rgb_color"
},
"sleep_color_temp": {
"description": "Цветова температура в режим на сън (използва се, когато sleep_rgb_or_color_temp е \"color_temp\") в Келвини. 😴",
"name": "sleep_color_temp"
},
"sunrise_offset": {
"description": "Коригирайте времето на изгрев с положително или отрицателно отместване в секунди. ⏰",
"name": "sunrise_offset"
},
"sunrise_time": {
"description": "Задайте фиксирано време (HH:MM:SS) за изгрев. 🌅",
"name": "sunrise_time"
},
"sunset_offset": {
"description": "Коригирайте времето на залез с положително или отрицателно отместване в секунди. ⏰",
"name": "sunset_offset"
},
"sunset_time": {
"description": "Задайте фиксирано време (HH:MM:SS) за залез. 🌇",
"name": "sunset_time"
},
"max_sunrise_time": {
"description": "Задайте най-късното виртуално време за изгрев (HH:MM:SS), което позволява по-ранни изгреви. 🌅",
"name": "max_sunrise_time"
},
"min_sunset_time": {
"description": "Задайте най-ранното виртуално време за изгрев (HH:MM:SS), което позволява по-ранни залези. 🌇",
"name": "min_sunset_time"
},
"take_over_control": {
"description": "Деактивирайте адаптивното осветление, ако друг източник извика 'light.turn_on', докато лампите са включени и се адаптират. Обърнете внимание, че това извиква homeassistant.update_entity на всеки interval! 🔒",
"name": "take_over_control"
},
"detect_non_ha_changes": {
"description": "Открива и спира адаптации за промени в състоянието, които не са 'light.turn_on'. Изисква активиран 'take_over_control'. 🕵️ Внимание: ⚠️ Някои лампи може лъжливо да указват състояние ‘включено’, което може да доведе до неочаквано включване на лампите. Деактивирайте тази функция, ако се сблъскате с такива проблеми.",
"name": "detect_non_ha_changes"
},
"transition": {
"description": "Продължителност на прехода, когато лампите се променят, в секунди. 🕑",
"name": "transition"
},
"adapt_delay": {
"description": "Време за изчакване (в секунди) между включването на светлината и прилагането на промените от адаптивното осветление. Може да помогне за избягване на премигване. ⏲️",
"name": "adapt_delay"
},
"autoreset_control_seconds": {
"description": "Автоматично нулиране на ръчното управление след определен брой секунди. Задайте на 0, за да деактивирате. ⏲️",
"name": "autoreset_control_seconds"
}
}
}
}
}

View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,217 @@
{
"title": "Il·luminació Adaptativa",
"options": {
"step": {
"init": {
"data_description": {
"interval": "Freqüència d'adaptació de les llums, en segons. 🔄",
"transition": "Durada de la transició en canviar les llums, en segons. 🕑",
"sleep_brightness": "Percentatge de brillantor dels llums en mode nocturn. 😴",
"sleep_color_temp": "Temperatura de color en mode nocturn (s'utilitza quan `sleep_rgb_or_color_temp` és `color_temp`) en Kelvin. 😴"
},
"title": "Opcions Il·luminació Adaptativa",
"data": {
"lights": "lights: Llista d'entity_ids dels llums a controlar (pot estar buida). 🌟",
"min_brightness": "min_brightness: Percentatge mínim de brillantor. 💡",
"max_brightness": "max_brightness: Percentatge màxim de brillantor. 💡",
"min_color_temp": "min_color_temp: Temperatura de color més càlida en graus Kelvin. 🔥",
"max_color_temp": "max_color_temp: Temperatura de color més freda en graus Kelvin. ❄️"
},
"description": "Configura un component d'Adaptive Lighting. Els noms de les opcions s'alineen amb la configuració de YAML. Si has definit aquesta entrada a YAML, aquí no apareixerà cap opció. Per veure gràfics interactius que demostren efectes de paràmetres, visita [aquesta aplicació web]({webapp_url}). Per a més detalls, pots veure la [documentació oficial]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Si prefereixes l'ajustament del color RGB en lloc de la temperatura de color, quan sigui possible. 🌈",
"transition_until_sleep": "transition_until_sleep: Si s'activa, Adaptive Lighting considerarà els ajustaments del mode nocturn com a mínims, fent una transició cap aquests valors després de la posta de sol. 🌙",
"take_over_control": "take_over_control: Inhabilita Adaptive Lighting si una altra font crida `light.turn_on` quan les llums estan enceses i en procés d'adaptació. Tingues present que això cridarà `homeassistant.update_entity` cada `interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Detecta i atura les adaptacions per als canvis d'estat diferents a `light.turn_on`. Necessita que `take_over_control` estigui habilitat. 🕵️ Precaució: ⚠️ Alguns llums poden indicar falsament un estat \"encès\", cosa que podria provocar que els llums s'encenguin inesperadament. Desactiva aquesta funció si trobes aquests problemes.",
"only_once": "only_once: Adapta els llums només quan s'encenen (`true`) o segueix adaptant-les (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Quan s'encenen les llums inicialment. Si el valor és `true`, AL adapta només si s'ha cridat `light.turn_on` sense especificar color o brillantor. ❌🌈 Això impedeix l'adaptació quan s'activa una escena. Si el valor és `false`, AL adapta independentment de la presencia de color o brillantor en les dades inicials `service_data`. Necessita `take_over_control` habilitat. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Separa les crides de `light.turn_on` per a color i brillantor; necessari per alguns tipus de llums. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Evita l'enviament de d'ordres d'adaptació als objectius on el seu estat ja és el conegut del llum. Minimitza el trànsit de la xarxa i millora la resposta de l'adaptació en alguns casos. 📉 Inhabilita-ho si l'estat físic del llum queda desincronitzat amb l'estat registrat a Home Assistant.",
"intercept": "intercept: Intercepta i adapta les crides `light.turn_on` per permetre canvis instantanis de color i brillantor. 🏎️ Inhabilita-ho per a llums que no admeten `light.turn_on` amb color i brillantor.",
"multi_light_intercept": "multi_light_intercept: Intercepta i adapta les crides `light.turn_on` dirigides a múltiples llums. ➗⚠️ Pot provocar la divisió d'una crida única `light.turn_on` en múltiples crides, com ara, quan les llums són en interruptors diferents. Necessita que `intercept` estigui habilitat.",
"include_config_in_attributes": "include_config_in_attributes: Mostra totes les opcions com atributs a l'interruptor de Home Assistant quan s'estableix com a `true`. 📝"
},
"data_description": {
"initial_transition": "Durada de la primera transició quan els llums canvien de `off` a `on` en segons. ⏲️",
"sleep_rgb_or_color_temp": "Utilitza `\"rgb_color\"` o `\"color_temp\"` durant el mode nocturn. 🌙",
"sleep_rgb_color": "Color RGB en mode nocturn (s'utilitza quan `sleep_rgb_or_color_temp` és \"rgb_color\"). 🌈",
"sleep_transition": "Durada de la transició en commutar el \"mode nocturn\", en segons. 🕑",
"sunrise_time": "Indica una hora fixa (HH:MM:SS) per a la sortida del sol. 🌅",
"min_sunrise_time": "Defineix la sortida de sol virtual més primerenca (HH:MM:SS), tot permetent sortides de sol posteriors. 🌅",
"max_sunrise_time": "Defineix la sortida de sol virtual més tardana (HH:MM:SS), tot permetent sortides de sol abans. 🌅",
"sunrise_offset": "Ajusta l'hora de sortida del sol amb una compensació positiva o negativa en segons. ⏰",
"sunset_time": "Indica una hora fixa (HH:MM:SS) per a la posta de sol. 🌇",
"min_sunset_time": "Defineix la posta de sol virtual més primerenca (HH:MM:SS), tot permetent postes de sol més tard. 🌇",
"max_sunset_time": "Defineix la sortida virtual de sol virtual més tardana (HH:MM:SS), tot permetent sortides de sol abans. 🌇",
"sunset_offset": "Ajusta l'hora de la posta del sol amb una compensació positiva o negativa en segons. ⏰",
"brightness_mode": "Mode de brillantor a utilitzar. Els valors possibles són `default`, \"linear\" i \"tanh\" (utilitza `brightness_mode_time_dark` i `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(S'ignora si `brightness_mode='default'`) La durada en segons de la variació de la brillantor abans/despres de la sortida/posta de sol. 📈📉.",
"brightness_mode_time_light": "(S'ignora si `brightness_mode='default'`) La durada en segons de la variació de la brillantor abans/despres de la sortida/posta de sol. 📈📉.",
"autoreset_control_seconds": "Restableix automàticament el control manual al cap d'uns segons. Posar a 0 per desactivar. ⏲️",
"send_split_delay": "Retard (ms) entre `separate_turn_on_commands` per als llums que no admeten la configuració simultània de brillantor i color. ⏲️",
"adapt_delay": "Temps d'espera (en segons) entre l'encesa de la llum i els canvis per part d'Adaptive Lighting. Pot ajudar a evitar els parpalleigs. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Opció invàlida",
"entity_missing": "Una o més de les entitats de llum seleccionades no es troba a Home Assistant"
}
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Ajustar les llums només quan s'encenguin (`true`) o ajustar contínuament(`false`). 🔄"
},
"sleep_color_temp": {
"description": "Temperatura de color en mode nocturn (s'utilitza quan `sleep_rgb_or_color_temp` és `color_temp`) en Kelvin. 😴"
},
"sunrise_offset": {
"description": "Ajusta l'hora de sortida del sol amb una compensació positiva o negativa en segons. ⏰"
},
"sunset_offset": {
"description": "Ajusta l'hora de la posta del sol amb una compensació positiva o negativa en segons. ⏰"
},
"autoreset_control_seconds": {
"description": "Restableix automàticament el control manual al cap d'uns segons. Posar a 0 per desactivar. ⏲️"
},
"sleep_brightness": {
"description": "Percentatge de brillantor dels llums en mode nocturn. 😴"
},
"max_color_temp": {
"description": "Temperatura de color més freda en Kelvin. ❄️"
},
"send_split_delay": {
"description": "Retard (ms) entre `separate_turn_on_commands` per als llums que no admeten la configuració simultània de brillantor i color. ⏲️"
},
"detect_non_ha_changes": {
"description": "Detecta i atura les adaptacions per als canvis d'estat diferents a `light.turn_on`. Necessita que `take_over_control` estigui habilitat. 🕵️ Precaució: ⚠️ Alguns llums poden indicar falsament un estat \"encès\", cosa que podria provocar que els llums s'encenguin inesperadament. Desactiva aquesta funció si trobes aquests problemes."
},
"take_over_control": {
"description": "Desactiva Adaptive Lighting si una altra font crida `light.turn_on` mentre els llums estan encesos i adaptats. Tingues en compte que això crida `homeassistant.update_entity` cada `interval`! 🔒"
},
"entity_id": {
"description": "ID de la entitat de l'interruptor. 📝"
},
"turn_on_lights": {
"description": "Si s'encenen les llums que estan apagades en aquest moment. 🔆"
},
"initial_transition": {
"description": "Durada de la primera transició quan els llums canvien `off` a `on` en segons. ⏲️"
},
"sleep_transition": {
"description": "Durada de la transició en commutar el \"mode nocturn\", en segons. 🕑"
},
"max_brightness": {
"description": "Percentatge màxim de brillantor. 💡"
},
"min_brightness": {
"description": "Percentatge mínim de brillantor. 💡"
},
"prefer_rgb_color": {
"description": "Si es prefereix ajustar el color RGB en lloc de la temperatura de color, quan sigui possible. 🌈"
},
"min_color_temp": {
"description": "Temperatura de color més càlida, en graus Kelvin. 🔥"
},
"separate_turn_on_commands": {
"description": "Utilitza crides independents per a `light.turn_on` per color i brillantor; necessari per alguns tipus de llums. 🔀"
},
"sleep_rgb_or_color_temp": {
"description": "Utilitza `\"rgb_color\"` o `\"color_temp\"` durant el mode nocturn. 🌙"
},
"sleep_rgb_color": {
"description": "Color RGB en mode nocturn (s'utilitza quan `sleep_rgb_or_color_temp` és \"rgb_color\"). 🌈"
},
"sunrise_time": {
"description": "Indica una hora fixa (HH:MM:SS) per a la sortida del sol. 🌅"
},
"sunset_time": {
"description": "Indica una hora fixa (HH:MM:SS) per a la posta de sol. 🌇"
},
"transition": {
"description": "Durada de la transició en canviar les llums, en segons. 🕑"
},
"adapt_delay": {
"description": "Temps d'espera (en segons) entre l'encesa de la llum i els canvis per part d'Adaptive Lighting. Pot ajudar a evitar els parpalleigs. ⏲️"
},
"use_defaults": {
"description": "Defineix els valors per defecte que no s'especifiquin a la crida del servei. Opcions: \"current\" (per defecte, manté els valors actuals), \"factory\" (restaura els valors documentats per defecte), o \"configuration\" (retorna als valors per defecte de l'interruptor). ⚙️"
},
"include_config_in_attributes": {
"description": "Mostra totes les opcions com a atributs de l'interruptor a Home Assistant quan es defineixi com a `true`. 📝"
},
"max_sunrise_time": {
"description": "Defineix la sortida de sol virtual més tardana (HH:MM:SS), tot permetent sortides de sol abans. 🌅"
},
"min_sunset_time": {
"description": "Defineix la posta de sol virtual més primerenca (HH:MM:SS), tot permetent postes de sol més tard. 🌇"
}
},
"description": "Canvia les opcions de configuració que vulguis al commutador. Totes les opcions d'aquí són les mateixes que en el flux de configuració."
},
"apply": {
"fields": {
"lights": {
"description": "Una llum (o una llista de llums) a la qual aplicar la configuració. 💡"
},
"transition": {
"description": "Durada de la transició en canviar les llums, en segons. 🕑"
},
"prefer_rgb_color": {
"description": "Si es prefereix ajustar el color RGB en lloc de la temperatura de color, quan sigui possible. 🌈"
},
"turn_on_lights": {
"description": "Si s'encenen les llums que estan apagades en aquest moment. 🔆"
},
"entity_id": {
"description": "L'`entity_id` de l'interruptor amb els paràmetres per aplicar. 📝"
},
"adapt_brightness": {
"description": "Si cal adaptar la brillantor del llum. 🌞"
},
"adapt_color": {
"description": "Si cal adaptar el color a les llums que ho admetin. 🌈"
}
},
"description": "Aplica la configuració actual d'Adaptive Lighting a les llums."
},
"set_manual_control": {
"description": "Indica quan una llum està 'controlada manualment'.",
"fields": {
"lights": {
"description": "entity_id(s) de les llums; si no s'especifica es seleccionaran totes les llums de l'interruptor. 💡"
},
"entity_id": {
"description": "L'`entity_id` de l'interruptor al qual (des)marcar el llum com a `manually controlled`. 📝"
},
"manual_control": {
"description": "Si cal afegir (\"true\") o treure (\"false\") el llum de la llista de \"manual_control\". 🔒"
}
}
}
},
"config": {
"step": {
"user": {
"title": "Tria un nom per a la instància d'Adaptive Lighting",
"description": "Cada instància pot contenir múltiples llums!"
},
"menu": {
"title": "Crear o Duplicar",
"description": "Vols crear una nova instància, o duplicar-ne una d'existent?",
"data": {
"action": "Acció"
}
}
},
"abort": {
"already_configured": "Aquest dispositiu ja està configurat"
}
}
}

View file

@ -8,6 +8,10 @@
"data": { "data": {
"name": "Název" "name": "Název"
} }
},
"menu": {
"title": "Vytvořit nebo duplikovat",
"description": "Chcete vytvořit novou instanci nebo duplikovat stávající?"
} }
}, },
"abort": { "abort": {
@ -17,35 +21,73 @@
"options": { "options": {
"step": { "step": {
"init": { "init": {
"title": "Nastavení adaptivního osvětlení", "title": "Nastavení Adaptivního osvětlení",
"description": "Všechna nastavení komponenty Adaptivního osvětlení. Názvy možností odpovídají nastavení YAML. Pokud máte v konfiguraci YAML definovánu položku 'adaptive_lighting', nezobrazí se žádné možnosti.", "description": "Nakonfigurujte komponentu Adaptive Lighting. Názvy voleb odpovídají nastavení YAML. Pokud je tato položka definována v YAML, žádné volby se zde nezobrazí. Interaktivní grafy znázorňující vliv parametrů najdete v [této webové aplikaci]({webapp_url}). Další podrobnosti najdete v [oficiální dokumentaci]({docs_url}).",
"data": { "data": {
"lights": "osvětlení", "lights": "lights: Seznam světel (entity_id), které mají být ovládané (může být prázdný). 🌟",
"initial_transition": "initial_transition: Prodlení pro změnu z 'vypnuto' do 'zapnuto' (sekundy)",
"sleep_transition": "sleep_transition: Prodleva pro přepnutí do „režimu spánku“ (sekundy)",
"interval": "interval: Prodleva pro změny osvětlení (v sekundách)", "interval": "interval: Prodleva pro změny osvětlení (v sekundách)",
"max_brightness": "max_brightness: Nejvyšší jas osvětlení během cyklu. (%)", "transition": "",
"max_color_temp": "max_color_temp: Nejchladnější odstín cyklu teploty barev. (Kelvin)",
"min_brightness": "min_brightness: Nejnižší jas osvětlení během cyklu. (%)", "min_brightness": "min_brightness: Nejnižší jas osvětlení během cyklu. (%)",
"max_brightness": "max_brightness: Nejvyšší jas osvětlení během cyklu. (%)",
"min_color_temp": "min_color_temp, Nejteplejší odstín cyklu teploty barev. (Kelvin)", "min_color_temp": "min_color_temp, Nejteplejší odstín cyklu teploty barev. (Kelvin)",
"only_once": "only_once: Přizpůsobení osvětlení pouze při rozsvícení.", "max_color_temp": "max_color_temp: Nejchladnější odstín cyklu teploty barev. (Kelvin)",
"prefer_rgb_color": "prefer_rgb_color: Upřednostněte použití 'rgb_color' před 'color_temp'.",
"separate_turn_on_commands": "separate_turn_on_commands: Oddělení příkazů pro každý atribut (barva, jas, atd.) v atributu 'light.turn_on' (vyžadováno pro některá světla).",
"send_split_delay": "send_split_delay: prodleva mezi příkazy (milisekundy), když je použit atribut 'separate_turn_on_commands'. Může zajistit správné zpracování obou příkazů.",
"sleep_brightness": "sleep_brightness, Nastavení jasu pro režim spánku. (%)", "sleep_brightness": "sleep_brightness, Nastavení jasu pro režim spánku. (%)",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, použijte 'rgb_color' nebo 'color_temp'", "sleep_color_temp": "sleep_color_temp: Nastavení teploty barev pro režim spánku. (v Kelvinech)"
"sleep_rgb_color": "sleep_rgb_color, v RGB", },
"sleep_color_temp": "sleep_color_temp: Nastavení teploty barev pro režim spánku. (v Kelvinech)", "data_description": {
"sunrise_offset": "sunrise_offset: Jak dlouho před (-) nebo po (+) definovat bod cyklu východu slunce (+/- v sekundách)", "interval": "Frekvence přizpůsobení světel v sekundách. 🔄",
"sunrise_time": "sunrise_time: Manuální přepsání času východu slunce, pokud je „None“, použije se skutečný čas východu slunce ve vaší lokalitě (HH:MM:SS)", "transition": "Doba trvání přechodu změny světel v sekundách. 🕑",
"max_sunrise_time": "max_sunrise_time: Ruční přepsání nejpozdějšího času východu slunce, pokud je „None“, použije se skutečný čas východu slunce vaší lokality (HH:MM:SS)", "sleep_brightness": "Jas světel během režimu spánku (v %). 😴",
"sunset_offset": "sunset_offset: Jak dlouho před (-) nebo po (+) definovat bod cyklu západu slunce (+/- v sekundách)", "sleep_color_temp": "Teplota barev v režimu spánku (používá se, když `sleep_rgb_or_color_temp` je `color_temp`) v Kelvinech. 😴"
"sunset_time": "sunset_time: Ruční přepsání času západu slunce, pokud je „None“, použije se skutečný čas západu slunce vaší lokality (HH:MM:SS)", },
"min_sunset_time": "min_sunset_time: Ruční přepsání nejdřívějšího času západu slunce, pokud je „None“, použije se skutečný čas západu slunce vaší lokality (HH:MM:SS)", "sections": {
"take_over_control": "take_over_control: Je-li volán 'light.turn_on' z jiného zdroje, než Adaptivním osvětlením, když je světlo již rozsvíceno, přestaňte toto světlo ovládat, dokud není vypnuto -> zapnuto (nebo i vypínačem).", "advanced": {
"detect_non_ha_changes": "detect_non_ha_changes: detekuje všechny změny >10% provedených pro osvětlení (také mimo HA), vyžaduje povolení atributu 'take_over_control' (každý 'interval' spouští 'homeassistant.update_entity'!)", "data": {
"transition": "transition: doba přechodu při změně osvětlení (sekundy)", "initial_transition": "initial_transition: Prodlení pro změnu z 'vypnuto' do 'zapnuto' (sekundy)",
"adapt_delay": "adapt_delay: prodleva mezi zapnutím světla ( sekundy) a projevem změny v Adaptivní osvětlení. Může předcházet blikání." "prefer_rgb_color": "prefer_rgb_color: Upřednostněte použití 'rgb_color' před 'color_temp'.",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, použijte 'rgb_color' nebo 'color_temp'",
"sleep_rgb_color": "sleep_rgb_color, v RGB",
"sleep_transition": "sleep_transition: Prodleva pro přepnutí do „režimu spánku“ (sekundy)",
"transition_until_sleep": "transition_until_sleep: Pokud je zapnuto, Adaptive Lighting bude zacházet s nastavením spánku jako s minimem, na tyto hodnoty přejde po západu slunce. 🌙",
"sunrise_time": "sunrise_time: Manuální přepsání času východu slunce, pokud je „None“, použije se skutečný čas východu slunce ve vaší lokalitě (HH:MM:SS)",
"max_sunrise_time": "max_sunrise_time: Ruční přepsání nejpozdějšího času východu slunce, pokud je „None“, použije se skutečný čas východu slunce vaší lokality (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: Jak dlouho před (-) nebo po (+) definovat bod cyklu východu slunce (+/- v sekundách)",
"sunset_time": "sunset_time: Ruční přepsání času západu slunce, pokud je „None“, použije se skutečný čas západu slunce vaší lokality (HH:MM:SS)",
"min_sunset_time": "min_sunset_time: Ruční přepsání nejdřívějšího času západu slunce, pokud je „None“, použije se skutečný čas západu slunce vaší lokality (HH:MM:SS)",
"sunset_offset": "sunset_offset: Jak dlouho před (-) nebo po (+) definovat bod cyklu západu slunce (+/- v sekundách)",
"take_over_control": "take_over_control: Je-li volán 'light.turn_on' z jiného zdroje, než Adaptivním osvětlením, když je světlo již rozsvíceno, přestaňte toto světlo ovládat, dokud není vypnuto -> zapnuto (nebo i vypínačem).",
"detect_non_ha_changes": "detect_non_ha_changes: detekuje všechny změny >10% provedených pro osvětlení (také mimo HA), vyžaduje povolení atributu 'take_over_control' (každý 'interval' spouští 'homeassistant.update_entity'!)",
"only_once": "only_once: Přizpůsobení osvětlení pouze při rozsvícení.",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Jenom při prvním zapnutí světel. Je-li nastaveno na `true`, AL udělá přizpůsobení pouze tehdy, je-li vyvoláno `light.turn_on` bez zadání barvy nebo jasu. ❌🌈 Tím se zabrání přizpůsobení např. při aktivaci scény. Pokud je `false`, AL udělá přizpůsobení bez ohledu na přítomnost barvy nebo jasu `service_data` volání. Vyžaduje zapnutí `take_over_control`. 🕵️ ",
"separate_turn_on_commands": "separate_turn_on_commands: Oddělení příkazů pro každý atribut (barva, jas, atd.) v atributu 'light.turn_on' (vyžadováno pro některá světla).",
"send_split_delay": "send_split_delay: prodleva mezi příkazy (milisekundy), když je použit atribut 'separate_turn_on_commands'. Může zajistit správné zpracování obou příkazů.",
"adapt_delay": "",
"skip_redundant_commands": "skip_redundant_commands: Přeskočí odesílání adaptačních příkazů, jejichž cílový stav se již rovná známému stavu světla. Minimalizuje síťový provoz a v některých situacích zlepšuje odezvu adaptace. 📉Zakažte, pokud se fyzické stavy světel dostanou mimo synchronizaci se zaznamenaným stavem HA.",
"intercept": "intercept: Zachytit a přizpůsobit volání `light.turn_on` a umožnit tak okamžité přizpůsobení barev a jasu. 🏎️ Zakažte pro světla, která nepodporují `light.turn_on` s barvou a jasem najednou.",
"multi_light_intercept": "multi_light_intercept: Zachytí a přizpůsobí volání `light.turn_on`, která se zaměřují na více světel. ➗⚠️ To může vést k rozdělení jednoho volání `light.turn_on` na více volání, např. když jsou světla v různých vypínačích. Vyžaduje, aby bylo povoleno `intercept`.",
"include_config_in_attributes": "include_config_in_attributes: Zobrazit všechny možnosti jako atributy přepínače v Home Assistant, pokud je nastaveno na `true`. 📝"
},
"data_description": {
"initial_transition": "Doba trvání prvního přechodu, kdy se světla změní z `vypnuto` na `zapnuto`, v sekundách. ⏲️",
"sleep_rgb_or_color_temp": "V režimu spánku se použije buď `\"rgb_color\"`, nebo `\"color_temp\"`. 🌙",
"sleep_rgb_color": "RGB barva v režimu spánku (používané když `sleep_rgb_or_color_temp` je \"rgb_color\"). 🌈",
"sleep_transition": "Doba trvání přechodu do režimu spánku v sekundách. 😴",
"sunrise_time": "Nastavit pevný čas (HH:MM:SS) pro východ slunce. 🌅",
"min_sunrise_time": "Nastavte nejbližší virtuální čas východu slunce (HH:MM:SS), abyste mohli nastavit pozdější východ slunce. 🌅",
"max_sunrise_time": "Nastavte nejpozdější virtuální čas východu slunce (HH:MM:SS), což umožňuje dřívější východ slunce. 🌅",
"sunrise_offset": "Upravte čas východu slunce o sekundy dopředu nebo dozadu. ⏰",
"sunset_time": "Nastavit pevný čas (HH:MM:SS) pro západ slunce. 🌅",
"min_sunset_time": "Nastavte nejbližší virtuální čas západu slunce (HH:MM:SS), abyste mohli nastavit pozdější západ slunce. 🌅",
"max_sunset_time": "Nastavte nejpozdější virtuální čas západu slunce (HH:MM:SS), což umožňuje dřívější západ slunce. 🌅",
"sunset_offset": "Upravte čas západu slunce o sekundy dopředu nebo dozadu. ⏰",
"brightness_mode": "Výběr režimu jasu. Možné hodnoty jsou `default`, `linear` a `tanh` (používá `brightness_mode_time_dark` a `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Ignorováno, pokud `brightness_mode='default'`) Doba trvání v sekundách pro zvýšení/snížení jasu po/před východem/západem slunce. 📈📉.",
"brightness_mode_time_light": "(Ignorováno, pokud `brightness_mode='default'`) Doba trvání v sekundách pro zvýšení/snížení jasu po/před východem/západem slunce. 📈📉.",
"autoreset_control_seconds": "Automatické resetování ručního ovládání po určitém počtu sekund. Nastavením na 0 se vypne. ⏲️",
"send_split_delay": "Zpoždění (ms) mezi příkazy `separate_turn_on_commands` pro světla, která nepodporují současné nastavení jasu a barvy. ⏲️",
"adapt_delay": "Doba čekání (v sekundách) mezi zapnutím světla a změnou adaptivního osvětlení. Mohlo by to pomoci zabránit blikání. ⏲️"
}
}
} }
} }
}, },
@ -53,5 +95,139 @@
"option_error": "Neplatná možnost", "option_error": "Neplatná možnost",
"entity_missing": "V aplikaci Home Assistant chybí jedna nebo více vybraných entit osvětlení" "entity_missing": "V aplikaci Home Assistant chybí jedna nebo více vybraných entit osvětlení"
} }
},
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Jas světel během režimu spánku (v %). 😴"
},
"detect_non_ha_changes": {
"description": "Zjistí a zastaví adaptace při změnách stavu, které nejsou ve stavu `light.turn_on`. Nutno mít zapnutou funkci `take_over_control`. 🕵️ Upozornění: ⚠️ Některá světla mohou falešně indikovat stav 'zapnuto', což může vést k neočekávanému zapnutí světel. Pokud se s takovými problémy setkáte, zakažte tuto funkci."
},
"sunrise_offset": {
"description": "Upravte čas východu slunce o sekundy dopředu nebo dozadu. ⏰"
},
"max_sunrise_time": {
"description": "Nastavte nejpozdější virtuální čas východu slunce (HH:MM:SS), což umožňuje dřívější východ slunce. 🌅"
},
"sleep_color_temp": {
"description": "Teplota barev v režimu spánku (používá se, když `sleep_rgb_or_color_temp` je `color_temp`) v Kelvinech. 😴"
},
"min_brightness": {
"description": "Minimální hodnota jasu. 💡"
},
"min_color_temp": {
"description": "Nejvyšší teplota barvy v Kelvinech. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "V režimu spánku se použije buď `\"rgb_color\"`, nebo `\"color_temp\"`. 🌙"
},
"turn_on_lights": {
"description": "Zda se mají zapnout světla, která jsou aktuálně vypnutá. 🔆"
},
"initial_transition": {
"description": "Doba trvání prvního přechodu, kdy se světla změní z `vypnuto` na `zapnuto`, v sekundách. ⏲️"
},
"entity_id": {
"description": "Entita ID přepínače. 📝"
},
"sunrise_time": {
"description": "Nastavit pevný čas (HH:MM:SS) pro východ slunce. 🌅"
},
"include_config_in_attributes": {
"description": "Zobrazení všech možností jako atributů přepínače v aplikaci Home Assistant, pokud je zaškrtnuto. 📝"
},
"max_brightness": {
"description": "Maximální hodnota jasu. 💡"
},
"sleep_rgb_color": {
"description": "RGB barva v režimu spánku (používané když `sleep_rgb_or_color_temp` je \"rgb_color\"). 🌈"
},
"take_over_control": {
"description": "Zakáže adaptivní osvětlení, pokud jiný zdroj volá `light.turn_on`, zatímco jsou světla zapnutá a přizpůsobují se. Vemte na vědomí, že `homeassistant.update_entity` volá každý `interval`! 🔒"
},
"sleep_transition": {
"description": "Doba trvání přechodu do režimu spánku v sekundách. 😴"
},
"autoreset_control_seconds": {
"description": "Automatické resetování ručního ovládání po určitém počtu sekund. Nastavením na 0 se vypne. ⏲️"
},
"adapt_delay": {
"description": "Doba čekání (v sekundách) mezi zapnutím světla a změnou adaptivního osvětlení. Mohlo by to pomoci zabránit blikání."
},
"only_once": {
"description": "Přizpůsobit světla pouze při zapnutí (`true`) nebo je průběžně přizpůsobovat (`false`). 🔄"
},
"use_defaults": {
"description": "Nastaví výchozí hodnoty, které nebyly zadány v tomto volání služby. Možnosti: \"stávající\" (výchozí, zachovává aktuální hodnoty), \"výchozí\" (obnovuje do výchozích hodnot) nebo \"konfigurace\" (vrací výchozí hodnoty konfigurace přepínače). ⚙️"
},
"separate_turn_on_commands": {
"description": "Použití samostatných volání `light.turn_on` pro barvu a jas, které jsou potřebné pro některé typy světel. 🔀"
},
"prefer_rgb_color": {
"description": "Zda upřednostnit nastavení barev RGB před teplotou barev světla, pokud je to možné. 🌈"
},
"max_color_temp": {
"description": "Nejchladnější teplota barvy v Kelvinech. ❄️"
},
"sunset_offset": {
"description": "Upravte čas západu slunce o sekundy dopředu nebo dozadu. ⏰"
},
"send_split_delay": {
"description": "Zpoždění (ms) mezi příkazy `separate_turn_on_commands` pro světla, která nepodporují současné nastavení jasu a barvy. ⏲️"
},
"sunset_time": {
"description": "Nastavit pevný čas (HH:MM:SS) pro západ slunce. 🌅"
},
"transition": {
"description": "Doba trvání přechodu změny světel v sekundách. 🕑"
},
"min_sunset_time": {
"description": "Nastavte nejbližší virtuální čas západu slunce (HH:MM:SS), abyste mohli nastavit pozdější západ slunce. 🌅"
}
},
"description": "V přepínači změňte libovolné nastavení. Všechny možnosti jsou zde stejné jako v konfiguračním souboru."
},
"apply": {
"fields": {
"entity_id": {
"description": "`entity_id` přepínače s nastavením, které se má použít. 📝"
},
"adapt_brightness": {
"description": "Přizpůsobení jasu světla. 🌞"
},
"turn_on_lights": {
"description": "Zda se mají zapnout světla, která jsou aktuálně vypnutá. 🔆"
},
"adapt_color": {
"description": "Zda se má přizpůsobit barva na podporovaných světlech. 🌈"
},
"prefer_rgb_color": {
"description": "Zda upřednostnit nastavení barev RGB před teplotou barev světla, pokud je to možné. 🌈"
},
"lights": {
"description": "Světlo (nebo seznam světel), na které se má nastavení aplikovat. 💡"
},
"transition": {
"description": "Doba trvání přechodu změny světel v sekundách. 🕑"
}
},
"description": "Aplikuje současné nastavení Adaptivního osvětlení na světla."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Zda přidat (\"true\") nebo odebrat (\"false\") světlo ze seznamu \"manual_control\". 🔒"
},
"entity_id": {
"description": "`entity_id` spínače, ve kterém se světlo (ne)označí jako `ručně ovládané`. 📝"
},
"lights": {
"description": "entity_id(s) světel, pokud není zadáno jinak, jsou vybrána všechna světla ve spínači. 💡"
}
},
"description": "Označte, zda je světlo \"ručně ovládané\"."
}
} }
} }

View file

@ -8,6 +8,11 @@
"data": { "data": {
"name": "Navn" "name": "Navn"
} }
},
"menu": {
"data": {
"action": "Handling"
}
} }
}, },
"abort": { "abort": {
@ -18,27 +23,65 @@
"step": { "step": {
"init": { "init": {
"title": "Adaptiv Belysnings indstillinger", "title": "Adaptiv Belysnings indstillinger",
"description": "Alle indstillinger tilhørende en Adaptiv Belysnings komponent. Indstillingernes navne svarer til YAML indstillingernes. Ingen indstillinger vises hvis du allerede har konfigureret den i YAML.", "description": "Alle indstillinger tilhørende en Adaptiv Belysnings komponent. Indstillingernes navne svarer til YAML indstillingernes. Ingen indstillinger vises hvis du allerede har konfigureret den i YAML. For interaktive grafer, der viser parametereffekter, besøg [denne webapp]({webapp_url}). Yderligere detaljer finder du i den [officielle dokumentation]({docs_url}).",
"data": { "data": {
"lights": "lights: lyskilder", "lights": "lights: lyskilder",
"initial_transition": "initial_transition: Hvor lang overgang når lyset går fra 'off' til 'on' eller når 'sleep_state' skiftes. (i sekunder)",
"interval": "interval: Tid imellem opdateringer (i sekunder)", "interval": "interval: Tid imellem opdateringer (i sekunder)",
"max_brightness": "max_brightness: Højeste lysstyrke i cyklussen. (%)", "transition": "Overgangsperiode når en ændring i lyset udføres (i sekunder)",
"max_color_temp": "max_color_temp: Koldeste lystemperatur i cyklussen. (Kelvin)",
"min_brightness": "min_brightness: Laveste lysstyrke i cyklussen. (%)", "min_brightness": "min_brightness: Laveste lysstyrke i cyklussen. (%)",
"max_brightness": "max_brightness: Højeste lysstyrke i cyklussen. (%)",
"min_color_temp": "min_color_temp: Varmeste lystemperatur i cyklussen. (Kelvin)", "min_color_temp": "min_color_temp: Varmeste lystemperatur i cyklussen. (Kelvin)",
"only_once": "only_once: Juster udelukkende lysene adaptivt i øjeblikket de tændes.", "max_color_temp": "max_color_temp: Koldeste lystemperatur i cyklussen. (Kelvin)",
"prefer_rgb_color": "prefer_rgb_color: Brug 'rgb_color' istedet for 'color_temp' når muligt.",
"separate_turn_on_commands": "separate_turn_on_commands: Adskil kommandoerne for hver attribut (color, brightness, etc.) ved 'light.turn_on' (nødvendigt for bestemte lys).",
"sleep_brightness": "sleep_brightness, Lysstyrke for Sleep Mode. (%)", "sleep_brightness": "sleep_brightness, Lysstyrke for Sleep Mode. (%)",
"sleep_color_temp": "sleep_color_temp: Farvetemperatur under Sleep Mode. (Kelvin)", "sleep_color_temp": "sleep_color_temp: Farvetemperatur under Sleep Mode. (Kelvin)"
"sunrise_offset": "sunrise_offset: Hvor længe før (-) eller efter (+) at definere solopgangen i cyklussen (+/- sekunder)", },
"sunrise_time": "sunrise_time: Manuel overstyring af solopgangstidspunktet, hvis 'None', bruges det egentlige tidspunkt din lokation. (HH:MM:SS)", "data_description": {
"sunset_offset": "sunset_offset: Hvor længe før (-) eller efter (+) at definere solnedgangen i cyklussen (+/- sekunder)", "interval": "Frekvens til at tilpasse lysene, i sekunder. 🔄",
"sunset_time": "sunset_time: Manuel overstyring af solnedgangstidspunktet, hvis 'None', bruges det egentlige tidspunkt for din lokation. (HH:MM:SS)", "transition": "Varighed af overgang, når lys ændres, i sekunder. 🕑",
"take_over_control": "take_over_control: Hvis andet end Adaptiv Belysning kalder 'light.turn_on' på et lys der allerede er tændt, afbryd adaptering af lyset indtil at det tændes igen.", "sleep_brightness": "Lysstyrkeprocent af lys i søvntilstand. 😴",
"detect_non_ha_changes": "detect_non_ha_changes: Registrer alle ændringer på >10% på et lys (også udenfor HA), kræver at 'take_over_control' er slået til (kalder 'homeassistant.update_entity' hvert 'interval'!)", "sleep_color_temp": "Farvetemperatur i søvntilstand (bruges når `sleep_rgb_or_color_temp` er `color_temp`) i Kelvin. 😴"
"transition": "Overgangsperiode når en ændring i lyset udføres (i sekunder)" },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Hvor lang overgang når lyset går fra 'off' til 'on' eller når 'sleep_state' skiftes. (i sekunder)",
"prefer_rgb_color": "prefer_rgb_color: Brug 'rgb_color' istedet for 'color_temp' når muligt.",
"transition_until_sleep": "overgang_til_sove: Når aktiveret, vil adaptiv belysning behandle søvnindstillinger som minimum, og overgår til disse værdier efter solnedgang. 🌙",
"sunrise_time": "sunrise_time: Manuel overstyring af solopgangstidspunktet, hvis 'None', bruges det egentlige tidspunkt din lokation. (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: Hvor længe før (-) eller efter (+) at definere solopgangen i cyklussen (+/- sekunder)",
"sunset_time": "sunset_time: Manuel overstyring af solnedgangstidspunktet, hvis 'None', bruges det egentlige tidspunkt for din lokation. (HH:MM:SS)",
"sunset_offset": "sunset_offset: Hvor længe før (-) eller efter (+) at definere solnedgangen i cyklussen (+/- sekunder)",
"take_over_control": "take_over_control: Hvis andet end Adaptiv Belysning kalder 'light.turn_on' på et lys der allerede er tændt, afbryd adaptering af lyset indtil at det tændes igen.",
"detect_non_ha_changes": "detect_non_ha_changes: Registrer alle ændringer på >10% på et lys (også udenfor HA), kræver at 'take_over_control' er slået til (kalder 'homeassistant.update_entity' hvert 'interval'!)",
"only_once": "only_once: Juster udelukkende lysene adaptivt i øjeblikket de tændes.",
"adapt_only_on_bare_turn_on": "tilpas_kun_ved_enkelt_tænd: Når du tænder lys for første gang. Hvis indstillet til 'true', tilpasser AL kun, hvis 'lys.tænd' er kaldt uden at angive farve eller lysstyrke. ❌🌈 Dette forhindrer f.eks. tilpasning, når du aktiverer en scene. Hvis indstillet til 'false' tilpasser AL sig uanset tilstanden af farve eller lysstyrke i den oprindelige 'service_data'. Har brug for at 'take_over_control' er aktiveret. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Adskil kommandoerne for hver attribut (color, brightness, etc.) ved 'light.turn_on' (nødvendigt for bestemte lys).",
"skip_redundant_commands": "skip_redundant_commands: Undlad at sende tilpasningskommando, hvis lampens kendte tilstand allerede er lig den ønskede tilstand. Mindsker mængden af netværkstrafik og forbedrer tilpasningens responsivitet i visse situationer. 📉 Slå fra, hvis lampens faktiske tilstand kommer ud af takt med den tilstand, som HA rapporterer.",
"intercept": "intercept: Indfang og tilpas »light.turn_on«-kald for at muliggøre øjeblikkelig farve- og lysstyrketilpasning. 🏎️ Slå fra for lyskilder, som ikke understøtter »light.turn_on« med farve og lysstyrke.",
"multi_light_intercept": "multi_light_intercept: Indfang og tilpas »light.turn_on«-kald til mere end en enkelt lyskilde. ➗⚠️ Dette kan bevirke at et enkelt »light.turn_on«-kald deles op i flere, f.eks. hvis lyskilderne er forbundet til forskellige kontakter. Forudsætter at »intercept« er slået til.",
"include_config_in_attributes": "include_config_in_attributes: Vis alle indstillinger som attributter for kontakten når dette er sat til »true«. 📝"
},
"data_description": {
"initial_transition": "Den første overgangs varighed når lysene ændres fra »off« til »on« i sekunder. ⏲️",
"sleep_rgb_or_color_temp": "Brug enten `\"rgb_farve\"` eller `\"farve_temp\"` i søvntilstand. 🌙",
"sleep_rgb_color": "RGB-farve i søvntilstand (anvendes når »sleep_rgb_or_color_temp« er sat til »rgb_color«). 🌈",
"sleep_transition": "Varigheden af overgangen, når \"sovetilstand\" skiftes, i sekunder. 😴",
"sunrise_time": "Sæt en fast tid (HH:MM:SS) for solopgang. 🌅",
"min_sunrise_time": "Indstil den tidligste virtuelle solopgangstid (HH:MM:SS), hvilket giver mulighed for senere solopgange. 🌅",
"max_sunrise_time": "Indstil den seneste virtuelle solopgangstid (HH:MM:SS), hvilket giver mulighed for tidligere solopgange. 🌅",
"sunrise_offset": "Juster solopgangstiden med en positiv eller negativ offset på få sekunder. ⏰",
"sunset_time": "Sæt en fast tid (HH:MM:SS) for solnedgang. 🌇",
"min_sunset_time": "Indstil den tidligste virtuelle solnedgangstid (HH:MM:SS), hvilket giver mulighed for senere solnedgange. 🌇",
"max_sunset_time": "Indstil den seneste virtuelle solnedgangstid (HH:MM:SS), hvilket giver mulighed for tidligere solnedgange. 🌇",
"sunset_offset": "Juster solnedgang tid med et positivt eller negativt offset, i sekunder. ⏰",
"brightness_mode": "Lysstyrketilstand til brug. Mulige værdier er \"default\", \"linear\" og \"tanh\" (bruger \"brightness_mode_time_dark\" og \"brightness_mode_time_light\"). 📈",
"brightness_mode_time_dark": "(Ignoreres hvis »brightness_mode='default'«) Varigheden i sekunder for tilpasningen af lysstyrken ved solopgang eller -nedgang. 📈📉",
"brightness_mode_time_light": "(Ignoreres hvis »brightness_mode='default'«) Varigheden i sekunder for tilpasningen af lysstyrken ved solopgang eller -nedgang. 📈📉",
"autoreset_control_seconds": "Nulstil automatisk den manuelle styring efter et antal sekunder. Indstil til 0 for at deaktivere. ⏲️",
"send_split_delay": "Forsinkelse (ms) mellem »separate_turn_on_commands« for lyskilder som ikke understøtter simultane styrke- og farveindstillinger. ⏲️",
"adapt_delay": "Ventetid (sekunder) mellem lyset tændes og Adaptive Lighting anvender ændringer. Kan hjælpe med at undgå flimren. ⏲️"
}
}
} }
} }
}, },
@ -46,5 +89,112 @@
"option_error": "Ugyldig indstilling", "option_error": "Ugyldig indstilling",
"entity_missing": "Et udvalgt lys blev ikke fundet " "entity_missing": "Et udvalgt lys blev ikke fundet "
} }
},
"services": {
"apply": {
"description": "Anvender de aktuelle Adaptive Lighting indstillinger på lys.",
"fields": {
"prefer_rgb_color": {
"description": "Om man vil foretrække RGB-farvejustering frem for lysfarvetemperatur, når det er muligt. 🌈"
},
"transition": {
"description": "Varighed af overgang, når lys ændres, i sekunder. 🕑"
},
"turn_on_lights": {
"description": "Om lys der i øjeblikket er slukket, skal tændes. 🔆"
},
"adapt_brightness": {
"description": "Om lysstyrken skal tilpasses. 🌞"
},
"lights": {
"description": "Et lys (eller liste over lys) som indstillingerne skal anvendes til. 💡"
},
"adapt_color": {
"description": "Om farven på støttelys skal tilpasses. 🌈"
}
}
},
"change_switch_settings": {
"fields": {
"entity_id": {
"description": "Entity ID af kontakten. 📝"
},
"turn_on_lights": {
"description": "Om lys der i øjeblikket er slukket, skal tændes. 🔆"
},
"sleep_transition": {
"description": "Varigheden af overgangen, når \"sovetilstand\" skiftes, i sekunder. 😴"
},
"only_once": {
"description": "Tilpas kun lys, når de er tændt ('sand'), eller fortsæt med at tilpasse dem ('falsk'). 🔄"
},
"prefer_rgb_color": {
"description": "Om man vil foretrække RGB-farvejustering frem for lysfarvetemperatur, når det er muligt. 🌈"
},
"sleep_brightness": {
"description": "Lysstyrkeprocent af lys i søvntilstand. 😴"
},
"sunrise_time": {
"description": "Sæt en fast tid (HH:MM:SS) til solopgang. 🌅"
},
"sunrise_offset": {
"description": "Juster solopgangstiden med et positivt eller negativt offset, i sekunder. ⏰"
},
"sunset_offset": {
"description": "Juster solnedgang tid med et positivt eller negativt offset, i sekunder. ⏰"
},
"sunset_time": {
"description": "Sæt en fast tid (HH:MM:SS) for solnedgang. 🌇"
},
"max_sunrise_time": {
"description": "Indstil den seneste virtuelle solopgangstid (HH:MM:SS), hvilket giver mulighed for tidligere solopgange. 🌅"
},
"min_sunset_time": {
"description": "Indstil den tidligste virtuelle solnedgangstid (HH:MM:SS), hvilket giver mulighed for senere solnedgange. 🌇"
},
"transition": {
"description": "Varighed af overgang, når lys ændres, i sekunder. 🕑"
},
"autoreset_control_seconds": {
"description": "Nulstil automatisk den manuelle styring efter et antal sekunder. Indstil til 0 for at deaktivere. ⏲️"
},
"adapt_delay": {
"description": "Ventetid (sekunder) mellem lyset tændes og Adaptive Lighting anvender ændringer. Kan hjælpe med at undgå flimren. ⏲️"
},
"max_brightness": {
"description": "Maksimal lysstyrkeprocent. 💡"
},
"max_color_temp": {
"description": "Koldeste farvetemperatur i Kelvin. ❄️"
},
"min_brightness": {
"description": "Mindste lysstyrkeprocent. 💡"
},
"min_color_temp": {
"description": "Varmste farvetemperatur i Kelvin. 🔥"
},
"sleep_color_temp": {
"description": "Farvetemperatur i søvntilstand (bruges når `sleep_rgb_or_color_temp` er `color_temp`) i Kelvin. 😴"
},
"send_split_delay": {
"description": "Forsinkelse (ms) mellem »separate_turn_on_commands« for lyskilder som ikke understøtter simultane styrke- og farveindstillinger. ⏲️"
},
"detect_non_ha_changes": {
"description": "Opdager og stopper tilpasningen ved tilstandsændringer, som ikke er udløst af »light.turn_on«. Indstillingen »take_over_control« skal være aktiveret. 🕵️ Advarsel: ⚠️ Nogle lyskilder kan rapportere en falsk tændt-tilstand, hvilket kan medføre af lyskilden tændes når det ikke er meningen. Slå denne funktion fra, hvis du oplever dette problem."
},
"initial_transition": {
"description": "Den første overgangs varighed når lysene ændres fra »off« til »on« i sekunder. ⏲️"
}
},
"description": "Skift de indstillinger du ønsker i kontakten. Alle muligheder her er de samme som i konfigurationsflowet."
},
"set_manual_control": {
"description": "Markér om et lys er 'manuelt kontrolleret'.",
"fields": {
"lights": {
"description": "entity_id(er) af lys, hvis ikke specificeret, vil alle lys i kontakten være valgt. 💡"
}
}
}
} }
} }

View file

@ -1,57 +1,238 @@
{ {
"title": "Adaptive Lighting", "title": "Adaptive Beleuchtung",
"config": { "config": {
"step": { "step": {
"user": { "user": {
"title": "Benenne das Adaptive Lighting", "title": "Benenne die Adaptive Beleuchtung Instanz",
"description": "Jede Instanz kann mehrere Licht Entitäten beinhalten", "description": "Jede Instanz kann mehrere Licht Entitäten beinhalten",
"data": { "data": {
"name": "Name" "name": "Name"
} }
},
"menu": {
"title": "Erstellen oder Duplizieren",
"description": "Möchtest du eine neue Instanz erstellen oder eine existierende duplizieren?",
"data": {
"action": "Aktion"
}
} }
}, },
"abort": { "abort": {
"already_configured": "Gerät ist bereits konfiguriert!" "already_configured": "Dieses Gerät ist bereits konfiguriert."
} }
}, },
"options": { "options": {
"step": { "step": {
"init": { "init": {
"title": "Adaptive Lighting Optionen", "title": "Optionen für Adaptive Beleuchtung",
"description": "Alle Einstellungen für eine Adaptive Lighting Komponente. Die Optionsnamen entsprechen den YAML-Einstellungen. Es werden keine Optionen angezeigt, wenn dieser Eintrag in YAML konfiguriert wurde.", "description": "Alle Einstellungen für eine Adaptive Lighting Komponente. Die Optionsnamen entsprechen den YAML-Einstellungen. Es werden keine Optionen angezeigt, wenn dieser Eintrag in YAML konfiguriert wurde. Interaktive Diagramme zur Veranschaulichung der Auswirkungen der Parameter finden Sie unter [dieser Webanwendung]({webapp_url}). Weitere Details finden Sie in der [offiziellen Dokumentation]({docs_url}).",
"data": { "data": {
"lights": "Lichter", "lights": "Lichter",
"initial_transition": "initial_transition, wenn Lichter von 'off' zu 'on' wechseln oder wenn 'sleep_state' wechselt",
"sleep_transition": "sleep_transition: Wenn 'sleep_state' sich ändert. (Sekunden)",
"interval": "interval, Zeit zwischen Updates des Switches", "interval": "interval, Zeit zwischen Updates des Switches",
"max_brightness": "max_brightness, maximale Helligkeit in %",
"max_color_temp": "max_color_temp, maximale Farbtemperatur in Kelvin",
"min_brightness": "min_brightness, minimale Helligkeit in %",
"min_color_temp": "min_color_temp, minimale Farbtemperatur in Kelvin",
"only_once": "only_once, passe die Lichter nur beim Einschalten an",
"prefer_rgb_color": "prefer_rgb_color, nutze 'rgb_color' vor 'color_temp', wenn möglich",
"separate_turn_on_commands": "separate_turn_on_commands, für jedes Attribut (Farbe, Helligkeit usw.) in 'light.turn_on' werden separate Befehle gesendet. Wird für manche Leuchtmittel benötigt.",
"send_split_delay": "send_split_delay: Wartezeit zwischen dem Senden der Befehle (Millisekunden), wenn separate_turn_on_commands genutzt wird. Kann helfen, wenn die Leuchtmittel die separaten Befehle nicht korrekt umsetzen.",
"sleep_brightness": "sleep_brightness, Schlafhelligkeit in %",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, nutze 'rgb_color' oder 'color_temp'",
"sleep_rgb_color": "sleep_rgb_color, in RGB",
"sleep_color_temp": "sleep_color_temp, Schlaffarbtemperatur in Kelvin",
"sunrise_offset": "sunrise_offset, Sonnenaufgang Verschiebung in +/- Sekunden",
"sunrise_time": "sunrise_time, Sonnenaufgangszeit in 'HH:MM:SS' Format (wenn 'None' wird die aktuelle Zeit des Sonnenaufgangs an deiner Position verwendet)",
"max_sunrise_time": "max_sunrise_time: Manuelles Überschreiben der max. sunrise_time. Falls 'None', wird die tatsächliche sunrise_time an deiner Position verwendet (HH:MM:SS)",
"sunset_offset": "sunset_offset, Sonnenuntergang Verschiebung in +/- Sekunden",
"sunset_time": "sunset_time, Sonnenuntergangszeit in 'HH:MM:SS' Format (wenn 'None' wird die aktuelle Zeit des Sonnenuntergangs an deiner Position verwendet)",
"min_sunset_time": "min_sunset_time: Manuelles Überschreiben der min. sunset_time. Falls 'None', wird die tatsächliche sunset_time an deiner Position verwendet (HH:MM:SS)",
"take_over_control": "take_over_control, wenn irgendetwas während ein Licht an ist außer Adaptive Lighting den Service 'light.turn_on' aufruft, stoppe die Anpassung des Lichtes (oder des Schalters) bis dieser wieder von off -> on geschaltet wird.",
"detect_non_ha_changes": "detect_non_ha_changes, entdeckt alle Änderungen über 10% am Licht (auch außerhalb von HA gemacht), 'take_over_control' muss aktiviert sein (ruft 'homeassistant.update_entity' jede 'interval' auf!)",
"transition": "transition, Wechselzeit in Sekunden", "transition": "transition, Wechselzeit in Sekunden",
"adapt_delay": "adapt_delay: Wartezeit (in Sekunden) zwischen Anschalten des Licht und der Anpassung durch Adaptive Lights. Kann Flackern vermeiden." "min_brightness": "min_brightness: Minimale Helligkeit in Prozent. 💡",
"max_brightness": "max_brightness: Maximale Helligkeit in Prozent. 💡",
"min_color_temp": "min_color_temp: Wärmste Farbtemperatur in Kelvin. 🔥",
"max_color_temp": "max_color_temp: Kälteste Farbtemperatur in Kelvin. ❄️",
"sleep_brightness": "sleep_brightness, Schlafhelligkeit in %",
"sleep_color_temp": "sleep_color_temp, Schlaffarbtemperatur in Kelvin"
},
"data_description": {
"interval": "Häufigkeit der Lichtanpassung in Sekunden. 🔄",
"transition": "Dauer des Übergangs beim Lichtwechsel in Sekunden. 🕑",
"sleep_brightness": "Helligkeit der Lichter im Schlafmodus in Prozent. 😴",
"sleep_color_temp": "Farbtemperatur im Schlafmodus in Kelvin (wird verwendet, wenn `sleep_rgb_or_color_temp` `color_temp` ist) . 😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition, wenn Lichter von 'off' zu 'on' wechseln oder wenn 'sleep_state' wechselt",
"prefer_rgb_color": "prefer_rgb_color: Ob die RGB-Farbanpassung der Farbtemperaturanpassung vorgezogen werden soll, wenn möglich. 🌈",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, nutze 'rgb_color' oder 'color_temp'",
"sleep_rgb_color": "sleep_rgb_color, in RGB",
"sleep_transition": "sleep_transition: Wenn 'sleep_state' sich ändert. (Sekunden)",
"transition_until_sleep": "transition_until_sleep: Wenn diese Option aktiviert ist, behandelt die adaptive Beleuchtung die Schlafeinstellungen als Minimum und geht nach Sonnenuntergang zu diesen Werten über. 🌙",
"sunrise_time": "sunrise_time, Sonnenaufgangszeit in 'HH:MM:SS' Format (wenn 'None' wird die aktuelle Zeit des Sonnenaufgangs an deiner Position verwendet)",
"max_sunrise_time": "max_sunrise_time: Manuelles Überschreiben der max. sunrise_time. Falls 'None', wird die tatsächliche sunrise_time an deiner Position verwendet (HH:MM:SS)",
"sunrise_offset": "sunrise_offset, Sonnenaufgang Verschiebung in +/- Sekunden",
"sunset_time": "sunset_time, Sonnenuntergangszeit in 'HH:MM:SS' Format (wenn 'None' wird die aktuelle Zeit des Sonnenuntergangs an deiner Position verwendet)",
"min_sunset_time": "min_sunset_time: Manuelles Überschreiben der min. sunset_time. Falls 'None', wird die tatsächliche sunset_time an deiner Position verwendet (HH:MM:SS)",
"sunset_offset": "sunset_offset, Sonnenuntergang Verschiebung in +/- Sekunden",
"take_over_control": "take_over_control: Deaktiviere die adaptive Beleuchtung, wenn eine andere Quelle `light.turn_on` aufruft, während die Beleuchtung eingeschaltet ist und angepasst wird. Beachte, dass dies `homeassistant.update_entity` jedes `Intervall` aufruft! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Erkennt und stoppt Anpassungen für nicht-`light.turn_on`-Zustandsänderungen. Benötigt, dass `take_over_control` aktiviert ist. 🕵️ Vorsicht: ⚠️ Einige Lichter können fälschlicherweise einen 'an'-Zustand anzeigen, was dazu führen kann, dass Lichter unerwartet eingeschaltet werden. Deaktiviere diese Funktion, wenn solche Probleme auftreten.",
"only_once": "only_once: Lichter nur einmalig anpassen, wenn sie eingeschaltet werden (`true`) oder sie immer wieder anpassen (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Beim ersten Einschalten des Lichts. Wenn auf `true` gesetzt, passt AL das Licht nur an, wenn `light.turn_on` ohne eine Angabe von Farbe oder Helligkeit aufgerufen wird. ❌🌈 Dies verhindert z.B. die Anpassung durch AL beim Aktivieren einer Szene. Wenn auf \"false\" gesetzt, passt AL das licht unabhängig von der Angabe von Farbe oder Helligkeit in den ursprünglichen `service_data` an. Benötigt das `take_over_control` aktiviert ist. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Verwende getrennte `light.turn_on`-Aufrufe für Farbe und Helligkeit, erforderlich für einige Lichttypen. 🔀",
"send_split_delay": "send_split_delay: Wartezeit zwischen dem Senden der Befehle (Millisekunden), wenn separate_turn_on_commands genutzt wird. Kann helfen, wenn die Leuchtmittel die separaten Befehle nicht korrekt umsetzen.",
"adapt_delay": "adapt_delay: Wartezeit (in Sekunden) zwischen Anschalten des Licht und der Anpassung durch Adaptive Lights. Kann Flackern vermeiden.",
"skip_redundant_commands": "skip_redundant_commands: Überspringt das Senden von Anpassungsbefehlen, deren Zielzustand bereits mit dem bekannten Zustand der Leuchte übereinstimmt. Minimiert den Netzwerkverkehr und verbessert die Anpassungsreaktion in einigen Situationen. 📉 Deaktivieren, falls der physikalische Zustand der Lichter nicht mehr mit dem Zustand in HA übereinstimmt.",
"intercept": "intercept: Abfangen und Anpassen von `light.turn_on`-Aufrufen, um eine sofortige Anpassung von Farbe und Helligkeit zu ermöglichen. 🏎️ Deaktivieren für Leuchten, die `light.turn_on` mit Farbe und Helligkeit nicht unterstützen.",
"multi_light_intercept": "multi_light_intercept: Abfangen und Anpassen von `light.turn_on`-Aufrufen, die auf mehrere Lichter aufrufen. ➗⚠️ Dies kann dazu führen, dass ein einzelner `light.turn_on`-Aufruf in mehrere Aufrufe aufgeteilt wird, z.B. wenn Lichter in verschiedenen Schaltern sind. Erfordert, dass `intercept` aktiviert ist.",
"include_config_in_attributes": "include_config_in_attributes: Alle Optionen als Attribute auf dem Schalter im Home Assistant anzeigen, wenn auf `true` gesetzt. 📝",
"expand_light_groups": "expand_light_groups: Lichtgruppen auf einzelne Mitgliedsentitäten erweitern (`true`) oder die Gruppenentität direkt steuern (`false`)."
},
"data_description": {
"initial_transition": "Dauer des ersten Übergangs, wenn das Licht von `off` auf `on` schaltet, in Sekunden. ⏲️",
"sleep_rgb_or_color_temp": "Verwende entweder `rgb_color` oder `color_temp` im Schlafmodus. 🌙",
"sleep_rgb_color": "RGB-Farbe im Schlafmodus (wird verwendet, wenn `sleep_rgb_or_color_temp` `rgb_color` ist). 🌈",
"sleep_transition": "Dauer des Übergangs, wenn der \"Schlafmodus\" umgeschaltet wird, in Sekunden. 😴",
"sunrise_time": "Stelle eine feste Zeit (HH:MM:SS) für den Sonnenaufgang ein. 🌅",
"min_sunrise_time": "Lege die früheste virtuelle Sonnenaufgangszeit (HH:MM:SS) fest, um einen späteren Sonnenaufgang zu ermöglichen. 🌅",
"max_sunrise_time": "Lege die späteste virtuelle Sonnenaufgangszeit (HH:MM:SS) fest, um einen früheren Sonnenaufgang zu ermöglichen. 🌅",
"sunrise_offset": "Anpassung der Sonnenaufgangszeit mit positivem oder negativem Versatz in Sekunden. ⏰",
"sunset_time": "Stelle eine feste Zeit (HH:MM:SS) für den Sonnenuntergang ein. 🌇",
"min_sunset_time": "Lege die früheste virtuelle Sonnenuntergangszeit (HH:MM:SS) fest, um spätere Sonnenuntergänge zu ermöglichen. 🌇",
"max_sunset_time": "Lege die späteste virtuelle Sonnenuntergangszeit (HH:MM:SS) fest, um frühere Sonnenuntergänge zu ermöglichen. 🌇",
"sunset_offset": "Anpassung der Sonnenuntergangszeit mit positivem oder negativem Versatz in Sekunden. ⏰",
"brightness_mode": "Helligkeitsmodus, der verwendet werden soll. Mögliche Werte sind `default`, `linear` und `tanh` (verwendet `brightness_mode_time_dark` und `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Wird ignoriert, wenn `brightness_mode='default'`) Die Dauer in Sekunden, um die Helligkeit vor/nach Sonnenaufgang/Sonnenuntergang hoch/runter zu fahren. 📈📉.",
"brightness_mode_time_light": "(Wird ignoriert, wenn `brightness_mode='default'`) Die Dauer in Sekunden, um die Helligkeit nach/vor Sonnenaufgang/Sonnenuntergang hoch/runter zu fahren. 📈📉.",
"autoreset_control_seconds": "Setzt die manuelle Steuerung nach einer bestimmten Anzahl von Sekunden automatisch zurück. Zum Deaktivieren auf 0 setzen. ⏲️",
"send_split_delay": "Verzögerung (ms) zwischen `separate_turn_on_commands` für Leuchten, die keine gleichzeitige Einstellung von Helligkeit und Farbe unterstützen. ⏲️",
"adapt_delay": "Wartezeit (Sekunden) zwischen dem Einschalten des Lichts und der Anwendung der adaptiven Beleuchtung. Könnte helfen, Flackern zu vermeiden. ⏲️",
"expand_light_groups": "Wenn auf `false` gesetzt, werden Anpassungsbefehle direkt an die Gruppenentität gesendet und nicht an die einzelnen Mitglieder."
}
}
} }
} }
}, },
"error": { "error": {
"option_error": "Fehlerhafte Option", "option_error": "Ungültige Option",
"entity_missing": "Ein ausgewähltes Licht wurde nicht gefunden" "entity_missing": "Ein oder mehrere ausgewählte Lichter fehlen in Home Assistant"
}
},
"services": {
"apply": {
"fields": {
"lights": {
"description": "Eine Leuchte (oder eine Liste von Leuchten), auf die die Einstellungen angewendet werden sollen. 💡"
},
"entity_id": {
"description": "Die `entity_id` des Schalters mit den zu übernehmenden Einstellungen. 📝"
},
"prefer_rgb_color": {
"description": "Ob die RGB-Farbanpassung der Farbtemperaturanpassung vorgezogen werden soll, wenn möglich. 🌈"
},
"transition": {
"description": "Dauer des Übergangs beim Lichtwechsel in Sekunden. 🕑"
},
"adapt_brightness": {
"description": "Ob die Helligkeit des Lichts angepasst werden soll. 🌞"
},
"adapt_color": {
"description": "Ob die Farbtemperatur des Lichts angepasst werden soll. 🌈"
},
"turn_on_lights": {
"description": "Ob Lichter eingeschaltet werden sollen, die derzeit ausgeschaltet sind. 🔆"
}
},
"description": "Wendet die aktuellen Einstellungen der adaptiven Beleuchtung auf die Lichter an."
},
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Lichter nur einmalig anpassen, wenn sie eingeschaltet werden (`true`) oder sie immer wieder anpassen (`false`). 🔄"
},
"detect_non_ha_changes": {
"description": "Erkennt und stoppt Anpassungen für nicht-`light.turn_on`-Zustandsänderungen. Benötigt, dass `take_over_control` aktiviert ist. 🕵️ Vorsicht: ⚠️ Einige Lichter können fälschlicherweise einen 'an'-Zustand anzeigen, was dazu führen kann, dass Lichter unerwartet eingeschaltet werden. Deaktiviere diese Funktion, wenn solche Probleme auftreten."
},
"min_brightness": {
"description": "Minimale Helligkeit in Prozent. 💡"
},
"sunset_time": {
"description": "Stelle eine feste Zeit (HH:MM:SS) für den Sonnenuntergang ein. 🌇"
},
"use_defaults": {
"description": "Setzt die nicht in diesem Service-Aufruf angegebenen Standardwerte. Optionen: `current` (Standard, behält die aktuellen Werte bei), `factory` (setzt auf die in der Dokumentation angegebenen Standardwerte zurück) oder `configuration` (setzt auf die Standardwerte der Switch-Konfiguration zurück). ⚙️"
},
"max_sunrise_time": {
"description": "Lege die späteste virtuelle Sonnenaufgangszeit (HH:MM:SS) fest, um einen früheren Sonnenaufgang zu ermöglichen. 🌅"
},
"include_config_in_attributes": {
"description": "Zeige alle Optionen als Attribute auf dem Schalter im Home Assistant, wenn auf `true` gesetzt. 📝"
},
"min_sunset_time": {
"description": "Lege die früheste virtuelle Sonnenuntergangszeit (HH:MM:SS) fest, um spätere Sonnenuntergänge zu ermöglichen. 🌇"
},
"sunrise_offset": {
"description": "Anpassung der Sonnenaufgangszeit mit positivem oder negativem Versatz in Sekunden. ⏰"
},
"sunset_offset": {
"description": "Anpassung der Sonnenuntergangszeit mit positivem oder negativem Versatz in Sekunden. ⏰"
},
"take_over_control": {
"description": "Deaktiviere die adaptive Beleuchtung, wenn eine andere Quelle `light.turn_on` aufruft, während die Beleuchtung eingeschaltet ist und angepasst wird. Beachte, dass dies `homeassistant.update_entity` jedes `Intervall` aufruft! 🔒"
},
"max_brightness": {
"description": "Maximale Helligkeit in Prozent. 💡"
},
"separate_turn_on_commands": {
"description": "Verwende getrennte `light.turn_on`-Aufrufe für Farbe und Helligkeit, erforderlich für einige Lichttypen. 🔀"
},
"sleep_brightness": {
"description": "Helligkeit der Lichter im Schlafmodus in Prozent. 😴"
},
"sleep_rgb_color": {
"description": "RGB-Farbe im Schlafmodus (wird verwendet, wenn `sleep_rgb_or_color_temp` `rgb_color` ist). 🌈"
},
"sleep_rgb_or_color_temp": {
"description": "Verwende entweder `rgb_color` oder `color_temp` im Schlafmodus. 🌙"
},
"sleep_color_temp": {
"description": "Farbtemperatur im Schlafmodus in Kelvin (wird verwendet, wenn `sleep_rgb_or_color_temp` `color_temp` ist) . 😴"
},
"sunrise_time": {
"description": "Stelle eine feste Zeit (HH:MM:SS) für den Sonnenaufgang ein. 🌅"
},
"transition": {
"description": "Dauer des Übergangs beim Lichtwechsel in Sekunden. 🕑"
},
"adapt_delay": {
"description": "Wartezeit (Sekunden) zwischen dem Einschalten des Lichts und der Anwendung der adaptiven Beleuchtung. Könnte helfen, Flackern zu vermeiden. ⏲️"
},
"autoreset_control_seconds": {
"description": "Setzt die manuelle Steuerung nach einer bestimmten Anzahl von Sekunden automatisch zurück. Zum Deaktivieren auf 0 setzen. ⏲️"
},
"entity_id": {
"description": "Entity ID des Schalters. 📝"
},
"turn_on_lights": {
"description": "Ob Lichter eingeschaltet werden sollen, die derzeit ausgeschaltet sind. 🔆"
},
"initial_transition": {
"description": "Dauer des ersten Übergangs, wenn das Licht von `off` auf `on` schaltet, in Sekunden. ⏲️"
},
"sleep_transition": {
"description": "Dauer des Übergangs, wenn der \"Schlafmodus\" umgeschaltet wird, in Sekunden. 😴"
},
"max_color_temp": {
"description": "Kälteste Farbtemperatur in Kelvin. ❄️"
},
"min_color_temp": {
"description": "Wärmste Farbtemperatur in Kelvin. 🔥"
},
"send_split_delay": {
"description": "Verzögerung (ms) zwischen `separate_turn_on_commands` für Leuchten, die keine gleichzeitige Einstellung von Helligkeit und Farbe unterstützen. ⏲️"
},
"prefer_rgb_color": {
"description": "Ob die RGB-Farbanpassung der Farbtemperaturanpassung vorgezogen werden soll, wenn möglich. 🌈"
}
},
"description": "Ändern Sie alle Einstellungen, die Sie im Schalter wünschen. Alle Optionen hier sind die gleichen wie im config Flow."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Ob das Licht aus der Liste `manual_control` hinzugefügt (`true`) oder entfernt (`false`) werden soll. 🔒"
},
"lights": {
"description": "entity_id(s) der Lichter, wenn nichts angegeben wird, werden alle Lichter des Schalters ausgewählt. 💡"
},
"entity_id": {
"description": "Die `entity_id` des Schalters, in dem das Licht als `manuell gesteuert` (un)markiert werden soll. 📝"
}
},
"description": "Markiere, ob ein Licht \"manuell gesteuert\" ist."
} }
} }
} }

View file

@ -0,0 +1,27 @@
{
"title": "Adaptive Lighting",
"options": {
"step": {
"init": {
"title": "Επιλογές Adaptive Lighting",
"sections": {
"advanced": {
"data": {},
"data_description": {}
}
},
"data": {},
"data_description": {}
}
}
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Προσαρμογή των φώτων μόνο όταν είναι αναμμένα (`true`) ή συνεχής προσαρμογή αυτών (`false`). 🔄"
}
}
}
}
}

View file

@ -4,10 +4,17 @@
"step": { "step": {
"user": { "user": {
"title": "Choose a name for the Adaptive Lighting instance", "title": "Choose a name for the Adaptive Lighting instance",
"description": "Pick a name for this instance. You can run several instances of Adaptive lighting, each of these can contain multiple lights!", "description": "Every instance can contain multiple lights!",
"data": { "data": {
"name": "Name" "name": "Name"
} }
},
"menu": {
"title": "Create or Duplicate",
"description": "Do you want to create a new instance or duplicate an existing one?",
"data": {
"action": "Action"
}
} }
}, },
"abort": { "abort": {
@ -18,35 +25,85 @@
"step": { "step": {
"init": { "init": {
"title": "Adaptive Lighting options", "title": "Adaptive Lighting options",
"description": "All settings for a Adaptive Lighting component. The option names correspond with the YAML settings. No options are shown if you have the adaptive_lighting entry defined in your YAML configuration.", "description": "Configure an Adaptive Lighting component. Option names align with the YAML settings. If you've defined this entry in YAML, no options will appear here. For interactive graphs that demonstrate parameter effects, visit [this web app]({webapp_url}). For further details, see the [official documentation]({docs_url}).",
"data": { "data": {
"lights": "lights", "lights": "lights: List of light entity_ids to be controlled (may be empty). 🌟",
"initial_transition": "initial_transition: When lights turn 'off' to 'on'. (seconds)", "interval": "interval",
"include_config_in_attributes": "include_config_in_attributes: All config options will be listed as attributes under the adaptive-lighting switch this integration creates. (default: false)", "transition": "transition",
"sleep_transition": "sleep_transition: When 'sleep_state' changes. (seconds)", "min_brightness": "min_brightness: Minimum brightness percentage. 💡",
"interval": "interval: Time between switch updates. (seconds)", "max_brightness": "max_brightness: Maximum brightness percentage. 💡",
"max_brightness": "max_brightness: Highest brightness of lights during a cycle. (%)", "min_color_temp": "min_color_temp: Warmest color temperature in Kelvin. 🔥",
"max_color_temp": "max_color_temp: Coldest hue of the color temperature cycle. (Kelvin)", "max_color_temp": "max_color_temp: Coldest color temperature in Kelvin. ❄️",
"min_brightness": "min_brightness: Lowest brightness of lights during a cycle. (%)", "sleep_brightness": "sleep_brightness",
"min_color_temp": "min_color_temp, Warmest hue of the color temperature cycle. (Kelvin)", "sleep_color_temp": "sleep_color_temp"
"only_once": "only_once: Only adapt the lights when turning them on.", },
"prefer_rgb_color": "prefer_rgb_color: Use 'rgb_color' rather than 'color_temp' when possible.", "data_description": {
"separate_turn_on_commands": "separate_turn_on_commands: Separate the commands for each attribute (color, brightness, etc.) in 'light.turn_on' (required for some lights).", "interval": "Frequency to adapt the lights, in seconds. 🔄",
"send_split_delay": "send_split_delay: wait between commands (milliseconds), when separate_turn_on_commands is used. May ensure that both commands are handled by the bulb correctly.", "transition": "Duration of transition when lights change, in seconds. 🕑",
"sleep_brightness": "sleep_brightness, Brightness setting for Sleep Mode. (%)", "sleep_brightness": "Brightness percentage of lights in sleep mode. 😴",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, use 'rgb_color' or 'color_temp'", "sleep_color_temp": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴"
"sleep_rgb_color": "sleep_rgb_color, in RGB", },
"sleep_color_temp": "sleep_color_temp: Color temperature setting for Sleep Mode. (Kelvin)", "sections": {
"sunrise_offset": "sunrise_offset: How long before(-) or after(+) to define the sunrise point of the cycle (+/- seconds)", "advanced": {
"sunrise_time": "sunrise_time: Manual override of the sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "name": "Advanced settings",
"max_sunrise_time": "max_sunrise_time: Manual override of the maximum sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "description": "Additional settings for fine-tuning Adaptive Lighting.",
"sunset_offset": "sunset_offset: How long before(-) or after(+) to define the sunset point of the cycle (+/- seconds)", "data": {
"sunset_time": "sunset_time: Manual override of the sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)", "initial_transition": "initial_transition",
"min_sunset_time": "min_sunset_time: Manual override of the minimum sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)", "prefer_rgb_color": "prefer_rgb_color: Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"take_over_control": "take_over_control: If anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on.", "sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp",
"detect_non_ha_changes": "detect_non_ha_changes: detects all >10% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)", "sleep_rgb_color": "sleep_rgb_color",
"transition": "Transition time when applying a change to the lights (seconds)", "sleep_transition": "sleep_transition",
"adapt_delay": "adapt_delay: wait time between light turn on (seconds), and Adaptive Lights applying changes to the light state. May avoid flickering." "transition_until_sleep": "transition_until_sleep: When enabled, Adaptive Lighting will treat sleep settings as the minimum, transitioning to these values after sunset. 🌙",
"sunrise_time": "sunrise_time",
"min_sunrise_time": "min_sunrise_time",
"max_sunrise_time": "max_sunrise_time",
"sunrise_offset": "sunrise_offset",
"sunset_time": "sunset_time",
"min_sunset_time": "min_sunset_time",
"max_sunset_time": "max_sunset_time",
"sunset_offset": "sunset_offset",
"brightness_mode": "brightness_mode",
"brightness_mode_time_dark": "brightness_mode_time_dark",
"brightness_mode_time_light": "brightness_mode_time_light",
"take_over_control": "take_over_control: Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
"take_over_control_mode": "take_over_control_mode",
"detect_non_ha_changes": "detect_non_ha_changes: Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
"autoreset_control_seconds": "autoreset_control_seconds",
"only_once": "only_once: Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: When turning lights on initially. If set to `true`, AL adapts only if `light.turn_on` is invoked without specifying color or brightness. ❌🌈 This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. Needs `take_over_control` enabled. 🕵️",
"manual_control_on_external_turn_on": "manual_control_on_external_turn_on: Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️",
"reset_manual_control_on_sleep_mode_change": "reset_manual_control_on_sleep_mode_change: Reset manual control when the sleep mode switch is toggled. Set to `false` to preserve manual control across sleep mode changes. 😴",
"separate_turn_on_commands": "separate_turn_on_commands: Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
"send_split_delay": "send_split_delay",
"adapt_delay": "adapt_delay",
"skip_redundant_commands": "skip_redundant_commands: Skip sending adaptation commands whose target state already equals the light's known state. Minimizes network traffic and improves the adaptation responsivity in some situations. 📉Disable if physical light states get out of sync with HA's recorded state.",
"intercept": "intercept: Intercept and adapt `light.turn_on` calls to enabling instantaneous color and brightness adaptation. 🏎️ Disable for lights that do not support `light.turn_on` with color and brightness.",
"multi_light_intercept": "multi_light_intercept: Intercept and adapt `light.turn_on` calls that target multiple lights. ➗⚠️ This might result in splitting up a single `light.turn_on` call into multiple calls, e.g., when lights are in different switches. Requires `intercept` to be enabled.",
"include_config_in_attributes": "include_config_in_attributes: Show all options as attributes on the switch in Home Assistant when set to `true`. 📝",
"expand_light_groups": "expand_light_groups: Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets."
},
"data_description": {
"initial_transition": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
"sleep_rgb_or_color_temp": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
"sleep_rgb_color": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
"sleep_transition": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
"sunrise_time": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
"min_sunrise_time": "Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅",
"max_sunrise_time": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
"sunrise_offset": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
"sunset_time": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
"min_sunset_time": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
"max_sunset_time": "Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇",
"sunset_offset": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
"brightness_mode": "Brightness mode to use. Possible values are `default`, `linear`, and `tanh` (uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness before/after sunrise/sunset. 📈📉",
"brightness_mode_time_light": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness after/before sunrise/sunset. 📈📉.",
"take_over_control_mode": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
"autoreset_control_seconds": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
"send_split_delay": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
"adapt_delay": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️"
}
}
} }
} }
}, },
@ -54,5 +111,189 @@
"option_error": "Invalid option", "option_error": "Invalid option",
"entity_missing": "One or more selected light entities are missing from Home Assistant" "entity_missing": "One or more selected light entities are missing from Home Assistant"
} }
},
"services": {
"apply": {
"name": "apply",
"description": "Applies the current Adaptive Lighting settings to lights.",
"fields": {
"entity_id": {
"description": "The `entity_id` of the switch with the settings to apply. 📝",
"name": "entity_id"
},
"lights": {
"description": "A light (or list of lights) to apply the settings to. 💡",
"name": "lights"
},
"transition": {
"description": "Duration of transition when lights change, in seconds. 🕑",
"name": "transition"
},
"adapt_brightness": {
"description": "Whether to adapt the brightness of the light. 🌞",
"name": "adapt_brightness"
},
"adapt_color": {
"description": "Whether to adapt the color on supporting lights. 🌈",
"name": "adapt_color"
},
"prefer_rgb_color": {
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"name": "prefer_rgb_color"
},
"turn_on_lights": {
"description": "Whether to turn on lights that are currently off. 🔆",
"name": "turn_on_lights"
}
}
},
"set_manual_control": {
"name": "set_manual_control",
"description": "Mark whether a light is 'manually controlled'.",
"fields": {
"entity_id": {
"description": "The `entity_id` of the switch in which to (un)mark the light as being `manually controlled`. 📝",
"name": "entity_id"
},
"lights": {
"description": "entity_id(s) of lights, if not specified, all lights in the switch are selected. 💡",
"name": "lights"
},
"manual_control": {
"description": "Whether to add (\"true\") or remove (\"false\") all adapted attributes of the light from the \"manual_control\" list, or the name of an attribute for selective addition. 🔒",
"name": "manual_control"
}
}
},
"change_switch_settings": {
"name": "change_switch_settings",
"description": "Change any settings you'd like in the switch. All options here are the same as in the config flow.",
"fields": {
"use_defaults": {
"description": "Sets the default values not specified in this service call. Options: \"current\" (default, retains current values), \"factory\" (resets to documented defaults), or \"configuration\" (reverts to switch config defaults). ⚙️",
"name": "use_defaults"
},
"include_config_in_attributes": {
"description": "Show all options as attributes on the switch in Home Assistant when set to `true`. 📝",
"name": "include_config_in_attributes"
},
"turn_on_lights": {
"description": "Whether to turn on lights that are currently off. 🔆",
"name": "turn_on_lights"
},
"initial_transition": {
"description": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
"name": "initial_transition"
},
"sleep_transition": {
"description": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
"name": "sleep_transition"
},
"max_brightness": {
"description": "Maximum brightness percentage. 💡",
"name": "max_brightness"
},
"max_color_temp": {
"description": "Coldest color temperature in Kelvin. ❄️",
"name": "max_color_temp"
},
"min_brightness": {
"description": "Minimum brightness percentage. 💡",
"name": "min_brightness"
},
"min_color_temp": {
"description": "Warmest color temperature in Kelvin. 🔥",
"name": "min_color_temp"
},
"only_once": {
"description": "Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
"name": "only_once"
},
"prefer_rgb_color": {
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
"name": "prefer_rgb_color"
},
"expand_light_groups": {
"description": "Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets.",
"name": "expand_light_groups"
},
"separate_turn_on_commands": {
"description": "Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
"name": "separate_turn_on_commands"
},
"send_split_delay": {
"description": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
"name": "send_split_delay"
},
"sleep_brightness": {
"description": "Brightness percentage of lights in sleep mode. 😴",
"name": "sleep_brightness"
},
"sleep_rgb_or_color_temp": {
"description": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
"name": "sleep_rgb_or_color_temp"
},
"sleep_rgb_color": {
"description": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
"name": "sleep_rgb_color"
},
"sleep_color_temp": {
"description": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴",
"name": "sleep_color_temp"
},
"sunrise_offset": {
"description": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
"name": "sunrise_offset"
},
"sunrise_time": {
"description": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
"name": "sunrise_time"
},
"sunset_offset": {
"description": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
"name": "sunset_offset"
},
"sunset_time": {
"description": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
"name": "sunset_time"
},
"max_sunrise_time": {
"description": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
"name": "max_sunrise_time"
},
"min_sunset_time": {
"description": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
"name": "min_sunset_time"
},
"take_over_control": {
"description": "Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
"name": "take_over_control"
},
"take_over_control_mode": {
"description": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
"name": "take_over_control_mode"
},
"detect_non_ha_changes": {
"description": "Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
"name": "detect_non_ha_changes"
},
"manual_control_on_external_turn_on": {
"description": "Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️",
"name": "manual_control_on_external_turn_on"
},
"transition": {
"description": "Duration of transition when lights change, in seconds. 🕑",
"name": "transition"
},
"adapt_delay": {
"description": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️",
"name": "adapt_delay"
},
"autoreset_control_seconds": {
"description": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
"name": "autoreset_control_seconds"
}
}
}
} }
} }

View file

@ -0,0 +1,218 @@
{
"title": "Iluminación Adaptativa",
"options": {
"step": {
"init": {
"title": "Configuración de la Iluminación Adaptativa",
"data_description": {
"interval": "Frecuencia de adaptación de las luces, en segundos. 🔄",
"transition": "Duración de la transición cuando las luces se adaptan, en segundos. ⏲️",
"sleep_brightness": "Porcentaje de brillo de las luces en el modo noche. 😴",
"sleep_color_temp": "Temperatura de color en modo noche (usado cuando`sleep_rgb_or_color_temp` es `color_temp`) en grados Kelvin. 😴"
},
"data": {
"lights": "lights: Lista de entity_ids de luces a controlar (puede estar vacía). 🌟",
"min_brightness": "min_brightness: Porcentaje mínimo de brillo. 💡",
"max_brightness": "max_brightness: Porcentaje máximo de brillo. 💡",
"min_color_temp": "min_color_temp: Temperatura de color más cálida en grados Kelvin. 🔥",
"max_color_temp": "max_color_temp: Temperatura de color más fría en grados Kelvin. ❄️"
},
"description": "Configura un componente Adaptive Lighting. Los nombres de las opciones se asemejan a las disponibles en la configuración YAML. Si has definido esta entrada en YAML, no aparecerá ninguna opción aquí. Para gráficos interactivos que demuestran los efectos de los parámetros, visita [esta web app]({webapp_url}). Para más detalles, ver la [documentación oficial]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Preferir ajustar el color RGB a la temperatura de color cuando sea posible. 🌈",
"transition_until_sleep": "transition_until_sleep: Cuando habilitado, Adaptive Lighting tratará los ajustes del modo noche como los valores mínimos, transicionando a esos valores tras la puesta del sol. 🌙",
"take_over_control": "take_over_control: Deshabilita Adaptive Lighting si otra fuente llama`light.turn_on` mientras las luces están encendidas y adaptándose. Cuidado, esto llama`homeassistant.update_entity` cada `interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Detecta e interrumpe adaptaciones para cambios de estado no `light.turn_on`. Necesita `take_over_control` habilitado. 🕵️ Precaución: ⚠️ Algunas luces pueden indicar de forma errónea un estado 'on', que puede resultar en luces que se enciendan de forma no esperada. Deshabilita esta función si encuentras dichos problemas.",
"only_once": "only_once: Adapta las luces sólo cuando se encienden (`true`) o mantener adaptadas (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Al encender las luces. Si el valor es `true`, AL adapta sólo si se llama `light.turn_on` sin especificar el color o brillo. ❌🌈 Esto, por ejemplo, previene la adaptación al activar una escena. Si el valor es `false`, AL adapta independientemente de la presencia de color o brillo en `service_data` inicial. Necesita `take_over_control` habilitado. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Usar llamadas independientes a `light.turn_on` para color y brillo, necesario para ciertos tipos de luces. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Evitar mandar comandos de adaptación a luces cuyo estado ya sea el esperado. Reduce tráfico en la red y mejora la respuesta de la adaptación en ciertas situaciones. 📉Deshabilitar si el estado real de las luces se desincroniza con el estado registrado en Home Assistant.",
"intercept": "intercept: Intercepta y adapta llamadas a `light.turn_on` para habilitar adaptaciones instantáneas de color y brillo. 🏎️ Deshabilitar para luces que no soporten `light.turn_on` con color y brillo.",
"multi_light_intercept": "multi_light_intercept: Intercepta y adapta llamadas a `light.turn_on` que apuntan a múltiples luces. ➗⚠️ Esto puede resultar en dividir una única llamada a `light.turn_on` en múltiples llamadas, por ejemplo, cuando las luces están vinculadas a distintos interruptores. Requiere que `intercept` esté habilitado.",
"include_config_in_attributes": "include_config_in_attributes: Muestra todas las opciones como atributes del interruptor en Home Assistant cuando sea `true`. 📝"
},
"data_description": {
"initial_transition": "Duración de la primera transición cuando las luces pasan de `off` a `on` en segundos. ⏲️",
"sleep_rgb_or_color_temp": "Usar el modo`\"rgb_color\"` o `\"color_temp\"` en el modo noche. 🌙",
"sleep_rgb_color": "Color RGB en modo noche(usado cuando `sleep_rgb_or_color_temp` es \"rgb_color\"). 🌈",
"sleep_transition": "Duración de la transición cuando el \"modo noche\" se activa o desactiva, en segundos. 😴",
"sunrise_time": "Fijar una hora (HH:MM:SS) para el amanecer. 🌅",
"min_sunrise_time": "Define el amanecer virtual más temprano (HH:MM:SS), permitiendo amaneceres más tardíos. 🌅",
"max_sunrise_time": "Define el amanecer virtual más tardío (HH:MM:SS), permitiendo amaneceres más tempranos. 🌅",
"sunrise_offset": "Define la hora de la salida del sol con un desfase (positivo o negativo) en segundos. ⏰",
"sunset_time": "Fijar una hora (HH:MM:SS) para el atardecer. 🌇",
"min_sunset_time": "Define el atardecer virtual más temprano (HH:MM:SS), permitiendo atardeceres más tardíos. 🌇",
"max_sunset_time": "Define el atardecer virtual más tardío (HH:MM:SS), permitiendo atardeceres más tempranos. 🌇",
"sunset_offset": "Define la hora de la puesta del sol con un desfase (positivo o negativo) en segundos. ⏰",
"brightness_mode": "Modo de brillo a usar. Valores posibles son: `default`, `linear` y `tanh` (usa`brightness_mode_time_dark` y `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Ignorado si `brightness_mode='default'`) La duración, en segundos, de la transición del brillo después/antes del amanecer/atardecer. 📈📉.",
"brightness_mode_time_light": "(Ignorado si `brightness_mode='default'`) La duración, en segundos, de la transición del brillo después/antes del amanecer/atardecer. 📈📉.",
"take_over_control_mode": "El modo de pausa de adaptación cuando otras fuentes cambian el brillo y/o el color de las luces. `pause_all` siempre pausa tanto la adaptación de brillo como la de color. `pause_changed` pausa la adaptación solo de los atributos cambiados y continúa adaptando los atributos sin cambios, por ejemplo, continúa la adaptación de color cuando solo se cambió el brillo.",
"autoreset_control_seconds": "Resetear automáticamente el control manual tras `X` segundos. Poner a 0 para deshabilitar.",
"send_split_delay": "Retraso (ms) entre `separate_turn_on_commands` para luces que no soportan ajustes simultáneos de brillo y color. ⏲️",
"adapt_delay": "Tiempo de espera (segundos) entre el encendido de la luz y Adaptive Lighting aplicando cambios. Puede ayudar a evitar parpadeos. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Opción no válida",
"entity_missing": "Una o más entidades de luz seleccionadas no se encuentran en Home Assistant"
}
},
"services": {
"apply": {
"fields": {
"lights": {
"description": "Luz (o listado de luces) sobre las que aplicar la configuración. 💡"
},
"transition": {
"description": "Duración de la transición cuando las luces se adaptan, en segundos. ⏲️"
},
"adapt_color": {
"description": "Adaptar (o no) el color en luces que lo soporten. 🌈"
},
"prefer_rgb_color": {
"description": "Preferir ajustes de color RGB a temperatura de color cuando sea posible. 🌈"
},
"turn_on_lights": {
"description": "Encender (o no) luces que estén apagadas. 🔆"
},
"entity_id": {
"description": "El `entity_id` del interruptor con los ajustes a aplicar. 📝"
},
"adapt_brightness": {
"description": "Adaptar (o no) el brillo de la luz. 🌞"
}
},
"description": "Aplica la configuración actual de Adaptive Lighting a las luces."
},
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "Define la hora de la salida del sol con un desfase (positivo o negativo) en segundos. ⏰"
},
"sunset_offset": {
"description": "Define la hora de la puesta del sol con un desfase (positivo o negativo) en segundos. ⏰"
},
"only_once": {
"description": "Adaptar las luces solo cuando se enciendan (`true`) o hacerlo siempre (`false`). 🔄"
},
"sleep_color_temp": {
"description": "Temperatura de color en modo noche (usado cuando`sleep_rgb_or_color_temp` es `color_temp`) en grados Kelvin. 😴"
},
"max_color_temp": {
"description": "Temperatura de color más fría en grados Kelvin. ❄️"
},
"send_split_delay": {
"description": "Retraso (ms) entre `separate_turn_on_commands` para luces que no soportan ajustes simultáneos de brillo y color. ⏲️"
},
"detect_non_ha_changes": {
"description": "detect_non_ha_changes: Detecta e interrumpe adaptaciones para cambios de estado no `light.turn_on`. Necesita `take_over_control` habilitado. 🕵️ Precaución: ⚠️ Algunas luces pueden indicar de forma errónea un estado 'on', que puede resultar en luces que se enciendan de forma no esperada. Deshabilita esta función si encuentras dichos problemas."
},
"take_over_control": {
"description": "Deshabilita Adaptive Lighting si otra fuente llama `light.turn_on` mientras las luces se estan adaptando. Cuidado porque esto llama a `homeassistant.update_entity` cada`interval`! 🔒"
},
"initial_transition": {
"description": "Duración de la primera transición cuando las luces pasan de `off` a `on` en segundos. ⏲️"
},
"transition": {
"description": "Duración de la transición cuando las luces se adaptan, en segundos. ⏲️"
},
"entity_id": {
"description": "ID de la entidad del interruptor. 📝"
},
"sleep_transition": {
"description": "Duración de la transición cuando el \"modo noche\" se activa o desactiva, en segundos. 😴"
},
"min_brightness": {
"description": "Porcentaje mínimo de brillo. 💡"
},
"include_config_in_attributes": {
"description": "Muestra todas las opciones como atributos del interruptor en Home Assistant cuando sea `true`. 📝"
},
"prefer_rgb_color": {
"description": "Preferir ajustes de color RGB a temperatura de color cuando sea posible. 🌈"
},
"turn_on_lights": {
"description": "Encender (o no) luces que estén apagadas. 🔆"
},
"max_brightness": {
"description": "Porcentaje máximo de brillo. 💡"
},
"use_defaults": {
"description": "Define los valores por defecto no especificados en la llamada al servicio. Opciones: \"current\" (predeterminado, mantiene los valores actuales), \"factory\" (resetea a los valores documentados predeterminados), o \"configuration\" (revierte a los valores por defecto del interruptor). ⚙️"
},
"separate_turn_on_commands": {
"description": "Usar llamadas independientes a`light.turn_on` para color y brillo, necesario para cierto tipo de luces. 🔀"
},
"min_color_temp": {
"description": "Temperatura de color más cálida en grados Kelvin. 🔥"
},
"autoreset_control_seconds": {
"description": "Resetear automáticamente el control manual tras `x` segundos. Poner a 0 para deshabilitar. ⏲️"
},
"sleep_brightness": {
"description": "Porcentaje de brillo en el modo noche. 😴"
},
"sleep_rgb_color": {
"description": "Color RGB en modo noche(usado cuando `sleep_rgb_or_color_temp` es \"rgb_color\"). 🌈"
},
"sunrise_time": {
"description": "Fijar una hora (HH:MM:SS) para el amanecer. 🌅"
},
"sunset_time": {
"description": "Fijar una hora (HH:MM:SS) para el atardecer. 🌇"
},
"min_sunset_time": {
"description": "Define el atardecer virtual más temprano (HH:MM:SS), permitiendo atardeceres más tardíos. 🌇"
},
"max_sunrise_time": {
"description": "Define el amanecer virtual más tardío (HH:MM:SS), permitiendo amaneceres más tempranos. 🌅"
},
"sleep_rgb_or_color_temp": {
"description": "Usar el modo`\"rgb_color\"` o `\"color_temp\"` en el modo noche. 🌙"
},
"adapt_delay": {
"description": "Tiempo de espera (segundos) entre el encendido de la luz y Adaptive Lighting aplicando cambios. Puede ayudar a evitar parpadeos. ⏲️"
}
},
"description": "Modifica cualquier ajuste que quieras en el interruptor. Todas las opciones aquí presentes son idénticas a la configuración del flujo."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Añadir (\"true\") o quitar (\"false\") la luz de la lista de `manual_control`. 🔒"
},
"lights": {
"description": "entity_id(s) de las luces, si no se especifica, se seleccionaran todas las luces vinculadas al interruptor. 💡"
},
"entity_id": {
"description": "El `entity_id` del interruptor en el cual (des)marcar la luz como estando `manually controlled`. 📝"
}
},
"description": "Señala si una luz está 'controlada manualmente'."
}
},
"config": {
"step": {
"user": {
"title": "Elige un nombre para la instancia de Adaptive Lighting",
"description": "Cada instancia puede contener múltiples luces!"
},
"menu": {
"title": "Crear o duplicar",
"description": "¿Quieres crear una nueva instancia o duplicar una existente?",
"data": {
"action": "Acción"
}
}
},
"abort": {
"already_configured": "El dispositivo ya está configurado"
}
}
}

View file

@ -21,25 +21,33 @@
"description": "Kohanduva valguse suvandid. Valikute nimetused ühtuvad YAML kirjes olevatega. Valikuid ei kuvata kui seadistus on tehtud YAML kirjes.", "description": "Kohanduva valguse suvandid. Valikute nimetused ühtuvad YAML kirjes olevatega. Valikuid ei kuvata kui seadistus on tehtud YAML kirjes.",
"data": { "data": {
"lights": "valgustid", "lights": "valgustid",
"initial_transition": "Algne üleminek kui valgustid lülituvad sisse/välja või unerežiim muutub",
"interval": "Intervall, aeg muutuste vahel sekundites", "interval": "Intervall, aeg muutuste vahel sekundites",
"max_brightness": "Suurim heledus %", "transition": "Üleminekud, sekundites",
"max_color_temp": "Suurim värvustemperatuur Kelvinites",
"min_brightness": "Vähim heledus %", "min_brightness": "Vähim heledus %",
"max_brightness": "Suurim heledus %",
"min_color_temp": "Vähim värvustemperatuur Kelvinites", "min_color_temp": "Vähim värvustemperatuur Kelvinites",
"only_once": "Ainult üks kord, rakendub ainult valgusti sisselülitamisel", "max_color_temp": "Suurim värvustemperatuur Kelvinites",
"prefer_rgb_color": "Eelista RGB värve, võimalusel kasuta RGB sätteid värvustemperatuuri asemel",
"separate_turn_on_commands": "Eraldi lülitused iga valiku (värvus, heledus jne.) sisselülitamiseks, mõned valgustid vajavad seda.",
"sleep_brightness": "Unerežiimi heledus %", "sleep_brightness": "Unerežiimi heledus %",
"sleep_color_temp": "Uneržiimi värvus Kelvinites", "sleep_color_temp": "Uneržiimi värvus Kelvinites"
"sunrise_offset": "Nihe päikesetõusust, +/- sekundit", },
"sunrise_time": "Päikesetõusu aeg 'HH:MM:SS' vormingus. (Kui jätta tühjaks kasutatakse asukohajärgset)", "sections": {
"sunset_offset": "Nihe päikeseloojangust, +/- sekundit", "advanced": {
"sunset_time": "Päikeseloojangu aeg 'HH:MM:SS' vormingus. (Kui jätta tühjaks kasutatakse asukohajärgset)", "data": {
"take_over_control": "Käsitsi juhtimine: kui miski peale kohanduva valguse enda lültiab valgusti sisse ja see juba põleb, katkesta kohandamine kuni järgmise välise lülitamiseni.", "initial_transition": "Algne üleminek kui valgustid lülituvad sisse/välja või unerežiim muutub",
"detect_non_ha_changes": "Märka väliseid lülitusi: kui mõni säte muutub üle 10% (isegi väljaspoolt HA juhituna) siis peab käsitsi juhtimine olema lubatud (kutsutakse 'homeassistant.update_entity')'interval'!)", "prefer_rgb_color": "Eelista RGB värve, võimalusel kasuta RGB sätteid värvustemperatuuri asemel",
"transition": "Üleminekud, sekundites" "sunrise_time": "Päikesetõusu aeg 'HH:MM:SS' vormingus. (Kui jätta tühjaks kasutatakse asukohajärgset)",
} "sunrise_offset": "Nihe päikesetõusust, +/- sekundit",
"sunset_time": "Päikeseloojangu aeg 'HH:MM:SS' vormingus. (Kui jätta tühjaks kasutatakse asukohajärgset)",
"sunset_offset": "Nihe päikeseloojangust, +/- sekundit",
"take_over_control": "Käsitsi juhtimine: kui miski peale kohanduva valguse enda lültiab valgusti sisse ja see juba põleb, katkesta kohandamine kuni järgmise välise lülitamiseni.",
"detect_non_ha_changes": "Märka väliseid lülitusi: kui mõni säte muutub üle 10% (isegi väljaspoolt HA juhituna) siis peab käsitsi juhtimine olema lubatud (kutsutakse 'homeassistant.update_entity')'interval'!)",
"only_once": "Ainult üks kord, rakendub ainult valgusti sisselülitamisel",
"separate_turn_on_commands": "Eraldi lülitused iga valiku (värvus, heledus jne.) sisselülitamiseks, mõned valgustid vajavad seda."
},
"data_description": {}
}
},
"data_description": {}
} }
}, },
"error": { "error": {

View file

@ -0,0 +1,210 @@
{
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Valojen kirkkausmäärä prosenteissa unitilassa (sleep mode)."
},
"sunrise_offset": {
"description": "Muuta auringonnousun aikaa positiivisella tai negatiivisella korjauksella määritettynä sekunneissa."
},
"initial_transition": {
"description": "Ensimmäisen siirtymän kesto sekunneissa, kun valot kytketään 'off'-tilasta 'on'-tilaan."
},
"autoreset_control_seconds": {
"description": "Resetoi manuaalisen ohjauksen automaattisesti määritetyn sekuntimäärän jälkeen. Aseta arvoon 0 jos et halua käyttää asetusta."
},
"only_once": {
"description": "Adaptoi valoja vain kun ne kytketään päälle ('true') tai adaptoi niitä jatkuvasti ('false')"
},
"max_color_temp": {
"description": "Kylmin värilämpötila Kelvin-asteikolla."
},
"sunset_offset": {
"description": "Muuta auringonlaskun aikaa positiivisella tai negatiivisella korjauksella määritettynä sekunneissa."
},
"send_split_delay": {
"description": "Viive (ms) `separate_turn_on_commands` välillä valoille, jotka eivät tue yhtäaikaista kirkkauden ja värilämpötilan säätöä."
},
"transition": {
"description": "Valojen siirtymän kesto sekunneissa, kun valaistusta muutetaan."
},
"sleep_color_temp": {
"description": "Värilämpötila lepotilassa (käytetään, kun `sleep_rgb_or_color_temp` on `color_temp`) kelvineinä. 😴"
},
"detect_non_ha_changes": {
"description": "Havaitsee ja pysäyttää mukautukset ei-\"light.turn_on\" -tilanmuutoksille. Vaatii \"take_over_control\":n käyttöönoton. 🕵️ Varoitus: ⚠️ Jotkut valot saatavat osoittaa virheellisesti 'on'-tilan, mikä voi johtaa valojen syttymiseen odottamatta. Poista tämä ominaisuus käytöstä, jos kohtaat tällaisia ongelmia."
},
"sunrise_time": {
"description": "Aseta kiinteä aika (TT:MM:SS) auringonnousulle. 🌅"
},
"use_defaults": {
"description": "Asettaa oletusarvot, joita ei ole määritetty tässä palvelukutsussa. Vaihtoehdot: \"nykyinen\" (oletus, säilyttää nykyiset arvot), \"tehdas\" (palauttaa dokumentoituihin oletusasetuksiin) tai \"kokoonpano\" (palaa kokoonpanon oletusasetusten vaihtamiseksi). ⚙️"
},
"max_sunrise_time": {
"description": "Aseta viimeisin virtuaalinen auringonnousuaika (TT:MM:SS), aikaisempia auringonnousuja sallien. 🌅"
},
"separate_turn_on_commands": {
"description": "Käytä erillisiä \"light.turn_on\" -kutsuja värin ja kirkkauden määrittämiseksi, joita tarvitaan joissakin valotyypeissä. 🔀"
},
"entity_id": {
"description": "Kytkimen entiteettitunnus. 📝"
},
"turn_on_lights": {
"description": "Sytytetäänkö valot, jotka ovat tällä hetkellä pois päältä. 🔆"
},
"include_config_in_attributes": {
"description": "Näytä kaikki vaihtoehdot attribuutteina kotiavustajan kytkimellä, kun sen arvo on \"true\". 📝"
},
"sleep_transition": {
"description": "Siirtymän kesto, kun \"lepotila\" vaihdetaan sekunneiksi. 😴"
},
"max_brightness": {
"description": "Enimmäiskirkkausprosentti. 💡"
},
"min_brightness": {
"description": "Vähittäiskirkkausprosentti. 💡"
},
"sleep_rgb_color": {
"description": "RGB-väri lepotilassa (käytetään, kun `sleep_rgb_or_color_temp` on \"rgb_color\"). 🌈"
},
"sunset_time": {
"description": "Aseta kiinteä aika (TT:MM:SS) auringonlaskulle. 🌇"
},
"sleep_rgb_or_color_temp": {
"description": "Käytä joko `\"rgb_color\"` tai `\"color_temp\"` lepotilassa. 🌙"
},
"min_color_temp": {
"description": "Lämpimin värilämpötila kelvineissä. 🔥"
},
"prefer_rgb_color": {
"description": "Halutaanko RGB-värinsäätö mieluummin valon värilämpötilan sijaan, kun mahdollista. 🌈"
},
"take_over_control": {
"description": "Poista Adaptive Lighting käytöstä, jos toinen lähde kutsuu `light.turn_on`, kun valot ovat päällä ja niitä mukautetaan. Huomaa, että tämä kutsuu `homeassistant.update_entity` joka `interval`! 🔒"
},
"min_sunset_time": {
"description": "Aseta aikaisin virtuaalinen auringonlaskuaika (TT:MM:SS), myöhempiä auringonlaskuja sallien. 🌇"
},
"adapt_delay": {
"description": "Odotusaika (sekunteina) valon syttymisen ja Adaptive Lightingin muutosten käyttöönoton välillä. Saattaa auttaa välttämään välkkymistä. ⏲️"
}
},
"description": "Muuta haluamiasi asetuksia kytkimessä. Kaikki vaihtoehdot ovat samat kuin kokoonpanon kulussa."
},
"apply": {
"description": "Asettaa nykyiset Adaptiivisen Valaistuksen asetukset valoihin.",
"fields": {
"lights": {
"description": "Valo (tai lista valoista) joihin näitä asetuksia sovelletaan."
},
"transition": {
"description": "Valojen siirtymän kesto sekunneissa, kun valaistusta muutetaan."
},
"entity_id": {
"description": "Kytkimen `entity_id` ja käytettävät asetukset. 📝"
},
"adapt_brightness": {
"description": "Mukautetaanko valon kirkkautta. 🌞"
},
"adapt_color": {
"description": "Mukautetaanko tukivalojen väriä. 🌈"
},
"prefer_rgb_color": {
"description": "Halutaanko RGB-värinsäätö mieluummin valon värilämpötilan sijaan, kun mahdollista. 🌈"
},
"turn_on_lights": {
"description": "Sytytetäänkö valot, jotka ovat tällä hetkellä pois päältä. 🔆"
}
}
},
"set_manual_control": {
"fields": {
"lights": {
"description": "Valojen entity_id(s), jos sitä ei ole määritetty, kaikki kytkimen valot valitaan. 💡"
},
"entity_id": {
"description": "Kytkimen `entity_id`, jolla valo määritetään `manuaalisesti ohjattavaksi`. 📝"
},
"manual_control": {
"description": "Lisätäänkö (\"true\") vai poistetaanko (\"false\") valo \"manual_control\"-luettelosta. 🔒"
}
},
"description": "Merkitse, onko valo 'manuaalisesti ohjattu'."
}
},
"title": "Adaptiivinen valaistus",
"options": {
"step": {
"init": {
"data_description": {
"interval": "Tiheys valojen mukauttamiseen sekunneissa. 🔄",
"transition": "Valojen siirtymän kesto sekunneissa, kun valaistusta muutetaan.",
"sleep_brightness": "Valojen kirkkausmäärä prosenteissa unitilassa (sleep mode).",
"sleep_color_temp": "Värilämpötila lepotilassa (käytetään, kun `sleep_rgb_or_color_temp` on `color_temp`) kelvineinä. 😴"
},
"description": "Määritä Adaptive Lighting -komponentti. Vaihtoehtojen nimet vastaavat YAML-asetuksia. Jos olet määrittänyt tämän merkinnän YAML:ssa, tässä ei näy vaihtoehtoja. Interaktiiviset kaaviot, jotka esittelevät parametrien vaikutuksia, on [tässä verkkosovelluksessa]({webapp_url}). Lisätietoja löytyy [virallisesta dokumentaatiosta]({docs_url}).",
"data": {
"lights": "lights: Luettelo ohjattavista valon entity_ids:stä (voi olla tyhjä). 🌟",
"min_brightness": "min_brightness: Vähittäiskirkkausprosentti. 💡",
"max_brightness": "max_brightness: Enimmäiskirkkausprosentti. 💡",
"min_color_temp": "min_color_temp: Lämpimin värilämpötila kelvineinä. 🔥",
"max_color_temp": "max_color_temp: Kylmin värilämpötila kelvineinä. ❄️"
},
"title": "Adaptive Lightingin vaihtoehdot",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: valitaanko RGB-värien säätö valon värilämpötilan sijaan, kun mahdollista. 🌈",
"transition_until_sleep": "shift_until_sleep: Kun käytössä, Adaptive Lighting käsittelee lepoasetukset miniminä ja siirtyy näihin arvoihin auringonlaskun jälkeen. 🌙",
"take_over_control": "take_over_control: Poista mukautuva valaistus käytöstä, jos toinen lähde kutsuu `light.turn_on`, kun valot ovat päällä ja niitä mukautetaan. Huomaa, että tämä kutsuu `homeassistant.update_entity` joka `interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Havaitsee ja pysäyttää mukautukset ei-\"light.turn_on\" -tilanmuutoksille. Vaatii \"take_over_control\" käyttöönoton. 🕵️ Varoitus: ⚠️ Jotkut valot saatavat osoittaa virheellisesti 'on'-tilan, mikä voi johtaa valojen syttymiseen odottamatta. Poista tämä ominaisuus käytöstä, jos kohtaat tällaisia ongelmia.",
"only_once": "only_once: Mukauta valot vain, kun ne ovat päällä (\"true\") tai mukauta niitä jatkuvasti (\"false\"). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Kun valot sytytetään ensimmäisen kerran. Jos asetuksena on \"true\", Adaptive Lighting mukautuu vain, jos \"light.turn_on\" kutsutaan määrittelemättä väriä tai kirkkautta. ❌🌈 Tämä esimerkiksi estää mukautumisen näkymää aktivoitaessa. Jos \"false\", Adaptive Lighting mukautuu riippumatta siitä, onko alkuperäisessä \"service_data\"-arvossa väri tai kirkkaus. Vaatii \"take_over_control\":n käyttöönoton. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Käytä erillisiä `light.turn_on`-kutsuja värin ja kirkkauden määrittämiseksi, joita tarvitaan joissakin valotyypeissä. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Ohita mukautuskomentojen lähettäminen, joiden kohdetila on jo yhtä suuri kuin valon tunnettu tila. Minimoi verkkoliikenteen ja parantaa mukautumisvastetta joissain tilanteissa. 📉 Poista käytöstä, jos fyysiset valotilat eivät ole synkronoitu kotiavustajan tallennetun tilan kanssa.",
"intercept": "intercept: sieppaa ja mukauta \"light.turn_on\"-kutsut mahdollistamaan välitön värin ja kirkkauden mukauttaminen. 🏎️ Poista käytöstä valot, jotka eivät tue \"light.turn_on\" värin ja kirkkauden kanssa.",
"multi_light_intercept": "multi_light_intercept: sieppaa ja mukauta light.turn_on-kutsut, jotka kohdistuvat useisiin valoihin. ➗⚠️ Tämä saattaa johtaa yksittäisen light.turn_on-kutsun jakamiseen useiksi kutsuiksi, esimerkiksi kun valot ovat eri kytkimissä. Vaadi `intercept`:n käyttöönotto.",
"include_config_in_attributes": "include_config_in_attributes: Näytä kaikki vaihtoehdot attribuutteina Kotiavustajan kytkimessä, kun asetuksena on \"true\". 📝"
},
"data_description": {
"initial_transition": "Ensimmäisen siirtymän kesto sekunneissa, kun valot kytketään 'off'-tilasta 'on'-tilaan.",
"sleep_rgb_or_color_temp": "Käytä joko `\"rgb_color\"` tai `\"color_temp\"` lepotilassa. 🌙",
"sleep_rgb_color": "RGB-väri lepotilassa (käytetään, kun `sleep_rgb_or_color_temp` on \"rgb_color\"). 🌈",
"sleep_transition": "Siirtymän kesto, kun \"lepotila\" vaihdetaan sekunneiksi. 😴",
"sunrise_time": "Aseta kiinteä aika (TT:MM:SS) auringonnousulle. 🌅",
"min_sunrise_time": "Aseta aikaisin virtuaalinen auringonnousuaika (TT:MM:SS), myöhempiä auringonnousuja sallien. 🌅",
"max_sunrise_time": "Aseta aikaisin virtuaalinen auringonnousuaika (TT:MM:SS), aikaisempia auringonnousuja sallien. 🌅",
"sunrise_offset": "Muuta auringonnousun aikaa positiivisella tai negatiivisella korjauksella määritettynä sekunneissa.",
"sunset_time": "Aseta kiinteä aika (TT:MM:SS) auringonlaskulle. 🌇",
"min_sunset_time": "Aseta aikaisin virtuaalinen auringonlaskuaika (TT:MM:SS), myöhempiä auringonlaskuja sallien. 🌅",
"max_sunset_time": "Aseta viimeisin virtuaalinen auringonlaskuaika (TT:MM:SS), jotta aikaisemmat auringonlaskut ovat mahdollisia. 🌇",
"sunset_offset": "Muuta auringonlaskun aikaa positiivisella tai negatiivisella korjauksella määritettynä sekunneissa.",
"brightness_mode": "Kirkkaus-moodi jota käytetään. Mahdolliset arvot ovat `default`, `linear`, and `tanh` (käyttää arvoja `brightness_mode_time_dark` ja `brightness_mode_time_light`).",
"brightness_mode_time_dark": "(Ohitetaan, jos `brightness_mode='default'`) Kesto sekunteina kirkkauden lisäämiseen/vähentämiseen auringonnousun/auringonlaskun jälkeen/ennen. 📈📉.",
"brightness_mode_time_light": "(Ohitetaan, jos `brightness_mode='default'`) Kesto sekunteina kirkkauden lisäämiseen/vähentämiseen auringonnousun/auringonlaskun jälkeen/ennen. 📈📉.",
"autoreset_control_seconds": "Resetoi manuaalisen ohjauksen automaattisesti määritetyn sekuntimäärän jälkeen. Aseta arvoon 0 jos et halua käyttää asetusta.",
"send_split_delay": "Viive (ms) `separate_turn_on_commands` välillä valoille, jotka eivät tue yhtäaikaista kirkkauden ja värilämpötilan säätöä.",
"adapt_delay": "Odotusaika (sekunteina) valon syttymisen ja Adaptive Lightingin muutosten käyttöönoton välillä. Saattaa auttaa välttämään välkkymistä. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Virheellinen vaihtoehto",
"entity_missing": "Kotiavustajasta puuttuu yksi tai useampi valittu valoentiteetti"
}
},
"config": {
"step": {
"user": {
"title": "Valitse nimi tälle Adaptiivisen Valaistuksen esiintymälle",
"description": "Jokainen esiintymä voi sisältää useita valoja!"
}
},
"abort": {
"already_configured": "Tämä laite on jo määritetty"
}
}
}

View file

@ -4,10 +4,14 @@
"step": { "step": {
"user": { "user": {
"title": "Choisissez un nom pour cette instance d'éclairage adaptatif", "title": "Choisissez un nom pour cette instance d'éclairage adaptatif",
"description": "Choisissez un nom pour cette instance. Vous pouvez configurer plusieurs instances d'éclairage adaptatif, chacune pouvant contrôler plusieurs lampes !", "description": "Chaque instance peut contenir plusieurs lumières",
"data": { "data": {
"name": "Nom" "name": "Nom"
} }
},
"menu": {
"title": "Créer ou dupliquer",
"description": "Voulez-vous créer une nouvelle instance, ou dupliquer une existante?"
} }
}, },
"abort": { "abort": {
@ -18,34 +22,206 @@
"step": { "step": {
"init": { "init": {
"title": "Options d'éclairage adaptatif", "title": "Options d'éclairage adaptatif",
"description": "Tous les paramètres de l'instance d'éclairage adaptatif. Les noms des options correspondent aux paramètres YAML. Aucune option n'est affichée si l'entrée adaptive_lighting est définie dans votre configuration YAML.", "description": "Configurer un composant d'éclairage adaptatif. Les noms correspondent aux paramètres YAML. Si vous avez défini cette entrée en YAML, aucune option n'apparaît ici. Pour les graphiques interactifs qui montrent les effets des paramètres, visiter [cette application web]({webapp_url}). Pour plus de détail, voir la [documentation]({docs_url})",
"data": { "data": {
"lights": "lights : Les lampes à contrôler", "lights": "lights : Liste d'\"entity_ids\" de lumières à controller (peu être vide). 🌟",
"initial_transition": "initial_transition : Transition (en secondes) lorsque l'état d'une lampe passe d'« éteinte » à « allumée ».",
"sleep_transition": "sleep_transition : Transition (en secondes) lorsque « sleep_state » est commuté.",
"interval": "interval : Temps (en secondes) entre deux mises à jour du commutateur.", "interval": "interval : Temps (en secondes) entre deux mises à jour du commutateur.",
"max_brightness": "max_brightness : Luminosité maximale des lampes (en pourcentage) au cours d'un cycle.", "transition": "transition : Durée de la transition (en secondes) des changements appliqués aux lampes.",
"max_color_temp": "max_color_temp : Couleur la plus froide (en kelvins) du cycle de température de couleur.", "min_brightness": "min_brightness : Luminosité minimale en pourcentage. 💡",
"min_brightness": "min_brightness : Luminosité minimale des lampes (en pourcentage) au cours d'un cycle.", "max_brightness": "max_brightness : Luminosité maximum (en pourcentage). 💡",
"min_color_temp": "min_color_temp : Couleur la plus chaude (en kelvins) du cycle de température de couleur.", "min_color_temp": "min_color_temp : Couleur de température la plus chaude en kelvins. 🔥",
"only_once": "only_once : Adapter les lampes uniquement au moment où elles sont allumées.", "max_color_temp": "max_color_temp : Couleur la plus froide (en Kelvins). ❄️",
"prefer_rgb_color": "prefer_rgb_color : Utiliser « rgb_color » plutôt que « color_temp » lorsque cela est possible.",
"separate_turn_on_commands": "separate_turn_on_commands : Séparer les commandes pour chaque attribut (couleur, luminosité, etc.) de « light.turn_on » (nécessaire pour certaines lampes).",
"sleep_brightness": "sleep_brightness : Luminosité (en pourcentage) du mode nuit.", "sleep_brightness": "sleep_brightness : Luminosité (en pourcentage) du mode nuit.",
"sleep_color_temp": "sleep_color_temp : Température de couleur (en kelvins) du mode nuit.", "sleep_color_temp": "sleep_color_temp : Température de couleur (en kelvins) du mode nuit."
"sunrise_offset": "sunrise_offset : Décalage (en secondes [- : passé, + : futur]) du cycle par rapport au lever du soleil.", },
"sunrise_time": "sunrise_time : Heure (HH:MM:SS) du lever du soleil. Si « None », utilise l'heure correspondant à votre emplacement.", "data_description": {
"sunset_offset": "sunset_offset : Décalage (en secondes [- : passé, + : futur]) du cycle par rapport au coucher du soleil.", "interval": "Fréquence d'adaptation des lumières, en secondes. 🔄",
"sunset_time": "sunset_time : Heure (HH:MM:SS) du coucher du soleil. Si « None », utilise l'heure correspondant à votre emplacement.", "transition": "Durée de la transition des changements lumineux, en secondes. 🕑",
"take_over_control": "take_over_control : Si quelque chose d'autre que l'éclairage adaptatif appelle « light.turn_on » alors qu'une lampe est déjà allumée, cesser d'adapter cette lampe jusqu'à ce qu'elle (ou le commutateur) soit éteinte puis rallumée.", "sleep_brightness": "Pourcentage de luminosité des lumières en mode nuit. 😴",
"detect_non_ha_changes": "detect_non_ha_changes : Détecter tout changement de plus de 10 % appliqué aux lampes (même en dehors de HA). Nécessite que « take_over_control » soit activé. (Appelle « homeassistant.update_entity » tous les « interval » !)", "sleep_color_temp": "Température de couleur en mode nuit en Kelvin (utilisée lorsque \"sleep_rgb_or_color_temp\" est égaler à \"color_temp\") . 😴"
"transition": "transition : Durée de la transition (en secondes) des changements appliqués aux lampes." },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition : Transition (en secondes) lorsque l'état d'une lampe passe d'« éteinte » à « allumée ».",
"prefer_rgb_color": "prefer_rgb_color : Indique s'il est préférable d'utiliser le réglage de couleur RBG plutôt que la température de couleur lorsque cela est possible. 🌈",
"sleep_transition": "sleep_transition : Transition (en secondes) lorsque « sleep_state » est commuté.",
"transition_until_sleep": "transition_until_sleep : Lorsque cela est activée, l'éclairage Adaptatif considérera les paramètres du mode nuit comme le minimum, effectuant la transition vers ces valeurs après le coucher du soleil. 🌙",
"sunrise_time": "sunrise_time : Heure (HH:MM:SS) du lever du soleil. Si « None », utilise l'heure correspondant à votre emplacement.",
"sunrise_offset": "sunrise_offset : Décalage (en secondes [- : passé, + : futur]) du cycle par rapport au lever du soleil.",
"sunset_time": "sunset_time : Heure (HH:MM:SS) du coucher du soleil. Si « None », utilise l'heure correspondant à votre emplacement.",
"sunset_offset": "sunset_offset : Décalage (en secondes [- : passé, + : futur]) du cycle par rapport au coucher du soleil.",
"take_over_control": "take_over_control : Désactive l'éclairage adaptatif si une autre source appelle \"light.turn_on\" pendant que la lumière est allumée ou adoptée. Notez que cela appelle \"homeassistant.update_entity\" chaque \"interval\"! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes : Détecter et arrête les changement d'états autre que \"light.turn_on\". Nécessite que \"take_over_control\" soit activé. 🕵️ Attention : ⚠️ Certaines lumière peuvent faussement indiqué un état \"on\", ce qui pourrait occasionner des lumières s'allumant de façon inattendu. Désactivez cette fonctionnalité si vous rencontrez de tels problème.",
"only_once": "only_once : Adapter les lampes uniquement au moment où elles sont allumées. 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Lors de l'allumage initiale des lumières. Si le paramètre est \"vrai\", AL s'adapte uniquement si l'on invoque \"light.turn_on\" sans préciser la couleur ou la luminosité. ❌🌈 Ceci, par exemple, empêche l'adaptation lors de l'activation d'une scène. Si \"false\", AL adapte indépendamment de la présence de couleur ou de luminosité dans le \"service_data\" initial. \"take_over_control\" doit être activé. 🕵",
"separate_turn_on_commands": "separate_turn_on_commands : Utiliser des appels \"light.turn_on\" séparés pour la couleur et la luminosité, nécessaires pour certains types de lumière. 🔀",
"skip_redundant_commands": "skip_redundant_commands : Évite d'envoyer des commandes d'adaptation lorsque l'état cible est déjà égal à l'état connu de la lumière. Minimise le trafic réseau et améliore la réactivité de l'adaptation dans certaines situations. 📉 Désactivez si les états physiques des lumières ne correspondent pas à l'état enregistré de Home Assistant.",
"intercept": "intercept : Intercepter et adapter les appels à \"light.turn_on\" pour permettre une adaptation instantanée de la couleur et de la luminosité. 🏎️ Désactivez cette option pour les lumières qui ne prennent pas en charge \"light.turn_on\" avec couleur et luminosité.",
"multi_light_intercept": "multi_light_intercept : Intercepte et adapte les appels à \"light.turn_on\" qui ciblent plusieurs lumières. ➗⚠️ Cela peut entraîner la division d'un seul appel \"light.turn_on\" en plusieurs appels, par exemple, lorsque les lumières sont dans différents interrupteurs. Nécessite que \"intercept\" soit activé.",
"include_config_in_attributes": "include_config_in_attributes : Afficher toutes les options en tant qu'attributs sur l'interrupteur dans Home Assistant lorsqu'il est défini sur \"true\". 📝"
},
"data_description": {
"initial_transition": "Durée de la première transition des lampes passent de \"off\" à \"on\" (en secondes). ⏲️",
"sleep_rgb_or_color_temp": "Utilisez soit \"rgb_color\" soit \"color_temp\" en mode nuit. 🌙",
"sleep_rgb_color": "Couleur RGB en mode nuit (utilisée lorsque \"sleep_rgb_or_color_temp\" est \"rgb_color\"). 🌈",
"sleep_transition": "Durée de la transition quand le \"mode nuit\" est déclenché. (en secondes) 😴",
"sunrise_time": "Définir une heure fixe (HH:MM:SS) pour le lever du soleil. 🌅",
"min_sunrise_time": "Définir l'heure virtuelle de lever du soleil la plus précoce (HH:MM:SS), permettant des levers de soleil tardifs. 🌅",
"max_sunrise_time": "Définir l'heure virtuelle de lever du soleil la plus tardive (HH:MM:SS), permettant des levers de soleil plus tôt. 🌅",
"sunrise_offset": "Ajuster l'heure du lever de soleil avec un décalage positif ou négatif en secondes. ⏰",
"sunset_time": "Définir une heure fixe (HH:MM:SS) pour le coucher du soleil. 🌇",
"min_sunset_time": "Définir l'heure virtuelle de coucher du soleil la plus précoce (HH:MM:SS), permettant des couchers de soleil tardifs. 🌇",
"max_sunset_time": "Définir l'heure virtuelle de coucher du soleil la plus tardive (HH:MM:SS), permettant des couchers de soleil plus précoces. 🌇",
"sunset_offset": "Réglez le l'heure de coucher du soleil avec un décalage positif ou négatif en quelques secondes. ⏰",
"brightness_mode": "Mode de luminosité à utiliser. Les valeurs possibles sont \"défaut\" , \"linear\" (linéaire) et \"tanh\" (tangente) utilise \"brightness_mode_time_dark\" et \"brightness_mode_time_light\". 📈",
"brightness_mode_time_dark": "(Ignoré si \"brightness_mode='default'\") La durée en secondes pour augmenter/diminuer progressivement la luminosité après/avant le lever/coucher du soleil. 📈📉.",
"brightness_mode_time_light": "(Ignoré si \"brightness_mode='default'\") La durée en secondes pour augmenter/diminuer progressivement la luminosité après/avant le lever/coucher du soleil. 📈📉.",
"autoreset_control_seconds": "Réinitialiser automatiquement la commande manuelle après un certain nombre de secondes. Définir à 0 pour désactiver. ⏲️",
"send_split_delay": "Délai (ms) entre \"separate_turn_on_commands\" pour les lumières qui ne supportent pas la commande de luminosité et le réglage de couleur en même temps. ⏲️",
"adapt_delay": "Temps d'attente (en secondes) entre l'allumage de la lumière et l'application des changements par l'Éclairage Adaptatif. Peut aider à éviter les scintillements. ⏲️"
}
}
} }
} }
}, },
"error": { "error": {
"option_error": "Option non valide", "option_error": "Option invalide",
"entity_missing": "Une lumière sélectionnée na pas été trouvée" "entity_missing": "Une ou plusieurs entités lumières sélectionnées sont manquantes de Home Assistant"
}
},
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Pourcentage de luminosité des lumières en mode nuit. 😴"
},
"only_once": {
"description": "Adapter les lumières seulement quand elles sont allumées (\"vrai\") ou quel que soit leur état (\"faux\")."
},
"sunrise_offset": {
"description": "Ajustez l'heure de lever de soleil avec un décalage positif ou négatif en secondes. ⏰"
},
"max_color_temp": {
"description": "Température de couleur la plus froide en Kelvin. ❄️"
},
"send_split_delay": {
"description": "Délai (ms) entre \"separate_turn_on_commands\" pour les lumières qui ne supportent pas la commande de luminosité et le réglage de couleur en même temps. ⏲️"
},
"detect_non_ha_changes": {
"description": "detect_non_ha_changes : Détecter et arrête les changement d'états autre que \"light.turn_on\". Nécessite que \"take_over_control\" soit activé. 🕵️ Attention : ⚠️ Certaines lumière peuvent faussement indiqué un état \"on\", ce qui pourrait occasionner des lumières s'allumant de façon inattendu. Désactivez cette fonctionnalité si vous rencontrez de tels problème."
},
"autoreset_control_seconds": {
"description": "Réinitialiser automatiquement la commande manuelle après un certain nombre de secondes. Définir à 0 pour désactiver. ⏲️"
},
"sunset_offset": {
"description": "Ajustez l'heure de coucher de soleil avec un décalage positif ou négatif en secondes. ⏰"
},
"sleep_color_temp": {
"description": "Température de couleur en mode nuit en Kelvin (utilisé lorsque \"sleep_rgb_or_color_temp\" est défini sur \"color_temp\") . 😴"
},
"entity_id": {
"description": "ID de l'Entité de l'interrupteur. 📝"
},
"initial_transition": {
"description": "Durée de la première transition des lampes passant de \"off\" à \"on\" (en secondes). ⏲️"
},
"transition": {
"description": "Durée de la transition des changements lumineux, en secondes. 🕑"
},
"sleep_transition": {
"description": "Durée de la transition quand le \"mode nuit\" est déclenché en secondes. 😴"
},
"min_brightness": {
"description": "Pourcentage de luminosité minimum. 💡"
},
"sunrise_time": {
"description": "Définir une heure fixe (HH:MM:SS) pour le lever du soleil. 🌅"
},
"max_brightness": {
"description": "Pourcentage de luminosité maximale. 💡"
},
"take_over_control": {
"description": "Désactiver l'Éclairage Adaptatif si une autre source appelle \"light.turn_on\" lorsque les lumières sont allumées et en cours d'adaptation. Notez que cela appelle \"homeassistant.update_entity\" à chaque \"intervalles\"! 🔒"
},
"use_defaults": {
"description": "Définit les valeurs par défaut non spécifiées dans cet appel de service. Options : \"current\" (par défaut, conserve les valeurs actuelles), \"factory\" (réinitialise aux valeurs par défaut documentées) ou \"configuration\" (revient aux valeurs par défaut de la configuration de l'interrupteur). ⚙️"
},
"sunset_time": {
"description": "Définir une heure fixe (HH:MM:SS) pour le coucher du soleil. 🌇"
},
"min_sunset_time": {
"description": "Définir l'heure virtuelle de coucher du soleil la plus précoce (HH:MM:SS), permettant des couchers de soleil tardifs. 🌇"
},
"max_sunrise_time": {
"description": "Définir l'heure virtuelle du lever du soleil la plus tardive (HH:MM:SS), permettant des levers de soleil plus tôt. 🌅"
},
"min_color_temp": {
"description": "Température de couleur la plus chaude en Kelvin. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Utilisez soit \"rgb_color\" soit \"color_temp\" en mode nuit. 🌙"
},
"turn_on_lights": {
"description": "Indique s'il faut allumer les lumières qui sont actuellement éteintes. 🔆"
},
"include_config_in_attributes": {
"description": "Afficher toutes les options en tant qu'attributs sur l'interrupteur dans Home Assistant lorsqu'il est défini sur \"true\". 📝"
},
"sleep_rgb_color": {
"description": "Couleur RGB en mode nuit (utilisée lorsque `sleep_rgb_or_color_temp` est `rgb_color`). 🌈"
},
"adapt_delay": {
"description": "Temps d'attente (en secondes) entre l'allumage de la lumière et l'application des changements par l'Éclairage Adaptatif. Peut aider à éviter les scintillements. ⏲️"
},
"separate_turn_on_commands": {
"description": "Utilisez des appels distincts à \"light.turn_on\" pour la couleur et la luminosité, nécessaire pour certains types de lumières. 🔀"
},
"prefer_rgb_color": {
"description": "Indique s'il faut privilégier l'ajustement de la couleur RGB plutôt que la température de couleur de la lumière lorsque c'est possible. 🌈"
}
},
"description": "Changez les réglages que vous souhaitez dans le commutateur. Toutes les options ici sont les mêmes que dans le flow de configuration."
},
"apply": {
"description": "Applique les réglages d'éclairage adaptatif actuels aux lumières.",
"fields": {
"lights": {
"description": "Une lumière (ou une liste de lumières) à laquelle appliquer les réglages."
},
"transition": {
"description": "Durée de la transition des changements lumineux, en secondes. 🕑"
},
"entity_id": {
"description": "L'`entity_id` de l'interrupteur avec les paramètres à appliquer. 📝"
},
"adapt_brightness": {
"description": "Indique s'il faut adapter la luminosité de la lumière. 🌞"
},
"turn_on_lights": {
"description": "Indique s'il faut allumer les lumières qui sont actuellement éteintes. 🔆"
},
"adapt_color": {
"description": "Indique s'il faut adapter la couleur sur les lumières compatibles. 🌈"
},
"prefer_rgb_color": {
"description": "Indique s'il faut privilégier l'ajustement de la couleur RGB plutôt que la température de couleur de la lumière lorsque c'est possible. 🌈"
}
}
},
"set_manual_control": {
"fields": {
"lights": {
"description": "entity_id(s) des lumières, si non spécifié, toutes les lumières de l'interrupteur sont sélectionnées. 💡"
},
"manual_control": {
"description": "Indique s'il faut ajouter (\"true\") ou retirer (\"false\") la lumière de la liste \"manual_control\". 🔒"
},
"entity_id": {
"description": "L'\"entity_id\" de l'interrupteur dans lequel (dé)marquer la lumière comme étant \"manuellement contrôlée\". 📝"
}
},
"description": "Indiquer si une lumière est \"contrôlée manuellement\"."
} }
} }
} }

View file

@ -0,0 +1,53 @@
{
"options": {
"step": {
"init": {
"data_description": {
"interval": "Frecuencia para adaptar as luces, en segundos. 🔄",
"sleep_brightness": "Porcentaxe de brillo das luces en modo durmir. 😴"
},
"title": "Configuración de Iluminación Adaptativa",
"sections": {
"advanced": {
"data": {},
"data_description": {
"sunrise_offset": "Axusta a hora do amencer cun desfasamento positivo ou negativo en segundos. ⏰",
"sunset_offset": "Axusta a hora da posta de sol cun desfasamento positivo ou negativo en segundos. ⏰",
"send_split_delay": "Retraso (ms) entre `separate_turn_on_commands`"
}
}
},
"data": {}
}
}
},
"title": "Iluminación Adaptativa",
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Porcentaxe de brillo das luces en modo durmir. 😴"
},
"only_once": {
"description": "Adaptar luces só cando estean acesas (`true`) ou mantelas adaptándose (`false`). 🔄"
},
"sunrise_offset": {
"description": "Axusta a hora do amencer cun desfasamento positivo ou negativo en segundos. ⏰"
},
"sunset_offset": {
"description": "Axusta a hora da posta de sol cun desfasamento positivo ou negativo en segundos. ⏰"
},
"transition": {
"description": "Duración da transición cando as luces cambian, en segundos. 🕑"
}
}
}
},
"config": {
"step": {
"user": {
"title": "Escolle un nome para a instancia de Iluminación Dinámica"
}
}
}
}

View file

@ -0,0 +1,38 @@
{
"options": {
"step": {
"init": {
"title": "Opcije prilagodljivog osvjetljenja",
"data_description": {},
"data": {},
"sections": {
"advanced": {
"data": {
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Prilikom početnog paljenja svjetla. Ako je postavljeno na \"true\", AL se prilagođava samo ako se \"light.turn_on\" pozove bez navođenja boje ili svjetline. ❌🌈 Ovo npr. sprječava prilagodbu prilikom aktiviranja scene. Ako je \"false\", AL se prilagođava bez obzira na prisutnost boje ili svjetline u početnim \"service_data\". Potrebno je omogućiti `take_over_control`. 🕵️ "
},
"data_description": {
"sunrise_offset": "Podesite vrijeme izlaska sunca s pozitivnim ili negativnim pomakom u sekundama. ⏰",
"sunset_offset": "Podesite vrijeme izlaska sunca s pozitivnim ili negativnim pomakom u sekundama. ⏰"
}
}
}
}
}
},
"title": "prilagodi svjetlinu",
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Prilagodi svjetla samo kada su uključena (true) ili ih neprestano prilagođavaj (false). 🔄"
},
"sunrise_offset": {
"description": "Podesite vrijeme izlaska sunca s pozitivnim ili negativnim pomakom u sekundama. ⏰"
},
"sunset_offset": {
"description": "Podesite vrijeme izlaska sunca s pozitivnim ili negativnim pomakom u sekundama. ⏰"
}
}
}
}
}

View file

@ -0,0 +1,210 @@
{
"options": {
"step": {
"init": {
"data_description": {
"interval": "Gyakoriság a lights illesztéséhez, másodpercekben. 🔄",
"transition": "Az transition időtartama, amikor a lights változnak, másodpercben. 🕑",
"sleep_brightness": "Az alvó üzemmódban lévő lights fényerejének százalékos értéke. 😴",
"sleep_color_temp": "Színhőmérséklet alvó üzemmódban (amikor a `sleep_rgb_or_color_temp` értéke `color_temp`) Kelvinben megadva. 😴"
},
"data": {
"lights": "lights: Az entity_id-k listája, amelyeket az AL vezéreljen (üresen is maradhat).🌟",
"min_brightness": "min_brightness: Minimális fényerő százalékban. 💡",
"max_brightness": "max_brightness: Maximális fényerő százalékban megadva. 💡",
"min_color_temp": "min_color_temp: A legmelegebb színhőmérséklet Kelvinben. 🔥",
"max_color_temp": "max_color_temp: A leghidegebb színhőmérséklet kelvinben. ❄️"
},
"title": "Adaptív világítás beállításai",
"description": "Egy Adaptív világítás komponens konfigurálása. Az opciók nevei a YAML-beállításokhoz igazodnak. Ha ezt a bejegyzést YAML-ben definiálta, itt nem jelennek meg beállítások. A paraméterek hatásait bemutató interaktív grafikonokért látogasson el [erre a webes alkalmazásra]({webapp_url}). További részletekért olvasd el a [hivatalos dokumentációt]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Lehetőség szerint az RGB színbeállítás előnyben részesítése a fény színhőmérsékletével szemben. 🌈",
"transition_until_sleep": "transition_until_sleep: Ha engedélyezve van, az Adaptív világítás az alvó mód beállításokat minimálisnak tekinti, és napnyugta után ezekre az értékekre vált át. 🌙",
"take_over_control": "take_over_control: Adaptív világítás kikapcsolása, amennyiben más forrásból érkező `Világítás: Bekapcsolás` szolgáltatás hívás történik, miközben a fények be vannak kapcsolva és illesztve vannak. Vegye figyelembe, hogy ez minden `interval`-ban meghívja a `homeassistant.update_entity`-t! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: `Világítás: Bekapcsolás`- szolgáltatás meghívástól eltérő állapotváltozások esetén észleli és leállítja az illesztéseket. A `take_over_control` beállítás engedélyezése szükséges. 🕵️ Vigyázat: ⚠️ Egyes lights tévesen jelezhetik a \"bekapcsolt\" állapotot, ami váratlanul bekapcsolódó lámpákhoz vezethet. Ha ilyen problémákat tapasztal, tiltsa le ezt a funkciót.",
"only_once": "only_once: lights illesztése kizárólag, amikor azok be vannak kapcsolva (`igaz`) vagy tartsa folyamatosan illesztve őket (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Kizárólag a bekapcsoláskor érvényes. A beállítást \"igaz\"-ra állítva, az AL csak akkor végzi az illesztést, amennyiben a \"Világítás: Bekapcsolás\" szolgáltatás meghívása a szín és fényerő paraméterek megadása nélkül történik.❌🌈 Ez pl. alkalmas az illesztés felfüggesztésére egy jelenet aktiválásakor. \"Hamis\" beállítás esetén az AL elvégzi a kezdeti illesztést a szín és fényerő paraméterek meghívásától függetlenül. A használatához engedélyezve kell lennie a \"take_over_control\" beállításnak. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Elkülönített `Világítás: Bekapcsolás` hívásokat használ a szín és a fényerő beállításához, ami néhány világítás típusnál szükséges. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Az olyan adaptációs parancsok küldésének kihagyása, amelyek célállapota már megegyezik a fény ismert állapotával. Minimalizálja a hálózati forgalmat, és bizonyos helyzetekben javítja az adaptációs reakciókészséget. 📉Kapcsolja ki, ha a fizikai fényállapotok nem szinkronizálódnak a HA rögzített állapotával.",
"intercept": "elfogás: `Világítás: Bekapcsolás` szolgáltatás hívások elfogása és adaptálása a színek és a fényerő azonnali illesztésének lehetővé tétele érdekében. 🏎️ Letiltja az olyan lights esetében, amelyek nem támogatják a `Világítás: Bekapcsolás` szolgáltatás színnel és fényerővel történő szín- és fényerőszabályozását.",
"multi_light_intercept": "multi_light_intercept: `Világítás: Bekapcsolás` szolgáltatás hívások elfogása és adaptálása, amelyek több fényt céloznak meg. ➗⚠️ Ez azt eredményezheti, hogy egyetlen `Világítás: Bekapcsolás` szolgáltatás hívás több hívásra oszlik fel, pl. ha a lights különböző kapcsolókban vannak. Az `elfogás` engedélyezése szükséges.",
"include_config_in_attributes": "include_config_in_attributes: A kapcsoló összes opciójának attribútumként való megjelenítése a Home Assistantben, ha a beállítás értéke `igaz`. 📝"
},
"data_description": {
"initial_transition": "Az első transition időtartama, amikor a lights \"kikapcsolt\" állapotból \"bekapcsolt\" állapotba váltanak, másodpercben. ⏲️",
"sleep_rgb_or_color_temp": "Az `\"rgb_color\" vagy a `\"color_temp\" használata alvó üzemmódban. 🌙",
"sleep_rgb_color": "RGB szín alvó üzemmódban (akkor érvényes, ha a `sleep_rgb_or_color_temp` értéke \"rgb_color\"). 🌈",
"sleep_transition": "Az transition időtartama az \"alvó üzemmód\" kapcsolásakor másodpercben. 😴",
"sunrise_time": "Állítson be egy fix időpontot (HH:MM:SS) a napfelkeltéhez. 🌅",
"min_sunrise_time": "Állítsa be a legkorábbi virtuális napfelkelte időpontját (HH:MM:SS), lehetővé téve a későbbi napfelkeltét. 🌅",
"max_sunrise_time": "A legkésőbbi virtuális napfelkelte időpontjának beállítása (HH:MM:SS), amely lehetővé teszi a korábbi napfelkeltét. 🌅",
"sunrise_offset": "A napfelkelte idejének beállítása pozitív vagy negatív eltolással másodpercekben. ⏰",
"sunset_time": "Állítson be egy fix időpontot (HH:MM:SS) a naplementéhez. 🌇",
"min_sunset_time": "Állítsa be a legkorábbi virtuális naplemente időpontját (HH:MM:SS), lehetővé téve a későbbi naplementéket. 🌇",
"max_sunset_time": "A legkésőbbi virtuális napnyugta időpontjának beállítása (HH:MM:SS), amely lehetővé teszi a korábbi naplementéket. 🌇",
"sunset_offset": "A naplemente idejének beállítása pozitív vagy negatív eltolással másodpercekben. ⏰",
"brightness_mode": "Használandó fényerő üzemmód. A lehetséges értékek: `default`, `linear` és `tanh` (a `brightness_mode_time_dark` és `brightness_mode_time_light` értékeket használja). 📈",
"brightness_mode_time_dark": "(Figyelmen kívül hagyva, ha `brightness_mode='default'`) A fényerő növelésének/csökkentésének időtartama másodpercben napfelkelte/napnyugta után/előtt. 📈📉.",
"brightness_mode_time_light": "(Figyelmen kívül hagyva, ha `brightness_mode='default'`) A fényerő növelésének/csökkentésének időtartama másodpercben napfelkelte/napnyugta után/előtt. 📈📉.",
"autoreset_control_seconds": "Automatikusan visszaállítja a kézi vezérlést néhány másodperc után. A letiltáshoz állítsa 0-ra. ⏲️",
"send_split_delay": "Késleltetés (ms-ban) a `separate_turn_on_commands` (különálló_bekapcsolási_parancsok) között olyan lights esetében, amelyek nem támogatják a fényerő és a szín egyidejű beállítását. ⏲️",
"adapt_delay": "Várakozási idő (másodpercben) a világítás bekapcsolása és az Adaptív világítás alkalmazása között. Segíthet elkerülni a villódzást. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Érvénytelen beállítás",
"entity_missing": "Egy vagy több kiválasztott világítás entitás hiányzik a Home Assistantból"
}
},
"title": "Adaptív világítás",
"services": {
"change_switch_settings": {
"fields": {
"entity_id": {
"description": "A kapcsoló entitásazonosítója. 📝"
},
"max_brightness": {
"description": "Maximális fényerő százalékban megadva. 💡"
},
"max_color_temp": {
"description": "Leghidegebb színhőmérséklet Kelvinben megadva. ❄️"
},
"sleep_brightness": {
"description": "Az alvó üzemmódban lévő lights fényerejének százalékos értéke. 😴"
},
"detect_non_ha_changes": {
"description": "`Világítás: Bekapcsolás`- szolgáltatás meghívástól eltérő állapotváltozások esetén észleli és leállítja az illesztéseket. A `take_over_control` beállítás engedélyezése szükséges. 🕵️ Vigyázat: ⚠️ Egyes lights tévesen jelezhetik a \"bekapcsolt\" állapotot, ami váratlanul bekapcsolódó lámpákhoz vezethet. Ha ilyen problémákat tapasztal, tiltsa le ezt a funkciót."
},
"sunrise_offset": {
"description": "A napfelkelte idejének beállítása pozitív vagy negatív eltolással másodpercekben. ⏰"
},
"max_sunrise_time": {
"description": "A legkésőbbi virtuális napfelkelte időpontjának beállítása (HH:MM:SS), amely lehetővé teszi a korábbi napfelkeltét. 🌅"
},
"sleep_color_temp": {
"description": "Színhőmérséklet alvó üzemmódban (akkor használatos, ha a `sleep_rgb_or_color_temp` a `color_temp`-re van állítva) kelvinben. 😴"
},
"min_brightness": {
"description": "Minimális fényerő százalékban. 💡"
},
"min_color_temp": {
"description": "A legmelegebb színhőmérséklet Kelvinben. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Az `\"rgb_color\" vagy a `\"color_temp\" használata alvó üzemmódban. 🌙"
},
"turn_on_lights": {
"description": "A jelenleg kikapcsolt fények bekapcsolása. 🔆"
},
"initial_transition": {
"description": "Az első transition időtartama, amikor a lights \"kikapcsolt\" állapotból \"bekapcsolt\" állapotba váltanak, másodpercben. ⏲️"
},
"sunrise_time": {
"description": "Állítson be egy fix időpontot (HH:MM:SS) a napfelkeltéhez. 🌅"
},
"include_config_in_attributes": {
"description": "Az összes beállítás megjelenítése a kapcsoló attribútumaként a Home Assistantban, ha a beállítás `igaz`. 📝"
},
"sleep_rgb_color": {
"description": "RGB szín alvó üzemmódban (akkor érvényes, ha a `sleep_rgb_or_color_temp` értéke \"rgb_color\"). 🌈"
},
"take_over_control": {
"description": "Az Adaptív világítás letiltása, ha egy másik forrásból érkező `Világítás: Bekapcsolás` hívja, miközben a világítás be van kapcsolva és AL által illesztve van. Vegye figyelembe, hogy ez minden \"interval\"-ban meghívja a `homeassistant.update_entity`-t! 🔒"
},
"sleep_transition": {
"description": "Az transition időtartama az \"alvó üzemmód\" kapcsolásakor másodpercben. 😴"
},
"autoreset_control_seconds": {
"description": "Automatikusan visszaállítja a kézi vezérlést néhány másodperc után. A letiltáshoz állítsa 0-ra. ⏲️"
},
"adapt_delay": {
"description": "Várakozási idő (másodpercben) a világítás bekapcsolása és az Adaptív világítás alkalmazása között. Segíthet elkerülni a villódzást. ⏲️"
},
"only_once": {
"description": "A lights illesztése csak a bekapcsoláskor egy alkalommal (\"igaz\") vagy folyamatosan történjen a bekapcsolás után is (\"hamis\")."
},
"use_defaults": {
"description": "Beállítja az ebben a szolgáltatáshívásban meg nem adott alapértelmezett értékeket. Opciók: \"(alapértelmezett, megtartja az aktuális értékeket), \"gyári\" (visszaállítja a dokumentált alapértelmezett értékeket) vagy \"konfiguráció\" (visszaállítja a kapcsoló konfigurációjának alapértelmezett értékeit). ⚙️"
},
"separate_turn_on_commands": {
"description": "Elkülönített `Világítás: Bekapcsolás` szolgáltatás hívások használata a szín és a fényerő számára, ami néhány világítás típusnál szükséges. 🔀"
},
"prefer_rgb_color": {
"description": "Lehetőség szerint az RGB színbeállítás előnyben részesítése a fény színhőmérsékletével szemben. 🌈"
},
"sunset_offset": {
"description": "A naplemente idejének beállítása pozitív vagy negatív eltolással másodpercekben. ⏰"
},
"send_split_delay": {
"description": "Késleltetés (ms-ban) a `separate_turn_on_commands` (különálló_bekapcsolási_parancsok) között olyan lights esetében, amelyek nem támogatják a fényerő és a szín egyidejű beállítását. ⏲️"
},
"sunset_time": {
"description": "Állítson be egy fix időpontot (HH:MM:SS) a naplementéhez. 🌇"
},
"transition": {
"description": "Az transition időtartama, amikor a lights változnak, másodpercben. 🕑"
},
"min_sunset_time": {
"description": "Állítsa be a legkorábbi virtuális naplemente időpontját (HH:MM:SS), lehetővé téve a későbbi naplementéket. 🌇"
}
},
"description": "Módosítsa a kapcsolóban a kívánt beállításokat. Itt minden beállítás ugyanaz, mint a konfigurációs folyamban."
},
"set_manual_control": {
"description": "Jelölje meg, hogy egy lámpa „kézi vezérlésű”-e.",
"fields": {
"manual_control": {
"description": "A világítás hozzáadása (\"true\") vagy eltávolítása (\"false\") a \"manual_control\" listából. 🔒"
},
"entity_id": {
"description": "A kapcsoló `entity_id`-je, amelyben a lámpát \"kézi vezérlésűnek\" kell jelölni. 📝"
},
"lights": {
"description": "a lights entity_id-je(i), ha nincs megadva, a kapcsoló összes lights ki lesz választva. 💡"
}
}
},
"apply": {
"fields": {
"entity_id": {
"description": "Az alkalmazandó beállításokat tartalmazó kapcsoló `entity_id`-je. 📝"
},
"adapt_brightness": {
"description": "A világítás fényerejének beállítása. 🌞"
},
"turn_on_lights": {
"description": "A jelenleg kikapcsolt lights bekapcsolása. 🔆"
},
"adapt_color": {
"description": "A lights által támogatott színek beállítása. 🌈"
},
"prefer_rgb_color": {
"description": "Lehetőség szerint az RGB színbeállítás előnyben részesítése a fény színhőmérsékletével szemben. 🌈"
},
"lights": {
"description": "A világítás (vagy a világítások listája), amelyre a beállításokat alkalmazni kell.💡"
},
"transition": {
"description": "Az transition időtartama, amikor a lights változnak, másodpercben. 🕑"
}
},
"description": "Az aktuális Adaptív világítás beállításokat alkalmazza a lights-ra."
}
},
"config": {
"step": {
"user": {
"title": "Válasszon nevet az Adaptív világítás példánynak",
"description": "Minden integrációs tétel több lights-t is tartalmazhat!"
}
},
"abort": {
"already_configured": "Ez az eszköz már be van állítva"
}
}
}

View file

@ -0,0 +1,210 @@
{
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Persentase kecerahan lampu dalam mode tidur. 😴"
},
"detect_non_ha_changes": {
"description": "Mendeteksi dan menghentikan adaptasi untuk perubahan status non-`light.turn_on`. Perlu mengaktifkan `take_over_control`. 🕵️ Perhatian: ⚠️ Beberapa lampu mungkin salah menunjukkan status 'hidup' yang dapat mengakibatkan lampu menyala secara tidak terduga. Nonaktifkan fitur ini jika Anda mengalami masalah seperti itu."
},
"sunrise_offset": {
"description": "Sesuaikan waktu matahari terbit dengan offset positif atau negatif dalam hitungan detik. ⏰"
},
"max_sunrise_time": {
"description": "Atur waktu matahari terbit virtual terkini (HH:MM:SS), memungkinkan matahari terbit lebih cepat. 🌅"
},
"sleep_color_temp": {
"description": "Suhu warna dalam mode tidur (digunakan ketika `sleep_rgb_or_color_temp` adalah `color_temp`) dalam Kelvin. 😴"
},
"min_brightness": {
"description": "Persentase kecerahan minimum. 💡"
},
"min_color_temp": {
"description": "Suhu warna terhangat dalam Kelvin. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Gunakan `\"rgb_color\"` atau `\"color_temp\"` dalam mode tidur. 🌙"
},
"turn_on_lights": {
"description": "Kalau ingin menyalakan lampu yang sedang mati. 🔆"
},
"initial_transition": {
"description": "Durasi transisi pertama saat lampu berubah dari `mati` ke `hidup` dalam hitungan detik. ⏲️"
},
"entity_id": {
"description": "ID Entitas sakelar. 📝"
},
"sunrise_time": {
"description": "Tetapkan waktu tetap (HH:MM:SS) untuk matahari terbit. 🌅"
},
"include_config_in_attributes": {
"description": "Tampilkan semua opsi sebagai atribut pada sakelar di Home Assistant ketika diatur ke `true`. 📝"
},
"max_brightness": {
"description": "Persentase kecerahan maksimum. 💡"
},
"sleep_rgb_color": {
"description": "Warna RGB dalam mode tidur (digunakan ketika `sleep_rgb_or_color_temp` adalah \"rgb_color\"). 🌈"
},
"take_over_control": {
"description": "Nonaktifkan Pencahayaan Adaptif jika sumber lain memanggil `light.turn_on` saat lampu menyala dan sedang diadaptasi. Perhatikan bahwa ini memanggil `homeassistant.update_entity` setiap `interval`! 🔒"
},
"sleep_transition": {
"description": "Durasi transisi ketika \"mode tidur\" diubah, dalam hitungan detik. 😴"
},
"autoreset_control_seconds": {
"description": "Secara otomatis mengatur ulang kontrol manual setelah beberapa detik. Setel ke 0 untuk menonaktifkan. ⏲️"
},
"adapt_delay": {
"description": "Waktu tunggu (detik) antara lampu menyala dan penerapan ubahan Pencahayaan Adaptif. Mungkin membantu untuk menghindari kedipan. ⏲️"
},
"only_once": {
"description": "Sesuaikan lampu hanya saat menyala (`true`) atau terus sesuaikan (`false`). 🔄"
},
"use_defaults": {
"description": "Menetapkan nilai bawaan yang tidak ditentukan dalam panggilan layanan ini. Opsi: \"current\" (bawaan, mempertahankan nilai saat ini), \"factory\" (direset ke nilai bawaan yang terdokumentasi), atau \"configuration\" (kembali ke nilai bawaan konfigurasi sakelar). ⚙️"
},
"separate_turn_on_commands": {
"description": "Gunakan panggilan `light.turn_on` terpisah untuk warna dan kecerahan, diperlukan untuk beberapa jenis lampu. 🔀"
},
"prefer_rgb_color": {
"description": "Kalau lebih memilih penyesuaian warna RGB dibandingkan suhu warna terang jika memungkinkan. 🌈"
},
"max_color_temp": {
"description": "Suhu warna terdingin dalam Kelvin. ❄️"
},
"sunset_offset": {
"description": "Sesuaikan waktu matahari terbenam dengan offset positif atau negatif dalam hitungan detik. ⏰"
},
"send_split_delay": {
"description": "Waktu tunda (ms) antara `separate_turn_on_commands` untuk lampu yang tidak mendukung pengaturan kecerahan dan warna secara bersamaan. ⏲️"
},
"sunset_time": {
"description": "Tetapkan waktu tetap (HH:MM:SS) untuk matahari terbenam. 🌇"
},
"transition": {
"description": "Durasi transisi saat lampu berganti, dalam hitungan detik. 🕑"
},
"min_sunset_time": {
"description": "Tetapkan waktu matahari terbenam virtual paling awal (HH:MM:SS), memungkinkan matahari terbenam di kemudian waktu. 🌇"
}
},
"description": "Ubah pengaturan apa pun yang Anda inginkan di sakelar. Semua opsi di sini sama seperti pada alur konfigurasi."
},
"apply": {
"fields": {
"entity_id": {
"description": "`eEntity_id` sakelar dengan pengaturan yang akan diterapkan. 📝"
},
"adapt_brightness": {
"description": "Kalau ingin menyesuaikan kecerahan lampu. 🌞"
},
"turn_on_lights": {
"description": "Kalau ingin menyalakan lampu yang sedang mati. 🔆"
},
"adapt_color": {
"description": "Kalau ingin menyesuaikan warna pada lampu pendukung. 🌈"
},
"prefer_rgb_color": {
"description": "Kalau lebih memilih penyesuaian warna RGB dibandingkan suhu warna terang jika memungkinkan. 🌈"
},
"lights": {
"description": "Lampu (atau daftar lampu) untuk menerapkan pengaturan. 💡"
},
"transition": {
"description": "Durasi transisi saat lampu berganti, dalam hitungan detik. 🕑"
}
},
"description": "Menerapkan pengaturan Pencahayaan Adaptif saat ini ke lampu."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Kalau ingin menambahkan (\"true\") atau menghapus (\"false\") lampu dari daftar \"manual_control\". 🔒"
},
"entity_id": {
"description": "`entity_id` dari sakelar yang digunakan untuk membatalkan penandaan lampu sebagai `manually controlled`. 📝"
},
"lights": {
"description": "entity_id(s) lampu, jika tidak ditentukan, semua lampu di sakelar dipilih. 💡"
}
},
"description": "Tandai kalau lampu 'dikontrol secara manual'."
}
},
"options": {
"step": {
"init": {
"data_description": {
"interval": "Frekuensi untuk menyesuaikan lampu, dalam hitungan detik. 🔄",
"transition": "Durasi transisi saat lampu berganti, dalam hitungan detik. 🕑",
"sleep_brightness": "Persentase kecerahan lampu dalam mode tidur. 😴",
"sleep_color_temp": "Suhu warna dalam mode tidur (digunakan ketika `sleep_rgb_or_color_temp` adalah `color_temp`) dalam Kelvin. 😴"
},
"data": {
"lights": "lights: Daftar entity_ids lampu yang akan dikontrol (boleh kosong). 🌟",
"min_brightness": "min_brightness: Persentase kecerahan minimum. 💡",
"max_brightness": "max_brightness: Persentase kecerahan maksimum. 💡",
"min_color_temp": "min_color_temp: Suhu warna terhangat dalam Kelvin. 🔥",
"max_color_temp": "max_color_temp: Suhu warna terdingin dalam Kelvin. ❄️"
},
"title": "Opsi Pencahayaan Adaptif",
"description": "Konfigurasikan komponen Pencahayaan Adaptif. Nama opsi selaras dengan pengaturan YAML. Jika Anda telah menentukan entri ini di YAML, tidak ada opsi yang akan muncul di sini. Untuk grafik interaktif yang menunjukkan efek parameter, kunjungi [aplikasi web ini]({webapp_url}). Untuk detail lebih lanjut, lihat [dokumentasi resmi]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Kalau lebih memilih penyesuaian warna RGB dibandingkan suhu warna terang jika memungkinkan. 🌈",
"transition_until_sleep": "transition_until_sleep: Jika diaktifkan, Pencahayaan Adaptif akan menganggap pengaturan tidur sebagai minimum, dan beralih ke nilai ini setelah matahari terbenam. 🌙",
"take_over_control": "take_over_control: Nonaktifkan Pencahayaan Adaptif jika sumber lain memanggil `light.turn_on` saat lampu menyala dan sedang diadaptasi. Perhatikan bahwa ini memanggil `homeassistant.update_entity` setiap `interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Mendeteksi dan menghentikan adaptasi untuk perubahan status non-`light.turn_on`. Perlu mengaktifkan `take_over_control`. 🕵️ Perhatian: ⚠️ Beberapa lampu mungkin salah menunjukkan status 'hidup' yang dapat mengakibatkan lampu menyala secara tidak terduga. Nonaktifkan fitur ini jika Anda mengalami masalah seperti itu.",
"only_once": "only_once: Sesuaikan lampu hanya saat menyala (`true`) atau terus sesuaikan (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Saat menyalakan lampu pada awalnya. Jika diatur ke `true`, AL hanya beradaptasi jika `light.turn_on` dipanggil tanpa menentukan warna atau kecerahan. ❌🌈 Misalnya, mencegah adaptasi ketika mengaktifkan scene. Jika `false`, AL akan beradaptasi tanpa menghiraukan keberadaan warna atau kecerahan dalam `service_data` awal. Perlu `take_over_control` diaktifkan. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Gunakan panggilan `light.turn_on` terpisah untuk warna dan kecerahan, diperlukan untuk beberapa jenis lampu. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Lewati pengiriman perintah adaptasi yang status targetnya sudah sama dengan status cahaya yang diketahui. Meminimalkan lalu lintas jaringan dan meningkatkan respons adaptasi dalam beberapa situasi. 📉Nonaktifkan jika status cahaya fisik tidak sinkron dengan status rekaman HA.",
"intercept": "intercept: Cegat dan sesuaikan panggilan `light.turn_on` untuk mengaktifkan adaptasi warna dan kecerahan seketika. 🏎️ Nonaktifkan untuk lampu yang tidak mendukung `light.turn_on` dengan warna dan kecerahan.",
"multi_light_intercept": "multi_light_intercept: Cegat dan sesuaikan panggilan `light.turn_on` yang menargetkan banyak lampu. ➗⚠️ Hal ini dapat mengakibatkan satu panggilan `light.turn_on` terpecah menjadi beberapa panggilan, misalnya saat lampu berada di sakelar yang berbeda. Membutuhkan `intercept` untuk diaktifkan.",
"include_config_in_attributes": "include_config_in_attributes: Tampilkan semua opsi sebagai atribut pada sakelar di Home Assistant ketika diatur ke `true`. 📝"
},
"data_description": {
"initial_transition": "Durasi transisi pertama saat lampu berubah dari `mati` ke `hidup` dalam hitungan detik. ⏲️",
"sleep_rgb_or_color_temp": "Gunakan `\"rgb_color\"` atau `\"color_temp\"` dalam mode tidur. 🌙",
"sleep_rgb_color": "Warna RGB dalam mode tidur (digunakan ketika `sleep_rgb_or_color_temp` adalah \"rgb_color\"). 🌈",
"sleep_transition": "Durasi transisi ketika \"mode tidur\" diubah, dalam hitungan detik. 😴",
"sunrise_time": "Tetapkan waktu tetap (HH:MM:SS) untuk matahari terbit. 🌅",
"min_sunrise_time": "Tetapkan waktu matahari terbit virtual paling awal (HH:MM:SS), memungkinkan matahari terbit di kemudian waktu. 🌅",
"max_sunrise_time": "Atur waktu matahari terbit virtual terkini (HH:MM:SS), memungkinkan matahari terbit lebih cepat. 🌅",
"sunrise_offset": "Sesuaikan waktu matahari terbit dengan offset positif atau negatif dalam hitungan detik. ⏰",
"sunset_time": "Tetapkan waktu tetap (HH:MM:SS) untuk matahari terbenam. 🌇",
"min_sunset_time": "Tetapkan waktu matahari terbenam virtual paling awal (HH:MM:SS), memungkinkan matahari terbenam di kemudian waktu. 🌇",
"max_sunset_time": "Atur waktu matahari terbenam virtual terkini (HH:MM:SS), memungkinkan matahari terbenam lebih cepat. 🌇",
"sunset_offset": "Sesuaikan waktu matahari terbenam dengan offset positif atau negatif dalam hitungan detik. ⏰",
"brightness_mode": "Mode kecerahan untuk digunakan. Nilai yang memungkinkan adalah `default`, `linear`, dan `tanh` (menggunakan `brightness_mode_time_dark` dan `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Diabaikan jika `brightness_mode='default'`) Durasi dalam hitungan detik untuk meningkatkan/menurunkan kecerahan sebelum/sesudah matahari terbit/terbenam. 📈📉",
"brightness_mode_time_light": "(Ignored if `brightness_mode='default'`) Durasi dalam hitungan detik untuk meningkatkan/menurunkan kecerahan setelah/sebelum matahari terbit/terbenam. 📈📉.",
"autoreset_control_seconds": "Secara otomatis mengatur ulang kontrol manual setelah beberapa detik. Setel ke 0 untuk menonaktifkan. ⏲️",
"send_split_delay": "Waktu tunda (ms) antara `separate_turn_on_commands` untuk lampu yang tidak mendukung pengaturan kecerahan dan warna secara bersamaan. ⏲️",
"adapt_delay": "Waktu tunggu (detik) antara lampu menyala dan penerapan ubahan Pencahayaan Adaptif. Mungkin membantu untuk menghindari kedipan. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Opsi tidak valid",
"entity_missing": "Satu atau lebih entitas cahaya yang dipilih hilang dari Home Assistant"
}
},
"title": "Pencahayaan Adaptif",
"config": {
"step": {
"user": {
"description": "Setiap instance dapat berisi banyak lampu!",
"title": "Pilih nama untuk instance Pencahayaan Adaptif"
}
},
"abort": {
"already_configured": "Perangkat ini sudah dikonfigurasi"
}
}
}

View file

@ -1,52 +1,224 @@
{ {
"title": "Illuminazione Adattiva", "title": "Illuminazione Adattiva",
"config": { "config": {
"step": { "step": {
"user": { "user": {
"title": "Scegli un nome per l'istanza di Illuminazione Adattiva", "title": "Scegli un nome per l'istanza di Illuminazione Adattiva",
"description": "Scegli un nome per questa istanza. Puoi eseguire più istanze di Illuminazione adattiva, ognuna delle quali può contenere più luci!", "description": "Scegli un nome per questa istanza. Puoi eseguire più istanze di Illuminazione adattiva, ognuna delle quali può contenere più luci!",
"data": { "data": {
"name": "Nome" "name": "Nome"
}
} }
},
"abort": {
"already_configured": "Questo dispositivo è già stato configurato"
} }
}, },
"options": { "abort": {
"step": { "already_configured": "Questo dispositivo è già stato configurato"
"init": { }
"title": "Opzioni Illuminazione Adattiva", },
"description": "Tutte le opzioni per il componente Illuminazione Adattiva. I nomi delle opzioni corrispondono con le impostazioni YAML. Non sono mostrate opzioni se hai la voce adaptive-lighting definita nella tua configurazione YAML.", "options": {
"data": { "step": {
"lights": "luci", "init": {
"initial_transition": "initial_transition: Quando le luci vengono accese (off -> on). (secondi)", "title": "Opzioni Illuminazione Adattiva",
"sleep_transition": "sleep_transition: Quando 'sleep_state' cambia. (secondi)", "description": "Tutte le opzioni per il componente Illuminazione Adattiva. I nomi delle opzioni corrispondono con le impostazioni YAML. Non sono mostrate opzioni se hai la voce adaptive-lighting definita nella tua configurazione YAML.",
"interval": "interval: Tempo tra i cambiamenti dello switch. (secondi)", "data": {
"max_brightness": "max_brightness: Luminosità massima delle luci durante un ciclo. (%)", "lights": "luci",
"max_color_temp": "max_color_temp: Gradazione più fredda del ciclo di temperatura del colore. (Kelvin)", "interval": "interval: Tempo tra i cambiamenti dello switch. (secondi)",
"min_brightness": "min_brightness: Luminosità minima delle luci durante un ciclo. (%)", "transition": "Tempo di transizione quando viene applicata una modifica alle luci (secondi)",
"min_color_temp": "min_color_temp: Gradazione più calda del ciclo di temperatura del colore. (Kelvin)", "min_brightness": "min_brightness: Luminosità minima delle luci durante un ciclo. (%)",
"only_once": "only_once: Adatta le luci solo quando vengono accese.", "max_brightness": "max_brightness: Luminosità massima delle luci durante un ciclo. (%)",
"prefer_rgb_color": "prefer_rgb_color: Usa 'rgb_color' al posto di 'color_temp' quando possibile.", "min_color_temp": "min_color_temp: Gradazione più calda del ciclo di temperatura del colore. (Kelvin)",
"separate_turn_on_commands": "separate_turn_on_commands: Separa i comandi per ogni attributo (color, brightness, etc.) in 'light.turn_on' (richiesto per alcune luci).", "max_color_temp": "max_color_temp: Gradazione più fredda del ciclo di temperatura del colore. (Kelvin)",
"sleep_brightness": "sleep_brightness: Impostazione della luminosità per la modalità notturna. (%)", "sleep_brightness": "sleep_brightness: Impostazione della luminosità per la modalità notturna. (%)",
"sleep_color_temp": "sleep_color_temp: Impostazione della temperatura colore per la modalità notturna. (Kelvin)", "sleep_color_temp": "sleep_color_temp: Impostazione della temperatura colore per la modalità notturna. (Kelvin)"
"sunrise_offset": "sunrise_offset: Imposta quanto anticipare(-) o ritardare(+) l'alba nel ciclo (+/- secondi)", },
"sunrise_time": "sunrise_time: Imposta manualmente l'ora dell'alba, se 'None', usa l'ora effettiva dell'alba alla tua posizione (HH:MM:SS)", "data_description": {
"sunset_offset": "sunset_offset: Imposta quanto anticipare(-) o ritardare(+) il tramonto nel ciclo (+/- secondi)", "interval": "Frequenza di adattamento delle luci, espressa in secondi. 🔄",
"sunset_time": "sunset_time: Imposta manualmente l'ora del tramonto, se 'None', usa l'ora effettiva del tramonto alla tua posizione (HH:MM:SS)", "transition": "Durata della transizione quando le luci cambiano, espressa in secondi. 🕑",
"take_over_control": "take_over_control: Se viene chiamato il servizio 'lights.turn_on' (non da Illuminazione Adattiva) quando una luce è già accesa, interrompi l'adattamento della luce finquando essa o l'interruttore non vengono riaccesi (off -> on.)", "sleep_brightness": "Luminosità percentuale delle luci in modalità notturna. 😴",
"detect_non_ha_changes": "detect_non_ha_changes: rileva tutti i cambiamenti >10% applicati alle luci (anche fuori da HA), richiede che 'take_over_control' sia abilitato (chiama 'homeassistant.update_entity' ad ogni 'intervallo'!)", "sleep_color_temp": "Temperatura colore per la modalità notturna (utilizzata quando `sleep_rgb_or_color_temp` vale `color_temp`), espressa in Kelvin. 😴"
"transition": "Tempo di transizione quando viene applicata una modifica alle luci (secondi)", },
"adapt_delay": "Tempo di attesa tra l'accensione della luce, e Illuminazione Adattiva che applica le modifiche allo stato della luce. Potrebbe evitare sfarfallii." "sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Quando le luci vengono accese (off -> on). (secondi)",
"prefer_rgb_color": "prefer_rgb_color: Usa 'rgb_color' al posto di 'color_temp' quando possibile.",
"sleep_transition": "sleep_transition: Quando 'sleep_state' cambia. (secondi)",
"transition_until_sleep": "transition_until_sleep: Quando abilitato, Adaptive Lighting tratterà le impostazioni di sleep come valori minimi, facendo la transizione a questi valori dopo il tramonto. 🌙",
"sunrise_time": "sunrise_time: Imposta manualmente l'ora dell'alba, se 'None', usa l'ora effettiva dell'alba alla tua posizione (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: Imposta quanto anticipare(-) o ritardare(+) l'alba nel ciclo (+/- secondi)",
"sunset_time": "sunset_time: Imposta manualmente l'ora del tramonto, se 'None', usa l'ora effettiva del tramonto alla tua posizione (HH:MM:SS)",
"sunset_offset": "sunset_offset: Imposta quanto anticipare(-) o ritardare(+) il tramonto nel ciclo (+/- secondi)",
"take_over_control": "take_over_control: Se viene chiamato il servizio 'lights.turn_on' (non da Illuminazione Adattiva) quando una luce è già accesa, interrompi l'adattamento della luce finquando essa o l'interruttore non vengono riaccesi (off -> on.)",
"detect_non_ha_changes": "detect_non_ha_changes: rileva tutti i cambiamenti >10% applicati alle luci (anche fuori da HA), richiede che 'take_over_control' sia abilitato (chiama 'homeassistant.update_entity' ad ogni 'intervallo'!)",
"only_once": "only_once: Adatta le luci solo quando vengono accese.",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Quando accendi le luci la prima volta. Se impostato su `true`, AL adatta solo se `light.turn_on è invocato senza specificare il colore o la luminosità. ❌🌈 Questo, per esempio, previene l'adattamento quando si attiva una scena. Se `false`, AL adatta indipendentemente dalla presenza di colore o luminosità nei `service_data` iniziali. Necessita che `take_over_control` sia abilitato. 🕵️ ",
"separate_turn_on_commands": "separate_turn_on_commands: Separa i comandi per ogni attributo (color, brightness, etc.) in 'light.turn_on' (richiesto per alcune luci).",
"adapt_delay": "Tempo di attesa tra l'accensione della luce, e Illuminazione Adattiva che applica le modifiche allo stato della luce. Potrebbe evitare sfarfallii.",
"skip_redundant_commands": "skip_redundant_commands: Salta l'invio di comandi di adattamento rivolti ad entità in cui lo stato desiderato è identico allo stato attuale. Minimizza il traffico sulla rete e migliora la responsività dell'adattamento in alcune situazioni. 📉 Disabilitalo se lo stato reale delle luci va fuori sincrono con quello registrato da HA.",
"intercept": "intercept: Intercetta e adatta alle chiamate a`light.turn_on` per abilitare adattamenti istantanei di colore e luminosità. 🏎️ Disabilita per quelle luci che non supportano l'impostazione di luci e colori a seguito dell'evento `light.turn_on`.",
"multi_light_intercept": "multi_light_intercept: Intercetta e adatta le chiamate a `light.turn_on` destinate a più luci. ➗⚠️ Questo potrebbe causare la divisione della singola chiamata `light.turn_on`in più chiamate, ad esempio quando le luci sono su switch diversi. Richiede che l'opzione `intercept` sia abilitata.",
"include_config_in_attributes": "include_config_in_attributes: Quando impostato come `true`, mostra tutte le opzioni come attributi dello switch in Home Assistant. 📝"
},
"data_description": {
"initial_transition": "Durata della prima transizione quando le luci passano dallo stato `off` a `on`, espressa in secondi. ⏲️",
"sleep_rgb_or_color_temp": "Usa uno tra `\"rgb_color\"` or`\"color_temp\"` in modalità notturna. 🌙",
"sleep_rgb_color": "Colore RGB in modalità notturna (usato quando `sleep_rgb_or_color_temp` è impostato su \"rgb_color\"). 🌈",
"sleep_transition": "Durata della transizione al passaggio da/verso la modalità luce notturna, espressa in secondi. 😴",
"sunrise_time": "Imposta un orario fisso (HH:MM:SS) per l'alba. 🌅",
"min_sunrise_time": "Imposta il minimo orario per l'alba (HH:MM:SS), per eventualmente ritardarla. 🌅",
"max_sunrise_time": "Imposta l'orario massimo per l'alba (HH:MM:SS), in modo da eventualmente anticiparla. 🌅",
"sunrise_offset": "Regola il momento dell'alba con un offset positivo o negativo. ⏰",
"sunset_time": "Imposta un orario fisso (HH:MM:SS) per il tramonto. 🌇",
"min_sunset_time": "Imposta il minimo orario per il tramonto (HH:MM:SS), per eventualmente ritardarlo. 🌅",
"max_sunset_time": "Imposta il massimo orario per il tramonto (HH:MM:SS), in modo da eventualmente anticiparlo. 🌇",
"sunset_offset": "Modifica l'orario del tramonto con un offset in secondi positivo o negativo. ⏰",
"brightness_mode": "Modalità per la luminosità da utilizzare. I valori possibili sono `default`, `linear`, and `tanh` (usa`brightness_mode_time_dark` e `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "La durata, espressa in secondi, della variazione di luminosità durante le albe/tramonti (ignorato se `brightness_mode='default'`). 📈📉",
"brightness_mode_time_light": "La durata, espressa in secondi, della variazione di luminosità durante le albe/tramonti (ignorato se `brightness_mode='default'`). 📈📉",
"autoreset_control_seconds": "Rimuovi automaticamente il colore impostato manualmente dopo un certo numero di secondi. Imposta 0 per disabilitare. ⏲️",
"send_split_delay": "Ritardo (ms) tra i comandi, per le luci che hanno `separate_turn_on_commands` e che non supportano l'impostazione simultanea di luminosità e colore. ⏲️",
"adapt_delay": "Tempo di attesa (in secondi) tra l'accensione della luce e i cambiamenti indotti da Illuminazione Adattativa. Può contribuire a ridurre lo sfarfallio. ⏲️"
}
} }
} }
},
"error": {
"option_error": "Opzione non valida",
"entity_missing": "Non è stata trovata una luce selezionata"
} }
},
"error": {
"option_error": "Opzione non valida",
"entity_missing": "Non è stata trovata una luce selezionata"
}
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Adatta le luci solo nel momento in cui vengono accese ('true') o continua ad adattarle ('false'). 🔄"
},
"sunrise_offset": {
"description": "Modifica l'orario dell'alba con un offset in secondi positivo o negativo."
},
"sleep_brightness": {
"description": "Luminosità percentuale delle luci in modalità notturna. 😴"
},
"detect_non_ha_changes": {
"description": "Individua e arresta l'adattamento per i cambiamenti di stato diversi da `light.turn_on`. Richiede che `take_over_control` sia abilitato. 🕵️ Avvertenza: ⚠️ Alcune luci potrebbero riportare erroneamente lo stato di 'on', il che potrebbe causarne accensione inaspettata. Disabilita questa opzione se riscontri questa casistica."
},
"max_sunrise_time": {
"description": "Imposta l'orario massimo per l'alba (HH:MM:SS), in modo da eventualmente anticiparla. 🌅"
},
"sleep_color_temp": {
"description": "Temperatura colore per la modalità notturna (utilizzata quando `sleep_rgb_or_color_temp` vale `color_temp`), espressa in Kelvin. 😴"
},
"min_brightness": {
"description": "Minima luminosità, in percentuale.💡"
},
"min_color_temp": {
"description": "Temperatura colore più calda, espressa in Kelvin.🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Usa uno tra `\"rgb_color\"` or`\"color_temp\"` in modalità notturna. 🌙"
},
"turn_on_lights": {
"description": "Seleziona per accedere le luci, qualora fossero spente. 🔆"
},
"initial_transition": {
"description": "Durata della prima transizione quando le luci passano dallo stato `off` a `on`, espressa in secondi. ⏲️"
},
"entity_id": {
"description": "ID entità dello switch. 📝"
},
"sunrise_time": {
"description": "Imposta un orario fisso (HH:MM:SS) per l'alba. 🌅"
},
"include_config_in_attributes": {
"description": "Quando impostato su `true`, tutte le opzioni saranno visibili come attributi dello switch in Home Assistant. 📝"
},
"max_brightness": {
"description": "Massima luminosità, in percentuale.💡"
},
"sleep_rgb_color": {
"description": "Colore RGB in modalità notturna (usato quando `sleep_rgb_or_color_temp` è impostato su \"rgb_color\"). 🌈"
},
"take_over_control": {
"description": "Disattiva Illuminazione Adattativa se un'altra sorcente chiama `light.turn_on` mentre le luci sono accese e soggette all'adattamento. Tieni conto che questo comporterà una chiamata a `homeassistant.update_entity` ad ogni `interval`! 🔒"
},
"sleep_transition": {
"description": "Durata della transizione al passaggio da/verso la modalità luce notturna, espressa in secondi. 😴"
},
"autoreset_control_seconds": {
"description": "Rimuovi automaticamente il colore impostato manualmente dopo un certo numero di secondi. Imposta 0 per disabilitare. ⏲️"
},
"adapt_delay": {
"description": "Tempo di attesa (in secondi) tra l'accensione della luce e i cambiamenti indotti da Illuminazione Adattativa. Può contribuire a ridurre lo sfarfallio. ⏲️"
},
"use_defaults": {
"description": "Imposta ai valori predefiniti non specificati nella chiamata al servizio. Opzioni possibili: \"current\" (predefinito, mantiene i valori correnti), \"factory\" (reimposta su un valore predefinito documentato) p \"configuration\" (reimposta sui valori predefiniti dello switch). ⚙️"
},
"separate_turn_on_commands": {
"description": "Usa chiamate distinte a `light.turn_on` per il colore e per la luminosità, necessario per alcuni tipi di luci. 🔀"
},
"prefer_rgb_color": {
"description": "Seleziona per preferire gli aggiustamenti di colore mediante RGB piuttosto che tramite temperatura colore, dove possibile. 🌈"
},
"max_color_temp": {
"description": "Temperatura colore più fredda, espressa in Kelvin. ❄️"
},
"sunset_offset": {
"description": "Modifica l'orario del tramonto con un offset positivo o negativo in secondi. ⏰"
},
"send_split_delay": {
"description": "Ritardo (ms) tra i comandi, per le luci che hanno `separate_turn_on_commands` e che non supportano l'impostazione simultanea di luminosità e colore. ⏲️"
},
"sunset_time": {
"description": "Imposta un orario fisso (HH:MM:SS) per il tramonto. 🌇"
},
"transition": {
"description": "Durata della transizione quando le luci cambiano, espressa in secondi. 🕑"
},
"min_sunset_time": {
"description": "Imposta il minimo orario per il tramonto (HH:MM:SS), per eventualmente ritardarlo. 🌅"
}
},
"description": "Cambia tutte le impostazioni che desideri nello switch. Le opzioni sono le stesse presenti nella procedura di configurazione."
},
"apply": {
"fields": {
"entity_id": {
"description": "L'`entity_id` dello switch a cui si applicano le impostazioni.📝"
},
"adapt_brightness": {
"description": "Seleziona per adattare la luminosità della luce. 🌞"
},
"turn_on_lights": {
"description": "Seleziona per accedere le luci, qualora fossero spente. 🔆"
},
"adapt_color": {
"description": "Seleziona per adattare il colore, per le luci che lo supportano. 🌈"
},
"prefer_rgb_color": {
"description": "Seleziona per preferire gli aggiustamenti di colore mediante RGB piuttosto che tramite temperatura colore, dove possibile. 🌈"
},
"lights": {
"description": "Una luce (o un insieme di luci) a cui applicare le impostazioni. 💡"
},
"transition": {
"description": "Durata della transizione quando le luci cambiano, espressa in secondi. 🕑"
}
},
"description": "Applica le impostazioni correnti di Illuminazione Adattativa alle luci."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Seleziona per aggiungere (\"true\") o rimuovere (\"false\") la luce dalla lista di quelle controllate manualmente . 🔒"
},
"entity_id": {
"description": "L'`entity_id` dello switch che controlla se la luce deve operare in modalità manualmente controllata.📝"
},
"lights": {
"description": "entity_id delle luci, se non specificato, tutte le luci nello switch sono selezionate. 💡"
}
},
"description": "Evidenzia quando una luce è controllata manualmente."
} }
} }
}

View file

@ -0,0 +1,48 @@
{
"title": "明るさの自動調整",
"services": {
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "日の出時間を基準に秒単位で正値もしくは負値で調整する。⏰"
},
"only_once": {
"description": "一度だけ明るさを自動調整するには(`true`)、常に自動調整し続ける場合は(`false`)。"
},
"sunset_offset": {
"description": "日の入時間を基準に秒単位で正値もしくは負値で調整する。⏰"
},
"entity_id": {
"description": "スイッチのエンティティID。 📝"
}
}
},
"apply": {
"fields": {
"lights": {
"description": "適応する照明(か照明のリスト)の設定。 💡"
}
}
}
},
"options": {
"step": {
"init": {
"data": {},
"data_description": {},
"title": "明るさの自動調整オプション",
"sections": {
"advanced": {
"data": {
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: 最初に照明オンにするとき。`true`を設定すると、AL(適応型照明)は調色や明るさを指定せずや`light.turn_on`をしたときのみ適応します。❌🌈 例えば、適応型照明をシーンを有効にするときにしないようにする。`false`であれば、`service_data`に最初から、ALはシーンの状態に関係なく調色や明るさを適応する。`take_over_control`を有効にすることが必要。🕵️ "
},
"data_description": {
"sunrise_offset": "日の出時間を基準に秒単位で正値もしくは負値で調整する。⏰",
"sunset_offset": "日の入時間を基準に秒単位で正値もしくは負値で調整する。⏰"
}
}
}
}
}
}
}

View file

@ -0,0 +1,277 @@
{
"title": "적응형 조명",
"config": {
"step": {
"user": {
"title": "적응형 조명 인스턴스 이름 선택",
"description": "각 인스턴스는 여러 조명을 포함할 수 있습니다!",
"data": {
"name": "이름"
}
}
},
"abort": {
"already_configured": "이 장치는 이미 구성되었습니다"
}
},
"options": {
"step": {
"init": {
"title": "적응형 조명 옵션",
"description": "적응형 조명 구성요소를 구성합니다. 옵션 이름은 YAML 설정과 일치합니다. 이 항목을 YAML에서 정의한 경우 여기에 옵션이 표시되지 않습니다. 매개변수 효과를 시연하는 인터랙티브 그래프는 [이 웹 앱]({webapp_url})에서 확인할 수 있습니다. 자세한 내용은 [공식 문서]({docs_url})를 참조하세요.",
"data": {
"lights": "조명: 제어될 조명 entity_ids의 목록 (비어 있을 수 있음). 🌟",
"interval": "간격",
"transition": "전환",
"min_brightness": "최소 밝기: 밝기 최소 퍼센트. 💡",
"max_brightness": "최대 밝기: 밝기 최대 퍼센트. 💡",
"min_color_temp": "최소 색온도: 켈빈으로 표시된 가장 따뜻한 색온도. 🔥",
"max_color_temp": "최대 색온도: 켈빈으로 표시된 가장 차가운 색온도. ❄️",
"sleep_brightness": "수면 밝기",
"sleep_color_temp": "수면 색온도"
},
"data_description": {
"interval": "조명을 조정하는 빈도, 초 단위. 🔄",
"transition": "조명이 변경될 때 전환 기간, 초 단위. 🕑",
"sleep_brightness": "수면 모드에서 조명의 밝기 퍼센트. 😴",
"sleep_color_temp": "수면 모드에서 색온도 (sleep_rgb_or_color_temp가 `color_temp`일 때 사용) 켈빈 단위. 😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "초기 전환",
"prefer_rgb_color": "RGB 색상 선호: 가능할 경우 색온도 조정보다 RGB 색상 조정을 선호하는지 여부. 🌈",
"sleep_rgb_or_color_temp": "수면 rgb_or_color_temp",
"sleep_rgb_color": "수면 RGB 색상",
"sleep_transition": "수면 전환",
"transition_until_sleep": "수면까지 전환: 활성화되면, 적응형 조명은 수면 설정을 최소값으로 취급하고 일몰 후 이 값으로 전환합니다. 🌙",
"sunrise_time": "일출 시간",
"min_sunrise_time": "최소 일출 시간",
"max_sunrise_time": "최대 일출 시간",
"sunrise_offset": "일출 오프셋",
"sunset_time": "일몰 시간",
"min_sunset_time": "최소 일몰 시간",
"max_sunset_time": "최대 일몰 시간",
"sunset_offset": "일몰 오프셋",
"brightness_mode": "밝기 모드",
"brightness_mode_time_dark": "어두울 때 밝기 모드 시간",
"brightness_mode_time_light": "밝을 때 밝기 모드 시간",
"take_over_control": "제어 인계: 다른 소스가 조명이 켜져 있고 조정 중일 때 `light.turn_on`을 호출하면 적응형 조명을 비활성화합니다. 이는 매 `간격`마다 `homeassistant.update_entity`를 호출합니다! 🔒",
"detect_non_ha_changes": "비HA 변경 감지: `light.turn_on`이 아닌 상태 변경을 감지하고 조정을 중단합니다. `take_over_control`이 활성화되어 있어야 합니다. 🕵️ 주의: ⚠️ 일부 조명은 잘못된 '켜짐' 상태를 나타낼 수 있으며, 이로 인해 조명이 예상치 못하게 켜질 수 있습니다. 이러한 문제가 발생하면 이 기능을 비활성화하세요.",
"autoreset_control_seconds": "자동 제어 리셋 초",
"only_once": "한 번만: 조명을 켤 때만 조정 (`true`) 또는 계속해서 조정 (`false`). 🔄",
"adapt_only_on_bare_turn_on": "초기 켜짐 시 조정만: 조명을 처음 켤 때. `true`로 설정하면 `light.turn_on`이 색상이나 밝기를 지정하지 않고 호출될 때만 AL이 조정합니다. ❌🌈 예를 들어, 장면을 활성화할 때 조정을 방지합니다. `false`로 설정하면, AL은 초기 `service_data`에 색상이나 밝기의 존재 여부와 관계없이 조정합니다. `take_over_control`이 활성화되어 있어야 합니다. 🕵️",
"separate_turn_on_commands": "분리된 켜기 명령 사용: 일부 조명 유형에 필요한 색상과 밝기에 대해 별도의 `light.turn_on` 호출을 사용합니다. 🔀",
"send_split_delay": "분할 전송 지연",
"adapt_delay": "조정 지연",
"skip_redundant_commands": "중복 명령 건너뛰기: 목표 상태가 이미 조명의 알려진 상태와 동일한 조정 명령을 보내지 않습니다. 네트워크 트래픽을 최소화하고 일부 상황에서 조정 반응성을 향상시킵니다. 📉 물리적 조명 상태가 HA의 기록된 상태와 동기화되지 않는 경우 비활성화하세요.",
"intercept": "가로채기: 색상과 밝기의 즉각적인 조정을 가능하게 하기 위해 `light.turn_on` 호출을 가로챕니다. 🏎️ 색상과 밝기를 지원하지 않는 조명에 대해 비활성화합니다.",
"multi_light_intercept": "다중 조명 가로채기: 여러 조명을 대상으로 하는 `light.turn_on` 호출을 가로채고 조정합니다. ➗⚠️ 이는 단일 `light.turn_on` 호출을 여러 호출로 분할할 수 있음을 의미합니다. 예를 들어, 조명이 다른 스위치에 있을 때. `intercept`가 활성화되어 있어야 합니다.",
"include_config_in_attributes": "속성에 구성 포함: `true`로 설정하면 Home Assistant에서 스위치의 모든 옵션을 속성으로 표시합니다. 📝"
},
"data_description": {
"initial_transition": "조명이 `off`에서 `on`으로 바뀔 때 첫 번째 전환의 지속 시간, 초 단위. ⏲️",
"sleep_rgb_or_color_temp": "수면 모드에서 `\"rgb_color\"` 또는 `\"color_temp\"` 사용. 🌙",
"sleep_rgb_color": "수면 모드에서 RGB 색상 (sleep_rgb_or_color_temp가 \"rgb_color\"일 때 사용). 🌈",
"sleep_transition": "\"수면 모드\"가 전환될 때 전환 기간, 초 단위. 😴",
"sunrise_time": "일출 시간을 고정된 시간 (HH:MM:SS)으로 설정. 🌅",
"min_sunrise_time": "가장 이른 가상 일출 시간 (HH:MM:SS)을 설정하여 더 늦은 일출을 허용. 🌅",
"max_sunrise_time": "가장 늦은 가상 일출 시간 (HH:MM:SS)을 설정하여 더 일찍 일출을 허용. 🌅",
"sunrise_offset": "양수 또는 음수 오프셋(초)으로 일출 시간을 조정. ⏰",
"sunset_time": "일몰 시간을 고정된 시간 (HH:MM:SS)으로 설정. 🌇",
"min_sunset_time": "가장 이른 가상 일몰 시간 (HH:MM:SS)을 설정하여 더 늦은 일몰을 허용. 🌇",
"max_sunset_time": "가장 늦은 가상 일몰 시간 (HH:MM:SS)을 설정하여 더 일찍 일몰을 허용. 🌇",
"sunset_offset": "양수 또는 음수 오프셋(초)으로 일몰 시간을 조정. ⏰",
"brightness_mode": "사용할 밝기 모드. 가능한 값은 `default`, `linear`, `tanh` (uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(`brightness_mode='default'`인 경우 무시됨) 일출/일몰 전/후에 밝기를 높이거나 낮추는 데 걸리는 시간, 초 단위. 📈📉",
"brightness_mode_time_light": "(`brightness_mode='default'`인 경우 무시됨) 일출/일몰 후/전에 밝기를 높이거나 낮추는 데 걸리는 시간, 초 단위. 📈📉.",
"autoreset_control_seconds": "특정 초 후에 수동 제어를 자동으로 재설정. 0으로 설정하면 비활성화됩니다. ⏲️",
"send_split_delay": "`separate_turn_on_commands`에 대한 호출 사이의 지연 시간(밀리초)으로, 밝기와 색상을 동시에 설정하지 않는 조명에 대한 지연. ⏲️",
"adapt_delay": "조명을 켠 후 적응형 조명이 변경 사항을 적용하기까지의 대기 시간(초). 깜박임을 피하는 데 도움이 될 수 있습니다. ⏲️"
}
}
}
}
},
"error": {
"option_error": "잘못된 옵션",
"entity_missing": "선택한 하나 이상의 조명 엔티티가 Home Assistant에서 누락됨"
}
},
"services": {
"apply": {
"name": "적용",
"description": "현재 적응형 조명 설정을 조명에 적용합니다.",
"fields": {
"entity_id": {
"description": "설정을 적용할 스위치의 `entity_id`. 📝",
"name": "entity_id"
},
"lights": {
"description": "설정을 적용할 조명(또는 조명 목록). 💡",
"name": "lights"
},
"transition": {
"description": "조명 변경 시 전환 기간, 초 단위. 🕑",
"name": "transition"
},
"adapt_brightness": {
"description": "조명의 밝기를 조정할지 여부. 🌞",
"name": "adapt_brightness"
},
"adapt_color": {
"description": "지원하는 조명의 색상을 조정할지 여부. 🌈",
"name": "adapt_color"
},
"prefer_rgb_color": {
"description": "가능할 경우 색온도 조정보다 RGB 색상 조정을 선호하는지 여부. 🌈",
"name": "prefer_rgb_color"
},
"turn_on_lights": {
"description": "현재 꺼져 있는 조명을 켤지 여부. 🔆",
"name": "turn_on_lights"
}
}
},
"set_manual_control": {
"name": "수동 제어 설정",
"description": "조명이 '수동 제어됨'으로 표시되었는지 여부를 표시합니다.",
"fields": {
"entity_id": {
"description": "`수동 제어됨`으로 (표시 해제)할 스위치의 `entity_id`. 📝",
"name": "entity_id"
},
"lights": {
"description": "조명의 entity_id(들), 지정하지 않으면 스위치의 모든 조명이 선택됩니다. 💡",
"name": "lights"
},
"manual_control": {
"description": "\"수동 제어\" 목록에서 조명을 추가(\"true\") 또는 제거(\"false\")할지 여부. 🔒",
"name": "manual_control"
}
}
},
"change_switch_settings": {
"name": "스위치 설정 변경",
"description": "스위치에서 원하는 모든 설정을 변경하세요. 여기에 있는 모든 옵션은 구성 흐름에서와 같습니다.",
"fields": {
"entity_id": {
"description": "스위치의 Entity ID. 📝",
"name": "entity_id"
},
"use_defaults": {
"description": "이 서비스 호출에서 지정되지 않은 기본값을 설정합니다. 옵션: \"현재\"(기본값, 현재 값을 유지), \"공장\"(문서화된 기본값으로 재설정), 또는 \"구성\"(스위치 구성 기본값으로 되돌림). ⚙️",
"name": "use_defaults"
},
"include_config_in_attributes": {
"description": "`true`로 설정하면 Home Assistant에서 스위치의 모든 옵션을 속성으로 표시합니다. 📝",
"name": "include_config_in_attributes"
},
"turn_on_lights": {
"description": "현재 꺼져 있는 조명을 켤지 여부. 🔆",
"name": "turn_on_lights"
},
"initial_transition": {
"description": "조명이 `off`에서 `on`으로 바뀔 때 첫 번째 전환의 지속 시간, 초 단위. ⏲️",
"name": "initial_transition"
},
"sleep_transition": {
"description": "\"수면 모드\"가 전환될 때 전환 기간, 초 단위. 😴",
"name": "sleep_transition"
},
"max_brightness": {
"description": "최대 밝기 퍼센트. 💡",
"name": "max_brightness"
},
"max_color_temp": {
"description": "켈빈으로 표시된 가장 차가운 색온도. ❄️",
"name": "max_color_temp"
},
"min_brightness": {
"description": "최소 밝기 퍼센트. 💡",
"name": "min_brightness"
},
"min_color_temp": {
"description": "켈빈으로 표시된 가장 따뜻한 색온도. 🔥",
"name": "min_color_temp"
},
"only_once": {
"description": "조명을 켤 때만 조정 (`true`) 또는 계속해서 조정 (`false`). 🔄",
"name": "only_once"
},
"prefer_rgb_color": {
"description": "가능할 경우 색온도 조정보다 RGB 색상 조정을 선호하는지 여부. 🌈",
"name": "prefer_rgb_color"
},
"separate_turn_on_commands": {
"description": "일부 조명 유형에 필요한 색상과 밝기에 대해 별도의 `light.turn_on` 호출을 사용합니다. 🔀",
"name": "separate_turn_on_commands"
},
"send_split_delay": {
"description": "밝기와 색상을 동시에 설정하지 않는 조명에 대한 `separate_turn_on_commands` 호출 사이의 지연 시간(밀리초). ⏲️",
"name": "send_split_delay"
},
"sleep_brightness": {
"description": "수면 모드에서 조명의 밝기 퍼센트. 😴",
"name": "sleep_brightness"
},
"sleep_rgb_or_color_temp": {
"description": "수면 모드에서 `\"rgb_color\"` 또는 `\"color_temp\"` 사용. 🌙",
"name": "sleep_rgb_or_color_temp"
},
"sleep_rgb_color": {
"description": "수면 모드에서 RGB 색상 (sleep_rgb_or_color_temp가 \"rgb_color\"일 때 사용). 🌈",
"name": "sleep_rgb_color"
},
"sleep_color_temp": {
"description": "수면 모드에서 색온도 (sleep_rgb_or_color_temp가 `color_temp`일 때 사용) 켈빈 단위. 😴",
"name": "sleep_color_temp"
},
"sunrise_offset": {
"description": "양수 또는 음수 오프셋(초)으로 일출 시간을 조정. ⏰",
"name": "sunrise_offset"
},
"sunrise_time": {
"description": "일출 시간을 고정된 시간 (HH:MM:SS)으로 설정. 🌅",
"name": "sunrise_time"
},
"sunset_offset": {
"description": "양수 또는 음수 오프셋(초)으로 일몰 시간을 조정. ⏰",
"name": "sunset_offset"
},
"sunset_time": {
"description": "일몰 시간을 고정된 시간 (HH:MM:SS)으로 설정. 🌇",
"name": "sunset_time"
},
"max_sunrise_time": {
"description": "가장 늦은 가상 일출 시간 (HH:MM:SS)을 설정하여 더 일찍 일출을 허용. 🌅",
"name": "max_sunrise_time"
},
"min_sunset_time": {
"description": "가장 이른 가상 일몰 시간 (HH:MM:SS)을 설정하여 더 늦은 일몰을 허용. 🌇",
"name": "min_sunset_time"
},
"take_over_control": {
"description": "다른 소스가 조명이 켜져 있고 조정 중일 때 `light.turn_on`을 호출하면 적응형 조명을 비활성화합니다. 이는 매 `간격`마다 `homeassistant.update_entity`를 호출합니다! 🔒",
"name": "take_over_control"
},
"detect_non_ha_changes": {
"description": "`light.turn_on`이 아닌 상태 변경을 감지하고 조정을 중단합니다. `take_over_control`이 활성화되어 있어야 합니다. 🕵️ 주의: ⚠️ 일부 조명은 잘못된 '켜짐' 상태를 나타낼 수 있으며, 이로 인해 조명이 예상치 못하게 켜질 수 있습니다. 이러한 문제가 발생하면 이 기능을 비활성화하세요.",
"name": "detect_non_ha_changes"
},
"transition": {
"description": "조명이 변경될 때 전환 기간, 초 단위. 🕑",
"name": "transition"
},
"adapt_delay": {
"description": "조명을 켠 후 적응형 조명이 변경 사항을 적용하기까지의 대기 시간(초). 깜박임을 피하는 데 도움이 될 수 있습니다. ⏲️",
"name": "adapt_delay"
},
"autoreset_control_seconds": {
"description": "특정 초 후에 수동 제어를 자동으로 재설정. 0으로 설정하면 비활성화됩니다. ⏲️",
"name": "autoreset_control_seconds"
}
}
}
}
}

View file

@ -1,50 +1,222 @@
{ {
"title":"Adaptiv Belysning", "title": "Adaptiv Belysning",
"config":{ "config": {
"step":{ "step": {
"user":{ "user": {
"title":"Velg et navn", "title": "Velg et navn",
"description":"Velg et navn for denne konfigurasjonen for adaptiv belysning - hver konfigurasjon kan inneholde flere lyskilder!", "description": "Velg et navn for denne konfigurasjonen for adaptiv belysning - hver konfigurasjon kan inneholde flere lyskilder!",
"data":{ "data": {
"name":"Navn" "name": "Navn"
} }
}
},
"abort":{
"already_configured":"Denne enheten er allerede konfigurert!"
} }
}, },
"options":{ "abort": {
"step":{ "already_configured": "Denne enheten er allerede konfigurert!"
"init":{ }
"title":"Adaptiv Belysning Innstillinger", },
"description":"Alle innstillinger for en adaptiv belysning konfigurasjon. Innstillingene er identiske med innstillingene for YAML konfigurasjon. Ingen innstillinger vises dersom du har definert adaptive_lighting i din YAML konfigurasjon.", "options": {
"data":{ "step": {
"lights":"Lys / Lyskilder", "init": {
"initial_transition":"'initial_transition': overgangen (i sekunder) når lysene skrus av eller på - eller når 'sleep_state' endres", "title": "Adaptiv Belysning Innstillinger",
"interval":"'interval': tiden mellom oppdateringer (i sekunder)", "description": "Alle innstillinger for en adaptiv belysning konfigurasjon. Innstillingene er identiske med innstillingene for YAML konfigurasjon. Ingen innstillinger vises dersom du har definert adaptive_lighting i din YAML konfigurasjon.",
"max_brightness":"'max_brightness': den høyeste lysstyrken (i prosent) på lysene i løpet av en syklus", "data": {
"max_color_temp":"'max_color_temp': den høyeste fargetemperaturen (i kelvin) på lysene i løpet av en syklus", "lights": "Lys / Lyskilder",
"min_brightness":"'min_brightness': den laveste lysstyrken (i prosent) på lysene i løpet av en syklus", "interval": "'interval': tiden mellom oppdateringer (i sekunder)",
"min_color_temp":"'min_color_temp': den laveste fargetemperaturen (i kelvin) på lysene i løpet av en syklus", "transition": "'transition': varigheten (i sekunder) på overgangen når lysene oppdateres ",
"only_once":"'only_once': anvend innstillingene for adaptiv belysning kun når lysene skrus av eller på", "min_brightness": "'min_brightness': den laveste lysstyrken (i prosent) på lysene i løpet av en syklus",
"prefer_rgb_color":"'prefer_rgb_color': benytt rgb i stedet for fargetemperatur dersom det er mulig", "max_brightness": "'max_brightness': den høyeste lysstyrken (i prosent) på lysene i løpet av en syklus",
"separate_turn_on_commands":"'separate_turn_on_commands': separer kommandone i 'light.turn_on' for hver attributt (farge, lysstyrke, osv.). Dette kan være nødvendig for enkelte typer lys / lyskilder", "min_color_temp": "'min_color_temp': den laveste fargetemperaturen (i kelvin) på lysene i løpet av en syklus",
"sleep_brightness":"'sleep_brightness': lysstyrken på lysene (i prosent) når 'sleep_mode' (søvnmodus) er aktiv", "max_color_temp": "'max_color_temp': den høyeste fargetemperaturen (i kelvin) på lysene i løpet av en syklus",
"sleep_color_temp":"'sleep_color_temp': fargetemperaturen på lysene (i kelvin) når 'sleep_mode' (søvnmodus) er aktiv", "sleep_brightness": "'sleep_brightness': lysstyrken på lysene (i prosent) når 'sleep_mode' (søvnmodus) er aktiv",
"sunrise_offset":"'sunrise_offset': hvor lenge før (-) eller etter (+) tidspunktet solen står opp (lokalt) skal defineres som soloppgang (i sekunder)", "sleep_color_temp": "'sleep_color_temp': fargetemperaturen på lysene (i kelvin) når 'sleep_mode' (søvnmodus) er aktiv"
"sunrise_time":"'sunrise_time': definer tidspunktet for soloppgang manuelt (i følgende format: TT:MM:SS)", },
"sunset_offset":"'sunset_offset': hvor lenge før (-) eller etter (+) tidspunktet solen går ned (lokalt) skal defineres som solnedgang (i sekunder)", "data_description": {
"sunset_time":"'sunset_time': definer tidspunktet for solnedgang manuelt (i følgende format: TT:MM:SS - f. eks: '20:30:00' vil definere tidspunktet for solnegang som halv-ni på kvelden)", "interval": "Frekvens til å tilpasse lys, i sekunder.",
"take_over_control":"'take_over_control': dersom en annen tjeneste enn adaptiv belysning skrur lysene av eller på, vil automatisk adaptering av lyset stoppes inntil lyset (eller den tilhørende bryteren for adaptiv belysning) blir slått av - og på igjen", "transition": "Varighet på overgang når lysene endres, i sekunder.",
"detect_non_ha_changes":"'detect_non_ha_changes': registrerer alle endringer i lysstyrke over 10% med opprinnelse utenfor Home Assistant - krever at 'take_over_control' er aktivert (OBS: tilkaller 'homeassistant.update_entity' ved hvert 'interval'!)", "sleep_brightness": "Lysstyrkeprosent på lysene i sove modus.",
"transition":"'transition': varigheten (i sekunder) på overgangen når lysene oppdateres " "sleep_color_temp": "Fargetemperatur i sove modus (brukes når `sleep_rgb_or_color_temp` er `color_temp`) i Kelvin."
},
"sections": {
"advanced": {
"data": {
"initial_transition": "'initial_transition': overgangen (i sekunder) når lysene skrus av eller på - eller når 'sleep_state' endres",
"prefer_rgb_color": "'prefer_rgb_color': benytt rgb i stedet for fargetemperatur dersom det er mulig",
"transition_until_sleep": "transition_until_sleep: Når aktivert, Adaptive lightning vil behandle sove innstillingene som minimum, bevege seg til disse verdiene etter solnedgang.",
"sunrise_time": "'sunrise_time': definer tidspunktet for soloppgang manuelt (i følgende format: TT:MM:SS)",
"sunrise_offset": "'sunrise_offset': hvor lenge før (-) eller etter (+) tidspunktet solen står opp (lokalt) skal defineres som soloppgang (i sekunder)",
"sunset_time": "'sunset_time': definer tidspunktet for solnedgang manuelt (i følgende format: TT:MM:SS - f. eks: '20:30:00' vil definere tidspunktet for solnegang som halv-ni på kvelden)",
"sunset_offset": "'sunset_offset': hvor lenge før (-) eller etter (+) tidspunktet solen går ned (lokalt) skal defineres som solnedgang (i sekunder)",
"take_over_control": "'take_over_control': dersom en annen tjeneste enn adaptiv belysning skrur lysene av eller på, vil automatisk adaptering av lyset stoppes inntil lyset (eller den tilhørende bryteren for adaptiv belysning) blir slått av - og på igjen",
"detect_non_ha_changes": "'detect_non_ha_changes': registrerer alle endringer i lysstyrke over 10% med opprinnelse utenfor Home Assistant - krever at 'take_over_control' er aktivert (OBS: tilkaller 'homeassistant.update_entity' ved hvert 'interval'!)",
"only_once": "'only_once': anvend innstillingene for adaptiv belysning kun når lysene skrus av eller på",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_on: Når lysene skrues på. Hvis satt til \"sann\", AL vil bare hvis \"light.turn_on\" er aktivert uten spesifisert farge og styrke. Dette f.eks. forhindrer aktivering når en scene aktiveres. Hvis \"false\", AL vil aktivere uansett om farge og stryke er satt av i opprinnelig \"service_data\". Trenger \"take_over_control\" er aktivert. ",
"separate_turn_on_commands": "'separate_turn_on_commands': separer kommandone i 'light.turn_on' for hver attributt (farge, lysstyrke, osv.). Dette kan være nødvendig for enkelte typer lys / lyskilder",
"skip_redundant_commands": "skip_redundant_commands: Dropp sending av tilpassnings kommandoer hvor målets tilstand allerede er lik den kjente tilstanden til lyset. Minimerer nettverk trafikk og forbedrer tilpasningens responsitivitet i noen situasjoner. Skru av hvis fysisk tilstand til lyset er ute av synkronisering med HA´s registrere tilstand.",
"intercept": "Bryt: Bryt og tilpass `light.turn_on` kall for å aktivere umiddelbar farge og styrke tilpassning. Deaktiver for lys som ikke støtter `light.turn_on` med farge og styrke.",
"multi_light_intercept": "multi_light_incept: Avskjære og tilpasse \"light.turn_on\" kall til flere lyskilder. Dette kan medføre oppsplitting av et enkelt \"light.turn_on\" kall til flere kall, f.eks når lys tilhører flere brytere. Dette krever at \"intercept\" er aktivert.",
"include_config_in_attributes": "include_config_in_attributes: Vis alle valg som attributes på bryteren i Home Assistant når satt til `true`."
},
"data_description": {
"initial_transition": "Varighet på første overgang når lysene endres fra `off` til `on` i sekunder.",
"sleep_rgb_or_color_temp": "Bruk enten `\"rgb_color\"` eller `\"color_temp\"` i sove modus.",
"sleep_rgb_color": "RGB farger i sove modus (brukes når \"sleep_rgb_or_color_temp\" er \"rgb_color\")",
"sleep_transition": "Varighet på overgang når \"sleep mode\" er aktivert i sekunder.",
"sunrise_time": "Sett et fast tidspunkt (TT:MM:SS) for soloppgang.",
"min_sunrise_time": "Sett tidligste virituelle tidspunkt for soloppgang (TT:MM:SS), muliggjør for senere soloppganger",
"max_sunrise_time": "Sett det seneste virituelle tidspunktet for soloppgang (TT:MM:SS), muliggjør for tidligere soloppganger.",
"sunrise_offset": "Juster soloppgang tidspunkt med en positiv eller negativ forskyvning i sekunder. ⏰",
"sunset_time": "Sett et fast tidspunkt (TT:MM:SS) for solnedgang.",
"min_sunset_time": "Sett det tidligste virituelle tidspunktet for solnedgang (TT:MM:SS), muliggjør for senere solnedgang.",
"max_sunset_time": "Sett det seneste virituelle tidspunktet for solnedgang (TT:MM:SS), muliggjør for tidligere solnedgang.",
"sunset_offset": "Juster soloppgang tidspunkt med en positiv eller negativ forskyvning i sekunder. ⏰",
"brightness_mode": "Hvilken lysstyrke moduse skal brukes. Mulige verdier er `default`, `linear`, and `tanh` (bruker `brightness_mode_time_dark` og `brightness_mode_time_light`).",
"brightness_mode_time_dark": "(Ignorere hvis `brightness_mode='default'`) Varigheten i sekunder for å justere opp/ned lysstyrken før/etter soloppgang/solnedgang.",
"brightness_mode_time_light": "(Ignorere hvis `brightness_mode='default'`) Varigheten i sekunder for å justere opp/ned lysstyrken før/etter soloppgang/solnedgang.",
"autoreset_control_seconds": "Automatisk reset manuell kontroll etter et gitt antall sekunder. Sett til 0 for å skru av.",
"send_split_delay": "Forsinkelse (ms) mellom `separate_turn_on_commands` for lys som ikke støtter simultane styrke og farge innstillinger.",
"adapt_delay": "Ventetid (sekunder) mellom at lyset skrues på og Adaptive Lightning sender endringer. Kan hjelpe til for å unngå blinking."
} }
} }
}, }
"error":{
"option_error":"En eller flere valgte innstillinger er ugyldige",
"entity_missing": "Et utvalgt lys ble ikke funnet"
} }
} },
"error": {
"option_error": "En eller flere valgte innstillinger er ugyldige",
"entity_missing": "Et utvalgt lys ble ikke funnet"
}
},
"services": {
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "Juster soloppgang tidspunkt med en positiv eller negativ forskyvning i sekunder. ⏰"
},
"only_once": {
"description": "Tilpass lys kun når dei er skrudd på (`true`) eller fortsett å tilpasse dei (`false`)"
},
"sunset_offset": {
"description": "Juster soloppgang tidspunkt med en positiv eller negativ forskyvning i sekunder. ⏰"
},
"use_defaults": {
"description": "Sett default verdier ikke spesifisert i dette service kallet. Muligheter: \"current\" (default, fortsetter med nåværende verdier), \"factory\" (nullstiller til dokumenterte defaults), eller \"configuration\" (går tilbake til bryter defaults)."
},
"include_config_in_attributes": {
"description": "Vis alle muligheter som valg på bryteren i Home Assistant når satt til \"true\"."
},
"initial_transition": {
"description": "Varighet på første overgang når lysene endres fra `off` til `on` i sekunder."
},
"entity_id": {
"description": "Bryterens Entity ID."
},
"sleep_transition": {
"description": "Varighet på overgang når \"sleep mode\" er aktivert i sekunder."
},
"max_brightness": {
"description": "Maksimal lysstyrke prosent."
},
"separate_turn_on_commands": {
"description": "Bruk separat `light.turn_on` kall for farge og styrke, nødvendig for noen typer lys."
},
"min_color_temp": {
"description": "Varmeste farge temperatur i Kelvin."
},
"prefer_rgb_color": {
"description": "Foretrekke RGB farge inntsillinger over lysets fargetemperatur innstilling når mulig."
},
"max_color_temp": {
"description": "Kaldeste farge temperatur i Kelvin."
},
"min_brightness": {
"description": "Minste lysstyrke prosent."
},
"sleep_rgb_or_color_temp": {
"description": "Bruk enten `\"rgb_color\"` eller `\"color_temp\"` i sove modus."
},
"sleep_brightness": {
"description": "Lysstyrkeprosent på lysene i sove modus."
},
"send_split_delay": {
"description": "Forsinkelse (ms) mellom `separate_turn_on_commands` for lys som ikke støtter simultane styrke og farge innstillinger."
},
"sleep_rgb_color": {
"description": "RGB farger i sove modus (brukes når \"sleep_rgb_or_color_temp\" er \"rgb_color\")"
},
"sleep_color_temp": {
"description": "Fargetemperatur i sove modus (brukes når `sleep_rgb_or_color_temp` er `color_temp`) i Kelvin."
},
"sunrise_time": {
"description": "Sett et fast tidspunkt (TT:MM:SS) for soloppgang."
},
"sunset_time": {
"description": "Set et fast tidspunkt (TT:MM:SS) for solnedgang"
},
"max_sunrise_time": {
"description": "Sett det seneste virituelle tidspunktet for soloppgang (TT:MM:SS), muliggjør for tidligere soloppganger."
},
"min_sunset_time": {
"description": "Sett det tidligeste virituelle tidspunktet for solnedgang (TT:MM:SS), muliggjør for senere solnedgang."
},
"detect_non_ha_changes": {
"description": "Detekterer og stopper tilpasningen for ikke-`light.turn_on` tilstander . Trenger `take_over_control` aktivert. Advarsel: Noen lys kan gi falske signal om 'on' tilstand, som kan medføre at lysene skrur seg på av seg selv. Skru av denne funksjonen om dette inntreffer."
},
"autoreset_control_seconds": {
"description": "Automatisk reset manuell kontroll etter et gitt antall sekunder. Sett til 0 for å skru av."
},
"transition": {
"description": "Varighet på overgang når lysene endres, i sekunder."
},
"adapt_delay": {
"description": "Ventetid (sekunder) mellom at lyset skrues på og Adaptive Lightning sender endringer. Kan hjelpe til for å unngå blinking."
},
"turn_on_lights": {
"description": "Skru på lys som fortiden er skrudd av."
},
"take_over_control": {
"description": "Skrur av Adaptive Lightning hvis en annen kilde kaller `light.turn_on` mens lysene er på og blir styrt. Merk at dette kaller `homeassistant.update_entity` hvert eneste`interval`!"
}
},
"description": "Endre hvilken som helst innstilling i bryteren. Alle valg er det samme som i konfigurasjons prosessen."
},
"apply": {
"fields": {
"lights": {
"description": "Et lys (eller ei liste av lys) instillingene skal påvirke. 💡"
},
"entity_id": {
"description": "\"entity_id\" på bryteren hvor innstillingene skal legges til."
},
"transition": {
"description": "Varighet på overgang når lysene endres, i sekunder."
},
"adapt_brightness": {
"description": "Om å tilpasse styrken til lyset."
},
"adapt_color": {
"description": "Om å tilpasse fargen på støttelysene."
},
"prefer_rgb_color": {
"description": "Foretrekke RGB farge inntsillinger over lysets fargetemperatur innstilling når mulig."
},
"turn_on_lights": {
"description": "Skru på lys som fortiden er skrudd av."
}
},
"description": "Aktiver nåværende Adaptive Lighting innstillinger til lysene."
},
"set_manual_control": {
"fields": {
"entity_id": {
"description": "\"entity_id\" på bryteren som skal (u)markeres med at lyset er \"manuelt kontrollert\""
},
"manual_control": {
"description": "Enten å legge til (\"true\") eller fjerne (\"false\") lys fra \"manual_control\" listen."
},
"lights": {
"description": "entity_id(s) til lysene, hvis ikke spesifisert, alle lys i bryteren som er valgt."
}
},
"description": "Marker om et lys er 'manually controlled'"
}
}
} }

View file

@ -4,10 +4,17 @@
"step": { "step": {
"user": { "user": {
"title": "Kies een naam voor de adaptieve verlichting integratie", "title": "Kies een naam voor de adaptieve verlichting integratie",
"description": "Kies een naam voor deze integratie. U kunt verschillende integratie van Adaptieve verlichting uitvoeren, elk van deze kan meerdere lichten bevatten!", "description": "Elk exemplaar kan meerdere lichten bevatten!",
"data": { "data": {
"name": "Naam" "name": "Naam"
} }
},
"menu": {
"data": {
"action": "Actie"
},
"title": "Maak of dupliceer",
"description": "Wil je een nieuwe instantie aanmaken of een bestaande dupliceren?"
} }
}, },
"abort": { "abort": {
@ -18,34 +25,73 @@
"step": { "step": {
"init": { "init": {
"title": "Adaptieve verlichting instellingen", "title": "Adaptieve verlichting instellingen",
"description": "Alle instellingen voor een Adaptieve verlichting component. De optienamen komen overeen met de YAML-instellingen. Er worden geen opties weergegeven als u het item adaptive_lighting hebt gedefinieerd in uw YAML-configuratie.", "description": "Alle instellingen voor een Adaptieve verlichting component. De optienamen komen overeen met de YAML-instellingen. Er worden geen opties weergegeven als u het item `adaptive_lighting` hebt gedefinieerd in uw YAML-configuratie.\nVoor een demonstratie met interactieve grafieken, parameters en effecten, bezoek [deze web applicatie]({webapp_url}). Voor verdere details, bekijk de [officiële documentatie]({docs_url}).",
"data": { "data": {
"lights": "Lichten", "lights": "Lampen: lijst van `light` entiteiten om te bedienen (kan leeg zijn). 🌟",
"initial_transition": "initial_transition: Wanneer lichten van 'uit' naar 'aan' gaan. (seconden)",
"sleep_transition": "sleep_transition: Wanneer 'sleep_state' verandert. (seconden)",
"interval": "interval: Tijd tussen switch-updates. (seconden)", "interval": "interval: Tijd tussen switch-updates. (seconden)",
"max_brightness": "max_brightness: Hoogste helderheid van lichten tijdens een cyclus. (%)",
"max_color_temp": "max_color_temp: Koudste tint van de kleurtemperatuurcyclus. (kelvin)",
"min_brightness": "min_brightness: Laagste helderheid van lichten tijdens een cyclus. (%)",
"min_color_temp": "min_color_temp, Warmste tint van de kleurtemperatuurcyclus. (kelvin)",
"only_once": "only_once: pas de verlichting alleen aan wanneer u ze aanzet.",
"prefer_rgb_color": "prefer_rgb_color: Gebruik waar mogelijk 'rgb_color' in plaats van 'color_temp'.",
"separate_turn_on_commands": "separate_turn_on_commands: Scheid de commando's voor elk attribuut (kleur, helderheid, enz.) in 'light.turn_on' (vereist voor sommige lampen).",
"send_split_delay": "send_split_delay: wacht tussen commando's (milliseconden), wanneer separate_turn_on_commands wordt gebruikt. Kan ervoor zorgen dat beide commando's correct door de lamp worden afgehandeld.",
"sleep_brightness": "sleep_brightness, helderheidsinstelling voor slaapstand. (%)",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, gebruik 'rgb_color' of 'color_temp'",
"sleep_rgb_color": "sleep_rgb_color, in RGB",
"sleep_color_temp": "sleep_color_temp: Kleurtemperatuurinstelling voor slaapstand. (kelvin)",
"sunrise_offset": "sunrise_offset: Hoe lang voor(-) of na(+) zonsopgang uitvoeren (+/- seconden)",
"sunrise_time": "sunrise_time: Handmatige wijziging van de zonsopgangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"max_sunrise_time": "max_sunrise_time: handmatige aanpassing van de maximale zonsopgangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"sunset_offset": "sunset_offset: Hoe lang voor(-) of na(+) zonsondergang uitvoeren (+/- seconden)",
"sunset_time": "sunset_time: handmatige onderdrukking van de zonsondergangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"min_sunset_time": "min_sunset_time: handmatige onderdrukking van de minimale zonsondergangstijd, indien 'Geen', wordt de werkelijke zonsondergangstijd op uw locatie gebruikt (UU:MM:SS)",
"take_over_control": "take_over_control: Als iets anders dan Adaptive Lighting 'light.turn_on' roept wanneer een lamp al aan is, stop dan met het aanpassen van het licht totdat het (of de schakelaar) uit -> aan gaat.",
"detect_non_ha_changes": "detect_non_ha_changes: detecteert alle >10% wijzigingen aan de lichten (ook buiten HA), vereist dat 'take_over_control' is ingeschakeld (heet 'homeassistant.update_entity' elke 'interval'!)",
"transition": "Overgangstijd bij het aanbrengen van een wijziging op de lichten (seconden)", "transition": "Overgangstijd bij het aanbrengen van een wijziging op de lichten (seconden)",
"adapt_delay": "adapt_delay: wachttijd tussen het inschakelen van het licht (seconden) en het aanbrengen van wijzigingen in de lichtstatus door Adaptieve verlichting. Kan flikkering voorkomen." "min_brightness": "min_brightness: Laagste helderheid van lichten tijdens een cyclus. (%)",
"max_brightness": "max_brightness: Hoogste helderheid van lichten tijdens een cyclus. (%)",
"min_color_temp": "min_color_temp, Warmste tint van de kleurtemperatuurcyclus. (Kelvin)",
"max_color_temp": "max_color_temp: Koudste tint van de kleurtemperatuurcyclus. (kelvin)",
"sleep_brightness": "sleep_brightness, helderheidsinstelling voor slaapstand. (%)",
"sleep_color_temp": "sleep_color_temp: Kleurtemperatuurinstelling voor slaapstand. (kelvin)"
},
"data_description": {
"interval": "Frequentie om de lampen aan te passen, in seconden. 🔄",
"transition": "Duur van de overgang, in seconden, als lampen aanpassen. 🕑",
"sleep_brightness": "Helderheidspercentage van lampen in slaapstand. 😴",
"sleep_color_temp": "Kleurtemperatuur in slaapmodus (gebruikt wanneer `sleep_rgb_or_color_temp` gelijk is aan `color_temp`) in Kelvin. 😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Wanneer lichten van 'uit' naar 'aan' gaan. (seconden)",
"prefer_rgb_color": "prefer_rgb_color: Gebruik waar mogelijk 'rgb_color' in plaats van 'color_temp'.",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp, gebruik 'rgb_color' of 'color_temp'",
"sleep_rgb_color": "sleep_rgb_color, in RGB",
"sleep_transition": "sleep_transition: Wanneer 'sleep_state' verandert. (seconden)",
"transition_until_sleep": "transition_until_sleep: Wanneer ingeschakeld, zal Adaptieve verlichting de slaapinstellingen behandelen als het minimum, overgaand naar deze waarden na zonsondergang. 🌙",
"sunrise_time": "sunrise_time: Handmatige wijziging van de zonsopgangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"max_sunrise_time": "max_sunrise_time: handmatige aanpassing van de maximale zonsopgangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"sunrise_offset": "sunrise_offset: Hoe lang voor(-) of na(+) zonsopgang uitvoeren (+/- seconden)",
"sunset_time": "sunset_time: handmatige onderdrukking van de zonsondergangstijd, indien 'Geen', wordt de werkelijke zonsopgangstijd op uw locatie gebruikt (UU:MM:SS)",
"min_sunset_time": "min_sunset_time: handmatige onderdrukking van de minimale zonsondergangstijd, indien 'Geen', wordt de werkelijke zonsondergangstijd op uw locatie gebruikt (UU:MM:SS)",
"sunset_offset": "sunset_offset: Hoe lang voor(-) of na(+) zonsondergang uitvoeren (+/- seconden)",
"take_over_control": "take_over_control: Als iets anders dan Adaptieve verlichting 'light.turn_on' roept wanneer een lamp al aan is, stop dan met het aanpassen van het licht totdat het (of de schakelaar) uit -> aan gaat.",
"detect_non_ha_changes": "detect_non_ha_changes: Detecteert en stopt aanpassingen voor`light.turn_on` statuswijzigingen. Vereist dat`take_over_control` is ingeschakeld. 🕵️ Voorzichtig: ⚠️ Sommige lampen kunnen een 'aan' status vals aangeven, wat kan leiden tot onverwacht inschakelen van lampen. Schakel deze functie uit als je dergelijke problemen tegenkomt.",
"only_once": "only_once: pas de verlichting alleen aan wanneer u ze aanzet.",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Bij het initieel inschakelen van de lampen. Als dit op `true` is ingesteld, past Av alleen aan als `light.turn_on` wordt aangeroepen zonder een kleur of helderheid te specificeren. ❌🌈 Dit voorkomt bijvoorbeeld aanpassing bij het activeren van een scène. Als het `false` is, past Av aan ongeacht de aanwezigheid van kleur of helderheid in de initiële `service_data`. `take_over_control` moet ingeschakeld zijn. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Scheid de commando's voor elk attribuut (kleur, helderheid, enz.) in 'light.turn_on' (vereist voor sommige lampen).",
"send_split_delay": "send_split_delay: wacht tussen commando's (milliseconden), wanneer separate_turn_on_commands wordt gebruikt. Kan ervoor zorgen dat beide commando's correct door de lamp worden afgehandeld.",
"adapt_delay": "adapt_delay: wachttijd tussen het inschakelen van het licht (seconden) en het aanbrengen van wijzigingen in de lichtstatus door Adaptieve verlichting. Kan flikkering voorkomen.",
"skip_redundant_commands": "skip_redundant_commands: Sla het verzenden van aanpassingscommando's over waarvan de doelstatus al gelijk is aan de bekende status van de lamp. Minimaliseert netwerkverkeer en verbetert de responsiviteit van de aanpassing in sommige situaties. 📉Schakel uit als de fysieke lichtstatus niet meer synchroon loopt met de door HA geregistreerde status.",
"intercept": "intercept: Onderschep en pas `light.turn_on` oproepen aan om directe kleur- en helderheidsaanpassing mogelijk te maken. 🏎️ Schakel uit voor lampen die `light.turn_on` niet ondersteunen met kleur en helderheid.",
"multi_light_intercept": "multi_light_intercept: Onderschep en pas `light.turn_on` oproepen aan die gericht zijn op meerdere lampen. ➗⚠️ Dit kan resulteren in het opsplitsen van een enkele `light.turn_on` call in meerdere calls, bijvoorbeeld wanneer lampen zich in verschillende schakelaars bevinden. Vereist dat `intercept` is ingeschakeld.",
"include_config_in_attributes": "include_config_in_attributes: Toon alle opties als attributen op de schakelaar in Home Assistant wanneer ingesteld op `true`. 📝"
},
"data_description": {
"initial_transition": "Duur van de eerste overgang wanneer de lampen van `uit` naar `aan`gaan, in seconden. ⏲️",
"sleep_rgb_or_color_temp": "Gebruik één van beide `\"rgb_color\"` of `\"color_temp\"` in slaapstand. 🌙",
"sleep_rgb_color": "RGB kleur in slaapstand (wordt gebruikt wanneer `sleep_rgb_or_color_temp` gelijk is aan \"rgb_color\"). 🌈",
"sleep_transition": "Duur van de overgang in seconden, als slaapstand wordt geactiveerd. 😴",
"sunrise_time": "Stel een vaste tijd (HH:MM:SS) in voor zonsopkomst. 🌅",
"min_sunrise_time": "Stel de tijd (HH:MM:SS) in voor de meest vroege virtuele zonsopkomst, maakt latere zonsopkomsten mogelijk. 🌅",
"max_sunrise_time": "Stel de tijd (HH:MM:SS) in voor de laatste virtuele zonsopkomst, maakt eerdere zonsopkomsten mogelijk. 🌅",
"sunrise_offset": "Pas de zonsopkomsttijd aan met een positieve of negatieve offset in seconden. ⏰",
"sunset_time": "Stel een vaste tijd (HH:MM:SS) in voor zonsondergang. 🌇",
"min_sunset_time": "Stel de tijd (HH:MM:SS) in voor de meest vroege virtuele zonsondergang, maakt latere zonsondergangen mogelijk. 🌇",
"max_sunset_time": "Stel de tijd (HH:MM:SS) in voor de laatste virtuele zonsondergang, maakt eerdere zonsondergangen mogelijk. 🌇",
"sunset_offset": "Pas de tijd van zonsondergang aan met een positieve of negatieve verschuiving in seconden. ⏰",
"brightness_mode": "Helderheidsmodus om te gebruiken. Mogelijke waarden zijn `default`, `linear` en `tanh` (gebruikt `brightness_mode_time_dark` en `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Negeer wanneer `brightness_mode='default'`) De duur in seconden van oplopende/aflopende helderheid na/voor zonsopkomst/zonsondergang. 📈📉.",
"brightness_mode_time_light": "(Negeer wanneer `brightness_mode='default'`) De duur in seconden van oplopende/aflopende helderheid na/voor zonsopkomst/zonsondergang. 📈📉.",
"take_over_control_mode": "De adaptie pauzeermodus wanneer andere bronnen de helderheid en/of kleur van lampen veranderen. `pause_all` pauzeert altijd verandering van zowel helderheid als kleur. `pause_changed` pauzeert alleen de verandering van de extern veranderde eigenschappen en blijft onveranderde eigenschappen aanpassen, bijv. doorgaan met kleur veranderen als alleen helderheid extern is veranderd.",
"autoreset_control_seconds": "Herstel de handmatige bediening automatisch na een aantal seconden. Stel in op 0 om uit te schakelen.",
"send_split_delay": "Vertraging (ms) tussen `separate_turn_on_commands` voor lampen die geen gelijktijdige helderheids- en kleurinstelling ondersteunen. ⏲️",
"adapt_delay": "Wachttijd in (seconden) tussen het aanzetten van de lamp en het toepassen van Adaptieve verlichting veranderingen. Het kan helpen om knipperen tegen te gaan. ⏲️"
}
}
} }
} }
}, },
@ -53,5 +99,142 @@
"option_error": "Ongeldige optie", "option_error": "Ongeldige optie",
"entity_missing": "Een of meer geselecteerde lichtentiteiten ontbreken in Home Assistant" "entity_missing": "Een of meer geselecteerde lichtentiteiten ontbreken in Home Assistant"
} }
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Pas lampen alleen aan wanneer ze zijn ingeschakeld (`true`) of blijf ze aanpassen (`false`). 🔄"
},
"sunrise_offset": {
"description": "Pas de tijd van zonsopkomst aan met een positieve of negatieve verschuiving in seconden. ⏰"
},
"sunset_offset": {
"description": "Pas de tijd van zonsondergang aan met een positieve of negatieve offset in seconden. ⏰"
},
"sleep_transition": {
"description": "Duur van de overgang in seconden, als slaapstand wordt geactiveerd. 😴"
},
"entity_id": {
"description": "entiteit_id van de schakelaar. 📝"
},
"transition": {
"description": "Duur van de overgang in seconden, als lampen aanpassen. 🕑"
},
"autoreset_control_seconds": {
"description": "Herstel de handmatige bediening na een aantal seconden. Stel in op 0 om uit te schakelen."
},
"sleep_brightness": {
"description": "Helderheidspercentage van lampen in slaapmodus. 😴"
},
"sleep_color_temp": {
"description": "Kleurtemperatuur in slaapmodus (gebruikt wanneer `sleep_rgb_or_color_temp` `color_temp` is) in Kelvin. 😴"
},
"max_color_temp": {
"description": "Koudste kleurtemperatuur in Kelvin. ❄️"
},
"initial_transition": {
"description": "Duur van de eerste overgang wanneer de lampen van `uit` naar `aan`gaan, in seconden. ⏲️"
},
"take_over_control": {
"description": "Schakel Adaptieve verlichting uit als een andere bron `light.turn_on` aanroept terwijl de lampen aan zijn en worden aangepast. Let op dit roept`homeassistant.update_entity` elke `interval`aan."
},
"detect_non_ha_changes": {
"description": "Detecteert en stopt aanpassingen voor niet-`light.turn_on` state veranderingen. `take_over_control` moet actief zijn. 🕵️ Let op:⚠Sommige lampen kunnen incorrect een 'on' state weergeven, wat resulteert in lampen die onverwacht aan gaan. Schakel deze feature uit wanneer deze fout zich voordoet."
},
"max_sunrise_time": {
"description": "Stel de tijd (HH:MM:SS) in voor de laatste virtuele zonsopkomst, maakt eerdere zonsopkomsten mogelijk. 🌅"
},
"min_brightness": {
"description": "Minimale helderheid in procenten. 💡"
},
"min_color_temp": {
"description": "Meest warme kleurtemperatuur ins Kelvin. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Gebruik één van beide `\"rgb_color\"` of `\"color_temp\"` in slaapstand. 🌙"
},
"turn_on_lights": {
"description": "Of de lampen moeten worden aangezet die momenteel uit zijn.🔆"
},
"sunrise_time": {
"description": "Stel een vaste tijd (HH:MM:SS) in voor zonsopkomst. 🌅"
},
"include_config_in_attributes": {
"description": "Toon alle opties als attributen bij de schakelaar in Home Assistant wanneer ingesteld op `true`. 📝"
},
"max_brightness": {
"description": "Maximale helderheid in procenten. 💡"
},
"sleep_rgb_color": {
"description": "RGB kleur in slaapstand (wordt gebruikt wanneer `sleep_rgb_or_color_temp` gelijk is aan \"rgb_color\"). 🌈"
},
"adapt_delay": {
"description": "Wachttijd in (seconden) tussen het aanzetten van de lamp en het toepassen van Adaptieve verlichting veranderingen. Het kan helpen om knipperen tegen te gaan. ⏲️"
},
"use_defaults": {
"description": "Stelt niet gespecificeerde waarden in voor deze service call. Opties: \"current\" (standaard, behoudt huidige waarden), \"factory\" (herstelt de gedocumenteerde standaardwaarden), of \"configuration\" (zet instellingen terug naar de standaardwaarden in de configuratie ). ⚙️"
},
"separate_turn_on_commands": {
"description": "Gebruik aparte `light.turn_on` calls voor kleur en helderheid, dit is nodig voor bepaalde lampen. 🔀"
},
"prefer_rgb_color": {
"description": "Geef de voorkeur aan RGB kleuren boven de kleurtemperatuur van de lamp wanneer mogelijk. 🌈"
},
"send_split_delay": {
"description": "Vertraging (ms) tussen `separate_turn_on_commands` voor lampen die geen gelijktijdige helderheids- en kleurinstelling ondersteunen. ⏲️"
},
"sunset_time": {
"description": "Stel een vaste tijd (HH:MM:SS) in voor zonsondergang. 🌇"
},
"min_sunset_time": {
"description": "Stel de tijd (HH:MM:SS) in voor de meest vroege virtuele zonsondergang, maakt latere zonsondergangen mogelijk. 🌇"
},
"take_over_control_mode": {
"description": "De adaptie pauzeermodus wanneer andere bronnen de helderheid en/of kleur van lampen veranderen. `pause_all` pauzeert altijd verandering van zowel helderheid als kleur. `pause_changed` pauzeert alleen de verandering van de extern veranderde eigenschappen en blijft onveranderde eigenschappen aanpassen, bijv. doorgaan met kleur veranderen als alleen helderheid extern is veranderd."
}
},
"description": "Wijzig alle gewenste instellingen in de schakelaar. Alle opties hier zijn hetzelfde als in de configuratie."
},
"apply": {
"fields": {
"lights": {
"description": "Een lamp (of een lijst van lampen) waarop de instellingen worden toegepast."
},
"transition": {
"description": "Duur van de overgang in seconden, als lampen aanpassen. 🕑"
},
"entity_id": {
"description": "De `entity_id` van de schakelaar met de toe te passen instellingen. 📝"
},
"adapt_brightness": {
"description": "Of de helderheid van het licht moet worden aangepast. 🌞"
},
"turn_on_lights": {
"description": "Of de lampen moeten worden aangezet die momenteel uit zijn.🔆"
},
"adapt_color": {
"description": "Aanpassen aan de kleur van de omringende verlichting. 🌈"
},
"prefer_rgb_color": {
"description": "Geef de voorkeur aan RGB kleuren boven de kleurtemperatuur van de lamp wanneer mogelijk. 🌈"
}
},
"description": "Past de huidige Adaptieve verlichting instellingen toe op de lampen."
},
"set_manual_control": {
"fields": {
"lights": {
"description": "entiteit_id(s) van de lamp(en), indien niets wordt gespecificeerd, worden alle lampen in de schakelaar geselecteerd. 💡"
},
"manual_control": {
"description": "Of de lamp moet worden toegevoegd (`\"true\"`) of verwijderd (`\"false\"`) van de `manual_control` lijst. 🔒"
},
"entity_id": {
"description": "De `entity_id` van de schakelaar waarvan het licht moet worden (on)gemarkeerd als `manually controlled`. 📝"
}
},
"description": "Geef aan of een lamp 'manually controlled' is."
}
} }
} }

View file

@ -3,8 +3,8 @@
"config": { "config": {
"step": { "step": {
"user": { "user": {
"title": "Wybierz nazwę grupy dla Adaptacyjnego oświetlenia", "title": "Wybierz nazwę dla tej instancji Adaptacyjnego oświetlenia",
"description": "Wybierz nazwę dla grupy. Możesz użyć wiele grup Adaptacyjnego oświetlenia, każda może mieć dowolną konfigurację świateł!", "description": "Każda instancja może zawierać wiele świateł.",
"data": { "data": {
"name": "Nazwa" "name": "Nazwa"
} }
@ -17,35 +17,207 @@
"options": { "options": {
"step": { "step": {
"init": { "init": {
"title": "Adaptacyjne oświetlenie opcje", "title": "Opcje adaptacyjnego oświetlenia",
"description": "Wszystkie ustawienia dla Adaptacyjnego oświetlenia. Nazwy opcji odpowiadają ustawieniom YAML. Żadne opcje nie są wyświetlane, jeśli masz wpis adaptive_lighting zdefiniowany w konfiguracji YAML.", "description": "Konfiguracja komponentu Adaptacyjnego oświetlenia. Nazwy opcji odpowiadają ustawieniom YAML. Żadne opcje nie są wyświetlane, jeśli są zdefiniowane w konfiguracji YAML. Aby zobaczyć interaktywne wykresy demonstrujące działanie parametrów odwiedź [tą aplikację webową]({webapp_url}). Aby zobaczyć więcej szczegółów odwiedź [oficjalną dokumentację]({docs_url}).",
"data": { "data": {
"lights": "światła", "lights": "lights: Lista `entity_id`, które mają być kontrolowane (może być pusta). 🌟",
"initial_transition": "initial_transition: When lights turn 'off' to 'on'. (sekund)",
"sleep_transition": "sleep_transition: When 'sleep_state' changes. (sekund)",
"interval": "interval: Time between switch updates. (sekund)", "interval": "interval: Time between switch updates. (sekund)",
"max_brightness": "max_brightness: Highest brightness of lights during a cycle. (%)", "transition": "Transition time when applying a change to the lights (sekund)",
"max_color_temp": "max_color_temp: Coldest hue of the color temperature cycle. (Kelvin)", "min_brightness": "min_brightness: Minimalna jasność (w procentach). 💡",
"min_brightness": "min_brightness: Lowest brightness of lights during a cycle. (%)", "max_brightness": "max_brightness: Maksymalna jasność (w procentach). 💡",
"min_color_temp": "min_color_temp, Warmest hue of the color temperature cycle. (Kelvin)", "min_color_temp": "min_color_temp: Najcieplejsza temperatura barwowa (w Kelwinach). 🔥",
"only_once": "only_once: Only adapt the lights when turning them on.", "max_color_temp": "max_color_temp: Najzimniejsza temperatura barwowa (w Kelwinach). ❄️",
"prefer_rgb_color": "prefer_rgb_color: Use 'rgb_color' rather than 'color_temp' when possible.",
"separate_turn_on_commands": "separate_turn_on_commands: Separate the commands for each attribute (color, brightness, etc.) in 'light.turn_on' (required for some lights).",
"sleep_brightness": "sleep_brightness, Brightness setting for Sleep Mode. (%)", "sleep_brightness": "sleep_brightness, Brightness setting for Sleep Mode. (%)",
"sleep_color_temp": "sleep_color_temp: Color temperature setting for Sleep Mode. (Kelvin)", "sleep_color_temp": "sleep_color_temp: Color temperature setting for Sleep Mode. (Kelvin)"
"sunrise_offset": "sunrise_offset: How long before(-) or after(+) to define the sunrise point of the cycle (+/- sekund)", },
"sunrise_time": "sunrise_time: Manual override of the sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "data_description": {
"sunset_offset": "sunset_offset: How long before(-) or after(+) to define the sunset point of the cycle (+/- sekund)", "interval": "Częstotliwość adaptacji świateł w sekundach. 🔄",
"sunset_time": "sunset_time: Manual override of the sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)", "transition": "Długość przejścia do nowego stanu (w sekundach). 🕑",
"take_over_control": "take_over_control: If anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on.", "sleep_brightness": "Jasność świateł w trybie spania (w procentach). 😴",
"detect_non_ha_changes": "detect_non_ha_changes: detects all >10% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)", "sleep_color_temp": "Temperatura barwowa w trybie spania (używane gdy `sleep_rgb_or_color_temp` jest `color_temp`) (w Kelwinach). 😴"
"transition": "Transition time when applying a change to the lights (sekund)" },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: When lights turn 'off' to 'on'. (sekund)",
"prefer_rgb_color": "prefer_rgb_color: Czy w miarę możliwości preferować regulację kolorów RGB zamiast regulacji temperatury barwowej światła. 🌈",
"sleep_transition": "sleep_transition: When 'sleep_state' changes. (sekund)",
"transition_until_sleep": "transition_until_sleep: Gdy włączone, Adaptacyjne oświetlenie będzie traktowało ustawienia spania jako minimalne i przejdzie do nich po zachodzie słońca. 🌙",
"sunrise_time": "sunrise_time: Manual override of the sunrise time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: How long before(-) or after(+) to define the sunrise point of the cycle (+/- sekund)",
"sunset_time": "sunset_time: Manual override of the sunset time, if 'None', it uses the actual sunset time at your location (HH:MM:SS)",
"sunset_offset": "sunset_offset: How long before(-) or after(+) to define the sunset point of the cycle (+/- sekund)",
"take_over_control": "take_over_control: Wyłącz adaptowanie oświetlenia, kiedy inna usługa wywoła `light.turn_on`, gdy oświetlenie jest już włączone. Zauważ, że to wywołuje `homeassistant.update_entity` co`interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Wykrywa i zatrzymuje adaptacje oświetlenia przy zmianach nie pochodzących od `light.turn_on`. Wymaga aktywnego `take_over_control`. 🕵️ Uwaga: ⚠️ Niektóre światła mogą błędnie wskazywać stan \"on\", co może powodować nieoczekiwane włączanie się świateł. Wyłącz to ustawienie, jeżeli doświadczasz takich objawów.",
"only_once": "only_once: Adaptuj światło tylko podczas włączenia (`true`) lub adaptuj cały czas (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Gdy włączone (`true`) to adaptacyjne oświetlenie zastosuje adaptacje tylko jeżeli `light.turn_on` jest wywołane bez konkretnego koloru lub jasności. ❌🌈 To ustawienie zapobiega między innymi adaptacji, gdy aktywowana jest scena. Gdy wyłączone (`false`), adaptacyjne oświetlenie zastosuje adaptacje niezależnie czy `service_data` zawiera kolor lub jasność. Potrzebuje włączonej opcji `take_over_control`. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Używaj oddzielnych wywołań `light.turn_on` dla koloru i jasności, wymagane dla niektórych typów świateł. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Pomiń wysyłanie polecenia adaptacji, jeżeli stan światła jest taki sam jak docelowy stan adaptacji. Minimalizuje to ruch sieciowy oraz w niektórych przypadkach poprawia szybkość działania. 📉 Wyłącz, jeżeli faktyczny stan światła się nie pokrywa z tym który widnieje w Home Assistant.",
"intercept": "intercept: Przechwyć i zaadaptuj wywołanie `light.turn_on`, aby błyskawicznie dostosować kolor i jasność. 🏎️ Wyłącz dla świateł, które nie akceptują wywołania `light.turn_on` zawierającego kolor i jasność.",
"multi_light_intercept": "multi_light_intercept: Przechwyć i zaadaptuj wywołanie `light.turn_on`, które dotyczą wielu świateł. ➗⚠️ Może to powodować rozdzielenie pojedynczego wywołania `light.turn_on` na wiele wywołań, na przykład gdy światła są przypisane do rożnych instancji. Wymaga włączonej opcji `intercept`.",
"include_config_in_attributes": "include_config_in_attributes: Gdy włączone (`true`) pokaż ustawienia jako atrybuty w encji przełącznika w Home Assistant. 📝"
},
"data_description": {
"initial_transition": "Długość pierwszego przejścia, gdy światło zostanie przełączone z `off` na `on` (w sekundach). ⏲️",
"sleep_rgb_or_color_temp": "Użyj `\"rgb_color\"` albo `\"color_temp\"` w trybie spania. 🌙",
"sleep_rgb_color": "Kolor RGB w trybie spania (używane, gdy `sleep_rgb_or_color_temp` jest `rgb_color`). 🌈",
"sleep_transition": "Długość przejścia, gdy nastąpi włączenie/wyłączenie \"trybu spania\" (w sekundach). 😴",
"sunrise_time": "Ustaw stały czas wschodu słońca (HH:MM:SS). 🌅",
"min_sunrise_time": "Ustaw czas najwcześniejszego wirtualnego wschodu słońca (HH:MM:SS), pozwala na opóźnienie wschodu słońca. 🌅",
"max_sunrise_time": "Ustaw czas najpóźniejszego wirtualnego wschodu słońca (HH:MM:SS), pozwala na przyspieszenie wschodu słońca. 🌅",
"sunrise_offset": "Dostosuj czas wschodu słońca - przesunięcie o +/- sekund. ⏰",
"sunset_time": "Ustaw stały czas zachodu słońca (HH:MM:SS). 🌇",
"min_sunset_time": "Ustaw czas najwcześniejszego wirtualnego zachodu słońca (HH:MM:SS), pozwala na opóźnienie zachodu słońca. 🌇",
"max_sunset_time": "Ustaw czas najpóźniejszego wirtualnego zachodu słońca (HH:MM:SS), pozwala na przyspieszenie zachodu słońca. 🌇",
"sunset_offset": "Dostosuj czas zachodu słońca - przesunięcie o +/- sekund. ⏰",
"brightness_mode": "Tryb ustawiania jasności. Dostępne opcje to `default`, `linear` i `tanh` (używa `brightness_mode_time_dark` i `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Pomijany, gdy `brightness_mode='default'`). Czas w sekundach, kiedy jasność będzie zwiększana przed wschodem słońca/zmniejszana po zachodzie słońca. 📈📉",
"brightness_mode_time_light": "(Pomijany, gdy `brightness_mode='default'`). Czas w sekundach, kiedy jasność będzie zwiększana po wschodzie słońca/zmniejszana przed zachodem słońca. 📈📉",
"autoreset_control_seconds": "Czas, po którym manualna kontrola zostanie wyłączona (w sekundach). Ustaw 0, aby wyłączyć. ⏲️",
"send_split_delay": "Opóźnienie (w ms) pomiędzy `separate_turn_on_commands` dla świateł, które nie akceptują jednoczesnego ustawiania jasności i koloru. ⏲️",
"adapt_delay": "Czas (w sekundach) pomiędzy włączeniem światła, a rozpoczęciem adaptowania przez Adaptacyjne oświetlenie. Może pomóc zredukować migotanie. ⏲️"
}
}
} }
} }
}, },
"error": { "error": {
"option_error": "Błędne opcje", "option_error": "Błędna opcja",
"entity_missing": "Nie znaleziono wybranego światła" "entity_missing": "Jednego lub więcej wybranych świateł nie można znaleźć w Home Assistant"
}
},
"services": {
"apply": {
"description": "Stosuje bieżące ustawienia Adaptacyjnego oświetlenia do świateł.",
"fields": {
"entity_id": {
"description": "`entity_id` przełącznika, którego ustawienia mają być zastosowane. 📝"
},
"lights": {
"description": "Światło (albo lista świateł), do których mają być zastosowane ustawienia. 💡"
},
"transition": {
"description": "Długość przejścia do nowego stanu (w sekundach). 🕑"
},
"adapt_color": {
"description": "Czy adaptować kolor światła. 🌈"
},
"adapt_brightness": {
"description": "Czy adaptować jasność światła. 🌞"
},
"prefer_rgb_color": {
"description": "Czy w miarę możliwości preferować regulację kolorów RGB zamiast temperatury barwowej światła. 🌈"
},
"turn_on_lights": {
"description": "Czy włączyć światła, które są aktualnie wyłączone? 🔆"
}
}
},
"set_manual_control": {
"description": "Zaznacza czy światło jest \"ręcznie sterowane\".",
"fields": {
"entity_id": {
"description": "`entity_id` encji przełącznika, w której należy zaznaczyć/odznaczyć flagę `ręczne sterowanie`. 📝"
},
"lights": {
"description": "`entity_id` świateł, dla których należy odznaczyć flagę `ręczne sterowanie`. 💡Gdy lista będzie pusta wszystkie światła będą brane pod uwagę."
},
"manual_control": {
"description": "Czy dodać (\"true\"), czy usunąć (\"false\") światło z listy \"ręczne sterowanie\". 🔒"
}
}
},
"change_switch_settings": {
"description": "Zmienia dowolny parametr w przełączniku. Wszystkie opcje są takie same jak w konfiguracji.",
"fields": {
"entity_id": {
"description": "ID encji przełącznika. 📝"
},
"use_defaults": {
"description": "Jak mają się zmienić ustawienia, które nie są wyszczególnione w tym wywołaniu. Opcje: \"current\" (domyślne, pozostawia obecne ustawienia), \"factory\" (przywraca ustawienia z dokumentacji), albo \"configuration\" (przywraca wartości z konfiguracji przełącznika). ⚙️"
},
"include_config_in_attributes": {
"description": "Gdy włączone (`true`) pokaż ustawienia jako atrybuty w encji przełącznika w Home Assistant."
},
"sleep_transition": {
"description": "Długość przejścia, gdy nastąpi włączenie/wyłączenie \"trybu spania\" (w sekundach). 😴"
},
"max_brightness": {
"description": "Maksymalna jasność (w procentach). 💡"
},
"turn_on_lights": {
"description": "Czy włączyć światła, które są aktualnie wyłączone? 🔆"
},
"initial_transition": {
"description": "Długość pierwszego przejścia, gdy światło zostanie przełączone z `off` na `on` (w sekundach). ⏲️"
},
"min_sunset_time": {
"description": "Ustaw czas najwcześniejszego wirtualnego zachodu słońca (HH:MM:SS), pozwala na opóźnienie zachodu słońca. 🌇"
},
"take_over_control": {
"description": "Wyłącz adaptowanie oświetlenia, kiedy inna usługa wywoła `light.turn_on`, gdy oświetlenie jest już włączone. Zauważ, że to wywołuje `homeassistant.update_entity` co `interval`! 🔒"
},
"transition": {
"description": "Długość przejścia do nowego stanu (w sekundach). 🕑"
},
"autoreset_control_seconds": {
"description": "Czas, po którym manualna kontrola zostanie wyłączona (w sekundach). Ustaw 0 aby wyłączyć. ⏲️"
},
"adapt_delay": {
"description": "Czas (w sekundach) pomiędzy włączeniem światła, a rozpoczęciem adaptowania przez Adaptacyjne oświetlenie. Może pomóc zredukować migotanie. ⏲️"
},
"max_color_temp": {
"description": "Najzimniejsza temperatura barwowa (w Kelwinach). ❄️"
},
"min_brightness": {
"description": "Minimalna jasność (w procentach). 💡"
},
"min_color_temp": {
"description": "Najcieplejsza temperatura barwowa (w Kelwinach). 🔥"
},
"only_once": {
"description": "Adaptuj światło tylko podczas włączania (`true`) lub adaptuj cały czas (`false`). 🔄"
},
"prefer_rgb_color": {
"description": "Czy w miarę możliwości preferować regulację kolorów RGB zamiast temperatury barwowej światła. 🌈"
},
"separate_turn_on_commands": {
"description": "Używaj oddzielnych wywołań `light.turn_on` dla koloru i jasności, wymagane dla niektórych typów świateł. 🔀"
},
"send_split_delay": {
"description": "Opóźnienie (w ms) pomiędzy `separate_turn_on_commands` dla świateł, które nie akceptują jednoczesnego ustawiania jasności i koloru. ⏲️"
},
"sleep_brightness": {
"description": "Jasność świateł w trybie spania (w procentach). 😴"
},
"sleep_rgb_or_color_temp": {
"description": "Użyj `\"rgb_color\"` albo `\"color_temp\"` w trybie spania. 🌙"
},
"sleep_rgb_color": {
"description": "Kolor RGB w trybie spania (używane, gdy `sleep_rgb_or_color_temp` jest `rgb_color`). 🌈"
},
"sleep_color_temp": {
"description": "Temperatura barwowa w trybie spania (używane gdy `sleep_rgb_or_color_temp` jest `color_temp`) (w Kelwinach). 😴"
},
"sunrise_offset": {
"description": "Dostosuj czas wschodu słońca - przesunięcie o +/- sekund. ⏰"
},
"sunrise_time": {
"description": "Ustaw stały czas wschodu słońca (HH:MM:SS). 🌅"
},
"sunset_offset": {
"description": "Dostosuj czas zachodu słońca - przesunięcie o +/- sekund. ⏰"
},
"sunset_time": {
"description": "Ustaw stały czas zachodu słońca (HH:MM:SS). 🌇"
},
"max_sunrise_time": {
"description": "Ustaw czas najpóźniejszego wirtualnego wschodu słońca (HH:MM:SS), pozwala na przyspieszenie wschodu słońca. 🌅"
},
"detect_non_ha_changes": {
"description": "Wykrywa i zatrzymuje adaptacje oświetlenia przy zmianach nie pochodzących od `light.turn_on`. Wymaga aktywnego `take_over_control`. 🕵️ Uwaga: ⚠️ Niektóre światła mogą błędnie wskazywać stan \"on\", co może powodować nieoczekiwane włączanie się świateł. Wyłącz to ustawienie, jeżeli doświadczasz takich objawów."
}
}
} }
} }
} }

View file

@ -8,6 +8,13 @@
"data": { "data": {
"name": "Nome" "name": "Nome"
} }
},
"menu": {
"data": {
"action": "Ação"
},
"description": "Você deseja criar uma nova instância ou duplicar uma já existente?",
"title": "Criar ou Duplicar"
} }
}, },
"abort": { "abort": {
@ -21,25 +28,58 @@
"description": "Todas as configurações de um componente de iluminação adaptativa. Os nomes das opções correspondem às configurações de YAML. Nenhuma opção será exibida se você tiver a entrada adaptive_lighting definida em sua configuração YAML.", "description": "Todas as configurações de um componente de iluminação adaptativa. Os nomes das opções correspondem às configurações de YAML. Nenhuma opção será exibida se você tiver a entrada adaptive_lighting definida em sua configuração YAML.",
"data": { "data": {
"lights": "luzes", "lights": "luzes",
"initial_transition": "initial_transition: Quando as luzes mudam de 'off' para 'on'. (segundos)",
"sleep_transition": "sleep_transition: Quando 'sleep_state' muda. (segundos)",
"interval": "interval: Tempo entre as atualizações do switch. (segundos)", "interval": "interval: Tempo entre as atualizações do switch. (segundos)",
"max_brightness": "max_brightness: Maior brilho das luzes durante um ciclo. (%)", "transition": "Tempo de transição ao aplicar uma mudança nas luzes (segundos)",
"max_color_temp": "max_color_temp: Matiz mais frio do ciclo de temperatura de cor. (Kelvin)",
"min_brightness": "min_brightness: Menor brilho das luzes durante um ciclo. (%)", "min_brightness": "min_brightness: Menor brilho das luzes durante um ciclo. (%)",
"max_brightness": "max_brightness: Maior brilho das luzes durante um ciclo. (%)",
"min_color_temp": "min_color_temp, matiz mais quente do ciclo de temperatura de cor. (Kelvin)", "min_color_temp": "min_color_temp, matiz mais quente do ciclo de temperatura de cor. (Kelvin)",
"only_once": "only_once: Apenas adapte as luzes ao ligá-las.", "max_color_temp": "max_color_temp: Matiz mais frio do ciclo de temperatura de cor. (Kelvin)",
"prefer_rgb_color": "prefer_rgb_color: Use 'rgb_color' em vez de 'color_temp' quando possível.",
"separate_turn_on_commands": "separar_turn_on_commands: Separe os comandos para cada atributo (cor, brilho, etc.) em 'light.turn_on' (necessário para algumas luzes).",
"sleep_brightness": "sleep_brightness, configuração de brilho para o modo de suspensão. (%)", "sleep_brightness": "sleep_brightness, configuração de brilho para o modo de suspensão. (%)",
"sleep_color_temp": "sleep_color_temp: configuração de temperatura de cor para o modo de suspensão. (Kelvin)", "sleep_color_temp": "sleep_color_temp: configuração de temperatura de cor para o modo de suspensão. (Kelvin)"
"sunrise_offset": "sunrise_offset: Quanto tempo antes (-) ou depois (+) para definir o ponto do nascer do sol do ciclo (+/- segundos)", },
"sunrise_time": "sunrise_time: substituição manual do horário do nascer do sol, se 'Nenhum', ele usa o horário real do nascer do sol em sua localização (HH:MM:SS)", "data_description": {
"sunset_offset": "Sunset_offset: Quanto tempo antes (-) ou depois (+) para definir o ponto de pôr do sol do ciclo (+/- segundos)", "interval": "Frequência, em segundos, para adaptar as luzes. 🔄",
"sunset_time": "sunset_time: substituição manual do horário do pôr do sol, se 'Nenhum', ele usa o horário real do nascer do sol em sua localização (HH:MM:SS)", "transition": "Duração da transição, em segundos, quando as luzes mudam. 🕑",
"take_over_control": "take_over_control: Se qualquer coisa, exceto Adaptive Lighting, chamar 'light.turn_on' quando uma luz já estiver acesa, pare de adaptar essa luz até que ela (ou o interruptor) desligue -> ligue.", "sleep_brightness": "Porcentagem do brilho das luzes no modo dormir. 😴",
"detect_non_ha_changes": "detect_non_ha_changes: detecta todas as alterações > 10% feitas nas luzes (também fora do HA), requer que 'take_over_control' seja ativado (chama 'homeassistant.update_entity' a cada 'intervalo'!)", "sleep_color_temp": "Temperatura de Cor no modo dormir (usado quando `sleep_rgb_or_color_temp` é `color_temp`) em Kelvin. 😴"
"transition": "Tempo de transição ao aplicar uma mudança nas luzes (segundos)" },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Quando as luzes mudam de 'off' para 'on'. (segundos)",
"prefer_rgb_color": "prefer_rgb_color: Use 'rgb_color' em vez de 'color_temp' quando possível.",
"sleep_transition": "sleep_transition: Quando 'sleep_state' muda. (segundos)",
"transition_until_sleep": "transition_until_sleep: Quando ativada, a Iluminação Adaptativa considerará as configurações de sono como o valor mínimo, transicionando para esses valores após o pôr do sol. 🌙",
"sunrise_time": "sunrise_time: substituição manual do horário do nascer do sol, se 'Nenhum', ele usa o horário real do nascer do sol em sua localização (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: Quanto tempo antes (-) ou depois (+) para definir o ponto do nascer do sol do ciclo (+/- segundos)",
"sunset_time": "sunset_time: substituição manual do horário do pôr do sol, se 'Nenhum', ele usa o horário real do nascer do sol em sua localização (HH:MM:SS)",
"sunset_offset": "Sunset_offset: Quanto tempo antes (-) ou depois (+) para definir o ponto de pôr do sol do ciclo (+/- segundos)",
"take_over_control": "take_over_control: Se qualquer coisa, exceto Adaptive Lighting, chamar 'light.turn_on' quando uma luz já estiver acesa, pare de adaptar essa luz até que ela (ou o interruptor) desligue -> ligue.",
"detect_non_ha_changes": "detect_non_ha_changes: detecta todas as alterações > 10% feitas nas luzes (também fora do HA), requer que 'take_over_control' seja ativado (chama 'homeassistant.update_entity' a cada 'intervalo'!)",
"only_once": "only_once: Apenas adapte as luzes ao ligá-las.",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Ao ligar as luzes inicialmente. Se definido como `true`, a Iluminação Adaptativa se adapta somente se o comando `light.turn_on` for chamado sem especificar cor ou brilho. ❌🌈 Isso, por exemplo, impede a adaptação ao ativar uma cena. Se false, a Iluminação Adaptativa se adapta independentemente da presença de cor ou brilho nos dados iniciais do `service_data`. Precisa de `take_over_control` ativado. 🕵️",
"separate_turn_on_commands": "separar_turn_on_commands: Separe os comandos para cada atributo (cor, brilho, etc.) em 'light.turn_on' (necessário para algumas luzes).",
"skip_redundant_commands": "skip_redundant_commands: Deixar de enviar comandos de adaptação cujo estado alvo já seja igual ao estado atual da luz. Minimiza o tráfego de rede e melhora a responsividade da adaptação em algumas situações. 📉Desative se os estados físicos das luzes podem ficar diferentes do estado registrado no HA.",
"intercept": "intercept: Interceptar e adaptar os chamados `light.turn_on` para ativar a adaptação instantânea de cor e brilho. 🏎️ Desative para luzes que não suportam `light.turn_on` com cor e brilho.",
"multi_light_intercept": "multi_light_intercept: Interceptar e adaptar chamadas de 'light.turn_on' que visem múltiplas luzes. ➗⚠️ Isso pode resultar na divisão de uma única chamada de 'light.turn_on' em múltiplas chamadas, por exemplo, quando as luzes estão em interruptores diferentes. Exige que 'intercept' esteja ativado.",
"include_config_in_attributes": "include_config_in_attributes: Mostra todas as opções como atributos no interruptor do Home Assistant quando está definido para `true`. 📝"
},
"data_description": {
"initial_transition": "Duração da primeira transição, em segundos, quando as luzes alternarem de 'desligado' para 'ligado'. ⏲️",
"sleep_rgb_or_color_temp": "Use `\"rgb_color\"` ou `\"color_temp\"` no modo dormir. 🌙",
"sleep_transition": "Duração da transição em segundos quando o modo dormir é alterado. 😴",
"sunrise_time": "Define um horário fixo (HH:MM:SS) para o nascer do sol. 🌅",
"min_sunrise_time": "Defina o horário virtual mais cedo do nascer do sol (HH:MM:SS), permitindo nasceres do sol mais tarde. 🌅",
"max_sunrise_time": "Defina o horário virtual mais recente do nascer do sol (HH:MM:SS), permitindo nasceres do sol mais cedo. 🌅",
"sunrise_offset": "Ajusta o horário do nascer do sol com um deslocamento positivo ou negativo em segundos. ⏰",
"sunset_time": "Definir um horário fixo (HH:MM:SS) para o pôr do sol. 🌇",
"min_sunset_time": "Defina o horário virtual mais cedo do pôr do sol (HH:MM:SS), permitindo pores do sol mais tarde. 🌇",
"max_sunset_time": "Defina o horário virtual mais recente do pôr do sol (HH:MM:SS), permitindo pores do sol mais cedo. 🌇",
"sunset_offset": "Ajusta o horário do pôr do sol com um deslocamento positivo ou negativo em segundos. ⏰",
"autoreset_control_seconds": "Redefine automaticamente o controle manual após um período de tempo definido em segundos. Defina 0 para desabilitar. ⏲️",
"adapt_delay": "Tempo de espera (segundos) entre a luz ligar e a aplicação das mudanças da iluminação adaptativa. Pode ajudar a evitar que a luz pisque. ⏲️"
}
}
} }
} }
}, },
@ -47,5 +87,106 @@
"option_error": "Opção inválida", "option_error": "Opção inválida",
"entity_missing": "Uma luz selecionada não foi encontrada" "entity_missing": "Uma luz selecionada não foi encontrada"
} }
},
"services": {
"change_switch_settings": {
"fields": {
"sleep_transition": {
"description": "Duração da transição em segundos quando o \"modo dormir\" é alternado. 😴"
},
"entity_id": {
"description": "ID da entidade do switch. 📝"
},
"max_brightness": {
"description": "Porcentagem máxima do brilho. 💡"
},
"autoreset_control_seconds": {
"description": "Redefine automaticamente o controle manual após um período de tempo definido em segundos. Defina 0 para desabilitar. ⏲️"
},
"transition": {
"description": "Duração da transição, em segundos, quando as luzes mudam. 🕑"
},
"sleep_brightness": {
"description": "Porcentagem do brilho das luzes no modo dormir. 😴"
},
"turn_on_lights": {
"description": "Se deve ligar as luzes que estão atualmente desligadas. 🔆"
},
"initial_transition": {
"description": "Duração da primeira transição, em segundos, quando as luzes alternarem de 'desligado' para 'ligado'. ⏲️"
},
"sunset_offset": {
"description": "Ajusta o horário do pôr do sol com um deslocamento positivo ou negativo em segundos. ⏰"
},
"sunrise_offset": {
"description": "Ajusta o horário do nascer do sol com um deslocamento positivo ou negativo em segundos. ⏰"
},
"sunset_time": {
"description": "Definir um horário fixo (HH:MM:SS) para o pôr do sol. 🌇"
},
"max_color_temp": {
"description": "Temperatura de cor mais fria em Kelvin. ❄️"
},
"sleep_color_temp": {
"description": "Temperatura de Cor no modo dormir (usado quando `sleep_rgb_or_color_temp` é `color_temp`) em Kelvin. 😴"
},
"sunrise_time": {
"description": "Define um horário fixo (HH:MM:SS) para o nascer do sol. 🌅"
},
"include_config_in_attributes": {
"description": "Exibe todas as opções como atributos no interruptor no Home Assistant quando definido para `true`. 📝"
},
"sleep_rgb_or_color_temp": {
"description": "Use `\"rgb_color\"` ou `\"color_temp\"` no modo dormir. 🌙"
},
"adapt_delay": {
"description": "Tempo de espera (segundos) entre a luz ligar e a aplicação das mudanças da iluminação adaptativa. Pode ajudar a evitar que a luz pisque. ⏲️"
},
"separate_turn_on_commands": {
"description": "Usa chamada separada de `light.turn_on` para cor e brilho, necessário para alguns tipos de luz. 🔀"
},
"use_defaults": {
"description": "Define os valores padrão não especificados nessa chamada de serviço. Opções: \"current\" (padrão, mantém os valores atuais), \"factory\" (reinicia para os padrões documentados) ou \"configuration\" (retorna aos padrões de configuração do interruptor). ⚙️"
},
"max_sunrise_time": {
"description": "Defina o horário virtual mais recente do nascer do sol (HH:MM:SS), permitindo nasceres do sol mais cedo. 🌅"
},
"min_sunset_time": {
"description": "Defina o horário virtual mais cedo do pôr do sol (HH:MM:SS), permitindo pores do sol mais tarde. 🌇"
}
},
"description": "Altere quaisquer configurações que você quiser . Todas as opções aqui são as mesmas que no fluxo de configuração."
},
"apply": {
"fields": {
"turn_on_lights": {
"description": "Se deve ligar as luzes que estão atualmente desligadas. 🔆"
},
"lights": {
"description": "Uma luz (ou lista de luzes) para aplicar as configurações. 💡"
},
"transition": {
"description": "Duração da transição, em segundos, quando as luzes mudam. 🕑"
},
"entity_id": {
"description": "O 'entity_id' do interruptor com as configurações para aplicar. 📝"
},
"adapt_brightness": {
"description": "Se deve adaptar o brilho da luz. 🌞"
},
"adapt_color": {
"description": "Se deve adaptar a cor das luzes que suportam este recurso. 🌈"
}
},
"description": "Aplica as configurações atuais de iluminação adaptativa nas luzes."
},
"set_manual_control": {
"description": "Marque se uma luz é 'controlada manualmente'.",
"fields": {
"lights": {
"description": "entity_id(s) das luzes, se não especificadas, todas as luzes do interruptor são selecionadas. 💡"
}
}
}
} }
} }

View file

@ -0,0 +1,100 @@
{
"title": "Iluminação Adaptativa",
"services": {
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "Ajustar a hora do nascer do sol com um offset positivo ou negativo em segundos. ⏰"
},
"only_once": {
"description": "Adaptar as luzes apenas quando estas estão ligadas (`true`) ou continuar a adaptá-las (`false`)."
},
"sunset_offset": {
"description": "Ajustar a hora do pôr do sol com um offset positivo ou negativo em segundos. ⏰"
},
"turn_on_lights": {
"description": "Para ligar luzes que estão neste momento desligadas. 🔆"
},
"entity_id": {
"description": "ID Entidade do interruptor. 📝"
},
"sleep_transition": {
"description": "Duração da transição quando o \"modo dormir\" é alternado em segundos. 😴"
},
"autoreset_control_seconds": {
"description": "Reiniciar o controlo manual automaticamente após um número de segundos. Definir 0 para desativar. ⏲️"
},
"transition": {
"description": "Duração da transição quando as luzes mudam, em segundos. 🕑"
},
"max_color_temp": {
"description": "Cor mais fria em Kelvin. ❄️"
},
"sleep_brightness": {
"description": "Porcentagem do brilho da lâmpadas no modo \"sleep mode\"."
}
},
"description": "Muda alguma configuração que você quiser no interruptor. Todas as opções aqui são as mesmas que estão no processo de configuração."
},
"apply": {
"description": "Aplica as definições atuais da Iluminação Adaptativa às luzes.",
"fields": {
"lights": {
"description": "Uma luz (ou lista de luzes) para a qual serão aplicadas as definições.💡"
},
"transition": {
"description": "Duração da transição quando as luzes mudam, em segundos. 🕑"
}
}
}
},
"config": {
"abort": {
"already_configured": "Este dispositivo já está configurado"
},
"step": {
"user": {
"description": "Cada instância pode conter múltiplas luzes!",
"title": "Escolha um nome para a instância de Iluminação Adaptativa"
}
}
},
"options": {
"step": {
"init": {
"data_description": {
"transition": "Duração da transição quando as luzes mudam, em segundos. 🕑",
"sleep_brightness": "Porcentagem do brilho da lâmpadas no modo \"sleep mode\"."
},
"title": "Opções da Iluminação Adaptativa",
"description": "Configure um componente da Iluminação Adaptativa. O nome das opções são as mesmas que as do YML. Se você já definiu essa configuração no YAML, nenhuma opção vai aparecer aqui. Para acessar um gráfico que demonstra o efeito dos parâmetros, acesse [esse app]({webapp_url}). Para mais detalhes, veja a [documentação oficial]({docs_url}).",
"data": {
"lights": "lights: Lista das entity_ids das luzes para serem controladas (pode ser vazia). 🌟",
"min_brightness": "min_brightness: Percentagem minima de brilho. 💡",
"max_brightness": "max_brightness: Percentagem máxima de brilho. 💡",
"min_color_temp": "min_color_temp: Cor mais quente em Kelvin. 🔥",
"max_color_temp": "max_color_temp: Cor mais fria em Kelvin. ❄️"
},
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Quando possível escolher ajuste em RGB em vez de temperatura da cor. 🌈",
"transition_until_sleep": "transition_until_sleep: Quando ativado, Adaptive Lighting usará as definições do modo noturno como os mínimos, passando para esses valores no por do sol. 🌙",
"take_over_control": "take_over_control: Desativa Adaptive Lighting se alguma fonte chamar`light.turn_on` enquanto as luzes estiverem ligadas e a serem controladas. Tomar nota que esta opção chama o serviço `homeassistant.update_entity` a cada `interval`! 🔒"
},
"data_description": {
"sleep_transition": "Duração da transição quando o \"modo dormir\" é alternado em segundos. 😴",
"sunrise_offset": "Ajustar a hora do nascer do sol com um offset positivo ou negativo em segundos. ⏰",
"sunset_offset": "Ajustar a hora do pôr do sol com um offset positivo ou negativo em segundos. ⏰",
"brightness_mode": "Brilho que irá ser usado. Possíveis valores são `default`, `linear` e `tanh`(usa `brightness_mode_time_dark` e `brightness_mode_time_light`). 📈",
"autoreset_control_seconds": "Reiniciar o controlo manual automaticamente após um número de segundos. Definir 0 para desativar. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Opção inválida"
}
}
}

View file

@ -0,0 +1,83 @@
{
"config": {
"step": {
"user": {
"description": "Fiecare instanţă poate conţine mai multe lumini!",
"title": "Alege un nume pentru instanța de Iluminare Adaptivă"
}
},
"abort": {
"already_configured": "Acest dispozitiv este deja configurat"
}
},
"options": {
"step": {
"init": {
"data_description": {
"interval": "Frecvenţa adaptării luminilor, în secunde.",
"sleep_brightness": "Procentul luminozităţii luminilor în modul 'somn'."
},
"title": "Opţiuni Iluminare Adaptivă",
"data": {},
"sections": {
"advanced": {
"data": {
"adapt_only_on_bare_turn_on": "adaptează_doar_la_comanda_de_arpindere: La aprinderea iniţială a luminilor. Dacă este activat, IA va adapta luminile doar dacă se invocă 'light.turn_on' fără a specifica culoarea sau luminozitatea. Aceasta, de exemplu, previne adaptarea atunci când se activează o scenă. Dacă este dezactivat,IA va adaptata luminile indiferent de prezența valorilor culorii sau luminozității în service_data. Necesită activarea opţiunii 'preia_controlul. "
},
"data_description": {
"sunrise_offset": "Ajustați ora răsăritului cu un decalaj pozitiv sau negativ în secunde.⏰",
"sunset_offset": "Ajustați ora răsăritului cu un decalaj pozitiv sau negativ în secunde.",
"brightness_mode": "Mod de luminozitate de utilizat. Valorile posibile sunt: 'implicit', 'liniar' şi 'hiperbolic' ( ultilizează 'mod_luminozitate_timp_de_noapte' şi 'mod_luminozitate_timp_de_zi').",
"brightness_mode_time_light": "(Se ignoră dacă `modul_de_luminozitate='implicit'`) Durată în secunde a modificării luminozităţii în sus/jos cand poziţia sorelui este înainte sau după răsărit/apus.",
"autoreset_control_seconds": "Resetare automată al controlului manual după un număr de secunde. Setaţi la 0 pentru a dezactiva."
}
}
}
}
}
},
"title": "Iluminare Adaptivă",
"services": {
"apply": {
"description": "Aplicaţi luminilor setările curente ale Iluminiării Adaptive luminilor.",
"fields": {
"lights": {
"description": "O lumină (sau listă de lumini) pentru care să se aplice setările."
}
}
},
"change_switch_settings": {
"fields": {
"entity_id": {
"description": "Numele entităţii."
},
"sleep_brightness": {
"description": "Procentul luminozităţii luminilor în modul 'somn'."
},
"sleep_transition": {
"description": "Durata de tranziție (în secunde) atunci când modul de „somn” este activat."
},
"autoreset_control_seconds": {
"description": "Resetare automată al controlului manual după un număr de secunde. Setaţi la 0 pentru a dezactiva."
},
"only_once": {
"description": "Adaptează luminile doar la pornire ('activat') sau adaptează continuu ('dezactivat')."
},
"sunrise_offset": {
"description": "Ajustați ora răsăritului cu un decalaj pozitiv sau negativ în secunde.⏰"
},
"sunset_offset": {
"description": "Ajustați ora apusului cu un decalaj pozitiv sau negativ în secunde."
}
},
"description": "Schimbați orice setări dorită în comutator. Toate opțiunile de aici sunt la fel ca în fluxul de configurare."
},
"set_manual_control": {
"fields": {
"lights": {
"description": "Numele luminii (luminilor) , dacă nu sunt specificate, sunt selectate toate luminile ce aparţin de comutator."
}
}
}
}
}

View file

@ -20,27 +20,74 @@
"title": "Настройки Adaptive Lighting", "title": "Настройки Adaptive Lighting",
"description": "Все настройки компонента Adaptive Lighting. Названия опций соответствуют настройкам в YAML. Параметры не отображаются, если в конфигурации YAML определена запись adaptive_lighting.", "description": "Все настройки компонента Adaptive Lighting. Названия опций соответствуют настройкам в YAML. Параметры не отображаются, если в конфигурации YAML определена запись adaptive_lighting.",
"data": { "data": {
"lights": "Осветительные приборы", "lights": "Осветительные приборы: список источников света, которыми нужно управлять (может быть пустым). 🌟",
"initial_transition": "initial_transition: Начальный переход, когда свет переключается с 'off' на 'on'. (секунды)",
"sleep_transition": "sleep_transition: Когда прибор переходит в Режима Сна (Sleep Mode) и 'sleep_state' изменяется. (секунды)",
"interval": "interval: Интервал между обновлениями переключателя. (секунды)", "interval": "interval: Интервал между обновлениями переключателя. (секунды)",
"max_brightness": "max_brightness: Максимальная яркость света во время цикла. (%)",
"max_color_temp": "max_color_temp: Самый холодный оттенок цветовой температуры во время цикла. (Kelvin)",
"min_brightness": "min_brightness: Минимальная яркость света во время цикла. (%)",
"min_color_temp": "min_color_temp: Самый теплый оттенок цветовой температуры во время цикла. (Kelvin)",
"only_once": "only_once: Адаптировать свет только при включении.",
"prefer_rgb_color": "prefer_rgb_color: По возможности использовать 'rgb_color' вместо 'color_temp'.",
"separate_turn_on_commands": "separate_turn_on_commands: Раздельные команды для каждого атрибута (цвет, яркость и т.д.) в 'light.turn_on' (требуется для некоторых источников света).",
"sleep_brightness": "sleep_brightness: Настройка яркости для Режима Сна (Sleep Mode). (%)",
"sleep_color_temp": "sleep_color_temp: Настройка цветовой температуры для Режима Сна (Sleep Mode). (Kelvin)",
"sunrise_offset": "sunrise_offset: За сколько времени до (-) или после (+) переопределить время восхода во время цикла. (+/- секунды)",
"sunrise_time": "sunrise_time: Ручное изменение времени восхода солнца, если указано 'None', используется фактическое время восхода в Вашем местоположении. (ЧЧ:ММ:СС)",
"sunset_offset": "sunset_offset: За сколько времени до (-) или после (+) переопределить время заката во время цикла. (+/- секунды)",
"sunset_time": "sunset_time: Ручное изменение времени заката солнца, если указано 'None', используется фактическое время заката в Вашем местоположении. (ЧЧ:ММ:СС)",
"take_over_control": "take_over_control: Если что-либо, кроме Adaptive Lighting, вызывает службу 'light.turn_on', когда свет уже включен, прекратить адаптацию этого осветительного прибора, пока он (или переключатель) не переключится off -> on.",
"detect_non_ha_changes": "detect_non_ha_changes: Обнаруживает все изменения на >10% примененные к освещению (также и из-за пределов Home Assistant), требует включения 'take_over_control' (вызывает 'homeassistant.update_entity' каждый 'interval'!)",
"transition": "Время перехода при применении изменения к источникам света. (секунды)", "transition": "Время перехода при применении изменения к источникам света. (секунды)",
"adapt_delay": "Время ожидания между включением света и применением адаптации. Может помочь избежать мерцания. (секунды)" "min_brightness": "min_brightness: Минимальная яркость света во время цикла. (%)",
"max_brightness": "max_brightness: Максимальная яркость света во время цикла. (%)",
"min_color_temp": "min_color_temp: Самый теплый оттенок цветовой температуры во время цикла. (Kelvin)",
"max_color_temp": "max_color_temp: Самый холодный оттенок цветовой температуры во время цикла. (Kelvin)",
"sleep_brightness": "sleep_brightness: Настройка яркости для Режима Сна (Sleep Mode). (%)",
"sleep_color_temp": "sleep_color_temp: Настройка цветовой температуры для Режима Сна (Sleep Mode). (Kelvin)"
},
"data_description": {
"interval": "Частота адаптации освещения в секундах. 🔄",
"transition": "Продолжительность перехода при смене освещения, в секундах. 🕑",
"sleep_brightness": "Процент яркости света в спящем режиме. 😴",
"sleep_color_temp": "Цветовая температура в спящем режиме (используется, когда параметр `sleep_rgb_or_color_temp` имеет значение `color_temp`) в Кельвинах. 😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Начальный переход, когда свет переключается с 'off' на 'on'. (секунды)",
"prefer_rgb_color": "prefer_rgb_color: По возможности использовать 'rgb_color' вместо 'color_temp'.",
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp: Использовать либо 'rgb_color', либо 'color_temp' в режиме сна. 🌙",
"sleep_rgb_color": "sleep_rgb_color: Цвет RGB в режиме сна (используется при 'sleep_rgb_or_color_temp' как 'rgb_color'). 🌈",
"sleep_transition": "sleep_transition: Когда прибор переходит в Режима Сна (Sleep Mode) и 'sleep_state' изменяется. (секунды)",
"transition_until_sleep": "transition_until_sleep: когда включено, адаптивное освещение будет рассматривать настройки сна как минимальные, переходя к этим значениям после захода солнца. 🌙",
"sunrise_time": "sunrise_time: Ручное изменение времени восхода солнца, если указано 'None', используется фактическое время восхода в Вашем местоположении. (ЧЧ:ММ:СС)",
"min_sunrise_time": "min_sunrise_time: Самое раннее время виртуального восхода (ЧЧ:ММ:СС). 🌅",
"max_sunrise_time": "max_sunrise_time: Самое позднее время виртуального восхода (ЧЧ:ММ:СС). 🌅",
"sunrise_offset": "sunrise_offset: За сколько времени до (-) или после (+) переопределить время восхода во время цикла. (+/- секунды)",
"sunset_time": "sunset_time: Ручное изменение времени заката солнца, если указано 'None', используется фактическое время заката в Вашем местоположении. (ЧЧ:ММ:СС)",
"min_sunset_time": "min_sunset_time: Самое раннее время виртуального заката (ЧЧ:ММ:СС). 🌇",
"max_sunset_time": "max_sunset_time: Самое позднее время виртуального заката (ЧЧ:ММ:СС). 🌇",
"sunset_offset": "sunset_offset: За сколько времени до (-) или после (+) переопределить время заката во время цикла. (+/- секунды)",
"brightness_mode": "brightness_mode: Режим яркости для использования (default, linear, tanh). 📈",
"take_over_control": "take_over_control: Если что-либо, кроме Adaptive Lighting, вызывает службу 'light.turn_on', когда свет уже включен, прекратить адаптацию этого осветительного прибора, пока он (или переключатель) не переключится off -> on.",
"detect_non_ha_changes": "detect_non_ha_changes: Обнаруживает все изменения на >10% примененные к освещению (также и из-за пределов Home Assistant), требует включения 'take_over_control' (вызывает 'homeassistant.update_entity' каждый 'interval'!)",
"autoreset_control_seconds": "autoreset_control_seconds: Автосброс ручного управления через X секунд. ⏲️",
"only_once": "only_once: Адаптировать свет только при включении.",
"adapt_only_on_bare_turn_on": "Adapt_only_on_bare_turn_on: При первоначальном включении света. Если установлено значение «true», AL адаптируется только в том случае, если «light.turn_on» вызывается без указания цвета или яркости. ❌🌈 Это, например, предотвращает адаптацию при активации сцены. Если false, AL адаптируется независимо от наличия цвета или яркости в исходных service_data. Требуется включить take_over_control. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Раздельные команды для каждого атрибута (цвет, яркость и т.д.) в 'light.turn_on' (требуется для некоторых источников света).",
"send_split_delay": "send_split_delay: Задержка между отдельными командами включения для источников света. ⏲️",
"adapt_delay": "Время ожидания между включением света и применением адаптации. Может помочь избежать мерцания. (секунды)",
"skip_redundant_commands": "Skip_redundant_commands: Пропустить отправку команд адаптации, целевое состояние которых уже равно известному состоянию источника света. Минимизирует сетевой трафик и улучшает скорость адаптации в некоторых ситуациях. 📉Отключите, если физические состояния освещения не синхронизируются с записанным состоянием HA.",
"intercept": "intercept: перехватывать и адаптировать вызовы `light.turn_on` для обеспечения мгновенной адаптации цвета и яркости. 🏎️ Отключите источники света, которые не поддерживают `light.turn_on` с цветом и яркостью.",
"multi_light_intercept": "multi_light_intercept: перехватывает и адаптирует вызовы `light.turn_on`, нацеленные на несколько источников света. ➗⚠️ Это может привести к разделению одного вызова `light.turn_on` на несколько вызовов, например, когда освещение включено в разные выключатели. Требуется, чтобы `перехват` был включен.",
"include_config_in_attributes": "include_config_in_attributes: отображать все параметры в качестве атрибутов на переключателе в Home Assistant, если установлено значение `true`. 📝"
},
"data_description": {
"initial_transition": "Продолжительность первого перехода, когда освещение переключается с `выключено` на `включено` в секундах. ⏲️",
"sleep_rgb_or_color_temp": "Используйте либо `\"rgb_color\"`, либо `\"color_temp\"` в спящем режиме. 🌙",
"sleep_rgb_color": "Цвет RGB в спящем режиме (используется, когда параметр `sleep_rgb_or_color_temp` имеет значение \"rgb_color\"). 🌈",
"sleep_transition": "Длительность перехода при переключении \"спящего режима\" в секундах. 😴",
"sunrise_time": "Устанавливает фиксированное время (ЧЧ:ММ:СС) восхода солнца. 🌅",
"min_sunrise_time": "Устанавливает самое раннее время виртуального восхода солнца (ЧЧ:ММ:СС), чтобы обеспечить возможность более позднего восхода солнца. 🌅",
"max_sunrise_time": "Устанавливает последнее время виртуального восхода солнца (ЧЧ:ММ:СС), что позволит восходить раньше. 🌅",
"sunrise_offset": "Регулирует время восхода солнца с положительным или отрицательным смещением в секундах. ⏰",
"sunset_time": "Устанавливает фиксированное время (ЧЧ:ММ:СС) для заката. 🌇",
"min_sunset_time": "Устанавливает самое раннее время виртуального заката (ЧЧ:ММ:СС), чтобы обеспечить более поздние закаты. 🌇",
"max_sunset_time": "Устанавливает последнее время виртуального заката (ЧЧ:ММ:СС), чтобы обеспечить более ранние закаты. 🌇",
"sunset_offset": "Регулирует время заката с помощью положительного или отрицательного смещения в секундах. ⏰",
"brightness_mode": "Режим яркости для использования. Возможные значения: `default`, `linear` и `tanh` (используются `brightness_mode_time_dark` и `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Игнорируется, если `brightness_mode='default'`) Продолжительность в секундах увеличения/уменьшения яркости до/после восхода/заката. 📈📉",
"brightness_mode_time_light": "(Игнорируется, если `brightness_mode='default'`) Продолжительность в секундах увеличения/уменьшения яркости после/до восхода/заката. 📈📉.",
"autoreset_control_seconds": "Автоматический сброс ручного управления через несколько секунд. Установите значение 0, чтобы отключить. ⏲️",
"send_split_delay": "Задержка (миллисекунды) между отдельными командами поворота для источников света, которые не поддерживают одновременную настройку яркости и цвета. ⏲️",
"adapt_delay": "Время ожидания (в секундах) между включением света и применением изменений адаптивного освещения. Возможно поможет избежать мерцания. ⏲️"
}
}
} }
} }
}, },
@ -48,5 +95,139 @@
"option_error": "Ошибка в настройках!", "option_error": "Ошибка в настройках!",
"entity_missing": "Выбранный индикатор не найден" "entity_missing": "Выбранный индикатор не найден"
} }
},
"services": {
"apply": {
"fields": {
"entity_id": {
"description": "`entity_id` переключателя с применяемыми настройками. 📝"
},
"lights": {
"description": "Источник света (или список источников света), к которому нужно применить настройки. 💡"
},
"adapt_brightness": {
"description": "Нужно ли адаптировать яркость света. 🌞"
},
"turn_on_lights": {
"description": "Включать ли свет, который в данный момент выключен. 🔆"
},
"adapt_color": {
"description": "Нужно ли адаптировать цвет, если поддерживается источником света. 🌈"
},
"prefer_rgb_color": {
"description": "Предпочитать ли настройку цвета RGB цветовой температуре света, когда это возможно. 🌈"
},
"transition": {
"description": "Длительность плавного перехода при смене освещения, в секундах. 🕑"
}
},
"description": "Применяет текущие настройки адаптивного освещения к источникам света."
},
"change_switch_settings": {
"fields": {
"max_sunrise_time": {
"description": "Устанавливает самое раннее время виртуального заката (ЧЧ:ММ:СС), чтобы обеспечить более поздние закаты. 🌇"
},
"min_brightness": {
"description": "Минимальный процент яркости. 💡"
},
"sunrise_time": {
"description": "Устанавливает фиксированное время (ЧЧ:ММ:СС) восхода солнца. 🌅"
},
"include_config_in_attributes": {
"description": "Показывать все параметры в качестве атрибутов переключателя в Home Assistant, если установлено значение `true`. 📝"
},
"max_brightness": {
"description": "Максимальный процент яркости. 💡"
},
"sleep_rgb_color": {
"description": "Цвет RGB в спящем режиме (используется, когда параметр `sleep_rgb_or_color_temp` имеет значение \"rgb_color\"). 🌈"
},
"use_defaults": {
"description": "Устанавливает значения по умолчанию, не указанные в этом вызове службы. Варианты: \"current\" (по умолчанию, сохраняются текущие значения), \"factory\" (сброс к документированным настройкам по умолчанию) или \"configuration\" (возврат к настройкам конфигурации по умолчанию). ⚙️"
},
"sunset_time": {
"description": "Устанавливает фиксированное время (ЧЧ:ММ:СС) для заката. 🌇"
},
"min_sunset_time": {
"description": "Устанавливает самое раннее время виртуального заката (ЧЧ:ММ:СС), чтобы обеспечить более поздние закаты. 🌇"
},
"sleep_brightness": {
"description": "Процент яркости света в режиме сна. 😴"
},
"detect_non_ha_changes": {
"description": "Обнаруживает и останавливает адаптацию для изменений состояния, отличных от `light.turn_on`. Требуется включить `take_over_control`. 🕵️ Внимание: ⚠️ Некоторые индикаторы могут ошибочно указывать включенное состояние, что может привести к неожиданному включению света. Отключите эту функцию, если у вас возникнут такие проблемы."
},
"sunrise_offset": {
"description": "Отрегулируйте время восхода солнца с положительным или отрицательным смещением в секундах. ⏰"
},
"sleep_color_temp": {
"description": "Цветовая температура в режиме сна (используется, когда параметр «sleep_rgb_or_color_temp» имеет значение «color_temp») в Кельвинах. 😴"
},
"min_color_temp": {
"description": "Самая теплая цветовая температура в Кельвинах. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Используйте либо «rgb_color», либо «color_temp» в режиме сна. 🌙"
},
"turn_on_lights": {
"description": "Включать ли свет, который в данный момент выключен. 🔆"
},
"initial_transition": {
"description": "Длительность первого плавного перехода, когда освещение переключается с «выключено» на «включено» в секундах. ⏲️"
},
"entity_id": {
"description": "Сущность `Entity ID` переключателя `switch`. 📝"
},
"take_over_control": {
"description": "Отключите адаптивное освещение, если другой источник вызывает `light.turn_on`, когда освещение включено и адаптируется. Обратите внимание, что это вызывает `homeassistant.update_entity` каждый `interval` интервал! 🔒"
},
"sleep_transition": {
"description": "Длительность плавного перехода при переключении «спящего режима» в секундах. 😴"
},
"autoreset_control_seconds": {
"description": "Автоматический сброс ручного управления через Х секунд. Установите значение 0, чтобы отключить. ⏲️"
},
"adapt_delay": {
"description": "Время ожидания (в секундах) между включением света и применением адаптивного освещения. Может помочь избежать мерцаний. ⏲️"
},
"only_once": {
"description": "Адаптировать освещение только тогда, когда оно включено («true») или продолжать его адаптировать («false»). 🔄"
},
"separate_turn_on_commands": {
"description": "Используйте отдельные вызовы `light.turn_on` для цвета и яркости, требуется для некоторых типов освещения. 🔀"
},
"prefer_rgb_color": {
"description": "Предпочитать ли настройку цвета RGB цветовой температуре света, когда это возможно. 🌈"
},
"max_color_temp": {
"description": "Самая холодная цветовая температура в Кельвинах. ❄️"
},
"sunset_offset": {
"description": "Отрегулируйте время заката с помощью положительного или отрицательного смещения в секундах. ⏰"
},
"send_split_delay": {
"description": "Задержка (мс) между отдельными командами поворота `separate_turn_on_commands` для источников света, которые не поддерживают одновременную настройку яркости и цвета. ⏲️"
},
"transition": {
"description": "Длительность плавного перехода при смене освещения, в секундах. 🕑"
}
},
"description": "Измените переключателями настройки, которые вам подходят. Все параметры здесь такие же, как и в процессе настройки."
},
"set_manual_control": {
"description": "Отметьте, контролируется ли свет вручную.",
"fields": {
"manual_control": {
"description": "Добавлять («true») или удалять («false») свет из списка «ручного упрваления». 🔒"
},
"entity_id": {
"description": "Сущность `entity_id` переключателя для выбора ручного управления `manually controlled`. 📝"
},
"lights": {
"description": "Сущность(и) `entity_id` источников света, если не указано, выбираются все источники света в переключателе. 💡"
}
}
}
} }
} }

View file

@ -0,0 +1,213 @@
{
"options": {
"step": {
"init": {
"data": {
"lights": "svetlá: Zoznam svetiel (entity_id), ktoré majú byť ovládané (môže byť prázdny). 🌟",
"min_brightness": "min_brightness: Najnižší jas (v %). 💡",
"max_brightness": "max_brightness: Najvyšší jas (v %). 💡",
"min_color_temp": "min_color_temp: Najnižšia teplota svetla (v ˚K). 🔥",
"max_color_temp": "max_color_temp: Najvyššia teplota svetla (v ˚K). ❄️"
},
"data_description": {
"interval": "Frekvencia s akou prispôsobovať svetlá (v sekundách). 🔄",
"transition": "Trvanie prechodu, keď sú svetlá zmenené (v sekundách). ⏲️",
"sleep_brightness": "Jas svetiel pri režime spánku (v %). 😴",
"sleep_color_temp": "Teplota svetla (v ˚K) v režime spánku (pokiaľ `sleep_rgb_or_color_temp` je `color_temp`). 😴"
},
"title": "Nastavenia Adaptívneho osvetlenia",
"description": "Nastavte komponentu Adaptívneho osvetlenia. Názvy nastavení sú zhodné s názvami v súbore YAML. Ak ste túto položku nastavili už v YAML, tak tu sa nezobrazia žiadne možnosti nastavenia. Interaktívne grafy, ktoré zobrazujú vplyv nastavení, nájdete na [tejto webovej aplikácii]({webapp_url}). Ďalšie informácie nájdete v [oficiálnej dokumentácii]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Či preferovať nastavenie cez RGB než nastavením teploty svetla, ak je to možné. 🌈",
"transition_until_sleep": "transition_until_sleep: Keď je funkcia povolená, Adaptívne osvetlenie bude považovať nastavenia režimu spánku ako minimum, a na tieto hodnoty prejde po západe slnka. 🌙",
"take_over_control": "take_over_control: Ak sú svetlá zapnuté a prispôsobované a niečo zavolá službu `light.turn_on`, dôjde k vypnutiu Adaptívneho osvetlenia. Poznámka: Zapnutie tejto voľby spôsobí volanie služby `homeassistant.update_entity` každý `interval`! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: Deteguje a zastaví prispôbovanie pre zmeny mimo `light.turn_on`. Vyžaduje zapnutie `take_over_control`. 🕵️ Upozornenie: ⚠️ Niektoré svetlá môžu falošne indikovať zapnutý stav, čo spôsobí, že sa svetlo neočakávane zapne. Ak narazíte na tento problém, funkciu vypnite.",
"only_once": "only_once: Prispôsobiť svetlá iba pri zapnutí (`true`) alebo prispôsobovať ich priebežne (`false`). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Len pri čistom zapnutí svetiel. Pri nastavení `true` prispôsobí Adaptívne osvetlenie svetlá len pri zavolaní služby `light.turn_on` bez parametrov jasu alebo teploty svetla. ❌🌈 Napríklad: zamedzí to prispôsobovaniu ak je aktivovaná scéna. Pri nastavení `false` dôjde k prispôsobeniu nezávisle na tom či sú parametre jasu alebo teploty svetla prítomné v`service_data`. Vyžaduje zapnutie `take_over_control`. 🕵️ ",
"separate_turn_on_commands": "separate_turn_on_commands: Použiť samostatné volania služby `light.turn_on` pre nastavenie teploty svetla a jasu (môže byť potrebné pre niektoré typy svetiel). 🔀",
"skip_redundant_commands": "skip_redundant_commands: Preskočiť odoslanie prispôsobovacích príkazov, ktorých cieľový stav je zhodný s posledným známym stavom. Nastavenie minimalizuje sieťovú prevádzku a v niektorých prípadoch môže zlepšiť odozvu prispôsobovania. 📉 Vypnite, pokiaľ skutočný stav svetiel prestáva odpovedať stavu zaznamenanom v HA.",
"intercept": "intercept: Zachytiť a prispôsobiť volania `light.turn_on`, aby došlo k okamžitému prispôsobeniu jasu a teploty svetla. 🏎️ Vypnite pre svetlá, ktoré nepodporujú `light.turn_on` s teplotou svetla a jasom zároveň.",
"multi_light_intercept": "multi_light_intercept: Zachytiť a prispôsobiť volanie služby`light.turn_on`, ktoré ovlyvňuje viacero svetiel. ➗⚠️ Toto môže spôsobiť rozdelenie jedného volania `light.turn_on`na viacero volaní, napr. ak sú svetlá pod rôznymi prepínačmi adaptívneho osvetlenia. Vyžaduje zapnutie `intercept`.",
"include_config_in_attributes": "include_config_in_attributes: Zobraziť všetky nastavenia ako atribúty prepínača v Home Assistant. 📝"
},
"data_description": {
"initial_transition": "Trvanie prvého prechodu, keď sú svetlá zapnuté z `off` na `on` (v sekundách). ⏲️",
"sleep_rgb_or_color_temp": "V režime spánku použiť `\"rgb_color\"` alebo `\"color_temp\"`. 🌙",
"sleep_rgb_color": "Farba svetla RGB v režime spánku (pokiaľ `sleep_rgb_or_color_temp` je `rgb_color `). 🌈",
"sleep_transition": "Trvanie prechodu do alebo z režimu spánku (v sekundách). 😴",
"sunrise_time": "Nastaviť pevný čas (HH:MM:SS) pre východ slnka. 🌅",
"min_sunrise_time": "Nastavte najskorší možný virtuálny východ slnka (HH:MM:SS). Umožňuje neskorší východ slnka. 🌅",
"max_sunrise_time": "Nastavte najneskorší možný virtuálny východ slnka (HH:MM:SS). Umožňuje skorší východ slnka. 🌅",
"sunrise_offset": "Upravte čas východu slnka o sekundy vpred alebo vzad. ⏰",
"sunset_time": "Nastaviť pevný čas (HH:MM:SS) pre západ slnka. 🌇",
"min_sunset_time": "Nastavte najskorší možný virtuálny západ slnka (HH:MM:SS). Umožňuje neskorší západ slnka. 🌅",
"max_sunset_time": "Nastavte najneskorší možný virtuálny západ slnka (HH:MM:SS). Umožňuje skorší západ slnka. 🌅",
"sunset_offset": "Upravte čas západu slnka o sekundy vpred alebo vzad. ⏰",
"brightness_mode": "Výber režimu jasu. Možné hodnotu sú `default`, `linear` a `tanh` (používa `brightness_mode_time_dark` a `brightness_mode_time_light`). 📈",
"brightness_mode_time_dark": "(Ignorované ak `brightness_mode='default'`) Čas na zvýšenie/zníženie jasu po udalosti/pred udalosťou východu/západu slnka. 📈📉",
"brightness_mode_time_light": "(Ignorovaný, ak `brightness_mode = 'predvolené') Trvanie v sekundách na rampu / vypnutie jasu po / pred východ slnka/sunset. 📈📉.",
"autoreset_control_seconds": "Automaticky ukončiť manuálne ovládanie po zadanom množtve sekúnd. Pre vypnutie nastavte 0. ⏲️",
"send_split_delay": "Pauza (v ms) medzi príkazmi pri zapnutom `separate_turn_on_commands` pre svetlá, ktoré nepodporujú súčasné nastavenie jasu a teploty svetla. ⏲️",
"adapt_delay": "Pauza (v sekundách) medzi zapnutím svetla a aplikáciou zmien Adaptívneho osvetlenia. Môže pomôcť zabrániť blikaniu. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Neplatné nastavenie",
"entity_missing": "V Home Assistant chýba jedno alebo viac vybraných svetiel"
}
},
"title": "Adaptívne osvetlenie",
"config": {
"step": {
"user": {
"description": "Každá inštancia môže obsahovať viacero svetiel!",
"title": "Vyberte názov inštancie Adaptívneho osvetlenia",
"data": {
"name": "Názov"
}
}
},
"abort": {
"already_configured": "Toto zariadenie už je nastavené"
}
},
"services": {
"change_switch_settings": {
"fields": {
"sunrise_time": {
"description": "Nastaviť pevný čas (HH:MM:SS) pre východ slnka. 🌅"
},
"sunset_time": {
"description": "Nastaviť pevný čas (HH:MM:SS) pre západ slnka. 🌇"
},
"sleep_brightness": {
"description": "Jas svetiel pri režime spánku (v %). 😴"
},
"sunrise_offset": {
"description": "Upravte čas východu slnka o sekundy vpred alebo vzad. ⏰"
},
"max_sunrise_time": {
"description": "Nastavte najneskorší možný virtuálny východ slnka (HH:MM:SS). Umožňuje skorší východ slnka. 🌅"
},
"sleep_color_temp": {
"description": "Teplota svetla (v ˚K) v režime spánku (pokiaľ `sleep_rgb_or_color_temp` je `color_temp`). 😴"
},
"min_brightness": {
"description": "Najnižší jas (v %). 💡"
},
"min_color_temp": {
"description": "Najnižšia teplota svetla (v ˚K). 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "V režime spánku použiť `\"rgb_color\"` alebo `\"color_temp\"`. 🌙"
},
"turn_on_lights": {
"description": "Či sa majú zapnúť svetlá, ktoré sú momentálne vypnuté. 🔆"
},
"initial_transition": {
"description": "Trvanie prvého prechodu, keď sú svetlá zapnuté z `off` na `on` (v sekundách). ⏲️"
},
"entity_id": {
"description": "ID prepínača. 📝"
},
"include_config_in_attributes": {
"description": "Zobraziť všetky nastavenia ako atribúty prepínača v Home Assistant. 📝"
},
"max_brightness": {
"description": "Najvyšší jas (v %). 💡"
},
"sleep_rgb_color": {
"description": "Farba svetla RGB v režime spánku (pokiaľ `sleep_rgb_or_color_temp` je `rgb_color `). 🌈"
},
"take_over_control": {
"description": "Ak sú svetlá zapnuté a prispôsobované a niečo zavolá službu `light.turn_on`, dôjde k vypnutiu Adaptívneho osvetlenia. Poznámka: Zapnutie tejto voľby spôsobí volanie služby `homeassistant.update_entity` každý `interval`! 🔒"
},
"sleep_transition": {
"description": "Trvanie prechodu do alebo z režimu spánku (v sekundách). 😴"
},
"autoreset_control_seconds": {
"description": "Automaticky ukončiť manuálne ovládanie po zadanom množtve sekúnd. Pre vypnutie nastavte 0. ⏲️"
},
"adapt_delay": {
"description": "Pauza (v sekundách) medzi zapnutím svetla a aplikáciou zmien Adaptívneho osvetlenia. Môže pomôcť zabrániť blikaniu. ⏲️"
},
"only_once": {
"description": "Prispôsobiť svetlá len pri zapnutí (`true`) alebo prispôsobovať ich priebežne (`false`). 🔄"
},
"use_defaults": {
"description": "Stanovuje predvolené hodnoty nie sú uvedené v tomto servisnom hovore. Možnosti: \"current\" (predvolené, zachováva aktuálne hodnoty), \"chôdzky na zdokumentované predvolené nastavenia), alebo \"konfigurácia\" (odkazy prepínať predvolené nastavenia). ⚙️"
},
"separate_turn_on_commands": {
"description": "Použiť samostatné volania služby `light.turn_on` pre nastavenie teploty svetla a jasu (môže byť potrebné pre niektoré typy svetiel). 🔀"
},
"prefer_rgb_color": {
"description": "Či preferovať nastavenie cez RGB než nastavením teploty svetla, ak je to možné. 🌈"
},
"max_color_temp": {
"description": "Najvyššia teplota svetla (v ˚K). ❄️"
},
"sunset_offset": {
"description": "Upravte čas západu slnka o sekundy vpred alebo vzad. ⏰"
},
"send_split_delay": {
"description": "Pauza (v ms) medzi príkazmi pri zapnutom `separate_turn_on_commands` pre svetlá, ktoré nepodporujú súčasné nastavenie jasu a teploty svetla. ⏲️"
},
"transition": {
"description": "Trvanie prechodu, keď sú svetlá zmenené (v sekundách). ⏲️"
},
"min_sunset_time": {
"description": "Nastavte najskorší možný virtuálny západ slnka (HH:MM:SS). Umožňuje neskorší západ slnka. 🌅"
},
"detect_non_ha_changes": {
"description": "Detekuje a zastaví prispôsobovanie pre iné zmeny stavov než `light.turn_on`. Vyžaduje zapnuté `take_over_control`. 🕵️ Upozornenie: ⚠️ Niektoré svetlá môžu nesprávne indikovať stav 'on', čo môže spôsobiť neočakávané zapnutie svetiel. Vypnite toto nastavenie, ak sa takéto problémy objavia."
}
},
"description": "Zmeňte ľubovoľné nastavenie prepínača. Všetky možnosti sú rovnaké ako v config flow."
},
"apply": {
"fields": {
"entity_id": {
"description": "`entity_id` prepínača, na ktorý sa majú aplikovať zmeny. 📝"
},
"adapt_brightness": {
"description": "Či prispôsobiť jas svetla. 🌞"
},
"turn_on_lights": {
"description": "Či sa majú zapnúť svetlá, ktoré sú momentálne vypnuté. 🔆"
},
"adapt_color": {
"description": "Či prispôsobiť teplotu svetla na podporovaných svetlách. 🌈"
},
"prefer_rgb_color": {
"description": "Či preferovať nastavenie cez RGB než nastavením teploty svetla, ak je to možné. 🌈"
},
"lights": {
"description": "Svetlo (alebo zoznam svetiel), na ktoré sa má nastavenie aplikovať. 💡"
},
"transition": {
"description": "Trvanie prechodu, keď sú svetlá zmenené (v sekundách). ⏲️"
}
},
"description": "Aplikuje na svetlá súčasné nastavenie Adaptívneho osvetlenia."
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "Či pridať (`true`) alebo odobrať (`false`) svetlo zo zoznamu \"manuálne ovládaných\". 🔒"
},
"entity_id": {
"description": "`entity_id` prepínača u ktorého sa majú svetlá o(d)značiť ako \"manuálne ovládané\". 📝"
},
"lights": {
"description": "subjekt_id(s) svietidiel, ak nie je špecifikované, všetky svetlá v prepínači sú vybrané. 💡"
}
},
"description": "Či označiť svetlo ako \"manuálne ovládané\"."
}
}
}

View file

@ -0,0 +1,83 @@
{
"options": {
"step": {
"init": {
"data": {
"lights": "lights: Seznam entity_id-jev luči za nadzor (lahko je prazen). 🌟",
"min_brightness": "min_brightness: Odstotek najmanjše svetlosti. 💡",
"max_brightness": "max_brightness: Odstotek največeje svetlosti. 💡",
"min_color_temp": "min_color_temp: Najtoplejša barvna temperatura v Kelvinih. 🔥",
"max_color_temp": "max_color_temp: Najhladnejša barvna temperatura v kelvinih. ❄️"
},
"data_description": {
"interval": "Pogostost prilagajanja luči, v sekundah. 🔄",
"transition": "Trajanje prehoda pri spreminjanju luči, v sekundah. 🕑",
"sleep_brightness": "Odstotek svetlosti luči v načinu spanja. 😴",
"sleep_color_temp": "Barvna temperatura v načinu spanja (uporabljena, ko je \"sleep_rgb_or_color_temp\" nastavljena na \"color_temp\") v Kelvinih. 😴"
},
"title": "Nastavitve prilagodljive osvetlitve",
"description": "Konfigurirajte komponento Adaptive Lighting. Imena možnosti so usklajena z nastavitvami v YAML. Če ste ta vnos definirali v YAML, tukaj ne bodo prikazane nobene možnosti. Za interaktivne grafe, ki ponazarjajo učinke parametrov, obiščite to [spletno aplikacijo]({webapp_url}). Za dodatne podrobnosti glejte [uradno dokumentacijo]({docs_url}).",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: Ali v primeru možnosti raje uporabiti prilagoditev RGB barve kot barvno temperaturo luči. 🌈",
"transition_until_sleep": "transition_until_sleep: Če je omogočeno, bo Adaptive Lighting obravnaval nastavitve spanja kot minimalne vrednosti in bo po zahodu sonca prehajal na te vrednosti. 🌙",
"take_over_control": "take_over_control: Onemogoči Adaptive Lighting, če drug vir pokliče \"light.turn_on\", ko so luči prižgane in se prilagajajo. Opozorilo: to ob vsakem intervalu kliče \"homeassistant.update_entity\"! 🔒",
"detect_non_ha_changes": "„detect_non_ha_changes: Zazna in ustavi prilagoditve za spremembe stanja, ki niso posledica \"light.turn_on\". Zahteva omogočeno \"take_over_control\". 🕵️ Pozor: ⚠️ Nekatere luči lahko nepravilno poročajo, da so prižgane, kar lahko povzroči nepričakovano vklapljanje. Onemogočite to funkcijo, če naletite na takšne težave.",
"only_once": "only_once: Prilagodi luči samo ob vklopu (true) ali pa jih še naprej prilagajaj (false). 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: Ob začetnem vklopu luči. Če je nastavljeno na \"true\", AL prilagodi samo, če je \"light.turn_on\" klic brez podanih parametrov barve ali jakosti. ❌🌈 S tem se npr. prepreči prilagajanje pri aktivaciji scene. Če je \"false\", AL prilagodi ne glede na prisotnost barve ali jakosti v začetnih \"service_data\". Zahteva omogočeno \"take_over_control\". 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Uporabi ločene klice \"light.turn_on\" za barvo in jakost, kar je potrebno za nekatere tipe luči. 🔀",
"skip_redundant_commands": "skip_redundant_commands: Preskoči pošiljanje prilagoditvenih ukazov, če je ciljano stanje že enako poznanemu stanju luči. Zmanjšuje omrežni promet in izboljšuje odzivnost prilagajanja v določenih situacijah. 📉 Onemogočite, če se fizična stanja luči ne ujemajo z zabeleženim stanjem v HA.",
"intercept": "intercept: Prestreza in prilagaja klice \"light.turn_on\" za takojšnjo prilagoditev barve in jakosti. 🏎️ Onemogočite za luči, ki ne podpirajo \"light.turn_on\" z barvo in svetlostjo.",
"multi_light_intercept": "multi_light_intercept: Prestreza in prilagaja klice \"light.turn_on\", ki ciljajo več luči. ➗⚠️ To lahko privede do razdelitve enega klica \"light.turn_on\" v več klicev, npr. ko so luči na različnih stikalih. Zahteva omogočeno \"intercept\".",
"include_config_in_attributes": "include_config_in_attributes: Ko je nastavljeno na \"true\", prikaže vse možnosti kot atribute stikala v Home Assistantu. 📝"
},
"data_description": {
"initial_transition": "Trajanje prvega prehoda, ko se luči prižgejo (iz \"off\" v \"on\"), v sekundah. ⏲️",
"sleep_rgb_or_color_temp": "V načinu spanja uporabi \"rgb_color\" ali \"color_temp\". 🌙",
"sleep_rgb_color": "RGB barva v načinu spanja (uporabljena, ko je \"sleep_rgb_or_color_temp\" nastavljeno na \"rgb_color\"). 🌈",
"sleep_transition": "Trajanje prehoda, ko se preklopi način spanja, v sekundah. 😴",
"sunrise_time": "Nastavi fiksni čas (HH:MM:SS) sončnega vzhoda. 🌅",
"min_sunrise_time": "Nastavi najzgodnejši navidezni sončni vzhod (HH:MM:SS), dovoljuje kasnejše vzhode. 🌅",
"max_sunrise_time": "Nastavi najkasnejši virtualni sončni vzhod (HH:MM:SS), dovoljuje zgodnejše vzhode. 🌅",
"sunrise_offset": "Prilagodite čas sončnega vzhoda z pozitivnim ali negativnim zamikom v sekundah. ⏰",
"sunset_time": "Nastavite fiksni čas (HH:MM:SS) za sončni zahod. 🌇",
"min_sunset_time": "Nastavite najzgodnejši navidezni čas sončnega zahoda (HH:MM:SS), dovoljuje kasnejše sončne zahode. 🌇",
"max_sunset_time": "Nastavite najpoznejši navidezni čas sončnega zahoda (HH:MM:SS), dovoljuje zgodnejše sončne zahode. 🌇",
"sunset_offset": "Prilagodite čas sončnega zahoda s pozitivnim ali negativnim zamikom v sekundah. ⏰",
"brightness_mode": "Način upravljanja svetlosti. Možne vrednosti so \"default\", \"linear\" in \"tanh\" (uporablja \"brightness_mode_time_dark\" in \"brightness_mode_time_light\"). 📈",
"brightness_mode_time_dark": "(Prezrto, če je \"brightness_mode='default'\") Trajanje v sekundah za postopno povečanje ali zmanjšanje svetlosti pred/po sončnem vzhodu/zahodu. 📈📉",
"brightness_mode_time_light": "(Prezrto, če je \"brightness_mode='default'\") Trajanje v sekundah za postopno povečanje ali zmanjšanje svetlosti po/pred sončnem vzhodu/zahodu. 📈📉",
"autoreset_control_seconds": "Samodejno ponastavi ročni nadzor po določenem številu sekund. Nastavite na 0, da onemogočite. ⏲️",
"send_split_delay": "Zamik (ms) med \"separate_turn_on_commands\" za luči, ki ne podpirajo hkratne nastavitve jakosti in barve. ⏲️"
}
}
}
}
}
},
"config": {
"step": {
"user": {
"title": "Izberite ime za instanco Adaptive Lighting",
"description": "Vsaka instanca lahko vsebuje več luči!"
}
},
"abort": {
"already_configured": "Naprava je že konfigurirana"
}
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Prilagajaj luči samo kadar so prižgane (\"true\") ali konstantno jih prilagajaj (\"false\")"
},
"max_sunrise_time": {
"description": "Nastavite najpoznejši navidezni čas sončnega vzhoda (HH:MM:SS), dovoljuje zgodnejše sončne vzhode. 🌅"
}
}
}
},
"title": "Prilagodljiva osvetlitev"
}

View file

@ -8,10 +8,17 @@
"data": { "data": {
"name": "Namn" "name": "Namn"
} }
},
"menu": {
"data": {
"action": "Åtgärd"
},
"title": "Skapa eller duplicera",
"description": "Vill du skapa en ny instans eller duplicera en befintlig?"
} }
}, },
"abort": { "abort": {
"already_configured": "Enheten är redan konfiguerad" "already_configured": "Den här enheten är redan konfiguerad"
} }
}, },
"options": { "options": {
@ -21,27 +28,63 @@
"description": "Alla inställningar för en Adaptiv Ljussättning komponent. Titeln på inställningarna är desamma som i YAML konfigurationen. Inga inställningar visas om enheten redan är konfigurerad i YAML.", "description": "Alla inställningar för en Adaptiv Ljussättning komponent. Titeln på inställningarna är desamma som i YAML konfigurationen. Inga inställningar visas om enheten redan är konfigurerad i YAML.",
"data": { "data": {
"lights": "lights, ljuskällor", "lights": "lights, ljuskällor",
"adapt_brightness": "adapt_brightness, Adaptiv ljusstyrka",
"adapt_color_temp": "adapt_color_temp, Justera färgtemperatur genom att använda 'color_temp' om möjligt",
"adapt_rgb_color": "adapt_rgb_color, Justera färgtemperatur genom att använda RGB/XY om möjligt",
"initial_transition": "initial_transition, när ljuskällorna går från 'av' till 'på' eller när 'sleep_state' ändras",
"interval": "interval, Tid mellan uppdateringar i sekunder", "interval": "interval, Tid mellan uppdateringar i sekunder",
"max_brightness": "max_brightness, i procent %", "transition": "transition, i sekunder",
"max_color_temp": "max_color_temp, i Kelvin",
"min_brightness": "min_brightness, i %", "min_brightness": "min_brightness, i %",
"max_brightness": "max_brightness, i procent %",
"min_color_temp": "min_color_temp, i Kelvin", "min_color_temp": "min_color_temp, i Kelvin",
"only_once": "only_once, Adaptivt justera endast ljuskällorna när de sätts från 'av' till 'på'", "max_color_temp": "max_color_temp, i Kelvin",
"prefer_rgb_color": "prefer_rgb_color, Använd 'rgb_color' över 'color_temp' om möjligt",
"separate_turn_on_commands": "separate_turn_on_commands, for each attribute (color, brightness, etc.) in 'light.turn_on', required for some lights.",
"sleep_brightness": "sleep_brightness, i %", "sleep_brightness": "sleep_brightness, i %",
"sleep_color_temp": "sleep_color_temp, i Kelvin", "sleep_color_temp": "sleep_color_temp, i Kelvin"
"sunrise_offset": "sunrise_offset, i +/- sekunder", },
"sunrise_time": "sunrise_time, i 'HH:MM:SS' format (om 'None', används den faktiskta soluppgången för din position)", "data_description": {
"sunset_offset": "sunset_offset, i +/- sekunder", "interval": "Frekvens för att anpassa lamporna, i sekunder. 🔄",
"sunset_time": "sunset_time, i 'HH:MM:SS' format (om 'None', används den faktiskta solnedgången för din position)", "transition": "Dröjsmål för övergång när lampor ändras, i sekunder. 🕑",
"take_over_control": "take_over_control, om något utöver 'Adaptiv Ljussättning' komponenten kallar på 'light.turn_on' när en ljuskälla redan är på, stängs den adaptiva justeringen av tills ljuskällan stängs av -> på igen, alternativt switchen för konfigurationen", "sleep_brightness": "Procent ljusstyrka för lampor i sovläge. 😴",
"detect_non_ha_changes": "detect_non_ha_changes, Upptäcker alla ändringar större än 5% gjorda på ljuskällorna som inte kommer från HA. Kräver att 'take_over_control' är påslaget.(Kallar på 'homeassistant.update_entity' vid varje 'interval'!)", "sleep_color_temp": "Färgtemperatur i sovläge (används när `sleep_rgb_or_color_temp` är `color_temp`) i Kelvin. 😴"
"transition": "transition, i sekunder" },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition, när ljuskällorna går från 'av' till 'på' eller när 'sleep_state' ändras",
"prefer_rgb_color": "prefer_rgb_color, Använd 'rgb_color' över 'color_temp' om möjligt",
"transition_until_sleep": "transition_until_sleep: När aktiverat kommer Adaptive Lighting att behandla sömninställningarna som ett minimum och övergå till dessa värden efter solnedgången. 🌙",
"sunrise_time": "sunrise_time, i 'HH:MM:SS' format (om 'None', används den faktiskta soluppgången för din position)",
"sunrise_offset": "sunrise_offset, i +/- sekunder",
"sunset_time": "sunset_time, i 'HH:MM:SS' format (om 'None', används den faktiskta solnedgången för din position)",
"sunset_offset": "sunset_offset, i +/- sekunder",
"take_over_control": "take_over_control, om något utöver 'Adaptiv Ljussättning' komponenten kallar på 'light.turn_on' när en ljuskälla redan är på, stängs den adaptiva justeringen av tills ljuskällan stängs av -> på igen, alternativt switchen för konfigurationen",
"detect_non_ha_changes": "detect_non_ha_changes, Upptäcker alla ändringar större än 5% gjorda på ljuskällorna som inte kommer från HA. Kräver att 'take_over_control' är påslaget.(Kallar på 'homeassistant.update_entity' vid varje 'interval'!)",
"only_once": "only_once, Adaptivt justera endast ljuskällorna när de sätts från 'av' till 'på'",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: När lampor först tänds. Om satt till \"true\", anpassar AL endast om \"light.turn_on\" anropas utan att ange färg eller ljusstyrka. ❌🌈 Detta förhindrar t.ex. anpassning när en scen aktiveras. Om \"false\" anpassas AL oavsett förekomsten av färg eller ljusstyrka i den initiala \"service_data\". \"takeover_control\" måste vara aktiverat. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands, for each attribute (color, brightness, etc.) in 'light.turn_on', required for some lights.",
"skip_redundant_commands": "skip_redundant_commands: Hoppa över att skicka anpassningskommandon vars måltillstånd redan är lika med lampans kända tillstånd. Minimerar nätverkstrafik och förbättrar anpassningsförmågan i vissa situationer. 📉 Inaktivera om lampans tillstånd blir osynkroniserade med HA:s registrerade tillstånd.",
"intercept": "intercept: Fånga upp och anpassa `light.turn_on`-anrop för att möjliggöra omedelbar anpassning av färg och ljusstyrka. 🏎️ Inaktivera för lampor som inte stöder `light.turn_on` med färg och ljusstyrka.",
"multi_light_intercept": "multi_light_intercept: Fånga upp och anpassa \"light.turn_on\"-anrop som riktar sig mot flera lampor. ➗⚠️ Detta kan resultera i att ett enda `light.turn_on`-anrop delas upp i flera anrop, t.ex. när lamporna är kopplade till olika strömbrytare. Kräver att \"intercept\" är aktiverat.",
"include_config_in_attributes": "include_config_in_attributes: Visa alla alternativ som attribut på strömbrytaren i Home Assistant när den är inställd på \"true\". 📝"
},
"data_description": {
"initial_transition": "Den första övergångens varaktighet när lampan slås från ”av” till ”på” i sekunder. ⏲️",
"sleep_rgb_or_color_temp": "Använd antingen`\"rgb_color\"` eller `\"color_temp\"` i sovläge. 🌙",
"sleep_rgb_color": "RGB-färg i sovläge (används när \"sleep_rgb_or_color_temp\" är \"rgb_color\"). 🌈",
"sleep_transition": "Dröjsmål för övergång när \"sov läge\" slås på/av, i sekunder. 🕑",
"sunrise_time": "Ställ in en fast tid (TT:MM:SS) för soluppgången. 🌅",
"min_sunrise_time": "Ställ in den tidigaste virtuella soluppgångstiden (TT: MM: SS), vilket möjliggör senare soluppgångar. 🌅",
"max_sunrise_time": "Ställ in den senaste virtuella soluppgångstiden (TT: MM: SS), vilket möjliggör tidigare soluppgångar. 🌅",
"sunrise_offset": "Justera soluppgångstiden med positiv och negativ förskutning is sekunder. ⏰",
"sunset_time": "Ställ in en fast tid (TT:MM:SS) för solnedgången. 🌇",
"min_sunset_time": "Ställ in den tidigaste virtuella solnedgångstiden (TT: MM: SS), vilket möjliggör senare solnedgångar. 🌇",
"max_sunset_time": "Ställ in den senaste virtuella solnedgångstiden (TT: MM: SS), vilket möjliggör tidigare solnedgångar. 🌇",
"sunset_offset": "Justera solnedgångstiden med positiv och negativ förskutning is sekunder. ⏰",
"brightness_mode": "Ljusstyrkeinställing att använda. Möjliga värden är \"default\", \"linear\" och \"tanh\" (använder \"brightness_mode_time_dark\" och \"brightness_mode_time_light\"). 📈",
"brightness_mode_time_dark": "(Ignoreras om `brightness_mode='default'`) Varaktigheten i sekunder för att öka/minska ljusstyrkan efter/före soluppgång/solnedgång. 📈📉.",
"brightness_mode_time_light": "(Ignoreras om `brightness_mode='default'`) Varaktigheten i sekunder för att öka/minska ljusstyrkan efter/före soluppgång/solnedgång. 📈📉.",
"take_over_control_mode": "Anpassningspausläget när andra källor ändrar ljusstyrka och/eller färg på belysningen. `pause_all` pausar alltid både ljusstyrka och färganpassning. `pause_changed` pausar endast anpassningen av de ändrade attributen och fortsätter att anpassa oförändrade attribut, t.ex. fortsätter färganpassningen när endast ljusstyrkan har ändrats.",
"autoreset_control_seconds": "Nollställ automatiskt manuell kontroll efter ett antal sekunder. Sätt till 0 för at avaktivera. ⏲️",
"send_split_delay": "Dröjsmål (ms) mellan `separate_turn_on_commands` för lampor som inte stödjer samtidiga ljussyrke och färg inställningar. ⏲️",
"adapt_delay": "Väntetid (sekunder) mellan lamptändning och Adaptiv Ljussättning tillämpar ändringar. Kan hjälpa till att undvika flimmer. ⏲️"
}
}
} }
} }
}, },
@ -49,5 +92,142 @@
"option_error": "Ogiltlig inställning", "option_error": "Ogiltlig inställning",
"entity_missing": "Ett valt ljus hittades inte" "entity_missing": "Ett valt ljus hittades inte"
} }
},
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "Procent ljusstyrka för lampor i sovläge. 😴"
},
"sunrise_offset": {
"description": "Justera soluppgångstiden med positiv och negativ förskutning is sekunder. ⏰Justera soluppgångstiden med positiv och negativ förskutning is sekunder. ⏰"
},
"sleep_color_temp": {
"description": "Färgtemperatur i sovläge (används när `sleep_rgb_or_color_temp` är `color_temp`) i Kelvin. 😴"
},
"entity_id": {
"description": "Enhets-ID för strömbrytaren. 📝"
},
"sleep_transition": {
"description": "Dröjsmål för övergång när \"sov läge\" slås på/av, i sekunder. 🕑"
},
"autoreset_control_seconds": {
"description": "Nollställ automatiskt manuell kontroll efter ett antal sekunder. Sätt till 0 för at avaktivera. ⏲️"
},
"only_once": {
"description": "Anpassa lampor endast när de slås på ('true') eller fortsätt anpassa dem ('false'). 🔄"
},
"max_color_temp": {
"description": "Kallaste färgtemperatur i Kelvin. ❄️"
},
"sunset_offset": {
"description": "Justera solnedgångstiden med positiv och negativ förskutning is sekunder. ⏰"
},
"send_split_delay": {
"description": "Dröjsmål (ms) mellan `separate_turn_on_commands` för lampor som inte stödjer samtidiga ljussyrke och färg inställningar. ⏲️"
},
"transition": {
"description": "Dröjsmål för övergång när lampor ändras, i sekunder. 🕑"
},
"max_sunrise_time": {
"description": "Ställ in den senaste virtuella soluppgångstiden (TT: MM: SS), vilket möjliggör tidigare soluppgångar. 🌅"
},
"min_brightness": {
"description": "Minimal ljusstyrka i procent. 💡"
},
"min_color_temp": {
"description": "Varmaste färgtemperaturen i Kelvin. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "Använd antingen`\"rgb_color\"` eller `\"color_temp\"` i sovläge. 🌙"
},
"turn_on_lights": {
"description": "Om att tända lampor som är för närvarande släckta. 🔆"
},
"initial_transition": {
"description": "Den första övergångens varaktighet när lampan slås från ”av” till ”på” i sekunder. ⏲️"
},
"sunrise_time": {
"description": "Ställ in en fast tid (TT:MM:SS) för soluppgången. 🌅"
},
"include_config_in_attributes": {
"description": "Visa alla alternativ som attribut på strömbrytaren i Home Assistant när ”true”. 📝"
},
"max_brightness": {
"description": "Maximal ljusstyrka i procent. 💡"
},
"sleep_rgb_color": {
"description": "RGB-färg i sovläge (används när \"sleep_rgb_or_color_temp\" är \"rgb_color\"). 🌈"
},
"adapt_delay": {
"description": "Väntetid (sekunder) mellan lamptändning och Adaptiv Ljussättning tillämpar ändringar. Kan hjälpa till att undvika flimmer. ⏲️"
},
"separate_turn_on_commands": {
"description": "Använd separata `light.turn_on`anrop för färg och ljusstyrka, behövs för vissa lamptyper. 🔀"
},
"prefer_rgb_color": {
"description": "Om att föredra RGB-färgjustering framför ljusfärgtemperatur när det är möjligt. 🌈"
},
"sunset_time": {
"description": "Ställ in en fast tid (TT:MM:SS) för solnedgången. 🌇"
},
"min_sunset_time": {
"description": "Ställ in den tidigaste virtuella solnedgångstiden (TT: MM: SS), vilket möjliggör senare solnedgångar. 🌇"
},
"detect_non_ha_changes": {
"description": "Upptäcker och stoppar anpassningar för tillståndsändringar som inte är \"light.turn_on\". Behöver \"takeover_control\" aktiverat. 🕵️ Varning: ⚠️ Vissa lampor kan felaktigt indikera ett \"på\"-läge, vilket kan resultera i att lamporna tänds oväntat. Inaktivera den här funktionen om du stöter på sådana problem."
},
"take_over_control": {
"description": "Inaktivera Adaptive Ligting om en annan källa anropar 'light.turn_on' medan lamporna är tända och anpassas. Observera att detta anropar `homeassistant.update_entity` varje `intervall`! 🔒"
},
"use_defaults": {
"description": "Ställer in standardvärden som inte anges i detta serviceanrop. Alternativ: \"current\" (standard, behåller nuvarande värden), \"factory\" (återställer till dokumenterade standardinställningar) eller \"configuration\" (återgår till strömbrytarens standardinställningar). ⚙️"
},
"take_over_control_mode": {
"description": "Anpassningspausläget när andra källor ändrar ljusstyrka och/eller färg på belysningen. `pause_all` pausar alltid både ljusstyrka och färganpassning. `pause_changed` pausar endast anpassningen av de ändrade attributen och fortsätter att anpassa oförändrade attribut, t.ex. fortsätter färganpassningen när endast ljusstyrkan har ändrats."
}
},
"description": "Ändra vilka inställningar du vill ha i strömbrytaren. All dessa inställningar är likadana som i config flow."
},
"set_manual_control": {
"fields": {
"lights": {
"description": "Enhets-ID för lampor. Om inget anges väljs alla lampor i strömbrytaren. 💡"
},
"manual_control": {
"description": "Lägg till (\"true\") eller ta bort (\"false\") ljuset från listan \"manual_control\". 🔒"
},
"entity_id": {
"description": "Strömbrytarens ”entity_id\" i vilken lampan ska (av)markeras som \"manuellt styrd\". 📝"
}
},
"description": "Markera om en lampa är \"styrd manuellt\"."
},
"apply": {
"description": "Tillämpar nuvarande Adaptiv Ljussätting inställningar till lampor.",
"fields": {
"lights": {
"description": "En lampa (eller en lamplista) till vilka inställningarna tillämpas."
},
"transition": {
"description": "Dröjsmål för övergång när lampor ändras, i sekunder. 🕑"
},
"entity_id": {
"description": "\"entity_id\" för strömbrytaren med inställningarna som ska tillämpas. 📝"
},
"adapt_brightness": {
"description": "Om lampans ljusstyrka ska anpassas. 🌞"
},
"turn_on_lights": {
"description": "Om att tända lampor som är för närvarande släckta. 🔆"
},
"adapt_color": {
"description": "Om färgen på lampor som stödjer ska anpassas. 🌈"
},
"prefer_rgb_color": {
"description": "Om att föredra RGB-färgjustering framför ljusfärgtemperatur när det är möjligt. 🌈"
}
}
}
} }
} }

View file

@ -0,0 +1,210 @@
{
"services": {
"set_manual_control": {
"description": "ஒரு ஒளி 'கைமுறையாக கட்டுப்படுத்தப்பட்டதா' என்பதைக் குறிக்கவும்.",
"fields": {
"entity_id": {
"description": "சுவிட்சின் `நிறுவனம்_ஐடி`, இதில் (அன்) ஒளியை` கைமுறையாக கட்டுப்படுத்தப்படுகிறது 'என்று குறிக்கவும். ."
},
"lights": {
"description": "விளக்குகளின் entity_id (கள்), குறிப்பிடப்படாவிட்டால், சுவிட்சில் உள்ள அனைத்து விளக்குகளும் தேர்ந்தெடுக்கப்படுகின்றன. ."
},
"manual_control": {
"description": "\"கையேடு_ கன்ட்ரோல்\" பட்டியலிலிருந்து ஒளியை சேர்க்க வேண்டுமா அல்லது அகற்ற வேண்டுமா அல்லது அகற்ற வேண்டுமா அல்லது அகற்ற வேண்டுமா? ."
}
}
},
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "விநாடிகளில் நேர்மறை அல்லது எதிர்மறை ஆஃப்செட் மூலம் சூரிய தோன்றுகை நேரத்தை சரிசெய்யவும். ."
},
"sunrise_time": {
"description": "சூரிய உதயத்திற்கு ஒரு நிலையான நேரத்தை (HH: MM: SS) அமைக்கவும். ."
},
"entity_id": {
"description": "சுவிட்சின் நிறுவன ஐடி. ."
},
"use_defaults": {
"description": "இந்த பணி அழைப்பில் குறிப்பிடப்படாத இயல்புநிலை மதிப்புகளை அமைக்கிறது. விருப்பங்கள்: \"நடப்பு\" (இயல்புநிலை, தற்போதைய மதிப்புகளைத் தக்க வைத்துக் கொள்கிறது), \"தொழிற்சாலை\" (ஆவணப்படுத்தப்பட்ட இயல்புநிலைகளுக்கு மீட்டமைக்கிறது) அல்லது \"உள்ளமைவு\" (கட்டமைப்பு இயல்புநிலைகளை மாற்றுவதற்கு மாற்றுகிறது). ."
},
"include_config_in_attributes": {
"description": "`உண்மை` என அமைக்கப்பட்டிருக்கும் போது வீட்டு உதவியாளரின் சுவிட்சில் உள்ள அனைத்து விருப்பங்களையும் பண்புகளாகக் காட்டுங்கள். ."
},
"turn_on_lights": {
"description": "தற்போது முடக்கப்பட்ட விளக்குகளை இயக்க வேண்டுமா. ."
},
"initial_transition": {
"description": "விளக்குகள் `ஆஃப்` முதல்` ஆன் `வரை நொடிகளில் மாறும் போது முதல் மாற்றத்தின் காலம். ."
},
"sleep_transition": {
"description": "\"தூக்க பயன்முறை\" நொடிகளில் மாற்றப்படும்போது மாற்றத்தின் காலம். ."
},
"max_brightness": {
"description": "அதிகபட்ச ஒளி விழுக்காடு. ."
},
"max_color_temp": {
"description": "கெல்வினில் குளிரான வண்ண வெப்பநிலை. ."
},
"min_brightness": {
"description": "குறைந்தபட்ச ஒளி விழுக்காடு. ."
},
"min_color_temp": {
"description": "கெல்வினில் வெப்பமான வண்ண வெப்பநிலை. ."
},
"only_once": {
"description": "விளக்குகள் இயக்கப்படும்போது மட்டுமே (`உண்மை`) மாற்றியமைக்கும்போது அல்லது அவற்றைத் தழுவிக்கொள்ளுங்கள் (` பொய்`). ."
},
"prefer_rgb_color": {
"description": "முடிந்தவரை ஒளி வண்ண வெப்பநிலையை விட RGB வண்ண சரிசெய்தலை விரும்பலாமா. ."
},
"separate_turn_on_commands": {
"description": "சில ஒளி வகைகளுக்கு தேவைப்படும் வண்ணம் மற்றும் பிரகாசத்திற்கான தனித்தனி `லைட்.டர்ன்_ஓஎன்` அழைப்புகளைப் பயன்படுத்தவும். ."
},
"send_split_delay": {
"description": "ஒரே நேரத்தில் ஒளி மற்றும் வண்ண அமைப்பை ஆதரிக்காத விளக்குகளுக்கு `தனி_டர்ன்_ஆன்_காமண்ட்ச்` இடையே நேரந்தவறுகை (எம்.எச்). ."
},
"sleep_brightness": {
"description": "தூக்க பயன்முறையில் விளக்குகளின் ஒளி விழுக்காடு. ."
},
"sleep_rgb_or_color_temp": {
"description": "தூக்க பயன்முறையில் `\" rgb_color \"` அல்லது `\" Color_Temp \"key ஐப் பயன்படுத்தவும். ."
},
"sleep_rgb_color": {
"description": "தூக்க பயன்முறையில் RGB வண்ணம் (`SLEEP_RGB_OR_COLOR_TEMP`\" RGB_COLOR \"ஆக இருக்கும்போது பயன்படுத்தப்படுகிறது). ."
},
"sleep_color_temp": {
"description": "ச்லீப் பயன்முறையில் வண்ண வெப்பநிலை (கெல்வினில் `SLEEP_RGB_OR_COLOR_TEMP` என்பது` color_temp` ஆக இருக்கும்போது பயன்படுத்தப்படுகிறது). ."
},
"sunset_offset": {
"description": "வினாடிகளில் நேர்மறை அல்லது எதிர்மறை ஆஃப்செட் மூலம் சூரிய மறைவு நேரத்தை சரிசெய்யவும். ."
},
"sunset_time": {
"description": "சூரிய அச்தமனத்திற்கு ஒரு நிலையான நேரத்தை (HH: MM: SS) அமைக்கவும். ."
},
"max_sunrise_time": {
"description": "ஆரம்பகால சூரிய உதயத்தை அனுமதிக்கும் அண்மைக் கால மெய்நிகர் சூரிய தோன்றுகை நேரத்தை (HH: MM: SS) அமைக்கவும். ."
},
"min_sunset_time": {
"description": "ஆரம்பகால மெய்நிகர் சூரிய மறைவு நேரத்தை (HH: MM: SS) அமைக்கவும், பின்னர் சூரிய அச்தமனங்களை அனுமதிக்கிறது. ."
},
"take_over_control": {
"description": "விளக்குகள் இயக்கத்தில் இருக்கும்போது மற்றொரு சான்று `லைட்.டர்ன்_ஒன்` என்று அழைத்தால் தகவமைப்பு விளக்குகளை முடக்கு. இது `ஓமாசிச்டன்ட்.பிடேட்_என்டிட்டி` ஒவ்வொரு` இடைவெளியையும் 'என்று அழைக்கிறது என்பதை நினைவில் கொள்க! ."
},
"detect_non_ha_changes": {
"description": "`விளக்கு அல்லாத. டர்ன்_ஓஎன்` மாநில மாற்றங்களுக்கான தழுவல்களைக் கண்டறிந்து நிறுத்துகிறது. `Take_over_control` இயக்கப்பட்டது. 🕵œ எச்சரிக்கை: ⚠œ சில விளக்குகள் ஒரு 'ஆன்' நிலையை பொய்யாகக் குறிக்கக்கூடும், இதனால் விளக்குகள் எதிர்பாராத விதமாக இயக்கப்படலாம். இதுபோன்ற சிக்கல்களை நீங்கள் சந்தித்தால் இந்த அம்சத்தை முடக்கு."
},
"transition": {
"description": "விளக்குகள் மாறும்போது, நொடிகளில் மாற்றத்தின் காலம். ."
},
"adapt_delay": {
"description": "லைட் டர்ன் மற்றும் தகவமைப்பு விளக்குகள் இடையே காத்திருப்பு நேரம் (விநாடிகள்) மாற்றங்களைப் பயன்படுத்துகிறது. ஒளிரும் தவிர்க்க உதவலாம். ."
},
"autoreset_control_seconds": {
"description": "பல விநாடிகளுக்குப் பிறகு தானாகவே கையேடு கட்டுப்பாட்டை மீட்டமைக்கவும். முடக்க 0 என அமைக்கவும். ."
}
},
"description": "சுவிட்சில் நீங்கள் விரும்பும் எந்த அமைப்புகளையும் மாற்றவும். இங்குள்ள அனைத்து விருப்பங்களும் கட்டமைப்பு ஓட்டத்தில் உள்ளதைப் போலவே இருக்கும்."
},
"apply": {
"description": "தற்போதைய தகவமைப்பு லைட்டிங் அமைப்புகளை விளக்குகளுக்கு பயன்படுத்துகிறது.",
"fields": {
"entity_id": {
"description": "விண்ணப்பிக்க அமைப்புகளுடன் சுவிட்சின் `ENTITY_ID`. ."
},
"lights": {
"description": "அமைப்புகளைப் பயன்படுத்த ஒரு ஒளி (அல்லது விளக்குகளின் பட்டியல்). ."
},
"transition": {
"description": "விளக்குகள் மாறும்போது, நொடிகளில் மாற்றத்தின் காலம். ."
},
"adapt_brightness": {
"description": "ஒளியின் பிரகாசத்தை மாற்றியமைக்க வேண்டுமா. ."
},
"adapt_color": {
"description": "துணை விளக்குகளில் வண்ணத்தை மாற்றியமைக்க வேண்டுமா. ."
},
"prefer_rgb_color": {
"description": "முடிந்தவரை ஒளி வண்ண வெப்பநிலையை விட RGB வண்ண சரிசெய்தலை விரும்பலாமா. ."
},
"turn_on_lights": {
"description": "தற்போது முடக்கப்பட்ட விளக்குகளை இயக்க வேண்டுமா. ."
}
}
}
},
"title": "தகவமைப்பு விளக்குகள்",
"config": {
"step": {
"user": {
"title": "தகவமைப்பு விளக்கு உதாரணத்திற்கு ஒரு பெயரைத் தேர்வுசெய்க",
"description": "ஒவ்வொரு நிகழ்விலும் பல விளக்குகள் இருக்கலாம்!"
}
},
"abort": {
"already_configured": "இந்த சாதனம் ஏற்கனவே கட்டமைக்கப்பட்டுள்ளது"
}
},
"options": {
"step": {
"init": {
"title": "தகவமைப்பு விளக்கு விருப்பங்கள்",
"description": "தகவமைப்பு விளக்கு கூறுகளை உள்ளமைக்கவும். விருப்பப் பெயர்கள் YAML அமைப்புகளுடன் சீரமைக்கப்படுகின்றன. இந்த உள்ளீட்டை நீங்கள் YAML இல் வரையறுத்திருந்தால், இங்கே எந்த விருப்பங்களும் தோன்றாது. அளவுரு விளைவுகளை நிரூபிக்கும் ஊடாடும் வரைபடங்களுக்கு, [இந்த வலை பயன்பாடு]({webapp_url}) ஐப் பார்வையிடவும். மேலும் விவரங்களுக்கு, [அதிகாரப்பூர்வ ஆவணங்கள்]({docs_url}) ஐப் பார்க்கவும்.",
"data": {
"lights": "விளக்குகள்: கட்டுப்படுத்தப்பட வேண்டிய ஒளி நிறுவனம்_டுகளின் பட்டியல் (காலியாக இருக்கலாம்). .",
"min_brightness": "min_brightness: குறைந்தபட்ச ஒளி விழுக்காடு. .",
"max_brightness": "அதிகபட்ச பிரகாசம்: அதிகபட்ச ஒளி விழுக்காடு. .",
"min_color_temp": "min_color_temp: கெல்வினில் வெப்பமான வண்ண வெப்பநிலை. .",
"max_color_temp": "MAX_COLOR_TEMP: கெல்வினில் குளிரான வண்ண வெப்பநிலை. ."
},
"data_description": {
"interval": "விளக்குகளை மாற்றியமைக்க அதிர்வெண், நொடிகளில். .",
"transition": "விளக்குகள் மாறும்போது, நொடிகளில் மாற்றத்தின் காலம். .",
"sleep_brightness": "தூக்க பயன்முறையில் விளக்குகளின் ஒளி விழுக்காடு. .",
"sleep_color_temp": "ச்லீப் பயன்முறையில் வண்ண வெப்பநிலை (கெல்வினில் `SLEEP_RGB_OR_COLOR_TEMP` என்பது` color_temp` ஆக இருக்கும்போது பயன்படுத்தப்படுகிறது). ."
},
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "bey_rgb_color: முடிந்தவரை ஒளி வண்ண வெப்பநிலையை விட RGB வண்ண சரிசெய்தலை விரும்பலாமா. .",
"transition_until_sleep": "Transition_until_sleep: இயக்கப்பட்டால், தகவமைப்பு விளக்குகள் தூக்க அமைப்புகளை குறைந்தபட்சமாகக் கருதும், சூரிய அச்தமனத்திற்குப் பிறகு இந்த மதிப்புகளுக்கு மாறும். .",
"take_over_control": "Take_over_control: விளக்குகள் இயக்கத்தில் இருக்கும்போது மற்றொரு சான்று `லைட்.டர்ன்_ஓஎன்` என்று அழைத்தால் தகவமைப்பு விளக்குகளை முடக்கு. இது `ஓமாசிச்டன்ட்.பிடேட்_என்டிட்டி` ஒவ்வொரு` இடைவெளியையும் 'என்று அழைக்கிறது என்பதை நினைவில் கொள்க! .",
"detect_non_ha_changes": "கண்டறிதல்_நான்_ஆ_சேஞ்ச்ச்: `விளக்கு அல்லாத. டர்ன்_ஓஎன்` மாநில மாற்றங்களுக்கான தழுவல்களைக் கண்டறிந்து நிறுத்துகிறது. `Take_over_control` இயக்கப்பட்டது. 🕵œ எச்சரிக்கை: ⚠œ சில விளக்குகள் ஒரு 'ஆன்' நிலையை பொய்யாகக் குறிக்கக்கூடும், இதனால் விளக்குகள் எதிர்பாராத விதமாக இயக்கப்படலாம். இதுபோன்ற சிக்கல்களை நீங்கள் சந்தித்தால் இந்த அம்சத்தை முடக்கு.",
"only_once": "மட்டும்_இன்: விளக்குகள் இயக்கப்படும்போது மட்டுமே (`உண்மை`) மாற்றியமைக்கும்போது அல்லது அவற்றைத் தழுவிக்கொள்ளுங்கள் (` தவறு`). .",
"adapt_only_on_bare_turn_on": "சரிசெய்_only_on_bare_turn_on: ஆரம்பத்தில் விளக்குகளை இயக்கும்போது. `உண்மை` என அமைக்கப்பட்டால், வண்ணம் அல்லது பிரகாசத்தைக் குறிப்பிடாமல்` லைட்.டர்ன்_ஓஎன்` செயல்படுத்தப்பட்டால் மட்டுமே அல் மாற்றியமைக்கிறது. ❌🌈 இது எ.கா., ஒரு காட்சியைச் செயல்படுத்தும்போது தழுவலைத் தடுக்கிறது. `தவறு` என்றால், ஆரம்ப` சேவை_டா` இல் நிறம் அல்லது ஒளி இருப்பதைப் பொருட்படுத்தாமல் AL மாற்றியமைக்கிறது. `Take_over_control` இயக்கப்பட்டது. . 🕵️",
"separate_turn_on_commands": "தனித்தனி_டர்ன்_ஆன்_காமண்ட்ச்: சில ஒளி வகைகளுக்கு தேவைப்படும் வண்ணம் மற்றும் பிரகாசத்திற்கான தனித்தனி `லைட்.டர்ன்_ஓஎன்` அழைப்புகளைப் பயன்படுத்தவும். .",
"skip_redundant_commands": "Skip_redundant_commands: தழுவல் கட்டளைகளை அனுப்புவதைத் தவிர்க்கவும், அதன் இலக்கு நிலை ஏற்கனவே ஒளியின் அறியப்பட்ட நிலைக்கு சமம். பிணையம் போக்குவரத்தை குறைக்கிறது மற்றும் சில சூழ்நிலைகளில் தழுவல் மறுமொழியை மேம்படுத்துகிறது. ஆ இன் பதிவு செய்யப்பட்ட நிலையுடன் இயற்பியல் ஒளி நிலைகள் ஒத்திசைவிலிருந்து வெளியேறினால் அது காணக்கூடியது.",
"intercept": "இடைமறிப்பு: உடனடி வண்ணம் மற்றும் பிரகாசமான தழுவலை செயல்படுத்த `ஒளி. Color வண்ணம் மற்றும் பிரகாசத்துடன் `ஒளி.",
"multi_light_intercept": "Mulli_light_intect: பல விளக்குகளை குறிவைக்கும் `light.turn_on` அழைப்புகளை இடைமறிக்கவும் மாற்றவும். ➗⚠œ இது ஒரு `லைட்.டர்ன்_ஒன்` அழைப்பை பல அழைப்புகளாக பிரிக்கக்கூடும், எ.கா., விளக்குகள் வெவ்வேறு சுவிட்சுகளில் இருக்கும்போது. இயக்கப்பட வேண்டும் `இடைமறிப்பு` தேவை.",
"include_config_in_attributes": "அடங்கும்_கான்ஃபிக்_இன்_அட்ரிபியூட்: `உண்மை` என அமைக்கப்பட்டிருக்கும் போது வீட்டு உதவியாளரின் சுவிட்சில் உள்ள பண்புகளாக அனைத்து விருப்பங்களையும் காட்டுங்கள். ."
},
"data_description": {
"initial_transition": "விளக்குகள் `ஆஃப்` முதல்` ஆன் `வரை நொடிகளில் மாறும் போது முதல் மாற்றத்தின் காலம். .",
"sleep_rgb_or_color_temp": "தூக்க பயன்முறையில் `\" rgb_color \"` அல்லது `\" Color_Temp \"key ஐப் பயன்படுத்தவும். .",
"sleep_rgb_color": "தூக்க பயன்முறையில் RGB வண்ணம் (`SLEEP_RGB_OR_COLOR_TEMP`\" RGB_COLOR \"ஆக இருக்கும்போது பயன்படுத்தப்படுகிறது). .",
"sleep_transition": "\"தூக்க பயன்முறை\" நொடிகளில் மாற்றப்படும்போது மாற்றத்தின் காலம். .",
"sunrise_time": "சூரிய உதயத்திற்கு ஒரு நிலையான நேரத்தை (HH: MM: SS) அமைக்கவும். .",
"min_sunrise_time": "ஆரம்பகால மெய்நிகர் சூரிய உதய நேரத்தை (HH: MM: SS) அமைக்கவும், பின்னர் சூரிய உதயங்களை அனுமதிக்கிறது. .",
"max_sunrise_time": "ஆரம்பகால சூரிய உதயத்தை அனுமதிக்கும் அண்மைக் கால மெய்நிகர் சூரிய தோன்றுகை நேரத்தை (HH: MM: SS) அமைக்கவும். .",
"sunrise_offset": "விநாடிகளில் நேர்மறை அல்லது எதிர்மறை ஆஃப்செட் மூலம் சூரிய தோன்றுகை நேரத்தை சரிசெய்யவும். .",
"sunset_time": "சூரிய அச்தமனத்திற்கு ஒரு நிலையான நேரத்தை (HH: MM: SS) அமைக்கவும். .",
"min_sunset_time": "ஆரம்பகால மெய்நிகர் சூரிய மறைவு நேரத்தை (HH: MM: SS) அமைக்கவும், பின்னர் சூரிய அச்தமனங்களை அனுமதிக்கிறது. .",
"max_sunset_time": "முந்தைய சூரிய அச்தமனங்களை அனுமதிக்கும் அண்மைக் கால மெய்நிகர் சன்செட் நேரத்தை (HH: MM: SS) அமைக்கவும். .",
"sunset_offset": "விநாடிகளில் நேர்மறை அல்லது எதிர்மறை ஆஃப்செட் மூலம் சூரிய மறைவு நேரத்தை சரிசெய்யவும். .",
"brightness_mode": "பயன்படுத்த பிரகாசமான முறை. சாத்தியமான மதிப்புகள் `இயல்புநிலை`,` லீனியர்`, மற்றும் `டான்` (` பிரகாசம்_மோட்_ நேரம்_டார்க்` மற்றும் `பிரகாசம்_மோட்_மட்_லிட்` ஆகியவற்றைப் பயன்படுத்துகின்றன). .",
"brightness_mode_time_dark": ". .",
"brightness_mode_time_light": ". ..",
"autoreset_control_seconds": "பல விநாடிகளுக்குப் பிறகு தானாகவே கையேடு கட்டுப்பாட்டை மீட்டமைக்கவும். முடக்க 0 என அமைக்கவும். .",
"send_split_delay": "ஒரே நேரத்தில் ஒளி மற்றும் வண்ண அமைப்பை ஆதரிக்காத விளக்குகளுக்கு `தனி_டர்ன்_ஆன்_காமண்ட்ச்` இடையே நேரந்தவறுகை (எம்.எச்). .",
"adapt_delay": "லைட் டர்ன் மற்றும் தகவமைப்பு விளக்குகள் இடையே காத்திருப்பு நேரம் (விநாடிகள்) மாற்றங்களைப் பயன்படுத்துகிறது. ஒளிரும் தவிர்க்க உதவலாம். ."
}
}
}
}
},
"error": {
"option_error": "தவறான விருப்பம்",
"entity_missing": "ஒன்று அல்லது அதற்கு மேற்பட்ட தேர்ந்தெடுக்கப்பட்ட ஒளி நிறுவனங்கள் வீட்டு உதவியாளரிடமிருந்து காணவில்லை"
}
}
}

View file

@ -0,0 +1,210 @@
{
"title": "Akıllı Aydınlatma",
"options": {
"step": {
"init": {
"title": "Akıllı Aydınlatma seçenekleri",
"data": {
"lights": "`lights`: Kontrol edilecek ışıkların entity_id listesi (boş bırakılabilir). 🌟",
"min_brightness": "min_brightness: Minimum parlaklık yüzdesi.💡",
"max_brightness": "`max_brightness`: Maksimum parlaklık yüzdesi. 💡",
"min_color_temp": "`min_color_temp`: En yüksek (sıcak) renk sıcaklığı (Kelvin cinsinden). 🔥",
"max_color_temp": "`max_color_temp`: En düşük renk sıcaklığı (Kelvin cinsinden). ❄️"
},
"data_description": {
"interval": "Işıkların uyarlanma sıklığı (saniye cinsinden). 🔄",
"transition": "Işıklar değişirken geçiş süresi (saniye cinsinden). 🕑",
"sleep_brightness": "Uyku modundayken ışıkların parlaklık yüzdesi 😴",
"sleep_color_temp": "Uyku modunda renk sıcaklığı ( `sleep_rgb_or_color_temp` `color_temp` olarak ayarlandığında kullanılır) Kelvin cinsinden. 😴"
},
"description": "Bir Adaptive Lighting bileşenini yapılandırın. Seçenek adları YAML ayarlarıyla uyumludur. Eğer bu girdiyi YAMLda tanımladıysanız, burada seçenekler görünmez. \nParametrelerin etkilerini gösteren etkileşimli grafikler için [bu web uygulamasını]({webapp_url}) ziyaret edebilirsiniz. Daha fazla bilgi için [resmi dokümantasyona]({docs_url}) bakın.",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "`prefer_rgb_color`: Mümkünse ışık renk sıcaklığı yerine RGB renk ayarını tercih edip etmeyeceğini belirler. 🌈",
"transition_until_sleep": "`transition_until_sleep`: Etkinleştirildiğinde, Adaptive Lighting uyku ayarlarını minimum değer olarak kabul eder ve gün batımından sonra bu değerlere geçiş yapar. 🌙",
"take_over_control": "`take_over_control`: Işıklar açıkken ve uyarlanırken başka bir kaynaktan `light.turn_on` çağrılırsa Adaptive Lightingi devre dışı bırakır. Dikkat: Bu işlem her `interval` süresinde `homeassistant.update_entity` çağrısı yapar! 🔒",
"detect_non_ha_changes": "`detect_non_ha_changes`: `light.turn_on` dışındaki durum değişikliklerini algılar ve uyarlamayı durdurur. Bu ayarın çalışması için `take_over_control` etkin olmalıdır. 🕵️\nDikkat: ⚠️ Bazı ışıklar yanlışlıkla “açık” durumunu bildirebilir, bu da ışıkların beklenmedik şekilde açılmasına yol açabilir. Böyle bir durumla karşılaşırsanız bu özelliği devre dışı bırakın.",
"only_once": "`only_once`: Işıkları yalnızca açıldıklarında mı uyarlasın (`true`), yoksa sürekli uyarlamaya devam mı etsin (`false`). 🔄",
"adapt_only_on_bare_turn_on": "Işıklar açıldığında geçerlidir. `true` olarak ayarlanırsa, eklenti yalnızca `light.turn_on` işlemi renk veya parlaklık belirtilmeden çağrıldığında uyarlama yapar (örneğin sahne etkinleştirmelerinde uyarlama yapılmaz). ❌🌈\n`false` olarak ayarlanırsa, renk veya parlaklık belirtilmiş olsa bile uyarlama yapılır. Bu ayarın çalışması için `take_over_control` etkin olmalıdır. 🕵️",
"separate_turn_on_commands": "`separate_turn_on_commands`: Renk ve parlaklık için ayrı `light.turn_on` çağrıları kullanır; bazı ışık türleri için gereklidir. 🔀",
"skip_redundant_commands": "`skip_redundant_commands`: Hedef durumu ışığın bilinen durumu ile aynı olan uyarlama komutlarını atlar. Ağ trafiğini azaltır ve bazı durumlarda uyarlamanın yanıt hızını artırır. 📉 \nFiziksel ışık durumları HAdaki kaydedilen durumla senkronize değilse devre dışı bırakın.",
"intercept": "`intercept`: `light.turn_on` çağrılarını yakalar ve renk ile parlaklığın anında uyarlanmasını sağlar. 🏎️ Renk ve parlaklığı desteklemeyen ışıklar için devre dışı bırakın.",
"multi_light_intercept": "`multi_light_intercept`: Birden fazla ışığı hedefleyen `light.turn_on` çağrılarını yakalar ve uyarlama yapar. ➗⚠️ Bu, örneğin ışıklar farklı anahtarlardaysa tek bir `light.turn_on` çağrısının birden fazla çağrıya bölünmesine yol açabilir. `intercept` etkin olmalıdır.",
"include_config_in_attributes": "`include_config_in_attributes`: `true` olarak ayarlandığında, tüm seçenekleri Home Assistantta anahtarın attributeları olarak gösterir. 📝"
},
"data_description": {
"initial_transition": "Işıklar `off` durumundan `on` durumuna geçerken ilk geçişin süresi (saniye cinsinden). ⏲️",
"sleep_rgb_or_color_temp": "Uyku modunda `\"rgb_color\"` veya `\"color_temp\"` kullanın. 🌙",
"sleep_rgb_color": "Uyku modunda RGB renk ( `sleep_rgb_or_color_temp` \"rgb_color\" olarak ayarlandığında kullanılır). 🌈",
"sleep_transition": "“Uyku modu” açılıp kapatıldığında geçiş süresi (saniye cinsinden). 😴",
"sunrise_time": "Gün doğumu için sabit bir saat (SS:DD:YY) belirleyin. 🌅",
"min_sunrise_time": "En erken sanal gün doğumu saatini (SS:DD:YY) belirleyin; daha geç gün doğumlarına izin verir. 🌅",
"max_sunrise_time": "En geç sanal gün doğumu saatini (SS:DD:YY) belirleyin; daha erken gün doğumlarına izin verir. 🌅",
"sunrise_offset": "Gün doğumu saatini, saniye cinsinden pozitif veya negatif bir kaydırma ile ayarlayın. ⏰",
"sunset_time": "Gün batımı için sabit bir saat (SS:DD:YY) belirleyin. 🌇",
"min_sunset_time": "En erken sanal gün batımı saatini (SS:DD:YY) belirleyin; daha geç gün batımlarına izin verir. 🌇",
"max_sunset_time": "En geç sanal gün batımı saatini (SS:DD:YY) belirleyin; daha erken gün batımlarına izin verir. 🌇",
"sunset_offset": "Gün batımı saatini, saniye cinsinden pozitif veya negatif bir kaydırma ile ayarlayın. ⏰",
"brightness_mode": "Kullanılacak parlaklık modunu belirtir. Olası değerler: `default`, `linear` ve `tanh` (`brightness_mode_time_dark` ve `brightness_mode_time_light` ayarlarını kullanır). 📈",
"brightness_mode_time_dark": "(`brightness_mode='default'` ise göz ardı edilir) Gün doğumu/gün batımı öncesi/sonrası parlaklığı kademeli olarak artırma/azaltma süresi (saniye cinsinden). 📈📉",
"brightness_mode_time_light": "(`brightness_mode='default'` ise göz ardı edilir) Gün doğumu/gün batımı öncesi/sonrası parlaklığı kademeli olarak artırma/azaltma süresi (saniye cinsinden). 📈📉",
"autoreset_control_seconds": "Manuel kontrolü belirtilen saniye sonunda otomatik olarak sıfırlar. Devre dışı bırakmak için 0 olarak ayarlayın. ⏲️",
"send_split_delay": "Parlaklık ve renk ayarını aynı anda desteklemeyen ışıklar için `separate_turn_on_commands` arasındaki gecikme (ms). ⏲️",
"adapt_delay": "Işık açıldıktan sonra Adaptive Lightingin değişiklikleri uygulamasına kadar bekleme süresi (saniye cinsinden). Titremeyi önlemeye yardımcı olabilir. ⏲️"
}
}
}
}
},
"error": {
"option_error": "Geçersiz seçenek",
"entity_missing": "Seçilen bir veya birden fazla ışık entitysi Home Assistantta bulunamadı."
}
},
"services": {
"change_switch_settings": {
"fields": {
"only_once": {
"description": "Işıkları yalnızca açıkken (`true`) uyarla, veya sürekli olarak uyarlamaya devam et (`false`).🔄"
},
"sunrise_offset": {
"description": "Gün doğumu saatini, saniye cinsinden pozitif veya negatif bir kaydırma ile ayarlayın. ⏰"
},
"sunset_offset": {
"description": "Gün batımı saatini, saniye cinsinden pozitif veya negatif bir kaydırma ile ayarlayın. ⏰"
},
"autoreset_control_seconds": {
"description": "Manuel kontrolü belirtilen saniye sonunda otomatik olarak sıfırlar. Devre dışı bırakmak için 0 olarak ayarlayın. ⏲️"
},
"sleep_brightness": {
"description": "Uyku modundayken ışıkların parlaklık yüzdesi 😴"
},
"max_color_temp": {
"description": "Kelvin cinsinden en düşük renk sıcaklığı. ❄️"
},
"sleep_color_temp": {
"description": "Uyku modunda renk sıcaklığı ( `sleep_rgb_or_color_temp` `color_temp` olarak ayarlandığında kullanılır) Kelvin cinsinden. 😴"
},
"send_split_delay": {
"description": "Parlaklık ve renk ayarını aynı anda desteklemeyen ışıklar için `separate_turn_on_commands` arasındaki gecikme (ms). ⏲️"
},
"detect_non_ha_changes": {
"description": "`light.turn_on` dışındaki durum değişikliklerini algılar ve uyarlamayı durdurur. Bu ayarın çalışması için `take_over_control` etkin olmalıdır. 🕵️ \nDikkat: ⚠️ Bazı ışıklar yanlışlıkla “açık” durumunu bildirebilir, bu da ışıkların beklenmedik şekilde açılmasına neden olabilir. Böyle bir durumda bu özelliği devre dışı bırakın."
},
"take_over_control": {
"description": "Işıklar açıkken ve uyarlanırken başka bir kaynaktan `light.turn_on` çağrılırsa Adaptive Lightingi devre dışı bırakır. Dikkat: Bu işlem her `interval` süresinde `homeassistant.update_entity` çağrısı yapar! 🔒"
},
"initial_transition": {
"description": "Işıklar `off` durumundan `on` durumuna geçerken ilk geçişin süresi (saniye cinsinden). ⏲️"
},
"transition": {
"description": "Işıklar değişirken geçiş süresi (saniye cinsinden). 🕑"
},
"sleep_transition": {
"description": "“Uyku modu” açılıp kapatıldığında geçiş süresi (saniye cinsinden). 😴"
},
"entity_id": {
"description": "Anahtarın Entity IDsi. 📝"
},
"max_brightness": {
"description": "Maksimum parlaklık yüzdesi.💡"
},
"min_brightness": {
"description": "Minimum parlaklık yüzdesi.💡"
},
"sleep_rgb_color": {
"description": "Uyku modunda RGB renk ( `sleep_rgb_or_color_temp` \"rgb_color\" olarak ayarlandığında kullanılır). 🌈"
},
"sunrise_time": {
"description": "Gün doğumu için sabit bir saat (SS:DD:YY) belirleyin. 🌅"
},
"sunset_time": {
"description": "Gün batımı için sabit bir saat (SS:DD:YY) belirleyin. 🌇"
},
"use_defaults": {
"description": "Bu servis çağrısında belirtilmeyen varsayılan değerleri ayarlar. Seçenekler: \n- `current` (varsayılan, mevcut değerleri korur) \n- `factory` (belgelendirilmiş varsayılanlara sıfırlar) \n- `configuration` (anahtar yapılandırma varsayılanlarına döner) ⚙️"
},
"min_sunset_time": {
"description": "En erken sanal gün batımı saatini (SS:DD:YY) belirleyin; daha geç gün batımlarına izin verir. 🌇"
},
"max_sunrise_time": {
"description": "En geç sanal gün doğumu saatini (SS:DD:YY) belirleyin; daha erken gün doğumlarına izin verir. 🌅"
},
"include_config_in_attributes": {
"description": "`true` olarak ayarlandığında, tüm seçenekleri Home Assistantta anahtarın attributeları olarak gösterir. 📝"
},
"sleep_rgb_or_color_temp": {
"description": "Uyku modunda `\"rgb_color\"` veya `\"color_temp\"` kullanın. 🌙"
},
"separate_turn_on_commands": {
"description": "Renk ve parlaklık için ayrı `light.turn_on` çağrıları kullanın; bazı ışık türleri için gereklidir. 🔀"
},
"min_color_temp": {
"description": "En yüksek (sıcak) renk sıcaklığı (Kelvin cinsinden). 🔥"
},
"prefer_rgb_color": {
"description": "Mümkün olduğunda ışık renk sıcaklığı yerine RGB renk ayarını tercih edip etmeyeceğini belirler. 🌈"
},
"turn_on_lights": {
"description": "Şu anda kapalı olan ışıkların açılıp açılmayacağını belirler. 🔆"
},
"adapt_delay": {
"description": "Işık açıldıktan sonra Adaptive Lightingin değişiklikleri uygulamasına kadar bekleme süresi (saniye cinsinden). Titremeyi önlemeye yardımcı olabilir. ⏲️"
}
},
"description": "Anahtardaki tüm ayarları dilediğiniz gibi değiştirebilirsiniz. Buradaki seçeneklerin hepsi, yapılandırma akışındakilerle aynıdır."
},
"apply": {
"fields": {
"lights": {
"description": "Ayarları bir veya birden fazla ışığa uygula.💡"
},
"transition": {
"description": "Işıklar değişirken geçiş süresi (saniye cinsinden). 🕑"
},
"entity_id": {
"description": "Uygulanacak ayarların bulunduğu anahtarın `entity_id`si. 📝"
},
"adapt_brightness": {
"description": "Işığın parlaklığının uyarlanıp uyarlanmayacağını belirler. 🌞"
},
"adapt_color": {
"description": "Destekleyen ışıklarda rengin uyarlanıp uyarlanmayacağını belirler. 🌈"
},
"prefer_rgb_color": {
"description": "Mümkün olduğunda ışık renk sıcaklığı yerine RGB renk ayarını tercih edip etmeyeceğini belirler. 🌈"
},
"turn_on_lights": {
"description": "Şu anda kapalı olan ışıkların açılıp açılmayacağını belirler. 🔆"
}
},
"description": "Şu anki Akıllııklandırma ayarlarını ışıklara uygular."
},
"set_manual_control": {
"fields": {
"lights": {
"description": "Işıkların entity_id(leri). Belirtilmezse, anahtardaki tüm ışıklar seçilir. 💡"
},
"entity_id": {
"description": "Işığın “manuel olarak kontrol edildiğini” işaretlemek veya kaldırmak için kullanılacak anahtarın `entity_id`si. 📝"
},
"manual_control": {
"description": "Işığı “manuel kontrol” listesinden eklemek (`true`) veya çıkarmak (`false`) için kullanılır. 🔒"
}
},
"description": "Bir ışığın 'manuel olarak kontrol' edilip edilmediğini işaretleyin."
}
},
"config": {
"step": {
"user": {
"title": "Akıllı ışıklandırma örneği için bir ad seçin.",
"description": "Her örnek birden fazla ışık içerebilir!"
}
},
"abort": {
"already_configured": "Bu cihaz zaten ayarlanmış."
}
}
}

View file

@ -8,6 +8,13 @@
"data": { "data": {
"name": "Ім’я" "name": "Ім’я"
} }
},
"menu": {
"data": {
"action": "Дія"
},
"title": "Створити або дублювати",
"description": "Ви хочете створити новий екземпляр чи скопіювати існуючий?"
} }
}, },
"abort": { "abort": {
@ -21,24 +28,63 @@
"description": "Всі налаштування компонента адаптивного освітлення. Назви опцій відповідають налаштуванням у YAML. Опції не відображаються, якщо ви вже визначили їх у компоненті adaptive_lighting вашої YAML-конфігурації.", "description": "Всі налаштування компонента адаптивного освітлення. Назви опцій відповідають налаштуванням у YAML. Опції не відображаються, якщо ви вже визначили їх у компоненті adaptive_lighting вашої YAML-конфігурації.",
"data": { "data": {
"lights": "прилади", "lights": "прилади",
"initial_transition": "initial_transition: Коли прилад вимикається (off), вмикається (on), або змінює 'sleep_state'. (секунди)",
"interval": "interval: Час між оновленнями перемикача. (секунди)", "interval": "interval: Час між оновленнями перемикача. (секунди)",
"max_brightness": "max_brightness: Найвища яскравість світла під час циклу. (%)", "transition": "Час переходу, який застосовується до освітлення (секунди)",
"max_color_temp": "max_color_temp: Найхолодніший відтінок циклу кольорової температури. (Кельвін)",
"min_brightness": "min_brightness: Найнижча яскравість світла під час циклу. (%)", "min_brightness": "min_brightness: Найнижча яскравість світла під час циклу. (%)",
"max_brightness": "max_brightness: Найвища яскравість світла під час циклу. (%)",
"min_color_temp": "min_color_temp: Найтепліший відтінок циклу кольорової температури. (%)", "min_color_temp": "min_color_temp: Найтепліший відтінок циклу кольорової температури. (%)",
"only_once": "only_once: Адаптувати світло лише після початкового увімкнення.", "max_color_temp": "max_color_temp: Найхолодніший відтінок циклу кольорової температури. (Кельвін)",
"prefer_rgb_color": "prefer_rgb_color: Використовувати 'rgb_color' замість 'color_temp', коли можливо.",
"separate_turn_on_commands": "separate_turn_on_commands: Окремі команди для кожного атрибута (колір, яскравість, тощо.) в 'light.turn_on' (необхідні для деяких приладів).",
"sleep_brightness": "sleep_brightness: Налаштування яскравості для Режиму сну. (%)", "sleep_brightness": "sleep_brightness: Налаштування яскравості для Режиму сну. (%)",
"sleep_color_temp": "sleep_color_temp: Температура кольору для Режиму сну. (Кельвін)", "sleep_color_temp": "sleep_color_temp: Температура кольору для Режиму сну. (Кельвін)"
"sunrise_offset": "sunrise_offset: Як за довго до(-) або після(+) визначати точку сходу сонця для циклу (+/- секунд)", },
"sunrise_time": "sunrise_time: Ручний перезапис часу сходу сонця, якщо 'None', тоді використовується час сходу сонця у вашій локації (HH:MM:SS)", "data_description": {
"sunset_offset": "sunset_offset: Як за довго до(-) або після(+) визначати точку заходу сонця для циклу (+/- секунд)", "interval": "Частота адаптації освітлення, у секундах. 🔄",
"sunset_time": "sunset_time: Ручний перезапис часу заходу сонця, якщо 'None', тоді використовується час заходу сонця у вашій локації (HH:MM:SS)", "transition": "Тривалість переходу, коли світло змінюється, у секундах. 🕑",
"take_over_control": "take_over_control: Якщо що-небудь, окрім Адаптивного освітлення, викликає 'light.turn_on', коли світло вже увімкнено, чи адаптувати освітлення допоки світло (або перемикач) перемкнеться (off -> on).", "sleep_brightness": "Відсоток яскравості світла в режимі сну. 😴",
"detect_non_ha_changes": "detect_non_ha_changes: виявляти всі зміни >10% до освітлення (включаючи ті, що зроблені поза HA), вимагає, щоб 'take_over_control' був включений (виклик 'homeassistant.update_entity' кожного оновлення 'interval'!)", "sleep_color_temp": "Колірна температура в режимі сну (використовується, коли `sleep_rgb_or_color_temp` має значення `color_temp`) у Кельвінах. 😴"
"transition": "Час переходу, який застосовується до освітлення (секунди)" },
"sections": {
"advanced": {
"data": {
"initial_transition": "initial_transition: Коли прилад вимикається (off), вмикається (on), або змінює 'sleep_state'. (секунди)",
"prefer_rgb_color": "prefer_rgb_color: Використовувати 'rgb_color' замість 'color_temp', коли можливо.",
"transition_until_sleep": "transition_until_sleep: Коли активовано, адаптивне освітлення буде ставитись до налаштування сну як мінімум, переходячи до цих значень після заходу сонця. 🌙",
"sunrise_time": "sunrise_time: Ручний перезапис часу сходу сонця, якщо 'None', тоді використовується час сходу сонця у вашій локації (HH:MM:SS)",
"sunrise_offset": "sunrise_offset: Як за довго до(-) або після(+) визначати точку сходу сонця для циклу (+/- секунд)",
"sunset_time": "sunset_time: Ручний перезапис часу заходу сонця, якщо 'None', тоді використовується час заходу сонця у вашій локації (HH:MM:SS)",
"sunset_offset": "sunset_offset: Як за довго до(-) або після(+) визначати точку заходу сонця для циклу (+/- секунд)",
"take_over_control": "take_over_control: Якщо що-небудь, окрім Адаптивного освітлення, викликає 'light.turn_on', коли світло вже увімкнено, чи адаптувати освітлення допоки світло (або перемикач) перемкнеться (off -> on).",
"detect_non_ha_changes": "detect_non_ha_changes: виявляти всі зміни >10% до освітлення (включаючи ті, що зроблені поза HA), вимагає, щоб 'take_over_control' був включений (виклик 'homeassistant.update_entity' кожного оновлення 'interval'!)",
"only_once": "only_once: Адаптувати світло лише після початкового увімкнення.",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: На початку вмикання світла. Якщо `true`, освітлення адаптується лише якщо `light.turn_on` викликано без вказання кольору чи яскравості. ❌🌈 Це, наприклад, запобігає адаптації, коли сцена активується. Якщо `false`, освітлення адаптується незалежно від наявності кольору чи яскравості у початковому `service_data`. Потребує ввімкнення `take_over_control`. 🕵️",
"separate_turn_on_commands": "separate_turn_on_commands: Окремі команди для кожного атрибута (колір, яскравість, тощо.) в 'light.turn_on' (необхідні для деяких приладів).",
"skip_redundant_commands": "skip_redundant_commands: Пропускати надсилання команд адаптації, цільовий стан яких вже дорівнює відомому стану освітлення. Мінімізує мережевий трафік і покращує швидкість реагування адаптації в деяких ситуаціях. 📉Вимкнути, якщо фізичний стан освітлення не синхронізується із записаним станом HA.",
"intercept": "intercept: Перехоплювати та адаптувати виклики увімкнення світла (`light.turn_on`), щоб увімкнути миттєву адаптацію кольору та яскравості. 🏎️ Вимкніть для світла, що не підтримує увімкнення світла (`light.turn_on`) з кольором та яскравістю.",
"multi_light_intercept": "multi_light_intercept: Перехоплення та адаптація викликів `light.turn_on`, які спрямовані на кілька світильників. ➗⚠️ Це може призвести до розділення одного виклику `light.turn_on` на кілька викликів, наприклад, коли світильники підключені до різних вимикачів. Потрібно ввімкнути `intercept`.",
"include_config_in_attributes": "Включити конфігурацію в атрибути (`include_config_in_attributes`): Показувати всі опції як атрибути на перемикачі в Home Assistant, якщо встановлено значення `true`. 📝"
},
"data_description": {
"initial_transition": "Тривалість першого переходу, коли світло перемикається зі стану вимкнено `off` на увімкнено `on`, у секундах. ⏲️",
"sleep_rgb_or_color_temp": "Використовуйте `\"rgb_color\"` або `\"color_temp\"` у режимі сну. 🌙",
"sleep_rgb_color": "Колір RGB у режимі сну (використовується, коли `sleep_rgb_or_color_temp` має значення \"rgb_color\"). 🌈",
"sleep_transition": "Тривалість переходу, коли режим сну \"sleep mode\" увімкнено, у секундах. 😴",
"sunrise_time": "Встановіть фіксований час (ГГ:ХХ:СС) для сходу сонця. 🌅",
"min_sunrise_time": "Встановіть найраніший час віртуального сходу сонця (ГГ:ХХ:СС), враховуючи пізніші сходи. 🌅",
"max_sunrise_time": "Встановіть найпізніший час віртуального сходу сонця (ГГ:ХХ:СС), враховуючи більш ранні сходи сонця. 🌅",
"sunrise_offset": "Змінити час сходу сонця на +/- секунд. ⏰",
"sunset_time": "Встановіть фіксований час (ГГ:ХХ:СС) для заходу сонця. 🌇",
"min_sunset_time": "Встановіть найраніший час віртуального заходу сонця (ГГ:ХХ:СС), враховуючи пізніші заходи сонця. 🌇",
"max_sunset_time": "Встановіть найновіший час віртуального заходу сонця (ГГ:ХХ:СС), враховуючи більш ранні заходи сонця. 🌇",
"sunset_offset": "Змінити час заходу сонця на +/- секунд. ⏰",
"brightness_mode": "Режим яскравості для використання. Можливі значення: default (стандартний) , linear (лінійний) та tanh (гіперболічний тангенс) (використовує значення brightness_mode_time_dark та brightness_mode_time_light).",
"brightness_mode_time_dark": "(Ігнорується, якщо `brightness_mode='default'`) Тривалість у секундах для збільшення/зменшення яскравості до/після сходу/заходу сонця. 📈📉",
"brightness_mode_time_light": "(Ігнорується, якщо brightness_mode='default') Тривалість у секундах для збільшення/зменшення яскравості після/до сходу/заходу сонця. 📈📉.",
"take_over_control_mode": "Режим призупинення адаптації, коли інші джерела змінюють яскравість та/або колір світла. `pause_all` завжди призупиняє адаптацію як яскравості, так і кольору. `pause_changed` призупиняє адаптацію лише змінених атрибутів та продовжує адаптацію незмінних атрибутів, наприклад, продовжує адаптацію кольору, коли змінювалася лише яскравість.",
"autoreset_control_seconds": "Самочинно скидати ручне керування після кількох секунд. Встановіть 0, щоб вимкнути.",
"send_split_delay": "Затримка (мс) між `separate_turn_on_commands` (окремі команди увімкнення) для світла, що не підтримує одночасне налаштування яскравості та кольору. ⏲️",
"adapt_delay": "Час очікування (секунди) між увімкненням світла та застосуванням змін системою адаптивного освітлення. Може допомогти уникнути мерехтіння. ⏲️"
}
}
} }
} }
}, },
@ -46,5 +92,142 @@
"option_error": "Хибна опція", "option_error": "Хибна опція",
"entity_missing": "Вибраного світла в домашньому помічнику не знайшли" "entity_missing": "Вибраного світла в домашньому помічнику не знайшли"
} }
},
"services": {
"apply": {
"description": "Застосовує поточні налаштування Адаптивного освітлення до світильників.",
"fields": {
"lights": {
"description": "Світильник (або список світильників), до яких буде застосовано налаштування. 💡"
},
"transition": {
"description": "Тривалість переходу, коли світло змінюється, у секундах. 🕑"
},
"entity_id": {
"description": "`entity_id` перемикача з налаштуваннями, які потрібно застосувати. 📝"
},
"adapt_brightness": {
"description": "Чи потрібно адаптувати яскравість світла. 🌞"
},
"adapt_color": {
"description": "Чи адаптувати колір допоміжних ламп. 🌈"
},
"prefer_rgb_color": {
"description": "Чи надавати перевагу налаштуванню кольору RGB над температурою кольору світла, коли це можливо. 🌈"
},
"turn_on_lights": {
"description": "Чи вмикати світло, яке наразі вимкнене. 🔆"
}
}
},
"change_switch_settings": {
"fields": {
"sunrise_offset": {
"description": "Змінити час сходу сонця на +/- секунд. ⏰"
},
"sunset_offset": {
"description": "Змінити час заходу сонця на +/- секунд. ⏰"
},
"autoreset_control_seconds": {
"description": "Самочинно скидати ручне керування після кількох секунд. Встановіть 0, щоб вимкнути."
},
"only_once": {
"description": "Приладжувати освітлення тільки тоді, коли воно ввімкнено (`true`) чи продовжувати завжди (`false`). 🔄"
},
"sleep_brightness": {
"description": "Відсоток яскравості світла в режимі сну. 😴"
},
"take_over_control": {
"description": "Вимкнути Адаптивне освітлення, якщо інше джерело викликає `light.turn_on`, коли світло увімкнене та адаптується. Зауважте, що це викликає `homeassistant.update_entity` щокожного заданого інтервалу `interval`! 🔒"
},
"entity_id": {
"description": "Ідентифікатор (ID) перемикача. 📝"
},
"initial_transition": {
"description": "Тривалість першого переходу, коли світло перемикається зі стану вимкнено `off` на увімкнено `on`, у секундах. ⏲️"
},
"sleep_transition": {
"description": "Тривалість переходу, коли режим сну \"sleep mode\" увімкнено, у секундах. 😴"
},
"max_color_temp": {
"description": "Найхолодніша колірна температура в Кельвінах. ❄️"
},
"max_brightness": {
"description": "Максимальний відсоток яскравості. 💡"
},
"min_brightness": {
"description": "Мінімальний відсоток яскравості. 💡"
},
"send_split_delay": {
"description": "Затримка (мс) між `separate_turn_on_commands` (окремі команди увімкнення) для світла, що не підтримує одночасне налаштування яскравості та кольору. ⏲️"
},
"sleep_color_temp": {
"description": "Колірна температура в режимі сну (використовується, коли `sleep_rgb_or_color_temp` має значення `color_temp`) в Кельвінах. 😴"
},
"detect_non_ha_changes": {
"description": "Виявляє та припиняє адаптації для змін стану, що не є `light.turn_on`. Потребує увімкнення `take_over_control`. 🕵️ Обережно: ⚠️ Деякі лампи можуть хибно вказувати на стан \"увімкнено\", що може призвести до неочікуваного ввімкнення ламп. Вимкніть цю функцію, якщо ви зіткнетеся з такими проблемами."
},
"transition": {
"description": "Тривалість переходу, коли світло змінюється, у секундах. 🕑"
},
"sleep_rgb_color": {
"description": "Колір RGB у режимі сну (використовується, коли `sleep_rgb_or_color_temp` має значення \"rgb_color\"). 🌈"
},
"sunrise_time": {
"description": "Встановіть фіксований час (ГГ:ХХ:СС) для сходу сонця. 🌅"
},
"sunset_time": {
"description": "Встановіть фіксований час (ГГ:ХХ:СС) для заходу сонця. 🌇"
},
"use_defaults": {
"description": "Встановлює значення за замовчуванням, не вказані в цьому виклику служби. Параметри: «current» (за замовчуванням, зберігає поточні значення), «factory» (скидає до задокументованих значень за замовчуванням) або «configuration» (повертає до значень за замовчуванням конфігурації комутатора). ⚙️"
},
"min_sunset_time": {
"description": "Встановіть найраніший час віртуального заходу сонця (ГГ:ХХ:СС), враховуючи пізніші заходи сонця. 🌇"
},
"max_sunrise_time": {
"description": "Встановіть найпізніший час віртуального сходу сонця (ГГ:ХХ:СС), враховуючи більш ранні сходи сонця. 🌅"
},
"include_config_in_attributes": {
"description": "Показувати всі опції як атрибути перемикача в Домашньому помічнику, якщо встановлено значення `true`. 📝"
},
"sleep_rgb_or_color_temp": {
"description": "Використовуйте `\"rgb_color\"` або `\"color_temp\"` у режимі сну. 🌙"
},
"separate_turn_on_commands": {
"description": "Використовуйте окремі виклики `light.turn_on` для кольору та яскравості, що необхідно для деяких типів освітлення. 🔀"
},
"adapt_delay": {
"description": "Час очікування (секунди) між увімкненням світла та застосуванням змін системою адаптивного освітлення. Може допомогти уникнути мерехтіння. ⏲️"
},
"min_color_temp": {
"description": "Найтепліша колірна температура в Кельвінах. 🔥"
},
"prefer_rgb_color": {
"description": "Чи надавати перевагу налаштуванню кольору RGB над температурою кольору світла, коли це можливо. 🌈"
},
"turn_on_lights": {
"description": "Чи вмикати світло, яке наразі вимкнене. 🔆"
},
"take_over_control_mode": {
"description": "Режим призупинення адаптації, коли інші джерела змінюють яскравість та/або колір світла. `pause_all` завжди призупиняє адаптацію як яскравості, так і кольору. `pause_changed` призупиняє адаптацію лише змінених атрибутів та продовжує адаптацію незмінних атрибутів, наприклад, продовжує адаптацію кольору, коли змінювалася лише яскравість."
}
},
"description": "Змініть будь-які налаштування, які ви бажаєте, у цьому перемикачі. Усі опції тут такі ж, як і в поточному конфігураційному файлі."
},
"set_manual_control": {
"description": "Позначте, чи світло \"керується вручну\".",
"fields": {
"lights": {
"description": "Ідентифікатор(и) світла (entity_id(s) of lights). Якщо не вказано, вибираються всі лампи у перемикачі. 💡"
},
"entity_id": {
"description": "`entity_id` перемикача, в якому потрібно (зняти) позначку світла як `керованого вручну`. 📝"
},
"manual_control": {
"description": "Додавати (\"true\") чи видаляти (\"false\") світло зі списку \"manual_control\". 🔒"
}
}
}
} }
} }

View file

@ -0,0 +1,210 @@
{
"services": {
"change_switch_settings": {
"fields": {
"sleep_brightness": {
"description": "نیند کے موڈ میں روشنی کی چمک کا فیصد. 😴"
},
"detect_non_ha_changes": {
"description": "غیر light.turn_on ریاست کی تبدیلیوں کے لئے موافقت کا پتہ لگاتا ہے اور روکتا ہے۔ 'take_over_control' کو فعال کرنے کی ضرورت ہے۔ 🕵️ احتیاط: ⚠️ کچھ لائٹس غلط طور پر 'آن' حالت کی نشاندہی کر سکتی ہیں ، جس کے نتیجے میں لائٹس غیر متوقع طور پر آن ہوسکتی ہیں۔ اگر آپ کو اس طرح کے مسائل کا سامنا کرنا پڑتا ہے تو اس خصوصیت کو غیر فعال کریں۔"
},
"sunrise_offset": {
"description": "طلوع آفتاب کے وقت کو سیکنڈوں میں مثبت یا منفی آفسیٹ کے ساتھ ایڈجسٹ کریں۔ ⏰"
},
"max_sunrise_time": {
"description": "تازہ ترین مجازی طلوع آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) سیٹ کریں ، جس سے قبل طلوع آفتاب کی اجازت ملتی ہے۔ 🌅"
},
"sleep_color_temp": {
"description": "کیلون میں نیند کے موڈ میں رنگ کا درجہ حرارت (جب 'sleep_rgb_or_color_temp' 'color_temp' ہوتا ہے) میں استعمال ہوتا ہے۔ 😴"
},
"min_brightness": {
"description": "کم سے کم چمک کا فیصد. 💡"
},
"min_color_temp": {
"description": "کیلون میں گرم ترین رنگ کا درجہ حرارت. 🔥"
},
"sleep_rgb_or_color_temp": {
"description": "نیند کے موڈ میں \"rgb_color\" یا \"color_temp\" کا استعمال کریں۔ 🌙"
},
"turn_on_lights": {
"description": "کیا ان لائٹس کو آن کرنا ہے جو فی الحال بند ہیں۔ 🔆"
},
"initial_transition": {
"description": "پہلی منتقلی کا دورانیہ جب لائٹس سیکنڈوں میں 'بند' سے 'آن' میں تبدیل ہوجاتی ہیں۔ ⏲️"
},
"entity_id": {
"description": "سوئچ کی اینٹیٹی آئی ڈی۔ 📝"
},
"sunrise_time": {
"description": "طلوع آفتاب کے لئے ایک مقررہ وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں۔ 🌅"
},
"include_config_in_attributes": {
"description": "'سچ' پر سیٹ ہونے پر ہوم اسسٹنٹ میں سوئچ پر تمام اختیارات بطور خصوصیات دکھائیں۔ 📝"
},
"max_brightness": {
"description": "زیادہ سے زیادہ چمک کا فیصد. 💡"
},
"sleep_rgb_color": {
"description": "نیند کے موڈ میں آر جی بی رنگ (جب 'sleep_rgb_or_color_temp' \"rgb_color\" ہوتا ہے تو استعمال کیا جاتا ہے). 🌈"
},
"take_over_control": {
"description": "اگر کوئی دوسرا ذریعہ 'light.turn_on' کا نام دیتا ہے تو ایڈاپٹو لائٹنگ کو غیر فعال کریں جب لائٹس آن ہیں اور اسے اپنایا جارہا ہے۔ نوٹ کریں کہ یہ ہر 'وقفے' کو 'homeassistant.update_entity' کہتا ہے! 🔒"
},
"sleep_transition": {
"description": "منتقلی کا دورانیہ جب \"نیند کا موڈ\" سیکنڈوں میں طے کیا جاتا ہے۔ 😴"
},
"autoreset_control_seconds": {
"description": "کئی سیکنڈ کے بعد دستی کنٹرول کو خود بخود ری سیٹ کریں۔ غیر فعال کرنے کے لئے 0 پر سیٹ کریں۔ ⏲️"
},
"adapt_delay": {
"description": "لائٹ آن ہونے اور ایڈاپٹو لائٹنگ کے درمیان انتظار کا وقت (سیکنڈ) تبدیلیاں لاگو کرتا ہے۔ جھلکنے سے بچنے میں مدد مل سکتی ہے۔ ⏲️"
},
"only_once": {
"description": "روشنیوں کو صرف اس وقت ڈھالیں جب وہ آن ہوں (`سچ`) یا انہیں ڈھالتے رہیں (`غلط`)۔ 🔄"
},
"use_defaults": {
"description": "اس سروس کال میں متعین نہ ہونے والی ڈیفالٹ اقدار سیٹ کرتا ہے۔ اختیارات: \"موجودہ\" (ڈیفالٹ، موجودہ اقدار کو برقرار رکھتا ہے)، \"فیکٹری\" (دستاویزی ڈیفالٹ میں ری سیٹ) ، یا \"کنفیگریشن\" (سوئچ کنفگ ڈیفالٹس پر واپس آجاتا ہے)۔ ⚙️"
},
"separate_turn_on_commands": {
"description": "رنگ اور چمک کے لئے علیحدہ 'light.turn_on' کا استعمال کریں ، جو کچھ روشنی کی اقسام کے لئے ضروری ہے۔ 🔀"
},
"prefer_rgb_color": {
"description": "جب ممکن ہو تو روشنی کے رنگ کے درجہ حرارت پر آر جی بی رنگ ایڈجسٹمنٹ کو ترجیح دیں یا نہیں۔ 🌈"
},
"max_color_temp": {
"description": "کیلون میں سرد ترین رنگ کا درجہ حرارت. ❄️"
},
"sunset_offset": {
"description": "غروب آفتاب کے وقت کو سیکنڈوں میں مثبت یا منفی آفسیٹ کے ساتھ ایڈجسٹ کریں۔ ⏰"
},
"send_split_delay": {
"description": "ان روشنیوں کے لئے 'separate_turn_on_commands' کے درمیان تاخیر (ایم ایس) جو بیک وقت چمک اور رنگ کی ترتیب کی حمایت نہیں کرتی ہیں۔ ⏲️"
},
"sunset_time": {
"description": "غروب آفتاب کے لئے ایک مقررہ وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں۔ 🌇"
},
"transition": {
"description": "جب روشنیاں تبدیل ہوتی ہیں تو منتقلی کا دورانیہ ، سیکنڈوں میں۔ 🕑"
},
"min_sunset_time": {
"description": "سب سے پہلے مجازی غروب آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں ، جس سے بعد میں غروب آفتاب کی اجازت ملتی ہے۔ 🌇"
}
},
"description": "سوئچ میں آپ جو بھی ترتیبات چاہتے ہیں اسے تبدیل کریں۔ یہاں تمام اختیارات وہی ہیں جو کنفگ بہاؤ میں ہیں۔"
},
"apply": {
"fields": {
"entity_id": {
"description": "لاگو کرنے کے لئے ترتیبات کے ساتھ سوئچ کا 'entity_id'۔ 📝"
},
"adapt_brightness": {
"description": "کیا روشنی کی چمک کو ڈھالنا ہے۔ 🌞"
},
"turn_on_lights": {
"description": "کیا ان لائٹس کو آن کرنا ہے جو فی الحال بند ہیں۔ 🔆"
},
"adapt_color": {
"description": "کیا معاون لائٹس پر رنگ کو ڈھالنا ہے۔ 🌈"
},
"prefer_rgb_color": {
"description": "جب ممکن ہو تو روشنی کے رنگ کے درجہ حرارت پر آر جی بی رنگ ایڈجسٹمنٹ کو ترجیح دیں یا نہیں۔ 🌈"
},
"lights": {
"description": "ترتیبات کو لاگو کرنے کے لیے روشنی (یا لائٹس کی فہرست)۔ 💡"
},
"transition": {
"description": "جب روشنیاں تبدیل ہوتی ہیں تو منتقلی کا دورانیہ ، سیکنڈوں میں۔ 🕑"
}
},
"description": "روشنیوں پر موجودہ مطابقت پذیر روشنی کی ترتیبات کا اطلاق ہوتا ہے۔"
},
"set_manual_control": {
"fields": {
"manual_control": {
"description": "کیا روشنی کو \"manual_control\" کی فہرست سے شامل کرنا ہے (\"سچ\") یا (\"غلط\") ہٹانا ہے۔ 🔒"
},
"entity_id": {
"description": "سوئچ کا 'entity_id' جس میں روشنی کو 'دستی طور پر کنٹرول' کے طور پر نشان زد کرنا ہے۔ 📝"
},
"lights": {
"description": "لائٹس کے entity_id ، اگر واضح نہیں ہیں تو ، سوئچ میں موجود تمام لائٹس منتخب کی جاتی ہیں۔ 💡"
}
},
"description": "نشان لگائیں کہ آیا روشنی کو 'دستی طور پر کنٹرول' کیا جاتا ہے۔"
}
},
"options": {
"step": {
"init": {
"data_description": {
"interval": "روشنیوں کو سیکنڈوں میں ڈھالنے کی فریکوئنسی۔ 🔄",
"transition": "جب روشنیاں تبدیل ہوتی ہیں تو منتقلی کا دورانیہ ، سیکنڈوں میں۔ 🕑",
"sleep_brightness": "نیند کے موڈ میں روشنی کی چمک کا فیصد. 😴",
"sleep_color_temp": "کیلون میں نیند کے موڈ میں رنگ کا درجہ حرارت (جب 'sleep_rgb_or_color_temp' 'color_temp' ہوتا ہے) میں استعمال ہوتا ہے۔ 😴"
},
"data": {
"lights": "لائٹس: کنٹرول کی جانے والی روشنی کے entity_ids کی فہرست (خالی ہوسکتی ہے). 🌟",
"min_brightness": "min_brightness: کم سے کم چمک کا فیصد. 💡",
"max_brightness": "max_brightness: زیادہ سے زیادہ چمک کا فیصد. 💡",
"min_color_temp": "min_color_temp: کیلون میں گرم ترین رنگ کا درجہ حرارت. 🔥",
"max_color_temp": "max_color_temp: کیلون میں سرد ترین رنگ کا درجہ حرارت۔ ❄️"
},
"title": "مطابقت پذیر روشنی کے اختیارات",
"description": "ایک مطابقت پذیر لائٹنگ جزو تشکیل دیں۔ آپشن کے نام YAML کی ترتیبات کے ساتھ مطابقت رکھتے ہیں۔ اگر آپ نے YAML میں اس اندراج کی وضاحت کی ہے تو ، یہاں کوئی آپشن ظاہر نہیں ہوگا۔ انٹرایکٹو گراف کے لئے جو پیرامیٹر کے اثرات کو ظاہر کرتے ہیں ، ملاحظہ کریں [اس ویب ایپ]({webapp_url})۔ مزید تفصیلات کے لئے ، [سرکاری دستاویزات]({docs_url}) ملاحظہ کریں۔",
"sections": {
"advanced": {
"data": {
"prefer_rgb_color": "prefer_rgb_color: جب ممکن ہو تو روشنی کے رنگ کے درجہ حرارت پر آر جی بی رنگ ایڈجسٹمنٹ کو ترجیح دیں یا نہیں۔ 🌈",
"transition_until_sleep": "transition_until_sleep: جب فعال کیا جاتا ہے تو ، ایڈاپٹو لائٹنگ نیند کی ترتیبات کو کم سے کم تصور کرے گی ، غروب آفتاب کے بعد ان اقدار میں منتقل ہوگی۔ 🌙",
"take_over_control": "take_over_control: اگر کوئی دوسرا ذریعہ 'light.turn_on' کا نام دیتا ہے تو ایڈاپٹو لائٹنگ کو غیر فعال کریں جب لائٹس آن ہیں اور اسے اپنایا جارہا ہے۔ نوٹ کریں کہ یہ ہر 'وقفے' کو 'homeassistant.update_entity' کہتا ہے! 🔒",
"detect_non_ha_changes": "detect_non_ha_changes: غیر light.turn_on ریاست کی تبدیلیوں کے لئے موافقت کا پتہ لگاتا ہے اور روکتا ہے۔ 'take_over_control' کو فعال کرنے کی ضرورت ہے۔ 🕵️ احتیاط: ⚠️ کچھ لائٹس غلط طور پر 'آن' حالت کی نشاندہی کر سکتی ہیں ، جس کے نتیجے میں لائٹس غیر متوقع طور پر آن ہوسکتی ہیں۔ اگر آپ کو اس طرح کے مسائل کا سامنا کرنا پڑتا ہے تو اس خصوصیت کو غیر فعال کریں۔",
"only_once": "only_once: لائٹس کو صرف اس وقت ڈھالیں جب وہ آن ہوں ('سچ') یا انہیں اپناتے رہیں ('جھوٹ')۔ 🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: شروع میں لائٹس آن کرتے وقت۔ اگر 'true' پر سیٹ کیا جاتا ہے، AL صرف اس صورت میں موافق ہوتا ہے جب رنگ یا چمک کی وضاحت کیے بغیر 'light.turn_on' کو مدعو کیا جاتا ہے۔ ❌🌈 یہ مثال کے طور پر، کسی منظر کو چالو کرتے وقت موافقت کو روکتا ہے۔ اگر 'غلط'، AL ابتدائی `سروس_ڈیٹا` میں رنگ یا چمک کی موجودگی سے قطع نظر موافقت کرتا ہے۔ 'ٹیک_اوور_کنٹرول' کو فعال کرنے کی ضرورت ہے۔ 🕵️ ",
"separate_turn_on_commands": "separate_turn_on_commands: رنگ اور چمک کے لئے الگ الگ 'light.turn_on' کا استعمال کریں، جو کچھ روشنی کی اقسام کے لئے ضروری ہے. 🔀",
"skip_redundant_commands": "skip_redundant_commands: موافقت کے احکامات بھیجنے سے گریز کریں جن کی ہدف کی حالت پہلے سے ہی روشنی کی معلوم حالت کے برابر ہے۔ نیٹ ورک ٹریفک کو کم سے کم کرتا ہے اور کچھ حالات میں موافقت کی ذمہ داری کو بہتر بناتا ہے۔ 📉اگر جسمانی روشنی کی حالت یں ایچ اے کی ریکارڈ شدہ حالت کے ساتھ مطابقت سے باہر ہوجاتی ہیں تو غیر فعال کریں۔",
"intercept": "انٹرسیپٹ: 'light.turn_on' کالز کو فوری طور پر رنگ اور چمک کے مطابقت پذیری کو قابل بنانے کے لئے روکیں اور اپنائیں۔ 🏎️ ایسی روشنیوں کو غیر فعال کریں جو رنگ اور چمک کے ساتھ 'light.turn_on' کی حمایت نہیں کرتی ہیں۔",
"multi_light_intercept": "multi_light_intercept: 'light.turn_on' کالز کو روکیں اور ان کے مطابق ڈھالیں جو متعدد روشنیوں کو نشانہ بناتی ہیں۔ ➗⚠️ اس کے نتیجے میں ایک ہی 'light.turn_on' کال کو متعدد کالز میں تقسیم کیا جاسکتا ہے ، مثال کے طور پر ، جب لائٹس مختلف سوئچوں میں ہوتی ہیں۔ 'انٹرسیپٹ' کو فعال کرنے کی ضرورت ہے۔",
"include_config_in_attributes": "include_config_in_attributes: 'سچ' پر سیٹ ہونے پر ہوم اسسٹنٹ میں سوئچ پر خصوصیات کے طور پر تمام اختیارات دکھائیں۔ 📝"
},
"data_description": {
"initial_transition": "پہلی منتقلی کا دورانیہ جب لائٹس سیکنڈوں میں 'بند' سے 'آن' میں تبدیل ہوجاتی ہیں۔ ⏲️",
"sleep_rgb_or_color_temp": "نیند کے موڈ میں \"rgb_color\" یا \"color_temp\" کا استعمال کریں۔ 🌙",
"sleep_rgb_color": "نیند کے موڈ میں آر جی بی رنگ (جب 'sleep_rgb_or_color_temp' \"rgb_color\" ہوتا ہے تو استعمال کیا جاتا ہے). 🌈",
"sleep_transition": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
"sunrise_time": "طلوع آفتاب کے لئے ایک مقررہ وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں۔ 🌅",
"min_sunrise_time": "ابتدائی مجازی طلوع آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں ، جس سے بعد میں طلوع آفتاب کی اجازت ملتی ہے۔ 🌅",
"max_sunrise_time": "تازہ ترین مجازی طلوع آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) سیٹ کریں ، جس سے قبل طلوع آفتاب کی اجازت ملتی ہے۔ 🌅",
"sunrise_offset": "طلوع آفتاب کے وقت کو سیکنڈوں میں مثبت یا منفی آفسیٹ کے ساتھ ایڈجسٹ کریں۔ ⏰",
"sunset_time": "غروب آفتاب کے لئے ایک مقررہ وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں۔ 🌇",
"min_sunset_time": "سب سے پہلے مجازی غروب آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) مقرر کریں ، جس سے بعد میں غروب آفتاب کی اجازت ملتی ہے۔ 🌇",
"max_sunset_time": "تازہ ترین مجازی غروب آفتاب کا وقت (ایچ ایچ: ایم ایم: ایس ایس) سیٹ کریں ، جس سے قبل غروب آفتاب کی اجازت ملتی ہے۔ 🌇",
"sunset_offset": "غروب آفتاب کے وقت کو سیکنڈوں میں مثبت یا منفی آفسیٹ کے ساتھ ایڈجسٹ کریں۔ ⏰",
"brightness_mode": "استعمال کرنے کے لئے چمک کا موڈ۔ ممکنہ قدریں 'ڈیفالٹ'، 'لکیری' اور 'تن' ہیں ('brightness_mode_time_dark' اور 'brightness_mode_time_light' کا استعمال کرتی ہیں)۔ 📈",
"brightness_mode_time_dark": "(اگر 'brightness_mode='ڈیفالٹ') سورج طلوع ہونے سے پہلے / غروب آفتاب سے پہلے / بعد میں چمک کو بڑھانے کے لئے سیکنڈ میں دورانیہ۔ 📈📉",
"brightness_mode_time_light": "(اگر 'brightness_mode='ڈیفالٹ') سورج طلوع ہونے کے بعد / اس سے پہلے / غروب آفتاب سے پہلے چمک کو بڑھانے کے لئے سیکنڈوں میں دورانیہ۔ 📈📉.",
"autoreset_control_seconds": "کئی سیکنڈ کے بعد دستی کنٹرول کو خود بخود ری سیٹ کریں۔ غیر فعال کرنے کے لئے 0 پر سیٹ کریں۔ ⏲️",
"send_split_delay": "ان روشنیوں کے لئے 'separate_turn_on_commands' کے درمیان تاخیر (ایم ایس) جو بیک وقت چمک اور رنگ کی ترتیب کی حمایت نہیں کرتی ہیں۔ ⏲️",
"adapt_delay": "لائٹ آن ہونے اور ایڈاپٹو لائٹنگ کے درمیان انتظار کا وقت (سیکنڈ) تبدیلیاں لاگو کرتا ہے۔ جھلکنے سے بچنے میں مدد مل سکتی ہے۔ ⏲️"
}
}
}
}
},
"error": {
"option_error": "غیر قانونی آپشن",
"entity_missing": "ہوم اسسٹنٹ سے ایک یا ایک سے زیادہ منتخب لائٹ ادارے غائب ہیں"
}
},
"title": "مطابقت پذیر روشنی",
"config": {
"step": {
"user": {
"description": "ہر مثال میں متعدد روشنیاں ہوسکتی ہیں!",
"title": "ایڈاپٹو لائٹنگ مثال کے لئے ایک نام منتخب کریں"
}
},
"abort": {
"already_configured": "یہ آلہ پہلے ہی تشکیل دیا گیا ہے"
}
}
}

View file

@ -0,0 +1,277 @@
{
"title": "自适应照明",
"config": {
"step": {
"user": {
"title": "为自适应照明实例选择一个名称",
"description": "每个实例可以包含多个灯光!",
"data": {
"name": "名称"
}
}
},
"abort": {
"already_configured": "此设备已配置"
}
},
"options": {
"step": {
"init": {
"title": "自适应照明选项",
"description": "配置自适应照明组件。选项名称与YAML设置对齐。如果在YAML中定义了此条目则此处不会显示任何选项。有关演示参数影响的交互式图表请访问[此Web应用程序]({webapp_url})。有关更多详细信息,请参阅[官方文档]({docs_url})。",
"data": {
"lights": "lights要控制的灯光实体ID列表可以为空。🌟",
"interval": "频率(interval)",
"transition": "过渡(transition)",
"min_brightness": "min_brightness最小亮度百分比。💡",
"max_brightness": "max_brightness最大亮度百分比。💡",
"min_color_temp": "min_color_temp最暖的色温以开尔文为单位。🔥",
"max_color_temp": "max_color_temp最冷的色温以开尔文为单位。❄",
"sleep_brightness": "睡眠模式亮度(sleep_brightness)",
"sleep_color_temp": "睡眠模式中的色温(sleep_color_temp)"
},
"data_description": {
"interval": "调整灯光的频率,以秒为单位。🔄",
"transition": "灯光变化时的过渡持续时间,以秒为单位。🕑",
"sleep_brightness": "睡眠模式中的亮度百分比。😴",
"sleep_color_temp": "睡眠模式中的色温(当`sleep_rgb_or_color_temp`为`color_temp`时使用),以开尔文为单位。😴"
},
"sections": {
"advanced": {
"data": {
"initial_transition": "初始过渡(initial_transition)",
"prefer_rgb_color": "prefer_rgb_color在可能时是否优先使用RGB颜色调整而不是灯光色温。🌈",
"sleep_rgb_or_color_temp": "睡眠模式RGB或色温(sleep_rgb_or_color_temp)",
"sleep_rgb_color": "睡眠模式中的RGB颜色(sleep_rgb_color)",
"sleep_transition": "睡眠模式过渡时间(sleep_transition)",
"transition_until_sleep": "transition_until_sleep启用时自适应照明将将睡眠设置视为最小值在日落后过渡到这些值。🌙",
"sunrise_time": "日出时间(sunrise_time)",
"min_sunrise_time": "最早日出时间(min_sunrise_time)",
"max_sunrise_time": "最晚日出时间(max_sunrise_time)",
"sunrise_offset": "日出时间偏移(sunrise_offset)",
"sunset_time": "日落时间(sunset_time)",
"min_sunset_time": "最早日落时间(min_sunset_time)",
"max_sunset_time": "最晚日落时间(max_sunset_time)",
"sunset_offset": "日落时间偏移(sunset_offset)",
"brightness_mode": "亮度模式(brightness_mode)",
"brightness_mode_time_dark": "变暗时间(brightness_mode_time_dark)",
"brightness_mode_time_light": "变亮时间(brightness_mode_time_light)",
"take_over_control": "take_over_control: 如果在灯光处于开启并处于适应照明的状态时,另一个来源调用`light.turn_on`,则禁用自适应照明。请注意,这会在每个`interval`调用`homeassistant.update_entity`!🔒",
"detect_non_ha_changes": "detect_non_ha_changes: 检测非`light.turn_on`的状态更改,并停止自适应照明。需要启用`take_over_control`。🕵️ 注意:⚠️ 一些灯光可能错误地显示为“开启”状态,这可能会导致灯光意外打开。如果遇到此类问题,请禁用此功能。",
"autoreset_control_seconds": "自动重置时间(autoreset_control_seconds)",
"only_once": "only_once仅在打开时调整灯光`true`)或始终调整灯光(`false`)。🔄",
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on当首次打开灯光时。如果设置为`true`仅在没有指定颜色或亮度的情况下AL才进行适应。❌🌈 例如,这可以防止在激活场景时进行适应。如果为`false`,则不考虑初始`service_data`中是否存在颜色或亮度AL都会适应。需要启用`take_over_control`。🕵️",
"separate_turn_on_commands": "separate_turn_on_commands为某些灯光类型需要使用单独的`light.turn_on`调用来设置颜色和亮度。🔀",
"send_split_delay": "指令发送间隔延迟(send_split_delay)",
"adapt_delay": "自适应照明延迟(adapt_delay)",
"skip_redundant_commands": "skip_redundant_commands跳过目标状态已经等于灯光已知状态的自适应命令。在某些情况下可以减少网络流量并提高适应响应性。📉如果物理灯光状态与HA的记录状态不同步请禁用此功能。",
"intercept": "intercept拦截并适应`light.turn_on`调用,以实现即时的颜色和亮度适应。🏎️ 对于不支持使用颜色和亮度进行`light.turn_on`的灯光,禁用此功能。",
"multi_light_intercept": "multi_light_intercept拦截和适应针对多个灯光的`light.turn_on`调用。➗⚠️ 这可能会将单个`light.turn_on`调用拆分为多个调用,例如当灯光位于不同的开关中时。需要启用`intercept`。",
"include_config_in_attributes": "include_config_in_attributes在Home Assistant中将所有选项显示为开关的属性时设置为`true`。📝"
},
"data_description": {
"initial_transition": "灯光从“关闭”到“开启”时的第一个过渡持续时间,以秒为单位。⏲️",
"sleep_rgb_or_color_temp": "在睡眠模式中使用“rgb_color”或“color_temp”。🌙",
"sleep_rgb_color": "睡眠模式中的RGB颜色当`sleep_rgb_or_color_temp`为“rgb_color”时使用。🌈",
"sleep_transition": "切换“睡眠模式”时的过渡持续时间,以秒为单位。😴",
"sunrise_time": "设置固定的日出时间HH:MM:SS。🌅",
"min_sunrise_time": "设置最早的虚拟日出时间HH:MM:SS允许更晚的日出。🌅",
"max_sunrise_time": "设置最晚的虚拟日出时间HH:MM:SS允许更早的日出。🌅",
"sunrise_offset": "以秒为单位的正负偏移调整日出时间。⏰",
"sunset_time": "设置固定的日落时间HH:MM:SS。🌇",
"min_sunset_time": "设置最早的虚拟日落时间HH:MM:SS允许更晚的日落。🌇",
"max_sunset_time": "设置最晚的虚拟日落时间HH:MM:SS允许更早的日落。🌇",
"sunset_offset": "以秒为单位的正负偏移调整日落时间。⏰",
"brightness_mode": "要使用的亮度模式。可能的值为`default`、`linear`和`tanh`(使用`brightness_mode_time_dark`和`brightness_mode_time_light`)。📈",
"brightness_mode_time_dark": "(如果`brightness_mode='default'`将被忽略)日出/日落之前/之后亮度逐渐增加/减少的持续时间,以秒为单位。📈📉",
"brightness_mode_time_light": "(如果`brightness_mode='default'`将被忽略)日出/日落之后/之前亮度逐渐增加/减少的持续时间,以秒为单位。📈📉。",
"autoreset_control_seconds": "在若干秒后自动重置手动控制。设置为0以禁用。⏲",
"send_split_delay": "对于不支持同时设置亮度和颜色的灯光,`separate_turn_on_commands`之间的延迟时间(毫秒)。⏲️",
"adapt_delay": "灯光打开和自适应照明应用更改之间的等待时间(秒)。可能有助于避免闪烁。⏲️"
}
}
}
}
},
"error": {
"option_error": "无效的选项",
"entity_missing": "一个或多个选择的灯光实体在Home Assistant中不存在"
}
},
"services": {
"apply": {
"name": "应用",
"description": "将当前自适应照明设置应用于灯光。",
"fields": {
"entity_id": {
"description": "具有要应用设置的开关的`entity_id`。📝",
"name": "entity_id"
},
"lights": {
"description": "要应用设置的灯光(或灯光列表)。💡",
"name": "lights"
},
"transition": {
"description": "灯光变化时的过渡持续时间,以秒为单位。🕑",
"name": "transition"
},
"adapt_brightness": {
"description": "是否调整灯光的亮度。🌞",
"name": "adapt_brightness"
},
"adapt_color": {
"description": "是否在支持的灯光上调整颜色。🌈",
"name": "adapt_color"
},
"prefer_rgb_color": {
"description": "在可能时是否优先使用RGB颜色调整而不是灯光色温。🌈",
"name": "prefer_rgb_color"
},
"turn_on_lights": {
"description": "是否打开当前关闭的灯光。🔆",
"name": "turn_on_lights"
}
}
},
"set_manual_control": {
"name": "设置手动控制",
"description": "标记灯光是否为'手动控制'。",
"fields": {
"entity_id": {
"description": "要在其中(取消)标记灯光为“手动控制”的开关的`entity_id`。📝",
"name": "entity_id"
},
"lights": {
"description": "如果未指定则为灯光的entity_ids如果未指定则选择开关中的所有灯光。💡",
"name": "lights"
},
"manual_control": {
"description": "是否将灯光从“手动控制”列表中添加“true”或删除“false”。🔒",
"name": "manual_control"
}
}
},
"change_switch_settings": {
"name": "更改开关设置",
"description": "在开关中更改您想要的任何设置。此处的所有选项与配置流中的选项相同。",
"fields": {
"entity_id": {
"description": "开关的实体ID。📝",
"name": "entity_id"
},
"use_defaults": {
"description": "设置未在此服务调用中指定的默认值。选项“current”默认值保留当前值、“factory”重置为文档默认值或“configuration”恢复到开关配置默认值。⚙",
"name": "use_defaults"
},
"include_config_in_attributes": {
"description": "在Home Assistant中将所有选项显示为开关的属性时设置为`true`。📝",
"name": "include_config_in_attributes"
},
"turn_on_lights": {
"description": "是否打开当前关闭的灯光。🔆",
"name": "turn_on_lights"
},
"initial_transition": {
"description": "灯光从“关闭”到“开启”时的第一个过渡持续时间,以秒为单位。⏲️",
"name": "initial_transition"
},
"sleep_transition": {
"description": "切换“睡眠模式”时的过渡持续时间,以秒为单位。😴",
"name": "sleep_transition"
},
"max_brightness": {
"description": "最大亮度百分比。💡",
"name": "max_brightness"
},
"max_color_temp": {
"description": "最低的色温,以开尔文为单位。❄️",
"name": "max_color_temp"
},
"min_brightness": {
"description": "最小亮度百分比。💡",
"name": "min_brightness"
},
"min_color_temp": {
"description": "最高的色温,以开尔文为单位。🔥",
"name": "min_color_temp"
},
"only_once": {
"description": "仅在打开时调整灯光(`true`)或始终调整灯光(`false`)。🔄",
"name": "only_once"
},
"prefer_rgb_color": {
"description": "在可能时是否优先使用RGB颜色调整而不是灯光色温。🌈",
"name": "prefer_rgb_color"
},
"separate_turn_on_commands": {
"description": "为某些灯光类型需要使用单独的`light.turn_on`调用来设置颜色和亮度。🔀",
"name": "separate_turn_on_commands"
},
"send_split_delay": {
"description": "对于不支持同时设置亮度和颜色的灯光,`separate_turn_on_commands`之间的延迟时间(毫秒)。⏲️",
"name": "send_split_delay"
},
"sleep_brightness": {
"description": "睡眠模式中的亮度百分比。😴",
"name": "sleep_brightness"
},
"sleep_rgb_or_color_temp": {
"description": "在睡眠模式中使用“rgb_color”或“color_temp”。🌙",
"name": "sleep_rgb_or_color_temp"
},
"sleep_rgb_color": {
"description": "睡眠模式中的RGB颜色当`sleep_rgb_or_color_temp`为“rgb_color”时使用。🌈",
"name": "sleep_rgb_color"
},
"sleep_color_temp": {
"description": "睡眠模式中的色温(当`sleep_rgb_or_color_temp`为`color_temp`时使用),以开尔文为单位。😴",
"name": "sleep_color_temp"
},
"sunrise_offset": {
"description": "以秒为单位的正负偏移调整日出时间。⏰",
"name": "sunrise_offset"
},
"sunrise_time": {
"description": "设置固定的日出时间HH:MM:SS。🌅",
"name": "sunrise_time"
},
"sunset_offset": {
"description": "以正负偏移秒调整日落时间。⏰",
"name": "sunset_offset"
},
"sunset_time": {
"description": "设置固定的日落时间HH:MM:SS。🌇",
"name": "sunset_time"
},
"max_sunrise_time": {
"description": "设置最晚的虚拟日出时间HH:MM:SS允许更早的日出。🌅",
"name": "max_sunrise_time"
},
"min_sunset_time": {
"description": "设置最早的虚拟日落时间HH:MM:SS允许更晚的日落。🌇",
"name": "min_sunset_time"
},
"take_over_control": {
"description": "如果其他来源在灯光处于打开和正在适应状态时调用`light.turn_on`,则禁用自适应照明。请注意,这会每个`interval`调用`homeassistant.update_entity`!🔒",
"name": "take_over_control"
},
"detect_non_ha_changes": {
"description": "检测并停止对非`light.turn_on`状态更改的适应。需要启用`take_over_control`。🕵️ 注意:⚠️ 一些灯光可能错误地显示为“开启”状态,这可能导致灯光意外打开。如果遇到此类问题,请禁用此功能。",
"name": "detect_non_ha_changes"
},
"transition": {
"description": "灯光变化时的过渡持续时间,以秒为单位。🕑",
"name": "transition"
},
"adapt_delay": {
"description": "灯光打开和自适应照明应用更改之间的等待时间(秒)。可能有助于避免闪烁。⏲️",
"name": "adapt_delay"
},
"autoreset_control_seconds": {
"description": "在若干秒后自动重置手动控制。设置为0以禁用。⏲",
"name": "autoreset_control_seconds"
}
}
}
}
}

View file

@ -0,0 +1 @@
{}

1
docs/CNAME Normal file
View file

@ -0,0 +1 @@
adaptive-lighting.nijho.lt

View file

@ -0,0 +1,122 @@
---
icon: lucide/trending-up
---
# Brightness Modes
Enhance your control over brightness transitions during sunrise and sunset with the `brightness_mode` option.
## Available Modes
Adaptive Lighting supports three brightness modes:
| Mode | Description |
|------|-------------|
| `default` | Standard behavior based on sun position |
| `linear` | Linear ramp between min/max brightness |
| `tanh` | Smooth S-curve using hyperbolic tangent |
## Detailed Explanation
<!-- CODE:START -->
<!-- print(include_section("../../README.md", "brightness-modes", strip_heading=True)) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
<details markdown="1">
<summary>Enhance your control over brightness transitions during sunrise and sunset with <code>brightness_mode</code> (click here to learn more 🧠).</summary>
With Adaptive Lighting, you can set a `brightness_mode` to specify how the brightness changes during sunrise and sunset. The `brightness_mode` can be set to `"default"` ([as illustrated in other graphs above](#high_brightness-brightness)), `"linear"`, or `"tanh"`. If you choose to deviate from the `"default"` mode, you can adjust `brightness_mode_time_dark` and `brightness_mode_time_light` to further customize the lighting transitions.
When `brightness_mode` is set to `"linear"`:
- During **_sunset_**, the brightness begins to gradually decrease from `max_brightness` starting at `time=sunset_time - brightness_mode_time_light`, until it reaches `min_brightness` at `time=sunset_time + brightness_mode_time_dark`.
- During **_sunrise_**, the brightness begins to gradually increase from `min_brightness` starting at `time=sunrise_time - brightness_mode_time_dark`, until it reaches `max_brightness` at `time=sunrise_time + brightness_mode_time_light`.
When `brightness_mode` is set to `"tanh"`, it uses the smooth transition of a [hyperbolic tangent function](https://mathworld.wolfram.com/HyperbolicTangent.html):
- During **_sunset_**, the brightness starts to decrease from 95% of `max_brightness` starting at `time=sunset_time - brightness_mode_time_light`, until it reaches 5% of `min_brightness` at `time=sunset_time + brightness_mode_time_dark`.
- During **_sunrise_**, the brightness starts to increase from 5% of `min_brightness` starting at `time=sunrise_time - brightness_mode_time_dark`, until it reaches 95% of `max_brightness` at `time=sunrise_time + brightness_mode_time_light`.
</details>
Notice the values of `brightness_mode_time_light` and `brightness_mode_time_dark` in the text box.
![image](https://github.com/basnijholt/adaptive-lighting/assets/6897215/15143580-13cd-4ab2-a603-89f2b7830afd)
![image](https://github.com/basnijholt/adaptive-lighting/assets/6897215/f61fdac9-6d47-48c9-84ed-cbb451d5de5d)
![image](https://github.com/basnijholt/adaptive-lighting/assets/6897215/e5fc5d27-3c37-4e3d-93d1-6e7cf4b48e7c)
![image](https://github.com/basnijholt/adaptive-lighting/assets/6897215/3dcbdc42-63c4-49df-8651-d2fae53dd08d)
> Check out the interactive webapp on https://basnijholt.github.io/adaptive-lighting/ to play with the parameters and see how the brightness changes!
<!-- OUTPUT:END -->
## Configuration Parameters
When using `linear` or `tanh` modes, you can fine-tune the transition with these parameters:
| Parameter | Default | Description |
|-----------|---------|-------------|
| `brightness_mode_time_dark` | 900 (15 min) | Duration to ramp brightness before/after sunrise/sunset |
| `brightness_mode_time_light` | 3600 (1 hour) | Duration to ramp brightness after/before sunrise/sunset |
## Example Configurations
### Quick Transition (Linear)
```yaml
adaptive_lighting:
- name: "Quick transitions"
lights:
- light.living_room
brightness_mode: linear
brightness_mode_time_dark: 600 # 10 minutes
brightness_mode_time_light: 1800 # 30 minutes
```
### Smooth Transition (Tanh)
```yaml
adaptive_lighting:
- name: "Smooth transitions"
lights:
- light.bedroom
brightness_mode: tanh
brightness_mode_time_dark: 1200 # 20 minutes
brightness_mode_time_light: 3600 # 1 hour
```
## Graphs
These graphs show how brightness changes throughout the day based on calculated values:
<!-- CODE:START -->
<!-- print(include_section("../../README.md", "graphs", strip_heading=True)) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
These graphs were generated using the values calculated by the Adaptive Lighting sensor/switch(es).
### :sunny: Sun Position
![cl_percent|690x131](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/5/657ff98beb65a94598edeb4bdfd939095db1a22c.PNG)
### :thermometer: Color Temperature
![cl_color_temp|690x129](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/5/9/59e84263cbecd8e428cb08777a0413672c48dfcd.PNG)
### :high_brightness: Brightness
![cl_brightness|690x130](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/5/8/58ebd994b62a8b1abfb3497a5288d923ff4e2330.PNG)
### While using `transition_until_sleep: true`
![image](https://user-images.githubusercontent.com/2219836/228949675-f9699624-8abc-466c-bb04-250ce0f495b8.png)
<!-- OUTPUT:END -->
## Interactive Simulator
The best way to understand brightness modes is to experiment with the interactive simulator:
<div style="text-align: center; margin: 2rem 0;">
<a href="../simulator/" class="simulator-link">
Try the Simulator
</a>
</div>
Adjust the `brightness_mode`, `brightness_mode_time_dark`, and `brightness_mode_time_light` parameters to see how they affect the brightness curve in real-time.

View file

@ -0,0 +1,201 @@
---
icon: lucide/hand
---
# Manual Control
Adaptive Lighting is designed to work seamlessly with manual adjustments, detecting when you or another source changes light settings and pausing adaptation accordingly.
## How It Works
<!-- CODE:START -->
<!-- print(include_section("../../README.md", "manual-control", strip_heading=True)) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
Adaptive Lighting is designed to automatically detect when you or another source (e.g., automation) manually changes light settings 🕹️.
When this occurs, the affected light is marked as "manually controlled," and Adaptive Lighting will not make further adjustments until the light is turned off and back on or reset using the `adaptive_lighting.set_manual_control` service call.
This feature is available when `take_over_control` is enabled.
Additionally, enabling `detect_non_ha_changes` allows Adaptive Lighting to detect all state changes, including those made outside of Home Assistant, by comparing the light's state to its previously used settings.
The `adaptive_lighting.manual_control` event is fired when a light is marked as "manually controlled," allowing for integration with automations 🤖.
With `expand_light_groups: false`, manual control belongs to the group. A direct member change cannot pause adaptation for only that member; use group-level manual control or enable expansion for individual tracking.
Explicit member targets in Adaptive Lighting services stay individual targets and do not mark or command the whole group.
Changing expansion at runtime discards tracking and pending adaptation for targets no longer used by any profile.
The Adaptive Lighting switch exposes these read-only attributes for its lights:
- `manual_control`: lights with any attribute marked as manually controlled.
- `manual_control_brightness`: lights with brightness marked as manually controlled.
- `manual_control_color`: lights with color marked as manually controlled.
These lists report manual-control flags. Actual adaptation also depends on `take_over_control_mode` and the brightness/color adaptation switches. For example, under the default `pause_all` mode, manually changing only brightness leaves `manual_control_color` empty while pausing both brightness and color adaptation. Under `pause_changed`, color can continue adapting.
The attributes are absent when the Adaptive Lighting switch is off. Use a fallback when checking them in templates:
```jinja
{{ 'light.bedroom' in (state_attr('switch.adaptive_lighting_bedroom', 'manual_control_brightness') or []) }}
```
> ⚠️ **_Caution: Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Disable `detect_non_ha_changes` if you encounter such issues._**
<!-- OUTPUT:END -->
## Configuration Options
### take_over_control
When enabled (default: `true`), Adaptive Lighting detects `light.turn_on` service calls that specify brightness or color values. If such a call is detected for a light that's already on, that light is marked as "manually controlled".
```yaml
adaptive_lighting:
- name: "With manual control detection"
lights:
- light.living_room
take_over_control: true # default
```
### take_over_control_mode
Controls how adaptation pauses when manual changes are detected:
| Mode | Behavior |
|------|----------|
| `pause_all` | Pause both brightness and color adaptation (default) |
| `pause_changed` | Only pause adaptation of the changed attribute |
```yaml
adaptive_lighting:
- name: "Selective pause"
lights:
- light.living_room
take_over_control: true
take_over_control_mode: pause_changed # Only pause changed attributes
```
### detect_non_ha_changes
When enabled, Adaptive Lighting detects state changes made outside of Home Assistant by comparing the light's current state to its previously applied settings.
> [!WARNING]
> **Use with caution.** Some lights may falsely report an "on" state, which could result in lights turning on unexpectedly. Disable this option if you encounter such issues.
```yaml
adaptive_lighting:
- name: "Detect external changes"
lights:
- light.living_room
take_over_control: true
detect_non_ha_changes: true
```
### autoreset_control_seconds
Automatically resets the manual control flag after a specified number of seconds. Set to `0` to disable (default).
```yaml
adaptive_lighting:
- name: "Auto-reset after 2 hours"
lights:
- light.living_room
take_over_control: true
autoreset_control_seconds: 7200 # 2 hours
```
### adapt_only_on_bare_turn_on
When enabled, Adaptive Lighting only adapts lights when `light.turn_on` is called without specifying brightness or color. This is useful when you want scenes to work without interference.
```yaml
adaptive_lighting:
- name: "Respect scenes"
lights:
- light.living_room
take_over_control: true
adapt_only_on_bare_turn_on: true
```
### manual_control_on_external_turn_on
When enabled, a turn-on without a state-change context matching the latest recorded Home Assistant `light.turn_on` is treated as manual control. This pauses brightness and color adaptation until manual control resets, rather than skipping just the first adjustment. The usual off/on, explicit reset, and configured timeout rules apply. A later unmatched turn-on marks the light manually controlled again.
Manual-control flags are shared by profiles controlling the same light. Use the same turn-on policy on those profiles; mixed policies can allow an earlier profile to adapt before another marks the light manually controlled.
Enable this if you want turn-ons from physical controls or native scenes to preserve their brightness and color. To adapt unmatched turn-ons, leave this disabled and enable `detect_non_ha_changes`.
Its advantage over simply disabling `detect_non_ha_changes` is that the two behaviors are decoupled: you can keep `detect_non_ha_changes: true` to catch manual dimming of lights that are *already on*, while leaving unmatched turn-ons untouched.
Adaptive Lighting cannot identify every physical versus Home Assistant source. Some integrations replace or omit the service context when they publish device state. In that case, even a Home Assistant turn-on does not match and this option treats it as external.
```yaml
adaptive_lighting:
- name: "Respect physical switches and Lutron scenes"
lights:
- light.living_room
take_over_control: true
detect_non_ha_changes: true # still catch manual changes to already-on lights
manual_control_on_external_turn_on: true # leave unmatched off→on events unchanged
```
## Checking Manual Control Status
You can see which lights are marked as manually controlled by checking the switch attributes:
1. Go to **Developer Tools** → **States**
2. Find your Adaptive Lighting switch (e.g., `switch.adaptive_lighting_living_room`)
3. Look at the `manual_control` attribute - it lists all manually controlled lights
## Resetting Manual Control
### Via Service Call
```yaml
service: adaptive_lighting.set_manual_control
data:
entity_id: switch.adaptive_lighting_living_room
lights:
- light.floor_lamp
manual_control: false # Resume adaptation
```
### By Turning Light Off and On
Simply turning a light off and then back on will reset its manual control status.
### Via Automation
See [Automation Examples](../automation-examples.md) for automation recipes that automatically reset manual control.
## Events
When a light is marked as manually controlled, Adaptive Lighting fires an event:
**Event type:** `adaptive_lighting.manual_control`
**Event data:**
```yaml
entity_id: light.living_room
switch: switch.adaptive_lighting_living_room
```
You can use this event to trigger automations:
```yaml
automation:
- alias: "Notify on manual control"
trigger:
platform: event
event_type: adaptive_lighting.manual_control
action:
- service: notify.mobile_app
data:
message: "{{ trigger.event.data.entity_id }} was manually adjusted"
```
## Best Practices
1. **Use Zigbee groups** when controlling multiple bulbs together - this ensures consistent manual control detection
2. **Set reasonable autoreset times** if you want lights to eventually resume adaptation
3. **Use `pause_changed` mode** if you only adjust brightness or color individually
4. **Disable `detect_non_ha_changes`** if you experience unexpected light turn-ons

View file

@ -0,0 +1,57 @@
---
icon: lucide/moon
---
# Sleep Mode
Sleep mode is a special operating mode that sets your lights to minimal brightness and very warm color, perfect for winding down at night without disrupting your circadian rhythm.
## Activating Sleep Mode
Each Adaptive Lighting configuration creates a sleep mode switch:
```
switch.adaptive_lighting_sleep_mode_<name>
```
Turn it on to activate sleep mode:
```yaml
service: switch.turn_on
target:
entity_id: switch.adaptive_lighting_sleep_mode_living_room
```
Sleep mode stays active until this switch is turned off. It does not turn off
automatically at sunrise, and Home Assistant restores its previous state after a
restart. Use an automation, such as the sleep-mode blueprint linked under
Automation Examples, when you want the switch to follow a schedule or helper.
If lights unexpectedly use `sleep_brightness` or `sleep_color_temp` during the
day, first check that the sleep-mode switch is off. While the main Adaptive
Lighting switch is on, it reports the current calculated `brightness_pct` and
`color_temp_kelvin` targets, including the sleep settings while sleep mode is on.
You can compare these attributes with the physical light state. They are `None`
when the main switch is off. In debug logs,
`initial_sleep=True` describes an internal delay before sending a command; it does
not mean that sleep mode is active.
## Configuration Options
Sleep mode is configured through the main Adaptive Lighting configuration. See the [Configuration](../configuration.md) page for the full options table. The sleep-related options are:
| Option | Default | Description |
|--------|---------|-------------|
| `sleep_brightness` | 1 | Brightness percentage in sleep mode |
| `sleep_rgb_or_color_temp` | `color_temp` | Use `rgb_color` or `color_temp` in sleep mode |
| `sleep_color_temp` | 1000 | Color temperature in Kelvin for sleep mode |
| `sleep_rgb_color` | `[255, 56, 0]` | RGB color for sleep mode |
| `sleep_transition` | 1 | Transition duration in seconds |
| `transition_until_sleep` | false | Gradually transition to sleep settings after sunset |
## Automation Examples
See [Automation Examples](../automation-examples.md) for sleep mode automation recipes, including:
- Toggle sleep mode using an `input_boolean`
- Set sunrise/sunset based on alarm time

BIN
docs/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -0,0 +1,46 @@
/* Adaptive Lighting Documentation Custom Styles */
/* Hero section on index page */
.md-content__inner > h1:first-child {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
/* Logo in header - make it slightly larger */
.md-header__button.md-logo img {
height: 1.8rem;
}
/* Simulator link button styling */
.simulator-link {
display: inline-block;
padding: 0.75rem 1.5rem;
background: linear-gradient(135deg, var(--md-primary-fg-color), var(--md-accent-fg-color));
color: white !important;
text-decoration: none;
border-radius: 2rem;
font-weight: 600;
font-size: 1.1rem;
transition: transform 0.2s ease, box-shadow 0.2s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
.simulator-link:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
text-decoration: none;
}
/* Code block improvements */
.highlight code {
font-size: 0.85rem;
}
/* Table improvements */
.md-typeset table:not([class]) {
font-size: 0.8rem;
}
.md-typeset table:not([class]) th {
font-weight: 700;
}

471
docs/automation-examples.md Normal file
View file

@ -0,0 +1,471 @@
---
icon: lucide/bot
---
# Automation Examples
Real-world automation examples showing how to integrate Adaptive Lighting with your Home Assistant setup.
<!-- CODE:START -->
<!-- from adaptive_lighting.docs_gen import _transform_readme_links -->
<!-- print(_transform_readme_links(include_section("../README.md", "automation-examples", strip_heading=True))) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
Replace every entity ID below with the IDs from your Home Assistant instance. Fresh Adaptive Lighting profiles use child IDs such as `switch.adaptive_lighting_living_room_sleep_mode`; profiles created before the device-based entity change may retain older IDs.
Blocks that begin with `- alias` are entries for `automations.yaml`. Blocks with a top-level `script:` or `adaptive_lighting:` key are complete `configuration.yaml` examples. If your configuration uses `script: !include scripts.yaml`, omit that outer key and place its contents in `scripts.yaml`.
Five examples also have blueprints with selectors, so you can configure them without editing YAML:
| Blueprint | Purpose | Import |
| --- | --- | --- |
| [Sleep mode](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/sleep_mode.yaml) | Synchronize several profiles with one sleep-mode helper. | [![Import blueprint](https://my.home-assistant.io/badges/blueprint_import.svg)](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fbasnijholt%2Fadaptive-lighting%2Fblob%2Fmain%2Fblueprints%2Fautomation%2Fsleep_mode.yaml) |
| [Minimum brightness](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/turn_off_at_minimum.yaml) | Turn one light off when its target crosses down to the minimum. | [![Import blueprint](https://my.home-assistant.io/badges/blueprint_import.svg)](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fbasnijholt%2Fadaptive-lighting%2Fblob%2Fmain%2Fblueprints%2Fautomation%2Fturn_off_at_minimum.yaml) |
| [Pause at minimum](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/manual_control_at_minimum.yaml) | Pause brightness through manual control, using its existing reset behavior. | [![Import blueprint](https://my.home-assistant.io/badges/blueprint_import.svg)](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fbasnijholt%2Fadaptive-lighting%2Fblob%2Fmain%2Fblueprints%2Fautomation%2Fmanual_control_at_minimum.yaml) |
| [Schedule profile](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/schedule_profile.yaml) | Apply brightness and color temperature from Schedule helper blocks. | [![Import blueprint](https://my.home-assistant.io/badges/blueprint_import.svg)](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fbasnijholt%2Fadaptive-lighting%2Fblob%2Fmain%2Fblueprints%2Fautomation%2Fschedule_profile.yaml) |
| [Daylight limit](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/daylight_limit.yaml) | Lower maximum brightness in strong daylight. | [![Import blueprint](https://my.home-assistant.io/badges/blueprint_import.svg)](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fbasnijholt%2Fadaptive-lighting%2Fblob%2Fmain%2Fblueprints%2Fautomation%2Fdaylight_limit.yaml) |
Click a blueprint's import badge, confirm the import in Home Assistant, then create an automation and select your entities. You can also copy its source link into **Settings → Automations & scenes → Blueprints → Import Blueprint**. Read the matching example below for setup and behavior. Each blueprint is tested through Home Assistant alongside its YAML example. The built-in manual-control timeout needs no automation; the scripts below remain useful as actions in your own automations.
`change_switch_settings` updates a profile while its main switch is off, but lights are adapted only while that switch is on. It preserves manual-control flags, so manually controlled lights remain paused.
<details markdown="1">
<summary>Automatically reset manual control after one hour.</summary>
Use the built-in timeout so every new manual change renews a single timer for that light:
```yaml
adaptive_lighting:
- name: "Living Room"
lights:
- light.living_room
autoreset_control_seconds: 3600
```
This is a top-level `configuration.yaml` example. The timer clears manual control and immediately readapts a light when both it and the Adaptive Lighting switch are on.
</details>
<details markdown="1">
<summary>Toggle multiple Adaptive Lighting switches to "sleep mode" using an <code>input_boolean.sleep_mode</code>.</summary>
Also available as a [blueprint](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/sleep_mode.yaml). Select an input boolean and the sleep-mode switches it should control.
```yaml
- alias: "Adaptive lighting: toggle 'sleep mode'"
mode: restart
trigger:
- platform: state
entity_id: input_boolean.sleep_mode
- platform: homeassistant
event: start # apply the helper's restored state
variables:
sleep_mode: "{{ states('input_boolean.sleep_mode') }}"
conditions:
- condition: template
value_template: "{{ sleep_mode in ['on', 'off'] }}"
actions:
- action: "switch.turn_{{ sleep_mode }}"
target:
entity_id:
- switch.adaptive_lighting_living_room_sleep_mode
- switch.adaptive_lighting_bedroom_sleep_mode
```
</details>
<details markdown="1">
<summary>Turn a light off when its adaptive brightness target reaches the minimum.</summary>
Prefer a form over editing YAML? Import the [blueprint](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/turn_off_at_minimum.yaml) in Home Assistant under **Settings → Automations & scenes → Blueprints → Import Blueprint**. Select your profile, its matching adapt brightness switch, one light managed by that profile, and its minimum brightness percentage. Create one automation per light. If you change the profile's minimum later, update the automation too. The blueprint and YAML example below have the same behavior.
The Adaptive Lighting switch already exposes its calculated `brightness_pct` target. Use its state changes to choose a power policy in an automation; no custom event is needed. This example assumes `min_brightness: 1`. Change `minimum_pct` to match your profile, and replace the switch and light entity IDs with your own.
The comparison uses the same rounded 0255 brightness as an adaptation command. Comparing floating-point percentages for exact equality can miss the minimum between updates. This detects the calculated target reaching its minimum command, not the bulb finishing a transition or reaching its physical dimming limit.
```yaml
- alias: "Adaptive lighting: turn off at minimum brightness"
mode: single
triggers:
- trigger: state
entity_id: switch.adaptive_lighting_living_room
attribute: brightness_pct
conditions:
- condition: state
entity_id:
- switch.adaptive_lighting_living_room
- switch.adaptive_lighting_living_room_adapt_brightness
state: "on"
- condition: template
value_template: >-
{% set minimum_pct = 1 %}
{% set minimum = (minimum_pct * 255 / 100) | round(0) %}
{% set before = trigger.from_state.attributes.get('brightness_pct')
if trigger.from_state else none %}
{% set after = trigger.to_state.attributes.get('brightness_pct')
if trigger.to_state else none %}
{{ is_number(before) and is_number(after)
and (before | float * 255 / 100) | round(0) > minimum
and (after | float * 255 / 100) | round(0) <= minimum }}
- condition: state
entity_id: light.living_room
state: "on"
- condition: template
value_template: >-
{{ 'light.living_room' not in
(state_attr('switch.adaptive_lighting_living_room', 'manual_control') or []) }}
actions:
- action: light.turn_off
target:
entity_id: light.living_room
```
This runs once when a valid target crosses down into the minimum range. It skips lights currently marked as manually controlled, does not repeatedly turn them off while the target remains low, and does not turn them back on later. Startup or re-enabling the profile while already at the minimum is not a new crossing. Sleep mode can also cause a crossing if its brightness is at or below the chosen minimum. Changing sleep mode clears manual control by default; set `reset_manual_control_on_sleep_mode_change: false` if you want to preserve it. For a bedtime-only policy, trigger directly on the sleep-mode switch changing to `on` instead.
</details>
<details markdown="1">
<summary>Pause brightness at the minimum using manual control.</summary>
Use the [blueprint](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/manual_control_at_minimum.yaml) to mark an individual light's brightness as manually controlled when the calculated target reaches its minimum. The light stays on and the adaptation switches stay enabled. Set `take_over_control_mode: pause_changed` on the profile to keep adapting color; the default `pause_all` pauses both attributes.
Select the profile, its adapt-brightness switch, and a light managed by it. Match the minimum percentage to the profile's `min_brightness`. This YAML example assumes `min_brightness: 1`; change `minimum_pct` and the entity IDs to match your setup.
```yaml
- alias: "Adaptive lighting: pause brightness at minimum"
mode: single
variables:
minimum_pct: 1
minimum: "{{ (minimum_pct * 255 / 100) | round(0) }}"
triggers:
- trigger: state
entity_id: switch.adaptive_lighting_living_room
attribute: brightness_pct
conditions:
- condition: state
entity_id:
- switch.adaptive_lighting_living_room
- switch.adaptive_lighting_living_room_adapt_brightness
state: "on"
- condition: template
value_template: >-
{% set before = trigger.from_state.attributes.get('brightness_pct')
if trigger.from_state else none %}
{% set after = trigger.to_state.attributes.get('brightness_pct')
if trigger.to_state else none %}
{{ is_number(before) and is_number(after)
and (before | float * 255 / 100) | round(0) > minimum
and (after | float * 255 / 100) | round(0) <= minimum }}
- condition: state
entity_id: light.living_room
state: "on"
- condition: template
value_template: >-
{{ 'light.living_room' not in
(state_attr('switch.adaptive_lighting_living_room', 'manual_control_brightness') or []) }}
actions:
- variables:
light_session: "{{ states.light.living_room.last_changed.isoformat() }}"
profile_session: "{{ states.switch.adaptive_lighting_living_room.last_changed.isoformat() }}"
brightness_session: "{{ states.switch.adaptive_lighting_living_room_adapt_brightness.last_changed.isoformat() }}"
- wait_template: >-
{% set target = state_attr('switch.adaptive_lighting_living_room', 'brightness_pct') %}
{{ not is_state('light.living_room', 'on')
or not is_state('switch.adaptive_lighting_living_room', 'on')
or not is_state('switch.adaptive_lighting_living_room_adapt_brightness', 'on')
or states.light.living_room.last_changed.isoformat() != light_session
or states.switch.adaptive_lighting_living_room.last_changed.isoformat() != profile_session
or states.switch.adaptive_lighting_living_room_adapt_brightness.last_changed.isoformat() != brightness_session
or not is_number(target) or (target | float * 255 / 100) | round(0) > minimum
or 'light.living_room' in
(state_attr('switch.adaptive_lighting_living_room', 'manual_control_brightness') or [])
or (state_attr('light.living_room', 'brightness') | float(256)) <= minimum }}
timeout: "00:05:00"
continue_on_timeout: false
- condition: template
value_template: >-
{% set target = state_attr('switch.adaptive_lighting_living_room', 'brightness_pct') %}
{{ is_state('light.living_room', 'on')
and is_state('switch.adaptive_lighting_living_room', 'on')
and is_state('switch.adaptive_lighting_living_room_adapt_brightness', 'on')
and states.light.living_room.last_changed.isoformat() == light_session
and states.switch.adaptive_lighting_living_room.last_changed.isoformat() == profile_session
and states.switch.adaptive_lighting_living_room_adapt_brightness.last_changed.isoformat() == brightness_session
and is_number(target) and (target | float * 255 / 100) | round(0) <= minimum
and (state_attr('light.living_room', 'brightness') | float(256)) <= minimum
and 'light.living_room' not in
(state_attr('switch.adaptive_lighting_living_room', 'manual_control_brightness') or []) }}
- action: adaptive_lighting.set_manual_control
data:
entity_id: switch.adaptive_lighting_living_room
lights: light.living_room
manual_control: >-
{{ true if 'light.living_room' in
(state_attr('switch.adaptive_lighting_living_room', 'manual_control_color') or [])
else 'brightness' }}
```
The comparison uses the rounded 0255 target, so it does not depend on sampling an exact floating-point minimum. It waits up to five minutes for the light to report that minimum before marking manual control, so the final dimming command can complete. Reported brightness does not prove physical fade completion. If the light, profile, or adapt-brightness switch is toggled, the target rises, brightness is marked manually controlled elsewhere, or brightness never reaches the minimum, the attempt is abandoned. Lights that cannot report the configured minimum will not be paused. Existing manual color flags are preserved, and lights whose brightness is already manually controlled are left alone. Manual-control state is shared for lights managed by multiple profiles, so their existing takeover policies still apply.
The usual resets apply: turning the light off, the configured `autoreset_control_seconds` timeout, clearing manual control through its service, and existing profile/sleep-switch reset behavior. After a reset, normal adaptation can increase brightness again. This runs once per downward crossing; resetting while the target remains at its minimum does not immediately mark the light again. Startup at the minimum is not a crossing either.
This pauses further dimming as well as brightening. To pause brightness immediately after a brightness change made through Home Assistant, use `take_over_control_mode: pause_changed` with `take_over_control: true`; that needs no additional automation.
</details>
<details markdown="1">
<summary>Set sunrise and sunset from an alarm.</summary>
Call this script from your alarm automation. It sets one Adaptive Lighting profile's sunrise to the current time and its sunset to 12 hours later on the local clock.
```yaml
script:
set_adaptive_lighting_alarm_times:
alias: "Adaptive lighting: set times from alarm"
variables:
alarm_time: '{{ now().strftime("%H:%M:%S") }}'
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_alarm_lights
sunrise_time: "{{ alarm_time }}"
sunset_time: >
{{ (strptime(alarm_time, "%H:%M:%S") + timedelta(hours=12))
.strftime("%H:%M:%S") }}
```
</details>
<details markdown="1">
<summary>Use a Schedule helper as a step-based custom lighting profile.</summary>
Also available as a [blueprint](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/schedule_profile.yaml). Select the main profile switch and your Schedule helper.
Create a [Schedule helper](https://www.home-assistant.io/integrations/schedule/) named `Adaptive Lighting Profile`. Add time blocks with Additional data like this:
```yaml
brightness_pct: 20
color_temp_kelvin: 2500
```
Use different values for each block. The automation below applies the active block whenever the schedule state or its attributes change. Setting both brightness limits and both color temperature limits to the same value keeps each block at its setpoint. Outside a block, the configured Adaptive Lighting settings are restored.
```yaml
- alias: "Adaptive lighting: apply scheduled profile"
triggers:
- trigger: state
entity_id: schedule.adaptive_lighting_profile
- trigger: homeassistant
event: start
actions:
- choose:
- conditions:
- condition: state
entity_id: schedule.adaptive_lighting_profile
state: "on"
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_living_room
min_brightness: >
{{ state_attr('schedule.adaptive_lighting_profile', 'brightness_pct') | int(1) }}
max_brightness: >
{{ state_attr('schedule.adaptive_lighting_profile', 'brightness_pct') | int(1) }}
min_color_temp: >
{{ state_attr('schedule.adaptive_lighting_profile', 'color_temp_kelvin') | int(2000) }}
max_color_temp: >
{{ state_attr('schedule.adaptive_lighting_profile', 'color_temp_kelvin') | int(2000) }}
default:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_living_room
use_defaults: configuration
mode: restart
```
This creates step changes at block boundaries. It does not interpolate between schedule points. Runtime settings also reset when Home Assistant restarts, so the startup trigger reapplies the active block. The default branch restores every configured setting; restore only the four fields explicitly if other automations also change runtime settings.
</details>
<details markdown="1">
<summary>Reduce daytime brightness when an illuminance sensor detects strong daylight.</summary>
Also available as a [blueprint](https://github.com/basnijholt/adaptive-lighting/blob/main/blueprints/automation/daylight_limit.yaml). Select the profile and sensor, then set the lux thresholds and brightness limits. The high lux threshold must exceed the low threshold; the blueprint does nothing if they are reversed or equal.
Keep a low configured `min_brightness` for late night and let an automation lower `max_brightness` while the room has ample daylight. Use a sensor that is not significantly affected by the controlled lights to avoid a feedback loop.
```yaml
- alias: "Adaptive lighting: limit brightness in daylight"
triggers:
- trigger: numeric_state
entity_id: sensor.living_room_illuminance
above: 300
- trigger: numeric_state
entity_id: sensor.living_room_illuminance
below: 200
- trigger: homeassistant
event: start
id: startup
actions:
- if:
- condition: trigger
id: startup
then:
- wait_template: >
{{ is_number(states('sensor.living_room_illuminance')) }}
timeout: "00:05:00"
continue_on_timeout: false
- choose:
- conditions:
- condition: numeric_state
entity_id: sensor.living_room_illuminance
above: 300
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_living_room
max_brightness: 30
- conditions:
- condition: numeric_state
entity_id: sensor.living_room_illuminance
below: 200
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_living_room
max_brightness: 100
mode: restart
```
The separate 200 and 300 lux thresholds add hysteresis. After a restart, the automation waits for a numeric sensor state before evaluating it. If the initial value is between the thresholds, Adaptive Lighting keeps its configured maximum. Replace `30` and `100` with your desired daytime limit and normal maximum.
`min_brightness` and `max_brightness` are the solar-midnight and daytime endpoints of the brightness curve. Setting `min_brightness` higher than `max_brightness` is supported and creates an inverted curve that is brighter at night and dimmer during the day. If you only want a daytime limit, keep the reduced maximum at or above the configured minimum.
</details>
<details markdown="1">
<summary>Turn on Hue-controlled lights with the current Adaptive Lighting values.</summary>
For a Hue button exposed to Home Assistant, call this script from the button automation. It turns on the listed lights directly with the current Adaptive Lighting brightness and color.
```yaml
script:
living_room_adaptive_lighting:
alias: "Living room: adaptive lighting"
sequence:
- action: adaptive_lighting.apply
data:
entity_id: switch.adaptive_lighting_living_room
lights:
- light.living_room_ceiling
- light.living_room_table
turn_on_lights: true
transition: 0
```
This requires Home Assistant to receive the button event. The one-shot `apply` call works while the main Adaptive Lighting switch is off, turns on the listed lights, and applies values even if a light is marked as manually controlled. It leaves the profile switch and manual-control state unchanged.
Adaptive Lighting does not update scenes stored on the Hue Bridge, so scenes activated only inside Hue cannot use this script and retain Hue's operation when Home Assistant is unavailable.
</details>
<details markdown="1">
<summary>Use a fixed RGB stage before sleep mode.</summary>
This script starts sleep mode with a fixed dim red color, waits 30 minutes, and then restores the configured Adaptive Lighting settings. The main profile switch and the light must already be on.
```yaml
script:
adaptive_lighting_bedtime:
alias: "Adaptive lighting: bedtime"
mode: restart
sequence:
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_bedroom
sleep_rgb_or_color_temp: rgb_color
sleep_rgb_color: [255, 56, 0]
sleep_brightness: 20
- action: switch.turn_on
target:
entity_id: switch.adaptive_lighting_bedroom_sleep_mode
- delay: "00:30:00"
- action: adaptive_lighting.change_switch_settings
data:
entity_id: switch.adaptive_lighting_bedroom
use_defaults: configuration
```
The light must support RGB color. The first stage uses a fixed brightness rather than following the normal brightness curve. When sleep mode changes from off to on, the default `reset_manual_control_on_sleep_mode_change: true` returns manually controlled lights to Adaptive Lighting control so they receive the stage. If you disable that option, manually controlled lights remain paused. Restoring configuration defaults resets every runtime setting on this Adaptive Lighting switch, so restore only the sleep fields explicitly if other automations also change runtime settings.
Stopping this script or reloading scripts during the delay prevents the final action, leaving the runtime overrides active. To recover, call `adaptive_lighting.change_switch_settings` for the profile with `use_defaults: configuration`. A Home Assistant restart reloads the configured settings.
</details>
<details markdown="1">
<summary>Run a fixed virtual day across midnight.</summary>
Fixed virtual sunrise and sunset times can cross midnight. This configuration ramps an indoor garden from its minimum at 16:00 to its maximum at 22:00, then back to its minimum at 04:00.
```yaml
adaptive_lighting:
- name: "Indoor Garden"
lights:
- light.indoor_garden
sunrise_time: "16:00:00"
sunset_time: "04:00:00"
min_brightness: 10
max_brightness: 100
brightness_mode: linear
brightness_mode_time_dark: 0
brightness_mode_time_light: 21600 # 6 hours
```
Adaptive Lighting changes brightness and color while a light is on; it does not manage the light's power schedule. This separate automation turns the example light on and off:
```yaml
- alias: "Indoor garden: power schedule"
triggers:
- trigger: time
at: "16:00:00"
id: turn_on
- trigger: time
at: "04:00:00"
id: turn_off
- trigger: homeassistant
event: start
id: startup
actions:
- choose:
- conditions:
- condition: trigger
id: turn_on
sequence:
- action: light.turn_on
target:
entity_id: light.indoor_garden
- conditions:
- condition: trigger
id: startup
- condition: time
after: "16:00:00"
before: "04:00:00"
sequence:
- action: light.turn_on
target:
entity_id: light.indoor_garden
default:
- action: light.turn_off
target:
entity_id: light.indoor_garden
```
Use `min_sunrise_time`, `max_sunrise_time`, `min_sunset_time`, or `max_sunset_time` instead when you want to constrain astronomical sunrise or sunset to an earliest or latest time rather than replace it.
</details>
<!-- OUTPUT:END -->
> [!TIP]
> **Have a useful automation?** Share your automation examples by [opening an issue](https://github.com/basnijholt/adaptive-lighting/issues) or submitting a pull request to the README.

147
docs/configuration.md Normal file
View file

@ -0,0 +1,147 @@
---
icon: lucide/settings
---
# Configuration
Adaptive Lighting supports configuration through both YAML and the Home Assistant UI, with identical option names in both methods.
## Basic Configuration
The simplest setup uses the Home Assistant UI. Go to **Settings****Devices & Services****Add Integration****Adaptive Lighting**. No `adaptive_lighting:` entry is needed in `configuration.yaml`.
## YAML Configuration
Alternatively, you can specify lights and options in `configuration.yaml`:
```yaml
adaptive_lighting:
- name: "Living Room"
lights:
- light.living_room_ceiling
- light.living_room_lamp
```
## All Options
All configuration options are listed below with their default values. These options work identically in both YAML and the UI.
<!-- CODE:START -->
<!-- from adaptive_lighting._docs_helpers import generate_config_markdown_table -->
<!-- print(generate_config_markdown_table()) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
| Variable name | Description | Default | Type |
|:--------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------|:----------------------------------------|
| `lights` | List of light entity_ids to be controlled (may be empty). 🌟 | `[]` | list of `entity_id`s |
| `interval` | Frequency to adapt the lights, in seconds. 🔄 | `90` | `int > 0` |
| `transition` | Duration of transition when lights change, in seconds. 🕑 | `45` | `float` 0-6553 |
| `initial_transition` | Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️ | `1` | `float` 0-6553 |
| `min_brightness` | Minimum brightness percentage. 💡 | `1` | `int` 1-100 |
| `max_brightness` | Maximum brightness percentage. 💡 | `100` | `int` 1-100 |
| `min_color_temp` | Warmest color temperature in Kelvin. 🔥 | `2000` | `int` 1000-10000 |
| `max_color_temp` | Coldest color temperature in Kelvin. ❄️ | `5500` | `int` 1000-10000 |
| `prefer_rgb_color` | Whether to prefer RGB color adjustment over light color temperature when possible. 🌈 | `False` | `bool` |
| `sleep_brightness` | Brightness percentage of lights in sleep mode. 😴 | `1` | `int` 1-100 |
| `sleep_rgb_or_color_temp` | Use either `"rgb_color"` or `"color_temp"` in sleep mode. 🌙 | `color_temp` | one of `['color_temp', 'rgb_color']` |
| `sleep_color_temp` | Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴 | `1000` | `int` 1000-10000 |
| `sleep_rgb_color` | RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is "rgb_color"). 🌈 | `[255, 56, 0]` | RGB color |
| `sleep_transition` | Duration of transition when "sleep mode" is toggled in seconds. 😴 | `1` | `float` 0-6553 |
| `transition_until_sleep` | When enabled, Adaptive Lighting will treat sleep settings as the minimum, transitioning to these values after sunset. 🌙 | `False` | `bool` |
| `sunrise_time` | Set a fixed time (HH:MM:SS) for sunrise. 🌅 | `None` | `str` |
| `min_sunrise_time` | Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅 | `None` | `str` |
| `max_sunrise_time` | Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅 | `None` | `str` |
| `sunrise_offset` | Adjust sunrise time with a positive or negative offset in seconds. ⏰ | `0` | `int` |
| `sunset_time` | Set a fixed time (HH:MM:SS) for sunset. 🌇 | `None` | `str` |
| `min_sunset_time` | Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇 | `None` | `str` |
| `max_sunset_time` | Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇 | `None` | `str` |
| `sunset_offset` | Adjust sunset time with a positive or negative offset in seconds. ⏰ | `0` | `int` |
| `brightness_mode` | Brightness mode to use. Possible values are `default`, `linear`, and `tanh` (uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈 | `default` | one of `['default', 'linear', 'tanh']` |
| `brightness_mode_time_dark` | (Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness before/after sunrise/sunset. 📈📉 | `900` | `int` |
| `brightness_mode_time_light` | (Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness after/before sunrise/sunset. 📈📉. | `3600` | `int` |
| `take_over_control` | Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒 | `True` | `bool` |
| `take_over_control_mode` | The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed. | `pause_all` | one of `['pause_all', 'pause_changed']` |
| `detect_non_ha_changes` | Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues. | `False` | `bool` |
| `autoreset_control_seconds` | Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️ | `0` | `int` 0-31536000 |
| `only_once` | Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄 | `False` | `bool` |
| `adapt_only_on_bare_turn_on` | When turning lights on initially. If set to `true`, AL adapts only if `light.turn_on` is invoked without specifying color or brightness. ❌🌈 This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. Needs `take_over_control` enabled. 🕵️ | `False` | `bool` |
| `manual_control_on_external_turn_on` | Treat turn-ons without a matching Home Assistant `light.turn_on` context as manual control. Normal manual-control resets apply. Still allows `detect_non_ha_changes` for already-on lights. Needs `take_over_control` enabled. 🕵️ | `False` | `bool` |
| `reset_manual_control_on_sleep_mode_change` | Reset manual control when the sleep mode switch is toggled. Set to `false` to preserve manual control across sleep mode changes. 😴 | `True` | `bool` |
| `separate_turn_on_commands` | Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀 | `False` | `bool` |
| `send_split_delay` | Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️ | `0` | `int` 0-10000 |
| `adapt_delay` | Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️ | `0` | `float > 0` |
| `skip_redundant_commands` | Skip sending adaptation commands whose target state already equals the light's known state. Minimizes network traffic and improves the adaptation responsivity in some situations. 📉Disable if physical light states get out of sync with HA's recorded state. | `False` | `bool` |
| `intercept` | Intercept and adapt `light.turn_on` calls to enabling instantaneous color and brightness adaptation. 🏎️ Disable for lights that do not support `light.turn_on` with color and brightness. | `True` | `bool` |
| `multi_light_intercept` | Intercept and adapt `light.turn_on` calls that target multiple lights. ➗⚠️ This might result in splitting up a single `light.turn_on` call into multiple calls, e.g., when lights are in different switches. Requires `intercept` to be enabled. | `True` | `bool` |
| `include_config_in_attributes` | Show all options as attributes on the switch in Home Assistant when set to `true`. 📝 | `False` | `bool` |
| `expand_light_groups` | Expand light groups to their members (`true`, default). Set `false` to send commands to the group and track manual control for the group. Explicit member targets in services stay individual targets. | `True` | `bool` |
<!-- OUTPUT:END -->
## Full Configuration Example
<!-- CODE:START -->
<!-- from adaptive_lighting.docs_gen import _transform_readme_links -->
<!-- print(_transform_readme_links(include_section("../README.md", "config-example-full"))) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
Full example:
```yaml
# Example configuration.yaml entry
adaptive_lighting:
- name: "default"
lights: []
prefer_rgb_color: false
transition: 45
initial_transition: 1
interval: 90
min_brightness: 1
max_brightness: 100
min_color_temp: 2000
max_color_temp: 5500
sleep_brightness: 1
sleep_color_temp: 1000
sunrise_time: "08:00:00" # override the sunrise time
sunrise_offset:
sunset_time:
sunset_offset: 1800 # in seconds or '00:30:00'
take_over_control: true
detect_non_ha_changes: false
only_once: false
```
<!-- OUTPUT:END -->
## Multiple Configurations
You can create multiple Adaptive Lighting configurations for different areas or use cases:
```yaml
adaptive_lighting:
- name: "Daytime Spaces"
lights:
- light.living_room
- light.kitchen
- light.office
min_brightness: 30
max_brightness: 100
- name: "Bedroom"
lights:
- light.bedroom_ceiling
- light.bedroom_lamp
min_brightness: 5
max_brightness: 80
sleep_brightness: 1
sleep_color_temp: 1000
```
## Related Topics
- [Brightness Modes](advanced/brightness-modes.md) - Detailed explanation of brightness calculation modes
- [Sleep Mode](advanced/sleep-mode.md) - Sleep mode configuration
- [Manual Control](advanced/manual-control.md) - How manual control detection works

102
docs/getting-started.md Normal file
View file

@ -0,0 +1,102 @@
---
icon: lucide/rocket
---
# Getting Started
This guide will help you install and configure Adaptive Lighting for the first time.
## Prerequisites
- [Home Assistant](https://www.home-assistant.io/) 2025.9.0 or newer
- [HACS](https://hacs.xyz/) (Home Assistant Community Store) installed
## Installation
### Via HACS (Recommended)
1. Open HACS in your Home Assistant instance
2. Click on **Integrations**
3. Click the **+ Explore & Download Repositories** button
4. Search for "Adaptive Lighting"
5. Click **Download**
6. Restart Home Assistant
Or use this button to open HACS directly:
[![Open your Home Assistant instance and open the Adaptive Lighting integration inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=basnijholt&repository=adaptive-lighting&category=integration)
### Manual Installation
1. Download the latest release from [GitHub](https://github.com/basnijholt/adaptive-lighting/releases)
2. Extract the `adaptive_lighting` folder to your `config/custom_components/` directory
3. Restart Home Assistant
## Configuration
Choose one of two configuration methods:
=== "Via UI"
1. Go to **Settings** → **Devices & Services**
2. Click **+ Add Integration**
3. Search for "Adaptive Lighting"
4. Follow the setup wizard to name your Adaptive Lighting instance
5. Find Adaptive Lighting and click **Configure**
6. Select your lights and adjust the settings
No `adaptive_lighting:` entry is needed in `configuration.yaml`.
=== "Via YAML"
Instances configured through YAML must be edited in YAML.
```yaml
adaptive_lighting:
- name: "Living Room"
lights:
- light.living_room_ceiling
- light.living_room_lamp
min_brightness: 20
max_brightness: 100
min_color_temp: 2200
max_color_temp: 5500
```
Restart Home Assistant after changing the YAML configuration.
## Basic YAML Configuration Example
Here's a simple configuration to get you started:
```yaml
adaptive_lighting:
- name: "Main Lights"
lights:
- light.living_room
- light.bedroom
- light.kitchen
transition: 30
min_brightness: 10
max_brightness: 100
min_color_temp: 2000
max_color_temp: 5500
```
## Verifying Installation
After configuration, you should see new switches in Home Assistant:
- `switch.adaptive_lighting_main_lights`
- `switch.adaptive_lighting_sleep_mode_main_lights`
- `switch.adaptive_lighting_adapt_brightness_main_lights`
- `switch.adaptive_lighting_adapt_color_main_lights`
Turn on `switch.adaptive_lighting_main_lights` to start adapting your lights!
## Next Steps
- [Configuration Reference](configuration.md) - Explore all available options
- [Services](services.md) - Learn about service calls for automations
- [Automation Examples](automation-examples.md) - See real-world automation recipes
- [Troubleshooting](troubleshooting.md) - Common issues and solutions

Some files were not shown because too many files have changed in this diff Show more