[Модуль] Uniel Controllers (uniel)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Вс дек 04, 2016 12:59 pm

Ошибку нашел, но незнаю как исправить этот кусок кода:

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

 //check outputs
   $outputs=SQLSelect("SELECT * FROM unielproperties WHERE DEVICE_ID='".$rec['ID']."' AND TYPE=1 ORDER BY NUM");
   $result=$this->sendDeviceCommand($rec['ID'], 0x0b, array(0x00, 0x00, 0x00));
   if (isset($result[4])) {
    $value=decbin($result[4]); //ошибку вызывает эта операция,чтобы всё работало $value должна быть массивом что-то вроде $value=array(0,0,1,0,0,0,0,1); сконвертировать в массив - не умею.
    //print_r($result);
    //echo $value."<br/>";
    $total=count($outputs);
    for($i=0;$i<$total;$i++) {
     $old_value=$outputs[$i]['CURRENT_VALUE'];
     if ($rec['TYPE']=='dimmer' && $value[(int)$outputs[$i]['NUM']]=='1') {
      $result=$this->sendDeviceCommand($rec['ID'], 0x05, array(0x00, 0x40+(int)$outputs[$i]['NUM'], 0x00));
      if (isset($result[4])) {
       $level=(int)$result[4];
       $outputs[$i]['CURRENT_VALUE']=$level;
      }
     } else {
      $outputs[$i]['CURRENT_VALUE']=(int)$value[(int)$outputs[$i]['NUM']]; // почему не использовать $value[$i] вместо (int)$value[(int)$outputs[$i]['NUM']]
     }
     SQLUpdate('unielproperties', $outputs[$i]);

     if ($outputs[$i]['LINKED_OBJECT'] && $outputs[$i]['LINKED_PROPERTY']) {
      if ($old_value!=$outputs[$i]['CURRENT_VALUE'] || $outputs[$i]['CURRENT_VALUE']!=gg($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'])) {
      }
      setGlobal($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'], $outputs[$i]['CURRENT_VALUE'], array($this->name=>'0'));
     }


    }
   }
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Пн дек 05, 2016 2:58 am

Решение найдено:

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

 //check outputs
   $outputs=SQLSelect("SELECT * FROM unielproperties WHERE DEVICE_ID='".$rec['ID']."' AND TYPE=1 ORDER B$
   $result=$this->sendDeviceCommand($rec['ID'], 0x0b, array(0x00, 0x00, 0x00));
   if (isset($result[4])) {
    //$value=decbin($result[4]);
    //print_r($result);
    //echo $value."<br/>";
    $ret = decbin($result[4]); 
    while(strlen($ret) < 8)
        {
         $ret = "0".$ret;
        }  
    $value = array_reverse(str_split($ret));

    $total=count($outputs);
    for($i=0;$i<$total;$i++) {
     $old_value=$outputs[$i]['CURRENT_VALUE'];
     if ($rec['TYPE']=='dimmer' && $value[(int)$outputs[$i]['NUM']]=='1') {
      $result=$this->sendDeviceCommand($rec['ID'], 0x05, array(0x00, 0x40+(int)$outputs[$i]['NUM'], 0x00$
      if (isset($result[4])) {
       $level=(int)$result[4];
       $outputs[$i]['CURRENT_VALUE']=$level;
      }
     } else {
      $outputs[$i]['CURRENT_VALUE']=$value[$i];//(int)$value[(int)$outputs[$i]['NUM']];
     }
     SQLUpdate('unielproperties', $outputs[$i]);

     if ($outputs[$i]['LINKED_OBJECT'] && $outputs[$i]['LINKED_PROPERTY']) {
      if ($old_value!=$outputs[$i]['CURRENT_VALUE'] || $outputs[$i]['CURRENT_VALUE']!=gg($outputs[$i]['L$
      }
      setGlobal($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'], $outputs[$i]['CURRENT$
     }


    }
   }
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Модуль работы с контроллерами Uniel

Сообщение sergejey » Пн дек 05, 2016 11:11 am

Спасибо, внёс изменение

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Пн дек 05, 2016 3:37 pm

Косяки в работе слайдера связаны с тем что в диммер заложена коррекция на реальную яркость (на мой взгляд хрень какая-то )
05.12.2016 13:11, Дмитрий пишет:

Добрый день. Вопрос по диммеру ламп накаливания Ydom.
Скажите с чем может быть связано, что на всех каналах диммер не выставляет яркость в 255 (максимум выставляется 245) и работает как-то странно например в программе управления я задаю яркость канала 50, а получаю 76, задаю 120, а получаю 123 может я сбил какую-то настройку?
Все верно. Тут учтена специфика ламп накаливания и работы симистора - симистор не может открыться при нулевом входном напряжении, а открывается при напряжении несколько вольт, так что примерно 4% времени (в самом начале) диммер остается закрытым, при этом потеря в мощности (а мощность в общем примерно как напряжение в квадрате) совсем невелика и составляет около 0,15%. Также учтена нелинейность (синус!) зависимости напряжения от времени, так что когда вы задаете % мощности, в трее "ответ" показано значение времени (пропорционально, единица соответсвует 255), в течении которого симистор открыт. Так что все у вас работает нормально, вы задаете % мощности, ответ - % времени.

Сергей
Дмитрий пишет:

Можно как-то отключить/исключить эту коррекцию?
Она приводит к тому что программа управления с обратной связью не может нормально отработать и выглядит это вот так:

https://www.youtube.com/watch?v=CNRBZNl ... e=youtu.be

Скажем для лабораторных работ это важно, а для хозяйки клацнувшей выключатель не имеет значения лампа потребляет 100% мощности или 99,85%. По этому хотелось бы получать заданное значение, очень не хочется городить код приводящий ответ к к нужному значению.
Нет, простыми средствами нельзя. Вы можете в программе обратной связи сделать функцию (например, табличную), преобразующую нормированные значения в относительные.

Если эта коррекция принципиальна, то я могу сделать прошивку без коррекции, но это будет стоить 200$ в рублях по курсу, на любое количество модулей. Так что думаю преобразовать значения в вашей программе будет проще и дешевле.

Сергей

Функция нормировки

char Norm(char L2n)
{
char tNorm;
char Tabl[]={0,11,22,28,32,35,38,40,42,44,46,48};


if((L2n>10) && (L2n<245))
tNorm=(char) ( 48+ ( (float)(255-L2n-10))*0.6766 );
else
{
if(L2n<11)
tNorm=255-Tabl[L2n];
else
{
tNorm=Tabl[255-L2n];
if (tNorm<0x0A)
tNorm=0x0A;

};

};
return(tNorm);


}


чтобы не потерять добавлю:
05.12.2016 16:21, Дмитрий пишет:

В диммере есть два уровня яркости: назначенный через порт и предустановленный с кнопки. Можно ли выставлять предустановленный для кнопки уровень через порт?

Да вроде можно, это параметры 0х12....0х19.
Сергей
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Чт янв 05, 2017 6:16 pm

периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Модуль работы с контроллерами Uniel

Сообщение sergejey » Чт янв 05, 2017 11:33 pm

DAP писал(а):периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.
Посмотрите файл лога этого цикла -- в нём должна быть какая-то информация на момент падения.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Чт фев 02, 2017 11:20 pm

sergejey писал(а):
DAP писал(а):периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.
Посмотрите файл лога этого цикла -- в нём должна быть какая-то информация на момент падения.
информации нет но происходит вот что : Цикл какое-то время работает и останавливается (зависает не отключаясь) иногда помогает перезапуск программы-шлюза ser2net
я добавил условие раз в 1000 опросов перезапускать ser2net, как можно ограничить время выполнения $unl->updateDevices(); пытался так: добавил при каждой итерации вызов set_time_limit(10); и включив авторестарт цикла но это не приводит к результату, цикл не отключается по таймауту.
vsevolod.trofimov
Сообщения: 22
Зарегистрирован: Вт авг 30, 2016 10:11 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Модуль работы с контроллерами Uniel

Сообщение vsevolod.trofimov » Пт фев 24, 2017 9:03 pm

Модуль настроил как на скриншоте. А каким образом, например, включить свет? Или отрегулировать яркость? Можно скрин?
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: Модуль работы с контроллерами Uniel

Сообщение DAP » Вс фев 26, 2017 6:01 pm

vsevolod.trofimov писал(а):Модуль настроил как на скриншоте. А каким образом, например, включить свет? Или отрегулировать яркость? Можно скрин?
Если вы о диммере -то измените связанное с каналом свойство.

Внес еще несколько изменений в модуль - теперь он корректно обрабвтывает яркость в диммере ламп накаливания и проверяет контрольную сумму ответа, но никак не могу победить зависание раз в два - три часа set_time_limit() не помогает. Есть в пхп аналог set_time_limit() включающий всё время выполнения без исключений? Или как автоматом убивать/перезапускать цикл если он завис?
vsevolod.trofimov
Сообщения: 22
Зарегистрирован: Вт авг 30, 2016 10:11 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Модуль работы с контроллерами Uniel

Сообщение vsevolod.trofimov » Пн фев 27, 2017 7:27 pm

что-то не могу разобраться. свойство прикрепил, но каким бы его не установил - ничего не меняется. может быть дело в настройках шлюза eth-rs485? я пробовал режимы tcp client и tcp server - результат одинаковый. у меня на странице появилось 7 input и 7 output - это правильно. Это считывается с устройства или 7+7 у всех?

по поводу цикла - я правильно понимаю, что скрипт должен постоянно крутиться в памяти, но вырубается по таймауту? можно еще max_execution_time, но вообще надо посмотреть что phpinfo() выдает для начала по поводу лимитов. он может вырубиться еще по лимиту памяти, например. что инициирует его запуск?
Вложения
2017-02-27_19-10-30.png
2017-02-27_19-10-30.png (56.62 КБ) 6333 просмотра
Ответить