Я создаю CMS, используя библиотеку Python OCPP от Mobile House. Я хотел отправить команду RemoteStartTransaction на зарядное устройство (в моем случае зарядное устройство — это просто симулятор на основе JS, который я запускаю с помощью браузера). Проблема, с которой я столкнулся, заключается в том, что выполнение функции self.call занимает около 30 секунд, о чем свидетельствует комментарий # проблема в прикрепленном блоке кода. Ключевое слово self представляет класс ChargePoint, предоставленный библиотекой.
По праву, ожидаемое поведение заключается в том, что функция self.call выдаст результаты сразу после получения ответа от зарядного устройства.
async def remote_start_transaction(self, id_tag, connector_id, duration_minute):
print("remote start transaction")
request = call.RemoteStartTransaction(id_tag=id_tag, connector_id=connector_id)
response = await self.call(request) # problem
print(f"got response: {response}")
logging.info(response)
if response.status == RemoteStartStopStatus.accepted:
self.has_remotely_started = True
self.charging_port_model_instance.status = "in_use"
await self.charging_port_model_instance.asave()
duration_second = duration_minute
if not settings.CHARGING_DURATION_USE_SECONDS_INSTEAD_OF_MINUTES:
duration_second = duration_second * 60
print(f"Charging for {duration_second} seconds")
await asyncio.sleep(duration_second)
await self.remote_stop_transaction()
print("Create Charging session completed")
else:
logging.warning(
f"Remote Start Transaction Failed | ChargePoint ID: {self.unique_identifier}"
)
logging.info(response.status)
Я проверил и подтвердил, что зарядное устройство ответило на вызов RemoteStartTransaction сразу после его получения, как показано в журнале ниже:
сообщения журнала
Я пытался исправить это, убедившись, что настройка асинхронности правильна, но безуспешно.
В качестве дополнительной информации я запускаю код в асинхронном потоке.
t = threading.Thread(target=asyncio.run, args=(handle_actions(),))
t.start()
async def handle_actions():
'''
This function should be called in a separate thread to listen to the redis queue and
perform the necessary actions.
'''
# listen to redis
db = CleanChargeRedis.redis_db(settings.REDIS_CONFIG)
queue_name = settings.REDIS_CONFIG['queue_name']
while True:
msg_json = CleanChargeRedis.redis_queue_pop(db, queue_name)
if not msg_json:
continue
print(f"Received from Redis queue: {msg_json}")
msg = json.loads(msg_json)
if msg['action'] == 'remote_start':
await handle_remote_start(msg)
elif msg['action'] == 'reserve_now':
await handle_reserve_now(msg)
async def handle_remote_start(msg):
cp = sockets.get(msg['connection_identifier'])
if cp:
await cp.remote_start_transaction(msg['id_tag'], msg['connector_id'], msg['duration_minute'])
else:
print(f"Charge Point {msg['connection_identifier']} is not connected.")
async def handle_reserve_now(msg):
cp = sockets.get(msg['connection_identifier'])
if cp:
await cp.reserve_now(msg['reservation_id'])
else:
print(f"Charge Point {msg['connection_identifier']} is not connected.")
Подробнее здесь: https://stackoverflow.com/questions/786 ... point-call
Вызов ChargePoint OCPP ⇐ Python
Программы на Python
1766655809
Anonymous
Я создаю CMS, используя библиотеку Python OCPP от Mobile House. Я хотел отправить команду RemoteStartTransaction на зарядное устройство (в моем случае зарядное устройство — это просто симулятор на основе JS, который я запускаю с помощью браузера). Проблема, с которой я столкнулся, заключается в том, что выполнение функции self.call занимает около 30 секунд, о чем свидетельствует комментарий # проблема в прикрепленном блоке кода. Ключевое слово self представляет класс ChargePoint, предоставленный библиотекой.
По праву, ожидаемое поведение заключается в том, что функция self.call выдаст результаты сразу после получения ответа от зарядного устройства.
async def remote_start_transaction(self, id_tag, connector_id, duration_minute):
print("remote start transaction")
request = call.RemoteStartTransaction(id_tag=id_tag, connector_id=connector_id)
response = await self.call(request) # problem
print(f"got response: {response}")
logging.info(response)
if response.status == RemoteStartStopStatus.accepted:
self.has_remotely_started = True
self.charging_port_model_instance.status = "in_use"
await self.charging_port_model_instance.asave()
duration_second = duration_minute
if not settings.CHARGING_DURATION_USE_SECONDS_INSTEAD_OF_MINUTES:
duration_second = duration_second * 60
print(f"Charging for {duration_second} seconds")
await asyncio.sleep(duration_second)
await self.remote_stop_transaction()
print("Create Charging session completed")
else:
logging.warning(
f"Remote Start Transaction Failed | ChargePoint ID: {self.unique_identifier}"
)
logging.info(response.status)
Я проверил и подтвердил, что зарядное устройство ответило на вызов RemoteStartTransaction сразу после его получения, как показано в журнале ниже:
сообщения журнала
Я пытался исправить это, убедившись, что настройка асинхронности правильна, но безуспешно.
В качестве дополнительной информации я запускаю код в асинхронном потоке.
t = threading.Thread(target=asyncio.run, args=(handle_actions(),))
t.start()
async def handle_actions():
'''
This function should be called in a separate thread to listen to the redis queue and
perform the necessary actions.
'''
# listen to redis
db = CleanChargeRedis.redis_db(settings.REDIS_CONFIG)
queue_name = settings.REDIS_CONFIG['queue_name']
while True:
msg_json = CleanChargeRedis.redis_queue_pop(db, queue_name)
if not msg_json:
continue
print(f"Received from Redis queue: {msg_json}")
msg = json.loads(msg_json)
if msg['action'] == 'remote_start':
await handle_remote_start(msg)
elif msg['action'] == 'reserve_now':
await handle_reserve_now(msg)
async def handle_remote_start(msg):
cp = sockets.get(msg['connection_identifier'])
if cp:
await cp.remote_start_transaction(msg['id_tag'], msg['connector_id'], msg['duration_minute'])
else:
print(f"Charge Point {msg['connection_identifier']} is not connected.")
async def handle_reserve_now(msg):
cp = sockets.get(msg['connection_identifier'])
if cp:
await cp.reserve_now(msg['reservation_id'])
else:
print(f"Charge Point {msg['connection_identifier']} is not connected.")
Подробнее здесь: [url]https://stackoverflow.com/questions/78632610/ocpp-chargepoint-call[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия