Skip to content

Dashboard

Diese Seite beschreibt alle dashboard-weiten Konfigurationsobjekte.

DashboardConfig

Feld Typ Default Bedeutung
schemaVersion Int 1 Versionsmarker für das JSON-Schema
dashboard DashboardMetaConfig leer mit Defaults Titel, Layout, Gruppen und Tabs
defaults DashboardDefaultsConfig leer mit Defaults globale Request-Defaults und Shared-Status-Requests
widgets List<WidgetConfig> [] alle Widgets des Dashboards

DashboardMetaConfig

Feld Typ Default Bedeutung
title String "Smart Home" Haupttitel im Dashboard
layout DashboardLayoutConfig siehe unten globale Grid-Parameter
defaultTabId String? null bevorzugter Start-Tab
groups List<DashboardGroupConfig> [] optisch zusammenhängende Gruppen
tabs List<DashboardTabConfig> [] optionale Reiter

Hinweis:

  • die App zeigt im Kopfbereich aktuell den Titel und direkt darunter eine kompakte Statuszeile
  • diese Statuszeile enthält Datum + Uhrzeit der letzten Aktualisierung sowie Online oder die aktuelle Fehleranzahl

DashboardLayoutConfig

Feld Typ Default Bedeutung
portraitColumns Int 4 Spaltenzahl im Hochformat
landscapeColumns Int 6 Spaltenzahl im Querformat
spacingDp Int 14 Abstand zwischen Rasterzellen
contentPaddingDp Int 16 Aussenabstand um den Dashboard-Inhalt
cornerRadiusDp Int 24 Eckenradius der Widget-Karten

Hinweis:

  • die Spaltenzahl wird zur Laufzeit mindestens auf 1 begrenzt
  • der Zellwert wird aus Bildschirmbreite, Spaltenzahl und spacingDp berechnet
  • im Reiter Optik können portraitColumns und landscapeColumns lokal pro Gerät überschrieben werden
  • bleibt ein Override leer, verwendet die App wieder den Wert aus der geladenen JSON

DashboardGroupConfig

Feld Typ Default Bedeutung
id String kein Default eindeutige Gruppen-ID
title String? null optionale Gruppenüberschrift
order Int 0 Sortierung innerhalb eines Tabs
widthColumns Int? null Breite der Gruppe in Raster-Spalten; ohne Wert nutzt die Gruppe die konfigurierten Landscape-Spalten. Bei expandable: true begrenzt ein explizit gesetzter Wert zusätzlich die Popup-Breite
expandable Boolean false zeigt die Gruppe als 1/1 Link-Kachel und öffnet den Inhalt in einem Popup
icon DashboardGroupIconConfig? null optionales Icon der eingeklappten Gruppen-Kachel
valueWidgetId String? null optionales Widget der Gruppe, dessen aufgelöster value auf der eingeklappten 1/1 Kachel angezeigt wird
valuePattern String? null optionales Template für die eingeklappte Kachel, zum Beispiel {{window-left}} / {{window-right}}
highlightColor String? null optionale Hex-Farbe für Titelakzent und Gruppen-Default
borderColor String? null optionale Hex-Farbe nur für die Gruppenumrandung
widgetIds List<String> [] Widgets der Gruppe

Validierungsregeln:

  • id darf nicht leer sein
  • widthColumns muss mindestens 1 sein, wenn gesetzt
  • highlightColor muss ein gültiger Hex-Farbwert wie #RRGGBB oder #AARRGGBB sein, wenn gesetzt
  • borderColor muss ein gültiger Hex-Farbwert wie #RRGGBB oder #AARRGGBB sein, wenn gesetzt
  • widgetIds darf nicht leer sein
  • valueWidgetId muss, wenn gesetzt, auf ein Widget innerhalb derselben Gruppe zeigen
  • alle in valuePattern referenzierten Widget-IDs müssen, wenn gesetzt, auf Widgets innerhalb derselben Gruppe zeigen
  • Widgets dürfen nicht in mehreren Gruppen auftauchen

Kompatibilität:

  • das alte Feld maxWidthDp wird beim Einlesen weiterhin akzeptiert
  • für neu Konfigurationen sollte widthColumns verwendet werden
  • wenn borderColor fehlt, verwendet die App zuerst highlightColor und danach die globale Theme-Farbe groupHighlight
  • bei expandable: true erscheint die Gruppe im Haupt-Dashboard immer als 1/1 Kachel; das Popup nutzt dieselbe Widgetgrösse wie das Haupt-Grid und höchstens fünf Spalten
  • ist bei einer expandierbaren Gruppe widthColumns explizit gesetzt, begrenzt dieser Wert das Popup zusätzlich
  • wenn valueWidgetId gesetzt ist, rendert die eingeklappte Kachel den bereits aufgelösten value dieses Widgets unter dem Gruppen-Icon
  • wenn valuePattern gesetzt ist, rendert die eingeklappte Kachel dieses Template mit den aufgelösten value-Texten der darin referenzierten Widget-IDs; die benötigten IDs werden direkt aus den Platzhaltern extrahiert

DashboardGroupIconConfig

Feld Typ Default Bedeutung
name String? null optionaler Material-Icon-Name der eingeklappten Gruppen-Kachel
emoji String? null Fallback, wenn kein passendes Material-Icon gesetzt ist
sizeDp Int? null optionale Icon-Grösse
color String? null optionale Hex-Farbe; ohne Wert nutzt die Kachel den Gruppenakzent

Editor-Hinweise

Für Gruppen und Reiter bietet die App zusätzlich Wizard-Schritte mit strukturierter Bearbeitung:

  • Grunddaten und Inhalt sind auf Karten aufgeteilt
  • Icon-Felder besitzen eine suchbare Iconauswahl
  • Farbfelder besitzen einen Color-Picker mit optionaler Rückkehr zum Standardwert
  • im ersten Schritt können Gruppen und Reiter direkt mit Bestätigungsdialog gelöscht werden

DashboardTabConfig

Feld Typ Default Bedeutung
id String kein Default eindeutige Tab-ID
title String kein Default sichtbare Bezeichnung
order Int 0 Sortierreihenfolge der Tabs
groupIds List<String> [] Gruppen, die in diesem Tab erscheinen
widgetIds List<String> [] Widgets, die direkt in diesem Tab erscheinen

Verhalten:

  • wenn groupIds und widgetIds beide leer sind, zeigt der Tab automatisch alle ungruppierten Widgets und alle Gruppen
  • Tabs werden nach order, danach nach title, danach nach id sortiert
  • innerhalb eines Tabs darf ein Widget nicht gleichzeitig direkt und über eine Gruppe referenziert sein

DashboardDefaultsConfig

Feld Typ Default Bedeutung
request RequestDefaultsConfig siehe unten globale Defaults für Header und Timeout
sharedStatusRequests List<SharedStatusRequestConfig> [] wiederverwendbare Sammelrequests

SharedStatusRequestConfig

Feld Typ Default Bedeutung
id String kein Default eindeutige Kennung für Widgets
request EndpointRequestConfig kein Default eigentlicher Status-Request

Laufzeitverhalten:

  • pro Aktualisierungszyklus wird jeder referenzierte Shared-Request genau einmal ausgeführt
  • alle Widgets mit derselben sharedRequestId lesen anschliessend aus derselben Antwort

RequestDefaultsConfig

Feld Typ Default Bedeutung
headers Map<String, String> {} globale Standardheader
timeoutMs Long 6000 Standardtimeout in Millisekunden

Merge-Regel:

  • die finalen Header ergeben sich aus defaults.request.headers + request.headers
  • falls kein Accept gesetzt ist, fügt die App automatisch application/json, image/png, image/jpeg hinzu

Beispiel

{
  "dashboard": {
    "title": "Mein Smart Home",
    "defaultTabId": "home",
    "layout": {
      "portraitColumns": 4,
      "landscapeColumns": 6,
      "spacingDp": 14,
      "contentPaddingDp": 16,
      "cornerRadiusDp": 26
    },
    "groups": [
      {
        "id": "living-room-controls",
        "title": "Wohnzimmer",
        "order": 14,
        "expandable": true,
        "icon": {
          "name": "light",
          "sizeDp": 28
        },
        "valueWidgetId": "living-room-light",
        "highlightColor": "#C88A43",
        "borderColor": "#8A4A17",
        "widgetIds": [
          "living-room-light",
          "living-room-dimmer"
        ]
      }
    ],
    "tabs": [
      {
        "id": "home",
        "title": "Zuhause",
        "order": 10,
        "groupIds": [
          "living-room-controls"
        ]
      }
    ]
  }
}

Siehe auch