Статья

Smart-UPS от APC в Умный дом

Как известно, критичные устройства защищаются источниками бесперебойного питания. Такие источники вполне себе справляются со своими функциями и автономно. Но если есть возможность контролировать и управлять им через систему умного дома было бы вообще супер.

Наконец дошли руки до своего ИБП Smart-UPS RT 8000 XL. В названии этого бесперебойника уже заложено что он умный. В моем ИБП установлена плата AP9631 и как выяснилось, что с обновлением ПО появился TCP ModBus в ней. Соответственно есть возможность получения текущих параметров, и управление через сервер умного дома. Было решено добавить его в WirenBoard .

После обновления ПО. В меню Конфигурация - Сеть появился пункт по настройке ModBus
В этом разделе мы можем включить Modbus. Выбрать порт, по умолчанию 502. Установить таймаут соединения. Так же установить флажок Проверка активности.

Так как все 3 платы ( AP9630, AP9631, AP9635) стали поддерживать с fw 7.х.х TCP ModBus, вот ссылка на актуальную версию ПО для версии SUMX " Это версия для Smart-UPS ". Ими можно управлять большим выбором ИБП и не только серии Смарт. Но там ПО свое и регистры могут быть смещены. Таблица регистров есть в этом документе. Как видим параметров там масса. Писать шаблон, на все регистры смысла нет, поэтому пока только информация и алармы. Был написан шаблон по найденным инструкциям от Schneider Electric. Регистры разделены на 4 группы: Статус устройства, Статус питания, Настройки устройства, Диагностика. 

json
Копировать
{
    "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.

json
Копировать
{
  "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ще один пункт добавлен в систему управления умным домом. Теперь при пропадании сетевого напряжения в доме, можно предпринять какие то действия в автоматизациях. Сделать оповещение. Ну и, опять же с помощью автоматизаций, сделать правильную реакцию устройств на восстановление напряжения в сети. В дальнейшем можно добавить и регистры управления бесперебойником. Например, принудительно переключать его периодически на батарею для тренировки. Тем самым продлевая срок службы батареи.

0

Вернуться назад
Вернуться назад