banzi
May 4, 2021, 2:29pm
1
I would love to be able to use my GrillEye Pro+ BBQ meat temperature sensor(s) within HA.
Of course it wouldn’t be fair to let others create what I want to integrate.
What I’ve found so far:
An Android APK version 1.6 (although my iPhone version is at 3.1 already)
api.grilleye.com is the server to connect to
The phone registers to that website with specific calls
Then whenever I press one of the sensors to see graphical temperatures, a call is made to https://api.grilleye.com/temperatures/xxxxxxxxxxx0000000 where the x’s stand for the serial number of the GrillEye Pro+. It needs a security-key in the header of the GET request.
Somehow current temperatures are not requested but probably pushed (I was unable to see this traffic in an HTTPS SSL Proxy program)
I’m unsure if this security-key relates to the app itself or if it is somehow a hash of my GrillEye Pro+ and iPhone.
Who could push me into the right direction? Or is even willing to participate in reverse-engineering of the GrillEye API?
banzi
May 5, 2021, 7:56am
2
So I’ve verified with another GrillEye, that the security key is NOT bound to the grilleye and/or phone.
Issueing a request to:
https://api.grilleye.com/temperatures/xxxxxxxxxxxx000000
while adding an extra header:
security-key = 6z7nmIq56VkUbb4
gives you the past temperatures of all connected sensors.
Fiddling around I created this for now:
- platform: rest
name: GrillEye Pro
scan_interval: 30
resource: https://api.grilleye.com/temperatures/xxx0000000
method: GET
value_template: '{{ value_json.probe }}'
json_attributes_path: "$.temperatures[-1:]"
json_attributes:
- id
- probe
- temp
- toTimestamp
headers:
Security-Key: 6z7nmIq56VkUbb4
Then converting this to two sensors, I mostly use two probes:
- platform: template
sensors:
grilleye_1_temperature:
value_template: >-
{% if state_attr('sensor.grilleye_pro_2', 'probe') == 1 %}
{{ state_attr('sensor.grilleye_pro_2', 'temp') }}
{% endif %}
device_class: temperature
unit_of_measurement: "°C"
grilleye_2_temperature:
value_template: >-
{% if state_attr('sensor.grilleye_pro_2', 'probe') == 2 %}
{{ state_attr('sensor.grilleye_pro_2', 'temp') }}
{% endif %}
device_class: temperature
unit_of_measurement: "°C"
[edit]
This doesn’t work well for the second probe. The interval of Grilleye updating is not predictible so if the probes update almost at the same time you probably mis the data from the second probe.
Not sure wat a better way is to achieve this
WiltoX
January 28, 2022, 1:51pm
4
Since i am a owner off the Grileye Pro+ i am curious to know if this still works for you. It does not work for me and hoping that it is my bad.
sincerely
Sorry it wasn’t stable enough.
WiltoX
January 30, 2022, 9:36am
6
@freakstar Thanks for your reply, going to find an other solution.
Would love to have my GrillEye in Hass, did anyone of you succeed to integrate it?
bino
(Peter Vandermeulen)
February 12, 2024, 2:52pm
8
I have the GillEye Max and was able to get the details via API.
I was able to check the API calls via mitmproxy and found that it works via a header ruequest, using a phone-id.
The probe details are pulled via the serial of the GrillEye, but that seems to be the MAC adr.
#GrillEye main data
- resource: https://api-prod.hyperion.grilleye.com/grills
scan_interval: 120
method: GET
sensor:
- name: "GrillEye serialNumber"
value_template: "{{ value_json[0].serialNumber }}"
- name: "GrillEye name"
value_template: "{{ value_json[0].name }}"
- name: "GrillEye firmwareVersion"
value_template: "{{ value_json[0].firmwareVersion }}"
- name: "GrillEye connected"
value_template: "{{ value_json[0].connected }}"
- name: "GrillEye battery level"
value_template: "{{ value_json[0].battery }}"
#device_class: battery
unit_of_measurement: "%"
- name: "GrillEye batteryCharging"
value_template: "{{ value_json[0].batteryCharging }}"
#device_class: battery
headers:
phone-id: !secret grileye_phone-id
#GrillEye Probe info
#Decice ID = MAC adr
#node URL: https://api-prod.hyperion.grilleye.com/grills/<MAC ADR>/probes
- resource: https://api-prod.hyperion.grilleye.com/grills/XXXXXXXXXXXX/probes
scan_interval: 60
method: GET
sensor:
- name: "GrillEye Probe 1 Temperature"
value_template: "{{ value_json[0]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 2 Temperature"
value_template: "{{ value_json[1]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 3 Temperature"
value_template: "{{ value_json[2]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 4 Temperature"
value_template: "{{ value_json[3]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 5 Temperature"
value_template: "{{ value_json[4]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 6 Temperature"
value_template: "{{ value_json[5]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 7 Temperature"
value_template: "{{ value_json[6]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye Probe 8 Temperature"
value_template: "{{ value_json[7]['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
headers:
phone-id: !secret grileye_phone-id
banzi
March 8, 2024, 11:50am
9
Not sure if it is the right way to do it, I now have the following for all available 8 sensors:
rest:
- resource: https://api.grilleye.com/temperatures/xxx0000000
headers:
Security-Key: 6z7nmIq56VkUbb4
scan_interval: 30
sensor:
- name: "GrillEye_Pro_Sensor_1"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 1) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_2"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 2) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_3"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 3) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_4"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 4) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_5"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 5) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_6"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 6) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_7"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 7) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "GrillEye_Pro_Sensor_8"
value_template: "{{ value_json.temperatures | reverse | selectattr('probe', 'eq', 8) | map(attribute='temp') | first | default(0) }}"
device_class: temperature
unit_of_measurement: "°C"
I’m not sure if this would take too much calculations… Haven’t tested it for the long run as well!