Веб-выключатели для Raspberry

Для начала всё было в качестве эксперимента. Руководствуясь вот этой статьёй: http://mattrichardson.com/Raspberry-Pi-Flask/   разделом Web-Lamp, начал строить управление выключателями (в нашем случае — реле)  через веб-страницу.

Читать необязательно — всё будет тут. По-русски и с пояснениями.

Начинаем с установки необходимых компонентов. Для начала установим менеджер пакетов для питона pip:

pi@raspberrypi ~ $ sudo apt-get install python-pip

После этого установим модуль flask:

pi@raspberrypi ~ $ sudo pip install flask

Сей модуль будет генерировать нам веб-страницу для управления выходами GPIO. Которые в свою очередь будут управлять выключателями-реле.

GPIO

 

Вот так это будет выглядеть, после того как мы закончим.

Программная часть.

Для начала я создал папку webpower.  Всё складывал туда, дабы не путаться что откуда и куда и где лежит. Внутри создал папку templates где будет лежать макет страницы и папку static где будут лежать картинки (особенности питона).  Картинки — это если вдруг мы захотим нарисовать свои прекрасные кнопки вместо отстойных дефолтных.
В папке templates создаём файл main.html который будет отрисовывать веб-страничку.  В моём случае подразумевалось, что «малинка» имеет выход в интернет и прочее и позволит брать макеты кнопок оттуда. Но при желании можно загрузить всё локально.

Листинг файла main.html

<head>
<title>Управление питанием</title>
<link rel=»stylesheet» href=»https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css»>
<link rel=»stylesheet» href=»https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap-theme.min.css»>
<script src=»http://code.jquery.com/jquery-1.11.2.min.js»></script>
<script src=»https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js»></script>
<style>
.list-group-item {
vertical-align: middle;
line-height: 30px;
}
.list-group-item .btn {
width: 60px;
}
</style>
</head>

<body>
<div class=»container»>
<div class=»header»>
<h3 class=»text-muted»>Устройства. Список и статус.</h3>
</div>
</div>

<div class=»container»>
<ul class=»list-group»>
{% for pin in pins %}
<li class=»list-group-item»><H3>{{ pins[pin].name }}
{% if pins[pin].state %}
<a href=»/{{pin}}/off» class=»btn btn-primary active btn-sm pull-right»>ON</a>
{% else %}
<a href=»/{{pin}}/on» class=»btn btn-default btn-sm pull-right»>OFF</a>
{% endif %}
</h3></li>
{% endfor %}
</ul>
</div> <!— class=»container» —>
<div class=»container»>
{% if message %}
<B>{{ message }}</b>
{% endif %}
</div>

</body>
</html>

Особо расписывать что к чему не буду.  Вкратце: грузим кнопки, показываем список девайсов и статус,  кнопку для управления в соответствующем состоянии и сообщение о последнем действии.  Минимализм — наше всё.

Далее в папке webpower создаем файл wp.py.  Это, собственно и будет программа управления контактами GPIO.  Листинг и комменты прилагаются.

Листинг wp.py

# encoding: utf-8
import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)

GPIO.setmode(GPIO.BCM)

# Создаём список контактов, номер, именование, состояние:
pins = {
4 : {‘name’ : u’GPIO 4 ~220V-1′, ‘state’ : GPIO.LOW},
17 : {‘name’ : u’GPIO 17 ~220V-2′, ‘state’ : GPIO.LOW},
8 : {‘name’ : ‘GPIO 8’, ‘state’ : GPIO.LOW},
22 : {‘name’ : ‘GPIO 22’, ‘state’ : GPIO.LOW},
18 : {‘name’ : ‘GPIO 18’, ‘state’ : GPIO.LOW},
24 : {‘name’ : u’GPIO 24 Кулер’, ‘state’ : GPIO.LOW},
25 : {‘name’ : u’GPIO 25 Светодиод’, ‘state’ : GPIO.LOW}
}

# Устанавливаем стартовое состояние для контактов:
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.HIGH)

@app.route(«/»)
def main():
# Для каждого контакта читаем состояние и храним его:
for pin in pins:
pins[pin][‘state’] = GPIO.input(pin) == GPIO.LOW
# Кладем состояние контактов в шаблон:
templateData = {
‘pins’ : pins
}
# Передаём данные шаблона в веб-страницу
return render_template(‘main.html’, **templateData)

# Функция, выполняемая по запросу с веб-страницы:
@app.route(«/<changePin>/<action>»)
def action(changePin, action):
# Конвертируем запрос с веб-страницы:
changePin = int(changePin)
# Получаем имя устройства для изменения:
deviceName = pins[changePin][‘name’]
# Если получаем запрос на включение выполняем следующий код:
if action == «on»:
# Включаем контакт:
GPIO.output(changePin, GPIO.LOW)
# Сохраняем статус контакта и отправляем его в страницу:
message = deviceName + u» включено.»
if action == «off»:
GPIO.output(changePin, GPIO.HIGH)
message = deviceName + u» выключено.»
if action == «toggle»:
# Читаем состояние контакта при переключении:
GPIO.output(changePin, not GPIO.input(changePin))
message = deviceName + u» переключено.»

# Цикл для обработки списка контактов:
for pin in pins:
pins[pin][‘state’] = GPIO.input(pin) == GPIO.LOW

# Пишем сообщение о последнем действии:
templateData = {
‘message’ : message,
‘pins’ : pins
}

return render_template(‘main.html’, **templateData)

if __name__ == «__main__»:
app.run(host=’0.0.0.0′, port=80, debug=True)

Вкратце — спрашиваем команду со страницы и выполняем её на устройстве. В силу особенностей доставшегося мне блока реле, программа отличается от оригинальной статьи с точностью до наоборот. В состоянии OFF приходится держать контакт в активном состоянии, а не наоборот. Но поменять «он» на «офф» — проблемы не вижу.

Собственно всё со стороны программы. Теперь чтоб её запустить надо выполнить подходящую команду и включать браузер. Команда для запуска такая:

pi@raspberrypi ~ $ cd webpower    #попадаем в директорию с файлом программы

pi@raspberrypi ~/webpower $ sudo python wp.py   # запускаем программу от администратора (рута)

Теперь при попытке зайти через браузер на адрес «малинки» мы увидим страничку с кнопками и прочим.  Останется только собрать подходящую схему.

Аппаратная часть. 

В аппаратную часть входит как и положено:
— сам raspberry pi не принципиально в какой комплектации
— блок реле (в моём случае вот такой)
— кусок кабель-канала чтоб всё влезло, желательно под розетки
— сами розетки в нужном количестве
— проводки, винтики, клеммники и прочая расходка
— схемы, рисунки, описание для правильной сборки

Внимание! Надо правильно понимать что Вы хотите сделать. 220 ни хрена не игрушка. Хорошо если просто дёрнет, а ведь может и убить.

Первое что я сделал — установил модуль реле и присоединил к нему розетки. Так сказать решил задачу с силовыми цепями. Если понимаете как это сделать- отлично. Если плохо понимаете — изучите эту часть заранее. Повторюсь — ток вообще плохая игрушка, если Вы не Никола Тесла.
Вторым шагом подсоединил контакты «малинки» к блоку реле. Тут понадобится схема контактов на плате. Список контактов можно взять прям из файла, но я тут их перечислю: 4, 17, 8, 22, 18, 24, 25. Восьмое реле я использовал для включения какой-нибудь хрени, которая будет мне сигналить о непрочитанной почте. Об этом в посте «Хозяин! Новая почта!». У меня оно висит на 23 контакте.
Ну и третье — уложить всё на место, закрепить, проверить, причесать и наслаждаться результатом.

Схема контактов.

gpiomap

Ну и собственно результат:

2 thoughts on “Веб-выключатели для Raspberry

  1. Не могу запустить эти команды:

    pi@raspberrypi ~ $ cd webpower #попадаем в директорию с файлом программы

    pi@raspberrypi ~/webpower $ sudo python wp.py # запускаем программу от администратора (рута)

  2. Не могу запустить эти команды:
    pi@raspberrypi ~ $ cd webpower #попадаем в директорию с файлом программы

    pi@raspberrypi ~/webpower $ sudo python wp.py # запускаем программу от администратора (рута)

Добавить комментарий