Curl in REST Sensor wandeln

Hallo Liebe Simon42 Community,

ich versuche seit geraumer Zeit eine fehlende Integration in meine HA Lösung einzubauen.
Im Detail geht es um die Wasseraufbereitungsanlage Watercryst Biocat.

Diese sitzt direkt nach der Wasseruhr und wandelt den Kalk um. Genauergesagt sie macht ihn rund (aber das führt jetzt zuweit).
Was mir die Biocat recht hübsch ausgeben kann ist der aktuelle Wasserverbrauch, der Druck in der Wasserleitung uvm. Der Hersteller selbst hat eine schöne API dazu:

https://appapi.watercryst.com/#overview

Ich habe mit der API auch schon geschaft einen funktionierenden GET zu bauen. Dieser sieht so aus:

curl -X GET “https://appapi.watercryst.com/v1/statistics/cumulative/daily
-H “accept: application/json”
-H “x-api-key: [MYKEY]” \

Als Output würde hier ein einziger INT Wert zurück kommen. Zum Beispiel 109.56

Wenn ich diesen Befehl im Template Editor eingebe kommt nix raus. Was muss ich jetzt machen um daraus einen Sensor zu bekommen?

Ich denke es muss ein RESTful Sensor werden. Brauche ich dazu noch eine Integration? Vielen Dank fürs helfen…

VG

RESTful bzw. RESTful Sensor ist die Integration, die über die Configuration.yaml Integriert wird.

LG
Tobi

Ok. Also quasi manuell in die config.yaml einfügen verstanden.

Aber wie muss ich den curl Befehl umbauen?

Kann ich das über den Template Editor testen damit ich sehe ob es funktioniert?

Ich habe nun viele Youtube Videos angesehen und mich durch diverse Foren gewälzt.
Die wichtigste Entscheidung: ICH BRAUCH EINE TESTUMGEBUNG!

Hier mal ein paar Links:

https://www.youtube.com/watch?v=G2YY-HXGmrE

https://youtu.be/34yD15jmeEA?feature=shared

Restful: retrieve multiple values with one sensor - Configuration - Home Assistant Community

REST sensor with multiple attributes - #4 by davinci - Configuration - Home Assistant Community

RESTful - Home Assistant

RESTful Sensor - Home Assistant

Sensor entity | Home Assistant Developer Docs

Also schnell einen Pi aufgesetzt und dort gespielt.
Mit ein wenig Try-n-Error und genau die Fehlermeldungen in den Entwicklerwerkzeugen lesen habe ich jetzt ein grundsätzlich funktionierendes Setup:

Das funktioniert grundsätzlich mit allen Watercryst Biocat Systemen die mit der Watercryst Cloud sprechen - sprich eine App Funktion haben.

rest:
  - resource: https://appapi.watercryst.com/v1/measurements/direct
    scan_interval: 31
    headers:
      accept: application/json
      x-api-key: [My API-KEY von Watercryst]

    sensor:
      - name: "Public Water Temperature"
        value_template: '{{value_json["waterTemp"]}}'
        device_class: temperature
        unit_of_measurement: °C
      - name: "Waterpressure to Building"
        value_template: '{{value_json["pressure"]}}'
        device_class: pressure
        unit_of_measurement: bar
      - name: "Last Water Tap Volume"
        value_template: '{{value_json["lastWaterTapVolume"]}}'
        device_class: water
        unit_of_measurement: L
      - name: "Last Water Tap Duration sec"
        value_template: '{{value_json["lastWaterTapDuration"]}}'
        
        
  - resource: https://appapi.watercryst.com/v1/statistics/cumulative/daily
    scan_interval: 60
    headers:
      accept: application/json
      x-api-key: [My API-KEY von Watercryst]

    sensor:
      - name: "Total Water Consumption Today"
        device_class: water
        unit_of_measurement: L

Jetzt bleibt nur noch ein “Problem”. Als ich noch mit RESTful Sensoren gespielt habe hatte ich immer wieder als Return Value unavailable. Im Log steht auch das gleiche, dass er zulange keine Antwort bekommen hat.
In Summe sind es zwei Abfragen:

  1. Aktueller Tageswasserbezug => kommt nur ein INT wert zurück
  2. Live Messungswerte => kommt ein Array zurück mit Druck, Temperatur, etc

Ich habe den Verdacht es lag auch daran, dass ich alle 20sek die Werte gezogen habe. Jedoch kam der Fehler deutlich häufiger wenn der Scan-Intervall bei beiden Sensoren gleich war. Ich denke mal das HA wirklich beide Werte dann zeitgleich abgefragt hat und es da vielleicht zu einem DoS gekommen ist.

Meine Frage:
Bekomme ich beide Sensoren irgendwie in einen Abfrage Zyklus hinein oder anders wie kann ich Sicherstellen, dass nicht beide gleichzeitig ausgelöst werden?
Habe jetzt den einen auf 31sek und den anderen auf 60 gestellt. Das bedeutet das spätestens 31*60 = 1860sek oder alle 31min eine Kollidierung entsteht. Habt ihr eine Idee wie ich das verhindern kann?

Update:
So für alle die vielleicht auch eine Watercryst Biocat Anlage haben. Hier mein finaler Code der alle verfügbaren Sensorwerte ausließt:

rest:
  - resource: https://appapi.watercryst.com/v1/measurements/direct
    scan_interval: 31
    headers:
      accept: application/json
      x-api-key: [My API-Key]

    sensor:
      - name: "Public Water Temperature"
        value_template: '{{value_json["waterTemp"]}}'
        device_class: temperature
        unit_of_measurement: °C
      - name: "Waterpressure to Building"
        value_template: '{{value_json["pressure"]}}'
        device_class: pressure
        unit_of_measurement: bar
      - name: "Last Water Tap Volume"
        value_template: '{{value_json["lastWaterTapVolume"]}}'
        device_class: water
        unit_of_measurement: L
      - name: "Last Water Tap Duration sec"
        value_template: '{{value_json["lastWaterTapDuration"]}}'
        device_class: duration
        unit_of_measurement: s
        
  - resource: https://appapi.watercryst.com/v1/statistics/cumulative/daily
    scan_interval: 60
    headers:
      accept: application/json
      x-api-key: [My API-Key]

    sensor:
      - name: "Total Water Consumption Today"
        device_class: water
        unit_of_measurement: L
        state_class: total

  - resource: https://appapi.watercryst.com/v1/state
    scan_interval: 13
    headers:
      accept: application/json
      x-api-key: [My API-Key]

    sensor:
      - name: "Biocat Operation Mode"
        value_template: '{{value_json["mode"]["name"]}}'

    binary_sensor:
      - name: "Biocat Water Treatment Online"
        value_template: '{{value_json["online"]}}'

      - name: "Biocat Microleakage Protection Absence Mode"
        value_template: '{{value_json["waterProtection"]["absenceModeEnabled"]}}'

Mit dem Code werden alle Sensorwerte ausgelesen jedoch keine Funktionen wie Desinfektion, Wasserzufuhr schließen/öffnen/quittieren ausgelöst.

Der Wert “Total Water Consumption Today” kann im Energiedashboard direkt verwendet werden.
Soweit sinnvoll habe ich auch bereits die passenden Sensortypen und Einheiten definiert.

Jetzt wäre es noch cool, das irgendwie in eine Integration zu packen. Aber dafür bin ich (noch) zu blöd.

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Danke für die Arbeit zu den Biocat Systemen.
Bei Verwendung des finalen Codes erhalte ich
UndefinedError: ‘value_json’ is undefined
Wo könnte der Fehler sein?

Hast du auf der Biocat API Website mal probiert ob dein Aufruf per se klappen würde?

Mal HA komplett neu gestartet?

Entschuldige, ich habe Deine schnelle Antwort übersehen.
Ich habe es gerade noch einmal ausprobiert. Mein Fehler war vermutlich das ich den API-Key nicht vollständig kopiert habe. :man_facepalming:
Jetzt funktioniert es.
Die kommenden zwei Wochen habe ich keine Zeit. Danach werde ich mal schauen, was ich mit den Daten machen kann.
Vielen Dank und Gruß!

Hallo zusammen,

Ich habe ebenfalls eine Wasseraufbereitungsanlage Watercryst Biocat, ich hatte jetzt mal angefangen es auch als HACS Integration in HA einzubringen anhand des Feedbacks hier:

2 „Gefällt mir“

Mega Cool!!!
Du hast das geschafft was ich nie konnte.
Werde demnächst deine HACS Integration ausprobieren.

Mein API Call läuft seit Beginn eigentlich super stabil. Einmal gab es einen Ausfall der API aber watercryst hat hier sehr schnell reagiert.

Das einzige was einfach manchmal passiert (vielleicht hast du da eine Idee) es dürfen nicht zwei API Calls gleichzeitig bzw. Zu eng an einander erfolgen. Ich habe deshalb versucht erst mit Primzahlen die Abfrage Intervalle zu entzerren aber das hat so nicht besser funktioniert als hier.

Es wäre einfach gut wenn zwischen den Abfragen so 2-5sec wären.

Falls nötig kann ich nochmal den persönlichen Kontakt zu Watercryst raussuchen die fanden das toll was hier gemacht wird.

Nächster Schritt wäre dann über die API die Sperre zu verriegeln bzw. Entriegeln. Ist eigentlich nur ein Set Aufruf. Wie siehst du das?

Info an alle zu den Werten: ich hatte Panik weil der Wasserdruck teilweise über 7 Bar geht obgleich das ja eigentlich nicht seien durch den Druckminderer.

Dank der Luxtronik Integration konnte ich herausfinden, dass diese Werte immer nur dann auftreten, wenn das 3-Wege Ventil umschaltet zwischen Heizen und Bodenheizung. Sprich der Druck kommt nicht von der Hauszuleitungsseite sondern von der Heizungsseite. Somit ist das laut Aussage vom Heizungsbauer ok.

Ja ich denke die Sperre könnte noch gut integriert werden, ich denke dann auch an Automatisierungen um z.B. bei den Wassersensoren die ich bei Waschmaschine usw. von HomematicIP habe entsprechend zu schließen.
Das mit der Abfrage auf bspw. 3 Sek. wäre kein Problem - ich muss nur erstmal nach meiner Rückkehr aus dem Urlaub die bestehende Integration testen, das zu erweitern wäre einfach, ich könnte es auch in die Abfrage bei Installation integrieren, sodass jeder User selbst zwischen 2 und 5 Sek. auswählen könnte.
Weiterhin könnte man das ganze dann auch grafisch gestalten.

1 „Gefällt mir“

ich habe jetzt erstmal eine selbst gestaltetes Icon eingereicht, sofern wir die vom Hersteller verwenden dürften, könnten wir die jederzeit ersetzen.
In der Beta habe ich jetzt auch die Abfrage des Pollings der API bei Installation ergänzt sowie die Sperre aufgenommen, allerdings noch ungetestet - komme leider erst wieder in 2Wochen an mein echtes System vorort :slight_smile: