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); } }