<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://mdminfo.ru/index.php?action=history&amp;feed=atom&amp;title=Modules%2Fdevices%2Fdevices_links_actions_inc_php</id>
	<title>Modules/devices/devices links actions inc php - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://mdminfo.ru/index.php?action=history&amp;feed=atom&amp;title=Modules%2Fdevices%2Fdevices_links_actions_inc_php"/>
	<link rel="alternate" type="text/html" href="https://mdminfo.ru/index.php?title=Modules/devices/devices_links_actions_inc_php&amp;action=history"/>
	<updated>2026-06-02T15:16:03Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://mdminfo.ru/index.php?title=Modules/devices/devices_links_actions_inc_php&amp;diff=1961&amp;oldid=prev</id>
		<title>Elmax: + файл devices_links_actions.inc.php</title>
		<link rel="alternate" type="text/html" href="https://mdminfo.ru/index.php?title=Modules/devices/devices_links_actions_inc_php&amp;diff=1961&amp;oldid=prev"/>
		<updated>2024-03-30T20:48:51Z</updated>

		<summary type="html">&lt;p&gt;+ файл devices_links_actions.inc.php&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Modules/devices/devices_links_actions_inc_php | devices_links_actions.inc.php]]&lt;br /&gt;
&lt;br /&gt;
[[Папки и файлы|ᐂ В корневой раздел]]  [[Modules/devices|ᐃ В директорию расположения файла]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// Начинаем измерение времени выполнения функции homebridge_update&lt;br /&gt;
startMeasure('homebridge_update');&lt;br /&gt;
// Переменная для отладки синхронизации, инициализируется значением 0&lt;br /&gt;
$debug_sync = 0;&lt;br /&gt;
// Проверяем, не является ли устройство системным, не архивировано ли оно и доступен ли HomeBridge&lt;br /&gt;
if (!$device1['SYSTEM_DEVICE'] &amp;amp;&amp;amp; !$device1['ARCHIVED'] &amp;amp;&amp;amp; $this-&amp;gt;isHomeBridgeAvailable()) {&lt;br /&gt;
    // Отправляем обновленный статус в HomeKit&lt;br /&gt;
    require DIR_MODULES . 'devices/homebridgeSendUpdate.inc.php';&lt;br /&gt;
}&lt;br /&gt;
endMeasure('homebridge_update');&lt;br /&gt;
&lt;br /&gt;
// Начинаем измерение времени выполнения функции checkingLinks&lt;br /&gt;
startMeasure('checkingLinks');&lt;br /&gt;
// Получаем значение связанного объекта и преобразуем его в число с плавающей точкой&lt;br /&gt;
$value = (float)gg($device1['LINKED_OBJECT'] . '.value');&lt;br /&gt;
// Получаем статус связанного объекта и преобразуем его в число с плавающей точкой&lt;br /&gt;
$status = (float)gg($device1['LINKED_OBJECT'] . '.status');&lt;br /&gt;
&lt;br /&gt;
// Выполняем SQL-запрос для получения связанных устройств&lt;br /&gt;
$links = SQLSelect(&amp;quot;SELECT devices_linked.*, devices.LINKED_OBJECT FROM devices_linked LEFT JOIN devices ON devices_linked.DEVICE2_ID=devices.ID WHERE devices_linked.IS_ACTIVE=1 AND DEVICE1_ID=&amp;quot; . (int)$device1['ID']);&lt;br /&gt;
// Подсчитываем общее количество связанных устройств&lt;br /&gt;
$total = count($links);&lt;br /&gt;
// Начинаем цикл по всем связанным устройствам&lt;br /&gt;
for ($i = 0; $i &amp;lt; $total; $i++) {&lt;br /&gt;
    // Проверяем доступ к устройству&lt;br /&gt;
    if (!checkAccess('sdevice', $links[$i]['ID'])) continue;&lt;br /&gt;
    // Получаем тип связи&lt;br /&gt;
    $link_type = $links[$i]['LINK_TYPE'];&lt;br /&gt;
    // Десериализуем настройки связи&lt;br /&gt;
    $settings = unserialize($links[$i]['LINK_SETTINGS']);&lt;br /&gt;
    if ($device1['TYPE'] == 'button' &amp;amp;&amp;amp; !$status) continue;&lt;br /&gt;
    if ($device1['TYPE'] == 'motion' &amp;amp;&amp;amp; $settings['action_type'] != 'sync' &amp;amp;&amp;amp; $settings['action_type'] != 'sync_inverted' &amp;amp;&amp;amp; !$status) continue;&lt;br /&gt;
    $object = $links[$i]['LINKED_OBJECT'];&lt;br /&gt;
    // Формируем имя таймера&lt;br /&gt;
    $timer_name = 'linkTimer' . $links[$i]['ID'];&lt;br /&gt;
    // Инициализируем строку для действия&lt;br /&gt;
    $action_string = '';&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // Проверяем тип связи &lt;br /&gt;
    if ($link_type == 'switch_it') {&lt;br /&gt;
&lt;br /&gt;
        // Формируем строку действия в зависимости от типа действия&lt;br /&gt;
        if ($settings['action_type'] == 'turnoff') {&lt;br /&gt;
            // Выключаем объект&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        } elseif ($settings['action_type'] == 'turnon') {&lt;br /&gt;
            // Включаем объект&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        } elseif ($settings['action_type'] == 'switch') {&lt;br /&gt;
            // Переключаем объект&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.switch' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        } elseif ($settings['action_type'] == 'close') {&lt;br /&gt;
            // Закрываем объект&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.close' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        } elseif ($settings['action_type'] == 'open') {&lt;br /&gt;
            // Открываем объект&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.open' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        } elseif ($settings['action_type'] == 'sync') {&lt;br /&gt;
            // Синхронизируем статус объекта&lt;br /&gt;
            if ($status) {&lt;br /&gt;
                $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            } else {&lt;br /&gt;
                $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            }&lt;br /&gt;
        } elseif ($settings['action_type'] == 'sync_inverted') {&lt;br /&gt;
            // Синхронизируем инвертированный статус объекта  &lt;br /&gt;
            if (!$status) {&lt;br /&gt;
                $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            } else {&lt;br /&gt;
                $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // Добавляем задержку, если нужно&lt;br /&gt;
        if ($settings['action_delay'] != '') {&lt;br /&gt;
            $settings['action_delay'] = (int)processTitle($settings['action_delay']);&lt;br /&gt;
            if ($settings['action_delay'] &amp;gt; 0) {&lt;br /&gt;
                $action_string = 'setTimeout(\'' . $timer_name . '\',\'' . $action_string . '\',' . (int)$settings['action_delay'] . ');';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    } elseif ($link_type == 'switch_timer') {&lt;br /&gt;
        // Формируем таймерное действие&lt;br /&gt;
        $timer_name = $object . '_switch_timer';&lt;br /&gt;
        $action_string = '';&lt;br /&gt;
        if ($settings['darktime']) {&lt;br /&gt;
            // проверка активен ли режим DarknessMode&lt;br /&gt;
            $action_string .= 'if (gg(&amp;quot;DarknessMode.active&amp;quot;)) {';&lt;br /&gt;
        }&lt;br /&gt;
        // включение&lt;br /&gt;
        $action_string .= 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        if ($settings['action_delay'] != '') {&lt;br /&gt;
            $settings['action_delay'] = (int)processTitle($settings['action_delay']);&lt;br /&gt;
            if ($settings['action_delay'] &amp;gt; 0) {&lt;br /&gt;
                $action_string .= 'setTimeout(\'' . $timer_name . '\',\'' . 'callMethod(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));' . '\',' . (int)$settings['action_delay'] . ');';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if ($settings['darktime']) {&lt;br /&gt;
            $action_string .= '}';&lt;br /&gt;
        }&lt;br /&gt;
    } elseif ($link_type == 'set_color') {&lt;br /&gt;
        $action_string = 'callMethodSafe(&amp;quot;' . $object . '.setColor' . '&amp;quot;,array(&amp;quot;color&amp;quot;=&amp;gt;&amp;quot;' . $settings['action_color'] . '&amp;quot;,&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        // Добавляем задержку выключения, если нужно&lt;br /&gt;
        if ($settings['action_delay'] != '') {&lt;br /&gt;
            $settings['action_delay'] = (int)processTitle($settings['action_delay']);&lt;br /&gt;
            if ($settings['action_delay'] &amp;gt; 0) {&lt;br /&gt;
                $action_string = 'setTimeout(\'' . $timer_name . '\',\'' . $action_string . '\',' . (int)$settings['action_delay'] . ');';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // -----------------------------------------------------------------&lt;br /&gt;
        // -----------------------------------------------------------------&lt;br /&gt;
        // Код для обработки действий по типу 'sensor_switch'&lt;br /&gt;
    } elseif ($link_type == 'sensor_switch') {&lt;br /&gt;
        // Если тип действия равен 'turnoff' и статус объекта активен, то выключаем объект&lt;br /&gt;
        if ($settings['action_type'] == 'turnoff' &amp;amp;&amp;amp; gg($object . '.status')) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            // Если тип действия равен 'turnon' и статус объекта не активен, то включаем объект&lt;br /&gt;
        } elseif ($settings['action_type'] == 'turnon' &amp;amp;&amp;amp; !gg($object . '.status')) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            // Если тип действия равен 'open' и статус объекта активен, то открываем объект&lt;br /&gt;
        } elseif ($settings['action_type'] == 'open' &amp;amp;&amp;amp; gg($object . '.status')) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.open' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
            // Если тип действия равен 'close' и статус объекта не активен, то закрываем объект&lt;br /&gt;
        } elseif ($settings['action_type'] == 'close' &amp;amp;&amp;amp; !gg($object . '.status')) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.close' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Если указан тип источника значения, то получаем среднее, минимальное или максимальное значение за указанный период&lt;br /&gt;
        if ($settings['source_value_type'] != '') {&lt;br /&gt;
            // Преобразуем время периода в целое число&lt;br /&gt;
            $period = (int)$settings['source_value_time'];&lt;br /&gt;
            // Если период меньше 1, устанавливаем его равным 1&lt;br /&gt;
            if ($period &amp;lt; 1) $period = 1;&lt;br /&gt;
            // Если тип источника значения равен 'avg', получаем среднее значение за указанный период&lt;br /&gt;
            if ($settings['source_value_type'] == 'avg') {&lt;br /&gt;
                $value = getHistoryAvg($device1['LINKED_OBJECT'] . '.value', (-1) * $period);&lt;br /&gt;
                // Если тип источника значения равен 'min', получаем минимальное значение за указанный период&lt;br /&gt;
            } elseif ($settings['source_value_type'] == 'min') {&lt;br /&gt;
                $value = getHistoryMin($device1['LINKED_OBJECT'] . '.value', (-1) * $period);&lt;br /&gt;
                // Если тип источника значения равен 'max', получаем максимальное значение за указанный период&lt;br /&gt;
            } elseif ($settings['source_value_type'] == 'max') {&lt;br /&gt;
                $value = getHistoryMax($device1['LINKED_OBJECT'] . '.value', (-1) * $period);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Если указан тип условия и значение соответствует условию, то выполняем действие&lt;br /&gt;
        if ($settings['condition_type'] == 'above' &amp;amp;&amp;amp; $value &amp;gt;= (float)$settings['condition_value']) {&lt;br /&gt;
            // Выполняем действие&lt;br /&gt;
        } elseif ($settings['condition_type'] == 'below' &amp;amp;&amp;amp; $value &amp;lt; (float)$settings['condition_value']) {&lt;br /&gt;
            // Выполняем действие&lt;br /&gt;
        } else {&lt;br /&gt;
            // Если условие не выполняется, то не выполняем действие&lt;br /&gt;
            $action_string = '';&lt;br /&gt;
        }&lt;br /&gt;
    } elseif ($link_type == 'sensor_pass') {&lt;br /&gt;
        // Код для обработки действий по типу 'sensor_pass'&lt;br /&gt;
        // Передаем значение объекта&lt;br /&gt;
        $action_string = 'sg(&amp;quot;' . $object . '.value' . '&amp;quot;,&amp;quot;' . $value . '&amp;quot;);';&lt;br /&gt;
        // Код для обработки действий по типу 'open_sensor_pass'&lt;br /&gt;
    } elseif ($link_type == 'open_sensor_pass') {&lt;br /&gt;
        // Передаем статус объекта&lt;br /&gt;
        $action_string = 'sg(&amp;quot;' . $object . '.status' . '&amp;quot;,&amp;quot;' . $status . '&amp;quot;);';&lt;br /&gt;
        // Код для обработки действий по типу 'thermostat_switch'&lt;br /&gt;
    } elseif ($link_type == 'thermostat_switch') {&lt;br /&gt;
        // Определяем значение для установки&lt;br /&gt;
        $set_value = 0;&lt;br /&gt;
        // Получаем текущий статус реле&lt;br /&gt;
        $current_relay_status = gg($device1['LINKED_OBJECT'] . '.relay_status');&lt;br /&gt;
        // Получаем текущий статус цели&lt;br /&gt;
        $current_target_status = gg($object . '.status');&lt;br /&gt;
        // Если нужно инвертировать статус, то инвертируем значение&lt;br /&gt;
        if ($settings['invert_status']) {&lt;br /&gt;
            $set_value = $current_relay_status ? 0 : 1;&lt;br /&gt;
        } else {&lt;br /&gt;
            $set_value = $current_relay_status;&lt;br /&gt;
        }&lt;br /&gt;
        // Если значение установлено и текущий статус цели не активен, то включаем объект&lt;br /&gt;
        if ($set_value &amp;amp;&amp;amp; !$current_target_status) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOn' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        // Если значение не установлено и текущий статус цели активен, то выключаем объект&lt;br /&gt;
        } elseif (!$set_value &amp;amp;&amp;amp; $current_target_status) {&lt;br /&gt;
            $action_string = 'callMethodSafe(&amp;quot;' . $object . '.turnOff' . '&amp;quot;,array(&amp;quot;link_source&amp;quot;=&amp;gt;&amp;quot;' . $device1['LINKED_OBJECT'] . '&amp;quot;));';&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Определяем директорию для дополнений&lt;br /&gt;
    $addons_dir = dirname(__FILE__) . '/addons';&lt;br /&gt;
    if (is_dir($addons_dir)) {&lt;br /&gt;
        // Получаем список файлов в директории дополнений&lt;br /&gt;
        $addon_files = scandir($addons_dir);&lt;br /&gt;
        foreach ($addon_files as $file) {&lt;br /&gt;
            if (preg_match('/\_links_actions\.php$/', $file)) {&lt;br /&gt;
                // Подключаем дополнительные скрипты для обработки действий&lt;br /&gt;
                require($addons_dir . '/' . $file);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    if ($action_string != '') {&lt;br /&gt;
        //DebMes(&amp;quot;Action string: &amp;quot;.$action_string,'logic_test');&lt;br /&gt;
        try {&lt;br /&gt;
            $code = $action_string;&lt;br /&gt;
            // Выполняем код действия&lt;br /&gt;
            $success = eval($code);&lt;br /&gt;
            if ($success === false) {&lt;br /&gt;
                // Регистрируем ошибку, если код выполнился неудачно&lt;br /&gt;
                registerError('linked_device', sprintf('Error in linked device code &amp;quot;%s&amp;quot;. Code: %s', $link_type, $code));&lt;br /&gt;
            }&lt;br /&gt;
        } catch (Exception $e) {&lt;br /&gt;
            // Регистрируем ошибку, если возникло исключение&lt;br /&gt;
            registerError('linked_device', sprintf('Error in script &amp;quot;%s&amp;quot;: ' . $e-&amp;gt;getMessage(), $link_type));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Завершаем измерение времени выполнения функции checkingLinks&lt;br /&gt;
    endMeasure('checkingLinks');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elmax</name></author>
	</entry>
</feed>