Hansgrohe Pontos = Syr Safe Tech

Hi,
I would love to see the Hansgrohe Pontos supported.
It is a device with Wlan that comes in your main water line and can detect leckages.
It has an http API.
Symcon already supports this with this php which includes all neccessary commands:

Got a link to that?

http://192.168.xxx.xxx:5333/set/ADM/(2)f to enable admin mode (only once needed)
http://192.168.xxx.xxx:5333/pontos-base/get/all to get the JSON which reads as:

{"getSRN":"000012345","getVER":"PontosBase V1.29","getTYP":"140","getCNO":"RDGZ62BXXXXXXX","getMAC":"00:aa:bb:cc:dd:ee","getPRF":"1","getPRN":"5","getPN1":"Anwesend","getPV1":"300","getPT1":"60","getPF1":"2100","getPM1":"1","getPR1":"0","getPB1":"1","getPN2":"Abwesend","getPV2":"30","getPT2":"30","getPF2":"1200","getPM2":"1","getPR2":"0","getPB2":"1","getPN3":"Urlaub","getPV3":"5","getPT3":"5","getPF3":"600","getPM3":"1","getPR3":"0","getPB3":"0","getPN4":"Erhoehter Verbrauch","getPV4":"5000","getPT4":"300","getPF4":"5000","getPM4":"1","getPR4":"0","getPB4":"1","getPN5":"Max. Verbrauch","getPV5":"0","getPT5":"0","getPF5":"0","getPM5":"0","getPR5":"0","getPB5":"0","getPN6":"","getPV6":"300","getPT6":"60","getPF6":"3000","getPM6":"1","getPR6":"0","getPB6":"1","getPN7":"","getPV7":"300","getPT7":"60","getPF7":"3000","getPM7":"1","getPR7":"0","getPB7":"1","getPN8":"","getPV8":"300","getPT8":"60","getPF8":"3000","getPM8":"1","getPR8":"0","getPB8":"1","getTMP":"0","getVLV":"20","getCEL":"260","getBAR":"3800 mbar","getNPS":"134","getALA":"FF","getALM":"Alarms:->FF FF FF FF FF FF FF FF","getDMA":"1","getAVO":"0mL","getVOL":"Vol[L]68","get71":"0","getBAT":"9,70","getNET":"12,42","getBUZ":"1","getDBD":"10","getDBT":"15","getDST":"180","getDCM":"3","getDOM":"60","getDPL":"10","getDTC":"3","getDRP":"1","getWFS":"2","getWFR":"10","getRTC":"1685312918","getIDS":"1","getTMZ":"4"}

oh sorry, in case you meant any official info about the api? Haven’t found any.

Ok, it should be doable with the restful integration, which is already part of HA.

It should be possible, yes. However, some functions can also be set via the api with GET/POST which might need a different approach.

That would be rest commands.

And would also be documented presumably.

Indeed: https://www.home-assistant.io/integrations/#search/restful

This is my first approach. I still need to work on switches and buttons with correct states.
Energy dashboard working.

rest:
- resource: http://192.168.xx.xx:5333/pontos-base/get/all
  scan_interval: 60
  sensor:
    - name: "Gesamtverbrauch in Liter"
      value_template: '{{ value_json.getVOL | replace("Vol[L]", "") }}'
      device_class: water
      unit_of_measurement: "L"
      state_class: total_increasing
    - name: "Wasserdruck"
      value_template: '{{ value_json.getBAR | replace(" mbar","") }}'
      device_class: pressure
      unit_of_measurement: "mbar"
    - name: "Wassertemperatur"
      value_template: '{{ value_json.getCEL | float / 10 }}'
      device_class: temperature
      unit_of_measurement: "°C"
    - name: "Zeit in Sek. seit Turbine keinen Impuls bekommt"
      value_template: "{{ value_json.getNPS }}"
      unit_of_measurement: "s"
    - name: "Volumen des aktuellen Wasserverbrauchs in ml"
      value_template: '{{ value_json.getAVO | replace("mL","") }}'
      device_class: water
      unit_of_measurement: "mL"
    - name: "konfigurierter Micro Leakage-Test, Druckabfall in bar"
      value_template: "{{ value_json.getDBD }}"
      device_class: pressure
      unit_of_measurement: "bar"
    - name: "Wifi Verbindungsstatus"
      value_template: "{{ value_json.getWFS }}"
    - name: "Wifi Signalstärke (RSSI)"
      value_template: "{{ value_json.getWFR }}"
      device_class: signal_strength
      unit_of_measurement: "dB"
    - name: "Batteriespannung"
      value_template: '{{ value_json.getBAT | replace(",",".") | float }}'
      device_class: voltage
      unit_of_measurement: "V"
    - name: "Netzspannung"
      value_template: '{{ value_json.getNET | replace(",",".") | float }}'
      device_class: voltage
      unit_of_measurement: "V"
    - name: "Serien-Nr."
      value_template: "{{ value_json.getSRN }}"
    - name: "Firmware Version"
      value_template: "{{ value_json.getVER }}"
    - name: "Typ"
      value_template: "{{ value_json.getTYP }}"
    - name: "Codenummer"
      value_template: "{{ value_json.getCNO }}"
    - name: "MAC Addresse"
      value_template: "{{ value_json.getMAC }}"
    - name: "Alarm"
      value_template: >
        {% set codes =
          { "FF": "kein Alarm",
            "A1": "ALARM END SWITCH",
            "A2": "ALARM: Turbine blockiert!",
            "A3": "ALARM: Leckagevolumen erreicht!",
            "A4": "ALARM: Leckagezeit erreicht!",
            "A5": "ALARM: Maximale Durchflussmenge erreicht!",
            "A6": "ALARM: Mikroleckage entdeckt!",
            "A7": "ALARM EXT. SENSOR LEAKAGE RADIO",
            "A8": "ALARM EXT. SENSOR LEAKAGE CABLE",
            "A9": "ALARM: Drucksensor fehlerhaft!",
            "AA": "ALARM: Temperatursensor fehlerhaft!",
            "AB": "ALARM: Batterie schwach!",
            "AE": "Fehler: keine Information verfügbar"
          } %}
        {{ codes.get(value_json['getALA'], 'unknown') }}
    - name: "Aktives Profil"
      value_template: >
        {% set codes =
          { "1": "Anwesend",
            "2": "Abwesend",
            "3": "Urlaub",
            "4": "erhöhter Verbrauch",
            "5": "maximaler Verbrauch",
            "6": "not definied",
            "7": "not definied",
            "8": "not definied"
          } %}
        {{ codes.get(value_json['getPRF'], 'unknown') }}
    - name: "Ventilstatus"
      value_template: >
        {% set codes =
          { "10": "geschlossen",
            "11": "wird verschlossen",
            "20": "geöffnet",
            "21": "wird geöffnet"
          } %}
        {{ codes.get(value_json['getVLV'], 'unknown') }}


- resource: http://192.168.xx.xx:5333/pontos-base/get/cnd
  scan_interval: 60
  sensor:
    - name: "Wasserleitfähigkeit"
      value_template: "{{ value_json.getCND }}"
      unit_of_measurement: "µS/cm"
    - name: "Wasserhärte"
      value_template: "{{ value_json.getCND | float / 30 }}"
      unit_of_measurement: "dH"
rest_command:
pontos_valve_close:
  url: http://192.168.xx.xx:5333/set/ab/2
pontos_valve_open:
  url: http://192.168.xx.xx:5333/set/ab/1
pontos_clear_alarm:
  url: http://192.168.xx.xx:5333/clr/ala
pontos_admin_enter:
  url: http://192.168.xx.xx:5333/set/ADM/(2)f
pontos_admin_leave:
  url: http://192.168.xx.xx:5333/clr/ADM
pontos_profile_1:
  url: http://192.168.xx.xx:5333/set/prf/1
pontos_profile_2:
  url: http://192.168.xx.xx:5333/set/prf/2
pontos_profile_3:
  url: http://192.168.xx.xx:5333/set/prf/3
pontos_profile_4:
  url: http://192.168.xx.xx:5333/set/prf/4
pontos_profile_5:
  url: http://192.168.xx.xx:5333/set/prf/5
pontos_profile_6:
  url: http://192.168.xx.xx:5333/set/prf/6
pontos_profile_7:
  url: http://192.168.xx.xx:5333/set/prf/7
pontos_profile_8:
  url: http://192.168.xx.xx:5333/set/prf/8


1 Like

Lol I know, I was referring to the Hansgrohe api.

http://192.168.xxx.xxx:5333/set/ADM/(2)f to enable admin mode (only once needed)

Since firmware-update today (new fw version 1.30) I get an error:

HTTP 400 Error. Bad request

Before I had to call that link manually from time to time…

Update: Power off and on and it worked again with answer:

{"setADM(2)f":"FACTORY"}

The posted URL was wrong, it should be
http://192.168.xxx.xxx:5333/pontos-base/set/ADM/(2)f

I grabbed another sensor which is not used

    - name: "Admin Interface"
      value_template: '{{ value_json.getDST }}'

and made an automation once it has “ERROR” in it.

- alias: "Fehlererkennung Pontos"
  trigger:
    - platform: state
      entity_id: sensor.admin_interface
  condition:
    - condition: template
      value_template: "{{ 'ERROR' in trigger.to_state.state }}"
  action:
    - service: rest_command.pontos_admin_enter

Any news here? Maybe some complete rest templates?

Would love to see a full integration.

Any updates on this topic? I would like to add my Pontos Base to my homeassistant, basically tracking water consumption would be of interest.
But also setting limits of the pontos depending on my irrigation system outside would be great…

Thanks for the restful sensoes @cg089

The commands is missing /pontos-base/ in the URL. I took the liberty of making some changes:

  • Translated to english using chatgpt
  • Fixed command URL’s

Working well to get the water usage into the energy panel. Sensors are missing uinique ID’s, so adding a GUID or somthing to them would be another improvement.
Thinking of wrapping it all in python and adding it to HACS.

rest:
- resource: http://192.168.0.105:5333/pontos-base/get/all
  scan_interval: 60
  sensor:
    - name: "Total consumption in liters"
      value_template: '{{ value_json.getVOL | replace("Vol[L]", "") }}'
      device_class: water
      unit_of_measurement: "L"
      state_class: total_increasing
    - name: "Water pressure"
      value_template: '{{ value_json.getBAR | replace(" mbar","") }}'
      device_class: pressure
      unit_of_measurement: "mbar"
    - name: "Water temperature"
      value_template: '{{ value_json.getCEL | float / 10 }}'
      device_class: temperature
      unit_of_measurement: "°C"
    - name: "Time in seconds since turbine received no pulse"
      value_template: "{{ value_json.getNPS }}"
      unit_of_measurement: "s"
    - name: "Volume of current water consumption in ml"
      value_template: '{{ value_json.getAVO | replace("mL","") }}'
      device_class: water
      unit_of_measurement: "mL"
    - name: "Configured Micro Leakage-Test, pressure drop in bar"
      value_template: "{{ value_json.getDBD }}"
      device_class: pressure
      unit_of_measurement: "bar"
    - name: "Wifi connection status"
      value_template: "{{ value_json.getWFS }}"
    - name: "Wifi signal strength (RSSI)"
      value_template: "{{ value_json.getWFR }}"
      device_class: signal_strength
      unit_of_measurement: "dB"
    - name: "Battery voltage"
      value_template: '{{ value_json.getBAT | replace(",",".") | float }}'
      device_class: voltage
      unit_of_measurement: "V"
    - name: "Mains voltage"
      value_template: '{{ value_json.getNET | replace(",",".") | float }}'
      device_class: voltage
      unit_of_measurement: "V"
    - name: "Serial number"
      value_template: "{{ value_json.getSRN }}"
    - name: "Firmware version"
      value_template: "{{ value_json.getVER }}"
    - name: "Type"
      value_template: "{{ value_json.getTYP }}"
    - name: "Code number"
      value_template: "{{ value_json.getCNO }}"
    - name: "MAC Address"
      value_template: "{{ value_json.getMAC }}"
    - name: "Alarm"
      value_template: >
        {% set codes =
          { "FF": "no alarm",
            "A1": "ALARM END SWITCH",
            "A2": "ALARM: Turbine blocked!",
            "A3": "ALARM: Leakage volume reached!",
            "A4": "ALARM: Leakage time reached!",
            "A5": "ALARM: Maximum flow rate reached!",
            "A6": "ALARM: Microleakage detected!",
            "A7": "ALARM EXT. SENSOR LEAKAGE RADIO",
            "A8": "ALARM EXT. SENSOR LEAKAGE CABLE",
            "A9": "ALARM: Pressure sensor faulty!",
            "AA": "ALARM: Temperature sensor faulty!",
            "AB": "ALARM: Weak battery!",
            "AE": "Error: no information available"
          } %}
        {{ codes.get(value_json['getALA'], 'unknown') }}
    - name: "Active profile"
      value_template: >
        {% set codes =
          { "1": "Present",
            "2": "Absent",
            "3": "Vacation",
            "4": "Increased consumption",
            "5": "Maximum consumption",
            "6": "not defined",
            "7": "not defined",
            "8": "not defined"
          } %}
        {{ codes.get(value_json['getPRF'], 'unknown') }}
    - name: "Valve status"
      value_template: >
        {% set codes =
          { "10": "Closed",
            "11": "Closing",
            "20": "Open",
            "21": "Opening"
          } %}
        {{ codes.get(value_json['getVLV'], 'unknown') }}


- resource: http://192.168.0.105:5333/pontos-base/get/cnd
  scan_interval: 60
  sensor:
    - name: "Water conductivity"
      value_template: "{{ value_json.getCND }}"
      unit_of_measurement: "µS/cm"
    - name: "Water hardness"
      value_template: "{{ value_json.getCND | float / 30 }}"
      unit_of_measurement: "dH"


rest_command:
  pontos_valve_close:
    url: http://192.168.0.105:5333/pontos-base/set/ab/2
  pontos_valve_open:
    url: http://192.168.0.105:5333/pontos-base/set/ab/1
  pontos_clear_alarm:
    url: http://192.168.0.105:5333/pontos-base/clr/ala
  pontos_admin_enter:
    url: http://192.168.0.105:5333/pontos-base/set/ADM/(2)f
  pontos_admin_leave:
    url: http://192.168.0.105:5333/pontos-base/clr/ADM
  pontos_profile_1:
    url: http://192.168.0.105:5333/pontos-base/set/prf/1
  pontos_profile_2:
    url: http://192.168.0.105:5333/pontos-base/set/prf/2
  pontos_profile_3:
    url: http://192.168.0.105:5333/pontos-base/set/prf/3
  pontos_profile_4:
    url: http://192.168.0.105:5333/pontos-base/set/prf/4
  pontos_profile_5:
    url: http://192.168.0.105:5333/pontos-base/set/prf/5
  pontos_profile_6:
    url: http://192.168.0.105:5333/pontos-base/set/prf/6
  pontos_profile_7:
    url: http://192.168.0.105:5333/pontos-base/set/prf/7
  pontos_profile_8:
    url: http://192.168.0.105:5333/pontos-base/set/prf/8
2 Likes

I would be very greateful if you could add this to HACS.

I tried to implement this in my Home Assistant Core running on an Synology DS218 but unfortunately the entities do not show up. Even if I add unique IDs.

I am working on it! Currently getting the sensors read correctly. All organized under a device etc. Have not organized it into the correct folder structure yet, since I’m just using git within the custom_components folder of my home assistant test environment.

You can find it here: GitHub - sangvikh/hass-pontos: Home Assistant integration for Hansgrohe Pontos

1 Like

Hi! I just finished installing my Syr SafeTech+ (which is different than the Syr SafeTech). I made a few modifications to your yaml, and pasted it into configuration and it mostly works (like magic :slight_smile: !) If you are willing, I can give you feedback for how to adapt what you are doing to support this device as well, and then maybe you can add support for it as well.

A couple examples of small differences:
instead of /pontos-base/, this device has the name /trio/
instead of “1” and “2” for open and closed, this device uses “true” (for closed) and “false”

That sounds very doable. I can add a configuration selection for that sensor to change the url. The valve status can just be added to the valve status dict :smiley:

What is the response when you hit http://:5333/trio/get/all ? Should show what info is available from the sensor.

I noticed you had a previous edit where the sensor stopped working. With the pontos, the admin mode times out after a while. In the integration I set it into admin mode whenever reading the data.