Mise en conformité a2m (type homeassistant-integration) et compatibilité Home Assistant 2026

- Carte servie et chargée par l'intégration (plus de copie dans www/ ni de ressource Lovelace)
- Température de couleur en kelvins (ATTR_COLOR_TEMP supprimé de HA 2026.1), anciens préréglages convertis
- get_presets déclarée avec réponse
- manifest (URLs, dépendances), hacs.json, icône, .a2m/type_attributes.toml, scripts/package.py
- README et CHANGELOG FR/EN, LICENSE MIT, CLAUDE.md et skill de publication
- Fichiers de Home Assistant de dev retirés du suivi, .gitignore revu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
angeandClaude Opus 5.5 committed 2026-10-22 13:37:27 +02:00
1 parent e625f8098e
commit 2a8ba5105a
31 files changed
+410 -2792

No files matched your search

+12
View File
@@ -0,0 +1,12 @@
# type_attributes de la prochaine release (type homeassistant-integration) : lus par « a2m release », validés par le
# schéma schemas/types/homeassistant-integration.schema.json d'apc-spec, recopiés dans publication.json.
# Tenir d'accord avec custom_components/light_preset_manager/manifest.json (domain, iot_class) et hacs.json (homeassistant).
# domain : texte, obligatoire (= domain du manifest)
domain = "light_preset_manager"
# ha_version_min : version AAAA.M.P, obligatoire (= homeassistant de hacs.json)
ha_version_min = "2024.7.0"
# ha_version_max : version AAAA.M.P, facultatif (dernière version de Home Assistant compatible)
# ha_version_max = ""
# iot_class : texte, facultatif (= iot_class du manifest)
iot_class = "local_push"
@@ -0,0 +1,30 @@
---
name: publier-homeassistant-integration
description: Marche à suivre pour publier une release de ce projet (Intégration personnalisée Home Assistant) avec a2m — version du manifest, notes de version, type_attributes, zip de l'intégration, contrôle, release stable ou dev, déploiement. À utiliser dès qu'il s'agit de publier, corriger ou retirer une version.
---
# Publier une release de Light Preset Manager
Type `homeassistant-integration` du contrat apc-spec ; règles dans `CLAUDE.md`. Rien n'est publié sans l'accord de l'utilisateur.
1. **État** : `a2m status` — arbre git propre, branche `main` à jour avec Gitea, projet conforme.
2. **Version** : `version` de `custom_components/light_preset_manager/manifest.json` = version X.Y.Z de la release (stable ; pour
`--dev`, la prochaine stable visée) ; idem dans `frontend/package.json`.
3. **Notes de version** : section `[Unreleased]` de `CHANGELOG.md` (anglais) et `[Non publié]` de `CHANGELOG.fr.md`
(français), remplies et cohérentes ; commitées.
4. **`type_attributes`** : mettre à jour `.a2m/type_attributes.toml` avec les valeurs de **cette** release (commité
avec le projet, validé par le schéma du type, recopié dans `publication.json`) :
- `domain` (texte, obligatoire) : `light_preset_manager`, le `domain` du manifest
- `ha_version_min` (version AAAA.M.P, obligatoire) : = `homeassistant` de `hacs.json`
- `ha_version_max` (version AAAA.M.P, facultatif) : dernière version de Home Assistant compatible
- `iot_class` (texte, facultatif) : = `iot_class` du manifest
5. **Fichiers** : `npm run build` dans `frontend/` (carte à jour, commitée), puis `python scripts/package.py`
→ `dist/light_preset_manager-X.Y.Z.zip` (rôle `download`), déclaré à la release :
`--asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download"` (option répétable, une par fichier ; archive des sources
éventuelle : `role=source`).
6. **Contrôle** : `a2m validate`, puis `a2m release --dry-run --asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download"` ;
relire `dist/publication.json`. Si possible, tester le zip dans le Home Assistant de dev.
7. **Publication**, avec l'accord de l'utilisateur : `a2m release --asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download"` (stable) ou `--dev` (pré-release `dev`),
puis `a2m deploy` (préproduction par défaut ; production : `--target prod`).
8. **Après** : une version publiée ne se modifie plus. Corriger ses notes ou sa visibilité : `a2m release edit
<version>` ; la retirer : `a2m release withdraw <version>` ; corriger le code : nouvelle version.
+12 -27
View File
@@ -1,38 +1,23 @@
# Python
# Construction
dist/
__pycache__/
*.py[cod]
*$py.class
.ruff_cache/
.pytest_cache/
*.egg-info/
dist/
build/
.eggs/
.mypy_cache/
# Environnements
.venv/
venv/
# Node
node_modules/
custom_components/light_preset_manager/frontend/*.js.map
# IDE
# Home Assistant de développement : seule la configuration est versionnée
ha-dev-config/*
!ha-dev-config/configuration.yaml
!ha-dev-config/scenes.yaml
# Éditeurs et système
.idea/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Home Assistant Dev
ha-dev-config/.storage/
ha-dev-config/home-assistant.log
ha-dev-config/home-assistant_v2.db
ha-dev-config/tts/
ha-dev-config/.cloud/
ha-dev-config/deps/
# Secrets
secrets.yaml
# Frontend build output
frontend/dist/*
!frontend/dist/.gitkeep
+5
View File
@@ -0,0 +1,5 @@
target-version = "py313"
line-length = 120
[lint]
select = ["E", "F", "I", "UP", "B"]
+23
View File
@@ -0,0 +1,23 @@
# Journal des modifications
Format : [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/) ; versions : [SemVer](https://semver.org/lang/fr/).
La section « Non publié » est reprise par `a2m release` sous le numéro de la nouvelle version
(version anglaise : [CHANGELOG.md](CHANGELOG.md)).
## [Non publié]
### Ajouté
- Carte Lovelace `custom:light-preset-manager` : pilotage d'un groupe de lumières (allumage, luminosité, température
de couleur) et jusqu'à quatre préréglages, enregistrés, rappelés et renommés depuis la carte ; éditeur visuel ;
anglais et français.
- Lumières individuelles des groupes gérées dans les préréglages.
- Actions `save_preset`, `recall_preset`, `rename_preset`, `get_presets` ; préréglages conservés par Home Assistant.
- La carte est servie et chargée par l'intégration : aucune ressource Lovelace à ajouter.
- Blueprint pour la télécommande IKEA STYRBAR.
### Corrigé
- Compatibilité avec Home Assistant 2026.1 et suivants : température de couleur envoyée en kelvins (préréglages
enregistrés en mireds convertis).
- L'action `get_presets` renvoie sa réponse.
+22
View File
@@ -0,0 +1,22 @@
# Changelog
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions: [SemVer](https://semver.org/).
The "Unreleased" section is taken by `a2m release` under the number of the new version
(French version: [CHANGELOG.fr.md](CHANGELOG.fr.md)).
## [Unreleased]
### Added
- Lovelace card `custom:light-preset-manager`: control of a group of lights (on/off, brightness, colour temperature)
and up to four presets, saved, recalled and renamed from the card; visual editor; English and French.
- Individual lights of groups managed in presets.
- Actions `save_preset`, `recall_preset`, `rename_preset`, `get_presets`; presets stored by Home Assistant.
- The card is served and loaded by the integration: no Lovelace resource to add.
- Blueprint for the IKEA STYRBAR remote.
### Fixed
- Compatibility with Home Assistant 2026.1 and later: colour temperature sent in kelvins (presets saved in
mireds are converted).
- The `get_presets` action returns its response.
+66
View File
@@ -0,0 +1,66 @@
# Light Preset Manager
Projet `light_preset_manager` publié par la chaîne d'outils **a2m** (repo `ange/apc-toolchain`) sur Gitea et sur
a2msystemes.org, selon le **contrat de publication apc-spec** (repo `ange/apc-spec`, fichier `CONTRAT.md` ; termes :
`GLOSSAIRE.md`). Ce fichier en résume ce qui concerne ce projet ; **en cas de doute, le contrat fait foi**.
Pour publier une release : skill `publier-homeassistant-integration` (`.claude/skills/`).
## Ce que le contrat exige de ce type
- Type : `homeassistant-integration` — Intégration personnalisée Home Assistant / Home Assistant custom integration.
- Logiciel hôte : Home Assistant (`homeassistant`).
- `type_attributes` (schéma `schemas/types/homeassistant-integration.schema.json`) : `domain`, `ha_version_min`,
`ha_version_max` (facultatif), `iot_class` (facultatif) ; valeurs écrites à la main dans `.a2m/type_attributes.toml`
avant chaque release.
- Pièces jointes obligatoires à chaque release : rôle `download` = `dist/light_preset_manager-X.Y.Z.zip`, contenu de
`custom_components/light_preset_manager/` (construit par `python scripts/package.py`).
- Constructeur dans a2m : non — le zip est fourni à la main : `a2m release --asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download"`.
Profil complet : `vocabulaire/types.yml` d'apc-spec (entrée `homeassistant-integration`).
## Valeurs à tenir d'accord
| Valeur | Où |
|---|---|
| Version X.Y.Z | `version` de `custom_components/light_preset_manager/manifest.json` = version de la release (nom du zip) ; `version` de `frontend/package.json` |
| `domain` | dossier `custom_components/light_preset_manager/`, `domain` du manifest, `DOMAIN` de `const.py`, `.a2m/type_attributes.toml` |
| `ha_version_min` | `homeassistant` de `hacs.json`, `.a2m/type_attributes.toml`, README |
| `iot_class` | `iot_class` du manifest, `.a2m/type_attributes.toml` |
## Structure
- `custom_components/light_preset_manager/` : l'intégration (seul contenu du zip publié) — `manifest.json`,
`__init__.py` (activée par la ligne `light_preset_manager:` de `configuration.yaml`, pas de config flow ; services,
commande WebSocket, stockage des préréglages ; sert et charge la carte), `const.py`, `services.yaml`,
`brand/icon.png` (icône provisoire, exigée par HACS), `frontend/light-preset-manager.js` (carte construite,
commitée).
- `frontend/` : sources de la carte Lovelace `custom:light-preset-manager` (TypeScript, lit, esbuild ; traductions
dans `src/locales/`) ; `npm run build` (esbuild puis `scripts/copy.js`) avant chaque commit qui les modifie et avant
une release ; `npm run watch` en développement.
- `docker-compose.yml` + `ha-dev-config/` (`configuration.yaml`, `scenes.yaml`) : Home Assistant de développement
(le reste n'est pas versionné) ; tâches dans `.vscode/tasks.json`.
- `Blueprints/` : blueprints d'automatisation fournis avec le projet (hors zip).
- `hacs.json` : pour HACS, qui n'installe que depuis GitHub (utile seulement avec un miroir GitHub du repo).
## Règles
- `.a2m/project.toml` (données du projet : titre, résumé, tags, visibilité, statut…) est écrit par a2m :
`a2m project update`, `a2m tags set`, `a2m project status`. Ne pas le modifier à la main.
- Versions [SemVer](https://semver.org/) `X.Y.Z` ; tag git `vX.Y.Z` créé par `a2m release`, jamais à la main.
Une version publiée est **immuable** (ses fichiers ne changent plus).
- Notes de version : section `[Unreleased]` de `CHANGELOG.md` (anglais) et `[Non publié]` de `CHANGELOG.fr.md`
(français), reprises par `a2m release`.
- README en deux langues : `README.md` (anglais) et `README.fr.md` (français).
- Rien n'est publié sans commande explicite. Arbre git propre et branche `main` à jour avant une release.
- Aucun secret dans le repo (`secrets.yaml` et `ha-dev-config/` ignorés).
## Circuit
```
a2m status # état du projet, conformité
a2m validate # contrat + .a2m/type_attributes.toml (schéma du type)
python scripts/package.py # dist/light_preset_manager-X.Y.Z.zip
a2m release --dry-run --asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download"
a2m release --asset "file=dist/light_preset_manager-X.Y.Z.zip;role=download" # stable ; --dev : canal dev
a2m deploy # le site prend la release en compte (préprod par défaut)
```
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) Ange-Marie MAURIN
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+56
View File
@@ -0,0 +1,56 @@
# Light Preset Manager
*[English version](README.md)*
Intégration personnalisée Home Assistant avec sa carte Lovelace : piloter un groupe de lumières (allumage,
luminosité, température de couleur) et enregistrer jusqu'à quatre préréglages de leurs états, rappelés d'un geste.
Home Assistant 2024.7.0 ou plus récent.
## Installation
1. Télécharger `light_preset_manager-X.Y.Z.zip` depuis la fiche du projet sur
[a2msystemes.org](https://a2msystemes.org/projets/light_preset_manager).
2. Le décompresser dans `config/custom_components/light_preset_manager/` de votre installation Home Assistant.
3. Ajouter cette ligne à `configuration.yaml`, puis redémarrer Home Assistant :
```yaml
light_preset_manager:
```
La carte est chargée automatiquement par l'intégration (aucune ressource Lovelace à ajouter).
## Carte
```yaml
type: custom:light-preset-manager
card_id: salon # obligatoire : identifiant unique, les préréglages sont enregistrés sous ce nom
group: light.salon # obligatoire : groupe ou lumière pilotée par les boutons principaux
title: Salon # facultatif
lights: # facultatif : lumières enregistrées dans les préréglages
- light.lampe_1
- light.lampe_2
presets: 4 # facultatif : nombre de préréglages (1 à 4)
```
La carte a aussi un éditeur visuel.
## Actions
`light_preset_manager.save_preset`, `recall_preset`, `rename_preset`, `get_presets` (voir *Outils de développement >
Actions*).
## Blueprint
`Blueprints/Stybarr-groups.yaml` : piloter un groupe de lumières avec une télécommande IKEA STYRBAR.
## Développement
- Home Assistant dans Docker : `docker compose up -d` (tâche VS Code *Dev: Start All*), puis http://localhost:8123.
L'intégration est montée depuis `custom_components/` ; redémarrer Home Assistant après une modification Python.
- Carte : `npm install` puis `npm run watch` dans `frontend/` ; le fichier construit va dans
`custom_components/light_preset_manager/frontend/` (commité).
- Fichier de release : `python scripts/package.py` → `dist/light_preset_manager-X.Y.Z.zip` (version lue dans
`manifest.json`).
## Licence
MIT, voir le fichier LICENSE.
+53
View File
@@ -0,0 +1,53 @@
# Light Preset Manager
*[Version française](README.fr.md)*
Home Assistant custom integration with its Lovelace card: control a group of lights (on/off, brightness, colour
temperature) and save up to four presets of their states, recalled with one tap. Home Assistant 2024.7.0 or later.
## Installation
1. Download `light_preset_manager-X.Y.Z.zip` from the project page on
[a2msystemes.org](https://a2msystemes.org/projets/light_preset_manager).
2. Unzip it into `config/custom_components/light_preset_manager/` of your Home Assistant installation.
3. Add this line to `configuration.yaml`, then restart Home Assistant:
```yaml
light_preset_manager:
```
The card is loaded automatically by the integration (no Lovelace resource to add).
## Card
```yaml
type: custom:light-preset-manager
card_id: living_room # required: unique identifier, presets are stored under it
group: light.living_room # required: group or light controlled by the main buttons
title: Living room # optional
lights: # optional: individual lights saved in presets
- light.lamp_1
- light.lamp_2
presets: 4 # optional: number of presets (1 to 4)
```
The card also has a visual editor.
## Actions
`light_preset_manager.save_preset`, `recall_preset`, `rename_preset`, `get_presets` (see *Developer tools > Actions*).
## Blueprint
`Blueprints/Stybarr-groups.yaml`: control a group of lights with an IKEA STYRBAR remote.
## Development
- Home Assistant in Docker: `docker compose up -d` (VS Code task *Dev: Start All*), then http://localhost:8123.
The integration is mounted from `custom_components/`; restart Home Assistant after a Python change.
- Card: `npm install` then `npm run watch` in `frontend/`; the built file goes to
`custom_components/light_preset_manager/frontend/` (committed).
- Release file: `python scripts/package.py` → `dist/light_preset_manager-X.Y.Z.zip` (version from `manifest.json`).
## License
MIT, see the LICENSE file.
@@ -3,18 +3,22 @@
from __future__ import annotations
import logging
from pathlib import Path
from typing import Any
import voluptuous as vol
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.components.frontend import add_extra_js_url
from homeassistant.components.http import StaticPathConfig
from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback
from homeassistant.loader import async_get_integration
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.storage import Store
from homeassistant.helpers.typing import ConfigType
from homeassistant.components import websocket_api
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ATTR_COLOR_TEMP,
ATTR_COLOR_TEMP_KELVIN,
ATTR_RGB_COLOR,
ATTR_XY_COLOR,
ATTR_HS_COLOR,
@@ -28,6 +32,8 @@ from homeassistant.const import (
from .const import (
DOMAIN,
CARD_NAME,
CARD_URL,
STORAGE_KEY,
STORAGE_VERSION,
SERVICE_SAVE_PRESET,
@@ -44,6 +50,9 @@ from .const import (
_LOGGER = logging.getLogger(__name__)
# Mireds key of presets saved before 0.6.0 (no longer accepted by light.turn_on)
LEGACY_COLOR_TEMP = "color_temp"
# Config schema
CONFIG_SCHEMA = vol.Schema(
{DOMAIN: vol.Schema({})},
@@ -102,6 +111,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
# Register WebSocket commands
websocket_api.async_register_command(hass, websocket_get_presets)
# Serve the Lovelace card and load it in the frontend (version in the URL: no stale cache)
integration = await async_get_integration(hass, DOMAIN)
card = Path(__file__).parent / "frontend" / f"{CARD_NAME}.js"
await hass.http.async_register_static_paths(
[StaticPathConfig(CARD_URL, str(card), True)]
)
add_extra_js_url(hass, f"{CARD_URL}?v={integration.version}")
async def async_save_preset(call: ServiceCall) -> None:
"""Save current light states to a preset."""
card_id = call.data[ATTR_CARD_ID]
@@ -166,8 +183,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
# Color descriptors are mutually exclusive - pick one based on priority
# Priority: color_temp > rgb_color > hs_color > xy_color
if ATTR_COLOR_TEMP in light_state:
service_data[ATTR_COLOR_TEMP] = light_state[ATTR_COLOR_TEMP]
if ATTR_COLOR_TEMP_KELVIN in light_state:
service_data[ATTR_COLOR_TEMP_KELVIN] = light_state[
ATTR_COLOR_TEMP_KELVIN
]
elif LEGACY_COLOR_TEMP in light_state:
# Presets saved before 0.6.0: mireds
service_data[ATTR_COLOR_TEMP_KELVIN] = round(
1_000_000 / light_state[LEGACY_COLOR_TEMP]
)
elif ATTR_RGB_COLOR in light_state:
service_data[ATTR_RGB_COLOR] = light_state[ATTR_RGB_COLOR]
elif ATTR_HS_COLOR in light_state:
@@ -237,7 +261,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
DOMAIN, SERVICE_RENAME_PRESET, async_rename_preset, schema=RENAME_PRESET_SCHEMA
)
hass.services.async_register(
DOMAIN, SERVICE_GET_PRESETS, handle_get_presets, schema=GET_PRESETS_SCHEMA
DOMAIN,
SERVICE_GET_PRESETS,
handle_get_presets,
schema=GET_PRESETS_SCHEMA,
supports_response=SupportsResponse.ONLY,
)
_LOGGER.info("Light Preset Manager initialized")
Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

@@ -1,7 +1,10 @@
"""Constants for Light Preset Manager."""
DOMAIN = "light_preset_manager"
VERSION = "0.6.0"
# Lovelace card: built by frontend/ (npm run build), served by the integration
CARD_NAME = "light-preset-manager"
CARD_URL = f"/{DOMAIN}/{CARD_NAME}.js"
# Storage
STORAGE_KEY = f"{DOMAIN}.presets"
@@ -1213,6 +1213,8 @@ var getEntityName = (entity, customName) => {
if (customName) return customName;
return entity?.attributes.friendly_name || entity?.entity_id || "Unknown";
};
var kelvinToMireds = (kelvin) => Math.round(1e6 / kelvin);
var miredsToKelvin = (mireds) => Math.round(1e6 / mireds);
var supportsColorTemp = (entity) => {
const modes = entity?.attributes.supported_color_modes || [];
return modes.includes("color_temp");
@@ -1223,9 +1225,9 @@ function captureLightState(entity) {
state: entity.state === "on" ? "on" : "off"
};
if (entity.state === "on") {
const { brightness, color_temp, rgb_color, xy_color, hs_color } = entity.attributes;
const { brightness, color_temp_kelvin, rgb_color, xy_color, hs_color } = entity.attributes;
if (brightness !== void 0) state.brightness = brightness;
if (color_temp !== void 0) state.color_temp = color_temp;
if (color_temp_kelvin != null) state.color_temp_kelvin = color_temp_kelvin;
if (rgb_color !== void 0) state.rgb_color = rgb_color;
if (xy_color !== void 0) state.xy_color = xy_color;
if (hs_color !== void 0) state.hs_color = hs_color;
@@ -1243,8 +1245,9 @@ function getLightsFromGroup(groupEntity, configLights) {
}
function getCurrentTempZone(entity, temperatures) {
if (!entity || entity.state !== "on") return null;
const colorTemp = entity.attributes.color_temp;
if (colorTemp === void 0) return null;
const kelvin = entity.attributes.color_temp_kelvin;
if (kelvin == null) return null;
const colorTemp = kelvinToMireds(kelvin);
const warmNeutralMid = (temperatures.warm + temperatures.neutral) / 2;
const neutralColdMid = (temperatures.neutral + temperatures.cold) / 2;
if (colorTemp >= warmNeutralMid) return "warm";
@@ -2014,7 +2017,7 @@ var LightPresetManager = class extends i4 {
if (!this.hass || !this._config) return;
this.hass.callService("light", "turn_on", {
entity_id: this._config.group,
color_temp: this._config.temperatures[temp]
color_temp_kelvin: miredsToKelvin(this._config.temperatures[temp])
});
}
// ---------------------------------------------------------------------------
@@ -2041,7 +2044,7 @@ var LightPresetManager = class extends i4 {
if (!this.hass || !this._config) return;
this.hass.callService("light", "turn_on", {
entity_id: entityId,
color_temp: this._config.temperatures[temp]
color_temp_kelvin: miredsToKelvin(this._config.temperatures[temp])
});
}
// ---------------------------------------------------------------------------
@@ -1,12 +1,12 @@
{
"domain": "light_preset_manager",
"name": "Light Preset Manager",
"version": "0.6.0",
"documentation": "https://github.com/your-repo/light-preset-manager",
"issue_tracker": "https://github.com/your-repo/light-preset-manager/issues",
"dependencies": [],
"codeowners": ["@your-username"],
"requirements": [],
"codeowners": ["@ange"],
"dependencies": ["frontend", "http"],
"documentation": "https://a2msystemes.org/projets/light_preset_manager",
"integration_type": "service",
"iot_class": "local_push",
"integration_type": "service"
}
"issue_tracker": "https://a2msystemes-git.duckdns.org/ange/HA-Light_preset_manager/issues",
"requirements": [],
"version": "0.6.0"
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "light-preset-manager-card",
"version": "1.0.0",
"version": "0.6.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "light-preset-manager-card",
"version": "1.0.0",
"version": "0.6.0",
"license": "MIT",
"dependencies": {
"lit": "^3.3.2"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "light-preset-manager-card",
"version": "1.0.0",
"version": "0.6.0",
"description": "Light control panel with savable presets for Home Assistant",
"main": "dist/light-preset-manager.js",
"scripts": {
+1 -3
View File
@@ -3,7 +3,7 @@
// =============================================================================
// Copies the built JS file to all required locations:
// 1. custom_components/.../frontend/ → For HACS distribution
// 2. ha-dev-config/www/ → For local development testing
// (served by the integration itself, also in the dev Home Assistant: no copy to www/)
const fs = require('fs');
const path = require('path');
@@ -15,8 +15,6 @@ const SOURCE = path.resolve(__dirname, '../dist/light-preset-manager.js');
const TARGETS = [
// Production location (HACS will use this)
path.resolve(__dirname, '../../custom_components/light_preset_manager/frontend/light-preset-manager.js'),
// Development location (served at /local/ by HA)
path.resolve(__dirname, '../../ha-dev-config/www/light-preset-manager.js'),
];
// Ensure each target directory exists, then copy
-1
View File
@@ -15,7 +15,6 @@ const path = require('path');
const SOURCE = path.resolve(__dirname, '../dist/light-preset-manager.js');
const TARGETS = [
path.resolve(__dirname, '../../custom_components/light_preset_manager/frontend/light-preset-manager.js'),
path.resolve(__dirname, '../../ha-dev-config/www/light-preset-manager.js'),
];
// Helper: copy built file to all targets
+3 -2
View File
@@ -23,6 +23,7 @@ import {
supportsColorTemp,
getCurrentTempZone,
captureLightState,
miredsToKelvin,
} from "./utils";
import { detectLocale, getTranslations } from "./locales";
@@ -395,7 +396,7 @@ export class LightPresetManager extends LitElement {
if (!this.hass || !this._config) return;
this.hass.callService("light", "turn_on", {
entity_id: this._config.group,
color_temp: this._config.temperatures[temp],
color_temp_kelvin: miredsToKelvin(this._config.temperatures[temp]),
});
}
@@ -426,7 +427,7 @@ export class LightPresetManager extends LitElement {
if (!this.hass || !this._config) return;
this.hass.callService("light", "turn_on", {
entity_id: entityId,
color_temp: this._config.temperatures[temp],
color_temp_kelvin: miredsToKelvin(this._config.temperatures[temp]),
});
}
+2 -1
View File
@@ -99,7 +99,8 @@ export interface LightState {
entity_id: string;
state: "on" | "off";
brightness?: number;
color_temp?: number;
color_temp_kelvin?: number;
color_temp?: number; // mireds, presets saved before 0.6.0
rgb_color?: [number, number, number];
xy_color?: [number, number];
hs_color?: [number, number];
+6 -4
View File
@@ -128,10 +128,10 @@ export function captureLightState(entity: HassEntity): LightState {
};
if (entity.state === "on") {
const { brightness, color_temp, rgb_color, xy_color, hs_color } =
const { brightness, color_temp_kelvin, rgb_color, xy_color, hs_color } =
entity.attributes;
if (brightness !== undefined) state.brightness = brightness;
if (color_temp !== undefined) state.color_temp = color_temp;
if (color_temp_kelvin != null) state.color_temp_kelvin = color_temp_kelvin;
if (rgb_color !== undefined) state.rgb_color = rgb_color;
if (xy_color !== undefined) state.xy_color = xy_color;
if (hs_color !== undefined) state.hs_color = hs_color;
@@ -168,8 +168,10 @@ export function getCurrentTempZone(
): TemperatureType | null {
if (!entity || entity.state !== "on") return null;
const colorTemp = entity.attributes.color_temp;
if (colorTemp === undefined) return null;
// Zones are configured in mireds; lights report kelvins
const kelvin = entity.attributes.color_temp_kelvin;
if (kelvin == null) return null;
const colorTemp = kelvinToMireds(kelvin);
// Calculate midpoints between zones
const warmNeutralMid = (temperatures.warm + temperatures.neutral) / 2;
-1
View File
@@ -1 +0,0 @@
2025.12.5
-1
View File
@@ -1 +0,0 @@
{"pid": 68, "version": 1, "ha_version": "2025.12.5", "start_ts": 1767291664.449257}
@@ -1,58 +0,0 @@
blueprint:
name: Motion-activated Light
description: Turn on a light when motion is detected.
domain: automation
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml
author: Home Assistant
input:
motion_entity:
name: Motion Sensor
selector:
entity:
filter:
- device_class: occupancy
domain: binary_sensor
- device_class: motion
domain: binary_sensor
light_target:
name: Light
selector:
target:
entity:
domain: light
no_motion_wait:
name: Wait time
description: Time to leave the light on after last motion is detected.
default: 120
selector:
number:
min: 0
max: 3600
unit_of_measurement: seconds
# If motion is detected within the delay,
# we restart the script.
mode: restart
max_exceeded: silent
triggers:
trigger: state
entity_id: !input motion_entity
from: "off"
to: "on"
actions:
- alias: "Turn on the light"
action: light.turn_on
target: !input light_target
- alias: "Wait until there is no motion from device"
wait_for_trigger:
trigger: state
entity_id: !input motion_entity
from: "on"
to: "off"
- alias: "Wait the number of seconds that has been set"
delay: !input no_motion_wait
- alias: "Turn off the light"
action: light.turn_off
target: !input light_target
@@ -1,50 +0,0 @@
blueprint:
name: Zone Notification
description: Send a notification to a device when a person leaves a specific zone.
domain: automation
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/notify_leaving_zone.yaml
author: Home Assistant
input:
person_entity:
name: Person
selector:
entity:
filter:
domain: person
zone_entity:
name: Zone
selector:
entity:
filter:
domain: zone
notify_device:
name: Device to notify
description: Device needs to run the official Home Assistant app to receive notifications.
selector:
device:
filter:
integration: mobile_app
triggers:
trigger: state
entity_id: !input person_entity
variables:
zone_entity: !input zone_entity
# This is the state of the person when it's in this zone.
zone_state: "{{ states[zone_entity].name }}"
person_entity: !input person_entity
person_name: "{{ states[person_entity].name }}"
conditions:
condition: template
# The first case handles leaving the Home zone which has a special state when zoning called 'home'.
# The second case handles leaving all other zones.
value_template: "{{ zone_entity == 'zone.home' and trigger.from_state.state == 'home' and trigger.to_state.state != 'home' or trigger.from_state.state == zone_state and trigger.to_state.state != zone_state }}"
actions:
- alias: "Notify that a person has left the zone"
domain: mobile_app
type: notify
device_id: !input notify_device
message: "{{ person_name }} has left {{ zone_state }}"
@@ -1,86 +0,0 @@
blueprint:
name: Confirmable Notification
description: >-
A script that sends an actionable notification with a confirmation before
running the specified action.
domain: script
source_url: https://github.com/home-assistant/core/blob/master/homeassistant/components/script/blueprints/confirmable_notification.yaml
author: Home Assistant
input:
notify_device:
name: Device to notify
description: Device needs to run the official Home Assistant app to receive notifications.
selector:
device:
filter:
integration: mobile_app
title:
name: "Title"
description: "The title of the button shown in the notification."
default: ""
selector:
text:
message:
name: "Message"
description: "The message body"
selector:
text:
confirm_text:
name: "Confirmation Text"
description: "Text to show on the confirmation button"
default: "Confirm"
selector:
text:
confirm_action:
name: "Confirmation Action"
description: "Action to run when notification is confirmed"
default: []
selector:
action:
dismiss_text:
name: "Dismiss Text"
description: "Text to show on the dismiss button"
default: "Dismiss"
selector:
text:
dismiss_action:
name: "Dismiss Action"
description: "Action to run when notification is dismissed"
default: []
selector:
action:
mode: restart
sequence:
- alias: "Set up variables"
variables:
action_confirm: "{{ 'CONFIRM_' ~ context.id }}"
action_dismiss: "{{ 'DISMISS_' ~ context.id }}"
- alias: "Send notification"
domain: mobile_app
type: notify
device_id: !input notify_device
title: !input title
message: !input message
data:
actions:
- action: "{{ action_confirm }}"
title: !input confirm_text
- action: "{{ action_dismiss }}"
title: !input dismiss_text
- alias: "Awaiting response"
wait_for_trigger:
- trigger: event
event_type: mobile_app_notification_action
event_data:
action: "{{ action_confirm }}"
- trigger: event
event_type: mobile_app_notification_action
event_data:
action: "{{ action_dismiss }}"
- choose:
- conditions: "{{ wait.trigger.event.data.action == action_confirm }}"
sequence: !input confirm_action
- conditions: "{{ wait.trigger.event.data.action == action_dismiss }}"
sequence: !input dismiss_action
-178
View File
@@ -1,178 +0,0 @@
2026-01-01 19:15:41.401 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration light_preset_manager which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant
2026-01-01 19:15:41.405 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration light_preset_manager which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant
2026-01-01 19:15:41.915 INFO (MainThread) [homeassistant.setup] Setting up system_log
2026-01-01 19:15:41.915 INFO (MainThread) [homeassistant.setup] Setting up http
2026-01-01 19:15:41.939 INFO (MainThread) [homeassistant.setup] Setup of domain logger took 0.02 seconds
2026-01-01 19:15:41.940 INFO (MainThread) [homeassistant.setup] Setup of domain system_log took 0.02 seconds
2026-01-01 19:15:41.940 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.02 seconds
2026-01-01 19:15:41.940 INFO (MainThread) [homeassistant.setup] Setting up websocket_api
2026-01-01 19:15:41.940 INFO (MainThread) [homeassistant.setup] Setup of domain websocket_api took 0.00 seconds
2026-01-01 19:15:41.944 INFO (MainThread) [homeassistant.setup] Setting up network
2026-01-01 19:15:41.945 INFO (MainThread) [homeassistant.setup] Setup of domain network took 0.00 seconds
2026-01-01 19:15:41.945 INFO (MainThread) [homeassistant.bootstrap] Setting up stage labs: {'labs'}; already set up: {}
Dependencies: {}; already set up: {}
2026-01-01 19:15:41.946 INFO (MainThread) [homeassistant.setup] Setting up labs
2026-01-01 19:15:41.946 INFO (MainThread) [homeassistant.setup] Setup of domain labs took 0.00 seconds
2026-01-01 19:15:41.946 INFO (MainThread) [homeassistant.bootstrap] Setting up stage frontend: {'frontend'}; already set up: {}
Dependencies: {'api', 'file_upload', 'auth', 'search', 'onboarding', 'device_automation', 'config', 'diagnostics', 'lovelace', 'repairs'}; already set up: {'websocket_api', 'http', 'system_log'}
2026-01-01 19:15:41.946 INFO (MainThread) [homeassistant.setup] Setting up api
2026-01-01 19:15:41.946 INFO (MainThread) [homeassistant.setup] Setup of domain api took 0.00 seconds
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setting up file_upload
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setup of domain file_upload took 0.00 seconds
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setting up auth
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setup of domain auth took 0.00 seconds
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setting up search
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setup of domain search took 0.00 seconds
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setting up onboarding
2026-01-01 19:15:41.947 INFO (MainThread) [homeassistant.setup] Setting up device_automation
2026-01-01 19:15:41.948 INFO (MainThread) [homeassistant.setup] Setup of domain device_automation took 0.00 seconds
2026-01-01 19:15:41.948 INFO (MainThread) [homeassistant.setup] Setting up config
2026-01-01 19:15:41.949 INFO (MainThread) [homeassistant.setup] Setup of domain config took 0.00 seconds
2026-01-01 19:15:41.949 INFO (MainThread) [homeassistant.setup] Setting up diagnostics
2026-01-01 19:15:41.950 INFO (MainThread) [homeassistant.setup] Setup of domain diagnostics took 0.00 seconds
2026-01-01 19:15:41.950 INFO (MainThread) [homeassistant.setup] Setting up repairs
2026-01-01 19:15:41.950 INFO (MainThread) [homeassistant.setup] Setup of domain repairs took 0.00 seconds
2026-01-01 19:15:41.955 INFO (MainThread) [homeassistant.setup] Setup of domain onboarding took 0.01 seconds
2026-01-01 19:15:41.955 INFO (MainThread) [homeassistant.setup] Setting up lovelace
2026-01-01 19:15:41.956 INFO (MainThread) [homeassistant.setup] Setup of domain lovelace took 0.00 seconds
2026-01-01 19:15:41.960 INFO (MainThread) [homeassistant.setup] Setting up frontend
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.setup] Setup of domain frontend took 0.01 seconds
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage recorder: {'recorder'}
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage debugger: {'debugpy'}
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage zeroconf: {'zeroconf'}
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage 1: {'dhcp', 'ssdp', 'bluetooth', 'hassio', 'usb', 'cloud', 'mqtt_eventstream'}
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.bootstrap] Setting up stage 2: {'input_boolean', 'input_datetime', 'automation', 'input_select', 'application_credentials', 'timer', 'script', 'backup', 'system_health', 'hardware', 'input_button', 'input_number', 'scene', 'tag', 'mqtt', 'shopping_list', 'counter', 'person', 'analytics', 'input_text', 'google_translate', 'schedule', 'zone', 'radio_browser', 'light_preset_manager'}; already set up: {'logger', 'api', 'homeassistant', 'http', 'config', 'network', 'labs', 'frontend'}
Dependencies: {'image_upload', 'trace', 'blueprint'}; already set up: {'api', 'file_upload', 'auth', 'http', 'device_automation', 'websocket_api'}
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.setup] Setting up scene
2026-01-01 19:15:41.966 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2026-01-01 19:15:41.967 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2026-01-01 19:15:41.967 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2026-01-01 19:15:41.967 INFO (MainThread) [homeassistant.setup] Setup of domain scene took 0.00 seconds
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setting up blueprint
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setup of domain blueprint took 0.00 seconds
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setting up trace
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setup of domain trace took 0.00 seconds
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setting up automation
2026-01-01 19:15:41.968 INFO (MainThread) [homeassistant.setup] Setup of domain automation took 0.00 seconds
2026-01-01 19:15:41.969 INFO (MainThread) [homeassistant.setup] Setting up zone
2026-01-01 19:15:41.969 INFO (MainThread) [homeassistant.setup] Setup of domain zone took 0.00 seconds
2026-01-01 19:15:41.969 INFO (MainThread) [homeassistant.setup] Setting up script
2026-01-01 19:15:41.970 INFO (MainThread) [homeassistant.setup] Setup of domain script took 0.00 seconds
2026-01-01 19:15:41.970 INFO (MainThread) [homeassistant.setup] Setting up system_health
2026-01-01 19:15:41.970 INFO (MainThread) [homeassistant.setup] Setup of domain system_health took 0.00 seconds
2026-01-01 19:15:41.970 INFO (MainThread) [homeassistant.setup] Setting up input_number
2026-01-01 19:15:41.971 INFO (MainThread) [homeassistant.setup] Setup of domain input_number took 0.00 seconds
2026-01-01 19:15:41.973 INFO (MainThread) [homeassistant.setup] Setting up input_boolean
2026-01-01 19:15:41.973 INFO (MainThread) [homeassistant.setup] Setup of domain input_boolean took 0.00 seconds
2026-01-01 19:15:41.975 INFO (MainThread) [homeassistant.components.http] Now listening on port 8123
2026-01-01 19:15:41.976 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.01 seconds
2026-01-01 19:15:41.978 INFO (MainThread) [homeassistant.setup] Setting up input_datetime
2026-01-01 19:15:41.979 INFO (MainThread) [homeassistant.setup] Setup of domain input_datetime took 0.00 seconds
2026-01-01 19:15:41.981 INFO (MainThread) [homeassistant.setup] Setting up tag
2026-01-01 19:15:41.982 INFO (MainThread) [homeassistant.setup] Setup of domain tag took 0.00 seconds
2026-01-01 19:15:41.985 INFO (MainThread) [homeassistant.setup] Setting up image_upload
2026-01-01 19:15:41.986 INFO (MainThread) [homeassistant.setup] Setup of domain image_upload took 0.00 seconds
2026-01-01 19:15:41.986 INFO (MainThread) [homeassistant.setup] Setting up person
2026-01-01 19:15:41.986 INFO (MainThread) [homeassistant.setup] Setup of domain person took 0.00 seconds
2026-01-01 19:15:41.989 INFO (MainThread) [homeassistant.setup] Setting up input_select
2026-01-01 19:15:41.990 INFO (MainThread) [homeassistant.setup] Setup of domain input_select took 0.00 seconds
2026-01-01 19:15:41.992 INFO (MainThread) [homeassistant.setup] Setting up application_credentials
2026-01-01 19:15:41.992 INFO (MainThread) [homeassistant.setup] Setup of domain application_credentials took 0.00 seconds
2026-01-01 19:15:42.000 INFO (MainThread) [homeassistant.setup] Setting up shopping_list
2026-01-01 19:15:42.000 INFO (MainThread) [homeassistant.setup] Setup of domain shopping_list took 0.00 seconds
2026-01-01 19:15:42.002 INFO (MainThread) [homeassistant.setup] Setting up counter
2026-01-01 19:15:42.003 INFO (MainThread) [homeassistant.setup] Setup of domain counter took 0.00 seconds
2026-01-01 19:15:42.005 INFO (MainThread) [homeassistant.setup] Setting up timer
2026-01-01 19:15:42.005 INFO (MainThread) [homeassistant.setup] Setup of domain timer took 0.00 seconds
2026-01-01 19:15:42.011 INFO (MainThread) [homeassistant.setup] Setting up input_text
2026-01-01 19:15:42.011 INFO (MainThread) [homeassistant.setup] Setup of domain input_text took 0.00 seconds
2026-01-01 19:15:42.013 INFO (MainThread) [homeassistant.setup] Setting up backup
2026-01-01 19:15:42.016 INFO (MainThread) [homeassistant.setup] Setting up schedule
2026-01-01 19:15:42.016 INFO (MainThread) [homeassistant.setup] Setup of domain schedule took 0.00 seconds
2026-01-01 19:15:42.017 INFO (MainThread) [homeassistant.setup] Setup of domain backup took 0.00 seconds
2026-01-01 19:15:42.018 INFO (MainThread) [homeassistant.setup] Setting up input_button
2026-01-01 19:15:42.018 INFO (MainThread) [homeassistant.setup] Setup of domain input_button took 0.00 seconds
2026-01-01 19:15:42.046 WARNING (ImportExecutor_0) [homeassistant.components.light] The deprecated constant ATTR_COLOR_TEMP was used from light_preset_manager. It will be removed in HA Core 2026.1. Use kelvin equivalent (ATTR_COLOR_TEMP_KELVIN) instead, please report it to the author of the 'light_preset_manager' custom integration
2026-01-01 19:15:42.047 WARNING (ImportExecutor_0) [homeassistant.components.light] The deprecated constant ATTR_COLOR_TEMP was used from light_preset_manager. It will be removed in HA Core 2026.1. Use kelvin equivalent (ATTR_COLOR_TEMP_KELVIN) instead, please report it to the author of the 'light_preset_manager' custom integration
2026-01-01 19:15:42.060 INFO (MainThread) [homeassistant.setup] Setting up light_preset_manager
2026-01-01 19:15:42.071 INFO (MainThread) [custom_components.light_preset_manager] Light Preset Manager initialized
2026-01-01 19:15:42.071 INFO (MainThread) [homeassistant.setup] Setup of domain light_preset_manager took 0.01 seconds
2026-01-01 19:15:42.081 INFO (MainThread) [homeassistant.setup] Setting up mqtt
2026-01-01 19:15:42.081 INFO (MainThread) [homeassistant.setup] Setup of domain mqtt took 0.00 seconds
2026-01-01 19:15:42.085 INFO (MainThread) [homeassistant.setup] Setting up todo
2026-01-01 19:15:42.086 INFO (MainThread) [homeassistant.setup] Setup of domain todo took 0.00 seconds
2026-01-01 19:15:42.087 INFO (MainThread) [homeassistant.components.todo] Setting up shopping_list.todo
2026-01-01 19:15:42.108 INFO (MainThread) [homeassistant.setup] Setting up google_translate
2026-01-01 19:15:42.108 INFO (MainThread) [homeassistant.setup] Setup of domain google_translate took 0.00 seconds
2026-01-01 19:15:42.112 INFO (MainThread) [homeassistant.setup] Setting up hardware
2026-01-01 19:15:42.124 INFO (MainThread) [homeassistant.setup] Setup of domain hardware took 0.01 seconds
2026-01-01 19:15:42.176 INFO (MainThread) [homeassistant.setup] Setting up radio_browser
2026-01-01 19:15:42.176 INFO (MainThread) [homeassistant.setup] Setup of domain radio_browser took 0.00 seconds
2026-01-01 19:15:42.185 INFO (MainThread) [homeassistant.setup] Setting up analytics
2026-01-01 19:15:42.185 INFO (MainThread) [homeassistant.setup] Setup of domain analytics took 0.00 seconds
2026-01-01 19:15:42.188 INFO (MainThread) [homeassistant.setup] Setting up event
2026-01-01 19:15:42.188 INFO (MainThread) [homeassistant.setup] Setup of domain event took 0.00 seconds
2026-01-01 19:15:42.188 INFO (MainThread) [homeassistant.setup] Setting up sensor
2026-01-01 19:15:42.188 INFO (MainThread) [homeassistant.setup] Setup of domain sensor took 0.00 seconds
2026-01-01 19:15:42.189 INFO (MainThread) [homeassistant.components.event] Setting up backup.event
2026-01-01 19:15:42.190 INFO (MainThread) [homeassistant.components.sensor] Setting up backup.sensor
2026-01-01 19:15:42.230 INFO (MainThread) [homeassistant.setup] Setting up ffmpeg
2026-01-01 19:15:42.232 INFO (MainThread) [homeassistant.setup] Setup of domain ffmpeg took 0.00 seconds
2026-01-01 19:15:42.232 INFO (MainThread) [homeassistant.setup] Setting up tts
2026-01-01 19:15:42.241 INFO (MainThread) [homeassistant.setup] Setup of domain tts took 0.01 seconds
2026-01-01 19:15:42.247 INFO (MainThread) [homeassistant.components.tts] Setting up google_translate.tts
2026-01-01 19:15:43.097 INFO (MainThread) [homeassistant.setup] Setting up button
2026-01-01 19:15:43.097 INFO (MainThread) [homeassistant.setup] Setup of domain button took 0.00 seconds
2026-01-01 19:15:43.097 INFO (MainThread) [homeassistant.setup] Setting up select
2026-01-01 19:15:43.098 INFO (MainThread) [homeassistant.setup] Setup of domain select took 0.00 seconds
2026-01-01 19:15:43.098 INFO (MainThread) [homeassistant.setup] Setting up binary_sensor
2026-01-01 19:15:43.098 INFO (MainThread) [homeassistant.setup] Setup of domain binary_sensor took 0.00 seconds
2026-01-01 19:15:43.098 INFO (MainThread) [homeassistant.setup] Setting up switch
2026-01-01 19:15:43.098 INFO (MainThread) [homeassistant.setup] Setup of domain switch took 0.00 seconds
2026-01-01 19:15:43.099 INFO (MainThread) [homeassistant.setup] Setting up update
2026-01-01 19:15:43.099 INFO (MainThread) [homeassistant.setup] Setup of domain update took 0.00 seconds
2026-01-01 19:15:43.099 INFO (MainThread) [homeassistant.setup] Setting up light
2026-01-01 19:15:43.100 INFO (MainThread) [homeassistant.setup] Setup of domain light took 0.00 seconds
2026-01-01 19:15:43.102 INFO (MainThread) [homeassistant.components.scene] Setting up mqtt.scene
2026-01-01 19:15:43.102 INFO (MainThread) [homeassistant.components.button] Setting up mqtt.button
2026-01-01 19:15:43.102 INFO (MainThread) [homeassistant.components.select] Setting up mqtt.select
2026-01-01 19:15:43.103 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mqtt.binary_sensor
2026-01-01 19:15:43.103 INFO (MainThread) [homeassistant.components.switch] Setting up mqtt.switch
2026-01-01 19:15:43.103 INFO (MainThread) [homeassistant.components.update] Setting up mqtt.update
2026-01-01 19:15:43.103 INFO (MainThread) [homeassistant.components.sensor] Setting up mqtt.sensor
2026-01-01 19:15:43.103 INFO (MainThread) [homeassistant.components.light] Setting up mqtt.light
2026-01-01 19:15:43.106 INFO (MainThread) [homeassistant.bootstrap] Home Assistant initialized in 1.72s
2026-01-01 19:15:43.106 INFO (MainThread) [homeassistant.core] Starting Home Assistant 2025.12.5
2026-01-01 19:15:43.726 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_asleep_screens_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_asleep_screens"` option with `"default_entity_id": "button.WARMACHINE-PAPA_asleep_screens"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.727 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_awake_screens_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_awake_screens"` option with `"default_entity_id": "button.WARMACHINE-PAPA_awake_screens"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.727 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_veille_prolonge_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_veille_prolonge"` option with `"default_entity_id": "button.WARMACHINE-PAPA_veille_prolonge"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.728 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_play_pause_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_play_pause"` option with `"default_entity_id": "button.WARMACHINE-PAPA_play_pause"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.728 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_volume_up_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_volume_up"` option with `"default_entity_id": "button.WARMACHINE-PAPA_volume_up"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.729 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_volume_down_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_volume_down"` option with `"default_entity_id": "button.WARMACHINE-PAPA_volume_down"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.729 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_right_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_touche_right"` option with `"default_entity_id": "button.WARMACHINE-PAPA_touche_right"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.729 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_left_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_touche_left"` option with `"default_entity_id": "button.WARMACHINE-PAPA_touche_left"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.730 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_up_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_touche_up"` option with `"default_entity_id": "button.WARMACHINE-PAPA_touche_up"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.730 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_down_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_touche_down"` option with `"default_entity_id": "button.WARMACHINE-PAPA_touche_down"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.731 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_alt_tab_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_alt_tab"` option with `"default_entity_id": "button.WARMACHINE-PAPA_alt_tab"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.731 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_mute_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_mute"` option with `"default_entity_id": "button.WARMACHINE-PAPA_mute"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:43.732 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_veille_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_veille"` option with `"default_entity_id": "button.WARMACHINE-PAPA_veille"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.041 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_chargecpu_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_chargecpu"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_chargecpu"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.042 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_chargegpu_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_chargegpu"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_chargegpu"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.042 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_temp_gpu_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_temp_gpu"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_temp_gpu"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.043 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_screen_state_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_screen_state"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_screen_state"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.043 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_status_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_batterie_charge_status"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_batterie_charge_status"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.044 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_full_charge_lifetime_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_batterie_full_charge_lifetime"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_batterie_full_charge_lifetime"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.045 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_remaining_percentage_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_batterie_charge_remaining_percentage"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_batterie_charge_remaining_percentage"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.045 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_remaining_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_batterie_charge_remaining"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_batterie_charge_remaining"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.046 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_powerline_status_2 uses the deprecated option `object_id` to set the default entity id. Replace the `"object_id": "WARMACHINE-PAPA_batterie_powerline_status"` option with `"default_entity_id": "sensor.WARMACHINE-PAPA_batterie_powerline_status"` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4
2026-01-01 19:15:44.305 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [139775576393504] Received unknown command: recorder/info
2026-01-01 19:15:49.602 INFO (MainThread) [homeassistant.components.mqtt.client] MQTT client initialized, birth message sent
2026-01-01 19:16:30.483 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [139775576396064] Received unknown command: recorder/info
2026-01-01 19:16:35.482 WARNING (MainThread) [homeassistant.components.light] Got `color_temp` argument in `turn_on` service, which is deprecated and will break in Home Assistant 2026.1, please use `color_temp_kelvin` argument
2026-01-01 19:16:38.333 DEBUG (MainThread) [custom_components.light_preset_manager] Saved preset 1 for card bureau_lightcard
2026-01-01 19:16:41.652 WARNING (MainThread) [homeassistant.components.light] Got `color_temp` argument in `turn_on` service, which is deprecated and will break in Home Assistant 2026.1, please use `color_temp_kelvin` argument
2026-01-01 19:16:44.815 DEBUG (MainThread) [custom_components.light_preset_manager] Saved preset 2 for card bureau_lightcard
2026-01-01 19:16:48.408 WARNING (MainThread) [homeassistant.components.light] Got `color_temp` argument in `turn_on` service, which is deprecated and will break in Home Assistant 2026.1, please use `color_temp_kelvin` argument
2026-01-01 19:16:51.549 DEBUG (MainThread) [custom_components.light_preset_manager] Saved preset 3 for card bureau_lightcard
2026-01-01 19:16:53.097 WARNING (MainThread) [homeassistant.components.light] Got `color_temp` argument in `turn_on` service, which is deprecated and will break in Home Assistant 2026.1, please use `color_temp_kelvin` argument
2026-01-01 19:16:55.879 DEBUG (MainThread) [custom_components.light_preset_manager] Saved preset 4 for card bureau_lightcard
File diff suppressed because it is too large. Load diff
+4
View File
@@ -0,0 +1,4 @@
{
"name": "Light Preset Manager",
"homeassistant": "2024.7.0"
}
+37
View File
@@ -0,0 +1,37 @@
"""Construit dist/light_preset_manager-X.Y.Z.zip : le contenu de custom_components/light_preset_manager/ (pièce jointe de rôle download).
La version est celle de manifest.json. Le zip se décompresse dans config/custom_components/light_preset_manager/.
Usage : python scripts/package.py
"""
import json
import sys
import zipfile
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
SOURCE = ROOT / "custom_components" / "light_preset_manager"
EXCLUDED = {"__pycache__", ".pytest_cache"}
def main() -> int:
manifest = json.loads((SOURCE / "manifest.json").read_text(encoding="utf-8"))
if manifest["domain"] != SOURCE.name:
print(f"manifest.json : domain « {manifest['domain']} » différent du dossier « {SOURCE.name} »")
return 1
card = SOURCE / "frontend" / "light-preset-manager.js"
if not card.is_file():
print(f"{card.relative_to(ROOT)} absent : lancer « npm run build » dans frontend/")
return 1
target = ROOT / "dist" / f"{SOURCE.name}-{manifest['version']}.zip"
target.parent.mkdir(exist_ok=True)
with zipfile.ZipFile(target, "w", zipfile.ZIP_DEFLATED) as archive:
for path in sorted(SOURCE.rglob("*")):
if path.is_file() and not EXCLUDED & set(path.relative_to(SOURCE).parts) and path.suffix not in {".pyc", ".map"}:
archive.write(path, path.relative_to(SOURCE).as_posix())
print(target.relative_to(ROOT).as_posix())
return 0
if __name__ == "__main__":
sys.exit(main())