Вызов ChargePoint OCPPPython

Программы на Python
Ответить
Anonymous
 Вызов ChargePoint OCPP

Сообщение 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.")


Подробнее здесь: https://stackoverflow.com/questions/786 ... point-call
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»