Docs

Input types

Every preference input type, how it hydrates, and the input / section / page definition fields.

Types

Types marked as hydrated become globalThis.<key> bindings before each handler runs; the others are only reachable through settings. default is a form default — it is never applied at hydration, so code must handle undefined.

TypeHydrated asNotes
stringstringSingle-line text.
numbernumber literalNumeric value; honours minValue / maxValue / unit.
booleanboolean literalOn/off toggle.
enumstringOne of options; renders as a dropdown or tiles (widget).
datestringCalendar date as an ISO string.
objectnot hydrated (read from settings)Nested object; reachable only through settings.
arrayJSON array (rows are plain objects)Repeating rows described by itemSchema.
textstringMulti-line text.
passwordstringMasked text; stored as a plain string.
emailstringEmail address; validated on submit.
timestringTime of day as HH:mm.
entityEntityWrapper (one pick) or a Proxy array of EntityWrappers (2+ picks, fans every service call out to all members)Device picker; narrowed with domainFilter / deviceClassFilter; multiple allows several.
domainnot hydrated (read from settings)Entity-domain picker (e.g. light).
modenot hydrated (read from settings)Location mode picker.
hubnot hydrated (read from settings)Hub picker.
appnot hydrated (read from settings)Child smart-app picker (childRef names the child definition).
accountUserEmailnot hydrated (read from settings)Account user, stored as their email.
accountUserPhonenot hydrated (read from settings)Account user, stored as their phone number.
accountUserIdnot hydrated (read from settings)Account user, stored as their user id.
thermostatScheduleJSON array (rows are plain objects)Weekly 7×24 schedule grid; stored like array.

Input definition

Fields of an entry in a page's inputs (or a section's).

FieldTypeOptionalDescription
keystringno—
labelstringno—
typeDataTypeno—
requiredbooleanyes—
defaultunknownyes—
descriptionstringyes—
optionsEnumOption[]yes—
visibleConditionyes—
submitOnChangebooleanyes—
multiplebooleanyes—
minValuenumberyes—
maxValuenumberyes—
unitstringyesCanonical unit of a numeric value (e.g. '°C'). User clients render the input in the location display unit and convert display↔canonical; the admin SPA renders canonical units.
unitFromEntitystringyes—
domainFilterstringyesEntity-picker filters. The hub normalizes legacy filter: { domain, deviceClass } from smart-app source into these two scalars.
deviceClassFilterstringyes—
placeholderstringyes—
readonlybooleanyes—
itemSchema{ inputs: ClientInputDefinition[] }yes—
minItemsnumberyes—
maxItemsnumberyes—
itemSummaryKeysstring[]yesUI hint: item-field keys (in order) shown in a collapsed array row's one-line summary. When omitted, the summary is derived from filled fields.
childRef{ namespace: string; name: string }yes'app'-type input. Points at a sibling smart-app definition by (namespace, name). The client renders the input as a list of currently- installed children of the calling parent matching this ref + an "Add new" button that opens a child install dialog.
filterOptionsByEntityDomainstringyesPer-row option filter for enum inputs inside an array's itemSchema. When set, the array editor filters this input's options per row to entries whose value starts with <domain>. where <domain> is the entity-domain of the sibling input named here. No-op for inputs at the top level (not inside an array).
requiresEntityFeature{ siblingKey: string; domain?: string | string[]; // Inverse of 'domain': hide when the sibling entity's domain matches // any of these. Useful when "show for everything except SENSOR" is // easier than listing every typed-state domain. domainNotEquals?: string | string[]; featureBit?: number; colorMode?: string; }yesPer-row visibility gate. The array editor hides this input unless the sibling input identified by siblingKey resolves to an entity that satisfies every constraint set. See FormEngine.InputDefinition for the full semantics; mirrored here verbatim.
requiresSiblingOneOf{ siblingKey: string; values: string[] }yesSimpler sibling-value gate. Input is hidden unless the named sibling's value appears in values. Composes (AND) with requiresEntityFeature when both are set.
filterOptionsBySiblingPrefixstringyesFilter this enum's options by sibling's raw value used as a prefix with a trailing dot (option.value.startsWith(${sibling}.)).
domainFilterFromstringyesFor entity inputs inside an array, pull the entity-domain filter from the named sibling's value at render time rather than the static domainFilter field.
widget'dropdown' | 'tiles' | 'textarea'yesRender-style hint. 'tiles' switches an enum's dropdown for a card grid with title + description. 'textarea' switches a string input for a multi-line text area. Anything else uses the type's default renderer.

Section definition

FieldTypeOptionalDescription
idstringno—
titlestringyes—
inputsClientInputDefinition[]no—
visibleConditionyes—

Page definition

FieldTypeOptionalDescription
idstringno—
titlestringno—
descriptionstringyesPage-level banner text shown above the inputs. Used by integrations like the LAN-discovery wizards for an intro page explaining what's about to happen ("Novon will scan your LAN for ..."). Optional — most pages omit it.
loadingDescriptionstringyesClient-facing loading text rendered as the spinner caption WHILE the engine is transitioning TO this page and the hub is running a prepareSchemaForPage hook. Used by the picker page of LAN-discovery wizards ("Scanning your LAN for ..."). The caller reads this BEFORE submitting, so it knows the message immediately.
inputsClientInputDefinition[]yes—
sectionsClientSectionDefinition[]yes—
visibleConditionyes—

Conditions

visible on inputs and sections takes a condition. Operators: equals, notEquals, greaterThan, lessThan, greaterThanOrEqual, lessThanOrEqual, contains, in, truthy, falsy.

export interface SimpleCondition {
  input: string;
  operator: ConditionOperator;
  value?: unknown;
}

export interface CompoundCondition {
  and?: Condition[];
  or?: Condition[];
}
Generated from docs-bundle v0.1.0, novon-platform 9ce3486c (2026-10-09).

On this page