Страница 1 из 6

MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Пн окт 06, 2014 8:01 pm
Bagir
Изображение
  • Статус подключения: Подключено
  • Категория: MegaD
  • Фирма: ab-log.ru
  • Модель: MegaD-328
  • Название: Контроллер ввода/вывода
  • Описание: Позволяет решать очень многие задачи в домашней автоматизации и может стать одним из ключевых элементов системы Умный Дом. Устройство ориентировано, прежде всего, на тех людей, которые заинтересованы в создании интеллектуального дома своими руками, однако оно может также представлять интерес и для интеграторов, монтажных организаций.
  • Ссылка на сайт каталога производителя: ab-log.ru
  • Тип питания: 12V-
  • Магазин:ab-log.ru
    • Приблизительная цена: 4500 руб (01.10.2014)
  • Достоинства: Готовый модуль
  • Недостатки: не выявлены
  • Инструкция
  • MajorDomo
    Суть: Есть класс MegaD. В нем объекты всех Мег. Файл megad.php должен быть в корневом каталоге, где лежат файлы сайта. Он запускается Мегами, и получает от них параметры. Код в этом файле ищет объект Меги в Классе MegaD по mdid или IP адресу, и запускает метод incomingMessage объекта Меги с передачей ему параметров. А в этом методе объекта каждой Меги уже указано кому, что и как передать. С управлением немного по другому. Есть общий метод класса. В самих методах объектов ничего нет и не нужно. Общий метод собирает строку на основе переданных параметров и свойств конкретного объекта Меги.
    Другими словами, идеология такая: как были у нас объекты датчиков и реле в классах keySensors и Relays, так там и остались. А класс MegaD со своими объектами MegaD1, MegaD2 ... Выступает в роли связующего звена наших объектов с железом. Плюсы - я легко могу переключить датчик с входа MegaD например на 1-Wire или Z-Wave. Да хоть куда. А в МД мне будет достаточно просто поправить его объект. Отвязать от класса MegaD и связать, например, с Z-Wave. Так же и наоборот.
    Я не хочу ориентировать этот класс на какие то конкретные задачи, будь то управление освещением или же контроль охранных датчиков. Каждый решит для себя это сам. Задача - завести в систему события от Меги, и сделать управление ее выходами.

    Что уже сделано и история изменений:
    1. Работа с несколькими Мегами.
    2. Получение от Меги сообщения о нажатии кнопки, подключенной к порту, настроенному как вход.
    3. Управление выходом. Установка статуса вкл и выкл.
    4. Принудительный опрос состояния порта.
    4.1 Добавил опрос двух АЦП портов.
    5. Реакция на двойное нажатие.
    6. Реакция на долгое нажатие.
    7. Обработка параметра all.
    8. Опрос встроенного датчика температуры.
    9. Отлов разных комбинаций нажатий кнопки. Двойное, тройное, долгое, отпускание и т.д. Требуется дополнительно функция registeredEventDetails()
  • Обсуждение устройства
  • megad-328-api

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Пн дек 08, 2014 4:30 am
Bagir
Выложил обновление файла и класса.

Запись событий в лог выведена в настройку. Теперь по умолчанию пишутся только критические записи, чего при обычной работе вполне достаточно. Можно как и раньше включить запись всех событий, что весьма полезно при отладке, или выключить логирование полностью. В файле megad.php и методе getData класса MegaD для этого есть переменная $reclog, которая может быть установлена как 0-нет, 1-только крит, 2-все.

Добавлена возможность опроса встроенного датчика температуры. Летом в жару шкафы могут сильно нагреваться, а зимой интересно на сколько там холодно. Кроме того, периодический опрос температуры заменяет ping и постоянно проверяет всю цепочку передачи данных. Немного проблематично, что это будет работать только начиная с версии прошивки 3.25 Но Мега отлично прошивается не требуя демонтажа и непосредственного доступа к ней. К тому же в новых версиях прошивки исправляются обнаруженные баги. Если же у вас нет в планах обновлять прошивку, то вариант с заменой пинга на опрос температуры все равно будет работать. Вот только температура не будет писаться в свойство объекта Меги. Но свойство alive все равно будет устанавливаться как 1 на время aliveTimeOut. Все сделано по аналогии с родными классами. Используя свойство alive можно организовать проверку в методе checkState объекта System класса systemStates. Это совершенно не нагрузит его, т.к. будет проверяться только само свойство alive и только. Пример кода в этом методе выложу позже.
Периодический опрос меги, я предлагаю поместить в метод onNewMinute класса Timer. Я думаю будет достаточно проверять каждые 5 минут. А интервал живучести выставить в 10-15 минут.

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

// Опрос температуры всех Мегадевайсов
if (!($m%5)) {
  $objects = getObjectsByClass('MegaD'); 
  foreach ($objects as $obj) {
    if (getGlobal($obj['TITLE'].'.ipAddress')) {
      callMethod($obj['TITLE'].'.getData', array('port'=>'tget')); 
    }
  }
}
В этом коде каждые 5 минут будет перебор всех объектов класса MegaD и запуск их методов getData с параметром tget.

В классе представлены 4 объекта MegaD1 - MegaD4 в которых пока практически нет кода, и MegaD99 с примерами и описанием. MegaD99 это шаблон. А MegaD1-MegaD4 это уже объекты реальных Мег с конкретным кодом для каждой. Я оставил их в классе для будущих примеров.

Устранен баг со свойством alive.

Переписан код отлова разных комбинаций нажатий. Работает отлично, но в этом коде я использую свою функцию registeredEventDetails() чтобы из базы данных получать детали события Event. Вот ссыль на эту тему http://smartliving.ru/forum/viewtopic.php?f=4&t=1956
Если кто еще не в курсе, предлагаю освоить момент, как писать и добавлять свои функции в МД. Это очень просто. Открываем на диске путь где лежат файлы МД. Забираемся вот сюда ...\majordomo\lib\ Создаем там файлик, например my.class.php Пишем в него код своей функции

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

<?php
/*
* Свои дополнительные функции
*/

// Получить детали события по его имени
function registeredEventDetails($eventName) {
 $even=SQLSelectOne("SELECT * FROM events WHERE EVENT_NAME='".$eventName."'"); 
 if (is_array ($even )) {
  return $even['DETAILS'];
 } else {
  return false;
 }
}

?>
Вот как бы и все. Теперь функция из этого файла будет доступна из любого места. Во вложении в самом начале я прицепил свой файлик my.class.php В нем есть эта и еще несколько других полезных дополнительных функций. Возможно они будут тоже вам интересны.

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Сб мар 21, 2015 10:48 pm
AHgpeu
если уважаемый Bagir не будет сильно против, чуть дополню его великолепную работу одним методом для класса MegaD
(это просто немного видоизменённая функция setOutput для работы с ШИМ-выходами):
работает начиная с ver 3.28

Название:

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

setOutputPWM
Описание:

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

команда на изменение яркости для ШИМ
В качестве параметров требуются $params['port'] (10 или 12 или 13), $params['value'] (0-255) и $params['time'] (время нарастания / спада) 
Код:

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

$reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все )

// Открывает лог если нужно
if ($reclog) { $log = getLogger($this); }

$cmdUrl = sprintf('http://%s/%s/?pt=%d&pwm=%d&cnt=%d', 
                    $this->getProperty('IpAddress'), $this->getProperty('Password'),
                    intval($params['port']), intval($params['value']), intval($params['time']));
// Запись данных в лог
if ($reclog == 2) {
  $log->trace('setOutputPWM method: '.$cmdUrl);
}
getURL($cmdUrl, 0); 
может быть, кому-то понадобится

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Вс мар 22, 2015 8:33 am
mirsum
А MegaD случаем самостоятельно из arduino не собирается?

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Вс мар 22, 2015 9:41 am
Bagir
Собирается еще как. И кто то из наших уже делали, и на форуме ab-log.ru я видел обсуждения. Если есть время и в добавок на ТЫ с паяльником и программатором, то и карты в руки.

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Вс мар 22, 2015 10:00 pm
Jager
mirsum писал(а):А MegaD случаем самостоятельно из arduino не собирается?
Легко. У меня так выглядит
Изображение

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Вс мар 22, 2015 10:45 pm
Bagir
AHgpeu писал(а):если уважаемый Bagir не будет сильно против
Да я только за! Сейчас у меня пока нет каналов для использования ШИМ. Но они точно будут. Пробовать было не на чем, а собрать тестовое железо на столе все руки не доходили. Постараюсь вскоре добавить этот метод.

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Ср мар 25, 2015 2:22 pm
AirKing
AHgpeu писал(а):если уважаемый Bagir не будет сильно против, чуть дополню его великолепную работу одним методом для класса MegaD
(это просто немного видоизменённая функция setOutput для работы с ШИМ-выходами):
работает начиная с ver 3.28

Название:

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

setOutputPWM
Описание:

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

команда на изменение яркости для ШИМ
В качестве параметров требуются $params['port'] (10 или 12 или 13), $params['value'] (0-255) и $params['time'] (время нарастания / спада)
Код:

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

$reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все )

// Открывает лог если нужно
if ($reclog) { $log = getLogger($this); }

$cmdUrl = sprintf('http://%s/%s/?pt=%d&pwm=%d&cnt=%d', 
                    $this->getProperty('IpAddress'), $this->getProperty('Password'),
                    intval($params['port']), intval($params['value']), intval($params['time']));
// Запись данных в лог
if ($reclog == 2) {
  $log->trace('setOutputPWM method: '.$cmdUrl);
}
getURL($cmdUrl, 0);
может быть, кому-то понадобится
Незнаю, бага или фича.
Занимательная вещь получается если в параметр  $params['value'] (0-255) отправить любое отрицательное число.
Это не ошибка данного метода, если указывать в URL ?pt=10&pwm=-1&cnt=2 тоже самое получится.

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Ср мар 25, 2015 3:11 pm
LutsenkoDenis
В приведенном коде на первой сроке указано: $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все )

Далее по коду есть условие только для $reclog = 2

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

if ($reclog == 2) {
  $log->trace('setOutputPWM method: '.$cmdUrl);
} 
Где $reclog = 1 ?

Re: MegaD, ab-log.ru, MegaD-328, Контроллер ввода/вывода

Добавлено: Ср мар 25, 2015 3:46 pm
AirKing
LutsenkoDenis писал(а):В приведенном коде на первой сроке указано: $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все )

Далее по коду есть условие только для $reclog = 2

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

if ($reclog == 2) {
  $log->trace('setOutputPWM method: '.$cmdUrl);
}
Где $reclog = 1 ?
Я подозреваю что тут

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

// Открывает лог если нужно
if ($reclog) { $log = getLogger($this); }