[Модуль] MegaD (megad)

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

Модератор: immortal

fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Вт мар 20, 2018 10:33 am

Подскажите пожалуйста, есть 1wbus - 2 датчика
Создал сценарий "opros" и закинул в него скрипт:

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

//Задаем массив датчиков: [матка => [номер свойства, доступность, показание]]
    $tempSensors = [
        "ff8a6d801402" => [1, false, -1],
        "ffd565801402" => [2, false, -1],
//        "ff2790c00000" => [3, false, -1],
    ];
//не зарегистрированный датчики на шине
    $notRegSensors = "";
//Получаем строку с меги и делим ее по датчикам в массив
    //$listTemps = "ff2790c11604:24.18;fff7b0b31603:23.81";
    $listTemps = file_get_contents("http://192.168.1.50/sec/?pt=30&cmd=list");
    $temps = explode( ';', $listTemps);
    print_r ($temps);
//Сравнивая метки пишем показания, меняя доступность
    foreach($temps as $temp){
        $temp = explode( ':', $temp);
        if(array_key_exists($temp[0], $tempSensors)){
            $tempSensors[$temp[0]][1] = true;
             $tempSensors[$temp[0]][2] = $temp[1];
        }else{//пишем не найденные датчики в свойство
            $notRegSensors = $notRegSensors."$temp[0]; ";
        }
    }
//обновляем свойства
    foreach($tempSensors as $key => $sensor){
     $this->setProperty($sensor[0], $sensor[2]);
    }
    $this->setProperty("notRegSensors", $notRegSensors); 
какие объекты мне надо создать и в каком классе, чтобы разложить два значения температуры на разные объекты?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Вт мар 20, 2018 10:58 am

fedotov_andrey писал(а):какие объекты мне надо создать и в каком классе, чтобы разложить два значения температуры на разные объекты?
Чисто технически можно создать любые объекты в любом классе и писать туда. Но в Мажордомо уже есть "предустановленный" класс для температурных датчиков. Не помню как он называется (система не "под рукой"), но что-то типа "TempSensors". Было бы логично добавлять туда.
За это сообщение автора Chainik поблагодарил:
fedotov_andrey (Вт мар 20, 2018 9:11 pm)
Рейтинг: 1.16%
fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Вт мар 20, 2018 11:42 am

Chainik писал(а):Чисто технически можно создать любые объекты в любом классе и писать туда. Но в Мажордомо уже есть "предустановленный" класс для температурных датчиков. Не помню как он называется (система не "под рукой"), но что-то типа "TempSensors". Было бы логично добавлять туда.
Есть SDevices - SSensors - STempSensors
Как назвать сами объекты, куда скрипт будет записывать данные с датчика?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Вт мар 20, 2018 12:09 pm

fedotov_andrey писал(а):Есть SDevices - SSensors - STempSensors
Как назвать сами объекты, куда скрипт будет записывать данные с датчика?
А... у вас "Простые устройства"... Тут я пас, поскольку этот модуль не использую. Может вам лучше в ветке по простым устройствам спросить, как там правильно все делать.
fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Вт мар 20, 2018 1:55 pm

А... у вас "Простые устройства"... Тут я пас, поскольку этот модуль не использую. Может вам лучше в ветке по простым устройствам спросить, как там правильно все делать.
Да нет, это я просто нашел из уже созданных.
Я могу создать сам, любой объект, просто как в него записать значения.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Вт мар 20, 2018 3:08 pm

Тогда так:

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

$T = Тут_формируется_ваше_значение;
sg('Имя_объекта.Имя_свойства',$T);
Если значение температуры для каждого объекта в классе будет запрашиваться "общеклассовым" методом (что, конечно, предпочтительнее), то тогда так:

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

$T = Тут_формируется_ваше_значение;
$this->setProperty('Имя_свойства',$T);
Думаю, вам будет полезно взглянуть вот сюда (https://ab-log.ru/forum/viewtopic.php?f=1&t=1328). В самом конце длинного первого поста про освещение после подзаголовка "ДОПОЛНЕНИЕ". Вот там, как мне представляется, показан идеологически верный подход к организации программной части в Мажордомо при использовании Мег.
За это сообщение автора Chainik поблагодарил:
fedotov_andrey (Вт мар 20, 2018 9:10 pm)
Рейтинг: 1.16%
fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Вт мар 20, 2018 8:44 pm

Chainik писал(а):Тогда так:

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

$T = Тут_формируется_ваше_значение;
sg('Имя_объекта.Имя_свойства',$T); 
Если значение температуры для каждого объекта в классе будет запрашиваться "общеклассовым" методом (что, конечно, предпочтительнее), то тогда так:

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

$T = Тут_формируется_ваше_значение;
$this->setProperty('Имя_свойства',$T); 
Спасибо Вам за помощь, чуть позже распишу как я сделал. Остался один нюанс. Значения получаю и раскладываю их в нужные объекты. Как настроить периодический опрос датчиков?
Т.е. я создал класс TemperatureSensors, в нем объект temp_1wbus. Есть метод TemperatureSensors-> UpdateValue в который я как раз и прописал скрипт опроса меги и разбора значений.
Самое простое я так понимаю повесить в крон, но правильно ли это?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Вт мар 20, 2018 9:06 pm

fedotov_andrey писал(а):... Остался один нюанс. Значения получаю и раскладываю их в нужные объекты. Как настроить периодический опрос датчиков?
Т.е. я создал класс TemperatureSensors, в нем объект temp_1wbus. Есть метод TemperatureSensors-> UpdateValue в который я как раз и прописал скрипт опроса меги и разбора значений.
Самое простое я так понимаю повесить в крон, но правильно ли это?
Это правильно. В Мажордомо даже есть модуль Cron. Но я сам им не пользуюсь, поэтому что там и как настроить, не подскажу.
Но есть вариант проще. Можно дописать в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»)

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

if ($m%5 == 0) {callMethod('temp_1wbus.UpdateValue');}
Этот код будет раз в 5 минут запускать метод "UpdateValue".
Единственное, обычно в качестве объектов используют единичные датчики, куда пишут с них значения. У вас же, если я правильно понял, в качестве объекта целая шина. Как-то нетипично (мне думается, так будет неудобно использовать).

Потом, если надумаете строить графики, не забудте в Свойстве, куда пишется температура, включить историю (этот параметр для свойства задается из класса).
За это сообщение автора Chainik поблагодарил:
fedotov_andrey (Вт мар 20, 2018 9:10 pm)
Рейтинг: 1.16%
fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Вт мар 20, 2018 9:13 pm

Огромное спасибо, все работает как часы!
Чуть позже сделаю инструкцию для таких же как я :)
fedotov_andrey
Сообщения: 28
Зарегистрирован: Пн июн 05, 2017 1:57 pm
Благодарил (а): 16 раз
Поблагодарили: 0

Re: Модуль "MegaD"

Сообщение fedotov_andrey » Ср мар 21, 2018 12:49 am

Получение показаний с датчиков температуры, которые подключены на MegaD шиной 1wbus.
На стороне меги настройку не рассматриваю, тут думаю и так все понятно.
1. Создаем в объектах класс, например "TemperatureSensors"
2. Создаем объект в этом классе, например "temp_1wbus"
3. Создаем новый метод, например "UpdateValue"
В методе прописываем код:

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

//Задаем массив датчиков: [матка => [номер свойства, доступность, показание]]
    $tempSensors = [
        "ff8a6d801402" => [1, false, -1],
        "ffd565801402" => [2, false, -1],
//      "ff2790c00000" => [3, false, -1],
    ];
//не зарегистрированный датчики на шине
    $notRegSensors = "";
//Получаем строку с меги и делим ее по датчикам в массив
    //$listTemps = "ff2790c11604:24.18;fff7b0b31603:23.81";
    $listTemps = file_get_contents("http://192.168.1.50/sec/?pt=30&cmd=list");
    $temps = explode( ';', $listTemps);
    //print_r ($temps);
//Сравнивая метки пишем показания, меняя доступность
    foreach($temps as $temp){
        $temp = explode( ':', $temp);
        if(array_key_exists($temp[0], $tempSensors)){
            $tempSensors[$temp[0]][1] = true;
             $tempSensors[$temp[0]][2] = $temp[1];
        }else{//пишем не найденные датчики в свойство
            $notRegSensors = $notRegSensors."$temp[0]; ";
        }
    }
//обновляем свойства
    foreach($tempSensors as $key => $sensor){
     $this->setProperty($sensor[0], $sensor[2]);
    }
    $this->setProperty("notRegSensors", $notRegSensors); 
где ff8a6d801402 и ffd565801402 - это адреса наших датчиков.
192.168.1.50 - ip MegaD
?pt=30 - порт, на котором висят наши датчики

4. Привязываем порт MegaD к объекту "temp_1wbus"
5. Устанавливаем модуль Cron
6. Создаем задание, которое вырлдняется раз в минуту (*/1 * * * *) выполняя следующий код:

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

callMethod('temp_1wbus.UpdateValue');
Ответить