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

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

Модератор: immortal

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

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

Сообщение vitosmaxim80sad145 »

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

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

Сообщение Jilber »

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

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

Сообщение Divan »

Это я и без вас знаю, что внизу привязывается свойство Ночной режим, но тут все иначе, в радиобоксе нам нужно, чтобы при переключении "По времени" или "На Закат" или наоборот, при установке времени значения вписывались в эти объекты
SPOILERSPOILER_SHOW
1.JPG
1.JPG (42.54 КБ) 3939 просмотров
По времени
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

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

Сообщение Divan »

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

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

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

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

$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

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

Сообщение Divan »

Вроде бы разобрался, сделал так и не много переделал меню, чтобы в боковом меню было красиво. Теперь если выбирать "по закату", то ночной режим включится по закату, если выбираем "по времени", то включится по указанному времени. Но почему-то если я выберу по закату, то ночной режим по времени все равно сработает, что я делаю не так? Вот ниже мои действия.
SPOILERSPOILER_SHOW
01 - Общий вид меню ночного режима в формате html.JPG
01 - Общий вид меню ночного режима в формате html.JPG (59.22 КБ) 3906 просмотров
Создаем в подобъекте "NightMode" свойство "mode", где будут значения 1 или 2
Значение=1 - по времени
Значение=2 - по закату
SPOILERSPOILER_SHOW
04 - создаем свойство mode в подобъекте NightMode.jpg
04 - создаем свойство mode в подобъекте NightMode.jpg (144.7 КБ) 3906 просмотров
В "Меню управления" настраиваем меню "Ночного режима" и привязываем к свойству "mode" подобъекта "NightMode"
SPOILERSPOILER_SHOW
02 - вид меню Меню управления.JPG
02 - вид меню Меню управления.JPG (21.81 КБ) 3905 просмотров
02-1 - настройка меню ночного режима - поле радио.jpg
02-1 - настройка меню ночного режима - поле радио.jpg (92.55 КБ) 3906 просмотров
02-2 - настройка меню ночного режима - поле радио.JPG
02-2 - настройка меню ночного режима - поле радио.JPG (38.26 КБ) 3906 просмотров
В методе "modeChanged" подобъекта "DarknessMode" мы добавляем код, который при активации проверит код и если значение=2, то сработает сценарии
SPOILERSPOILER_SHOW
05 - идем в настройки метода modeChanged подобъекта DarknessMode.jpg
05 - идем в настройки метода modeChanged подобъекта DarknessMode.jpg (80.35 КБ) 3906 просмотров
Вариант кода в блокли
SPOILERSPOILER_SHOW
вариант кода в блокли.JPG
вариант кода в блокли.JPG (53.32 КБ) 3906 просмотров
Вариант кода в 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
SPOILERSPOILER_SHOW
06 - восход и заход солнца.JPG
06 - восход и заход солнца.JPG (16.96 КБ) 3906 просмотров
03 - создаем сценарии Вычисляем восход и заход солнца.JPG
03 - создаем сценарии Вычисляем восход и заход солнца.JPG (85.87 КБ) 3906 просмотров
Код для сценария "Вычисляем восход и заход солнца"

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

$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
Сообщения: 1576
Зарегистрирован: Сб янв 13, 2018 5:00 pm

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

Сообщение fandaymon »

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
SPOILERSPOILER_SHOW
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
Сообщения: 2113
Зарегистрирован: Пт апр 07, 2017 12:20 pm

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

Сообщение Logrus »

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

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

Сообщение Divan »

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


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

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

Сообщение fandaymon »

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", когда жинка автора скалкой приголубит - иной раз мне вас не понять, может вам понятно, но мне лично не ясно что вы этим хотите сказать. Потом здесь на форуме новичкам никто подробно не разжевывает, а я стараюсь разобраться, понять и помочь таким же новичкам, как и я. Вы так и не ответили на мой вопрос, как решать проблему в одну строку, даже не ответили мне в личку. Игнор!?
На самом деле новичкам подробно разжевывают и не один раз... Просто каждый новичок (почти каждый) считает что его проблема уникальна, поэтому даже не пытается поискать решение на форуме, а сразу открывает новую тему со своей проблемой и форум загромождается постоянными повторами одного и того же... А люди все занятые, повторять одно и тоже не особо интересно, в конце концов если человек ленится потратить своё время на поиск, то почему ты должен тратить своё время и писать одно и тоже? Но это так - не претензия лично к вам, просто мысли вслух
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр

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

Сообщение vitosmaxim80sad145 »

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