I have the BBQ Guru CyberQ Wi-Fi thermostatic controller and just did a 12 hour brisket cook. While running the cook overnight I had thoughts of how nice it would be to have the controller integrated into my ever growing HA system. After a lot of searching I was unable to find any documented successful implementations for this controller.
After 2 days of searching, scraping and amateur HA programming I have a working solution.
Basic section card for the CyberQ. All it does is display. No inputs or updating. Still trying to decide how I might approach that.
This code goes into your configuration.yaml file. Edit the IP to match your controller. I set my controller to have a dedicated IP in the router so this doesn’t have to be changed all the time.
rest:
- resource: http://192.168.1.35/all.xml
sensor:
- name: "BBQ Fan Output"
value_template: "{{ (value_json['nutcallstatus']['OUTPUT_PERCENT'])}}"
- name: "BBQ Cook Name"
value_template: "{{ (value_json['nutcallstatus']['COOK']['COOK_NAME'])}}"
- name: "BBQ Pit Set Point"
value_template: "{{ (value_json['nutcallstatus']['COOK']['COOK_SET'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Pit Temp"
value_template: "{{ (value_json['nutcallstatus']['COOK']['COOK_TEMP'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 1 Name"
value_template: "{{ (value_json['nutcallstatus']['FOOD1']['FOOD1_NAME'])}}"
- name: "BBQ Food 1 Set Point"
value_template: "{{ (value_json['nutcallstatus']['FOOD1']['FOOD1_SET'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 1 Temp"
value_template: "{{ (value_json['nutcallstatus']['FOOD1']['FOOD1_TEMP'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 2 Name"
value_template: "{{ (value_json['nutcallstatus']['FOOD2']['FOOD2_NAME'])}}"
- name: "BBQ Food 2 Set Point"
value_template: "{{ (value_json['nutcallstatus']['FOOD2']['FOOD2_SET'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 2 Temp"
value_template: "{{ (value_json['nutcallstatus']['FOOD2']['FOOD2_TEMP'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 3 Name"
value_template: "{{ (value_json['nutcallstatus']['FOOD3']['FOOD3_NAME'])}}"
- name: "BBQ Food 3 Set Point"
value_template: "{{ (value_json['nutcallstatus']['FOOD3']['FOOD3_SET'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
- name: "BBQ Food 3 Temp"
value_template: "{{ (value_json['nutcallstatus']['FOOD3']['FOOD3_TEMP'] | float / 10) | round(1) }}"
unit_of_measurement: "°F"
rest_command:
set_cook_name:
url: 'http://192.168.1.35/'
method: 'post'
payload: "COOK_NAME={{ name }}"
headers:
content-type: application/x-www-form-urlencoded
set_cook_temp:
url: 'http://192.168.1.35/'
method: 'post'
payload: "COOK_SET={{ temp }}"
headers:
content-type: application/x-www-form-urlencoded
set_food1_name:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD1_NAME={{ name }}"
headers:
content-type: application/x-www-form-urlencoded
set_food1_temp:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD1_SET={{ temp }}"
headers:
content-type: application/x-www-form-urlencoded
set_food2_name:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD2_NAME={{ name }}"
headers:
content-type: application/x-www-form-urlencoded
set_food2_temp:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD2_SET={{ temp }}"
headers:
content-type: application/x-www-form-urlencoded
set_food3_name:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD3_NAME={{ name }}"
headers:
content-type: application/x-www-form-urlencoded
set_food3_temp:
url: 'http://192.168.1.35/'
method: 'post'
payload: "FOOD3_SET={{ temp }}"
headers:
content-type: application/x-www-form-urlencoded
The rest section reads the values from the controller. The rest_command section writes the values to the controller. Writing works but seems inconsistent with the temp values so some tweaking may be needed.
Scripts are needed to write to the unit.
Paste the scripts below into your scripts.yaml file.
bbq_set_cook_name:
alias: 'BBQ: Set Cook Name'
sequence:
- data:
name: New Cook Name2
action: rest_command.set_cook_name
bbq_set_cook_temp:
alias: 'BBQ: Set Pit Temp'
sequence:
- data:
temp: 2400
action: rest_command.set_cook_temp
response_variable: bbqct
bbq_set_food1_name:
alias: 'BBQ: Set Food 1 Name'
sequence:
- data:
name: New Food 1 Nameb
action: rest_command.set_food1_name
bbq_set_food1_temp:
alias: 'BBQ: Set Food 1 Temp'
sequence:
- data:
temp: 1650
action: rest_command.set_food1_temp
bbq_set_food2_name:
alias: 'BBQ: Set Food 2 Name'
sequence:
- service: rest_command.set_food2_name
data:
name: New Food 2 Name
bbq_set_food2_temp:
alias: 'BBQ: Set Food 2 Temp'
sequence:
- data:
temp: 1650
action: rest_command.set_food2_temp
bbq_set_food3_name:
alias: 'BBQ: Set Food 3 Name'
sequence:
- data:
name: New Food 3 Name
action: rest_command.set_food3_name
bbq_set_food3_temp:
alias: 'BBQ: Set Food 3 Temp'
sequence:
- data:
temp: 1650
action: rest_command.set_food3_temp
This is the code for the section card.
type: grid
cards:
- type: custom:button-card
name: Big Green Egg
show_name: false
entity: null
aspect_ratio: 1.4/1
styles:
grid:
- grid-template-areas: >-
"n n pitn" "i i pitn" "food1n food1s food1t" "food2n food2s food2t"
"food3n food3s food3t"
- grid-template-columns: 33% 33% 33%
- grid-template-rows: null
custom_fields:
logo:
- position: absolute
- left: 2%
- top: 0%
custom_fields:
logo:
card:
type: custom:button-card
color: transparent
show_name: false
entity_picture: /local/bgexl.jpeg
show_entity_picture: true
styles:
card:
- background-color: transparent
- border-style: none
icon:
- width: 290px
- height: 180px
- border-radius: 5px
pitn:
card:
type: vertical-stack
cards:
- type: custom:button-card
entity: sensor.bbq_cook_name
name: Pit
show_icon: false
show_state: true
show_name: false
styles:
card:
- border-radius: 10px
- border-style: none
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2)
icon:
- width: 35px
- height: 35px
- align-self: null
- text-align: start
- padding: 5px
img_cell:
- justify-content: bottom
- align-self: bottom
- margin: null
state:
- align-self: center
- justify-self: center
- padding-left: 1px
- padding-top: 1px
- padding-bottom: 1px
- letter-spacing: 1.0px
- color: white
- type: custom:button-card
entity: sensor.bbq_pit_set_point
name: Pit Target
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 13px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 13px
- letter-spacing: 1.0px
- color: white
- type: custom:button-card
entity: sensor.bbq_pit_temp
name: Pit Temperature
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 13px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 13px
- letter-spacing: 1.0px
- color: white
food1n:
card:
type: custom:button-card
entity: sensor.bbq_food_1_name
name: Pit
show_icon: false
show_state: true
show_name: false
styles:
card:
- border-radius: 10px
- border-style: none
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2)
icon:
- width: 35px
- height: 35px
- align-self: null
- text-align: start
- padding: 5px
img_cell:
- justify-content: bottom
- align-self: bottom
- margin: null
state:
- font-weight: bold
- font-size: 13px
- align-self: center
- justify-self: center
- padding-left: 1px
- padding-top: 1px
- padding-bottom: 1px
- letter-spacing: 1.0px
- color: white
food1s:
card:
type: custom:button-card
entity: sensor.bbq_food_2_name
name: Pit
show_icon: false
show_state: true
show_name: false
styles:
card:
- border-radius: 10px
- border-style: none
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2)
icon:
- width: 35px
- height: 35px
- align-self: null
- text-align: start
- padding: 5px
img_cell:
- justify-content: bottom
- align-self: bottom
- margin: null
state:
- font-weight: bold
- font-size: 13px
- align-self: center
- justify-self: center
- padding-left: 1px
- padding-top: 1px
- padding-bottom: 1px
- letter-spacing: 1.0px
- color: white
food1t:
card:
type: custom:button-card
entity: sensor.bbq_food_3_name
name: Pit
show_icon: false
show_state: true
show_name: false
styles:
card:
- border-radius: 10px
- border-style: none
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2)
icon:
- width: 35px
- height: 35px
- align-self: null
- text-align: start
- padding: 5px
img_cell:
- justify-content: bottom
- align-self: bottom
- margin: null
state:
- font-weight: bold
- font-size: 13px
- align-self: center
- justify-self: center
- padding-left: 1px
- padding-top: 1px
- padding-bottom: 1px
- letter-spacing: 1.0px
- color: white
food2n:
card:
type: custom:button-card
entity: sensor.bbq_food_1_set_point
name: Target Temperature
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
food2s:
card:
type: custom:button-card
entity: sensor.bbq_food_2_set_point
name: Target Temperature
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
food2t:
card:
type: custom:button-card
entity: sensor.bbq_food_3_set_point
name: Target Temperature
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
food3n:
card:
type: custom:button-card
entity: sensor.bbq_food_1_temp
name: Food Temp
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
food3s:
card:
type: custom:button-card
entity: sensor.bbq_food_2_temp
name: Food Temp
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
food3t:
card:
type: custom:button-card
entity: sensor.bbq_food_3_temp
name: Food Temp
show_icon: false
show_state: true
show_name: true
layout: icon_label
styles:
card:
- background-color: rgba(255, 255, 255,0)
- border-radius: none
- border-style: none
- box-shadow: none
name:
- font-size: 12px
- letter-spacing: 1.0px
- color: white
state:
- font-weight: bold
- font-size: 14px
- letter-spacing: 1.0px
- color: white
title: BBQ Monitor
visibility:
- condition: state
entity: sensor.bbq_cook_name
state_not: unavailable
That’s it. Maybe there are others out there that might find this helpful. And if anyone wants to run with this and create some better cards or updating cards I would love to see the code. I’m just an amateur.