# Прошивка UMNI UNI

Техническое описание программного обеспечения контроллера автоматизации УМНЫЙ К1

# Универсальный REST API для управления устройствами

Данная глава описывает REST API для взаимодействия с универсальной прошивкой (программным обеспечением) контроллера УМНЫЙ К1.

Основной упор сделан на простоту интеграций, автономность и децентрализованность.

REST API может использоваться в связке с любым языком программирования, поддерживающим работу с протоколом HTTP

# REST API v1.0

## Спецификация протокола REST API

<p class="callout warning">Внимание! Не подключайте контроллер в публичную сеть Интернет! Вместо этого используйте локальную сеть, или выделенную подсеть для безопасного администрирования контроллера и прокси сервера (Nginx, Apache как обратный прокси).</p>

### Формат данных ответа

Каждый ответ от контроллера формируется в виде JSON строки и имеет вид

```json
{
  "success": true,
  "data": {...}
}
```

Свойство data имеет внутри состояние запрашиваемого функционала.

### Список методов

Получение системной информации

```bash
GET /api/systeminfo
```

Ответ

```json
{
  "success": true,
  "data": {
    "hostname": "umni-838a74",
    "capabilities": [
      "ethernet",
      "sdcard",
      "webserver",
      "mqtt",
      "opentherm",
      "rf433",
      "onewire",
      "alarm",
      "ntc1",
      "ntc2",
      "ai1",
      "ai2",
      "opencollectors",
      "oc1",
      "oc2",
      "buzzer",
      "inputs",
      "inp1",
      "inp2",
      "inp3",
      "inp4",
      "inp5",
      "inp6",
      "outputs",
      "out1",
      "out2",
      "out3",
      "out4",
      "out5",
      "out6",
      "out7",
      "out8"
    ],
    "networks": [
      {
        "name": "ethernet",
        "mac": "44:1d:64:83:8a:77",
        "ip": "192.168.88.122",
        "mask": "255.255.252.0",
        "gw": "192.168.88.9",
        "active": true
      }
    ],
    "heap": {
      "total": 380928,
      "free": 190464,
      "min": 166876
    }
  }
}
```

##### Пояснения

<table border="1" id="bkmrk-hostname-%D0%B8%D0%BC%D1%8F-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81" style="border-collapse: collapse; width: 100%; height: 106.188px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">hostname</td><td style="height: 29.7969px;">имя устройства</td><td style="height: 29.7969px;">строка</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">capabilities</td><td style="height: 46.5938px;">список доступных возможностей контроллера</td><td style="height: 46.5938px;">массив строк</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">networks</td><td style="height: 29.7969px;">список сетевых подключений</td><td style="height: 29.7969px;">объект</td></tr><tr><td>heap</td><td>список общей и доступной оперативной памяти</td><td>объект</td></tr></tbody></table>

##### Возможности контроллера (capabilities)

<table border="1" id="bkmrk-ethernet-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-" style="border-collapse: collapse; width: 100%; height: 983.298px;"><colgroup><col style="width: 50.0596%;"></col><col style="width: 50.0596%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ethernet</td><td style="height: 29.7969px;">устройство использует проводное подключение</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">wifi</td><td style="height: 29.7969px;">устройство использует wifi</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">sdcard</td><td style="height: 29.7969px;">устройство использует microSD карту памяти</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">webserver</td><td style="height: 29.7969px;">устройство использует веб-сервер</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">mqtt</td><td style="height: 29.7969px;">устройство использует клиента mqtt</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">opentherm</td><td style="height: 29.7969px;">устройство использует opentherm (для газовых котлов)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">rf433</td><td style="height: 29.7969px;">устройство использует беспроводной канал 433 мГц</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">onewire</td><td style="height: 29.7969px;">устройство использует onewire</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">alarm</td><td style="height: 29.7969px;">у устройства есть вывод по датчики наличия 12в</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ntc1</td><td style="height: 29.7969px;">у устройства есть NTC термистор №1 (резистор 10К)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ntc2</td><td style="height: 29.7969px;">у устройства есть NTC термистор №2 (резистор 10К)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ai1</td><td style="height: 29.7969px;">у устройства имеется аналоговый вход №1</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ai2</td><td style="height: 29.7969px;">у устройства имеется аналоговый вход №2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">opencollectors</td><td style="height: 29.7969px;">устройство имеет выходы "открытый коллектор"</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">oc1</td><td style="height: 29.7969px;">устройство имеет выход открытого коллектора №1</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">oc2</td><td style="height: 29.7969px;">устройство имеет выход открытого коллектора №2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">buzzer</td><td style="height: 29.7969px;">устройство имеет на своем борту бипер (buzzer)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inputs</td><td style="height: 29.7969px;">устройство имеет цифровые входы</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp1</td><td style="height: 29.7969px;">устройство имеет цифровой вход №1</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp2</td><td style="height: 29.7969px;">устройство имеет цифровой вход №2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp3</td><td style="height: 29.7969px;">устройство имеет цифровой вход №3</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp4</td><td style="height: 29.7969px;">устройство имеет цифровой вход №4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp5</td><td style="height: 29.7969px;">устройство имеет цифровой вход №5</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">inp6</td><td style="height: 29.7969px;">устройство имеет цифровой вход №6</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">outputs</td><td style="height: 29.7969px;">устройство имеет цифровые выходы (релейные выходы)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out1</td><td style="height: 29.7969px;">устройство имеет выход №1</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out2</td><td style="height: 29.7969px;">устройство имеет выход №2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out3</td><td style="height: 29.7969px;">устройство имеет выход №3</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out4</td><td style="height: 29.7969px;">устройство имеет выход №4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out5</td><td style="height: 29.7969px;">устройство имеет выход №5</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out6</td><td style="height: 29.7969px;">устройство имеет выход №6</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out7</td><td style="height: 29.7969px;">устройство имеет выход №7</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">out8</td><td style="height: 29.7969px;">устройство имеет выход №8</td></tr></tbody></table>

<span style="color: rgb(187, 187, 187); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 1.666em; font-weight: 400;">Получение конфигурации</span>

Возвращает JSON объект конфигурации для указанной секции

```
GET /api/conf?section={string}
```

##### Список ответов конфигурационных секций

**adc**

```json
{
  "success": true,
  "data": {
    "channels": [
      {
        "id": 0,
        "label": "ADC Input 1",
        "active": true
      },
      {
        "id": 1,
        "label": "ADC Input 2",
        "active": true
      }
    ]
  }
}
```

**ntc**

```json
{
  "success": true,
  "data": {
    "channels": [
      {
        "id": 0,
        "label": "NTC Sensor 1",
        "active": true
      },
      {
        "id": 1,
        "label": "NTC Sensor 2",
        "active": true
      }
    ]
  }
}
```

**dio**

```json
{
  "success": true,
  "data": {
    "inputs": [
      {
        "config_index": 1,
        "port_index": 1,
        "label": "Input 1 (port 1)",
        "active": true
      },
      ...
    ],
    "outputs": [
      {
        "config_index": 1,
        "port_index": 0,
        "label": "Output 1 (port 0)",
        "active": true,
        "default_state": 0
      },
      ...
    ]
  }
}
```

**onewire**

```json
{
  "success": true,
  "data": {
    "sensors": [
      {
        "sn": "F7062454B2EE5528",
        "label": "Sensor F7062454B2EE5528",
        "active": true
      }
    ]
  }
}
```

**rf433**

```json
{
  "success": true,
  "data": {
    "devices": []
  }
}
```

opencollectors

```json
{
  "success": true,
  "data": {
    "opencollectors": [
      {
        "index": 0,
        "label": "OC1",
        "active": true,
        "state": false
      },
      {
        "index": 1,
        "label": "OC2",
        "active": true,
        "state": false
      }
    ],
    "count": 2
  }
}
```

#### Сохранение конфигурации (сенсоры)

```
POST /api/settings
```

Тело запроса

```json
{
  "setting": "{setting}",
  "values": {...{values}}
}
```

<table border="1" id="bkmrk-setting-%D0%BA%D0%BB%D1%8E%D1%87-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>setting</td><td>ключ настройки</td></tr><tr><td>values</td><td>значения настройки (объект)</td></tr></tbody></table>

##### Типы тела POST запроса для ключа настройки

<div id="bkmrk-mqtt"><div>**mqtt**</div><div>  
</div></div>```json
{
  "en": bool, 
  "host": string, 
  "port": int, 
  "user": ?string, 
  "password": ?string
}
```

<div id="bkmrk-webhook"><div>**webhook**</div><div>  
</div></div>```json
{
  "en": bool, 
  "url": string
}
```

**outputs**

```json
{
  "en": bool, 
  "label": ?string, 
  "index": int
}
```

**inputs**

```json
{
  "en": bool, 
  "label": ?string, 
  "index": int
}
```

**ntc**

```json
{
  "channel":int,
  "active": bool,
  "offset":float,
  "label":string
}
```

**adc**

```json
{
  "channel":int,
  "active": bool,
  "offset":float,
  "label":string
}
```

**onewire**

```json
{
  "serial": string,
  "label": string,
  "active" : bool,
  "calibration": float
}
```

**rf433**

```json
{
  "mode": ?string, //null or delete
  "serial": number, 
  "label": string, 
  "alaram": bool, 
  "type": number
}
```

**opentherm**

```json
{
  "en": bool,
  "ch_en": bool,
  "ch_sp": int,
  "dhw_en": bool,
  "dhw_sp": int,
  "ch2_en": bool,
  "cool_en": bool,
  "mod": int,
  "otc_en": bool
}
```

Пояснения по параметрам

<table border="1" id="bkmrk-en-%D0%90%D0%BA%D1%82%D0%B8%D0%B2%D0%B5%D0%BD-%D0%BB%D0%B8-openth" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>en</td><td>Активен ли Opentherm в контроллере. Вы можете отключить и не использовать этот функционал.</td></tr><tr><td>ch\_en</td><td>Флаг активации режима отопления. При установке значения true, включится режим нагрева теплоносителя на контур отопления.</td></tr><tr><td>ch\_sp</td><td>Пороговое значение температуры теплоносителя, которое будет поддерживаться в контуре отопления при нагреве теплоносителя.</td></tr><tr><td>dhw\_en</td><td>Флаг активации режима горячего водоснабжения. Если отключен, котел не будет включать контур горячей воды или переключать трехходовой клапан (Buderus U072)</td></tr><tr><td>dhw\_sp</td><td>Пороговое значение температуры теплоносителя в контуре горячего водоснабжения.</td></tr><tr><td>ch2\_en</td><td>Второй контур отопления.</td></tr><tr><td>cool\_en</td><td>Охлаждение</td></tr><tr><td>mod</td><td>Уровень модуляции (0-100)</td></tr><tr><td><div><div>otc_en</div></div></td><td>Outside temperature compensation. Режим компенсации температуры по наружному датчику.</td></tr></tbody></table>

Конфигурация устройства (чтение)

```
GET /api/configuration
```

Пример ответа

```
{
  "success": true,
  "data": {
    "title": "My Device",
    "username": "admin",
    "password": null,
    "ntp": "pool.ntp.org",
    "timezone": "MSK-3",
    "socket_port": 8080,
    "token": "secret123",
    "network_mode": 1,
    "wifi_sta_ssid": "HomeWiFi",
    "wifi_sta_password": null,
    "wifi_sta_ip_type": 2,
    "wifi_sta_ip": "192.168.1.100",
    "wifi_sta_netmask": "255.255.255.0",
    "wifi_sta_gateway": "192.168.1.1",
    "wifi_sta_dns": "8.8.8.8",
    "wifi_ap_ssid": "HomeWiFi",
    "wifi_ap_password": null,
    "eth_ip_type": 1,
    "eth_ip": "192.168.1.200",
    "eth_netmask": "255.255.255.0",
    "eth_gateway": "192.168.1.1",
    "eth_dns": "8.8.8.8"
  }
}
```

#### Конфигурация устройства (сохранение)

```
POST /api/configuration
```

Тело запроса (элементы можно передавать не все, а выборочно)

```json
{
    // Системные настройки
    "title": "My Device",
    "username": "admin",
    "password": "1234",
    "ntp": "pool.ntp.org",
    "timezone": "MSK-3",
    "socket_port": 514,
    "token": "secret_token",
 
    // Настройки сети
    "network_mode": 1,           // 1-ETH, 2-WIFI_AP
 
    // Настройки WiFi STA
    "wifi_sta_ssid": "MyWiFi",
    "wifi_sta_password": "pass123",
    "wifi_sta_ip_type": 1,       // 1-DHCP, 2-STATIC
    "wifi_sta_ip": "192.168.1.100",
    "wifi_sta_netmask": "255.255.255.0",
    "wifi_sta_gateway": "192.168.1.1",
    "wifi_sta_dns": "8.8.8.8",
 
    // Настройки WiFi AP
    "wifi_ap_ssid": "UMNI_AP",
    "wifi_ap_password": "",
    "wifi_ap_channel": 6,
    "wifi_ap_max_connections": 4,
    "wifi_ap_hidden": false,
 
    // Настройки Ethernet
    "eth_ip_type": 1,            // 1-DHCP, 2-STATIC
    "eth_ip": "192.168.1.100",
    "eth_netmask": "255.255.255.0",
    "eth_gateway": "192.168.1.1",
    "eth_dns": "8.8.8.8"
  }
 
```

<p class="callout warning">**Внимание!** После установки token, все запросы к API должны идти с заголовком 'Authorization': 'Bearer my\_token', либо с передачей параметра запроса &amp;token=my\_token в URL.</p>

#### Переключение цифровых выходов

```bash
POST /api/switch
```

Тело запроса

```json
{
  "mode": "{mode}",
  "index": 1,
  "level": true|false
}
```

Возможные значения mode:

- outputs
- opencollectors

Возможные значения index:

- для outputs 1-8

Возможные значения level 0-1

##### Получение списка Wifi сетей

```
POST /api/wifi/scan
```

Пример ответа

```json
{
  "success": true,
  "data": [
    {
      "ssid": string,
      "rssi": int,
      "channel": int,
      "authmode": int,
      "authmode_name": string
    }
  ]
}
```

##### Работа с оповещателем (пьезоизлучатель)

```bash
POST /api/beep
```

тело запроса

```json
{
  "count": int, // >= 16
  "on_ms":int // 0 >= 1000,
  "off_ms":int //  0 >= 1000
}
```

##### Чтение данных сенсоров

```
POST /api/state
```

Тело запроса

```json
{
  "capability": string
}
```

Формат ответа

```json
{
  "success": true,
  "data": {
    "state": {
      "value": 0
    },
    "history": {
      "name": string,
      "timestamps": [ ],
      "values": [ ],
      "count": int
    }
  }
}
```

#### Автоматизации

Контроллеры поддерживают автоматизации - это правила в виде JSON данных, которые выполняются при срабатывании определенных условий (состоянии сенсоров).

##### Получение списка автоматизаций

```
GET /api/automations
```

Ответ

```json
[
  {
    "id": 1,
    "if": {
      "capability": "ntc1",
      "subtype":?string,
      "op": ">",
      "value": 30.0
    },
    "then": [
      { "capability": "out1", "action": 1 }
    ],
    "else": [
      { "capability": "out1", "action": 0 }
    ]
  }
]
```

##### Создание автоматизации

```
POST /api/automations
```

Тело запроса

```json
 {
   "if": {
     "capability": "ntc1",
     "op": ">",
     "subtype": ?string // может быть серийным номером или подтипом-действием opentherm (ch dhw)
     "value": 30.0
   },
   "then": [
     { "capability": "out1", "action": 1 }
   ],
   "else": [
     { "capability": "out1", "action": 0 }
   ]
 }
```

##### Обновление автоматизации

```
PUT /api/automations/{id}
```

Тело запроса

```json
{
  "if": {
    "capability": "ntc1",
    "op": ">",
    "subtype": "28FF1234567890AB", // может быть серийным номером или подтипом-действием opentherm (ch dhw)
    "value": 35.0
  },
  "then": [
    { "capability": "out1", "action": 1 },
    { "capability": "opentherm", "subtype": "ch", "action": 1 }
  ],
  "else": [
    { "capability": "out1", "action": 0 }
  ]
}
```

##### Удаление автоматизации

```
DELETE /api/automations/{id}
```

### Возможные значения - значения capabilities

<div id="bkmrk--1"></div><table border="1" id="bkmrk-opentherm-%7B-%22success" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>opentherm</td><td>```
{
  "success": true,
  "state": {
    "ot_enabled": true,
    "ready": true,
    "adapter_success": false,
    "status_code": 3,
    "ch_enable": false,
    "ch_setpoint_requested": 60,
    "dhw_enable": true,
    "dhw_setpoint_requested": 50,
    "otc_enable": false,
    "cooling_enable": false,
    "ch2_enable": false,
    "modulation_level_set": 0,
    "heat_curve_ratio": 0,
    "central_heating_active": false,
    "hot_water_active": false,
    "flame_on": false,
    "is_fault": false,
    "boiler_temperature": 0,
    "return_temperature": 0,
    "dhw_temperature": 0,
    "outside_temperature": 0,
    "dhw_setpoint_current": 0,
    "ch_max_setpoint": 0,
    "modulation": 0,
    "pressure": 0,
    "flow_rate": 0,
    "flow_rate_ch2": 0,
    "fault_code": 0,
    "boiler_config": {
      "control_type": "ON/OFF",
      "dhw_present": false,
      "dhw_config": "INSTANTANEOUS",
      "ch2_present": false,
      "cooling_supported": false,
      "pump_control_allowed": false,
      "slave_ot_version": 0,
      "slave_product_version": 0
    },
    "bounds": {
      "ch": {
        "min": 0,
        "max": 0
      },
      "dhw": {
        "min": 0,
        "max": 0
      },
      "heat_curve": {
        "min": 0,
        "max": 0
      }
    }
  }
}
```

</td></tr><tr><td>ntc1</td><td>```
{
  "success": true,
  "data": {
    "state": {
      "value": 27.62923812866211
    },
    "history": {
      "name": "ntc1",
      "timestamps": [
        1777483230583
      ],
      "values": [
        27.62923812866211
      ],
      "count": 1
    }
  }
}
```

  
</td></tr><tr><td>ntc2</td><td>аналогично ntc1</td></tr><tr><td>ai1</td><td>аналогично ntc1</td></tr><tr><td>ai2</td><td>аналогично ntc1</td></tr><tr><td>  
</td><td>  
</td></tr><tr><td>  
</td><td>  
</td></tr></tbody></table>

# Формат MQTT сообщений

# Описание протокола сообщений MQTT v1.0

<p class="callout danger">В настоящее время UMNI UNI отказался от MQTT и промежуточных брокеров в пользу RESP API, SSE и Syslog!</p>

### Publish

#### /LWT

device/umni-838a74/lwt

```json
{
  "state":"online"
}
```

```json
{
  "state":"offline"
}
```

#### /PONG

device/umni-838a74/pong

```json
{
  "ping":"pong"
}
```

#### /REGISTER

device/umni-838a74/register

```json
{
  "hostname": "umni-838a74",
  "capabilities": [
    "ethernet",
    "sdcard",
    ...
  ],
  "networks": [
    {
      "name": "ethernet",
      "ip": "192.168.88.122",
      "mask": "255.255.252.0",
      "gw": "192.168.88.9",
      "active": true
    }
  ],
  "heap": {
    "total": 383104,
    "free": 191552,
    "min": 178628
  },
  "device_type": "generic"
}
```

#### /CONFIG (onewire)

device/umni-838a74/config

```json
{
  "key":"onewire",
  "config":{
    "sensors":[
      {
        "sn":"F7062454B2EE5528",
        "label":"Sensor F7062454B2EE5528",
        "active":true
      }
    ]
  }
}
```

#### /CONFIG (rf433)

device/umni-838a74/config

```json
{
  "key":"rf433",
  "config":{
    "devices":[]
  }
}
```

#### /CONFIG (ntc)

device/umni-838a74/config

```json
{
  "key":"ntc",
  "config":{
    "channels":[
      {
        "id":0,
        "label":"NTC Sensor 1",
        "active":true
      },
      {
        "id":1,
        "label":"NTC Sensor 2",
        "active":true
      }
    ]
  }
}
```

#### /CONFIG (adc)

device/umni-838a74/config

```json
{
  "key":"adc",
  "config":{
    "channels":[
      {
        "id":0,
        "label":"ADC Input 1",
        "active":true
      },
      {
        "id":1,
        "label":"ADC Input 2",
        "active":true
      }
    ]
  }
}
```

#### /CONFIG (inputs)

device/umni-838a74/config

```json
{
  "key": "inputs",
  "config": {
    "inputs": [
      {
        "config_index": 1,
        "port_index": 1,
        "label": "Input 1 (port 1)",
        "active": true
      },
      ...
    ],
  }
}
```

#### /SENSORS (onewire)

device/umni-838a74/sensors

```json
{
  "category": "onewire",
  "capability":"onewire",
  "value":28.25,
  "serial":"F7062454B2EE5528"
}
```

#### /SENSORS (ntc)

device/umni-838a74/sensors

```json
{
  "category": "ntc",
  "capability":"ntc1",
  "value":27.906805038452148,
  "serial":null
}
```

#### /SENSORS (adc)

device/umni-838a74/sensors

```json
{
  "category": "adc",
  "capability":"ai1",
  "value":27.906805038452148,
  "serial":null
}
```

####  /SENSORS (outputs)

device/umni-838a74/sensors:

```json
{
  "category": "outputs",
  "capability":"out2",
  "value":1,
  "serial":null
}
```

#### /SENSORS (inputs)

device/umni-838a74/sensors:

```json
{
  "category": "inputs",
  "capability":"inp4",
  "value":0,
  "serial":null
}
```

#### /SENSORS (outputs)

device/umni-838a74/sensors:

```json
{
  "key": "dio",
  "config": {
    "outputs": [
      {
        "config_index": 1,
        "port_index": 0,
        "label": "Output 1 (port 0)",
        "active": true,
        "default_state": 0
      },
      ...
    ]
  }
}
```

### Subscribe

#### Ping

device/umni-838a74/ping

Payload ""

# Прошивка устройств UMNI через ESP Launchpad (веб-браузер)

<p class="callout info">Эта инструкция описывает процесс прошивки устройства через онлайн-инструменты на примере Esp Launchpad.</p>

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/Gqpjd3qP1rOBerlj-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/Gqpjd3qP1rOBerlj-image.png)

<p class="callout warning">Перед прошивкой подайте внешнее питание на контроллер и подключите USB, либо снимите перемычку КОНФ. Либо используйте хороший USB кабель и порт компьютера.</p>

Скачать последний релиз прошивки (файл umni-uni.bin) со страницы [https://github.com/umni-su/umni-uni/releases](https://github.com/umni-su/umni-uni/releases) .

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/wyWX3cPzuV6YPg7j-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/wyWX3cPzuV6YPg7j-image.png)

Скачать и установить драйвера для чипа CH340 по ссылкам ниже или из файлов инструкции.

<table id="bkmrk-os-source-url-linux-"><thead><tr><th>OS</th><th>Source URL</th></tr></thead><tbody><tr><td>Linux</td><td>[https://www.wch-ic.com/downloads/CH341SER\_LINUX\_ZIP.html](https://www.wch-ic.com/downloads/CH341SER_LINUX_ZIP.html)</td></tr><tr><td>macOS</td><td>[https://www.wch-ic.com/downloads/CH341SER\_MAC\_ZIP.html](https://www.wch-ic.com/downloads/CH341SER_MAC_ZIP.html)</td></tr><tr><td>Windows</td><td>[https://www.wch-ic.com/downloads/CH341SER\_ZIP.htm](https://www.wch-ic.com/downloads/CH341SER_ZIP.html)</td></tr></tbody></table>

Подключить контроллер UMNI к компьютеру по USB.

Перейти на сайт [https://espressif.github.io/esp-launchpad/](https://espressif.github.io/esp-launchpad/)

Нажать "Connect"

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/AIpeweF6n3ZGAhbw-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/AIpeweF6n3ZGAhbw-image.png)

Во всплывающем окне выбрать COM порт, к которому подключен контроллер.

Перейти на вкладку DIY и важно - указать **Flash Address 0x100000**

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/IQiYXdSm1teUvC17-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/IQiYXdSm1teUvC17-image.png)

Выбрать файл ,bin, нажать Program

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/STZxYuusCwwTr0DK-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/STZxYuusCwwTr0DK-image.png)

Если видите в терминале такой вывод, то все прошло успешно!

```
esptool.js
Serial port WebSerial VendorID 0x1a86 ProductID 0x7523
Connecting...
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision 3)
Features: Wi-Fi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 44:1d:64:83:89:b4
Uploading stub...
Running stub...
Stub running...
Changing baudrate to 921600
Changed
Manufacturer: 46
Device: 4016
Detected flash size: 4MB
Compressed 1175312 bytes to 751024...
Writing at 0x100000... (2%)
Writing at 0x10d071... (4%)
Writing at 0x11a7e2... (6%)
Writing at 0x1243df... (8%)
Writing at 0x12be9d... (10%)
Writing at 0x134589... (13%)
Writing at 0x139e45... (15%)
Writing at 0x13fb0d... (17%)
Writing at 0x145a07... (19%)
Writing at 0x14b7b2... (21%)
Writing at 0x1515cd... (23%)
Writing at 0x15725d... (26%)
Writing at 0x15cc78... (28%)
Writing at 0x163248... (30%)
Writing at 0x169097... (32%)
Writing at 0x16eb74... (34%)
Writing at 0x174945... (36%)
Writing at 0x17a58c... (39%)
Writing at 0x1802bd... (41%)
Writing at 0x1862a2... (43%)
Writing at 0x18b8cc... (45%)
Writing at 0x1912f8... (47%)
Writing at 0x196973... (50%)
Writing at 0x19bf45... (52%)
Writing at 0x1a1ab5... (54%)
Writing at 0x1a71a1... (56%)
Writing at 0x1ac753... (58%)
Writing at 0x1b1e4c... (60%)
Writing at 0x1b7b87... (63%)
Writing at 0x1bd47c... (65%)
Writing at 0x1c2cd7... (67%)
Writing at 0x1c85a9... (69%)
Writing at 0x1ce451... (71%)
Writing at 0x1d3ebf... (73%)
Writing at 0x1d98d2... (76%)
Writing at 0x1df49f... (78%)
Writing at 0x1e5681... (80%)
Writing at 0x1ea75b... (82%)
Writing at 0x1efa65... (84%)
Writing at 0x1f53dc... (86%)
Writing at 0x1fb183... (89%)
Writing at 0x2017f2... (91%)
Writing at 0x2091b8... (93%)
Writing at 0x20ea65... (95%)
Writing at 0x214e5c... (97%)
Writing at 0x21a245... (100%)
Wrote 1175312 bytes (751024 compressed) at 0x100000 in 11.372 seconds.
Leaving...
```

Нажмите Reset

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/WI0pmXWZSGQOrKWB-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/WI0pmXWZSGQOrKWB-image.png)

Увидите логи приложения - можно отключаться. ПО обновлено.

[![image.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/HWncexh7ruteV7yO-image.png)](https://docs.umni.su/uploads/images/gallery/2026-06/HWncexh7ruteV7yO-image.png)

# UMNI UNI Tool - управление контроллерами UMNI из одного места

Экосистема содержит в себе программное обеспечение для централизованного управления контроллерами. Так как контроллер UMNI создан на базе ESP32, данное программное обеспечение подойдет для управления любым совместимым контроллером ESP32. Важно помнить, что контроллер должен быть прошит оригинальным [ПО UMNI UNI](https://github.com/umni-su/umni-uni) и подключен к необходимой периферии согласно открытой документации.

[![UMNI-UNI-D-CLIMATE.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/sSWwwNiZ7WzpifKN-umni-uni-d-climate.png)](https://docs.umni.su/uploads/images/gallery/2026-06/sSWwwNiZ7WzpifKN-umni-uni-d-climate.png)

UMNI UNI TOOL - это по сути обвертка надо открытым REST HTTP API, о котором вы можете почитать [тут](https://docs.umni.su/books/prosivka-umni-uni/page/rest-api-v10).

С помощью этого приложения, вы можете централизованно управлять контроллерами UMNI:

- Настраивать порты ввода-вывода
- Управлять газовыми котлами (UMNI C1, например, содержит на борту адаптер, совместимый с Opentherm)
- Подключать и получать статус с аналоговых датчиков, встроенных NTC термисторов, ONEWIRE датчиков температуры
- Использовать OTA для обновления ПО устройства без проводов ([а можно и с проводами](https://docs.umni.su/books/prosivka-umni-uni/page/prosivka-ustroistv-umni-cerez-esp-launchpad-veb-brauzer)).
- Настраивать автоматизации (не такие вложенные и сложные, но все же).

Релиз можно скачать с официального репозитория на Github.

### Разработка и поддержка

Каждый из вас может вложить вклад в проект. [Поддержим ](https://github.com/umni-su/umni-uni-tool/blob/main/CONTRIBUTING.md)развитие отечественного опенсорса, да и опенсорса в целом!

Запуск проекта

```
npm run tauri dev

npm run tauri android dev
```

Сборка проекта

```
npm run tauri build

npm run android build
```

### Скриншоты

[![UMNI-UNI-D-HOME.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/sYjwGx5uZ3gI5InZ-umni-uni-d-home.png)](https://docs.umni.su/uploads/images/gallery/2026-06/sYjwGx5uZ3gI5InZ-umni-uni-d-home.png)

[![UMNI-UNI-D-DIO.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/af6cc74ho1rgcLD3-umni-uni-d-dio.png)](https://docs.umni.su/uploads/images/gallery/2026-06/af6cc74ho1rgcLD3-umni-uni-d-dio.png)

[![UMNI-UNI-D-OW.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/lsixv89NjoZBELMN-umni-uni-d-ow.png)](https://docs.umni.su/uploads/images/gallery/2026-06/lsixv89NjoZBELMN-umni-uni-d-ow.png)

[![UMNI-UNI-D-RF.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/JddkLAnTVL5OYYd8-umni-uni-d-rf.png)](https://docs.umni.su/uploads/images/gallery/2026-06/JddkLAnTVL5OYYd8-umni-uni-d-rf.png)

[![UMNI-UNI-0.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/IzgfVmcpQmK30Ugq-umni-uni-0.png)](https://docs.umni.su/uploads/images/gallery/2026-06/IzgfVmcpQmK30Ugq-umni-uni-0.png)

[![UMNI-UNI-1.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/SkSRURaPU5p4WTW1-umni-uni-1.png)](https://docs.umni.su/uploads/images/gallery/2026-06/SkSRURaPU5p4WTW1-umni-uni-1.png)

[![UMNI-UNI-2.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/XuHqjteJvKfcfI3D-umni-uni-2.png)](https://docs.umni.su/uploads/images/gallery/2026-06/XuHqjteJvKfcfI3D-umni-uni-2.png)

[![UMNI-UNI-3.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/jlqOgxG9wuJrQ33m-umni-uni-3.png)](https://docs.umni.su/uploads/images/gallery/2026-06/jlqOgxG9wuJrQ33m-umni-uni-3.png)

[![UMNI-UNI-4.png](https://docs.umni.su/uploads/images/gallery/2026-06/scaled-1680-/fMnjg2qJvr7PD9M6-umni-uni-4.png)](https://docs.umni.su/uploads/images/gallery/2026-06/fMnjg2qJvr7PD9M6-umni-uni-4.png)