kia_uvo icon indicating copy to clipboard operation
kia_uvo copied to clipboard

IONIQ 5 (EUR): Scheduled departure as datetime object

Open kalaws opened this issue 1 year ago • 6 comments

Update: See below post for a way to get next departure as datetime object.


Thank you for the great work. Extremely useful.

My Data sensor includes reservInfo: day: item. I’m wondering if you could expose the data as a separate sensor? 1 is Monday, 7 is Sunday. Not sure how it is best presented? Datestamp? Separate sensor for each day of week? Either way, the point for me would be to match it to the present day of week to feed that info to an automation for charging.

IMG_7161

kalaws avatar Sep 11 '23 19:09 kalaws

Perhaps a sensor with one attribute for each day? Monday: True Tuesday: False And so on

kalaws avatar Sep 11 '23 19:09 kalaws

Perhaps the most reasonable way would be to expose a full timestamp of the next scheduled departure time, as indicated by the list of days. for instance, today the list would look as follows: Tuesday 2023/09/12 07:10:00 Wednesday 2023/09/13 07:10:00 Thursday 2023/09/14 07:10:00 Friday 2023/09/15 07:10:00 Monday 2023/09/18 07:10:00

State of sensor could be next scheduled departure as full timestamp. Rest of the list could be in attribute(s).

kalaws avatar Sep 11 '23 20:09 kalaws

Never mind, solved it by parsing the data in the following way, if anyone else tries to base automation off it:

{% set depday = state_attr('sensor.ioniq_5_data', 'vehicle_data').vehicleStatus.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservInfo.day %}
{% set deptime = as_timestamp(strptime(states('sensor.ioniq_5_ev_first_scheduled_departure_time'), '%H:%M:%S')) | timestamp_custom('%H:%M:%S') %}
{% set bluelinknow = as_datetime((now().timestamp()+86400)|int | timestamp_local(True)) %}
{% set bluelinktomorrow = as_datetime((now().timestamp()+(86400*2))|int | timestamp_local(True)) %}
{% set nutid = as_timestamp(now()) | timestamp_custom('%H:%M:%S') %}

{% if bluelinknow.weekday() in depday and nutid <= deptime %}
  {% set sched = "on" %}
{% elif bluelinktomorrow.weekday() in depday and nutid >= deptime %}
  {% set sched = "on" %}
{% else %}
  {% set sched = "off" %}
{% endif %}
{{ sched }}

The bluelinknow is a correction of HA's now(), because in HA 0 is Monday, and in Bluelink 0 means Sunday. This way bluelinknow.weekday() can be used to check if today is listed among the scheduled weekdays.

My particular smart charging solution accepts only time of day as input, so my way might look convoluted to someone else. :)

kalaws avatar Sep 15 '23 10:09 kalaws

Here's a way to get the next scheduled departure as a datetime object, i.e., including date and time. I'm posting it since I guess more people will be interested. The whole replace() business is required because HA and Kia/Hyundai do not assume the same day of week as 0. There's probably a neater way of doing the replace - please post if you know of one.

{% set errdepday = state_attr('sensor.[YOURCAR]_data', 'vehicle_data').vehicleStatus.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservInfo.day %}
{% set sched = states('binary_sensor.[YOURCAR]_ev_first_scheduled_departure') %}
{% set deptime = as_timestamp(strptime(states('sensor.[YOURCAR]_ev_first_scheduled_departure_time'), '%H:%M:%S')) | timestamp_custom('%H:%M:%S') %}

{% set depday = (errdepday|replace(6,7)|replace(0,6)|replace(1,0)|replace(2,1)|replace(3,2)|replace(4,3)|replace(5,4)|replace(7,5)|replace(', ','')|replace('[','')|replace("]",'')|replace("'",''))|list %}
{% set nutid = as_timestamp(now()) | timestamp_custom('%H:%M:%S') %}
{% if now().weekday() in depday|map('int') and nutid < deptime %}
  {% set startday = -1 %}
{% else %}
  {% set startday = 0 %}
{% endif %}
{% set ns = namespace(result=[]) %}
      {% for i in depday %}
      {% set days_delta = i|int - now().weekday() %}
      {% if days_delta <= startday %}
        {% set days_delta = days_delta + 7 %}
      {% endif %}

      {% set res = now() + timedelta(days_delta) %}
      {% set ns.result = ns.result + [(res.timestamp() | timestamp_custom('%Y-%m-%d '+deptime))] %}

      {% if not loop.last %}{% endif %}
      {%- endfor %}
{% set listan = ns.result | sort %}
  {{ as_datetime(listan[0]) }}

For second departure as datetime object, change the first three lines:

{% set errdepday = state_attr('sensor.[YOURCAR]_data', 'vehicle_data').vehicleStatus.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservInfo.day %}
{% set sched = states('binary_sensor.[YOURCAR]_ev_second_scheduled_departure') %}
{% set deptime = as_timestamp(strptime(states('sensor.[YOURCAR]_ev_second_scheduled_departure_time'), '%H:%M:%S')) | timestamp_custom('%H:%M:%S') %}

kalaws avatar Sep 23 '23 12:09 kalaws

Open to PRs. I don't own a Kia anymore so haven't done much on this.

cdnninja avatar Sep 23 '23 16:09 cdnninja

Sorry, I have no idea how to do this in proper code 😬

kalaws avatar Sep 27 '23 18:09 kalaws