15 лет спустя: как я модернизировал умный дом на базе PLC и написал свой OPC-сервер для перехода от

Пятнадцать лет назад я собрал умный дом на промышленных контроллерах. Это была крепкая, надежная система. Но время не щадит никого. Особенно legacy-архитектуру. Монолитная SCADA на Windows XP, зависимость от проприетарного софта и невозможность добавить новую «умную» лампочку без перепрограммирования PLC — это тупик. Выход есть — миграция на open-source. Но есть нюанс: старые PLC говорят только на древнем протоколе OPC DA. А современные системы, вроде ioBroker, его не понимают. Я нашел решение. И оно потребовало написать собственный код.
Почему SCADA — это вчерашний день
Моя старая Wonderware работала на отдельном ПК. Она управляла отоплением, светом, вентиляцией. Звучит круто? Только до первого сбоя. Лицензия стоила больше $2000. Каждый год — продление поддержки. Хочешь добавить датчик? Перепрограммируй PLC, перекомпилируй SCADA. Хочешь управлять с телефона? Поднимай VPN. Это не просто неудобно. Это дорого и медленно. Современный умный дом должен быть гибким. WinCC из той же эпохи, кстати, тоже не подарок. Закрытая экосистема душит любую инициативу.
ioBroker: бесплатно и без границ
ioBroker — это open-source платформа на Node.js. Она умеет всё: MQTT, Zigbee, REST API, сотни адаптеров. Главное — модульность. Я оставил PLC как «тупые» исполнительные устройства. Всю логику управления вынес на ioBroker. Но связка уперлась в протокол. Мои PLC работали через OPC DA (устаревший, медленный, но живучий). ioBroker из коробки не умеет с ним работать. Нужен был мост. Готовые шлюзы стоят от $500. И они не дают гибкости. Пришлось писать свой OPC-сервер.
Как я написал мост между прошлым и будущим
Я выбрал Node.js и библиотеку node-opcua. Задача: читать данные из PLC по OPC DA (через DCOM) и отдавать их по современному OPC UA. Звучит просто. На деле — пришлось писать C++ модуль для обертки COM-интерфейса. Вот упрощенный фрагмент кода сервера:
// Код OPC UA сервера на Node.js
const { OPCUAServer, DataType, Variant } = require('node-opcua');
const opcDaClient = require('./opcDaClient'); // самописный C++ модуль
const server = new OPCUAServer({ port: 4840, resourcePath: '/UA/PLC' });
server.initialize(async () => {
const namespace = server.engine.getNamespace(1);
const folder = namespace.addObject({ organizedBy: server.engine.rootFolder.objects, browseName: 'PLCData' });
['Temperature', 'Pressure', 'Light'].forEach(name => {
namespace.addVariable({
componentOf: folder, browseName: name, dataType: DataType.Float,
value: { get: () => new Variant({ dataType: DataType.Float, value: opcDaClient.read(name) }) }
});
});
await server.start();
console.log('OPC UA server is running on port 4840');
});
Важный момент: DCOM — это боль. Настройка безопасности на Windows-машине с PLC заняла больше времени, чем сам код. Можно упростить, используя готовую npm-библиотеку opc-da-client, но она тоже требует возни с DCOM.
Старая SCADA vs Новая связка: цифры и факты
- Стоимость лицензии: $2000+ против $0. Разница очевидна.
- Гибкость: Только Windows против любой ОС, включая Docker.
- Интеграция: Требует PLC-программиста против адаптеров ioBroker (MQTT, BLE).
- Удаленный доступ: VPN или RDP против веб-интерфейса и облачных сервисов.
- Масштабируемость: До 10 PLC против неограниченной.
Сложность разработки выросла. Но это разовая инвестиция времени. Взамен вы получаете систему, которую можете расширять без оглядки на вендора.
Настройка ioBroker: от сервера до Telegram-бота
Установите адаптер OPC UA в ioBroker. Укажите адрес: opc.tcp://localhost:4840/UA/PLC. Адаптер сам найдет все переменные. Дальше — дело техники. Вот пример скрипта для управления светом:
const temperature = getState('opcua.0.PLCData.Temperature').val;
if (temperature > 25) {
setState('opcua.0.PLCData.Light', 0); // выключить свет
}
Личное наблюдение автора
Самым сложным оказался не код, а совместимость. Я пытался настроить DCOM между Windows XP и Windows 10. Это ад. В итоге я пошел на хитрость: запустил OPC DA клиент на том же старом ПК, где стояла SCADA, и передавал данные по TCP на мой Node.js сервер на Linux. Задержка выросла на 50 мс. Для умного дома это не критично. Зато теперь я могу выключить свет через Telegram-бота. Мелочь, а приятно. Проект занял месяц вечеров. Экономия на лицензиях окупилась за полгода.
Резюме от автора
Миграция с монолитной SCADA на ioBroker — это реально. Даже если ваши PLC говорят на древнем OPC DA. Ключ к успеху — написать промежуточный OPC-сервер. Это не rocket science. Это инженерная задача, которую можно решить за разумное время. В итоге вы получаете современную, гибкую и дешевую систему. И главное — вы снова контролируете свой дом, а не он вас.


