Горячая линия Embedded System Rus:8-800-775-06-34 (звонок по России бесплатный)

LM5_N
LM-Wall_N
DALI_N
Vita_N

Сдвиг всех групповых адресов

ВНИМАНИЕ! Перед применением данного решения обязательно сделайте резервную копию вашего LogicMachine.

Бывают случаи, когда вы создаете типовой проект для нескольких инсталляций или объединяете существующие, то у Вас могут начать пересекаться групповые адреса. Чтобы этого избежать, можно сдвинуть все адреса, а не переделывать весь проект под каждый LogicMachine. LogicMachine позволяет изменять данные в своей базе данных с помощью скриптов, чем мы и воспользуемся для решения данной задачи.

Следующий код позволяет вам сдвинуть все групповые адреса в маппинге Modbus и DALI, визуализации, пользовательских расписаниях, трендлогах, логах объектов, событийных скриптах с возможностью также изменить имя и с сохранением всех тегов.
Переменная «step» отвечает за сдвиг и представляет из себя сумму трех чисел: сдвиг по главной группе, сдвиг по средней группе и сдвиг группового адреса. В данном примере осуществляется сдвиг влево на 1/2/3, т.е. групповой адрес 2/3/2 станет групповым адресом 1/0/255. Примечание. Если после сдвига адрес окажется больше 63/7/255, то он вернется к 0/0/0, и наоборот, поэтому вы можете не беспокоится о том, что произойдёт ошибка при выполнении кода, но Ваши реальные групповые адреса станут виртуальными, если окажутся в диапазоне 32/0/0 — 63/7/255, а изначально виртуальные останутся виртуальными и в диапазоне 0/0/1 — 31/7/255. Также проверьте, чтобы после сдвига у Вас не оказался групповой адрес 0/0/0.
Переменная «new_name» позволяет изменить имя для группового адреса. В данном примере к старому имени добавляется приписка «Shifted».

log('start')
a = grp.all()
-- Переменная для сдвига, представляет из себя сумму трех параметров:
-- главной группы, средней группы и группового адреса.
step = -( 1 * 2^11 + 2 * 2^8 + 3 ) -- Осуществляет сдвиг на -(1/2/3)
-- Выберите необходимый for в зависимости от step
for i = 1, #a, 1 do -- if step < 0
--for i = #a, 1, -1 do -- if step > 0
old_id = a[i].id
id = old_id + step
knx_addr = knxlib.decodega(id)
old_knx = knxlib.decodega(old_id)
old_name = a[i].name
-- Новое имя, в данном примере добавляет приписку Shifted к началу старого имени
new_name = 'Shifted ' .. old_name
-- Сдвиг групповых адресов
sql_query = "UPDATE objects SET id=?, rowid=?, address=? WHERE id=?"
db:query(sql_query, id, id, id, old_id)
-- Обновление имени, если необходимо
--sql_query = "UPDATE objects SET name=? WHERE name=?"
--db:query(sql_query, new_name, old_name)
--Обновление Modbus маппинга
sql_query = "UPDATE modbus_mapping SET bus_address=? WHERE bus_address=?"
db:query(sql_query, id, old_id)
-- Обновление объектов на визуализации
sql_query = "UPDATE visobjects SET object=? WHERE object=?"
db:query(sql_query, id, old_id)
sql_query = "UPDATE visobjects SET statusobject=? WHERE statusobject=?"
db:query(sql_query, id, old_id)
-- Обновление логов объектов
sql_query = "UPDATE objectlog SET address=? WHERE address=?"
db:query(sql_query, id, old_id)
-- Обновление трендлогов
sql_query = "UPDATE trends SET object=? WHERE object=?"
db:query(sql_query, id, old_id)
-- Обновление тегов
sql_query = "UPDATE objecttags SET object=? WHERE object=?"
db:query(sql_query, id, old_id)
-- Обновление планировщиков/пользовательских расписаний
sql_query = "UPDATE schedulers SET object=? WHERE object=?"
db:query(sql_query, id, old_id)
-- Обновление DALI маппинга
sql_query = "UPDATE dali_devices SET objbin=? WHERE objbin=?"
db:query(sql_query, id, old_id)
sql_query = "UPDATE dali_devices SET obj4bit=? WHERE obj4bit=?"
db:query(sql_query, id, old_id)
sql_query = "UPDATE dali_devices SET objscale=? WHERE objscale=?"
db:query(sql_query, id, old_id)
-- Обновление событийных скриптов
sql_query = "UPDATE scripting SET params=? WHERE params=?"
db:query(sql_query, knx_addr, old_knx)
end
log('end')

Следующий код позволяет изменить групповые адреса в исходном коде самих скриптов, но только по адресу, а не названию.

-- Функция сдвига
function shift_knx(addr)
step = 0 * 2^11 + 1 * 2^8 + 0 -- Сдвиг на 0/1/0
decode_knx = knxlib.encodega(addr)
new_knx = decode_knx + step
new_addr = knxlib.decodega(new_knx)
return new_addr
end
-- Получение всех скриптов
scripts = db:getall("SELECT script FROM scripting")
-- Цикл для прохода по каждому скрипту
for i = 1, #scripts, 1 do
-- Сдвиг всех адресов в исходном коде скрипта
new_script = string.gsub(scripts[i].script, "%d+/%d+/%d+", shift_knx)
-- Обновление скрипта
db:query("UPDATE scripting SET script=? WHERE script=?", new_script, scripts[i].script)
end