# =====================================================================
#  温泉熱 × 井戸水 床下空調コントローラ ファームウェア (ESPHome)
#  対象: ESP32 DevKit / ESP32 8ch relay board
#  機能: 5温度センサ / 暖房・冷房を比例弁でPID自動制御 / ECファン風量 /
#        Home Assistant連携で「どこからでも」遠隔調整
#
#  書き込み方法 (買った人がやる):
#   1. https://web.esphome.io を Chrome で開き、ESP32をUSB接続
#   2. このYAMLを貼り、INSTALL → ブラウザから直接Flash
#   3. 初回はスマホで WiFi "Onsen-HVAC Setup" (pass: setup1234) に繋ぎ自宅WiFiを設定
#   4. Home Assistant がデバイスを自動発見 → 遠隔操作開始
#  どこからでも: Home Assistant + Tailscale(無料) か Nabu Casa で外出先からも操作
# =====================================================================

substitutions:
  device_name: onsen-hvac
  friendly: 温泉床下空調

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

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

# Home Assistant 連携 (遠隔操作の母艦)
api:
  encryption:
    key: !secret api_key            # ESPHomeが自動生成（32byte base64）

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:                               # 初回設置者がスマホからWiFi設定（YAML編集不要）
    ssid: "Onsen-HVAC Setup"
    password: "setup1234"

captive_portal:

web_server:                         # 同一LANからブラウザで直接操作
  port: 80
  version: 3

# --- 任意: HA無しで「どこからでも」直接制御したい場合はクラウドMQTTを有効化 ---
# mqtt:
#   broker: your-broker.example.com
#   username: !secret mqtt_user
#   password: !secret mqtt_pass

# 温度センサ DS18B20 ×5 (1-Wireバスに数珠つなぎ。GPIO4)
one_wire:
  - platform: gpio
    pin: GPIO4

sensor:
  # ↓ 各センサの address は初回起動のログに出る値へ差し替える
  - platform: dallas_temp
    name: "床下温度"
    id: t_floor
    # address: 0x1c0000031edd2a28
  - platform: dallas_temp
    name: "居室温度"
    id: t_room
  - platform: dallas_temp
    name: "温泉入口温度"
    id: t_onsen
  - platform: dallas_temp
    name: "コイル出口温度"
    id: t_coil
  - platform: dallas_temp
    name: "外気温度"
    id: t_out

# 出力: 比例弁(0-10V)はPWM→0-10V変換モジュール経由。ファンはEC PWM。
output:
  - platform: ledc
    pin: GPIO25
    id: valve_heat                  # 二次側=暖房バルブ（温泉熱）
    frequency: 1000 Hz
  - platform: ledc
    pin: GPIO26
    id: valve_cool                  # 井戸水バルブ（冷房）
    frequency: 1000 Hz
  - platform: ledc
    pin: GPIO27
    id: fan_pwm                     # ECファン風量
    frequency: 25000 Hz
  - platform: ledc
    pin: GPIO33
    id: valve_footbath              # 足湯給湯バルブ（出しっぱなしにしない）
    frequency: 1000 Hz

# 足湯の人感センサ（PIR）。人が来たら出す・いなければ止める
binary_sensor:
  - platform: gpio
    pin: GPIO34
    name: "足湯 人感センサ"
    id: footbath_motion
    on_press:
      - output.set_level: {id: valve_footbath, level: 80%}
    on_release:
      - delay: 3min
      - output.set_level: {id: valve_footbath, level: 0%}

# ファン（風量可変。床下空気を回す）
fan:
  - platform: speed
    output: fan_pwm
    name: "床下ファン"
    id: floor_fan

# 暖房/冷房を比例弁で自動制御（PID）。HAから目標温度を遠隔調整。
climate:
  - platform: pid
    name: "床下空調"
    id: floor_hvac
    sensor: t_floor
    default_target_temperature: 22 °C
    heat_output: valve_heat
    cool_output: valve_cool
    control_parameters:
      kp: 0.8
      ki: 0.01
      kd: 0.0

# 安全ロジック: 温泉が薄い/凍結リスク時の保護（必要に応じ調整）
interval:
  - interval: 30s
    then:
      - if:                         # 外気が氷点下＝一次側を細く流し続ける合図（ファン弱で循環維持）
          condition:
            lambda: 'return id(t_out).state < 1.0;'
          then:
            - fan.turn_on:
                id: floor_fan
                speed: 20
      - if:                         # 足湯：氷点下で誰もいなくても凍結防止に最小流量で細く流す
          condition:
            lambda: 'return id(t_out).state < 0.0;'
          then:
            - output.set_level: {id: valve_footbath, level: 8%}
