Как отправлять критические уведомления из промышленных SCADA-систем по SMS API
SCADA-системы — это программно-аппаратные комплексы для мониторинга и управления промышленными процессами. При сбоях и авариях они формируют критические уведомления о перегревах, утечках, отказах оборудования и других опасных ситуациях.
Отправлять такие оповещения в Telegram значит их гарантированно потерять. Поэтому мы решили сделать интеграцию с Exolve API для их автоматической отправки для мгновенного оповещения ответственных специалистов через SMS.
Архитектура интеграции SCADA с Exolve API
Прежде чем выстраивать интеграцию, стоит понять, как весь процесс будет выглядеть на практике. Вот общая схема:

Рассмотрим детальнее основные аспекты архитектуры взаимодействия.
1. Общая схема взаимодействия SCADA-системы и Exolve API.
SCADA-система фиксирует аварийные события (например, превышение температуры, отказ насоса, утечка газа) и передает их в Exolve API. API, в свою очередь, обрабатывает данные, определяет получателей и отправляет уведомления по заданным каналам (SMS, email, push-уведомления).
2. Варианты интеграции.
Интеграция может выполняться двумя основными способами:
Встроенные механизмы SCADA: большинство SCADA-систем (например, WinCC, Ignition, Wonderware) поддерживают выполнение скриптов (Python, JavaScript) или модули связи (OPC UA, MQTT, REST API). Это позволяет отправлять HTTP-запросы к Exolve API напрямую.
Внешние сервисы: если SCADA не поддерживает прямую отправку HTTP-запросов, можно использовать промежуточный сервер или шлюз (Node-RED, Python-сервис, облачные функции), который получает события от SCADA (через OPC, MQTT, базы данных) и пересылает их в Exolve API.
3. Поток обработки событий.
SCADA фиксирует аварийное событие в реальном времени.
Настроенные триггеры или скрипты формируют уведомление.
Данные передаются в Exolve API (через HTTP POST или MQTT).
Exolve API анализирует событие, выбирает получателей и форматирует сообщение.
Уведомление отправляется по заданным каналам связи.
Ответственные специалисты получают сообщение и реагируют на аварию.
Интеграция с популярными SCADA-системами
Интеграцию Exolve API с промышленными SCADA-системами можно реализовать с использованием встроенных скриптовых языков, настройки HTTP-запросов или через промежуточный сервер. Рассмотрим каждый из этих подходов.
Использование встроенных скриптовых языков
Многие SCADA-системы поддерживают выполнение пользовательских скриптов на языках, таких как Python, Lua или VBScript. Это позволяет напрямую вызывать Exolve API для отправки уведомлений.
Пример на Python (для SCADA с поддержкой Python):
import requests
api_key = "ваш_api_ключ"
url = "https://api.exolve.ru/send_sms"
payload = {
"api_key": api_key,
"phone": "+79123456789",
"text": "Критическое уведомление: температура превышена.",
"sender": "SCADA"
}
response = requests.post(url, json=payload)
if response.status_code == 200:
print("SMS отправлено успешно:", response.json())
else:
print("Ошибка:", response.status_code, response.text)
Пример на VBScript (для WinCC):
Dim http, url, apiKey, phone, text, sender
apiKey = "ваш_api_ключ"
url = "https://api.exolve.ru/send_sms"
phone = "+79123456789"
text = "Критическое уведомление: температура превышена."
sender = "SCADA"
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", url, False
http.SetRequestHeader "Content-Type", "application/json"
http.Send "{""api_key"":""" & apiKey & """,""phone"":""" & phone & """,""text"":""" & text & """,""sender"":""" & sender & """}"
If http.Status = 200 Then
WScript.Echo "SMS отправлено успешно: " & http.ResponseText
Else
WScript.Echo "Ошибка: " & http.Status & " " & http.ResponseText
End If
Примеры настройки HTTP-запросов в SCADA-системах
1. WinCC.
WinCC позволяет настраивать HTTP-запросы через встроенные скрипты VBScript или C-скрипты. Пример выше демонстрирует использование VBScript для отправки SMS через Exolve API.
2. Ignition.
Ignition поддерживает Python-скрипты и имеет встроенные инструменты для работы с HTTP-запросами. Пример на Python:
from system.net import postToURL
import json
api_key = "ваш_api_ключ"
url = "https://api.exolve.ru/send_sms"
payload = {
"api_key": api_key,
"phone": "+79123456789",
"text": "Критическое уведомление: температура превышена.",
"sender": "SCADA"
}
response = postToURL(url, json.dumps(payload), {"Content-Type": "application/json"})
if response.isSuccessful():
print("SMS отправлено успешно:", response.getResponseText())
else:
print("Ошибка:", response.getStatusCode(), response.getResponseText())
3. MasterSCADA.
MasterSCADA поддерживает выполнение скриптов на Lua. Пример:
local http = require("socket.http")
local ltn12 = require("ltn12")
local api_key = "ваш_api_ключ"
local url = "https://api.exolve.ru/send_sms"
local payload = {
api_key = api_key,
phone = "+79123456789",
text = "Критическое уведомление: температура превышена.",
sender = "SCADA"
}
local response = {}
local body = "api_key=" .. api_key .. "&phone=" .. payload.phone .. "&text=" .. payload.text .. "&sender=" .. payload.sender
local result, status_code = http.request{
url = url,
method = "POST",
headers = {
["Content-Type"] = "application/json",
["Content-Length"] = #body
},
source = ltn12.source.string(body),
sink = ltn12.sink.table(response)
}
if status_code == 200 then
print("SMS отправлено успешно:", table.concat(response))
else
print("Ошибка:", status_code, table.concat(response))
end
Использование промежуточного сервера для маршрутизации уведомлений
Для сложных систем или случаев, когда SCADA-система не поддерживает прямую интеграцию с API, можно использовать промежуточный сервер. Этот сервер будет принимать данные от SCADA-системы, формировать запросы к Exolve API и обрабатывать ответы.
Пример архитектуры:
SCADA-система отправляет данные на промежуточный сервер через HTTP, MQTT или другой протокол.
Промежуточный сервер (например, на базе Node.js, Python или Java) обрабатывает данные, формирует запрос к Exolve API и отправляет уведомление.
Сервер логирует результаты и возвращает статус SCADA-системе.
Пример на Python (промежуточный сервер):
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/send_notification', methods=['POST'])
def send_notification():
data = request.json
api_key = "ваш_api_ключ"
url = "https://api.exolve.ru/send_sms"
payload = {
"api_key": api_key,
"phone": data["phone"],
"text": data["text"],
"sender": "SCADA"
}
response = requests.post(url, json=payload)
if response.status_code == 200:
return jsonify({"status": "success", "message_id": response.json()["message_id"]})
else:
return jsonify({"status": "error", "code": response.status_code, "message": response.text}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Этот подход обеспечивает гибкость и масштабируемость, особенно в системах с большим количеством SCADA-узлов.
Практический пример
В этом разделе рассмотрим реализацию сценария отправки уведомлений через Exolve API при превышении температурного порога в SCADA-системе. Схематично это будет выглядеть так:

Мы разберем подробнее конфигурацию SCADA, написание кода для отправки сообщений и тестирование работы системы.
Реализация сценария: отправка уведомлений при превышении температурного порога
Сценарий:
SCADA-система мониторит температуру на промышленном объекте.
При превышении заданного порога (например, 100 °C) система отправляет SMS-уведомление через Exolve API.
Уведомление содержит информацию о текущей температуре и времени события.
Конфигурация SCADA для мониторинга параметров
Для мониторинга температуры в SCADA-системе необходимо настроить соответствующий тег (переменную), который будет считывать данные с датчика. Рассмотрим пример для WinCC:
Создайте новый тег Temperature типа Float для хранения текущего значения температуры.
Настройте связь тега с устройством (например, через OPC-сервер или драйвер).
Создайте аларм (тревогу) для тега Temperature, установив пороговое значение 100 °C.
Настройте триггер аларма для вызова скрипта при срабатывании.
Написание кода отправки сообщений через API
Для отправки SMS-уведомлений при срабатывании аларма используем встроенный скриптовый язык SCADA-системы. Пример для WinCC на VBScript:
Sub SendTemperatureAlert(temperature)
Dim http, url, apiKey, phone, text, sender
apiKey = "ваш_api_ключ"
url = "https://api.exolve.ru/send_sms"
phone = "+79123456789"
text = "Критическое уведомление: температура превышена. Текущее значение: " & temperature & "°C."
sender = "SCADA"
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", url, False
http.SetRequestHeader "Content-Type", "application/json"
http.Send "{""api_key"":""" & apiKey & """,""phone"":""" & phone & """,""text"":""" & text & """,""sender"":""" & sender & """}"
If http.Status = 200 Then
LogMessage "SMS отправлено успешно: " & http.ResponseText
Else
LogMessage "Ошибка: " & http.Status & " " & http.ResponseText
End If
End Sub
Sub LogMessage(message)
' Логирование сообщений в файл или SCADA-систему
Dim fso, logFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set logFile = fso.OpenTextFile("C:\SCADA_Logs\Exolve_API.log", 8, True)
logFile.WriteLine Now() & " - " & message
logFile.Close
End Sub
Для интеграции с алармом в настройках аларма добавьте вызов функции SendTemperatureAlert с передачей текущего значения температуры.
Тестирование работы и анализ логов
Тестирование:
Установите значение температуры выше порогового (например, 105 °C) через симулятор или вручную.
Убедитесь, что аларм срабатывает и вызывается скрипт отправки SMS.
Проверьте получение SMS на указанный номер телефона.
Анализ логов:
Проверьте файл логов C:\SCADA_Logs\Exolve_API.log на наличие записей об отправке SMS и возможных ошибках.
Пример записи в логе:
2023-10-10 14:30:45 - SMS отправлено успешно: {"status":"success","message_id":"1234567890"}
В случае ошибок (например, 401 или 429) проверьте корректность API-ключа и лимиты запросов.
Интеграция Exolve API с промышленными SCADA-системами для отправки критических уведомлений — это эффективное решение для оперативного оповещения о критических событиях. Использование встроенных скриптовых языков, настройка HTTP-запросов и промежуточных серверов позволяет гибко адаптировать систему под конкретные задачи.
В будущем систему можно расширить за счет добавления поддержки мультиканальных уведомлений (SMS, голосовые вызовы и так далее), интеграции с системами аналитики для прогнозирования событий, а также автоматизации обработки ответов API для более гибкого управления уведомлениями. Это позволит повысить отказоустойчивость и удобство использования системы.
Автор: Роман Андреев