
Компания Honeywell (Ademco) разрабатывает популярные охранные системы VISTA, начиная от простых VISTA-10 до богатых функционалом VISTA-250. Многофункциональные охранные системы VISTA-128/250 содержат порт RS232, что позволяет интегрировать их в любую другую систему.
Мне была поставлена задача: "Интегрировать охранную систему VISTA-10 L в систему домашней автоматизации Fibaro, из одного мобильного приложения нужно управлять и освещением и гаражными воротами и ставить дом на охрану".
При беглом изучении VISTA-10 L, выяснилось, что никакого UART там нет и в помине. К счастью на просторах американского интернета была найдена компания www.alarmdecoder.com, которая занимается разработкой плат имитирующих работу пульта управления. Плата существует в 3-х вариантах подключения: USB, RS-232, UART шилд для Raspberry Pi. Я выбрал шилд AD2Pi для Raspberry Pi.

Плата AD2Pi подключается к клеммам пульта управления и для охранной системы представляется, как еще один пульт управления и индикации.

Пульт управления и индикации (control panel)
Схема подключения проста:
| AD2Pi | VISTA контрольная панель |
| - | 4 — KEYPAD GROUND (-) |
| + | 5 — KEYPAD PWD (+) |
| DI | 6 — DATA IN TO KEYPAD |
| DO | 7 — DATA OUT TO KEYPAD |

После подключения AD2Pi к контрольной панели VISTA, переходим к работе с софтом. alarmdecoder позволяет полностью управлять и мониторить охранную систему.
1) Установка python библиотеки alarmdecoder
alarmdecoder позволяет принимать все системные сообщения в распарсенном виде, отправлять команды управления и настройки.
pip install alarmdecoder
или из git
git clone https://github.com/nutechsoftware/alarmdecoder.git cd alarmdecoder python setup.py install
2) Установка ser2sock — Serial to Socket Redirector
ser2sock позволяет подключиться к serial порту удаленно, это нужно чтобы управлять охранной системой не только с Raspberry Pi, но и с любого другого компьютера/устройства напрямую.
git clone https://github.com/nutechsoftware/ser2sock.git
Подробности установки тут: https://github.com/nutechsoftware/ser2sock
3) Настройка платы AD2Pi
Первым делом нужно настроить плату AD2Pi, чтобы оно передавала нам все интересующие события. Подключитесь к serial порту AD2Pi через minicom и для входа в режим настройки введите "!". Обратите внимание, что адрес виртуальной панели управления должен быть 31, LRR должен быть Y, и маска по адресам ffffffff, т.е. получать сообщения от всех.
sudo minicom -d /dev/ttyAMA0

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

4) Проверка работоспособности системы
Запускаем ser2sock и слушаем порт 10000:
sudo /etc/init.d/ser2sock start nc localhost 10000
Должны увидеть сообщения от системы:

5) Обработка сообщений от охранной системы

Python cкрипт отправки сообщений от alarmdecoder на контроллер автоматизации Home Center 2
#!/usr/bin/python # -*- coding: utf-8 -*- import json import base64 import time from time import gmtime, strftime import requests from requests.auth import HTTPBasicAuth from alarmdecoder import AlarmDecoder from alarmdecoder.devices import SocketDevice # Configuration values HOSTNAME = 'localhost' PORT = 10000 # Fibaro access username = "admin" password = "admin" def main(): """ Example application that prints messages from the panel to the terminal. """ try: # Retrieve an AD2 device that has been exposed with ser2sock on localhost:10000. device = AlarmDecoder(SocketDevice(interface=(HOSTNAME, PORT))) # Set up an event handler and open the device device.on_message += handle_message device.on_lrr_message += handle_lrr_message with device.open(): while True: time.sleep(1) except Exception, ex: print 'Exception:', ex def handle_message(sender, message): """ Handles message events from the AlarmDecoder. """ print message.text jsonData = {"value":message.text} requests.put('http://10.0.1.43/api/globalVariables/AlarmStatus', json = jsonData, auth=HTTPBasicAuth(username, password)) def handle_lrr_message(sender, message): """ Handles message events from the AlarmDecoder. """ lrr_message = message.event_data + " " + message.event_type print lrr_message jsonData = {"value":lrr_message} requests.put('http://10.0.1.43/api/globalVariables/AlarmUsers', json = jsonData, auth=HTTPBasicAuth(username, password)) if __name__ == '__main__': main()
Для обработки сообщения я написал небольшой python скрипт, который поставил в автозагрузку.
Скрипт подключается к сервису ser2sock, получает от него сообщения и отправляет их на контроллер автоматизации Home Center 2. На контроллере я обрабатываю сообщения, отображаю их в виртуальном устройстве и отправляю push notification о статусе охранной системы.
6) Виджет для управления охранной системой Home Center 2

На Home Center 2 я создал виртуальное устройство, с помощью которого можно ставить на охрану в разных режимах, снимать с охраны и на который выводится статус системы и информация о том кто поставил или снял с охраны.
Чтобы поставить или снять с охраны, нужно всего лишь отправить TCP запрос с кодом постановки/снятия.

Lua скрипт для обработки сообщений от alarmdecoder
-- Check alarm status securityStatus = fibaro:getGlobalValue('AlarmStatus') lastSecurityStatus = fibaro:getGlobalValue('lastSecurityStatus') -- Show messages from alarm system if (lastSecurityStatus ~= securityStatus) then fibaro:call(108, "setProperty", "ui.Label1.value", os.date("%x %X ") .. securityStatus) fibaro:setGlobal('lastSecurityStatus',securityStatus) fibaro:debug(fibaro:getValue(108, 'ui.Label1.value')) end -- Check alarm user and event alarmUsers = fibaro:getGlobalValue('AlarmUsers') lastAlarmUsers = fibaro:getGlobalValue('lastAlarmUsers') -- If security status changed then show new status and send push if (lastAlarmUsers ~= alarmUsers) then fibaro:setGlobal('lastAlarmUsers',alarmUsers) userID = string.sub(alarmUsers, 3, 3) event = string.sub(alarmUsers, 5) -- set user name if userID == "4" then userID = "Raspberry" elseif userID == "3" then userID = "Жена" elseif userID == "2" then userID = "Муж" end -- set translated event if event == "ARM_AWAY" then event = "Поставил на охрану" elseif event == "ARM_STAY" then event = "Частично поставил на охрану" elseif event == "OPEN" then event = "Снял с охраны" end fibaro:call(108, "setProperty", "ui.Label2.value", event .. " " .. userID) fibaro:debug(fibaro:getValue(108, 'ui.Label2.value')) fibaro:call(100, "sendPush", fibaro:getValue(108, 'ui.Label2.value')) fibaro:call(25, "sendPush", fibaro:getValue(108, 'ui.Label2.value')) end
Также потребовалось завести несколько глобальный переменных на Home Center 2, которые хранят текущее состояние системы и пользователей.

Всю информация, которая выводится на панель управления: снято/поставлено на охрану, сработка датчика, низкий заряд батареи датчика, переход на резервное питание и др, можно обрабатывать и отправлять в систему автоматизации для дальнейших действий.
Все устройства Home Center 2 транслируются в homebridge, что позволяет ставить на охрану и снимать с помощью голосового ассистента Siri.
Платы от alarmdecoder можно использовать с любой системой автоматизации, подробная документация и удобный API позволяют удобно и быстро интегрировать охранную систему в любой умный дом!