Home Assistant integration for Hansgrohe Pontos and SYR water meters, talking to the device's local HTTP API on port 5333 – no cloud, no account, everything stays in your network.
Home Assistant and HACS list the integration as Hansgrohe Pontos; the domain stays pontos, so
entity ids, unique ids and existing config entries are unaffected by the name.
Fork of sangvikh/hass-pontos. All original work is by @sangvikh. This fork is not the HACS default store repository: add it as a custom repository (see Installation).
- Water consumption, pressure, temperature, flow rate and conductivity sensors
- Water shut-off valve, profile selection, leak test and buzzer controls
- Binary sensors for leakage alarms, warnings, notifications and the WLAN state
- Profile settings (permitted volume, time, flow, return time, availability, leakage warning) as
numberentities and services - Self-study phase of SYR SafeTech+/Trio devices (start, delete, determined values)
- Network diagnostics (SSID, available networks, WLAN/LAN IP and gateway, both MAC addresses)
- Configurable polling interval, HTTP timeout and retry behaviour
- Robust data handling: implausible values (for example a negative cumulative volume) never reach the recorder or the long term statistics
- All user visible text is available in English and German, French and Norwegian fall back to English
| Device | Note |
|---|---|
| Hansgrohe Pontos Base | http://<ip>:5333/pontos-base/ |
| SYR Trio | http://<ip>:5333/trio/ |
| SYR SafeTech+ | http://<ip>:5333/trio/ |
| SYR SafeTech+ (old firmware) | http://<ip>:5333/safe-tec/ |
| SYR NeoSoft | http://<ip>:5333/neosoft/ |
- Install HACS if you have not already.
- HACS → ⋮ → Custom repositories → add
https://github.com/acdcnow/pontoswith the category Integration. - Search for Pontos in HACS and install it.
- Restart Home Assistant.
- Add the integration: Settings → Devices & Services → Add integration → Pontos.
- Download or clone this repository.
- Copy
custom_components/pontosinto your Home Assistantcustom_componentsdirectory. - Restart Home Assistant.
- Add the integration: Settings → Devices & Services → Add integration → Pontos.
The integration was renamed: the repository is now acdcnow/pontos and the integration domain
changed from hass_pontos to pontos. This requires one manual step, because Home Assistant can
only load one integration per folder:
-
In HACS, remove the old repository (
sangvikh/hass-pontosor your previous fork). -
Delete the folder
custom_components/hass_pontosfrom your configuration directory. -
Install this repository as a custom repository (see above) and restart Home Assistant.
-
Add the integration again: Settings → Devices & Services → Add integration → Pontos.
The setup dialog detects the configuration of the previous version and offers to take it over. Confirm it, and your IP address, polling interval, device name and model are reused.
-
The old configuration entry and its entities are removed as part of the import. Because the devices and entities keep their names, the entity ids stay the same and your history and long term statistics are preserved.
During setup only the essentials are asked for; everything else can be changed later via Settings → Devices & Services → Pontos → Configure.
| Field | Description |
|---|---|
| IP address | IP address of the device in your network |
| Port | HTTP port, default 5333 |
| Fetch interval | Polling interval in seconds (default 10) |
| Device name | Name of the device in Home Assistant |
| Device type | Model of your device, see supported devices |
| Section | Option | Description |
|---|---|---|
| Connection | IP address, port | Where the device can be reached |
| Connection | HTTP timeout | Timeout per request in seconds |
| Connection | Retry attempts, retry delay | Retries per poll and the delay between them |
| Polling | Fetch interval | How often the device is polled |
| Device | Device name, device type | Rename the device or switch to another model |
| Data quality | Ignore implausible values | See data quality |
| Data quality | Keep last valid value for | How long the last valid value may be kept, 0 = unlimited |
| Data quality | Unit for volume sensors | Display volumes in L or m³ |
| Entities | Create diagnostic entities | Turn the diagnostic sensors on or off |
| Entities | Create control entities | Turn buttons, selects, switches, times and numbers on or off |
| Logging | Enable debug logging | More verbose logging for this integration |
Saving the options reloads the config entry.
Water meters occasionally report values that cannot be correct: a device that is starting up, a lost connection or an internal reset can produce a negative cumulative volume or a value that does not parse as a number.
Such values are ignored by default:
- the sensor keeps its last valid value, so the dashboard and the statistics stay continuous,
- the rejected value is exposed in the entity attributes as
invalid_valueandinvalid_since, - the raw device value is always available as
raw_value, - if the device keeps sending implausible values for longer than Keep last valid value for
(default 60 minutes), the sensor becomes
unavailableinstead of showing a stale value, - after a restart the last known good value is restored, so a bogus first reading does not create a gap in the statistics.
Cumulative meters (state class total_increasing, for example Total water consumption) are
guarded automatically – a meter can never count backwards. If you really want the raw values, turn
Ignore implausible values off.
The available entities depend on the model. The following table lists the most important ones:
| Entity | Type | Description |
|---|---|---|
| Total water consumption | sensor | Cumulative volume, total_increasing |
| Current water consumption | sensor | Volume of the current water draw |
| Water flow | sensor | Current flow rate in L/h |
| Water pressure | sensor | Input pressure |
| Water temperature | sensor | Water temperature |
| Water conductivity / Water hardness | sensor | Conductivity and calculated hardness |
| Alarm status, Warning status, Notification status | sensor | Current device state |
| Leakage alarm | binary sensor | on for leakage related alarms |
| Alarm / Warning / Notification active | binary sensor | on while the device reports an entry |
| WiFi connected | binary sensor | WLAN connection state |
| Water supply | valve | Open or close the shut-off valve |
| Profile | select | Active profile, by profile name |
| Profile n permitted volume / time / flow / return time | number | Profile limits, 1-8 |
| Microleakage test active | binary sensor | on while a leak test runs |
| Self-study … | sensor | Determined values of the self-study phase |
| Salt quantity, Salt stock | sensor | NeoSoft only |
| WLAN/LAN IP address, gateway, SSID, MAC | sensor | Diagnostic |
Every config entry creates two devices:
| Device | What it carries |
|---|---|
<device name> |
The measurements, the buttons (clear alarms, …) and the profile selection |
<device name> configuration |
The settings: profile limits, microleakage schedule and time, regeneration mode/interval/time, buzzer |
The configuration device is linked to the meter as a sub device, so the meter stays about its measurements. Entity ids and unique ids are unchanged, the settings only moved to another device card.
All services can target a single device with the Device field (or entry_id). Without a
target, the command is sent to all configured devices.
| Service | Fields | Description |
|---|---|---|
pontos.open_valve / pontos.close_valve |
– | Open or close the water valve |
pontos.clear_alarms / clear_warnings / clear_notifications |
– | Clear the respective list |
pontos.set_profile |
profile |
Activate a profile (1-8) |
pontos.set_profile_volume |
profile, volume |
Permitted volume in liters |
pontos.set_profile_time |
profile, minutes |
Permitted draw time |
pontos.set_profile_flow |
profile, flow |
Permitted flow in L/h |
pontos.set_profile_return_time |
profile, hours |
Return to profile after n hours |
pontos.set_profile_availability |
profile, enabled |
Enable/disable a profile |
pontos.set_profile_warning |
profile, enabled |
Leakage warning of a profile |
pontos.microleakage_test |
– | Start a microleakage test |
pontos.microleakage_time |
time |
Time of day of the leak test (HH:MM) |
pontos.microleakage_schedule |
schedule |
1 daily, 2 weekly, 3 monthly |
pontos.start_self_study |
days |
Start the self-study phase (SafeTech+/Trio) |
pontos.delete_self_study |
– | Delete the determined self-study values |
pontos.set_regeneration_mode |
mode |
NeoSoft regeneration mode |
pontos.set_regeneration_interval |
days |
NeoSoft days between regenerations |
pontos.set_regeneration_time |
time |
NeoSoft time of regeneration |
pontos.enable_buzzer / disable_buzzer |
– | NeoSoft buzzer |
pontos.generic_service |
endpoint, data |
Send a raw command, see below |
pontos.generic_service sends a command to any /set endpoint, which is useful for features that
are not covered by the entities above. The endpoint is given without the leading set/.
Example – change the permitted volume of profile 2 to 250 liters:
action: pontos.generic_service
data:
endpoint: pv2
data: "250"The commands documented for the SYR devices are listed in documentation/readme.md.
-
Check that the device answers:
http://<ip>:5333/<prefix>/get/allin a browser. -
Use the correct device type – the URL prefix differs per model (
pontos-base,trio,safe-tec,neosoft). -
Make sure the port is not blocked and the device is in the same network.
-
Run the probe included in the repository for the raw answer of every endpoint:
python3 testing/diagnose.py 192.168.1.100It reports which device type answers, the HTTP status and the first keys of the payload.
-
An IP address or a host name (
pontos.fritz.box) can be entered.
- Up to 2.9.5 setup failed with
AttributeError: 'dict' object has no attribute 'add'inservices.py(logged as Error setting up entry Pontos for pontos) and no entity could ever be created - update to 2.9.6 or newer. - Check
Settings → Devices & Services → Pontos– if the entry shows Retrying setup, the device did not answer the poll; the log contains the reason (Received no complete response from <ip>). - Look at the integration's Settings dialog: Create diagnostic entities and Enable control entities must be enabled, otherwise most entities are left out (up to 2.9.4 the dialog could open with empty fields – press Update once in 2.9.5 to store the correct values).
- The device type must match the meter, see above.
- The device did not report a usable value yet, or the value was implausible and the tolerance ran out.
Check the
raw_valueandinvalid_valueattributes of the entity. - Diagnostic entities that the model does not support stay unavailable by design; you can switch them off with Create diagnostic entities or disable the individual entity.
- Up to 2.9.6 the controls looked up the sensor they mirror in the entity registry, with a unique id
that never matched the sensor's own id. The alarm button and the profile selection therefore stayed
unavailable. 2.9.7 reads the values from the coordinator instead - if a control is still greyed
out, enable debug logging and look for
cannot find the sensor.
- Leave Ignore implausible values enabled. A negative cumulative volume would otherwise be treated as a counter reset.
- If you changed Unit for volume sensors, the statistics continue in the new unit.
logger:
default: info
logs:
custom_components.pontos: debug
The Enable debug logging option does the same without editing configuration.yaml.
testing/serve.pysimulates the device endpoints,testing/link_pontos.shlinks this repository into a Home Assistant instance for development.testing/offline_smoke.pyruns the integration without Home Assistant (stubbed imports, simulated payloads) and checks setup, entities, every service and unload for all five device types:python3 testing/offline_smoke.py.testing/diagnose.pytalks to a real device and reports what it answers.testing/check_translations.pycomparesstrings.jsonand the translation files with the labels the config and options flow actually look up.documentation/readme.mddocuments the device API and all known endpoints.- Pull requests must bump
versionincustom_components/pontos/manifest.jsonwhen the integration changes – the Check Version workflow enforces this.
- Original integration by @sangvikh and contributors.
- Device documentation collected from the SYR API documentation and the Home Assistant community.
- Brand images by the home-assistant/brands project.