Перейти к содержанию

Обработка ответа

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

Template

Для простой обработки ответа можно использовать шаблон. В качестве примера рассмотрим 2 ответа контроллера MegaD.

Запрос значения 1wire датчика температуры

Пример обработки ответа с помощью шаблона

Пример обработки ответа с помощью шаблона

Запрос http://10.35.16.11/sec/?pt=30&cmd=get возвращает ответ вида temp:24.93. Для того чтобы извлечь из ответа только значение (без "temp: ") необходлимо целевую часть ответа (в данном случае значение 24.93) заменить плейсхолдером {{.}}.

Запрос состояние входного порта

Пример обработки ответа с помощью шаблона

Пример обработки ответа с помощью шаблона

В первом примере ответ всегда представлен одинаковой структурой, но бывают случаи когда ответ содержит целевое значени, а также динамически меняющиеся данные. Запрос http://10.35.16.11/sec/?pt=0&cmd=get возвращает ответ вида OFF/19, где OFF - текущее состояние, а 19 - количество нажатий/активаций . Поэтому мы не можем использовать шаблон {{.}}/19, т.к. при новых сработках порта значение 19 изменится и шаблон не сработает. Чтобы игнорировать часть ответа, его нужно заменить символом * {{.}}/*. В этом случае система будет игнорировать значение после /.

JSON

Если ответ представляет собой json структуру, то к данным можно обратиться по имени ключа.

Предположим, что ответ имеет следующую структуру:

{
  "port": 31,
  "value": {
    "temp": 27.24,
    "press": 752.4,
    "hum": 46.509
  }
}

Чтобы получить номер порта, необходимо указать ключ port. Также поддерживаются вложенные ключи, поэтому для получения значения температуры нужно указать value.temp (вложенный ключ отделяется от родительского точкой).

Пример обработки ответа в виде json

Пример обработки ответа в виде json

Regex

Регулярные выражения могут применяться и как замена указанным выше способам, и как решение для сложных и нестандартных обработок.

Предположим, что ответ имеет следующую структуру:

{
  "device_id": "TH-204",
  "timestamp": "2026-07-10T14:32:00Z",
  "diagnostics": {
    "log": "[INFO] boot ok\n[INFO] calibration offset=+0.3\n[DATA] reading: temp:23.47;hum:41;ts=1720613520\n"
  }
}

Из этого ответа требуется получить значение температуры, которое находиться в значении ключа log. Получить значение с помощью способов выше не получиться. Но можем использовать регулярное выражение (?:temp:)(-?\d+(?:.\d+)?).