Статьи

SweetHomeHub: домашний контроль с Raspberry Pi и MQTT — часть 1

Уже довольно давно я работаю над своим универсальным Intertechno-Remote на базе Raspberry Pi (см. Предыдущие посты 1 2 3 4 ):

intertechno-пульт

Я пробовал разные подходы для запуска / управления моей службой дистанционного управления через пользовательский HTTPServer / -Handler и простую версию Vert.x. Поскольку MQTT v3.1.1 оказывается де-факто стандартными протоколами для IoT, я также реализовал клиент MQTT.

Этот клиент MQTT в основном следует двум шаблонам проектирования:

  1. Одна тема для каждого устройства

    Для каждого устройства определена тема. Его состоянием можно управлять, опубликовав сообщение с полезной нагрузкой «ВКЛ» или «ВЫКЛ».

    Pro:

    • пользователь не должен знать о коде адреса устройства Intertechno
    • изменения адреса не должны публиковаться
    • сообщение просто «ВКЛ» или «ВЫКЛ» для управления устройством

    Contra:

    • пользователь должен знать тему для каждого устройства
    • пользователь может управлять только настроенными устройствами
  2. Одна тема для сообщения JSON

    Pro:

    • очень гибкий для управления устройствами

    Contra:

    • пользователь должен знать о синтаксисе JSON и кодировании устройств

Решение:

Предоставьте оба варианта

Одна тема для каждого устройства

topics_table

Моя конфигурация очень проста

При запуске Клиент ищет в домашнем каталоге пользователя файл sweethomehub-config.xml, который затем отправляется из JAXB.

Эта конфигурация содержит коды и тему для каждого устройства, а также параметры MQTT для соединения с брокером:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<configuration>
    <devices>
        <device>
            <houseCode>a</houseCode>
            <groupId>1</groupId>
            <deviceId>1</deviceId>
            <name>Light Front-Door</name>
            <mqttTopic>front/lights/door</mqttTopic>
        </device>
        <device>
            <houseCode>a</houseCode>
            <groupId>1</groupId>
            <deviceId>2</deviceId>
            <name>Light Terrace</name>
            <mqttTopic>garden/lights/terrace</mqttTopic>
        </device>
        <device>
            <houseCode>a</houseCode>
            <groupId>1</groupId>
            <deviceId>3</deviceId>
            <name>Fountain</name>
            <mqttTopic>garden/devices/fountain</mqttTopic>
        </device>
        <device>
            <houseCode>a</houseCode>
            <groupId>1</groupId>
            <deviceId>4</deviceId>
            <name>Light Garden</name>
            <mqttTopic>garden/lights/ambiente</mqttTopic>
        </device>
        <device>
            <houseCode>a</houseCode>
            <groupId>1</groupId>
            <deviceId>3</deviceId>
            <name>Light Living Room</name>
            <mqttTopic>livingroom/lights/ambiente</mqttTopic>
        </device>
    </devices>
    <mqttClientConfiguration>
        <mqttClientId>SweethoemMQTTClientId</mqttClientId>
        <mqttBrokerAddress>sweethome</mqttBrokerAddress>
        <mqttBrokerPort>1883</mqttBrokerPort>
        <mqttMessagesBaseTopic>sweethome</mqttMessagesBaseTopic>
    </mqttClientConfiguration>
</configuration>

И еще одна тема ожидает команды JSON: sweethome/devices/jsoncommand

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "devices":[
    {
      "device":{
        "name": "Light Front-Door",
        "houseCode": "a",
        "groupId": "1",
        "deviceId": "1"
      },
      "command":"ON"
    },
    {
      "device":{
        "name": "Light Terrace",
        "houseCode": "a",
        "groupId": "1",
        "deviceId": "2"
      },
      "command":"ON"
    },
    {
      "device":{
        "name": "Light Living Room",
        "houseCode": "a",
        "groupId": "1",
        "deviceId": "3"
      },
      "command":"ON"
    }
  ]
}

Центральный метод для обработки поступивших сообщений:

MqttMessageReceiver.messageArrived

JsonDeviceCommandProcessor:

JsonCommandProcessor

И методы doSwitch :

DeviceControl

Клиент MQTT, работающий на Raspberry Pi, ожидает сообщений:

MQTT-receiver1

… И получение командных сообщений:

MQTT-приемник-команда

Тестирование приемника с помощью MQTT.fx

MQTT-FX

Полный код можно найти на BitBucket .