New Rheem Eziset Integration - Testers wanted

I have made a new custom_component for Rheem Eziset systems.

These are residential water heaters used in Australia (and possibly elsewhere - my unit has its internal wiring labelled in Japanese). You will need to opt in for the Eziset module (see my protocol documentation, it costs around AU$300 and is easy to install for anybody a little bit handy).

Custom component (HACS compatible): https://github.com/illuzn/rheem-eziset
Protocol Documentation: https://illuzn.github.io/Rheem-Eziset-Protocol/

I have only used this on my own device at home so am in desperate need of testers to confirm it is working correctly.

With a little bit of work this may also be compatible with other Rheem brands such as Vulcan, Everhot, Solarhart, Solar Edwards and Aquamax but obviously havenā€™t tested those units.

1 Like

Have been using your old setup (via Node-RED) for a while - thanks!

Was planning to do a custom integration and funnily found this just as I was about to kick off. Iā€™ll get this loaded up and let you know how I go. Cheers!

Thanks for your work on this @illuzn !

Iā€™ve added the integration, and the sensor entities are updating with the correct data, however when trying to set the temperature using water_heater.rheem_water_heater it throws an error and does not update the value.

Below are the log entries with debug logging enabled on the integration:

    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.143', port=80): Max retries exceeded with url: /getInfo.cgi (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 113] Host is unreachable'))
2024-01-04 11:07:05.318 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 3.070 seconds (success: False)
2024-01-04 11:07:13.161 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 3.070 seconds (success: False)
2024-01-04 11:07:19.659 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 1.567 seconds (success: False)
2024-01-04 11:07:19.659 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [INTENTIONALLY_REDACTED] HTTPConnectionPool(host='192.168.1.143', port=80): Max retries exceeded with url: /getInfo.cgi (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at INTENTIONALLY_REDACTED>: Failed to establish a new connection: [Errno 113] Host is unreachable'))
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 174, in _new_conn
    conn = connection.create_connection(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/urllib3/util/connection.py", line 95, in create_connection
    raise err
  File "/usr/local/lib/python3.11/site-packages/urllib3/util/connection.py", line 85, in create_connection
    sock.connect(sa)
OSError: [Errno 113] Host is unreachable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/urllib3/connectionpool.py", line 715, in urlopen
    httplib_response = self._make_request(
                       ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/urllib3/connectionpool.py", line 416, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 244, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.11/http/client.py", line 1286, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.11/http/client.py", line 1332, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.11/http/client.py", line 1281, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.11/http/client.py", line 1041, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.11/http/client.py", line 979, in send
    self.connect()
  File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 205, in connect
    conn = self._new_conn()
           ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 186, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 113] Host is unreachable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/urllib3/connectionpool.py", line 799, in urlopen
    retries = retries.increment(
              ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/urllib3/util/retry.py", line 592, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.1.143', port=80): Max retries exceeded with url: /getInfo.cgi (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 113] Host is unreachable'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 238, in handle_call_service
    response = await hass.services.async_call(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2173, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2210, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 272, in handle_service
    return await service.entity_service_call(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 882, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 952, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/water_heater/__init__.py", line 443, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/water_heater/__init__.py", line 337, in async_set_temperature
    await self.hass.async_add_executor_job(
  File "/usr/local/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/rheem_eziset/water_heater.py", line 114, in set_temperature
    api.set_temp(water_heater=self, temp=temp)
  File "/config/custom_components/rheem_eziset/api.py", line 61, in set_temp
    self.check_control_issues(entity=water_heater, reset_attribute="rheem_current_temperature", session=session)
  File "/config/custom_components/rheem_eziset/api.py", line 142, in check_control_issues
    result = self.get_responses(session=session, page=page)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/rheem_eziset/api.py", line 182, in get_responses
    response = session.get(url, timeout=6.1)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.143', port=80): Max retries exceeded with url: /getInfo.cgi (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 113] Host is unreachable'))
2024-01-04 11:07:28.165 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 3.073 seconds (success: False)
2024-01-04 11:07:36.167 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 3.075 seconds (success: False)
2024-01-04 11:07:41.208 DEBUG (SyncWorker_8) [custom_components.rheem_eziset] rheem_eziset - getInfo.cgi response: {"heaterName":"Rheem","mode":10,"temp":48,"flow":0.0,"state":1,"appErrCode":0,"sTimeout":90,"sessionTimer":300}
2024-01-04 11:07:41.229 DEBUG (SyncWorker_8) [custom_components.rheem_eziset] rheem_eziset - version.cgi response: {"FWversion":"1.4"}
2024-01-04 11:07:41.273 DEBUG (SyncWorker_8) [custom_components.rheem_eziset] rheem_eziset - getParams.cgi response: {"heaterModel":6147,"tempMax":50,"tempMin":37,"bathtempMax":48,"bathtempMin":37,"bathvolMax":500,"bathvolMin":10}
2024-01-04 11:07:41.276 INFO (MainThread) [custom_components.rheem_eziset] rheem_eziset - Final getInfo_data result: {'heaterName': 'Rheem', 'mode': 10, 'temp': 48, 'flow': 0.0, 'state': 1, 'appErrCode': 0, 'sTimeout': 90, 'sessionTimer': 300, 'FWversion': '1.4', 'heaterModel': 6147, 'tempMax': 50, 'tempMin': 37, 'bathtempMax': 48, 'bathtempMin': 37, 'bathvolMax': 500, 'bathvolMin': 10}
2024-01-04 11:07:41.276 INFO (MainThread) [custom_components.rheem_eziset] Fetching rheem_eziset data recovered
2024-01-04 11:07:41.277 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 0.185 seconds (success: True)
2024-01-04 11:07:52.250 ERROR (MainThread) [custom_components.rheem_eziset] Error fetching rheem_eziset data: 
2024-01-04 11:07:52.251 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 6.159 seconds (success: False)
2024-01-04 11:08:03.441 DEBUG (MainThread) [custom_components.rheem_eziset] Finished fetching rheem_eziset data in 6.116 seconds (success: False)

You can see the sensor data in the ā€œSyncWorker_8ā€ thread of the debug entries.
Eziset firmware is 1.4 and my model is ā€œ6147ā€ (Rheem Metro Max 26 876T26NF).
Running HA Core 2024.1.0 with Supervisor 2023.12.0

Iā€™ve got almost exactly the same unit 876T26NFA (note the additional A) and my heater model is reporting as ā€œ1ā€.

Looks like you are running into the issue with a very spotty connection between the water heater and the powerline unit. The requests that are failing are actually requests to update the sensors. Try to put the powerline unit as close as possible to the heater with as few obstructions (especially metal) as possible - my hypothesis is that the heater unit acts as a quasi-Faraday cage and significantly reduces the wireless signal between the powerline unit and the water heater. Edit: see below

You could also try debugging this by using the official app. If what I am saying above is correct, the official app should also have issues connecting to your heating and frequently ā€œrescanā€ to try to find your heater when the connection is lost.

The only other thing I notice is that you are currently in ā€œmode: 10ā€ or ā€œHeating Control Modeā€. This occurs when a user has requested control of the heater - this has probably occurred for one of these reasons:

  1. You have a manual (shower or bathside) controller and someone is using it.
  2. Someone else is controlling the water heater using the official app.
  3. The control process failed half way (i.e. it took control but was not fully successful in changing the temperature and thus failed to release control).

Unfortunately, your debug logs arenā€™t long enough for me to see which of the above 3 is the issue. If trying the above doesnā€™t have any luck try opening an issue my github repo with the full logs for a 5 minute window.

Just to clarify a little on this, the powerline unit communicates over the electrical network in the house with the heater which should allow you to put it anywhere as long as it is on the same circuit. This is similar to the Ethernet-over-Power type networking gear available from TP-Link, DLink, etc. I have seen connectivity issues in two scenarios though:

  • On a house with 3-phase power, putting the heater and powerline unit on different phases wont work (physically separated power lines) - I donā€™t think this is the case here.
  • The heater and powerline unit on the same phase but different circuits in the house. The signal degrades heavily when passing over circuit breakers - Possibly a culprit here or the other items @illuzn mentioned.

The ideal setup is having the heater and powerline adapter on the same circuit if possible. Hope this info helps.

Wowā€¦ thatā€™s great informationā€¦ do you mind if I copy that over to my protocol documentation. I didnā€™t know thatā€™s how it works (and probably explains the dodgy connection I have (powerline on a different circuit). Makes sense now that I think of it (ā€œpowerlineā€ duh).

I assume my solar battery also may play a part in this because itā€™s a UPS and filters my electrical supply.

Sure thing! Iā€™m just pulling together some more of my other notes to enable device discovery too in your integration.

Yes this could be causing issues if the signal needs to traverse it. Essentially both the heater and adapter need to be joined on the same ā€˜wireā€™.

1 Like

Feel free to PR: Unofficial Rheem Eziset Protocol Documentation (illuzn.github.io)

Thatā€™s where Iā€™ve documented my findings.

I own a Rheem Heat Pump Water Heater and am looking for information on the available operation modes that can be used for automation purposes. Specifically, I am in the midst of creating an automation that switches the water heater from the heat pump mode to electric mode. In the settings of the water heater, I have already configured the operation mode to electric, but it doesnā€™t seem to be taking effect.

For the automation setup in Home Assistant, I navigated to the ā€œThen Doā€ section, selected ā€œadd action,ā€ chose my water heater, and opted for the ā€œset operation modeā€ action. Subsequently, I entered ā€˜electricā€™ as the desired operation mode.

I would appreciate it if someone could confirm whether my approach is correct or if thereā€™s something I might be overlooking.

Are you using my custom component? Iā€™ve only ever tested it with my own instant hot water system so I canā€™t guarantee it will work correctly with your heat pump water heater.

In fact, I donā€™t think I ever allowed for an electric operation mode in the code?

Not sure if I need to do more reading about these Rheem instant gas HWS, but as I have 3 phase in my place Iā€™m checking before I purchase a Rheem.
Would it be possible in anyoneā€™s opinion, to put a Wifi client bridge near the heater and the Ezinet box (on the same house circuit) to get around the 3phase issue ?
My heater location is on one phase and the router is far away on other side of home and on another phaseā€¦
By typical bridge I mean this type of thing (which I have used for wired cameras before).
TP-Link AC750 Dual Band Wireless Pocket Router - (TL-WR902AC) - Umart.com.au

PS. Pity the Eziset box has no Ethernet socketā€¦

I havenā€™t tested myself, but I canā€™t see why it wouldnā€™t work.

It doesā€¦
image

There is an ethernet port at the bottom (not shown in picture). So the best way to do this would be to put the powerline unit on another socket on the same phase, then run ethernet from your router to the powerline unit.

Ah ha. Thanks for the correction. Yes, easier way indeed.
I may become a tester soonā€¦

Thanks for this - It seems to be working now. It mat have been that the app session was still active.

The only think Iā€™ve noticed when setting the temp in HomeAssistant, is that sometimes it takes a few tries to actually set it (Even after waiting for longer than the refresh duration). But that I can live with.

I just deleted a post from this topic suggesting it would be great if the Eziset could be replaced with an ESP32.

Please keep in mind:

You must be a licensed gasļ¬tter to do any work on gas powered devices in Australia.

Modifying a gas powered device in any way will void its approval and using an unapproved device is a criminal offence.

It varies by state but you can expect up to 6 months in prison and a fine of up to $15,000.00

IANAL and Iā€™m not suggesting that reverse engineering the Eziset is illegal, just replacing it with a home-brew ESP23 most definitely would be.