#volttron
Вопрос:
У меня есть система BACnet для управления системой кондиционирования, в которой я использую агент привода VOLTTRON для записи @ priority 10 в BACnet со значением 2, что хорошо работает.
result = self.vip.rpc.call('platform.actuator', 'set_multiple_points', self.core.identity, set_multi_topic_values_master).get(timeout=20)
_log.debug(f'*** [Setter Agent INFO] *** - set_multiple_points ON ALL VAVs WRITE SUCCESS!')
Затем система на некоторое время отключается для целей тестирования:
_log.debug(f'*** [Setter Agent INFO] *** - SETTING UP GEVENT SLEEP!')
gevent.sleep(120)
_log.debug(f'*** [Setter Agent INFO] *** - GEVENT SLEEP DONE!')
Где после сна gevent я сталкиваюсь с некоторыми проблемами, связанными с тем, что точка возврата не работает. Приведенный ниже код выполняется просто отлично, но при использовании инструмента сканирования BACnet значение приоритета 10, равное 2, все еще присутствует в элементах управления HVAC, например, точка возврата ничего не делает.
for device in revert_topic_devices_jci:
response = self.vip.rpc.call('platform.actuator', 'revert_point', self.core.identity, topic_jci, self.jci_setpoint_topic).get(timeout=20)
_log.debug(f'*** [Setter Agent INFO] *** - REVERT POINTS ON {device} SUCCESS!')
_log.debug(f'*** [Setter Agent INFO] *** - REVERT POINTS JCI DONE DEAL SUCCESS!')
Одна вещь, которую я замечаю, — автоматизация зданий записывает заполняемость/незанятость в элементы управления HVAC @ приоритет BACnet 12. Его либо ВСЕГДА 1 для занятости, либо 2 для незанятости.
То, что я пытаюсь сделать с VOLTTRON, — это записать в BACnet с приоритетом 10 значение 2, а затем отпустить в ничто при возврате. Может ли это путем возврата ничего не делать, потому что тоже нечего было возвращать? Я надеялся, что VOLTTRON сможет написать @ BACnet priority 10, а затем просто выпустить. В инструменте сканирования BACnet я могу сделать то же самое, написать @ приоритет 10, а затем освободить приоритет 10 с приоритетом 10 записи null
Должен ли я просто писать с приоритетом 12 так же, как система автоматизации зданий, чтобы VOLTTRON тоже мог вернуться к тому, что делала автоматизация зданий?
Ответ №1:
У меня есть несколько замечаний:
- В цикле возврата, третьем блоке кода выше, вы фактически не меняете тему, передаваемую вызову RPC. Каждый вызов будет использовать тему устройства, которой нет в этом блоке кода (но, как мы видим, она не изменяется внутри блока), и тему устройства, которая аналогично не определена в блоке, но, по крайней мере, кажется, что она не изменяется. Вероятно, стоит установить здесь некоторые точки останова и/или инструкции отладки, чтобы убедиться, что вы передаете правильные темы для возврата.
- Использование вами приоритета, по-видимому, соответствует спецификации протокола BACnet и реализации драйвера VOLTTRON BACnet. Мы бы не рекомендовали вам пытаться писать с тем же приоритетом, что и существующая система автоматизации зданий.
- Код драйвера BACnet отправит значение NULL (Нет) в запросе на обслуживание «Свойства записи», когда драйвер платформы вызовет функцию «revert_point». С этой функциональностью я, честно говоря, не очень хорошо знаком, но, учитывая, что ваш инструмент сканирования выполняет ожидаемую функцию возврата при передаче нулевого значения, я подозреваю, что это ожидаемый способ выполнения функции типа «возврат к предыдущему значению» в протоколе BACnet. У меня нет оснований полагать, что поведение, с которым вы сталкиваетесь, является результатом ошибки в базе кода драйвера.
В целом, я предлагаю отладить темы, передаваемые в вызове RPC «revert_point».
Ответ №2:
Мне очень повезло вернуться к использованию точки set_multiple_points
, чтобы None
Что-то вроде этого:
self.jci_device_map = {
'VMA-2-6': '27',
'VMA-2-4': '29',
'VMA-2-7': '30',
'VMA-1-8': '6',
}
revert_multi_topic_values_master = []
set_multi_topic_values_master = []
for device in self.jci_device_map.values():
topic_jci = '/'.join([self.building_topic, device])
final_topic_jci = '/'.join([topic_jci, self.jci_setpoint_topic])
# BACnet enum point for VAV occ
# 1 == occ, 2 == unnoc
# create a (topic, value) tuple and add it to our topic values
set_multi_topic_values_master.append((final_topic_jci, self.unnoccupied_value)) # TO SET UNNOCUPIED
revert_multi_topic_values_master.append((final_topic_jci, None)) # TO SET FOR REVERT
result = self.vip.rpc.call('platform.actuator', 'set_multiple_points', self.core.identity, revert_multi_topic_values_master).get(timeout=20)