Bartek_Buduje

Untitled

Nov 14th, 2025
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 14.92 KB | Source Code | 0 0
  1. #################### ESP8266 - CZUJNIK PARKOWANIA ######################
  2.  
  3. #################### KONFIGURACJA ######################
  4. esphome:
  5.   name: ws2811_garage_led
  6.   friendly_name: Czujnik parkowania
  7.   comment: ESP8266
  8.  
  9. esp8266:
  10.   board: d1_mini
  11.  
  12. time:
  13.   - platform: homeassistant
  14.     id: homeassistant_time
  15.  
  16. #################### standardowe wifi
  17.  
  18. wifi:
  19.   ssid: !secret wifi_ssid
  20.   password: !secret wifi_password
  21.   reboot_timeout: 5min
  22.  
  23. #################### Serwer WWW
  24.  
  25. web_server:
  26.   port: 80
  27.  
  28. #################### Logi  
  29.  
  30. debug:
  31. logger:
  32. #################### OTA/API
  33.  
  34. ota:
  35.   - platform: esphome
  36.     password: !secret ota
  37.  
  38. api:
  39.   encryption:
  40.     key: !secret api
  41.   services:
  42.     - service: update_leds
  43.       variables:
  44.         distance: float
  45.         garage_status: string
  46.       then:
  47.         - lambda: |-
  48.             ESP_LOGD("led_effect", "Aktualna odległość: %f", id(distance_sensor_value));
  49.             id(garage_status_value) = garage_status;
  50.  
  51. #################### ELEMENTY ZEWNETRZNE ######################
  52.  
  53. #################### Sterowanie LED
  54.  
  55. light:
  56.   - platform: neopixelbus
  57.     id: ws2811_strip
  58.     pin: GPIO3
  59.     num_leds: 50
  60.     type: GRB
  61.     variant: ws2811
  62.     default_transition_length: 0.5s
  63.     name: "WS2811 LED Strip"
  64.     effects:
  65.       - addressable_lambda:
  66.                 name: "Reakcja na bramę (otwieranie i zamykanie)"
  67.                 update_interval: 500ms
  68.                 lambda: |-
  69.                   std::string garage_status = id(garage_status_value);
  70.  
  71.                   // Sprawdzenie statusu bramy (otwieranie/zamykanie)
  72.                   if (garage_status == "otwieranie" || garage_status == "zamykanie") {
  73.                     // Skrajne LED-y na niebiesko
  74.                     it[0] = Color(0, 0, 255);
  75.                     it[1] = Color(0, 0, 255);
  76.                     it[it.size() - 2] = Color(0, 0, 255);
  77.                     it[it.size() - 1] = Color(0, 0, 255);
  78.  
  79.                     // Mruganie skrajnych LED-ów
  80.                     for (int i = 0; i < it.size(); i++) {
  81.                       if (i == 0 || i == 1 || i == it.size() - 2 || i == it.size() - 1) {
  82.                         if (millis() % 1000 < 500) {
  83.                           it[i] = Color(0, 0, 255);  // Niebieskie
  84.                         } else {
  85.                           it[i] = Color::BLACK;
  86.                         }
  87.                       } else {
  88.                         // Normalny efekt oparty na odległości
  89.                         float distance = id(distance_sensor_value);
  90.                         float distance_threshold = id(distance_threshold_value);
  91.  
  92.                         // Jeśli odległość jest nieznana, ustaw LED-y na zielono
  93.                         if (std::isnan(distance)) {
  94.                           it[i] = Color(0, 255, 0);  // Zielony pasek LED
  95.                         } else {
  96.                           // Nowy wzór na liczbę czerwonych LED-ów, który wyklucza skrajne LED-y
  97.                           int leds_to_red = (int)((id(zero_point) + id(distance_threshold_value) - distance) / (id(distance_threshold_value)) * (it.size() - 4));  
  98.                           leds_to_red = leds_to_red > (it.size() - 4) ? (it.size() - 4) : leds_to_red;
  99.  
  100.  
  101.                           // Dostosowanie zakresu czerwonych diod, aby skrajne LED-y nadal działały jak wcześniej
  102.                           if (i < leds_to_red / 2 + 2 || i >= it.size() - leds_to_red / 2 - 2) {
  103.                             it[i] = Color(255, 0, 0);  // Czerwone diody przy krawędziach
  104.                           } else {
  105.                             it[i] = Color(0, 255, 0);  // Zielone diody w środku
  106.                           }
  107.                         }
  108.                       }
  109.                     }
  110.                     return;
  111.                   }
  112. #                  // Jeśli brama nie jest w stanie otwierania, zamykania lub otwarta, wyłącz LED-y
  113. #                  for (int i = 0; i < it.size(); i++) {
  114. #                    it[i] = Color::BLACK;  // Wyłącz LED-y
  115. #                  }
  116.       - addressable_lambda:
  117.                 name: "Reakcja na bramę i odległość"
  118.                 update_interval: 200ms
  119.                 lambda: |-
  120.                   static bool blink_state = false;
  121.                   static unsigned long last_blink_time = 0;
  122.                   const unsigned long blink_interval = 100;  // Czas migania (w ms)
  123.  
  124.                   float distance = id(distance_sensor_value);
  125.                   std::string garage_status = id(garage_status_value);
  126.  
  127.                   // Zmienna określająca próg odległości, od której zaczynają się zmiany
  128.                   float distance_threshold = id(distance_threshold_value);
  129.  
  130.                   // Aktualizacja stanu migania
  131.                   unsigned long current_time = millis();
  132.                   if (current_time - last_blink_time >= blink_interval) {
  133.                     blink_state = !blink_state;
  134.                     last_blink_time = current_time;
  135.                   }
  136.  
  137.                   // Normalny efekt oparty na odległości
  138.                   if (std::isnan(distance)) {
  139.                     // Jeśli wartość odległości jest nieznana, ustaw LED-y na zielono
  140.                     for (int i = 0; i < it.size(); i++) {
  141.                       it[i] = Color(0, 255, 0);  // Zielony pasek LED
  142.                     }
  143.                   } else if (distance <= (id(zero_point) - 0.05)) {
  144.                     // Jeśli odległość jest mniejsza lub równa punktowi zero minus 5 cm, zapalić czerwony pasek
  145.                     for (int i = 0; i < it.size(); i++) {
  146.                       it[i] = blink_state ? Color(255, 0, 0) : Color(0, 0, 0);  // Mruganie na czerwono
  147.                     }
  148.                   } else if (distance <= id(zero_point) + id(distance_threshold_value)) {
  149.                     // Jeśli odległość jest mniejsza niż threshold (odległość od zero_point + distance_threshold_value)
  150.                     int leds_to_red = (int)((id(zero_point) + id(distance_threshold_value) - distance) / (id(distance_threshold_value)) * 50);
  151.                     leds_to_red = leds_to_red > 50 ? 50 : leds_to_red;
  152.                     for (int i = 0; i < it.size(); i++) {
  153.                       if (i < leds_to_red / 2 || i >= it.size() - leds_to_red / 2) {
  154.                         it[i] = Color(255, 0, 0);  // Czerwone diody przy krawędziach
  155.                       } else {
  156.                         it[i] = Color(0, 255, 0);  // Zielone diody w środku
  157.                       }
  158.                     }
  159.                   } else {
  160.                     // Jeśli odległość jest większa niż threshold, wszystkie diody na zielono
  161.                     for (int i = 0; i < it.size(); i++) {
  162.                       it[i] = Color(0, 255, 0);  // Wszystkie diody zielone
  163.                     }
  164.                   }
  165.  
  166.  
  167. #################### Funkcje globalne
  168.  
  169.  
  170. globals:
  171.   - id: distance_sensor_value
  172.     type: float
  173.     initial_value: "1.25"  # Początkowa odległość w metrach
  174.   - id: garage_status_value
  175.     type: std::string
  176.     initial_value: '"zamknięta"'
  177.   - id: led_active
  178.     type: bool
  179.     initial_value: "false"
  180.   - id: garage_status_open_time
  181.     type: long
  182.     initial_value: "0"  
  183.   - id: garage_status_change_time
  184.     type: long
  185.     initial_value: "0"
  186.   - id: zero_point
  187.     type: float
  188.     initial_value: "0.40"  # Punkt 0 w metrach, np. 2m
  189.   - id: distance_threshold_value
  190.     type: float
  191.     initial_value: "1.6"  # Próg, przy którym LED-y zaczynają zmieniać kolor
  192.   - id: elapsed_time_open
  193.     type: float
  194. #    initial_value: "1.6"  # Próg, przy którym LED-y zaczynają zmieniać kolor
  195.   - id: garage_status_is_open
  196.     type: bool
  197.     initial_value: "false"  # Początkowy stan: brama nieotwarta
  198.   - id: transistor_active
  199.     type: bool
  200.     restore_value: no
  201.     initial_value: "false"
  202.  
  203. #################### Obsługa zdrazeń z HA
  204.  
  205. text_sensor:
  206.   - platform: homeassistant
  207.     id: garage_status_sensor
  208.     entity_id: sensor.3_gar_stan_bramy
  209.     on_value:
  210.       then:
  211.         - lambda: |-
  212.             std::string new_status = x.c_str();
  213.             id(garage_status_value) = new_status;
  214.             ESP_LOGD("garage_status", "Nowy status bramy: %s", new_status.c_str());
  215.  
  216.             if (new_status == "otwieranie") {
  217.               id(led_active) = true;
  218.               id(garage_status_change_time) = millis();
  219.  
  220.               if (!id(transistor_active)) {
  221.                 id(transistor_pin).turn_on();
  222.                 id(transistor_active) = true;
  223.                 delay(150);
  224.               }
  225.  
  226.               auto call = id(ws2811_strip).make_call();
  227.               call.set_state(true);
  228.               call.set_brightness(1.0);
  229.               call.set_effect("Reakcja na bramę (otwieranie i zamykanie)");
  230.               call.perform();
  231.             }
  232.  
  233.             if (new_status == "otwarta") {
  234.               id(garage_status_open_time) = millis();
  235.               ESP_LOGD("garage_status", "Brama otwarta, czas: %lu", id(garage_status_open_time));
  236.  
  237.               if (!id(transistor_active)) {
  238.                 id(transistor_pin).turn_on();
  239.                 id(transistor_active) = true;
  240.                 delay(150);
  241.               }
  242.  
  243.               auto call = id(ws2811_strip).make_call();
  244.               call.set_state(true);
  245.               call.set_brightness(1.0);
  246.               call.set_effect("Reakcja na bramę i odległość");
  247.               call.perform();
  248.               id(garage_status_is_open) = true;
  249.             }
  250.  
  251.             if (new_status == "zamykanie") {
  252.               id(led_active) = true;
  253.               id(garage_status_change_time) = millis();
  254.  
  255.               if (!id(transistor_active)) {
  256.                 id(transistor_pin).turn_on();
  257.                 id(transistor_active) = true;
  258.                 delay(150);
  259.               }
  260.  
  261.               auto call = id(ws2811_strip).make_call();
  262.               call.set_state(true);
  263.               call.set_brightness(1.0);
  264.               call.set_effect("Reakcja na bramę (otwieranie i zamykanie)");
  265.               call.perform();
  266.             }
  267.  
  268.         - if:
  269.             condition:
  270.               lambda: 'return id(garage_status_value) == "zamknięta";'
  271.             then:
  272.               - script.execute: handle_gate_closed
  273.      
  274. #################### Obsługa wyłączeń timerów
  275.  
  276. interval:
  277.   - interval: 1s
  278.     then:
  279.       - lambda: |-
  280.           if (id(garage_status_is_open)) {
  281.             unsigned long elapsed_time_open = millis() - id(garage_status_open_time);
  282.             ESP_LOGD("garage_status", "Czas otwarcia bramy: %lu ms", elapsed_time_open);
  283.  
  284.             if (elapsed_time_open >= 300000) {  // Po 5 minutach
  285.               ESP_LOGD("garage_status", "Brama otwarta za długo, wyłączam LED-y.");
  286.               auto call = id(ws2811_strip).make_call();
  287.               call.set_state(false);  // Wyłącz LED-y
  288.               call.perform();
  289.               id(garage_status_is_open) = false;  // Zresetuj flagę otwarcia
  290.  
  291.               // Wyłączenie czujnika odległości, gdy brama jest otwarta za długo
  292.               if (id(transistor_active)) {  // Sprawdzamy, czy czujnik był aktywowany
  293.                 ESP_LOGD("garage_status", "Czujnik odległości wyłączony.");
  294.                 id(transistor_pin).turn_off();
  295.                 id(transistor_active) = false;  // Użycie id() zamiast przypisania bezpośredniego
  296.               }
  297.             }
  298.           }
  299.  
  300.           // Monitorowanie stanu otwierania/zamykania bramy
  301.           if ((id(garage_status_value) == "otwieranie" || id(garage_status_value) == "zamykanie") && id(led_active)) {
  302.             unsigned long elapsed_time_changing = millis() - id(garage_status_change_time);
  303.             ESP_LOGD("garage_status", "Czas otwierania/zamykania: %lu ms", elapsed_time_changing);
  304.  
  305.             if (elapsed_time_changing >= 180000) {  // Po 3 minutach (lub innym ustawionym czasie)
  306.               ESP_LOGD("garage_status", "Brama otwiera się/zamyka za długo, wyłączam LED-y.");
  307.               auto call = id(ws2811_strip).make_call();
  308.               call.set_state(false);  // Wyłącz LED-y
  309.               call.perform();
  310.               id(garage_status_is_open) = false;  // Zresetuj flagę otwarcia
  311.               id(led_active) = false;  // Wyłącz aktywność LED-ów
  312.  
  313.  
  314.               // Wyłączenie czujnika odległości, gdy brama jest otwarta za długo
  315.               if (id(transistor_active)) {  // Sprawdzamy, czy czujnik był aktywowany
  316.                 ESP_LOGD("garage_status", "Czujnik odległości wyłączony.");
  317.                 id(transistor_pin).turn_off();
  318.                 id(transistor_active) = false;  // Użycie id() zamiast przypisania bezpośredniego
  319.               }
  320.             }
  321.           }
  322.  
  323. #################### Czujnik ultradzwiękowy
  324.  
  325. sensor:
  326.   - platform: ultrasonic
  327.     id: distance_sensor
  328.     trigger_pin: D2
  329.     echo_pin: D3
  330.     timeout: 4m
  331.     update_interval: 250ms
  332.     name: "Czujnik odległości"
  333.     filters:
  334.      # Lambda filtrująca błędne odczyty (NaN i skrajne różnice)
  335.       - lambda: |-
  336.           static float last_valid_value = 0.0;  // Przechowuje ostatnią poprawną wartość
  337.           static float buffer[5] = {0};  // Bufor do przechowywania ostatnich odczytów
  338.           static int index = 0;  // Indeks bufora
  339.  
  340.           if (isnan(x)) {  // Sprawdzanie NaN
  341.               return last_valid_value;  // Zwraca ostatnią poprawną wartość
  342.           }
  343.  
  344.           // Aktualizacja bufora
  345.           buffer[index] = x;
  346.           index = (index + 1) % 5;  // Cykl bufora
  347.  
  348.           // Obliczanie średniej z bufora
  349.           float sum = 0.0;
  350.           for (int i = 0; i < 5; i++) {
  351.               sum += buffer[i];
  352.           }
  353.           float average = sum / 5;
  354.  
  355.           // Odrzucanie wartości mocno odbiegających od średniej
  356.           if (abs(x - average) > 0.3) {  // Próg różnicy 0.3 m (30 cm)
  357.               return last_valid_value;
  358.           }
  359.  
  360.           last_valid_value = x;  // Aktualizacja poprawnej wartości
  361.           return x;
  362.  
  363.       # Wygładzanie odczytów za pomocą filtru wykładniczego
  364.       - exponential_moving_average:
  365.           alpha: 0.3
  366.           send_every: 1
  367.  
  368.     # Działania do wykonania przy zmianie wartości
  369.     on_value:
  370.       then:
  371.         - lambda: |-
  372.             id(distance_sensor_value) = x;  // Aktualizacja wartości odległości
  373.  
  374. script:
  375.   - id: handle_gate_closed
  376.     mode: restart
  377.     then:
  378.       - logger.log: "Brama zamknięta, czekam 10 sekund..."
  379.       - delay: 10s
  380.  
  381.       - logger.log: "Wyłączam LED-y"
  382.       - light.turn_off:
  383.           id: ws2811_strip
  384.           transition_length: 0.5s
  385.  
  386.       - delay: 1s
  387.  
  388.       - if:
  389.           condition:
  390.             lambda: 'return id(transistor_active);'
  391.           then:
  392.             - logger.log: "Wyłączam czujnik odległości"
  393.             - switch.turn_off: transistor_pin
  394.             - lambda: 'id(transistor_active) = false;'
  395.  
  396. switch:
  397.   - platform: gpio
  398.     pin: D1
  399.     name: "Przekaźnik"
  400.     id: transistor_pin
  401.  
Advertisement
Add Comment
Please, Sign In to add comment