Adding full dev workflow with copy watch and VScode basic config

This commit is contained in:
ange committed 2025-12-31 11:03:44 +01:00
1 parent cd652f5680
commit 21c4ef1ac8
20 files changed
+2185 -815

No files matched your search

+3
View File
@@ -33,3 +33,6 @@ ha-dev-config/deps/
# Secrets
secrets.yaml
# Frontend build output
frontend/dist/*
!frontend/dist/.gitkeep
+20
View File
@@ -0,0 +1,20 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Open HA Dev",
"type": "chrome",
"request": "launch",
"url": "http://localhost:8123",
"webRoot": "${workspaceFolder}"
}
],
"compounds": [
{
"name": "Dev: Full Stack",
"configurations": ["Open HA Dev"],
"preLaunchTask": "Dev: Start All",
"stopAll": true
}
]
}
+1 -1
View File
@@ -16,7 +16,7 @@
"**/node_modules": true,
"**/.venv": true,
"ha-dev-config/.storage": true,
".gitignore": true,
//".gitignore": true,
"ha-dev-config/deps": true
}
}
+46 -14
View File
@@ -1,16 +1,6 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Frontend: Build",
"type": "shell",
"command": "npm run build",
"options": {
"cwd": "${workspaceFolder}/frontend"
},
"group": "build",
"problemMatcher": []
},
{
"label": "Frontend: Watch",
"type": "shell",
@@ -19,31 +9,73 @@
"cwd": "${workspaceFolder}/frontend"
},
"isBackground": true,
"problemMatcher": []
"problemMatcher": [],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"panel": "dedicated"
}
},
{
"label": "Frontend: Build",
"type": "shell",
"command": "npm run build",
"options": {
"cwd": "${workspaceFolder}/frontend"
},
"problemMatcher": [],
"group": "build"
},
{
"label": "HA: Start",
"type": "shell",
"command": "docker-compose up -d",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{
"label": "HA: Stop",
"type": "shell",
"command": "docker-compose down",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{
"label": "HA: Restart",
"type": "shell",
"command": "docker-compose restart",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{
"label": "HA: Logs",
"type": "shell",
"command": "docker-compose logs -f",
"problemMatcher": []
"command": "docker-compose logs -f --tail=100",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [],
"isBackground": true,
"presentation": {
"reveal": "always",
"panel": "dedicated"
}
},
{
"label": "Dev: Start All",
"dependsOn": ["HA: Start", "Frontend: Watch"],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
}
@@ -107,14 +107,14 @@ var y = class extends HTMLElement {
}
}
static getPropertyDescriptor(t4, s4, i5) {
const { get: e5, set: r5 } = h(this.prototype, t4) ?? { get() {
const { get: e5, set: r6 } = h(this.prototype, t4) ?? { get() {
return this[s4];
}, set(t5) {
this[s4] = t5;
} };
return { get: e5, set(s5) {
const h3 = e5?.call(this);
r5?.call(this, s5), this.requestUpdate(t4, h3, i5);
r6?.call(this, s5), this.requestUpdate(t4, h3, i5);
}, configurable: true, enumerable: true };
}
static getPropertyOptions(t4) {
@@ -199,20 +199,20 @@ var y = class extends HTMLElement {
if (void 0 !== e5 && this._$Em !== e5) {
const t5 = i5.getPropertyOptions(e5), h3 = "function" == typeof t5.converter ? { fromAttribute: t5.converter } : void 0 !== t5.converter?.fromAttribute ? t5.converter : u;
this._$Em = e5;
const r5 = h3.fromAttribute(s4, t5.type);
this[e5] = r5 ?? this._$Ej?.get(e5) ?? r5, this._$Em = null;
const r6 = h3.fromAttribute(s4, t5.type);
this[e5] = r6 ?? this._$Ej?.get(e5) ?? r6, this._$Em = null;
}
}
requestUpdate(t4, s4, i5, e5 = false, h3) {
if (void 0 !== t4) {
const r5 = this.constructor;
if (false === e5 && (h3 = this[t4]), i5 ??= r5.getPropertyOptions(t4), !((i5.hasChanged ?? f)(h3, s4) || i5.useDefault && i5.reflect && h3 === this._$Ej?.get(t4) && !this.hasAttribute(r5._$Eu(t4, i5)))) return;
const r6 = this.constructor;
if (false === e5 && (h3 = this[t4]), i5 ??= r6.getPropertyOptions(t4), !((i5.hasChanged ?? f)(h3, s4) || i5.useDefault && i5.reflect && h3 === this._$Ej?.get(t4) && !this.hasAttribute(r6._$Eu(t4, i5)))) return;
this.C(t4, s4, i5);
}
false === this.isUpdatePending && (this._$ES = this._$EP());
}
C(t4, s4, { useDefault: i5, reflect: e5, wrapped: h3 }, r5) {
i5 && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(t4) && (this._$Ej.set(t4, r5 ?? s4 ?? this[t4]), true !== h3 || void 0 !== r5) || (this._$AL.has(t4) || (this.hasUpdated || i5 || (s4 = void 0), this._$AL.set(t4, s4)), true === e5 && this._$Em !== t4 && (this._$Eq ??= /* @__PURE__ */ new Set()).add(t4));
C(t4, s4, { useDefault: i5, reflect: e5, wrapped: h3 }, r6) {
i5 && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(t4) && (this._$Ej.set(t4, r6 ?? s4 ?? this[t4]), true !== h3 || void 0 !== r6) || (this._$AL.has(t4) || (this.hasUpdated || i5 || (s4 = void 0), this._$AL.set(t4, s4)), true === e5 && this._$Em !== t4 && (this._$Eq ??= /* @__PURE__ */ new Set()).add(t4));
}
async _$EP() {
this.isUpdatePending = true;
@@ -325,7 +325,7 @@ var N = (t4, i5) => {
};
var S2 = class _S {
constructor({ strings: t4, _$litType$: i5 }, e5) {
let r5;
let r6;
this.parts = [];
let l3 = 0, a3 = 0;
const u3 = t4.length - 1, d3 = this.parts, [f3, v2] = N(t4, i5);
@@ -333,24 +333,24 @@ var S2 = class _S {
const t5 = this.el.content.firstChild;
t5.replaceWith(...t5.childNodes);
}
for (; null !== (r5 = P.nextNode()) && d3.length < u3; ) {
if (1 === r5.nodeType) {
if (r5.hasAttributes()) for (const t5 of r5.getAttributeNames()) if (t5.endsWith(h2)) {
const i6 = v2[a3++], s4 = r5.getAttribute(t5).split(o3), e6 = /([.?@])?(.*)/.exec(i6);
d3.push({ type: 1, index: l3, name: e6[2], strings: s4, ctor: "." === e6[1] ? I : "?" === e6[1] ? L : "@" === e6[1] ? z : H }), r5.removeAttribute(t5);
} else t5.startsWith(o3) && (d3.push({ type: 6, index: l3 }), r5.removeAttribute(t5));
if (y2.test(r5.tagName)) {
const t5 = r5.textContent.split(o3), i6 = t5.length - 1;
for (; null !== (r6 = P.nextNode()) && d3.length < u3; ) {
if (1 === r6.nodeType) {
if (r6.hasAttributes()) for (const t5 of r6.getAttributeNames()) if (t5.endsWith(h2)) {
const i6 = v2[a3++], s4 = r6.getAttribute(t5).split(o3), e6 = /([.?@])?(.*)/.exec(i6);
d3.push({ type: 1, index: l3, name: e6[2], strings: s4, ctor: "." === e6[1] ? I : "?" === e6[1] ? L : "@" === e6[1] ? z : H }), r6.removeAttribute(t5);
} else t5.startsWith(o3) && (d3.push({ type: 6, index: l3 }), r6.removeAttribute(t5));
if (y2.test(r6.tagName)) {
const t5 = r6.textContent.split(o3), i6 = t5.length - 1;
if (i6 > 0) {
r5.textContent = s2 ? s2.emptyScript : "";
for (let s4 = 0; s4 < i6; s4++) r5.append(t5[s4], c3()), P.nextNode(), d3.push({ type: 2, index: ++l3 });
r5.append(t5[i6], c3());
r6.textContent = s2 ? s2.emptyScript : "";
for (let s4 = 0; s4 < i6; s4++) r6.append(t5[s4], c3()), P.nextNode(), d3.push({ type: 2, index: ++l3 });
r6.append(t5[i6], c3());
}
}
} else if (8 === r5.nodeType) if (r5.data === n3) d3.push({ type: 2, index: l3 });
} else if (8 === r6.nodeType) if (r6.data === n3) d3.push({ type: 2, index: l3 });
else {
let t5 = -1;
for (; -1 !== (t5 = r5.data.indexOf(o3, t5 + 1)); ) d3.push({ type: 7, index: l3 }), t5 += o3.length - 1;
for (; -1 !== (t5 = r6.data.indexOf(o3, t5 + 1)); ) d3.push({ type: 7, index: l3 }), t5 += o3.length - 1;
}
l3++;
}
@@ -379,13 +379,13 @@ var R = class {
u(t4) {
const { el: { content: i5 }, parts: s4 } = this._$AD, e5 = (t4?.creationScope ?? l2).importNode(i5, true);
P.currentNode = e5;
let h3 = P.nextNode(), o6 = 0, n5 = 0, r5 = s4[0];
for (; void 0 !== r5; ) {
if (o6 === r5.index) {
let h3 = P.nextNode(), o6 = 0, n5 = 0, r6 = s4[0];
for (; void 0 !== r6; ) {
if (o6 === r6.index) {
let i6;
2 === r5.type ? i6 = new k(h3, h3.nextSibling, this, t4) : 1 === r5.type ? i6 = new r5.ctor(h3, r5.name, r5.strings, this, t4) : 6 === r5.type && (i6 = new Z(h3, this, t4)), this._$AV.push(i6), r5 = s4[++n5];
2 === r6.type ? i6 = new k(h3, h3.nextSibling, this, t4) : 1 === r6.type ? i6 = new r6.ctor(h3, r6.name, r6.strings, this, t4) : 6 === r6.type && (i6 = new Z(h3, this, t4)), this._$AV.push(i6), r6 = s4[++n5];
}
o6 !== r5?.index && (h3 = P.nextNode(), o6++);
o6 !== r6?.index && (h3 = P.nextNode(), o6++);
}
return P.currentNode = l2, e5;
}
@@ -469,8 +469,8 @@ var H = class {
if (void 0 === h3) t4 = M(this, t4, i5, 0), o6 = !a2(t4) || t4 !== this._$AH && t4 !== E, o6 && (this._$AH = t4);
else {
const e6 = t4;
let n5, r5;
for (t4 = h3[0], n5 = 0; n5 < h3.length - 1; n5++) r5 = M(this, e6[s4 + n5], i5, n5), r5 === E && (r5 = this._$AH[n5]), o6 ||= !a2(r5) || r5 !== this._$AH[n5], r5 === A ? t4 = A : t4 !== A && (t4 += (r5 ?? "") + h3[n5 + 1]), this._$AH[n5] = r5;
let n5, r6;
for (t4 = h3[0], n5 = 0; n5 < h3.length - 1; n5++) r6 = M(this, e6[s4 + n5], i5, n5), r6 === E && (r6 = this._$AH[n5]), o6 ||= !a2(r6) || r6 !== this._$AH[n5], r6 === A ? t4 = A : t4 !== A && (t4 += (r6 ?? "") + h3[n5 + 1]), this._$AH[n5] = r6;
}
o6 && !e5 && this.j(t4);
}
@@ -541,8 +541,8 @@ var i4 = class extends y {
return this.renderOptions.renderBefore ??= t4.firstChild, t4;
}
update(t4) {
const r5 = this.render();
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t4), this._$Do = D(r5, this.renderRoot, this.renderOptions);
const r6 = this.render();
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t4), this._$Do = D(r6, this.renderRoot, this.renderOptions);
}
connectedCallback() {
super.connectedCallback(), this._$Do?.setConnected(true);
@@ -568,76 +568,497 @@ var t3 = (t4) => (e5, o6) => {
// node_modules/@lit/reactive-element/decorators/property.js
var o5 = { attribute: true, type: String, converter: u, reflect: false, hasChanged: f };
var r4 = (t4 = o5, e5, r5) => {
const { kind: n5, metadata: i5 } = r5;
var r4 = (t4 = o5, e5, r6) => {
const { kind: n5, metadata: i5 } = r6;
let s4 = globalThis.litPropertyMetadata.get(i5);
if (void 0 === s4 && globalThis.litPropertyMetadata.set(i5, s4 = /* @__PURE__ */ new Map()), "setter" === n5 && ((t4 = Object.create(t4)).wrapped = true), s4.set(r5.name, t4), "accessor" === n5) {
const { name: o6 } = r5;
return { set(r6) {
if (void 0 === s4 && globalThis.litPropertyMetadata.set(i5, s4 = /* @__PURE__ */ new Map()), "setter" === n5 && ((t4 = Object.create(t4)).wrapped = true), s4.set(r6.name, t4), "accessor" === n5) {
const { name: o6 } = r6;
return { set(r7) {
const n6 = e5.get.call(this);
e5.set.call(this, r6), this.requestUpdate(o6, n6, t4, true, r6);
e5.set.call(this, r7), this.requestUpdate(o6, n6, t4, true, r7);
}, init(e6) {
return void 0 !== e6 && this.C(o6, void 0, t4, e6), e6;
} };
}
if ("setter" === n5) {
const { name: o6 } = r5;
return function(r6) {
const { name: o6 } = r6;
return function(r7) {
const n6 = this[o6];
e5.call(this, r6), this.requestUpdate(o6, n6, t4, true, r6);
e5.call(this, r7), this.requestUpdate(o6, n6, t4, true, r7);
};
}
throw Error("Unsupported decorator location: " + n5);
};
function n4(t4) {
return (e5, o6) => "object" == typeof o6 ? r4(t4, e5, o6) : ((t5, e6, o7) => {
const r5 = e6.hasOwnProperty(o7);
return e6.constructor.createProperty(o7, t5), r5 ? Object.getOwnPropertyDescriptor(e6, o7) : void 0;
const r6 = e6.hasOwnProperty(o7);
return e6.constructor.createProperty(o7, t5), r6 ? Object.getOwnPropertyDescriptor(e6, o7) : void 0;
})(t4, e5, o6);
}
// node_modules/@lit/reactive-element/decorators/state.js
function r5(r6) {
return n4({ ...r6, state: true, attribute: false });
}
// src/styles.ts
var mainStyles = i`
/* CSS Custom Properties for theming */
:host {
--lpm-temp-warm-color: #ff9800;
--lpm-temp-neutral-color: #9e9e9e;
--lpm-temp-cold-color: #2196f3;
--lpm-button-radius: 8px;
--lpm-preset-radius: 12px;
--lpm-spacing: 8px;
--lpm-padding: 16px;
--lpm-transition: 0.2s ease;
--lpm-preset-min-height: 70px;
--lpm-preset-font-size: 11px;
--lpm-popup-max-width: 300px;
display: block;
}
.card-content {
padding: var(--lpm-padding);
}
/* Temperature Buttons */
.temp-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.temp-button {
flex: 1;
padding: 12px var(--lpm-spacing);
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
font-family: inherit;
font-size: 12px;
}
.temp-button:hover {
background: var(--secondary-background-color);
}
.temp-button:active {
transform: scale(0.95);
}
.temp-button.warm {
border-bottom: 3px solid var(--lpm-temp-warm-color);
}
.temp-button.neutral {
border-bottom: 3px solid var(--lpm-temp-neutral-color);
}
.temp-button.cold {
border-bottom: 3px solid var(--lpm-temp-cold-color);
}
.temp-button ha-icon {
--mdc-icon-size: 24px;
}
/* Preset Buttons */
.preset-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.preset-button {
flex: 1;
aspect-ratio: 1;
min-height: var(--lpm-preset-min-height);
border: none;
border-radius: var(--lpm-preset-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
padding: var(--lpm-spacing);
font-family: inherit;
}
.preset-button:hover {
background: var(--secondary-background-color);
}
.preset-button:active {
transform: scale(0.95);
}
.preset-button.active {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.preset-button ha-icon {
--mdc-icon-size: 28px;
}
.preset-button .name {
font-size: var(--lpm-preset-font-size);
text-align: center;
word-wrap: break-word;
line-height: 1.2;
max-width: 90%;
}
/* Lights List */
.lights-list {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: var(--lpm-spacing);
padding-top: var(--lpm-spacing);
border-top: 1px solid var(--divider-color);
}
.light-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
}
.light-name {
font-size: 14px;
color: var(--primary-text-color);
}
.light-state {
font-size: 12px;
color: var(--secondary-text-color);
}
.light-state.on {
color: var(--success-color, #4caf50);
}
/* Popup */
.popup-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 999;
}
.popup-content {
background: var(--card-background-color, var(--primary-background-color));
border-radius: var(--lpm-preset-radius);
padding: 24px;
max-width: var(--lpm-popup-max-width);
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
.popup-title {
font-size: 1.2em;
font-weight: 500;
margin-bottom: 16px;
color: var(--primary-text-color);
}
.popup-message {
margin-bottom: 20px;
color: var(--secondary-text-color);
}
.popup-input {
width: 100%;
padding: 12px;
border: 1px solid var(--divider-color, #e0e0e0);
border-radius: var(--lpm-button-radius);
margin-bottom: 16px;
font-size: 1em;
box-sizing: border-box;
background: var(--primary-background-color);
color: var(--primary-text-color);
font-family: inherit;
}
.popup-input:focus {
outline: none;
border-color: var(--primary-color);
}
.popup-buttons {
display: flex;
gap: 12px;
justify-content: flex-end;
}
.popup-button {
padding: 10px 20px;
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
font-size: 0.95em;
font-family: inherit;
transition: all var(--lpm-transition);
}
.popup-button.cancel {
background: var(--secondary-background-color);
color: var(--primary-text-color);
}
.popup-button.confirm {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.popup-button:hover {
opacity: 0.9;
}
.popup-button:active {
transform: scale(0.95);
}
/* Debug (temporary) */
.debug-info {
background: var(--secondary-background-color);
border-radius: var(--lpm-button-radius);
padding: 12px;
margin-top: 12px;
font-family: monospace;
font-size: 12px;
}
.debug-info p {
margin: 4px 0;
color: var(--primary-text-color);
}
.state-on {
color: var(--success-color, #4caf50);
font-weight: bold;
}
.state-off {
color: var(--disabled-text-color, #999);
}
`;
// src/utils.ts
var DEFAULT_TEMPERATURES = {
warm: 370,
neutral: 285,
cold: 200
};
var DEFAULT_PRESETS = 4;
var DEFAULT_NAME = "Lights";
function validateConfig(config) {
if (!config.lights?.length) {
throw new Error('Config error: "lights" must be a non-empty array');
}
for (const light of config.lights) {
if (!light.startsWith("light.")) {
throw new Error(`Config error: "${light}" is not a light.* entity`);
}
}
if (config.presets !== void 0 && (config.presets < 1 || config.presets > 4)) {
throw new Error('Config error: "presets" must be between 1 and 4');
}
return {
lights: config.lights,
name: config.name || DEFAULT_NAME,
temperatures: {
warm: config.temperatures?.warm || DEFAULT_TEMPERATURES.warm,
neutral: config.temperatures?.neutral || DEFAULT_TEMPERATURES.neutral,
cold: config.temperatures?.cold || DEFAULT_TEMPERATURES.cold
},
presets: config.presets || DEFAULT_PRESETS
};
}
var isEntityOn = (entity) => entity?.state === "on";
var isEntityAvailable = (entity) => entity !== void 0 && !["unavailable", "unknown"].includes(entity.state);
var getBrightnessPercent = (entity) => {
const brightness = entity?.attributes.brightness;
return brightness ? Math.round(brightness / 255 * 100) : 0;
};
var getEntityName = (entity) => entity?.attributes.friendly_name || entity?.entity_id || "Unknown";
// src/locales.ts
var translations = {
en: {
card: {
loading: "Loading...",
unavailable: "Unavailable",
allOn: "All ON",
allOff: "All OFF",
partial: "Partial",
averageBrightness: "Average brightness",
lights: "Lights"
},
temperature: {
warm: "Warm",
neutral: "Neutral",
cold: "Cold"
},
preset: {
defaultName: "Preset",
save: "Save",
recall: "Recall",
rename: "Rename"
},
popup: {
confirmSaveTitle: "Confirm save",
confirmSaveMessage: "Save current state to",
renameTitle: "Rename preset",
cancel: "Cancel",
confirm: "Confirm",
save: "Save"
}
},
fr: {
card: {
loading: "Chargement...",
unavailable: "Indisponible",
allOn: "Toutes ON",
allOff: "Toutes OFF",
partial: "Partiel",
averageBrightness: "Luminosit\xE9 moyenne",
lights: "Lumi\xE8res"
},
temperature: {
warm: "Chaud",
neutral: "Neutre",
cold: "Froid"
},
preset: {
defaultName: "Preset",
save: "Enregistrer",
recall: "Rappeler",
rename: "Renommer"
},
popup: {
confirmSaveTitle: "Confirmer l'enregistrement",
confirmSaveMessage: "Enregistrer l'\xE9tat actuel dans",
renameTitle: "Renommer le preset",
cancel: "Annuler",
confirm: "Confirmer",
save: "Enregistrer"
}
}
};
function detectLocale(hassLanguage) {
if (!hassLanguage) return "en";
const lang = hassLanguage.split("-")[0].toLowerCase();
return lang in translations ? lang : "en";
}
function getTranslations(locale) {
return translations[locale];
}
// src/light-preset-manager.ts
var LightPresetManager = class extends i4 {
setConfig(config) {
this.config = config;
this._config = validateConfig(config);
}
updated(changedProps) {
if (changedProps.has("hass") && this.hass) {
this._t = getTranslations(detectLocale(this.hass.language));
}
}
get _lights() {
if (!this.hass || !this._config) return [];
return this._config.lights.map((id) => this.hass.states[id]);
}
get _isAnyOn() {
return this._lights.some((e5) => isEntityOn(e5));
}
get _isAllOn() {
return this._lights.every((e5) => isEntityOn(e5));
}
get _averageBrightness() {
const onLights = this._lights.filter((e5) => isEntityOn(e5));
if (!onLights.length) return 0;
const total = onLights.reduce((sum, e5) => sum + getBrightnessPercent(e5), 0);
return Math.round(total / onLights.length);
}
render() {
if (!this.hass || !this._config || !this._t) {
return b2`<ha-card
><div class="card-content">
${this._t?.card.loading || "Loading..."}
</div></ha-card
>`;
}
const t4 = this._t;
return b2`
<ha-card>
<div class="card">
<h1>🎉 Hello World!</h1>
<p>Light Preset Manager fonctionne.</p>
<p>Config: ${JSON.stringify(this.config)}</p>
<ha-card header="${this._config.name}">
<div class="card-content">
<div class="debug-info">
<p>
<strong>${t4.card.lights}:</strong> ${this._config.lights.length}
</p>
<p>
<strong>Status:</strong>
<span class="${this._isAnyOn ? "state-on" : "state-off"}">
${this._isAnyOn ? this._isAllOn ? t4.card.allOn : t4.card.partial : t4.card.allOff}
</span>
</p>
<p>
<strong>${t4.card.averageBrightness}:</strong> ${this._averageBrightness}%
</p>
</div>
<div class="lights-list">
${this._config.lights.map((id) => this._renderLightRow(id))}
</div>
</div>
</ha-card>
`;
}
_renderLightRow(entityId) {
const entity = this.hass?.states[entityId];
const isOn = isEntityOn(entity);
const available = isEntityAvailable(entity);
const brightness = getBrightnessPercent(entity);
const name = getEntityName(entity);
return b2`
<div class="light-row">
<span class="light-name">${name}</span>
<span class="light-state ${isOn ? "on" : ""}">
${!available ? this._t?.card.unavailable : isOn ? `${brightness}%` : "OFF"}
</span>
</div>
`;
}
getCardSize() {
return 3;
return 2 + Math.ceil((this._config?.lights.length || 0) / 2);
}
};
LightPresetManager.styles = i`
:host {
display: block;
padding: 16px;
}
.card {
background: var(--ha-card-background, #fff);
border-radius: 8px;
padding: 16px;
box-shadow: var(--ha-card-box-shadow, 0 2px 4px rgba(0, 0, 0, 0.1));
}
h1 {
margin: 0;
color: var(--primary-text-color);
}
`;
LightPresetManager.styles = mainStyles;
__decorateClass([
n4({ attribute: false })
], LightPresetManager.prototype, "hass", 2);
__decorateClass([
n4({ attribute: false })
], LightPresetManager.prototype, "config", 2);
r5()
], LightPresetManager.prototype, "_config", 2);
__decorateClass([
r5()
], LightPresetManager.prototype, "_t", 2);
LightPresetManager = __decorateClass([
t3("light-preset-manager")
], LightPresetManager);
@@ -645,9 +1066,14 @@ window.customCards = window.customCards || [];
window.customCards.push({
type: "light-preset-manager",
name: "Light Preset Manager",
description: "Panel de contr\xF4le lumi\xE8re avec presets"
description: "Light control panel with saveable presets",
preview: true
});
console.log("Light Preset Manager loaded!");
console.log(
"%c LIGHT-PRESET-MANAGER %c v0.2.0 ",
"background: #3498db; color: white; font-weight: bold; border-radius: 4px 0 0 4px;",
"background: #2ecc71; color: white; border-radius: 0 4px 4px 0;"
);
export {
LightPresetManager
};
+6 -12
View File
@@ -1,21 +1,15 @@
{
"name": "light-preset-manager-card",
"version": "1.0.0",
"description": "Light control panel with savable and virtually renamable presets for Homeassistant",
"description": "Light control panel with savable presets for Home Assistant",
"main": "dist/light-preset-manager.js",
"scripts": {
"build": "esbuild src/light-preset-manager.ts --bundle --outfile=../custom_components/light_preset_manager/frontend/light-preset-manager.js --format=esm",
"watch": "esbuild src/light-preset-manager.ts --bundle --outfile=../custom_components/light_preset_manager/frontend/light-preset-manager.js --format=esm --watch",
"dev": "npm run watch",
"build": "esbuild src/light-preset-manager.ts --bundle --format=esm --outfile=dist/light-preset-manager.js && node scripts/copy.js",
"watch": "node scripts/dev.js",
"typecheck": "tsc --noEmit",
"test": "echo \"Error: no test specified\" && exit 1"
"test": "echo \"No tests yet\" && exit 0"
},
"keywords": [
"homeassistant",
"lovelace",
"light",
"preset"
],
"keywords": ["homeassistant", "lovelace", "light", "preset"],
"author": "Ange-Marie MAURIN",
"license": "MIT",
"devDependencies": {
@@ -25,4 +19,4 @@
"dependencies": {
"lit": "^3.3.2"
}
}
}
+39
View File
@@ -0,0 +1,39 @@
// =============================================================================
// COPY SCRIPT
// =============================================================================
// 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
const fs = require('fs');
const path = require('path');
// Source: where esbuild outputs the compiled file
const SOURCE = path.resolve(__dirname, '../dist/light-preset-manager.js');
// Targets: where we need to copy the file
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
for (const target of TARGETS) {
const dir = path.dirname(target);
// Create directory if it doesn't exist
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
console.log(`📁 Created directory: ${dir}`);
}
// Copy the file
try {
fs.copyFileSync(SOURCE, target);
console.log(`✅ Copied to: ${path.relative(process.cwd(), target)}`);
} catch (err) {
console.error(`❌ Failed: ${err.message}`);
}
}
+92
View File
@@ -0,0 +1,92 @@
// =============================================================================
// DEV SCRIPT
// =============================================================================
// Watches TypeScript files and on each change:
// 1. Recompiles with esbuild
// 2. Copies the output to all required locations
//
// Usage: npm run watch
const { spawn, execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// Paths
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
function copyToTargets() {
for (const target of TARGETS) {
const dir = path.dirname(target);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
try {
fs.copyFileSync(SOURCE, target);
} catch (err) {
// Ignore errors on first run (file may not exist yet)
}
}
const time = new Date().toLocaleTimeString();
console.log(`📦 [${time}] Copied to all targets`);
}
// Helper: format current time
function time() {
return new Date().toLocaleTimeString();
}
// Start message
console.log('🚀 Starting development server...');
console.log('');
// Start esbuild in watch mode
const esbuild = spawn('npx', [
'esbuild',
'src/light-preset-manager.ts',
'--bundle',
'--format=esm',
'--outfile=dist/light-preset-manager.js',
'--sourcemap', // Enables debugging in browser
'--watch'
], {
cwd: path.resolve(__dirname, '..'),
shell: true,
stdio: 'pipe'
});
// Handle esbuild output
esbuild.stdout.on('data', (data) => {
const output = data.toString().trim();
if (!output) return;
console.log(output);
// When esbuild says "watching" or "done", copy the files
if (output.includes('watching') || output.includes('done')) {
copyToTargets();
console.log(`✅ [${time()}] Ready - Refresh your browser (Ctrl+Shift+R)`);
console.log('');
}
});
// Handle esbuild errors
esbuild.stderr.on('data', (data) => {
console.error(`❌ ${data.toString().trim()}`);
});
// Handle process exit
esbuild.on('close', (code) => {
console.log(`\n⏹️ esbuild stopped (code ${code})`);
});
// Handle Ctrl+C gracefully
process.on('SIGINT', () => {
console.log('\n👋 Stopping...');
esbuild.kill();
process.exit();
});
+120 -29
View File
@@ -1,53 +1,144 @@
import { LitElement, html, css } from "lit";
import { customElement, property } from "lit/decorators.js";
// =============================================================================
// LIGHT PRESET MANAGER - Main Component
// =============================================================================
import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import type {
HomeAssistant,
HassEntity,
LightPresetManagerConfig,
LightPresetManagerConfigInternal,
} from "./types";
import type { Translations } from "./locales";
import { mainStyles } from "./styles";
import {
validateConfig,
isEntityOn,
getBrightnessPercent,
getEntityName,
isEntityAvailable,
} from "./utils";
import { detectLocale, getTranslations } from "./locales";
@customElement("light-preset-manager")
export class LightPresetManager extends LitElement {
@property({ attribute: false }) public hass?: any;
@property({ attribute: false }) public config?: any;
@property({ attribute: false }) public hass?: HomeAssistant;
@state() private _config?: LightPresetManagerConfigInternal;
@state() private _t?: Translations;
static styles = css`
:host {
display: block;
padding: 16px;
static styles = mainStyles;
setConfig(config: LightPresetManagerConfig): void {
this._config = validateConfig(config);
}
updated(changedProps: Map<string, unknown>): void {
if (changedProps.has("hass") && this.hass) {
this._t = getTranslations(detectLocale(this.hass.language));
}
.card {
background: var(--ha-card-background, #fff);
border-radius: 8px;
padding: 16px;
box-shadow: var(--ha-card-box-shadow, 0 2px 4px rgba(0, 0, 0, 0.1));
}
h1 {
margin: 0;
color: var(--primary-text-color);
}
`;
setConfig(config: any): void {
this.config = config;
}
private get _lights(): (HassEntity | undefined)[] {
if (!this.hass || !this._config) return [];
return this._config.lights.map((id) => this.hass!.states[id]);
}
private get _isAnyOn(): boolean {
return this._lights.some((e) => isEntityOn(e));
}
private get _isAllOn(): boolean {
return this._lights.every((e) => isEntityOn(e));
}
private get _averageBrightness(): number {
const onLights = this._lights.filter((e) => isEntityOn(e));
if (!onLights.length) return 0;
const total = onLights.reduce((sum, e) => sum + getBrightnessPercent(e), 0);
return Math.round(total / onLights.length);
}
render() {
if (!this.hass || !this._config || !this._t) {
return html`<ha-card
><div class="card-content">
${this._t?.card.loading || "Loading..."}
</div></ha-card
>`;
}
const t = this._t;
return html`
<ha-card>
<div class="card">
<h1>🎉 Hello World!</h1>
<p>Light Preset Manager fonctionne.</p>
<p>Config: ${JSON.stringify(this.config)}</p>
<ha-card header="${this._config.name}">
<div class="card-content">
<div class="debug-info">
<p>
<strong>${t.card.lights}:</strong> ${this._config.lights.length}
</p>
<p>
<strong>Status:</strong>
<span class="${this._isAnyOn ? "state-on" : "state-off"}">
${this._isAnyOn
? this._isAllOn
? t.card.allOn
: t.card.partial
: t.card.allOff}
</span>
</p>
<p>
<strong>${t.card.averageBrightness}:</strong> ${this
._averageBrightness}%
</p>
</div>
<div class="lights-list">
${this._config.lights.map((id) => this._renderLightRow(id))}
</div>
</div>
</ha-card>
`;
}
private _renderLightRow(entityId: string) {
const entity = this.hass?.states[entityId];
const isOn = isEntityOn(entity);
const available = isEntityAvailable(entity);
const brightness = getBrightnessPercent(entity);
const name = getEntityName(entity);
return html`
<div class="light-row">
<span class="light-name">${name}</span>
<span class="light-state ${isOn ? "on" : ""}">
${!available
? this._t?.card.unavailable
: isOn
? `${brightness}%`
: "OFF"}
</span>
</div>
`;
}
getCardSize(): number {
return 3;
return 2 + Math.ceil((this._config?.lights.length || 0) / 2);
}
}
// Card registration
(window as any).customCards = (window as any).customCards || [];
(window as any).customCards.push({
type: "light-preset-manager",
name: "Light Preset Manager",
description: "Panel de contrôle lumière avec presets",
description: "Light control panel with saveable presets",
preview: true,
});
console.log("Light Preset Manager loaded!");
console.log(
"%c LIGHT-PRESET-MANAGER %c v0.2.0 ",
"background: #3498db; color: white; font-weight: bold; border-radius: 4px 0 0 4px;",
"background: #2ecc71; color: white; border-radius: 0 4px 4px 0;"
);
+115
View File
@@ -0,0 +1,115 @@
// =============================================================================
// LOCALES - Internationalization
// =============================================================================
export type SupportedLocale = "en" | "fr";
export interface Translations {
card: {
loading: string;
unavailable: string;
allOn: string;
allOff: string;
partial: string;
averageBrightness: string;
lights: string;
};
temperature: {
warm: string;
neutral: string;
cold: string;
};
preset: {
defaultName: string;
save: string;
recall: string;
rename: string;
};
popup: {
confirmSaveTitle: string;
confirmSaveMessage: string;
renameTitle: string;
cancel: string;
confirm: string;
save: string;
};
}
const translations: Record<SupportedLocale, Translations> = {
en: {
card: {
loading: "Loading...",
unavailable: "Unavailable",
allOn: "All ON",
allOff: "All OFF",
partial: "Partial",
averageBrightness: "Average brightness",
lights: "Lights",
},
temperature: {
warm: "Warm",
neutral: "Neutral",
cold: "Cold",
},
preset: {
defaultName: "Preset",
save: "Save",
recall: "Recall",
rename: "Rename",
},
popup: {
confirmSaveTitle: "Confirm save",
confirmSaveMessage: "Save current state to",
renameTitle: "Rename preset",
cancel: "Cancel",
confirm: "Confirm",
save: "Save",
},
},
fr: {
card: {
loading: "Chargement...",
unavailable: "Indisponible",
allOn: "Toutes ON",
allOff: "Toutes OFF",
partial: "Partiel",
averageBrightness: "Luminosité moyenne",
lights: "Lumières",
},
temperature: {
warm: "Chaud",
neutral: "Neutre",
cold: "Froid",
},
preset: {
defaultName: "Preset",
save: "Enregistrer",
recall: "Rappeler",
rename: "Renommer",
},
popup: {
confirmSaveTitle: "Confirmer l'enregistrement",
confirmSaveMessage: "Enregistrer l'état actuel dans",
renameTitle: "Renommer le preset",
cancel: "Annuler",
confirm: "Confirmer",
save: "Enregistrer",
},
},
};
/**
* Detects locale from Home Assistant language setting
*/
export function detectLocale(hassLanguage?: string): SupportedLocale {
if (!hassLanguage) return "en";
const lang = hassLanguage.split("-")[0].toLowerCase();
return lang in translations ? (lang as SupportedLocale) : "en";
}
/**
* Returns translations for the given locale
*/
export function getTranslations(locale: SupportedLocale): Translations {
return translations[locale];
}
+30
View File
@@ -0,0 +1,30 @@
{
"card": {
"loading": "Loading...",
"unavailable": "Unavailable",
"allOn": "All ON",
"allOff": "All OFF",
"partial": "Partial",
"averageBrightness": "Average brightness",
"lights": "Lights"
},
"temperature": {
"warm": "Warm",
"neutral": "Neutral",
"cold": "Cold"
},
"preset": {
"defaultName": "Preset",
"save": "Save",
"recall": "Recall",
"rename": "Rename"
},
"popup": {
"confirmSaveTitle": "Confirm save",
"confirmSaveMessage": "Save current state to",
"renameTitle": "Rename preset",
"cancel": "Cancel",
"confirm": "Confirm",
"save": "Save"
}
}
+30
View File
@@ -0,0 +1,30 @@
{
"card": {
"loading": "Chargement...",
"unavailable": "Indisponible",
"allOn": "Toutes ON",
"allOff": "Toutes OFF",
"partial": "Partiel",
"averageBrightness": "Luminosité moyenne",
"lights": "Lumières"
},
"temperature": {
"warm": "Chaud",
"neutral": "Neutre",
"cold": "Froid"
},
"preset": {
"defaultName": "Preset",
"save": "Enregistrer",
"recall": "Rappeler",
"rename": "Renommer"
},
"popup": {
"confirmSaveTitle": "Confirmer l'enregistrement",
"confirmSaveMessage": "Enregistrer l'état actuel dans",
"renameTitle": "Renommer le preset",
"cancel": "Annuler",
"confirm": "Confirmer",
"save": "Enregistrer"
}
}
+76
View File
@@ -0,0 +1,76 @@
// =============================================================================
// LOCALES - i18n Loader
// =============================================================================
import en from "./en.json";
import fr from "./fr.json";
export interface Translations {
card: {
loading: string;
unavailable: string;
allOn: string;
allOff: string;
partial: string;
averageBrightness: string;
lights: string;
};
temperature: {
warm: string;
neutral: string;
cold: string;
};
preset: {
defaultName: string;
save: string;
recall: string;
rename: string;
};
popup: {
confirmSaveTitle: string;
confirmSaveMessage: string;
renameTitle: string;
cancel: string;
confirm: string;
save: string;
};
}
export type SupportedLocale = "en" | "fr";
const locales: Record<SupportedLocale, Translations> = {
en,
fr,
};
// Default fallback
const DEFAULT_LOCALE: SupportedLocale = "en";
/**
* Detects locale from Home Assistant language
*/
export function detectLocale(hassLanguage?: string): SupportedLocale {
if (!hassLanguage) return DEFAULT_LOCALE;
const lang = hassLanguage.split("-")[0].toLowerCase();
if (lang in locales) {
return lang as SupportedLocale;
}
return DEFAULT_LOCALE;
}
/**
* Returns translations for given locale
*/
export function getTranslations(locale: SupportedLocale): Translations {
return locales[locale] || locales[DEFAULT_LOCALE];
}
/**
* Lists available locales
*/
export function getAvailableLocales(): SupportedLocale[] {
return Object.keys(locales) as SupportedLocale[];
}
+262
View File
@@ -0,0 +1,262 @@
// =============================================================================
// STYLES
// =============================================================================
import { css } from "lit";
export const mainStyles = css`
/* CSS Custom Properties for theming */
:host {
--lpm-temp-warm-color: #ff9800;
--lpm-temp-neutral-color: #9e9e9e;
--lpm-temp-cold-color: #2196f3;
--lpm-button-radius: 8px;
--lpm-preset-radius: 12px;
--lpm-spacing: 8px;
--lpm-padding: 16px;
--lpm-transition: 0.2s ease;
--lpm-preset-min-height: 70px;
--lpm-preset-font-size: 11px;
--lpm-popup-max-width: 300px;
display: block;
}
.card-content {
padding: var(--lpm-padding);
}
/* Temperature Buttons */
.temp-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.temp-button {
flex: 1;
padding: 12px var(--lpm-spacing);
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
font-family: inherit;
font-size: 12px;
}
.temp-button:hover {
background: var(--secondary-background-color);
}
.temp-button:active {
transform: scale(0.95);
}
.temp-button.warm {
border-bottom: 3px solid var(--lpm-temp-warm-color);
}
.temp-button.neutral {
border-bottom: 3px solid var(--lpm-temp-neutral-color);
}
.temp-button.cold {
border-bottom: 3px solid var(--lpm-temp-cold-color);
}
.temp-button ha-icon {
--mdc-icon-size: 24px;
}
/* Preset Buttons */
.preset-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.preset-button {
flex: 1;
aspect-ratio: 1;
min-height: var(--lpm-preset-min-height);
border: none;
border-radius: var(--lpm-preset-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
padding: var(--lpm-spacing);
font-family: inherit;
}
.preset-button:hover {
background: var(--secondary-background-color);
}
.preset-button:active {
transform: scale(0.95);
}
.preset-button.active {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.preset-button ha-icon {
--mdc-icon-size: 28px;
}
.preset-button .name {
font-size: var(--lpm-preset-font-size);
text-align: center;
word-wrap: break-word;
line-height: 1.2;
max-width: 90%;
}
/* Lights List */
.lights-list {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: var(--lpm-spacing);
padding-top: var(--lpm-spacing);
border-top: 1px solid var(--divider-color);
}
.light-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
}
.light-name {
font-size: 14px;
color: var(--primary-text-color);
}
.light-state {
font-size: 12px;
color: var(--secondary-text-color);
}
.light-state.on {
color: var(--success-color, #4caf50);
}
/* Popup */
.popup-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 999;
}
.popup-content {
background: var(--card-background-color, var(--primary-background-color));
border-radius: var(--lpm-preset-radius);
padding: 24px;
max-width: var(--lpm-popup-max-width);
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
.popup-title {
font-size: 1.2em;
font-weight: 500;
margin-bottom: 16px;
color: var(--primary-text-color);
}
.popup-message {
margin-bottom: 20px;
color: var(--secondary-text-color);
}
.popup-input {
width: 100%;
padding: 12px;
border: 1px solid var(--divider-color, #e0e0e0);
border-radius: var(--lpm-button-radius);
margin-bottom: 16px;
font-size: 1em;
box-sizing: border-box;
background: var(--primary-background-color);
color: var(--primary-text-color);
font-family: inherit;
}
.popup-input:focus {
outline: none;
border-color: var(--primary-color);
}
.popup-buttons {
display: flex;
gap: 12px;
justify-content: flex-end;
}
.popup-button {
padding: 10px 20px;
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
font-size: 0.95em;
font-family: inherit;
transition: all var(--lpm-transition);
}
.popup-button.cancel {
background: var(--secondary-background-color);
color: var(--primary-text-color);
}
.popup-button.confirm {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.popup-button:hover {
opacity: 0.9;
}
.popup-button:active {
transform: scale(0.95);
}
/* Debug (temporary) */
.debug-info {
background: var(--secondary-background-color);
border-radius: var(--lpm-button-radius);
padding: 12px;
margin-top: 12px;
font-family: monospace;
font-size: 12px;
}
.debug-info p {
margin: 4px 0;
color: var(--primary-text-color);
}
.state-on {
color: var(--success-color, #4caf50);
font-weight: bold;
}
.state-off {
color: var(--disabled-text-color, #999);
}
`;
+88
View File
@@ -0,0 +1,88 @@
// =============================================================================
// TYPES
// =============================================================================
// Card Configuration
export interface TemperaturesConfig {
warm: number;
neutral: number;
cold: number;
}
export interface LightPresetManagerConfig {
lights: string[];
name?: string;
temperatures?: Partial<TemperaturesConfig>;
presets?: number;
}
export interface LightPresetManagerConfigInternal {
lights: string[];
name: string;
temperatures: TemperaturesConfig;
presets: number;
}
// Home Assistant
export interface LightAttributes {
friendly_name?: string;
brightness?: number;
color_temp?: number;
color_temp_kelvin?: number;
rgb_color?: [number, number, number];
xy_color?: [number, number];
hs_color?: [number, number];
min_mireds?: number;
max_mireds?: number;
supported_color_modes?: string[];
color_mode?: string;
[key: string]: any;
}
export interface HassEntity {
entity_id: string;
state: string;
attributes: LightAttributes;
last_changed: string;
last_updated: string;
}
export interface HomeAssistant {
states: Record<string, HassEntity>;
language: string;
callService: (
domain: string,
service: string,
data?: object,
target?: object
) => Promise<void>;
}
// -----------------------------------------------------------------------------
// Presets
// -----------------------------------------------------------------------------
export interface LightState {
entity_id: string;
state: "on" | "off";
brightness?: number;
color_temp?: number;
rgb_color?: [number, number, number];
xy_color?: [number, number];
hs_color?: [number, number];
}
export interface PresetData {
id: number;
name: string;
lights: LightState[];
lastModified?: string;
}
// -----------------------------------------------------------------------------
// Events
// -----------------------------------------------------------------------------
export type PresetAction = "tap" | "hold" | "double-tap";
+103
View File
@@ -0,0 +1,103 @@
// =============================================================================
// UTILS
// =============================================================================
import type {
HassEntity,
LightState,
LightPresetManagerConfig,
LightPresetManagerConfigInternal,
TemperaturesConfig,
} from "./types";
// Defaults
export const DEFAULT_TEMPERATURES: TemperaturesConfig = {
warm: 370,
neutral: 285,
cold: 200,
};
export const DEFAULT_PRESETS = 4;
export const DEFAULT_NAME = "Lights";
/**
* Validates user config and applies defaults
*/
export function validateConfig(
config: LightPresetManagerConfig
): LightPresetManagerConfigInternal {
if (!config.lights?.length) {
throw new Error('Config error: "lights" must be a non-empty array');
}
for (const light of config.lights) {
if (!light.startsWith("light.")) {
throw new Error(`Config error: "${light}" is not a light.* entity`);
}
}
if (
config.presets !== undefined &&
(config.presets < 1 || config.presets > 4)
) {
throw new Error('Config error: "presets" must be between 1 and 4');
}
return {
lights: config.lights,
name: config.name || DEFAULT_NAME,
temperatures: {
warm: config.temperatures?.warm || DEFAULT_TEMPERATURES.warm,
neutral: config.temperatures?.neutral || DEFAULT_TEMPERATURES.neutral,
cold: config.temperatures?.cold || DEFAULT_TEMPERATURES.cold,
},
presets: config.presets || DEFAULT_PRESETS,
};
}
// Entity helpers
export const isEntityOn = (entity?: HassEntity): boolean =>
entity?.state === "on";
export const isEntityAvailable = (entity?: HassEntity): boolean =>
entity !== undefined && !["unavailable", "unknown"].includes(entity.state);
export const getBrightnessPercent = (entity?: HassEntity): number => {
const brightness = entity?.attributes.brightness;
return brightness ? Math.round((brightness / 255) * 100) : 0;
};
export const percentToBrightness = (percent: number): number =>
Math.round((percent / 100) * 255);
export const getEntityName = (entity?: HassEntity): string =>
entity?.attributes.friendly_name || entity?.entity_id || "Unknown";
// Temperature conversions
export const kelvinToMireds = (kelvin: number): number =>
Math.round(1000000 / kelvin);
export const miredsToKelvin = (mireds: number): number =>
Math.round(1000000 / mireds);
/**
* Captures current light state for preset storage
*/
export function captureLightState(entity: HassEntity): LightState {
const state: LightState = {
entity_id: entity.entity_id,
state: entity.state === "on" ? "on" : "off",
};
if (entity.state === "on") {
const { brightness, color_temp, rgb_color, xy_color, hs_color } =
entity.attributes;
if (brightness !== undefined) state.brightness = brightness;
if (color_temp !== undefined) state.color_temp = color_temp;
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;
}
return state;
}
+2 -1
View File
@@ -17,7 +17,8 @@
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"useDefineForClassFields": false,
"skipLibCheck": true
"skipLibCheck": true,
"resolveJsonModule": true
},
"include": ["src/**/*.ts"],
"exclude": ["node_modules"]
+1 -1
View File
@@ -1 +1 @@
{"pid": 67, "version": 1, "ha_version": "2025.12.5", "start_ts": 1767110951.3492944}
{"pid": 68, "version": 1, "ha_version": "2025.12.5", "start_ts": 1767175041.0137742}
+161 -619
View File
@@ -1,620 +1,162 @@
2025-12-30 16:10:54.822 INFO (MainThread) [homeassistant.setup] Setting up http
2025-12-30 16:10:54.851 INFO (MainThread) [homeassistant.setup] Setup of domain system_log took 0.03 seconds
2025-12-30 16:10:54.851 INFO (MainThread) [homeassistant.setup] Setup of domain logger took 0.03 seconds
2025-12-30 16:10:54.851 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.03 seconds
2025-12-30 16:10:54.851 INFO (MainThread) [homeassistant.setup] Setting up websocket_api
2025-12-30 16:10:54.851 INFO (MainThread) [homeassistant.setup] Setup of domain websocket_api took 0.00 seconds
2025-12-30 16:10:54.856 INFO (MainThread) [homeassistant.setup] Setting up network
2025-12-30 16:10:54.857 INFO (MainThread) [homeassistant.setup] Setup of domain network took 0.00 seconds
2025-12-30 16:10:54.857 INFO (MainThread) [homeassistant.bootstrap] Setting up stage labs: {'labs'}; already set up: {}
2025-12-31 10:50:44.243 INFO (MainThread) [homeassistant.setup] Setup of domain system_log took 0.03 seconds
2025-12-31 10:50:44.243 INFO (MainThread) [homeassistant.setup] Setup of domain logger took 0.03 seconds
2025-12-31 10:50:44.247 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.03 seconds
2025-12-31 10:50:44.247 INFO (MainThread) [homeassistant.setup] Setting up websocket_api
2025-12-31 10:50:44.248 INFO (MainThread) [homeassistant.setup] Setup of domain websocket_api took 0.00 seconds
2025-12-31 10:50:44.252 INFO (MainThread) [homeassistant.setup] Setting up network
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.setup] Setup of domain network took 0.00 seconds
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.bootstrap] Setting up stage labs: {'labs'}; already set up: {}
Dependencies: {}; already set up: {}
2025-12-30 16:10:54.857 INFO (MainThread) [homeassistant.setup] Setting up labs
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setup of domain labs took 0.00 seconds
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.bootstrap] Setting up stage frontend: {'frontend'}; already set up: {}
Dependencies: {'file_upload', 'repairs', 'onboarding', 'diagnostics', 'auth', 'config', 'device_automation', 'api', 'search', 'lovelace'}; already set up: {'system_log', 'websocket_api', 'http'}
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setting up file_upload
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setup of domain file_upload took 0.00 seconds
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setting up repairs
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setup of domain repairs took 0.00 seconds
2025-12-30 16:10:54.858 INFO (MainThread) [homeassistant.setup] Setting up auth
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setup of domain auth took 0.00 seconds
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setting up onboarding
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setup of domain onboarding took 0.00 seconds
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setting up diagnostics
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setup of domain diagnostics took 0.00 seconds
2025-12-30 16:10:54.859 INFO (MainThread) [homeassistant.setup] Setting up api
2025-12-30 16:10:54.860 INFO (MainThread) [homeassistant.setup] Setup of domain api took 0.00 seconds
2025-12-30 16:10:54.860 INFO (MainThread) [homeassistant.setup] Setting up config
2025-12-30 16:10:54.862 INFO (MainThread) [homeassistant.setup] Setup of domain config took 0.00 seconds
2025-12-30 16:10:54.862 INFO (MainThread) [homeassistant.setup] Setting up device_automation
2025-12-30 16:10:54.862 INFO (MainThread) [homeassistant.setup] Setup of domain device_automation took 0.00 seconds
2025-12-30 16:10:54.862 INFO (MainThread) [homeassistant.setup] Setting up lovelace
2025-12-30 16:10:54.862 INFO (MainThread) [homeassistant.setup] Setting up search
2025-12-30 16:10:54.863 INFO (MainThread) [homeassistant.setup] Setup of domain search took 0.00 seconds
2025-12-30 16:10:54.868 INFO (MainThread) [homeassistant.setup] Setup of domain lovelace took 0.01 seconds
2025-12-30 16:10:54.871 INFO (MainThread) [homeassistant.setup] Setting up frontend
2025-12-30 16:10:54.875 INFO (MainThread) [homeassistant.setup] Setup of domain frontend took 0.00 seconds
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage recorder: {'recorder'}
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage debugger: {'debugpy'}
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage zeroconf: {'zeroconf'}
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage 1: {'mqtt_eventstream', 'hassio', 'bluetooth', 'usb', 'ssdp', 'dhcp', 'cloud'}
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.bootstrap] Setting up stage 2: {'input_number', 'input_button', 'google_translate', 'shopping_list', 'analytics', 'input_text', 'radio_browser', 'schedule', 'input_boolean', 'timer', 'scene', 'automation', 'script', 'backup', 'system_health', 'person', 'tag', 'zone', 'counter', 'application_credentials', 'hardware', 'input_select', 'input_datetime'}; already set up: {'http', 'logger', 'network', 'frontend', 'labs', 'config', 'homeassistant', 'api'}
Dependencies: {'blueprint', 'trace', 'image_upload'}; already set up: {'http', 'device_automation', 'auth', 'websocket_api', 'api'}
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.setup] Setting up scene
2025-12-30 16:10:54.876 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-30 16:10:54.877 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-30 16:10:54.877 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-30 16:10:54.877 INFO (MainThread) [homeassistant.setup] Setup of domain scene took 0.00 seconds
2025-12-30 16:10:54.877 INFO (MainThread) [homeassistant.setup] Setting up input_number
2025-12-30 16:10:54.878 INFO (MainThread) [homeassistant.setup] Setup of domain input_number took 0.00 seconds
2025-12-30 16:10:54.878 INFO (MainThread) [homeassistant.setup] Setting up zone
2025-12-30 16:10:54.879 INFO (MainThread) [homeassistant.setup] Setup of domain zone took 0.00 seconds
2025-12-30 16:10:54.879 INFO (MainThread) [homeassistant.setup] Setting up blueprint
2025-12-30 16:10:54.879 INFO (MainThread) [homeassistant.setup] Setup of domain blueprint took 0.00 seconds
2025-12-30 16:10:54.880 INFO (MainThread) [homeassistant.setup] Setting up trace
2025-12-30 16:10:54.880 INFO (MainThread) [homeassistant.setup] Setup of domain trace took 0.00 seconds
2025-12-30 16:10:54.880 INFO (MainThread) [homeassistant.setup] Setting up automation
2025-12-30 16:10:54.881 INFO (MainThread) [homeassistant.setup] Setup of domain automation took 0.00 seconds
2025-12-30 16:10:54.881 INFO (MainThread) [homeassistant.setup] Setting up script
2025-12-30 16:10:54.881 INFO (MainThread) [homeassistant.setup] Setup of domain script took 0.00 seconds
2025-12-30 16:10:54.881 INFO (MainThread) [homeassistant.setup] Setting up system_health
2025-12-30 16:10:54.882 INFO (MainThread) [homeassistant.setup] Setup of domain system_health took 0.00 seconds
2025-12-30 16:10:54.883 INFO (MainThread) [homeassistant.setup] Setting up input_button
2025-12-30 16:10:54.884 INFO (MainThread) [homeassistant.setup] Setup of domain input_button took 0.00 seconds
2025-12-30 16:10:54.885 INFO (MainThread) [homeassistant.components.http] Now listening on port 8123
2025-12-30 16:10:54.885 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.01 seconds
2025-12-30 16:10:54.890 INFO (MainThread) [homeassistant.setup] Setting up tag
2025-12-30 16:10:54.890 INFO (MainThread) [homeassistant.setup] Setup of domain tag took 0.00 seconds
2025-12-30 16:10:54.896 INFO (MainThread) [homeassistant.setup] Setting up image_upload
2025-12-30 16:10:54.897 INFO (MainThread) [homeassistant.setup] Setup of domain image_upload took 0.00 seconds
2025-12-30 16:10:54.897 INFO (MainThread) [homeassistant.setup] Setting up person
2025-12-30 16:10:54.898 INFO (MainThread) [homeassistant.setup] Setup of domain person took 0.00 seconds
2025-12-30 16:10:54.905 INFO (MainThread) [homeassistant.setup] Setting up shopping_list
2025-12-30 16:10:54.905 INFO (MainThread) [homeassistant.setup] Setup of domain shopping_list took 0.00 seconds
2025-12-30 16:10:54.910 INFO (MainThread) [homeassistant.setup] Setting up counter
2025-12-30 16:10:54.911 INFO (MainThread) [homeassistant.setup] Setup of domain counter took 0.00 seconds
2025-12-30 16:10:54.914 INFO (MainThread) [homeassistant.setup] Setting up application_credentials
2025-12-30 16:10:54.914 INFO (MainThread) [homeassistant.setup] Setup of domain application_credentials took 0.00 seconds
2025-12-30 16:10:54.917 INFO (MainThread) [homeassistant.setup] Setting up input_text
2025-12-30 16:10:54.917 INFO (MainThread) [homeassistant.setup] Setup of domain input_text took 0.00 seconds
2025-12-30 16:10:54.922 INFO (MainThread) [homeassistant.setup] Setting up schedule
2025-12-30 16:10:54.923 INFO (MainThread) [homeassistant.setup] Setup of domain schedule took 0.00 seconds
2025-12-30 16:10:54.927 INFO (MainThread) [homeassistant.setup] Setting up input_select
2025-12-30 16:10:54.928 INFO (MainThread) [homeassistant.setup] Setup of domain input_select took 0.00 seconds
2025-12-30 16:10:54.931 INFO (MainThread) [homeassistant.setup] Setting up input_boolean
2025-12-30 16:10:54.931 INFO (MainThread) [homeassistant.setup] Setup of domain input_boolean took 0.00 seconds
2025-12-30 16:10:54.933 INFO (MainThread) [homeassistant.setup] Setting up timer
2025-12-30 16:10:54.934 INFO (MainThread) [homeassistant.setup] Setup of domain timer took 0.00 seconds
2025-12-30 16:10:54.935 INFO (MainThread) [homeassistant.setup] Setting up input_datetime
2025-12-30 16:10:54.936 INFO (MainThread) [homeassistant.setup] Setup of domain input_datetime took 0.00 seconds
2025-12-30 16:10:54.942 INFO (MainThread) [homeassistant.setup] Setting up backup
2025-12-30 16:10:54.944 INFO (MainThread) [homeassistant.setup] Setup of domain backup took 0.00 seconds
2025-12-30 16:10:54.963 INFO (MainThread) [homeassistant.setup] Setting up google_translate
2025-12-30 16:10:54.963 INFO (MainThread) [homeassistant.setup] Setup of domain google_translate took 0.00 seconds
2025-12-30 16:10:54.967 INFO (MainThread) [homeassistant.setup] Setting up todo
2025-12-30 16:10:54.968 INFO (MainThread) [homeassistant.setup] Setup of domain todo took 0.00 seconds
2025-12-30 16:10:54.969 INFO (MainThread) [homeassistant.components.todo] Setting up shopping_list.todo
2025-12-30 16:10:55.038 INFO (MainThread) [homeassistant.setup] Setting up radio_browser
2025-12-30 16:10:55.038 INFO (MainThread) [homeassistant.setup] Setup of domain radio_browser took 0.00 seconds
2025-12-30 16:10:55.044 INFO (MainThread) [homeassistant.setup] Setting up hardware
2025-12-30 16:10:55.065 INFO (MainThread) [homeassistant.setup] Setup of domain hardware took 0.02 seconds
2025-12-30 16:10:55.065 INFO (MainThread) [homeassistant.setup] Setting up analytics
2025-12-30 16:10:55.065 INFO (MainThread) [homeassistant.setup] Setup of domain analytics took 0.00 seconds
2025-12-30 16:10:55.070 INFO (MainThread) [homeassistant.setup] Setting up ffmpeg
2025-12-30 16:10:55.073 INFO (MainThread) [homeassistant.setup] Setting up event
2025-12-30 16:10:55.073 INFO (MainThread) [homeassistant.setup] Setup of domain event took 0.00 seconds
2025-12-30 16:10:55.074 INFO (MainThread) [homeassistant.setup] Setting up sensor
2025-12-30 16:10:55.074 INFO (MainThread) [homeassistant.setup] Setup of domain sensor took 0.00 seconds
2025-12-30 16:10:55.074 INFO (MainThread) [homeassistant.setup] Setup of domain ffmpeg took 0.00 seconds
2025-12-30 16:10:55.075 INFO (MainThread) [homeassistant.setup] Setting up tts
2025-12-30 16:10:55.075 INFO (MainThread) [homeassistant.components.event] Setting up backup.event
2025-12-30 16:10:55.076 INFO (MainThread) [homeassistant.components.sensor] Setting up backup.sensor
2025-12-30 16:10:55.083 INFO (MainThread) [homeassistant.setup] Setup of domain tts took 0.01 seconds
2025-12-30 16:10:55.084 INFO (MainThread) [homeassistant.components.tts] Setting up google_translate.tts
2025-12-30 16:10:55.151 INFO (MainThread) [homeassistant.bootstrap] Home Assistant initialized in 0.95s
2025-12-30 16:10:55.151 INFO (MainThread) [homeassistant.core] Starting Home Assistant 2025.12.5
2025-12-30 16:11:21.541 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140617783361216] Received unknown command: recorder/info
2025-12-30 16:11:35.347 INFO (SyncWorker_5) [homeassistant.loader] Loaded homekit_controller from homeassistant.components.homekit_controller
2025-12-30 16:11:35.348 INFO (SyncWorker_5) [homeassistant.loader] Loaded season from homeassistant.components.season
2025-12-30 16:11:35.348 INFO (SyncWorker_5) [homeassistant.loader] Loaded sun from homeassistant.components.sun
2025-12-30 16:11:35.348 INFO (SyncWorker_5) [homeassistant.loader] Loaded moon from homeassistant.components.moon
2025-12-30 16:11:35.349 INFO (SyncWorker_5) [homeassistant.loader] Loaded plant from homeassistant.components.plant
2025-12-30 16:11:35.349 INFO (SyncWorker_5) [homeassistant.loader] Loaded proximity from homeassistant.components.proximity
2025-12-30 16:11:35.350 INFO (SyncWorker_5) [homeassistant.loader] Loaded utility_meter from homeassistant.components.utility_meter
2025-12-30 16:11:35.350 INFO (SyncWorker_5) [homeassistant.loader] Loaded alert from homeassistant.components.alert
2025-12-30 16:11:35.350 INFO (SyncWorker_5) [homeassistant.loader] Loaded group from homeassistant.components.group
2025-12-30 16:11:35.351 INFO (SyncWorker_5) [homeassistant.loader] Loaded version from homeassistant.components.version
2025-12-30 16:11:35.351 INFO (SyncWorker_5) [homeassistant.loader] Loaded irm_kmi from homeassistant.components.irm_kmi
2025-12-30 16:11:35.351 INFO (SyncWorker_5) [homeassistant.loader] Loaded waze_travel_time from homeassistant.components.waze_travel_time
2025-12-30 16:11:35.352 INFO (SyncWorker_5) [homeassistant.loader] Loaded workday from homeassistant.components.workday
2025-12-30 16:11:35.352 INFO (SyncWorker_5) [homeassistant.loader] Loaded rpi_power from homeassistant.components.rpi_power
2025-12-30 16:11:35.353 INFO (SyncWorker_5) [homeassistant.loader] Loaded google_travel_time from homeassistant.components.google_travel_time
2025-12-30 16:11:35.353 INFO (SyncWorker_5) [homeassistant.loader] Loaded cpuspeed from homeassistant.components.cpuspeed
2025-12-30 16:11:35.354 INFO (SyncWorker_5) [homeassistant.loader] Loaded cert_expiry from homeassistant.components.cert_expiry
2025-12-30 16:11:35.354 INFO (SyncWorker_5) [homeassistant.loader] Loaded energenie_power_sockets from homeassistant.components.energenie_power_sockets
2025-12-30 16:11:35.355 INFO (SyncWorker_5) [homeassistant.loader] Loaded filesize from homeassistant.components.filesize
2025-12-30 16:11:35.355 INFO (SyncWorker_5) [homeassistant.loader] Loaded filter from homeassistant.components.filter
2025-12-30 16:11:35.356 INFO (SyncWorker_5) [homeassistant.loader] Loaded uptime from homeassistant.components.uptime
2025-12-30 16:11:35.356 INFO (SyncWorker_5) [homeassistant.loader] Loaded vegehub from homeassistant.components.vegehub
2025-12-30 16:11:35.356 INFO (SyncWorker_5) [homeassistant.loader] Loaded tod from homeassistant.components.tod
2025-12-30 16:11:35.356 INFO (SyncWorker_5) [homeassistant.loader] Loaded nmap_tracker from homeassistant.components.nmap_tracker
2025-12-30 16:11:35.357 INFO (SyncWorker_5) [homeassistant.loader] Loaded local_todo from homeassistant.components.local_todo
2025-12-30 16:11:35.357 INFO (SyncWorker_5) [homeassistant.loader] Loaded nextbus from homeassistant.components.nextbus
2025-12-30 16:11:35.357 INFO (SyncWorker_5) [homeassistant.loader] Loaded demo from homeassistant.components.demo
2025-12-30 16:11:35.358 INFO (SyncWorker_5) [homeassistant.loader] Loaded remote_calendar from homeassistant.components.remote_calendar
2025-12-30 16:11:35.358 INFO (SyncWorker_5) [homeassistant.loader] Loaded random from homeassistant.components.random
2025-12-30 16:11:35.358 INFO (SyncWorker_5) [homeassistant.loader] Loaded min_max from homeassistant.components.min_max
2025-12-30 16:11:35.359 INFO (SyncWorker_5) [homeassistant.loader] Loaded aurora from homeassistant.components.aurora
2025-12-30 16:11:35.359 INFO (SyncWorker_5) [homeassistant.loader] Loaded derivative from homeassistant.components.derivative
2025-12-30 16:11:35.359 INFO (SyncWorker_5) [homeassistant.loader] Loaded growatt_server from homeassistant.components.growatt_server
2025-12-30 16:11:35.360 INFO (SyncWorker_5) [homeassistant.loader] Loaded statistics from homeassistant.components.statistics
2025-12-30 16:11:35.360 INFO (SyncWorker_5) [homeassistant.loader] Loaded time_date from homeassistant.components.time_date
2025-12-30 16:11:35.361 INFO (SyncWorker_5) [homeassistant.loader] Loaded mobile_app from homeassistant.components.mobile_app
2025-12-30 16:11:35.361 INFO (SyncWorker_5) [homeassistant.loader] Loaded local_calendar from homeassistant.components.local_calendar
2025-12-30 16:11:35.361 INFO (SyncWorker_5) [homeassistant.loader] Loaded emulated_roku from homeassistant.components.emulated_roku
2025-12-30 16:11:35.362 INFO (SyncWorker_5) [homeassistant.loader] Loaded generic_hygrostat from homeassistant.components.generic_hygrostat
2025-12-30 16:11:35.362 INFO (SyncWorker_5) [homeassistant.loader] Loaded history_stats from homeassistant.components.history_stats
2025-12-30 16:11:35.363 INFO (SyncWorker_5) [homeassistant.loader] Loaded mold_indicator from homeassistant.components.mold_indicator
2025-12-30 16:11:35.363 INFO (SyncWorker_5) [homeassistant.loader] Loaded holiday from homeassistant.components.holiday
2025-12-30 16:11:35.363 INFO (SyncWorker_5) [homeassistant.loader] Loaded generic_thermostat from homeassistant.components.generic_thermostat
2025-12-30 16:11:35.364 INFO (SyncWorker_5) [homeassistant.loader] Loaded moehlenhoff_alpha2 from homeassistant.components.moehlenhoff_alpha2
2025-12-30 16:11:35.365 INFO (SyncWorker_5) [homeassistant.loader] Loaded zodiac from homeassistant.components.zodiac
2025-12-30 16:11:35.365 INFO (SyncWorker_5) [homeassistant.loader] Loaded trend from homeassistant.components.trend
2025-12-30 16:11:35.366 INFO (SyncWorker_5) [homeassistant.loader] Loaded local_ip from homeassistant.components.local_ip
2025-12-30 16:11:35.366 INFO (SyncWorker_5) [homeassistant.loader] Loaded generic from homeassistant.components.generic
2025-12-30 16:11:35.367 INFO (SyncWorker_5) [homeassistant.loader] Loaded integration from homeassistant.components.integration
2025-12-30 16:11:35.367 INFO (SyncWorker_5) [homeassistant.loader] Loaded threshold from homeassistant.components.threshold
2025-12-30 16:11:35.367 INFO (SyncWorker_5) [homeassistant.loader] Loaded islamic_prayer_times from homeassistant.components.islamic_prayer_times
2025-12-30 16:11:35.368 INFO (SyncWorker_5) [homeassistant.loader] Loaded garages_amsterdam from homeassistant.components.garages_amsterdam
2025-12-30 16:11:41.933 INFO (SyncWorker_7) [homeassistant.loader] Loaded mqtt from homeassistant.components.mqtt
2025-12-30 16:12:24.529 INFO (MainThread) [homeassistant.setup] Setting up mqtt
2025-12-30 16:12:25.148 INFO (MainThread) [homeassistant.setup] Setting up binary_sensor
2025-12-30 16:12:25.148 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mqtt.binary_sensor
2025-12-30 16:12:25.150 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new binary_sensor.mqtt entity: binary_sensor.zigbee2mqtt_bridge_connection_state
2025-12-30 16:12:25.151 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new binary_sensor.mqtt entity: binary_sensor.zigbee2mqtt_bridge_restart_required
2025-12-30 16:12:25.155 INFO (MainThread) [homeassistant.setup] Setting up button
2025-12-30 16:12:25.156 INFO (MainThread) [homeassistant.components.button] Setting up mqtt.button
2025-12-30 16:12:25.157 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.zigbee2mqtt_bridge_restart
2025-12-30 16:12:25.158 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_pan_canape_identify
2025-12-30 16:12:25.158 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.couloir_amp_cuisine_identify
2025-12-30 16:12:25.159 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_rang2_pan_centre_identify
2025-12-30 16:12:25.160 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.couloir_amp_sdb_identify
2025-12-30 16:12:25.161 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_rang1_amp_centre_identify
2025-12-30 16:12:25.162 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.couloir_amp_poele_identify
2025-12-30 16:12:25.163 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_rang1_amp_table_identify
2025-12-30 16:12:25.163 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_cuisine_id002_identify
2025-12-30 16:12:25.164 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_rang2_amp_table_identify
2025-12-30 16:12:25.167 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang1_lamp_escaliers_identify
2025-12-30 16:12:25.168 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salle_a_manger_rang2_amp_fauteuil_identify
2025-12-30 16:12:25.169 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang1_lamp_centre_identify
2025-12-30 16:12:25.169 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_basescalier_identify
2025-12-30 16:12:25.170 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang1_lamp_evier_identify
2025-12-30 16:12:25.171 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_clicclac_identify
2025-12-30 16:12:25.171 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang2_lamp_escaliers_identify
2025-12-30 16:12:25.173 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_escalier_amp_escaliercentre_identify
2025-12-30 16:12:25.173 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang2_lamp_centre_identify
2025-12-30 16:12:25.174 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_mezzanine_amp_tetedelit_identify
2025-12-30 16:12:25.175 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_rang1_lamp_plaques_identify
2025-12-30 16:12:25.175 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_portefenetre_identify
2025-12-30 16:12:25.176 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_centre_lamp_table_identify
2025-12-30 16:12:25.177 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_armoire_identify
2025-12-30 16:12:25.177 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_centre_lamp_escaliers_identify
2025-12-30 16:12:25.178 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_mezzanine_amp_bureau_identify
2025-12-30 16:12:25.179 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.cuisine_centre_lamp_four_identify
2025-12-30 16:12:25.180 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_fenetre_identify
2025-12-30 16:12:25.181 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_couloir_id009_identify
2025-12-30 16:12:25.181 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_bas_amp_porte_identify
2025-12-30 16:12:25.182 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_mezzanine_amp_hautescalier_identify
2025-12-30 16:12:25.183 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_jojo_mezzanine_amp_piedlit_identify
2025-12-30 16:12:25.184 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_ch_jojo_id008_identify
2025-12-30 16:12:25.185 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_bureau_dressing_id006_identify
2025-12-30 16:12:25.186 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_salle_a_manger_id005_identify
2025-12-30 16:12:25.187 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_ch_parents_id007_identify
2025-12-30 16:12:25.188 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_escaliers_bas_identify
2025-12-30 16:12:25.189 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.escaliers_strip_main_identify
2025-12-30 16:12:25.189 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_salon_id003_identify
2025-12-30 16:12:25.190 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salon_strip_poutreescaliers_identify
2025-12-30 16:12:25.191 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salon_amp_lampeparapluie1_identify
2025-12-30 16:12:25.192 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salon_amp_lampeparapluie2_identify
2025-12-30 16:12:25.193 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.salon_amp_lampeparapluie3_identify
2025-12-30 16:12:25.194 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_bureau_dressing_id000_identify
2025-12-30 16:12:25.195 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_spare_id004_identify
2025-12-30 16:12:25.195 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_parents_amp_chevetlolo_identify
2025-12-30 16:12:25.196 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_ch_parents_id001_identify
2025-12-30 16:12:25.197 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_parents_amp_entree_identify
2025-12-30 16:12:25.198 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.ch_parents_pan_main_identify
2025-12-30 16:12:25.198 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.bureau_dressing_pc_main_identify
2025-12-30 16:12:25.199 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.bureau_dressing_pan_main_identify
2025-12-30 16:12:25.200 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_bureau_dressing_id009_identify
2025-12-30 16:12:25.200 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_asleep_screens 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
2025-12-30 16:12:25.200 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_asleep_screens
2025-12-30 16:12:25.201 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_awake_screens 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
2025-12-30 16:12:25.201 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_awake_screens
2025-12-30 16:12:25.202 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_veille_prolonge 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
2025-12-30 16:12:25.202 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_veille_prolonge
2025-12-30 16:12:25.202 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_play_pause 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
2025-12-30 16:12:25.202 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_play_pause
2025-12-30 16:12:25.203 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_volume_up 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
2025-12-30 16:12:25.203 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_volume_up
2025-12-30 16:12:25.204 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_volume_down 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
2025-12-30 16:12:25.204 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_volume_down
2025-12-30 16:12:25.205 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_right 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
2025-12-30 16:12:25.205 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_touche_right
2025-12-30 16:12:25.205 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_left 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
2025-12-30 16:12:25.205 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_touche_left
2025-12-30 16:12:25.206 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_up 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
2025-12-30 16:12:25.206 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_touche_up
2025-12-30 16:12:25.207 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_touche_down 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
2025-12-30 16:12:25.207 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_touche_down
2025-12-30 16:12:25.207 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_alt_tab 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
2025-12-30 16:12:25.208 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_alt_tab
2025-12-30 16:12:25.208 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_mute 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
2025-12-30 16:12:25.208 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_mute
2025-12-30 16:12:25.209 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity button.warmachine_papa_veille 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
2025-12-30 16:12:25.209 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.warmachine_papa_veille
2025-12-30 16:12:25.210 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.couloir_amp_spotpoele_identify
2025-12-30 16:12:25.210 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_spot_poele_id010_identify
2025-12-30 16:12:25.211 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_ch_lea_escaliers_identify
2025-12-30 16:12:25.212 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.sdb_strip_miroir_identify
2025-12-30 16:12:25.213 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.teleco_sdb_id013_identify
2025-12-30 16:12:25.214 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new button.mqtt entity: button.sdb_amp_centre_identify
2025-12-30 16:12:25.432 INFO (MainThread) [homeassistant.setup] Setting up light
2025-12-30 16:12:25.434 INFO (MainThread) [homeassistant.components.light] Setting up mqtt.light
2025-12-30 16:12:25.436 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.couloir_amp_cuisine
2025-12-30 16:12:25.439 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_salon_all
2025-12-30 16:12:25.440 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.couloir_amp_sdb
2025-12-30 16:12:25.441 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_parents_amp_chevetlolo
2025-12-30 16:12:25.442 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.couloir_amp_poele
2025-12-30 16:12:25.444 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_parents_amp_entree
2025-12-30 16:12:25.445 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang1_lamp_escaliers
2025-12-30 16:12:25.446 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_parents_pan_main
2025-12-30 16:12:25.447 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang1_lamp_centre
2025-12-30 16:12:25.449 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.bureau_dressing_pan_main
2025-12-30 16:12:25.449 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang1_lamp_evier
2025-12-30 16:12:25.450 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_couloir_all
2025-12-30 16:12:25.451 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang2_lamp_escaliers
2025-12-30 16:12:25.452 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.couloir_amp_spotpoele
2025-12-30 16:12:25.453 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang2_lamp_centre
2025-12-30 16:12:25.454 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.sdb_strip_miroir
2025-12-30 16:12:25.455 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_rang1_lamp_plaques
2025-12-30 16:12:25.456 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.sdb_amp_centre
2025-12-30 16:12:25.457 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_centre_lamp_table
2025-12-30 16:12:25.458 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_centre_lamp_escaliers
2025-12-30 16:12:25.459 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.cuisine_centre_lamp_four
2025-12-30 16:12:25.460 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_cuisine_all
2025-12-30 16:12:25.461 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_pan_canape
2025-12-30 16:12:25.463 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_rang2_pan_centre
2025-12-30 16:12:25.464 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_rang1_amp_centre
2025-12-30 16:12:25.465 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_rang1_amp_table
2025-12-30 16:12:25.465 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_rang2_amp_table
2025-12-30 16:12:25.466 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salle_a_manger_rang2_amp_fauteuil
2025-12-30 16:12:25.467 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_basescalier
2025-12-30 16:12:25.468 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_clicclac
2025-12-30 16:12:25.469 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_escalier_amp_escaliercentre
2025-12-30 16:12:25.470 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_mezzanine_amp_tetedelit
2025-12-30 16:12:25.470 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_portefenetre
2025-12-30 16:12:25.471 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_armoire
2025-12-30 16:12:25.473 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_mezzanine_amp_bureau
2025-12-30 16:12:25.475 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_fenetre
2025-12-30 16:12:25.476 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_bas_amp_porte
2025-12-30 16:12:25.477 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_mezzanine_amp_hautescalier
2025-12-30 16:12:25.478 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.ch_jojo_mezzanine_amp_piedlit
2025-12-30 16:12:25.479 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_ch_jojo_all
2025-12-30 16:12:25.481 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_ch_jojo_mezzanine
2025-12-30 16:12:25.482 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_ch_jojo_bas
2025-12-30 16:12:25.483 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_ch_jojo_escalier
2025-12-30 16:12:25.484 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_bureau_dressing_all
2025-12-30 16:12:25.486 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_salle_a_manger_all
2025-12-30 16:12:25.487 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.escaliers_strip_main
2025-12-30 16:12:25.488 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.groups_escaliers_all
2025-12-30 16:12:25.489 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salon_strip_poutreescaliers
2025-12-30 16:12:25.491 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salon_amp_lampeparapluie1
2025-12-30 16:12:25.491 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salon_amp_lampeparapluie2
2025-12-30 16:12:25.492 INFO (MainThread) [homeassistant.components.scene] Setting up mqtt.scene
2025-12-30 16:12:25.492 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new light.mqtt entity: light.salon_amp_lampeparapluie3
2025-12-30 16:12:25.494 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_bureau_dressing_all_0_full_froid
2025-12-30 16:12:25.496 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_bureau_dressing_all_1_full_chaud
2025-12-30 16:12:25.497 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_bureau_dressing_all_2_full_neutral
2025-12-30 16:12:25.498 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_0_full_froid
2025-12-30 16:12:25.500 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_1_full_chaud
2025-12-30 16:12:25.502 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_2_full_neutral
2025-12-30 16:12:25.503 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_3_mezzanine
2025-12-30 16:12:25.503 INFO (MainThread) [homeassistant.setup] Setting up select
2025-12-30 16:12:25.504 INFO (MainThread) [homeassistant.components.select] Setting up mqtt.select
2025-12-30 16:12:25.505 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_4_bureau
2025-12-30 16:12:25.506 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_5_bas
2025-12-30 16:12:25.507 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_pan_canape_effect
2025-12-30 16:12:25.508 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_amp_table_power_on_behavior
2025-12-30 16:12:25.509 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_ch_jojo_all_6_escalier
2025-12-30 16:12:25.510 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_pan_canape_power_on_behavior
2025-12-30 16:12:25.510 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_amp_fauteuil_effect
2025-12-30 16:12:25.511 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_salle_a_manger_all_0_full_chaud
2025-12-30 16:12:25.512 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_pan_centre_effect
2025-12-30 16:12:25.514 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_amp_fauteuil_power_on_behavior
2025-12-30 16:12:25.514 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new scene.mqtt entity: scene.groups_salle_a_manger_all_1_full_froid
2025-12-30 16:12:25.515 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_pan_centre_power_on_behavior
2025-12-30 16:12:25.516 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_basescalier_effect
2025-12-30 16:12:25.516 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang1_amp_centre_effect
2025-12-30 16:12:25.517 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_basescalier_power_on_behavior
2025-12-30 16:12:25.517 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang1_amp_centre_power_on_behavior
2025-12-30 16:12:25.518 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_clicclac_effect
2025-12-30 16:12:25.519 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang1_amp_table_effect
2025-12-30 16:12:25.520 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_clicclac_power_on_behavior
2025-12-30 16:12:25.520 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang1_amp_table_power_on_behavior
2025-12-30 16:12:25.521 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_escalier_amp_escaliercentre_effect
2025-12-30 16:12:25.521 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salle_a_manger_rang2_amp_table_effect
2025-12-30 16:12:25.522 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_escalier_amp_escaliercentre_power_on_behavior
2025-12-30 16:12:25.523 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_tetedelit_effect
2025-12-30 16:12:25.524 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_tetedelit_power_on_behavior
2025-12-30 16:12:25.525 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_portefenetre_effect
2025-12-30 16:12:25.525 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_portefenetre_power_on_behavior
2025-12-30 16:12:25.526 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_armoire_effect
2025-12-30 16:12:25.527 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_armoire_power_on_behavior
2025-12-30 16:12:25.528 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_bureau_effect
2025-12-30 16:12:25.529 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_bureau_power_on_behavior
2025-12-30 16:12:25.529 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_fenetre_effect
2025-12-30 16:12:25.530 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_fenetre_power_on_behavior
2025-12-30 16:12:25.531 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_porte_effect
2025-12-30 16:12:25.532 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_bas_amp_porte_power_on_behavior
2025-12-30 16:12:25.533 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_hautescalier_effect
2025-12-30 16:12:25.533 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_hautescalier_power_on_behavior
2025-12-30 16:12:25.534 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_piedlit_effect
2025-12-30 16:12:25.535 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_jojo_mezzanine_amp_piedlit_power_on_behavior
2025-12-30 16:12:25.536 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.escaliers_strip_main_effect
2025-12-30 16:12:25.537 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.escaliers_strip_main_power_on_behavior
2025-12-30 16:12:25.538 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_strip_poutreescaliers_effect
2025-12-30 16:12:25.538 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_strip_poutreescaliers_power_on_behavior
2025-12-30 16:12:25.540 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie1_effect
2025-12-30 16:12:25.540 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie1_power_on_behavior
2025-12-30 16:12:25.541 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie2_effect
2025-12-30 16:12:25.542 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie2_power_on_behavior
2025-12-30 16:12:25.542 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie3_effect
2025-12-30 16:12:25.544 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.salon_amp_lampeparapluie3_power_on_behavior
2025-12-30 16:12:25.545 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.zigbee2mqtt_bridge_log_level
2025-12-30 16:12:25.546 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_cuisine_effect
2025-12-30 16:12:25.547 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_cuisine_power_on_behavior
2025-12-30 16:12:25.548 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_poele_effect
2025-12-30 16:12:25.549 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_poele_power_on_behavior
2025-12-30 16:12:25.549 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_sdb_effect
2025-12-30 16:12:25.550 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_sdb_power_on_behavior
2025-12-30 16:12:25.551 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_escaliers_effect
2025-12-30 16:12:25.552 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_escaliers_power_on_behavior
2025-12-30 16:12:25.553 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang2_lamp_escaliers_effect
2025-12-30 16:12:25.553 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang2_lamp_escaliers_power_on_behavior
2025-12-30 16:12:25.554 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_plaques_effect
2025-12-30 16:12:25.555 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_plaques_power_on_behavior
2025-12-30 16:12:25.555 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang2_lamp_centre_effect
2025-12-30 16:12:25.556 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang2_lamp_centre_power_on_behavior
2025-12-30 16:12:25.557 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_four_effect
2025-12-30 16:12:25.558 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_four_power_on_behavior
2025-12-30 16:12:25.558 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_table_effect
2025-12-30 16:12:25.559 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_centre_lamp_table_power_on_behavior
2025-12-30 16:12:25.560 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_evier_effect
2025-12-30 16:12:25.561 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_evier_power_on_behavior
2025-12-30 16:12:25.562 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_centre_effect
2025-12-30 16:12:25.563 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_centre_power_on_behavior
2025-12-30 16:12:25.564 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_escaliers_effect
2025-12-30 16:12:25.565 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.cuisine_rang1_lamp_escaliers_power_on_behavior
2025-12-30 16:12:25.565 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_amp_chevetlolo_effect
2025-12-30 16:12:25.566 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_amp_chevetlolo_power_on_behavior
2025-12-30 16:12:25.567 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_amp_entree_effect
2025-12-30 16:12:25.568 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_amp_entree_power_on_behavior
2025-12-30 16:12:25.569 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_pan_main_effect
2025-12-30 16:12:25.570 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.ch_parents_pan_main_power_on_behavior
2025-12-30 16:12:25.571 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.bureau_dressing_pc_main_power_on_behavior
2025-12-30 16:12:25.572 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.bureau_dressing_pan_main_effect
2025-12-30 16:12:25.573 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.bureau_dressing_pan_main_power_on_behavior
2025-12-30 16:12:25.574 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_spotpoele_effect
2025-12-30 16:12:25.574 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.couloir_amp_spotpoele_power_on_behavior
2025-12-30 16:12:25.575 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.sdb_strip_miroir_effect
2025-12-30 16:12:25.576 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.sdb_strip_miroir_power_on_behavior
2025-12-30 16:12:25.577 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.sdb_amp_centre_effect
2025-12-30 16:12:25.577 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new select.mqtt entity: select.sdb_amp_centre_power_on_behavior
2025-12-30 16:12:25.583 INFO (MainThread) [homeassistant.components.sensor] Setting up mqtt.sensor
2025-12-30 16:12:25.584 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.zigbee2mqtt_bridge_version
2025-12-30 16:12:25.586 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_poele_linkquality
2025-12-30 16:12:25.587 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.zigbee2mqtt_bridge_coordinator_version
2025-12-30 16:12:25.588 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_cuisine_id002_battery
2025-12-30 16:12:25.591 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.zigbee2mqtt_bridge_network_map
2025-12-30 16:12:25.592 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_cuisine_id002_linkquality
2025-12-30 16:12:25.594 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_cuisine_color_options
2025-12-30 16:12:25.595 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_escaliers_color_options
2025-12-30 16:12:25.595 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_cuisine_linkquality
2025-12-30 16:12:25.596 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_escaliers_linkquality
2025-12-30 16:12:25.596 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_sdb_color_options
2025-12-30 16:12:25.597 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_centre_color_options
2025-12-30 16:12:25.598 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_sdb_linkquality
2025-12-30 16:12:25.598 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_centre_linkquality
2025-12-30 16:12:25.599 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_poele_color_options
2025-12-30 16:12:25.600 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_evier_color_options
2025-12-30 16:12:25.601 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_evier_linkquality
2025-12-30 16:12:25.602 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang2_lamp_escaliers_color_options
2025-12-30 16:12:25.603 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang2_lamp_escaliers_linkquality
2025-12-30 16:12:25.604 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang2_lamp_centre_color_options
2025-12-30 16:12:25.605 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang2_lamp_centre_linkquality
2025-12-30 16:12:25.605 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_plaques_color_options
2025-12-30 16:12:25.606 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_rang1_lamp_plaques_linkquality
2025-12-30 16:12:25.607 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_table_color_options
2025-12-30 16:12:25.608 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_table_linkquality
2025-12-30 16:12:25.609 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_escaliers_color_options
2025-12-30 16:12:25.610 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_escaliers_linkquality
2025-12-30 16:12:25.610 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_four_color_options
2025-12-30 16:12:25.611 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.cuisine_centre_lamp_four_linkquality
2025-12-30 16:12:25.612 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_couloir_id009_battery
2025-12-30 16:12:25.614 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_couloir_id009_linkquality
2025-12-30 16:12:25.614 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_pan_canape_color_options
2025-12-30 16:12:25.615 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_pan_canape_linkquality
2025-12-30 16:12:25.616 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_pan_centre_color_options
2025-12-30 16:12:25.617 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_pan_centre_linkquality
2025-12-30 16:12:25.618 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang1_amp_centre_color_options
2025-12-30 16:12:25.619 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang1_amp_centre_linkquality
2025-12-30 16:12:25.619 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang1_amp_table_color_options
2025-12-30 16:12:25.620 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang1_amp_table_linkquality
2025-12-30 16:12:25.622 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_amp_table_color_options
2025-12-30 16:12:25.623 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_amp_table_linkquality
2025-12-30 16:12:25.624 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_amp_fauteuil_color_options
2025-12-30 16:12:25.625 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salle_a_manger_rang2_amp_fauteuil_linkquality
2025-12-30 16:12:25.626 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_basescalier_color_options
2025-12-30 16:12:25.627 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_basescalier_linkquality
2025-12-30 16:12:25.628 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_clicclac_color_options
2025-12-30 16:12:25.628 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_clicclac_linkquality
2025-12-30 16:12:25.629 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_escalier_amp_escaliercentre_color_options
2025-12-30 16:12:25.630 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_escalier_amp_escaliercentre_linkquality
2025-12-30 16:12:25.631 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_tetedelit_color_options
2025-12-30 16:12:25.632 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_tetedelit_linkquality
2025-12-30 16:12:25.632 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_portefenetre_color_options
2025-12-30 16:12:25.633 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_portefenetre_linkquality
2025-12-30 16:12:25.634 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_armoire_color_options
2025-12-30 16:12:25.635 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_armoire_linkquality
2025-12-30 16:12:25.635 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_bureau_color_options
2025-12-30 16:12:25.636 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_bureau_linkquality
2025-12-30 16:12:25.637 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_fenetre_color_options
2025-12-30 16:12:25.638 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_fenetre_linkquality
2025-12-30 16:12:25.639 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_porte_color_options
2025-12-30 16:12:25.640 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_bas_amp_porte_linkquality
2025-12-30 16:12:25.641 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_hautescalier_color_options
2025-12-30 16:12:25.642 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_hautescalier_linkquality
2025-12-30 16:12:25.643 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_piedlit_color_options
2025-12-30 16:12:25.644 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_jojo_mezzanine_amp_piedlit_linkquality
2025-12-30 16:12:25.644 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_jojo_id008_battery
2025-12-30 16:12:25.645 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_jojo_id008_linkquality
2025-12-30 16:12:25.646 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id006_battery
2025-12-30 16:12:25.647 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id006_linkquality
2025-12-30 16:12:25.648 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_salle_a_manger_id005_battery
2025-12-30 16:12:25.649 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_salle_a_manger_id005_linkquality
2025-12-30 16:12:25.650 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_parents_id007_battery
2025-12-30 16:12:25.651 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_parents_id007_linkquality
2025-12-30 16:12:25.652 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_escaliers_bas_battery
2025-12-30 16:12:25.653 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_escaliers_bas_linkquality
2025-12-30 16:12:25.654 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.escaliers_strip_main_color_options
2025-12-30 16:12:25.655 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.escaliers_strip_main_linkquality
2025-12-30 16:12:25.656 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_salon_id003_battery
2025-12-30 16:12:25.657 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_salon_id003_linkquality
2025-12-30 16:12:25.657 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_strip_poutreescaliers_color_options
2025-12-30 16:12:25.658 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_strip_poutreescaliers_linkquality
2025-12-30 16:12:25.659 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie1_color_options
2025-12-30 16:12:25.660 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie1_linkquality
2025-12-30 16:12:25.660 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie2_color_options
2025-12-30 16:12:25.661 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie2_linkquality
2025-12-30 16:12:25.662 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie3_color_options
2025-12-30 16:12:25.663 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.salon_amp_lampeparapluie3_linkquality
2025-12-30 16:12:25.664 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id000_battery
2025-12-30 16:12:25.665 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id000_linkquality
2025-12-30 16:12:25.666 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_spare_id004_battery
2025-12-30 16:12:25.667 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_spare_id004_linkquality
2025-12-30 16:12:25.667 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_amp_chevetlolo_color_options
2025-12-30 16:12:25.669 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_amp_chevetlolo_linkquality
2025-12-30 16:12:25.670 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_parents_id001_battery
2025-12-30 16:12:25.671 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_parents_id001_linkquality
2025-12-30 16:12:25.672 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_amp_entree_color_options
2025-12-30 16:12:25.672 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_amp_entree_linkquality
2025-12-30 16:12:25.674 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_pan_main_color_options
2025-12-30 16:12:25.675 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.ch_parents_pan_main_linkquality
2025-12-30 16:12:25.676 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.bureau_dressing_pc_main_linkquality
2025-12-30 16:12:25.677 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.bureau_dressing_pan_main_color_options
2025-12-30 16:12:25.678 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.bureau_dressing_pan_main_linkquality
2025-12-30 16:12:25.679 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id009_battery
2025-12-30 16:12:25.680 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id009_voltage
2025-12-30 16:12:25.682 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_bureau_dressing_id009_linkquality
2025-12-30 16:12:25.682 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_chargecpu 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
2025-12-30 16:12:25.683 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_chargecpu
2025-12-30 16:12:25.683 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_chargegpu 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
2025-12-30 16:12:25.684 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_chargegpu
2025-12-30 16:12:25.685 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_temp_gpu 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
2025-12-30 16:12:25.685 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_temp_gpu
2025-12-30 16:12:25.686 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_screen_state 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
2025-12-30 16:12:25.686 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_screen_state
2025-12-30 16:12:25.687 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_status 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
2025-12-30 16:12:25.687 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_batterie_charge_status
2025-12-30 16:12:25.688 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_full_charge_lifetime 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
2025-12-30 16:12:25.688 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_batterie_full_charge_lifetime
2025-12-30 16:12:25.689 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_remaining_percentage 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
2025-12-30 16:12:25.689 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_batterie_charge_remaining_percentage
2025-12-30 16:12:25.690 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_charge_remaining 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
2025-12-30 16:12:25.690 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_batterie_charge_remaining
2025-12-30 16:12:25.691 WARNING (MainThread) [homeassistant.components.mqtt.entity] The configuration for entity sensor.warmachine_papa_batterie_powerline_status 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
2025-12-30 16:12:25.691 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.warmachine_papa_batterie_powerline_status
2025-12-30 16:12:25.692 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_spotpoele_color_options
2025-12-30 16:12:25.694 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.couloir_amp_spotpoele_linkquality
2025-12-30 16:12:25.695 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_spot_poele_id010_battery
2025-12-30 16:12:25.697 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_spot_poele_id010_linkquality
2025-12-30 16:12:25.698 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_lea_escaliers_battery
2025-12-30 16:12:25.699 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_ch_lea_escaliers_linkquality
2025-12-30 16:12:25.700 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.sdb_strip_miroir_color_options
2025-12-30 16:12:25.702 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.sdb_strip_miroir_linkquality
2025-12-30 16:12:25.703 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_sdb_id013_battery
2025-12-30 16:12:25.704 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.teleco_sdb_id013_linkquality
2025-12-30 16:12:25.704 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.mqtt entity: sensor.sdb_amp_centre_linkquality
2025-12-30 16:12:25.708 INFO (MainThread) [homeassistant.setup] Setting up switch
2025-12-30 16:12:25.708 INFO (MainThread) [homeassistant.components.switch] Setting up mqtt.switch
2025-12-30 16:12:25.710 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new switch.mqtt entity: switch.zigbee2mqtt_bridge_permit_join
2025-12-30 16:12:25.711 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new switch.mqtt entity: switch.bureau_dressing_pc_main
2025-12-30 16:12:25.718 INFO (MainThread) [homeassistant.setup] Setting up update
2025-12-30 16:12:25.719 INFO (MainThread) [homeassistant.components.update] Setting up mqtt.update
2025-12-30 16:12:25.722 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.couloir_amp_cuisine
2025-12-30 16:12:25.723 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_centre_lamp_table
2025-12-30 16:12:25.724 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.couloir_amp_sdb
2025-12-30 16:12:25.725 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_centre_lamp_escaliers
2025-12-30 16:12:25.726 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.couloir_amp_poele
2025-12-30 16:12:25.727 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_centre_lamp_four
2025-12-30 16:12:25.728 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_cuisine_id002
2025-12-30 16:12:25.729 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_couloir_id009
2025-12-30 16:12:25.730 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang1_lamp_escaliers
2025-12-30 16:12:25.731 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_pan_canape
2025-12-30 16:12:25.732 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang1_lamp_centre
2025-12-30 16:12:25.733 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_rang2_pan_centre
2025-12-30 16:12:25.734 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang1_lamp_evier
2025-12-30 16:12:25.734 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_rang1_amp_centre
2025-12-30 16:12:25.735 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang2_lamp_escaliers
2025-12-30 16:12:25.736 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_rang1_amp_table
2025-12-30 16:12:25.737 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang2_lamp_centre
2025-12-30 16:12:25.738 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_rang2_amp_table
2025-12-30 16:12:25.739 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.cuisine_rang1_lamp_plaques
2025-12-30 16:12:25.740 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salle_a_manger_rang2_amp_fauteuil
2025-12-30 16:12:25.741 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_basescalier
2025-12-30 16:12:25.742 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_clicclac
2025-12-30 16:12:25.743 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_escalier_amp_escaliercentre
2025-12-30 16:12:25.744 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_mezzanine_amp_tetedelit
2025-12-30 16:12:25.745 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_portefenetre
2025-12-30 16:12:25.746 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_armoire
2025-12-30 16:12:25.747 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_mezzanine_amp_bureau
2025-12-30 16:12:25.748 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_fenetre
2025-12-30 16:12:25.749 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_bas_amp_porte
2025-12-30 16:12:25.750 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_mezzanine_amp_hautescalier
2025-12-30 16:12:25.751 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_jojo_mezzanine_amp_piedlit
2025-12-30 16:12:25.752 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_ch_jojo_id008
2025-12-30 16:12:25.753 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_bureau_dressing_id006
2025-12-30 16:12:25.754 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_salle_a_manger_id005
2025-12-30 16:12:25.755 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_ch_parents_id007
2025-12-30 16:12:25.756 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_escaliers_bas
2025-12-30 16:12:25.758 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.escaliers_strip_main
2025-12-30 16:12:25.759 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_salon_id003
2025-12-30 16:12:25.760 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salon_strip_poutreescaliers
2025-12-30 16:12:25.761 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salon_amp_lampeparapluie1
2025-12-30 16:12:25.762 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salon_amp_lampeparapluie2
2025-12-30 16:12:25.763 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.salon_amp_lampeparapluie3
2025-12-30 16:12:25.764 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_bureau_dressing_id000
2025-12-30 16:12:25.765 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_spare_id004
2025-12-30 16:12:25.766 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_parents_amp_chevetlolo
2025-12-30 16:12:25.767 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_ch_parents_id001
2025-12-30 16:12:25.768 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_parents_amp_entree
2025-12-30 16:12:25.769 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.ch_parents_pan_main
2025-12-30 16:12:25.770 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.bureau_dressing_pc_main
2025-12-30 16:12:25.771 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.bureau_dressing_pan_main
2025-12-30 16:12:25.772 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_bureau_dressing_id009
2025-12-30 16:12:25.773 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.couloir_amp_spotpoele
2025-12-30 16:12:25.774 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_spot_poele_id010
2025-12-30 16:12:25.775 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_ch_lea_escaliers
2025-12-30 16:12:25.776 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.sdb_strip_miroir
2025-12-30 16:12:25.777 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.teleco_sdb_id013
2025-12-30 16:12:25.778 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new update.mqtt entity: update.sdb_amp_centre
2025-12-30 16:12:25.800 WARNING (Thread-1 (_monitor)) [homeassistant.util.logging] Module homeassistant.helpers.entity_registry is logging too frequently. 200 messages since last count
2025-12-30 16:12:31.281 INFO (MainThread) [homeassistant.components.mqtt.client] MQTT client initialized, birth message sent
2025-12-30 16:39:42.111 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616584446176] Received unknown command: recorder/info
2025-12-30 16:42:07.718 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616631401696] Received unknown command: recorder/info
2025-12-30 16:51:43.934 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616582687584] Received unknown command: recorder/info
2025-12-30 16:53:35.110 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616582687904] Received unknown command: recorder/info
2025-12-30 16:56:21.316 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616582692224] Received unknown command: recorder/info
2025-12-30 16:57:33.222 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616582692224] Received unknown command: recorder/info
2025-12-30 16:59:04.289 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616582691424] Received unknown command: recorder/info
2025-12-30 17:06:38.353 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [140616584461216] Received unknown command: recorder/info
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.setup] Setting up labs
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.setup] Setup of domain labs took 0.00 seconds
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.bootstrap] Setting up stage frontend: {'frontend'}; already set up: {}
Dependencies: {'lovelace', 'diagnostics', 'device_automation', 'search', 'config', 'api', 'file_upload', 'onboarding', 'repairs', 'auth'}; already set up: {'system_log', 'http', 'websocket_api'}
2025-12-31 10:50:44.253 INFO (MainThread) [homeassistant.setup] Setting up auth
2025-12-31 10:50:44.254 INFO (MainThread) [homeassistant.setup] Setup of domain auth took 0.00 seconds
2025-12-31 10:50:44.254 INFO (MainThread) [homeassistant.setup] Setting up onboarding
2025-12-31 10:50:44.254 INFO (MainThread) [homeassistant.setup] Setting up api
2025-12-31 10:50:44.255 INFO (MainThread) [homeassistant.setup] Setup of domain api took 0.00 seconds
2025-12-31 10:50:44.255 INFO (MainThread) [homeassistant.setup] Setting up config
2025-12-31 10:50:44.256 INFO (MainThread) [homeassistant.setup] Setup of domain config took 0.00 seconds
2025-12-31 10:50:44.256 INFO (MainThread) [homeassistant.setup] Setting up device_automation
2025-12-31 10:50:44.256 INFO (MainThread) [homeassistant.setup] Setup of domain device_automation took 0.00 seconds
2025-12-31 10:50:44.256 INFO (MainThread) [homeassistant.setup] Setting up diagnostics
2025-12-31 10:50:44.257 INFO (MainThread) [homeassistant.setup] Setup of domain diagnostics took 0.00 seconds
2025-12-31 10:50:44.257 INFO (MainThread) [homeassistant.setup] Setting up file_upload
2025-12-31 10:50:44.257 INFO (MainThread) [homeassistant.setup] Setup of domain file_upload took 0.00 seconds
2025-12-31 10:50:44.257 INFO (MainThread) [homeassistant.setup] Setting up repairs
2025-12-31 10:50:44.257 INFO (MainThread) [homeassistant.setup] Setup of domain repairs took 0.00 seconds
2025-12-31 10:50:44.258 INFO (MainThread) [homeassistant.setup] Setting up search
2025-12-31 10:50:44.258 INFO (MainThread) [homeassistant.setup] Setup of domain search took 0.00 seconds
2025-12-31 10:50:44.271 INFO (MainThread) [homeassistant.setup] Setup of domain onboarding took 0.02 seconds
2025-12-31 10:50:44.271 INFO (MainThread) [homeassistant.setup] Setting up lovelace
2025-12-31 10:50:44.287 INFO (MainThread) [homeassistant.setup] Setup of domain lovelace took 0.02 seconds
2025-12-31 10:50:44.291 INFO (MainThread) [homeassistant.setup] Setting up frontend
2025-12-31 10:50:44.295 INFO (MainThread) [homeassistant.setup] Setup of domain frontend took 0.00 seconds
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage recorder: {'recorder'}
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage debugger: {'debugpy'}
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage zeroconf: {'zeroconf'}
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage 1: {'hassio', 'bluetooth', 'usb', 'dhcp', 'ssdp', 'cloud', 'mqtt_eventstream'}
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.bootstrap] Setting up stage 2: {'timer', 'script', 'person', 'input_select', 'mqtt', 'hardware', 'automation', 'input_text', 'backup', 'analytics', 'system_health', 'input_datetime', 'tag', 'input_boolean', 'application_credentials', 'input_button', 'shopping_list', 'radio_browser', 'counter', 'google_translate', 'schedule', 'input_number', 'zone', 'scene'}; already set up: {'frontend', 'homeassistant', 'config', 'api', 'network', 'labs', 'http', 'logger'}
Dependencies: {'blueprint', 'image_upload', 'trace'}; already set up: {'device_automation', 'api', 'file_upload', 'http', 'websocket_api', 'auth'}
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.setup] Setting up scene
2025-12-31 10:50:44.296 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.setup] Setup of domain scene took 0.00 seconds
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.setup] Setting up blueprint
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.setup] Setup of domain blueprint took 0.00 seconds
2025-12-31 10:50:44.300 INFO (MainThread) [homeassistant.setup] Setting up trace
2025-12-31 10:50:44.301 INFO (MainThread) [homeassistant.setup] Setup of domain trace took 0.00 seconds
2025-12-31 10:50:44.301 INFO (MainThread) [homeassistant.setup] Setting up script
2025-12-31 10:50:44.302 INFO (MainThread) [homeassistant.setup] Setup of domain script took 0.00 seconds
2025-12-31 10:50:44.302 INFO (MainThread) [homeassistant.setup] Setting up automation
2025-12-31 10:50:44.302 INFO (MainThread) [homeassistant.setup] Setup of domain automation took 0.00 seconds
2025-12-31 10:50:44.303 INFO (MainThread) [homeassistant.setup] Setting up system_health
2025-12-31 10:50:44.303 INFO (MainThread) [homeassistant.setup] Setup of domain system_health took 0.00 seconds
2025-12-31 10:50:44.303 INFO (MainThread) [homeassistant.setup] Setting up zone
2025-12-31 10:50:44.304 INFO (MainThread) [homeassistant.setup] Setup of domain zone took 0.00 seconds
2025-12-31 10:50:44.304 INFO (MainThread) [homeassistant.setup] Setting up input_number
2025-12-31 10:50:44.305 INFO (MainThread) [homeassistant.setup] Setup of domain input_number took 0.00 seconds
2025-12-31 10:50:44.310 INFO (MainThread) [homeassistant.components.http] Now listening on port 8123
2025-12-31 10:50:44.310 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.01 seconds
2025-12-31 10:50:44.311 INFO (MainThread) [homeassistant.setup] Setting up timer
2025-12-31 10:50:44.312 INFO (MainThread) [homeassistant.setup] Setup of domain timer took 0.00 seconds
2025-12-31 10:50:44.314 INFO (MainThread) [homeassistant.setup] Setting up input_text
2025-12-31 10:50:44.314 INFO (MainThread) [homeassistant.setup] Setup of domain input_text took 0.00 seconds
2025-12-31 10:50:44.315 INFO (MainThread) [homeassistant.setup] Setting up image_upload
2025-12-31 10:50:44.316 INFO (MainThread) [homeassistant.setup] Setup of domain image_upload took 0.00 seconds
2025-12-31 10:50:44.316 INFO (MainThread) [homeassistant.setup] Setting up person
2025-12-31 10:50:44.317 INFO (MainThread) [homeassistant.setup] Setup of domain person took 0.00 seconds
2025-12-31 10:50:44.321 INFO (MainThread) [homeassistant.setup] Setting up input_datetime
2025-12-31 10:50:44.322 INFO (MainThread) [homeassistant.setup] Setup of domain input_datetime took 0.00 seconds
2025-12-31 10:50:44.329 INFO (MainThread) [homeassistant.setup] Setting up tag
2025-12-31 10:50:44.330 INFO (MainThread) [homeassistant.setup] Setup of domain tag took 0.00 seconds
2025-12-31 10:50:44.331 INFO (MainThread) [homeassistant.setup] Setting up backup
2025-12-31 10:50:44.334 INFO (MainThread) [homeassistant.setup] Setting up input_boolean
2025-12-31 10:50:44.335 INFO (MainThread) [homeassistant.setup] Setup of domain input_boolean took 0.00 seconds
2025-12-31 10:50:44.336 INFO (MainThread) [homeassistant.setup] Setup of domain backup took 0.00 seconds
2025-12-31 10:50:44.338 INFO (MainThread) [homeassistant.setup] Setting up application_credentials
2025-12-31 10:50:44.338 INFO (MainThread) [homeassistant.setup] Setup of domain application_credentials took 0.00 seconds
2025-12-31 10:50:44.341 INFO (MainThread) [homeassistant.setup] Setting up input_button
2025-12-31 10:50:44.342 INFO (MainThread) [homeassistant.setup] Setup of domain input_button took 0.00 seconds
2025-12-31 10:50:44.350 INFO (MainThread) [homeassistant.setup] Setting up shopping_list
2025-12-31 10:50:44.350 INFO (MainThread) [homeassistant.setup] Setup of domain shopping_list took 0.00 seconds
2025-12-31 10:50:44.354 INFO (MainThread) [homeassistant.setup] Setting up input_select
2025-12-31 10:50:44.355 INFO (MainThread) [homeassistant.setup] Setup of domain input_select took 0.00 seconds
2025-12-31 10:50:44.357 INFO (MainThread) [homeassistant.setup] Setting up counter
2025-12-31 10:50:44.358 INFO (MainThread) [homeassistant.setup] Setup of domain counter took 0.00 seconds
2025-12-31 10:50:44.361 INFO (MainThread) [homeassistant.setup] Setting up schedule
2025-12-31 10:50:44.362 INFO (MainThread) [homeassistant.setup] Setup of domain schedule took 0.00 seconds
2025-12-31 10:50:44.368 INFO (MainThread) [homeassistant.setup] Setting up hardware
2025-12-31 10:50:44.392 INFO (MainThread) [homeassistant.setup] Setup of domain hardware took 0.02 seconds
2025-12-31 10:50:44.395 INFO (MainThread) [homeassistant.setup] Setting up analytics
2025-12-31 10:50:44.397 INFO (MainThread) [homeassistant.setup] Setup of domain analytics took 0.00 seconds
2025-12-31 10:50:44.476 INFO (MainThread) [homeassistant.setup] Setting up radio_browser
2025-12-31 10:50:44.477 INFO (MainThread) [homeassistant.setup] Setup of domain radio_browser took 0.00 seconds
2025-12-31 10:50:44.509 INFO (MainThread) [homeassistant.setup] Setting up mqtt
2025-12-31 10:50:44.509 INFO (MainThread) [homeassistant.setup] Setup of domain mqtt took 0.00 seconds
2025-12-31 10:50:44.537 INFO (MainThread) [homeassistant.setup] Setting up google_translate
2025-12-31 10:50:44.537 INFO (MainThread) [homeassistant.setup] Setup of domain google_translate took 0.00 seconds
2025-12-31 10:50:44.545 INFO (MainThread) [homeassistant.setup] Setting up todo
2025-12-31 10:50:44.546 INFO (MainThread) [homeassistant.setup] Setup of domain todo took 0.00 seconds
2025-12-31 10:50:44.548 INFO (MainThread) [homeassistant.components.todo] Setting up shopping_list.todo
2025-12-31 10:50:44.555 INFO (MainThread) [homeassistant.setup] Setting up ffmpeg
2025-12-31 10:50:44.557 INFO (MainThread) [homeassistant.setup] Setup of domain ffmpeg took 0.00 seconds
2025-12-31 10:50:44.557 INFO (MainThread) [homeassistant.setup] Setting up tts
2025-12-31 10:50:44.565 INFO (MainThread) [homeassistant.setup] Setup of domain tts took 0.01 seconds
2025-12-31 10:50:44.566 INFO (MainThread) [homeassistant.components.tts] Setting up google_translate.tts
2025-12-31 10:50:44.619 INFO (MainThread) [homeassistant.setup] Setting up event
2025-12-31 10:50:44.619 INFO (MainThread) [homeassistant.setup] Setup of domain event took 0.00 seconds
2025-12-31 10:50:44.620 INFO (MainThread) [homeassistant.setup] Setting up sensor
2025-12-31 10:50:44.620 INFO (MainThread) [homeassistant.setup] Setup of domain sensor took 0.00 seconds
2025-12-31 10:50:44.621 INFO (MainThread) [homeassistant.components.event] Setting up backup.event
2025-12-31 10:50:44.622 INFO (MainThread) [homeassistant.components.sensor] Setting up backup.sensor
2025-12-31 10:50:44.746 INFO (MainThread) [homeassistant.setup] Setting up light
2025-12-31 10:50:44.747 INFO (MainThread) [homeassistant.setup] Setup of domain light took 0.00 seconds
2025-12-31 10:50:44.748 INFO (MainThread) [homeassistant.setup] Setting up update
2025-12-31 10:50:44.748 INFO (MainThread) [homeassistant.setup] Setup of domain update took 0.00 seconds
2025-12-31 10:50:44.748 INFO (MainThread) [homeassistant.setup] Setting up binary_sensor
2025-12-31 10:50:44.748 INFO (MainThread) [homeassistant.setup] Setup of domain binary_sensor took 0.00 seconds
2025-12-31 10:50:44.749 INFO (MainThread) [homeassistant.setup] Setting up switch
2025-12-31 10:50:44.749 INFO (MainThread) [homeassistant.setup] Setup of domain switch took 0.00 seconds
2025-12-31 10:50:44.749 INFO (MainThread) [homeassistant.setup] Setting up button
2025-12-31 10:50:44.749 INFO (MainThread) [homeassistant.setup] Setup of domain button took 0.00 seconds
2025-12-31 10:50:44.749 INFO (MainThread) [homeassistant.setup] Setting up select
2025-12-31 10:50:44.750 INFO (MainThread) [homeassistant.setup] Setup of domain select took 0.00 seconds
2025-12-31 10:50:44.754 INFO (MainThread) [homeassistant.components.sensor] Setting up mqtt.sensor
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.light] Setting up mqtt.light
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.update] Setting up mqtt.update
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mqtt.binary_sensor
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.scene] Setting up mqtt.scene
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.switch] Setting up mqtt.switch
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.button] Setting up mqtt.button
2025-12-31 10:50:44.755 INFO (MainThread) [homeassistant.components.select] Setting up mqtt.select
2025-12-31 10:50:44.758 INFO (MainThread) [homeassistant.bootstrap] Home Assistant initialized in 1.23s
2025-12-31 10:50:44.758 INFO (MainThread) [homeassistant.core] Starting Home Assistant 2025.12.5
2025-12-31 10:50:45.402 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
2025-12-31 10:50:45.403 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
2025-12-31 10:50:45.404 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
2025-12-31 10:50:45.404 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
2025-12-31 10:50:45.405 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
2025-12-31 10:50:45.406 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
2025-12-31 10:50:45.407 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
2025-12-31 10:50:45.407 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
2025-12-31 10:50:45.408 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
2025-12-31 10:50:45.409 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
2025-12-31 10:50:45.410 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
2025-12-31 10:50:45.410 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
2025-12-31 10:50:45.411 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
2025-12-31 10:50:45.847 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
2025-12-31 10:50:45.849 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
2025-12-31 10:50:45.851 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
2025-12-31 10:50:45.852 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
2025-12-31 10:50:45.853 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
2025-12-31 10:50:45.854 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
2025-12-31 10:50:45.856 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
2025-12-31 10:50:45.857 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
2025-12-31 10:50:45.858 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
2025-12-31 10:50:47.107 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [139721097331872] Received unknown command: recorder/info
2025-12-31 10:50:51.445 INFO (MainThread) [homeassistant.components.mqtt.client] MQTT client initialized, birth message sent
2025-12-31 10:51:19.080 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [139719955133792] Received unknown command: recorder/info
2025-12-31 10:56:31.720 INFO (MainThread) [homeassistant.components.websocket_api.http.connection] [139719955130272] Received unknown command: recorder/info
+495 -69
View File
@@ -107,14 +107,14 @@ var y = class extends HTMLElement {
}
}
static getPropertyDescriptor(t4, s4, i5) {
const { get: e5, set: r5 } = h(this.prototype, t4) ?? { get() {
const { get: e5, set: r6 } = h(this.prototype, t4) ?? { get() {
return this[s4];
}, set(t5) {
this[s4] = t5;
} };
return { get: e5, set(s5) {
const h3 = e5?.call(this);
r5?.call(this, s5), this.requestUpdate(t4, h3, i5);
r6?.call(this, s5), this.requestUpdate(t4, h3, i5);
}, configurable: true, enumerable: true };
}
static getPropertyOptions(t4) {
@@ -199,20 +199,20 @@ var y = class extends HTMLElement {
if (void 0 !== e5 && this._$Em !== e5) {
const t5 = i5.getPropertyOptions(e5), h3 = "function" == typeof t5.converter ? { fromAttribute: t5.converter } : void 0 !== t5.converter?.fromAttribute ? t5.converter : u;
this._$Em = e5;
const r5 = h3.fromAttribute(s4, t5.type);
this[e5] = r5 ?? this._$Ej?.get(e5) ?? r5, this._$Em = null;
const r6 = h3.fromAttribute(s4, t5.type);
this[e5] = r6 ?? this._$Ej?.get(e5) ?? r6, this._$Em = null;
}
}
requestUpdate(t4, s4, i5, e5 = false, h3) {
if (void 0 !== t4) {
const r5 = this.constructor;
if (false === e5 && (h3 = this[t4]), i5 ??= r5.getPropertyOptions(t4), !((i5.hasChanged ?? f)(h3, s4) || i5.useDefault && i5.reflect && h3 === this._$Ej?.get(t4) && !this.hasAttribute(r5._$Eu(t4, i5)))) return;
const r6 = this.constructor;
if (false === e5 && (h3 = this[t4]), i5 ??= r6.getPropertyOptions(t4), !((i5.hasChanged ?? f)(h3, s4) || i5.useDefault && i5.reflect && h3 === this._$Ej?.get(t4) && !this.hasAttribute(r6._$Eu(t4, i5)))) return;
this.C(t4, s4, i5);
}
false === this.isUpdatePending && (this._$ES = this._$EP());
}
C(t4, s4, { useDefault: i5, reflect: e5, wrapped: h3 }, r5) {
i5 && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(t4) && (this._$Ej.set(t4, r5 ?? s4 ?? this[t4]), true !== h3 || void 0 !== r5) || (this._$AL.has(t4) || (this.hasUpdated || i5 || (s4 = void 0), this._$AL.set(t4, s4)), true === e5 && this._$Em !== t4 && (this._$Eq ??= /* @__PURE__ */ new Set()).add(t4));
C(t4, s4, { useDefault: i5, reflect: e5, wrapped: h3 }, r6) {
i5 && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(t4) && (this._$Ej.set(t4, r6 ?? s4 ?? this[t4]), true !== h3 || void 0 !== r6) || (this._$AL.has(t4) || (this.hasUpdated || i5 || (s4 = void 0), this._$AL.set(t4, s4)), true === e5 && this._$Em !== t4 && (this._$Eq ??= /* @__PURE__ */ new Set()).add(t4));
}
async _$EP() {
this.isUpdatePending = true;
@@ -325,7 +325,7 @@ var N = (t4, i5) => {
};
var S2 = class _S {
constructor({ strings: t4, _$litType$: i5 }, e5) {
let r5;
let r6;
this.parts = [];
let l3 = 0, a3 = 0;
const u3 = t4.length - 1, d3 = this.parts, [f3, v2] = N(t4, i5);
@@ -333,24 +333,24 @@ var S2 = class _S {
const t5 = this.el.content.firstChild;
t5.replaceWith(...t5.childNodes);
}
for (; null !== (r5 = P.nextNode()) && d3.length < u3; ) {
if (1 === r5.nodeType) {
if (r5.hasAttributes()) for (const t5 of r5.getAttributeNames()) if (t5.endsWith(h2)) {
const i6 = v2[a3++], s4 = r5.getAttribute(t5).split(o3), e6 = /([.?@])?(.*)/.exec(i6);
d3.push({ type: 1, index: l3, name: e6[2], strings: s4, ctor: "." === e6[1] ? I : "?" === e6[1] ? L : "@" === e6[1] ? z : H }), r5.removeAttribute(t5);
} else t5.startsWith(o3) && (d3.push({ type: 6, index: l3 }), r5.removeAttribute(t5));
if (y2.test(r5.tagName)) {
const t5 = r5.textContent.split(o3), i6 = t5.length - 1;
for (; null !== (r6 = P.nextNode()) && d3.length < u3; ) {
if (1 === r6.nodeType) {
if (r6.hasAttributes()) for (const t5 of r6.getAttributeNames()) if (t5.endsWith(h2)) {
const i6 = v2[a3++], s4 = r6.getAttribute(t5).split(o3), e6 = /([.?@])?(.*)/.exec(i6);
d3.push({ type: 1, index: l3, name: e6[2], strings: s4, ctor: "." === e6[1] ? I : "?" === e6[1] ? L : "@" === e6[1] ? z : H }), r6.removeAttribute(t5);
} else t5.startsWith(o3) && (d3.push({ type: 6, index: l3 }), r6.removeAttribute(t5));
if (y2.test(r6.tagName)) {
const t5 = r6.textContent.split(o3), i6 = t5.length - 1;
if (i6 > 0) {
r5.textContent = s2 ? s2.emptyScript : "";
for (let s4 = 0; s4 < i6; s4++) r5.append(t5[s4], c3()), P.nextNode(), d3.push({ type: 2, index: ++l3 });
r5.append(t5[i6], c3());
r6.textContent = s2 ? s2.emptyScript : "";
for (let s4 = 0; s4 < i6; s4++) r6.append(t5[s4], c3()), P.nextNode(), d3.push({ type: 2, index: ++l3 });
r6.append(t5[i6], c3());
}
}
} else if (8 === r5.nodeType) if (r5.data === n3) d3.push({ type: 2, index: l3 });
} else if (8 === r6.nodeType) if (r6.data === n3) d3.push({ type: 2, index: l3 });
else {
let t5 = -1;
for (; -1 !== (t5 = r5.data.indexOf(o3, t5 + 1)); ) d3.push({ type: 7, index: l3 }), t5 += o3.length - 1;
for (; -1 !== (t5 = r6.data.indexOf(o3, t5 + 1)); ) d3.push({ type: 7, index: l3 }), t5 += o3.length - 1;
}
l3++;
}
@@ -379,13 +379,13 @@ var R = class {
u(t4) {
const { el: { content: i5 }, parts: s4 } = this._$AD, e5 = (t4?.creationScope ?? l2).importNode(i5, true);
P.currentNode = e5;
let h3 = P.nextNode(), o6 = 0, n5 = 0, r5 = s4[0];
for (; void 0 !== r5; ) {
if (o6 === r5.index) {
let h3 = P.nextNode(), o6 = 0, n5 = 0, r6 = s4[0];
for (; void 0 !== r6; ) {
if (o6 === r6.index) {
let i6;
2 === r5.type ? i6 = new k(h3, h3.nextSibling, this, t4) : 1 === r5.type ? i6 = new r5.ctor(h3, r5.name, r5.strings, this, t4) : 6 === r5.type && (i6 = new Z(h3, this, t4)), this._$AV.push(i6), r5 = s4[++n5];
2 === r6.type ? i6 = new k(h3, h3.nextSibling, this, t4) : 1 === r6.type ? i6 = new r6.ctor(h3, r6.name, r6.strings, this, t4) : 6 === r6.type && (i6 = new Z(h3, this, t4)), this._$AV.push(i6), r6 = s4[++n5];
}
o6 !== r5?.index && (h3 = P.nextNode(), o6++);
o6 !== r6?.index && (h3 = P.nextNode(), o6++);
}
return P.currentNode = l2, e5;
}
@@ -469,8 +469,8 @@ var H = class {
if (void 0 === h3) t4 = M(this, t4, i5, 0), o6 = !a2(t4) || t4 !== this._$AH && t4 !== E, o6 && (this._$AH = t4);
else {
const e6 = t4;
let n5, r5;
for (t4 = h3[0], n5 = 0; n5 < h3.length - 1; n5++) r5 = M(this, e6[s4 + n5], i5, n5), r5 === E && (r5 = this._$AH[n5]), o6 ||= !a2(r5) || r5 !== this._$AH[n5], r5 === A ? t4 = A : t4 !== A && (t4 += (r5 ?? "") + h3[n5 + 1]), this._$AH[n5] = r5;
let n5, r6;
for (t4 = h3[0], n5 = 0; n5 < h3.length - 1; n5++) r6 = M(this, e6[s4 + n5], i5, n5), r6 === E && (r6 = this._$AH[n5]), o6 ||= !a2(r6) || r6 !== this._$AH[n5], r6 === A ? t4 = A : t4 !== A && (t4 += (r6 ?? "") + h3[n5 + 1]), this._$AH[n5] = r6;
}
o6 && !e5 && this.j(t4);
}
@@ -541,8 +541,8 @@ var i4 = class extends y {
return this.renderOptions.renderBefore ??= t4.firstChild, t4;
}
update(t4) {
const r5 = this.render();
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t4), this._$Do = D(r5, this.renderRoot, this.renderOptions);
const r6 = this.render();
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t4), this._$Do = D(r6, this.renderRoot, this.renderOptions);
}
connectedCallback() {
super.connectedCallback(), this._$Do?.setConnected(true);
@@ -568,76 +568,497 @@ var t3 = (t4) => (e5, o6) => {
// node_modules/@lit/reactive-element/decorators/property.js
var o5 = { attribute: true, type: String, converter: u, reflect: false, hasChanged: f };
var r4 = (t4 = o5, e5, r5) => {
const { kind: n5, metadata: i5 } = r5;
var r4 = (t4 = o5, e5, r6) => {
const { kind: n5, metadata: i5 } = r6;
let s4 = globalThis.litPropertyMetadata.get(i5);
if (void 0 === s4 && globalThis.litPropertyMetadata.set(i5, s4 = /* @__PURE__ */ new Map()), "setter" === n5 && ((t4 = Object.create(t4)).wrapped = true), s4.set(r5.name, t4), "accessor" === n5) {
const { name: o6 } = r5;
return { set(r6) {
if (void 0 === s4 && globalThis.litPropertyMetadata.set(i5, s4 = /* @__PURE__ */ new Map()), "setter" === n5 && ((t4 = Object.create(t4)).wrapped = true), s4.set(r6.name, t4), "accessor" === n5) {
const { name: o6 } = r6;
return { set(r7) {
const n6 = e5.get.call(this);
e5.set.call(this, r6), this.requestUpdate(o6, n6, t4, true, r6);
e5.set.call(this, r7), this.requestUpdate(o6, n6, t4, true, r7);
}, init(e6) {
return void 0 !== e6 && this.C(o6, void 0, t4, e6), e6;
} };
}
if ("setter" === n5) {
const { name: o6 } = r5;
return function(r6) {
const { name: o6 } = r6;
return function(r7) {
const n6 = this[o6];
e5.call(this, r6), this.requestUpdate(o6, n6, t4, true, r6);
e5.call(this, r7), this.requestUpdate(o6, n6, t4, true, r7);
};
}
throw Error("Unsupported decorator location: " + n5);
};
function n4(t4) {
return (e5, o6) => "object" == typeof o6 ? r4(t4, e5, o6) : ((t5, e6, o7) => {
const r5 = e6.hasOwnProperty(o7);
return e6.constructor.createProperty(o7, t5), r5 ? Object.getOwnPropertyDescriptor(e6, o7) : void 0;
const r6 = e6.hasOwnProperty(o7);
return e6.constructor.createProperty(o7, t5), r6 ? Object.getOwnPropertyDescriptor(e6, o7) : void 0;
})(t4, e5, o6);
}
// node_modules/@lit/reactive-element/decorators/state.js
function r5(r6) {
return n4({ ...r6, state: true, attribute: false });
}
// src/styles.ts
var mainStyles = i`
/* CSS Custom Properties for theming */
:host {
--lpm-temp-warm-color: #ff9800;
--lpm-temp-neutral-color: #9e9e9e;
--lpm-temp-cold-color: #2196f3;
--lpm-button-radius: 8px;
--lpm-preset-radius: 12px;
--lpm-spacing: 8px;
--lpm-padding: 16px;
--lpm-transition: 0.2s ease;
--lpm-preset-min-height: 70px;
--lpm-preset-font-size: 11px;
--lpm-popup-max-width: 300px;
display: block;
}
.card-content {
padding: var(--lpm-padding);
}
/* Temperature Buttons */
.temp-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.temp-button {
flex: 1;
padding: 12px var(--lpm-spacing);
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
font-family: inherit;
font-size: 12px;
}
.temp-button:hover {
background: var(--secondary-background-color);
}
.temp-button:active {
transform: scale(0.95);
}
.temp-button.warm {
border-bottom: 3px solid var(--lpm-temp-warm-color);
}
.temp-button.neutral {
border-bottom: 3px solid var(--lpm-temp-neutral-color);
}
.temp-button.cold {
border-bottom: 3px solid var(--lpm-temp-cold-color);
}
.temp-button ha-icon {
--mdc-icon-size: 24px;
}
/* Preset Buttons */
.preset-buttons {
display: flex;
gap: var(--lpm-spacing);
}
.preset-button {
flex: 1;
aspect-ratio: 1;
min-height: var(--lpm-preset-min-height);
border: none;
border-radius: var(--lpm-preset-radius);
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
background: var(--primary-background-color);
color: var(--primary-text-color);
transition: all var(--lpm-transition);
padding: var(--lpm-spacing);
font-family: inherit;
}
.preset-button:hover {
background: var(--secondary-background-color);
}
.preset-button:active {
transform: scale(0.95);
}
.preset-button.active {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.preset-button ha-icon {
--mdc-icon-size: 28px;
}
.preset-button .name {
font-size: var(--lpm-preset-font-size);
text-align: center;
word-wrap: break-word;
line-height: 1.2;
max-width: 90%;
}
/* Lights List */
.lights-list {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: var(--lpm-spacing);
padding-top: var(--lpm-spacing);
border-top: 1px solid var(--divider-color);
}
.light-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
}
.light-name {
font-size: 14px;
color: var(--primary-text-color);
}
.light-state {
font-size: 12px;
color: var(--secondary-text-color);
}
.light-state.on {
color: var(--success-color, #4caf50);
}
/* Popup */
.popup-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 999;
}
.popup-content {
background: var(--card-background-color, var(--primary-background-color));
border-radius: var(--lpm-preset-radius);
padding: 24px;
max-width: var(--lpm-popup-max-width);
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
.popup-title {
font-size: 1.2em;
font-weight: 500;
margin-bottom: 16px;
color: var(--primary-text-color);
}
.popup-message {
margin-bottom: 20px;
color: var(--secondary-text-color);
}
.popup-input {
width: 100%;
padding: 12px;
border: 1px solid var(--divider-color, #e0e0e0);
border-radius: var(--lpm-button-radius);
margin-bottom: 16px;
font-size: 1em;
box-sizing: border-box;
background: var(--primary-background-color);
color: var(--primary-text-color);
font-family: inherit;
}
.popup-input:focus {
outline: none;
border-color: var(--primary-color);
}
.popup-buttons {
display: flex;
gap: 12px;
justify-content: flex-end;
}
.popup-button {
padding: 10px 20px;
border: none;
border-radius: var(--lpm-button-radius);
cursor: pointer;
font-size: 0.95em;
font-family: inherit;
transition: all var(--lpm-transition);
}
.popup-button.cancel {
background: var(--secondary-background-color);
color: var(--primary-text-color);
}
.popup-button.confirm {
background: var(--primary-color);
color: var(--text-primary-color, #fff);
}
.popup-button:hover {
opacity: 0.9;
}
.popup-button:active {
transform: scale(0.95);
}
/* Debug (temporary) */
.debug-info {
background: var(--secondary-background-color);
border-radius: var(--lpm-button-radius);
padding: 12px;
margin-top: 12px;
font-family: monospace;
font-size: 12px;
}
.debug-info p {
margin: 4px 0;
color: var(--primary-text-color);
}
.state-on {
color: var(--success-color, #4caf50);
font-weight: bold;
}
.state-off {
color: var(--disabled-text-color, #999);
}
`;
// src/utils.ts
var DEFAULT_TEMPERATURES = {
warm: 370,
neutral: 285,
cold: 200
};
var DEFAULT_PRESETS = 4;
var DEFAULT_NAME = "Lights";
function validateConfig(config) {
if (!config.lights?.length) {
throw new Error('Config error: "lights" must be a non-empty array');
}
for (const light of config.lights) {
if (!light.startsWith("light.")) {
throw new Error(`Config error: "${light}" is not a light.* entity`);
}
}
if (config.presets !== void 0 && (config.presets < 1 || config.presets > 4)) {
throw new Error('Config error: "presets" must be between 1 and 4');
}
return {
lights: config.lights,
name: config.name || DEFAULT_NAME,
temperatures: {
warm: config.temperatures?.warm || DEFAULT_TEMPERATURES.warm,
neutral: config.temperatures?.neutral || DEFAULT_TEMPERATURES.neutral,
cold: config.temperatures?.cold || DEFAULT_TEMPERATURES.cold
},
presets: config.presets || DEFAULT_PRESETS
};
}
var isEntityOn = (entity) => entity?.state === "on";
var isEntityAvailable = (entity) => entity !== void 0 && !["unavailable", "unknown"].includes(entity.state);
var getBrightnessPercent = (entity) => {
const brightness = entity?.attributes.brightness;
return brightness ? Math.round(brightness / 255 * 100) : 0;
};
var getEntityName = (entity) => entity?.attributes.friendly_name || entity?.entity_id || "Unknown";
// src/locales.ts
var translations = {
en: {
card: {
loading: "Loading...",
unavailable: "Unavailable",
allOn: "All ON",
allOff: "All OFF",
partial: "Partial",
averageBrightness: "Average brightness",
lights: "Lights"
},
temperature: {
warm: "Warm",
neutral: "Neutral",
cold: "Cold"
},
preset: {
defaultName: "Preset",
save: "Save",
recall: "Recall",
rename: "Rename"
},
popup: {
confirmSaveTitle: "Confirm save",
confirmSaveMessage: "Save current state to",
renameTitle: "Rename preset",
cancel: "Cancel",
confirm: "Confirm",
save: "Save"
}
},
fr: {
card: {
loading: "Chargement...",
unavailable: "Indisponible",
allOn: "Toutes ON",
allOff: "Toutes OFF",
partial: "Partiel",
averageBrightness: "Luminosit\xE9 moyenne",
lights: "Lumi\xE8res"
},
temperature: {
warm: "Chaud",
neutral: "Neutre",
cold: "Froid"
},
preset: {
defaultName: "Preset",
save: "Enregistrer",
recall: "Rappeler",
rename: "Renommer"
},
popup: {
confirmSaveTitle: "Confirmer l'enregistrement",
confirmSaveMessage: "Enregistrer l'\xE9tat actuel dans",
renameTitle: "Renommer le preset",
cancel: "Annuler",
confirm: "Confirmer",
save: "Enregistrer"
}
}
};
function detectLocale(hassLanguage) {
if (!hassLanguage) return "en";
const lang = hassLanguage.split("-")[0].toLowerCase();
return lang in translations ? lang : "en";
}
function getTranslations(locale) {
return translations[locale];
}
// src/light-preset-manager.ts
var LightPresetManager = class extends i4 {
setConfig(config) {
this.config = config;
this._config = validateConfig(config);
}
updated(changedProps) {
if (changedProps.has("hass") && this.hass) {
this._t = getTranslations(detectLocale(this.hass.language));
}
}
get _lights() {
if (!this.hass || !this._config) return [];
return this._config.lights.map((id) => this.hass.states[id]);
}
get _isAnyOn() {
return this._lights.some((e5) => isEntityOn(e5));
}
get _isAllOn() {
return this._lights.every((e5) => isEntityOn(e5));
}
get _averageBrightness() {
const onLights = this._lights.filter((e5) => isEntityOn(e5));
if (!onLights.length) return 0;
const total = onLights.reduce((sum, e5) => sum + getBrightnessPercent(e5), 0);
return Math.round(total / onLights.length);
}
render() {
if (!this.hass || !this._config || !this._t) {
return b2`<ha-card
><div class="card-content">
${this._t?.card.loading || "Loading..."}
</div></ha-card
>`;
}
const t4 = this._t;
return b2`
<ha-card>
<div class="card">
<h1>🎉 Hello World!</h1>
<p>Light Preset Manager fonctionne.</p>
<p>Config: ${JSON.stringify(this.config)}</p>
<ha-card header="${this._config.name}">
<div class="card-content">
<div class="debug-info">
<p>
<strong>${t4.card.lights}:</strong> ${this._config.lights.length}
</p>
<p>
<strong>Status:</strong>
<span class="${this._isAnyOn ? "state-on" : "state-off"}">
${this._isAnyOn ? this._isAllOn ? t4.card.allOn : t4.card.partial : t4.card.allOff}
</span>
</p>
<p>
<strong>${t4.card.averageBrightness}:</strong> ${this._averageBrightness}%
</p>
</div>
<div class="lights-list">
${this._config.lights.map((id) => this._renderLightRow(id))}
</div>
</div>
</ha-card>
`;
}
_renderLightRow(entityId) {
const entity = this.hass?.states[entityId];
const isOn = isEntityOn(entity);
const available = isEntityAvailable(entity);
const brightness = getBrightnessPercent(entity);
const name = getEntityName(entity);
return b2`
<div class="light-row">
<span class="light-name">${name}</span>
<span class="light-state ${isOn ? "on" : ""}">
${!available ? this._t?.card.unavailable : isOn ? `${brightness}%` : "OFF"}
</span>
</div>
`;
}
getCardSize() {
return 3;
return 2 + Math.ceil((this._config?.lights.length || 0) / 2);
}
};
LightPresetManager.styles = i`
:host {
display: block;
padding: 16px;
}
.card {
background: var(--ha-card-background, #fff);
border-radius: 8px;
padding: 16px;
box-shadow: var(--ha-card-box-shadow, 0 2px 4px rgba(0, 0, 0, 0.1));
}
h1 {
margin: 0;
color: var(--primary-text-color);
}
`;
LightPresetManager.styles = mainStyles;
__decorateClass([
n4({ attribute: false })
], LightPresetManager.prototype, "hass", 2);
__decorateClass([
n4({ attribute: false })
], LightPresetManager.prototype, "config", 2);
r5()
], LightPresetManager.prototype, "_config", 2);
__decorateClass([
r5()
], LightPresetManager.prototype, "_t", 2);
LightPresetManager = __decorateClass([
t3("light-preset-manager")
], LightPresetManager);
@@ -645,9 +1066,14 @@ window.customCards = window.customCards || [];
window.customCards.push({
type: "light-preset-manager",
name: "Light Preset Manager",
description: "Panel de contr\xF4le lumi\xE8re avec presets"
description: "Light control panel with saveable presets",
preview: true
});
console.log("Light Preset Manager loaded!");
console.log(
"%c LIGHT-PRESET-MANAGER %c v0.2.0 ",
"background: #3498db; color: white; font-weight: bold; border-radius: 4px 0 0 4px;",
"background: #2ecc71; color: white; border-radius: 0 4px 4px 0;"
);
export {
LightPresetManager
};