• Уважаемые посетители сайта 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 действует полный запрет.
 

Сергей_Ф

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

  • Windows:
    Windows не использует опцию 100 DHCP для автоматической установки часового пояса по умолчанию. Она полагается на геолокацию (или задание вручную). Настроить получение TZ через DHCP сложно, обычно это требует групповых политик (GPO) в доменной сети.
  • Android / iOS:
    Мобильные ОС также используют геолокацию для определения часового пояса и в большинстве случаев игнорируют опцию 100 DHCP.
Важные замечания:
  1. Поддержка: Не все роутеры (особенно домашние) и не все клиентские ОС поддерживают опцию 100. Это наиболее распространено в корпоративных сетях и среди устройств IoT.
  2. Конфликты: Если на клиенте уже задан часовой пояс вручную или через геолокацию, значение из DHCP может быть проигнорировано.
  3. Перезапрос аренды:После настройки опции на DHCP-сервере, клиентам нужно обновить аренду IP-адреса:
    • Windows: ipconfig /release и ipconfig /renew
    • Linux: sudo dhclient -r и sudo dhclient
Итог: Чтобы получить TZ от роутера, его сначала нужно настроить на стороне DHCP-сервера, добавив пользовательскую опцию с кодом 100 и значением в формате IANA (например, Europe/Moscow). Затем убедитесь, что ваше клиентское устройство настроено на запрос и обработку этой опции.

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

pvvx

Активный участник сообщества
То есть вы специально уходите от базиса?
Задайте вопрос правильно - какой метод обеспечивает наиболее правильный способ установки часового пояса.
И получите однозначный ответ:
1. Через DHCP - там три опции, а не только "100"
2. Вручную через консоль
3. По координатам GPS (и имея карту мира разбитую на секторы)
4. Через API для коммерческих устройств (умные розетки, счётчики).

Все остальные методы не дают даже 50% правильного определения часового пояса.

В итоге ваша программа должна придерживаться определенной последовательности в определении часового пояса.
И первый пункт - это DHCP - если на 3 опции ответа нет, то переходите на следующий метод. И так до анализа через ИИ работающего на устройстве, пройдя все возможные комбинации.
 

Сергей_Ф

Moderator
Команда форума
То есть вы специально уходите от базиса?
1. Я Вам привел довод, что этим базисом не пользуется НИКТО, поскольку он опционален и его реализация не гарантирована никем. А вы опять про базис.
2. Вручную никто не запрещает корректировать сколько угодно раз в любой момент.
3. Координат GPS нет в том оборудовании, на которое рассчитана библиотека.
4. API для коммерческих устройств недоступны широкому кругу

Все ограничения и дисклеймер по точности и применимости я описал. Не нравится - не пользуетесь. У Вас явно проблема с пониманием написанного, несмотря на Вашу высокую квалификацию в МК.

В итоге, если вы считаете что надо сделать по другому- делайте. Сделаете лучше и правильно, мир станет чуточку лучше.
 

pvvx

Активный участник сообщества
1. Я Вам привел довод, что этим базисом не пользуется НИКТО, поскольку он опционален и его реализация не гарантирована никем. А вы опять про базис.
Не вижу - вы говорите только о ESP и о опции "100". А есть "101" и "2", а так-же другие низкоуровневые протоколы. У Windows свои, у Linux - свои.
 

pvvx

Активный участник сообщества
Вы наверно никогда не создавали и не участвовали в построении систем автоматизации или других проектах с множеством устройств, раз полагаетесь на некие неизвестные сторонние сервисы, для которых внешний IP зависит не от вас .

Будет очень прикольно, когда получите от устройств данные с разными timestamp. А ваш предлагаемый метод эту путаницу создает даже для устройств в местной интрасети. :)

И решение по вашей методике вам уже выдано – в Макс есть боты. И этот скам работает всегда.
 

pvvx

Активный участник сообщества
1. Я Вам привел довод, что этим базисом не пользуется НИКТО, поскольку он опционален и его реализация не гарантирована никем. А вы опять про базис.
Это имеет значение только в дешман китай роутерах и ESP.
Все остальные нормальные роутеры, включая OpenWRT имеют эти функции.
 
Сверху Снизу