Архив автора: strike

подключение темпрературных датчиков

temperatureИтак, все провода были проложены и пора было подключать первые датчики. В гараже (где предполагалось установка модуля управления) все лучи были спаяны вместе ( +12в, +5в, DATA, земля), о чём я кстати в будущем пожалел (но об этом в следующих постах) и выведен разъём для подключения сети к «мастеру» RJ11.

С другой стороны я начал устанавливать температурные датчики. Так как эти датчики не требуют никакой обвязки, то я их подключил напрямую к 1-wire сети. Предварительно на тех местах где предполагалась установка датчиков, я разместил телефонные коробки (прикрутив или приклеив их к стене, и подключив кабель).

rj12-01

Ножниц для обжима у меня на тот момент не было, поэтому я заводил  кабеля непосредственно внутрь розетки (выкинув разъём RJ11). К температурному датчику я подпаял небольшие провода и скрутил их вместе с проводами кабеля, зафиксировав винтами внутри розетки.

Как показала практика, на датчик всё же лучше делать обвес. Фильтры по питанию, стабилитроны и стабилизаторы. Пример:

ds18b20

В доме я установил 12 датчиков в помещениях + 2 датчика в контуры отопления (на вход и на выход) + 1 датчик на улице. Уличный датчик я хорошенько изолировал от влаги, оставив торчать только пластмассовый кончик. Подключив все датчики, подсоединив сеть к мастера, я загрузил на «малине» линукс и далее owfs сервер. Дал команду на показ содержимого сети:

pi@home /opt/owfs/bin $ ./owdir -s 3000 /uncached
/uncached/28.C0213D050000
/uncached/28.20404C050000
/uncached/28.E4FC3C050000
/uncached/28.14343D050000
/uncached/28.CC293C050000
/uncached/28.AADCC8040000
/uncached/28.2E1D3C050000
/uncached/28.D1D53C050000
/uncached/28.492E3D050000
/uncached/28.29383D050000
/uncached/28.55EA4B050000
/uncached/28.B5FEB8040000
/uncached/28.E3874C050000
/uncached/28.EB1D3D050000
/uncached/28.67BE3C050000
/uncached/81.F39E30000000
/uncached/bus.0
/uncached/settings
/uncached/system
/uncached/statistics
/uncached/structure
/uncached/simultaneous
/uncached/alarm

Ура! Все 15 датчиков + мастер были видны и нормально функционировали (можно было прочитать с них текущую температуру).
В пакете OWFS есть PHP библиотека ownet.php. Я взял её, написал небольшой скрипт, который собирал показания датчиков через определённый промежуток времени и пихал эти показания в базу данных MySQL.

проектирование

proektirovanieДалее настало время выяснить для себя, что же я хочу получить от умного дома, и что он должен и сможет сделать (делать). я решил разделить воплощение идеи на несколько этапов:

 

1-ый этап
- снабдить умный дом органами чувств.

  • температурными датчиками
  • датчиками движения
  • датчиками влажности
  • датчиками освещённости

2-ой этап
- управление отоплением

  • управление водяным тёплым полом
  • управление радиаторами
  • управление электрическим тёплым полом
  • управление вытяжкой (вентиляторами)
  • управление кондиционерами
  • управление котлом

3-ий этап
- управление светом

  • включение/выключение света
  • управление интенсивностью света (диммирование)

4-ий этап

  • датчики на открытие окон
  • датчики на открытие дверей
  • датчики и управление гаражными воротами

5-ый этап
- управление розетками

  • включение/выключение
  • измерение потребляемого электричества

6-ый этап
- управление мультимедиа

  • динамики в каждую комнату
  • управление различной техникой по ИК

7-ой этап
- видео-наблюдение

  • внутреннее
  • наружное

8-ой этап

  • датчики газа
  • датчики протечки

9-ый этап
- система полива газона

  • система управление поливом
  • датчики влажности почвы

10-ый этап
- метео станция

11-ый этап
- так называемые «праздничные» фишки

  • ёлка
  • гирлянды
  • наружное праздничное освещение

С самого первого этапа уже предполагалось писать софт, который бы управлял всем этим делом, и дописывать по мере появления новых устройств.

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

1-ый этаж.
1-floor-1200x900

2-ой этаж
2-floor-1200x900

разводка кабелей

6fc5228481a25f10ba503917d4e09acf_enlИтак, когда все тесты были закончены, и система показала свою жизнеспособность, настало всё это дело воплотить в железе. В начале я решил провести кабели во все предполагаемые места подключения устройств. В качестве кабеля я прокладывал UTF витую пару. Вернее, как я уже писал ниже, у меня уже были протянуть ethernet кабеля в каждую комнату, но за ненадобностью я их решил «переквалифицировать» в кабеля для умного дома. Оставалось только продлить эти кабеля по всей комнате до точек предполагаемых устройств. Так как мой дом был уже на стадии эксплуатации, то кабеля приходилось проводить за регипсом (от розетке к розетке), либо под плинтусом, либо внутри косяков (предварительно сняв наличники). Все соединения тщательно пропаивал и изолировал (все 4-е пары).

IMG_1842 IMG_1843 IMG_1844 IMG_1846 IMG_1850 IMG_1851 IMG_1852

Так как сеть изначально планировалась как ethernet, то она имеет топологию «звезда». Все лучи сходятся в одном месте, в гараже, куда я и планировал поставить мозг умного дома. Забыл кстати упомянуть что также в каждой комнате у меня висел датчик движения, подключенные к блоку сигнализации 4-х жильным кабелем. И так как я хотел интегрировать и соединить эти датчики с умным домом, то я отключил их от блока сигнализации и подключил к 1-wire. Таким образом получились дополнительные лучи, и в каждую комнату всё таки приходило 2-а сигнальных кабеля 1-wire.

148Fig03

На данный момент сеть насчитывает где то порядком 15 лучей, каждый луч приблизительно метров 10. К сожалению есть один луч который идёт по 3-х жильному силовому кабелю (так как не было возможности поставить витую пару и который я в будущем планирую всё таки поменять), но хочу сказать что пока все датчики за этим куском провода видны и работают стабильно.

пакет OWFS

bobeckПакет OWFS служит для коммуникации устройств 1-wire с компьютером. Я скачал самую новую версию пакета с сайта http://owfs.org и скомпилировал его из исходников. OWFS расшифровывается как One Wire File System, и при запуске данный пакет генерирует виртуальную директорию в которой находится все устройства сети 1-wire также в виде директорий.

pi@raspberrypi:/mnt# ls -l 1wire/
drwxrwxrwx    1 root     root             8 Apr 16 00:01 28.1CC484040000
drwxrwxrwx    1 root     root             8 Apr 16 00:01 81.5F9031000000
drwxr-xr-x    1 root     root             8 Apr 16 00:01 alarm
drwxr-xr-x    1 root     root             8 Apr 16 00:01 bus.0
drwxr-xr-x    1 root     root             8 Apr 16 00:01 settings
drwxrwxrwx    1 root     root             8 Apr 16 00:01 simultaneous
drwxr-xr-x    1 root     root             8 Apr 16 00:01 statistics
drwxr-xr-x    1 root     root            32 Apr 16 00:01 structure
drwxr-xr-x    1 root     root             8 Apr 16 00:01 system
drwxr-xr-x    1 root     root             8 Apr 16 00:01 uncached

Директория начинающаяся с 81. это мастер USB DS9490R, а директория начинающаяся с 28. это температурный датчик.
В зависимости от типа устройства (датчики температуры, ключи) в директориях находиться целый ряд файлов для управления устройством или считывания разных показателей.

pi@raspberrypi ~ $ ls /mnt/1wire/28.1CC484040000
address  errata    id       r_address  temperature    temperature12  templow
alias    family    locator  r_id       temperature10  temperature9   type
crc8     fasttemp  power    r_locator  temperature11  temphigh

Например для того что бы прочитать значение какого либо устройства, достаточно просто прочитать значение соответствующего файла.

pi@raspberrypi ~ $ cat /mnt/1wire/28.1CC484040000/temperature
     25.4375

А для того что бы записать какое либо значение в устройство, достаточно записать это значение в соответствующий файл.

pi@raspberrypi ~ $ echo "1" > /mnt/1wire/12.C4DF1F000000/PIO.A

Вкратце о назначениях некоторых файлов в директории (например ключа DS2406):

PIO.* — состояние встроенного транзистора.
sensed.* — логический уровень входа
Когда DS2406 работает как ключ и переключает нагрузку нужно менять свойство PIO. при изменении PIO изменяется sensed.
Когда DS2406 работает как датчик, то при замыкании контактов свойство PIO не меняется, но меняется sensed
latch.* — флажок срабатывания.
Например вы проверяете состояние датчика раз в минуту. Для вашей задачи этого достаточно. Но датчик может замкнуться между проверками. В момент проверки свойство sensed будет Выкл. Но latch скажет вам, что срабатывание было. Это средство, которое помогает отказаться в некоторых случаях от циклического опроса датчика. После проверки latched его необходимо сбросить.

Теперь о том как я всё это связал со своим софтом (который я пишу на PHP). Изначально я написал коннектор для работы с файловой системой, который писал или читал значения из файлов. Но оказывается вместе с пакетом OWFS идёт библиотека для работы через PHP. Изначально пакет OWFS нужно настроить на работу не как файловая система, а как простой сервер который висит на определённом порте (у меня 3000).

/opt/owfs/bin/owserver -uall --nozero -p 127.0.0.1:3000

Далее пишем PHP скрипт с помощью которого подключаемся к OWFS серверу и читаем или записываем значения.

   // подключение библиотеки из пакета OWFS
   include "ownet.php";
   $ow = new OWNet('tcp://localhost:3000');
   
   // читаем значение с датчика
   $value = $ow->get('/28.1CC484040000/temperature', false);
   echo $value;

   // устанавливаем значение в ключе, в канале A
   $ow->set('/12.C4DF1F000000/PIO.A', '1');

мастер DS9490R

Но радость по поводу того что всё чётко работает была не долгой. При подключении нескольких датчиков и увеличение длинны кабеля часть из датчиков отваливалось и больше небыли видны в системе.

IMG_1845

При штудировании интернета выяснилось что мастер с пассивной подтяжкой не пригоден для нормального функционирования. Поэтому было принято решение заказать мастер DS9490R с активной подтяжкой и подключением к USB. Заказал на hobby-board и через полтора месяца я стал обладателем этого синего «свистка».

photo_132

так как ядро линукс поддерживало ограниченное количество типов устройств, то встал вопрос о выборе софта который бы поддерживал данное устройство, а так же разнообразные типы датчиков и устройств 1-wire. Далеко ходить не надо, для 1-wire был разработан специализированный пакет OWFS ( http://owfs.org ).

подключение первого устройства

Для подключения первого устройства, я в ближайшем магазине прикупил термометр для шины 1-wire DS18B20.

DS18B20_1

 

Порыскав в интернет нашёл схему подключения непосредственно к самому компьютеру на вывод GPIO4 с резистором в качестве пассивной подтяжки.

ds1820connect

 

Данное устройство может работать и на паразитном питании, но в своём доме я изначально решил не использовать его, и к каждому устройству у меня подведено +5 и +12 вольт. Далее надо было как то считать показания с этого девайса.

в линукс есть поддержка 1-wire на уровне ядра, надо только предварительно включит её.

Device Drivers  --->
    <*> Dallas's 1-wire support  --->
        1-wire Bus Masters  --->
            <*> GPIO 1-wire busmaster
        1-wire Slaves  --->
            <*> Thermal family implementation

после включения поддержки и сканирования сети на диске появляется директория «/sys/devices/w1 bus master» с уникальными идентификаторами обнаруженных устройств .

# ls -la /sys/devices/w1\ bus\ master/
total 0
drwxr-xr-x    4 root     root             0 Jan  1 01:06 .
drwxr-xr-x    6 root     root             0 Jan  1 01:05 ..
drwxr-xr-x    3 root     root             0 Jan  1 01:06 28-000001e68904
lrwxrwxrwx    1 root     root             0 Jan  1 01:07 driver -> ../../bus/w1/drivers/w1_master_driver
drwxr-xr-x    2 root     root             0 Jan  1 01:07 power
lrwxrwxrwx    1 root     root             0 Jan  1 01:07 subsystem -> ../../bus/w1
-rw-r--r--    1 root     root          4096 Jan  1 01:07 uevent
-rw-rw-rw-    1 root     root          4096 Jan  1 01:07 w1_master_add
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_attempts
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_max_slave_count
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_name
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_pointer
-rw-rw-rw-    1 root     root          4096 Jan  1 01:07 w1_master_pullup
-rw-rw-rw-    1 root     root          4096 Jan  1 01:07 w1_master_remove
-rw-rw-rw-    1 root     root          4096 Jan  1 01:07 w1_master_search
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_slave_count
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_slaves
-r--r--r--    1 root     root          4096 Jan  1 01:07 w1_master_timeout

Далее мы можем прочитать какие либо данные с устройства (например текущую температуру с термометра)

# cat /sys/devices/w1\ bus\ master/28-000001e68904/w1_slave
dd 01 4b 46 7f ff 03 10 1e : crc=1e YES
dd 01 4b 46 7f ff 03 10 1e t=29812

Здесь число 29812 означает, температуру: 29.812°C

среда для обмена данными

Wire-1024x1024В качестве среды для обмена данными я выбрал 1-wire. Чем это было обусловлено:
- дешевизна
- большое количество разнообразных устройств
- большое количество документации в интернете
- помехоустойчивость
- энергонезависемость (не надо менять батарейки)
- быстродействие (для своих целей)

Из минусов могу назвать только то что к каждому датчику надо подводить отдельный кабель. некоторые называют минусом обязательное наличие «мастера» (контроллера), ну а как же без него (хотя забегая вперёд скажу что некоторые критичные вещи я делал так что бы при потере мастера они сохраняли базовый функционал).
Что же представляет из себя шина 1-wire. Это двунаправленная шина связи для устройств с передачей данных (обычно 15,4 Кбит/с, максимум 125 Кбит/с в режиме overdrive), в которой данные передаются по цепи питания (то есть всего используются два провода — один для заземления, а второй для питания и данных; в некоторых случаях используют и отдельный провод питания). Соответственно, топология такой сети — общая шина.
Каждое устройство 1-Wire имеет уникальный номер в сети.

По спецификации сеть должна иметь топологию шина, то есть один кабель который проходит через все датчики. На практике же такую структуру очень сложно добиться в доме. Опять же забегая вперёд скажу, что у меня дома проложена топология «звезда» и всё работает без проблем.

148Fig03

Причём на каждом луче звезды может находится несколько устройств. Я не говорю что это правильно, но по крайне мере у меня всё работает без проблем.

ещё один фактор повлиявший на выбор 1-wire, это то что уже в каждую комнату на стадии строительства были разведены ethernet витые пары. И так как все компьютеры в доме перешли на WiFI, то надобность в этих проводах отпала и я их приспособил под 1-wire. Оставалось только от точки где выходил кабель в комнату развести его по всей комнате (либо за регипсом, либо под плинтусом).

мозг умного дома

С самого начала решил использовать компьютер с привычной для меня линуксом.

В первую очередь хотелось миниатюрный, недорогой и не прожорливый до электричества. Выбор пал на raspberry pi. за 30 EUR заказал в интернет магазине и уже через сутки я держал вожделенную коробочку у себя в руках.

1236176_554958747887410_1055995285_n

Технические подробности
Raspberry Pi выпускается в двух комплектациях: модель «A» и модель «B». У меня версия «B». Плата оснащена ARM11 процессором Broadcom BCM2835 с тактовой частотой 700 МГц и модулем оперативной памяти на 512МБ, размещенными по технологии «package-on-package ruen» непосредственно на процессоре. Модель «B» оснащается двумя USB 2.0 портами. Также у модели «B» присутствует порт Ethernet. Помимо основного ядра, BCM2835 включает в себя графическое ядро с поддержкой OpenGL ES 2.0, аппаратного ускорения и FullHD-видео и DSP-ядро.

С платой шла флеш карточка, на которой уже стоял linux Raspbian, его и оставил в качестве ОС. Через apt-get доставил MySQL, Apache и PHP. Всё завелось с пол тычка.

как я дошёл до умного дома

9Идея создать умный дом, ветала ещё с самого детства. Всегда хотелось чем то управлять или автоматизировать.

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

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

Перечитав кучу литературы я определился с концепцией и вывел для себя несколько пунктов:
- в качестве мозга будет компьютер с linux
- в качестве среды передачи данных между датчиками будет 1-wire
- в качестве софта управления будет PHP
- в качестве веб будет тот же PHP, apache, MySQL