GrillEye Pro+

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?

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

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.

@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?

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

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!