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

Нужна помощь Не работает setTime()

Romale

New member
Здравствуйте!​
Прошу помощи.
Делаю проект, осталось только одно, сделать синхронизацию времени когда контроллер работает в режиме точки доступа. Синхронизация по NTP работает, а вот синхронизация с системным временем ПК нет. Чую что не замечаю "бревна".
Создана функция синхронизации времени с ПК, которая получает с WEB страницы системное время ПК, тоесть переменная pctime содержит время 1580496498 (проверено ) соответсвенно функция [inline]setTime(pctime)[/inline] или [inline]setTime(t) [/inline]в моем случае должна совершить установку времени ESP8266 согласно содержимому переменной pctime. Но этого не происходит.
Пробовал и тупо [inline]setTime(1580496498)[/inline], аналогичный результат.
Даже в void setup() ставил [inline]setTime(1580496498)[/inline], что по идее должно запустить ESP--шку с датой 31.01.2020, 21:48:18, но при прочтении там 1970 год. Что я делаю не так?
Код:
void SetTimePC () {
unsigned long pctime = HTTP.arg("timepc").toInt();
time_t t = pctime;
setTime(t);
HTTP.send(200,"text/plain",String(t));
}
 

Romale

New member
Проблема решена, всем спасибо!:)
Действительно был ошибочный путь поиска решения. Синхронизация времени с использованием библиотеки Timelib.h в моем случае не работоспособна в принципе. Попробовал запустить на ЕСПшке пример из библиотеки, все работает. Но используя ее на проекте, все функции управления неработоспособны, причину точную не выяснил. Но в процессе поиска проблемы в интернете, пересмотрел кучу примеров и мануалов, где описывается синхронизация системного времени с NTP серверами. Но в моем случае было необходимо синхронизировать время с временем ПК или другого устройства (телефон), так как ESPшка может и должна эксплуатироваться вне какой либо сети, и для выполнения задач по времени, синхронизация необходима.
Я не буду описывать подробно, просто приведу текст функции которая работает. Именно этого текста мне и не хватало чтобы решить проблему. Если что пишите, поясню, в меру своих возможностей.
Код:
void SetTimePC () {
  time_t rtc_time_t = HTTP.arg("timepc").toInt();
  int timecode = jsonReadtoInt(configSetup, "timezone");
  timezone tz = { timecode * 60.0, 0};
  timeval tv = { rtc_time_t, 0};
  settimeofday(&tv, &tz);
  //setenv("TZ", timecode, 1);
  //tzset();
  HTTP.send(200,"text/plain","OK");
}
 

Romale

New member
строки 7 и 8 закоментированы, так как я не разобрался точно с поясами и вообще стандартами. Строка 7 здесь описывается часовой пояс и режим перехода на летнее и зимние время, почитал мануалы, но мне так и не удалось корректно выставить все. По общим стандартам у меня время устанавливалось не точно.
Строка 8 это команда применить значения строки 7.
Часовой пояс я обрабатываю в строке 4 тупо значение пояса привожу в минуты. Все стало корректно.
в строке 7 переменная timcode должна содержать чтото типа "EST+5EDT,M3.2.0/2,M11.1.0/2"
 

dzanis

New member
Часовой пояс я обрабатываю в строке 4 тупо значение пояса привожу в минуты. Все стало корректно."
В браузере время местное,поэтому я вообще не ставил timezone.Получается что оно нужно только при получении времени по NTP.У меня так в коде
Код:
timezone tz = { 0,0 };
timeval tv = { _time,0 };// _time это uint32_t  время в UTC присланное из браузера
sntp_stop();
settimeofday(&tv, &tz);
 

Romale

New member
@dzanis
Согласен. Все зависит от источника времени. Я подумал сохранить возможность использования часового пояса в своем проекте, поэтому источником запроса системного времени ПК, является время в формате UNIX (вроде) то есть количество секунд от 1970 года. Хотя и ваше решение не меняет, скорее упрощает задачу.:)
 

dzanis

New member
@Romale я тоже timezone сохраняю в памяти esp, т.к без него полученное время через NTP будет неверное.А если ESP не подключено к интернету,то из браузера через ajax настраиваю.
 

pvvx

Активный участник сообщества
@Romale я тоже timezone сохраняю в памяти esp, т.к без него полученное время через NTP будет неверное.А если ESP не подключено к интернету,то из браузера через ajax настраиваю.
Зачем вам timezone, если всё передается в интернет или в Web? Чтобы запутаться где и какое?
На самой странице или у внешнего сервера, или на конечном устройстве отображения время и переводится в местное...
 

pvvx

Активный участник сообщества
Перевод в местное время задача сугубо конечного интерфейса с человеком. Это исключает все путаницы.
К примеру ваше устройство на самолете или на Луне...
 

Romale

New member
Перевод в местное время задача сугубо конечного интерфейса с человеком. Это исключает все путаницы.
К примеру ваше устройство на самолете или на Луне...[/QUOTE
Если я Вас правильно понял, то вы не правы. К примеру если я установил задачу конечному устройству выполнить некую команду, в назначенное время. Задачу я выставил исходя из моего текущего времени, то есть я с устройством должен находится так сказать "на одном часовом поясе". Иначе мне при постановке задачи, необходимо желаемое время переводить к времени без учета часового пояса. А так я поставил время включить что то в 14:30 и контроллер знает, что когда будет 14:30, в моем часовом поясе, он включит это что то.
 
Сверху Снизу