Агент привода ВОЛЬТТРОНА RPC не работает

#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:

У меня есть несколько замечаний:

  1. В цикле возврата, третьем блоке кода выше, вы фактически не меняете тему, передаваемую вызову RPC. Каждый вызов будет использовать тему устройства, которой нет в этом блоке кода (но, как мы видим, она не изменяется внутри блока), и тему устройства, которая аналогично не определена в блоке, но, по крайней мере, кажется, что она не изменяется. Вероятно, стоит установить здесь некоторые точки останова и/или инструкции отладки, чтобы убедиться, что вы передаете правильные темы для возврата.
  2. Использование вами приоритета, по-видимому, соответствует спецификации протокола BACnet и реализации драйвера VOLTTRON BACnet. Мы бы не рекомендовали вам пытаться писать с тем же приоритетом, что и существующая система автоматизации зданий.
  3. Код драйвера 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)