ESPHome restore from flash

www
Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

ESPHome restore from flash

Příspěvek od rejze69 »

Ahoj lidi.

Mám ESP32 a už druhý den procházím net jak ukládat hodnoty do flash a obnovit je po restartu.
Nemáte někdo s tímto zkušenost? Jde o to aby si to např. pamatovalo poslední stav relé a dokázalo to uložit hodnoty pro tlakový spínač. Tedy min - max hodnotu, mezi kterými to bude spínat.
Zatím zkouším poslední stav spínače. udělal jsem si globální proměnnou, ale potom už narážím na to, že žádný z příkazů které existují není platný.
restore_from_flash: atd
Nepotřebuji tam ukládat žádné sensory. Pouze konfigurační parametry, které si nastavím v HA frontendu. Nechci to zároveň dávat natvrdo do kódu.
Díky
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
tiimsvk
Dárce - Donátor
Dárce - Donátor
Příspěvky: 835
Registrován: 06. květen 2021, 07:03
Dal poděkování: 75 poděkování
Dostal poděkování: 65 poděkování

Re: ESPHome restore from flash

Příspěvek od tiimsvk »

Podľa týchto nastavení si nepamätá posledné nastavenie polohy relé?
"restore_mode"
https://esphome.io/components/switch/index.html

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Díky,
To nakonec funguje, akorát mi to po vepsání restore_mode: jako vše předtím podtrhlo a v hintu bylo, že taková komponenta neexistuje. Až když za to napíšu volbu, tak to je dobrý. Jenže jak to má člověk vědět. :lol:
Tak teď co s těmi čísly? tam tahle volba není. Pouze u number template je restore_value, ale to ukládá do RTC a to nepřežije výpadek napájení.
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Ahoj,

Po x hodinách hledání jak ukládat a číst globální proměnné a testování těch střepů co o tom existují nastupuje taková frustrace, že to nechci týden vidět.
Bohužel dokud nerozjedu tohle, nemá smysl s tím pokračovat, protože to nebude autonomní a tedy k ničemu. Zlaté Arduino s EEPROM.
Kód nyní s různými zakomentovanými testy vypadá takto:

Kód: Vybrat vše

esphome:
  name: test
  friendly_name: test

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

#external_components:
#  - source: github://martgras/esphome@nvs-fix
#    components: [ esp32]

preferences:
  flash_write_interval: 1min

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

web_server:
  port: 80

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Test Fallback Hotspot"
    password: "xxxxxxxxxxxxx"

captive_portal:

globals:
  - id: button_relay_state
    type: bool
    restore_value: yes

sensor:
  - platform: pulse_counter
    pin: GPIO34
    name: "Pulse Counter"
    update_interval: 5s
    filters:
    - lambda: return (x / 300.0);
    unit_of_measurement: "L/min"

    total:
      unit_of_measurement: 'litrů'
      name: 'celkova spotreba vody'
      filters:
        - multiply: 0.03  # (1/30 pulses na 0.1L)


binary_sensor:
  - platform: gpio
    pin:
      number: 13
      mode: INPUT_PULLUP
      inverted: True
    name: "Testovací tlačítko"
    on_press:
      then:
        - switch.template.publish:
            id: button_relay
            state: !lambda |-
              if (id(button_relay).state) {
                return false;
              } else {
                return true;
              }
#              if (id(button_relay_state).state) {
#                return false;
#              } else {
#                return true;
#              }

switch:
  - platform: template
    name: "Relay"
    id: button_relay
    optimistic: true
    restore_state: on
    restore_mode: RESTORE_DEFAULT_OFF
    on_turn_on:
      then:
        - switch.turn_on:
            id: rele_1
    on_turn_off:
      then:
        - switch.turn_off:
            id: rele_1

  - platform: gpio
    pin: 33
    name: "Relé 1"
    id: rele_1

  - platform: restart
    name: "Test Restart" 
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
tiimsvk
Dárce - Donátor
Dárce - Donátor
Příspěvky: 835
Registrován: 06. květen 2021, 07:03
Dal poděkování: 75 poděkování
Dostal poděkování: 65 poděkování

Re: ESPHome restore from flash

Příspěvek od tiimsvk »

Ktoru hodnotu z kodu chces aby si to pametalo?

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Ahoj
Chtěl jsem pro začátek zkusit jenom bool proměnnou a použít ji do toho spínače a nahradit tu funkci co jsi mi poradil prve. Vlastně tedy místo toho restore_mode tu hodnotu uložit do proměnné.
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
tiimsvk
Dárce - Donátor
Dárce - Donátor
Příspěvky: 835
Registrován: 06. květen 2021, 07:03
Dal poděkování: 75 poděkování
Dostal poděkování: 65 poděkování

Re: ESPHome restore from flash

Příspěvek od tiimsvk »

Nemalo by to byt v tomto zmysle?

Kód: Vybrat vše

on_press:
  then:
          - globals.set:
              id: button_relay_state
              value: !lambda 'return id(button_relay).state;
         
Nemam to odskusane lebo to pisem na mobile

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Dík.
To vypadá pravděpodobně. :like:
Zítra to zkusím.
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Zdravím,
tak jsem to zkusil, ale nejspíš ten přepínač není vhodný.
Zkusím to tedy podle tohohle

Kód: Vybrat vše

esphome:
  name: laadpaal-dev
  on_boot:
    priority: 700   # I have tried various values between -10 and 800
    then:
      - pulse_counter.set_total_pulses:
          id: dev_counter
          value: !lambda return id(dev_total_pulses);

globals:
  - id: dev_total_pulses
    type: int
    restore_value: yes
esp32:
  board: nodemcu-32s
  framework:
    type: arduino

preferences:
  flash_write_interval: 60s
sensor:
  - platform: pulse_counter
    use_pcnt: True
    pin: 5
    icon: "mdi:flash"
    name: "DEV Laadpaal Raw counter"
    id: dev_counter
    total:
      id: dev_counter_total
      name: 'DEV Laadpaal Raw Total'
    on_value:
      then:
        - globals.set:
            id: dev_total_pulses
            value: !lambda 'return x;'
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 338
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 22 poděkování
Dostal poděkování: 16 poděkování

Re: ESPHome restore from flash

Příspěvek od rejze69 »

Ahoj,

Tak jsem to zkusil podle všeho co jsem našel. Nyní to vypadá takto:

Kód: Vybrat vše

esphome:
  name: test
  friendly_name: test
  on_boot:
    priority: 600 
    then:
      - pulse_counter.set_total_pulses:
          id: dev_counter
          value: !lambda return id(dev_total_pulses);

globals:
  - id: dev_total_pulses
    type: int
    restore_value: true

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:


preferences:
  flash_write_interval: 1min

# Enable Home Assistant API
api:
  encryption:
    key: "XXXXXXXXXXXXXXXXXXXXX"

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxx"

web_server:
  port: 80

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Test Fallback Hotspot"
    password: "yyyyyyyyyyyyyyy"

captive_portal:


sensor:
  - platform: pulse_counter
    pin: GPIO34
    name: "Pulse Counter"
    id: dev_counter
    update_interval: 5s
    filters:
    - lambda: return (x / 300.0);
    unit_of_measurement: "L/min"

    on_value:
      then:
        - globals.set:
            id: dev_total_pulses
            value: !lambda 'return int(x);'

    total:
      unit_of_measurement: 'litrů'
      name: 'celkova spotreba vody'
      filters:
        - multiply: 0.003  # (1/30 pulses na 0.1L)
V logu vidím, že to provádí zápis do flash podle nastavení jednou za minutu, ale po rebootu je to stejně vynulované.
Navíc tam je náhodně pár pulsů. Třeba 3 nebo 5. Nevím jak zjistit, jestli to blbosti ukládá, nebo načte on_boot.
Zkoušel jsem měnit typ proměnné, a způsoby ukládání do global, ale to pak nešlo ani zkompilovat.
Co dál?
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Odpovědět

Zpět na „ESPHome“