• Система автоматизации с открытым исходным кодом на базе 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, в моем часовом поясе, он включит это что то.
 
Сверху Снизу