Integration of HUUM UKU Wifi

Just to pile on here, I have two things in progress:

1 - rev engineering what the ip based com’s are, seems VERY simple but annoying to replicate

2 - rev engineering what the keypad is sending to the controller, so far I can duplicate a few menu items, my goal would be a physical MITM between the keypad and the controller.

I have a good track record of this stuff :slight_smile: I did the first rev of the Balboa spa long ago and a couple rev’s of the Mitsubishi splits, commercial dehumidifiers, and a few other rev engineerings. The good news is serial serial serial :slight_smile: Adding in energy use and graphing heat/cool times is also my to do list with this.

I HATE cloud and I HATE having 50689 apps to do simple things, so their closed system will not stand!

2 Likes

I honestly regret buying this controller. I was misled by their marketing “local/wifi control”. I thought the app can controller locally without having to go up to the cloud!! It meant local controller from keypad.

Bigger issue with their cloud is the long latency, so frustrating. And I only now just noticed that the temperature adjustment between HA and the APP won’t synchronise at all.

Good luck, hope you can make it work!!

There is hope for local control !!! The project seems to be in the early stage but already looks promising.

Alternative would be to reverse engineer the main controller inputs/outputs and write a custom ESPHome control software on it because in the heart of the controller there is an ESP32. But this would most certanly void the warranty and pose a fire hazard, if code is written poorly. Also the remote panel would also have to be reverse engineered in that case.

1 Like

Any progress?

Last time I spoke with the author of this project he said that he ran out of time will focus on the Openhab instead.

The Huum Sauna integration works great… however, my only complaint is it doesn’t show the Orange color indicator on the temperature when it’s heating up. Like all my other climate entities do. I tried creating some custom wrapper that basically sync with the Huum entity, but just adds the heating orange color text, but haven’t figured it out yet. Would this be an easy fix to the integration? Thanks!

Update: I managed to get my wrapper going, but this is a little convoluted to get a simple orange text when heating! :slight_smile: Would love for the integration to be fixed instead.

# configuration.yaml

input_boolean:
  huum_sauna_status:
    name: "Huum Sauna Status"
    initial: false

climate:
  - platform: generic_thermostat
    name: "Huum Sauna HomeKit"
    heater: input_boolean.huum_sauna_status
    target_sensor: sensor.huum_sauna_temp_sensor
    min_temp: 100
    max_temp: 230
    target_temp: 185
    initial_hvac_mode: "off"
    ac_mode: false
    hot_tolerance: 0
    cold_tolerance: 0

template:
  - sensor:
      - name: "Huum Sauna Temp Sensor"
        state: "{{ state_attr('climate.huum_sauna', 'current_temperature') }}"
        unit_of_measurement: "°F"
        device_class: temperature


# automations.yml

- alias: "Sync Huum Sauna Status to HomeKit"
  trigger:
    - platform: state
      entity_id: climate.huum_sauna
      from: "heat"
      to: "off"
    - platform: state
      entity_id: climate.huum_sauna
      from: "off"
      to: "heat"
  action:
    - service: >
        {% if states('climate.huum_sauna') == 'heat' %}
          input_boolean.turn_on
        {% else %}
          input_boolean.turn_off
        {% endif %}
      target:
        entity_id: input_boolean.huum_sauna_status
- alias: "Sync HomeKit to Huum Sauna"  
  trigger:
    - platform: state
      entity_id: input_boolean.huum_sauna_status
  action:
    - service: climate.set_hvac_mode
      target:
        entity_id: climate.huum_sauna
      data:
        hvac_mode: >
          {% if is_state('input_boolean.huum_sauna_status', 'on') %}
            heat
          {% else %}
            off
          {% endif %}
- alias: "Force Huum HomeKit Update"
  trigger:
    - platform: state
      entity_id: input_boolean.huum_sauna_status
  action:
    - service: homeassistant.update_entity
      target:
        entity_id: climate.huum_sauna_homekit
    - delay:
        seconds: 1
    - service: climate.set_hvac_mode
      target:
        entity_id: climate.huum_sauna_homekit
      data:
        hvac_mode: >
          {% if is_state('input_boolean.huum_sauna_status', 'on') %}
            heat
          {% else %}
            off
          {% endif %}

Nevermind, while that complicated wrapper worked initially, it turns off the sauna once it exceeds target temperature. I’m back to zero and living with a homekit tile that does NOT show orange text when it’s heating. :frowning:

Looking into the feasability of a home sauna, and, naturally, integration of HA has crossed my mind… I’m wondering, instead of the dedicated UKU controller, has anyone considered wiring up something like the SONOS touchscreen which I believe can be operated as a relay to turn the heater (and lights etc) on / off?

£840 is a lot for a touch screen!

Yes it is a lot money. Especially when the HUUM controller box is nothing more than regular ESP32 with high power relays and RS485 chip (to communicate with the small on-wall remote). In theory you can buy the control box, flash your own ESPHOME firmware on it and use SONOFF wall panel as a remote BUT warranty will be void and all safety is for you to implement.

Hey there, i did some more work on the reverse engineering and prepared a HA App that is running the fake server.

  1. install app from GitHub - weidi/ha-addons · GitHub
  2. point api.huum.eu via DNS rewrite to your local HA IP (where the app is running), i use adguard but you can use anything like pihole or your internet router (if it has the feature)
  3. start / restart sauna so it picks up the new ip as target
  4. Use this package config
Summary
huum_control_huum_sauna:
  rest_command:
    huum_sauna_start:
      url: "http://localhost:8080/start"
      method: POST
      content_type: "application/json"
      payload: >-
        {
          "targetTemperature": {{ target_temperature | int }},
          "durationHours": {{ duration_hours | int }}
        }

    huum_sauna_stop:
      url: "http://localhost:8080/stop"
      method: POST
      content_type: "application/json"
      payload: >-
        {
          "targetTemperature": {{ target_temperature | int }}
        }

    huum_light_set:
      url: "http://localhost:8080/light"
      method: POST
      content_type: "application/json"
      payload: >-
        {
          "lightOn": {{ light_on | tojson }}
        }

  input_number:
    huum_sauna_target_temperature:
      name: Huum Sauna Target Temperature
      icon: mdi:thermometer
      min: 40
      max: 110
      step: 1
      mode: box
      unit_of_measurement: "°C"
      initial: 65

    huum_sauna_duration:
      name: Huum Sauna Duration
      icon: mdi:timer-outline
      min: 1
      max: 6
      step: 1
      mode: slider
      unit_of_measurement: "h"
      initial: 3

  sensor:
    - platform: rest
      name: Huum Sauna API
      unique_id: huum_sauna_api
      resource: "http://localhost:8080/status"
      method: GET
      scan_interval: 30
      timeout: 10
      value_template: "{{ value_json.heaterStatus }}"
      json_attributes:
        - temperature
        - frequencySeconds
        - heaterStatus
        - targetTemperature
        - lightOn
        - lightConfigured
        - steamerConfigured

  template:
    - binary_sensor:
        - name: Huum Sauna API Available
          unique_id: huum_sauna_api_available
          device_class: connectivity
          state: >-
            {{ states('sensor.huum_sauna_api') not in ['unavailable', 'unknown', 'none', ''] }}

    - sensor:
        - name: Huum Sauna Temperature
          unique_id: huum_sauna_temperature
          unit_of_measurement: "°C"
          device_class: temperature
          state_class: measurement
          availability: "{{ is_state('binary_sensor.huum_sauna_api_available', 'on') }}"
          state: "{{ state_attr('sensor.huum_sauna_api', 'temperature') | int(0) }}"

        - name: Huum Sauna Status
          unique_id: huum_sauna_status
          icon: mdi:sauna
          availability: "{{ is_state('binary_sensor.huum_sauna_api_available', 'on') }}"
          state: "{{ state_attr('sensor.huum_sauna_api', 'heaterStatus') | default('Unknown', true) }}"

        - name: Huum Sauna Configured Target Temperature
          unique_id: huum_sauna_configured_target_temperature
          unit_of_measurement: "°C"
          icon: mdi:thermometer-check
          availability: "{{ is_state('binary_sensor.huum_sauna_api_available', 'on') }}"
          state: "{{ state_attr('sensor.huum_sauna_api', 'targetTemperature') | int(0) }}"

    - switch:
        - name: Huum Sauna
          unique_id: huum_sauna
          icon: mdi:sauna
          availability: "{{ is_state('binary_sensor.huum_sauna_api_available', 'on') }}"
          state: "{{ state_attr('sensor.huum_sauna_api', 'heaterStatus') == 'OnlineHeating' }}"
          turn_on:
          - action: rest_command.huum_sauna_start
            data:
              target_temperature: "{{ states('input_number.huum_sauna_target_temperature') | int(65) }}"
              duration_hours: "{{ states('input_number.huum_sauna_duration') | int(3) }}"
          - delay: 00:00:03 
          - action: homeassistant.update_entity
            target:
              entity_id: sensor.huum_sauna_api
          turn_off:
          - action: rest_command.huum_sauna_stop
            data:
              target_temperature: "{{ states('input_number.huum_sauna_target_temperature') | int(65) }}"
          - delay: 00:00:03 
          - action: homeassistant.update_entity
            target:
              entity_id: sensor.huum_sauna_api

        - name: Huum Light
          unique_id: huum_light
          icon: mdi:lightbulb
          availability: >-
            {{
              is_state('binary_sensor.huum_sauna_api_available', 'on')
              and (state_attr('sensor.huum_sauna_api', 'lightConfigured') | bool(false))
            }}
          state: "{{ state_attr('sensor.huum_sauna_api', 'lightOn') | bool(false) }}"
          turn_on:
          - action: rest_command.huum_light_set
            data:
              light_on: true
          - delay: 00:00:03 
          - action: homeassistant.update_entity
            target:
              entity_id: sensor.huum_sauna_api
          turn_off:
            - action: rest_command.huum_light_set
              data:
                light_on: false
            - delay: 00:00:03 
            - action: homeassistant.update_entity
              target:
                entity_id: sensor.huum_sauna_api

Enjoy local control!

What is missing is the steamer feature as i dont have any.