0
Rating
19 December 2013

От умного дома к умным корпорациям

iSystems corporate blogWebsite developmentProgramming
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.


Мы открыты для идей и предложений по всем направлениям, а также принимаем опытных специалистов в свою немногочисленную команду.
Для анализа спроса, просим оставить свой голос в форме для голосования.
Only registered users can participate in poll. Log in, please.
Использовал бы контроллер в своих проектах?
91.8% Да, если бы цена не сильно превышала 500р 336
8.74% Нет 32
366 users voted. 97 users abstained.
Tags:iSystems
Hubs: iSystems corporate blog Website development Programming
+18
51.6k 303
Comments 43
Information
Founded

4 October 2008

Location

Россия

Employees

51–100 employees

Registered

19 December 2013