Skip to content

Aktionen und Dialoge

Diese Seite dokumentiert alle Aktionsarten sowie die typspezifischen Dialog-Widgets.

WidgetActionConfig

Feld Typ Default Bedeutung
type WidgetActionType endpoint Aktionsart
request EndpointRequestConfig? null Request für Endpoint-Aktionen
targetTabId String? null Ziel-Tab für switch_tab
url String? null Browser-URL für open_url
prompt Boolean false zeigt vor dem Ausführen einen Bestätigungsdialog
refreshAfterAction Boolean true steuert Refresh nach erfolgreicher Aktion

WidgetActionType

Wert Wirkung
endpoint führt einen HTTP-Request aus
switch_tab wechselt auf einen anderen Tab
open_url öffnet eine URL im Browser

Endpoint-Aktionen

Normale klickbare Widgets verwenden action.type = "endpoint" oder lassen type weg.

Ohne request.method gilt dieselbe Auto-Regel wie bei Status-Requests:

  • kein Body -> GET
  • Body vorhanden -> POST

Beispiel:

"action": {
  "request": {
    "url": "http://192.168.1.20/api/lights/living-room/toggle"
  },
  "prompt": true,
  "refreshAfterAction": true
}

Bestätigungsdialoge mit prompt

Für Aktionen mit spürbarer Wirkung kann ein vorgeschalteter Bestätigungsdialog aktiviert werden.

Mögliche Stellen:

  • widgets[].action.prompt für normale Tap-Aktionen und Slider-Widgets
  • widgets[].content.select.action.prompt für Select-Bestätigungen
  • widgets[].content.shutter.sliderAction.prompt für die Zielposition im Rollladen-Dialog
  • widgets[].content.shutter.upAction.prompt, stopAction.prompt, downAction.prompt für Rollladen-Kommandos

Laufzeitverhalten:

  • der Dialogtitel nutzt den aktuell sichtbaren Widget-Titel; wenn keiner aufgelöst werden kann, fällt die App auf die Widget-ID zurück
  • der Dialogtext ist aktuell generisch und nicht pro Widget konfigurierbar
  • erst nach Bestätigung wird der eigentliche Request ausgeführt

Beispiel für einen bestätigten Aktionsbutton:

{
  "content": {
    "mode": "icon_text",
    "title": {
      "mode": "static",
      "value": "Warmwasser jetzt"
    }
  },
  "action": {
    "request": {
      "url": "http://192.168.1.20/api/hot-water/boost-now"
    },
    "prompt": true,
    "refreshAfterAction": true
  }
}

Tab-Wechsel

"action": {
  "type": "switch_tab",
  "targetTabId": "energy"
}

Validierung:

  • targetTabId muss auf einen existierenden Tab verweisen

URL im Browser öffnen

"action": {
  "type": "open_url",
  "url": "https://example.org/camera/frontdoor"
}

Validierung:

  • dieselbe URL-Policy wie bei normalen Requests

Slider-Widgets

Ein Slider-Widget benötigt zwei Bereiche:

  • content.slider für Bereich, Step und Statuspfad
  • action.request für den eigentlichen Action-Endpoint

WidgetSliderConfig

Feld Typ Default Bedeutung
min Double kein Default Untergrenze
max Double kein Default Obergrenze
step Double 1.0 Schrittweite
valuePath String kein Default JSON-Pfad des aktuellen Werts
actionValueBindings List<RequestActionValueBindingConfig> [{json_body,value}] wohin der eingestellte Wert geschrieben wird

Dialogverhalten:

  • Tap öffnet Slider-Dialog
  • Statuswert setzt die aktuelle Slider-Position
  • OK sendet den neuen Wert
  • bei refreshAfterAction = false erfolgt ein optimistisches Snapshot-Update

Select-Widgets

WidgetSelectConfig

Feld Typ Default Bedeutung
valuePath String kein Default JSON-Pfad des aktuellen Werts
optionsPath String kein Default JSON-Pfad zum Optionsarray
optionValuePath String "value" Pfad innerhalb eines Optionsobjekts für den gesendeten Wert
optionLabelPath String "label" Pfad innerhalb eines Optionsobjekts für die Anzeige
action SelectActionConfig kein Default Request für den bestätigten Wert

SelectActionConfig

Feld Typ Default Bedeutung
request EndpointRequestConfig kein Default Action-Endpoint
valueBindings List<RequestActionValueBindingConfig> [{json_body,value}] wohin der Wert geschrieben wird
prompt Boolean false zeigt vor OK einen Bestätigungsdialog
refreshAfterAction Boolean true Refresh-Steuerung

Dialogverhalten:

  • Tap öffnet ein Select-Feld
  • Optionen kommen aus dem Status
  • primitive Arrays wie ["A","B"] funktionieren ebenso wie Objektarrays
  • prompt: true zeigt vor dem eigentlichen Senden einen zusätzlichen Bestätigungsdialog
  • bei erfolgreicher Bestätigung kann der Snapshot optimistisch aktualisiert werden

Beispiel mit Bestätigung:

"select": {
  "valuePath": "mode",
  "optionsPath": "available_modes",
  "action": {
    "request": {
      "url": "http://192.168.1.20/api/heating/mode",
      "method": "post",
      "jsonBody": {
        "mode": ""
      }
    },
    "valueBindings": [
      {
        "target": "json_body",
        "path": "mode"
      }
    ],
    "prompt": true
  }
}

Rollladen-Widgets

WidgetShutterConfig

Feld Typ Default Bedeutung
min Double 0.0 Untergrenze
max Double 100.0 Obergrenze
step Double 1.0 Schrittweite
valuePath String kein Default JSON-Pfad der aktuellen Position
sliderAction ShutterSliderActionConfig? null optionaler Action-Endpoint für Zielposition
upAction WidgetActionConfig kein Default separater Request für Hoch
stopAction WidgetActionConfig? null optionaler Request für Stop
downAction WidgetActionConfig kein Default separater Request für Runter

ShutterSliderActionConfig

Feld Typ Default Bedeutung
request EndpointRequestConfig kein Default Slider-Endpoint
valueBindings List<RequestActionValueBindingConfig> [{json_body,value}] Wertbindung
prompt Boolean false zeigt vor OK einen Bestätigungsdialog
refreshAfterAction Boolean true Refresh-Steuerung

Dialogverhalten:

  • der Slider samt OK-Button erscheint nur, wenn sliderAction gesetzt ist
  • die Kommando-Buttons liegen in einer Zeile als Runter, optional Stop, Hoch
  • Stop erscheint zusätzlich im Dialog, wenn stopAction gesetzt ist
  • Buttons und Slider können unterschiedliche Endpoints nutzen
  • upAction, stopAction, downAction und sliderAction können jeweils unabhängig prompt: true setzen
  • upAction, stopAction und downAction verwenden dieselbe WidgetActionConfig wie normale Widgets

Gemeinsame Binding-Struktur

Slider-, Select- und Rollladen-Slider verwenden denselben Binding-Typ.

RequestActionValueBindingConfig

Feld Typ Default Bedeutung
target RequestActionValueTarget json_body Zielort des Werts
key String? null Key für Header oder Query-Parameter
path String "value" JSON-Pfad im Body

RequestActionValueTarget

Wert Wirkung
json_body schreibt den Wert in den JSON-Body
header schreibt den Wert in einen Header
query_param schreibt den Wert in die URL-Query

Beispiele für Bindings

Wert in JSON-Body schreiben

{
  "target": "json_body",
  "path": "brightness"
}

Wert in Header schreiben

{
  "target": "header",
  "key": "X-Level"
}

Wert in Query-Parameter schreiben

{
  "target": "query_param",
  "key": "position"
}

Erfolgs- und Fehlerverhalten

Bei erfolgreicher Aktion:

  • refreshAfterAction = true: betroffenes Widget wird neu geladen
  • refreshAfterAction = false: optimistisches Update, soweit für den Typ vorgesehen

Bei Fehlern:

  • das Widget erhält hasError = true
  • eine User-Message wird gesetzt
  • laufende Dialoge verlassen den Busy-Zustand

Siehe auch