Gecko in.touch2 integration (Spa wireless remote control module)

ok i got the integration working now.
Nice !

I’m trying to make it in a nice dashboard view now.
I’m using a picture glance card.
Is it possible to have at the bottom left, the current temperature? and the set point temperature?

This one is a picture elements card. 3 jet pumps can be switched on and off using the pump symbols. Snowflake and fire symbols set the low and high setpoints, respectively. Shows the current temp and setpoint.

1 Like

Can you share the code please?
I’m also looking for a way to integratie to turn on music on the spa using HA

type: picture-elements
elements:
  - type: custom:button-card
    entity: climate.ducky_tub_heater
    style:
      transform: translate(-50%, -50%) scale(0.8,0.8)
      left: 70%
      top: 90%
      opacity: 70%
    size: 60px
    show_name: false
    icon: mdi:snowflake
    color: cyan
    action: toggle
    tap_action:
      action: call-service
      service: climate.set_temperature
      target:
        entity_id: climate.ducky_tub_heater
      service_data:
        temperature: 36
  - type: custom:button-card
    entity: climate.ducky_tub_heater
    style:
      transform: translate(-50%, -50%) scale(.8,.8)
      left: 27%
      top: 90%
      opacity: 70%
    size: 60px
    show_name: false
    icon: mdi:fire-circle
    color: orange
    action: toggle
    tap_action:
      action: call-service
      service: climate.set_temperature
      target:
        entity_id: climate.ducky_tub_heater
      service_data:
        temperature: 39
  - type: custom:button-card
    entity: fan.ducky_tub_pump_1
    style:
      transform: translate(-50%, -50%) scale(.8,.8)
      left: 9%
      top: 63%
      opacity: 70%
    size: 60px
    show_name: false
    action: toggle
    tap_action:
      action: call-service
      service: fan.set_preset_mode
      service_data:
        entity_id: fan.ducky_tub_pump_1
        preset_mode: |
          [[[
           if (entity.state == 'off')
            return 'HI';
           else
            return 'OFF';
          ]]]
  - type: custom:button-card
    entity: fan.ducky_tub_pump_2
    style:
      transform: translate(-50%, -50%) scale(.8,.8)
      left: 25%
      top: 36%
      opacity: 70%
    size: 60px
    show_name: false
    action: toggle
    tap_action:
      action: call-service
      service: fan.set_preset_mode
      service_data:
        entity_id: fan.ducky_tub_pump_2
        preset_mode: |
          [[[
           if (entity.state == 'off')
            return 'HI';
           else
            return 'OFF';
          ]]]
  - type: custom:button-card
    entity: fan.ducky_tub_pump_3
    style:
      transform: translate(-50%, -50%) scale(.8,.8)
      left: 85%
      top: 44%
      opacity: 70%
    size: 60px
    show_name: false
    action: toggle
    tap_action:
      action: call-service
      service: fan.set_preset_mode
      service_data:
        entity_id: fan.ducky_tub_pump_3
        preset_mode: |
          [[[
           if (entity.state == 'off')
            return 'HI';
           else
            return 'OFF';
          ]]]
  - type: state-label
    entity: climate.ducky_tub_heater
    attribute: temperature
    name: Heater
    style:
      top: 90%
      left: 48%
    prefix: 'Setpoint  '
  - type: state-label
    entity: sensor.spa_temperature
    style:
      transform: translate(-50%, -50%) scale(3.5,3.5)
      top: 50%
      left: 48%
    size: 50%
image: /local/tub.jpg
style: |
  ha-card {
  background-color: var(--primary-background-color);
  border-radius: 25px;
  margin: 15px;
  box-shadow:
    -4px -4px 8px rgba(255, 255, 255, .5), 5px 5px 8px rgba(0, 0, 0, .03);
  }

Full card looks like this. RHS are all the helpers, etc., for the setpoint automations.

1 Like

Thx will see if i can make something like that
How did u get the sensor.spa_temperature

Templates

sensor:
  - platform: template
    sensors:
      spa_temperature:
        friendly_name: Spa Temperature
        value_template: '{{ states.climate.ducky_tub_heater.attributes.current_temperature }}'
        unit_of_measurement: °C
      spa_setpoint:
        friendly_name: Spa Setpoint
        value_template: '{{ states.climate.ducky_tub_heater.attributes.temperature }}'
        unit_of_measurement: °C
1 Like

I’m posting my card soon as well.

Do you know how i get a black transparant horizontal box at the bottom of my card (containing elements) ?
Like with the picture glance card (at the bottom) ?

Also how do i add just text as an element?

Honestly, if you’re going through that much effort, just eliminate the Gecko stuff completely. Your creating more work and complexity by leaving it. And you’re already bypassing all the safety features it has built-in anyway, with your method, if I understand it correctly.

I’ve built a custom spa controller from scratch before in the past running off of a Pi. Please be safe. I don’t know how familiar you are with electronics but you should probably research how the different safety and limit switches work and integrate that into your design. You don’t want home assistant exclusively controlling something that costs thousands of dollars and has the potential to physically hurt you.

2 Likes

I’ve been wanting to get to grips with direct RS485 connection to the gecko unit almost since the day I got my spa, and due to various circumstances I recently got my hands on a dead screen module and cable.

So I’m hoping I can now start helping with the reverse engineering project. Is there anyone following this thread who has been / still is working on it? I have an electronic engineering background and some small amount of reverse engineering experience, but it’s all pretty rusty. It would be good to compare notes with anyone who has already started down this path. Please DM me if you’re willing to work together!

1 Like

Howdy! Yes, finding the time is always the challenge :slight_smile:

It’s still on my projects list, but DM doesn’t work for me as I won’t have time for things at the same time as you, and the information gets “trapped” in the conversation instead of being out where anyone can benefit or chip in as things come up.

I like the idea of discussing work here, or if there’s too much detail, whacking it up on a github or blog page and linking from here for more detail. Or perhaps a different thread should be started for the reverse-engineering discussion if it’s too noisy for this thread, since lots of folk are probably interested in the higher-level functionality only, rather than digging around in the details.

What would be super handy to start with are high-resolution photos of the circuit boards, so that people have the option of tracing layouts and starting to reverse-engineer some of the circuits. Of course not everyone has the gear or experience perhaps to take suitably hi-quality photos, but they are a really helpful starting point.

I have some of the in.touch2 but they’re still in raw format, haven’t got around to processing them yet, but will share them here when I have. This will get us started with a reasonable idea of the pin-outs at least, which might help others get into snooping the comms.

Glad to hear there is on-going interest though, I certainly am keen, I just have to balance which projects I can put time into, and Bermuda is taking up a lot of my me-time currently.

1 Like

Hi everyone! I recently bought a Buenospa (Wellis) Chicago hot tub, which has a single, two-speed pump. It came with a basic 4-button Gecko controller. I set it up so that the spa is in Eco mode until mid-afternoon, after which it warms to the set temperature for use in the late afternoon/early evening, returning to Eco mode later in the evening, cooling until the next afternoon. This worked without any problems.

As part of my purchase deal, I was later sent an in.touch 2 system, which I installed and got connected and running without too much fuss. I created a Water Care program to achieve the same cooling/heating timings as before. There were glitches, some of which I traced to a bad breaker, now resolved. But a problem remained, where the system would drop out of Eco mode, seemingly at random, leading to unneccesary heating.

In the process of troubleshooting, I got interested in Home Assistant, which I never used before. I installed HA OS on an old laptop, HACS, file editor add-on, and gazoodle’s fine integration. A bit of a learning curve, but I got everything working. I implemented my control strategy by simply creating automations to set the temperature to the desired value at the desired time. This avoids the ongoing problem of losing Eco mode.

HA revealed that occasionally the temperature reading spikes down to 32 deg F. It is not clear to me why - hardware, Gecko controller, in.touch, or other? When this happens, it seems there is a panic (winter mode?) which kicks it out of Eco mode. I read here and on Github that others have the same issue. In addition, yesterday I got an “OverTemp” error while everything is normal. I am not sure whether these two issues are related.

I have also seen the same behaviour as others, that unless a Water Care program is selected in the Gecko app, the HA integration will fail. I use the standard Water Care option, with no Eco times, and one filter cycle. If I block in.touch from internet access, the Gecko phone app stops working, but the HA integration is still ok.

So I am very happy with my setup! Thank you @gazoodle and other contributors. But I do have a wish list, in order of priority:

  1. The default setup does not recognize that I have a two-speed pump. I believe there is a way to fix this, by changing the “fan” setup in the integration. I am trying to figure out how to do this, and would appreciate help. I am a newbie, not a python programmer. But I can edit code with instruction!
  2. Solve the temperature reading spikes. This may be outside the scope of HA.
  3. Fix a number of sensors reported by HA that do not work, such a pump running, ozone.
  4. Set the Gecko controller time though HA. At present this can only be done via the keypad.

Device info
inYJ 605 v3.0
by Gecko Alliance
Firmware: SpaPack:v36.01 Config:62 Log:59
Hardware: EN:70 v14.0 CO:69 v11.0

Home Assistant
Core 2024.5.5
Supervisor 2024.05.1
Operating System 12.3
Frontend 20240501.1

You’re on the right track. You can do 1. with a service call. The syntax is typically mangled for Home Assistant. Here’s my instance to toggle the pump on and off.

    action: toggle
    tap_action:
      action: call-service
      service: fan.set_preset_mode
      service_data:
        entity_id: fan.ducky_tub_pump_1
        preset_mode: |
          [[[
           if (entity.state == 'off')
            return 'HI';
           else
            return 'OFF';
          ]]]

I have HA in ‘dark mode’. Just prefer it that way.

Here’s the YAML for the whole hot tub page:

  - title: TUB
    path: ''
    icon: mdi:hot-tub
    badges: []
    cards:
      - type: picture-elements
        elements:
          - type: custom:button-card
            entity: climate.ducky_tub_heater
            style:
              transform: translate(-50%, -50%) scale(0.8,0.8)
              left: 70%
              top: 90%
              opacity: 70%
            size: 60px
            show_name: false
            icon: mdi:snowflake
            color: cyan
            action: toggle
            tap_action:
              action: call-service
              service: climate.set_temperature
              target:
                entity_id: climate.ducky_tub_heater
              service_data:
                temperature: 36
          - type: custom:button-card
            entity: climate.ducky_tub_heater
            style:
              transform: translate(-50%, -50%) scale(.8,.8)
              left: 27%
              top: 90%
              opacity: 70%
            size: 60px
            show_name: false
            icon: mdi:fire-circle
            color: orange
            action: toggle
            tap_action:
              action: call-service
              service: climate.set_temperature
              target:
                entity_id: climate.ducky_tub_heater
              service_data:
                temperature: 39
          - type: custom:button-card
            entity: fan.ducky_tub_pump_1
            style:
              transform: translate(-50%, -50%) scale(.8,.8)
              left: 9%
              top: 63%
              opacity: 70%
            size: 60px
            show_name: false
            action: toggle
            tap_action:
              action: call-service
              service: fan.set_preset_mode
              service_data:
                entity_id: fan.ducky_tub_pump_1
                preset_mode: |
                  [[[
                   if (entity.state == 'off')
                    return 'HI';
                   else
                    return 'OFF';
                  ]]]
          - type: custom:button-card
            entity: fan.ducky_tub_pump_2
            style:
              transform: translate(-50%, -50%) scale(.8,.8)
              left: 25%
              top: 36%
              opacity: 70%
            size: 60px
            show_name: false
            action: toggle
            tap_action:
              action: call-service
              service: fan.set_preset_mode
              service_data:
                entity_id: fan.ducky_tub_pump_2
                preset_mode: |
                  [[[
                   if (entity.state == 'off')
                    return 'HI';
                   else
                    return 'OFF';
                  ]]]
          - type: custom:button-card
            entity: fan.ducky_tub_pump_3
            style:
              transform: translate(-50%, -50%) scale(.8,.8)
              left: 85%
              top: 44%
              opacity: 70%
            size: 60px
            show_name: false
            action: toggle
            tap_action:
              action: call-service
              service: fan.set_preset_mode
              service_data:
                entity_id: fan.ducky_tub_pump_3
                preset_mode: |
                  [[[
                   if (entity.state == 'off')
                    return 'HI';
                   else
                    return 'OFF';
                  ]]]
          - type: state-label
            entity: climate.ducky_tub_heater
            attribute: temperature
            name: Heater
            style:
              top: 90%
              left: 48%
            prefix: 'Setpoint  '
          - type: state-label
            entity: sensor.spa_temperature
            style:
              transform: translate(-50%, -50%) scale(3.5,3.5)
              top: 50%
              left: 48%
            size: 50%
        image: /local/tub.jpg
        style: |
          ha-card {
          background-color: var(--primary-background-color);
          border-radius: 25px;
          margin: 15px;
          box-shadow:
            -4px -4px 8px rgba(255, 255, 255, .5), 5px 5px 8px rgba(0, 0, 0, .03);
          }
      - type: thermostat
        entity: climate.ducky_tub_heater
        name: Heater
      - type: custom:mini-graph-card
        icon: mdi:hot-tub
        name: Hot Tub Temperature
        entities:
          - entity: sensor.spa_temperature
            name: Temperature
          - entity: sensor.spa_setpoint
            name: Setpoint
        hours_to_show: 24
        points_per_hour: 6
      - type: entities
        entities:
          - entity: button.ducky_tub_reconnect
            name: Reconnect
          - entity: sensor.ducky_tub_error_s
            name: Error(s)
          - entity: sensor.ducky_tub_rf_channel
            name: "RF\_Channel"
          - entity: sensor.ducky_tub_radio
            name: RF Signal
          - entity: sensor.ducky_tub_status
            name: Status
        title: InTouch 2 Module
      - type: entities
        entities:
          - entity: input_datetime.pm_on_time
            name: Boost On Time
          - entity: input_number.pm_on_temp
            name: Evening Temperature
          - entity: input_datetime.pm_off_time
            name: Boost Off Time
          - entity: automation.boost_on
            name: Enable Evening Boost On
          - entity: automation.pm_boost_off
            name: Enable Evening Boost Off
          - entity: automation.heat_boost_on
            name: Enable Octopus Overnight Heat On
          - entity: automation.heat_boost_off
            name: Enable Octopus Overnight Heat Off
          - entity: input_datetime.octopus_on_time
            name: Time to Start Octopus Heating
          - entity: input_number.octopus_on_temp
            name: Target temperature

Thanks Richard, let me study the code and try to make sense of what is what. I’m still coming to grips with HA terminology, like cards, devices, entities, plus the Python part (I am a Fortran guy from waay back).

I’m presently traveling away from home, so reluctant to make too many changes, in case I am not able to recover from a mistake. But I’ll let you know how I get on.

I’m a Forth guy from way back :slight_smile: I’m hopeless with object-oriented languages and YAML is bonkers inconsistent.

I’ve learned nothing about syntax {{{ [[[ embedding javascript/json/etc in YAML. I’ve just copied other people’s similar stuff and made do. I don’t pretend to know how it works!

1 Like

Hello everyone,

I have just come across your topic and I would be interested in connecting my swim spa with HA.
Before buying an In Touche 2 I would like to know if I can activate the circulation pump or not?
My idea is to optimise filtration with an automated filtration time depending on the temperature.

Thank you for your feedback.

Another FORTH guy. Amazing!!!

It varies according to your configuration, but you can set the filtration time on the app or keypad very easily.

On my spa, the filter is part of the standard circulation, so it filters whenever heating or measuring the temperature. I don’t set a separate filter schedule as it does enough heating to get good filtration.

I can trigger the circulation pump, but it shuts off automatically after 20 minutes. However, it will run the pump whenever the lights are on - I guess this is a feature rather than a bug. They also turn off but after more than an hour. Not sure how long actually.

Anyhow, short answer: yes

Thank you for your feedback @RhinoRich .

So with the In Touch 2 and HA integration I’ll be able to activate or deactivate the filtration pump without using a contact module?

Below is my dashboard