Files
houseplan-card/demo/smoke_radar_setup.mjs
2026-09-20 23:06:43 +03:00

100 lines
4.7 KiB
JavaScript

// #485 Stage 1: eligibility, manual entry and session-local on-plan setup.
import { launch, checkAll, finish } from './serve.mjs';
const { page, browser } = await launch();
const out = await page.evaluate(async () => {
const card = window.__card;
const root = () => card.shadowRoot || card.renderRoot;
const update = async () => {
card.requestUpdate();
await card.updateComplete;
await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
};
card._setMode('devices');
await update();
const ordinary = card._devices.find((device) => device.bindingKind !== 'virtual'
&& !device.marker?.radar && device.id === 'd_lamp')
|| card._devices.find((device) => device.bindingKind !== 'virtual' && !device.marker?.radar);
card._openMarkerDialog(ordinary);
await update();
const noAutomaticSection = !root().querySelector('.radargroup');
const manualToggle = root().querySelector('#marker-radar-presence');
manualToggle?.click();
await update();
const declared = !!card._markerDialog?.radar && !!root().querySelector('.radargroup');
const room = card._spaceModelById(ordinary.space)?.rooms?.[0];
const binary = Object.keys(card._planHass.states || {}).find((id) => id.startsWith('binary_sensor.'));
card._markerDialog = {
...card._markerDialog,
radar: {
...card._markerDialog.radar,
profile: 'presence_v1', roomId: room?.id || '', occupancyEntity: binary || '',
},
};
await update();
root().querySelector('.radargroup button ha-icon[icon="mdi:map-marker-radius"]')
?.closest('button')?.click();
await update();
const setup = root().querySelector('.radarsetup');
const setupOpened = !!setup;
const planSvg = setup?.querySelector('svg');
const press = (x, y) => planSvg?.dispatchEvent(new PointerEvent('pointerdown', {
bubbles: true, clientX: x, clientY: y, pointerId: 1,
}));
if (planSvg) {
planSvg.getBoundingClientRect = () => ({ left: 0, top: 0, width: 1000, height: 1000,
right: 1000, bottom: 1000, x: 0, y: 0, toJSON() {} });
press(250, 400);
press(250, 100);
}
await update();
const installationDrafted = card._editorRuntime?._radarSetup?.isActive() === true;
const persistedBeforeSave = card._serverCfg.markers.find((marker) => marker.id === ordinary.id)?.radar;
root().querySelector('.radarsetup .iconbtn')?.click();
await update();
const cancelReleased = !root().querySelector('.radarsetup')
&& card._serverCfg.markers.find((marker) => marker.id === ordinary.id)?.radar === persistedBeforeSave;
card._closeMarkerDialog();
// #602: a radar saved in an earlier session reopens as an enabled toggle in
// Details, regardless of whether it was once manual or auto-recognized.
const savedRadar = {
version: 1, enabled: true, show_live: true, profile: 'presence_v1',
sources: { occupancy_entity: binary || '' },
mount: { installation_id: 'saved-radar-smoke', x: 50, y: 50, heading_deg: 0, range_cm: 500, fov_deg: 120 },
room_id: room?.id || '',
calibration: { method: 'not_required', mirror: false, cell_cm: card._spaceModelById(ordinary.space)?.cellCm || 5 },
};
const originalMarker = ordinary.marker;
ordinary.marker = { ...(ordinary.marker || {}), id: ordinary.id, binding: `device:${ordinary.bindingRef}`, radar: savedRadar };
card._openMarkerDialog(ordinary);
await update();
const savedToggle = root().querySelector('#marker-radar-presence');
const savedReopensInline = savedToggle?.checked === true
&& !!savedToggle.closest('.hpf-card[data-card="details"] .radaradditional')?.querySelector('.radargroup')
&& !root().querySelector('.hpf-card[data-card="basics"] .radargroup');
savedToggle?.click(); await update();
const savedOffKeepsOriginal = card._markerDialog?.radarRemove === true
&& card._markerDialog?.radar?.original?.mount?.installation_id === 'saved-radar-smoke';
root().querySelector('#marker-radar-presence')?.click(); await update();
const savedOnRestoresOriginal = card._markerDialog?.radarRemove === false
&& card._markerDialog?.radar?.original?.mount?.installation_id === 'saved-radar-smoke';
card._closeMarkerDialog();
ordinary.marker = originalMarker;
const virtual = card._devices.find((device) => device.bindingKind === 'virtual');
if (virtual) card._openMarkerDialog(virtual);
await update();
const virtualHasNoEntry = !virtual || (!root().querySelector('.radargroup')
&& !root().querySelector('.radaradditional'));
card._closeMarkerDialog();
card._setMode('view');
return {
noAutomaticSection, manualToggleVisible: !!manualToggle, declared, setupOpened,
installationDrafted, cancelReleased, savedReopensInline, savedOffKeepsOriginal,
savedOnRestoresOriginal, virtualHasNoEntry,
};
});
await finish(browser, checkAll(out));