Для управления реле в системе умного дома возможно использовать различные способы, это и ESP8266 и готовые блоки реле и управление с помощью Arduino по http через Ethernet шилд, но в данной статье речь пойдет об управлении реле непосредственно подключенных к GPIO OrangePi PC (Апельсинка) или через uart Апельсинки.Как работать с GPIO, UART и i2c можно прочитать в статье, данную статью рекомендуется изучить для включения портов UART и установки WiringOP, если же Вы используете мои готовые образы DietPi или Armbian то там все это уже настроено.
Видео управления реле из консоли Апельсинки и о муках выбора.
Для управления реле в системе MajorDoMo предусмотрен класс Relays в котором необходимо создать объекты, каждый объект это одно реле, в системе по умолчанию уже имеется объект Switch1. У класса Relays имеются методы, которые наследуются объектам класса Relays, то есть методы Relays будут выполняться во всех объектах если в объекте данные метод не переопределен.
Методы класса Relays
Методы объекта Switch1, наследуемые от класса Relays, то есть метод выполняется в классе Relays
Преимущество использования методов в классе состоит в том, что не надо для каждого объекта использовать свой метод и прописывать в каждом методе объекта свой код, что упрощает разработку.
Вот так выглядят методы Объекта Switch1 если методы отличаются от аналогичных методов класса
и в дереве Классов и Объектов
Но для отправки команд на управление реле у разных объектов будут разные команды и по этому необходимо каждому объекту прописать свою команду, в статье Умный дом. клацкаем светом. я уже рассказывал как это делать, однако описанные варианты на мой взгляд неудобны. В случае если Вы решили использовать команды управления реле через методы объектов, то в методах turnOff И turnOn пишем команды управления реле.
Если у Вас реле подключены к GPIO или UART Апельсинки то код будет аналогичный коду из консоли описанный в статье OrangePi PC работаем с GPIO, UART и i2c, только необходимо добавить команду вызова exec, и получается следующий код для GPIO:
exec ("gpio -1 write 29 1"); и exec ("gpio -1 write 29 0");
и для UART (команда на ардуино с прошитым универсальным скетчем из статьи )
exec ("echo 1103 > /dev/ttyS3"); и exec ("echo 1003 > /dev/ttyS3");
для включения и выключения ,скорее всего реле у Вас инверсные и поэтому логический 0 включает реле, логическая 1 выключает реле.
Однако при большом количестве реле на мой взгляд не удобно прописывать данный код в методах объектов, по этому обработку мы будем делать в сценарии. Так же из-за того, что при работе с uart портом во время посылке данных в порт порт становиться занятым, то способ обработки в сценарии scene_switch описанный с статье Умный дом. клацкаем светом. не подходит, поскольку команды будут отсылаться на все реле не зависимо изменилось состояние реле или нет и соответственно после отсылки первой команды в UART порт вторая не может послать в UART порт поскольку он становиться ещё занятым. Я пробовал при стандартной скорости порта 9600, возможно при другой скорости порта такой проблемы не будет. Однако обработка описанная в статье по моему мнению неправильная поскольку повторно посылает состояние реле даже если оно не изменилось.
Для того, чтобы сценарий scene_switch обрабатывал только события конкретного объекта нам надо в этот сценарий передать имя этого объекта, для получения имени объекта используем команду $this->object_title и запуск скрипта с передачей параметра — имени объекта будет выглядеть следующим образом:
runScript("scene_switch",array("nameobj"=>$this->object_title))
эту строчку надо добавить в конец методов turnOff и turnOn класса Relays
Теперь создаем сценарий scene_switch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$n = $params['nameobj']; //получаем имя объекта //нажата кнопка Switch1 if ($n == "Switch1") { if (getGlobal("Switch1.status")==1) { exec ("gpio -1 write 29 0"); } else { exec ("gpio -1 write 29 1"); } } //нажата кнопка Switch2 if ($n == "Switch2") { if (getGlobal("Switch2.status")==1) { exec ("echo 1003 > /dev/ttyS3"); } else { exec ("echo 1103 > /dev/ttyS3"); } } |
в данном примере 2 кнопки, первая включает и выключает реле на GPIO Апельсинки, вторая посылает через UART порт команду ардуине с залитым универсальным скетчем.
Как сделать кнопки в сценах или меню, а так же включать через различные пульты описано в статье Умный дом. Клацкаем светом.
Поделиться в соц. сетях
Понравилась статья? Подпишитесь на RSS .