Подружить GSM-сигнализацию и умный дом по JSON

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

mrsavelio
Сообщения: 17
Зарегистрирован: Пн май 15, 2017 9:15 pm
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Подружить GSM-сигнализацию и умный дом по JSON

Сообщение mrsavelio » Вт май 16, 2017 3:39 pm

Silowar писал(а):Как у Вас подключена ССU? Можно начать с этого.
локально, в дальнейшем думаю будет через инет, но пока что хочу разобраться локально
Silowar
Сообщения: 85
Зарегистрирован: Пт фев 06, 2015 10:19 am
Благодарил (а): 16 раз
Поблагодарили: 9 раз

Re: Подружить GSM-сигнализацию и умный дом по JSON

Сообщение Silowar » Вт май 16, 2017 3:56 pm

Самый простой способ управлять выходами и состоянием это getUrl:

Код: Выделить всё

Устанавливаем выход 3 в состояние 1
getUrl('http://localhost:8080/data.cgx?cmd={"Command":"SetOutputState","Number":3,"State":1}',0,'admin','pass') 
или так
СпойлерПоказать

Код: Выделить всё

# Имя пользователя для доступа к серверу ccu.sh.

$jsonUser = "admin";

# Пароль для доступа к серверу ccu.sh
$jsonPass = "pass";

# Функция HTTP Basic аутентификации и обращения к JSON.
function http_auth_get($url,$username,$password){
    $cred = sprintf('Authorization: Basic %s',
    base64_encode("$username:$password"));
    $opts = array('http'=>array('method'=>'GET','header'=>$cred));
    $ctx = stream_context_create($opts);
    $handle = fopen ( $url, 'r', false,$ctx);

    return stream_get_contents($handle);
}
# Устанавливаем 3 выход в состояние 1, на самом деле исполняется сценарий
$json = http_auth_get('http://localhost:8080/data.cgx?cmd={"Command":"SetOutputState","Number":3,"State":1}',$jsonUser,$jsonPass);


 
Дальше можно считывать состояние и разбирать JSON.
СпойлерПоказать

Код: Выделить всё

<?php

# Имя пользователя для доступа к серверу ccu.sh должно быть введено в формате user@IMEI.
# IMEI должен состоять из 15 десятичных цифр и совпадать с IMEI контроллера.
# Имя для локального доступа вводиться без IMEI.
$jsonUser = "admin";

# Пароль для доступа к серверу ccu.sh
$jsonPass = "pass";

# Функция HTTP Basic аутентификации и обращения к JSON.
function http_auth_get($url,$username,$password){
    $cred = sprintf('Authorization: Basic %s',
    base64_encode("$username:$password"));
    $opts = array('http'=>array('method'=>'GET','header'=>$cred));
    $ctx = stream_context_create($opts);
    $handle = fopen ( $url, 'r', false,$ctx);

    return stream_get_contents($handle);
}
# Устанавливаем 5 выход в состояние 1, на самом деле исполняется сценарий
$json = http_auth_get('http://localhost:8080/data.cgx?cmd={"Command":"GetStateAndEvents"}',$jsonUser,$jsonPass);
$obj = json_decode($json, TRUE);

# Если массив пустой (нет связи с контроллером) тогда выжидаем паузу в 10 секунд и делаем ещё запрос (бывает, что из-за плохого GPRS, контроллер не может ответить с первого раза).
/*if( empty($obj) ) {
    echo "\nНет связи с контроллером!\n\n";
    echo "\nВторая попытка JSON запроса. Пауза 10 сек.\n\n";
    sleep(10);
    $json = http_auth_get('http://localhost:8080/data.cgx?cmd={"Command":"GetStateAndEvents"}',$jsonUser,$jsonPass);
    $obj = json_decode($json, TRUE);
}*/

# Если ЕСТЬ связь с контроллером (массив непустой), то обрабатываем массив полученный из JSON.
if( !empty($obj) ) {
    
    # Извлекам данные из массива.
    $input = $obj['Inputs'];

    # Вход 1. Датчик RTD-03, температура в помещении.
    $input1 = $input['0'];
    # Преобразуем дискреты на входе контроллера в напряжение.
    $inputVoltage1 = $input1['Voltage']*10/4095;
    # Используя формулу из uGuard преобразуем напряжение в градусы и округляем до десятых.
    $inputVoltageRtd1 = round(($inputVoltage1/5-0.5)/0.01,1);

    # Вход 2. Датчик RTD-03, температура на улице.
    $input2 = $input['1'];
    # Преобразуем дискреты на входе контроллера в напряжение.
    $inputVoltage2 = $input2['Voltage']*10/4095;
    # Используя формулу из uGuard преобразуем напряжение в градусы и округляем до десятых.
    $inputVoltageRtd2 = round(($inputVoltage2/5-0.5)/0.01,1);

    # Вход 3. Датчик RTD-03, температура .
    $input3 = $input['2'];
    # Преобразуем дискреты на входе контроллера в напряжение.
    $inputVoltage3 = $input3['Voltage']*10/4095;
    # Используя формулу из uGuard преобразуем напряжение в градусы и округляем до десятых.
    $inputVoltageRtd3 = round(($inputVoltage2/5-0.5)/0.01,1);
    
    # Вход 9. Датчик Digital, Датчик движения.
    $input9 = $input['8'];
    # Присваиваем статус Active .
    $inputActive9 = $input9['Active'];
    
    # Вход 10. Датчик Digital,  Датчик движения.
    $input10 = $input['9'];
    # Присваиваем статус Active 
    $inputActive10 = $input10['Active'];
    
    # Вход 11. Датчик Digital,  Датчик движения.
    $input11 = $input['10'];
    # Присваиваем статус Active.
    $inputActive11 = $input11['Active'];

    # Вход 12. Датчик Digital,  Датчик движения.
    $input12 = $input['11'];
    # Присваиваем статус Active.
    $inputActive12 = $input12['Active'];

    # Вход 13. Датчик Digital,  Датчик движения.
    $input13 = $input['12'];
    # Присваиваем статус Active.
    $inputActive13 = $input13['Active'];
    
    # Вход 14. Датчик Digital,  Геркон.
    $input14 = $input['13'];
    # Присваиваем статус Active.
    $inputActive14 = $input14['Active'];
    
    # Заряд аккумулятора.
    $battery = $obj['Battery'];
    $batteryCharge = $battery['Charge'];
    

    # Состояние охраны.
    $Partitions = $obj['Partitions'];
    $PartitionsState = $Partitions['0'];
    
    # Температура CCU.
    $ccuTemp = round($obj['Temp'],1);
    # Напряжение питания CCU.
    $ccuVolt = round($obj['Power'],1);
    # Баланс на SIM карте.
    $ccuBalance = $obj['Balance'];
    

} else {
    # Если нет связи с сконтроллером (массив пустой), то все переменные обунляем.
    $inputVoltageRtd1 = 0;
    $inputVoltageRtd2 = 0;
    $inputVoltageRtd3 = 0;
    
    $inputActive9 = 0;
    $inputActive10 = 0;
    $inputActive11 = 0;
    $inputActive12 = 0;
    $inputActive13 = 0;
    $inputActive14 = 0;    
    
    $batteryCharge = 0;
    $ccuTemp = 0;
    $ccuVolt = 0;
    $ccuBalance = 0;
    
    
    echo "\nNo connection to CCU!\n\n";

}

# Отображение полученных значений (для диагностики проблем).
echo "Temp: $inputVoltageRtd1:$inputVoltageRtd2:$ccuTemp \n";
echo "Active: $inputActive9:$inputActive10:$inputActive11:$inputActive12:$inputActive13:$inputActive14 \n";
echo "Voltage: $ccuVolt \n"; 
echo "Balance: $ccuBalance \n";
echo "BatteryCharge: $batteryCharge \n";
echo "PartitionsState: $PartitionsState \n";


?>

В скрипте если надо ставим setglobal для тех переменных, которые нас интересуют и практически все.
Для полноценной работы в МДМ из скрипта надо убрать echo и писать в Debmes. Ну и добавить вызов самого себя с выжиданием паузы, которая вас устраивает.
Наверное как-то так.

Может кто решиться оформить в модуль, или подскажет как это сделать,я пока не смог.

Уже год, у меня работает управление выходами, к которым подключен привод ворот. Вроде стабильно. Задержка срабатывания 3-5 секунд.

Первоначальную информацию как работать с ССU нашел на просторах инета, вот тут http://4ham.ru/grafiki_gsm_kontroller_ccu825/
Все взято от туда.

Вроде была где-то тема отдельная про CCU, но я не нашел её. Можно будет отдельную тему создать, где будет название контроллера CCU825.
За это сообщение автора Silowar поблагодарил:
madbob (Вт май 16, 2017 10:28 pm)
Рейтинг: 1.16%
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Подружить GSM-сигнализацию и умный дом по JSON

Сообщение nick7zmail » Вт май 16, 2017 6:15 pm

Silowar писал(а): Может кто решиться оформить в модуль, или подскажет как это сделать,я пока не смог.
https://www.youtube.com/watch?v=_NL3r_CzwzY
Вот, давно записывал.

Сейчас есть модульбилдер http://majordomo.smartliving.ru/mbuilder/
Скелет модуля за вас создаёт, ничего не надо переименовывать. Но суть осталась та же...и функции тоже. Так же можете глянуть примеры модулей из маркета (по кнопке Src в маркете качаются исходники)
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить