From 8a73b474796332a80615b16efa61e69c46eb0116 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan@faked.org>
Date: Fri, 11 Nov 2022 21:35:30 +0100
Subject: [PATCH] switch fan_control from power socket to PWM

---
 README.md           |  1 +
 packages/fan.yaml   | 36 +++++++++++++++++++++++-------------
 packages/light.yaml |  6 +++---
 propbox.yaml        |  8 ++++++++
 4 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index acae40e..15b431c 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@ Home Grow(n) Monitoring
 * propbox: ESP32 Propagator Controller
     * BME280 Temperature and Humidity Sensor (3.3V, I2C)
     * Dallas DS18B20 Temperature Sensor
+    * YYAC-3S Triac (5V, PWM)
 * propbox-light: Nous A1T Smart Plug for Light
 * propbox-fan: Nous A1T Smart Plug for Fan
 * growbox: ESP32 Grow Tent Monitor
diff --git a/packages/fan.yaml b/packages/fan.yaml
index ecedf85..c1ac770 100644
--- a/packages/fan.yaml
+++ b/packages/fan.yaml
@@ -10,13 +10,17 @@ output:
 fan:
   - platform: speed
     output: fan_dimmer
-    name: "Extraction Fan"
+    id: fan_extraction
+    name: "Fan"
 
 prometheus:
   relabel:
-    propbox_fan:
+    fan_extraction:
       id: fan
       name: Fan
+    propbox_fan:
+      id: power_fan
+      name: "Power Fan"
 
 sensor:
   - platform: template
@@ -62,14 +66,14 @@ select:
   - platform: template
     id: temperature_min
     name: "Fan: Temperature Off"
-    options: ["15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"]
+    options: ["16", "17", "18", "19", "20", "21", "22", "23", "24", "25"]
     initial_option: "21"
     optimistic: true
     restore_value: true
   - platform: template
     id: humidity_max
     name: "Fan: Humidity On"
-    options: ["40", "45", "50", "55", "60", "65", "70", "75", "80", "85", "90"]
+    options: ["40", "45", "50", "55", "60", "65", "70", "75", "80", "85"]
     initial_option: "70"
     optimistic: true
     restore_value: true
@@ -83,15 +87,16 @@ select:
   - platform: template
     id: humidity_min
     name: "Fan: Humidity Off"
-    options: ["25", "30", "35", "40", "45", "50", "55", "60", "65", "70", "80"]
+    options: ["30", "35", "40", "45", "50", "55", "60", "65", "70", "80"]
     initial_option: "40"
     optimistic: true
     restore_value: true
 
+
 switch:
   - platform: template
     id: propbox_fan
-    name: "Status: Fan"
+    name: "Power: Fan"
     optimistic: true
     turn_on_action:
       - http_request.post: http://${hostname_fan}/switch/power/turn_on
@@ -110,37 +115,43 @@ script:
           // Normal On:
           // switch fan on when either temperature or humidity is above "max", unless humidity/temperature is below "min"
           if (
-            !id(propbox_fan).state &&
+            !id(fan_extraction).state &&
             (
               (id(bme280_temperature).state >= atoi(id(temperature_max).state.c_str()) && id(bme280_humidity).state    >= atoi(id(humidity_min).state.c_str())) ||
               (id(bme280_humidity).state    >= atoi(id(humidity_max).state.c_str())    && id(bme280_temperature).state >= atoi(id(temperature_min).state.c_str()))
             )
           ) {
-            id(propbox_fan).turn_on();
+            ESP_LOGI("fan", "Fan On");
+            auto call = id(fan_extraction).turn_on();
+            call.perform();
           }
 
           // Forced Off, ignoring Hysteresis:
           // switch fan off when either temperature or humidity are below "min", unless humidity/temperature is above "max"
           else if (
-            id(propbox_fan).state &&
+            id(fan_extraction).state &&
             (
               (id(bme280_temperature).state <= atoi(id(temperature_min).state.c_str()) && id(bme280_humidity).state    <= atoi(id(humidity_max).state.c_str())) ||
               (id(bme280_humidity).state    <= atoi(id(humidity_min).state.c_str())    && id(bme280_temperature).state <= atoi(id(temperature_max).state.c_str()))
             )
           ) {
-            id(propbox_fan).turn_off();
+            ESP_LOGI("fan", "Fan Off (forced)");
+            auto call = id(fan_extraction).turn_off();
+            call.perform();
           }
 
           // Normal Off, respecting Hysteresis:
           // switch fan off when both temperature and humidity are below "max minus hysteresis"
           else if (
-            id(propbox_fan).state &&
+            id(fan_extraction).state &&
             (
               id(bme280_temperature).state <= atoi(id(temperature_max).state.c_str()) - atoi(id(temperature_hysteresis).state.c_str()) && 
               id(bme280_humidity).state    <= atoi(id(humidity_max).state.c_str())    - atoi(id(humidity_hysteresis).state.c_str())
             )
           ) {
-            id(propbox_fan).turn_off();
+            ESP_LOGI("fan", "Fan Off");
+            auto call = id(fan_extraction).turn_off();
+            call.perform();
           }
   - id: fan_state
     then:
@@ -155,4 +166,3 @@ script:
           }
           id(propbox_fan).publish_state(state);
           http.end();
-  
\ No newline at end of file
diff --git a/packages/light.yaml b/packages/light.yaml
index 85cfb75..7f109e1 100644
--- a/packages/light.yaml
+++ b/packages/light.yaml
@@ -8,8 +8,8 @@ substitutions:
 prometheus:
   relabel:
     propbox_light:
-      id: light
-      name: Light
+      id: power_light
+      name: "Power Light"
 
 sensor:
   - platform: template
@@ -29,7 +29,7 @@ select:
 switch:
   - platform: template
     id: propbox_light
-    name: "Status: Light"
+    name: "Power: Light"
     optimistic: true
     turn_on_action:
       - http_request.post: http://${hostname_light}/switch/power/turn_on
diff --git a/propbox.yaml b/propbox.yaml
index 2db9a52..2d84483 100644
--- a/propbox.yaml
+++ b/propbox.yaml
@@ -9,6 +9,14 @@ substitutions:
   # Overrides
   bme280_script: "fan_control"
 
+esphome:
+  on_boot:
+    priority: -200
+    then:
+      - lambda: |-
+          id(fan_state).execute();
+          id(light_state).execute();
+
 packages:
   base:     !include packages/base.yaml
   esp32:    !include packages/esp32.yaml
-- 
GitLab