Zum Hauptinhalt springen

WifiWhirl® Webhooks zur externen Steuerung

Nutze Webhooks, um dein WifiWhirl-Modul über HTTP-Anfragen fernzusteuern. Hier findest du alle Befehle und Parameter für die Integration.

Ab der Version 1.1.3 deines WifiWhirl-Moduls kannst du viele Funktionen bequem über Webhooks (HTTP-Aufrufe) fernsteuern. Dies ermöglicht die Integration in viele Smart-Home-Systeme, eigene Skripte oder den direkten Aufruf über einen Webbrowser.

Grundlagen

Webhooks sind eine einfache Methode, mit der Anwendungen über das HTTP-Protokoll miteinander kommunizieren können. Im Fall des WifiWhirl-Moduls sendest du eine speziell formatierte URL an das Modul, um eine Aktion auszulösen.

Wichtige Hinweise vorab:

  • Ersetze in allen Beispiel-URLs wifiwhirl.local durch den Hostnamen oder die lokale IP-Adresse deines WifiWhirl-Moduls im Netzwerk. Den Hostnamen (oft wifiwhirl-xxxxxx.local) oder die IP-Adresse findest du z.B. in der Weboberfläche deines Routers oder beim Start des Moduls auf dem Pumpendisplay.
  • Alle Webhook-Aufrufe erfolgen über die HTTP GET-Methode, sofern nicht anders angegeben.
  • Die zu sendenden Befehle werden als JSON-Objekt im send-Parameter der URL übergeben. Die Struktur ist dabei immer {"CMD":<Befehlsnummer>,"VALUE":<Wert>}.

Verfügbare Webhook-Befehle

Die folgende Tabelle listet alle verfügbaren Befehle auf, die du per Webhook an dein WifiWhirl-Modul senden kannst:

FunktionCMDVALUE TypVALUE Beispiele & HinweiseBeispiel-URL (mit wifiwhirl.local)
Pumpe Ein/Aus4Booleantrue (ein), false (aus)http://wifiwhirl.local/hook/?send={"CMD":4,"VALUE":true}
Heizung & Pumpe Ein/Aus3Booleantrue (ein), false (aus)http://wifiwhirl.local/hook/?send={"CMD":3,"VALUE":true}
AirJet-Düsen Ein/Aus2Booleantrue (ein), false (aus)http://wifiwhirl.local/hook/?send={"CMD":2,"VALUE":true}
HydroJet-Düsen Ein/Aus11Booleantrue (ein), false (aus)http://wifiwhirl.local/hook/?send={"CMD":11,"VALUE":true}
Ziel-Temperatur setzen0Unsigned IntegerGanzzahl, z.B. 30 für 30°Chttp://wifiwhirl.local/hook/?send={"CMD":0,"VALUE":30}
Display-Helligkeit setzen12Unsigned Integer0 (aus) bis 8 (max. Helligkeit)http://wifiwhirl.local/hook/?send={"CMD":12,"VALUE":8}
Umgebungstemp. setzen (°C)15IntegerGanzzahl in °C, z.B. 20 für 20°C (-40 bis 60)http://wifiwhirl.local/hook/?send={"CMD":15,"VALUE":20}
Tasten aktivieren/deaktivieren26Booleantrue (aktivieren), false (deaktivieren)http://wifiwhirl.local/hook/?send={"CMD":26,"VALUE":false}
pH-Wert setzen27Unsigned IntegerWert = pH × 10, z.B. 72 für pH 7,2http://wifiwhirl.local/hook/?send={"CMD":27,"VALUE":72}
Chlorgehalt setzen28Unsigned IntegerWert = Cl × 10 in mg/L, z.B. 15 für 1,5 mg/Lhttp://wifiwhirl.local/hook/?send={"CMD":28,"VALUE":15}
Cyanursäure (CYA) setzen29Unsigned IntegerWert = CYA × 10 in mg/L, z.B. 300 für 30,0 mg/Lhttp://wifiwhirl.local/hook/?send={"CMD":29,"VALUE":300}
Alkalität setzen30Unsigned IntegerWert in mg/L, z.B. 100 für 100 mg/Lhttp://wifiwhirl.local/hook/?send={"CMD":30,"VALUE":100}

Weitere Befehle

Diese Befehle sind seltener im Einsatz, funktionieren aber genauso. Befehle ohne Wert ignorieren VALUE - du kannst den Parameter dann einfach weglassen, z.B. http://wifiwhirl.local/hook/?send={"CMD":6}.

FunktionCMDVALUE TypHinweise & Beispiel-JSON
Temperatureinheit umschalten1Booleantrue = °C, false = °F. Wird nicht von jedem Pumpenmodell übernommen. {"CMD":1,"VALUE":true}
Warteschlange leeren5-Verwirft alle geplanten Befehle. {"CMD":5}
Modul neu starten6-Speichert Einstellungen und Warteschlange, dann Neustart des Moduls. {"CMD":6}
Alle Zähler zurücksetzen8-Laufzeiten, Energie (kWh) und Kosten auf 0. {"CMD":8}
Chlor-Timer zurücksetzen9-Setzt den Timer für die letzte Chlorzugabe auf jetzt. {"CMD":9}
Filter-Timer zurücksetzen10-Setzt den Timer für die letzte Filterreinigung auf jetzt. {"CMD":10}
Signalton / Melodie13Unsigned Integer0 = kurzer Piep, 1 = Akkord. Jeder andere Wert spielt die Melodiedatei aus TXT. {"CMD":13,"VALUE":2,"TXT":"/furelise.mel"}
Umgebungstemp. setzen (°F)14IntegerGanzzahl in °F (-40 bis 140). {"CMD":14,"VALUE":68}
Tagesverbrauch zurücksetzen16-Setzt kWh und Kosten des laufenden Tages zurück. {"CMD":16}
Volle Heizleistung18Booleantrue = beide Heizelemente, false = eines. Nur bei Pumpen mit zwei Heizelementen. {"CMD":18,"VALUE":true}
Text auf dem Display anzeigen19-Zeigt den Inhalt von TXT an, ohne sonst etwas zu schalten (max. 96 Zeichen). {"CMD":19,"TXT":"HALLO"}
Fertig-Zeitpunkt (Aufheizen planen)20-Sonderfall: Der Zielzeitpunkt steht als Unix-Timestamp in XTIME, VALUE wird dabei überschrieben. Das Modul schätzt die Aufheizzeit (plus 2 h Reserve) und startet die Heizung rechtzeitig. {"CMD":20,"XTIME":1767250800}
Ein/Aus umschalten22-Wie ein Druck auf die Power-Taste - ein Umschalter, kein Ein/Aus-Wert. {"CMD":22}
Tastensperre umschalten23-Wie ein Druck auf die Lock-Taste. {"CMD":23}
Filterwechsel-Timer zurücksetzen24-Setzt den Timer für den letzten Filterwechsel auf jetzt. {"CMD":24}
Wasserwechsel-Timer zurücksetzen25-Setzt den Timer für den letzten Wasserwechsel auf jetzt. {"CMD":25}

Alle hier gelisteten Befehle gibt es in Firmware 1.2.0 und neuer. CMD 7 ist intern belegt und wird bewusst nicht ausgeführt.


Erweiterte Parameter für /hook/

Neben CMD und VALUE unterstützt der /hook/-Endpunkt optional weitere Parameter im JSON-Objekt:

ParameterTypBeschreibung
XTIMEIntegerUnix-Timestamp, wann der Befehl ausgeführt werden soll. Standardmäßig sofort (jetzt).
INTERVALIntegerWiederholungsintervall in Sekunden. 0 = einmalig.
FORCEBooleantrue = Sicherheitsprüfungen umgehen (z.B. Pumpe ausschalten wenn Heizung läuft). Vorsichtig einsetzen.
TXTStringText, den das Pumpendisplay zusätzlich anzeigt (max. 96 Zeichen). Bei CMD 13 der Dateiname der Melodie.

Zusätzlich gelten feste Obergrenzen: XTIME maximal 4102444800 (01.01.2100), INTERVAL maximal 31622400 Sekunden (366 Tage), TXT maximal 96 Zeichen.

Gültige Wertebereiche

Seit Version 2.0.0 prüft das Modul jeden Webhook, bevor er in die Warteschlange kommt. Liegt ein Wert außerhalb des erlaubten Bereichs, wird der Befehl nicht ausgeführt und /hook/ antwortet mit 400 und einer Begründung im Klartext.

CMDErlaubte VALUE-Werte
0 Ziel-Temperatur1-40 (wird als °C gelesen) oder 51-104 (wird als °F gelesen)
1, 2, 3, 4, 11, 18, 260/1 bzw. false/true
12 Display-Helligkeit0-8
14 Umgebungstemperatur °F-40 bis 140
15 Umgebungstemperatur °C-40 bis 60
20 Fertig-Zeitpunktkein Wert, dafür muss XTIME gesetzt sein
27 pH-Wert0-140 (entspricht pH 0,0-14,0)
28 Chlorgehalt0-100 (entspricht 0,0-10,0 mg/L)
29 Cyanursäure0-1000 (entspricht 0,0-100,0 mg/L)
30 Alkalität0-300 mg/L

Antwortcodes von /hook/

CodeBedeutung
200Befehl angenommen. Der Antworttext enthält CMD VALUE XTIME des eingereihten Befehls
400JSON fehlerhaft, unbekannter CMD oder Wert außerhalb des erlaubten Bereichs (Text nennt den Grund)
401Webhook-Schutz ist aktiv, Zugangsdaten fehlen oder sind falsch
404Webhooks sind am Modul deaktiviert
409Warteschlange voll (maximal 20 Befehle)

Detaillierte Erklärungen zu den Parametern

  • CMD (Command ID): Eine eindeutige Nummer, die den auszuführenden Befehl identifiziert (siehe Tabelle oben).
  • VALUE (Wert): Der Wert, der für den jeweiligen Befehl gesetzt werden soll.
    • Boolean: Akzeptiert true (für einschalten/aktivieren) oder false (für ausschalten/deaktivieren).
    • Unsigned Integer: Akzeptiert positive Ganzzahlen (inkl. 0).
    • Integer: Akzeptiert positive und negative Ganzzahlen.

Anwendungsbeispiel mit curl

Du kannst Webhooks einfach über die Kommandozeile mit einem Tool wie curl testen. Um beispielsweise die Pumpe einzuschalten (angenommen, dein Modul ist unter 192.168.1.100 erreichbar):

curl "http://192.168.1.100/hook/?send={\"CMD\":4,\"VALUE\":true}"

Beachte die notwendige Maskierung der Anführungszeichen (\") innerhalb des JSON-Strings, wenn du curl in einer typischen Shell-Umgebung verwendest.


Statusabfrage per /getstates/

Seit Version 1.1.6 gibt es einen Endpunkt, mit dem du den aktuellen Ein-/Aus-Status aller wichtigen Komponenten deines WifiWhirl-Moduls auslesen kannst.

  • Endpunkt: /getstates/
  • Methode: HTTP GET
  • Parameter: Keine

Antwortformat

Beispiel-Abfrage:

curl "http://192.168.1.100/getstates/"

Beispiel-Antwort:

{"pump":true,"heater":false,"bubbles":false,"jets":false,"power":true,"lock":true}

Bedeutung der Schlüssel:

SchlüsselTypBeschreibung
pumpBooleanStatus der Filterpumpe (true = an, false = aus)
heaterBooleanStatus der Heizung (true = an, false = aus)
bubblesBooleanStatus der AirJet-Düsen (true = an, false = aus)
jetsBooleanStatus der HydroJet-Düsen (true = an, false = aus)
powerBooleanGesamtstatus des Systems (true = an, false = aus)
lockBooleanStatus der Tastensperre (true = aktiv, false = inaktiv)

Temperaturabfrage per /gettemps/

Seit Version 1.2.0 gibt es einen Endpunkt für alle Temperaturwerte. Die Antwort enthält immer beide Einheiten (Celsius und Fahrenheit), unabhängig von der Geräteeinstellung.

  • Endpunkt: /gettemps/
  • Methode: HTTP GET
  • Parameter: Optional - Feldfilterung über Query-Parameter

Antwortformat

Beispiel-Abfrage (alle Felder):

curl "http://192.168.1.100/gettemps/"

Beispiel-Antwort:

{"currentC":38,"currentF":100,"targetC":40,"targetF":104,"ambientC":20,"ambientF":68,"unit":"C"}

Bedeutung der Schlüssel:

SchlüsselTypBeschreibung
currentCNumberAktuelle Wassertemperatur in °C
currentFNumberAktuelle Wassertemperatur in °F
targetCNumberZieltemperatur in °C
targetFNumberZieltemperatur in °F
ambientCNumberUmgebungstemperatur in °C
ambientFNumberUmgebungstemperatur in °F
unitStringEinstellung am Gerät: "C" (Celsius) oder "F" (Fahrenheit)

Feldfilterung

Um Bandbreite zu sparen, kannst du gezielt nur bestimmte Felder anfordern, indem du ihre Namen als Query-Parameter übergibst:

# Nur aktuelle Temperatur in Celsius
curl "http://192.168.1.100/gettemps/?currentC"

# Aktuelle und Zieltemperatur in Celsius
curl "http://192.168.1.100/gettemps/?currentC&targetC"

Ohne Parameter werden immer alle Felder zurückgegeben.


Webhooks aktivieren und absichern

Seit Version 2.0.0 kannst du die Webhook-Schnittstelle in der Weboberfläche unter Gerät → Webhooks steuern:

  • Webhooks aktivieren: Schaltet /hook/ komplett ab, wenn du die Schnittstelle nicht brauchst. Aufrufe antworten dann mit 404. Auf ausgelieferten Modulen sind Webhooks aktiv.
  • Webhooks schützen: Optionale HTTP-Basic-Auth mit eigenem Benutzernamen und Passwort - unabhängig vom Web-Login. Dieselben Zugangsdaten schützen auch den Prometheus-Endpunkt /metrics.

Mit aktiviertem Schutz sieht der Aufruf so aus:

curl -u benutzer:passwort "http://192.168.1.100/hook/?send={\"CMD\":4,\"VALUE\":true}"
Web-Login und Maschinen-Zugriff

Das allgemeine Web-Login (Gerät → Login) arbeitet mit Session-Cookies. Ist es aktiv, antworten /getstates/, /gettemps/, /getpolldata/ und /sendcommand/ für Skripte mit 401, weil diese keine Session haben. Für den Zugriff durch Maschinen bleiben /hook/ und /metrics erreichbar - sie nutzen die separate Webhook-Basic-Auth.


Prometheus-Metriken per /metrics

Für Monitoring-Setups liefert das Modul seine Kernwerte im Prometheus-Textformat.

  • Endpunkt: /metrics
  • Methode: HTTP GET
  • Parameter: Keine
  • Authentifizierung: dieselbe optionale Webhook-Basic-Auth (siehe oben)
curl "http://192.168.1.100/metrics"
MetrikBedeutung
layzspa_info{version,name}Firmware-Version und Gerätename, Wert immer 1
layzspa_temperature_celciusAktuelle Wassertemperatur
layzspa_target_temperature_celciusZieltemperatur
layzspa_heater_stateHeizung (1 = an)
layzspa_pump_stateFilterpumpe (1 = an)
layzspa_jets_stateHydroJet-Düsen (1 = an)
layzspa_bubbles_stateAirJet-Düsen (1 = an)
layzspa_power_stateGesamtstatus (1 = an)
layzspa_locked_stateTastensperre (1 = aktiv)
layzspa_unit_stateEinheit am Gerät: 1 = °C, 0 = °F

Die beiden Temperaturmetriken kommen roh aus der Pumpe, also in der am Gerät eingestellten Einheit - trotz _celcius im Namen. layzspa_unit_state sagt dir, welche Einheit gerade gilt. Brauchst du beide Einheiten fest, nutze /gettemps/.


HTTP Polling Fallback

Seit Version 1.2.0 stehen zwei zusätzliche Endpunkte als Fallback für Browser bereit, die Probleme mit WebSocket-Verbindungen haben (z.B. bestimmte iOS-Safari-Versionen). Diese Endpunkte werden normalerweise vom Frontend intern genutzt und können in der Web-Konfiguration aktiviert werden.

GET /getpolldata/

Gibt den vollständigen aktuellen Gerätezustand als JSON-Array zurück (äquivalent zu den WebSocket-Nachrichten STATES, TIMES und OTHER).

  • Endpunkt: /getpolldata/
  • Methode: HTTP GET
  • Parameter: Keine

POST /sendcommand/

Sendet einen Steuerbefehl an das Modul. Akzeptiert dasselbe JSON-Format wie die WebSocket-Schnittstelle.

  • Endpunkt: /sendcommand/
  • Methode: HTTP POST
  • Body: JSON-Objekt mit den Feldern CMD, VALUE, XTIME, INTERVAL, TXT, FORCE

Beispiel:

curl -X POST "http://192.168.1.100/sendcommand/" \
-H "Content-Type: application/json" \
-d '{"CMD":4,"VALUE":true}'

Wichtige Sicherheitshinweise

  • Standardmäßig keine Authentifizierung: Ohne aktivierten Webhook-Schutz kann jeder, der Zugriff auf dein lokales Netzwerk hat und die IP-Adresse/den Hostnamen deines Moduls kennt, diese Webhooks auslösen. Ab Version 2.0.0 kannst du das mit HTTP-Basic-Auth absichern (siehe Webhooks aktivieren und absichern).
  • Keine Verschlüsselung: Das Modul spricht kein HTTPS. Zugangsdaten und Befehle gehen im Klartext über das Netzwerk.
  • Netzwerksicherheit: Stelle sicher, dass dein WLAN angemessen gesichert ist (z.B. durch WPA2 Verschlüsselung und ein starkes Passwort).
  • Kein Fernzugriff ohne VPN: Setze das Modul nicht direkt dem Internet aus (z.B. durch Port-Weiterleitungen im Router). Wenn du von außerhalb deines Heimnetzwerks auf die Webhooks zugreifen möchtest, verwende eine sichere VPN-Verbindung zu deinem Heimnetzwerk.

Bei Fragen oder Problemen mit den Webhooks, schaue bitte auch in die FAQ oder erstelle ein Issue im WifiWhirl GitHub Repository.