Thanks to visit codestin.com
Credit goes to github.com

Skip to content

eclipse1482/recteq

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Home Assistant Recteq Integration

This was an abandoned fork that was picked up by others including mochman who made some great improvements. However, I needed to modify it to get my RT700 working and I am hoping to add some capabilities and make this integration more robust for most users. I will need feedback to capture the changes though as I only have one grill to test on :)

Custom integration for recteq grills and smokers providing a climate entity to control the unit and sensor entities for the probes.

hacs-badge issue-badge pr-badge release-badge commit-badge license-badge commits-badge

NOTE - This isn't supported or approved by recteq at all!

climate

entities

Installation

We recommend you install HACS first, then add https://github.com/eclipse1482/recteq as a custom integration repository and finally, add the integration from there.

Instead, if you prefer the manual route, you could download a copy of the latest release and unpack the contents into into config/custom_components/recteq/ on your HA machine. Feeling adventurous? Using git clone in config/custom_components/ to pull the project from Github works too.

In either case, you need to restart HS once it's installed. Then you need to configure it.

Configuration

This integration is configured using the UI only; no changes in configuration.yaml are needed. Navigate to Configuration » Integrations and tap the red "+" button in the bottom-right. Search for and select the "Recteq" entry in the list of available integrations to setup. You'll get the dialog shown below. Enter the details for your grill and tap "Submit".

config

Repeat the process if you have multiple grills to control. (ps: I'm jealous!)

See the wiki for info in where to get the IP address, device ID and local key values needed.

The "Force Fahrenheit" option was added for folks who operate HA in Celsius but cook in Fahrenheit. The climate and sensor entities will report temperatures in Fahrenheit rather than converting them to Celsius when this option is set. The thermostat card will still display °C but the values will actually be °F.

User Interface

I use the stock Thermostat Card to turn it on/off, adust temperature, and see the current state of the Recteq.

Below the Thermostat Card, I use Tile Cards to display a custom probe name, probe actual temperature, and enter probe target temperature. The probe target temperature is a Helper integer. I also have buttons to turn notifications on or off for each probe which interacts with the Notification Automations described in the next section.

Adjusting temperature can be done by dragging the temperature selector or by clicking +/-

Low and full modes can be done by dragging the temperature slider all the way to the highest or lowest temperature settings, or by hitting plus or minus when you are at the highest or lowest temperatures that can be controlled to.

climate

Example yaml for Probe A Tile Cards:

type: tile
entity: input_text.probe_a_name
features_position: bottom
vertical: false
type: tile
entity: sensor.rt700_probe_a_temperature
features_position: bottom
vertical: false
name: Actual
type: tile
features_position: bottom
vertical: false
entity: input_number.probe_a_alarm_temp
name: Target
type: tile
entity: input_boolean.probe_a_alarm_set
features_position: bottom
vertical: false
hide_state: true
name: Notifications
icon: mdi:bell
tap_action:
  action: toggle
icon_tap_action:
  action: more-info

Below the Thermostat Card, I have two History Graphs. One for Grill Temperature History and one for Probe History:

type: history-graph
entities:
  - entity: sensor.rt700_probe_a_temperature
  - entity: sensor.rt700_probe_b_temperature
  - entity: input_number.probe_a_alarm_temp
  - entity: input_number.probe_b_alarm_temp
title: Probe Temps
fit_y_data: true
grid_options:
  columns: full
hours_to_show: 1

entities

type: history-graph
entities:
  - entity: sensor.rt700_target_temperature
  - entity: sensor.rt700_actual_temperature
  - entity: sensor.rt700_probe_a_temperature
  - entity: sensor.rt700_probe_b_temperature
min_y_axis: 0
title: Grill Temp History
grid_options:
  columns: full
hours_to_show: 2

You will also need to create helpers for this UI to function properly. Please see the screenshot below. You will need to create:

  • input_text.probe_a_name
  • input_boolean.probe_a_alarm_temp
  • input_number.probe_a_alarm_temp
  • input_text.probe_b_name
  • input_boolean.probe_b_alarm_temp
  • input_number.probe_b_alarm_temp
  • input_number.recteq_temp_variance (I actually don't know if this one is still needed.)

helpers

*NOTE - If you're using the "Force Fahrenheit" option, don't set the units on the input_number or HA will try to convert it automagically.

Notifications

Paste these scripts into your automations.yaml file. These automations send notifications for various reasons such as turning on your grill, when it is approaching target temperature. When it exceeds or falls far below target temperature. When probes are almost at temperature and at temperature. Etc.

notifications

- id: '1626129294093'
  alias: Recteq Probe A Alarm - 5F
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_probe_a_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_probe_a_temperature.state) >= float(states.input_number.probe_a_alarm_temp.state)-5
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions:
  - condition: state
    entity_id: input_boolean.probe_a_alarm_set
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.probe_a_alarm_temp
    above: 0
  actions:
  - data:
      message: Probe A is 5 degrees below target temp
      title: Food is Almost Ready
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_probe_a_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_probe_a_temperature.state) < float(states.input_number.probe_a_alarm_temp.state)-5
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    - entity_id: sensor.rt700_probe_a_temperature
      to: unavailable
      trigger: state
    continue_on_timeout: false
    timeout: '20:00:00'
  mode: single
- id: '1626131232835'
  alias: Recteq Grill Temperature - 10F
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_actual_temperature.state) >= float(states.sensor.rt700_target_temperature.state)-10
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions: []
  actions:
  - data:
      message: Your grill will be ready soon. It is 10 degrees below your target temperature.
      title: Recteq - Heating up!
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_actual_temperature.state) < float(states.sensor.rt700_target_temperature.state)-10
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
      for:
        hours: 0
        minutes: 5
        seconds: 0
    timeout: '20:00:00'
    continue_on_timeout: false
  - data:
      message: Your grill has dropped 10 degrees below your target temperature
      title: Recteq - Grill has cooled!
      data:
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
        color: red
    action: notify.all_devices
  mode: single
- id: '1626140861013'
  alias: Recteq Grill Temperature + 10F
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_actual_temperature.state) >= float(states.sensor.rt700_target_temperature.state)+10
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions: []
  actions:
  - data:
      message: Your grill is 10 degrees above your target temperature
      title: Recteq - Warning!
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
        color: red
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_actual_temperature.state) < float(states.sensor.rt700_target_temperature.state)+10
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    continue_on_timeout: false
    timeout: '20:00:00'
  - data:
      message: Your grill is back within 10 degrees of your target temperature
      title: Recteq
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
    action: notify.all_devices
  mode: single
- id: '1626380331997'
  alias: Recteq Probe B Alarm - 5F
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_probe_b_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_probe_b_temperature.state) >= float(states.input_number.probe_b_alarm_temp.state)-5
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions:
  - condition: state
    entity_id: input_boolean.probe_b_alarm_set
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.probe_b_alarm_temp
    above: 0
  actions:
  - data:
      message: Probe B is 5 degrees below target temp
      title: Food is Almost Ready
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_probe_b_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_probe_b_temperature.state) < float(states.input_number.probe_b_alarm_temp.state)-5
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    - entity_id: sensor.rt700_probe_b_temperature
      to: unavailable
      trigger: state
    continue_on_timeout: false
    timeout: '20:00:00'
  mode: single
- id: '1626380349717'
  alias: Recteq Probe B Alarm
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_probe_b_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_probe_b_temperature.state) >= float(states.input_number.probe_b_alarm_temp.state)
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions:
  - condition: state
    entity_id: input_boolean.probe_b_alarm_set
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.probe_b_alarm_temp
    above: 0
  actions:
  - data:
      message: 'Probe B is at target temp '
      title: Food is Done!
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
        color: red
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_probe_b_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_probe_b_temperature.state) < float(states.input_number.probe_b_alarm_temp.state)
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    - entity_id: sensor.rt700_probe_b_temperature
      to: unavailable
      trigger: state
    continue_on_timeout: false
    timeout: '20:00:00'
  mode: single
- id: '1626380490549'
  alias: Recteq Probe A Alarm
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_probe_a_temperature') not in ['unavailable','unknown']
      %}\n  {% if float(states.sensor.rt700_probe_a_temperature.state) >= float(states.input_number.probe_a_alarm_temp.state)
      %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions:
  - condition: state
    entity_id: input_boolean.probe_a_alarm_set
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.probe_a_alarm_temp
    above: 0
  actions:
  - data:
      message: Probe A is at target temp
      title: Food is Done!
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
        color: red
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_probe_a_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_probe_a_temperature.state) < float(states.input_number.probe_a_alarm_temp.state)
        %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    - trigger: state
      entity_id:
      - sensor.rt700_probe_a_temperature
      to: unavailable
    continue_on_timeout: false
    timeout: '20:00:00'
  mode: single
- id: '1626739464825'
  alias: Recteq Grill at Temperature
  description: ''
  triggers:
  - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
      %}\n {% if float(states.sensor.rt700_actual_temperature.state) >= float(states.sensor.rt700_target_temperature.state)
      %}\n  True\n {% else %}\n  False\n {% endif %}\n{% else %}\n False\n{% endif
      %}"
    trigger: template
  conditions: []
  actions:
  - data:
      message: Your grill is at your target temperature
      title: Recteq Ready!
      data:
        channel: recteq
        actions:
        - action: URI
          title: View
          uri: /lovelace/grill
        sticky: false
    action: notify.all_devices
  - wait_for_trigger:
    - value_template: "{% if states('sensor.rt700_actual_temperature') not in ['unavailable','unknown']
        %}\n  {% if float(states.sensor.rt700_actual_temperature.state) < float(states.sensor.rt700_target_temperature.state)
        - 50 %}\n   True\n  {% else %}\n   False\n  {% endif %}\n{% else %}\n False\n{%
        endif %}"
      trigger: template
    continue_on_timeout: false
    timeout: '20:00:00'
  mode: single

Change Log

  • future
  • 1.0.0
    • Fix error for async_forward_entry_setup being deprecated
    • Add low and full modes
  • 0.2.1
    • Fixing DPS for RT700
    • Fixed Tuya Protocol 3.4 and ability for Local Key to use more the hex digits for new controllers
    • Fixed issue that caused Home Assistant to slow down significantly when integration was enabled, but grill was offline
    • Adding drop down to select Tuya Protocol and Grill Type which will dynamically point the correct data points to probe names (I will need help to make sure I align them correctly so this will be a work in progress)
    • Fixed Device Key Length
    • Fixed Probe Temps
    • Switched to tintuya for data reading
  • 0.0.4
    • Metric units support
    • Force-Fahrenheit option
  • 0.0.3
    • Added target & actual sensors
    • Sensors and current temperature report "unavailable" when off.
    • Added UI usage to README
    • Bugfixes and cleanup.
  • 0.0.2
    • HACS support
    • README additions
  • 0.0.1
    • Initial release candidate
    • Works for me. Looking for others to test.

License

MIT

See LICENSE for details.

Support

Submit issues for defects, feature requests or questions. I'll try to help as I can.

I am very interested in feedback on this to know whether it's working for others.

Credits

This is forked from mochman (https://github.com/mochman) who forked the repo by Paul Dugas, [email protected].

Paul Dugas learned this was possible from SDNick484/rectec_status and based the intial versions of the project on his examples. Much thanks to mochman, SDNick along with those he credits; codetheweb, clach04, blackrozes, jepsonrob, and all the other contributors on tuyapi and python-tuya who have made communicating to Tuya devices possible with open source code.

About

Control & Monitor your Recteq Grill

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 97.3%
  • Makefile 2.7%