Modules/devices/processCommand inc php
Материал из MajorDoMo инфо
ᐂ В корневой раздел ᐃ В директорию расположения файла
<?php // Проверяет, отключены ли простые устройства в файле конфигурации ROOT . config.php. Если да, прекращает выполнение скрипта. if (defined('DISABLE_SIMPLE_DEVICES') && DISABLE_SIMPLE_DEVICES == 1) return; /* * array('level' => $level, 'message' => $ph, 'member_id' => $member_id, 'source' => $source) * $details['BREAK'] = 1 / 0 */ // Этот блок кода, вероятно, предназначен для обработки лога или отладки, так как он содержит пример использования переменной $details['BREAK']. // Однако, поскольку он закомментирован, его выполнение в текущем состоянии скрипта не происходит. // Включаем файлы локализации для текущего языка сайта и по умолчанию. @include_once(ROOT . 'languages/' . $this->name . '_' . SETTINGS_SITE_LANGUAGE . '.php'); @include_once(ROOT . 'languages/' . $this->name . '_default' . '.php'); // Если в деталях команды указано источник (терминал), то получаем информацию о терминале. if ($details['source']) { $terminal = getTerminalByID(str_replace("terminal", "", $details['source'])); // Если у терминала есть ID местоположения, сохраняем его. if ($terminal['LOCATION_ID']) { $location_id = $terminal['LOCATION_ID']; } } /* * Этот фрагмент кода анализирует входящую команду на предмет наличия указаний на задержку выполнения, * или продолжительность выполнения действия. * Если такие указания присутствуют, код вычисляет соответствующие значения в секундах * и сохраняет их в переменных $period_delay и $period_run_for соответственно. * Также код сохраняет найденное совпадение в переменную $add_phrase, чтобы потом добавить его к сообщению. */ // Получаем текстовую команду из массива $details, который содержит детали сообщения. $command = $details['message']; // Инициализируем переменную $run_code как пустую строку. Эта переменная будет использоваться для хранения кода, который нужно выполнить. $run_code = ''; // Инициализируем переменную $opposite_code как пустую строку. Эта переменная будет использоваться для хранения кода, который будет выполнен в качестве противодействия к основному коду. $opposite_code = ''; // Инициализируем переменную $add_phrase как пустую строку. Эта переменная будет использоваться для хранения дополнительной фразы, которая будет добавлена к сообщению. $add_phrase = ''; // Инициализируем переменную $period_delay как 0. Эта переменная будет использоваться для хранения задержки выполнения команды в секундах. $period_delay = 0; // Инициализируем переменную $period_run_for как 0. Эта переменная будет использоваться для хранения продолжительности выполнения команды в секундах. $period_run_for = 0; // Проверяем, содержит ли команда фразу, указывающую на необходимость выполнения действия после определенного времени. if (preg_match('/' . LANG_PATTERN_DO_AFTER . ' (\d+?) (' . LANG_PATTERN_SECOND . '|' . LANG_PATTERN_MINUTE . '|' . LANG_PATTERN_HOUR . ')/uis', textToNumbers($command), $m)) { // Получаем числовое значение времени задержки из найденного совпадения. $period_number = $m[1]; // Добавляем найденное совпадение к переменной $add_phrase, чтобы потом добавить его к сообщению. $add_phrase = ' ' . $m[0]; // Определяем единицу измерения времени (секунды, минуты, часы) и вычисляем задержку в секундах. if (preg_match('/' . LANG_PATTERN_SECOND . '/uis', $m[2])) { // Если единица измерения - секунды, то задержка равна числовому значению. $period_delay = $period_number; } elseif (preg_match('/' . LANG_PATTERN_MINUTE . '/uis', $m[2])) { // Если единица измерения - минуты, то задержка равна числовому значению, умноженному на 60. $period_delay = $period_number * 60; } elseif (preg_match('/' . LANG_PATTERN_HOUR . '/uis', $m[2])) { // Если единица измерения - часы, то задержка равна числовому значению, умноженному на 3600. $period_delay = $period_number * 60 * 60; } // Удаляем обработанную часть команды, чтобы оставить только саму команду без указания времени задержки. $command = trim(str_replace($m[0], '', textToNumbers($command))); } elseif (preg_match('/' . LANG_PATTERN_DO_FOR . ' (\d+?) (' . LANG_PATTERN_SECOND . '|' . LANG_PATTERN_MINUTE . '|' . LANG_PATTERN_HOUR . ')/uis', textToNumbers($command), $m)) { // Получаем числовое значение времени выполнения из найденного совпадения. $period_number = $m[1]; // Добавляем найденное совпадение к переменной $add_phrase, чтобы потом добавить его к сообщению. $add_phrase = ' ' . $m[0]; // Определяем единицу измерения времени (секунды, минуты, часы) и вычисляем продолжительность выполнения в секундах. if (preg_match('/' . LANG_PATTERN_SECOND . '/uis', $m[2])) { // Если единица измерения - секунды, то продолжительность выполнения равна числовому значению. $period_run_for = $period_number; } elseif (preg_match('/' . LANG_PATTERN_MINUTE . '/uis', $m[2])) { // Если единица измерения - минуты, то продолжительность выполнения равна числовому значению, умноженному на 60. $period_run_for = $period_number * 60; } elseif (preg_match('/' . LANG_PATTERN_HOUR . '/uis', $m[2])) { // Если единица измерения - часы, то продолжительность выполнения равна числовому значению, умноженному на 3600. $period_run_for = $period_number * 60 * 60; } // Удаляем обработанную часть команды, чтобы оставить только саму команду без указания времени выполнения. $command = trim(str_replace($m[0], '', textToNumbers($command))); } // Инициализируем переменную $processed как 0. Эта переменная будет использоваться для отслеживания, была ли команда обработана. $processed = 0; // Инициализируем переменную $reply_confirm как 0. Эта переменная будет использоваться для подтверждения выполнения команды. $reply_confirm = 0; // Инициализируем переменную $reply_say как пустую строку. Эта переменная будет использоваться для хранения сообщения, которое будет отправлено в ответ на команду. $reply_say = ''; // Инициализируем переменную $phpmorphy_loaded как 0. Эта переменная будет использоваться для отслеживания, загружена ли библиотека phpMorphy. $phpmorphy_loaded = 0; // Проверяем, существует ли файл библиотеки phpMorphy. if (file_exists(ROOT . "lib/phpmorphy/common.php")) { // Подключаем файл библиотеки phpMorphy. require_once(ROOT . "lib/phpmorphy/common.php"); $opts = array( // Указываем тип хранения данных. 'storage' => PHPMORPHY_STORAGE_MEM, // Включаем предсказание по суффиксу. 'predict_by_suffix' => true, // Включаем предсказание по базе данных. 'predict_by_db' => true, // Указываем, что грамматическая информация должна быть представлена в виде текста. 'graminfo_as_text' => true, ); // Указываем путь к словарям phpMorphy. $dir = ROOT . 'lib/phpmorphy/dicts'; // Получаем код текущего языка сайта. $lang = SETTINGS_SITE_LANGUAGE_CODE; try { // Создаем экземпляр класса phpMorphy. $morphy = new phpMorphy($dir, $lang, $opts); // Сохраняем ссылку на созданный экземпляр в свойстве объекта. $this->morphy = &$morphy; } catch (phpMorphy_Exception $e) { // Выводим сообщение об ошибке и прерываем выполнение скрипта. die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e); } // Разбиваем команду на слова. $words = explode(' ', $command); // Инициализируем массив для хранения отфильтрованных слов. $words_filtered = array(); // Инициализируем счетчик отфильтрованных слов. $filtered_count = 0; // Инициализируем массив для хранения базовых форм слов. $base_forms = array(); // Инициализируем массив для хранения базовых форм отфильтрованных слов. $base_forms_filtered = array(); // Получаем общее количество слов в команде. $totals = count($words); for ($is = 0; $is < $totals; $is++) { // Инициализируем переменную для отслеживания, было ли слово фильтровано. $filtered = 0; // Преобразуем слово в верхний регистр. $upper = mb_strtoupper($words[$is], 'UTF-8'); // Получаем длину слова. $len = mb_strlen($words[$is], 'UTF-8'); // Если длина слова больше или равна 3, считаем его достаточно длинным для анализа. if ($len >= 3) { // Добавляем слово в массив отфильтрованных слов. $words_filtered[] = $words[$is]; // Помечаем слово как отфильтрованное. $filtered = 1; // Увеличиваем счетчик отфильтрованных слов. $filtered_count++; } // Если слово является числом, добавляем его в массив базовых форм. if (preg_match('/^(\d+)$/', $words[$is])) { $base_forms[$is] = array($words[$is]); // Если слово не содержит специальных символов, получаем его базовую форму. } elseif (!preg_match('/[\(\)\+\.]/', $words[$is])) { // Преобразуем слово в верхний регистр. $Word = mb_strtoupper($words[$is], 'UTF-8'); // Получаем базовую форму слова. $base_forms[$is] = $morphy->getBaseForm($Word); // Добавляем исходное слово в массив базовых форм. $base_forms[$is][] = $words[$is]; // Если слово содержит специальные символы, добавляем его в массив базовых форм без изменений. } else { $base_forms[$is] = array($words[$is]); } // Если слово было отфильтровано, добавляем его базовую форму в массив отфильтрованных базовых форм. if ($filtered) { $base_forms_filtered[$filtered_count - 1] = $base_forms[$is]; } } // Генерируем все возможные комбинации базовых форм слов. $combos = $this->generate_combinations($base_forms); // Если количество отфильтрованных слов меньше общего количества слов, генерируем дополнительные комбинации. if ($filtered_count < $totals) { // Генерируем комбинации для отфильтрованных базовых форм. $add_combos = $this->generate_combinations($base_forms_filtered); // Добавляем каждую сгенерированную комбинацию в общий массив комбинаций. foreach ($add_combos as $cmb) { $combos[] = $cmb; } } // Инициализируем массив для хранения строк, полученных из комбинаций. $lines = array(); // Получаем общее количество комбинаций. $totals = count($combos); // Преобразуем каждую комбинацию в строку и добавляем ее в массив строк. for ($is = 0; $is < $totals; $is++) { $lines[] = implode(' ', $combos[$is]); } // Помечаем, что библиотека phpMorphy была успешно загружена. $phpmorphy_loaded = 1; } // Получаем список устройств из базы данных. $devices = SQLSelect("SELECT ID, TITLE, ALT_TITLES, TYPE, LINKED_OBJECT, LOCATION_ID FROM devices"); // Проходим по каждому устройству в полученном списке. foreach ($devices as $device) { // Если у устройства есть альтернативные названия. if (trim($device['ALT_TITLES']) != '') { // Разбиваем альтернативные названия по запятой. $nicknames = explode(',', trim($device['ALT_TITLES'])); // Проходим по каждому альтернативному названию. foreach ($nicknames as $nickname) { // Копируем текущее устройство. $add_rec = $device; // Заменяем название устройства на альтернативное. $add_rec['TITLE'] = $nickname; // Добавляем измененное устройство обратно в список устройств. $devices[] = $add_rec; } } } // Получаем список групп устройств из базы данных. $groups = SQLSelect("SELECT * FROM devices_groups"); // Получаем общее количество групп. $total = count($groups); // Проходим по каждой группе в полученном списке. for ($i = 0; $i < $total; $i++) { // Копируем текущую группу. $add_rec = $groups[$i]; // Устанавливаем тип группы как 'group'. $add_rec['TYPE'] = 'group'; // Добавляем группу обратно в список устройств. $devices[] = $add_rec; } // Получаем список комнат с устройствами из базы данных. $rooms = SQLSelect("SELECT locations.ID, locations.TITLE, COUNT(*) AS TOTAL FROM locations, devices WHERE locations.ID=devices.LOCATION_ID GROUP BY locations.ID"); // Проходим по каждой комнате в полученном списке. foreach ($rooms as $room) { //lights //if ($room['TITLE']=='Кабинет') { // Инициализируем массив для хранения типов устройств в комнате. $device_types = array(); // Получаем список устройств типа 'relay' в текущей комнате. $room_devices = SQLSelect("SELECT * FROM devices WHERE LOCATION_ID=" . $room['ID'] . " AND TYPE='relay'"); // Проходим по каждому устройству в полученном списке. foreach ($room_devices as $device) { // Получаем тип нагрузки устройства. $loadType = gg($device['LINKED_OBJECT'] . '.loadType'); // Добавляем устройство в массив типов устройств. $device_types[$loadType][] = $device; } // Если в комнате есть устройства типа 'light'. if (isset($device_types['light'])) { // Инициализируем массив для новой группы устройств. $add_rec = array(); // Устанавливаем тип группы как 'group'. $add_rec['TYPE'] = 'group'; // Устанавливаем название группы. $add_rec['TITLE'] = LANG_DEVICES_LOADTYPE_LIGHT . ' ' . $room['TITLE']; // Добавляем устройства типа 'light' в группу. $add_rec['DEVICES'] = $device_types['light']; // Устанавливаем типы применения группы. $add_rec['APPLY_TYPES'] = 'relay'; // Добавляем группу обратно в список устройств. $devices[] = $add_rec; // Инициализируем массив для новой группы устройств. $add_rec = array(); // Устанавливаем тип группы как 'group'. $add_rec['TYPE'] = 'group'; // Устанавливаем альтернативное название группы. $add_rec['TITLE'] = LANG_DEVICES_LOADTYPE_LIGHT_ALT . ' ' . $room['TITLE']; // Добавляем устройства типа 'light' в группу. $add_rec['DEVICES'] = $device_types['light']; // Устанавливаем типы применения группы. $add_rec['APPLY_TYPES'] = 'relay'; // Добавляем группу обратно в список устройств. $devices[] = $add_rec; } //} } // Если библиотека phpMorphy была успешно загружена. if ($phpmorphy_loaded) { // Получаем общее количество устройств. $total = count($devices); // Инициализируем массив для хранения дополнительных устройств. $add_devices = array(); // Проходим по каждому устройству в полученном списке. for ($i = 0; $i < $total; $i++) { // Получаем название устройства. $device_title = $devices[$i]['TITLE']; // Разбиваем название устройства на слова и преобразуем их в верхний регистр. $words = explode(' ', mb_strtoupper($device_title, 'UTF-8')); // Инициализируем массив для хранения базовых форм слов. $base_forms = array(); // Получаем общее количество слов. $totals = count($words); // Проходим по каждому слову в полученном списке. for ($is = 0; $is < $totals; $is++) { // Если слово является числом, добавляем его в массив базовых форм. if (preg_match('/^(\d+)$/', $words[$is])) { $base_forms[$is] = array($words[$is]); // Если слово не содержит специальных символов, получаем его базовую форму. } elseif (!preg_match('/[\(\)\+\.]/', $words[$is])) { // Преобразуем слово в верхний регистр. $Word = mb_strtoupper($words[$is], 'UTF-8'); // Получаем базовую форму слова. $base_form = $morphy->getBaseForm($Word); // Если базовая форма представлена в виде массива. if (is_array($base_form)) { $base_forms[$is] = $base_form; // Если базовая форма не представлена в виде массива. } else { $base_forms[$is] = array(); } // Если исходное слово не содержится в массиве базовых форм. if (!in_array($words[$is], $base_forms[$is])) { // Добавляем исходное слово в массив базовых форм. $base_forms[$is][] = $words[$is]; } // Если слово содержит специальные символы, добавляем его в массив базовых форм без изменений. } else { $base_forms[$is] = array($words[$is]); } } // Генерируем все возможные комбинации базовых форм слов. $combos = $this->generate_combinations($base_forms); // Инициализируем массив для хранения фраз, полученных из комбинаций. $phrases = array(); // Проходим по каждой комбинации в полученном списке. foreach ($combos as $combo) { // Вычисляем все возможные перестановки для текущей комбинации. $mutations = $this->computePermutations($combo); // Проходим по каждой перестановке в полученном списке. foreach ($mutations as $m) { // Преобразуем каждую перестановку в строку и добавляем ее в массив фраз. $phrases[] = implode(' ', $m); } } // Инициализируем массив для хранения новых названий устройств. $device_titles = array(); // Получаем общее количество фраз. $totals = count($phrases); // Проходим по каждой фразе в полученном списке. for ($is = 0; $is < $totals; $is++) { // Получаем новое название устройства. $new_title = $phrases[$is]; // Добавляем новое название устройства в массив новых названий. $device_titles[] = $new_title; // Копируем текущее устройство. $new_device = $devices[$i]; // Заменяем название устройства на новое. $new_device['TITLE'] = $new_title; // Сохраняем оригинальное название устройства. $new_device['ORIGINAL_TITLE'] = $device_title; // Добавляем измененное устройство в массив дополнительных устройств. $add_devices[] = $new_device; } } // Проходим по каждому устройству в массиве дополнительных устройств. foreach ($add_devices as $device) { // Добавляем устройство обратно в список устройств. $devices[] = $device; } } // Выводим содержимое переменной $lines для отладки. //dprint($lines,false); // Выводим содержимое переменной $devices для отладки. //dprint($devices); // Инициализируем переменную $compare_title командой. $compare_title = $command; // Проверяем, содержит ли команда фразу, указывающую на необходимость включения устройства. if (preg_match('/' . LANG_DEVICES_PATTERN_TURNON . '/uis', $compare_title, $m)) { // Если да, удаляем эту фразу из команды. $compare_title = trim(str_replace($m[0], ' ', $compare_title)); } // Проверяем, содержит ли команда фразу, указывающую на необходимость выключения устройства. if (preg_match('/' . LANG_DEVICES_PATTERN_TURNOFF . '/uis', $compare_title, $m)) { // Если да, удаляем эту фразу из команды. $compare_title = trim(str_replace($m[0], ' ', $compare_title)); } // Удаляем начальные слова "ть" и "те" из команды, если они присутствуют. $compare_title = trim(preg_replace('/^ть /', '', $compare_title)); $compare_title = trim(preg_replace('/^те /', '', $compare_title)); // Если после всех преобразований команда стала пустой, прекращаем выполнение скрипта. if ($compare_title == '') { return; } // Получаем общее количество устройств. $total = count($devices); // Проходим по каждому устройству в полученном списке. for ($i = 0; $i < $total; $i++) { // Инициализируем переменную для отслеживания, было ли найдено соответствие устройства. $device_matched = 0; // Если указано местоположение терминала. if ($location_id) { // Ищем строгое соответствие по названию и местоположению. foreach ($devices as $key => $value) { // Если ID местоположения устройства совпадает с ID местоположения терминала и название устройства совпадает с командой. if (in_array($location_id, $value) && strtolower($devices[$key]['TITLE']) == strtolower($compare_title)) { // Обновляем индекс текущего устройства. $i = $key; // Помечаем, что устройство найдено. $device_matched = 1; // Прерываем цикл. break; } } // Если устройство не найдено. if (!$device_matched) { // Ищем строгое соответствие по названию. foreach ($devices as $key => $value) { // Если название устройства совпадает с командой. if (in_array(strtolower($compare_title), strtolower($value))) { // Обновляем индекс текущего устройства. $i = $key; // Помечаем, что устройство найдено. $device_matched = 1; // Прерываем цикл. break; } } } } // Ищем по старому принципу. if (preg_match('/' . preg_quote($devices[$i]['TITLE']) . '/uis', $compare_title)) { // Помечаем, что устройство найдено. $device_matched = 1; } elseif (preg_match('/' . preg_quote($compare_title) . '/uis', $devices[$i]['TITLE'])) { // Помечаем, что устройство найдено. $device_matched = 1; // Если библиотека phpMorphy была успешно загружена. } elseif ($phpmorphy_loaded) { if (preg_match('/' . preg_quote($devices[$i]['TITLE']) . '/isu', implode('@@@@', $lines), $matches)) { // Помечаем, что устройство найдено. $device_matched = 1; } } /* if (preg_match('/свет над столом/uis',$devices[$i]['TITLE'])) { dprint($devices[$i]['TITLE'].' - '.$compare_title.': '.$device_matched); } */ // Если устройство было найдено. if ($device_matched) { // Найдено устройство. // Получаем ID устройства. $device_id = $devices[$i]['ID']; // Получаем тип устройства. $device_type = $devices[$i]['TYPE']; // Если у устройства есть оригинальное название. if ($devices[$i]['ORIGINAL_TITLE'] != '') { // Используем оригинальное название. $device_title = $devices[$i]['ORIGINAL_TITLE']; // Если оригинального названия нет. } else { // Используем текущее название. $device_title = $devices[$i]['TITLE']; } // Записываем сообщение о том, что устройство было найдено. DebMes("Device found for $command ($device_title)", 'simple_devices'); // Получаем связанный объект устройства. $linked_object = $devices[$i]['LINKED_OBJECT']; if ($device_type == 'sensor_percentage' || $device_type == 'sensor_humidity') { // Формируем сообщение для датчиков с процентами и влажностью. $reply_say = $device_title . ' ' . gg($linked_object . '.value') . '%'; // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'sensor_light') { // Формируем сообщение для датчиков света. $reply_say = $device_title . ' ' . gg($linked_object . '.value'); // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'sensor_temp') { // Формируем сообщение для датчиков температуры. $reply_say = $device_title . ' ' . gg($linked_object . '.value') . ' ' . LANG_DEVICES_DEGREES; // Помечаем, что команда была обработана. $processed = 1; } elseif (preg_match('/sensor/', $device_type)) { // Формируем сообщение для других датчиков. $reply_say = $device_title . ' ' . gg($linked_object . '.value') . ''; // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'counter') { // Формируем сообщение для счетчиков. $reply_say = $device_title . ' ' . gg($linked_object . '.value') . ' ' . gg($linked_object . '.unit'); // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'openclose') { // Формируем сообщение для устройств открытия/закрытия. $reply_say = $device_title . ' ' . (gg($linked_object . '.status') ? LANG_DEVICES_STATUS_CLOSED : LANG_DEVICES_STATUS_OPEN); // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'smoke' || $device_type == 'leak') { // Формируем сообщение для датчиков дыма и утечек. $reply_say = $device_title . ' ' . (gg($linked_object . '.status') ? LANG_DEVICES_STATUS_ALARM : LANG_DEVICES_NORMAL_VALUE); // Помечаем, что команда была обработана. $processed = 1; } elseif ($device_type == 'button') { // Добавляем код для имитации нажатия кнопки. $run_code .= "callMethod('$linked_object.pressed');"; // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. $reply_confirm = 1; } elseif ( $device_type == 'controller' || $device_type == 'relay' || $device_type == 'dimmer' || $device_type == 'rgb' ) { if (preg_match('/' . LANG_DEVICES_PATTERN_TURNON . '/uis', $command)) { // Формируем сообщение для включения устройства. $reply_say = LANG_TURNING_ON . ' ' . $device_title . $add_phrase; // Добавляем код для включения устройства. $run_code .= "callMethod('$linked_object.turnOn');"; // Добавляем код для выключения устройства в качестве противодействия. $opposite_code .= "callMethod('$linked_object.turnOff');"; // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } elseif (preg_match('/' . LANG_DEVICES_PATTERN_TURNOFF . '/uis', $command)) { // Формируем сообщение для выключения устройства. $reply_say = LANG_TURNING_OFF . ' ' . $device_title . $add_phrase; // Добавляем код для выключения устройства. $run_code .= "callMethod('$linked_object.turnOff');"; // Добавляем код для включения устройства в качестве противодействия. $opposite_code .= "callMethod('$linked_object.turnOn');"; // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } } elseif ($device_type == 'openable') { if (preg_match('/' . LANG_DEVICES_PATTERN_OPEN . '/uis', $command)) { // Формируем сообщение для открытия устройства. $reply_say = LANG_TURNING_OPEN . ' ' . $device_title . $add_phrase; // Добавляем код для открытия устройства. $run_code .= "callMethod('$linked_object.Open');"; // Добавляем код для закрытия устройства в качестве противодействия. $opposite_code .= "callMethod('$linked_object.Close');"; // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } elseif (preg_match('/' . LANG_DEVICES_PATTERN_CLOSE . '/uis', $command)) { // Формируем сообщение для закрытия устройства. $reply_say = LANG_TURNING_CLOSE . ' ' . $device_title . $add_phrase; // Добавляем код для закрытия устройства. $run_code .= "callMethod('$linked_object.Close');"; // Добавляем код для открытия устройства в качестве противодействия. $opposite_code .= "callMethod('$linked_object.Open');"; // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } } elseif ($device_type == 'group') { // Разбиваем типы применения группы по запятой. $applies_to = explode(',', $devices[$i]['APPLY_TYPES']); // Если устройства группы представлены в виде массива. if (is_array($devices[$i]['DEVICES'])) { // Инициализируем массив для хранения связанных объектов устройств в группе. $devices_in_group = array(); // Проходим по каждому устройству в группе. foreach ($devices[$i]['DEVICES'] as $group_device) { // Добавляем связанный объект устройства в массив. $devices_in_group[] = $group_device['LINKED_OBJECT']; } // Если устройства группы не представлены в виде массива. } else { // Получаем связанные объекты устройств в группе по свойству. $devices_in_group = getObjectsByProperty('group' . $devices[$i]['SYS_NAME'], 1); } // Выводим содержимое переменной $devices_in_group для отладки. //dprint($devices_in_group); // Если устройства группы не представлены в виде массива, пропускаем текущую итерацию цикла. if (!is_array($devices_in_group)) continue; if ( in_array('relay', $applies_to) || in_array('dimmer', $applies_to) || in_array('rgb', $applies_to) || 0 ) { if (preg_match('/' . LANG_DEVICES_PATTERN_TURNON . '/uis', $command)) { // Формируем сообщение для включения устройства. $reply_say = LANG_TURNING_ON . ' ' . $device_title . $add_phrase; foreach ($devices_in_group as $linked_object) { // Добавляем код для включения каждого устройства в группе. $run_code .= "callMethod('$linked_object.turnOn');"; // Добавляем код для выключения каждого устройства в группе в качестве противодействия. $opposite_code .= "callMethod('$linked_object.turnOff');"; } // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } elseif (preg_match('/' . LANG_DEVICES_PATTERN_TURNOFF . '/uis', $command)) { // Формируем сообщение для выключения устройства. $reply_say = LANG_TURNING_OFF . ' ' . $device_title . $add_phrase; foreach ($devices_in_group as $linked_object) { // Добавляем код для выключения каждого устройства в группе. $run_code .= "callMethod('$linked_object.turnOff');"; // Добавляем код для включения каждого устройства в группе в качестве противодействия. $opposite_code .= "callMethod('$linked_object.turnOn');"; } // Помечаем, что команда была обработана. $processed = 1; // Помечаем, что необходимо подтверждение выполнения команды. //$reply_confirm = 1; } } // Определяем путь к директории дополнений. $addons_dir = dirname(__FILE__) . '/addons'; // Если директория дополнений существует. if (is_dir($addons_dir)) { // Получаем список файлов в директории дополнений. $addon_files = scandir($addons_dir); // Проходим по каждому файлу в полученном списке. foreach ($addon_files as $file) { // Если имя файла соответствует шаблону. if (preg_match('/\_commands\.php$/', $file)) { // Подключаем файл дополнения. require($addons_dir . '/' . $file); } } } // Если команда была обработана, прерываем цикл. if ($processed) break; if ($run_code != '' && $period_delay > 0) { // Если есть код для выполнения и задержка больше 0, устанавливаем таймер для выполнения кода после задержки. setTimeout('delay' . md5($run_code), $run_code, $period_delay); } elseif ($run_code != '' && $period_run_for > 0 && $opposite_code != '') { // Если есть код для выполнения, продолжительность выполнения больше 0 и есть код для противодействия, выполняем код. eval($run_code); // Устанавливаем таймер для выполнения кода противодействия после указанного времени. setTimeout('opposite' . md5($run_code), $opposite_code, $period_run_for); } elseif ($run_code != '') { // Если есть код для выполнения, выполняем его. eval($run_code); /* * TODO использовать eval считается небезопасным, поскольку он выполняет произвольный PHP-код, представленный в виде строки. * Это может создать уязвимости в безопасности и снизить производительность, поскольку он компилирует и выполняет код каждый раз, * когда он вызывается. Это может привести к увеличению нагрузки на сервер и снижению производительности. */ } if ($reply_say != '') { // Если есть сообщение для ответа, отправляем его. sayReplySafe($reply_say, 2); } if ($reply_confirm) { // Разбиваем строку подтверждения команды по символу '|'. $items = explode('|', LANG_DEVICES_COMMAND_CONFIRMATION); // Удаляем пробелы в начале и конце каждого элемента массива. $items = array_map('trim', $items); // Отправляем случайное сообщение из массива подтверждений. sayReplySafe($items[array_rand($items)], 2); } if ($processed) { // Если команда была обработана, помечаем это. $details['PROCESSED'] = 1; // Помечаем, что необходимо прервать выполнение. $details['BREAK'] = 1; } } } }