Skip to content

Web Interface

Varitras edited this page Nov 7, 2026 · 5 revisions

Web Interface (experimental)

The heat pump's controller also serves a local web interface, WEM Lokal. It shows values Modbus does not carry: the refrigerant circuit (pressures, temperatures, superheat, valve openings), compressor speed and counters, target and actual output, the flow rate, energy statistics to three decimals including the yearly totals, and the heating power limit. The integration reads them in a second entry beside the heat pump, and sets one of them, the heating power limit; nothing else is written.

This part is experimental. The controller's web server is slow and now and then answers with an incomplete page: on the tested WBB about one first answer in five came broken, and one immediate retry rescued nearly all. Upstream issue #159 reports web interfaces that crashed and impaired the controller until a power cycle; the cause is unproven. The integration therefore asks little and pauses on its own when the answers go wrong, until they come right again.

Switching it on

  1. Switch the web server on at the heat pump's display. It sits in the OEM level, which opens from the same password entry as the installer level (Fachmann-Ebene); the PIN decides which level opens. On a WBB, PIN 11 opens the installer level and PIN 21 the OEM level. In the OEM level, set Settings → Webserver to on, and change nothing else there: that level also holds the settings the heat pump runs by. Menu names may differ on other controllers or firmware.
  2. Set a login. Open http://<address of the heat pump>/ in a browser. On the first visit the page asks you to set a user name and a password; there are no default credentials. These two go into the integration.
  3. Keep the web interface's language on Auto, German or English. The web interface has a language setting of its own, Einstellungen › Allgemein › Sprache (Settings › General › Language), with Auto, Deutsch and English; Auto served German to the integration. The web interface shows its texts in that language, and a text value, such as the diverter valve position, keeps the controller's wording and so changes with it. The integration finds its pages and values by their titles in German and English; with another language the dialog names the menu entries it could not find and asks about the language.

The integration knows the pages of a WBB and of an Evoblock, and tells them apart by the version row of Info › Wärmepumpe. An Evoblock lacks the EVI rows, the valve openings and some other refrigerant rows of a WBB, shows the compressor in Hz and adds the power output, the water pressure and its own version row. It is known from two captures of a WEB 13/20, at a standstill and running, with its titles in German: set to English it is not supported yet, and writing the power limit has not been tried on it.

Another model may show other values on its pages (forum screenshots of a WSB6 do); the dialog then says the controller is not supported yet. In either case - a language that has to stay, or a model the integration does not know - see Capturing the titles below.

Adding it

The web interface belongs to a heat pump entry, so set the heat pump up first: the dialog offers Web interface of a heat pump only once a heat pump entry exists. Then Settings → Devices & services → Add integration → Weishaupt Modbus → Web interface of a heat pump, pick the heat pump and enter the web interface's user and password. A heat pump has one web interface entry: the list offers only heat pumps that have none yet.

  • Logging in, finding the pages and reading each once can take several minutes when the controller answers slowly; the dialog shows its progress meanwhile and logs out again afterwards.
  • Pages the controller serves only half are searched once more before the dialog asks you to try again a little later; a page of values that shows none of its titles counts as served half. Values shown empty or twice, and a menu entry shown twice, are searched once more as well and then named, with a request to try again.
  • A page that lacks a title the sensors need, or shows a value in a unit they do not know, is named in the dialog with those titles: that controller is not supported yet.

The entry takes the heat pump's address and follows it when the heat pump entry is reconfigured; when the heat pump entry is deleted, it stops. Reconfigure takes a new user and password and searches the pages again; a refused login asks for a new one by itself.

Web interface only. To read only the web interface, for example from a second Home Assistant beside one that polls the heat pump over Modbus, disable the heat pump entry afterwards: ⋮ → Disable on the entry itself. Disabling only its devices leaves the entry connecting over Modbus at every start. The web interface keeps working without it.

Options

Option Default Range Meaning
Interval of the heat pump page 5 min 1 - 60 min How often Info › Wärmepumpe is read
Interval of the statistics 15 min 1 - 60 min How often Info › Statistik is read
Interval of the heating settings 15 min 1 - 60 min How often Wärmepumpe › Heizen is read
Settings written per day 10 0 - 100 000 (0 = no limit) How many settings it may write a day

What it reads

On a WBB, 46 sensors with the pump's values, on an Evoblock 39, and on both the heating power limit as a number, five sensors about the polling itself and two counting the settings written, on a device of their own, WH Web interface (with the heat pump's postfix). The list below and the one under Entities, with each page and title, are a WBB's. An Evoblock has no intermediate pressure, one superheat value, no valve openings and fewer refrigerant temperatures, its compressor frequency in place of the speed, the version of its WEB CPU in place of the WWP-EC one, and the power output and the water pressure besides. On both, the dynamic switching difference reads unknown while the setting of that name is off: a WBB then left the row out, and the Evoblock's manual says it does too.

  • Readings: setpoint temperature, dynamic switching difference, pump M1 speed, flow rate, diverter valve position, target and actual output, eight refrigerant circuit temperatures, low, intermediate and high pressure, three superheat values, three valve openings, compressor speed, operating hours, starts and defrost cycles.
  • Statistics: the thermal and electrical energy of today, this month and this year to three decimals, and the performance factors of the year and overall.
  • Diagnostic: the heating switching difference, the two controller software versions and the outdoor unit variant.
  • Setting: the heating power limit, 10 to 100 %.
  • Settings written (diagnostic): in total and today, carried over restarts and shown while the polling is paused.
  • The polling itself (diagnostic): the answer time, which is the slowest answer since the round before - a setting written in between counts too - and the counts of requests, logins, pages that came incomplete and failed reads. A failed read is one the web interface failed; an error in the integration itself is not counted there. The counts carry over restarts, so Home Assistant's statistics show over weeks whether the web interface answers more slowly or serves more incomplete pages. They stay shown while polling is paused.

The Name topic prefix and Name device prefix options of the heat pump entry name the values and the power limit like their Modbus siblings, with WP_ or ST_ and the prefix in front; the sensors about the polling and the settings written keep their names.

How a value is read. A value counts only in the unit the page shows for it; anything else reads unknown. The page shows an idle power or speed as Aus (in English an idle power as off), which reads 0 there and unknown on any other number; a text value keeps the word. It shows the setpoint temperature as -- while nothing is demanded, which reads 0 °C like the Modbus setpoints, in the statistics too, but without a demand attribute; any other -- reads unknown.

Setting the heating power limit

The number Heating power limit sets Wärmepumpe › Heizen › Leistungsbegrenzung (heat pump › heating › output limit in English) at the controller, 10 to 100 % in steps of one.

  • A change waits 5 seconds for further changes, so a few clicks on the arrows make one write, of the last value. A change made while a write runs is written after it.
  • The write reads the heating page and the limit's own page fresh, sends the form once and reads the heating page back. A value the controller already shows is not written.
  • The number shows a value only once the controller shows it, and unknown while the heating page has no reading or polling is paused. It stays available, so a value can be set without a reading. A refused or failed write says why: the daily limit reached, polling paused, a form that does not match the value shown, or a save the controller did not confirm.
  • The save is never repeated. When its outcome is unclear, the next reading shows what the controller holds.
  • Each write is treated like an EEPROM write: the options limit the settings written to 10 a day by default. Nothing else is ever written through the web interface.

How gently it asks

  • One request at a time, at least 5 seconds apart, each limited to 20 seconds. The gap holds between everything that asks one heat pump's web interface, a dialog's visit and the running entry included. While Reconfigure or a new login checks the web interface, the entry's polling rounds start no page of their own; a power limit you set still goes out.
  • Never at the same moment as a Modbus request from this integration to the same heat pump (see How Data Updates).
  • It stays logged in. It logs in again when the controller has dropped the session, renews the session once a day, and logs out when the entry is unloaded or Home Assistant stops.
  • The first round, a login and the three pages, takes at least 20 seconds, five requests 5 seconds apart; on the project's WBB it took 25 to 50 seconds, longer when a page had to be asked for again. It runs after the entry has started, so Home Assistant's start does not wait for it; the sensors show unavailable until it is done.
  • A page that arrived whole but wrong is asked for once more. After a timeout, a broken connection, an error status or a session dropped right after the login, nothing more is asked in that round, and no page before the shortest page interval has passed: not by an update requested by hand, and not after a write. A write that meets one of these gives the same rest. A power limit you set during the rest still goes out.
  • Failures in a row. A page that fails keeps its values once; the second failure in a row makes them unavailable; the third pauses polling and raises a repair notice. A failed page is asked for again only after its own interval. The notice names the page and why; for a page that came wrong, the titles it lacked, showed blank or showed twice, or their number when there are more than five.
  • While paused, only that page is asked again: after 15 minutes, or after the shortest page interval if that is longer, then at waits doubling from there up to 2 hours. When it comes whole, polling resumes and the notice goes by itself; the other pages show values again once they are read anew. Reloading the entry resumes at once. An error in the integration itself counts as a failure too.
  • A refused login stops polling at once and asks for the login again. Any other failed login, such as the controller reporting its database out of reach, counts like a failed page.
  • A write of the heating power limit asks nothing of a round between its reads, its save and its read-back; a round waits for it. Its reads count in the polling counts like a round's, but its failures do not pause polling.

Privacy

The user and password are stored in Home Assistant's configuration and sent to the heat pump only, as plain HTTP: the controller offers nothing else, so keep it on a network you trust. The diagnostics download leaves them out, and the page addresses the entry stores. After a pause, the reason it and the repair notice give is the kind of failure and its cause, such as Unreachable (TimeoutError) or Unreachable (HTTP 500), never a page address or a value the controller sent; for a page that came wrong, the titles it lacked, showed blank or showed twice, such as Broken (missing: Hochdruck). Of each page it holds only the values the sensors show.

Capturing the titles

A language that has to stay, or a model the integration does not know: open an issue so that it can be added. The integration needs the controller's menu and value titles, and tools/webif_capture.py in the repository collects them.

  • Download the repository (Code → Download ZIP) and unpack it on a computer in the same network. On Windows double-click tools\webif_capture.bat and enter the heat pump's address: no Python is needed. On its first start it downloads the official portable Python from python.org (about 11 MB) into tools\python, checks it against the checksum python.org publishes and runs nothing else; nothing is installed, and deleting that folder removes it. Elsewhere run python tools/webif_capture.py <address of the heat pump> (Python 3.10 or newer).
  • It asks for the user and the password and opens six pages. It finds the menu entries the integration reads by their codes, else by their German titles, else you pick them by number and confirm each pick; Reset, Service and the time programs are never offered on the controller the tool was built for. On another one it knows them by their codes only, so check each title before you confirm a pick.
  • When the controller serves a page half or does not answer, it rests a minute and goes on, ten times at most: a run takes about a minute, one the controller keeps failing up to about three quarters of an hour.
  • The file it writes holds the titles, and the values of the three pages the integration reads; the tool adds no address, credentials or page address, and the file lands in the current folder (tools when the batch file is double-clicked). The values are what those pages show: check the file for a serial number, an access code or a network address before you attach it to the issue.

Clone this wiki locally