diff --git a/custom_components/omni_pca/frontend/src/omni-panel-programs.ts b/custom_components/omni_pca/frontend/src/omni-panel-programs.ts
index 45c9488..e089efd 100644
--- a/custom_components/omni_pca/frontend/src/omni-panel-programs.ts
+++ b/custom_components/omni_pca/frontend/src/omni-panel-programs.ts
@@ -12,13 +12,17 @@ import { LitElement, html, css, PropertyValues, TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { renderTokens } from "./token-renderer.js";
import {
+ ARG_TYPES,
COMMAND_OPTIONS,
+ COND_OPS,
CommandOption,
CondFamily,
DAY_BITS,
DecodedCondition,
DecodedEvent,
+ DecodedStructuredAnd,
EventCategory,
+ FIELDS_BY_TYPE,
FIXED_EVENTS,
Hass,
MISC_CONDITIONALS,
@@ -37,18 +41,23 @@ import {
ProgramListResponse,
ProgramRow,
SECURITY_MODE_NAMES,
+ argTypeKind,
commandOptionFor,
decodeAndCondition,
decodeCondition,
decodeEventId,
+ decodeStructuredAnd,
emptyAndRecord,
emptyOrRecord,
emptyThenRecord,
encodeAndCondition,
encodeCondition,
encodeEventId,
+ encodeStructuredAnd,
eventIdFromFields,
+ isEditableStructuredAnd,
isStructuredAnd,
+ isUnaryOp,
packEventIdIntoFields,
} from "./types.js";
@@ -566,10 +575,11 @@ export class OmniPanelPrograms extends LitElement {
private _pickBucket(kind: string): NamedObject[] | null {
if (!this._objects) return null;
switch (kind) {
- case "zone": return this._objects.zones;
- case "unit": return this._objects.units;
- case "area": return this._objects.areas;
- case "button": return this._objects.buttons;
+ case "zone": return this._objects.zones;
+ case "unit": return this._objects.units;
+ case "area": return this._objects.areas;
+ case "button": return this._objects.buttons;
+ case "thermostat": return this._objects.thermostats;
default: return null;
}
}
@@ -1820,19 +1830,7 @@ export class OmniPanelPrograms extends LitElement {
): TemplateResult {
const isOr = cond.prog_type === PROGRAM_TYPE_OR;
if (isStructuredAnd(cond)) {
- return html`
-
-
- ${isOr ? "OR IF" : "AND IF"} (structured comparison — read-only)
- this._removeChainCondition(idx)}>×
-
-
- This condition uses a structured comparison (TEMP > N etc.).
- Editing structured-OP records is not yet supported; it's
- preserved on save.
-
-
`;
+ return this._renderStructuredChainConditionRow(cond, idx, isOr);
}
const decoded = decodeAndCondition(cond);
return html`
@@ -1846,6 +1844,156 @@ export class OmniPanelPrograms extends LitElement {
`;
}
+ private _renderStructuredChainConditionRow(
+ cond: ProgramFields, idx: number, isOr: boolean,
+ ): TemplateResult {
+ const s = decodeStructuredAnd(cond);
+ if (!isEditableStructuredAnd(s)) {
+ // Out of editor scope (non-constant Arg2, unsupported Arg1 type,
+ // or non-zero compConst). Surface as preserve-only so the user
+ // can still remove the row but can't damage the encoded data.
+ return html`
+
+
+
+ Structured comparison with a shape the editor can't drive
+ yet (Arg2 references another object, Arg1 is an unsupported
+ type, or a CompConst value is present). Preserved on save.
+
+
`;
+ }
+ return html`
+
+
+ ${this._renderStructuredAndForm(s, idx)}
+
`;
+ }
+
+ /** Render the editor for one structured-AND condition. Lays out as:
+ *
+ * Arg1 type ▸ object/picker ▸ field ▸ operator ▸ Arg2 constant
+ *
+ * Arg2 is locked to Constant in this pass. For unary operators
+ * (ODD / EVEN) the Arg2 input is hidden.
+ */
+ private _renderStructuredAndForm(
+ s: DecodedStructuredAnd, idx: number,
+ ): TemplateResult {
+ const update = (patch: Partial) => {
+ const merged = { ...s, ...patch };
+ // Force Arg2 = Constant in editor scope so nothing accidentally
+ // promotes to an object reference.
+ merged.arg2Type = 0;
+ merged.arg2Field = 0;
+ this._patchChainCondition(idx, encodeStructuredAnd(merged));
+ };
+ const arg1Fields = FIELDS_BY_TYPE[s.arg1Type] ?? [];
+ const arg1Kind = argTypeKind(s.arg1Type);
+ const showArg2 = !isUnaryOp(s.op);
+ return html`
+
+
+ Arg1 type
+ {
+ const newType = parseInt((e.target as HTMLSelectElement).value, 10);
+ // Reset arg1Ix + field when type changes — keeps the form
+ // self-consistent and avoids stale picker values.
+ const firstField = (FIELDS_BY_TYPE[newType] ?? [{ value: 0 }])[0].value;
+ const newKind = argTypeKind(newType);
+ let newIx = 0;
+ if (newKind === "zone") newIx = this._objects?.zones?.[0]?.index ?? 1;
+ else if (newKind === "unit") newIx = this._objects?.units?.[0]?.index ?? 1;
+ else if (newKind === "thermostat") newIx = this._objects?.thermostats?.[0]?.index ?? 1;
+ else if (newKind === "area") newIx = this._objects?.areas?.[0]?.index ?? 1;
+ update({
+ arg1Type: newType,
+ arg1Ix: newIx,
+ arg1Field: firstField,
+ });
+ }}>
+ ${ARG_TYPES.filter((a) => a.value !== 0).map((a) => html`
+
+ ${a.label}
+ `)}
+
+
+
+ ${arg1Kind ? this._renderStructuredArg1Picker(s, arg1Kind, update) : ""}
+
+ ${arg1Fields.length > 0 ? html`
+
+ Field
+ update({
+ arg1Field: parseInt((e.target as HTMLSelectElement).value, 10),
+ })}>
+ ${arg1Fields.map((f) => html`
+
+ ${f.label}
+ `)}
+
+ ` : ""}
+
+
+ Operator
+ update({
+ op: parseInt((e.target as HTMLSelectElement).value, 10),
+ })}>
+ ${COND_OPS.map((o) => html`
+
+ ${o.label}
+ `)}
+
+
+
+ ${showArg2 ? html`
+
+ Compare against (constant)
+ {
+ const v = parseInt((e.target as HTMLInputElement).value, 10);
+ if (Number.isFinite(v) && v >= 0 && v <= 0xFFFF) {
+ update({ arg2Ix: v });
+ }
+ }}
+ />
+ ` : ""}
+
`;
+ }
+
+ private _renderStructuredArg1Picker(
+ s: DecodedStructuredAnd,
+ kind: string,
+ update: (p: Partial) => void,
+ ): TemplateResult {
+ const bucket = this._bucketWithPreserve(
+ this._pickBucket(kind), kind, s.arg1Ix,
+ );
+ const label = kind[0].toUpperCase() + kind.slice(1);
+ return html`
+
+ ${label}
+ update({
+ arg1Ix: parseInt((e.target as HTMLSelectElement).value, 10),
+ })}>
+ ${bucket.map((o) => html`
+
+ #${o.index} ${o.name}
+ `)}
+
+ `;
+ }
+
private _renderChainCondFamily(
decoded: DecodedCondition, idx: number,
): TemplateResult {
@@ -2458,7 +2606,30 @@ export class OmniPanelPrograms extends LitElement {
border-color: var(--error-color, #db4437);
}
.structured-cond {
- background: rgba(255, 152, 0, 0.08); /* subtle warning tint */
+ background: rgba(255, 152, 0, 0.08); /* subtle structured tint */
+ }
+ .structured-row {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 6px;
+ }
+ .structured-tag, .readonly-tag {
+ display: inline-block;
+ margin-left: 6px;
+ padding: 1px 6px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ border-radius: 3px;
+ }
+ .structured-tag {
+ background: rgba(255, 152, 0, 0.18);
+ color: #b35a00;
+ }
+ .readonly-tag {
+ background: var(--secondary-background-color, #eee);
+ color: var(--secondary-text-color, #888);
}
.chain-meta {
margin-top: 8px;
diff --git a/custom_components/omni_pca/frontend/src/types.ts b/custom_components/omni_pca/frontend/src/types.ts
index c5851f6..b2ac97a 100644
--- a/custom_components/omni_pca/frontend/src/types.ts
+++ b/custom_components/omni_pca/frontend/src/types.ts
@@ -547,6 +547,177 @@ export function emptyThenRecord(firstUnit: number = 1): ProgramFields {
};
}
+
+// --------------------------------------------------------------------------
+// Structured-OP AND record editing.
+//
+// When ``and_op`` (= ``(cond >> 8) & 0xFF``) is non-zero, the record
+// encodes ``Arg1 OP Arg2`` where Arg1 and Arg2 are typed references
+// (Zone, Unit, Thermostat, Area, TimeDate, Constant) plus per-type
+// field selectors. This is fundamentally a different shape from the
+// Traditional encoding handled by decodeAndCondition above.
+//
+// Wire layout (from programs.py decoders + clsProgram.cs):
+//
+// cond high byte (>>8) = and_op (CondOP)
+// cond low byte (& FF) = and_arg1_argtype (CondArgType)
+// cond2 (whole u16) = and_arg1_ix (object index or 0)
+// cmd = and_arg1_field (per-type field selector)
+// par = and_arg2_argtype (CondArgType — usually Constant)
+// pr2 = and_arg2_ix (constant value OR second object idx)
+// month = and_arg2_field (per-type field selector for arg2)
+// day, days = and_compconst (BE u16 — extra constant, rarely used)
+//
+// Editor cuts:
+// * Arg2 locked to Constant in this pass (other-object Arg2 stays
+// read-only with a banner). Arg2-constant covers
+// "TEMP > 70", "Zone.CurrentState == 1", "Hour == 22" etc.
+// * Arg1 restricted to Zone / Unit / Thermostat / Area / TimeDate.
+// Anything else (Aux / Audio / System / etc.) stays read-only.
+// --------------------------------------------------------------------------
+
+
+// CondOP enum (matches omni_pca.programs.CondOP). 0=Traditional is
+// excluded from the editor — picking it would switch to Traditional
+// editing semantics.
+export const COND_OPS: ReadonlyArray<{ value: number; label: string }> = [
+ { value: 1, label: "==" },
+ { value: 2, label: "!=" },
+ { value: 3, label: "<" },
+ { value: 4, label: ">" },
+ { value: 5, label: "is odd" },
+ { value: 6, label: "is even" },
+ { value: 7, label: "is multiple of" },
+ { value: 8, label: "in (bitmask)" },
+ { value: 9, label: "not in (bitmask)" },
+];
+
+/** True iff the operator only uses Arg1 (no Arg2). */
+export function isUnaryOp(op: number): boolean {
+ return op === 5 || op === 6; // ODD, EVEN
+}
+
+// CondArgType enum (matches omni_pca.programs.CondArgType). Only the
+// editor-supported subset; full list is in programs.py.
+export const ARG_TYPES: ReadonlyArray<{
+ value: number; label: string; kind: string | null;
+}> = [
+ { value: 0, label: "Constant", kind: null },
+ { value: 2, label: "Zone", kind: "zone" },
+ { value: 3, label: "Unit", kind: "unit" },
+ { value: 4, label: "Thermostat", kind: "thermostat" },
+ { value: 6, label: "Area", kind: "area" },
+ { value: 7, label: "Time / Date", kind: null }, // no object picker
+];
+
+export function isEditableArg1Type(argtype: number): boolean {
+ return [2, 3, 4, 6, 7].includes(argtype);
+}
+
+export function argTypeKind(argtype: number): string | null {
+ const a = ARG_TYPES.find((x) => x.value === argtype);
+ return a ? a.kind : null;
+}
+
+// Per-Arg1Type field menus. Numbers match omni_pca.programs enums
+// (enuZoneField / enuUnitField / enuThermostatField / enuTimeDateField).
+export const FIELDS_BY_TYPE: Readonly>> = {
+ // Zone (argtype 2) — enuZoneField
+ 2: [
+ { value: 1, label: "Loop reading" },
+ { value: 2, label: "Current state" },
+ { value: 3, label: "Arming state" },
+ { value: 4, label: "Alarm state" },
+ ],
+ // Unit (argtype 3) — enuUnitField
+ 3: [
+ { value: 1, label: "Current state" },
+ { value: 2, label: "Previous state" },
+ { value: 3, label: "Timer" },
+ { value: 4, label: "Level" },
+ ],
+ // Thermostat (argtype 4) — enuThermostatField
+ 4: [
+ { value: 1, label: "Current temperature" },
+ { value: 2, label: "Heat setpoint" },
+ { value: 3, label: "Cool setpoint" },
+ { value: 4, label: "System mode" },
+ { value: 5, label: "Fan mode" },
+ { value: 6, label: "Hold mode" },
+ { value: 7, label: "Freeze alarm" },
+ { value: 8, label: "Comm error" },
+ { value: 9, label: "Humidity" },
+ { value: 10, label: "Humidify setpoint" },
+ { value: 11, label: "Dehumidify setpoint" },
+ { value: 12, label: "Outdoor temperature" },
+ { value: 13, label: "System status" },
+ ],
+ // Area (argtype 6) — single useful field
+ 6: [
+ { value: 1, label: "Security mode" },
+ ],
+ // TimeDate (argtype 7) — enuTimeDateField
+ 7: [
+ { value: 2, label: "Year" },
+ { value: 3, label: "Month" },
+ { value: 4, label: "Day" },
+ { value: 5, label: "Day of week (1=Mon..7=Sun)" },
+ { value: 6, label: "Time (minutes since midnight)" },
+ { value: 8, label: "Hour" },
+ { value: 9, label: "Minute" },
+ ],
+};
+
+export interface DecodedStructuredAnd {
+ op: number; // CondOP value (1..9)
+ arg1Type: number; // CondArgType
+ arg1Ix: number; // 1-based object index (0 for TimeDate)
+ arg1Field: number; // per-type field
+ arg2Type: number; // CondArgType (locked to Constant in editor)
+ arg2Ix: number; // constant value OR second object index
+ arg2Field: number; // per-type field (usually 0 for constants)
+ compConst: number; // extra constant; preserved verbatim
+}
+
+export function decodeStructuredAnd(fields: ProgramFields): DecodedStructuredAnd {
+ return {
+ op: ((fields.cond ?? 0) >> 8) & 0xFF,
+ arg1Type: (fields.cond ?? 0) & 0xFF,
+ arg1Ix: fields.cond2 ?? 0,
+ arg1Field: fields.cmd ?? 0,
+ arg2Type: fields.par ?? 0,
+ arg2Ix: fields.pr2 ?? 0,
+ arg2Field: fields.month ?? 0,
+ compConst: ((fields.day ?? 0) << 8) | (fields.days ?? 0),
+ };
+}
+
+export function encodeStructuredAnd(s: DecodedStructuredAnd): Partial {
+ return {
+ cond: ((s.op & 0xFF) << 8) | (s.arg1Type & 0xFF),
+ cond2: s.arg1Ix & 0xFFFF,
+ cmd: s.arg1Field & 0xFF,
+ par: s.arg2Type & 0xFF,
+ pr2: s.arg2Ix & 0xFFFF,
+ month: s.arg2Field & 0xFF,
+ day: (s.compConst >> 8) & 0xFF,
+ days: s.compConst & 0xFF,
+ };
+}
+
+/** True iff the structured AND record is in a shape the editor can
+ * fully drive. Other shapes (Arg2=non-constant object, exotic Arg1
+ * types, or non-zero compConst) stay read-only — they're preserved
+ * on save but their fields aren't exposed as form controls. */
+export function isEditableStructuredAnd(s: DecodedStructuredAnd): boolean {
+ if (!isEditableArg1Type(s.arg1Type)) return false;
+ if (!isUnaryOp(s.op) && s.arg2Type !== 0) return false;
+ if (s.compConst !== 0) return false;
+ return true;
+}
+
/** HA's hass object — minimal surface we use. */
export interface Hass {
connection: {
diff --git a/custom_components/omni_pca/www/panel.js b/custom_components/omni_pca/www/panel.js
index 34c1aee..25fe0ef 100644
--- a/custom_components/omni_pca/www/panel.js
+++ b/custom_components/omni_pca/www/panel.js
@@ -1,33 +1,33 @@
// omni_pca side panel — generated by frontend/build.mjs. Edit src/, not this file.
-var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e,t)=>{for(var n=t>1?void 0:t?Ke(i,e):i,r=s.length-1,o;r>=0;r--)(o=s[r])&&(n=(t?o(i,e,n):o(n))||n);return t&&n&&Ze(i,e,n),n};var U=globalThis,Y=U.ShadowRoot&&(U.ShadyCSS===void 0||U.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,K=Symbol(),ye=new WeakMap,R=class{constructor(i,e,t){if(this._$cssResult$=!0,t!==K)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=i,this.t=e}get styleSheet(){let i=this.o,e=this.t;if(Y&&i===void 0){let t=e!==void 0&&e.length===1;t&&(i=ye.get(e)),i===void 0&&((this.o=i=new CSSStyleSheet).replaceSync(this.cssText),t&&ye.set(e,i))}return i}toString(){return this.cssText}},$e=s=>new R(typeof s=="string"?s:s+"",void 0,K),J=(s,...i)=>{let e=s.length===1?s[0]:i.reduce((t,n,r)=>t+(o=>{if(o._$cssResult$===!0)return o.cssText;if(typeof o=="number")return o;throw Error("Value passed to 'css' function must be a 'css' function result: "+o+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(n)+s[r+1],s[0]);return new R(e,s,K)},xe=(s,i)=>{if(Y)s.adoptedStyleSheets=i.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of i){let t=document.createElement("style"),n=U.litNonce;n!==void 0&&t.setAttribute("nonce",n),t.textContent=e.cssText,s.appendChild(t)}},X=Y?s=>s:s=>s instanceof CSSStyleSheet?(i=>{let e="";for(let t of i.cssRules)e+=t.cssText;return $e(e)})(s):s;var{is:Je,defineProperty:Xe,getOwnPropertyDescriptor:Qe,getOwnPropertyNames:et,getOwnPropertySymbols:tt,getPrototypeOf:it}=Object,B=globalThis,Ee=B.trustedTypes,nt=Ee?Ee.emptyScript:"",rt=B.reactiveElementPolyfillSupport,D=(s,i)=>s,P={toAttribute(s,i){switch(i){case Boolean:s=s?nt:null;break;case Object:case Array:s=s==null?s:JSON.stringify(s)}return s},fromAttribute(s,i){let e=s;switch(i){case Boolean:e=s!==null;break;case Number:e=s===null?null:Number(s);break;case Object:case Array:try{e=JSON.parse(s)}catch{e=null}}return e}},W=(s,i)=>!Je(s,i),ke={attribute:!0,type:String,converter:P,reflect:!1,useDefault:!1,hasChanged:W};Symbol.metadata??=Symbol("metadata"),B.litPropertyMetadata??=new WeakMap;var y=class extends HTMLElement{static addInitializer(i){this._$Ei(),(this.l??=[]).push(i)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(i,e=ke){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(i)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(i,e),!e.noAccessor){let t=Symbol(),n=this.getPropertyDescriptor(i,t,e);n!==void 0&&Xe(this.prototype,i,n)}}static getPropertyDescriptor(i,e,t){let{get:n,set:r}=Qe(this.prototype,i)??{get(){return this[e]},set(o){this[e]=o}};return{get:n,set(o){let c=n?.call(this);r?.call(this,o),this.requestUpdate(i,c,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(i){return this.elementProperties.get(i)??ke}static _$Ei(){if(this.hasOwnProperty(D("elementProperties")))return;let i=it(this);i.finalize(),i.l!==void 0&&(this.l=[...i.l]),this.elementProperties=new Map(i.elementProperties)}static finalize(){if(this.hasOwnProperty(D("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(D("properties"))){let e=this.properties,t=[...et(e),...tt(e)];for(let n of t)this.createProperty(n,e[n])}let i=this[Symbol.metadata];if(i!==null){let e=litPropertyMetadata.get(i);if(e!==void 0)for(let[t,n]of e)this.elementProperties.set(t,n)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let n=this._$Eu(e,t);n!==void 0&&this._$Eh.set(n,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(i){let e=[];if(Array.isArray(i)){let t=new Set(i.flat(1/0).reverse());for(let n of t)e.unshift(X(n))}else i!==void 0&&e.push(X(i));return e}static _$Eu(i,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t:typeof i=="string"?i.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(i=>this.enableUpdating=i),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(i=>i(this))}addController(i){(this._$EO??=new Set).add(i),this.renderRoot!==void 0&&this.isConnected&&i.hostConnected?.()}removeController(i){this._$EO?.delete(i)}_$E_(){let i=new Map,e=this.constructor.elementProperties;for(let t of e.keys())this.hasOwnProperty(t)&&(i.set(t,this[t]),delete this[t]);i.size>0&&(this._$Ep=i)}createRenderRoot(){let i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return xe(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(i=>i.hostConnected?.())}enableUpdating(i){}disconnectedCallback(){this._$EO?.forEach(i=>i.hostDisconnected?.())}attributeChangedCallback(i,e,t){this._$AK(i,t)}_$ET(i,e){let t=this.constructor.elementProperties.get(i),n=this.constructor._$Eu(i,t);if(n!==void 0&&t.reflect===!0){let r=(t.converter?.toAttribute!==void 0?t.converter:P).toAttribute(e,t.type);this._$Em=i,r==null?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(i,e){let t=this.constructor,n=t._$Eh.get(i);if(n!==void 0&&this._$Em!==n){let r=t.getPropertyOptions(n),o=typeof r.converter=="function"?{fromAttribute:r.converter}:r.converter?.fromAttribute!==void 0?r.converter:P;this._$Em=n;let c=o.fromAttribute(e,r.type);this[n]=c??this._$Ej?.get(n)??c,this._$Em=null}}requestUpdate(i,e,t,n=!1,r){if(i!==void 0){let o=this.constructor;if(n===!1&&(r=this[i]),t??=o.getPropertyOptions(i),!((t.hasChanged??W)(r,e)||t.useDefault&&t.reflect&&r===this._$Ej?.get(i)&&!this.hasAttribute(o._$Eu(i,t))))return;this.C(i,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(i,e,{useDefault:t,reflect:n,wrapped:r},o){t&&!(this._$Ej??=new Map).has(i)&&(this._$Ej.set(i,o??e??this[i]),r!==!0||o!==void 0)||(this._$AL.has(i)||(this.hasUpdated||t||(e=void 0),this._$AL.set(i,e)),n===!0&&this._$Em!==i&&(this._$Eq??=new Set).add(i))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let i=this.scheduleUpdate();return i!=null&&await i,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[n,r]of this._$Ep)this[n]=r;this._$Ep=void 0}let t=this.constructor.elementProperties;if(t.size>0)for(let[n,r]of t){let{wrapped:o}=r,c=this[n];o!==!0||this._$AL.has(n)||c===void 0||this.C(n,void 0,r,c)}}let i=!1,e=this._$AL;try{i=this.shouldUpdate(e),i?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw i=!1,this._$EM(),t}i&&this._$AE(e)}willUpdate(i){}_$AE(i){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(i)),this.updated(i)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(i){return!0}update(i){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(i){}firstUpdated(i){}};y.elementStyles=[],y.shadowRootOptions={mode:"open"},y[D("elementProperties")]=new Map,y[D("finalized")]=new Map,rt?.({ReactiveElement:y}),(B.reactiveElementVersions??=[]).push("2.1.2");var se=globalThis,Se=s=>s,V=se.trustedTypes,Ce=V?V.createPolicy("lit-html",{createHTML:s=>s}):void 0,De="$lit$",$=`lit$${Math.random().toFixed(9).slice(2)}$`,Pe="?"+$,st=`<${Pe}>`,S=document,I=()=>S.createComment(""),z=s=>s===null||typeof s!="object"&&typeof s!="function",oe=Array.isArray,ot=s=>oe(s)||typeof s?.[Symbol.iterator]=="function",Q=`[
-\f\r]`,M=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Te=/-->/g,we=/>/g,E=RegExp(`>|${Q}(?:([^\\s"'>=/]+)(${Q}*=${Q}*(?:[^
-\f\r"'\`<>=]|("|')|))|$)`,"g"),Ae=/'/g,Fe=/"/g,Me=/^(?:script|style|textarea|title)$/i,ae=s=>(i,...e)=>({_$litType$:s,strings:i,values:e}),a=ae(1),xt=ae(2),Et=ae(3),C=Symbol.for("lit-noChange"),g=Symbol.for("lit-nothing"),Re=new WeakMap,k=S.createTreeWalker(S,129);function Ie(s,i){if(!oe(s)||!s.hasOwnProperty("raw"))throw Error("invalid template strings array");return Ce!==void 0?Ce.createHTML(i):i}var at=(s,i)=>{let e=s.length-1,t=[],n,r=i===2?"":i===3?"":"",o=M;for(let c=0;c"?(o=n??M,d=-1):p[1]===void 0?d=-2:(d=o.lastIndex-p[2].length,u=p[1],o=p[3]===void 0?E:p[3]==='"'?Fe:Ae):o===Fe||o===Ae?o=E:o===Te||o===we?o=M:(o=E,n=void 0);let _=o===E&&s[c+1].startsWith("/>")?" ":"";r+=o===M?l+st:d>=0?(t.push(u),l.slice(0,d)+De+l.slice(d)+$+_):l+$+(d===-2?c:_)}return[Ie(s,r+(s[e]||">")+(i===2?" ":i===3?"":"")),t]},O=class s{constructor({strings:i,_$litType$:e},t){let n;this.parts=[];let r=0,o=0,c=i.length-1,l=this.parts,[u,p]=at(i,e);if(this.el=s.createElement(u,t),k.currentNode=this.el.content,e===2||e===3){let d=this.el.content.firstChild;d.replaceWith(...d.childNodes)}for(;(n=k.nextNode())!==null&&l.length0){n.textContent=V?V.emptyScript:"";for(let _=0;_2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=g}_$AI(i,e=this,t,n){let r=this.strings,o=!1;if(r===void 0)i=w(this,i,e,0),o=!z(i)||i!==this._$AH&&i!==C,o&&(this._$AH=i);else{let c=i,l,u;for(i=r[0],l=0;l{let t=e?.renderBefore??i,n=t._$litPart$;if(n===void 0){let r=e?.renderBefore??null;t._$litPart$=n=new L(i.insertBefore(I(),r),r,void 0,e??{})}return n._$AI(s),n};var le=globalThis,x=class extends y{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let i=super.createRenderRoot();return this.renderOptions.renderBefore??=i.firstChild,i}update(i){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(i),this._$Do=ze(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return C}};x._$litElement$=!0,x.finalized=!0,le.litElementHydrateSupport?.({LitElement:x});var ct=le.litElementPolyfillSupport;ct?.({LitElement:x});(le.litElementVersions??=[]).push("4.2.2");var Oe=s=>(i,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(s,i)}):customElements.define(s,i)};var dt={attribute:!0,type:String,converter:P,reflect:!1,hasChanged:W},ut=(s=dt,i,e)=>{let{kind:t,metadata:n}=e,r=globalThis.litPropertyMetadata.get(n);if(r===void 0&&globalThis.litPropertyMetadata.set(n,r=new Map),t==="setter"&&((s=Object.create(s)).wrapped=!0),r.set(e.name,s),t==="accessor"){let{name:o}=e;return{set(c){let l=i.get.call(this);i.set.call(this,c),this.requestUpdate(o,l,s,!0,c)},init(c){return c!==void 0&&this.C(o,void 0,s,c),c}}}if(t==="setter"){let{name:o}=e;return function(c){let l=this[o];i.call(this,c),this.requestUpdate(o,l,s,!0,c)}}throw Error("Unsupported decorator location: "+t)};function N(s){return(i,e)=>typeof e=="object"?ut(s,i,e):((t,n,r)=>{let o=n.hasOwnProperty(r);return n.constructor.createProperty(r,t),o?Object.getOwnPropertyDescriptor(n,r):void 0})(s,i,e)}function f(s){return N({...s,state:!0,attribute:!1})}function ce(s,i){return a`${s.map(e=>pt(e,i))}`}function pt(s,i){switch(s.k){case"newline":return a` `;case"indent":return a`${s.t} `;case"keyword":return a`${s.t} `;case"operator":return a`${s.t} `;case"value":return a`${s.t} `;case"ref":{let e=i&&s.ek&&typeof s.ei=="number"?()=>i(s.ek,s.ei):void 0;return a`{for(var i=t>1?void 0:t?rt(n,e):n,r=a.length-1,s;r>=0;r--)(s=a[r])&&(i=(t?s(n,e,i):s(i))||i);return t&&i&&it(n,e,i),i};var U=globalThis,Y=U.ShadowRoot&&(U.ShadyCSS===void 0||U.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,K=Symbol(),ke=new WeakMap,R=class{constructor(n,e,t){if(this._$cssResult$=!0,t!==K)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=n,this.t=e}get styleSheet(){let n=this.o,e=this.t;if(Y&&n===void 0){let t=e!==void 0&&e.length===1;t&&(n=ke.get(e)),n===void 0&&((this.o=n=new CSSStyleSheet).replaceSync(this.cssText),t&&ke.set(e,n))}return n}toString(){return this.cssText}},Se=a=>new R(typeof a=="string"?a:a+"",void 0,K),J=(a,...n)=>{let e=a.length===1?a[0]:n.reduce((t,i,r)=>t+(s=>{if(s._$cssResult$===!0)return s.cssText;if(typeof s=="number")return s;throw Error("Value passed to 'css' function must be a 'css' function result: "+s+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+a[r+1],a[0]);return new R(e,a,K)},Ce=(a,n)=>{if(Y)a.adoptedStyleSheets=n.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of n){let t=document.createElement("style"),i=U.litNonce;i!==void 0&&t.setAttribute("nonce",i),t.textContent=e.cssText,a.appendChild(t)}},X=Y?a=>a:a=>a instanceof CSSStyleSheet?(n=>{let e="";for(let t of n.cssRules)e+=t.cssText;return Se(e)})(a):a;var{is:at,defineProperty:ot,getOwnPropertyDescriptor:st,getOwnPropertyNames:lt,getOwnPropertySymbols:ct,getPrototypeOf:dt}=Object,B=globalThis,Te=B.trustedTypes,ut=Te?Te.emptyScript:"",pt=B.reactiveElementPolyfillSupport,D=(a,n)=>a,P={toAttribute(a,n){switch(n){case Boolean:a=a?ut:null;break;case Object:case Array:a=a==null?a:JSON.stringify(a)}return a},fromAttribute(a,n){let e=a;switch(n){case Boolean:e=a!==null;break;case Number:e=a===null?null:Number(a);break;case Object:case Array:try{e=JSON.parse(a)}catch{e=null}}return e}},W=(a,n)=>!at(a,n),Fe={attribute:!0,type:String,converter:P,reflect:!1,useDefault:!1,hasChanged:W};Symbol.metadata??=Symbol("metadata"),B.litPropertyMetadata??=new WeakMap;var y=class extends HTMLElement{static addInitializer(n){this._$Ei(),(this.l??=[]).push(n)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(n,e=Fe){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(n)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(n,e),!e.noAccessor){let t=Symbol(),i=this.getPropertyDescriptor(n,t,e);i!==void 0&&ot(this.prototype,n,i)}}static getPropertyDescriptor(n,e,t){let{get:i,set:r}=st(this.prototype,n)??{get(){return this[e]},set(s){this[e]=s}};return{get:i,set(s){let c=i?.call(this);r?.call(this,s),this.requestUpdate(n,c,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(n){return this.elementProperties.get(n)??Fe}static _$Ei(){if(this.hasOwnProperty(D("elementProperties")))return;let n=dt(this);n.finalize(),n.l!==void 0&&(this.l=[...n.l]),this.elementProperties=new Map(n.elementProperties)}static finalize(){if(this.hasOwnProperty(D("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(D("properties"))){let e=this.properties,t=[...lt(e),...ct(e)];for(let i of t)this.createProperty(i,e[i])}let n=this[Symbol.metadata];if(n!==null){let e=litPropertyMetadata.get(n);if(e!==void 0)for(let[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let i=this._$Eu(e,t);i!==void 0&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(n){let e=[];if(Array.isArray(n)){let t=new Set(n.flat(1/0).reverse());for(let i of t)e.unshift(X(i))}else n!==void 0&&e.push(X(n));return e}static _$Eu(n,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t:typeof n=="string"?n.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(n=>this.enableUpdating=n),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(n=>n(this))}addController(n){(this._$EO??=new Set).add(n),this.renderRoot!==void 0&&this.isConnected&&n.hostConnected?.()}removeController(n){this._$EO?.delete(n)}_$E_(){let n=new Map,e=this.constructor.elementProperties;for(let t of e.keys())this.hasOwnProperty(t)&&(n.set(t,this[t]),delete this[t]);n.size>0&&(this._$Ep=n)}createRenderRoot(){let n=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Ce(n,this.constructor.elementStyles),n}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(n=>n.hostConnected?.())}enableUpdating(n){}disconnectedCallback(){this._$EO?.forEach(n=>n.hostDisconnected?.())}attributeChangedCallback(n,e,t){this._$AK(n,t)}_$ET(n,e){let t=this.constructor.elementProperties.get(n),i=this.constructor._$Eu(n,t);if(i!==void 0&&t.reflect===!0){let r=(t.converter?.toAttribute!==void 0?t.converter:P).toAttribute(e,t.type);this._$Em=n,r==null?this.removeAttribute(i):this.setAttribute(i,r),this._$Em=null}}_$AK(n,e){let t=this.constructor,i=t._$Eh.get(n);if(i!==void 0&&this._$Em!==i){let r=t.getPropertyOptions(i),s=typeof r.converter=="function"?{fromAttribute:r.converter}:r.converter?.fromAttribute!==void 0?r.converter:P;this._$Em=i;let c=s.fromAttribute(e,r.type);this[i]=c??this._$Ej?.get(i)??c,this._$Em=null}}requestUpdate(n,e,t,i=!1,r){if(n!==void 0){let s=this.constructor;if(i===!1&&(r=this[n]),t??=s.getPropertyOptions(n),!((t.hasChanged??W)(r,e)||t.useDefault&&t.reflect&&r===this._$Ej?.get(n)&&!this.hasAttribute(s._$Eu(n,t))))return;this.C(n,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(n,e,{useDefault:t,reflect:i,wrapped:r},s){t&&!(this._$Ej??=new Map).has(n)&&(this._$Ej.set(n,s??e??this[n]),r!==!0||s!==void 0)||(this._$AL.has(n)||(this.hasUpdated||t||(e=void 0),this._$AL.set(n,e)),i===!0&&this._$Em!==n&&(this._$Eq??=new Set).add(n))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let n=this.scheduleUpdate();return n!=null&&await n,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[i,r]of this._$Ep)this[i]=r;this._$Ep=void 0}let t=this.constructor.elementProperties;if(t.size>0)for(let[i,r]of t){let{wrapped:s}=r,c=this[i];s!==!0||this._$AL.has(i)||c===void 0||this.C(i,void 0,r,c)}}let n=!1,e=this._$AL;try{n=this.shouldUpdate(e),n?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw n=!1,this._$EM(),t}n&&this._$AE(e)}willUpdate(n){}_$AE(n){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(n)),this.updated(n)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(n){return!0}update(n){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(n){}firstUpdated(n){}};y.elementStyles=[],y.shadowRootOptions={mode:"open"},y[D("elementProperties")]=new Map,y[D("finalized")]=new Map,pt?.({ReactiveElement:y}),(B.reactiveElementVersions??=[]).push("2.1.2");var ae=globalThis,Ae=a=>a,V=ae.trustedTypes,we=V?V.createPolicy("lit-html",{createHTML:a=>a}):void 0,ze="$lit$",$=`lit$${Math.random().toFixed(9).slice(2)}$`,Le="?"+$,ht=`<${Le}>`,S=document,M=()=>S.createComment(""),z=a=>a===null||typeof a!="object"&&typeof a!="function",oe=Array.isArray,mt=a=>oe(a)||typeof a?.[Symbol.iterator]=="function",Q=`[
+\f\r]`,I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Re=/-->/g,De=/>/g,E=RegExp(`>|${Q}(?:([^\\s"'>=/]+)(${Q}*=${Q}*(?:[^
+\f\r"'\`<>=]|("|')|))|$)`,"g"),Pe=/'/g,Ie=/"/g,Oe=/^(?:script|style|textarea|title)$/i,se=a=>(n,...e)=>({_$litType$:a,strings:n,values:e}),o=se(1),Rt=se(2),Dt=se(3),C=Symbol.for("lit-noChange"),b=Symbol.for("lit-nothing"),Me=new WeakMap,k=S.createTreeWalker(S,129);function He(a,n){if(!oe(a)||!a.hasOwnProperty("raw"))throw Error("invalid template strings array");return we!==void 0?we.createHTML(n):n}var gt=(a,n)=>{let e=a.length-1,t=[],i,r=n===2?"":n===3?"":"",s=I;for(let c=0;c"?(s=i??I,u=-1):p[1]===void 0?u=-2:(u=s.lastIndex-p[2].length,d=p[1],s=p[3]===void 0?E:p[3]==='"'?Ie:Pe):s===Ie||s===Pe?s=E:s===Re||s===De?s=I:(s=E,i=void 0);let _=s===E&&a[c+1].startsWith("/>")?" ":"";r+=s===I?l+ht:u>=0?(t.push(d),l.slice(0,u)+ze+l.slice(u)+$+_):l+$+(u===-2?c:_)}return[He(a,r+(a[e]||">")+(n===2?" ":n===3?"":"")),t]},L=class a{constructor({strings:n,_$litType$:e},t){let i;this.parts=[];let r=0,s=0,c=n.length-1,l=this.parts,[d,p]=gt(n,e);if(this.el=a.createElement(d,t),k.currentNode=this.el.content,e===2||e===3){let u=this.el.content.firstChild;u.replaceWith(...u.childNodes)}for(;(i=k.nextNode())!==null&&l.length0){i.textContent=V?V.emptyScript:"";for(let _=0;_2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=b}_$AI(n,e=this,t,i){let r=this.strings,s=!1;if(r===void 0)n=F(this,n,e,0),s=!z(n)||n!==this._$AH&&n!==C,s&&(this._$AH=n);else{let c=n,l,d;for(n=r[0],l=0;l{let t=e?.renderBefore??n,i=t._$litPart$;if(i===void 0){let r=e?.renderBefore??null;t._$litPart$=i=new O(n.insertBefore(M(),r),r,void 0,e??{})}return i._$AI(a),i};var le=globalThis,x=class extends y{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let n=super.createRenderRoot();return this.renderOptions.renderBefore??=n.firstChild,n}update(n){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(n),this._$Do=Ne(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return C}};x._$litElement$=!0,x.finalized=!0,le.litElementHydrateSupport?.({LitElement:x});var bt=le.litElementPolyfillSupport;bt?.({LitElement:x});(le.litElementVersions??=[]).push("4.2.2");var je=a=>(n,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(a,n)}):customElements.define(a,n)};var vt={attribute:!0,type:String,converter:P,reflect:!1,hasChanged:W},_t=(a=vt,n,e)=>{let{kind:t,metadata:i}=e,r=globalThis.litPropertyMetadata.get(i);if(r===void 0&&globalThis.litPropertyMetadata.set(i,r=new Map),t==="setter"&&((a=Object.create(a)).wrapped=!0),r.set(e.name,a),t==="accessor"){let{name:s}=e;return{set(c){let l=n.get.call(this);n.set.call(this,c),this.requestUpdate(s,l,a,!0,c)},init(c){return c!==void 0&&this.C(s,void 0,a,c),c}}}if(t==="setter"){let{name:s}=e;return function(c){let l=this[s];n.call(this,c),this.requestUpdate(s,l,a,!0,c)}}throw Error("Unsupported decorator location: "+t)};function H(a){return(n,e)=>typeof e=="object"?_t(a,n,e):((t,i,r)=>{let s=i.hasOwnProperty(r);return i.constructor.createProperty(r,t),s?Object.getOwnPropertyDescriptor(i,r):void 0})(a,n,e)}function g(a){return H({...a,state:!0,attribute:!1})}function ce(a,n){return o`${a.map(e=>yt(e,n))}`}function yt(a,n){switch(a.k){case"newline":return o` `;case"indent":return o`${a.t} `;case"keyword":return o`${a.t} `;case"operator":return o`${a.t} `;case"value":return o`${a.t} `;case"ref":{let e=n&&a.ek&&typeof a.ei=="number"?()=>n(a.ek,a.ei):void 0;return o`
- ${s.t}
- ${s.s?a`${s.s} `:""}
- `}default:return a`${s.t} `}}var G=[{value:0,label:"Turn OFF unit",ref_kind:"unit"},{value:1,label:"Turn ON unit",ref_kind:"unit"},{value:2,label:"All OFF",ref_kind:null},{value:3,label:"All ON",ref_kind:null},{value:4,label:"Bypass zone",ref_kind:"zone"},{value:5,label:"Restore zone",ref_kind:"zone"},{value:7,label:"Execute button",ref_kind:"button"},{value:9,label:"Set unit level %",ref_kind:"unit"},{value:48,label:"Disarm area",ref_kind:"area"},{value:49,label:"Arm area Day",ref_kind:"area"},{value:50,label:"Arm area Night",ref_kind:"area"},{value:51,label:"Arm area Away",ref_kind:"area"},{value:52,label:"Arm area Vacation",ref_kind:"area"}];function H(s){return G.find(i=>i.value===s)}var de=[{bit:2,label:"Mon"},{bit:4,label:"Tue"},{bit:8,label:"Wed"},{bit:16,label:"Thu"},{bit:32,label:"Fri"},{bit:64,label:"Sat"},{bit:128,label:"Sun"}],ue=1,pe=2,he=3;var Z=[{id:768,label:"Phone line dead"},{id:769,label:"Phone ringing"},{id:770,label:"Phone off hook"},{id:771,label:"Phone on hook"},{id:772,label:"AC power lost"},{id:773,label:"AC power restored"}];function T(s){if(Z.some(i=>i.id===s))return{category:"fixed",fixedId:s};if(!(s&65280))return{category:"button",button:s&255};if((s&64512)===1024){let i=s&1023;return{category:"zone",zone:Math.floor(i/4)+1,zoneState:i%4}}if((s&64512)===2048){let i=s&1023;return{category:"unit",unit:Math.floor(i/2)+1,unitOn:(i&1)===1}}return{category:"raw",raw:s}}function me(s){switch(s.category){case"button":return(s.button??1)&255;case"zone":{let i=(s.zone??1)-1,e=(s.zoneState??0)&3;return 1024|i*4+e&1023}case"unit":{let i=(s.unit??1)-1,e=s.unitOn?1:0;return 2048|i*2+e&1023}case"fixed":return s.fixedId??768;case"raw":default:return s.raw??0}}function F(s){return(s.month??0)<<8|(s.day??0)}function Le(s,i){return{...s,month:i>>8&255,day:i&255}}var Ne=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],fe=[{value:0,label:"always"},{value:1,label:"never"},{value:2,label:"it is light outside"},{value:3,label:"it is dark outside"},{value:4,label:"phone line is dead"},{value:5,label:"phone is ringing"},{value:6,label:"phone is off hook"},{value:7,label:"phone is on hook"},{value:8,label:"AC power is off"},{value:9,label:"AC power is on"},{value:10,label:"battery is low"},{value:11,label:"battery is OK"},{value:12,label:"energy cost is low"},{value:13,label:"energy cost is mid"},{value:14,label:"energy cost is high"},{value:15,label:"energy cost is critical"}],ge=[{value:0,label:"Off (disarmed)"},{value:1,label:"Day"},{value:2,label:"Night"},{value:3,label:"Away"},{value:4,label:"Vacation"},{value:5,label:"Day Instant"},{value:6,label:"Night Delayed"}];function He(s){if(s===0)return{family:"none"};let i=s>>8&252,e=(s&512)!==0;return i===0?{family:"misc",misc:s&15}:i===4?{family:"zone",index:s&255,active:e}:i===8?{family:"unit",index:s&511,active:e}:i===12?{family:"time",index:s&255,active:e}:{family:"sec",index:s>>8&15,mode:s>>12&7}}function v(s){switch(s.family){case"none":return 0;case"misc":return(s.misc??0)&15;case"zone":{let i=(s.index??0)&255;return 1024|(s.active?512:0)|i}case"unit":{let i=(s.index??0)&511;return 2048|(s.active?512:0)|i}case"time":{let i=(s.index??0)&255;return 3072|(s.active?512:0)|i}case"sec":{let i=(s.index??1)&15;return((s.mode??0)&7)<<12|i<<8}}}var je=5,Ue=6,Ye=7,ht=8,be=9,mt=10;function Be(s){let i=(s.cond??0)&255,e=(s.cond2??0)>>8&255,t=i&252,n=(i&2)!==0;return i===0&&e===0?{family:"none"}:t===0?{family:"misc",misc:i&15}:t===4?{family:"zone",index:e,active:n}:t===8?{family:"unit",index:e,active:n}:t===12?{family:"time",index:e,active:n}:{family:"sec",index:i&15,mode:i>>4&7}}function ve(s){switch(s.family){case"none":return{cond:0,cond2:0};case"misc":return{cond:(s.misc??0)&15,cond2:0};case"zone":return{cond:4|(s.active?2:0),cond2:((s.index??0)&255)<<8};case"unit":return{cond:8|(s.active?2:0),cond2:((s.index??0)&255)<<8};case"time":return{cond:12|(s.active?2:0),cond2:((s.index??0)&255)<<8};case"sec":{let i=(s.index??1)&15;return{cond:((s.mode??0)&7)<<4|i,cond2:0}}}}function We(s){return((s.cond??0)>>8&255)!==0}function _e(){return{prog_type:ht,cond:1,cond2:0,cmd:0,par:0,pr2:0,month:0,day:0,days:0,hour:0,minute:0}}function Ve(){return{..._e(),prog_type:be}}function qe(s=1){return{prog_type:mt,cmd:0,par:0,pr2:s,cond:0,cond2:0,month:0,day:0,days:0,hour:0,minute:0}}var Ge=new Set(["TIMED","EVENT","YEARLY"]),ft=["TIMED","EVENT","YEARLY","WHEN","AT","EVERY","REMARK"],gt=5e3,h=class extends x{constructor(){super(...arguments);this.narrow=!1;this._entryId=null;this._rows=[];this._total=0;this._filteredTotal=0;this._loading=!1;this._error=null;this._activeTriggerTypes=new Set;this._referenceFilter=null;this._searchTerm="";this._selectedSlot=null;this._detail=null;this._detailLoading=!1;this._fireFeedback=null;this._writeFeedback=null;this._cloneTargetSlot="";this._showCloneInput=!1;this._confirmingClear=!1;this._editingDraft=null;this._objects=null;this._chainDraft=null;this._refreshTimer=null}connectedCallback(){super.connectedCallback(),this._discoverEntry(),this._entryId&&(this._loadList(),this._startRefreshTimer())}disconnectedCallback(){super.disconnectedCallback(),this._stopRefreshTimer()}updated(e){e.has("hass")&&this._entryId===null&&(this._discoverEntry(),this._entryId&&(this._loadList(),this._startRefreshTimer()))}_discoverEntry(){this.hass?.connection&&this._discoverViaList()}async _discoverViaList(){try{let t=(await this.hass.connection.sendMessagePromise({type:"config_entries/get"})).filter(r=>r.domain==="omni_pca");if(t.length===0){this._error="No Omni panel configured. Add one via Settings \u2192 Devices & Services.";return}let n=t.find(r=>r.state==="loaded");this._entryId=(n??t[0]).entry_id,this._error=null,this._loadList(),this._startRefreshTimer()}catch(e){this._error=`Could not discover panels: ${e instanceof Error?e.message:String(e)}`}}async _loadList(){if(this._entryId){this._loading=!0,this._error=null;try{let e={type:"omni_pca/programs/list",entry_id:this._entryId};this._activeTriggerTypes.size>0&&(e.trigger_types=[...this._activeTriggerTypes]),this._referenceFilter&&(e.references_entity=this._referenceFilter),this._searchTerm&&(e.search=this._searchTerm);let t=await this.hass.connection.sendMessagePromise(e);this._rows=t.programs,this._total=t.total,this._filteredTotal=t.filtered_total}catch(e){this._error=e instanceof Error?e.message:String(e)}finally{this._loading=!1}}}async _loadDetail(e){if(this._entryId){this._detailLoading=!0,this._detail=null;try{this._detail=await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/get",entry_id:this._entryId,slot:e})}catch(t){this._error=t instanceof Error?t.message:String(t)}finally{this._detailLoading=!1}}}async _fireProgram(e){if(this._entryId){this._fireFeedback="firing\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/fire",entry_id:this._entryId,slot:e}),this._fireFeedback=`fired slot ${e}`}catch(t){this._fireFeedback=`error: ${t instanceof Error?t.message:t}`}setTimeout(()=>{this._fireFeedback=null},4e3)}}async _clearProgram(e){if(this._entryId){this._writeFeedback="clearing\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/clear",entry_id:this._entryId,slot:e}),this._writeFeedback=`cleared slot ${e}`,this._confirmingClear=!1,this._selectedSlot=null,this._detail=null,await this._loadList()}catch(t){let n=t instanceof Error?t.message:String(t);this._writeFeedback=`error: ${n}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}async _cloneProgram(e){if(!this._entryId)return;let t=this._cloneTargetSlot.trim(),n=parseInt(t,10);if(!Number.isFinite(n)||n<1||n>1500){this._writeFeedback="target slot must be 1..1500",setTimeout(()=>{this._writeFeedback=null},4e3);return}if(n===e){this._writeFeedback="target must differ from source",setTimeout(()=>{this._writeFeedback=null},4e3);return}this._writeFeedback="cloning\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/clone",entry_id:this._entryId,source_slot:e,target_slot:n}),this._writeFeedback=`cloned to slot ${n}`,this._showCloneInput=!1,this._cloneTargetSlot="",this._selectedSlot=n,await this._loadList(),await this._loadDetail(n)}catch(r){let o=r instanceof Error?r.message:String(r);this._writeFeedback=`error: ${o}`}setTimeout(()=>{this._writeFeedback=null},4e3)}_onCloneTargetInput(e){this._cloneTargetSlot=e.target.value}async _ensureObjectsLoaded(){if(!(this._objects!==null||!this._entryId))try{this._objects=await this.hass.connection.sendMessagePromise({type:"omni_pca/objects/list",entry_id:this._entryId})}catch(e){let t=e instanceof Error?e.message:String(e);console.warn("omni_pca: objects/list failed",t)}}async _beginEdit(){if(!this._detail||(await this._ensureObjectsLoaded(),!this._entryId))return;if(this._detail.kind==="chain"){this._beginChainEdit();return}if(!Ge.has(this._detail.trigger_type))return;let e=this._detail.fields??this._defaultFieldsForType(this._detail.trigger_type);e!==null&&(this._editingDraft={...e},this._stopRefreshTimer())}_beginChainEdit(){if(!this._detail||!this._detail.chain_members)return;let e=this._detail.chain_members,t=e.find(n=>n.role==="head");t&&(this._chainDraft={headSlot:t.slot,head:{...t.fields},conditions:e.filter(n=>n.role==="condition").map(n=>({...n.fields})),actions:e.filter(n=>n.role==="action").map(n=>({...n.fields}))},this._stopRefreshTimer())}_cancelChainEdit(){this._chainDraft=null,this._startRefreshTimer()}async _saveChainDraft(){if(!(!this._chainDraft||!this._entryId)){this._writeFeedback="saving chain\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/chain/write",entry_id:this._entryId,head_slot:this._chainDraft.headSlot,head:this._chainDraft.head,conditions:this._chainDraft.conditions,actions:this._chainDraft.actions}),this._writeFeedback=`saved chain @ slot ${this._chainDraft.headSlot}`;let e=this._chainDraft.headSlot;this._chainDraft=null,this._startRefreshTimer(),await this._loadList(),await this._loadDetail(e)}catch(e){let t=e instanceof Error?e.message:String(e);this._writeFeedback=`error: ${t}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}_patchChainHead(e){this._chainDraft&&(this._chainDraft={...this._chainDraft,head:{...this._chainDraft.head,...e}})}_patchChainCondition(e,t){if(!this._chainDraft)return;let n=[...this._chainDraft.conditions];n[e]={...n[e],...t},this._chainDraft={...this._chainDraft,conditions:n}}_addChainCondition(e=!1){if(!this._chainDraft)return;let t=e?Ve():_e();this._chainDraft={...this._chainDraft,conditions:[...this._chainDraft.conditions,t]}}_removeChainCondition(e){if(!this._chainDraft)return;let t=this._chainDraft.conditions.filter((n,r)=>r!==e);this._chainDraft={...this._chainDraft,conditions:t}}_patchChainAction(e,t){if(!this._chainDraft)return;let n=[...this._chainDraft.actions];n[e]={...n[e],...t},this._chainDraft={...this._chainDraft,actions:n}}_addChainAction(){if(!this._chainDraft)return;let e=this._objects?.units?.[0]?.index??1;this._chainDraft={...this._chainDraft,actions:[...this._chainDraft.actions,qe(e)]}}_removeChainAction(e){if(!this._chainDraft||this._chainDraft.actions.length<=1)return;let t=this._chainDraft.actions.filter((n,r)=>r!==e);this._chainDraft={...this._chainDraft,actions:t}}_defaultFieldsForType(e){let t=this._objects?.units?.[0]?.index??1;if(e==="TIMED")return{prog_type:ue,cmd:1,par:0,pr2:t,hour:6,minute:0,days:62,cond:0,cond2:0,month:0,day:0};if(e==="EVENT"){let n=this._objects?.buttons?.[0]?.index??1;return{prog_type:pe,cmd:1,par:0,pr2:t,month:0,day:n&255,hour:0,minute:0,days:0,cond:0,cond2:0}}return e==="YEARLY"?{prog_type:he,cmd:1,par:0,pr2:t,month:1,day:1,hour:0,minute:0,days:0,cond:0,cond2:0}:null}async _saveDraft(){if(!(!this._editingDraft||!this._detail||!this._entryId)){this._writeFeedback="saving\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/write",entry_id:this._entryId,slot:this._detail.slot,program:this._editingDraft}),this._writeFeedback=`saved slot ${this._detail.slot}`,this._editingDraft=null,this._startRefreshTimer(),await this._loadList(),await this._loadDetail(this._detail.slot)}catch(e){let t=e instanceof Error?e.message:String(e);this._writeFeedback=`error: ${t}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}_cancelEdit(){this._editingDraft=null,this._startRefreshTimer()}_patchDraft(e){this._editingDraft&&(this._editingDraft={...this._editingDraft,...e})}_toggleDayBit(e){if(!this._editingDraft)return;let n=(this._editingDraft.days??0)^e;this._patchDraft({days:n})}_onCommandChange(e){let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let n=H(t),r=this._editingDraft?.pr2??0;if(n?.ref_kind&&this._objects){let o=this._pickBucket(n.ref_kind);o&&o.length>0&&!o.some(c=>c.index===r)&&(r=o[0].index)}else n?.ref_kind||(r=0);this._patchDraft({cmd:t,pr2:r})}_pickBucket(e){if(!this._objects)return null;switch(e){case"zone":return this._objects.zones;case"unit":return this._objects.units;case"area":return this._objects.areas;case"button":return this._objects.buttons;default:return null}}_bucketWithPreserve(e,t,n){let r=e??[];return n===0||r.some(o=>o.index===n)?r:[{index:n,name:`(undiscovered ${t} ${n} \u2014 preserve original)`},...r]}_onObjectChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchDraft({pr2:t})}_onHourChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=23&&this._patchDraft({hour:t})}_onMinuteChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=59&&this._patchDraft({minute:t})}_onParChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=255&&this._patchDraft({par:t})}_onMonthChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=1&&t<=12&&this._patchDraft({month:t})}_onDayChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=1&&t<=31&&this._patchDraft({day:t})}_patchEvent(e){if(!this._editingDraft)return;let t=me(e);this._editingDraft=Le(this._editingDraft,t)}_onEventCategoryChange(e){let t=e.target.value;if(t==="button"){let n=this._objects?.buttons?.[0]?.index??1;this._patchEvent({category:"button",button:n})}else if(t==="zone"){let n=this._objects?.zones?.[0]?.index??1;this._patchEvent({category:"zone",zone:n,zoneState:1})}else if(t==="unit"){let n=this._objects?.units?.[0]?.index??1;this._patchEvent({category:"unit",unit:n,unitOn:!0})}else t==="fixed"&&this._patchEvent({category:"fixed",fixedId:772})}_onEventButtonChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchEvent({category:"button",button:t})}_onEventZoneChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let n=T(F(this._editingDraft));this._patchEvent({category:"zone",zone:t,zoneState:n.zoneState??1})}_onEventZoneStateChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let n=T(F(this._editingDraft));this._patchEvent({category:"zone",zone:n.zone??1,zoneState:t})}_onEventUnitChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let n=T(F(this._editingDraft));this._patchEvent({category:"unit",unit:t,unitOn:n.unitOn??!0})}_onEventUnitOnChange(e){if(!this._editingDraft)return;let t=e.target.value==="1",n=T(F(this._editingDraft));this._patchEvent({category:"unit",unit:n.unit??1,unitOn:t})}_onEventFixedChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchEvent({category:"fixed",fixedId:t})}_startRefreshTimer(){this._refreshTimer===null&&(this._refreshTimer=window.setInterval(()=>{this._loadList(),this._selectedSlot!==null&&this._loadDetail(this._selectedSlot)},gt))}_stopRefreshTimer(){this._refreshTimer!==null&&(window.clearInterval(this._refreshTimer),this._refreshTimer=null)}_toggleTriggerFilter(e){let t=new Set(this._activeTriggerTypes);t.has(e)?t.delete(e):t.add(e),this._activeTriggerTypes=t,this._loadList()}_onSearchInput(e){this._searchTerm=e.target.value,this._loadList()}_clearReferenceFilter(){this._referenceFilter=null,this._loadList()}_onRowClick(e){this._selectedSlot=e,this._loadDetail(e)}_onRefClick(e,t){this._referenceFilter=`${e}:${t}`,this._selectedSlot=null,this._detail=null,this._loadList()}_closeDetail(){this._selectedSlot=null,this._detail=null}render(){return a`
+ ${a.t}
+ ${a.s?o`${a.s} `:""}
+ `}default:return o`${a.t} `}}var G=[{value:0,label:"Turn OFF unit",ref_kind:"unit"},{value:1,label:"Turn ON unit",ref_kind:"unit"},{value:2,label:"All OFF",ref_kind:null},{value:3,label:"All ON",ref_kind:null},{value:4,label:"Bypass zone",ref_kind:"zone"},{value:5,label:"Restore zone",ref_kind:"zone"},{value:7,label:"Execute button",ref_kind:"button"},{value:9,label:"Set unit level %",ref_kind:"unit"},{value:48,label:"Disarm area",ref_kind:"area"},{value:49,label:"Arm area Day",ref_kind:"area"},{value:50,label:"Arm area Night",ref_kind:"area"},{value:51,label:"Arm area Away",ref_kind:"area"},{value:52,label:"Arm area Vacation",ref_kind:"area"}];function N(a){return G.find(n=>n.value===a)}var de=[{bit:2,label:"Mon"},{bit:4,label:"Tue"},{bit:8,label:"Wed"},{bit:16,label:"Thu"},{bit:32,label:"Fri"},{bit:64,label:"Sat"},{bit:128,label:"Sun"}],ue=1,pe=2,he=3;var Z=[{id:768,label:"Phone line dead"},{id:769,label:"Phone ringing"},{id:770,label:"Phone off hook"},{id:771,label:"Phone on hook"},{id:772,label:"AC power lost"},{id:773,label:"AC power restored"}];function T(a){if(Z.some(n=>n.id===a))return{category:"fixed",fixedId:a};if(!(a&65280))return{category:"button",button:a&255};if((a&64512)===1024){let n=a&1023;return{category:"zone",zone:Math.floor(n/4)+1,zoneState:n%4}}if((a&64512)===2048){let n=a&1023;return{category:"unit",unit:Math.floor(n/2)+1,unitOn:(n&1)===1}}return{category:"raw",raw:a}}function me(a){switch(a.category){case"button":return(a.button??1)&255;case"zone":{let n=(a.zone??1)-1,e=(a.zoneState??0)&3;return 1024|n*4+e&1023}case"unit":{let n=(a.unit??1)-1,e=a.unitOn?1:0;return 2048|n*2+e&1023}case"fixed":return a.fixedId??768;case"raw":default:return a.raw??0}}function w(a){return(a.month??0)<<8|(a.day??0)}function Ue(a,n){return{...a,month:n>>8&255,day:n&255}}var Ye=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ge=[{value:0,label:"always"},{value:1,label:"never"},{value:2,label:"it is light outside"},{value:3,label:"it is dark outside"},{value:4,label:"phone line is dead"},{value:5,label:"phone is ringing"},{value:6,label:"phone is off hook"},{value:7,label:"phone is on hook"},{value:8,label:"AC power is off"},{value:9,label:"AC power is on"},{value:10,label:"battery is low"},{value:11,label:"battery is OK"},{value:12,label:"energy cost is low"},{value:13,label:"energy cost is mid"},{value:14,label:"energy cost is high"},{value:15,label:"energy cost is critical"}],fe=[{value:0,label:"Off (disarmed)"},{value:1,label:"Day"},{value:2,label:"Night"},{value:3,label:"Away"},{value:4,label:"Vacation"},{value:5,label:"Day Instant"},{value:6,label:"Night Delayed"}];function Be(a){if(a===0)return{family:"none"};let n=a>>8&252,e=(a&512)!==0;return n===0?{family:"misc",misc:a&15}:n===4?{family:"zone",index:a&255,active:e}:n===8?{family:"unit",index:a&511,active:e}:n===12?{family:"time",index:a&255,active:e}:{family:"sec",index:a>>8&15,mode:a>>12&7}}function v(a){switch(a.family){case"none":return 0;case"misc":return(a.misc??0)&15;case"zone":{let n=(a.index??0)&255;return 1024|(a.active?512:0)|n}case"unit":{let n=(a.index??0)&511;return 2048|(a.active?512:0)|n}case"time":{let n=(a.index??0)&255;return 3072|(a.active?512:0)|n}case"sec":{let n=(a.index??1)&15;return((a.mode??0)&7)<<12|n<<8}}}var We=5,Ve=6,qe=7,$t=8,be=9,xt=10;function Ge(a){let n=(a.cond??0)&255,e=(a.cond2??0)>>8&255,t=n&252,i=(n&2)!==0;return n===0&&e===0?{family:"none"}:t===0?{family:"misc",misc:n&15}:t===4?{family:"zone",index:e,active:i}:t===8?{family:"unit",index:e,active:i}:t===12?{family:"time",index:e,active:i}:{family:"sec",index:n&15,mode:n>>4&7}}function ve(a){switch(a.family){case"none":return{cond:0,cond2:0};case"misc":return{cond:(a.misc??0)&15,cond2:0};case"zone":return{cond:4|(a.active?2:0),cond2:((a.index??0)&255)<<8};case"unit":return{cond:8|(a.active?2:0),cond2:((a.index??0)&255)<<8};case"time":return{cond:12|(a.active?2:0),cond2:((a.index??0)&255)<<8};case"sec":{let n=(a.index??1)&15;return{cond:((a.mode??0)&7)<<4|n,cond2:0}}}}function Ze(a){return((a.cond??0)>>8&255)!==0}function _e(){return{prog_type:$t,cond:1,cond2:0,cmd:0,par:0,pr2:0,month:0,day:0,days:0,hour:0,minute:0}}function Ke(){return{..._e(),prog_type:be}}function Je(a=1){return{prog_type:xt,cmd:0,par:0,pr2:a,cond:0,cond2:0,month:0,day:0,days:0,hour:0,minute:0}}var Xe=[{value:1,label:"=="},{value:2,label:"!="},{value:3,label:"<"},{value:4,label:">"},{value:5,label:"is odd"},{value:6,label:"is even"},{value:7,label:"is multiple of"},{value:8,label:"in (bitmask)"},{value:9,label:"not in (bitmask)"}];function ye(a){return a===5||a===6}var $e=[{value:0,label:"Constant",kind:null},{value:2,label:"Zone",kind:"zone"},{value:3,label:"Unit",kind:"unit"},{value:4,label:"Thermostat",kind:"thermostat"},{value:6,label:"Area",kind:"area"},{value:7,label:"Time / Date",kind:null}];function Et(a){return[2,3,4,6,7].includes(a)}function xe(a){let n=$e.find(e=>e.value===a);return n?n.kind:null}var Ee={2:[{value:1,label:"Loop reading"},{value:2,label:"Current state"},{value:3,label:"Arming state"},{value:4,label:"Alarm state"}],3:[{value:1,label:"Current state"},{value:2,label:"Previous state"},{value:3,label:"Timer"},{value:4,label:"Level"}],4:[{value:1,label:"Current temperature"},{value:2,label:"Heat setpoint"},{value:3,label:"Cool setpoint"},{value:4,label:"System mode"},{value:5,label:"Fan mode"},{value:6,label:"Hold mode"},{value:7,label:"Freeze alarm"},{value:8,label:"Comm error"},{value:9,label:"Humidity"},{value:10,label:"Humidify setpoint"},{value:11,label:"Dehumidify setpoint"},{value:12,label:"Outdoor temperature"},{value:13,label:"System status"}],6:[{value:1,label:"Security mode"}],7:[{value:2,label:"Year"},{value:3,label:"Month"},{value:4,label:"Day"},{value:5,label:"Day of week (1=Mon..7=Sun)"},{value:6,label:"Time (minutes since midnight)"},{value:8,label:"Hour"},{value:9,label:"Minute"}]};function Qe(a){return{op:(a.cond??0)>>8&255,arg1Type:(a.cond??0)&255,arg1Ix:a.cond2??0,arg1Field:a.cmd??0,arg2Type:a.par??0,arg2Ix:a.pr2??0,arg2Field:a.month??0,compConst:(a.day??0)<<8|(a.days??0)}}function et(a){return{cond:(a.op&255)<<8|a.arg1Type&255,cond2:a.arg1Ix&65535,cmd:a.arg1Field&255,par:a.arg2Type&255,pr2:a.arg2Ix&65535,month:a.arg2Field&255,day:a.compConst>>8&255,days:a.compConst&255}}function tt(a){return!(!Et(a.arg1Type)||!ye(a.op)&&a.arg2Type!==0||a.compConst!==0)}var nt=new Set(["TIMED","EVENT","YEARLY"]),kt=["TIMED","EVENT","YEARLY","WHEN","AT","EVERY","REMARK"],St=5e3,h=class extends x{constructor(){super(...arguments);this.narrow=!1;this._entryId=null;this._rows=[];this._total=0;this._filteredTotal=0;this._loading=!1;this._error=null;this._activeTriggerTypes=new Set;this._referenceFilter=null;this._searchTerm="";this._selectedSlot=null;this._detail=null;this._detailLoading=!1;this._fireFeedback=null;this._writeFeedback=null;this._cloneTargetSlot="";this._showCloneInput=!1;this._confirmingClear=!1;this._editingDraft=null;this._objects=null;this._chainDraft=null;this._refreshTimer=null}connectedCallback(){super.connectedCallback(),this._discoverEntry(),this._entryId&&(this._loadList(),this._startRefreshTimer())}disconnectedCallback(){super.disconnectedCallback(),this._stopRefreshTimer()}updated(e){e.has("hass")&&this._entryId===null&&(this._discoverEntry(),this._entryId&&(this._loadList(),this._startRefreshTimer()))}_discoverEntry(){this.hass?.connection&&this._discoverViaList()}async _discoverViaList(){try{let t=(await this.hass.connection.sendMessagePromise({type:"config_entries/get"})).filter(r=>r.domain==="omni_pca");if(t.length===0){this._error="No Omni panel configured. Add one via Settings \u2192 Devices & Services.";return}let i=t.find(r=>r.state==="loaded");this._entryId=(i??t[0]).entry_id,this._error=null,this._loadList(),this._startRefreshTimer()}catch(e){this._error=`Could not discover panels: ${e instanceof Error?e.message:String(e)}`}}async _loadList(){if(this._entryId){this._loading=!0,this._error=null;try{let e={type:"omni_pca/programs/list",entry_id:this._entryId};this._activeTriggerTypes.size>0&&(e.trigger_types=[...this._activeTriggerTypes]),this._referenceFilter&&(e.references_entity=this._referenceFilter),this._searchTerm&&(e.search=this._searchTerm);let t=await this.hass.connection.sendMessagePromise(e);this._rows=t.programs,this._total=t.total,this._filteredTotal=t.filtered_total}catch(e){this._error=e instanceof Error?e.message:String(e)}finally{this._loading=!1}}}async _loadDetail(e){if(this._entryId){this._detailLoading=!0,this._detail=null;try{this._detail=await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/get",entry_id:this._entryId,slot:e})}catch(t){this._error=t instanceof Error?t.message:String(t)}finally{this._detailLoading=!1}}}async _fireProgram(e){if(this._entryId){this._fireFeedback="firing\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/fire",entry_id:this._entryId,slot:e}),this._fireFeedback=`fired slot ${e}`}catch(t){this._fireFeedback=`error: ${t instanceof Error?t.message:t}`}setTimeout(()=>{this._fireFeedback=null},4e3)}}async _clearProgram(e){if(this._entryId){this._writeFeedback="clearing\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/clear",entry_id:this._entryId,slot:e}),this._writeFeedback=`cleared slot ${e}`,this._confirmingClear=!1,this._selectedSlot=null,this._detail=null,await this._loadList()}catch(t){let i=t instanceof Error?t.message:String(t);this._writeFeedback=`error: ${i}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}async _cloneProgram(e){if(!this._entryId)return;let t=this._cloneTargetSlot.trim(),i=parseInt(t,10);if(!Number.isFinite(i)||i<1||i>1500){this._writeFeedback="target slot must be 1..1500",setTimeout(()=>{this._writeFeedback=null},4e3);return}if(i===e){this._writeFeedback="target must differ from source",setTimeout(()=>{this._writeFeedback=null},4e3);return}this._writeFeedback="cloning\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/clone",entry_id:this._entryId,source_slot:e,target_slot:i}),this._writeFeedback=`cloned to slot ${i}`,this._showCloneInput=!1,this._cloneTargetSlot="",this._selectedSlot=i,await this._loadList(),await this._loadDetail(i)}catch(r){let s=r instanceof Error?r.message:String(r);this._writeFeedback=`error: ${s}`}setTimeout(()=>{this._writeFeedback=null},4e3)}_onCloneTargetInput(e){this._cloneTargetSlot=e.target.value}async _ensureObjectsLoaded(){if(!(this._objects!==null||!this._entryId))try{this._objects=await this.hass.connection.sendMessagePromise({type:"omni_pca/objects/list",entry_id:this._entryId})}catch(e){let t=e instanceof Error?e.message:String(e);console.warn("omni_pca: objects/list failed",t)}}async _beginEdit(){if(!this._detail||(await this._ensureObjectsLoaded(),!this._entryId))return;if(this._detail.kind==="chain"){this._beginChainEdit();return}if(!nt.has(this._detail.trigger_type))return;let e=this._detail.fields??this._defaultFieldsForType(this._detail.trigger_type);e!==null&&(this._editingDraft={...e},this._stopRefreshTimer())}_beginChainEdit(){if(!this._detail||!this._detail.chain_members)return;let e=this._detail.chain_members,t=e.find(i=>i.role==="head");t&&(this._chainDraft={headSlot:t.slot,head:{...t.fields},conditions:e.filter(i=>i.role==="condition").map(i=>({...i.fields})),actions:e.filter(i=>i.role==="action").map(i=>({...i.fields}))},this._stopRefreshTimer())}_cancelChainEdit(){this._chainDraft=null,this._startRefreshTimer()}async _saveChainDraft(){if(!(!this._chainDraft||!this._entryId)){this._writeFeedback="saving chain\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/chain/write",entry_id:this._entryId,head_slot:this._chainDraft.headSlot,head:this._chainDraft.head,conditions:this._chainDraft.conditions,actions:this._chainDraft.actions}),this._writeFeedback=`saved chain @ slot ${this._chainDraft.headSlot}`;let e=this._chainDraft.headSlot;this._chainDraft=null,this._startRefreshTimer(),await this._loadList(),await this._loadDetail(e)}catch(e){let t=e instanceof Error?e.message:String(e);this._writeFeedback=`error: ${t}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}_patchChainHead(e){this._chainDraft&&(this._chainDraft={...this._chainDraft,head:{...this._chainDraft.head,...e}})}_patchChainCondition(e,t){if(!this._chainDraft)return;let i=[...this._chainDraft.conditions];i[e]={...i[e],...t},this._chainDraft={...this._chainDraft,conditions:i}}_addChainCondition(e=!1){if(!this._chainDraft)return;let t=e?Ke():_e();this._chainDraft={...this._chainDraft,conditions:[...this._chainDraft.conditions,t]}}_removeChainCondition(e){if(!this._chainDraft)return;let t=this._chainDraft.conditions.filter((i,r)=>r!==e);this._chainDraft={...this._chainDraft,conditions:t}}_patchChainAction(e,t){if(!this._chainDraft)return;let i=[...this._chainDraft.actions];i[e]={...i[e],...t},this._chainDraft={...this._chainDraft,actions:i}}_addChainAction(){if(!this._chainDraft)return;let e=this._objects?.units?.[0]?.index??1;this._chainDraft={...this._chainDraft,actions:[...this._chainDraft.actions,Je(e)]}}_removeChainAction(e){if(!this._chainDraft||this._chainDraft.actions.length<=1)return;let t=this._chainDraft.actions.filter((i,r)=>r!==e);this._chainDraft={...this._chainDraft,actions:t}}_defaultFieldsForType(e){let t=this._objects?.units?.[0]?.index??1;if(e==="TIMED")return{prog_type:ue,cmd:1,par:0,pr2:t,hour:6,minute:0,days:62,cond:0,cond2:0,month:0,day:0};if(e==="EVENT"){let i=this._objects?.buttons?.[0]?.index??1;return{prog_type:pe,cmd:1,par:0,pr2:t,month:0,day:i&255,hour:0,minute:0,days:0,cond:0,cond2:0}}return e==="YEARLY"?{prog_type:he,cmd:1,par:0,pr2:t,month:1,day:1,hour:0,minute:0,days:0,cond:0,cond2:0}:null}async _saveDraft(){if(!(!this._editingDraft||!this._detail||!this._entryId)){this._writeFeedback="saving\u2026";try{await this.hass.connection.sendMessagePromise({type:"omni_pca/programs/write",entry_id:this._entryId,slot:this._detail.slot,program:this._editingDraft}),this._writeFeedback=`saved slot ${this._detail.slot}`,this._editingDraft=null,this._startRefreshTimer(),await this._loadList(),await this._loadDetail(this._detail.slot)}catch(e){let t=e instanceof Error?e.message:String(e);this._writeFeedback=`error: ${t}`}setTimeout(()=>{this._writeFeedback=null},4e3)}}_cancelEdit(){this._editingDraft=null,this._startRefreshTimer()}_patchDraft(e){this._editingDraft&&(this._editingDraft={...this._editingDraft,...e})}_toggleDayBit(e){if(!this._editingDraft)return;let i=(this._editingDraft.days??0)^e;this._patchDraft({days:i})}_onCommandChange(e){let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let i=N(t),r=this._editingDraft?.pr2??0;if(i?.ref_kind&&this._objects){let s=this._pickBucket(i.ref_kind);s&&s.length>0&&!s.some(c=>c.index===r)&&(r=s[0].index)}else i?.ref_kind||(r=0);this._patchDraft({cmd:t,pr2:r})}_pickBucket(e){if(!this._objects)return null;switch(e){case"zone":return this._objects.zones;case"unit":return this._objects.units;case"area":return this._objects.areas;case"button":return this._objects.buttons;case"thermostat":return this._objects.thermostats;default:return null}}_bucketWithPreserve(e,t,i){let r=e??[];return i===0||r.some(s=>s.index===i)?r:[{index:i,name:`(undiscovered ${t} ${i} \u2014 preserve original)`},...r]}_onObjectChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchDraft({pr2:t})}_onHourChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=23&&this._patchDraft({hour:t})}_onMinuteChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=59&&this._patchDraft({minute:t})}_onParChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=0&&t<=255&&this._patchDraft({par:t})}_onMonthChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=1&&t<=12&&this._patchDraft({month:t})}_onDayChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&t>=1&&t<=31&&this._patchDraft({day:t})}_patchEvent(e){if(!this._editingDraft)return;let t=me(e);this._editingDraft=Ue(this._editingDraft,t)}_onEventCategoryChange(e){let t=e.target.value;if(t==="button"){let i=this._objects?.buttons?.[0]?.index??1;this._patchEvent({category:"button",button:i})}else if(t==="zone"){let i=this._objects?.zones?.[0]?.index??1;this._patchEvent({category:"zone",zone:i,zoneState:1})}else if(t==="unit"){let i=this._objects?.units?.[0]?.index??1;this._patchEvent({category:"unit",unit:i,unitOn:!0})}else t==="fixed"&&this._patchEvent({category:"fixed",fixedId:772})}_onEventButtonChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchEvent({category:"button",button:t})}_onEventZoneChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let i=T(w(this._editingDraft));this._patchEvent({category:"zone",zone:t,zoneState:i.zoneState??1})}_onEventZoneStateChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let i=T(w(this._editingDraft));this._patchEvent({category:"zone",zone:i.zone??1,zoneState:t})}_onEventUnitChange(e){if(!this._editingDraft)return;let t=parseInt(e.target.value,10);if(!Number.isFinite(t))return;let i=T(w(this._editingDraft));this._patchEvent({category:"unit",unit:t,unitOn:i.unitOn??!0})}_onEventUnitOnChange(e){if(!this._editingDraft)return;let t=e.target.value==="1",i=T(w(this._editingDraft));this._patchEvent({category:"unit",unit:i.unit??1,unitOn:t})}_onEventFixedChange(e){let t=parseInt(e.target.value,10);Number.isFinite(t)&&this._patchEvent({category:"fixed",fixedId:t})}_startRefreshTimer(){this._refreshTimer===null&&(this._refreshTimer=window.setInterval(()=>{this._loadList(),this._selectedSlot!==null&&this._loadDetail(this._selectedSlot)},St))}_stopRefreshTimer(){this._refreshTimer!==null&&(window.clearInterval(this._refreshTimer),this._refreshTimer=null)}_toggleTriggerFilter(e){let t=new Set(this._activeTriggerTypes);t.has(e)?t.delete(e):t.add(e),this._activeTriggerTypes=t,this._loadList()}_onSearchInput(e){this._searchTerm=e.target.value,this._loadList()}_clearReferenceFilter(){this._referenceFilter=null,this._loadList()}_onRowClick(e){this._selectedSlot=e,this._loadDetail(e)}_onRefClick(e,t){this._referenceFilter=`${e}:${t}`,this._selectedSlot=null,this._detail=null,this._loadList()}_closeDetail(){this._selectedSlot=null,this._detail=null}render(){return o`
- ${this._error?a`
+ ${this._error?o`
${this._error}
`:""}
${this._renderFilters()}
${this._renderList()}
${this._selectedSlot!==null?this._renderDetail():""}
- `}_renderFilters(){return a`
+ `}_renderFilters(){return o`
- ${ft.map(e=>a`
+ ${kt.map(e=>o`
${e}
`)}
- ${this._referenceFilter?a`
+ ${this._referenceFilter?o`
filtering on ${this._referenceFilter}
clear
`:""}
- `}_renderList(){return this._loading&&this._rows.length===0?a`loading…
`:this._rows.length===0?a`No programs match the current filters.
`:a`
+ `}_renderList(){return this._loading&&this._rows.length===0?o`loading…
`:this._rows.length===0?o`No programs match the current filters.
`:o`
- ${this._rows.map(e=>a`
+ ${this._rows.map(e=>o`
this._onRowClick(e.slot)}
>
#${e.slot}
- ${ce(e.summary,(t,n)=>this._onRefClick(t,n))}
+ ${ce(e.summary,(t,i)=>this._onRefClick(t,i))}
${e.trigger_type}
- ${e.condition_count>0?a`
+ ${e.condition_count>0?o`
${e.condition_count} cond `:""}
- ${e.action_count>1?a`
+ ${e.action_count>1?o`
${e.action_count} actions `:""}
`)}
- `}_renderDetail(){if(this._detailLoading)return a``;if(this._detail===null)return a``;let e=this._detail;return this._editingDraft!==null?this._renderEditor(e):this._chainDraft!==null?this._renderChainEditor(e):a`
+ `}_renderDetail(){if(this._detailLoading)return o``;if(this._detail===null)return o``;let e=this._detail;return this._editingDraft!==null?this._renderEditor(e):this._chainDraft!==null?this._renderChainEditor(e):o`
@@ -85,14 +85,14 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
×
- ${ce(e.tokens,(t,n)=>this._onRefClick(t,n))}
+ ${ce(e.tokens,(t,i)=>this._onRefClick(t,i))}
this._fireProgram(e.slot)}
>▶ Fire now
- ${e.kind==="compact"&&Ge.has(e.trigger_type)||e.kind==="chain"?a`
+ ${e.kind==="compact"&&nt.has(e.trigger_type)||e.kind==="chain"?o`
{this._confirmingClear=!this._confirmingClear,this._showCloneInput=!1}}
>Clear
- ${this._fireFeedback?a`
+ ${this._fireFeedback?o`
${this._fireFeedback} `:""}
- ${this._writeFeedback?a`
+ ${this._writeFeedback?o`
${this._writeFeedback} `:""}
- ${this._showCloneInput?a`
+ ${this._showCloneInput?o`
Clone slot ${e.slot} → target slot:
{this._showCloneInput=!1}}
>Cancel
`:""}
- ${this._confirmingClear?a`
+ ${this._confirmingClear?o`
Clear slot ${e.slot}?
@@ -151,19 +151,19 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
@click=${()=>{this._confirmingClear=!1}}
>Cancel
`:""}
- ${e.chain_slots&&e.chain_slots.length>1?a`
+ ${e.chain_slots&&e.chain_slots.length>1?o`
spans slots
- ${e.chain_slots.map((t,n)=>a`
- ${n>0?"\u2192":""}#${t}`)}
+ ${e.chain_slots.map((t,i)=>o`
+ ${i>0?"\u2192":""}#${t}`)}
`:""}
- `}_renderEditor(e){let t=this._editingDraft,n=e.trigger_type;return a`
+ `}_renderEditor(e){let t=this._editingDraft,i=e.trigger_type;return o`
- `}_renderTriggerSection(e){switch(e.prog_type){case ue:return this._renderTimedTrigger(e);case pe:return this._renderEventTrigger(e);case he:return this._renderYearlyTrigger(e);default:return a`
+ `}_renderTriggerSection(e){switch(e.prog_type){case ue:return this._renderTimedTrigger(e);case pe:return this._renderEventTrigger(e);case he:return this._renderYearlyTrigger(e);default:return o`
Editing program type ${e.prog_type} is not supported.
-
`}}_renderTimedTrigger(e){return a`
+
`}}_renderTimedTrigger(e){return o`
Time
@@ -215,64 +215,64 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Days
- ${de.map(t=>{let n=((e.days??0)&t.bit)!==0;return a`
+ ${de.map(t=>{let i=((e.days??0)&t.bit)!==0;return o`
this._toggleDayBit(t.bit)}
>${t.label}
`})}
- `}_renderEventTrigger(e){let t=F(e),n=T(t);return a`
+ `}_renderEventTrigger(e){let t=w(e),i=T(t);return o`
Trigger event
Category
+ ?selected=${i.category==="button"}>
Button press
+ ?selected=${i.category==="zone"}>
Zone state change
+ ?selected=${i.category==="unit"}>
Unit state change
+ ?selected=${i.category==="fixed"}>
Fixed event (phone / AC)
- ${n.category==="raw"?a`
+ ${i.category==="raw"?o`
Raw 0x${t.toString(16).padStart(4,"0")}
`:""}
- ${this._renderEventCategoryFields(n)}
+ ${this._renderEventCategoryFields(i)}
- `}_renderEventCategoryFields(e){if(e.category==="button"){let t=this._bucketWithPreserve(this._objects?.buttons??null,"button",e.button??0);return a`
+ `}_renderEventCategoryFields(e){if(e.category==="button"){let t=this._bucketWithPreserve(this._objects?.buttons??null,"button",e.button??0);return o`
Button
- ${t.map(n=>a`
-
- #${n.index} ${n.name}
+ ${t.map(i=>o`
+
+ #${i.index} ${i.name}
`)}
- `}if(e.category==="zone"){let t=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.zone??0);return a`
+ `}if(e.category==="zone"){let t=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.zone??0);return o`
Zone
- ${t.map(n=>a`
-
- #${n.index} ${n.name}
+ ${t.map(i=>o`
+
+ #${i.index} ${i.name}
`)}
@@ -285,14 +285,14 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
trouble
tamper
- `}if(e.category==="unit"){let t=this._bucketWithPreserve(this._objects?.units??null,"unit",e.unit??0);return a`
+ `}if(e.category==="unit"){let t=this._bucketWithPreserve(this._objects?.units??null,"unit",e.unit??0);return o`
Unit
- ${t.map(n=>a`
-
- #${n.index} ${n.name}
+ ${t.map(i=>o`
+
+ #${i.index} ${i.name}
`)}
@@ -303,31 +303,31 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
ON
OFF
- `}return e.category==="fixed"?a`
+ `}return e.category==="fixed"?o`
Event
- ${Z.map(t=>a`
+ ${Z.map(t=>o`
${t.label}
`)}
- `:a`
+ `:o`
Unrecognised event ID. Switch category above to redefine.
-
`}_renderYearlyTrigger(e){return a`
+
`}_renderYearlyTrigger(e){return o`
Date
Month
- ${Ne.map((t,n)=>a`
-
- ${t} (${n+1})
+ ${Ye.map((t,i)=>o`
+
+ ${t} (${i+1})
`)}
@@ -364,33 +364,33 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
- `}_renderActionSection(e){let t=H(e.cmd??0),n=t?.ref_kind?this._bucketWithPreserve(this._pickBucket(t.ref_kind),t.ref_kind,e.pr2??0):null,r=e.cmd===9;return a`
+ `}_renderActionSection(e){let t=N(e.cmd??0),i=t?.ref_kind?this._bucketWithPreserve(this._pickBucket(t.ref_kind),t.ref_kind,e.pr2??0):null,r=e.cmd===9;return o`
Action
Command
- ${G.map(o=>a`
-
- ${o.label}
+ ${G.map(s=>o`
+
+ ${s.label}
`)}
- ${t?.ref_kind?a`
+ ${t?.ref_kind?o`
${t.ref_kind[0].toUpperCase()+t.ref_kind.slice(1)}
- ${(n??[]).map(o=>a`
-
- #${o.index} ${o.name}
+ ${(i??[]).map(s=>o`
+
+ #${s.index} ${s.name}
`)}
`:""}
- ${r?a`
+ ${r?o`
Level (0..100)
`:""}
- `}_renderConditionsSection(e){return a`
+ `}_renderConditionsSection(e){return o`
Inline AND-IF conditions
${this._renderConditionSlot("First condition",e.cond??0,t=>this._patchDraft({cond:t}))}
${this._renderConditionSlot("Second condition",e.cond2??0,t=>this._patchDraft({cond2:t}))}
- `}_renderConditionSlot(e,t,n){let r=He(t),o=c=>{let l=this._objects?.zones?.[0]?.index??1,u=this._objects?.units?.[0]?.index??1,p=this._objects?.areas?.[0]?.index??1,d;switch(c){case"none":d={family:"none"};break;case"misc":d={family:"misc",misc:1};break;case"zone":d={family:"zone",index:l,active:!1};break;case"unit":d={family:"unit",index:u,active:!0};break;case"time":d={family:"time",index:1,active:!0};break;case"sec":d={family:"sec",index:p,mode:0};break}n(v(d))};return a`
+ `}_renderConditionSlot(e,t,i){let r=Be(t),s=c=>{let l=this._objects?.zones?.[0]?.index??1,d=this._objects?.units?.[0]?.index??1,p=this._objects?.areas?.[0]?.index??1,u;switch(c){case"none":u={family:"none"};break;case"misc":u={family:"misc",misc:1};break;case"zone":u={family:"zone",index:l,active:!1};break;case"unit":u={family:"unit",index:d,active:!0};break;case"time":u={family:"time",index:1,active:!0};break;case"sec":u={family:"sec",index:p,mode:0};break}i(v(u))};return o`
${e}
- o(c.target.value)}>
+ s(c.target.value)}>
(none)
Zone state
Unit state
@@ -419,13 +419,13 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Misc (light, AC power, …)
- ${this._renderConditionSubfields(r,n)}
+ ${this._renderConditionSubfields(r,i)}
- `}_renderConditionSubfields(e,t){if(e.family==="none")return a``;if(e.family==="zone"){let n=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.index??0);return a`
+ `}_renderConditionSubfields(e,t){if(e.family==="none")return o``;if(e.family==="zone"){let i=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.index??0);return o`
Zone
- {let o=parseInt(r.target.value,10);t(v({...e,index:o}))}}>
- ${n.map(r=>a`
+ {let s=parseInt(r.target.value,10);t(v({...e,index:s}))}}>
+ ${i.map(r=>o`
#${r.index} ${r.name}
@@ -435,15 +435,15 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Is
- {let o=r.target.value==="1";t(v({...e,active:o}))}}>
+ {let s=r.target.value==="1";t(v({...e,active:s}))}}>
secure
not ready
- `}if(e.family==="unit"){let n=this._bucketWithPreserve(this._objects?.units??null,"unit",e.index??0);return a`
+ `}if(e.family==="unit"){let i=this._bucketWithPreserve(this._objects?.units??null,"unit",e.index??0);return o`
Unit
- {let o=parseInt(r.target.value,10);t(v({...e,index:o}))}}>
- ${n.map(r=>a`
+ {let s=parseInt(r.target.value,10);t(v({...e,index:s}))}}>
+ ${i.map(r=>o`
#${r.index} ${r.name}
@@ -453,15 +453,15 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Is
- {let o=r.target.value==="1";t(v({...e,active:o}))}}>
+ {let s=r.target.value==="1";t(v({...e,active:s}))}}>
ON
OFF
- `}if(e.family==="sec"){let n=this._bucketWithPreserve(this._objects?.areas??null,"area",e.index??0);return a`
+ `}if(e.family==="sec"){let i=this._bucketWithPreserve(this._objects?.areas??null,"area",e.index??0);return o`
Area
- {let o=parseInt(r.target.value,10);t(v({...e,index:o}))}}>
- ${n.map(r=>a`
+ {let s=parseInt(r.target.value,10);t(v({...e,index:s}))}}>
+ ${i.map(r=>o`
#${r.index} ${r.name}
@@ -471,41 +471,41 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Mode
- {let o=parseInt(r.target.value,10);t(v({...e,mode:o}))}}>
- ${ge.map(r=>a`
+ {let s=parseInt(r.target.value,10);t(v({...e,mode:s}))}}>
+ ${fe.map(r=>o`
${r.label}
`)}
- `}return e.family==="time"?a`
+ `}return e.family==="time"?o`
Time clock # (1..3)
{let r=parseInt(n.target.value,10);Number.isFinite(r)&&t(v({...e,index:r}))}}
+ @input=${i=>{let r=parseInt(i.target.value,10);Number.isFinite(r)&&t(v({...e,index:r}))}}
/>
Is
- {let r=n.target.value==="1";t(v({...e,active:r}))}}>
+ {let r=i.target.value==="1";t(v({...e,active:r}))}}>
enabled
disabled
- `:a`
+ `:o`
Condition
- {let r=parseInt(n.target.value,10);t(v({family:"misc",misc:r}))}}>
- ${fe.map(n=>a`
-
- ${n.label}
+ {let r=parseInt(i.target.value,10);t(v({family:"misc",misc:r}))}}>
+ ${ge.map(i=>o`
+
+ ${i.label}
`)}
- `}_renderChainEditor(e){let t=this._chainDraft;return a`
+ `}_renderChainEditor(e){let t=this._chainDraft;return o`
@@ -534,14 +534,14 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Cancel
- ${this._writeFeedback?a`
+ ${this._writeFeedback?o`
${this._writeFeedback} `:""}
- `}_renderChainHeadSection(e){return e.prog_type===je?this._renderEventTriggerChain(e):e.prog_type===Ue?this._renderTimedTriggerChain(e):e.prog_type===Ye?this._renderEveryTriggerChain(e):a`
+ `}_renderChainHeadSection(e){return e.prog_type===We?this._renderEventTriggerChain(e):e.prog_type===Ve?this._renderTimedTriggerChain(e):e.prog_type===qe?this._renderEveryTriggerChain(e):o`
Editing trigger type ${e.prog_type} (chain head) is not supported.
-
`}_renderTimedTriggerChain(e){return a`
+
`}_renderTimedTriggerChain(e){return o`
AT (trigger)
@@ -562,45 +562,45 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
- ${de.map(t=>{let n=((e.days??0)&t.bit)!==0;return a`
+ ${de.map(t=>{let i=((e.days??0)&t.bit)!==0;return o`
this._patchChainHead({days:(e.days??0)^t.bit})}
>${t.label} `})}
- `}_renderEventTriggerChain(e){let t=(e.month??0)<<8|(e.day??0),n=T(t),r=o=>{let c=me(o);this._patchChainHead({month:c>>8&255,day:c&255})};return a`
+ `}_renderEventTriggerChain(e){let t=(e.month??0)<<8|(e.day??0),i=T(t),r=s=>{let c=me(s);this._patchChainHead({month:c>>8&255,day:c&255})};return o`
WHEN (trigger event)
Category
- {let c=o.target.value;if(c==="button"){let l=this._objects?.buttons?.[0]?.index??1;r({category:"button",button:l})}else if(c==="zone"){let l=this._objects?.zones?.[0]?.index??1;r({category:"zone",zone:l,zoneState:1})}else if(c==="unit"){let l=this._objects?.units?.[0]?.index??1;r({category:"unit",unit:l,unitOn:!0})}else c==="fixed"&&r({category:"fixed",fixedId:772})}}>
- Button press
- Zone state change
- Unit state change
- Fixed (phone / AC)
- ${n.category==="raw"?a`
+ {let c=s.target.value;if(c==="button"){let l=this._objects?.buttons?.[0]?.index??1;r({category:"button",button:l})}else if(c==="zone"){let l=this._objects?.zones?.[0]?.index??1;r({category:"zone",zone:l,zoneState:1})}else if(c==="unit"){let l=this._objects?.units?.[0]?.index??1;r({category:"unit",unit:l,unitOn:!0})}else c==="fixed"&&r({category:"fixed",fixedId:772})}}>
+ Button press
+ Zone state change
+ Unit state change
+ Fixed (phone / AC)
+ ${i.category==="raw"?o`
Raw 0x${t.toString(16).padStart(4,"0")} `:""}
- ${this._renderChainEventSubfields(n,r)}
+ ${this._renderChainEventSubfields(i,r)}
- `}_renderChainEventSubfields(e,t){if(e.category==="button"){let n=this._bucketWithPreserve(this._objects?.buttons??null,"button",e.button??0);return a`
+ `}_renderChainEventSubfields(e,t){if(e.category==="button"){let i=this._bucketWithPreserve(this._objects?.buttons??null,"button",e.button??0);return o`
Button
t({category:"button",button:parseInt(r.target.value,10)})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
`)}
- `}if(e.category==="zone"){let n=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.zone??0);return a`
+ `}if(e.category==="zone"){let i=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.zone??0);return o`
Zone
t({...e,category:"zone",zone:parseInt(r.target.value,10),zoneState:e.zoneState??1})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
@@ -616,11 +616,11 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
trouble
tamper
- `}if(e.category==="unit"){let n=this._bucketWithPreserve(this._objects?.units??null,"unit",e.unit??0);return a`
+ `}if(e.category==="unit"){let i=this._bucketWithPreserve(this._objects?.units??null,"unit",e.unit??0);return o`
Unit
t({...e,category:"unit",unit:parseInt(r.target.value,10),unitOn:e.unitOn??!0})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
@@ -634,29 +634,29 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
ON
OFF
- `}return e.category==="fixed"?a`
+ `}return e.category==="fixed"?o`
Event
- t({category:"fixed",fixedId:parseInt(n.target.value,10)})}>
- ${Z.map(n=>a`
-
- ${n.label}
+ t({category:"fixed",fixedId:parseInt(i.target.value,10)})}>
+ ${Z.map(i=>o`
+
+ ${i.label}
`)}
- `:a`Unrecognised event ID. Pick a category to redefine.
`}_renderEveryTriggerChain(e){let t=((e.cond??0)&255)<<8|(e.cond2??0)>>8&255;return a`
+ `:o`Unrecognised event ID. Pick a category to redefine.
`}_renderEveryTriggerChain(e){let t=((e.cond??0)&255)<<8|(e.cond2??0)>>8&255;return o`
EVERY (interval, seconds)
Seconds between fires
{let r=parseInt(n.target.value,10);!Number.isFinite(r)||r<1||this._patchChainHead({cond:r>>8&255,cond2:(r&255)<<8})}}
+ @input=${i=>{let r=parseInt(i.target.value,10);!Number.isFinite(r)||r<1||this._patchChainHead({cond:r>>8&255,cond2:(r&255)<<8})}}
/>
- `}_renderChainConditionsSection(e){return a`
+ `}_renderChainConditionsSection(e){return o`
Conditions (${e.length})
@@ -667,36 +667,98 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
+ OR IF
- ${e.length===0?a`
+ ${e.length===0?o`
No conditions — chain fires unconditionally when triggered.
`:""}
- ${e.map((t,n)=>this._renderChainConditionRow(t,n))}
+ ${e.map((t,i)=>this._renderChainConditionRow(t,i))}
- `}_renderChainConditionRow(e,t){let n=e.prog_type===be;if(We(e))return a`
-
-
- ${n?"OR IF":"AND IF"} (structured comparison — read-only)
- this._removeChainCondition(t)}>×
-
-
- This condition uses a structured comparison (TEMP > N etc.).
- Editing structured-OP records is not yet supported; it's
- preserved on save.
-
-
`;let r=Be(e);return a`
+ `}_renderChainConditionRow(e,t){let i=e.prog_type===be;if(Ze(e))return this._renderStructuredChainConditionRow(e,t,i);let r=Ge(e);return o`
${this._renderChainCondFamily(r,t)}
-
`}_renderChainCondFamily(e,t){let n=o=>{let c=this._objects?.zones?.[0]?.index??1,l=this._objects?.units?.[0]?.index??1,u=this._objects?.areas?.[0]?.index??1,p;switch(o){case"none":p={family:"none"};break;case"misc":p={family:"misc",misc:1};break;case"zone":p={family:"zone",index:c,active:!1};break;case"unit":p={family:"unit",index:l,active:!0};break;case"time":p={family:"time",index:1,active:!0};break;case"sec":p={family:"sec",index:u,mode:0};break}let d=ve(p);this._patchChainCondition(t,d)},r=o=>{this._patchChainCondition(t,ve(o))};return a`
+ `}_renderStructuredChainConditionRow(e,t,i){let r=Qe(e);return tt(r)?o`
+
+
+ ${this._renderStructuredAndForm(r,t)}
+
`:o`
+
+
+
+ Structured comparison with a shape the editor can't drive
+ yet (Arg2 references another object, Arg1 is an unsupported
+ type, or a CompConst value is present). Preserved on save.
+
+
`}_renderStructuredAndForm(e,t){let i=l=>{let d={...e,...l};d.arg2Type=0,d.arg2Field=0,this._patchChainCondition(t,et(d))},r=Ee[e.arg1Type]??[],s=xe(e.arg1Type),c=!ye(e.op);return o`
+
+
+ Arg1 type
+ {let d=parseInt(l.target.value,10),p=(Ee[d]??[{value:0}])[0].value,u=xe(d),f=0;u==="zone"?f=this._objects?.zones?.[0]?.index??1:u==="unit"?f=this._objects?.units?.[0]?.index??1:u==="thermostat"?f=this._objects?.thermostats?.[0]?.index??1:u==="area"&&(f=this._objects?.areas?.[0]?.index??1),i({arg1Type:d,arg1Ix:f,arg1Field:p})}}>
+ ${$e.filter(l=>l.value!==0).map(l=>o`
+
+ ${l.label}
+ `)}
+
+
+
+ ${s?this._renderStructuredArg1Picker(e,s,i):""}
+
+ ${r.length>0?o`
+
+ Field
+ i({arg1Field:parseInt(l.target.value,10)})}>
+ ${r.map(l=>o`
+
+ ${l.label}
+ `)}
+
+ `:""}
+
+
+ Operator
+ i({op:parseInt(l.target.value,10)})}>
+ ${Xe.map(l=>o`
+
+ ${l.label}
+ `)}
+
+
+
+ ${c?o`
+
+ Compare against (constant)
+ {let d=parseInt(l.target.value,10);Number.isFinite(d)&&d>=0&&d<=65535&&i({arg2Ix:d})}}
+ />
+ `:""}
+
`}_renderStructuredArg1Picker(e,t,i){let r=this._bucketWithPreserve(this._pickBucket(t),t,e.arg1Ix),s=t[0].toUpperCase()+t.slice(1);return o`
+
+ ${s}
+ i({arg1Ix:parseInt(c.target.value,10)})}>
+ ${r.map(c=>o`
+
+ #${c.index} ${c.name}
+ `)}
+
+ `}_renderChainCondFamily(e,t){let i=s=>{let c=this._objects?.zones?.[0]?.index??1,l=this._objects?.units?.[0]?.index??1,d=this._objects?.areas?.[0]?.index??1,p;switch(s){case"none":p={family:"none"};break;case"misc":p={family:"misc",misc:1};break;case"zone":p={family:"zone",index:c,active:!1};break;case"unit":p={family:"unit",index:l,active:!0};break;case"time":p={family:"time",index:1,active:!0};break;case"sec":p={family:"sec",index:d,mode:0};break}let u=ve(p);this._patchChainCondition(t,u)},r=s=>{this._patchChainCondition(t,ve(s))};return o`
Family
- n(o.target.value)}>
+ i(s.target.value)}>
Zone state
Unit state
Area in security mode
@@ -705,11 +767,11 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
${this._renderChainCondSubfields(e,r)}
- `}_renderChainCondSubfields(e,t){if(e.family==="zone"){let n=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.index??0);return a`
+ `}_renderChainCondSubfields(e,t){if(e.family==="zone"){let i=this._bucketWithPreserve(this._objects?.zones??null,"zone",e.index??0);return o`
Zone
t({...e,index:parseInt(r.target.value,10)})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
`)}
@@ -721,11 +783,11 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
secure
not ready
- `}if(e.family==="unit"){let n=this._bucketWithPreserve(this._objects?.units??null,"unit",e.index??0);return a`
+ `}if(e.family==="unit"){let i=this._bucketWithPreserve(this._objects?.units??null,"unit",e.index??0);return o`
Unit
t({...e,index:parseInt(r.target.value,10)})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
`)}
@@ -737,11 +799,11 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
ON
OFF
- `}if(e.family==="sec"){let n=this._bucketWithPreserve(this._objects?.areas??null,"area",e.index??0);return a`
+ `}if(e.family==="sec"){let i=this._bucketWithPreserve(this._objects?.areas??null,"area",e.index??0);return o`
Area
t({...e,index:parseInt(r.target.value,10)})}>
- ${n.map(r=>a`
+ ${i.map(r=>o`
#${r.index} ${r.name}
`)}
@@ -750,76 +812,76 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
Mode
t({...e,mode:parseInt(r.target.value,10)})}>
- ${ge.map(r=>a`
+ ${fe.map(r=>o`
${r.label}
`)}
- `}return e.family==="time"?a`
+ `}return e.family==="time"?o`
Time clock # (1..3)
{let r=parseInt(n.target.value,10);Number.isFinite(r)&&t({...e,index:r})}}
+ @input=${i=>{let r=parseInt(i.target.value,10);Number.isFinite(r)&&t({...e,index:r})}}
/>
Is
- t({...e,active:n.target.value==="1"})}>
+ t({...e,active:i.target.value==="1"})}>
enabled
disabled
- `:a`
+ `:o`
Condition
- t({family:"misc",misc:parseInt(n.target.value,10)})}>
- ${fe.map(n=>a`
-
- ${n.label}
+ t({family:"misc",misc:parseInt(i.target.value,10)})}>
+ ${ge.map(i=>o`
+
+ ${i.label}
`)}
- `}_renderChainActionsSection(e){return a`
+ `}_renderChainActionsSection(e){return o`
Actions (${e.length})
this._addChainAction()}>+ THEN
- ${e.map((t,n)=>this._renderChainActionRow(t,n,e.length))}
+ ${e.map((t,i)=>this._renderChainActionRow(t,i,e.length))}
- `}_renderChainActionRow(e,t,n){let r=H(e.cmd??0),o=r?.ref_kind?this._bucketWithPreserve(this._pickBucket(r.ref_kind),r.ref_kind,e.pr2??0):null,c=e.cmd===9;return a`
+ `}_renderChainActionRow(e,t,i){let r=N(e.cmd??0),s=r?.ref_kind?this._bucketWithPreserve(this._pickBucket(r.ref_kind),r.ref_kind,e.pr2??0):null,c=e.cmd===9;return o`
Command
- {let u=parseInt(l.target.value,10),p=H(u),d=e.pr2??0;if(p?.ref_kind&&this._objects){let b=this._pickBucket(p.ref_kind);b&&b.length>0&&!b.some(_=>_.index===d)&&(d=b[0].index)}else p?.ref_kind||(d=0);this._patchChainAction(t,{cmd:u,pr2:d})}}>
- ${G.map(l=>a`
+ {let d=parseInt(l.target.value,10),p=N(d),u=e.pr2??0;if(p?.ref_kind&&this._objects){let f=this._pickBucket(p.ref_kind);f&&f.length>0&&!f.some(_=>_.index===u)&&(u=f[0].index)}else p?.ref_kind||(u=0);this._patchChainAction(t,{cmd:d,pr2:u})}}>
+ ${G.map(l=>o`
${l.label}
`)}
- ${r?.ref_kind?a`
+ ${r?.ref_kind?o`
${r.ref_kind[0].toUpperCase()+r.ref_kind.slice(1)}
- {let u=parseInt(l.target.value,10);Number.isFinite(u)&&this._patchChainAction(t,{pr2:u})}}>
- ${(o??[]).map(l=>a`
+ {let d=parseInt(l.target.value,10);Number.isFinite(d)&&this._patchChainAction(t,{pr2:d})}}>
+ ${(s??[]).map(l=>o`
#${l.index} ${l.name}
`)}
`:""}
- ${c?a`
+ ${c?o`
Level (0..100)
{let u=parseInt(l.target.value,10);Number.isFinite(u)&&u>=0&&u<=100&&this._patchChainAction(t,{par:u})}}
+ @input=${l=>{let d=parseInt(l.target.value,10);Number.isFinite(d)&&d>=0&&d<=100&&this._patchChainAction(t,{par:d})}}
/>
`:""}
@@ -1188,7 +1250,30 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
border-color: var(--error-color, #db4437);
}
.structured-cond {
- background: rgba(255, 152, 0, 0.08); /* subtle warning tint */
+ background: rgba(255, 152, 0, 0.08); /* subtle structured tint */
+ }
+ .structured-row {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 6px;
+ }
+ .structured-tag, .readonly-tag {
+ display: inline-block;
+ margin-left: 6px;
+ padding: 1px 6px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ border-radius: 3px;
+ }
+ .structured-tag {
+ background: rgba(255, 152, 0, 0.18);
+ color: #b35a00;
+ }
+ .readonly-tag {
+ background: var(--secondary-background-color, #eee);
+ color: var(--secondary-text-color, #888);
}
.chain-meta {
margin-top: 8px;
@@ -1198,7 +1283,7 @@ var Ze=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var m=(s,i,e
background: var(--secondary-background-color, #f5f5f5);
border-radius: 4px;
}
- `,m([N({attribute:!1})],h.prototype,"hass",2),m([N({attribute:!1})],h.prototype,"narrow",2),m([f()],h.prototype,"_entryId",2),m([f()],h.prototype,"_rows",2),m([f()],h.prototype,"_total",2),m([f()],h.prototype,"_filteredTotal",2),m([f()],h.prototype,"_loading",2),m([f()],h.prototype,"_error",2),m([f()],h.prototype,"_activeTriggerTypes",2),m([f()],h.prototype,"_referenceFilter",2),m([f()],h.prototype,"_searchTerm",2),m([f()],h.prototype,"_selectedSlot",2),m([f()],h.prototype,"_detail",2),m([f()],h.prototype,"_detailLoading",2),m([f()],h.prototype,"_fireFeedback",2),m([f()],h.prototype,"_writeFeedback",2),m([f()],h.prototype,"_cloneTargetSlot",2),m([f()],h.prototype,"_showCloneInput",2),m([f()],h.prototype,"_confirmingClear",2),m([f()],h.prototype,"_editingDraft",2),m([f()],h.prototype,"_objects",2),m([f()],h.prototype,"_chainDraft",2),h=m([Oe("omni-panel-programs")],h);export{h as OmniPanelPrograms};
+ `,m([H({attribute:!1})],h.prototype,"hass",2),m([H({attribute:!1})],h.prototype,"narrow",2),m([g()],h.prototype,"_entryId",2),m([g()],h.prototype,"_rows",2),m([g()],h.prototype,"_total",2),m([g()],h.prototype,"_filteredTotal",2),m([g()],h.prototype,"_loading",2),m([g()],h.prototype,"_error",2),m([g()],h.prototype,"_activeTriggerTypes",2),m([g()],h.prototype,"_referenceFilter",2),m([g()],h.prototype,"_searchTerm",2),m([g()],h.prototype,"_selectedSlot",2),m([g()],h.prototype,"_detail",2),m([g()],h.prototype,"_detailLoading",2),m([g()],h.prototype,"_fireFeedback",2),m([g()],h.prototype,"_writeFeedback",2),m([g()],h.prototype,"_cloneTargetSlot",2),m([g()],h.prototype,"_showCloneInput",2),m([g()],h.prototype,"_confirmingClear",2),m([g()],h.prototype,"_editingDraft",2),m([g()],h.prototype,"_objects",2),m([g()],h.prototype,"_chainDraft",2),h=m([je("omni-panel-programs")],h);export{h as OmniPanelPrograms};
/*! Bundled license information:
@lit/reactive-element/css-tag.js:
diff --git a/dev/artifacts/screenshots/2026-05-16/12-structured-and.png b/dev/artifacts/screenshots/2026-05-16/12-structured-and.png
new file mode 100644
index 0000000..d67014e
Binary files /dev/null and b/dev/artifacts/screenshots/2026-05-16/12-structured-and.png differ