Rinnai Heating/Cooling Wifi Module

Either a typo or wrong port used? Should be 27847

What has been your experience with the component so far Chris?

sorry i’ve type wrong port in the post.

My heater is Rinnai ZEN 34 with wifi thermostat.
do you think is compatible?

Ummmm - nothing yet :grimacing: … been getting too easily distracted with other bits and pieces :frowning:

Just to reply to myself … this is what I was thinking of: https://khaz.me/cheap-and-easy-multiroom-sensing-for-your-hvac-with-xiaomi-aqara-and-home-assistant/

Is this using the same protocol/unit as described in this post? Sendo A/C unit with Wifi Control (BroadLink_OEM-T1)

I don’t think so - this def. isn’t broadlink based.

Hi all, I’ve been keen to get my Rinnai Touch Module working with HomeKit for some time and I stumbled upon this discussion last week. There’s some really great info here that members have contributed.

Using the info here I’ve written a node.js class that can be used to connect to a Rinnai Module, receive status updates and send commands to it. It only works on a local network but it seems to be quite reliable. It will also work out the IP address and port of the Module so you don’t need to assign a static IP address for it.

For those that are interested I’ve created a GitHub repo with the code:

Please feel free to use it in your own projects. Any bugs or suggestions please let me know.
@andrewgould, hoping you can use it to make your HomeBridge plugin more stable.

Has anyone here had any luck setting the time of the Module? Further up in this discussion was published:

I’ve tried using this but have had no success. :confused:

Not sure about the time setting. Have you tried the Home Assistant component posted above? I haven’t got it working yet

I have never tried it …


Sorry to ask, i am still new with HA. How do i integrate or get this added to HA?

1 Like

Hi everyone. I’ve been following this thread quietly for some time :stuck_out_tongue_winking_eye:. The findings you guys have been sharing here are fantastic and helped me a lot. Now I think it’s time to share mine and hopefully it could help someone.

Let’s make my long story short not too long…

I have a Brivis evap cooling system with an NC-1 networker (quite old and it’s there when I moved in years ago) and it had been the last piece that I would like to integrate into my HA setup. I was thinking Nest/Ecobee for a momont. Though since we lives in Down Under and we do things our own way, it seems most of our HVAC systems are not compatible with Nest/Ecobee out of the box.

A couple of days ago, I finally got my hands on a Rinnai Wifi Module for $300 (this was the part I finally understood why Brivis have their own TW1/TW2 communication bus :sweat_smile:) and a used NC-6 networker for $100. However, I felt a little comfort thinking about the potential that it could be controlled all locally.

Climbed to the roof cavity, wired everything up and connected to the Rinnai app in an hour. Smooth…

Then I hijacked

and started modifying it to support evap cooling system, with my zero knowledge of python… :scream:

2,000 hours later … :sleeping:

The custom component was working! well, sort of…

The command sent to the wifi module worked inconsistently. The “get status” commands succeeded all the time and “change operation” commands were only about 40% even if the log showed it’s sent successfully all the time.

I removed all the code except the minimum command sending part from the custom component and tried again. The same result.

Then I’ve tried

on my windows dev computer. The nodejs script worked 100%. But how come it’s not for the python socket created by a custom component??? I guess not every socket is created equal? Or I just missed something obvious? :exploding_head:

BTW @Mantorok your documentation is great and I can confirm it’s correct for evap cooling. You can also add “OP”:“M” and “OP”:“A” for evap system as well.

My options were limited -
A - Run the rest api of the nodejs script on a pi (or somewhere else). And then the custom component calls the api.
B - Add some sort of checking mechanism in the custom component. So it can tell if a command gets executed successfully. If not, send the command again…

A could be reliable and responsive. But it will increase the complexity of the system.
B would be a simple structure (just a custom component). But it would result in longer command execution time. (around 5 secs more than A on average)

At the end I chose plan B since it doesn’t really bother me if it takes a bit longer to turn on/off, change mode or fan speed.

20,000 hours later… :skull:

  • Support brivis evap cooling system at the moment.
  • Support auto/manual/fan-only mode.
  • Support 16 levels of fan speed.
  • Support sensor for measuring current temperature.
  • You can set the scan_interval quite high (>=1800) if your main purpose is to control the system via automation/Siri/Alexa/GA.
  • My python code looks absolutely silly. Please go easy on me… :flushed:

Please note -
I don’t have heating or refrigerative cooling. So I can’t code and test them. The custom component is for evap cooling only. Though it should not be too difficult to add support for extra modes if you follow the doc created by Mantorok.

Thanks for the feedback @jerryz. Good to know my RinnaiTouchClient works with Evap cooling.

As requested I’ve added an “EvapOperation” command to it. Enjoy.

I decided to have a crack at writing my own Homebridge plugin for the Rinnai Touch WiFi Module. After a few false starts it’s finally ready and seems reasonably stable. It allows you to turn on/off, switch modes (heat/cool), set the desired temperature and turn on/off zones. For those that are interested you can read more at:


Any feedback is welcome.

Awesome work. I’m trying it just now and all I get is this error -

[3/15/2020, 12:00:30 AM] [Rinnai Touch] ERROR: Cannot read property ‘HC’ of undefined
[3/15/2020, 12:00:30 AM] [Rinnai Touch] RinnaiTouchServer.process(‘undefined’)
[3/15/2020, 12:00:30 AM] [Rinnai Touch] RinnaiTouchTcp.destroy()
[3/15/2020, 12:00:30 AM] [Rinnai Touch] RinnaiHeaterCooler.update(’[{“SYST”: {“CFG”: {“MTSP”: “Y”, “NC”: “00”, “DF”: “N”, “TU”: “C”, “CF”: “1”, “VR”: “0183”, “CV”: “0010”, “CC”: “043”, “ZA”: " ", “ZB”: " ", “ZC”: " ", “ZD”: " " }, “AVM”: {“HG”: “Y”, “EC”: “N”, “CG”: “Y”, “RA”: “N”, “RH”: “N”, “RC”: “N” }, “OSS”: {“DY”: “SUN”, “TM”: “09:53”, “BP”: “Y”, “RG”: “Y”, “ST”: “N”, “MD”: “C”, “DE”: “N”, “DU”: “N”, “AT”: “999”, “LO”: “N” }, “FLT”: {“AV”: “N”, “C3”: “000” } } },{“CGOM”: {“CFG”: {“ZUIS”: “N”, “ZAIS”: “Y”, “ZBIS”: “Y”, “ZCIS”: “N”, “ZDIS”: “N”, “CF”: “N”, “PS”: “Y”, “DG”: “W” }, “OOP”: {“ST”: “F”, “CF”: “N”, “FL”: “00”, “SN”: “Y” }, “ZUS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N” }, “ZAS”: {“AE”: “N”, “MT”: “198”, “ID”: “Y”, “CP”: “N”, “FS”: “N” }, “ZBS”: {“AE”: “N”, “MT”: “213”, “ID”: “Y”, “CP”: “N”, “FS”: “N” }, “ZCS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N” }, “ZDS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N” }, “APZ”: {“ZV”: “N” } } }]’)
[3/15/2020, 12:00:30 AM] [Rinnai Touch] ERROR: Cannot read property ‘HC’ of undefined
[3/15/2020, 12:00:30 AM] [Rinnai Touch] queue is drained

Any ideas?

Hi @mitchmario, thanks for letting me know. I’ve published an update (ver 1.0.1) which should remove that error. However, the status received from your Rinnai Touch module looks quite different to mine. The plugin uses the value of CGOM.GSS.CC (or HGOM.GSS.HC for heating) to determine if it is currently active or idle. For you it will just appear to be idle all the time (ie. a green circle with the current temp).

Also, it appears you have 2 zones with your unit, but again the status is quite different to mine. To determine if a zone if On or Off the plugin uses CGOM.ZAO.UE for Zone A (ZBO for B etc). I suspect for your status it is CGOM.ZAS.ID. Are you able to confirm this by turning off/on zones and seeing what changes in the status?

Here’s a sample of my status (just the CGOM bit) so you can see the differences:

{"CGOM": {
 "CFG": {"ZUIS": "Y", "ZAIS": "Y", "ZBIS": "Y", "ZCIS": "N", "ZDIS": "N", "CF": "N", "PS": "Y", "DG": "W" },
 "OOP": {"ST": "N", "CF": "N", "FL": "08", "SN": "N" },
 "GSO": {"OP": "A", "SP": "24", "AO": "N" },
 "GSS": {"CC": "N", "FS": "N", "CP": "N", "AT": "L", "AZ": "R" },
 "APS": {"AV": "N" },
 "ZUO": {"UE": "Y" },
 "ZAO": {"UE": "Y" },
 "ZBO": {"UE": "Y" },
 "ZCO": {"UE": "N" },
 "ZDO": {"UE": "N" },
 "ZUS": {"AE": "N", "MT": "233" },
 "ZAS": {"AE": "N", "MT": "233" },
 "ZBS": {"AE": "N", "MT": "233" },
 "ZCS": {"AE": "N", "MT": "233" },
 "ZDS": {"AE": "N", "MT": "233" } 
} }

Could someone here that has an evaporative cooling system please post a copy of their status (when in evap cooling mode). To obtain the status you can use my RinnaiTouchClient. See https://github.com/mantorok1/RinnaiTouchClient

I’m hoping to enhance my Homebridge plugin to support evap coolers but as I don’t have this type of cooling I’m not sure what the status & commands look like. Any help would be appreciated.

EvapMode - All off

b'*HELLO*N000000[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:49", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "F" }, "GSS": {"PW": "N", "BY": "N", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "N", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SNE": "N" } } }]'
b'[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:49", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "F" }, "GSS": {"PW": "N", "BY": "N", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "N", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SNE": "N" } } }]'

EvapMode - Fan On/ Pump Off

b'*HELLO*N000000[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:50", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "N", "OP": "M", "FS": "N", "PS": "F", "FL": "01", "ZUUE": "Y", "ZAUE": "N", "ZBUE": "N", "ZCUE": "N", "ZDUE": "N" }, "GSS": {"PW": "N", "BY": "Y", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "Y", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SFE": "N" } } }]'
b'[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:50", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "N", "OP": "M", "FS": "N", "PS": "F", "FL": "01", "ZUUE": "Y", "ZAUE": "N", "ZBUE": "N", "ZCUE": "N", "ZDUE": "N" }, "GSS": {"PW": "N", "BY": "Y", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "Y", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SFE": "N" } } }]'

Evap Mode - Fan and Pump On

b'*HELLO*N000000[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:52", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "N", "OP": "M", "FS": "N", "PS": "N", "FL": "01", "ZUUE": "Y", "ZAUE": "N", "ZBUE": "N", "ZCUE": "N", "ZDUE": "N" }, "GSS": {"PW": "N", "BY": "Y", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "Y", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SFE": "N" } } }]'
b'[{"SYST": {"CFG": {"MTSP": "N", "NC": "00", "DF": "N", "TU": "C", "CF": "1", "VR": "0183", "CV": "0010", "CC": "043", "ZA": "                ", "ZB": "                ", "ZC": "                ", "ZD": "                " }, "AVM": {"HG": "Y", "EC": "Y", "CG": "N", "RA": "N", "RH": "N", "RC": "N" }, "OSS": {"DY": "SAT", "TM": "07:52", "BP": "Y", "RG": "Y", "ST": "N", "MD": "E", "DE": "N", "DU": "N", "AT": "999", "LO": "N" }, "FLT": {"AV": "N", "C3": "000" } } },{"ECOM": {"CFG": {"ZUIS": "Y", "ZAIS": "N", "ZBIS": "N", "ZCIS": "N", "ZDIS": "N", "TP": "N" }, "GSO": {"SW": "N", "OP": "M", "FS": "N", "PS": "N", "FL": "01", "ZUUE": "Y", "ZAUE": "N", "ZBUE": "N", "ZCUE": "N", "ZDUE": "N" }, "GSS": {"PW": "N", "BY": "Y", "PO": "N", "FO": "N", "SN": "N", "MT": "999", "ZUAE": "Y", "ZAAE": "N", "ZBAE": "N", "ZCAE": "N", "ZDAE": "N" }, "PSU": {"AV": "N", "SFE": "N" } } }]'


I have had some time today to see why it is still not working for me. I have realised that on/off commands work, heat/cool commands work, but temperature changes do not. Is my rinnai touch sending a different status? This is the status when my cooler is off -

{“CGOM”: {
“CFG”: {“ZUIS”: “N”, “ZAIS”: “Y”, “ZBIS”: “Y”, “ZCIS”: “N”, “ZDIS”: “N”, “CF”: “N”, “PS”: “Y”, “DG”: “W” },
“OOP”: {“ST”: “F”, “CF”: “N”, “FL”: “00”, “SN”: “Y” },
“ZUS”: {“AE”: “N”, “MT”: “209”, “ID”: “N”, “CP”: “N”, “FS”: “N” },
“ZAS”: {“AE”: “N”, “MT”: “215”, “ID”: “Y”, “CP”: “N”, “FS”: “N” },
“ZBS”: {“AE”: “N”, “MT”: “209”, “ID”: “Y”, “CP”: “N”, “FS”: “N” },
“ZCS”: {“AE”: “N”, “MT”: “209”, “ID”: “N”, “CP”: “N”, “FS”: “N” },
“ZDS”: {“AE”: “N”, “MT”: “209”, “ID”: “N”, “CP”: “N”, “FS”: “N” },
“APZ”: {“ZV”: “N” } } }]’)

and when it is on -

{“CGOM”: {
“CFG”: {“ZUIS”: “N”, “ZAIS”: “Y”, “ZBIS”: “Y”, “ZCIS”: “N”, “ZDIS”: “N”, “CF”: “N”, “PS”: “Y”, “DG”: “W” },
“OOP”: {“ST”: “N”, “CF”: “N”, “FL”: “00”, “SN”: “Y” },
“ZUO”: {“OP”: “M”, “SP”: “20”, “AO”: “N” },
“ZAO”: {“OP”: “M”, “SP”: “24”, “AO”: “N” },
“ZBO”: {“OP”: “M”, “SP”: “24”, “AO”: “N” },
“ZCO”: {“OP”: “M”, “SP”: “20”, “AO”: “N” },
“ZDO”: {“OP”: “M”, “SP”: “20”, “AO”: “N” },
“ZUS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N”, “AT”: “W”, “AZ”: “W” },
“ZAS”: {“AE”: “N”, “MT”: “215”, “ID”: “Y”, “CP”: “N”, “FS”: “N”, “AT”: “W”, “AZ”: “W” },
“ZBS”: {“AE”: “Y”, “MT”: “213”, “ID”: “Y”, “CP”: “Y”, “FS”: “Y”, “AT”: “L”, “AZ”: “R” },
“ZCS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N”, “AT”: “W”, “AZ”: “W” },
“ZDS”: {“AE”: “N”, “MT”: “213”, “ID”: “N”, “CP”: “N”, “FS”: “N”, “AT”: “W”, “AZ”: “W” },
“APZ”: {“ZV”: “N” } } }]’)