Умный дом на Raspberry Pi / Orange Pi и MediaTek LinkIt: бюджетная IoT-система с локальным сервером и Azure
Компоненты и материалы
| Raspberry Pi 2 Model B (или Orange Pi — дешевле) | ×1 |
| XBee (или дешёвый радиопереceiver) | ×1 |
| Arduino UNO | ×1 |
Облачные сервисы
- Microsoft Azure (хранение данных в Table Storage)
О проекте
Введение
Рассмотрим создание системы умного дома на базе MediaTek LinkIt. Железную часть (подключение датчиков) опустим — здесь много экспертов. Сосредоточимся на создании API и развёртывании ультрадешёвого локального сервера ($15 на Orange Pi) для сбора данных с датчиков. Опционально — логирование в Azure.
Архитектура системы

Датчики передают данные по радиоканалу (XBee или другой трансивер) на MediaTek LinkIt. LinkIt упаковывает сырые данные в JSON с помощью библиотеки ArduinoJson и отправляет POST-запрос на локальный сервер. Локальный сервер (Node.js на Orange Pi/Raspberry Pi) принимает JSON, добавляет UTC-время и подпись, выполняет валидацию/фильтрацию/конвертацию, затем пересылает данные в облако (Azure Table Storage).
Локальный сервер выступает препроцессором. Можно полностью отказаться от облака и хранить данные в локальной NoSQL-БД. LinkIt также может слать данные напрямую в Azure — локальный сервер добавлен для демонстрации, что $15-PC способен обрабатывать поток данных.



Демонстрация
(видео-демо в оригинале)
Предварительные требования
Предполагается, что вы умеете читать данные с датчиков на Arduino/MediaTek. Чтобы сузить рамки, считаем, что данные уже доступны на LinkIt. Для передачи можно использовать XBee или дешёвые радиомодули. Новичкам удобно стартовать с Grove Starter Kit для MediaTek LinkIt (температура, влажность, свет и т.д.).
JSON-формат данных
JSON стал де-факто стандартом для IoT. Основная идея — передавать максимум данных на сервер, где происходят аналитика, конвертация, ML. Поле desired — желаемое состояние датчика/актуатора. Например, "temperature": "24" означает целевую температуру 24°C. Клиенты (веб/мобильное приложение) используют это состояние для отображения.
Примеры JSON-объектов:
// Температура и влажность
{ "deviceid": "iot/myhome/livingroom/thermostat",
"desired": { "temperature": "24", "humidity": "80" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Микрофон
{ "deviceid": "iot/myhome/livingroom/mic",
"desired": { "intensity": "66" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Ультразвуковой датчик расстояния
{ "deviceid": "iot/myhome/livingroom/obstacle",
"desired": { "proximity": "150" },
"timeutc": "2015-01-01", "signedBy": "localserver" }
// PIR (движение)
{ "deviceid": "iot/myhome/livingroom/pir",
"desired": { "motion start": "2500", "motion end": "5345" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// GPS
{ "deviceid": "iot/mydevice/location",
"desired": { "lat": "25.5", "long": "32.2" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Влажность почвы
{ "deviceid": "/iot/myhome/garden/moisture",
"desired": { "moisture": "20" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Газ
{ "deviceid": "/iot/myhome/kitchen/gas",
"desired": { "leak": "No" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Свет
{ "deviceid": "/iot/myhome/livingroom/light",
"desired": { "intensity": "60" },
"timeutc": "2015-11-23T00:41:48.824Z", "signedBy": "localserver" }
// Комнатные агрегаты
{ "deviceid": "/iot/myhome/livingroom",
"desired": { "temperature": "25", "humidity": "80", "window": "open", "door": "closed", "light": "80", "noise": "low" } }
{ "deviceid": "/iot/myhome/bedroom",
"desired": { "temperature": "24", "humidity": "70", "window": "closed", "door": "closed", "light": "80", "ac": "on", "noise": "low" } }
MediaTek LinkIt — приёмник (скетч)
См. файл MediaTekRx.ino в разделе кода. Данные датчиков симулируются (random), замените на реальные чтения.
Локальный сервер (Node.js на Orange Pi / Raspberry Pi)
Крошечный ПК + Node.js — отличный выбор. Я использовал Orange Pi ($15) с Arch Linux ARMv7. Установлен Node.js и npm. Клонируйте репозиторий iotapp с GitHub, npm install, сервер слушает порт 3000. Проверьте https://local-ip:3000.
API эндпоинты для приёма данных:
/iot/myhome/livingroom/thermostat— температура/iot/myhome/livingroom/mic— звук/iot/myhome/livingroom/pir— присутствие/iot/myhome/livingroom/distance— расстояние/iot/mydevice/location— GPS/iot/myhome/garden/moisture— влажность почвы/iot/myhome/kitchen/gas— утечка газа/iot/myhome/livingroom/light— освещённость/iot/myhome/livingroom— агрегат гостиной/iot/myhome/bedroom— агрегат спальни
Настройка: клонируйте iotapp, в index.js укажите IP/домен облачного приложения (ASP.NET 5 на Azure).
Удалённый сервер (ASP.NET 5 на Azure)
Публикация данных в облако популярна. Выбрал Azure. Аналитика, Data Mining, ML — в облаке. Клонируйте iotwebapp с GitHub (Visual Studio 2015, ASP.NET 5). API логируют данные в Azure Table Storage. Создайте таблицу в Azure, в IoTController.cs укажите Account Name и Key. Этот домен/IP пропишите в локальном сервере.
API эндпоинты облака:
api/iot/myhome/thermostatapi/iot/myhome/microphoneapi/iot/myhome/pirapi/iot/myhome/distanceapi/iot/mydevice/locationapi/iot/myhome/moistureapi/iot/myhome/gasapi/iot/myhome/lightapi/iot/myhome/livingroomapi/iot/myhome/bedroom
Заключение
Код требует рефакторинга — модифицируйте под свои нужды. Пишите, если застрянете.
Исходный код
- MediaTekRx.ino — скетч LinkIt для отправки данных на локальный сервер (C/C++)
- nodejs (index.js) — локальный сервер Express.js с маршрутами приёма и прокси в Azure (JavaScript)
- ASP.NET 5 Controllers (C#) — ThermoStatController, PIRController, MoistureController, LivingRoomController, LightController, GPSController, GasController, DistanceController, BedRoomController — все логируют в Azure Table Storage
Полный репозиторий (MediaTek, Node.js, ASP.NET 5):
https://github.com/syediddi/iot-mediatek-linkIt
Схемы подключения датчиков к Arduino для радио-передачи



Производственный процесс
- Умные данные: навигация по следующей границе IoT и Big Data
- Создание умного домашнего контроллера 433 МГц с Sensorflare и Raspberry Pi
- Создайте систему домашней автоматизации на Raspberry Pi для удаленного управления
- Умный бармен: создайте свою Raspberry Pi-станцию для коктейлей
- Умные больницы будущего: Критическая роль интеллектуального ПО
- Преодоление разрыва навыков умного дома: почему Британия отстает от Европы
- Как взаимосвязность повышает эффективность, безопасность и устойчивость современных рабочих мест
- Эволюция умного дома: что будущее готовит для коннектед жилья
- Умные фабрики: от видения к реальности — почему большинство британских бизнесов всё ещё промахиваются
- Умный дом: 3 проверенных шага для преодоления главных препятствий