fix: issue 39
authorSekiya <shusei.sekiya@sap.com>
Thu, 27 Jun 2024 07:18:21 +0000 (16:18 +0900)
committerSekiya <shusei.sekiya@sap.com>
Thu, 27 Jun 2024 07:18:21 +0000 (16:18 +0900)
tests/ocpp-server/README.md
tests/ocpp-server/server.py

index 67942a07a774b2bd116de4f0f4920e70baa99922..e6a4dfa180791a9c62293c160f1127b06b3b4332 100644 (file)
@@ -29,7 +29,7 @@ You can also specify a command and a period duration with the --request and --pe
 To run the server and send a GetBaseReport command every 5 seconds, use:
 
 ```shell
-poetry run task server --request GetBaseReport --period 5
+poetry run task server --command GetBaseReport --period 5
 ```
 
 ### ClearCache Command
@@ -37,7 +37,7 @@ poetry run task server --request GetBaseReport --period 5
 To run the server and send a ClearCache command every 5 seconds, use:
 
 ```shell
-poetry run task server --request ClearCache --period 5
+poetry run task server --command ClearCache --period 5
 ```
 
 Please be mindful that these commands were examples according to the provided scenario, the available commands and their syntax might vary depending on the ocpp version and the implemented functionalities on your server.
index c6ea6e1360c19ed49c2fad4e1c9c2edc333cb7bd..5738c7e33ce778fcf401c1bdb7ac501f9944c3d1 100644 (file)
@@ -118,65 +118,41 @@ class ChargePoint(ocpp.v201.ChargePoint):
     async def send_get_base_report(self):
         request = ocpp.v201.call.GetBaseReport(
             reportBase=ReportBaseType.ConfigurationInventory
-        )  # Use correct ReportBaseType
-        try:
-            response = await self.call(request)
-            logging.info("Send %s", Action.GetBaseReport)
-
-            if response.status == ReportBaseType.accepted:
-                logging.info("%s successful", Action.GetBaseReport)
-            else:
-                logging.info("%s failed", Action.GetBaseReport)
-
-        except ConnectionClosed as e:
-            logging.error("Connection closed: %s", str(e))
+        )
+        response = await self.call(request)
 
-        except Exception as e:
-            logging.error("Unexpected error occurred: %s", str(e))
+        if response.status == ReportBaseType.accepted:
+            logging.info("%s successful", Action.GetBaseReport)
+        else:
+            logging.info("%s filed", Action.GetBaseReport)
 
-        logging.info("send_get_base_report done.")
 
 
 # Function to send OCPP command
 async def send_ocpp_command(cp, command_name, delay=None, period=None):
-    # If delay is not None, sleep for delay seconds
+    try:
+        match command_name:
+            case Action.ClearCache:
+                logging.info("%s Send:", Action.ClearCache)
+                await cp.send_clear_cache()
+            case Action.GetBaseReport:
+                logging.info("%s Send:", Action.GetBaseReport)
+                await cp.send_get_base_report()
+            case _:
+                logging.warning(f"Unsupported command {command_name}")
+    except Exception:
+        logging.exception(f"Failure while processing command {command_name}")
+
     if delay:
         await asyncio.sleep(delay)
 
-    # If period is not None, send command repeatedly with period interval
     if period:
-
-        async def send_command_repeatedly():
-            while True:
-                command_name = await cp.receive_command()
-                try:
-                    match command_name:
-                        case Action.ClearCache:
-                            logging.info("ClearCache parser working")
-                            await cp.send_clear_cache()
-                        case Action.GetBaseReport:
-                            logging.info("GetBaseReport parser working")
-                            await cp.send_get_base_report()
-                        case _:
-                            logging.warning(f"Unsupported command {command_name}")
-                except Exception:
-                    logging.exception(
-                        f"Failure while processing command {command_name}"
-                    )
-                finally:
-                    await asyncio.sleep(period)
-
-        timer = RepeatTimer(period, send_command_repeatedly)
-        await timer.start()
-        await timer.wait_closed()  # Wait for timer to finish before exiting
-
-    else:
-        if command_name == "GetBaseReport":
-            await cp.send_get_base_report()
+        my_timer = RepeatTimer(period, asyncio.create_task, [cp.send_ocpp_command(command_name)])
+        my_timer.start()
 
 
 # Function to handle new WebSocket connections.
-async def on_connect(websocket, path, args):
+async def on_connect(websocket, path):
     """For every new charge point that connects, create a ChargePoint instance and start
     listening for messages."""
     try:
@@ -202,39 +178,38 @@ async def on_connect(websocket, path, args):
     ChargePoints.add(cp)
     try:
         await cp.start()
-        # Check if request argument is specified
-        if args.request:
-            asyncio.create_task(
-                send_ocpp_command(cp, args.request, args.delay, args.period)
-            )
 
     except ConnectionClosed:
         logging.info("ChargePoint %s closed connection", cp.id)
         ChargePoints.remove(cp)
         logging.debug("Connected ChargePoint(s): %d", len(ChargePoints))
 
-
 # Main function to start the WebSocket server.
 async def main():
     # Define argument parser
-    parser = argparse.ArgumentParser(description="OCPP Charge Point Simulator")
-    parser.add_argument("--request", type=str, help="OCPP 2 Command Name")
+    parser = argparse.ArgumentParser(description="OCPP2 Charge Point Simulator")
+    parser.add_argument("--command", type=str, help="OCPP2 Command Name")
     parser.add_argument("--delay", type=int, help="Delay in seconds")
     parser.add_argument("--period", type=int, help="Period in seconds")
 
-    args = parser.parse_args()
-
-    on_connect_bound = partial(on_connect, args=args)  # Add args to on_connect
 
     # Create the WebSocket server and specify the handler for new connections.
     server = await websockets.serve(
-        on_connect_bound,
+        on_connect,
         "127.0.0.1",  # Listen on loopback.
         9000,  # Port number.
         subprotocols=["ocpp2.0", "ocpp2.0.1"],  # Specify OCPP 2.0.1 subprotocols.
     )
     logging.info("WebSocket Server Started")
 
+    args = parser.parse_args()
+
+    if args.command:
+        for cp in ChargePoints:
+            asyncio.create_task(
+                send_ocpp_command(cp, args.command, args.delay, args.period)
+                )
+
     # Wait for the server to close (runs indefinitely).
     await server.wait_closed()