From 21c4ef1ac85d0ae7e99eef59ea5af3ae79ea1ac5 Mon Sep 17 00:00:00 2001 From: Ange-Marie MAURIN Date: Wed, 31 Dec 2025 11:03:44 +0100 Subject: [PATCH] Adding full dev workflow with copy watch and VScode basic config --- .gitignore | 3 + .vscode/launch.json | 20 + .vscode/settings.json | 2 +- .vscode/tasks.json | 60 +- .../frontend/light-preset-manager.js | 564 +++++++++++-- frontend/package.json | 18 +- frontend/scripts/copy.js | 39 + frontend/scripts/dev.js | 92 +++ frontend/src/light-preset-manager.ts | 149 +++- frontend/src/locales.ts | 115 +++ frontend/src/locales/en.json | 30 + frontend/src/locales/fr.json | 30 + frontend/src/locales/index.ts | 76 ++ frontend/src/styles.ts | 262 ++++++ frontend/src/types.ts | 88 ++ frontend/src/utils.ts | 103 +++ frontend/tsconfig.json | 3 +- ha-dev-config/.ha_run.lock | 2 +- ha-dev-config/home-assistant.log.1 | 780 ++++-------------- ha-dev-config/www/light-preset-manager.js | 564 +++++++++++-- 20 files changed, 2185 insertions(+), 815 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 frontend/scripts/copy.js create mode 100644 frontend/scripts/dev.js create mode 100644 frontend/src/locales.ts create mode 100644 frontend/src/locales/en.json create mode 100644 frontend/src/locales/fr.json create mode 100644 frontend/src/locales/index.ts create mode 100644 frontend/src/styles.ts create mode 100644 frontend/src/types.ts create mode 100644 frontend/src/utils.ts diff --git a/.gitignore b/.gitignore index 3dc15c7..36f0cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ ha-dev-config/deps/ # Secrets secrets.yaml +# Frontend build output +frontend/dist/* +!frontend/dist/.gitkeep diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ac34f7c --- /dev/null +++ b/.vscode/launch.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 07abe8d..e8ed5fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,7 +16,7 @@ "**/node_modules": true, "**/.venv": true, "ha-dev-config/.storage": true, - ".gitignore": true, + //".gitignore": true, "ha-dev-config/deps": true } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 03cebe3..5eea234 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -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 + } } ] -} \ No newline at end of file +} diff --git a/custom_components/light_preset_manager/frontend/light-preset-manager.js b/custom_components/light_preset_manager/frontend/light-preset-manager.js index 0d823bb..6fbd2aa 100644 --- a/custom_components/light_preset_manager/frontend/light-preset-manager.js +++ b/custom_components/light_preset_manager/frontend/light-preset-manager.js @@ -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`
+ ${this._t?.card.loading || "Loading..."} +
`; + } + const t4 = this._t; return b2` - -
-

🎉 Hello World!

-

Light Preset Manager fonctionne.

-

Config: ${JSON.stringify(this.config)}

+ +
+
+

+ ${t4.card.lights}: ${this._config.lights.length} +

+

+ Status: + + ${this._isAnyOn ? this._isAllOn ? t4.card.allOn : t4.card.partial : t4.card.allOff} + +

+

+ ${t4.card.averageBrightness}: ${this._averageBrightness}% +

+
+ +
+ ${this._config.lights.map((id) => this._renderLightRow(id))} +
`; } + _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` +
+ ${name} + + ${!available ? this._t?.card.unavailable : isOn ? `${brightness}%` : "OFF"} + +
+ `; + } 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 }; diff --git a/frontend/package.json b/frontend/package.json index bcb9bb1..61d600c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -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" } -} +} \ No newline at end of file diff --git a/frontend/scripts/copy.js b/frontend/scripts/copy.js new file mode 100644 index 0000000..06d94f4 --- /dev/null +++ b/frontend/scripts/copy.js @@ -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}`); + } +} \ No newline at end of file diff --git a/frontend/scripts/dev.js b/frontend/scripts/dev.js new file mode 100644 index 0000000..d190fdd --- /dev/null +++ b/frontend/scripts/dev.js @@ -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(); +}); \ No newline at end of file diff --git a/frontend/src/light-preset-manager.ts b/frontend/src/light-preset-manager.ts index ea314f8..2a086e9 100644 --- a/frontend/src/light-preset-manager.ts +++ b/frontend/src/light-preset-manager.ts @@ -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): 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`
+ ${this._t?.card.loading || "Loading..."} +
`; + } + + const t = this._t; + return html` - -
-

🎉 Hello World!

-

Light Preset Manager fonctionne.

-

Config: ${JSON.stringify(this.config)}

+ +
+
+

+ ${t.card.lights}: ${this._config.lights.length} +

+

+ Status: + + ${this._isAnyOn + ? this._isAllOn + ? t.card.allOn + : t.card.partial + : t.card.allOff} + +

+

+ ${t.card.averageBrightness}: ${this + ._averageBrightness}% +

+
+ +
+ ${this._config.lights.map((id) => this._renderLightRow(id))} +
`; } + 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` +
+ ${name} + + ${!available + ? this._t?.card.unavailable + : isOn + ? `${brightness}%` + : "OFF"} + +
+ `; + } + 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;" +); diff --git a/frontend/src/locales.ts b/frontend/src/locales.ts new file mode 100644 index 0000000..065dcac --- /dev/null +++ b/frontend/src/locales.ts @@ -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 = { + 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]; +} diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json new file mode 100644 index 0000000..15bdf09 --- /dev/null +++ b/frontend/src/locales/en.json @@ -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" + } +} \ No newline at end of file diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json new file mode 100644 index 0000000..be07fd8 --- /dev/null +++ b/frontend/src/locales/fr.json @@ -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" + } +} \ No newline at end of file diff --git a/frontend/src/locales/index.ts b/frontend/src/locales/index.ts new file mode 100644 index 0000000..e8a3bc7 --- /dev/null +++ b/frontend/src/locales/index.ts @@ -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 = { + 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[]; +} diff --git a/frontend/src/styles.ts b/frontend/src/styles.ts new file mode 100644 index 0000000..1ab6ef3 --- /dev/null +++ b/frontend/src/styles.ts @@ -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); + } +`; diff --git a/frontend/src/types.ts b/frontend/src/types.ts new file mode 100644 index 0000000..512840e --- /dev/null +++ b/frontend/src/types.ts @@ -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; + 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; + language: string; + callService: ( + domain: string, + service: string, + data?: object, + target?: object + ) => Promise; +} + +// ----------------------------------------------------------------------------- +// 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"; diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts new file mode 100644 index 0000000..f70dc22 --- /dev/null +++ b/frontend/src/utils.ts @@ -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; +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 6410bd1..6847f05 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -17,7 +17,8 @@ "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "useDefineForClassFields": false, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] diff --git a/ha-dev-config/.ha_run.lock b/ha-dev-config/.ha_run.lock index 16594f6..28c007d 100644 --- a/ha-dev-config/.ha_run.lock +++ b/ha-dev-config/.ha_run.lock @@ -1 +1 @@ -{"pid": 67, "version": 1, "ha_version": "2025.12.5", "start_ts": 1767110951.3492944} \ No newline at end of file +{"pid": 68, "version": 1, "ha_version": "2025.12.5", "start_ts": 1767175041.0137742} \ No newline at end of file diff --git a/ha-dev-config/home-assistant.log.1 b/ha-dev-config/home-assistant.log.1 index 05375c7..84341f5 100644 --- a/ha-dev-config/home-assistant.log.1 +++ b/ha-dev-config/home-assistant.log.1 @@ -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 diff --git a/ha-dev-config/www/light-preset-manager.js b/ha-dev-config/www/light-preset-manager.js index 0d823bb..6fbd2aa 100644 --- a/ha-dev-config/www/light-preset-manager.js +++ b/ha-dev-config/www/light-preset-manager.js @@ -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`
+ ${this._t?.card.loading || "Loading..."} +
`; + } + const t4 = this._t; return b2` - -
-

🎉 Hello World!

-

Light Preset Manager fonctionne.

-

Config: ${JSON.stringify(this.config)}

+ +
+
+

+ ${t4.card.lights}: ${this._config.lights.length} +

+

+ Status: + + ${this._isAnyOn ? this._isAllOn ? t4.card.allOn : t4.card.partial : t4.card.allOff} + +

+

+ ${t4.card.averageBrightness}: ${this._averageBrightness}% +

+
+ +
+ ${this._config.lights.map((id) => this._renderLightRow(id))} +
`; } + _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` +
+ ${name} + + ${!available ? this._t?.card.unavailable : isOn ? `${brightness}%` : "OFF"} + +
+ `; + } 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 };