• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Blockly, добавить работу со временем.

valeraba

Moderator
Команда форума
Есть запрос пользователей добавить в blockly работу со временем. Какие блоки нужно добавить?

В domoticz это сделано так
 

valeraba

Moderator
Команда форума
Насколько было бы удобно, если добавить такие блоки?
  • Second // seconds after the minute (from 0 to 59)
  • Minute // minutes after the hour (from 0 to 59)
  • Hour // hour of the day (from 0 to 23)
  • Wday // day of week (from 1 to 7), с какого дня начинается неделя?
  • Day // day of the month (from 1 to 31)
  • Month // month of the year (from 1 to 12)
  • Year // от Рождества Христова

Если время устройства не синхронизировано, то все эти блоки будут возвращать NaN.
Где выставлять временную зону? Наверное это лучше делать вне сценария?
 

valeraba

Moderator
Команда форума
Также было предложение добавить блок GetTime (количество секунд от начала суток).
Но я очень сомневаюсь в её полезности, уж очень низкая читаемость.
А если продолжить, то может потребоваться количество секунд от начала часа, недели, месяца, года.
 

glory24

Member
Наверное это лучше делать вне сценария?
Трудно так сказать. Было бы неплохо сравнить уже готовые реализации что было что сравнивать.
С одной стороны, когда собираешь сценарий то у тебя перед глазами целостная картина того, что ты собираешься получить с помощью этих временных блоков.
С другой - на панели управления можно каждому окну дать текстовые пояснения, а в сценарий уйдут ссылки на них.
  • Second // seconds after the minute (from 0 to 59)
  • Minute // minutes after the hour (from 0 to 59)
  • Hour // hour of the day (from 0 to 23)
  • Wday // day of week (from 1 to 7), с какого дня начинается неделя?
  • Day // day of the month (from 1 to 31)
  • Month // month of the year (from 1 to 12)
  • Year // offset from 1970
Ну и понадобятся дополнительных 7 переменных каждому окну на панели управления.
А вообще заказчиком этой функции выступал у Нас Петр. На сколько я помню, ему она нужна была для отправки отчетов в Телеграм, значит эти 7 переменных нужно будет добавлять в прошивку Телеграм бота.
 

valeraba

Moderator
Команда форума
Ну и понадобятся дополнительных 7 переменных каждому окну на панели управления.
А вообще заказчиком этой функции выступал у Нас Петр. На сколько я помню, ему она нужна была для отправки отчетов в Телеграм, значит эти 7 переменных нужно будет добавлять в прошивку Телеграм бота.
Не 7 переменных, а семь блоков... либо вообще один блок с выпадашкой, типа такого:
2020-06-18_14-33-36.png

Я понял ход твоих мыслей. Но нам незачем добавлять лишние переменные. Я же могу расширить функционал самого blockly, добавить новые ассемблерные команды и модифицировать свою виртуальную машину :)
 
Последнее редактирование:

PeterPK

Active member
Мне это было нужно и для котла, и для других устройств.
Основная задача - работать или не работать устройство в заданный период. Например освещение, полив, электрорадиатор по ночному тарифу и тд.

Подход Domoticz
Blockly_time_compare[1].PNG
в принципе хорош, единственный минус - если кому то вдруг понадобятся секундные интервалы, то никак.
Что такое Sunrise - вопрос, астрономический на каждой широте происходит в разное время, это надо еще знать широту пользователя?

Вариант
  • Second // seconds after the minute (from 0 to 59)
  • Minute // minutes after the hour (from 0 to 59)
  • Hour // hour of the day (from 0 to 23)
вполне рабочий, но потребует трех запросов и потом кучи if'ов - если больше n часов и n минут и k секунд и меньше часов-минут-секунд, как-то так.
С секундами проще всего - один запрос и потом две проверки, больше n и меньше m.

Недаром время на компьютерах измеряют в секундах прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг) .
Я подумал что это логично.
 

valeraba

Moderator
Команда форума
Какой то кривой способ задания времени, неоднозначный (это просто строка, которая может принять любые символы).
2020-06-18_16-23-39.png
 

valeraba

Moderator
Команда форума
Для задания суточной временной константы я могу создать дополнительный блок (часы + минуты + секунды)
Для недельного временной константы другой блок (день недели + часы + минуты + секунды)
Эти блоки даже не потребуют добавления ассемблерных команд, просто удобный ввод временных констант.
 
Последнее редактирование:

PeterPK

Active member
Не понял с
1) 00:30:00. В примере имелось в виду 12:30:00 ?

2) Почему "else if"?
По-моему if ((Текущее >= Начальное)AND(Текущее <Конечное))

И отдельная проблема (в любом случае), если временной интервал пересекает полночь.
В этом случае: if ((Текущее >= Начальное)OR(Текущее <Конечное))

А в остальном нормально. Тогда я делаю себе функцию GetTime(return x) куда уношу эту строку "set Текущее время" и получаю то, что хотел. Вполне.
 

PeterPK

Active member
  • Wday // day of week (from 1 to 7), с какого дня начинается неделя?
На сколько я знаю это обычно делают как-то так:
Day = GetWDay{n} , где n=0 первый день недели воскресенье, n=1 первый день недели понедельник.

Где выставлять временную зону? Наверное это лучше делать вне сценария?
Мне кажется это лучше делать в настройках, там же где и всякие SSID, id, key.
 

valeraba

Moderator
Команда форума
Не понял с
1) 00:30:00. В примере имелось в виду 12:30:00 ?

2) Почему "else if"?
По-моему if ((Текущее >= Начальное)AND(Текущее <Конечное))

И отдельная проблема (в любом случае), если временной интервал пересекает полночь.
В этом случае: if ((Текущее >= Начальное)OR(Текущее <Конечное))

А в остальном нормально. Тогда я делаю себе функцию GetTime(return x) куда уношу эту строку "set Текущее время" и получаю то, что хотел. Вполне.
Все замечания верны. Все эти ляпы я заметил сразу, когда выложил, но лень было править.
 

antenna-krsk

Active member
Ребята, а sunrise, sunset возможны? Насколько сложно их добавить. Но это реально нужные блоки. Они точно бы были всем полезны
 

glory24

Member
Мне это было нужно и для котла, и для других устройств.
Основная задача - работать или не работать устройство в заданный период. Например освещение, полив, электрорадиатор по ночному тарифу и тд.
А почему это нельзя обычным расписанием задать?
1592497352133.png
Зачем такие-то сложности?
 

valeraba

Moderator
Команда форума
А почему это нельзя обычным расписанием задать?
Посмотреть вложение 9412
Зачем такие-то сложности?
Плохая картинка, нужно страничку обновить, я менял сайт.
Умение blockly работать со временем, довольно важный функционал. Сценарий даёт больше возможностей для работы со временем, чем расписание. Другое дело, нужно найти оптимальное решение.
Ребята, а sunrise, sunset возможны? Насколько сложно их добавить. Но это реально нужные блоки. Они точно бы были всем полезны
Для этого требуются координаты и довольно тяжёлые вычисления, с другой стороны вычислять нужно не чаще, чем раз в сутки. Нужно подумать.
 

PeterPK

Active member
А почему это нельзя обычным расписанием задать?
Посмотреть вложение 9412
Зачем такие-то сложности?
Ну, например мне в 1 час ночи нужно включить Реле1 на 10 минут, а в 2 часа ночи Реле2 на 10 минут.
Расписание мне скажет, что сейчас период, когда нужно включить какое-то реле, но какое - я не пойму.

Но возможно дело в том, что я так и не смог понять, что значит строка "1 из 1 +"
QMGT2.png
как ни нажимал + оно потом все равно пропадало...
 

valeraba

Moderator
Команда форума
Ну, например мне в 1 час ночи нужно включить Реле1 на 10 минут, а в 2 часа ночи Реле2 на 10 минут.
Расписание мне скажет, что сейчас период, когда нужно включить какое-то реле, но какое - я не пойму.

Но возможно дело в том, что я так и не смог понять, что значит строка "1 из 1 +"
Посмотреть вложение 9413
как ни нажимал + оно потом все равно пропадало...
Попробуйте убрать некоторые галочки, всё поймёте. Расписание на каждый день недели может быть разным.
2020-06-19_01-31-59.png
 
Сверху Снизу