iSystems
Компания
27,75
рейтинг
19 декабря 2013 в 20:46

Разработка → От умного дома к умным корпорациям tutorial

«… Если бы в этот момент мистер Рипли вывел нас во двор и, оборотясь к дому, сказал: «Стань, домик, к Нью-Йорку задом, а ко мне передом», и домик, подобно избушке на курьих ножках, выполнил бы эту просьбу при помощи электричества, мы бы не слишком удивились.»
Ильф и Петров. Одноэтажная Америка. 1935г.


Часть первая


Введение







Мы компания, которая в этом году отпраздновала 5 лет, SAP-партнер с АСУТП-прошлым. В настоящий момент внедряем системы управления имуществом для крупных компаний, собственников недвижимости. Для справки: зачастую количество объектов составляет нескольких десятков тысяч (редко – сотни тысяч), а площадь превышает миллионы квадратных метров. Для таких компаний, с их географией и требованиями по надежности и безопасности, SAP является наиболее предпочтительным решением, но в этой статье речь пойдет не об этом (об этом, если есть интерес, можем рассказать отдельно).
В этой статье речь пойдет не об этом, а о том, что нам выпал случай заняться строительством высокотехнологичного и интеллектуального загородного частного коттеджа… и мы с удовольствием за это взялись. И предлагаем вам историю того пути, который мы проделали с начала года от умного коттеджа до умной корпорации.
На всех этапах строительства и инженерных решениях останавливаться не будем, хочется отметить лишь отличительные характеристики в части автономности и энергоэффективности:

  1. Стены выполнены из керамического камня, утеплены пятнадцатисантиметровым слоем минерального утеплителя, и завершает этот пирог облицовочный кирпич. С учетом чистовой отделки толщина стены составляет порядка 70 сантиметров, что должно обеспечивать хорошую сохранность тепла в условиях подмосковной зимы.
  2. Окна. Использовались шестикамерные рамы с энергоэффективными стеклами (основной источник теплопотерь – ИК-спектр на 98% отражается обратно). Поверх окон установлены электрические ролл-ставни, защищающие от вандализма, они создают дополнительный воздушный слой, и летом затеняют солнечную сторону.
  3. Энергетика. Во главе угла стоит система Xantrex производства Schneider Electric, а так же входным стабилизатором, блоком аккумуляторов, солнечными панелями на 3,6 кВт, блок автоматического запуска генератора и управление через веб-интерфейс.
  4. Отопление. Бойлер с несколькими контурами, газовый котел, гелиоустановка и тепловой насос. Тёплые полы и радиаторы в комнатах имеют индивидуальные линии с электрическими клапанами (климат-контроль в каждой комнате).
  5. Вентиляция. Приточно-вытяжная установка с рекуператором и гидроузлом (зимой греем, летом охлаждаем). В каждую комнату/зону индивидуальный вентиляционный клапан. Установка имеет дифференциальный датчик давления и автоматическую регулировку производительности.
  6. Освещение. Преимущественно светодиодное. Второй свет с использованием SolarTube.




Вот такой вот объект для автоматизации мы имеем. Перед нами стояла задача по увязке всех инженерных систем дома в единую, простую и понятную систему управления, которая бы обеспечивала комфортное, безопасное и энергоэффективное проживание. Все помнят Алису (http://habrahabr.ru/post/160067/), и мы, находясь под впечатлением этого и ещё некоторых проектов, решили повторить нечто подобное. Мы также хотели, чтобы система была действительно интеллектуальной. С минимальными органами управления.

Например:

  • Свет включается автоматически в зависимости от времени суток, внешнего освещения, выбранного сценария и присутствия человека в комнате (именно за обнаружение присутствия, а не движения (!!!), у нас отвечает специальный датчик производства Leviton).
  • Уровень вентиляции в отдельно взятой комнате автоматически управляется по присутствию в ней человека и содержанию в воздухе CO2 (http://habrahabr.ru/post/187210/). В отличие от существующих норм с троекратным обменом воздуха в помещении.
  • За поддержание температуры в комнате отвечают радиаторные батареи, теплые полы, система вентиляции.


Ну и, естественно, в каждой комнате хотелось отдавать свои голосовые команды (не Google); переключать сценарии (кино, сон, дискотека); управлять мультимедиа, ролл-ставнями, розетками; ставить/снимать с охраны; иметь возможность удаленного управления с телефона/планшета, включая подключение к IP-камерам. В какой-то момент мы подошли к проектированию архитектуры, и встали перед выбором: либо делать всё на KNX, либо придумать что-то своё. Как вы уже, наверное, догадались, мы выбрали второй вариант. За KNX говорило большое количество готовых устройств/интерфейсов, красивых рамок и выключателей, но единственное что было не в пользу KNX – это два знания: знание того, сколько стоят электронные компоненты и знание того как это всё сделать самостоятельно. Так мы подошли к созданию своего контроллера. Когда мы раздумывали, каким он должен быть, мы подумали, что было бы здорово сделать такую платформу, которую бы мы могли использовать, как и у себя дома, так и в большинстве наших коммерческих проектов.

У нас родилась идея создания максимально простого и компактного продукта, который бы можно было установить в любую квартиру за небольшие деньги. Кроме того, система должна быть модульной и гибко подстраиваться под различные задачи. В то же время её можно использовать и в сфере ЖКХ (госсектор) и в корпоративном сегменте.

Сначала мы постарались сформулировать критерии, которыми должен отвечать контроллер «УМНОГО ДОМА»:

  1. Контроллер должен основываться на принципах «Открытого программного и аппаратного обеспечения» (Open-source software, Open-source hardware). Среда программирования должна быть простой и понятной. Любой человек обладающий техническими знаниями смог бы самостоятельно создать/модернизировать и запрограммировать такое устройство.
  2. Контроллер должен быть универсален и использоваться во всех аспектах управления «УМНОГО ДОМА» от теплого пола до мультимедиа. Совместим с различными типами датчиков, исполнительными устройствами, готовыми решениями по вентиляции, отоплению и безопасности.
  3. Контролер должен быть самодостаточным и «автономным» для применения его в одной отдельно-взятой комнате, но при этом несколько контроллеров должны объединяться в сеть и в этом случае область применения расширяется до квартиры, коттеджа или большого здания под управлением центрального сервера.
  4. Контроллер должен поддерживать передачу данных по Ethernet либо Wi-Fi (опционально).
  5. Контроллер должен обладать компактными размерами, чтобы поместиться в стандартный подрозетник, и при этом оставить достаточно места для сопутствующих монтажных проводов.
  6. Контроллер должен обладать низкой стоимостью и высокой надежностью.


Разработка системы



В качестве основы для всей системы наш выбор упал на контроллер-платформу «Ардуино»

В интернете масса информации по проектам, юзкейсам, реализованным на данной платформе, поэтому отдельно останавливаться на ней не будем, отметим только, что она полностью соответствует приведенным выше критериям.

В качестве прототипа было решено объединить самые компактные версии контроллера и сетевого модуля, сделав многослойную плату. Плата контроллера — Femtoduino с ATMEGA328p-MU на борту, сетевой модуль на базе ENC26J60, пара стабилизаторов, резисторы, клеммники.

Всё это мы разместили на небольшой печатной «материнской плате». При этом плата контроллера целиком помещается в стандартный подрозетник, а самым большим конструктивным элементом получился разъем RJ45 для сетевого кабеля.


На фото: WiFi-камера, Датчик присутствия Leviton, Лампочка-свеча 220V, твердотельное реле, датчик CO2 K-30, Arduino Mega2560 + Ethernet Shield, наш контроллер v1 и v2, модуль распознавания голоса, AC-DC 5В (600ma), femtoduino usb, DC-DC преобразователь, ENC26J60


Изначально для прототипа планировалось изготовить необходимые печатные платы методом ЛУТ, однако шаг между контактами для подключения контроллера оказался слишком маленьким, что повысило требования к качеству платы. После пары неудачных попыток, от ЛУТ пришлось отказаться и заказать плату в специализированной организации.

Femtoduino



Существует две версии этого контроллера: с miniUSB разъемом для программирования и без.
Первые версии контроллера, которые к нам пришли, были без разъема и программировались через другой Arduino-совместимый контроллер с помощью AVRIsp. Для удобства программирования на материнской плате был предусмотрен штыревой разъем под шлейф, соединяющийся с платой программатором. Тем не менее, этот способ программирования далеко не самый удобный. Кроме того, в процессе работы несколько контроллеров этого типа успели выйти из строя из-за ошибок во время перезаписи. В новой версии этой проблемы уже не было.

Femtoduino USB



Вторая версия контроллера значительно упростила работу с ним, так как для программирования теперь предусмотрен специальный USB разъем. Он программируется также как и любая другая плата Arduino. Однако из-за FTDI чипа, который нужен для его работы, возникла проблема со связью контроллера с модулем распознавания голоса. Rx/Tx выводы напрочь отказывались работать с чем-то ещё, кроме USB. Проблему устранить так и не удалось (разработчик платы признал, что FTDI действительно мешает работе нужных выводов), поэтому пришлось использовать обходное решение – библиотеку SoftwareSerial. Она позволяет эмулировать последовательный порт на любых выводах, вместо аппаратных, которые работать отказались.

ENC26J60



Это очень компактный сетевой модуль, фактически состоящий из одного только разъема RJ45 на миниатюрной плате почти таких же размеров. К сожалению, для этого ENC26J60 не годится библиотека стандартного ардуиновского Ethernet-модуля, вместо неё использовалась библиотека EtherCard. Эта библиотека достаточно сильно отличается от встроенной в среду разработки, что не очень удобно при разработке скетчей под неё.
Таким образом, все необходимые устройства были протестированы и собраны на материнской плате. Получился следующий контроллер:



В процессе перехода на Femtoduino USB, контроллер удалось уменьшить в размерах:



В итоге, у нас получился компактный контроллер, соединяющийся с сервером по Ethernet кабелю и способный решать широкие задачи по автоматизации дома (питание от 220V в качестве опции на фото).

ТТХ:



  • Размеры: 45x43x25 мм
  • Micro-B USB порт для программирования
  • RJ45 для сетевого подключения
  • Питание DC
  • 5-10V (100-240VAC — опция)
  • Микроконтроллер: ATMEGA328p-MU
  • Размер программной памяти: 32 KB
  • Размер ОЗУ данных: 1 KB
  • Доступно: 8 аналоговых портов,11 цифровых портов
  • I2C: порты A4 (SDA) и A5 (SCL)
  • ШИМ: порты A3, D5, D6 и D9


Область применения решения «Умный дом»


Комфорт

  • контроль качества воздуха
  • климат-контроль (интеграция с вентиляцией/кондиционированием/отоплением)
  • управление ролл-ставнями/жалюзи/гаражными воротами
  • управление теплыми полами (водяные/электрические)
  • управление светом (для диммирования требуется доп. компоненты)
  • голосовое управление
  • автоматические сценарии
  • управление поливом

Безопасность

  • Контроль доступа на объект (постановка/снятие на охрану)
  • Обнаружение движения/присутствия
  • Пожарная безопасность
  • Контроль открытия/закрытия окон/дверей
  • Обнаружение утечки воды
  • Интеграция с системой видеонаблюдения
  • Уведомление по различным каналам SMS/Email


Эффективность

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


Разработка серверной части


Для серверной части системы наш выбор пал на проект MajorDoMo. MajorDoMo — это открытая и доступная платформа для автоматизации и управления системой умного дома. Подробно о проекте можно узнать на сайте разработчика smartliving.ru. Этот программный продукт полностью удовлетворяет требованиям, предъявленным к нашей системе. Это открытая, простая в настройке система, которую можно адаптировать для самых различных задач по автоматизации. В то же время, система управляется через веб-интерфейс, что позволяет использовать её с любых устройств.

В MajorDoMo используется язык PHP для программирования всех сценариев работы системы, при этом в нем реализован удобный графический интерфейс, который позволяет разобраться в настройке системы даже людям, мало знакомым с программированием.

В нашем проекте мы планировали использовать пакет MajorDoMo, установленный на Raspberry Pi, который можно использовать как веб-сервер. В ходе тестов стало ясно, что MajorDoMo слишком требовательна к железу, и такой слабый сервер с трудом справляется с задачей. После попыток оптимизации серверной части и разгона самой железки, было решено отказаться от неё, так как задержка между отправкой и выполнением команд была слишком большой. В дальнейшем в качестве сервера для MajorDoMo мы использовали выделенный сервер (Digital Ocean), к которому подключались через 3G модем. Несмотря на то, что сервер находится в Амстердаме, отклик на выполнение команд стал практически мгновенный.
На основе последнего прототипа было решено сделать демонстрационный стенд, который бы позволил наглядно показать весь функционал полученного контроллера системы умного дома.

На место Raspberry Pi пришел TP-Link 3020 с кастомной прошивкой, который соединялся с выделенным сервером, и вся система была доступна по внешнему IP.

В лицевую фальшпанель, закрывающую подрозетник, решено было поместить отдельную плату с датчиками. На этой плате размещены два датчика света: цифровой, умеющий пересчитывать результат в люксы, и обычный фоторезистор, а также цифровой датчик температуры (DS18B20, куда же без него), панель модуля распознавания голоса и микрофон к ней. Для соединения платы с датчиком сделан отдельный шлейф, который подключается напрямую к плате контроллера в отведенный для него разъем. Плата датчиков получилась настолько компактной, что практически не занимает места внутри самого подрозетника. Вся начинка уместилась в пространстве между рамкой подрозетника и крышкой.


Итоговая архитектура макета:


Сам стенд в конечном виде представляет собой четыре подрозетника, скрепленных вместе. Два из них это управляемая розетка (розетка + твердотельное реле) и кнопочный выключатель, соединенный с контроллером. С помощью реле можно управлять нагрузкой, подключенной к этой розетке, например, электрической лампочкой. В третьем подрозетнике расположился блок питания для всей системы, а в четвертом сам контроллер.

Помимо панели с датчиками, устанавливаемой на контроллер (в которую входит датчик температуры, два датчика света и микрофон), к контроллеру подключаются два дополнительных датчика температуры (1-Wire), геркон, датчик движения и светодиоды. Также на макете сделан разъем для подключения WiFi-камеры с сервоприводом.
Как можно увидеть, у нас получилась довольно объёмная обвязка для такого миниатюрного контроллера. Кроме того, многие из используемых датчиков цифровые, а значит, требуют использования библиотек для работы с ними. Именно из-за этого при написании скетча для макета возникла проблема. В контроллере этого типа не так много памяти, что ставит ограничение на размер кода программы. Проблему удалось решить существенной оптимизацией кода.

Полный код можно посмотреть тут
(подробнее)
#include <EtherCard.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(1, 0); //Software serial initialization

#define ONE_WIRE_BUS 4        //Dallas initialisation
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Ter1;
DeviceAddress Ter2;
DeviceAddress Ter3;
int tempC1 = 1;
int tempC2 = 1;
int tempC3 = 1;

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; 
static byte myip[] = { 192,168,0,150 };
static byte gwip[] = { 192,168,0,1 };
static byte hisip[] = { 192,168,2,1 };
//char website[] PROGMEM = "192.168.2.1";

#define REQUEST_RATE 3000

Servo servo1;
int xAxis = 90;


int BH1750address = 0x23;
byte buff[2];
int dLight = 0;
#define relay1Pin 9 //Основной свет
//#define relay2Pin 2 //ФОновая подсветка
#define buttonPin 3  //Кнопка
int buttonState = HIGH;
int lastButtonState = LOW;
long lastDebounceTime = 0;
long debounceDelay = 100;
int lightState = 0;
#define reedPin 8
int reedState = 0;
#define PIRPin 7
int pirState = 0;
#define photo1Pin = 2;
int photo1Value = 0;
int sensor = 0;    //Текущий датчик
#define LED1Pin 2
#define LED2Pin 5
#define LED3Pin A0
#define LED4Pin A1
int background = 0;

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

const char link[] PROGMEM = "GET /objects/?object=";
const char linkLight[] PROGMEM = "GET /objects/?object=lightgroup1&op=m&m=updateState&state=";
const char website[] PROGMEM = " HTTP/1.1" "\r\n" "Host: 192.168.2.1" "\r\n" "\r\n";

byte Ethernet::buffer[600];
BufferFiller bfill;
Stash stash;
static long timer;


///////////////////////////////////////// SETUP /////////////////////////////////////////
void setup () {
  mySerial.begin(9600);
  sensors.begin();
  sensors.getAddress(Ter1, 0);
  sensors.setResolution(Ter1, 12);
  sensors.getAddress(Ter2, 1);
  sensors.setResolution(Ter2, 12);
  sensors.getAddress(Ter3, 2);
  sensors.setResolution(Ter3, 12);
  ether.begin(sizeof Ethernet::buffer, mymac, 10);  
  ether.staticSetup(myip, gwip);
  ether.copyIp(ether.hisip, hisip);
  timer = - REQUEST_RATE; //Запуск таймера
  servo1.attach(6);
  pinMode(relay1Pin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(reedPin, INPUT);
  pinMode(PIRPin, INPUT);
  pinMode(LED1Pin, OUTPUT);
  pinMode(LED2Pin, OUTPUT);
  pinMode(LED3Pin, OUTPUT);
  pinMode(LED4Pin, OUTPUT);
  delay (100);	//Инициализация голосового модуля
  mySerial.write(0xAA);
  mySerial.write(0x37);
  delay(100);
  mySerial.write(0xAA);
  mySerial.write(0x21);
  delay(100);
}


///////////////////////////////////////// LOOP /////////////////////////////////////////
void loop () {
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  netSend();
  if (pos)
    netReply(pos);
  
  checkButton();
  checkReed();
  checkPIR();
  checkSerial();
}


//////////////////////////////////////// NETWORK ////////////////////////////////////////
void netSend() {  //Передача показаний датчиков
  if (millis() > timer + REQUEST_RATE) {
    timer = millis(); 
    switch (sensor) {
      case 0:            //Фоторезистор
        sensor = 1;
        photo1Value = analogRead(2);
        Stash::prepare(PSTR("$Fphoto1&op=m&m=updateValue&value=$D$F"), link, photo1Value, website);
        ether.tcpSend();
        break;
      case 1:            //ЦиФровой датчик света
        sensor = 2;
        //dLight = getLx();
        //Stash::prepare(PSTR("$Fdlight1&op=m&m=updateValue&value=$D$F"), link, dLight, website);
        //ether.tcpSend();
        break;
      case 2:            //Датчик температуры
        sensor = 0;
        sensors.requestTemperatures();
        tempC1 = (int)(sensors.getTempC(Ter1)*100);
        tempC2 = (int)(sensors.getTempC(Ter2)*100);
        tempC3 = (int)(sensors.getTempC(Ter3)*100);
        Stash::prepare(PSTR("$Fds1&op=m&m=updateTemp&temp=$D&temp2=$D&temp3=$D$F"), link, tempC1, tempC2, tempC3, website);
        ether.tcpSend();
        break;
    }
  }
}

void netReply(word pos) {  //Обработка входящих команд и ответ сервера
  bfill = ether.tcpOffset();
  char *data = (char *) Ethernet::buffer + pos;
  char sub[4];
  char *var;
  var = strstr(data, "srv1=");
  if (var != NULL) {
    var += 5;
    for (int i=0; i<=2; i++) sub[i] = var[i];
    xAxis = atoi(sub);
    servo1.write(xAxis);
  }
  var = strstr(data, "lgr1=");
  if (var != NULL) {
    Serial.print("Command recieved!");
    digitalWrite(52, 1);
  }
   //LED Control
  var = strstr(data, "led1=");
  if (var != NULL) {
    var += 5;
    for (int i=0; i<=1; i++) sub[i] = var[i];
    digitalWrite(LED1Pin, (atoi(sub)));
  }
  var = strstr(data, "led2=");
  if (var != NULL) {
    var += 5;
    for (int i=0; i<=1; i++) sub[i] = var[i];
    digitalWrite(LED2Pin, (atoi(sub)));
  }
  var = strstr(data, "led3=");
  if (var != NULL) {
    var += 5;
    for (int i=0; i<=1; i++) sub[i] = var[i];
    digitalWrite(LED3Pin, (atoi(sub)));
  }
  var = strstr(data, "led4=");
  if (var != NULL) {
    var += 5;
    for (int i=0; i<=1; i++) sub[i] = var[i];
    digitalWrite(LED4Pin, (atoi(sub)));
  }
  
  bfill.emit_p(PSTR("$F<h1>Arduino Web Server</h1>"), http_OK);
  ether.httpServerReply(bfill.position());
  /*bfill.emit_p(PSTR(
  "$F<meta http-equiv=\"refresh\" content=\"3\" >"
  "<h1>Arduino Web Server</h1>"
  "</br>ds1=$D</br>ds2=$D</br>ds3=$D</br>photo1=$D</br>dLight=$D</br>pir=$D</br>reed=$D</br>light=$D</br>srv1=$D"
  ), http_OK, tempC1, tempC2, tempC3, photo1Value, dLight, pirState, reedState, lightState, xAxis);
  ether.httpServerReply(bfill.position());*/
}


/////////////////////////////////////// FUNCTIONS ///////////////////////////////////////
/*unsigned short getLx() {
  unsigned short val = 0;
  BH1750_Init(BH1750address);
  delay(1000);
  if(2==BH1750_Read(BH1750address))
  {
    val=((buff[0]<<8)|buff[1])/1.2;
  }
  return val;
}

int BH1750_Read(int address) {\
  int i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available())
  {
    buff[i] = Wire.read();  // receive one byte
    i++;
  }
  Wire.endTransmission();  
  return i;
}

void BH1750_Init(int address) {
  Wire.beginTransmission(address);
  Wire.write(0x10);//1lx reolution 120ms
  Wire.endTransmission();
}*/

void checkButton() {  // Button
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        switchLight();
      }
    }
  }
  lastButtonState = reading;
}

void switchLight() {
  //if (lightState > 1) lightState = 1;
  lightState = !lightState;
  digitalWrite(relay1Pin, lightState);
  Stash::prepare(PSTR("$F$D$F"), linkLight, lightState, website);
  ether.tcpSend();
}


void checkReed() {
  int a = digitalRead(reedPin);
  if (a != reedState) {
    reedState = a;
    Stash::prepare(PSTR("$Freed1&op=m&m=updateState&state=$D$F"), link, reedState, website);
    ether.tcpSend();
  }
}

void checkPIR() {
    int a = digitalRead(PIRPin);
    if (a != pirState) {
      pirState = a;
      Stash::prepare(PSTR("$Fpir1&op=m&m=updateState&state=$D$F"), link, pirState, website);
      ether.tcpSend();
    }
}

void checkSerial() {  // VR Module
  if (mySerial.available()) {
    byte com = mySerial.read();
    switch(com) {
    case 0x11:    //Включить реле 1
      lightState = 1;
      digitalWrite(relay1Pin, lightState);
      Stash::prepare(PSTR("$F$D$F"), linkLight, lightState, website);
      ether.tcpSend();
      break;
    case 0x12:    //Выключить реле 1
      lightState = 0;
      digitalWrite(relay1Pin, lightState);
      Stash::prepare(PSTR("$F$D$F"), linkLight, lightState, website);
      ether.tcpSend();
      break;
    case 0x13:    //Камера влево
      xAxis -= 30;
      if (xAxis < 10) xAxis = 10;
      servo1.write(xAxis);
      break;
    case 0x14:    //Камера вправо
      xAxis += 30;
      if (xAxis > 170) xAxis = 180;
      servo1.write(xAxis);
      break;
    case 0x15:    //Фоновая подсветка
      background = !background;
      digitalWrite(LED1Pin, background);
      digitalWrite(LED2Pin, background);
      digitalWrite(LED3Pin, background);
      digitalWrite(LED4Pin, background);
      break;
    }
  }
}





Вот что у нас получилось в итоге:

Все показания датчиков выведены на главную страничку MajorDoMo, а на модели комнаты сделаны кнопки для управления светодиодами, встроенными в подрозетники. Так же пользователь может получить изображение с WiFi-камеры и повращать ей.

Посмотреть как это работает можно тут: http://smarthouse.isystemsautomation.ru
На голосовой модуль записаны несколько голосовых команд, которые позволяют, например, включить лампочку – управляемую нагрузку в розетке, или повернуть камеру влево-вправо.





Часть вторая



Дальше события развивались стремительным для нас образом. Мы показали макет одним людям, затем другим… сработал «социальный лифт», и нам было предложено поучаствовать в форуме «Открытые Инновации» в разделе Smart City за 3 недели до открытия. Мы не могли упустить возможность продемонстрировать свои наработки. Мы начали креативить, и родилась идея с макетом здания, фонтаном и элементами инженерной инфраструктуры города. Достаточно быстро мы прошли путь от эскиза и 3D-модели до воплощения в “железе и бетоне”.

Вот так воплощались наши мысли:



Для управления различными группами света использовался блок из 18 реле.

Из датчиков мы вывели на макете фоторезистор и датчик температуры. Ещё один датчик температуры остался под стендом, чтобы можно было сравнивать разницу температур.

Также на макете присутствует управляемый фонтан. Рядом с фонтаном расположился водосчётчик, который «символично» учитывает расход воды. На счетчике можно остановиться подробнее. Выбран он не случайно, а для того, чтобы продемонстрировать самое типичное бытовое применение для нашей системы умного дома. Он представляет собой обычный водосчётчик с импульсным выводом. Принцип его работы очень простой: раз в 10 литров счетчик замыкает контакт внутри себя, контроллер легко может считать этот импульс и приплюсовать его к сохраненному значению. Осталось только заставить его вращаться. Конечно, можно было бы подсоединить его напрямую к компрессору, который качает воду в фонтане, но тогда конструкция бы получилось сложной и ненадежной. Поэтому требовалось альтернативное решение. После вскрытия счетчика выяснилось, что он состоит из двух механически несвязанных частей: самого счетчика в герметичном корпусе и маленькой крыльчатки, установленной в трубе. Вращался счетчик с помощью магнита, установленного на оси этой крыльчатки. Решение напрашивалось само собой – чтобы смоделировать работу счетчика вовсе не нужно возиться с водой, достаточно разобрать его, убрав кусок трубы с крыльчаткой и с помощью миниатюрного моторчика создавать вращающееся магнитное поле. В качестве такого электродвигателя под рукой оказался маленький скоростной мотор от авиационной модели. На его лопастях были заклеены два неодимовых магнита из детской игрушки, а сам мотор вмонтирован в пластиковый кожух, который как раз пристыковывался на заднюю стенку счетчика. В итоге, мы получили управляемый с контроллера (а скорость его можно регулировать с помощью ШИМ) счетчик, который позволяет наглядно показать, как считываются и передаются показания на сервер

Графический интерфейс



Для доступа к поэтажным планам макета, помимо веб-интерфейса предоставляемого MajorDoMo, мы использовали собственную разработку – модуль визуализации поэтажных планов (МВПП), немного «допилив» ее под соответствующие задачи. Нужно отметить, что изначально МВПП разрабатывался и входил в состав Автоматизированной системы управления недвижимостью для корпоративного сегмента и предназначался для широкого круга задач, в том числе:
  • Управление площадями;
  • Управление размещением сотрудников/организаций;
  • Управление инженерными сетями и оборудованием;
  • Отображение геометрии поэтажного плана;
  • Редактирование геометрии поэтажного плана;
  • Визуализация и редактирование рабочих мест;
  • Отображение атрибутивной информации (по зданиям, этажам, помещениям, рабочим и технологическим местам), хранящейся в модулях SAP;
  • Редактирование атрибутивной информации и сохранение ее в SAP;
  • Построение различных аналитических отчетов.

Архитектура программного комплекса выглядит следующим образом:



Веб-приложение МВПП написано с использованием Java/JavaScript и опубликовано на Apache Tomcat, серверная часть модуля использует ArcGIS for Server компании ESRI, СУБД – Oracle с расширением для работы с пространственными данными. Двухсторонняя связь МВПП с SAP реализована посредством веб-сервисов, авторизация пользователей в SAP сквозная, с использованием SAP SSO2 cookie. Вот как это примерно выглядит.



Ниже представлен функционал размещения рабочих мест. Все изменения, проводимые на поэтажном плане в МВПП (изменение геометрии, атрибутов, рабочих мест и прочее) передаются и сохраняются в SAP.



Если Хабрасообществу будет интересно – распишем реализацию более подробно. А пока желающие могут сами поиграться с приложением.

Итак, вернемся к нашему макету.

Основной функционал, который мы хотели получить от МВПП при его использовании совместно с макетом заключался в следующем:
  • Визуализация поэтажных планов здания и прилегающей территории;
  • Управление освещением и фонтаном;
  • Мониторинг состояния набора датчиков, находящихся на макете (с возможностью построения графиков);
  • Просмотр видео с камеры наблюдения, установленной на макете (и управление поворотом камер);
  • Запуск сервисов передачи в модуль ТОРО SAP информации по отслеживаемым датчикам (при выходе значения какого-либо показателя за границы предельно допустимых значений).


Для использования МВПП в качестве интерфейса управления умным домом, мы несколько доработали его, расширили модель пространственных данных в БД (добавили слой датчиков, уличных фонарей, мебели, прилегающей территории и прочее) и в ArcMAP отрисовали четыре этажа с прилегающей территорией, связав все объекты по идентификаторам с объектами в SAP. То же самое проделали со всеми датчиками.



Фонари объединили в три группы – по периметру, вокруг дома и вдоль дороги. Соответственно, при нажатии на любой фонарь внутри группы, изменение состояния происходит на всех фонарях группы (на скриншоте горят фонари группы «по периметру»). При срабатывании датчика на парковке предполагалось, что на соответствующем парковочном месте в интерфейсе визуализации появляется символ автомобиля. При включении фонтана на макете, его символ на интерфейсе визуализации так же должен «оживать».

Написали сервисы получения информации от контроллера умного дома с ее сохранением информацией в базе данных (для простоты использовали MS SQL) и сервисы, передающие на контроллер управляющие воздействие (включить/выключить). Хранение получаемой информации с датчиков необходимо для возможности строить графики за прошлые периоды, что так же было реализовано. Рассмотрим подробнее контроль температуры и расхода воды.



Для каждого датчика реализовали индивидуальную настройку граничных значений.



Сами датчики на плане так же подсвечиваем цветом в соответствии со статусом нахождения в том или ином коридоре (выше нормы, норма и ниже нормы).



При выходе значения датчика из коридора допустимых значений (< 20 и > 30 градусов Цельсия), запускается сервис создания в ТОРО (SAP) соответствующего инцидента.



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

Также, для показательных целей, настроена передача в ТОРО с определенным интервалом значений с датчика расхода воды, установленного на фонтане.



Также имеется возможность выбрать другой этаж.



В дальнейших планах – полностью отказаться от использования MajorDoMo с реализацией у себя (в МВПП) необходимого функционала, поработать над интерфейсом.

В результате, с помощью веб-приложения, которое может быть запущено в браузере на компьютере или мобильном устройстве (в частности, на iPad), мы получаем возможность удаленного мониторинга следующих параметров: состояния освещения, показателей с датчиков (расход воды, освещенность, температура, парковка), камер наружного наблюдения. Также веб-приложение позволяет управлять освещением (как наружных групп, так и ламп внутри здания), поворотом камеры и работой фонтана.

Мы отработали на форуме 3 дня, и за это время наш макет вызывал большой интерес, как у специалистов, так и случайных прохожих. Те, кто погружались в технические особенности, не могли поверить, что весь цикл управления (от датчиков до SAPа) работал на боевых серверах.
Кадры с крутящимся фонтаном, на удивление, начинали большинство новостных выпусков на ТВ, посвященных работе форума. Про нас даже сняли небольшой сюжет:



Рабочие моменты:



Заключение



В предложенном материале мы постарались поделиться тем опытом, который получили в результате выполнения проекта по строительству энергоэффективного и интеллектуального коттеджа. Данный проект подходит к концу, завершается отделка и пуско-наладка. И в заключении хочется поделиться нашими планами по развитию.
Развитие мы видим по следующим направлениям:

  1. Сделать серийный контроллер для умного дома максимально дешевым и открытым (OpenSource Hard/OpenSource Soft). Сейчас ведем переговоры с китайскими производителями, прорабатываются несколько версий (Ethernet/Wifi + AC/DC). Согласно нашему плану, стоимость для конечного потребителя не должна превышать 500р за версию c Ethernet.
  2. Мы ведем разработку сенсорной панели с экраном, датчиками и микрофоном, которая будет заменять лицевую фальшпанель, закрывающую подрозетник стандартного типоразмера.
  3. Планируем выпускать на базе данного контроллера уже готовые решения для конкретных задач. Например, контроллер теплого пола будет содержать в себе реле, 3 датчика температуры, питание от 220В и Ethernet модуль (опция). Потребитель получит уже готовое решение для своей задачи. Аналогично, для диммирования света и обнаружения протечек.
  4. Планируем под «одной крышей» собрать единомышленников и партнеров, где предлагаем совместно поучаствовать в обмене идеями по развитию систем управления жилой и промышленной инфраструктурой, направленной на безопасность, повышение эффективности и удобства использования. Рабочее название проекта – iCity.


Мы открыты для идей и предложений по всем направлениям, а также принимаем опытных специалистов в свою немногочисленную команду.
Для анализа спроса, просим оставить свой голос в форме для голосования.
Использовал бы контроллер в своих проектах?

Проголосовало 359 человек. Воздержалось 97 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Автор: @Strong01
iSystems
рейтинг 27,75
Компания прекратила активность на сайте

Комментарии (43)

  • +8
    MajorDoMo — это открытая и доступная платформа для автоматизации и управления системой умного дома.…
    … В дальнейшем в качестве сервера для MajorDoMo мы использовали выделенный сервер (Digital Ocean), к которому подключались через 3G модем.

    Так и представляю себе:
    — Папа, а чего у меня в комнате свет не включается?
    — Это, наверное, сервер в Голландии отвалился. Сейчас перезапущу…
    • +1
      Наверно в контроллере заложена логика, которая позволяет отрабатывать команды «по умолчанию» при отсутствии связи с сервером ;)
    • +1
      На ролике с голосовым управлением видно, как контроллер отрабатывает в автономном режиме. Клавиша, по классической схеме, также включит свет.
  • +3
    Леша приветствую.
    «У дураков мысли сходятся» (с) :)
    Сейчас ремонт в квартире предстоит — думаю в ту же самую сторону, умный дом на 4 контролерах arduino+lan.
    Отличия — я сторонник умного дома как add on, то есть если завтра все контроллеры сгорят, то дом должен продолжить работу, малость «отупеть» — но в ручном режиме на 100% рабочий.
    У тебя твердотельники (считай семисторы) в розетке контролируют питание — если вырвать контролер или он словит глюк, то розетке считай нет. То же самое со светом.
    Что бы это победить — делаю весь свет на импульсных реле от Шнайдер. Каждым реле можно управлять нажимая кнопку «выключателя», так и с arduino (220в импульс на 200мсек).
    Cиловые розетки только мониторятся (датчики тока), прерывание питания (опять импульсным реле) есть только на группе розеток.
    Зачем мне выключать что то подключенное к розетке, какой сценарий? Забытый утюг только приходит в голову, но это авария — можно и группу рубануть.
    За основу узловых контролеров взял itead iboard pro devicter.blogspot.ru/2012/12/iboard-pro.html — куча ног, памяти и т.д.
    Что можно посоветовать тебе улучшить:
    — питание, используй пассивный PoE — у тебя 100мбит, две пары LAN свободны, гони 24 вольта и DC-DC преобразователем получай что хочешь (12, 5, 3,3в) — подсмотри решение у iTead, у меня хаб dlink за 300р переделан: отдает контролерам питание и ethernet одновременно.
    — ENC26J60 не лучший выбор, wiznet w5100 код лучше отполирован, больше памяти, коннектов.
    — зачем эта архаика на 328 чипе? Почему не смотреть в сторону micro версий Leonardo(http://www.ebay.com/itm/301041414713) на 32u4? Нет проблем usb и FTDI, usb встроен, больше ног и прерываний.
    — «именно за обнаружение присутствия, а не движения (!!!)» — здесь нет никакой магии, они обычный PIR дополняют ультрозвуковым радаром или микроволновым радаром на 2,4 ггц. И мой опыт — это нифига не работает на 100%, если тупо ляжешь на кровать и замрешь — все, нет никого в комнате :(. У меня стоит два таких мультидатчика в туалете\ванной сейчас (тоже с ардуино спаренные). Еще 2,4 ггц датчик ловит помехи от микроволновки, при включении часто ложные срабатывания.
    — датчик ds1820 лучше поменять на DHT22 — кроме температуры сразу и влажность сможешь читать.

    Теперь смотри по рынку — не у каждого есть витая пара в каждой розетке. Поэтому более перпективен wifi, и тут в качестве базы можно взять Spark www.spark.io Много вкусняшек, типа программирования из облака, но беда в начальной стадии проработки, нет библиотек, тот же DS1820 так просто не подключишь, код либов надо портировать. Но это самый перспективный проект на рынке, я если бы начинал сейчас смотрел бы в эту сторону.

    П.С. Наверно мне надо было бы статью на хабр запилить, но много времени уходит на прототипы, ремонт через пару месяцев предстоит.
    Думаю основной интерес представляет именно add on идеалогия, ее думаю на этих выходных опишу и приведу пример реализации.

    П.С.С. Смотрю ник у тебя со времен Бутлерова 3 не сильно поменялся. Вспомни Godz 'a, передавай привет Алине :).
    • 0
      Зачем мне выключать что то подключенное к розетке, какой сценарий? Забытый утюг только приходит в голову, но это авария — можно и группу рубануть.

      Например, термопот\кулер на ночь отключать, или если дома никого нет. Опять же всякую технику, типа телевизора\ресивера, многие не любят постоянно оставлять ее в standby режиме…
      • +1
        термопот\кулер на ночь отключать, или если дома никого нет. Опять же всякую технику, типа телевизора\ресивера, многие не любят постоянно оставлять ее в standby режиме…

        Хороший пример, но он проще реализуется в элетрощитке: рубани группу розеток — там и места больше, и с размещением любого оборудования нет проблем. Именно микроменеджмент на уровне каждой розетки не очень понимаю.
    • 0
      Привет Радион, спасибо за дельные советы, с удовольствием бы пообщался в личке.
    • 0
      Для медленных протоколов домашней автоматизации вместо wifi существенно более эффективен радиоканал 433/868 mhz, т.к. выше проникающая способность и дальнобойность.

      При этом Spark — очень интересная штука, будет опыт с ним, обязательно напишите! Там где нужно wifi это видится отличным решением.
    • 0
      Мужик! Спасибо за линки. Занимаюсь отбором оборудования для хитрого дома. Отличное дополнение и мысли.
  • +3
    Зачем были использованы такие большие изображения?
  • +4
    И почему 18+?
    • +9
      Присоединяюсь к вопросу. Нельзя так с пятничными надеждами людей обходиться.
  • 0
    Конечно, подключение контроллера через Ethernet несколько разочаровывает. В существующую систему не встроишься — нужно кабели тянуть…
    Если вы все равно используете TP-Link 3020, то почему бы не использовать его (вернее, плату на AR9331) как контроллер? Мы вот по этому пути идем.
  • 0
    Постараюсь ответить сразу на несколько вопросов. Представленные макеты лишь описывают Proof-of-Concept. Причем, мы постарались максимально компактно предложить несколько сценариев. Реальные варианты использования у всех будут свои.
    На тему контроллера, то как и написано в Заключении, мы сейчас работаем над серийным производством и там будет несколько вариантов, реализованные на одной плате и на другом чипе (32u4):

    1. С Ethernet и DC-питанием (7-18V)
    2. С Ethernet и AC-питанием (100-240V)
    3. C WiFi и DC-питанием (7-18V)
    4. C WiFi и AC-питанием (100-240V)
    5. Отдельные комплекты под теплый пол/ диммер света/ обнаружение протечек

    Текущее использование TP-Link 3020 — лишь для того, чтобы устанавливать VPN соединение с внешним сервером через 3G модем.
    На реальном объекте, архитектура будет другая: Свой сервер Majrdomo, своя сеть Wifi/Ethernet

    • 0
      И что, реально получается стоимость четвертого варианта (он, по-моему, наиболее интересен) 500р в розницу? Тогда это действительно круто!
      • 0
        Около 500р в розницу — это наша цель за 1-й вариант.
        • 0
          Первый вариант наименее интересен, т.к. откуда-то нужно брать питание, тянуть витую пару в каждую точку и находить свободные порты на маршрутизаторе.
          • 0
            В нашем реальном проекте, мы как раз используем первый вариант, питание, как описал *Nizametdinov, мы используем PoE. Такая схема дешевле и стабильнее, на этапе когда вся проводка делается с «нуля» пробросить витую пару до каждой комнаты — не очень сложная задача.
            • 0
              Верю, что для вашего конкретного проекта это был идеальный вариант.
              Но большинство людей уже где-то живут и для реализации каких-то полезных функций «умного дома» стены своего текущего жилья штробить вряд ли захотят.
              • 0
                Понимаем, поэтому предусмотрен 4-й вариант
                • 0
                  И какая целевая розничная цена для него?
                  • 0
                    С ценой на этот вариант пока нет окончательной ясности, мы обязательно информируем, как такая возможность появится
      • 0
        Это не реально — wifi модуль от Ti cc3000 стоит 15$ в крупных заказах, а еще куча обвеса, контроллер, маржа, растаможка — выйдет 1,5 тыр в лучшем случае.
        • 0
          Ну так не одна же TI производит wifi модули, правда?
          Любимый китайцами риалтековский модуль стоит 2 USD с подключением по USB.
          • 0
            А есть какой-нибудь недорогой модуль, который умеет что-нибудь типа «smart config» от TI? Для конечных устройств многое упирается в простоту инсталляции.
          • 0
            Какой USB? Мы же о контролерах говорим — для них модули по SPI цепляются (иногда Serial(Tx\Rx)) — я таких дешевле 10 баксов не знаю. Если чето пропустил — ссылку в студию, плюс в карму.
            • 0
              А цеплять модули к контроллерам по USB некошерно? Я, честно говоря, не совсем понимаю, почему USB должен быть однозначно исключен из рассмотрения, если это реально самый дешевый wifi модуль из существующих.
              • 0
                А цеплять модули к контроллерам по USB некошерно?

                Нереально. Разберись сначала, что такое arduino и на каком контроллере оно работает. В нем 2000 байт памяти, а ты предлагаешь usb драйвер сюда запихать с блекджеком и монашками.
                • 0
                  А Ардуино — обязательное условие для контроллера умного дома? Есть много других замечательных чипов. Я вот выше AR9331 упомянул. Он 5 баксов стоит, кстати, и у него wifi прямо на борту.
                  • 0
                    А Ардуино — обязательное условие для контроллера умного дома?

                    В рамках обсуждения данной статьи, построенной на arduino — да, иначе можно уйти в сторону cortex-m3 и т.д., скатившись в флейм :(.
                    Есть много других замечательных чипов. Я вот выше AR9331 упомянул. Он 5 баксов стоит, кстати, и у него wifi прямо на борту.

                    У него совершенно нет I\O ног, то есть web сервер он поддержит, а периферией рулить не сможет. Ты конечно предложишь прикрутить через tx\rx порт к AR9331 простенькую 328 микруху…
                    Но это уже придумано до тебя :) — Arduino Yun store.arduino.cc/index.php?main_page=product_info&cPath=11_12&products_id=313
                    52 евро + налоги.
                    • +1
                      Люди прописали 4 варианта. Мне лично очень любопытно, как они собираются реализовывать вайфайные варианты на Ардуине? И зачем, если есть более продвинутые варианты за те же деньги или даже дешевле?

                      Э-э-э… А сколько нужно ног? В даташите на 9331 указано, вроде, 29 GPIO. Этого мало?
                      • 0
                        Мой косяк — Yun меня сбил с толку. Спасиб за наставление на путь интересный.
                        Покурил мануалы — мало то что 29 ног, так и SPI есть(часть этих 29 ног). Почти все эти I\O используются под Led, SD карту, jtag разъем, но…
                        — если все это выкинуть
                        — навесить на ноги ченить согласующее уровни напряжений (у AR9331 2,5 вольта на GPIO выходит)
                        — залить на флеш openwrt
                        Получится профит.
                        На «малинке» уже есть много либов на чтение датчиков, поднять вебсервер не вопрос.
                        и это все можно в бюджете 20-25$ удержать (правда при очень массовом производстве), не забываем про память\корпуса\питание\SDRAM\
                        Я не настолько линуксоид, что бы собрать под это макет — но идея ИМХО клевая.
                        • 0
                          Можно еще Карамболу2 покурить на этом же чипе. Идут две платы ко мне прямо сейчас из Литвы. А три китайских уже на столе лежат…
  • 0
    Реально классный проект получился. Впечатляет.
    Как с SAP интегрировались?
    • +1
      Спасибо. На стороне SAP и ArcGIS были написаны соответствующие web-сервисы.
  • 0
    А зачем внешний сервер в Интернете? Интернет тут самое слабое звено… Пусть бы работал прямо в доме мини-сервер, в котором крутилась бы вся логика.
    • 0
      Внешний сервер, как и сам макет — для демонстрации Заказчикам, вне стен офиса.
      Первоначально у нас все работало автономно на RaspberryPI
    • 0
      я работал над этим проектом, как приглашенный сетевик.
      внешний сервак был нужен частично как раз и под хабра эффект.
      ибо ежевичка, канешн, хорошая железка, но на ней при работе нескольких пользователей, да еще и с видео с камеры были небольшие задержки. мелочь, а неприятно.
      ну и опять же — когда мы думали — а как это показать людям, находящимся не на площадке с оборудованием вышло проще строить ВПН до внешнего сервака, по нему передавать данные визуализации, чем крутить что-то через DynDNS.
      по сути, большая часть логики работы зашита в микроконтроллеры, а веб морда — это уже визуализация всех данных.
      на 3020, ясное дело, стоит openwrt, что позволило с минимумо телодвижений получить весь функционал без колхоза и перепайки роутера.
  • 0
    Очень здорово! Рад, что MajorDoMo так интересно применяется.
  • +3
    Зашёл сюда из-за первой фотки.
  • +1
    Про постройку дома было интересно, а потом уж извините, что-то поломалось, может надо было на две части пост разбить…

    Подход к постройке дома капитален, впечатляет, но в условиях современной реальности (относительной новизне и высокой стоимости вещей для энергосберегающих решений), видимо позволить построить себе подобный по оснащению дом может тот, кто может позволить SAP`у внедряться в свою компанию. :)
  • 0
    Удачи!
    • 0
      Спасибо!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка