Modules/devices/homebridgeSendUpdate inc php

Материал из MajorDoMo инфо

ᐂ В корневой раздел ᐃ В директорию расположения файла

<?php

// Создание пустого массива под названием $payload
$payload = array();
// Добавление в массив $payload элемента 'name' со значением из $device1['LINKED_OBJECT']
$payload['name'] = $device1['LINKED_OBJECT'];
// Добавление в массив $payload элемента 'service_name' со значением из $device1['TITLE']
$payload['service_name'] = $device1['TITLE'];

// Создание второго пустого массива под названием $payload2
$payload2 = array();
// Добавление в массив $payload2 элемента 'name' со значением из $device1['LINKED_OBJECT']
$payload2['name'] = $device1['LINKED_OBJECT'];
// Добавление в массив $payload2 элемента 'service_name' со значением из $device1['TITLE']
$payload2['service_name'] = $device1['TITLE'];

// Закомментированный код, который, вероятно, должен был выводить сообщение об обновлении Homebridge
//DebMes("Homebridge Update ".$device1['LINKED_OBJECT']." (".$device1['TYPE']."): ".gg($device1['LINKED_OBJECT'] . '.status')." / ".gg($device1['LINKED_OBJECT'] . '.value'),'homebridge');

// Выбор типа устройства
switch ($device1['TYPE']) {
        // Если тип устройства - реле
    case 'relay':
        // Получение типа нагрузки для реле
        $load_type = gg($device1['LINKED_OBJECT'] . '.loadType');
        // Если тип нагрузки - свет
        if ($load_type == 'light') $payload['service'] = 'Lightbulb';
        // Если тип нагрузки - вентилятор
        elseif ($load_type == 'vent') $payload['service'] = 'Fan';
        // Если тип нагрузки - переключатель
        elseif ($load_type == 'switch') $payload['service'] = 'Switch';
        // Если тип нагрузки не указан, считаем его выходом
        else $payload['service'] = 'Outlet';
        // Установка характеристики для реле
        $payload['characteristic'] = 'On';
        // Проверка статуса устройства
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если устройство включено, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если устройство выключено, устанавливаем значение false
            $payload['value'] = false;
        }
        // Прерывание выполнения кода для данного случая
        break;

        // Если тип устройства - датчик температуры
    case 'sensor_temp':
        // Установка сервиса для датчика температуры
        $payload['service'] = 'TemperatureSensor';
        // Установка характеристики для текущей температуры
        $payload['characteristic'] = 'CurrentTemperature';
        // Получение значения температуры
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.value');
        break;
        // Если тип устройства - датчик CO2
    case 'sensor_co2':
        // Установка сервиса для датчика CO2
        $payload['service'] = 'CarbonDioxideSensor';
        // Установка характеристики для уровня CO2
        $payload['characteristic'] = 'CarbonDioxideLevel';
        // Получение значения уровня CO2
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.value');

        // Получение максимального уровня CO2
        $max_level = gg($device1['LINKED_OBJECT'] . '.maxValue');
        if (!$max_level) {
            // Если максимальный уровень не указан, устанавливаем значение по умолчанию
            $max_level = 1200;
        }
        // Установка сервиса для датчика CO2 во втором массиве
        $payload2['service'] = 'CarbonDioxideSensor';
        // Установка характеристики для обнаружения CO2
        $payload2['characteristic'] = 'CarbonDioxideDetected';
        if ($payload['value'] >= $max_level) {
            // Если уровень CO2 превышает максимальный, устанавливаем значение обнаружения
            $payload2['value'] = "1";
        } else {
            // Если уровень CO2 не превышает максимальный, устанавливаем значение отсутствия обнаружения
            $payload2['value'] = "0";
        }
        break;
        // Если тип устройства - датчик влажности
    case 'sensor_humidity':
        // Установка сервиса для датчика влажности
        $payload['service'] = 'HumiditySensor';
        // Установка характеристики для текущей относительной влажности
        $payload['characteristic'] = 'CurrentRelativeHumidity';
        // Получение значения относительной влажности
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.value');
        break;
        // Если тип устройства - датчик движения
    case 'motion':
        // Установка сервиса для датчика движения
        $payload['service'] = 'MotionSensor';
        // Установка характеристики для обнаружения движения
        $payload['characteristic'] = 'MotionDetected';
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если обнаружено движение, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если движение не обнаружено, устанавливаем значение false
            $payload['value'] = false;
        }
        break;
        // Если тип устройства - датчик дыма
    case 'smoke':
        // Установка сервиса для датчика дыма
        $payload['service'] = 'SmokeSensor';
        // Установка характеристики для обнаружения дыма
        $payload['characteristic'] = 'SmokeDetected';
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если обнаружен дым, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если дым не обнаружен, устанавливаем значение false
            $payload['value'] = false;
        }
        break;
        // Если тип устройства - датчик утечки
    case 'leak':
        // Установка сервиса для датчика утечки
        $payload['service'] = 'LeakSensor';
        // Установка характеристики для обнаружения утечки
        $payload['characteristic'] = 'LeakDetected';
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если обнаружена утечка, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если утечка не обнаружена, устанавливаем значение false
            $payload['value'] = false;
        }
        break;
        // Если тип устройства - датчик освещенности
    case 'sensor_light':
        // Установка сервиса для датчика освещенности
        $payload['service'] = 'LightSensor';
        // Установка характеристики для текущего уровня освещенности
        $payload['characteristic'] = 'CurrentAmbientLightLevel';
        // Получение значения уровня освещенности
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.value');
        break;
        // Если тип устройства - датчик открытия/закрытия
    case 'openclose':
        // Установка сервиса для датчика открытия/закрытия
        $payload['service'] = 'ContactSensor';
        // Установка характеристики для состояния датчика открытия/закрытия
        $payload['characteristic'] = 'ContactSensorState';
        // Проверка типа датчика (NO/NC)
        $nc = gg($device1['LINKED_OBJECT'] . '.ncno') == 'nc';
        // Установка значения в зависимости от типа датчика
        $payload['value'] = $nc ? 1 - gg($device1['LINKED_OBJECT'] . '.status') : gg($device1['LINKED_OBJECT'] . '.status');
        break;
        // Если тип устройства - открываемое устройство
    case 'openable':
        // Получение типа открываемого устройства
        $open_type = gg($device1['LINKED_OBJECT'] . '.openType');
        if ($open_type == 'gates') {
            // Установка сервиса для открывателя гаражных дверей
            $payload['service'] = 'GarageDoorOpener';
        } elseif ($open_type == 'door') {
            // Установка сервиса для двери
            $payload['service'] = 'Door';
        } elseif ($open_type == 'window') {
            // Установка сервиса для окна
            $payload['service'] = 'Window';
        } elseif ($open_type == 'curtains') {
            // Установка сервиса для жалюзи
            $payload['service'] = 'WindowCovering';
        } elseif ($open_type == 'shutters') {
            // Установка сервиса для штор
            $payload['service'] = 'WindowCovering';
        }
        if ($payload['service']) {
            if ($open_type == 'gates') {
                if (gg($device1['LINKED_OBJECT'] . '.status')) {
                    // Если дверь открыта, устанавливаем значение 1
                    $payload['value'] = "1";
                } else {
                    // Если дверь закрыта, устанавливаем значение 0
                    $payload['value'] = "0";
                }

                // Установка характеристики для текущего состояния двери
                $payload['characteristic'] = 'CurrentDoorState';
                if ($debug_sync) {
                    // Вывод сообщения для отладки
                    DebMes("MQTT to_set : " . json_encode($payload), 'homebridge');
                }
                // Отправка данных в Homebridge
                sg('HomeBridge.to_set', json_encode($payload));
                /*
            if ($debug_sync) {
            // Вывод сообщения для отладки
                DebMes("MQTT to_set : " . json_encode($payload), 'homebridge');
            }
            // Установка характеристики для целевого состояния двери
            $payload['characteristic'] = 'TargetDoorState';
            */

                // Удаление сервиса из массива
                unset($payload['service']);
                // Если тип открываемого устройства - дверь, окно, жалюзи или шторы
            } elseif ($open_type == 'door' || $open_type == 'window' || $open_type == 'curtains' || $open_type == 'shutters') {
                // Установка характеристики для текущей позиции
                $payload['characteristic'] = 'CurrentPosition';
                if (gg($device1['LINKED_OBJECT'] . '.status')) {
                    // Если устройство закрыто, устанавливаем значение 0
                    $payload['value'] = "0";
                } else {
                    // Если устройство открыто, устанавливаем значение 100
                    $payload['value'] = "100";
                }
                if ($debug_sync) {
                    // Вывод сообщения для отладки
                    DebMes("MQTT to_set : " . json_encode($payload), 'homebridge');
                }
                // Отправка данных в Homebridge
                sg('HomeBridge.to_set', json_encode($payload));
                // Установка характеристики для целевой позиции
                $payload['characteristic'] = 'TargetPosition';
                // Отправка данных в Homebridge
                sg('HomeBridge.to_set', json_encode($payload));
                // Удаление сервиса из массива
                unset($payload['service']);
            }
        }
        break;
        // Если тип устройства - RGB лампа
    case 'rgb':
        // Установка сервиса для лампы
        $payload['service'] = 'Lightbulb';
        // Добавление лампы в Homebridge
        sg('HomeBridge.to_add', json_encode($payload));

        // Установка характеристики для включения/выключения
        $payload['characteristic'] = 'On';
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если лампа включена, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если лампа выключена, устанавливаем значение false
            $payload['value'] = false;
        }
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));

        // Установка характеристики для оттенка
        $payload['characteristic'] = 'Hue';
        // Получение значения оттенка
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.hue');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));

        // Установка характеристики для насыщенности
        $payload['characteristic'] = 'Saturation';
        // Получение значения насыщенности
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.saturation');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));

        // Установка характеристики для яркости
        $payload['characteristic'] = 'Brightness';
        // Получение значения яркости
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.brightness');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));
        // Удаление сервиса из массива
        unset($payload['service']);
        break;
        // Если тип устройства - LED лампа
    case 'ledlamp':
        // Установка сервиса для лампы
        $payload['service'] = 'Lightbulb';
        // Добавление лампы в Homebridge
        sg('HomeBridge.to_add', json_encode($payload));

        // Установка характеристики для включения/выключения
        $payload['characteristic'] = 'On';
        if (gg($device1['LINKED_OBJECT'] . '.status')) {
            // Если лампа включена, устанавливаем значение true
            $payload['value'] = true;
        } else {
            // Если лампа выключена, устанавливаем значение false
            $payload['value'] = false;
        }
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));


        // Установка характеристики для яркости
        $payload['characteristic'] = 'Brightness';
        // Получение значения яркости
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.brightness');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));
        // Удаление сервиса из массива
        unset($payload['service']);
        break;

        // Если тип устройства - термостат
    case 'thermostat':
        // Установка характеристики для текущей температуры
        $payload['characteristic'] = 'CurrentTemperature';
        // Получение значения текущей температуры
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.value');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));

        // Установка характеристики для целевой температуры
        $payload['characteristic'] = 'TargetTemperature';
        // Получение значения целевой температуры
        $payload['value'] = gg($device1['LINKED_OBJECT'] . '.currentTargetValue');
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', json_encode($payload));
        // Установка характеристики для текущего состояния обогрева/охлаждения
        $payload['characteristic'] = 'CurrentHeatingCoolingState'; //off = 0, heat = 1, and cool = 2, auto = 3
        if (!gg($device1['LINKED_OBJECT'] . '.disabled')) {
            if (gg($device1['LINKED_OBJECT'] . '.status')) {
                // Если термостат включен, устанавливаем значение 1 (нагрев)
                $payload['value'] = 1;
            } else {
                // Если термостат выключен, устанавливаем значение 2 (охлаждение)
                $payload['value'] = 2;
            }
        } else {
            // Если термостат отключен, устанавливаем значение 0 (выключено)
            $payload['value'] = 0;
        }
        break;
        /*
    // Если тип устройства - датчик батареи
case 'sensor_battery':
    // Установка сервиса для датчика батареи
    $payload['service']='BatteryService'; 
    // Добавление датчика батареи в Homebridge
    sg('HomeBridge.to_add',json_encode($payload)); 
    // Характеристика для уровня заряда батареи
    // Characteristic.BatteryLevel; 
    // Характеристика для состояния зарядки
    // Characteristic.ChargingState; 0 - NOT_CHARGING, 1 - CHARGING, 2 - NOT_CHARGEABLE 
    // Характеристика для состояния низкого уровня батареи
    // Characteristic.StatusLowBattery; 
    // Установка характеристики для уровня заряда батареи
    $payload['characteristic'] = 'BatteryLevel'; 
    // Получение значения уровня заряда батареи
    $payload['value']=gg($device1['LINKED_OBJECT'].'.value'); 
    // Отправка данных в Homebridge
    sg('HomeBridge.to_set',json_encode($payload)); 

    // Установка характеристики для состояния зарядки
    $payload['characteristic'] = 'ChargingState'; 
    // Установка значения для состояния зарядки (2 - NOT_CHARGEABLE)
    $payload['value']=2; 
    // Отправка данных в Homebridge
    sg('HomeBridge.to_set',json_encode($payload)); 

    // Установка характеристики для состояния низкого уровня батареи
    $payload['characteristic'] = 'StatusLowBattery'; 
    // Установка значения в зависимости от нормального значения батареи
    $payload['value']=gg($device1['LINKED_OBJECT'].'.normalValue') ? 0 : 1; 
    // Отправка данных в Homebridge
    sg('HomeBridge.to_set',json_encode($payload)); 

    break;
    */
        // Если тип устройства не соответствует ни одному из предыдущих случаев
    default:
        // Формирование пути к дополнению для обработки данного типа устройства
        $addon_path = dirname(__FILE__) . '/addons/' . $device1['TYPE'] . '_homebridgeSendUpdate.php';
        // Проверка существования файла дополнения
        if (file_exists($addon_path)) {
            // Подключение файла дополнения для обработки данного типа устройства
            require($addon_path);
        }
}
// Проверка наличия сервиса в массиве $payload
if (isset($payload['service'])) {
    // Формирование имени ключа для кэша
    $hmName = 'hmb:' . $payload['name'];
    // Кодирование данных $payload в формате JSON
    $payload_encoded = json_encode($payload);
    // Вычисление хеш-кода данных $payload
    $hmValue = md5($payload_encoded);
    // Сравнение хеш-кода данных $payload с хеш-кодом из кэша
    if (checkFromCache($hmName) != $hmValue) {
        // Если хеш-коды не совпадают, сохраняем новый хеш-код в кэш
        saveToCache($hmName, $hmValue);
        // Если включена отладка, выводим сообщение для отладки
        if ($debug_sync) {
            DebMes("MQTT to_set : " . $payload_encoded, 'homebridge');
        }
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', $payload_encoded);
    }
}
// Проверка наличия сервиса во втором массиве $payload2
if (isset($payload2['service'])) {
    // Формирование имени ключа для кэша
    $hmName = 'hmb:' . $payload2['name'];
    // Кодирование данных $payload2 в формате JSON
    $payload2_encoded = json_encode($payload2);
    // Вычисление хеш-кода данных $payload2
    $hmValue = md5($payload2_encoded);
    // Сравнение хеш-кода данных $payload2 с хеш-кодом из кэша
    if (checkFromCache($hmName) != $hmValue) {
        // Если хеш-коды не совпадают, сохраняем новый хеш-код в кэш
        saveToCache($hmName, $hmValue);
        // Если включена отладка, выводим сообщение для отладки
        if ($debug_sync) {
            DebMes("MQTT to_set : " . $payload2_encoded, 'homebridge');
        }
        // Отправка данных в Homebridge
        sg('HomeBridge.to_set', $payload2_encoded);
    }
}