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