Konfiguration Überblick¶
Die gesamte App wird über JSON konfiguriert. Die Datenstruktur ist modular aufgebaut und trennt Dashboard-Metadaten, Requests, Layout, Inhalt und Aktionen klar voneinander.
Gesamtstruktur¶
{
"schemaVersion": 1,
"dashboard": {
"...": "Titel, Layout, Tabs, Gruppen"
},
"defaults": {
"...": "globale Request-Defaults und Shared-Status-Requests"
},
"widgets": [
{
"...": "einzelne Widget-Definitionen"
}
]
}
Objektbaum¶
DashboardConfig
|- schemaVersion
|- dashboard
| |- title
| |- subtitle
| |- layout
| |- defaultTabId
| |- groups[]
| `- tabs[]
|- defaults
| |- request
| `- sharedStatusRequests[]
`- widgets[]
|- id
|- layout
|- content
|- status
|- action
`- tags[]
Hinweis:
dashboard.subtitleist weiterhin Teil des JSON-Schemas- die aktuelle App rendert jedoch keinen separaten Untertitel mehr, sondern eine kompakte Statuszeile unter dem Titel
- diese Zeile zeigt
Datum + UhrzeitsowieOnlineoder die Fehleranzahl
Grundprinzipien¶
Status und Aktion sind getrennt¶
Ein Widget definiert immer:
- wie es angezeigt wird:
content - woher sein Status kommt:
status - was bei einem Tap passieren soll:
action
Dadurch kann dasselbe Darstellungsprinzip mit unterschiedlichen Datenquellen und Aktionen kombiniert werden.
Render-Modus und Datenquellen sind entkoppelt¶
Ein Widget kann:
- JSON lesen und als Icon/Text anzeigen
- PNG laden und als Bild anzeigen
- denselben JSON-Status gleichzeitig für Text, Farbe, Icon-Namen und Slider-Werte nutzen
Requests können global oder lokal sein¶
- globale Sammelrequests sitzen in
defaults.sharedStatusRequests - widgets referenzieren diese über
status.sharedRequestId - individuelle Requests bleiben direkt am Widget
Eindeutigkeitsregeln¶
Die Validierung erzwingt:
- eindeutige Widget-IDs
- eindeutige Gruppen-IDs
- eindeutige Tab-IDs
- eindeutige Shared-Request-IDs
- eindeutige Profil-IDs innerhalb einer
index.json
Pflicht- und Wahlfelder¶
Nicht jedes Feld ist zwingend. Typische Pflichtfelder sind:
widgets[].idwidgets[].status- je nach Widget-Typ die passende Unterstruktur wie
content.slider,content.selectodercontent.shutter
Viele Bereiche haben sinnvolle Defaults, zum Beispiel:
schemaVersion = 1dashboard.title = "Smart Home"dashboard.layout.portraitColumns = 4dashboard.layout.landscapeColumns = 6defaults.request.timeoutMs = 6000content.mode = "auto"
Werteformate¶
IDs¶
Empfehlung:
- nur Kleinbuchstaben, Zahlen, Bindestriche und Unterstriche
Beispiel:
Grössen¶
Erlaubt sind:
1/1bis4/4full/1bisfull/4
Alternativ akzeptiert der Parser auch x statt /, also z. B. 2x1.
JSON-Pfade¶
Pfadsyntax:
room.temperaturerooms[0].nameavailable_scenes[2].label
Mehr dazu auf JSON-Pfade und Templates.
Farben¶
Farben werden als CSS-ähnliche Hexwerte erwartet:
Auflösungsreihenfolge¶
Bei einem erfolgreichen Status-Refresh passiert pro Widget grob folgendes:
- Request aus
status.requestodersharedRequestIdbestimmen - Antwort als JSON oder PNG klassifizieren
WidgetPresentationResolverausführen- Titel, Value, Icon-Name, Icon-Farbe, Slider-Wert und Select-Optionen berechnen
- Snapshots an die UI liefern
Was auto bedeutet¶
content.mode = "auto" bedeutet:
- wenn ein Bild geladen wird, rendert das Widget als Bild
- wenn kein Bild vorliegt, rendert es als Icon/Text
Das ist besonders praktisch für Kamera-Widgets, deren Endpoint stabil ein PNG liefert.