Объекты - это универсальная сущность для хранения и обмена данными между подсистемами шлюза, например между скриптами LUA. Также объекты позволяют выполнять скрипты при изменении своих значений.
К объектам можно обращаться из скриптовLUA, HTTP API и из Simple Bind
Управление объектами доступно на странице Objects. Здесь доступно создание новых объектов, изменение и удаление существующих.
В таблице отображаются следующие данные:
- имя объекта
- тип данных:
- STR - Строки (используется по умолчанию)
- BOOL - Бинарный (true / false)
- INT - Целое число
- FLOAT - Дробное число
- JSON - строка формата JSON
- значения - текущее и предыдущее
- время изменения - timestamp последнего и предпоследнего изменения
- флаги:
- A (Ack) - при изменении значения объекта передан признак Ack (описание ниже).
- M (MQTT Notify) - при изменении значения объекта значение передается в MQTT (описание ниже). Ранее обозначался символом
N
- W (Write) - изменение значения при каждом обращении на запись объекта
Также имеются кнопки управления:
Для создания нового объекта нажать "плюсик" . Откроется форма создания объекта
Заполнить необходимые данные и сохранить.
Здесь же можно изменить существующий объект по кнопке .
Объекты хранятся только в памяти и не сохраняются во флеш-память. Поэтому, при необходимости, инициализировать объекты можно в стартовом скрипте init.lua
, с помощью функций obj.setOpt(), obj.set()
или через веб-интерфейс, как описано выше. Если начальные значения задавать не требуется, то инициализировать не обязательно, поскольку объект создается при первом к нему обращении.
Позволяют отслеживать функционал объектов. Установка доступна из скриптов LUA. Чтение - как из LUA, так и из HTTP API.
Флаг A
- ACK
Объекты поддерживают установку флага обратной связи, таким образом в вызываемом скрипте можно получить информацию об источнике изменения.
Например, есть два скрипта. Один записывает значение в объект со своей периодичностью, а другой скрипт значение считывает со своей периодичностью. Необходимо, чтобы пока второй скрипт не считал значение, первый бы не записывал. Для этого первый скрипт при записи выставляет флаг А
, если его нет, а второй скрипт при чтении флаг сбрасывает. Вариантов использования масса. Например, можно использовать как дополнительное поле данных в объекте).
Флаг обратной связи виден в веб-интерфейсе (A
), а так же возвращается в LUA и HTTP API командах. Также этот флаг передается в событии Event.Obj.Ack
скрипту, вызванному по изменению или записи объекта.
Флаг M
- MQTT Notify
Шлюз может отправлять уведомления в MQTT при изменении объекта. Установка флага доступна как в веб-интерфейсе, так из LUA
При поднятом флаге, шлюз будет публиковать в топик вида: zgwXXXX/obj/OBJ_NAME
Для изменения объекта необходимо отправить значение объекта в топик zgwXXXX/obj/OBJ_NAME/set
Для запроса текущего значения объекта необходимо отправить пустой топик zgwXXXX/obj/OBJ_NAME/get
Флаг W
- Write
Установка доступна как из веб-интерфейса, так из LUA
При поднятом флаге запись значения в объект производится при каждом к нему обращении. При каждой записи в объект значения, запись производится даже если значение не изменилось. Таким образом, если к объекту привязан скрипт, то он будет вызываться при каждом обращении к объекту на запись. Однако, в таком случае не получится отслеживать время изменения значения.
При вызове скрипта привязанного к объекту вызывается событие с типом SCRIPT_EVENT_TYPE_OBJ_CHANGE
и значением 2.
Event.Obj.Name
- имя объекта, который вызвал скриптEvent.Obj.Ack
- флаг обратной связи объектаEvent.Obj.Value
- текущее значениеEvent.Obj.OldValue
- предыдущее значение
Изменение типа данных, записываемых в объект. Если объекта не существует, он будет создан.
obj.setType(name, type)
-- name - STR, имя объекта
-- type - STR, тип хранимых данных: STR, INT, BOOL, FLOAT, JSON
Управление сетевыми флагами объекта. На 25.10.2023 доступен флаг MQTT.
obj.setShare(name, mqtt)
-- name - STR, имя объекта
-- mqtt - BOOL, флаг передачи уведомлений в MQTT
-- false = передача выключена
-- true = передача включена. В таблице объектов (WebUI/Objects) отображается символом M (MQTT Notify)
Изменение типа данных, записываемых в объект, управление флагом передачи уведомлений в MQTT. Если объекта не существует, он будет создан. Внимание функция может быть удалена в прошивках после 2023.10.25. Её заменят функции obj.setType() для настройки типов и obj.setShare() для настройки флагов.
obj.setOpt(name, type[, flagMQTT])
-- name - STR, имя объекта
-- type - STR, тип хранимых данных: STR, INT, BOOL, FLOAT, JSON
-- flagMQTT - BOOL, флаг передачи уведомлений в MQTT
-- false = передача выключена
-- true = передача включена. В таблице объектов (WebUI/Objects) отображается символом M (MQTT Notify)
Запись данных в объект, управление флагом обратной связи. Если объекта не существует, он будет создан.
result = obj.set(name, value[, flagACK])
-- name - STR, имя объекта
-- value - записываемые данные, любого типа
-- flagACK - BOOL, флаг обратной связи
-- true = включен. В таблице объектов отображается символом A (ACK)
-- false = выключен. В таблице объектов не отображается
-- result - BOOL, true - значение изменено и успешно записано, false - значение не изменилось, поэтому не записано
Получение данных, хранящихся в объекте. Данные будут получены того же типа, какой задан объектом (проверяется функцией LUA type()
).
result = obj.get(name)
-- name - STR, имя объекта
-- result - текущее значение или NIL если объект не найден
В объекте хранится текущее значение, предыдущее и состояние флага ACK.
Пример получения всех значений:
local current_value, previos_value, flag_ack = obj.get("object_name")
-- переменные будут содержать:
-- current_value = текущее значение
-- previos_value = предыдущее значение
-- flag_ack = статус флага ACK: true|false
Получение тайм-штампов изменения текущего и предыдущего значений. Оба значения можно получить так-же как в obj.get()
obj.getTime(name)
-- name - STR, имя объекта
Привязка к объекту скрипта, который будет выполняться при каждом изменении значения объекта или при каждой его записи. Если объекта не существует, он будет создан.
obj.setScript(name, script.lua[, run_on_write])
-- name - STR, имя объекта
-- script.lua - STR, имя файла скрипта с расширением
-- run_on_write - BOOL, false (default) = запуск при обновлении значения; true = запуск каждый раз при записи значения в объект + поднимается флаг W
Привязка к объекту скрипта, который будет выполняться при каждом изменении значения объекта. Если объекта не существует, он будет создан.
obj.onChange(name, script.lua)
-- name - STR, имя объекта
-- script.lua - STR, имя файла скрипта с расширением
Удаление объекта
result = obj.remove(name)
-- name - имя объекта
-- result - BOOL, true - успех, false - объект не найден
GET /api/obj
POST /api/obj?name=XXX&value=YYY
<!--
name - имя объекта
value - значение -->
DELETE /api/obj?name=obj_name
GET /api/obj?name=XXX
Флаги возвращаются в поле flags: flag_value
:
flag_value = 0: ACK=0; MQTT=0
flag_value = 1: ACK=0; MQTT=1
flag_value = 2: ACK=1; MQTT=0
flag_value = 3: ACK=1; MQTT=1
obj.setType("test", "JSON") -- создает объект test с типом данных JSON
obj.setType("test", "STR") -- изменяет тип данных объекта на STR
obj.setShare("test", true) -- включить передачу уведомлений в MQTT
obj.set("security.status", true)
obj.set("security.status", true, true)
Скрипт привязывается к объекту командой obj.setScript()
в init.lua
local status = ""
local current_status, previous_status, ack = obj.get("security.status")
-- добавим обработчик булевых значений для склейки со строками
if current_status == true then
status = "true"
else
status = "false"
end
-- отправляем уведомление только в случае изменения значений с признаком ack
if ack == true then
telegram.send("wsecurity status is " .. status)
end
obj.remove("security.status")
obj.setType("security.status", "INT")
obj.setShare("security.status", true)
local curr, prev = obj.getTime("security.status")
print("Время предыдущего изменения:" .. prev .. ", И последнего: " .. curr .. " длительность события: " .. curr-prev)
obj.set('reg1', 0)
scripts.setTimer("#obj.set('reg1', obj.get('reg1')+1)", 1)
Используются для синхронизации данных между несколькими шлюзами, при изменении объекта на одном, он так же изменится и на остальных шлюзах.
Данный функционал в разработке.