{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Overview","text":"

This documentation covers the standalone rewrite located in nspanel-lovelace-ui/.

It is a Python backend that:

This docs set is intentionally separate from the AppDaemon docs in docs/.

","path":["Overview"],"tags":[]},{"location":"#rewrite-location","level":2,"title":"Rewrite location","text":"","path":["Overview"],"tags":[]},{"location":"#what-is-supported","level":2,"title":"What is supported","text":"","path":["Overview"],"tags":[]},{"location":"#runtime-model","level":2,"title":"Runtime model","text":"
  1. Load panels.yaml.
  2. Resolve MQTT and Home Assistant connection settings.
  3. Create one thread per panel.
  4. Listen for events and state changes.
  5. Re-render active pages and detail popups when relevant entities change.
","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":"","path":["Cards"],"tags":[]},{"location":"cards/#common-card-keys","level":2,"title":"Common card keys","text":"key required type description type yes string Card type. title no string Card title. key no string Navigation key used by navigate.<key>.","path":["Cards"],"tags":[]},{"location":"cards/#cardentities-and-cardgrid","level":2,"title":"cardEntities and cardGrid","text":"
- type: cardEntities\n  title: Main\n  key: main\n  entities:\n    - entity: light.kitchen\n    - entity: navigate.settings\n      icon: mdi:cog\n
","path":["Cards"],"tags":[]},{"location":"cards/#cardqr","level":2,"title":"cardQR","text":"
- 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

Keys:

","path":["Cards"],"tags":[]},{"location":"cards/#cardpower","level":2,"title":"cardPower","text":"
- type: cardPower\n  title: Energy\n  entities:\n    - entity: sensor.house_power\n    - entity: delete\n    - entity: sensor.solar_power\n

Notes:

","path":["Cards"],"tags":[]},{"location":"cards/#cardmedia","level":2,"title":"cardMedia","text":"
- 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

Notes:

","path":["Cards"],"tags":[]},{"location":"cards/#cardthermo","level":2,"title":"cardThermo","text":"
- type: cardThermo\n  title: Heating\n  entity: climate.downstairs\n  supported_modes: [\"heat\", \"off\"]\n

Keys:

","path":["Cards"],"tags":[]},{"location":"cards/#cardalarm","level":2,"title":"cardAlarm","text":"
- type: cardAlarm\n  title: House Alarm\n  entity: alarm_control_panel.house\n  supported_modes: [\"arm_home\", \"arm_away\", \"arm_night\"]\n

Keys:

","path":["Cards"],"tags":[]},{"location":"cards/#cardunlock","level":2,"title":"cardUnlock","text":"
- type: cardUnlock\n  title: Admin\n  pin: 1234\n  destination: navigate.admin\n

Keys:

Typical target in hiddenCards:

hiddenCards:\n  - type: cardGrid\n    key: admin\n    title: Admin\n    entities:\n      - entity: switch.maintenance_mode\n
","path":["Cards"],"tags":[]},{"location":"configuration/","level":1,"title":"Configuration","text":"

The runtime reads one YAML file (default: ./panels.yaml, add-on mode: /config/panels.yaml).

","path":["Configuration"],"tags":[]},{"location":"configuration/#top-level-keys","level":2,"title":"Top-level keys","text":"key required type default description nspanels yes object none Map of panel definitions. home_assistant_address recommended string none Home Assistant base URL. In add-on mode it is auto-filled as http://supervisor if missing. home_assistant_token recommended string none Long-lived token or Supervisor token. mqtt_server required in MQTT mode string from env MQTT host. mqtt_port required in MQTT mode int from env MQTT port. mqtt_username required in MQTT mode string from env MQTT username. mqtt_password required in MQTT mode string from env MQTT password. use_ha_api optional any absent If present, MQTT input mode is disabled and HA event mode is used. timeZone optional string Europe/Berlin Global fallback for panel timeZone. hiddenCards optional list [] Global fallback for panel hiddenCards.","path":["Configuration"],"tags":[]},{"location":"configuration/#panel-keys-nspanelsname","level":2,"title":"Panel keys (nspanels.<name>)","text":"key required type default description panelRecvTopic yes string none Receive channel for panel events. panelSendTopic yes string none Send channel for panel commands. locale yes string none Locale used for translations and date formatting. timeZone recommended string from top-level timeZone Time zone for clock. timeFormat yes string none Python strftime format. dateFormat yes string none Babel date format (example: full, medium). model optional string eu Panel model (eu, us-p, us-l). temp_unit optional string celsius Thermostat card unit (celsius or fahrenheit). sleepTimeout optional int 20 Seconds before screensaver. sleepBrightness optional int or entity_id 10 Screensaver brightness. screenBrightness optional int or entity_id 100 Active-screen brightness. sleepTracking optional entity_id none Forces sleep brightness to 0 when entity state matches sleepTrackingZones. sleepTrackingZones optional list [\"not_home\", \"off\"] States that trigger forced dimming. sleepOverride optional object none Override sleep brightness when entity is on/true/home. defaultBackgroundColor optional string ha-dark ha-dark or black. featExperimentalSliders optional int 0 Forwarded in dimmode command. defaultCard optional string none Default card when leaving screensaver (navigate.<key>). screensaver yes object none Screensaver definition. cards yes list none Top-level cards. hiddenCards optional list [] Hidden cards addressable through navigate.<key>.","path":["Configuration"],"tags":[]},{"location":"configuration/#brightness-behavior","level":2,"title":"Brightness behavior","text":"

Example:

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
","path":["Configuration"],"tags":[]},{"location":"connection-modes/","level":1,"title":"Connection Modes","text":"

The rewrite supports two panel input/output modes.

","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#1-mqtt-mode-default","level":2,"title":"1) MQTT mode (default)","text":"

Enabled when:

Behavior:

Example receive payload:

{\"CustomRecv\":\"event,startup,54,eu\"}\n
","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#2-home-assistant-api-mode-use_ha_api","level":2,"title":"2) Home Assistant API mode (use_ha_api)","text":"

Enabled when key use_ha_api exists in config.

Behavior:

Service payload shape:

data: \"...panel command...\"\ncommand: 2\n
","path":["Connection Modes"],"tags":[]},{"location":"connection-modes/#common-to-both-modes","level":2,"title":"Common to both modes","text":"","path":["Connection Modes"],"tags":[]},{"location":"entities/","level":1,"title":"Entities","text":"

Entities are used in cards and screensaver lists.

","path":["Entities"],"tags":[]},{"location":"entities/#entity-keys","level":2,"title":"Entity keys","text":"key required type description entity yes string Home Assistant entity id, or internal entity (navigate.*, delete, iText.*). name no string Display name override. icon no string or map Icon override (mdi:*), optionally per state. color no [r,g,b] or map Color override, optionally per state. value no string Value override. font no string Icon font variant (small, medium, medium-icon, large). status no string Extra status entity for navigate.* items. effectList no list Custom light effect list for detail popup. attribute no string Weather attribute to display. day no int Weather daily forecast index. hour no int Weather hourly forecast index. unit no string Value suffix.","path":["Entities"],"tags":[]},{"location":"entities/#supported-home-assistant-domains","level":2,"title":"Supported Home Assistant domains","text":"","path":["Entities"],"tags":[]},{"location":"entities/#internal-entities","level":2,"title":"Internal entities","text":"","path":["Entities"],"tags":[]},{"location":"entities/#template-based-values","level":2,"title":"Template-based values","text":"

The rewrite supports Home Assistant template rendering for selected fields when prefixed with ha::

Example:

- 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
","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":"

In add-on mode, the container startup script:

Relevant files:

","path":["Getting Started"],"tags":[]},{"location":"getting-started/#minimal-panelsyaml","level":2,"title":"Minimal panels.yaml","text":"

Start with one panel:

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
","path":["Getting Started"],"tags":[]},{"location":"getting-started/#important-notes","level":2,"title":"Important notes","text":"","path":["Getting Started"],"tags":[]},{"location":"getting-started/#running-standalone-outside-ha-add-on","level":2,"title":"Running standalone (outside HA add-on)","text":"

If you run this container/process outside Supervisor:

","path":["Getting Started"],"tags":[]},{"location":"migration-appdaemon/","level":1,"title":"Migration from AppDaemon Config","text":"

This page explains how to migrate panel configuration from the legacy AppDaemon apps.yaml format to the standalone rewrite panels.yaml format.

","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#file-and-structure-changes","level":2,"title":"File and structure changes","text":"

Old (AppDaemon):

New (rewrite):

","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#minimal-beforeafter-example","level":2,"title":"Minimal before/after example","text":"

Old AppDaemon (apps.yaml):

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

New rewrite (panels.yaml):

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
","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 module, class, config wrapper removed Rewrite uses nspanels.<panel_name> directly. panelRecvTopic panelRecvTopic Same meaning. panelSendTopic panelSendTopic Same meaning. model model Same meaning (eu, us-p, us-l). locale locale Same meaning. timeFormat timeFormat Same meaning. timezone (legacy docs casing) timeZone Use exact camelCase timeZone. dateFormatBabel / dateFormat dateFormat Rewrite expects dateFormat. cards cards Same concept. hiddenCards hiddenCards Same concept. screensaver screensaver Same concept; some legacy theme options are not available. defaultCard under screensaver usage defaultCard (panel level) Use as panel-level key in rewrite. temperatureUnit (card-level legacy usage) temp_unit (panel level) Rewrite reads panel-level temp_unit. sleepBrightness list schedule not supported Rewrite supports integer or entity id, not list-based schedules. screenBrightness list schedule not supported Rewrite supports integer or entity id, not list-based schedules. sleepTracking sleepTracking Same concept. sleepTrackingZones sleepTrackingZones Same concept. sleepOverride sleepOverride Same concept. updateMode / OTA URL overrides (displayURL-*, berryURL) not supported Rewrite does not implement these legacy update keys. theme, dateAdditionalTemplate, timeAdditionalTemplate 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":"

In AppDaemon setups, MQTT and Home Assistant connectivity was mostly configured via AppDaemon plugin settings.

In the rewrite, connectivity is resolved directly by the runtime:

","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#entity-level-differences-to-watch","level":2,"title":"Entity-level differences to watch","text":"

Some legacy entity config fields are not implemented in the rewrite parser/renderer:

Supported and commonly used fields in rewrite:

","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"migration-appdaemon/#migration-checklist","level":2,"title":"Migration checklist","text":"
  1. Create /config/panels.yaml from the rewrite example.
  2. Move each old app entry (nspanel-1, nspanel-2, ...) into nspanels.
  3. Remove module/class/config wrappers.
  4. Rename timezone to timeZone.
  5. Ensure each panel has dateFormat, timeFormat, screensaver, and cards.
  6. Replace unsupported scheduled brightness lists with integer/entity-based values.
  7. Remove unsupported legacy-only keys listed above.
","path":["Migration from AppDaemon Config"],"tags":[]},{"location":"screensaver/","level":1,"title":"Screensaver","text":"

screensaver is a required object in each panel config.

","path":["Screensaver"],"tags":[]},{"location":"screensaver/#keys","level":2,"title":"Keys","text":"key required type default description type no string screensaver Layout type (screensaver / screensaver2). entities yes* list none Screensaver entities. entity yes* string none Single-entity shortcut. statusIcon1 no object none Left status icon near date. statusIcon2 no object none Right status icon near date. doubleTapToUnlock no bool false Requires double tap when leaving screensaver. sleepTimeout no int panel sleepTimeout Per-screensaver timeout override.

* Provide at least one of entity or entities.

","path":["Screensaver"],"tags":[]},{"location":"screensaver/#screensaver-entities","level":2,"title":"Screensaver entities","text":"

Screensaver entities use the same entity format as other cards.

For weather.<entity> you can also use:

","path":["Screensaver"],"tags":[]},{"location":"screensaver/#example","level":2,"title":"Example","text":"
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
","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":"

Symptoms:

Checks:

  1. Confirm CONFIG_FILE path.
  2. Validate YAML syntax.
  3. Ensure required per-panel keys exist: panelRecvTopic, panelSendTopic, locale, timeFormat, dateFormat, screensaver, cards.
","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#mqtt-not-connected","level":2,"title":"MQTT not connected","text":"

Symptoms:

Checks:

  1. Verify mqtt_server, mqtt_port, mqtt_username, mqtt_password.
  2. Verify panel publishes on the same topic as panelRecvTopic.
  3. Verify payload includes CustomRecv JSON key.
","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#home-assistant-websocket-not-connected","level":2,"title":"Home Assistant websocket not connected","text":"

Symptoms:

Checks:

  1. Verify home_assistant_address and home_assistant_token.
  2. In add-on mode, verify Supervisor token access is available.
  3. Confirm HA is reachable from container network.
","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#card-does-not-open-or-navigate","level":2,"title":"Card does not open or navigate","text":"

Checks:

  1. For navigate.<key>, confirm target card has matching key.
  2. For cardUnlock, confirm destination and pin are set.
  3. Confirm card type is one of the implemented types.
","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#brightness-behaves-unexpectedly","level":2,"title":"Brightness behaves unexpectedly","text":"

Checks:

  1. If using entity-based brightness, verify entity state is numeric.
  2. Avoid list-based brightness schedules in this rewrite (not supported).
  3. Review interaction between sleepTracking, sleepTrackingZones, and sleepOverride.
","path":["Troubleshooting"],"tags":[]},{"location":"troubleshooting/#useful-logs-to-look-for","level":2,"title":"Useful logs to look for","text":"","path":["Troubleshooting"],"tags":[]}]}