- Интернет электро розетка на основе Raspberry Pi

Интернет электро - розетка на основе мини компьютера Raspberry Pi и фреймворка WebIOPi
Практика для студентов. Мясищев А.А.

    Рассмотрим удаленное управление устройствами и датчиками через компьютерную сеть(Интернет) с помощью одно платных мини компьютеров.  В настоящее время наиболее популярными и покупаемыми являются Raspberry Pi 2, Banana Pi 2 и Orange Pi PC (см. рисунок 1).

Рис.1. Одно платные мини компьютеры
Эти компьютеры объединяет:
1. Малые размеры, с кредитную карточку;
2. Четырехядерный процессор, который работает на всех компьютерах примерно на частоте 1-1.2 ГГц;
3. Оперативная память 1 ГБайт;
4. SD card вместо жесткого диска для загрузки операционной системы и программ;
5. Ethernet порт для подключения к сети;
6. HDMI выход для подключения монитора или телевизора;
7. USB порты для подключения, например клавиатуры, мыши, флешь памяти.
8. Операционная система Linux;
9. И главное - 40-а пиновый GPIO порт, к которому подключаются устройства, датчики, которыми надо управлять.
Главный вопрос - это выбор компьютера для удаленного управления.
1. Стоимость (на 25.02.2016, сайт http://ru.aliexpress.com с доставкой):
- Raspberry Pi 2 - $36.99;
- Banana Pi 2 (BPI-M2 A31S) - $50.21
- Orange Pi pc - $18.99
2. Быстродействие процессора+памяти:
По вычислительным тестам с использованием 4-х ядер 
- Banana Pi 2 (BPI-M2 A31S);
- Orange Pi pc;
- Raspberry Pi 2. 
При использовании одного ядра для вычислительных работ (задача не распаралелена) 
- Orange Pi pc;
- Banana Pi 2 (BPI-M2 A31S);
- Raspberry Pi 2.
Отмечают, что у Orange Pi работает 3 ядра, 4-й не всегда запускается.
3.Техническая поддержка и наличие отлаженного программного обеспечения:
- Raspberry Pi 2;
- Banana Pi 2;
- Orange Pi pc.
У Orange Pi pc пока нет главного условия для управления устройствами - это программной поддержки порта GPIO.
    Удаленное управление устройствами может выполняться с помощью микроконтроллеров:
1. Arduino Mega256 с Ethernet Shild w5100 - $12-15;
2. Arduino nano с контроллером сети enc28j60 - $8-9;
3. ESP8266-12 - $2-3;
    Опыт показывает, что в локальной сети микроконтроллеры работают неплохо, в глобальной сети при потерях пакетов управление становиться ненадежным. Мини компьютеры работают под управлением ОС Linux, у которой сетевые протоколы отлажены хорошо. Можно делать высокую степень защиты для входа в управляемую систему. У микроконтроллеров для хороших протоколов и защиты от взлома не достаточно ресурсов. 
    Здесь для управления электро розетками используется мини компьютер Raspberry Pi model B. 
    На рисунке 2 представлена простая Интернет электро - розетка с электро-нагревателем, который подключен к первой розетке. Устройство имеет 3 розетки и один датчик температуры DS18B20. Основой 
является мини компьютер Raspberry Pi model B. Интернет розетка должна выполнять функции:
1. Удаленно включать и выключать три электро-розетки. Первая розетка служит для подключения мощных потребителей энергии (например электро-нагревателя), две другие - стандартные бытовые устройства - это лампы накаливания, газовый котел и др.
2. Определять температуру помещения, рисовать график изменения температуры для любого интервала времени.
3. Управление устройством и получение информации о температуре должно выполнятся браузером (Chrome).

Рис.3. Интерфейс с Интернет розеткой

4. Должно быть предусмотрено управление устройством и в случае отсутствия у него реального IP - адреса(DNS имени). Необходимо лишь подключение к Интернет, например через стандартный ADSL модем с установленным nat (что установлено по умолчанию).
5. Необходимо создать через браузер интерфейс связи с розеткой, показанный на рисунке 3. При включенной розетки кнопка изменяет цвет с черной на зеленую.
Розетка для обогревателя должна управляться временем. Необходимо предусмотреть время включения и выключения обогревателя, которые должны вводится в браузер (рис.3).
     На рисунке 4 представлен график температуры для выбранного промежутка времени, который должен прорисовывать браузер на основании данных с интернет розетки.
Рис.4. График температуры, который генерируется при нажатии на ссылку "Кафедра КСМ"

Рассмотрим последовательность решения задачи.
1. Установка операционной системы Raspbian.
Для этого необходимо с сайта https://www.raspberrypi.org/downloads/raspbian/ скопировать образ 
операционной системы RASPBIAN JESSIE, например на компьютер под управлением Windows 8.1. Разархивировать этот файл. Скопировать дисковую утилиту Win32DiskImager http://sourceforge.net/projects/win32diskimager , разархивировать ее. Установить SD card на компьютер и с помощью дисковой утилиты установить на SD образ операционной системы. После этого SD card переносится на компьютер Raspberry Pi и подключается к источнику питания. Предварительно к компьютеру необходимо подключить монитор, клавиатуру, мышь и кабель Ethernet. Компьютер автоматически загружается и на экране появляется меню предварительной настройки, которое формируется файлом raspi-config. Опции этого файла можно посмотреть по ссылке  https://www.raspberrypi.org/documentation/configuration/raspi-config.md
2. Назначение Raspberry Pi статического IP адреса
Raspberry Pi выполняет здесь функцию web - сервера, поэтому он должен иметь статический ip адрес. Для этого:
- меняем содержимое файла  /etc/network/interfaces на

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
  address 172.20.0.137
  netmask 255.255.0.0
  gateway 172.20.200.1
  dns-nameservers 8.8.8.8

- полностью удаляем из системы dhcpcd5, выполнив команду

sudo apt-get purge dhcpcd5

3. Следующим этапом является установка фреймворка Webiopi. 
Webiopi представляет пакет программ, специально разработанный для Raspberry Pi для удаленного управления устройствами. Совместно с Raspberry Pi он реализует технологию Internet of Things (Интернет вещей). Webiopi позволяет создавать различные пользовательские приложения. На рисунке 5 показаны основные возможность этого фреймворка в соответствии с его официальным сайтом http://webiopi.trouch.com/ .
Рис.5. Возможности Webiopi

Таким образом Webiopi имеет следующие возможности:
-Встроенный Web - сервер, реализованный на языке Python
-Встроенная поддержка более чем 30 устройств с интерфейсами UART, SPI, I2C, 1-Wire
-Библиотеки Javascript / HTML для создания Web-интерфейса
-Библиотеки Python / Java для создания приложений под Android
-Поддерживает протокол CoAP предназначенный для управления и взаимодействия между простыми электронными устройствами через сеть.
    Webiopi имеет открытый код, который может быть изменен пользователем.  Это позволяет увеличить количество задач для решения. Для настройки пакета под конкретную задачу изменяется файл конфигурации. Например, в этот файл записываются GPIO pins, к которым подключены устройства. Если используются датчики, их также заносят в конфигурационный файл. Однако необходимо в некоторых случаях включить драйвер устройства (например для температурного датчика ds18b20). Рассмотрим установку версии 0.6 Webiopi. Эта версия хорошо поддерживает Raspberry Pi model B, имеющего 26 пинов порта GPIO. Для  установки WebIOPi, заходим в Raspberry Pi через программу Putty (логин – pi, пароль - raspberry) и в терминале вводим поочередно следующие команды:

$ wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
$ tar xvzf WebIOPi-0.6.0.tar.gz
$ cd WebIOPi-0.6.0
$ sudo ./setup.sh

После завершения установки необходимо активировать автозапуск WebIOPi. Автозапуск WebIOPi нужен для того, что бы каждый раз после включения Raspberry Pi не выполнять запуск приложения вручную. Для этого выполняем команду:

$ sudo update-rc.d webiopi defaults

После чего перезапускаем Raspberry Pi:

sudo reboot

Теперь можно проверить работу Webiopi. С любого компьютера в локальной сети набираем сетевой адрес, присвоенный Raspberry Pi с указанием порта 8000. Например:

http://172.20.0.137:8000/app/gpio-header

Для доступа к WebIOPi необходимо в открывшейся форме ввести логин и пароль. По умолчанию логин «webiopi», пароль – «raspberry». На рисунке 6 представлен интерфейс программы Webiopi, на котором представлены номера пинов порта GPIO и их назначение.

Рис.6. Интерфейс фреймворка Webiopi

    Из рисунка видно, что по умолчанию все пины GPIO работают на вход (IN). Для переключения на выход, необходимо мышкой нажать на IN. Его значение поменяется на OUT. Черный цвет пина означает низкий уровень порта, желтый - высокий. Если кликнуть мышкой на номер порта, его значение переключиться с низкого на высокий и черный цвет поменяется на желтый. В этом случае произойдет включение(или выключение) устройства, подключенного к этому пину. 
    Для настройки Webiopi под задачу необходимо выбрать пины порта GPIO для подключения розеток и датчика температуры DS18B20 и прописать их в конфигурационном файле Webiopi:
GPIO23 - розетка для подключения обогревателя;
GPIO9  -  розетка 1;
GPIO11 - розетка 2.
Датчик температуры подключен к GPIO4, который реализует шину 1-wire(рис.7).
Рис.7. Пример подключения DS18B20 к GPIO4

    Подключаемся к Raspberry Pi через терминальную программу Putty (логин – pi, пароль - raspberry) и открываем для редактирования конфигурационный файл config:

sudo nano /etc/webiopi/config

Настраиваем  порты GPIO 9, 11, 23  как выходы с высоким стартовым уровнем. В секции [GPIO] записываем:

9  =  OUT 1
11 = OUT 1
23 = OUT 1

Для того, чтобы работал датчик температуры в секции [DEVICES] прописываем:

tmp0 = DS18B20

В секции [SCRIPTS] указываем имя и расположение файла - скрипта на Питоне, необходимый для считывания данных с датчика температуры и контроля наступления включения или выключения обогревателя в заданное время:

myproject = /home/pi/myproject/python/script.py

В секции [HTTP] указываем имя и расположение html файла:

doc-root = /home/pi/myproject/html

и номер порта работы встроенного в Webiopi web - сервера:

port = 80
 
В секции [REST] прописываем активные порты(только они будут работать):

gpio-export = 9, 11, 23

и разрешаем вводить изменение с браузера величин GPIO(низкий и высокий уровень пина) но запрещаем менять функции GPIO(нельзя менять OUT на IN):

gpio-post-value = true
gpio-post-function = false

Для того, чтобы работал датчик DS18B20 необходимо в файл /boot/config.txt вставить строку

dtoverlay=w1-gpio

Если к GPIO4 подключено несколько датчиков DS18B20, то каждый из них должен иметь свое имя. Для определении имени переходим в каталог: 

cd /sys/bus/w1/devices

Распечатываем файлы в этом каталоге:
ls
28-00000272b04c  28-000002d9a4f5  w1_bus_master1

Первые два имени определяют два датчика DS18B20. Заносим их в /etc/webiopi/config в секцию  [DEVICES]:
tmp0=DS18B20 slave:28-00000272b04c
tmp1=DS18B20 slave:28-000002d9a4f5

Изменение пароля Webiopi выполняется командой 

$ sudo webiopi-passwd

Далее выполняем перегрузку компьютера командой reboot.
Подключиться к web - серверу webiopi теперь можно по адресу

http://172.20.0.137/app/gpio-header

В браузере появиться изображение аналогичное рис.6, но активными будут только порты gpio9, 11, 23. 
Проверить работоспособность датчика температуры можно, подключившись по адресу:

http://172.20.0.137/app/devices-monitor

В браузере должно появиться значение температуры от датчика.
Для перегрузки webiopi после внесения изменений в конфигурационный файл, скипт на питоне, html файл, необходимо выполнить команду:

/etc/init.d/webiopi restart

Сообщения об ошибках при запуске  Webiopi находятся в файле /var/log/webiopi. Его можно распечатать:
cat /var/log/webiopi

4. Создание файла index.html
    Этот html файл с WebIOPi Javascript library должен сформировать web - страничку, показанную на рисунке 3, передавать на сервер команды при нажатии на кнопки, получать от сервера информацию о состоянии кнопок, выводить значение даты, температуры и взаимодействовать со скриптом на Питоне. Файл index.html разместим в каталоге /home/pi/myproject/html , который предварительно необходимо создать. Этот файл создавался по примерам, которые можно найти в ссылках: http://webiopi.trouch.com/Tutorial_Basis.html,  http://webiopi.trouch.com/Tutorial_Macros.html,  http://webiopi.trouch.com/Tutorial_Devices.html 
Ниже приведено содержимое этого файла:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Temperatura 1-wire DS18B20</title>
  <style>
   a {
    color: #FF0000; /* Цвет обычной ссылки */
    text-decoration: none; /* Убираем подчеркивание у ссылок */
   }
   a:visited {
    color: #800080; /* Цвет посещённой ссылки */
   }
   a:hover {
    color: #800000; /* Цвет ссылки при наведении на нее курсора мыши */
    text-decoration: underline; /* Добавляем подчеркивание */
   }
  </style>
    <script type="text/javascript" src="/webiopi.js"></script>
    <script type="text/javascript">

       // Вызов макроса изменения температуры с интервалом 5 сек.
                setInterval ("callMacro_getTmp0()", 5000);{
                }
        // Запрос температуры
                function callMacro_getTmp0(){
                webiopi().callMacro("getTmp0", [], macro_getTmp0_Callback);
                 }
        // Получение температуры
                function macro_getTmp0_Callback(macro, args, data) {
                $("#celsius_0").text("Температура: "+data+" °C");
                }
setInterval ("callMacro_tihour()", 2000);{
}
function callMacro_tihour(){
webiopi().callMacro("tihour", [], macro_tihour_Callback);
}
function macro_tihour_Callback(macro, args, data) {
$("#hr").text(data);
}
    webiopi().ready(function() {
   // Following function will process data received from set/getLightHours macro.
        var updateLightHours = function(macro, args, response) {
                    var hours = response.split(";");
                    // Following lines use jQuery functions
                    $("#inputOn").val(hours[0]);
                    $("#inputOff").val(hours[1]);
                     $("#inputOnm").val(hours[2]);
                     $("#inputOffm").val(hours[3]);
        }
// Immediately call getLightHours macro to update the UI with current values
// "getLightHours" refers to macro name
// [] is an empty array, because getLightHours macro does not take any argument
// updateLightHours is the callback function, defined above

                webiopi().callMacro("getLightHours", [], updateLightHours);

       // Create a button to call setLightHours macro
  var sendButton = webiopi().createButton("sendButton", "Передать", function() {
           // Arguments sent to the macro
  var hours = [$("#inputOn").val(), $("#inputOff").val(), $("#inputOnm").val(), $("#inputOffm").val()];
            // Call the macro
               webiopi().callMacro("setLightHours", hours, updateLightHours);
                });

       // Append the button to the controls box using a jQuery function
                $("#send_contr").append(sendButton);

        // Create a "Обогреватель" labeled button for GPIO 23
        var button = webiopi().createGPIOButton(23, "Обогреватель");

        // Append button to HTML element with ID="controls" using jQuery
        $("#controls").append(button);

        // Create a "Розетка 1" labeled button1 for GPIO 9
        var button1 = webiopi().createGPIOButton(9, "Розетка 1");

        // Append button to HTML element with ID="controls1" using jQuery
        $("#controls1").append(button1);

        // Create a "Розетка 2" labeled button2 for GPIO 11
        var button2 = webiopi().createGPIOButton(11, "Розетка 2");

        // Append button to HTML element with ID="controls2" using jQuery
        $("#controls2").append(button2);

        // Refresh GPIO buttons
        // pass true to refresh repeatedly of false to refresh once
                webiopi().refreshGPIO(true);
    });
    </script>

                <style type="text/css">
               #celsius_0, #hr {
                margin: 5px 5px 5px 5px;
                        width: 350px;
                        height: 75px;
                        background-color: Blue;
                font-size: 24pt;
                font-weight: bold;
                color: white;
                padding: 5px 5px 5px 5px;
        }
        </style>
    <style type="text/css">
        #send_contr {
            display: block;
            margin: 5px 5px 5px 5px;
            width: 360px;
            height: 85px;
            font-size: 34pt;
            font-weight: bold;
            color: white;
        }
     </style>

    <style type="text/css">
        button, button1, button2 {
            display: block;
            margin: 5px 5px 5px 5px;
            width: 360px;
            height: 85px;
            font-size: 30pt;
            font-weight: bold;
            color: white;
        }
        #gpio23.LOW {
            background-color: Green;
        }
        #gpio23.HIGH {
            background-color: Black;
        }
        #gpio9.LOW {
            background-color: green;
        }
        #gpio9.HIGH {
            background-color: black;
        }
        #gpio11.LOW {
            background-color: green;
        }
        #gpio11.HIGH {
            background-color: black;
        }
    </style>
</head>
<body>
<div align="center">
&nbsp;&nbsp;Включить обогреватель, часы, минуты:<input type="text" maxlength="2" size="2" id="inputOn" />
<input type="text" maxlength="2" size="2" id="inputOnm" /><br/>
Выключить обогреватель, часы, минуты:<input type="text" maxlength="2" size="2" id="inputOff" />
<input type="text" maxlength="2" size="2" id="inputOffm" /><br/>
</div>
<div align="center">
    <div id="send_contr" align="center"></div>
    <div id="hr" align="center"></div>
    <div id="controls" align="center"></div>
    <div id="controls1" align="center"></div>
    <div id="controls2" align="center"></div>
    <div id="celsius_0" align="center"></div>
</div>
<center><FONT color="#008000"><FONT size="5">График изменения температуры:<br></FONT></FONT></center>
<a href="temp.html" target="_blank"><center><FONT size="5">1. Кафедра КСМ&nbsp;<br></FONT></center></a>
</body>
</html>

5. Создание файла - скрипта на питоне script.py
    Этот файл должен находиться в каталоге /home/pi/myproject/python, который должен быть предварительно создан. Задачей скрипта является получение данных с температурного датчика и передача их  в файл index.html, запись файла /home/pi/myproject/html/data_18B20.txt с значениями температур и времени их определения для построения графика, анализа времени включения и выключения обогревателя и его включение или отключение.
Ниже приведена распечатка файла /home/pi/myproject/python/script.py

import webiopi
import datetime
import time
from webiopi import deviceInstance
from time import strftime
GPIO = webiopi.GPIO

LIGHT = 23 # GPIO pin

HOUR_ON  = 0  # Turn Light ON at 13:00
HOUR_OFF = 0  # Turn Light OFF at 14:00
MIN_ON = 0
MIN_OFF = 0
celsius_0 = 0,0
cel_0=0,0
num=1
# setup function is automatically called at WebIOPi startup
def setup():
    # set the GPIO used by the light to output
    GPIO.setFunction(LIGHT, GPIO.OUT)

    # retrieve current datetime
    now = datetime.datetime.now()
    # test if we are between ON time and tun the light ON
    if (((now.hour >= HOUR_ON) and (now.hour <= HOUR_OFF)) and ((now.minute >= MIN_ON) and (now.minute <= MIN_OFF))):
        GPIO.digitalWrite(LIGHT, GPIO.LOW)

@webiopi.macro
def getTmp0():
    global celsius_0
    tmp0 = webiopi.deviceInstance("tmp0")
    celsius_0 = tmp0.getCelsius()  # получение температуры
    print (celsius_0)
    return "%.2f" % celsius_0 # возврат данных температуры в HTML
    # с округлением до сотых

@webiopi.macro
def tihour():
    now = datetime.datetime.now()
    return "Время {0}, {1}".format("%d:%d %d:%d" % (HOUR_ON, MIN_ON,HOUR_OFF, MIN_OFF), strftime("%Y-%m-%d %H:%M"))

def loop():
    global cel_0
    global num
   # retrieve current datetime
    now = datetime.datetime.now()
    # toggle light ON all days at the correct time
    if ((now.hour == HOUR_ON) and (now.minute == MIN_ON) and (now.second == 0)):
         if (GPIO.digitalRead(LIGHT) == GPIO.HIGH):
            GPIO.digitalWrite(LIGHT, GPIO.LOW)

    # toggle light OFF
    if ((now.hour == HOUR_OFF) and (now.minute == MIN_OFF) and (now.second == 0)):
         if (GPIO.digitalRead(LIGHT) == GPIO.LOW):
            GPIO.digitalWrite(LIGHT, GPIO.HIGH)
    if (num==300):
      tmp0 = webiopi.deviceInstance("tmp0")
      cel_0 = tmp0.getCelsius()
      f = open('/home/pi/myproject/html/data_18B20.txt', 'a')
      data_entry = "{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),"%.2f" % cel_0)
      f.write(data_entry)
      f.close()
      num=0
    num+=1
    # gives CPU some time before looping again
    time.sleep(1)

@webiopi.macro
def getLightHours():
    return "%d;%d;%d;%d" % (HOUR_ON, HOUR_OFF, MIN_ON, MIN_OFF)

@webiopi.macro
def setLightHours(on, off, onm, offm):
    global HOUR_ON, HOUR_OFF, MIN_ON, MIN_OFF
    HOUR_ON = int(on)
    HOUR_OFF = int(off)
    MIN_ON = int(onm)
    MIN_OFF = int(offm)
    return getLightHours()

# destroy function is called at WebIOPi shutdown
def destroy():
    GPIO.digitalWrite(LIGHT, GPIO.HIGH)

6. Построение графика температуры
График температуры строиться с помощью библиотеки dygraph, файл которой dygraph-combined-dev.js необходимо скопировать в каталог /home/pi/myproject/html с сайта http://dygraphs.com. Эта библиотека для прорисовки графика использует файл /home/pi/myproject/html/data_18B20.txt, который формирует каждые 300 секунд скрипт на питоне. Построение графика будет выполняться браузером при обращении по адресу:
http://172.20.0.137/temp.html (по ссылке "1.Кафедра КСМ" со странички по адресу http://172.20.0.137)
Ниже приведена распечатка файла /home/pi/myproject/htmp/temp.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Temperature_graph</title>

<script type="text/javascript"
src="dygraph-combined-dev.js"></script>

<!===========ВЫВОД ГРАФИКА НА СТРАНИЦУ>

<div id="graph_temperatura"
style="width:1200; height:600px;"></div>

<!=======================СКРИПТ ГРАФИКА>

<script type="text/javascript">
  g3 = new Dygraph(
    document.getElementById("graph_temperatura"),

    "data_18B20.txt",
            "DATA,Temperature\n" +                // the data series
        "2015-01-01 12:00,15.00\n" +
        "2015-01-01 12:15,23.50\n" +
        "2015-01-01 12:30,23.00\n",

    {
      title: 'Температура',
          legend: 'always',
          ylabel: 'Temp',
          xlabel: 'Date',
      rollPeriod: 5,
          color: "#FF0000",
      showRoller: true
    }
  );
</script>
</head>
</html>

7. Подключение к Интернет интернет - розетки, если она не имеет реального ip-адреса или доменного имени, но имеет выход в Интернет(через модем, router, межсетевой экран).
    Одним из способов получения доступа к Raspberry Pi как к устройству интернет вещей является использование сервиса Weaved. Он предлагает следующие услуги:
SSH - позволяет войти в Raspberry Pi с любой точки мира по SSH;
Web (http) on port 80 - можно просматривать web - страницы с любой точки мира, размещенные на Raspberry Pi;
WebIOPI - позволяет управлять пинами GPIO порта Raspberry Pi, используя разработанное пользователем программное обеспечение.
Перед установкой Weaved желательно создать каталог /home/pi/myproject/my, зайти туда и работать там с файлами Weaved.
Установка Weaved на Raspberry Pi:
- Необходимо на сайте https://developer.weaved.com/portal/login.php получить аккаунт;
- Подключить Raspberry Pi к Интернет;
- Загрузить Weaved Software на Raspberry Pi:
wget https://github.com/weaved/installer/raw/master/binaries/weaved-nixinstaller_1.2.13.bin
- Сделать файл weaved-nixinstaller_1.2.13.bin исполняемым:
chmod +x weaved-nixinstaller_1.2.13.bin
- Запустить программу установки:
./weaved-nixinstaller_1.2.13.bin
- Выбрать услугу
При первом запуске программы будет предложено установить одну из услуг: SSH на порт 22, Web (HTTP) на 80-й порт, WebIOPi на порту 8000, VNC на порт 5091 (протестирован с tightvncserver), или пользовательский TCP на выбранном порту.
Выбираем здесь 2-ю услугу, Web (HTTP) на 80-й порт.
- Ввести информацию для входа в Weaved(ввести аккаунт, который был получен на сайте Weaved).
Далее вводится имя своего устройства, например webiopi80.
- Проверяем было ли создано новое устройство:
Заходим по адресу https://developer.weaved.com/portal/login.php и вводим свой аккаунт. После входа должна появиться следующая страничка, где указано имя вашего устройства:


Если нажать на ссылку на имени устройства, то должна появиться страничка как на рисунке 3, только адрес будет примерно такой:
https://eksgaxwj.p19.weaved.com/
Таким образом подключение к Raspberry Pi было выполнено через промежуточный сервер, который предоставлен сервисом Weaved.

8. Подключение Raspberry Pi к релейному модулю
    На рисунке 8 представлена схема подключения релейного модуля к пинам порта GPIO Raspberry Pi и электро розеткам. Для повышения мощности нагрузки два реле подключены параллельно к розетки обогревателя. Приведенное на рисунке подключение работоспособно, если реле срабатывают от напряжения 5 вольт. Необходимо отметить, что реле срабатывает при подаче на вход модуля нулевого напряжения.
Рис.8. Подключение релейного модуля к пинам Raspberry Pi и розеткам

9. Применение.
Кроме учебного процесса эта розетка используется для предварительного подогрева аудитории зимой. Это хорошо иллюстрируется графиком температуры на рис.4.

Написано 27.02.2016.