Ви не увійшли.
Сторінки 1
Все почалось з того, що Св Миколай подарував мені електричного каміна Забавна річ, яка вміє прикольно світитись, імітувати полум"я і навіть нагріває повітря. І вирішив я, що було б забавно навчити цю штуку вмикатись замість будильника.
Всередину лізти категорично не хочеться. Але є інфрачервоний пульт з кнопкою ON/OFF, яку треба натиснути вранці. А на вихідних теж можна натиснути, але пізніше.
Короче, взяв ардуїну (по ходу зміни побажань до роботи поміняв на ESP12E), випаяв з якогось донора IR приймач, записав команди, які передає пульт. Знайшов в інтернеті лібу для NTP, лібу для підтримки cron, трохи підпиляв, щоб їх подружити. Думав запиляти ще й автоматичне розпізнавання зимового часу, але вирішив що воно лишнє - навряд чи влітку захочеться вмикати камін
Управління у будильника - через веб-морду, індикація - RGB-світлодіод, живлення - зарядка від старого телефону. Реквізити доступу до wifi забиваються в текст програми. Компілювалось в середовищі platformio.
https://github.com/Ihor-Chu/alarm-cron-clock-wifi-irc
Неактивний
було б забавно навчити цю штуку вмикатись замість будильника.
Короче, взяв ардуїну
А не простіше було взяти готовий недільний таймер-розетку? Чи тут головне чим би дитя не тішилось лише б з ардуїною гралось?
Думав запиляти ще й автоматичне розпізнавання зимового часу, але вирішив що воно лишнє
Якщо що то NTP вміє самостійно переходити на зимовий/літній час. Потрібно лише взяти "правильну" лібу та вказати в налаштуванях потрібний часовий пояс
>> А не простіше було взяти готовий недільний таймер-розетку?
Простіше Але як навчити той таймер нажимати кнопки на пульті чи на панелі?
>> чим би дитя не тішилось
Мені більше подобається термін хоббі-проект
>> Якщо що то NTP вміє самостійно переходити на зимовий/літній час.
Ніт. Просто повірте - ніт. NTP вертає UTC час. А zoneinfo - це досить складно, як для мікроконтроллера. Єдине що я знайшов - хоббі-проект якогось чувака з Нової Зеландії, і zoneinfo парсилось на його власному сервері, і бази були вже досить протухші (замість Kyiv - Kiev).. Цю частину конкурса - портування підтримки zoneinfo - я залишаю тому, кому це дійсно потрібно.
Неактивний
Не маю на меті критикувати, технічна творчість - це завжди добре. Респект вам. Але не можу втриматись і не вказати на можливі підводні камені.
Наскільки розумію, вмикання і вимикання здійснюється однією і тією ж командою? Тобто якщо прилад був уже увімкнений, то по настанню часу будильника, навпаки, вимкнеться? А якщо в момент вмикання ІЧ-приймач виявиться засліпленим, то так і залишиться вимкненим? Якщо є можливість додати зворотній звʼязок (який-небудь датчик поточного стану приладу), то ці недоліки можна обійти.
Думав запиляти ще й автоматичне розпізнавання зимового часу
Зимового часу не буває, є стандартний час і літній. Але ж перехід на літній наче скасували? Так що вже мабуть не актуально
Неактивний
Все правильно, якщо робити industrial style, треба якийсь зворотній зв"язок. Струм міряти, чи пищалку слухати. Але в рамках поставленої задачі це просто значно ускладнює реалізацію. А щодо автоматичної підтримки літнього часу - цей геморой не вартий тих свічок + 2 години в налаштуваннях.
uint8_t tz_offset;
Хе-хе. Тільки що звернув увагу, в західній півкулі нас чекає облом
Неактивний
А щодо автоматичної підтримки літнього часу - цей геморой не вартий тих свічок
Обчислення для поточного часу не дуже складні. Це ж не обчислення, наприклад, періоду між моментами локального часу в минулому, де потрібно враховувати всі зміни, що відбулись за цей період. Основна проблема - це підтримка zoneinfo в актуальному стані.
Як компроміс, можна конвертувати час в UTC засобами браузера при налаштуванні будильника, а сам контроллер працюватиме лише з UTC. Тільки тоді, якщо zoneinfo зміниться, то будильник "не знатиме" про ці зміни до наступного налаштування.
Але звісно, якщо функция не потрібна, то і заморочуватись не варто.
uint8_t tz_offset;
Хе-хе. Тільки що звернув увагу, в західній півкулі нас чекає облом
Саме тому для типових задач рекомендується використовувати існуючі перевірені рішення. Хоча бібліотек ардуіно це не стосується, бо там зустрічається і не таке
Неактивний
Саме тому для типових задач рекомендується використовувати існуючі перевірені рішення.
Хм, наприклад? Всі існуючі рішення кимсь перевірені.
Хоча бібліотек ардуіно це не стосується, бо там зустрічається і не таке hmm
Ну так то це мій особистий косяк А так від програміста і тестувальників залежить.
можна конвертувати час в UTC засобами браузера
Хм, цікава ідея.
Неактивний
Хм, наприклад? Всі існуючі рішення кимсь перевірені.
Я більше маю на увазі в загальному. Наприклад, якщо потрібна аутентифікація чи інші повʼязані з криптографією задачі, то вигадувати свій велосипед не те що не варто, а і небезпечно. Наполегливо рекомендується використовувати відкриті реалізації існуючих алгоритмів.
Щодо часових поясів, то самому не було потреби з ними працювати в ардуіноподібних фреймворках. Ось знаходиться Timezone, ezTime.
Знову ж, основна проблема здається не в конвертації локального часу в UTC і навпаки, а в підтримці zoneinfo в актуальному стані.
Неактивний
ezTime мацав, не сподобалось. Це якраз та сама подєлка, зав"язана на якийсь дивний сервер timezoned.rop.nl. І, враховуючи що там не в курсі, що Kiev вже давно Kyiv - бази там не свіжі.
Зав"язуватись на таке - нафіг-нафіг, навіть в домашньому проекті.
Неактивний
ezTime мацав, не сподобалось. Це якраз та сама подєлка, зав"язана на якийсь дивний сервер timezoned.rop.nl.
Так то сервер, який використовується автором для підтримання бази на цільових пристроях в актуальному стані. Наскільки бачу, його використання можна вимкнути, прибравши EZTIME_NETWORK_ENABLE. Або підняти свій аналогічний.
Якщо апдейтити прошивку з базою вручну, то для конвертації часу доступу до мережі не потрібно.
І, враховуючи що там не в курсі, що Kiev вже давно Kyiv - бази там не свіжі.
В сучасній базі теж є Kiev, бо зворотня сумісність. Kyiv та Kiev - два файла з однаковим вмістом.
Актуальна база розміщується на https://www.iana.org/time-zones, також доступна по FTP та rsync. Звідти її і потрібно брати.
Остання редакція dimich (2024-12-18 17:13:52)
Неактивний
його використання можна вимкнути, прибравши EZTIME_NETWORK_ENABLE. Або підняти свій аналогічний.
Якщо вимкнути - буде єдина доступна таймзона UTC. Це корисно хіба що для імітації сумусності. Підняти свій сервер - це якийсь аццький оверінжинірінг
Якщо апдейтити прошивку з базою вручну, то для конвертації часу доступу до мережі не потрібно.
Ну теоретично так, але робочого рішення я не знайшов. Робоче - це якщо можна взяти файл з iana.org і вкрутити в прошивку.
Неактивний
Якщо вимкнути - буде єдина доступна таймзона UTC. Це корисно хіба що для імітації сумусності. Підняти свій сервер - це якийсь аццький оверінжинірінг
Хм, дійсно, здається, там не можна просто захардкодити свою таймзону. Зате і автоапдейт, і NTP, і форматування, і якісь евенти. Хороший приклад, як НЕ треба проектувати бібліотеки
Робоче - це якщо можна взяти файл з iana.org і вкрутити в прошивку.
"Стандартна" Timezone для цього майже підходить.
У файлі континента з архіва IANA знайти діючий на даний момент запис для Zone (UNTIL пустий). Там STDOFF - зміщення відносно UTC, RULES - правила переходу. Знайти діючі на правила у записах Rules (TO==max) і на їх основі створити параметри для обʼєктів TimeChangeRule.
Або компілити таймзони за допомогою zic у бінарний формат, але прийдеться парсити бінарний формат у рантаймі.
Можна і автоматизувати цей процес при збірці прошивки, але як інтегрувати це конкретно в platformio, того вже не знаю.
Неактивний
як навчити той таймер нажимати кнопки на пульті чи на панелі?
А простим встромлянням в розетку той камін не вмикається? Якщо ні, то питання знімається.
Ніт. Просто повірте - ніт. NTP вертає UTC час. А zoneinfo - це досить складно, як для мікроконтроллера. Єдине що я знайшов - хоббі-проект якогось чувака з Нової Зеландії,
Я використовую для отримааня часу на esp32/8266 щось типу такого
#include <time.h>
char timeGet[10];
#define MYTZ "EET-2EEST,M3.5.0/3,M10.5.0/4"
void setTimezone(String timezone) {
Serial.printf(" Setting Timezone to %sn", timezone.c_str());
setenv("TZ", timezone.c_str(), 1);
tzset();
}
void setup() {
WiFi.begin(ssid, pass);
configTzTime(MYTZ, "time.google.com", "time.windows.com", "pool.ntp.org");
struct tm timeinfo;
if (getLocalTime(&timeinfo)) {
setTimezone(MYTZ);
}
}
void loop() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
strftime(timeGet, 10, "%T", &timeinfo);
int timeHour = timeinfo.tm_hour;
int timeMin = timeinfo.tm_min;
int timeSec = timeinfo.tm_sec;
int timeDay = timeinfo.tm_wday; //0-6
}
і все само переводить стрілки годинника
framework-arduinoespressif8266/tools/esptool/flasher_stub/ld/rom_32.ld:PROVIDE ( tzset = 0x40001a1c );
Прикольно
Походу якась магія від esp
"EET-2EEST,M3.5.0/3,M10.5.0/4"
З openwrt походу.
Буду знати, дякую.
Неактивний
Сторінки 1