• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Автоматическая настройка системных часов esp

pvvx

Активный участник сообщества

Но самое правильное и самое короткое определение timezone (добавляется всего пару байт и один if в огрызок клиента DHCP у ESP):
Включить в запрос у DHCP опцию 100 и получить параметры часового пояса в стиле POSIX.
Всю остальную лабуду с лазанием к каким-то внешним сервисам выкинуть

Для справки что и где:
 

pvvx

Активный участник сообщества
Обзор ИИ:
Необходимые параметры DHCP (RFC 4833)
Для запроса данных о часовом поясе ваш клиент должен включить следующие параметры в свой «Список запрашиваемых параметров» (параметр 55):
  • Вариант 100 (PCode): Возвращает строку часового пояса в стиле POSIX (например, EST5EDT4,M3.2.0/02:00,M11.1.0/02:00).
  • Вариант 101 (TCode): Возвращает имя базы данных IANA/Olson (например, America/New_York).
  • Вариант 2 (смещение по времени): указывает смещение относительно UTC в секундах (устаревший, но все еще используемый).
 

pvvx

Активный участник сообщества
предложено ИИ:
Python:
from scapy.all import *

# Construct a DHCP Discover packet with Timezone options in the Parameter Request List (55)
# Options: 100 (PCode), 101 (TCode)
dhcp_discover = (
    Ether(dst="ff:ff:ff:ff:ff:ff") /
    IP(src="0.0.0.0", dst="255.255.255.255") /
    UDP(sport=68, dport=67) /
    BOOTP(chaddr=get_if_raw_hwaddr('eth0')[1]) /
    DHCP(options=[("message-type", "discover"),
                  ("param_req_list", [1, 3, 6, 15, 100, 101]),
                  "end"])
)

# Send and receive the response (DHCP Offer)
ans, unans = srp(dhcp_discover, timeout=5)

for sent, received in ans:
    # Parse the options from the DHCP Offer
    dhcp_options = received[DHCP].options
    for opt in dhcp_options:
        if opt[0] == 100:
            print(f"POSIX Timezone (Option 100): {opt[1].decode()}")
        elif opt[0] == 101:
            print(f"TZ Name (Option 101): {opt[1].decode()}")
Вот только со scapy замучаетесь давать права...
 

pvvx

Активный участник сообщества
Какие ещё могут быть нюансы с DHCP:

На OpenWRT это настраивается в меню LUCI или конфигах.

На роутерах в меню, типа так:
1766687709451.png

На GSM роутерах – они сами знают локальное время от станций.

На BLE термометрах с альтернативной прошивкой - в программе эксплорера конфигурации или ESPHome.

На Zigbee - само, устанавливает координатор.

На ESP – никак.
 

pvvx

Активный участник сообщества
Так ещё надо, что бы у пользователя был правильный пояс установлен на роутере. Я вот не уверен, что у многих это так
Ваш предполагаемый пользователь должен уметь собирать прошивку, но не может выставить пояс на стационарном роутере (на других он ставится автоматически)?
Стационарным - это предполагается что имеет внешнее проводное или оптическое соединение.

Когда вы устанавливаете ОС на комп, то там тоже надо установить часовой пояс, тот который нужен вам, а железке.
 

Сергей_Ф

Moderator
Команда форума
Ваш предполагаемый пользователь должен уметь собирать прошивку, но не может выставить пояс на стационарном роутере (на других он ставится автоматически)?
Стационарным - это предполагается что имеет внешнее проводное или оптическое соединение.

Когда вы устанавливаете ОС на комп, то там тоже надо установить часовой пояс, тот который нужен вам, а железке.
если он собирает прошивку, то он может и вставить смещение ручками. Более того, он даже может вставить смещение в форму настройки. Задача освободить его от такого действия. Ну не получится правильно определить, тогда уж пусть ручками правит.

Единственный бесплатный российский сервис http://api.sypexgeo.net Вас вообще в Краснодар отправил :(. Так что мой выбор не самый плохой.
https://api.ipgeolocation.io вполне точно определил Ваше положение, несмотря на мобильного оператора. Но он требует наличие ключа доступа (бесплатного) к API, что делает затею сомнительной. Проще ручками вбить одно-два числа, чем заносить ключ (свой ключ встраивать в библиотеку по понятным причинам не стоит).

Есть ещё один не совсем корректный метод: поставить у себя на сервере прокси и добавлять ключ "налету" для запросов от своих прошивок с перенаправлением на https://api.ipgeolocation.io. Но только быстро лимит закончится если их будет много, и даже если паролить, то вскроют :(
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вот возьмем простейший пример –

За 5 лет существования альтернативной прошивки для BLE гигрометров нет ни одного вопроса по установке часового пояса для показа часов на их экране. Созданный для общества BTHome формат тоже имеет переменную timestamp. А так-же теперь и дополнительную функцию, но её ещё не освоили внешние ПО.

С Zigbee вообще вопросов про это нет. А там существует множество устройств в которых настраивается работа по расписанию, которое обслуживает само устройство (термостат или кондиционер к примеру )

И у данных систем нет никаких установок часовых поясов.

Но у ESP c WiFi, существующему с 2012 года, по этому поводу тысячи вопросов по всему инет.
А причина именно в том, что все повторяют вашу мантру.
 

pvvx

Активный участник сообщества
Для того чтобы сделать что-то правильно по началу необходимо определиться – зачем и в каких случаях требуется автоматическая установка часового пояса.
Для мобильного устройства это крайне нежелательно – едет дальнобой, а у него время на экране переключается… :)
Так что найдите пример где нужно это знать автоматически.
 

pvvx

Активный участник сообщества
Если рассматривать систему IoT – то там всегда желательно, чтобы все устройства работали с единым счетом времени привязанным к центральной системе.
А какой регион выставит пользователь в своей системе - это по его желанию. Лишать этого выбора нельзя.
 

pvvx

Активный участник сообщества
А написать какую-то фигню и втюхивать это в сознание пользователей как мантру – это дело ESP-шников. Ведь целей сделать что-то рабочее у них нет.
 

pvvx

Активный участник сообщества
Как сделать передачу часового пояса в местной интрасети давно продумали и нормировали в приведенном RFC.
Но у вас не обслуживается даже базис.
 

pvvx

Активный участник сообщества
Цель часов в синхронизации с каким-то центром.
Для электронных устройств – для синхронизации со своим коммуникационным центром.
По этой аналгии ИИ нашел, кому автоматически требуется задавать местное время:
В Санкт-Петербурге продажа алкоголя в магазинах строго ограничена: с 22:00 до 11:00 действует полный запрет.
 
Сверху Снизу