Как реализовать 3 состояния для одного выключателя?

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение vitosmaxim80sad145 » Вс окт 13, 2019 3:09 pm

Divan писал(а):
Вс окт 13, 2019 3:02 pm
пока не знаю, задал вопрос выше, может кто-то подскажет.
а нет сцены новостей
Jilber
Сообщения: 686
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 113 раз
Поблагодарили: 107 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Jilber » Вс окт 13, 2019 3:32 pm

Divan писал(а):
Вс окт 13, 2019 1:25 pm
Нужна помощь, как сделать, чтобы при выборе функции, можно было выставлять время для Ночного режима или для заката?
СпойлерПоказать
Поле выбора radio.JPG
Там же ниже привязывается нужное свойство.
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Divan » Вс окт 13, 2019 4:39 pm

Это я и без вас знаю, что внизу привязывается свойство Ночной режим, но тут все иначе, в радиобоксе нам нужно, чтобы при переключении "По времени" или "На Закат" или наоборот, при установке времени значения вписывались в эти объекты
СпойлерПоказать
1.JPG
1.JPG (42.54 КБ) 3285 просмотров
По времени
ThisComputer.NightModeStart
ThisComputer.NightModeEnd

Восход и закат солнца
ThisComputer.SunSetTime
ThisComputer.SunRiseTime
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Divan » Вс окт 13, 2019 5:43 pm

vitosmaxim80sad145 писал(а):
Вс окт 13, 2019 3:09 pm
Divan писал(а):
Вс окт 13, 2019 3:02 pm
пока не знаю, задал вопрос выше, может кто-то подскажет.
а нет сцены новостей
Выкладываю инструкцию, как настроить новости. Сам готовый объект Weather можете скачать здесь, вот так он будет выглядеть, тут есть и ночной режим. Пока я с ним разбираюсь, хочу понять как нужно настроить Ночной режим, чтобы можно было переключать по закату или по времени. Как разберусь, выложу инструкцию.
СпойлерПоказать
03 - подобъект новости.jpg
03 - подобъект новости.jpg (76.95 КБ) 3276 просмотров
Далее из маркета нужно установить модуль и настроить
СпойлерПоказать
06 - модуль RSS Channels.jpg
06 - модуль RSS Channels.jpg (86.37 КБ) 3276 просмотров
01 - Каналы RSS.jpg
01 - Каналы RSS.jpg (90.29 КБ) 3276 просмотров
02 - Каналы RSS.jpg
02 - Каналы RSS.jpg (80.83 КБ) 3276 просмотров
URL-источник

Код: Выделить всё

http://www.vesti.md/rss/news.xml
Создаете сценарии Говорилка, сам код ниже
СпойлерПоказать
04 -Сценарии на чтение новостей.jpg
04 -Сценарии на чтение новостей.jpg (60.29 КБ) 3276 просмотров
05 - Сценарии на чтение новостей.jpg
05 - Сценарии на чтение новостей.jpg (149.18 КБ) 3276 просмотров
В сценарии вставляете код

Код: Выделить всё

$Msn=(gg("Mainsity.Say_news"));
if ($Msn=='свежие новости') {
$data=SQLSelectOne("SELECT * FROM rss_items ORDER BY ADDED DESC LIMIT 1");
//вариант с фильтром по каналу: $data=SQLSelectOne("SELECT * FROM rss_items WHERE CHANNEL_ID=5 ORDER BY ADDED DESC LIMIT 1"); //вместо 5 нужный ID канала
$news_text=$data['BODY']; // текст новости
$news_header=$data['TITLE']; // заголовок
setGlobal('Mainsity.eventsTitle',$news_header);
setGlobal('Mainsity.eventsNews',$news_text);

$status="";
$tm=(gg("Mainsity.Say_news_text"));
if ($tm=='Заголовок') {
$status.=(''.$news_header.' ');
} elseif ($tm=='Новость') {
$status.=(''.$news_text.' ');
} else{
$status.=(''.$news_header.'. '.$news_text.'. ');
}
say($status,5);
 }

Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Divan » Вс окт 13, 2019 11:23 pm

Вроде бы разобрался, сделал так и не много переделал меню, чтобы в боковом меню было красиво. Теперь если выбирать "по закату", то ночной режим включится по закату, если выбираем "по времени", то включится по указанному времени. Но почему-то если я выберу по закату, то ночной режим по времени все равно сработает, что я делаю не так? Вот ниже мои действия.
СпойлерПоказать
01 - Общий вид меню ночного режима в формате html.JPG
01 - Общий вид меню ночного режима в формате html.JPG (59.22 КБ) 3252 просмотра
Создаем в подобъекте "NightMode" свойство "mode", где будут значения 1 или 2
Значение=1 - по времени
Значение=2 - по закату
СпойлерПоказать
04 - создаем свойство mode в подобъекте NightMode.jpg
04 - создаем свойство mode в подобъекте NightMode.jpg (144.7 КБ) 3252 просмотра
В "Меню управления" настраиваем меню "Ночного режима" и привязываем к свойству "mode" подобъекта "NightMode"
СпойлерПоказать
02 - вид меню Меню управления.JPG
02 - вид меню Меню управления.JPG (21.81 КБ) 3251 просмотр
02-1 - настройка меню ночного режима - поле радио.jpg
02-1 - настройка меню ночного режима - поле радио.jpg (92.55 КБ) 3252 просмотра
02-2 - настройка меню ночного режима - поле радио.JPG
02-2 - настройка меню ночного режима - поле радио.JPG (38.26 КБ) 3252 просмотра
В методе "modeChanged" подобъекта "DarknessMode" мы добавляем код, который при активации проверит код и если значение=2, то сработает сценарии
СпойлерПоказать
05 - идем в настройки метода modeChanged подобъекта DarknessMode.jpg
05 - идем в настройки метода modeChanged подобъекта DarknessMode.jpg (80.35 КБ) 3252 просмотра
Вариант кода в блокли
СпойлерПоказать
вариант кода в блокли.JPG
вариант кода в блокли.JPG (53.32 КБ) 3252 просмотра
Вариант кода в PHP

Код: Выделить всё

if (getGlobal("DarknessMode.active") == 1 && getGlobal('NightMode.mode') == 2) {
  callMethod('NightMode.activate');
} else if (getGlobal("DarknessMode.active") == 0 && getGlobal('NightMode.mode') == 2) {
  callMethod('NightMode.deactivate');
}
Осталось сделать сценарии "Вычисляем восход и заход солнца" и в CRON настроить на запуск сценария раз в сутки в 00:00. Данный сценарии позволит вычислить восход и заход солнца, который внесет данные в ThisComputer.SunSetTime и ThisComputer.SunRiseTime
СпойлерПоказать
06 - восход и заход солнца.JPG
06 - восход и заход солнца.JPG (16.96 КБ) 3252 просмотра
03 - создаем сценарии Вычисляем восход и заход солнца.JPG
03 - создаем сценарии Вычисляем восход и заход солнца.JPG (85.87 КБ) 3252 просмотра
Код для сценария "Вычисляем восход и заход солнца"

Код: Выделить всё

$sun_info = date_sun_info(time(), 46.984, 28.8358);
foreach ($sun_info as $key => $val) {
if ($key == 'sunrise') {
$sunrise = $val;
setGlobal('ThisComputer.SunRiseTime',date("H:i", $sunrise));
}
if ($key == 'sunset') {
$sunset = $val;
$day_length = $sunset - $sunrise;
setGlobal('ThisComputer.SunSetTime',date("H:i", $sunset));}}
Последний раз редактировалось Divan Пн окт 14, 2019 12:30 am, всего редактировалось 1 раз.
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
fandaymon
Сообщения: 1557
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение fandaymon » Пн окт 14, 2019 1:27 am

Divan писал(а):
Вс окт 13, 2019 11:23 pm


Вариант кода в PHP

Код: Выделить всё

if (getGlobal("DarknessMode.active") == 1 && getGlobal('NightMode.mode') == 2) {
  callMethod('NightMode.activate');
} else if (getGlobal("DarknessMode.active") == 0 && getGlobal('NightMode.mode') == 2) {
  callMethod('NightMode.deactivate');
}
Очень странный способ включать Ночной режим при включение Тёмного времени суток...
Правильный способ - зайти в onNewMinute объекта ClockChime, найти там код, который включает/выключает Ночной режим по времени и там вместо TimeIs('20:00') поставить условие если режим По времени, то TimeIs(наше время), если По закату, то TimeIs(gg('SunRiseTime'))

Аналогично для выключения - вместо TimeIs('08:00') своё время или время рассвета

Время, которое выбирается в меню, тоже надо где-то хранить
Divan писал(а):
Вс окт 13, 2019 11:23 pm
Осталось сделать сценарии "Вычисляем восход и заход солнца" и в CRON настроить на запуск сценария раз в сутки в 00:00. Данный сценарии позволит вычислить восход и заход солнца, который внесет данные в ThisComputer.SunSetTime и ThisComputer.SunRiseTime
СпойлерПоказать
06 - восход и заход солнца.JPG
03 - создаем сценарии Вычисляем восход и заход солнца.JPG
Код для сценария "Вычисляем восход и заход солнца"

Код: Выделить всё

$sun_info = date_sun_info(time(), 46.984, 28.8358);
foreach ($sun_info as $key => $val) {
if ($key == 'sunrise') {
$sunrise = $val;
setGlobal('ThisComputer.SunRiseTime',date("H:i", $sunrise));
}
if ($key == 'sunset') {
$sunset = $val;
$day_length = $sunset - $sunrise;
setGlobal('ThisComputer.SunSetTime',date("H:i", $sunset));}}
Если из всего массива нужны только sunset и sunrise, то можно не перебирать все элементы массива, а ссылаться на них сразу
$sun_info['sunset']
Но это ладно - а вот координаты Кишинёва вам посчитают совершенно неправильное время заката/рассвета
Logrus
Сообщения: 2088
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 459 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Logrus » Пн окт 14, 2019 2:25 am

:D это ты еще никого нет в блокли не смотрел
в курилке все гадаем когда жинка автора скалкой приголубит :lol:
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение Divan » Пн окт 14, 2019 2:42 am

про Кишинёв :D, мой косяк. Можете, если не трудно написать правильный код для заката и восхода солнца? Если я в методе onNewMinute в коде ночного режима пропишу правило, чтобы срабатывал, если у night mode стоит значение 1, это будет работать?


"logrus", когда жинка автора скалкой приголубит - иной раз мне вас не понять, может вам понятно, но мне лично не ясно что вы этим хотите сказать. Потом здесь на форуме новичкам никто подробно не разжевывает, а я стараюсь разобраться, понять и помочь таким же новичкам, как и я. Вы так и не ответили на мой вопрос, как решать проблему в одну строку, даже не ответили мне в личку. Игнор!?
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
fandaymon
Сообщения: 1557
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение fandaymon » Пн окт 14, 2019 3:52 am

Divan писал(а):
Пн окт 14, 2019 2:42 am
про Кишинёв :D, мой косяк. Можете, если не трудно написать правильный код для заката и восхода солнца? Если я в методе onNewMinute в коде ночного режима пропишу правило, чтобы срабатывал, если у night mode стоит значение 1, это будет работать?
В onNewMinute вместо того что есть сейчас прописывается примерно такой код:

Код: Выделить всё

if (timeIs(gg('NightModeStart'))) {
 callMethod('NightMode.activate');
} elseif (timeIs(gg('NightModeEnd'))) {
 callMethod('NightMode.deactivate');
}
Т.е. вместо жестко заданного времени 20:00 и 08:00 мы заводим 2 свойства в объекте ThisComputer - NightModeStart и NightModeEnd, где храним время активации и деактивации Ночного времени. (ThisComputer можно не писать - по умолчанию используется именно этот объект)

Далее нам надо заполнить эти 2 свойства

В сценарий Hourly (он выполняется каждый час) пишем следующее

Код: Выделить всё

$h=(int)date('G',time());

if ($h==3) {
 $sun_info = date_sun_info(time(), 55.75, 37.62); //Примерно координаты Москвы
 setGlobal('SunRiseTime',date("H:i",  $sun_info['sunrise']));
 setGlobal('SunSetTime',date("H:i",  $sun_info['sunset']));
 if (gg('NightMode.mode')==2) {
   setGlobal('NightModeEnd',date("H:i",  $sun_info['sunrise']));
   setGlobal('NightModeStart ',date("H:i",  $sun_info['sunset']));  
 }

}
В 3 часа ночи мы вычисляем время заката и восхода, записываем его в свойства ВремяЗаката и ВремяВосхода, а если режим Ночного времени=2, то и в свойства ВремяНачалаНочногоРежима и ВремяКонцаНочногоРежима

Ну и там, где редактируется Режим, надо привязать свойства NightModeStart и NightModeEnd к нашим часикам


Divan писал(а):
Пн окт 14, 2019 2:42 am
"logrus", когда жинка автора скалкой приголубит - иной раз мне вас не понять, может вам понятно, но мне лично не ясно что вы этим хотите сказать. Потом здесь на форуме новичкам никто подробно не разжевывает, а я стараюсь разобраться, понять и помочь таким же новичкам, как и я. Вы так и не ответили на мой вопрос, как решать проблему в одну строку, даже не ответили мне в личку. Игнор!?
На самом деле новичкам подробно разжевывают и не один раз... Просто каждый новичок (почти каждый) считает что его проблема уникальна, поэтому даже не пытается поискать решение на форуме, а сразу открывает новую тему со своей проблемой и форум загромождается постоянными повторами одного и того же... А люди все занятые, повторять одно и тоже не особо интересно, в конце концов если человек ленится потратить своё время на поиск, то почему ты должен тратить своё время и писать одно и тоже? Но это так - не претензия лично к вам, просто мысли вслух
За это сообщение автора fandaymon поблагодарил:
Divan (Пн окт 14, 2019 8:53 am)
Рейтинг: 1.16%
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: Как реализовать 3 состояния для одного выключателя?

Сообщение vitosmaxim80sad145 » Вт окт 15, 2019 8:15 am

СПАСИБО ЗА ПОМОЩЬ
Последний раз редактировалось vitosmaxim80sad145 Чт апр 02, 2020 11:09 pm, всего редактировалось 1 раз.
Ответить