#1 2024-12-17 13:39:50

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Електричний камін замість будильника

Все почалось з того, що Св Миколай подарував мені електричного каміна wink Забавна річ, яка вміє прикольно світитись, імітувати полум"я і навіть нагріває повітря. І вирішив я, що було б забавно навчити цю штуку вмикатись замість будильника.
Всередину лізти категорично не хочеться. Але є інфрачервоний пульт з кнопкою ON/OFF, яку треба натиснути вранці. А на вихідних теж можна натиснути, але пізніше.
Короче, взяв ардуїну (по ходу зміни побажань до роботи поміняв на ESP12E), випаяв з якогось донора IR приймач, записав команди, які передає пульт. Знайшов в інтернеті лібу для NTP, лібу для підтримки cron, трохи підпиляв, щоб їх подружити. Думав запиляти ще й автоматичне розпізнавання зимового часу, але вирішив що воно лишнє - навряд чи влітку захочеться вмикати камін wink
Управління у будильника - через веб-морду, індикація - RGB-світлодіод, живлення - зарядка від старого телефону. Реквізити доступу до wifi забиваються в текст програми. Компілювалось в середовищі platformio.

https://github.com/Ihor-Chu/alarm-cron-clock-wifi-irc

Неактивний

#2 2024-12-17 23:31:40

Васятко
Гість

Re: Електричний камін замість будильника

jokeR пише:

було б забавно навчити цю штуку вмикатись замість будильника.
Короче, взяв ардуїну

А не простіше було взяти готовий недільний таймер-розетку? Чи тут головне чим би дитя не тішилось лише б з ардуїною гралось? smile

jokeR пише:

Думав запиляти ще й автоматичне розпізнавання зимового часу, але вирішив що воно лишнє

Якщо що то NTP вміє самостійно переходити на зимовий/літній час. Потрібно лише взяти "правильну" лібу та вказати в налаштуванях потрібний часовий пояс

#3 2024-12-17 23:52:13

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

>> А не простіше було взяти готовий недільний таймер-розетку?

Простіше wink  Але як навчити той таймер нажимати кнопки на пульті чи на панелі?

>> чим би дитя не тішилось

Мені більше подобається термін хоббі-проект wink

>> Якщо що то NTP вміє самостійно переходити на зимовий/літній час.

Ніт. Просто повірте - ніт. NTP вертає UTC час. А zoneinfo - це досить складно, як для мікроконтроллера. Єдине що я знайшов - хоббі-проект якогось чувака з Нової Зеландії, і zoneinfo парсилось на його власному сервері, і бази були вже досить протухші (замість Kyiv - Kiev).. Цю частину конкурса - портування підтримки zoneinfo - я залишаю тому, кому це дійсно потрібно.

Неактивний

#4 2024-12-18 07:30:24

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 222

Re: Електричний камін замість будильника

Не маю на меті критикувати, технічна творчість - це завжди добре. Респект вам. Але не можу втриматись і не вказати на можливі підводні камені.

Наскільки розумію, вмикання і вимикання здійснюється однією і тією ж командою? Тобто якщо прилад був уже увімкнений, то по настанню часу будильника, навпаки, вимкнеться? А якщо в момент вмикання ІЧ-приймач виявиться засліпленим, то так і залишиться вимкненим? Якщо є можливість додати зворотній звʼязок (який-небудь датчик поточного стану приладу), то ці недоліки можна обійти.

jokeR пише:

Думав запиляти ще й автоматичне розпізнавання зимового часу

Зимового часу не буває, є стандартний час і літній. Але ж перехід на літній наче скасували? Так що вже мабуть не актуально  smile

Неактивний

#5 2024-12-18 09:44:46

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

Все правильно, якщо робити industrial style, треба якийсь зворотній зв"язок. Струм міряти, чи пищалку слухати. Але в рамках поставленої задачі це просто значно ускладнює реалізацію. А щодо автоматичної підтримки літнього часу - цей геморой не вартий тих свічок wink + 2 години в налаштуваннях.

uint8_t tz_offset;

Хе-хе. Тільки що звернув увагу, в західній півкулі нас чекає облом wink

Неактивний

#6 2024-12-18 13:44:37

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 222

Re: Електричний камін замість будильника

jokeR пише:

А щодо автоматичної підтримки літнього часу - цей геморой не вартий тих свічок wink

Обчислення для поточного часу не дуже складні. Це ж не обчислення, наприклад, періоду між моментами локального часу в минулому, де потрібно враховувати всі зміни, що відбулись за цей період. Основна проблема - це підтримка zoneinfo в актуальному стані.
Як компроміс, можна конвертувати час в UTC засобами браузера при налаштуванні будильника, а сам контроллер працюватиме лише з UTC. Тільки тоді, якщо zoneinfo зміниться, то будильник "не знатиме" про ці зміни до наступного налаштування.
Але звісно, якщо функция не потрібна, то і заморочуватись не варто.

jokeR пише:
uint8_t tz_offset;

Хе-хе. Тільки що звернув увагу, в західній півкулі нас чекає облом wink

Саме тому для типових задач рекомендується використовувати існуючі перевірені рішення. Хоча бібліотек ардуіно це не стосується, бо там зустрічається і не таке  hmm

Неактивний

#7 2024-12-18 15:14:03

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

Саме тому для типових задач рекомендується використовувати існуючі перевірені рішення.

Хм, наприклад? Всі існуючі рішення кимсь перевірені.


Хоча бібліотек ардуіно це не стосується, бо там зустрічається і не таке  hmm

Ну так то це мій особистий косяк wink А так від програміста і тестувальників залежить.

можна конвертувати час в UTC засобами браузера

Хм, цікава ідея.

Неактивний

#8 2024-12-18 15:56:41

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 222

Re: Електричний камін замість будильника

jokeR пише:

Хм, наприклад? Всі існуючі рішення кимсь перевірені.

Я більше маю на увазі в загальному. Наприклад, якщо потрібна аутентифікація чи інші повʼязані з криптографією задачі, то вигадувати свій велосипед не те що не варто, а і небезпечно. Наполегливо рекомендується використовувати відкриті реалізації існуючих алгоритмів.

Щодо часових поясів, то самому не було потреби з ними працювати в ардуіноподібних фреймворках. Ось знаходиться Timezone, ezTime.
Знову ж, основна проблема здається не в конвертації локального часу в UTC і навпаки, а в підтримці zoneinfo в актуальному стані.

Неактивний

#9 2024-12-18 16:34:02

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

ezTime мацав, не сподобалось. Це якраз та сама подєлка, зав"язана на якийсь дивний сервер timezoned.rop.nl. І, враховуючи що там не в курсі, що Kiev вже давно Kyiv - бази там не свіжі.
Зав"язуватись на таке - нафіг-нафіг, навіть в домашньому проекті.

Неактивний

#10 2024-12-18 17:12:12

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 222

Re: Електричний камін замість будильника

jokeR пише:

ezTime мацав, не сподобалось. Це якраз та сама подєлка, зав"язана на якийсь дивний сервер timezoned.rop.nl.

Так то сервер, який використовується автором для підтримання бази на цільових пристроях в актуальному стані. Наскільки бачу, його використання можна вимкнути, прибравши EZTIME_NETWORK_ENABLE. Або підняти свій аналогічний.
Якщо апдейтити прошивку з базою вручну, то для конвертації часу доступу до мережі не потрібно.

jokeR пише:

І, враховуючи що там не в курсі, що Kiev вже давно Kyiv - бази там не свіжі.

В сучасній базі теж є Kiev, бо зворотня сумісність. Kyiv та Kiev - два файла з однаковим вмістом.
Актуальна база розміщується на https://www.iana.org/time-zones, також доступна по FTP та rsync. Звідти її і потрібно брати.

Остання редакція dimich (2024-12-18 17:13:52)

Неактивний

#11 2024-12-18 18:29:19

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

його використання можна вимкнути, прибравши EZTIME_NETWORK_ENABLE. Або підняти свій аналогічний.

Якщо вимкнути - буде єдина доступна таймзона UTC. Це корисно хіба що для імітації сумусності. Підняти свій сервер - це якийсь аццький оверінжинірінг wink

Якщо апдейтити прошивку з базою вручну, то для конвертації часу доступу до мережі не потрібно.

Ну теоретично так, але робочого рішення я не знайшов. Робоче - це якщо можна взяти файл з iana.org і вкрутити в прошивку.

Неактивний

#12 2024-12-18 22:18:04

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 222

Re: Електричний камін замість будильника

jokeR пише:

Якщо вимкнути - буде єдина доступна таймзона UTC. Це корисно хіба що для імітації сумусності. Підняти свій сервер - це якийсь аццький оверінжинірінг wink

Хм, дійсно, здається, там не можна просто захардкодити свою таймзону. Зате і автоапдейт, і NTP, і форматування, і якісь евенти. Хороший приклад, як НЕ треба проектувати бібліотеки big_smile

jokeR пише:

Робоче - це якщо можна взяти файл з iana.org і вкрутити в прошивку.

"Стандартна" Timezone для цього майже підходить.
У файлі континента з архіва IANA знайти діючий на даний момент запис для Zone (UNTIL пустий). Там STDOFF - зміщення відносно UTC, RULES - правила переходу. Знайти діючі на правила у записах Rules (TO==max) і на їх основі створити параметри для обʼєктів TimeChangeRule.
Або компілити таймзони за допомогою zic у бінарний формат, але прийдеться парсити бінарний формат у рантаймі.
Можна і автоматизувати цей процес при збірці прошивки, але як інтегрувати це конкретно в platformio, того вже не знаю.

Неактивний

#13 2024-12-18 22:39:50

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

Ну, якби я пиляв щось типу розумного лічильника - щось подібне довелось би майстрячити. Рішення для колгоспників - задати таймзону руками і поміняти якщо буде потрібно wink

Неактивний

#14 2024-12-19 14:03:29

Васятко
Гість

Re: Електричний камін замість будильника

jokeR пише:

як навчити той таймер нажимати кнопки на пульті чи на панелі?

А простим встромлянням в розетку той камін не вмикається? Якщо ні, то питання знімається.

jokeR пише:

Ніт. Просто повірте - ніт. 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

}

і все само переводить стрілки годинника

#15 2024-12-19 14:58:15

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 21

Re: Електричний камін замість будильника

framework-arduinoespressif8266/tools/esptool/flasher_stub/ld/rom_32.ld:PROVIDE ( tzset = 0x40001a1c );

Прикольно
Походу якась магія від esp wink

"EET-2EEST,M3.5.0/3,M10.5.0/4"

З openwrt походу.

Буду знати, дякую.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму