Как известно, критичные устройства защищаются источниками бесперебойного питания. Такие источники вполне себе справляются со своими функциями и автономно. Но если есть возможность контролировать и управлять им через систему умного дома было бы вообще супер.
Наконец дошли руки до своего ИБП Smart-UPS RT 8000 XL. В названии этого бесперебойника уже заложено что он умный. В моем ИБП установлена плата AP9631 и как выяснилось, что с обновлением ПО появился TCP ModBus в ней. Соответственно есть возможность получения текущих параметров, и управление через сервер умного дома. Было решено добавить его в WirenBoard .
Так как все 3 платы ( AP9630, AP9631, AP9635) стали поддерживать с fw 7.х.х TCP ModBus, вот ссылка на актуальную версию ПО для версии SUMX " Это версия для Smart-UPS ". Ими можно управлять большим выбором ИБП и не только серии Смарт. Но там ПО свое и регистры могут быть смещены. Таблица регистров есть в этом документе. Как видим параметров там масса. Писать шаблон, на все регистры смысла нет, поэтому пока только информация и алармы. Был написан шаблон по найденным инструкциям от Schneider Electric. Регистры разделены на 4 группы: Статус устройства, Статус питания, Настройки устройства, Диагностика.
{
"title": "UPS NMC2",
"device_type": "APC_series",
"group": "UPSdev",
"device": {
"name": "APC_NMC2",
"id": "APC_NMC2",
"max_read_registers": 0,
"frame_timeout_ms": 8,
"groups": [
{
"title": "Device Status",
"id": "device_status",
"order": 1
},
{
"title": "Power status",
"id": "power_status",
"order": 2
},
{
"title": "Device setting",
"id": "device_setting",
"order": 3
},
{
"title": "Managment command",
"id": "diagnostics",
"order": 4
}
],
"channels": [
{
"name": "Battery State of Charge 0-100%:",
"reg_type": "holding",
"address": 5,
"type": "value",
"format": "u16",
"scale": 1.0,
"group": "device_status",
"readonly": true
},
{
"name": "Runtime Remaining:",
"reg_type": "holding",
"address": 6,
"type": "value",
"format": "u16",
"group": "device_status",
"readonly": true
},
{
"name": "Battery Voltage:",
"reg_type": "holding",
"address": 7,
"type": "value",
"format": "u16",
"type": "voltage",
"group": "device_status",
"readonly": true
},
{
"name": "UPS Internal Temperature:",
"reg_type": "holding",
"address": 8,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "temperature",
"group": "device_status",
"readonly": true
},
{
"name": "Quantity of battery packs with bad batteries:",
"reg_type": "holding",
"address": 10,
"type": "value",
"format": "u16",
"group": "device_status",
"readonly": true
},
{
"name": "Quantity of battery packs:",
"reg_type": "holding",
"address": 11,
"type": "value",
"format": "u16",
"group": "device_status",
"readonly": true
},
{
"name": "Power drawn by load %:",
"reg_type": "holding",
"address": 12,
"type": "value",
"format": "u16",
"scale": 1.0,
"group": "device_status",
"readonly": true
},
{
"name": "Nominal Output Voltage:",
"reg_type": "holding",
"address": 13,
"type": "value",
"format": "u16",
"type": "voltage",
"scale": 1.0,
"group": "power_status",
"readonly": true
},
{
"name": "Actual Output Voltage:",
"reg_type": "holding",
"address": 14,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "voltage",
"group": "power_status",
"readonly": true
},
{
"name": "Maximum Input Voltage Since Last Reading:",
"reg_type": "holding",
"address": 15,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "voltage",
"group": "power_status",
"readonly": true
},
{
"name": "Minimum Input Voltage Since Last Reading:",
"reg_type": "holding",
"address": 16,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "voltage",
"group": "power_status",
"readonly": true
},
{
"name": "Input Voltage:",
"reg_type": "holding",
"address": 17,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "voltage",
"group": "power_status",
"readonly": true
},
{
"name": "Input Frequency Hz:",
"reg_type": "holding",
"address": 18,
"type": "value",
"format": "u16",
"scale": 1.0,
"group": "power_status",
"readonly": true
},
{
"name": "Minimum Return Battery Capacity:",
"reg_type": "holding",
"address": 26,
"type": "value",
"format": "u16",
"scale": 1.0,
"group": "device_setting",
"readonly": true
},
{
"name": "Lower Transfer Point:",
"reg_type": "holding",
"address": 27,
"type": "value",
"format": "u16",
"type": "voltage",
"group": "device_setting",
"readonly": true
},
{
"name": "Upper Transfer Point:",
"reg_type": "holding",
"address": 28,
"type": "value",
"format": "u16",
"type": "voltage",
"group": "device_setting",
"readonly": true
},
{
"name": "Nominal Output Voltage:",
"reg_type": "holding",
"address": 29,
"type": "value",
"format": "u16",
"scale": 1.0,
"type": "voltage",
"group": "device_setting",
"readonly": true
},
{
"name": "Shutdown Delay:",
"reg_type": "holding",
"address": 30,
"type": "value",
"format": "u16",
"group": "device_setting",
"readonly": true
},
{
"name": "Low Battery Duration:",
"reg_type": "holding",
"address": 31,
"type": "value",
"format": "u16",
"group": "device_setting",
"readonly": true
},
{
"name": "Turn On Delay:",
"reg_type": "holding",
"address": 32,
"type": "value",
"format": "u16",
"group": "device_setting",
"readonly": true
},
{
"name": "UPS turning on",
"reg_type": "holding",
"address": "0:0:1",
"type": "switch",
"on_value": "0x0000",
"off_value": "0x0001",
"group": "device_status",
"readonly": true
},
{
"name": "On line",
"reg_type": "holding",
"address": "3:3:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "On battery",
"reg_type": "holding",
"address": "3:4:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "UPS fault - UPS in bypass",
"reg_type": "holding",
"address": "2:4:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "Inverter fault or Output overvoltage",
"reg_type": "holding",
"address": "2:7:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "Overload",
"reg_type": "holding",
"address": "3:5:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "Low battery",
"reg_type": "holding",
"address": "3:6:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
{
"name": "Replace battery",
"reg_type": "holding",
"address": "3:7:1",
"type": "switch",
"group": "device_status",
"readonly": true
},
]
}
}
Для того, чтобы WirenBoard обнаружил и добавил устройство скачиваем шаблон и размещаем его в дериктории /usr/share/wb-mqtt-serial/templates. После чего настраеваем в wb-mqtt-sereal.conf устройство, выбрав шаблон из ссылки.
Дальше решил завести его в Sprut.hub по MQTT. Для того, чтобы Sprut.hub обнаружил и добавил устройство нужен шаблон. Огромное спасибо Дмитрию (ReD) за написание шаблона для Sprut.hub. Скачиваем шаблон и размещаем его в папке Sprut.hub/Templates/MQTT/Custom. Перезапускаем контроллер MQTT, получаем данные с UPS.
{
"name": "APC UPS",
"manufacturer": "APC",
"model": "APxx",
"catalogId": -1,
"services": [
{
"name": "Напряжение АКБ",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicSearch": "/devices/APC_NMC(.*)_(.*)/controls/Battery Voltage:",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Battery Voltage:"
}
}
]
},
{
"name": "Внутренняя температура ИБП",
"type": "TemperatureSensor",
"characteristics": [
{
"type": "CurrentTemperature",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/UPS Internal Temperature:"
}
}
]
},
{
"name": "Номинальное выходное напряжение",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Nominal Output Voltage:"
}
}
]
},
{
"name": "Актуальное выходное напряжение",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Actual Output Voltage:"
}
}
]
},
{
"name": "Максимальное входное напряжение",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Maximum Input Voltage Since Last Reading:"
}
}
]
},
{
"name": "Минимальное входное напряжение",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Minimum Input Voltage Since Last Reading:"
}
}
]
},
{
"name": "Входное напряжение",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Input Voltage:"
}
}
]
},
{
"name": "Минимальное напряжение для перехода на АКБ",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Lower Transfer Point:"
}
}
]
},
{
"name": "Максимальное напряжение для перехода на АКБ",
"type": "C_VoltMeter",
"characteristics": [
{
"type": "C_Volt",
"link": {
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Upper Transfer Point:"
}
}
]
},
{
"name": "В работе",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/UPS turning on"
}
}
]
},
{
"name": "Питание от сети",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/On line"
}
}
]
},
{
"name": "Питание от АКБ",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/On battery"
}
}
]
},
{
"name": "Ошибка ИБП - ИБП в байпасе",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/UPS fault - UPS in bypass"
}
}
]
},
{
"name": "Неисправность инвертора или перенапряжение на выходе",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Inverter fault or Output overvoltage"
}
}
]
},
{
"name": "Перегрузка",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Overload"
}
}
]
},
{
"name": "Низкий заряд АКБ",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Low battery"
}
}
]
},
{
"name": "Требуется заменить АКБ",
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "Integer",
"topicGet": "/devices/APC_NMC(1)_(2)/controls/Replace battery"
}
}
]
}
]
}
Eще один пункт добавлен в систему управления умным домом. Теперь при пропадании сетевого напряжения в доме, можно предпринять какие то действия в автоматизациях. Сделать оповещение. Ну и, опять же с помощью автоматизаций, сделать правильную реакцию устройств на восстановление напряжения в сети. В дальнейшем можно добавить и регистры управления бесперебойником. Например, принудительно переключать его периодически на батарею для тренировки. Тем самым продлевая срок службы батареи.