首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OCPP1.6远程启动事务

OCPP1.6远程启动事务
EN

Stack Overflow用户
提问于 2022-06-10 11:07:15
回答 1查看 948关注 1票数 0

这是我们的CentralSystem.py

我们配置了一个活动充电器,可以连接到我们的websocket Ex - ws://HostName:Port/Charger序列号。

一旦充电器连接到我们的中央系统,它就会自动向我们发送以下信息:

充电点/D5200372001000010101连接信息:ocpp:d 5200372001000010101:接收消息2,"530",“心跳”,{}心跳信息:ocpp:D 5200372001000010101: send 3,"530",{"currentTime":"2022-06-10T10:43:26Z"} INFO:ocpp:D5200372001000010101:接收消息2,"531",“心跳”,{}心跳

问题1-我们每2分钟接收一次心跳,但当没有车辆连接时,我们看不到任何BootNotification和状态通知。

然而,当车辆连接时,我们确实会看到状态通知和心跳。

问题2-现在,我们有一个移动应用程序,是建立使用颤振,应该允许我们启用“远程启动事务”。实现这一目标的最佳途径是什么?我们是否应该连接到同一个websocket端点并调用RemoteStartTransaction。

代码语言:javascript
运行
复制
import asyncio
import logging
from asyncio import constants

import websockets
from datetime import datetime, timezone
from ocpp.routing import on
from ocpp.v16 import ChargePoint as cp
from ocpp.v16.enums import Action, RegistrationStatus, RemoteStartStopStatus
import ocpp.v16.enums as enums
from ocpp.v16 import call_result, call
import requests

logging.basicConfig(level=logging.INFO)


class ChargePoint(cp):
  chargingProfile = {}

  @on(Action.RemoteStartTransaction)
  async def on_remote_start(self, id_tag, connector_id):
    print("remotely starting")
    return await self.remote_start_transaction()

  @on(Action.BootNotification)
  def on_boot_notification(self, charge_point_vendor, charge_point_model, **kwargs):
    print("Boot Notification")
    return call_result.BootNotificationPayload(
      # current_time=datetime.utcnow().isoformat() + 'Z',
      current_time=datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S') + "Z",
      interval=100,
      status=RegistrationStatus.accepted
    )

  @on(Action.StatusNotification)
  def on_status_notification(self, connector_id, error_code, status, **kwargs):
    print("Status Notification")
    return call_result.StatusNotificationPayload()

  @on(Action.Heartbeat)
  def on_heartbeat(self):
    print("Heartbeat")
    return call_result.HeartbeatPayload(
      current_time=datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S') + "Z"
    )

  @on(Action.Authorize)
  def on_authorize(self, id_tag):
    print("Authorize")
    query = {'access_token': 'masterKey'}

    response = requests.get('http://ec2-13-233-102-233.ap-south-1.compute.amazonaws.com:3000/chargersOnboarding/',
                            params=query)
    data = response.json()
    isFound = "false"
    status = ""

    for item in data['rows']:
      if item['RFID'] == id_tag:
        isFound = "true"
        if item['status'] == 0:
          status = "Accepted"
        else:
          status = "Expired"
        break
      else:
        continue
    if isFound == "true":
      print("Authorized")
      return call_result.AuthorizePayload(
        id_tag_info={
          # "expiryDate": "2022-02-04T13:00:00.21Z",
          "expiryDate": "2023-05-19T13:00:00.21Z",
          "parentIdTag": id_tag,
          "status": status
        },
      )
    else:
      print("Not Authorized")
      return call_result.AuthorizePayload(
        id_tag_info={
          "expiryDate": "",
          "parentIdTag": id_tag,
          "status": "Invalid"
        },
      )

  @on(Action.StartTransaction)
  def on_start_transaction(self, connector_id, id_tag, meter_start, timestamp, **kwargs):
    print("START TRANSACTION COMING FROM CHARGER")
    query = {'access_token': 'masterKey'}

    response = requests.get('http://ec2-13-233-102-233.ap-south-1.compute.amazonaws.com:3000/chargersOnboarding/',
                            params=query)
    data = response.json()
    isFound = "false"
    status = ""

    for item in data['rows']:
      if item['RFID'] == id_tag:
        isFound = "true"
        if item['status'] == 0:
          status = "Accepted"
        else:
          status = "Expired"
        break
      else:
        continue
    if isFound == "true":
      return call_result.StartTransactionPayload(
        id_tag_info={
          # "expiryDate": "2022-02-04T13:00:00.21Z",
          "expiryDate": "2023-05-19T13:00:00.21Z",
          "parentIdTag": id_tag,
          "status": status
        },
        transaction_id=int(1)
      )
    else:
      print("Not Authorized")
      return call_result.StartTransactionPayload(
        id_tag_info={
          "expiryDate": "",
          "parentIdTag": id_tag,
          "status": "Invalid"
        },
        transaction_id=int(1)
      )

  @on(Action.StopTransaction)
  def on_stop_transaction(self, transaction_id, timestamp, meter_stop, id_tag, **kwargs):
    query = {'access_token': 'masterKey'}
    response = requests.get('http://ec2-13-233-102-233.ap-south-1.compute.amazonaws.com:3000/chargersOnboarding/',
                            params=query)
    data = response.json()
    isFound = "false"
    status = ""

    for item in data['rows']:
      if item['RFID'] == id_tag:
        isFound = "true"
        if item['status'] == 0:
          status = "Accepted"
        else:
          status = "Expired"
        break
      else:
        continue
    if isFound == "true":
      return call_result.StopTransactionPayload(
        id_tag_info={
          # "expiryDate": "2022-02-04T13:00:00.21Z",
          "expiryDate": "2023-05-19T13:00:00.21Z",
          "parentIdTag": id_tag,
          "status": status
        },
        # transaction_id=int(1)
      )
    else:
      print("Not Authorized")
      return call_result.StopTransactionPayload(
        id_tag_info={
          "expiryDate": "",
          "parentIdTag": id_tag,
          "status": "Invalid"
        },
        transaction_id=int(1)
      )

  @on(Action.MeterValues)
  def on_meter_value(self, **kwargs):
    return call_result.MeterValuesPayload()

  @on(Action.DataTransfer)
  def on_data_transfer(self, vendor_id, message_id, data):
    return call_result.DataTransferPayload(
      status='Accepted'
    )

  @on(Action.ChangeAvailability)
  def on_change_availabilty(self, connector_id, type):
    return call_result.ChangeAvailabilityPayload(
      status='Accepted'
    )

  async def send_limitation(self, limit):
    response = await self.call(call.SetChargingProfilePayload(
      connector_id=0,
      cs_charging_profiles={
        'chargingProfileId': 1,
        'stackLevel': 0,
        'chargingProfilePurpose': enums.ChargingProfilePurposeType.chargepointmaxprofile,
        'chargingProfileKind': enums.ChargingProfileKindType.absolute,
        'chargingSchedule': {
          'startSchedule': datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S') + "Z",
          'chargingRateUnit': enums.ChargingRateUnitType.amps,
          'chargingSchedulePeriod': [{
            'startPeriod': 0,
            'limit': limit
          }]
        }
      }
    ))
    print("SEND Limitation")
    print(response)

  async def remote_start_transaction(self):
    obj = {
      'chargingProfileId': 1,
      'stackLevel': 0,
      'chargingProfilePurpose': enums.ChargingProfilePurposeType.chargepointmaxprofile,
      'chargingProfileKind': enums.ChargingProfileKindType.absolute,
      'chargingSchedule': {
        'startSchedule': datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S') + "Z",
        'chargingRateUnit': enums.ChargingRateUnitType.amps,
        'chargingSchedulePeriod': [{
          'startPeriod': 0,
          'limit': 8.0
        }]
      },

    }
    print("REMOTE START!!!")
    request = call.RemoteStartTransactionPayload(
      id_tag='5C1DEA5A',
      charging_profile=obj,
      connector_id=1
    )
    response = await self.call(request)
    print(response)
    if response.status == RemoteStartStopStatus.accepted:
      print("Transaction Started!!!")
    else:
      print("Transaction Failed to Start!!!")
      print(response.status)
      # websockets.send("Transaction Started!!!")

  async def remote_stop_transaction(self):
    print("REMOTE STOP!!!")
    request = call.RemoteStopTransactionPayload(
      transaction_id=1
    )
    response = await self.call(request)

    if response.status == RemoteStartStopStatus.accepted:
      print("Stopping transaction")
      # websockets.send("Transaction Stopped!!!")


async def on_connect(websocket, path):

  charge_point_id = path.strip('/')
  cp = ChargePoint(charge_point_id, websocket)
  try:
    print(f'Charge point {path} connected')
    await asyncio.gather(cp.start())

  except websockets.exceptions.ConnectionClosed:
    print(f"Charge Point {path} disconnected")


async def main():
  server = await websockets.serve(
    on_connect,
    '0.0.0.0',
    9000,
    subprotocols=['ocpp1.6'],
    ping_interval=None,
    ping_timeout=None

  )

  logging.info("Server Started listening to new connections...")
  await server.wait_closed()


if __name__ == '__main__':
  asyncio.run(main())
EN

回答 1

Stack Overflow用户

发布于 2022-08-10 23:35:20

代码语言:javascript
运行
复制
> async def send_heartbeat(self, interval):
>         request = call.HeartbeatPayload()
>         while True:
>             await self.call(request)
>             await asyncio.sleep(interval)
> 

> await asyncio.gather(cp.start(), cp.send_heartbeat(10))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72573301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档