Skip to content

Time Zone

Time Zones

Time Zones

substitutions:
...
  time_zone: AST4ADT,M3.2.0,M11.1.0

esphome:
...
  on_boot:
    - priority: -100
      then:
        - script.execute: set_timezone

time:
  - platform: sntp
    id: my_time
    timezone: "${time_zone}"
    update_interval: 8h
    on_time_sync:
      then:
        - ds1307.write_time:
  - platform: ds1307
    update_interval: never
    id: ehmtx_time

text:
  - platform: template
    name: "Time Zone POSIX"
    id: timezone_text
    optimistic: true
    min_length: 0
    max_length: 45
    mode: text
    restore_value: true
    initial_value: "${time_zone}"
    icon: mdi:airplane-time
    entity_category: config
    disabled_by_default: true
    on_value:
      then:
        - script.execute: set_timezone

script:
  - id: set_timezone
    mode: restart
    then:
      - wait_until:
          condition: wifi.connected
      - lambda: |-
          if (id(timezone_text).state != "" && id(timezone_text).state.c_str() != "${time_zone}") {
            id(my_time)->set_timezone(id(timezone_text).state.c_str());
            id(ehmtx_time)->set_timezone(id(timezone_text).state.c_str());
            // id(my_time)->call_setup();
            ESP_LOGI("main", "Alt Time Zone Set");
          } else {
            id(my_time)->set_timezone("${time_zone}");
            id(ehmtx_time)->set_timezone("${time_zone}");
            // id(my_time)->call_setup();
            ESP_LOGI("main", "Default Time Zone");
            id(timezone_text).state="${time_zone}";
          }

preferences:
  flash_write_interval: 15s # 0 does immediate write to memory with no mem buffer (not recommended) (only saves when persistent variables have changed)

Note

The first set_timezone changes the ESP's time, the second changes the RTC's time. The call_setup calls internal code to restart the time module (which will also trigger a sync).

Note

Thanks @trip5 https://github.com/andrewjswan/pixel-clock/issues/56