Управление освещением
Презентации
Технические решения на LogicMachine
Визуализация
  logicmachine.net.ru    Технические решения на LogicMachine    Сдвиг всех групповых адресов

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

ВНИМАНИЕ! Перед применением данного решения обязательно сделайте резервную копию вашего 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



Copyright
© Embedded Systems Rus
2019. All Rights Reserved