Hyundai Bluelink Integration

Hi!

I’m looking for a solution to display the stats of the las 28 days using sensor.car.daily_driving_stats.

I’d like to display a chart of daily consumption and distance.

Thank you,
Balint

Hi,
It"s possible to add control to start and stop charging the vehicle, like on the mobile application?
The goal is to manage the charge via Home Assistant depending on the sunshine to optimize charging with the photovoltaic panels.
THANKS

You can to that with the “start_charge” service. It is in the documentation under “Suported services”.

1 Like

update to my ioniq 5 page

2 Likes

nice one!
Can you share the yml with us ?

1 Like

Thank you !

I’ve been using it since yesterday ! also for people who come to this post :
I have 2024 Ioniq 5. all of the entities should include 2024_ioniq_5 instead of ioniq_5
Also inside the configuration file

Set the force Update for once/twice a day as it draining the 12v Battery if more :smiley:

Good luck !

I have it updating 6 times a day and it also refreshes every 5 minutes if I run a certian automation, I have had no issues with 12v, although I did replace mine as soon as I got the car with a lithium one.

i have added this info to the repo

Thanks I’ve installed for my Ioniq 6. Any tips on how you created the graphics so I can adapt for the Ioniq 6?

Should be easy to build on your own.
The Picture of the Car is a png without Background. Just use a simple jpg with such Service: Bild-Hintergrund entfernen oder transparent machen – remove.bg

type: picture-elements
image: /local/images/konatrans.png
elements:
  - type: state-badge
    entity: sensor.kona2020_ev_range
    style:
      top: 14%
      left: 7%
      color: transparent
      font-size: 0.8em
  - type: state-badge
    entity: sensor.kona2020_ev_battery_level
    style:
      top: 15%
      left: 20%
      color: transparent
      font-size: 0.8em
  - type: state-badge
    entity: sensor.kona2020_odometer
    style:
      top: 93%
      left: 90%
      color: transparent
      font-size: 1em
  - type: state-badge
    entity: sensor.kona2020_target_range_of_charge_ac
    style:
      top: 14%
      left: 90%
      color: transparent
      font-size: 0.8em

image

it was done in photoshop with quite a bit of work cutting out squares ect from tail lights for battery level etc, even as far as cutting out doors :stuck_out_tongue:

1 Like

Thanks for the guidance. I suspected as much, perhaps I’ll try a simple version without the intricacies of doors and windows moving etc.

simple I worked on in lunch, cant do much better than this as only top down open shot of the ioniq 6 had airbags on show so I had to improvise a little. follow my instructions, but leave out doors and hood and trunk, then the code left over use this image instead of the ioniq 5 lhd one.

1 Like

Is there any documentation available explaining the sensors used?
I recently bought a Hyundai Kona electric 65kW and installed Kia Uvo / Hyundai Bluelink integration, version 2.26.1, in HA.
Everything works fine, but there are some sensors that do not tell me anything or remain at 0, while the EV Battery Level is 74,5%, such as:

Estimated Charge Duration:           0 min
Estimated Fast Charge Duration:     25 min
Estimated Portable Charge Duration: 90 min
Estimated Station Charge Duration:   6 min
EV Battery Capacity:               234.440 (Unit?, Apples?)
EV Battery Level:                167.299,2 (Unit?, Pears?)

My guess for the Battery Capacity and Level:

The unit is probably Ah instead of kWh.

For Hyundai and Kia owners using the integration, here’s a stacked card with some charging data and controls.

type: vertical-stack
cards:
  - type: custom:mushroom-template-card
    primary: '{{ states(entity) }}%'
    secondary: '{{ state_attr(entity, ''friendly_name'') | title }}'
    icon: >
      {% set battery_level = (states(entity) | int / 10) | round(0) | int * 10
      %}

      {% if is_state('binary_sensor.2023_ioniq_6_ev_battery_plug', 'on' ) %}
        {% if battery_level > 0 %}
          mdi:battery-charging-{{ battery_level }}
        {% else %}
          mdi:battery-charging-outline
        {% endif %}
      {% else %}
        {% if battery_level == 100 %}
          mdi:battery
        {% elif battery_level > 0 %}
          mdi:battery-{{ battery_level }}
        {% else %}
          mdi:battery-alert-variant-outline
        {% endif %}
      {% endif %}
    icon_color: |-
      {% set battery_level = states(entity) | int %}
      {% if battery_level > 90 %} 
        green
      {% elif battery_level > 60 %}
        light-green
      {% elif battery_level > 50 %}
        lime
      {% elif battery_level > 40 %}
        yellow
      {% elif battery_level > 30 %}
        amber
      {% elif battery_level > 20 %}
        orange
      {% elif battery_level > 10 %}
        deep-orange
      {% else %}
        red
      {% endif %} 
    tap_action:
      action: none
    entity: sensor.2023_ioniq_6_ev_battery_level
    fill_container: false
    layout: horizontal
  - type: entities
    entities:
      - entity: number.2023_ioniq_6_ac_charging_limit
        name: AC Charging Limit
      - entity: number.2023_ioniq_6_dc_charging_limit
        name: DC Charging Limit
      - entity: lock.2023_ioniq_6_door_lock
        name: Door Lock
  - type: horizontal-stack
    cards:
      - type: custom:bar-card
        positions:
          name: null
          icon: 'off'
          value: inside
        style:
          top: 6.5%
          left: 10%
          background: none
          box-shadow: none
          text-shadow: none
          transform: none
          overflow: hidden
          border-radius: 0px
          width: 38%
        height: 25px
        min: 0
        max: 100
        severity:
          - color: Red
            from: 0
            to: 20
          - color: Orange
            from: 21
            to: 24
          - color: Amber
            from: 25
            to: 49
          - color: Green
            from: 50
            to: 74
        entities:
          - entity: sensor.2023_ioniq_6_ev_battery_level
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 91 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 81 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 71 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 61 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 51 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 41 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 31 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 21 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 11 %}
          mdi:square-outline
          {% else %}
          mdi:square-outline
          {% endif %}
        entity: sensor.2023_ioniq_6_ev_battery_level
        icon_color: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 20 %}
          green
          {% else %}
          red
          {% endif %}
        badge_color: red
        badge_icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float < 30 %}
          mdi:alert
          {% endif %}
        tap_action:
          action: more-info
        hold_action:
          action: none
        double_tap_action:
          action: none
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 91 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 81 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 71 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 61 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 51 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 41 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 31 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 21 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 11 %}
          mdi:square-outline
          {% else %}
          mdi:square-outline
          {% endif %}
        entity: sensor.2023_ioniq_6_ev_battery_level
        icon_color: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 24 %}
          green
          {% else %}
          null
          {% endif %}
        badge_color: red
        badge_icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float < 30 %}
          mdi:alert
          {% endif %}
        tap_action:
          action: more-info
        hold_action:
          action: none
        double_tap_action:
          action: none
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 91 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 81 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 71 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 61 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 51 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 41 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 31 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 21 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 11 %}
          mdi:square-outline
          {% else %}
          mdi:square-outline
          {% endif %}
        entity: sensor.2023_ioniq_6_ev_battery_level
        icon_color: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 49 %}
          green
          {% else %}
          null
          {% endif %}
        badge_color: red
        badge_icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float < 30 %}
          mdi:alert
          {% endif %}
        tap_action:
          action: more-info
        hold_action:
          action: none
        double_tap_action:
          action: none
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 91 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 81 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 71 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 61 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 51 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 41 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 31 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 21 %}
          mdi:square-outline
          {% elif states("sensor.2023_ioniq_6_ev_battery_level")|float > 11 %}
          mdi:square-outline
          {% else %}
          mdi:square-outline
          {% endif %}
        entity: sensor.2023_ioniq_6_ev_battery_level
        icon_color: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float > 74 %}
          green
          {% else %}
          null
          {% endif %}
        badge_color: red
        badge_icon: |-
          {% if states("sensor.2023_ioniq_6_ev_battery_level")|float < 30 %}
          mdi:alert
          {% endif %}
        tap_action:
          action: more-info
        hold_action:
          action: none
        double_tap_action:
          action: none
  - type: custom:mushroom-entity-card
    name: Last Updated
    entity: sensor.2023_ioniq_6_last_updated_at
    tap_action:
      action: perform-action
      perform_action: kia_uvo.update
    hold_action:
      action: perform-action
      perform_action: kia_uvo.force_update


image

1 Like

I live in Indonesia and I use Hyundai Stargazer with bluelink capability. Any chance I can use this integration?


updated my cards to include ioniq 6 and some smaller alt ones too.

the charge port icon works like the charge port, stays on for battery level and flashes the way the car one does when car is charging.

1 Like

Hi all,

Posted on UVO thread, I guess I can also share this here.

Thanks @anon63427907 (and @fuatakgun and @wcomartin and all involved) ! This is great to be able to fetch data from uvo/bluelink

I’m using this integration and managed to push bluelink data to ABRP :slight_smile:
(inspiration came from here)

First create a rest_command in configuration.yaml:

  update_abrp:
    method: POST
    headers:
      content_type: "charset=utf-8; application/x-www-form-urlencoded"
    url: >
      {% set tlm = {
        "utc": as_timestamp(strptime(states('sensor.kona_last_updated_at'), "%Y-%m-%dT%H:%M:%S%z")),
        "soc": states('sensor.kona_ev_battery_level'),
        "soh": states('sensor.kona_ev_state_of_health_battery'),
        "est_battery_range": float(states('sensor.kona_ev_range')),
        "is_charging": states('sensor.kona_is_charging'),
        "lat": state_attr('device_tracker.kona_location', 'latitude'),
        "lon": state_attr('device_tracker.kona_location', 'longitude'),
        "odometer": states('sensor.kona_odometer')
      } -%}
      https://api.iternio.com/1/tlm/send?api_key=your_api_key_from_iternio&token=your_token_from_abrp_app&tlm={{tlm|to_json|urlencode}}
# https://documenter.getpostman.com/view/7396339/SWTK5a8w#api-endpoints

then this automation will push the telemetry each time an update is received by the integration:

  alias: Télémétrie KONA vers ABRP
  description: ''
  triggers:
  - trigger: state
    entity_id:
    - sensor.kona_last_updated_at
  conditions: []
  actions:
  - action: rest_command.update_abrp
    data: {}
    response_variable: status
  mode: single

Now I have to figure out what are the best value for scan without beeing locked until the rest of the day (got “to many request” error in bluelink app while playing with ABRP)