""" Add test servers and action mappings - named with "Claude" prefix """ import asyncio import sys sys.path.insert(0, r'C:\DEV\COPILOT\geutebruck-api\src\api\protos') import grpc import configuration_pb2 import configuration_pb2_grpc async def get_existing_servers(): """Read current configuration and list all servers""" channel = grpc.aio.insecure_channel('localhost:50051') stub = configuration_pb2_grpc.ConfigurationServiceStub(channel) try: request = configuration_pb2.ReadConfigurationTreeRequest() response = await stub.ReadConfigurationTree(request, timeout=10.0) servers = [] for child in response.root.children: if child.name == "GeViGCoreServer": for server in child.children: if server.type == "folder": servers.append({ 'id': server.name, 'alias': next((c.string_value for c in server.children if c.name == "Alias"), ""), 'host': next((c.string_value for c in server.children if c.name == "Host"), "") }) break await channel.close() return servers except grpc.RpcError as e: print(f"Error reading configuration: {e.code()} - {e.details()}") await channel.close() return [] def get_next_server_id(servers): """Find the highest numeric server ID and return next ID""" numeric_ids = [] for server in servers: try: numeric_ids.append(int(server['id'])) except ValueError: pass if not numeric_ids: return "1" return str(max(numeric_ids) + 1) async def create_server(alias, host, user="admin", password="", enabled=True): """Create a server with auto-incremented ID""" servers = await get_existing_servers() next_id = get_next_server_id(servers) print(f"Creating server ID={next_id}: {alias}") channel = grpc.aio.insecure_channel('localhost:50051') stub = configuration_pb2_grpc.ConfigurationServiceStub(channel) request = configuration_pb2.CreateServerRequest( server=configuration_pb2.ServerData( id=next_id, alias=alias, host=host, user=user, password=password, enabled=enabled, deactivate_echo=False, deactivate_live_check=False ) ) try: response = await stub.CreateServer(request, timeout=10.0) print(f" [OK] Server created - ID: {response.server.id}, Host: {response.server.host}") await channel.close() return response.server.id except grpc.RpcError as e: print(f" [ERROR] Failed to create server: {e.details()}") await channel.close() return None async def create_action_mapping(name, message): """Create an action mapping""" channel = grpc.aio.insecure_channel('localhost:50051') stub = configuration_pb2_grpc.ConfigurationServiceStub(channel) mapping_request = configuration_pb2.CreateActionMappingRequest( mapping=configuration_pb2.ActionMappingInput( name=name, input_actions=[ configuration_pb2.ActionDefinition( action="DigitalContactChanged", parameters=[ configuration_pb2.ActionParameter(name="Contact", value="1"), configuration_pb2.ActionParameter(name="State", value="closed") ] ) ], output_actions=[ configuration_pb2.ActionDefinition( action="SystemInfo", parameters=[ configuration_pb2.ActionParameter(name="Message", value=message) ] ) ], video_input=101027 ) ) try: response = await stub.CreateActionMapping(mapping_request, timeout=10.0) print(f" [OK] Action mapping created: {response.mapping.name}") await channel.close() return True except grpc.RpcError as e: print(f" [ERROR] Failed to create action mapping: {e.details()}") await channel.close() return False async def main(): print("=" * 70) print("ADDING CLAUDE TEST DATA") print("=" * 70) # 1. List current servers print("\n1. CURRENT SERVERS:") print("-" * 70) servers = await get_existing_servers() for server in servers: print(f" ID: {server['id']:10s} | Alias: {server['alias']:30s} | Host: {server['host']}") # 2. Create test servers print("\n2. CREATING CLAUDE SERVERS:") print("-" * 70) await create_server( alias="Claude Server Alpha", host="192.168.10.100", user="admin", password="claude123" ) await create_server( alias="Claude Server Beta", host="192.168.10.101", user="admin", password="claude123" ) await create_server( alias="Claude Server Gamma", host="192.168.10.102", user="admin", password="claude123" ) # 3. Create action mappings print("\n3. CREATING CLAUDE ACTION MAPPINGS:") print("-" * 70) await create_action_mapping( name="Claude Mapping - Door Contact", message="Claude: Door contact triggered" ) await create_action_mapping( name="Claude Mapping - Window Sensor", message="Claude: Window sensor activated" ) # 4. List final state print("\n4. FINAL CONFIGURATION:") print("-" * 70) servers = await get_existing_servers() for server in servers: print(f" ID: {server['id']:10s} | Alias: {server['alias']:30s} | Host: {server['host']}") print("\n" + "=" * 70) print("DONE - Check GeViSet to verify Claude's additions") print("=" * 70) if __name__ == "__main__": asyncio.run(main())