Przepisanie/przeniesienie kodu z LUA do ESPhome

@PITiMAT
wrzucam to co przetestowałem z podanym przez Ciebie input’em:

1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0;9.0;10.0;11.0;12.0;13.0;14.0;15.0;16.0;17.0;18.0;19.0;20.0;21.0;22.0

yaml:

substitutions:
  hostname: "uart"
  name: "UART"
  
esphome:
  name: $hostname
  platform: ESP8266
  board: d1_mini
  includes:
    - uart_read_line_sensor.h

wifi:
  #use_address: 192.168.4.40
  ssid: !secret wifi_IoT_Devices_SSID
  password: !secret wifi_IoT_Devices_password
  manual_ip:
    static_ip: 192.168.4.40
    gateway: !secret IoT_Devices_gateway
    subnet: !secret subnet
  
captive_portal:

logger:
  level: DEBUG
  baud_rate: 0

ota:
  password: !secret ota_password

api:

web_server:
   port: 80

uart:
  id: uart_bus
  baud_rate: 9600
  rx_pin: 3

sensor:
- platform: custom
  lambda: |-
    auto my_sensor = new UartReadLineSensor(id(uart_bus));
    App.register_component(my_sensor);
    return {
      my_sensor->sensor_0,
      my_sensor->sensor_1,
      my_sensor->sensor_2,
      my_sensor->sensor_3,
      my_sensor->sensor_4,
      my_sensor->sensor_5,
      my_sensor->sensor_6,
      my_sensor->sensor_7,
      my_sensor->sensor_8,
      my_sensor->sensor_9,
      my_sensor->sensor_10,
      my_sensor->sensor_11,
      my_sensor->sensor_12,
      my_sensor->sensor_13,
      my_sensor->sensor_14,
      my_sensor->sensor_15,
      my_sensor->sensor_16,
      my_sensor->sensor_17,
      my_sensor->sensor_18,
      my_sensor->sensor_19,
      my_sensor->sensor_20,
      my_sensor->sensor_21
      };

  sensors:
    - name: "My Custom0 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom1 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom2 Temperature Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom3 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom4 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom5 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom6 Temperature Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom7 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom8 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom9 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom10 Temperature Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom11 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom12 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom13 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom14 Temperature Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom15 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom16 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom17 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom18 Temperature Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom19 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2
    - name: "My Custom20 Sensor"
      unit_of_measurement: °C
      accuracy_decimals: 1
    - name: "My Custom21 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2    
  • pliczek uart_read_line_sensor.h:
#include "esphome.h"
#include <string>
#include <vector>
#include <sstream>

class UartReadLineSensor: public Component, public UARTDevice {
 public:
  UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}
  Sensor *sensor_0  = new Sensor();
  Sensor *sensor_1  = new Sensor();
  Sensor *sensor_2  = new Sensor();
  Sensor *sensor_3  = new Sensor();
  Sensor *sensor_4  = new Sensor();
  Sensor *sensor_5  = new Sensor();
  Sensor *sensor_6  = new Sensor();
  Sensor *sensor_7  = new Sensor();
  Sensor *sensor_8  = new Sensor();
  Sensor *sensor_9  = new Sensor();
  Sensor *sensor_10 = new Sensor();
  Sensor *sensor_11 = new Sensor();
  Sensor *sensor_12 = new Sensor();
  Sensor *sensor_13 = new Sensor();
  Sensor *sensor_14 = new Sensor();
  Sensor *sensor_15 = new Sensor();
  Sensor *sensor_16 = new Sensor();
  Sensor *sensor_17 = new Sensor();
  Sensor *sensor_18 = new Sensor();
  Sensor *sensor_19 = new Sensor();
  Sensor *sensor_20 = new Sensor();
  Sensor *sensor_21 = new Sensor();

  void setup() override {
    // nothing to do here
  }

  int readline(int readch, char *buffer, int len)
  {
    static int pos = 0;
    int npos;

    if (readch > 0) {
      switch (readch) {
        case '\n': // return on new line
          npos = pos;
          pos = 0; // Reset position index ready for next time
          return npos;
        default:
          if (pos < len-1) {
            buffer[pos++] = readch;
            buffer[pos] = 0;
          }
      }
    }
    // No end of line has been found, so return -1.
    return -1;
  }

  void loop() override {
    const int max_line_length = 120;
    static char buffer[max_line_length];
    while (available()) {
      if(readline(read(), buffer, max_line_length) > 0) {
        ESP_LOGD("loop", "Got new msg");
        
        std::stringstream ss(buffer);
        std::string segment;
        std::vector<std::string> seglist;
        
        while(std::getline(ss, segment, ';'))
        {
           seglist.push_back(segment);
        }
        ESP_LOGD("loop", "The numer of got sensors is: %d", seglist.size());
        ESP_LOGD("loop", "Publishing states");
        sensor_0->publish_state(std::stof(seglist[0]));
        sensor_1->publish_state(std::stof(seglist[1]));
        sensor_2->publish_state(std::stof(seglist[2]));
        sensor_3->publish_state(std::stof(seglist[3]));
        sensor_4->publish_state(std::stof(seglist[4]));
        sensor_5->publish_state(std::stof(seglist[5]));
        sensor_6->publish_state(std::stof(seglist[6]));
        sensor_7->publish_state(std::stof(seglist[7]));
        sensor_8->publish_state(std::stof(seglist[8]));
        sensor_9->publish_state(std::stof(seglist[9]));
        sensor_10->publish_state(std::stof(seglist[10]));
        sensor_11->publish_state(std::stof(seglist[11]));
        sensor_12->publish_state(std::stof(seglist[12]));
        sensor_13->publish_state(std::stof(seglist[13]));
        sensor_14->publish_state(std::stof(seglist[14]));
        sensor_15->publish_state(std::stof(seglist[15]));
        sensor_16->publish_state(std::stof(seglist[16]));
        sensor_17->publish_state(std::stof(seglist[17]));
        sensor_18->publish_state(std::stof(seglist[18]));
        sensor_19->publish_state(std::stof(seglist[19]));
        sensor_20->publish_state(std::stof(seglist[20]));
        sensor_21->publish_state(std::stof(seglist[21]));
      }
    }
  }
};

Efekt:

DeepSleep w ESP8266 jest rozwiązany tylko czasowo(nie GPIO), więc tego nie dodaję, ale jeśli wybierzesz docelowe rozwiązanie to mogę pomóc z yaml’em do tego.

2 polubienia

Mówiłem, że MISTRZU Dawid poradzi sobie i pomorze.
@Stravi
bravo-respect

O kurczaczki… Dziękuję za kody. Teraz nie mogę z tym posiedzieć na spokojnie bo mam drugie zmiany i w domu przeziębionego niemowlaka - po prostu masakra. Na dniach będę dalej próbował.
Ja chwilę się pobawiłem z “podsluchianiem” transmisji, ale coś mi to nie szło i pomyślałem, że trzeba wlasnie po prostu czytać UART - zacząłem z przykładem z esphome.io , ale to co tu pokazałeś to mi by zajęło sporo, oj sporo czasu. Dziękuję

Jak to nie GPIO? (tzn.w sensie takim jak jest w ESP32, to w ogóle nie ma odpowiednika)

Przecież to chyba jedyny tryb budzenia dostępny w ESPHome (i nie tylko) dla ESP8266 i po to łączymy wyjście WAKE = GPIO16 (wyjście sterowane z RTC) z wejściem resetu RST by budzić uśpione ESP82xx wewnętrznym zegarem. Idea działania jest taka - programujemy zegar na odliczanie timera, po zadanym czasie on wystawia stan niski na wyjściu WAKE, ten stan niski resetuje ESP czym go wybudza z uśpienia. Jeśli w takiej konfiguracji zabraknie połączenia WAKE → RST to po pojedynczym cyklu pracy (spowodowanym sprzętowym zresetowaniem układu za 1 razem np. przez odcięcie zasilania) układ już się nigdy nie obudzi, jeśli nie wciśniemy guziczka resetu lub mu nie podamy zewnętrznie tego sygnału.

Zakładam że AVR jest właśnie podpięty do RST.

Wprawdzie ta funkcja jest nieudokumentowana i jej nie testowałem, ale można teoretycznie spróbować takiego chwytu (można by pokopać po kodzie źródłowym czy to ma sens)

deep_sleep:
  run_duration: 30s
  sleep_duration: 0s

(dałem czas pracy 30 sek. ale zapewne ustanowienie połączenia WiFi i przesłanie jednego pakietu danych potrwa znacznie krócej, run_duration w sumie jest nieobowiązkowe - można przecież skorzystać z akcji deep_sleep.enter)
Jeśli tak się nie uda, to można pokombinować z timingami by budzenie wypadało w okienku kiedy ESP jest już wybudzone sygnałem z AVR (to może potencjalnie resetować ESP, nie sprawdziłem jak działa RTC choć moim zdaniem powinien być zerowany podczas wyzwolenia resetu z zewnątrz, w sumie to czas można ustawić znacznie dłuższy biorąc pod uwagę że RTC i tak powinien zostać zresetowany), ewentualnie budzić je nieco wcześniej - wtedy gdy spodziewamy się danych.

Tu małe wyjaśnienie ograniczeń w ESP82xx

też mi tak się wydaje że powinno to działać poprawnie, ale nie testowałem tego rozwiązania.
W przypadku tej stacji zastanowiłbym się jaki zysk wprowadza zastosowanie osobnej Atmegi? Uśrednienie danych z ciągłego pomiaru?

Co do zbierania pomiarów i ich obróbki to autor musi się wypowiedzieć, ale z mojego punktu widzenia to…

Przede wszystkim zysk energetyczny.

Próbowałem kiedyś zbudować podobną konstrukcję na bazie “gołego” ESP, ostatecznie odpuściłem temat - aby nazbierać jakiekolwiek dane z czujników jest potrzebny stosunkowo długi czas pracy, to za to zmuszało mnie do bardzo długiego czasu uśpienia, aby odrobić “przepaloną” energię podczas aktywnej pracy ESP (same czujniki pobierają akceptowalnie mało prądu). Ostatecznie uzyskałem mocno skokowe dane (zbierane 3x na h nie odzwierciedlające rzeczywistych szybszych zmian) co mi się nie podobało.

Może jestem mało ambitnym leniem :stuck_out_tongue: , ale mam też skończoną ilość wolnego czasu - ostatecznie u mnie się skończyło na kupnie gotowej chińskiej stacji (RF433 i to mimo, że się zarzekałem, że RF433 u mnie już nie wróci) i jedynie zaimpregnowania jej elektroniki, aby miała szansę popracować nieco dłużej niż do końca gwarancji :smiley:

1 polubienie

Hej, to znów ja :slight_smile:
Przesiedziałem dziś prawie całe popołudnie nad tym wszystkim i zaczęło to żyć ha ha - nawet nie wiecie jak się cieszę :slight_smile:
Miałem lekkie problemy ze znakiem końca linii i takie tam, ale się udało w końcu.

Wygrzebałem z szuflady swoją pierwszą płytkę, poskładałem wszytko, ale bez czujników i działam.

Mój ESP wygląda dokładnie tak:


Co minutę AVR na chwilę ustawia stan wysoki na pin “ESP_RESET” , ESP się restartuje i po 10 sekundach otrzymuje ramkę danych. Gdy zakończy przesyłać dane to przechodzi w stan deep sleep

Głównie chodziło o oszczędności akumulatora, a działa to tak:

  • temperatury - pomiar raz na minutę
  • wilgotność - pomiar raz na minutę
  • ciśnienie - pomiar raz na minutę
  • opady deszczu - ciągły pomiar, a odczyt przed wysyłką jest sumowany i po wysyłce zerowany
  • prędkość wiatru - ciągły pomiar, a przed wysyłka jest brana średnia z 60 pomiarów
  • podmuch wiatru - najwyższa wartość z 60 pomiarów
  • kierunek wiatru - przeważający odczyt z 60 pomiarów
  • sensor burzy - to coś nie bardzo chciało do końca współpracować, ale był ciągły pomiar
  • sensor lux - odczyt raz na minutę, ale to też miałem z tym problem
  • sensor UV - odczyt raz na minutę, ale czujnik po roku padł, ale zgadzało się z tym co np widget pogody w telefonie pokazywał
  • napięcia paneli - odczyt raz na minutę
  • napięcie akumulatora - odczyt raz na minutę
  • napięcie turbinki wiatrowej - to był chiński niewypał, ale można np trzeci panel dodać w to miejsce
  • pojemność akumulatora - przeliczne raz na minutę i wymyśliłem sobie coś takiego:
    pusty 0% = 2,5V
    pełny 100% = 4,2V
    Pojemność = 100 * (odczyt_ADC - pusty) / (pelny - pusty)
substitutions:
  device_name: Meteo
  host_name: meteo

esphome:
  name: $host_name
  platform: ESP8266
  board: d1_mini
  includes:
    - uart_read_line_sensor.h
  
logger:
  level: DEBUG
  baud_rate: 0 #disable logging over uart

# Enable Home Assistant API
api:
  encryption:
    key: "TN2wZAvjiH0tDZ/9H0aGUJNPaTtRqyyiLZhQyMpzisI="

ota:
  password: "479acbdc0ee6fb256c28452e62edc738"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  #manual_ip:
    #static_ip: 192.168.1.171
    #gateway: 192.168.1.1
    #subnet: 255.255.255.0
  
  #ap:
    #ssid: ${device_name}
    #password: !secret ap_password

#captive_portal:

#web_server:
#   port: 80

uart:
  id: uart_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 115200  

sensor:
# sygnał Wi-Fi
#- platform: wifi_signal
#  name: ${device_name} WiFi signal
#  device_class: signal_strength
#  entity_category: diagnostic

- platform: custom
  lambda: |-
    auto my_sensor = new UartReadLineSensor(id(uart_bus));
    App.register_component(my_sensor);
    return {
      my_sensor->sensor_0,
      my_sensor->sensor_1,
      my_sensor->sensor_2,
      my_sensor->sensor_3,
      my_sensor->sensor_4,
      my_sensor->sensor_5,
      my_sensor->sensor_6,
      my_sensor->sensor_7,
      my_sensor->sensor_8,
      my_sensor->sensor_9,
      my_sensor->sensor_10,
      my_sensor->sensor_11,
      my_sensor->sensor_12,
      my_sensor->sensor_13,
      my_sensor->sensor_14,
      my_sensor->sensor_15,
      my_sensor->sensor_16,
      my_sensor->sensor_17,
      my_sensor->sensor_18,
      my_sensor->sensor_19,
      my_sensor->sensor_20,
      my_sensor->sensor_21
      };           

# ramka danych z uC ATmega328
# rainfall;speed;wind;uv;lux;press;humid;temp;temp;temp;temp;temp;temp;temp;volt;volt;volt;volt;battery;gust;storm;lightining
 
  sensors:
    # rainfall - ilość opadu deszczu l/m2
    # - suma opadu z 1 minuty
    - name: ${device_name} Rainfall
      unit_of_measurement: l/m2
      accuracy_decimals: 1
      state_class: measurement
      #device_class:      
      icon: 'mdi:weather-rainy'
    # speed - prędkość wiatru km/h
    # -  
    - name: ${device_name} Wind Speed
      unit_of_measurement: km/h
      accuracy_decimals: 1 
      state_class: measurement
      device_class: wind_speed  
      #icon:      
    # wind - kierunek wiatru 
    # - przeważający odczyt z 60 pomiarów w ciągu minuty 
    - name: ${device_name} Wind Direction
      unit_of_measurement: °
      accuracy_decimals: 0
      state_class: measurement
      device_class: wind_speed  
      #icon:    
    # uv - INDEX UV  
    # - odczyt raz na minutę 
    - name: ${device_name} UV
      unit_of_measurement: INDEX
      accuracy_decimals: 0
      state_class: measurement
      device_class: ""
      icon: 'mdi:sun-wireless-outline'      
    # lux - poziom jasności lx  
    # BH1750 - odczyt raz na minutę
    - name: ${device_name} Illuminance
      unit_of_measurement: "lx"
      accuracy_decimals: 1
      state_class: measurement
      device_class: illuminance  
      #icon:    
    # press - ciśnienie atmosferyczne  
    # BME280 - odczyt raz na minutę
    - name: ${device_name} Pressure
      unit_of_measurement: "hPa"
      accuracy_decimals: 1
      state_class: measurement
      device_class: pressure
      #icon:      
    # humid - wilgotność powietrza
    # BME280 - odczyt raz na minutę 
    - name: ${device_name} Humidity
      unit_of_measurement: "%"
      accuracy_decimals: 1 
      state_class: measurement
      device_class: humidity  
      #icon:      
    # temp - temperatura 
    # BME280 - odczyt raz na minutę 
    - name: ${device_name} Temperature
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature   
      #icon:   
    # temp - temperatura do słońca 
    # DS18B20 - odczyt raz na minutę 
    - name: ${device_name} Temperature Sun
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature  
      #icon:    
    # temp - temperatura przy gruncie +15cm 
    # DS18B20 - odczyt raz na minutę 
    - name: ${device_name} Temperature +15cm
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature  
      #icon:    
    # temp - temperatura w gruncie -10cm 
    # DS18B20 - odczyt raz na minutę
    - name: ${device_name} Temperature -10cm
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature  
      #icon:    
    # temp - temperatura w gruncie -25cm 
    # DS18B20 - odczyt raz na minutę 
    - name: ${device_name} Temperature -25cm
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature   
      #icon:   
    # temp - temperatura w gruncie -50cm 
    # DS18B20 - odczyt raz na minutę  
    - name: ${device_name} Temperature -50cm
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature  
      #icon:    
    # temp - temperatura w gruncie -100cm
    # DS18B20 - odczyt raz na minutę
    - name: ${device_name} Temperature -100cm
      unit_of_measurement: °C
      accuracy_decimals: 2
      state_class: measurement
      device_class: temperature  
      #icon:    
    # volt - napięcie panelu fotowoltaicznego 1
    # ADC - odczyt raz na minutę 
    - name: ${device_name} Panel Solar 1
      unit_of_measurement: "V"
      accuracy_decimals: 2
      state_class: measurement
      device_class: "voltage"   
      #icon:   
    # volt - napięcie panelu fotowoltaicznego 2
    # ADC - odczyt raz na minutę 
    - name: ${device_name} Panel Solar 2
      unit_of_measurement: "V"
      accuracy_decimals: 2
      state_class: measurement
      device_class: voltage   
      #icon:   
    # volt - napięcie turbiny wiatrowej 
    # ADC - odczyt raz na minutę 
    - name: ${device_name} Wind Turbine
      unit_of_measurement: "V"
      accuracy_decimals: 2
      state_class: measurement
      device_class: voltage
      #icon:
    # volt - napięcie baterii 
    # ADC - odczyt raz na minutę
    - name: ${device_name} Battery
      unit_of_measurement: "V"
      accuracy_decimals: 2
      state_class: measurement
      device_class: voltage
      #icon:
    # battery - procent naładowania baterii 
    # obliczenia programowe  
    - name: ${device_name} Battery Capacity
      unit_of_measurement: "%"
      accuracy_decimals: 0
      state_class: measurement
      device_class: battery   
      #icon:
    # gust - podmuch wiatru m/s km/h 
    # obliczenia programowe - najwyższa odczytana wartość w ciągu minuty  
    - name: ${device_name} Wind Gust
      unit_of_measurement: "km/h"
      accuracy_decimals: 1
      state_class: measurement
      device_class: wind_speed  
      #icon:
    # storm - odległość od burzy 
    # AS3935 - odczyt gdy sensor jest aktywny
    - name: ${device_name} Storm
      unit_of_measurement: "km"
      accuracy_decimals: 0
      state_class: measurement
      #device_class:  
      icon: 'mdi:weather-lightning'  
    # lightining - ilość wyładowań atmosferycznych/błyskawic
    # AS3935 - odczyt gdy sensor jest aktywny
    - name: ${device_name} Lightining
      unit_of_measurement: ""
      accuracy_decimals: 0
      state_class: measurement
      #device_class:  
      icon: 'mdi:flash-outline'           


2

Zostało chyba najgorsze, usypianie ESP - muszę sprawdzić ile u mnie ESP pobiera prądu w stanie spoczynku, a ile w deep sleep.

Dziękuję przeogromnie za pomoc bo bez Was to chyba nigdy bym tego nie uruchomił z HA

4 polubienia

W końcu znalazła się dziś chwila na pomiary… jest gorzej niż myślałem, ogólnie jest źle… mój ESP pobiera sobie radośnie 68mA - podczas wysyłania danych nie jestem w stanie zweryfikować ile ponieważ mój miernik jest zbyt wolny.

Czy mógłbym prosić o pomoc z deep sleep? :wink:
Czytam i czytam i nie bardzo wiem jak to ugryźć, albo ja jakoś tego wszystkiego nie rozumiem.

Jeśli nie jest uśpiony to taki jest mniej więcej średni pobór prądu, w pikach może polecieć do 150mA (ale średniego poboru to jakoś kosmicznie nie zawyża).

Musisz poeksperymentować, ostatnio kombinowałem z usypianiem w ESPHome ze 2 lata temu.

Jeśli masz bezpośredni dostęp do ESP to będzie wygodniej go flashować po kabelku, zamiast chrzanić się z oficjalnie sugerowanymi metodami.

A co miałem wcześniej na myśli?

deep_sleep:
  run_duration: 10s
  sleep_duration: 0s

ta powyżej zakłada, że zerowy czas uśpienia uśpi “na zawsze” (ale tego nie sprawdzałem)

deep_sleep:
  run_duration: 10s
  sleep_duration: 60s
deep_sleep:
  run_duration: 10s
  sleep_duration: 333s

możesz pokombinować z minimalnym czasem pracy (zamiast tych 10s) ponieważ nie mam żadnego pomysłu na wyzwalacz, aby automatycznie uśpić ESP w najbliższym możliwym momencie, ale zajrzyj tam, może coś wymyślisz

Gdzieś jeszcze widziałem implementację switcha który nie pozwala wejść w deepsleep na potrzeby OTA, ale jak ma się dostęp do kabla to nie ma sensu teraz się nad tym rozczulać.

Mam swoją pierwszą płytkę, prototyp. Wszytko mam w domu na stole, jak już to zacznie poprawnie i ekonomicznie działać to podmienię tylko ESP w stacji na dworze :wink:

Właśnie sobie uświadomiłem swoje błędne założenie… ja cały czas szukałem coś na wzór swojego starego kodu czyli wysyłam dane i ESP się usypia. Teraz dopiero dotarło co napisałeś, ESP staruje i od razu ma z góry ustalony czas pracy po jakim przejdzie w tryb deep sleep
Dzięki za myśl :wink:

Fajnie by było mieć coś takiego bo czasami trzeba coś zmienić i dybać z drabiną na dwór to trochę słabo, ale z drugiej strony to moja stacja działa 6 lat bez zaglądania do niej.

To o czym wspominał @Stravi jest w dokumentacji (która jest źle napisana i teraz nie wiadomo co czego obecnie dotyczy, więc pozostaje eksperymentować, a nie mam aż tyle czasu na zabawę)

Generalnie jeśli wymyślisz co może być triggerem uśpienia to możesz spróbować wywoływać akcję uśpienia (ale obecna dokumentacja jest wyjątkowo mętna a nie pamiętam jak było kiedyś - to jest też na githubie, więc można kopać w historii, ale nie mam weny a przede wszystkim czasu na takie śledztwo, skoro i tak sugeruję rozwiązania spoza dokumentacji to szybciej będzie dojść eksperymentalnie).

Dzięki Panowie, zaraz zabieram się za lekturę.
Jutro spróbuję na “żywym organizmie” Dam znać co wyszło :wink:

Miałem dzisiaj chwilkę to przetestowałem kilka rozwiązań.
To wydaje się działać stabilnie i jedyny mankament jaki zauważyłem to to że po wybudzeniu z deep_sleep sensory są ustawiane na “unknown”. Więc jeśli Ci taki stan przejściowy(aż pomiary przyjdą z UART) nie przeszkadza to próbuj.

Do ostatniego sensora aktualizowanego w kodzie C++ dodaj implementację “on_value”:

    - name: "My Custom21 Pressure Sensor"
      unit_of_measurement: hPa
      accuracy_decimals: 2  
      on_value:
        - then:
          - if:
              condition:
                binary_sensor.is_off: prevent_deep_sleep
              then:
                - logger.log: "Going to sleep"
                - delay: 1000ms
                - deep_sleep.enter:
                    id: deep_sleep_1  

Dodaj do yaml:

deep_sleep:
  id: deep_sleep_1

binary_sensor:
  - platform: homeassistant
    id: prevent_deep_sleep
    entity_id: input_boolean.prevent_deep_sleep

W HA/AIS dodaj pomocnika typu “Przełącznik” o nazwie: “prevent_deep_sleep”

Opcjonalnie również do YAML możesz dodać taki button żeby z poziomu HA móc wywołać wyłączenie ESP:

button:
  - platform: shutdown
    name: "MySensors shutdown"
    id: shutdown_button
2 polubienia

Dzięki bardzo za poświęcony czas.

Myślę, że to nie jest jakiś problem.

Rano, po nocnej zmianie usiadłem do tego i ile ja się nakombinowałem, że ESP z trybem deep sleep nie chce posyłać danych, a bez usypiania jest OK. Dopiero po dłuższym kombinowaniu zajrzałem do kodu na AVR, a tam niespodzianka… AVR resetuje ESP, czeka 10s aby ESP się połączył z siecią i przesyła dane przez UART. Czyli mogłem sobie czekać jak ja ustawiłem, aby ESP pracował przez 10s i przeszedł w tryb deep sleep.
Teraz mam tak zrobione, że AVR “budzi” ESP, czeka 5s i posyła dane. ESP po przebudzeniu ma 10s na wszytko. Wszytko działa, ale będę musiał jeszcze pooglądać jak to wygląda z czasem łączenia, przesyłania danych do HA itd

Miałem wieczorem usiąść do tego ale już brakło czasu, ale co zauważyłem:

  • patrząc na natężenie prądu to w deep sleep mam 15uA, a gdy ESP łączy się, przesyła dane to mam 68-72mA
  • czas który ustawiam dla deep sleep to nie jest czas całkowitej pracy ESP, a czas od połączenia się z serwerem. Czyli tak jak teraz całą akcja dla ESP wynosi ~18s (czas ustawiony 10s) Czas mierzyłem stoperem patrząc na miernik i natężenie prądu
2 polubienia