esphome:
  name: kona-obd-reader
  comment: "ESP32 #1 - Kona EV OBD via iCar2"
  includes:
    - obd_client.h

esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP_TASK_WDT_TIMEOUT_S: "30"

safe_mode:
  disabled: true

wifi:
  id: wifi_wlan
  ssid: "V-LINK"
  fast_connect: true
  reboot_timeout: 0s   # Nicht rebooten wenn iCar2 nicht da

logger:
  level: DEBUG

ota:
  platform: esphome

uart:
  id: uart_to_esp2
  tx_pin: GPIO17
  rx_pin: GPIO10
  baud_rate: 115200

globals:
  - id: g_obd_enabled
    type: bool
    initial_value: "false"
  - id: g_uart_buf
    type: std::string
    initial_value: '""'
  - id: g_soc
    type: float
    initial_value: "0.0"
  - id: g_soh
    type: float
    initial_value: "0.0"
  - id: g_bat_temp_avg
    type: float
    initial_value: "0.0"
  - id: g_bat_temp_min
    type: float
    initial_value: "0.0"
  - id: g_bat_temp_max
    type: float
    initial_value: "0.0"
  - id: g_charge_cycles
    type: float
    initial_value: "0.0"
  - id: g_is_charging
    type: bool
    initial_value: "false"
  - id: g_battery_voltage
    type: float
    initial_value: "0.0"
  - id: g_battery_current
    type: float
    initial_value: "0.0"

sensor:
  - platform: wifi_signal
    name: "Kona iCar2 Signal"
    id: sensor_wifi_signal
    update_interval: 60s

  - platform: template
    name: "Kona SOC"
    id: sensor_soc
    unit_of_measurement: "%"
    accuracy_decimals: 1
    lambda: return id(g_soc);
    update_interval: 60s

  - platform: template
    name: "Kona SOH"
    id: sensor_soh
    unit_of_measurement: "%"
    accuracy_decimals: 1
    lambda: return id(g_soh);
    update_interval: 60s

  - platform: template
    name: "Kona Batterie Temp (Avg)"
    id: sensor_bat_temp_avg
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    lambda: return id(g_bat_temp_avg);
    update_interval: 60s

  - platform: template
    name: "Kona Batterie Temp (Min)"
    id: sensor_bat_temp_min
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    lambda: return id(g_bat_temp_min);
    update_interval: 60s

  - platform: template
    name: "Kona Batterie Temp (Max)"
    id: sensor_bat_temp_max
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    lambda: return id(g_bat_temp_max);
    update_interval: 60s

  - platform: template
    name: "Kona Ladezyklen"
    id: sensor_cycles
    unit_of_measurement: ""
    accuracy_decimals: 0
    lambda: return id(g_charge_cycles);
    update_interval: 60s

  - platform: template
    name: "Kona Batterie Spannung"
    id: sensor_voltage
    unit_of_measurement: "V"
    accuracy_decimals: 1
    lambda: return id(g_battery_voltage);
    update_interval: 60s

  - platform: template
    name: "Kona Batterie Strom"
    id: sensor_current
    unit_of_measurement: "A"
    accuracy_decimals: 1
    lambda: return id(g_battery_current);
    update_interval: 60s

binary_sensor:
  - platform: template
    name: "Kona lädt"
    id: sensor_charging
    lambda: return id(g_is_charging);


interval:
  # UART Kommandos von ESP32 #2 empfangen (CMD:ENABLE / CMD:DISABLE)
  - interval: 500ms
    then:
      - lambda: |-
          while (id(uart_to_esp2).available()) {
            uint8_t c;
            id(uart_to_esp2).read_byte(&c);
            if (c == '\n') {
              std::string cmd = id(g_uart_buf);
              id(g_uart_buf) = "";
              if (cmd == "CMD:ENABLE") {
                id(g_obd_enabled) = true;
                ESP_LOGI("CTRL", "OBD aktiviert");
              } else if (cmd == "CMD:DISABLE") {
                id(g_obd_enabled) = false;
                ESP_LOGI("CTRL", "OBD deaktiviert");
              }
            } else if (c != '\r') {
              id(g_uart_buf) += (char)c;
            }
          }

  # BMS Hauptdaten: SOC, Spannung, Strom, Temp - 2x pro Minute also 30s
  - interval: 30s
    then:
      - lambda: |-
          obd_query_bms();
      - delay: 500ms
      - lambda: |-
          if (id(g_obd_enabled)) send_data_uart();

  # SOH + Ladezyklen - 1x pro Stunde also 3600s
  - interval: 3600s
    then:
      - lambda: |-
          obd_query_soh();
      - delay: 300ms
      - lambda: |-
          if (id(g_obd_enabled)) send_data_uart();

  # Keep-Alive: TCP offen halten damit iCar2 nicht einschläft
  - interval: 120s
    then:
      - lambda: |-
          obd_keepalive();
