Recteq smoker via Tuya integration

Would love to be able to control Recteq smoker via Home Assistant Tuya Smart Life integration. It shows up as unsupported.

I’ve been reading that some people are getting it added into Smart Life and then it is appearing in Home Assistant already. I sold my smoker during a move, so can’t test nor confirm.

Have you already successfully integrated the smoker into Smart Life? That’s step 1. If successful, then will it display in Home Assistant?

Yeah it’s in Smart Life, but shows up in HA as

recteq (unsupported)
by Tuya

With no entities

When you add to Smart Life you have to reset the WiFi so it gets removed from the recteq app.

1 Like

Found this on Reddit and helped me get local Tuya to work

https://www.reddit.com/r/recteq/s/kFriwnC0Dl

HomeAssistant + Recteq + RT-700 (“The Bull”)

Overview

This will quickly describe some of the steps needed to get the recteq configured in the latest versions of HA & (Local)Tuya.

If configured, you will be able to:

  • Display Current and Target Temperatures, Probe A & B Temperatures
  • Turn Smoker on and off
  • Set Target Temperature NEW

Requirements

  • HomeAssistant
  • Tuya/LocalTuya
    • Steps here are for LocalTuya, but should be similar for normal Tuya users
  • Tuya IoT Platform
  • Recteq Pellet Smoker
    • This has only been tested with an RT-700.

Steps

  1. Install LocalTuya into HA as described in their docs.
  2. Configure the Tuya IoT Platform account. Details described in the LocalTuya docs above.
  • Local Keys are hard to find, but the easiest way in the Tuya IoT Platform is by going to:
    1. Cloud (left-toolbar) > API Explorer
    2. Navigating the tree to Smart Home Device System > Device Management > Get device details
    3. Pasting the device_id from the previous steps
    4. Reading the JSON Response and looking for "local_key" with the corresponding value.
  1. In HA, configure your first device after loading the integration and connecting the Tuya IoT Cloud Account
  • My configuration has never allowed me to use the auto-discover and here it helps because I can configure each dps
  1. BE CAREFUL doing the following as there is no chance to edit anything in the Device/Entity after it has been added to HA. You will always need to delete and start from scratch.
  2. For Power On/Off: name Smoker Entity Type = switch, ID/DPS = 1
  3. For Probe A: name Smoker Probe A Temperature Entity Type = sensor, ID/DPS = 105, Device Class = temperature, Unit of Measurement = F
  4. For Probe B:name Smoker Probe B Temperature Entity Type = sensor, ID/DPS = 106, Device Class = temperature, Unit of Measurement = F
  5. For Smoker Temperatures: name Smoker Entity Type = climate, ID/DPS = 102, Target Temperature = 102, Current Temperature = 103, Precision = 1
  6. At this point should be have a working device with 4 entities. Now, if you would like to have a working Lovelace Thermostat card, you will need to customize the entity itself via YAML configuration.
  • You may also want to customize the entity IDs as it was not something available during set-up.

Lovelace Thermostat Card Fix

This is required because the LocalTuya configuration for the entity will not take free-text values and none of the DPS parameters from the smoker itself provide the max/min. We are going to hard-code these. I assume you’ve never configured a customization before below. If you have, you know where to start :slight_smile:

  1. Create a new customize.yaml file in the root of the config folder. I use the Visual Code Studio host add-on so this is very easy from within HA.
  2. Include the following in the new customize.yaml file, replacing the climate.smoker_temperature with the appropriate entity ID:
climate.smoker:
  max_temp: 500
  min_temp: 180
  1. Save the file.
  2. Open the configuration.yaml file and locate a line that states homeassistant:; if this does not exist, add it on a new line at the bottom.
  3. Indent two spaces, and add customize: !include customize.yaml and save the file. The added text should be:
homeassistant:
  customize: !include customize.yaml
  1. Restart HA
2 Likes

Then I did this for a dashboard

type: vertical-stack
cards:
  - type: conditional
    conditions:
      - entity: switch.smoker
        state: 'off'
    card:
      type: glance
      entities:
        - entity: switch.smoker
          tap_action:
            action: toggle
  - type: conditional
    conditions:
      - entity: switch.smoker
        state: 'on'
    card:
      type: custom:simple-thermostat
      header: false
      control: false
      toggle:
        entity: switch.smoker
      layout:
        step: row
        mode:
          headings: false
          icons: false
          names: false
      entity: climate.smoker
      decimals: 0
      step_size: 1
      hide:
        state: true
  - type: conditional
    conditions:
      - condition: state
        entity: switch.smoker
        state: 'on'
      - condition: numeric_state
        entity: sensor.smoker_probe_a_temperature
        above: '0'
    card:
      type: glance
      entities:
        - entity: sensor.smoker_probe_a_temperature
          name: Probe-A
        - entity: input_number.smoker_probe_a_target
          name: Target
        - entity: sensor.smoker_probe_a_status
          name: Status
      state_color: true
  - type: conditional
    conditions:
      - condition: state
        entity: switch.smoker
        state: 'on'
      - condition: numeric_state
        entity: sensor.smoker_probe_b_temperature
        above: '0'
    card:
      type: glance
      entities:
        - entity: sensor.smoker_probe_b_temperature
          name: Probe-B
        - entity: input_number.smoker_probe_b_target
          name: Target
        - entity: sensor.smoker_probe_b_status
          name: Status
      state_color: true
  - type: conditional
    conditions:
      - condition: state
        entity: switch.smoker
        state: 'on'
      - condition: numeric_state
        entity: sensor.smoker_probe_a_temperature
        above: '0'
      - condition: numeric_state
        entity: sensor.smoker_probe_b_temperature
        below: '1'
    card:
      type: history-graph
      entities:
        - entity: sensor.smoker_target_temperature
          name: Target
        - entity: sensor.smoker_actual_temperature
          name: Actual
        - entity: sensor.smoker_probe_a_temperature
          name: Probe-A
      refresh_interval: 0
      hours_to_show: 8
  - type: conditional
    conditions:
      - condition: state
        entity: switch.smoker
        state: 'on'
      - condition: numeric_state
        entity: sensor.smoker_probe_a_temperature
        below: '1'
      - condition: numeric_state
        entity: sensor.smoker_probe_b_temperature
        above: '0'
    card:
      type: history-graph
      entities:
        - entity: sensor.smoker_target_temperature
          name: Target
        - entity: sensor.smoker_actual_temperature
          name: Actual
        - entity: sensor.smoker_probe_b_temperature
          name: Probe-B
      refresh_interval: 0
      hours_to_show: 8
  - type: conditional
    conditions:
      - entity: switch.smoker
        state: 'on'
      - entity: sensor.smoker_probe_a_temperature
        state: unavailable
      - entity: sensor.smoker_probe_b_temperature
        state: unavailable
    card:
      type: history-graph
      entities:
        - entity: sensor.smoker_target_temperature
          name: Target
        - entity: sensor.smoker_actual_temperature
          name: Actual
      refresh_interval: 0
      hours_to_show: 8
  - type: conditional
    conditions:
      - condition: state
        entity: switch.smoker
        state: 'on'
      - condition: numeric_state
        entity: sensor.smoker_probe_a_temperature
        above: '0'
      - condition: numeric_state
        entity: sensor.smoker_probe_b_temperature
        above: '0'
    card:
      type: history-graph
      entities:
        - entity: sensor.smoker_target_temperature
          name: Target
        - entity: sensor.smoker_actual_temperature
          name: Actual
        - entity: sensor.smoker_probe_a_temperature
          name: Probe-A
        - entity: sensor.smoker_probe_b_temperature
          name: Probe-B
      refresh_interval: 0
      hours_to_show: 8
1 Like

Thanks for adding instructions to the post. I’ll likely be coming back for it later after I get another Recteq. Hopefully this summer.

Thank you so much! I got mine up this weekend.

Recteq 1070 ID/DPS below

Device on/off = 1
Target Temp = 101
Current Temp = 102
Probe A = 104
Probe B = 105

2 Likes

@mclever
Thanks for the awesome input here. This is amazing!
My climate.smoker_temperature comes back as Unavailable while everything else seems to be flawless. Target and Actual did show up for a bit before I set the max and min, but now nothing. I’ve seen other reports of this, but no solutions. Did you run into this at all?

Having issues getting tuya (iOS) to pair with my recteq. I am holding down the wifi button on the controller but it never shows in the app.

any ideas?
Thank you

I’m not a pro here, but there are a few things I can say:
Make sure your wifi is 2.4gHz. I’ve heard people say you should temp disable your 5.0 while doing this pairing, but I read that after I got mine up.
Keep trying-- It took me about 20 attempts :slight_smile:

My climate.smoker_temperature comes back as Unavailable while everything else seems to be flawless.

I’m running into this similar right now, I’m seeing Unknown for my climate entity. Looking at the entity history, I see the temperature values getting properly displayed over time, but the entity itself shows nothing.

Did you ever find a solution?

Forgot I had this in config too

template:
  sensor:
    - name: smoker_probe_a_status
      state: >
        {% if states('sensor.smoker_probe_a_temperature') != unavailable %}
          {% set target = states('input_number.smoker_probe_a_target')|int %}
          {% set actual = states('sensor.smoker_probe_a_temperature')|int %}
          {% set offset = actual - target %}
          {% if offset > 5 %}Over Temp!
          {% elif offset > -5 %}At Target
          {% elif offset > -15 %}Approaching...
          {% else %}Not Cooked Enough{% endif %}
        {%- endif %}
    - name: smoker_probe_b_status
      state: >
        {% if states('sensor.smoker_probe_b_temperature') != unavailable -%}
          {% set target = states('input_number.smoker_probe_b_target')|int %}
          {% set actual = states('sensor.smoker_probe_b_temperature')|int %}
          {% set offset = actual - target %}
          {% if offset > 5 %}Over Temp!
          {% elif offset > -5 %}At Target
          {% elif offset > -15 %}Approaching...
          {% else %}Not Cooked Enough{% endif %}
        {%- endif %}
2 Likes

input number recteq
Is there a template for input_number as well? Mine shows up as unavailable.

Yep, that one’s in the GUI heres a screenshot of one

Just noting for my smoker, the inputs needed were slightly different. Guessing this could vary for each model.

RT-410 for the ID/DPS
On/Off: 1
Smoker Temp: 102
Target Temp : 101
Probe A: 103
Probe B: 104

I’m still getting mine set up but when I do device debug from Tuya IoT Platform I got these values for my smoker so wanted so save someone the time.

B380X

2 switch (ON/OFF)
101 set point (250) - in F
102 actual temp (100)
103 probe temp (0)
104 min feed rate (20)
105 temp adjust (0)
106 power failure (on/off)
107 ignite failure (on/off)

2 Likes

I’ve got a Recteq 590, and found a way to dump all of the available data points along with their supported values via the Tuya API (API Explorer > Device Control > Query Things Data Model). Lots of interesting stuff in here, some of which I’ll never use but neat that it’s there.

Short summary:
2: Switch
101: Set point
102: Actual temp
103: Min feed rate
104: Probe A
105: Probe B
106: Temp adjust
107: Temp unit
108: Power failure
109: Ignite failure
110: RTD Failure
111: Probe A arrive
112: Probe B arrive
113: Actual low deviate
114: Actual high deviate
115: Probe A setpoint
116: Probe B setpoint
117: Actual float range

And finally, here’s a JSON dump of the full list of data points, along with their supported values & types:

1 Like

Latest localtuya update breaks the control of my 700, haven’t figured out why yet

Did you get this working? I have not updated the Local Tuya integration and am now leery to do so after seeing this.

Was able to get it to work again by reconfiguring cloud api account on latest version

1 Like