# =====================================================================
#  サウナ コントローラ ファームウェア (ESPHome) — 床下空調と同じ仕組みの応用
#  対象: ESP32 + K型熱電対(MAX6675) + 湿度センサ + リレー基板
#
#  なぜDS18B20でなく熱電対か:
#   サウナ室内は80〜100℃。DS18B20は上限~125℃でギリギリ＆寿命が縮む。
#   K型熱電対(MAX6675)なら0〜1000℃で安全。サウナはこれが正解。
#
#  制御: 目標温度でヒーターON/OFF(リレー) + ロウリュ給水ポンプ + 過熱安全カット
#  遠隔: 床下空調と同じく Home Assistant 連携で外出先から予約・ON/OFF
#  device.house SKU: DEVICE-SAUNA-CTRL-V1
# =====================================================================

substitutions:
  device_name: sauna-ctrl
  friendly: サウナ制御

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

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
api:
  encryption:
    key: !secret api_key
ota:
  - platform: esphome
    password: !secret ota_password
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Sauna Setup"
    password: "setup1234"
captive_portal:
web_server:
  port: 80
  version: 3

# K型熱電対 (室温・高温対応)
spi:
  clk_pin: GPIO18
  miso_pin: GPIO19

sensor:
  - platform: max6675
    name: "サウナ室温"
    id: t_sauna
    cs_pin: GPIO5
    update_interval: 5s
  - platform: dht                 # 湿度（ロウリュ管理・任意）
    pin: GPIO4
    temperature:
      name: "サウナ温度(湿度計側)"
    humidity:
      name: "サウナ湿度"
      id: h_sauna
    model: DHT22
    update_interval: 10s

# リレー出力（ヒーター・ロウリュ給水ポンプ）
switch:
  - platform: gpio
    pin: GPIO26
    name: "ロウリュ給水ポンプ"
    id: loyly_pump
    icon: "mdi:water"

output:
  - platform: gpio
    pin: GPIO25
    id: heater_relay              # サウナヒーター

# 目標温度でヒーター制御（サーモスタット）
climate:
  - platform: thermostat
    name: "サウナ"
    id: sauna_clima
    sensor: t_sauna
    min_heating_off_time: 20s
    min_heating_run_time: 20s
    min_idle_time: 20s
    heat_action:
      - output.turn_on: heater_relay
    idle_action:
      - output.turn_off: heater_relay
    default_target_temperature_low: 85 °C
    heat_deadband: 2 °C
    heat_overrun: 2 °C

# 過熱安全カット（110℃超で強制停止）
interval:
  - interval: 5s
    then:
      - if:
          condition:
            lambda: 'return id(t_sauna).state > 110.0;'
          then:
            - output.turn_off: heater_relay
            - logger.log: "SAFETY: over 110C — heater cut"
