# =============================================================================
#  shh-c6-wifi.yaml — XIAO ESP32-C6 + CHT832X (DFRobot SEN0546) σε WiFi
#  Smart Home Hellas · https://smarthomehellas.gr/blog/xiao-esp32-c6-wifi-thread-zigbee/
#
#  Καλωδίωση (pinout Seeed): SDA -> D4 (GPIO22), SCL -> D5 (GPIO23), VCC -> 3V3, GND -> GND
#  Secrets που χρειάζονται (δες secrets.example.yaml):
#    wifi_ssid, wifi_password, ap_password, ota_password, web_password
# =============================================================================

substitutions:
  device_name: shh-c6-wifi
  friendly_name: "XIAO C6 WiFi"

esphome:
  name: ${device_name}
  friendly_name: ${friendly_name}

esp32:
  board: seeed_xiao_esp32c6
  framework:
    type: esp-idf          # υποχρεωτικό στο C6 (με Arduino δεν χτίζει)

logger:
  level: INFO
  hardware_uart: USB_SERIAL_JTAG

# ---------- Home Assistant API ----------
api:
  reboot_timeout: 0s
  # Προαιρετικά, κρυπτογράφηση (το key το φτιάχνει ο Device Builder ή: openssl rand -base64 32)
  # encryption:
  #   key: !secret api_encryption_key

# ---------- Δικτύωση ----------
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:                       # fallback hotspot αν δεν βρει το WiFi
    ssid: "${device_name} Fallback"
    password: !secret ap_password

captive_portal:
improv_serial:

esp32_improv:
  authorizer: none

ota:
  - platform: esphome
    password: !secret ota_password
  - platform: web_server

web_server:
  version: 3
  local: true
  port: 80
  auth:
    username: admin
    password: !secret web_password

# ---------- I2C bus (pinout Seeed: SDA = D4 = GPIO22, SCL = D5 = GPIO23) ----------
i2c:
  sda: GPIO22
  scl: GPIO23
  frequency: 100kHz
  scan: true                # στο log θα δεις τη διεύθυνση 0x44 του CHT832X

sensor:
  # CHT832X (DFRobot SEN0546) — συμβατός με SHT3x, διεύθυνση 0x44.
  # Το timeout (3x update_interval) γυρνάει τις οντότητες σε "unavailable" αν ο
  # αισθητήρας σταματήσει να απαντάει, αντί να μείνουν «παγωμένες» στην τελευταία τιμή.
  - platform: sht3xd
    temperature:
      name: "${friendly_name} Temperature"
      id: sht_temperature
      filters:
        - timeout: 180s
    humidity:
      name: "${friendly_name} Humidity"
      id: sht_humidity
      filters:
        - timeout: 180s
    address: 0x44
    update_interval: 60s

  # ---------- Παράγωγα από θερμοκρασία + υγρασία ----------
  - platform: template
    name: "${friendly_name} Absolute Humidity"
    id: sht_abs_humidity
    lambda: |-
      const float mw = 18.01534;
      const float r = 8.31447215;
      return (6.112 * powf(2.718281828, (17.67 * id(sht_temperature).state) /
        (id(sht_temperature).state + 243.5)) * id(sht_humidity).state * mw) /
        ((273.15 + id(sht_temperature).state) * r);
    accuracy_decimals: 2
    update_interval: 60s
    icon: "mdi:water"
    unit_of_measurement: "g/m³"

  - platform: template
    name: "${friendly_name} Dew Point"
    id: sht_dew_point
    lambda: |-
      return (243.5*(log(id(sht_humidity).state/100)+((17.67*id(sht_temperature).state)/
      (243.5+id(sht_temperature).state)))/(17.67-log(id(sht_humidity).state/100)-
      ((17.67*id(sht_temperature).state)/(243.5+id(sht_temperature).state))));
    unit_of_measurement: °C
    icon: "mdi:thermometer-alert"

  # ---------- Διαγνωστικά ----------
  - platform: uptime
    name: "${friendly_name} Uptime"
    id: uptime_seconds
    entity_category: diagnostic

  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: diagnostic

  - platform: copy
    source_id: wifi_signal_db
    name: "${friendly_name} WiFi Signal Percent"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    entity_category: diagnostic

# ---------- Ώρα ----------
time:
  - platform: sntp
    id: sntp_time
    timezone: Europe/Athens

text_sensor:
  - platform: template
    name: "${friendly_name} Time"
    lambda: |-
      char str[17];
      time_t currTime = id(sntp_time).now().timestamp;
      strftime(str, sizeof(str), "%d-%m-%Y %H:%M", localtime(&currTime));
      return {str};
    update_interval: 60s

  - platform: version
    name: "${friendly_name} ESPHome Version"
    hide_timestamp: true
    entity_category: diagnostic
    disabled_by_default: true

  - platform: wifi_info
    ip_address:
      name: "${friendly_name} IP Address"
      entity_category: diagnostic
    ssid:
      name: "${friendly_name} Connected SSID"
      entity_category: diagnostic
      disabled_by_default: true
    mac_address:
      name: "${friendly_name} MAC Address"
      entity_category: diagnostic
      disabled_by_default: true

  - platform: template
    name: "${friendly_name} Last Boot Time"
    entity_category: diagnostic
    disabled_by_default: true
    lambda: |-
      auto boot_time = id(sntp_time).now().timestamp - (time_t)id(uptime_seconds).state;
      char str[30];
      strftime(str, sizeof(str), "%d-%m-%Y %H:%M:%S", localtime(&boot_time));
      return {str};
    update_interval: 5min

# ---------- Κουμπιά ----------
button:
  - platform: restart
    name: "${friendly_name} Restart"
    entity_category: config

  - platform: factory_reset
    name: "${friendly_name} Factory Reset"
    entity_category: config
    disabled_by_default: true
