This custom integration connects Home Assistant directly to an ISG over the local Modbus TCP interface. It does not require the Stiebel Eltron cloud or a Web-Monitoring subscription.
Supported controller families include WPM 3, WPM 3i, WPMsystem, LWZ, LWZ x04 SOL and LWZ R290. The exact entities depend on the controller and the registers it exposes. They can include temperatures, operating states, energy values, climate controls, setpoints, operating modes and SG Ready inputs.
Although the integration was created for Stiebel Eltron devices, it can also be used with compatible Tecalor devices.
You need:
- An ISG connected to the heat pump and the same local network as Home Assistant.
- Modbus TCP enabled on the ISG.
- The IP address or hostname of the ISG. A DHCP reservation is recommended.
For connecting the ISG device to your heat pump refer to the corresponding Stiebel Eltron documentation or ask your installer. There is no need to buy the "STIEBEL ELTRON Web-Monitoring" subscription.
If you are using the ISG with the STIEBEL ELTRON EMI extension make sure that your ISG Firmware is current because this Integration is using Modbus, older versions of ISG Software are not able to do Modbus and EMI at the same time. (ISG Software Version v12.1.2 was tested by @northalpha using this integration to be working).
An update may be triggered via Stiebel Eltron Support (Kundendienst).
This is the preferred installation option:
- Open the repository in HACS:
- Download Stiebel Eltron ISG and restart Home Assistant.
- Go to Settings → Devices & services, select Add integration, and search for Stiebel Eltron ISG.
- Using the tool of choice open the directory (folder) for your HA configuration (where you find
configuration.yaml). - If you do not have a
custom_componentsdirectory (folder) there, you need to create it. - In the
custom_componentsdirectory (folder) create a new folder calledstiebel_eltron_isg. - Download all the files from the
custom_components/stiebel_eltron_isg/directory (folder) in this repository. - Place the files you downloaded in the new directory (folder) you created.
- Restart Home Assistant
- Go to Settings → Devices & services, select Add integration, and search for Stiebel Eltron ISG.
Configuration is entirely UI based. Enter the ISG host and Modbus TCP port
(normally 502). When the ISG advertises itself through DHCP, Home Assistant
may discover it automatically.
To change the address later, open Settings → Devices & services, select the three-dot menu on the integration entry, and choose Reconfigure. Existing entity IDs and history are retained.
For the Energy Dashboard and other long-term statistics, use the cumulative
consumed or produced energy sensor whose source combines the current day with
the historical total (day_and_total). These sensors are marked as
total_increasing, so Home Assistant can derive clean hourly and daily deltas
from them.
Sensors whose names end in Today expose the raw ISG day registers. They are useful on dashboards for the device's current-day value, but deliberately do not generate long-term sums. At midnight the ISG transfers only whole kWh to the total register and retains the fractional remainder in the day register. Treating that remainder as a reset to zero would count part of the energy twice.
The separate Total sensors remain cumulative alternatives. Which energy entities are available depends on the connected controller.
- Open Settings → Devices & services.
- Select the three-dot menu on the Stiebel Eltron ISG entry and choose Delete.
- To remove the code as well, uninstall the repository in HACS and restart Home Assistant.
Removing the entry stops polling and removes its devices and entities. Recorder history is retained by Home Assistant until it is deleted separately.
- Verify that Home Assistant can reach the ISG on the configured host and port.
- Confirm that Modbus TCP is enabled and that no firewall or VLAN rule blocks the connection.
- Reserve the ISG address in DHCP, or use Reconfigure after an address change.
- If the integration fails to start with Unsupported controller model, include the controller ID from that error and the relevant Home Assistant log in a GitHub issue.
- For an entry that loads successfully, include a diagnostics download with the issue. Diagnostics redact the configured host.
- A register that is not exposed by a controller remains unavailable. This is preferable to reporting a plausible but stale value.
The integration polls locally every 30 seconds. A failed update marks entities unavailable; it does not keep presenting cached values as current. Write errors are returned to the Home Assistant action that initiated them.
The integration cannot update ISG firmware. Firmware updates are handled through Stiebel Eltron support. It also cannot make a register writable when the connected controller or firmware exposes it as read-only.
Release 2026.8 needs no reconfiguration of the integration entry, but six things change for an existing installation. Three of them can ask something of you: an automation, a dashboard or an Energy dashboard source. The rest is metadata.
Writable temperature entities now carry the range the library accepts.
They used to offer a wider one, so a value outside the library's range was accepted by the interface and refused further down, with a ValueError in the log and no useful message in the interface.
| Entities | Offered before | Offered now | Library accepts |
|---|---|---|---|
| Climate on WPM, WPM 3i and LWZ R290 | 7 to 35 °C | 5 to 30 °C | 5 to 30 °C |
| Climate on the other LWZ controllers | 7 to 35 °C | 10 to 30 °C | 10 to 30 °C |
| The four room temperature settings, same controllers | from 5 °C | from 10 °C | from 10 °C |
| The two hot water settings, same controllers | up to 60 °C | up to 55 °C | up to 55 °C |
LWZ R290 is served by the WPM entity set on both platforms, so it follows the first row rather than the LWZ ones.
A write outside the range failed before this release as well, so no automation that used to succeed starts failing.
What changes is where it fails: Home Assistant now rejects a climate.set_temperature outside min_temp and max_temp with a ServiceValidationError that names the allowed range, instead of the write travelling as far as the library.
On WPM the lower end also moves down, so 5 to 7 °C can be set for the first time.
The hot water maximum follows the range the library documents for the whole LWZ family. Individual controllers document a higher one, and correcting that belongs in the library rather than in the entity description.
The domestic hot water circulation pump is a read-only operating status on
WPMsystem and LWZ R290. It is therefore exposed as
binary_sensor.<device>_circulation_pump, not as a switch. Existing
automations and dashboards that reference the former switch entity need to use
the binary sensor instead; switch actions must be removed because the register
was never writable.
Raw energy entities whose names end in Today are disabled by default for new installations.
Their ISG registers reset at midnight to a non-zero fractional remainder.
Treating that value as TOTAL_INCREASING makes Home Assistant interpret the reset incorrectly and causes long-term sums to drift.
Existing registry entries stay enabled after the update, but no longer expose a state class.
If a Today entity is configured in the Energy dashboard, replace it with the corresponding enabled cumulative entity.
For example, replace Produced Heating Today with Produced Heating.
This preferred day_and_total counter includes the current day's fractional energy while remaining cumulative.
Produced Heating Total is also cumulative but is the whole-kWh lifetime counter that is updated when the day value is transferred.
The same naming pattern applies to consumed and water-heating energy.
Entity IDs depend on the installation and language, so select by the entity name under Settings → Devices & services → Entities.
Statistics already stored under the old Today entity are not transferred to the replacement.
Home Assistant may offer a fixable state_class_removed issue under Developer Tools → Statistics for a Today entity that previously generated statistics.
Deleting that invalid statistic removes its long-term statistics, not the entity's ordinary state history.
To derive a daily value, create a Home Assistant utility_meter helper with a daily cycle from the cumulative source.
Users who still need the raw operational Today value can enable it manually under Settings → Devices & services → Entities.
Flow-rate sensors now use Home Assistant's canonical L/min unit and volume-flow device class instead of the legacy l/min string.
To the recorder those two spellings are different units, so it reports a units_changed issue for an existing long-term statistic and stops extending it until the issue is resolved.
Open Developer Tools → Statistics and apply the offered fix.
Choose the option that updates the stored unit, which keeps the entire history; the other one deletes the statistic.
No values change either way, L/min and l/min are the same quantity.
Pressure sensors now use Home Assistant's pressure device class. On US customary
installations, Home Assistant therefore displays their native bar values as
psi. Ventilation flow-rate sensors keep their native m³/h values.
Writable number entities are now grouped under Configuration on the device page. Existing entity IDs and manually configured dashboards or automations are not changed. These settings may no longer appear in automatically generated dashboards or default voice-assistant exposure.
Release 2026.7 is a significant refactoring of the integration.
For users:
- Update the integration and restart Home Assistant.
- If entities show as unavailable, reload the integration once from the UI.
- Some installations briefly created replacement entities during the unique-ID transition. If Home Assistant reports unavailable duplicates, open the Repair and review the exact entity IDs before confirming their removal. If the Repair is not available, remove only an unavailable leftover that has a working counterpart and is no longer referenced by a dashboard or automation. Removing and adding the integration again is not the preferred cleanup because it can change entity IDs and require references to be updated.
A note on history, because it is easy to get wrong in both directions. Removing an entity does not delete its recorded history: the long term statistics stay behind under the old entity id and show up in Developer Tools, Statistics as no longer provided, where you can delete them deliberately. Home Assistant does not merge that separate series into the working entity automatically. Renaming an entity inside Home Assistant is the one path that carries its statistics along, because the recorder migrates the statistic id on a rename but has no hook for a removal.
To change the IP address or port of the ISG, use Reconfigure in the three-dot menu of the integration entry. It leaves the entities untouched, so nothing has to be matched up afterwards.
For contributors, the transition the earlier migration notes described is complete.
The compatibility shims are gone, along with probe.py and client_bridge.py:
- Platform code reads through
coordinator.get_valueand writes throughcoordinator.write_component_value. - Entity descriptions address library fields directly, for example
modbus_register=lambda api: api.system_parameters.comfort_temperature_hk_1. - The pinned
pystiebeleltronversion is incustom_components/stiebel_eltron_isg/manifest.json.
Note that the library uses wire addresses, which are one below the addresses in the
Stiebel Eltron Modbus documentation. Documented register 1514 is 1513 in the
library.
If you want to contribute to this please read the Contribution guidelines