WaterFurance control via Modbus bridge with smart control automations

Our house is heated and cooled via a WaterFurance series 7 geothermal heat pump. After a couple of years of using HA I was running out of things to integrate. Then I got the feeling without energy monitoring, the smart home was some how lacking. So I started to integrate energy tracking. If you’re tracking energy you have to track your HVAC system, as it’s probably your biggest energy consumer. Once you start tracking energy usage, you’ll probably want some control capability to make the tracking meaningful. Thus began my effort to smartly integrate the WaterFurance HVAC with HA.

WaterFurance sell the symphony addon capability that can provide cloud based control of your system. There is also an existing HA integration that works with this cloud solution. I’m very opposed to using manufacture cloud solution, which means I don’t have the symphony capability. I looking at possible going the smart thermostat route with energy monitoring clamps for the HVAC. I pulled the thermostat away from the wall and was surprised by the 4 wires on the system. The thermostat wires didn’t appear to be a good match for any of the available smart thermostats. I believe some wiring modifications would have been required to make a smart thermostat work.

Thinks weren’t looking good until I stumbled upon the second post in this thread. The link provided by that post lands on a github site with instructions and code that works with a number of WaterFurance units. The link provides the details on how set up the base capability. I’m creating this thread, as I wasted hours trying to figure out how to control my WaterFurance. Hopefully this thread will make finding this solution easier. I’ve also provide addition details on how to utilize the created device.

The WaterFurnace systems have a maintenance port, which is really just exposes a modbus type interface. You need a USB device, a modified CAT 5 cable and the software from the link running on some Linux machine. This is all detailed in the instructions found on the github site.

A couple of important things to point out. Your WaterFurance must be running a version of software 3.0 or above. This might require an update both on your HVAC system and on the thermostat. My Waterfurance HVAC controller was running version 2.0 and the Thermostat was running 1.04. With software below version 3.0 the software pulled some information, but it did not provide access to the thermostat controls. You can check the version of software running in your thermostat from the setting screen on thermostat. When the repair guy came out to update the software he gave me the version number running on the HVAC controller.

It wasn’t clear to me from the installation instruction, off the link above, if I’d be able to control the thermostat without the WaterFurance symphony add on. I can report that you don’t need any extra features, you just plug your modified CAT 5 cables into the maintenance modbus port.

The provided link has instruction for installing the software. I believe you should be able to install this software directly on your HA controller, assuming you have control at the OS level. I didn’t do that that because I don’t like having non smart home critical capabilities on my HA controller. I installed the capability on a Ubuntu system I have, that provides video services for my home. The software is written in ruby, which means it’s an interpreted language, which means it should work on both x86 and ARM processors.

The install instructions have you install an MQTT broker. As I use the MQTT broker add on available from HA, I did not install the MQTT broker. The line in the install instructions that installs the MQTT broker is:

sudo apt install mosquitto

If you’re using the HA MQTT broker just skip that line.
The instruction have you install a service file at the following location, to control starting the modbus to MQTT bridge:

/etc/systemd/system/aurora_mqtt_bridge.service

You will have to modify the ExecStart line in this file so that the service can connects to your MQTT broker. Assuming you’re using the HA MQTT broker the line will be something like this:

ExecStart=/usr/local/bin/aurora_mqtt_bridge  /dev/ttyUSB0  mqtt://USER:PASSWORD@IP/ 

If you don’t have any other USB devices connected to the box running this software then /dev/ttyUSB0 should be the USB device you used to connect to the WaterFurance maintenance port. USER needs to be changed to the USER name you’ve configured for connections to your MQTT broker. Likewise, PASSWORD is the PASSWORD for the MQTT broker user. Finally IP is the IP address of the machine running your MQTT broker.

When you start the aurora_mqtt_bridge service, you should consider using MQTT Explorer, as suggested in the instruction link, to verify all the new topics are created. If that works and you have the HA add on MQTT broker configured correctly, then the thermostat and a lot of other entities should be discovered and placed under one the HA MQTT integration. This is a partial view of what was discovered by HA on my system:

The thermostat is a climate entity and shows in a card that looks like this:

You can use this card to control the HVAC temperature and operational mode.

One items that is reported is the amount of energy currently being used by the HVAC system. You can use this with the HA “Integration - riemann sum integral sensor (helper)” to generate an kWh value. You add the integration and create a new helper using sensor.waterfurnace_heat_pump_total_power_usage as the “input sensor”, k for “Metric prefix” and hours for “time unit”. Most recommendations are to use the “Left Riemann sum” for integration method. I tried both Left and Trapezoidal, and the results were just about identical. The new helper that is created can be placed on the Energy dashboard giving something like this:

This gives you the mean to evaluate if any automation you put in place to adjust the temperature have a positive energy savings effect.

At this point I have three automation that control the temperature. The first will lower or raise (heating or cooling) by 2 degrees Fahrenheit when everyone is out of the house. The second automation set the temperature back to the desired set point when someone returns home. I use three helper with these automation. The first is group.persons, which contains all of the individuals living in the house. I track individual’s home and away status with a combination of ping trackers and location information reported by the phone app. The second and third helpers are input_numbers, used to capture the desired low (Heating) and high (Cooling) temperatures. Here’s the automation for when everyone is out of the house:

alias: Thermostate temp change on Away
description: ""
trigger:
  - platform: state
    entity_id:
      - group.persons
    to: not_home
    from: home
condition: []
action:
  - service: input_number.set_value
    metadata: {}
    data:
      value: >-
        {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_low' )|float
        }}
    target:
      entity_id: input_number.low_temp
  - service: input_number.set_value
    metadata: {}
    data:
      value: >-
        {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_high' )|float
        }}
    target:
      entity_id: input_number.high_temp
  - service: climate.set_temperature
    metadata: {}
    data:
      target_temp_high: >-
        {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_high' )|float
        +2 }}
      target_temp_low: >-
        {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_low' )|float
        -2 }}
    target:
      entity_id: climate.waterfurnace_zone_1
mode: single

And for when someone arrives home:

alias: Thermostate temp change on Home
description: ""
trigger:
  - platform: state
    entity_id:
      - group.persons
    to: home
    from: not_home
condition: []
action:
  - service: climate.set_temperature
    metadata: {}
    data:
      target_temp_high: "{{ states('input_number.high_temp') | float }}"
      target_temp_low: "{{ states('input_number.low_temp') | float }}"
    target:
      entity_id: climate.waterfurnace_zone_1
mode: single

The final automation will reduce the temperature by two degrees when everyone should be sleeping and then raise it before people get out of bed:

alias: Night Thermostat Temp Shifts
description: ""
trigger:
  - platform: time
    at:
      - "05:00:00"
      - "23:30:00"
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ trigger.now.hour == 5 }}"
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              target_temp_low: "{{ states('input_number.low_temp') | float }}"
              target_temp_high: >-
                {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_high'
                )|float }}
            target:
              entity_id: climate.waterfurnace_zone_1
      - conditions:
          - condition: template
            value_template: "{{ trigger.now.hour == 23 }}"
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              target_temp_low: >-
                {{ state_attr('climate.waterfurnace_zone_1',
                'target_temp_low')|float -2 }}
              target_temp_high: >-
                {{ state_attr('climate.waterfurnace_zone_1', 'target_temp_high'
                )|float }}
            target:
              entity_id: climate.waterfurnace_zone_1

I just put these automation in place and so can’t yet comment as to any potential energy savings. Most people recommend to just set and forget the temperature with a geothermal HVAC. Their concern is that changing the temperature will cause your HVAC to use backup heating. If that happens you have little hope of saving any energy. This is the reason I’m only shifting the temperature by 2 degrees, to stay off backup heating. Anyway it’s seems like something worth trying.