mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2026-02-23 13:02:14 +01:00
1 line
29 KiB
JSON
1 line
29 KiB
JSON
{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Overview","text":"<p>This documentation covers the standalone rewrite located in <code>nspanel-lovelace-ui/</code>.</p> <p>It is a Python backend that:</p> <ul> <li>receives panel input (MQTT mode or Home Assistant API mode)</li> <li>reads Home Assistant state through the websocket API</li> <li>renders cards and screensaver pages</li> <li>sends panel commands back to the device</li> </ul> <p>This docs set is intentionally separate from the AppDaemon docs in <code>docs/</code>.</p>","path":["Overview"],"tags":[]},{"location":"#rewrite-location","level":2,"title":"Rewrite location","text":"<ul> <li>Add-on package: <code>nspanel-lovelace-ui/</code></li> <li>Runtime code: <code>nspanel-lovelace-ui/rootfs/usr/bin/mqtt-manager/</code></li> <li>Example panel config: <code>nspanel-lovelace-ui/rootfs/usr/bin/mqtt-manager/panels.yaml.example</code></li> </ul>","path":["Overview"],"tags":[]},{"location":"#what-is-supported","level":2,"title":"What is supported","text":"<ul> <li><code>cardEntities</code></li> <li><code>cardGrid</code> (auto-switches to <code>cardGrid2</code> when needed)</li> <li><code>cardQR</code></li> <li><code>cardPower</code></li> <li><code>cardMedia</code></li> <li><code>cardThermo</code></li> <li><code>cardAlarm</code></li> <li><code>cardUnlock</code></li> <li>screensaver with status icons and weather forecast entities</li> </ul>","path":["Overview"],"tags":[]},{"location":"#runtime-model","level":2,"title":"Runtime model","text":"<ol> <li>Load <code>panels.yaml</code>.</li> <li>Resolve MQTT and Home Assistant connection settings.</li> <li>Create one thread per panel.</li> <li>Listen for events and state changes.</li> <li>Re-render active pages and detail popups when relevant entities change.</li> </ol>","path":["Overview"],"tags":[]},{"location":"cards/","level":1,"title":"Cards","text":"","path":["Cards"],"tags":[]},{"location":"cards/#supported-card-types","level":2,"title":"Supported card types","text":"<ul> <li><code>cardEntities</code></li> <li><code>cardGrid</code></li> <li><code>cardQR</code></li> <li><code>cardPower</code></li> <li><code>cardMedia</code></li> <li><code>cardThermo</code></li> <li><code>cardAlarm</code></li> <li><code>cardUnlock</code></li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#common-card-keys","level":2,"title":"Common card keys","text":"key required type description <code>type</code> yes string Card type. <code>title</code> no string Card title. <code>key</code> no string Navigation key used by <code>navigate.<key></code>.","path":["Cards"],"tags":[]},{"location":"cards/#cardentities-and-cardgrid","level":2,"title":"<code>cardEntities</code> and <code>cardGrid</code>","text":"<pre><code>- type: cardEntities\n title: Main\n key: main\n entities:\n - entity: light.kitchen\n - entity: navigate.settings\n icon: mdi:cog\n</code></pre> <ul> <li><code>entities</code> is required.</li> <li><code>cardGrid</code> auto-switches to <code>cardGrid2</code> if more than 6 entities are present.</li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardqr","level":2,"title":"<code>cardQR</code>","text":"<pre><code>- type: cardQR\n title: Guest WiFi\n qrCode: \"WIFI:S:myssid;T:WPA;P:mypassword;;\"\n entities:\n - entity: iText.myssid\n name: SSID\n icon: mdi:wifi\n</code></pre> <p>Keys:</p> <ul> <li><code>qrCode</code> optional (default value exists, but set it explicitly)</li> <li>supports optional <code>entity</code> / <code>entities</code></li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardpower","level":2,"title":"<code>cardPower</code>","text":"<pre><code>- type: cardPower\n title: Energy\n entities:\n - entity: sensor.house_power\n - entity: delete\n - entity: sensor.solar_power\n</code></pre> <p>Notes:</p> <ul> <li><code>entities</code> is required.</li> <li><code>speed</code> key is accepted in config but currently not applied by the renderer.</li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardmedia","level":2,"title":"<code>cardMedia</code>","text":"<pre><code>- type: cardMedia\n title: Living Room\n entity: media_player.living_room\n entities:\n - entity: light.ambient\n - entity: switch.tv_bias_light\n</code></pre> <p>Notes:</p> <ul> <li>Main media entity must exist (<code>entity</code> or first generated entity).</li> <li>Additional <code>entities</code> are rendered as action buttons on the bottom row.</li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardthermo","level":2,"title":"<code>cardThermo</code>","text":"<pre><code>- type: cardThermo\n title: Heating\n entity: climate.downstairs\n supported_modes: [\"heat\", \"off\"]\n</code></pre> <p>Keys:</p> <ul> <li><code>entity</code> required</li> <li><code>supported_modes</code> optional (filters shown HVAC mode buttons)</li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardalarm","level":2,"title":"<code>cardAlarm</code>","text":"<pre><code>- type: cardAlarm\n title: House Alarm\n entity: alarm_control_panel.house\n supported_modes: [\"arm_home\", \"arm_away\", \"arm_night\"]\n</code></pre> <p>Keys:</p> <ul> <li><code>entity</code> required</li> <li><code>supported_modes</code> optional</li> </ul>","path":["Cards"],"tags":[]},{"location":"cards/#cardunlock","level":2,"title":"<code>cardUnlock</code>","text":"<pre><code>- type: cardUnlock\n title: Admin\n pin: 1234\n destination: navigate.admin\n</code></pre> <p>Keys:</p> <ul> <li><code>pin</code> required</li> <li><code>destination</code> required</li> </ul> <p>Typical target in <code>hiddenCards</code>:</p> <pre><code>hiddenCards:\n - type: cardGrid\n key: admin\n title: Admin\n entities:\n - entity: switch.maintenance_mode\n</code></pre>","path":["Cards"],"tags":[]},{"location":"configuration/","level":1,"title":"Configuration","text":"<p>The runtime reads one YAML file (default: <code>./panels.yaml</code>, add-on mode: <code>/config/panels.yaml</code>).</p>","path":["Configuration"],"tags":[]},{"location":"configuration/#top-level-keys","level":2,"title":"Top-level keys","text":"key required type default description <code>nspanels</code> yes object none Map of panel definitions. <code>home_assistant_address</code> recommended string none Home Assistant base URL. In add-on mode it is auto-filled as <code>http://supervisor</code> if missing. <code>home_assistant_token</code> recommended string none Long-lived token or Supervisor token. <code>mqtt_server</code> required in MQTT mode string from env MQTT host. <code>mqtt_port</code> required in MQTT mode int from env MQTT port. <code>mqtt_username</code> required in MQTT mode string from env MQTT username. <code>mqtt_password</code> required in MQTT mode string from env MQTT password. <code>use_ha_api</code> optional any absent If present, MQTT input mode is disabled and HA event mode is used. <code>timeZone</code> optional string <code>Europe/Berlin</code> Global fallback for panel <code>timeZone</code>. <code>hiddenCards</code> optional list <code>[]</code> Global fallback for panel <code>hiddenCards</code>.","path":["Configuration"],"tags":[]},{"location":"configuration/#panel-keys-nspanelsname","level":2,"title":"Panel keys (<code>nspanels.<name></code>)","text":"key required type default description <code>panelRecvTopic</code> yes string none Receive channel for panel events. <code>panelSendTopic</code> yes string none Send channel for panel commands. <code>locale</code> yes string none Locale used for translations and date formatting. <code>timeZone</code> recommended string from top-level <code>timeZone</code> Time zone for clock. <code>timeFormat</code> yes string none Python <code>strftime</code> format. <code>dateFormat</code> yes string none Babel date format (example: <code>full</code>, <code>medium</code>). <code>model</code> optional string <code>eu</code> Panel model (<code>eu</code>, <code>us-p</code>, <code>us-l</code>). <code>temp_unit</code> optional string <code>celsius</code> Thermostat card unit (<code>celsius</code> or <code>fahrenheit</code>). <code>sleepTimeout</code> optional int <code>20</code> Seconds before screensaver. <code>sleepBrightness</code> optional int or entity_id <code>10</code> Screensaver brightness. <code>screenBrightness</code> optional int or entity_id <code>100</code> Active-screen brightness. <code>sleepTracking</code> optional entity_id none Forces sleep brightness to 0 when entity state matches <code>sleepTrackingZones</code>. <code>sleepTrackingZones</code> optional list <code>[\"not_home\", \"off\"]</code> States that trigger forced dimming. <code>sleepOverride</code> optional object none Override sleep brightness when entity is <code>on</code>/<code>true</code>/<code>home</code>. <code>defaultBackgroundColor</code> optional string <code>ha-dark</code> <code>ha-dark</code> or <code>black</code>. <code>featExperimentalSliders</code> optional int <code>0</code> Forwarded in dimmode command. <code>defaultCard</code> optional string none Default card when leaving screensaver (<code>navigate.<key></code>). <code>screensaver</code> yes object none Screensaver definition. <code>cards</code> yes list none Top-level cards. <code>hiddenCards</code> optional list <code>[]</code> Hidden cards addressable through <code>navigate.<key></code>.","path":["Configuration"],"tags":[]},{"location":"configuration/#brightness-behavior","level":2,"title":"Brightness behavior","text":"<ul> <li>Integer values are used directly.</li> <li>Entity values read Home Assistant state and cast to number.</li> <li>List/schedule style brightness is not supported in this rewrite.</li> </ul> <p>Example:</p> <pre><code>sleepBrightness: input_number.nspanel_sleep\nscreenBrightness: input_number.nspanel_awake\nsleepTracking: person.john\nsleepTrackingZones: [\"not_home\", \"off\"]\nsleepOverride:\n entity: light.bedroom\n brightness: 30\n</code></pre>","path":["Configuration"],"tags":[]},{"location":"connection-modes/","level":1,"title":"Connection Modes","text":"<p>The rewrite supports two panel input/output modes.</p>","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#1-mqtt-mode-default","level":2,"title":"1) MQTT mode (default)","text":"<p>Enabled when:</p> <ul> <li><code>mqtt_server</code> is configured</li> <li><code>use_ha_api</code> is not present</li> </ul> <p>Behavior:</p> <ul> <li>Subscribes to every panel <code>panelRecvTopic</code></li> <li>Expects JSON payload containing <code>CustomRecv</code></li> <li>Publishes commands to <code>panelSendTopic</code></li> </ul> <p>Example receive payload:</p> <pre><code>{\"CustomRecv\":\"event,startup,54,eu\"}\n</code></pre>","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#2-home-assistant-api-mode-use_ha_api","level":2,"title":"2) Home Assistant API mode (<code>use_ha_api</code>)","text":"<p>Enabled when key <code>use_ha_api</code> exists in config.</p> <p>Behavior:</p> <ul> <li>Subscribes to HA event <code>esphome.nspanel.data</code></li> <li>Routes events by <code>device_id</code> (must match configured <code>panelRecvTopic</code>)</li> <li>Sends panel commands by calling Home Assistant service:</li> <li><code><panelSendTopic>_nspanelui_api_call</code></li> </ul> <p>Service payload shape:</p> <pre><code>data: \"...panel command...\"\ncommand: 2\n</code></pre>","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#common-to-both-modes","level":2,"title":"Common to both modes","text":"<ul> <li>Home Assistant websocket connection is used for entity state cache and service calls.</li> <li>UI actions (button presses, sliders, mode selects) are translated to Home Assistant service calls.</li> </ul>","path":["Connection Modes"],"tags":[]},{"location":"entities/","level":1,"title":"Entities","text":"<p>Entities are used in cards and screensaver lists.</p>","path":["Entities"],"tags":[]},{"location":"entities/#entity-keys","level":2,"title":"Entity keys","text":"key required type description <code>entity</code> yes string Home Assistant entity id, or internal entity (<code>navigate.*</code>, <code>delete</code>, <code>iText.*</code>). <code>name</code> no string Display name override. <code>icon</code> no string or map Icon override (<code>mdi:*</code>), optionally per state. <code>color</code> no <code>[r,g,b]</code> or map Color override, optionally per state. <code>value</code> no string Value override. <code>font</code> no string Icon font variant (<code>small</code>, <code>medium</code>, <code>medium-icon</code>, <code>large</code>). <code>status</code> no string Extra status entity for <code>navigate.*</code> items. <code>effectList</code> no list Custom light effect list for detail popup. <code>attribute</code> no string Weather attribute to display. <code>day</code> no int Weather daily forecast index. <code>hour</code> no int Weather hourly forecast index. <code>unit</code> no string Value suffix.","path":["Entities"],"tags":[]},{"location":"entities/#supported-home-assistant-domains","level":2,"title":"Supported Home Assistant domains","text":"<ul> <li><code>switch</code></li> <li><code>input_boolean</code></li> <li><code>automation</code></li> <li><code>lock</code></li> <li><code>input_text</code></li> <li><code>input_select</code></li> <li><code>select</code></li> <li><code>light</code></li> <li><code>fan</code></li> <li><code>button</code></li> <li><code>input_button</code></li> <li><code>scene</code></li> <li><code>script</code></li> <li><code>number</code></li> <li><code>input_number</code></li> <li><code>timer</code></li> <li><code>alarm_control_panel</code></li> <li><code>vacuum</code></li> <li><code>media_player</code></li> <li><code>sun</code></li> <li><code>person</code></li> <li><code>climate</code></li> <li><code>cover</code></li> <li><code>sensor</code></li> <li><code>binary_sensor</code></li> <li><code>weather</code></li> </ul>","path":["Entities"],"tags":[]},{"location":"entities/#internal-entities","level":2,"title":"Internal entities","text":"<ul> <li><code>navigate.<key></code>: Navigate to card with matching <code>key</code>.</li> <li><code>navigate.UP</code>: Navigate back.</li> <li><code>delete</code>: Placeholder/empty slot.</li> <li><code>iText.<text></code>: Static text entry.</li> </ul>","path":["Entities"],"tags":[]},{"location":"entities/#template-based-values","level":2,"title":"Template-based values","text":"<p>The rewrite supports Home Assistant template rendering for selected fields when prefixed with <code>ha:</code>:</p> <ul> <li><code>icon: \"ha:{{ ... }}\"</code></li> <li><code>color: \"ha:{{ ... }}\"</code> (must evaluate to JSON RGB list)</li> <li><code>value: \"ha:{{ ... }}\"</code></li> <li><code>qrCode: \"ha:{{ ... }}\"</code></li> </ul> <p>Example:</p> <pre><code>- entity: light.kitchen\n icon:\n \"on\": mdi:lightbulb\n \"off\": mdi:lightbulb-outline\n color:\n \"on\": [255, 210, 90]\n \"off\": [80, 120, 170]\n</code></pre>","path":["Entities"],"tags":[]},{"location":"getting-started/","level":1,"title":"Getting Started","text":"","path":["Getting Started"],"tags":[]},{"location":"getting-started/#home-assistant-add-on-mode","level":2,"title":"Home Assistant add-on mode","text":"<p>In add-on mode, the container startup script:</p> <ul> <li>reads MQTT credentials from Home Assistant service discovery</li> <li>sets <code>CONFIG_FILE=/config/panels.yaml</code></li> <li>creates <code>/config/panels.yaml</code> from the bundled example if it does not exist</li> </ul> <p>Relevant files:</p> <ul> <li><code>nspanel-lovelace-ui/rootfs/usr/bin/mqtt-manager/run.sh</code></li> <li><code>nspanel-lovelace-ui/config.yaml</code></li> </ul>","path":["Getting Started"],"tags":[]},{"location":"getting-started/#minimal-panelsyaml","level":2,"title":"Minimal <code>panels.yaml</code>","text":"<p>Start with one panel:</p> <pre><code>home_assistant_address: \"http://supervisor\"\nhome_assistant_token: \"SUPERVISOR_TOKEN_OR_LONG_LIVED_TOKEN\"\n\nnspanels:\n kitchen:\n panelRecvTopic: \"tele/tasmota_kitchen/RESULT\"\n panelSendTopic: \"cmnd/tasmota_kitchen/CustomSend\"\n locale: \"en_US\"\n timeZone: \"Europe/Berlin\"\n timeFormat: \"%H:%M\"\n dateFormat: \"full\"\n screensaver:\n entities:\n - entity: weather.home\n cards:\n - type: cardEntities\n title: Main\n entities:\n - entity: light.kitchen\n - entity: switch.coffee_machine\n</code></pre>","path":["Getting Started"],"tags":[]},{"location":"getting-started/#important-notes","level":2,"title":"Important notes","text":"<ul> <li><code>cards</code> and <code>screensaver</code> are required per panel.</li> <li><code>timeFormat</code>, <code>dateFormat</code>, and <code>locale</code> should be set per panel.</li> <li><code>panelRecvTopic</code> / <code>panelSendTopic</code> are required.</li> </ul>","path":["Getting Started"],"tags":[]},{"location":"getting-started/#running-standalone-outside-ha-add-on","level":2,"title":"Running standalone (outside HA add-on)","text":"<p>If you run this container/process outside Supervisor:</p> <ul> <li>provide <code>home_assistant_address</code> and <code>home_assistant_token</code> in YAML</li> <li>provide MQTT values in YAML (<code>mqtt_server</code>, <code>mqtt_port</code>, <code>mqtt_username</code>, <code>mqtt_password</code>) or environment</li> <li>set <code>CONFIG_FILE</code> if the config is not <code>./panels.yaml</code></li> </ul>","path":["Getting Started"],"tags":[]},{"location":"migration-appdaemon/","level":1,"title":"Migration from AppDaemon Config","text":"<p>This page explains how to migrate panel configuration from the legacy AppDaemon <code>apps.yaml</code> format to the standalone rewrite <code>panels.yaml</code> format.</p>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#file-and-structure-changes","level":2,"title":"File and structure changes","text":"<p>Old (AppDaemon):</p> <ul> <li>panel config lived under <code>apps.yaml</code></li> <li>MQTT and Home Assistant base connection config was split across AppDaemon files (<code>appdaemon.yaml</code>, plugin config, and app config)</li> </ul> <p>New (rewrite):</p> <ul> <li>panel config lives in one file: <code>panels.yaml</code> (usually <code>/config/panels.yaml</code>)</li> <li>connection values are read from this file and/or environment variables</li> </ul>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#minimal-beforeafter-example","level":2,"title":"Minimal before/after example","text":"<p>Old AppDaemon (<code>apps.yaml</code>):</p> <pre><code>nspanel-1:\n module: nspanel-lovelace-ui\n class: NsPanelLovelaceUIManager\n config:\n panelRecvTopic: \"tele/tasmota_panel/RESULT\"\n panelSendTopic: \"cmnd/tasmota_panel/CustomSend\"\n model: eu\n locale: en_US\n timeFormat: \"%H:%M\"\n</code></pre> <p>New rewrite (<code>panels.yaml</code>):</p> <pre><code>home_assistant_address: \"http://supervisor\"\nhome_assistant_token: \"YOUR_TOKEN\"\n\nnspanels:\n panel-1:\n panelRecvTopic: \"tele/tasmota_panel/RESULT\"\n panelSendTopic: \"cmnd/tasmota_panel/CustomSend\"\n model: eu\n locale: en_US\n timeZone: \"Europe/Berlin\"\n timeFormat: \"%H:%M\"\n dateFormat: \"full\"\n screensaver:\n entities:\n - entity: weather.home\n cards:\n - type: cardEntities\n title: Main\n entities:\n - entity: light.kitchen\n</code></pre>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#key-mapping","level":2,"title":"Key mapping","text":"Legacy AppDaemon key or concept Standalone rewrite Notes <code>module</code>, <code>class</code>, <code>config</code> wrapper removed Rewrite uses <code>nspanels.<panel_name></code> directly. <code>panelRecvTopic</code> <code>panelRecvTopic</code> Same meaning. <code>panelSendTopic</code> <code>panelSendTopic</code> Same meaning. <code>model</code> <code>model</code> Same meaning (<code>eu</code>, <code>us-p</code>, <code>us-l</code>). <code>locale</code> <code>locale</code> Same meaning. <code>timeFormat</code> <code>timeFormat</code> Same meaning. <code>timezone</code> (legacy docs casing) <code>timeZone</code> Use exact camelCase <code>timeZone</code>. <code>dateFormatBabel</code> / <code>dateFormat</code> <code>dateFormat</code> Rewrite expects <code>dateFormat</code>. <code>cards</code> <code>cards</code> Same concept. <code>hiddenCards</code> <code>hiddenCards</code> Same concept. <code>screensaver</code> <code>screensaver</code> Same concept; some legacy theme options are not available. <code>defaultCard</code> under screensaver usage <code>defaultCard</code> (panel level) Use as panel-level key in rewrite. <code>temperatureUnit</code> (card-level legacy usage) <code>temp_unit</code> (panel level) Rewrite reads panel-level <code>temp_unit</code>. <code>sleepBrightness</code> list schedule not supported Rewrite supports integer or entity id, not list-based schedules. <code>screenBrightness</code> list schedule not supported Rewrite supports integer or entity id, not list-based schedules. <code>sleepTracking</code> <code>sleepTracking</code> Same concept. <code>sleepTrackingZones</code> <code>sleepTrackingZones</code> Same concept. <code>sleepOverride</code> <code>sleepOverride</code> Same concept. <code>updateMode</code> / OTA URL overrides (<code>displayURL-*</code>, <code>berryURL</code>) not supported Rewrite does not implement these legacy update keys. <code>theme</code>, <code>dateAdditionalTemplate</code>, <code>timeAdditionalTemplate</code> not supported Not implemented in rewrite config.","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#connection-config-differences","level":2,"title":"Connection config differences","text":"<p>In AppDaemon setups, MQTT and Home Assistant connectivity was mostly configured via AppDaemon plugin settings.</p> <p>In the rewrite, connectivity is resolved directly by the runtime:</p> <ul> <li>Home Assistant:</li> <li><code>home_assistant_address</code></li> <li><code>home_assistant_token</code></li> <li>MQTT (for MQTT mode):</li> <li><code>mqtt_server</code>, <code>mqtt_port</code>, <code>mqtt_username</code>, <code>mqtt_password</code></li> <li>Optional mode switch:</li> <li>set <code>use_ha_api</code> to use Home Assistant event mode instead of MQTT receive mode</li> </ul>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#entity-level-differences-to-watch","level":2,"title":"Entity-level differences to watch","text":"<p>Some legacy entity config fields are not implemented in the rewrite parser/renderer:</p> <ul> <li><code>state</code>, <code>state_not</code>, <code>state_template</code></li> <li>direct <code>service.*</code> action entries with custom <code>data</code></li> <li><code>action_name</code></li> </ul> <p>Supported and commonly used fields in rewrite:</p> <ul> <li><code>entity</code>, <code>name</code>, <code>icon</code>, <code>color</code>, <code>value</code>, <code>font</code></li> <li>weather-related: <code>attribute</code>, <code>day</code>, <code>hour</code>, <code>unit</code></li> <li>light detail helper: <code>effectList</code></li> <li>navigation helper: <code>status</code> for <code>navigate.*</code> entities</li> </ul>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#migration-checklist","level":2,"title":"Migration checklist","text":"<ol> <li>Create <code>/config/panels.yaml</code> from the rewrite example.</li> <li>Move each old app entry (<code>nspanel-1</code>, <code>nspanel-2</code>, ...) into <code>nspanels</code>.</li> <li>Remove <code>module/class/config</code> wrappers.</li> <li>Rename <code>timezone</code> to <code>timeZone</code>.</li> <li>Ensure each panel has <code>dateFormat</code>, <code>timeFormat</code>, <code>screensaver</code>, and <code>cards</code>.</li> <li>Replace unsupported scheduled brightness lists with integer/entity-based values.</li> <li>Remove unsupported legacy-only keys listed above.</li> </ol>","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"screensaver/","level":1,"title":"Screensaver","text":"<p><code>screensaver</code> is a required object in each panel config.</p>","path":["Screensaver"],"tags":[]},{"location":"screensaver/#keys","level":2,"title":"Keys","text":"key required type default description <code>type</code> no string <code>screensaver</code> Layout type (<code>screensaver</code> / <code>screensaver2</code>). <code>entities</code> yes* list none Screensaver entities. <code>entity</code> yes* string none Single-entity shortcut. <code>statusIcon1</code> no object none Left status icon near date. <code>statusIcon2</code> no object none Right status icon near date. <code>doubleTapToUnlock</code> no bool <code>false</code> Requires double tap when leaving screensaver. <code>sleepTimeout</code> no int panel <code>sleepTimeout</code> Per-screensaver timeout override. <p><code>*</code> Provide at least one of <code>entity</code> or <code>entities</code>.</p>","path":["Screensaver"],"tags":[]},{"location":"screensaver/#screensaver-entities","level":2,"title":"Screensaver entities","text":"<p>Screensaver entities use the same entity format as other cards.</p> <p>For <code>weather.<entity></code> you can also use:</p> <ul> <li><code>attribute</code> (default <code>temperature</code>)</li> <li><code>day</code> (daily forecast index)</li> <li><code>hour</code> (hourly forecast index)</li> <li><code>unit</code> (suffix, default <code>°C</code> for temperature-like attributes)</li> </ul>","path":["Screensaver"],"tags":[]},{"location":"screensaver/#example","level":2,"title":"Example","text":"<pre><code>screensaver:\n type: screensaver\n doubleTapToUnlock: true\n sleepTimeout: 30\n statusIcon1:\n entity: binary_sensor.front_door\n icon:\n \"on\": mdi:door-open\n \"off\": mdi:door-closed\n font: medium-icon\n statusIcon2:\n entity: sensor.outdoor_temperature\n icon: mdi:thermometer\n entities:\n - entity: weather.home\n attribute: temperature\n - entity: weather.home\n day: 1\n attribute: temperature\n - entity: weather.home\n day: 2\n attribute: temperature\n - entity: sensor.indoor_temperature\n icon: mdi:home-thermometer\n</code></pre>","path":["Screensaver"],"tags":[]},{"location":"troubleshooting/","level":1,"title":"Troubleshooting","text":"","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#config-does-not-load","level":2,"title":"Config does not load","text":"<p>Symptoms:</p> <ul> <li>no panel output</li> <li>log shows YAML parse error or file missing</li> </ul> <p>Checks:</p> <ol> <li>Confirm <code>CONFIG_FILE</code> path.</li> <li>Validate YAML syntax.</li> <li>Ensure required per-panel keys exist: <code>panelRecvTopic</code>, <code>panelSendTopic</code>, <code>locale</code>, <code>timeFormat</code>, <code>dateFormat</code>, <code>screensaver</code>, <code>cards</code>.</li> </ol>","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#mqtt-not-connected","level":2,"title":"MQTT not connected","text":"<p>Symptoms:</p> <ul> <li>log repeats MQTT connection retry</li> </ul> <p>Checks:</p> <ol> <li>Verify <code>mqtt_server</code>, <code>mqtt_port</code>, <code>mqtt_username</code>, <code>mqtt_password</code>.</li> <li>Verify panel publishes on the same topic as <code>panelRecvTopic</code>.</li> <li>Verify payload includes <code>CustomRecv</code> JSON key.</li> </ol>","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#home-assistant-websocket-not-connected","level":2,"title":"Home Assistant websocket not connected","text":"<p>Symptoms:</p> <ul> <li>log repeatedly waits for websocket/auth</li> </ul> <p>Checks:</p> <ol> <li>Verify <code>home_assistant_address</code> and <code>home_assistant_token</code>.</li> <li>In add-on mode, verify Supervisor token access is available.</li> <li>Confirm HA is reachable from container network.</li> </ol>","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#card-does-not-open-or-navigate","level":2,"title":"Card does not open or navigate","text":"<p>Checks:</p> <ol> <li>For <code>navigate.<key></code>, confirm target card has matching <code>key</code>.</li> <li>For <code>cardUnlock</code>, confirm <code>destination</code> and <code>pin</code> are set.</li> <li>Confirm card <code>type</code> is one of the implemented types.</li> </ol>","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#brightness-behaves-unexpectedly","level":2,"title":"Brightness behaves unexpectedly","text":"<p>Checks:</p> <ol> <li>If using entity-based brightness, verify entity state is numeric.</li> <li>Avoid list-based brightness schedules in this rewrite (not supported).</li> <li>Review interaction between <code>sleepTracking</code>, <code>sleepTrackingZones</code>, and <code>sleepOverride</code>.</li> </ol>","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#useful-logs-to-look-for","level":2,"title":"Useful logs to look for","text":"<ul> <li><code>Config file not found</code></li> <li><code>Error while parsing YAML file</code></li> <li><code>Connected to MQTT Server</code></li> <li><code>Home Assistant auth OK</code></li> <li><code>card type ... not implemented</code></li> <li><code>Not implemented: <button action></code></li> </ul>","path":["Troubleshooting"],"tags":[]}]} |