Horloge/Heure sur ESP32 non connecté

Bonjour,

Je cherche à faire des automatismes (pilotant des relais en fonction de l’heure de la journée, avec un esp32 non connecté. Il sera alimenté sur batterie + panneau solaire.

Existe t-il un moyen via esphome, d’initialiser l’heure de départ et qu’il soit ensuite autonome sur l’incrémentation du temps?

Je ferais les modifications (heure d’été/heure d’hiver en manuel).

Merci de votre aide.

ça doit être possible, soit manuellement, soit en NTP je suppose.

Par contre, si l’ESP en lui même contient bien une horloge RTC, la grande majorité des modules du commerce n’ont pas le quartz à 32kHz qui permet sont fonctionnement.
Il faudrait donc que tu l’ajoutes, ou que tu conçoives ta propre carte.
C’est certainement plus simple de passer par un RTC « externe » comme le classique DS1307

Sur amazon/aliexpress on trouve des modules tout fait qui embarquent tout ce qu’il faut pour que e genre d’horloge fonctionne sans se prendre la tête.

J’ai tenté avec le composant time, mais je ne vois pas où initialiser l’heure de départ.

Vis à vis de ta réponse, je ne comprends pas si l’ESP peut le gérer seul ou si je dois obligatoirement lui associer un composant complémentaire?

De ce que j’ai compris (j’ai jamais utilisé cette fonction) le composant « time » de ESPHome s’initialise automatiquement à la bonne heure quand l’ESP se connecte à HA. Il doit sans doute y avoir aussi la possibilité de le faire manuellement avec un lambda (mais bon, la documentation ESPhome est souvent minimaliste donc il faudra sans doute fouiller le web pour en savoir plus)

Pour ce qui est de gérer l’heure, en théorie l’ESP peut le faire seul, puisqu’il dispose en interne d’une horloge RTC. Cependant, pour qu’elle fonctionne, il faut qu’elle soit raccordée à son propre quartz « horloger » de 32768 Hz et il faut aussi s’assurer que l’alimentation de l’ESP ne soit jamais interrompue.
Sans ça, il y aura forcement une dérive plus ou moins importante (au mieux quelques secondes par jour, ce qui au bout de quelques mois peut vite faire une grosse différence par rapport à l’heure réelle)
Mais la RTC interne de l’ESP ne semble pas être gérée nativement par ESPHome (en tout cas j’ai rien vu d’explicitement précisé à ce sujet).
Le plus simple (aussi bien du point de vue du matériel que du logiciel) ça reste donc d’utiliser un composant RTC externe (le DS1307 étais un exemple parce que je l’ai déjà utilisé, mais il y en a d’autres) qui a du coup son propre quartz à la bonne fréquence et sa propre pile de sauvegarde et qui est calibré en usine pour être « juste »; et qui gère l’heure et la date tout seul comme un grand (faut juste l’initialiser une fois)

J’ai trouvé ça qui semble répondre à ma demande…maintenant faut que je déchiffre pour comprendre le code!

https://community.home-assistant.io/t/esphome-set-your-time/852415/24

A adapter à notre région pour ceux qui utiliserait

Europe/Paris CET-1CEST,M3.5.0,M10.5.0/3

J’ai testé …et maintenant mon ESP ne se connecte plus!

En Log, j’ai:

INFO ESPHome 2024.12.2 INFO Reading configuration /config/esphome/esp32-c1.yaml... WARNING GPIO2 is a strapping PIN and should only be used for I/O with care. Attaching external pullup/down resistors to strapping pins can cause unexpected failures. See  INFO Detected timezone 'Europe/Paris' INFO Starting log output from 192.168.1.73 using esphome API WARNING Can't connect to ESPHome API for esp32-c1 @ 192.168.1.73: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.1.73', port=6053))]: [Errno 111] Connect call failed ('192.168.1.73', 6053) (SocketAPIError) INFO Trying to connect to esp32-c1 @ 192.168.1.73 in the background

et en programme:

esphome:
  name: esp32-c1
  friendly_name: esp32 C1

#information pour l'horloge interne
  platformio_options:
    board_build.flash_mode: dio
  on_boot:
  - priority: 200
    then:
      - ds1307.read_time:
          id: rtc_time

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "Evwu8rUDOQQLcMbQOjCd5O5c7oawjMpmsEoH3OYiiK4="

ota:
  - platform: esphome
    password: "325062a1a5bd34ba415bc6deed67f6c9"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32-C1 Fallback Hotspot"
    password: "8lHMgykZHqpR"

#déclaration bus 1-wire pour sonde dallas
one_wire:
  - platform: gpio
    pin: GPIO16
    id: bus_ds18b20_1

#déclaration des capteurs
sensor:
  - platform: dallas_temp
    one_wire_id: bus_ds18b20_1
    name: "Température Dallas 1"
    id: temp_dallas_1
    resolution: 12
    update_interval: 30s

#création d'un bouton virtuel
switch:
  - platform: output
    output: relais
    name: "switch relais"
    id: switch_relais

#Définition des actionneurs
output:
  - id: relais
    platform: gpio
    pin: 13

#Définition de l'heure
substitutions:
  timezone: "Europe/paris"

psram:
  mode: octal
  speed: 80MHz

i2c:
  - id: bus_slow
    sda: GPIO01
    scl: GPIO02
    scan: True
    frequency: 100kHz  

number:
  - platform: template
    name: "Year Select"
    icon: "mdi:hours-24"
    id: year_select
    mode: BOX
    min_value: 2025
    max_value: 2040
    step: 1
    initial_value: 2025
    unit_of_measurement: "Year"
    update_interval: 0s
    optimistic: true   

  - platform: template
    name: "Month Select"
    icon: "mdi:hours-24"
    id: month_select
    mode: BOX
    min_value: 1
    max_value: 12
    step: 1
    initial_value: 1
    unit_of_measurement: "Month"
    update_interval: 0s
    optimistic: true   

  - platform: template
    name: "Day Select"
    icon: "mdi:hours-24"
    id: day_select
    mode: BOX
    min_value: 1
    max_value: 31
    step: 1
    initial_value: 1
    unit_of_measurement: "Day"
    update_interval: 0s
    optimistic: true   

  - platform: template
    name: "Hours Select"
    icon: "mdi:hours-24"
    id: hours_select
    mode: BOX
    min_value: 0
    max_value: 23
    step: 1
    initial_value: 0
    unit_of_measurement: "Hours"
    update_interval: 0s
    optimistic: true   


  - platform: template
    name: "Minutes Select"
    icon: "mdi:hours-24"
    id: minutes_select
    mode: BOX
    min_value: 0
    max_value: 59
    step: 1
    initial_value: 0
    unit_of_measurement: "Minutes"
    update_interval: 0s
    optimistic: true   

text_sensor:
  - platform: template
    name: "Current Time"
    id: current_time
    icon: mdi:clock-time-eight-outline
    lambda: |-
      auto time = id(rtc_time).now();
      return time.strftime("%Y-%m-%d / %H:%M");
    update_interval: 5s

button:
  - platform: template
    name: "Set Manual Time"
    id: set_time_button
    icon: mdi:clock-time-six-outline
    on_press:
      - script.execute: set_time

script:
  - id: set_time
    then:
      - lambda: |-
          setenv("TZ", "${timezone}", 1);  
          tzset();  

          struct tm time_info;
          time_info.tm_year = id(year_select).state - 1900;
          time_info.tm_mon = id(month_select).state - 1;
          time_info.tm_mday = id(day_select).state;
          time_info.tm_hour = id(hours_select).state;
          time_info.tm_min = id(minutes_select).state;
          time_info.tm_sec = 0;
          time_info.tm_isdst = -1;

          std::time_t t = mktime(&time_info);
          struct timeval tv = {t, 0};
          settimeofday(&tv, NULL);

          ESP_LOGD("main", "Time set to: %s", ctime(&t));
      - delay: 1s    
      - component.update: current_time    
      - ds1307.write_time: 
          id: rtc_time
      - logger.log: Time synchronized ds1307
      - delay: 1s
      - ds1307.read_time: 
          id: rtc_time
      - logger.log: Time read by ds1307

time:
  - platform: homeassistant        
    id: ha_time
    update_interval: 60s
    on_time_sync:
      then:
        - ds1307.write_time: 
            id: rtc_time
        - logger.log: Time synchronized ds1307
        - delay: 1s
        - ds1307.read_time: 
            id: rtc_time
        - logger.log: Time read by ds1307

  - platform: ds1307
    id: rtc_time
    timezone: "unknown"
    i2c_id: bus_slow
    address: 0x68
    update_interval: never

J’intérroge time via HA dont voici un bout de code:

time:
  - platform: homeassistant
    id: homeassistant_time
    timezone: "Europe/Paris"
    on_time:
      - seconds: 0
        minutes: 0
        hours: [0, 12]
        then:
          - script.execute: maj_temp_midi
      - seconds: 0
        minutes: /1
        then:
          - script.execute: gestion_pompe_filtration
          - logger.log: "⏰ Déclenchement on_time toutes les minutes"

Mais tu as un DS1307 de physiquement connecté à l’ESP ou tu te contente de tester un code trouvé au hasard ?

Merci ZIGFOU! Quand tu déconnectes l’ESP du réseau, il poursuit l’incrémentation de l’horloge?

Non je n’ai pas de DS1307. Je cherche à m’affranchir d’un module complémentaire, ne cherchant pas une précision d’horloge.

il se base uniquement sur home assistant et ne va pas sur internet.