This MVP release provides a complete full-stack solution for managing action mappings in Geutebruck's GeViScope and GeViSoft video surveillance systems. ## Features ### Flutter Web Application (Port 8081) - Modern, responsive UI for managing action mappings - Action picker dialog with full parameter configuration - Support for both GSC (GeViScope) and G-Core server actions - Consistent UI for input and output actions with edit/delete capabilities - Real-time action mapping creation, editing, and deletion - Server categorization (GSC: prefix for GeViScope, G-Core: prefix for G-Core servers) ### FastAPI REST Backend (Port 8000) - RESTful API for action mapping CRUD operations - Action template service with comprehensive action catalog (247 actions) - Server management (G-Core and GeViScope servers) - Configuration tree reading and writing - JWT authentication with role-based access control - PostgreSQL database integration ### C# SDK Bridge (gRPC, Port 50051) - Native integration with GeViSoft SDK (GeViProcAPINET_4_0.dll) - Action mapping creation with correct binary format - Support for GSC and G-Core action types - Proper Camera parameter inclusion in action strings (fixes CrossSwitch bug) - Action ID lookup table with server-specific action IDs - Configuration reading/writing via SetupClient ## Bug Fixes - **CrossSwitch Bug**: GSC and G-Core actions now correctly display camera/PTZ head parameters in GeViSet - Action strings now include Camera parameter: `@ PanLeft (Comment: "", Camera: 101028)` - Proper filter flags and VideoInput=0 for action mappings - Correct action ID assignment (4198 for GSC, 9294 for G-Core PanLeft) ## Technical Stack - **Frontend**: Flutter Web, Dart, Dio HTTP client - **Backend**: Python FastAPI, PostgreSQL, Redis - **SDK Bridge**: C# .NET 8.0, gRPC, GeViSoft SDK - **Authentication**: JWT tokens - **Configuration**: GeViSoft .set files (binary format) ## Credentials - GeViSoft/GeViScope: username=sysadmin, password=masterkey - Default admin: username=admin, password=admin123 ## Deployment All services run on localhost: - Flutter Web: http://localhost:8081 - FastAPI: http://localhost:8000 - SDK Bridge gRPC: localhost:50051 - GeViServer: localhost (default port) Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
9.5 KiB
Action Mappings REST API - Complete Guide
Overview
The REST API now provides comprehensive access to action mappings from GeViSoft .set files. You can access all endpoints via Swagger UI at: http://localhost:8000/docs
Authentication
All endpoints require authentication:
- Username:
admin - Password:
admin123
Click the "Authorize" button in Swagger UI to log in.
Available Endpoints
1. GET /api/v1/configuration/action-mappings/export
Get all action mappings (READ)
Returns complete list of all action mappings with structured format including parameters.
Authentication: Viewer role (all users)
Response Format:
{
"total_mappings": 51,
"mappings_with_parameters": 11,
"mappings": [
{
"id": 1,
"offset": 252173,
"name": null,
"input_actions": [],
"output_actions": [
{
"action": "CrossSwitch C_101027 -> M",
"parameters": {
"SwitchMode": "True",
"VideoInput": "101027",
"VideoOutput": ""
}
},
{
"action": "GSC ViewerConnectLive V <- C",
"parameters": {}
}
]
}
]
}
Use Case:
- Display all mappings in your frontend
- Export to Excel/CSV
- Analysis and reporting
2. GET /api/v1/configuration/action-mappings/{mapping_id}
Get single mapping by ID (READ)
Retrieve details of a specific action mapping.
Authentication: Viewer role
Path Parameters:
mapping_id: Integer (1-based index, e.g., 1 = first mapping, 2 = second mapping)
Example Request:
GET /api/v1/configuration/action-mappings/5
Response:
{
"id": 5,
"offset": 253586,
"name": null,
"input_actions": [],
"output_actions": [
{
"action": "GSC warning: demo mode for 80 min",
"parameters": {}
}
]
}
Use Case:
- View details of specific mapping
- Editing preparation
- Debugging
3. POST /api/v1/configuration/action-mappings
Create new mapping (CREATE) ⚠️ Coming Soon
Add a new action mapping to the configuration.
Authentication: Administrator role
Request Body:
{
"name": "Switch Camera 101027",
"output_actions": [
{
"action": "CrossSwitch C_101027 -> M",
"parameters": {
"SwitchMode": "True",
"VideoInput": "101027"
}
}
]
}
Status: HTTP 501 Not Implemented Reason: Requires .set file writer implementation (planned for next phase)
4. PUT /api/v1/configuration/action-mappings/{mapping_id}
Update existing mapping (UPDATE) ⚠️ Coming Soon
Modify an existing action mapping.
Authentication: Administrator role
Path Parameters:
mapping_id: ID of mapping to update
Request Body (all fields optional):
{
"output_actions": [
{
"action": "CrossSwitch C_101027 -> M",
"parameters": {
"SwitchMode": "True",
"VideoInput": "101027",
"VideoOutput": "2"
}
}
]
}
Status: HTTP 501 Not Implemented
5. DELETE /api/v1/configuration/action-mappings/{mapping_id}
Delete mapping (DELETE) ⚠️ Coming Soon
Remove an action mapping from configuration.
Authentication: Administrator role
Path Parameters:
mapping_id: ID of mapping to delete
Status: HTTP 501 Not Implemented
6. POST /api/v1/configuration/action-mappings/bulk-import
Bulk import from Excel/CSV (CREATE MANY) ⚠️ Coming Soon
Import multiple action mappings at once.
Authentication: Administrator role
Request Body:
{
"mappings": [
{
"name": "Mapping 1",
"output_actions": [
{
"action": "Action1",
"parameters": {"param1": "value1"}
}
]
},
{
"name": "Mapping 2",
"output_actions": [
{
"action": "Action2",
"parameters": {}
}
]
}
],
"replace_existing": false
}
Response:
{
"success": true,
"message": "Successfully imported 100 action mappings",
"imported_count": 100,
"failed_count": 0,
"errors": []
}
Status: HTTP 501 Not Implemented
Current Status
✅ Fully Functional
- GET /action-mappings/export - Read all mappings
- GET /action-mappings/{id} - Read single mapping
⏳ Planned (Next Phase)
- POST /action-mappings - Create single mapping
- PUT /action-mappings/{id} - Update mapping
- DELETE /action-mappings/{id} - Delete mapping
- POST /action-mappings/bulk-import - Bulk import
Frontend Integration Recommendations
Phase 1: Read-Only Interface (Available Now)
Build your frontend to:
-
Display all mappings
// Fetch all mappings GET /api/v1/configuration/action-mappings/export // Display in table/grid - Column: ID - Column: Actions (list) - Column: Parameters (expandable) - Column: Offset (for debugging) -
View details
// User clicks on mapping GET /api/v1/configuration/action-mappings/{id} // Show modal/detail view with: - All actions - All parameters - Formatted display -
Export to Excel
// Get all mappings const data = await fetch('/api/v1/configuration/action-mappings/export') // Convert to Excel using library (e.g., xlsx, exceljs) // Each mapping = 1 row // Columns: ID, Actions (comma-separated), Parameters (JSON)
Phase 2: Full CRUD (Coming Soon)
Once the .set file writer is implemented:
-
Manual Add
// User fills form POST /api/v1/configuration/action-mappings Body: { name, output_actions } -
Edit
// User modifies mapping PUT /api/v1/configuration/action-mappings/{id} Body: { output_actions } -
Delete
DELETE /api/v1/configuration/action-mappings/{id} -
Bulk Import from Excel
// User uploads Excel file // Parse Excel rows into JSON array // Post to bulk import endpoint POST /api/v1/configuration/action-mappings/bulk-import Body: { mappings: [...], replace_existing: false }
Example Excel Import Workflow
Excel Format
| ID | Name | Action 1 | Param 1 Name | Param 1 Value | Action 2 | Param 2 Name | Param 2 Value |
|---|---|---|---|---|---|---|---|
| 1 | Switch Cam 1 | CrossSwitch C_101027 -> M | SwitchMode | True | ViewerConnect | ClientID | 123 |
| 2 | Switch Cam 2 | CrossSwitch C_101028 -> M | SwitchMode | True | ViewerConnect | ClientID | 124 |
Frontend Processing
async function importExcel(file) {
// 1. Parse Excel (using library like xlsx)
const workbook = XLSX.read(await file.arrayBuffer());
const sheet = workbook.Sheets[workbook.SheetNames[0]];
const rows = XLSX.utils.sheet_to_json(sheet);
// 2. Convert to API format
const mappings = rows.map(row => ({
name: row.Name,
output_actions: [
{
action: row['Action 1'],
parameters: {
[row['Param 1 Name']]: row['Param 1 Value']
}
}
]
}));
// 3. Post to API
const response = await fetch('/api/v1/configuration/action-mappings/bulk-import', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
mappings,
replace_existing: false
})
});
const result = await response.json();
console.log(`Imported: ${result.imported_count}, Failed: ${result.failed_count}`);
}
Testing in Swagger UI
-
Open:
http://localhost:8000/docs -
Click "Authorize"
- Username:
admin - Password:
admin123
- Username:
-
Try the GET endpoints:
- Expand
GET /api/v1/configuration/action-mappings/export - Click "Try it out"
- Click "Execute"
- See all 51+ mappings with parameters!
- Expand
-
Try single mapping:
- Expand
GET /api/v1/configuration/action-mappings/{mapping_id} - Click "Try it out"
- Enter
1for mapping_id - Click "Execute"
- See first mapping details
- Expand
-
Try CREATE (will show 501):
- Expand
POST /api/v1/configuration/action-mappings - Click "Try it out"
- See example request body
- Click "Execute"
- Get 501 Not Implemented (expected - coming soon!)
- Expand
Next Steps
Immediate (You Can Do Now)
✅ Build frontend that:
- Displays all mappings (GET /export)
- Shows mapping details (GET /{id})
- Exports to Excel for editing
- Plans Excel import format
Coming Soon (I Will Implement)
🔧 C# .set file writer to enable:
- POST /action-mappings (create)
- PUT /action-mappings/{id} (update)
- DELETE /action-mappings/{id} (delete)
- POST /action-mappings/bulk-import (Excel import)
Future Expansion
📈 Additional configuration sections:
- Cameras
- Monitors
- Digital I/O
- Alarms
- System settings
API Schema Summary
All endpoints return structured data with:
interface ActionMapping {
id: number; // Sequential ID (1-based)
offset: number; // Byte offset in .set file
name?: string; // Optional descriptive name
input_actions: Action[]; // Trigger actions (currently empty)
output_actions: Action[]; // Response actions (at least 1)
}
interface Action {
action: string; // Action command
parameters: Record<string, string>; // Parameter name-value pairs
}
Ready to start building your frontend! 🚀
All READ operations are fully functional. CREATE/UPDATE/DELETE coming in next phase once .set file writer is complete.