Яндекс.Карты для диспетчеризации ЖКХ
В современной системе ЖКХ важное место занимает учет коммунальных ресурсов. Существует целый класс приборов, называемых теплосчетчиками, используемых для расчета потребленного тепла и ГВС в отдельно взятом многоквартирном жилом доме (МЖД) или подъезде, о них и пойдет речь.
Стоит разделять коммерческий учет и технологический. В первом случае используются поверенные приборы, программное обеспечение, имеющее свидетельство о сертификации, и главное – огромная бумажная волокита. Второй случай интереснее: отсутствие внешних требований для компаний, большая гибкость в решении вопросов эксплуатации систем автоматики, в общем, простор для творчества.
По долгу службы автор эксплуатирует систему диспетчерской связи по узлам учета тепловой энергии отдельно взятого района города N с миллионным населением. Данная система состоит из 4 ключевых элементов:
- первичные регистраторы (теплосчётчики, тепловычислители);
- передающие конверторы;
- каналы связи (Ethernet, GSM, GPRS);
- программное обеспечение.
В качестве программного обеспечения для коммерческого учета используются продукты, разработанные производителями приборов учета. Система технологического учета отсутствовала на эксплуатирующем жилищный фонд предприятии.
Проведя опросы аварийных и диспетчерских служб, стало ясно – необходима информационная система, в которой содержалась бы оперативная информация об инженерных коммуникациях МЖД. После недолгих споров выбрали Rapid SCADA версии 3, недавно перешли на версию 4.
Используя существующие каналы связи, через сервера OPC текущие параметры приборов учета попадают в SCADA-Коммуникатор, затем в SCADA-Сервер. Представим схему связи приборов учета и сервера данных на рис. 1.
Рис. 1. Структурная схема системы
Рис. 2. Отображение информации через веб-интерфейс Rapid SCADA
На рис. 2 показан пример информации о температуре ГВС нескольких МЖД. Представьте, что мы добавим в таблицу ещё и расходы по трубопроводам, показания электросчётчиков, данные лифтового хозяйства. Таблица станет перегруженной и нечитаемой для оперативного персонала, можно сделать несколько таблиц, но и это не облегчит работу операторов.
Появилась задача: сделать визуализацию данных Rapid SCADA максимально упрощённой и, главное, наглядной для руководства компании. Отталкиваясь от классификации объектов (а это жилые дома), напрашивается решение – интерактивная карта.
Компания Яндекс предоставляет отличный API-интерфейс для работы с картами городов России. Особенности отображения информации Rapid SCADA на карте, которые были реализованы:
- обновление показаний без перезагрузки карты;
- цвет метки отражает состояние: синий – низкое значение, зелёный – норма, красный – высокое;
- в одном доме может быть несколько приборов учёта, поэтому предусмотрена группировка – отображение значений каналов со всех установленных в доме приборов в одной метке.
Рассмотрим, как связать Rapid SCADA с Яндекс.Картой (рис. 3). Доступ к серверу SCADA имеет смысл ограничить в целях безопасности, потому воспользуемся всеми преимуществами API Rapid SCADA для децентрализации размещения данных SCADA и страницы с картой. Разработанный автором Windows-сервис по протоколу TCP получает значения входных каналов и складывает их в базу MySQL, которая используется в качестве источника информации для карты. Далее PHP-приложение, получив данные из базы MySQL, формирует веб-страницы, содержащие JavaScript-код, отображающий информацию на Яндекс.Картах.
Рис. 3. Взаимодействие ПО
1. Таблица в базе MySQL – источник информации для карты
Структура таблицы:
Колонка | Тип | Комментарий |
---|---|---|
idChannel | mediumint(9) | ID входного канала |
idUKUT | int(8) | ID узла учёта |
channel | char(30) | Номер канала в Rapid SCADA |
channelName | char(30) | Имя канала в Rapid SCADA |
value | char(30) | Значение канала |
last_update | datetime | Последнее обновление |
color | char(30) | Цвет |
Такая структура обусловлена исторически – на предприятии используется самостоятельно разработанная база данных для учета оборудования, установленного на МЖД, поэтому достаточно просто добавить новую таблицу, связав её с данными по узлам учёта с помощью ключа idUKUT. Координаты конкретного жилого дома хранятся в уже существующей таблице базы данных в виде параметров lon, lat:
Колонка | Тип | Комментарий |
---|---|---|
lon | varchar(50) | Долгота |
lat | varchar(50) | Широта |
Написать запрос на получение этих данных из базы для человека знакомого с SQL не составит труда.
2. Заполнение базы данных
Используя API Rapid SCADA, осуществим подключение к приложению SCADA-Сервер, по номерам каналов получим их значения. Для удобства рекомендуется использовать текстовый файл с номерами используемых на карте каналов.
На языке C# был разработан Windows-сервис, отвечающий за получение значений каналов и обновляющий эти данные в базе данных MySQL.
В качестве примера приведена реализация двух ключевых функций Windows-сервиса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Получение свойств и значения канала по его номеру public void GetChannelValue(int channel) { string value; bool unit = true; string color; string channelName; if (channel != 0) { MD.RefreshData(); channelName = MD.GetCnlProps(channel).CnlName.ToString(); value = MD.GetCnlVal(channel, unit, out color).ToString(); UpdateValueChannel(channel, value, channelName, color); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Обновление информации в базе данных MySQL public void UpdateValueChannel(int channel, string temp_value, string channelName, string color) { if (connection.State != ConnectionState.Open) connection.Open(); string decimal_sep = System.Globalization.NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator; temp_value = temp_value.Replace(".", decimal_sep); MySqlCommand command = new MySqlCommand("UPDATE ValueChannel SET value=@value, last_update=@last_update, " + "channelName=@channelName, color=@color WHERE channel=@channel", connection); try { DateTime theDate = DateTime.Now; // Готовим команду command.Prepare(); command.Parameters.AddWithValue("@value", temp_value); command.Parameters.AddWithValue("@channel", channel); command.Parameters.AddWithValue("@channelName", channelName); command.Parameters.AddWithValue("@last_update", theDate.ToString("yyyy-MM-dd H:mm:ss")); command.Parameters.AddWithValue("@color", color); // Выполняем command.BeginExecuteNonQuery(); } catch (MySqlException ex) { } } |
3. Вывод информации на карту
JSON (англ. JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.
Для наших целей используем упорядоченный набор значений, это обусловлено простотой и небольшим объемом информации. Формируется JSON последовательность скриптом, написанным на языке PHP.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[ [ "851", "56.910979", "60.600897", "2014-03-28 14:27:36", "СПТ-943.1 №11255", "67 °C", "2", "", "Бакинских коммисаров, 118", "10", "1102", "55800003" ], [ "875", "56.892684", "60.608658", "2014-03-28 14:27:35", "СПТ-943.1 №12725", "66 °C", "2", "", "Уральских рабочих, 10", "4", "1133", "55800043" ], ... ] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[ [ "1102", "Температура подачи отопления", "1804", "67 °C", "2014-03-28 14:29:16", "Black" ], [ "1102", "Расход подачи отопления", "1802", "9,216 т", "2014-03-28 14:29:16", "Black" ], ... ] |
Первая структура – это пример массива описаний объектов, размещаемых на карте, вторая – пример массива каналов и их значений. Далее, обратившись к документации по использованию API Яндекс.Карт, можно легко вывести информацию на карту.
Рассмотрим код для создания карты:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
function initMap() { map = new ymaps.Map('map', { center: [56.894019, 60.596773], zoom: 11, type: 'yandex#map', behaviors: ['default', 'scrollZoom', 'multiTouch'] }); map.controls.add('mapTools'); map.controls.add('zoomControl', { left: 7, top: 40 }); map.controls.add('typeSelector'); var btnUpdMap = new ymaps.control.Button({ data: { image: 'img/reload.png', content: '', title: 'Обновить показания на карте' } }, { selectOnClick: false }); btnUpdMap.events.add('click', GetMarkers); // Добавим кнопку обновления показаний map.controls.add(btnUpdMap, { left: 4, top: 230 }); map.setCenter([56.894019, 60.596773], 16, { checkZoomRange: true, callback: GetMarkers // Функция получения JSON }); createIconLayout(); // Создадим иконки createItemLayout(); // Создадим маркеры с использованием кластеризатора Яндекс.Карт setInterval(showCnlData, 50000); // Обновляем значения каналов через интервал } |
Таким образом, мы получили на карте метку с указанием значения канала. После внимательного прочтения документации API Яндекс.Карт читателю не составим труда вывести значения нескольких каналов в одну метку. Используйте событие isOpen().
Вот что у нас получилось в итоге (кликните рисунок для увеличения):
Рис. 4. Отображение данных на карте
Такая структура представления информации технологического учета очень наглядна, максимально проста и радует глаз. Если у вас остались вопросы, или Вы хотите внедрить подобную систему у себя на предприятии, обращайтесь к автору статьи.
Автор: Пастухов Алексей Владимирович
Начальник отдела ИТ ООО «ЭкспертСервис»
alex.vl.pas@gmail.com