mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
- lightColorOf(): on+rgb_color tints icon/glow/ripple (explicit ripple color wins); brightness ignored by design; off/white/unavailable unchanged - isAlarmState(): leak/smoke/gas/CO/safety/tamper/problem sensors and sirens in 'on' pulse a red ring over any display mode; outages never alarm; prefers-reduced-motion honoured - +2 unit tests, smoke_rgb_alarm.mjs, TESTING.md rows
33 lines
1.7 KiB
JavaScript
33 lines
1.7 KiB
JavaScript
import { launch } from './serve.mjs';
|
|
const { page, browser } = await launch();
|
|
const res = await page.evaluate(async () => {
|
|
const out = {};
|
|
const c = window.__card;
|
|
const sr = () => c.shadowRoot || c.renderRoot;
|
|
// RGB-лампа: ceiling on + rgb_color
|
|
c.hass = { ...c.hass, states: { ...c.hass.states,
|
|
'light.ceiling': { entity_id: 'light.ceiling', state: 'on', attributes: { friendly_name: 'Ceiling light', rgb_color: [255, 0, 128] } } } };
|
|
await c.updateComplete;
|
|
const rgbDev = sr().querySelector('.dev.rgb');
|
|
out.rgbClass = !!rgbDev;
|
|
out.rgbVar = rgbDev?.getAttribute('style')?.includes('--light-color:rgb(255, 0, 128)');
|
|
// тревога: датчик протечки on
|
|
c.hass = { ...c.hass, states: { ...c.hass.states,
|
|
'binary_sensor.sink_leak': { entity_id: 'binary_sensor.sink_leak', state: 'on', attributes: { friendly_name: 'Leak', device_class: 'moisture' } } } };
|
|
await c.updateComplete;
|
|
out.alarmCount = sr().querySelectorAll('.dev.alarm').length;
|
|
// выключили — тревога ушла
|
|
c.hass = { ...c.hass, states: { ...c.hass.states,
|
|
'binary_sensor.sink_leak': { entity_id: 'binary_sensor.sink_leak', state: 'off', attributes: { friendly_name: 'Leak', device_class: 'moisture' } } } };
|
|
await c.updateComplete;
|
|
out.alarmCleared = sr().querySelectorAll('.dev.alarm').length === 0;
|
|
// unavailable не тревожит
|
|
c.hass = { ...c.hass, states: { ...c.hass.states,
|
|
'binary_sensor.sink_leak': { entity_id: 'binary_sensor.sink_leak', state: 'unavailable', attributes: { device_class: 'moisture' } } } };
|
|
await c.updateComplete;
|
|
out.outageSafe = sr().querySelectorAll('.dev.alarm').length === 0;
|
|
return out;
|
|
});
|
|
console.log(JSON.stringify(res, null, 1));
|
|
await browser.close();
|