From 4d41b7b9b3b0d42bbdbf2b1fc81ad6c8d63602a3 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 29 Aug 2025 20:31:17 +0200 Subject: [PATCH] Refactor plot definitions and variable configurations - Updated plot definition for DAR_Brix to disable stacking and increase time window from 60 to 120 seconds. - Changed variable name from "Blink" to "HMI_Instrument.CTS306.PVFiltered" in plot variables configuration. - Removed console logs related to pending time changes in PlotHistoricalSession component for cleaner code. - Enhanced VariableSelectorWidget with debug options and improved SSE connection handling. - Removed unnecessary debug logs from various components including Tooltip, AllWidgets, and TestWidget. - Implemented automatic reconnection logic for SSE in useCoordinatedSSE hook. - Added periodic ping messages in stream_variables function to maintain SSE connection. - Updated system state to enable connection and include active datasets. --- application_events.json | 3590 +++++++++++++++-- config/data/plot_definitions.json | 4 +- config/data/plot_variables.json | 2 +- .../src/components/PlotHistoricalSession.jsx | 7 - frontend/src/components/PlotManager.jsx | 6 +- .../src/components/PlotRealtimeSession.jsx | 16 - frontend/src/components/TimePointSelector.jsx | 3 - .../rjsf/VariableSelectorWidget.jsx | 114 +- frontend/src/components/ui/tooltip.jsx | 3 - .../src/components/widgets/AllWidgets.jsx | 7 - .../widgets/PlcVariableObjectWidget.jsx | 35 - .../src/components/widgets/TestWidget.jsx | 2 - frontend/src/contexts/VariableContext.jsx | 6 +- .../src/hooks/useCoordinatedConnection.js | 115 +- frontend/src/pages/Dashboard.jsx | 43 - main.py | 10 + system_state.json | 9 +- 17 files changed, 3403 insertions(+), 569 deletions(-) diff --git a/application_events.json b/application_events.json index eefff23..5fd5db4 100644 --- a/application_events.json +++ b/application_events.json @@ -1,406 +1,5 @@ { "events": [ - { - "timestamp": "2025-08-29T10:03:39.800230", - "level": "info", - "event_type": "application_started", - "message": "Application initialization completed successfully", - "details": {} - }, - { - "timestamp": "2025-08-29T10:03:39.823390", - "level": "info", - "event_type": "dataset_activated", - "message": "Dataset activated: DAR", - "details": { - "dataset_id": "DAR", - "variables_count": 6, - "streaming_count": 4, - "prefix": "dar" - } - }, - { - "timestamp": "2025-08-29T10:03:39.824406", - "level": "info", - "event_type": "csv_recording_started", - "message": "🔥 CRITICAL PRIORITY: CSV recording started with MAXIMUM PRIORITY, async buffering, and performance monitoring: 1 datasets activated", - "details": { - "activated_datasets": 1, - "total_datasets": 1, - "priority": "CRITICAL", - "recording_protection": true, - "performance_monitoring": true, - "async_csv_buffering": true, - "csv_flush_interval": 5.0 - } - }, - { - "timestamp": "2025-08-29T10:03:40.831309", - "level": "info", - "event_type": "application_started", - "message": "Application initialization completed successfully", - "details": {} - }, - { - "timestamp": "2025-08-29T10:03:40.852505", - "level": "info", - "event_type": "dataset_activated", - "message": "Dataset activated: DAR", - "details": { - "dataset_id": "DAR", - "variables_count": 6, - "streaming_count": 4, - "prefix": "dar" - } - }, - { - "timestamp": "2025-08-29T10:03:40.853791", - "level": "info", - "event_type": "csv_recording_started", - "message": "🔥 CRITICAL PRIORITY: CSV recording started with MAXIMUM PRIORITY, async buffering, and performance monitoring: 1 datasets activated", - "details": { - "activated_datasets": 1, - "total_datasets": 1, - "priority": "CRITICAL", - "recording_protection": true, - "performance_monitoring": true, - "async_csv_buffering": true, - "csv_flush_interval": 5.0 - } - }, - { - "timestamp": "2025-08-29T10:03:42.872508", - "level": "error", - "event_type": "dataset_loop_error", - "message": "� CRITICAL: Multiple consecutive read failures for dataset 'DAR' (5). Stopping dataset.", - "details": { - "dataset_id": "DAR", - "consecutive_errors": 5, - "priority": "CRITICAL" - } - }, - { - "timestamp": "2025-08-29T10:03:50.853254", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 11.024716854095459, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 4, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:00.854706", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.8% CPU", - "details": { - "duration": 10.002092361450195, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.8, - "cpu_max": 0.8, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:10.856250", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001543521881104, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:20.857798", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001548290252686, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:30.859713", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001914739608765, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:40.861263", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001550197601318, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:04:50.862685", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001421928405762, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:00.864717", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.00142788887024, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:10.865811", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001697540283203, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:20.867593", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.001782417297363, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:30.869493", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.00190019607544, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:40.871003", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.00150990486145, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:05:50.873315", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU", - "details": { - "duration": 10.002312421798706, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.0, - "cpu_max": 0.0, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, - { - "timestamp": "2025-08-29T10:06:00.874973", - "level": "info", - "event_type": "performance_report", - "message": "Performance report: 0 points saved, 0 lost, 0.2% CPU", - "details": { - "duration": 10.001657485961914, - "points_saved": 0, - "points_rate": 0.0, - "variables_saved": 0, - "udp_points_sent": 0, - "points_lost": 0, - "cpu_average": 0.2, - "cpu_max": 0.2, - "delay_average": 0.0, - "delay_max": 0.0, - "read_errors": 0, - "csv_errors": 0, - "udp_errors": 0, - "read_time_avg": 0.0, - "csv_write_time_avg": 0.0 - } - }, { "timestamp": "2025-08-29T10:06:10.876572", "level": "info", @@ -18493,8 +18092,3193 @@ "active_datasets_count": 1, "csv_recording_active": false } + }, + { + "timestamp": "2025-08-29T19:56:44.834185", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-29T19:56:45.877441", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-29T20:09:49.812032", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 7, + "streaming_count": 5, + "prefix": "dar" + } + }, + { + "timestamp": "2025-08-29T20:09:49.840854", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: Test", + "details": { + "dataset_id": "Test", + "variables_count": 1, + "streaming_count": 0, + "prefix": "test" + } + }, + { + "timestamp": "2025-08-29T20:09:49.867470", + "level": "info", + "event_type": "csv_recording_started", + "message": "🔥 CRITICAL PRIORITY: CSV recording started with MAXIMUM PRIORITY, async buffering, and performance monitoring: 2 datasets activated", + "details": { + "activated_datasets": 2, + "total_datasets": 2, + "priority": "CRITICAL", + "recording_protection": true, + "performance_monitoring": true, + "async_csv_buffering": true, + "csv_flush_interval": 5.0 + } + }, + { + "timestamp": "2025-08-29T20:09:49.892669", + "level": "info", + "event_type": "plc_connection", + "message": "Successfully connected to PLC 10.1.33.11 and auto-started CSV recording for 2 datasets", + "details": { + "ip": "10.1.33.11", + "rack": 0, + "slot": 2, + "symbols_path": "C:/Users/migue/Downloads/symSAE452.asc", + "auto_started_recording": true, + "recording_datasets": 2, + "dataset_names": [ + "DAR", + "Test" + ] + } + }, + { + "timestamp": "2025-08-29T20:09:59.811605", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 794.9420523643494, + "points_saved": 20, + "points_rate": 0.025159066551474006, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1256019353866577, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:09.837521", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.6% CPU", + "details": { + "duration": 10.025410652160645, + "points_saved": 20, + "points_rate": 1.994930750860531, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.6, + "cpu_max": 0.6, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.13174021244049072, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:13.410425", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491013409_2", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "CTS306_PEW" + ], + "time_window": 60, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:10:19.874293", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.037277936935425, + "points_saved": 20, + "points_rate": 1.9925721022831802, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12831995487213135, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:29.917829", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.9% CPU", + "details": { + "duration": 10.04353642463684, + "points_saved": 21, + "points_rate": 2.0908969821114907, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.9, + "cpu_max": 0.9, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12108400889805385, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:39.939093", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.021263837814331, + "points_saved": 20, + "points_rate": 1.9957562562649844, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11764242649078369, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:49.960656", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.021562576293945, + "points_saved": 20, + "points_rate": 1.9956967636274703, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11542130708694458, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:10:59.982420", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.021763801574707, + "points_saved": 20, + "points_rate": 1.9956566923735946, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12021534442901612, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:11:10.005087", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.02266788482666, + "points_saved": 20, + "points_rate": 1.995476676452389, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11658999919891358, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:11:20.026496", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.021408319473267, + "points_saved": 20, + "points_rate": 1.9957274828465643, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11638294458389283, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:11:26.862388", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491086862_3", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 60, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:11:28.049804", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491088048_4", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 60, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:11:30.052253", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025757074356079, + "points_saved": 21, + "points_rate": 2.094604910557217, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11457184382847377, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:11:40.074040", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.0217866897583, + "points_saved": 20, + "points_rate": 1.995652134607781, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11887092590332031, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:11:50.096443", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.022403001785278, + "points_saved": 20, + "points_rate": 1.9955294150951048, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11570484638214111, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:00.120408", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023436307907104, + "points_saved": 20, + "points_rate": 1.995323697944064, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12298736572265626, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:10.143190", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.023311376571655, + "points_saved": 20, + "points_rate": 1.9953485678143965, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1191133737564087, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:20.165054", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.021356105804443, + "points_saved": 20, + "points_rate": 1.9957378810654032, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11682159900665283, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:30.188591", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.024044752120972, + "points_saved": 20, + "points_rate": 1.9952025848416362, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11070231199264527, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:40.221170", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.032578468322754, + "points_saved": 20, + "points_rate": 1.9935054645372337, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11837642192840576, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:12:50.244060", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.022890567779541, + "points_saved": 20, + "points_rate": 1.9954323420724303, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11364624500274659, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:00.266106", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.022045373916626, + "points_saved": 20, + "points_rate": 1.9956006238059945, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11704604625701905, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:10.288837", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02273154258728, + "points_saved": 20, + "points_rate": 1.9954640025045682, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11987195014953614, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:20.311163", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.021816492080688, + "points_saved": 20, + "points_rate": 1.9956462000480795, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12125930786132813, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:30.334361", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.023707151412964, + "points_saved": 20, + "points_rate": 1.9952697837127809, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11490981578826905, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:40.356739", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.022377729415894, + "points_saved": 20, + "points_rate": 1.9955344470104706, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11475651264190674, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:13:50.379646", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.022907018661499, + "points_saved": 20, + "points_rate": 1.9954290669126535, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12859752178192138, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:00.412539", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 8.4% CPU", + "details": { + "duration": 10.032893419265747, + "points_saved": 20, + "points_rate": 1.9934428847409895, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 8.4, + "cpu_max": 8.4, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11563323736190796, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:10.435084", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.022545337677002, + "points_saved": 20, + "points_rate": 1.995501075441934, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11234749555587768, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:20.457853", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.0227689743042, + "points_saved": 20, + "points_rate": 1.9954565501085433, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1214672565460205, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:30.480318", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.022464752197266, + "points_saved": 20, + "points_rate": 1.9955171202388433, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11476998329162598, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:40.512652", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.032334327697754, + "points_saved": 20, + "points_rate": 1.9935539772416708, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11598918437957764, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:14:50.535204", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.022551536560059, + "points_saved": 20, + "points_rate": 1.9954998412374743, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.119586181640625, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:00.558004", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.022799730300903, + "points_saved": 20, + "points_rate": 1.9954504268439137, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12717058658599853, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:10.589996", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.031991958618164, + "points_saved": 20, + "points_rate": 1.993622012706922, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12902480363845825, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:20.614937", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.024941444396973, + "points_saved": 20, + "points_rate": 1.9950241216798503, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1279079794883728, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:30.663340", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.6% CPU", + "details": { + "duration": 10.048402547836304, + "points_saved": 20, + "points_rate": 1.9903661208623202, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.6, + "cpu_max": 0.6, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.13094215393066405, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:40.688379", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.025039911270142, + "points_saved": 20, + "points_rate": 1.9950045263676224, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.13134897947311402, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:15:50.738230", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.04984998703003, + "points_saved": 20, + "points_rate": 1.990079456490522, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.13133739233016967, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:00.764534", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.026304721832275, + "points_saved": 20, + "points_rate": 1.9947528580943692, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1306633472442627, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:10.800041", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.0355064868927, + "points_saved": 20, + "points_rate": 1.9929238276236332, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1321083903312683, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:20.827410", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.027369260787964, + "points_saved": 20, + "points_rate": 1.994541088479709, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1272369384765625, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:30.856779", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.029369354248047, + "points_saved": 20, + "points_rate": 1.9941433298125355, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12487742900848389, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:40.889073", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.03229308128357, + "points_saved": 20, + "points_rate": 1.9935621734688322, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11827741861343384, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:16:50.912203", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.023130655288696, + "points_saved": 20, + "points_rate": 1.995384544792601, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.121684992313385, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:00.942092", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.02988862991333, + "points_saved": 20, + "points_rate": 1.9940400873795967, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11391420364379883, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:10.966678", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024586200714111, + "points_saved": 20, + "points_rate": 1.9950948198315936, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12205606698989868, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:21.001073", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.03439474105835, + "points_saved": 20, + "points_rate": 1.9931446306536826, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.111518394947052, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:31.028200", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.027127027511597, + "points_saved": 20, + "points_rate": 1.994589272193886, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1142659068107605, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:41.050925", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.022725105285645, + "points_saved": 20, + "points_rate": 1.9954652841324243, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1111042857170105, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:17:51.074047", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.023122310638428, + "points_saved": 20, + "points_rate": 1.995386206030054, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1094090223312378, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:01.098587", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024014472961426, + "points_saved": 20, + "points_rate": 1.9952086116742545, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12421658039093017, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:11.142708", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.044646501541138, + "points_saved": 21, + "points_rate": 2.0906659081310623, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12734001023428781, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:21.168004", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025295734405518, + "points_saved": 20, + "points_rate": 1.9949536183119854, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1246566653251648, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:31.194326", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.02632188796997, + "points_saved": 20, + "points_rate": 1.994749442863678, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12500650882720948, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:41.220168", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025842905044556, + "points_saved": 21, + "points_rate": 2.094586978760034, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11667312894548688, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:18:51.242771", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.022602558135986, + "points_saved": 20, + "points_rate": 1.9954896828433772, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11609385013580323, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:01.265983", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.02321195602417, + "points_saved": 20, + "points_rate": 1.9953683597381737, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11355807781219482, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:11.289802", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.023312091827393, + "points_saved": 20, + "points_rate": 1.9953484254278782, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11024303436279297, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:21.313482", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024186849594116, + "points_saved": 20, + "points_rate": 1.9951743019245305, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12200617790222168, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:31.336575", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023092985153198, + "points_saved": 20, + "points_rate": 1.9953920441150441, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1284550905227661, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:41.363611", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.026529550552368, + "points_saved": 20, + "points_rate": 1.994708128985486, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1260589838027954, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:19:51.408597", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.045492172241211, + "points_saved": 20, + "points_rate": 1.990942768863646, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12226033210754395, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:01.431964", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023367643356323, + "points_saved": 20, + "points_rate": 1.9953373668036987, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11697373390197754, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:11.459744", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.027779817581177, + "points_saved": 20, + "points_rate": 1.994459428091456, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11160904169082642, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:20.757069", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491620757_5", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 60, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:20:21.482951", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.02320671081543, + "points_saved": 20, + "points_rate": 1.9953694039273102, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11433277130126954, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:31.506669", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.023717880249023, + "points_saved": 20, + "points_rate": 1.9952676480857952, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12395538091659546, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:41.529992", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023323059082031, + "points_saved": 20, + "points_rate": 1.9953462421704748, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11403264999389648, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:20:51.556223", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02623176574707, + "points_saved": 20, + "points_rate": 1.9947673729552737, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11654514074325562, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:01.580114", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023890256881714, + "points_saved": 20, + "points_rate": 1.9952333363056698, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11188417673110962, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:11.608087", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.027972936630249, + "points_saved": 20, + "points_rate": 1.9944210187229228, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11212437152862549, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:21.632395", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024308204650879, + "points_saved": 20, + "points_rate": 1.9951501481888594, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11920078992843627, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:31.658236", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025840997695923, + "points_saved": 20, + "points_rate": 1.9948451211819813, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1174845576286316, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:41.682578", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.02434253692627, + "points_saved": 20, + "points_rate": 1.9951433150180973, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12145076990127564, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:45.338231", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491705337_6", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:21:46.967849", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491706967_7", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:21:51.707238", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.024659633636475, + "points_saved": 20, + "points_rate": 1.9950802053061767, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12391790151596069, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:21:52.809248", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491712808_8", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:22:01.753297", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 1.4% CPU", + "details": { + "duration": 10.045552015304565, + "points_saved": 20, + "points_rate": 1.9909309084786648, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 1.4, + "cpu_max": 1.4, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12942501306533813, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:22:11.800264", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.6% CPU", + "details": { + "duration": 10.0469651222229, + "points_saved": 20, + "points_rate": 1.9906508837939492, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.6, + "cpu_max": 0.6, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12267584800720215, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:22:13.670422", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491733670_9", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:22:14.746807", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756491734746_10", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:22:21.849553", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.049798011779785, + "points_saved": 20, + "points_rate": 1.9900897487250162, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12533024549484253, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:22:31.894779", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.8% CPU", + "details": { + "duration": 10.045225620269775, + "points_saved": 20, + "points_rate": 1.990995598908497, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.8, + "cpu_max": 0.8, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12868189811706543, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:22:41.920647", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025867462158203, + "points_saved": 20, + "points_rate": 1.994839855552482, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1145666480064392, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:22:51.943768", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.02312159538269, + "points_saved": 20, + "points_rate": 1.9953863484219643, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11289905309677124, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:01.967713", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02342414855957, + "points_saved": 20, + "points_rate": 1.9953261184576456, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1141359567642212, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:12.018142", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 18 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.050949573516846, + "points_saved": 18, + "points_rate": 1.7908755653722543, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 2, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.11745082007514106, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:22.045644", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.026995658874512, + "points_saved": 19, + "points_rate": 1.8948846340811791, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.14868086262753136, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:32.094247", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 18 points saved, 0 lost, 0.8% CPU", + "details": { + "duration": 10.04910945892334, + "points_saved": 18, + "points_rate": 1.7912034965463017, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.8, + "cpu_max": 0.8, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 2, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1138237714767456, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:42.140579", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 1 lost, 0.3% CPU", + "details": { + "duration": 10.045825004577637, + "points_saved": 19, + "points_rate": 1.891332965818354, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 1, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.1388106346130371, + "delay_max": 0.1388106346130371, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.18463990562840513, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:23:52.176967", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.03689455986023, + "points_saved": 19, + "points_rate": 1.893015801519448, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.14855742454528809, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:02.224912", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.047945737838745, + "points_saved": 19, + "points_rate": 1.8909337784786635, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09191154178820159, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:12.261404", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.035982131958008, + "points_saved": 21, + "points_rate": 2.0924708437980177, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09323100816635858, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:22.291216", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02981424331665, + "points_saved": 20, + "points_rate": 1.9940548762732038, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09343442916870118, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:32.340920", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.6% CPU", + "details": { + "duration": 10.050211906433105, + "points_saved": 20, + "points_rate": 1.9900077914972192, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.6, + "cpu_max": 0.6, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09404599666595459, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:42.370686", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.029765844345093, + "points_saved": 20, + "points_rate": 1.9940644986519052, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08996092081069947, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:24:52.397662", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.026976108551025, + "points_saved": 20, + "points_rate": 1.9946192933424824, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09822391271591187, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:02.433966", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.036303997039795, + "points_saved": 20, + "points_rate": 1.9927654648463213, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08953895568847656, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:12.463040", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.029073476791382, + "points_saved": 21, + "points_rate": 2.093912269024333, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09114996592203777, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:22.514891", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.051851272583008, + "points_saved": 20, + "points_rate": 1.9896832392010346, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09506657123565673, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:32.551947", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.037055969238281, + "points_saved": 20, + "points_rate": 1.9926161676587535, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09415082931518555, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:42.578881", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.026934146881104, + "points_saved": 20, + "points_rate": 1.9946276406154555, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09203169345855713, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:25:52.610802", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.031409740447998, + "points_saved": 20, + "points_rate": 1.9937377215644279, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09590002298355102, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:02.658935", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.048643827438354, + "points_saved": 20, + "points_rate": 1.9903183298614824, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.0906724214553833, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:12.683811", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024876356124878, + "points_saved": 20, + "points_rate": 1.9950370747246815, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08518303632736206, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:22.707735", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.023701429367065, + "points_saved": 20, + "points_rate": 1.9952709227157095, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.0864838719367981, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:32.731687", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.024174690246582, + "points_saved": 20, + "points_rate": 1.995176722075663, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08472529649734498, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:42.756850", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.024651527404785, + "points_saved": 20, + "points_rate": 1.9950818185874304, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08764432668685913, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:26:52.780823", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024484395980835, + "points_saved": 20, + "points_rate": 1.995115081232377, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08919469118118287, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:02.805506", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02468228340149, + "points_saved": 20, + "points_rate": 1.995075697622386, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08657046556472778, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:12.833716", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.028210401535034, + "points_saved": 20, + "points_rate": 1.9943737914532156, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1002280592918396, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:22.858109", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02439284324646, + "points_saved": 20, + "points_rate": 1.9951333026093658, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08886433839797973, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:32.882610", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024501085281372, + "points_saved": 20, + "points_rate": 1.9951117596630628, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08420648574829101, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:42.907061", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02445101737976, + "points_saved": 20, + "points_rate": 1.9951217244041854, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08993270397186279, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:27:52.939095", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.031479358673096, + "points_saved": 20, + "points_rate": 1.993723885072668, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09506721496582031, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:02.983513", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.044972896575928, + "points_saved": 19, + "points_rate": 1.8914934062665922, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08608504345542506, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:13.017252", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.033738851547241, + "points_saved": 20, + "points_rate": 1.9932749193403536, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08362761735916138, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:23.042218", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024965763092041, + "points_saved": 20, + "points_rate": 1.9950192821238442, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08343106508255005, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:33.066515", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.02429747581482, + "points_saved": 20, + "points_rate": 1.9951522835643214, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08442392349243164, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:43.092356", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.025840997695923, + "points_saved": 20, + "points_rate": 1.9948451211819813, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08763513565063477, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:28:53.117376", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.025020122528076, + "points_saved": 20, + "points_rate": 1.9950084643776722, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08751732110977173, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:03.142578", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025201797485352, + "points_saved": 19, + "points_rate": 1.8952236956233461, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.094594491155524, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:13.167453", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024874925613403, + "points_saved": 19, + "points_rate": 1.8952854914384307, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.17646600070752597, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:23.192775", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 5.3% CPU", + "details": { + "duration": 10.025321960449219, + "points_saved": 19, + "points_rate": 1.8952009795751876, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 5.3, + "cpu_max": 5.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.12467268893593236, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:33.217793", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.025017499923706, + "points_saved": 19, + "points_rate": 1.895258536969596, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.14907875813935934, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:43.242420", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024627685546875, + "points_saved": 20, + "points_rate": 1.995086563547416, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08596735000610352, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:29:53.266556", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.02413558959961, + "points_saved": 20, + "points_rate": 1.9951845045622385, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08401284217834473, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:03.291404", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.024848461151123, + "points_saved": 19, + "points_rate": 1.895290494777044, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08231273450349506, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:13.317741", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 19 points saved, 0 lost, 0.0% CPU", + "details": { + "duration": 10.025824546813965, + "points_saved": 19, + "points_rate": 1.8951059747038834, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.0, + "cpu_max": 0.0, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 1, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08395503696642424, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:20.574666", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'DAR_Brix' created and started", + "details": { + "session_id": "DAR_1756492220573_11", + "variables": [ + "HMI_Instrument.QTM306.PVFiltered", + "HMI_Instrument.QTM307.PVFiltered", + "HMI_Instrument.CTS306.PVFiltered" + ], + "time_window": 120, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-29T20:30:23.347215", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.029986143112183, + "points_saved": 20, + "points_rate": 1.9940207009891484, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.0898507833480835, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:33.391139", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 8.7% CPU", + "details": { + "duration": 10.043398141860962, + "points_saved": 20, + "points_rate": 1.9913578768365106, + "variables_saved": 1, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 8.7, + "cpu_max": 8.7, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08968406915664673, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:43.444401", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 21 points saved, 0 lost, 1.4% CPU", + "details": { + "duration": 10.05378794670105, + "points_saved": 21, + "points_rate": 2.0887649621544617, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 1.4, + "cpu_max": 1.4, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.09269826752798897, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:30:53.479738", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.2% CPU", + "details": { + "duration": 10.035337209701538, + "points_saved": 20, + "points_rate": 1.9929574444857965, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.2, + "cpu_max": 0.2, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.08999161720275879, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:31:03.510334", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.3% CPU", + "details": { + "duration": 10.030595779418945, + "points_saved": 20, + "points_rate": 1.9938995090437752, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.3, + "cpu_max": 0.3, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.0899770975112915, + "csv_write_time_avg": 0.0 + } + }, + { + "timestamp": "2025-08-29T20:31:13.557479", + "level": "info", + "event_type": "performance_report", + "message": "Performance report: 20 points saved, 0 lost, 0.5% CPU", + "details": { + "duration": 10.047145366668701, + "points_saved": 20, + "points_rate": 1.9906151717830012, + "variables_saved": 7, + "udp_points_sent": 0, + "points_lost": 0, + "cpu_average": 0.5, + "cpu_max": 0.5, + "delay_average": 0.0, + "delay_max": 0.0, + "read_errors": 0, + "csv_errors": 0, + "udp_errors": 0, + "read_time_avg": 0.1509416103363037, + "csv_write_time_avg": 0.0 + } } ], - "last_updated": "2025-08-29T16:11:09.141420", - "total_entries": 877 + "last_updated": "2025-08-29T20:31:13.557479", + "total_entries": 1000 } \ No newline at end of file diff --git a/config/data/plot_definitions.json b/config/data/plot_definitions.json index 8893bce..c500437 100644 --- a/config/data/plot_definitions.json +++ b/config/data/plot_definitions.json @@ -6,9 +6,9 @@ "name": "DAR_Brix", "point_hover_radius": 4, "point_radius": 1, - "stacked": true, + "stacked": false, "stepped": true, - "time_window": 60, + "time_window": 120, "trigger_enabled": false, "trigger_on_true": true }, diff --git a/config/data/plot_variables.json b/config/data/plot_variables.json index 6cf2bef..bed52f7 100644 --- a/config/data/plot_variables.json +++ b/config/data/plot_variables.json @@ -72,7 +72,7 @@ "enabled": true }, { - "variable_name": "Blink", + "variable_name": "HMI_Instrument.CTS306.PVFiltered", "color": "#3498db", "line_width": 2, "y_axis": "left", diff --git a/frontend/src/components/PlotHistoricalSession.jsx b/frontend/src/components/PlotHistoricalSession.jsx index 82f7058..f588f11 100644 --- a/frontend/src/components/PlotHistoricalSession.jsx +++ b/frontend/src/components/PlotHistoricalSession.jsx @@ -91,14 +91,11 @@ export default function PlotHistoricalSession({ // Apply pending changes after cooldown const applyPendingTimeChanges = useCallback(() => { const pending = pendingUpdatesRef.current - console.log('📊 Applying pending time changes:', pending) if (pending.centralTime !== null) { - console.log('📊 Setting central time to:', pending.centralTime) setCentralTime(pending.centralTime) } if (pending.rangeSeconds !== null) { - console.log('📊 Setting time range seconds to:', pending.rangeSeconds) setTimeRangeSeconds(pending.rangeSeconds) } @@ -109,8 +106,6 @@ export default function PlotHistoricalSession({ // Debounced handler for time changes (pan/zoom) const debouncedTimeChange = useCallback((newCentralTime, newRangeSeconds = null) => { - console.log('📊 Debounced time change requested:', { newCentralTime, newRangeSeconds }) - // Update pending values using refs pendingUpdatesRef.current.centralTime = newCentralTime if (newRangeSeconds !== null) { @@ -123,9 +118,7 @@ export default function PlotHistoricalSession({ } // Set new timer - console.log('📊 Setting timer for 1000ms...') cooldownTimerRef.current = setTimeout(() => { - console.log('📊 Timer fired, calling applyPendingTimeChanges') applyPendingTimeChanges() }, 1000) }, [applyPendingTimeChanges]) diff --git a/frontend/src/components/PlotManager.jsx b/frontend/src/components/PlotManager.jsx index a09aca4..9d81b21 100644 --- a/frontend/src/components/PlotManager.jsx +++ b/frontend/src/components/PlotManager.jsx @@ -1147,7 +1147,11 @@ export default function PlotManager() { variable_name: { "ui:widget": "variableSelector", "ui:placeholder": "Search and select variable from datasets...", - "ui:description": "🔍 Search and select a variable from the configured datasets (includes live values and metadata)" + "ui:description": "🔍 Search and select a variable from the configured datasets (includes live values and metadata)", + "ui:options": { + debug: false, // Enable to debug live value issues + refreshTrigger: Date.now() // Force refresh when schema changes + } }, label: { "ui:widget": "text", diff --git a/frontend/src/components/PlotRealtimeSession.jsx b/frontend/src/components/PlotRealtimeSession.jsx index 3ad8855..da52c0d 100644 --- a/frontend/src/components/PlotRealtimeSession.jsx +++ b/frontend/src/components/PlotRealtimeSession.jsx @@ -339,30 +339,20 @@ export default function PlotRealtimeSession({ const wasPaused = session.is_paused try { - console.log(`🔄 Applying configuration changes for plot ${plotDefinition.id}...`) - console.log(`📊 Plot was active: ${wasActive}, paused: ${wasPaused}`) - console.log(`📋 Local config to apply:`, localConfig) - // First, update backend configuration and wait for it to complete - console.log(`💾 Saving configuration to backend...`) await onConfigUpdate?.(plotDefinition.id, localConfig) - console.log(`✅ Configuration saved to backend successfully`) // Wait a moment for the configuration to be fully persisted await new Promise(resolve => setTimeout(resolve, 200)) // Then reload configuration from backend (same as Refresh button) if (onReloadConfig) { - console.log(`📥 Reloading plot configuration from backend...`) await onReloadConfig() - console.log(`✅ Configuration reloaded from backend`) } // Finally refresh the chart configuration (same as Refresh button) if (chartControlsRef.current?.refreshConfiguration) { - console.log(`🔄 Refreshing chart configuration...`) await chartControlsRef.current.refreshConfiguration() - console.log(`✅ Chart configuration refreshed successfully`) } else { console.warn(`⚠️ chartControlsRef.current.refreshConfiguration not available`) } @@ -372,7 +362,6 @@ export default function PlotRealtimeSession({ // If the plot was active before, restart it if (wasActive && !wasPaused) { - console.log(`🔄 Restarting plot session that was active before Apply...`) await handleControlClick('start') } @@ -426,13 +415,9 @@ export default function PlotRealtimeSession({ const wasPaused = session.is_paused try { - console.log(`🔄 Refreshing configuration for plot ${plotDefinition.id}...`) - // First, reload configuration from backend if the function is available if (onReloadConfig) { - console.log(`📥 Reloading plot configuration from backend...`) await onReloadConfig() - console.log(`✅ Configuration reloaded from backend`) } // Trigger chart configuration refresh if available @@ -445,7 +430,6 @@ export default function PlotRealtimeSession({ // If the plot was active before refresh, try to restart it if (wasActive && !wasPaused) { - console.log(`🔄 Plot was active before refresh, attempting to restart...`) try { // Wait a bit to ensure the session status has been updated await new Promise(resolve => setTimeout(resolve, 500)) diff --git a/frontend/src/components/TimePointSelector.jsx b/frontend/src/components/TimePointSelector.jsx index 181b124..d921e26 100644 --- a/frontend/src/components/TimePointSelector.jsx +++ b/frontend/src/components/TimePointSelector.jsx @@ -116,7 +116,6 @@ export default function TimePointSelector({ // Establecer nuevo timer cooldownRef.current = setTimeout(() => { if (onTimeChange && lastCallbackValueRef.current) { - console.log('📊 TimeSelector: Calling onChange after cooldown', lastCallbackValueRef.current); onTimeChange(lastCallbackValueRef.current); } cooldownRef.current = null; @@ -142,7 +141,6 @@ export default function TimePointSelector({ setHasPendingChanges(false); if (onTimeChange) { - console.log('📊 TimeSelector: Applying changes', { time: newValue, range: tempRangeSeconds }); onTimeChange(newValue, tempRangeSeconds); } }, [sliderValue, tempRangeSeconds, hasPendingChanges, onTimeChange]); @@ -158,7 +156,6 @@ export default function TimePointSelector({ // DatePicker es cambio directo - usar range actual if (onTimeChange) { - console.log('📊 TimeSelector: DatePicker change (immediate)', newValue); onTimeChange(newValue, rangeSeconds); } }; diff --git a/frontend/src/components/rjsf/VariableSelectorWidget.jsx b/frontend/src/components/rjsf/VariableSelectorWidget.jsx index a2007de..ec193b1 100644 --- a/frontend/src/components/rjsf/VariableSelectorWidget.jsx +++ b/frontend/src/components/rjsf/VariableSelectorWidget.jsx @@ -12,17 +12,14 @@ import { useCoordinatedSSE } from '../../hooks/useCoordinatedConnection' export function VariableSelectorWidget(props) { const { id, value, required, disabled, readonly, label, onChange, onBlur, onFocus, rawErrors = [], options = {} } = props - // Extract refresh trigger from options if provided + // Extract options at the top to maintain hook order const refreshTrigger = options?.refreshTrigger || 0 + const debugMode = options?.debug || false // Use variable context if available, fallback to local state - let contextTrigger = 0 - try { - const variableContext = useVariableContext() - contextTrigger = variableContext?.variableRefreshTrigger || 0 - } catch { - // Context not available, use local trigger only - } + // Always call useVariableContext to maintain hook order + const variableContext = useVariableContext() + const contextTrigger = variableContext?.variableRefreshTrigger || 0 const [datasetVariables, setDatasetVariables] = useState({}) const [loading, setLoading] = useState(true) @@ -86,7 +83,12 @@ export function VariableSelectorWidget(props) { // Load dataset variables on mount and when refresh trigger changes useEffect(() => { - loadDatasetVariables() + // Small delay to ensure context is properly initialized + const timer = setTimeout(() => { + loadDatasetVariables() + }, 100) + + return () => clearTimeout(timer) }, [loadDatasetVariables, refreshTrigger, contextTrigger]) // Auto-refresh when component gains focus (optional behavior) @@ -128,22 +130,57 @@ export function VariableSelectorWidget(props) { }, [datasetVariables]) // Determinar dataset y variable para SSE coordinado - const variable = value && allVariables.find(v => v.name === value) + const variable = useMemo(() => { + if (!value || !allVariables.length) return null + return allVariables.find(v => v.name === value) + }, [value, allVariables]) + const datasetId = variable?.dataset // Usar SSE coordinado para valor en vivo de la variable seleccionada - const sseUrl = datasetId && value ? - `/api/stream/variables?dataset_id=${encodeURIComponent(datasetId)}&interval=1.0` : - null + const sseUrl = useMemo(() => { + if (!datasetId || !value || !variable) return null + return `/api/stream/variables?dataset_id=${encodeURIComponent(datasetId)}&interval=1.0` + }, [datasetId, value, variable]) - const { data: liveData } = useCoordinatedSSE( - `variable_live_${datasetId}_${value}`, + const { data: liveData, isConnected: sseConnected } = useCoordinatedSSE( + value && datasetId ? `variable_live_${datasetId}_${value}` : null, sseUrl, - [datasetId, value] + [datasetId || '', value || '', (variable?.name || '')] ) - // Procesar datos SSE recibidos + // Debug logging for SSE connection useEffect(() => { + if (debugMode) { + console.log(`🔍 VariableSelectorWidget Debug:`, { + value, + datasetId, + variable, + sseUrl, + liveStatus, + liveValue, + liveDataType: liveData?.type, + sseConnected, + timestamp: new Date().toLocaleTimeString() + }) + } + }, [value, datasetId, variable, sseUrl, liveStatus, liveValue, liveData, sseConnected, debugMode]) + + // Procesar datos SSE recibidos y estado de conexión + useEffect(() => { + if (!value || !datasetId) { + setLiveValue(undefined) + setLiveStatus('idle') + return + } + + // Si no hay conexión SSE, mostrar estado de desconexión + if (!sseConnected) { + setLiveStatus('disconnected') + // No limpiar liveValue inmediatamente para mostrar último valor conocido + return + } + if (!liveData) { setLiveValue(undefined) setLiveStatus('idle') @@ -151,17 +188,26 @@ export function VariableSelectorWidget(props) { } if (liveData?.type === 'values' && liveData.values) { - setLiveValue(liveData.values[value]) + const currentValue = liveData.values[value] + setLiveValue(currentValue) setLiveStatus('ok') + } else if (liveData?.type === 'ping') { + // Ignore ping messages, they're just for keeping connection alive + return } else if (liveData?.type === 'no_cache') { setLiveStatus('waiting') + setLiveValue(undefined) } else if (liveData?.type === 'plc_disconnected' || liveData?.type === 'dataset_inactive') { setLiveValue(undefined) setLiveStatus('offline') } else if (liveData?.type === 'connected') { setLiveStatus('connecting') + setLiveValue(undefined) + } else if (liveData?.type === 'cache_error') { + setLiveStatus('error') + setLiveValue(undefined) } - }, [liveData, value]) + }, [liveData, value, datasetId, sseConnected]) // Filter variables based on search term and selected dataset const filteredVariables = useMemo(() => { @@ -348,9 +394,33 @@ export function VariableSelectorWidget(props) { {selectedVariable.streaming ? ' • Real-time streaming enabled' : ' • Static logging only'} - Live value: {liveStatus === 'ok' && liveValue !== undefined ? ( - {String(liveValue)} - ) : liveStatus === 'waiting' ? 'waiting…' : liveStatus === 'offline' ? 'offline' : liveStatus === 'error' ? 'error' : '—'} + Live value: {(() => { + if (!value || !datasetId) { + return select variable + } + + switch (liveStatus) { + case 'ok': + return liveValue !== undefined ? ( + {String(liveValue)} + ) : ( + no data + ) + case 'waiting': + return waiting for cache... + case 'offline': + return PLC offline + case 'connecting': + return connecting... + case 'disconnected': + return reconnecting... + case 'error': + return cache error + case 'idle': + default: + return + } + })()} diff --git a/frontend/src/components/ui/tooltip.jsx b/frontend/src/components/ui/tooltip.jsx index d7a56ae..fd37df1 100644 --- a/frontend/src/components/ui/tooltip.jsx +++ b/frontend/src/components/ui/tooltip.jsx @@ -9,9 +9,6 @@ export const Tooltip = React.forwardRef(function Tooltip(props, ref) { ...rest } = props - // Debug logging - console.log('Tooltip render:', { label, disabled, hasChildren: !!children }) - if (disabled || !label) return children return ( diff --git a/frontend/src/components/widgets/AllWidgets.jsx b/frontend/src/components/widgets/AllWidgets.jsx index cc5edba..71bcf81 100644 --- a/frontend/src/components/widgets/AllWidgets.jsx +++ b/frontend/src/components/widgets/AllWidgets.jsx @@ -86,13 +86,6 @@ export const allWidgets = { TestWidget: TestWidget, } -// Debug log to verify widget registration -console.log('🎯 Widget Registry:', { - hasPlcVariableObject: !!allWidgets.plcVariableObject, - hasPlcVariableObjectDash: !!allWidgets['plc-variable-object'], - totalWidgets: Object.keys(allWidgets).length -}) - // Export both widgets and fields (fields can handle complete objects) export const allFields = { 'test-widget': TestWidget, diff --git a/frontend/src/components/widgets/PlcVariableObjectWidget.jsx b/frontend/src/components/widgets/PlcVariableObjectWidget.jsx index d46291f..2d2330d 100644 --- a/frontend/src/components/widgets/PlcVariableObjectWidget.jsx +++ b/frontend/src/components/widgets/PlcVariableObjectWidget.jsx @@ -62,16 +62,6 @@ const PlcVariableObjectWidget = (props) => { ...otherProps } = props - // Log all props received when used as a field - console.log('🔧 PlcVariableObjectWidget PROPS:', { - id, - value, - hasOnChange: !!onChange, - schema: schema?.title || schema?.type, - uiSchema: Object.keys(uiSchema || {}), - allPropsKeys: Object.keys(props), - otherProps: Object.keys(otherProps) - }) // Parse value - handle both object and string cases let parsedValue = value if (typeof value === 'string') { @@ -88,21 +78,6 @@ const PlcVariableObjectWidget = (props) => { parsedValue = {} } - // Debug log to understand how data is being passed - console.log('🔧 PlcVariableObjectWidget DEBUG:', { - id, - rawValue: value, - rawValueJSON: JSON.stringify(value, null, 2), - valueType: typeof value, - valueIsEmpty: !value || value === '{}', - parsedValue, - parsedValueJSON: JSON.stringify(parsedValue, null, 2), - parsedValueKeys: parsedValue ? Object.keys(parsedValue) : [], - schema: schema?.title, - formContext, - registry: !!registry - }) - // Initialize state from parsed value object const name = parsedValue?.name || '' const address = parsedValue?.address || '' @@ -434,16 +409,6 @@ const PlcVariableObjectWidget = (props) => { const status = getValidationStatus() const showValidateButton = address.trim() || symbol.trim() - console.log('🔧 Current state values:', { - name: `"${name}"`, - address: `"${address}"`, - symbol: `"${symbol}"`, - format: `"${format}"`, - showValidateButton, - hasValue: !!value, - valueType: typeof value - }) - return ( {/* Variable Name Field */} diff --git a/frontend/src/components/widgets/TestWidget.jsx b/frontend/src/components/widgets/TestWidget.jsx index 3298dcf..d07a9f9 100644 --- a/frontend/src/components/widgets/TestWidget.jsx +++ b/frontend/src/components/widgets/TestWidget.jsx @@ -4,8 +4,6 @@ import React from 'react' * Simple Test Widget para verificar que el sistema de widgets funciona */ const TestWidget = (props) => { - console.log('🧪 TestWidget loaded!', props) - return (
{} + } } return context } diff --git a/frontend/src/hooks/useCoordinatedConnection.js b/frontend/src/hooks/useCoordinatedConnection.js index fcbfaf8..f0bd9f2 100644 --- a/frontend/src/hooks/useCoordinatedConnection.js +++ b/frontend/src/hooks/useCoordinatedConnection.js @@ -13,6 +13,9 @@ export function useCoordinatedConnection(source, connectionFactory, dependencies const coordinatorRef = useRef(null) const subscriptionRef = useRef(null) + // Ensure dependencies is always an array to prevent undefined issues + const safeDependencies = Array.isArray(dependencies) ? dependencies : [] + // Obtener el coordinador useEffect(() => { coordinatorRef.current = getTabCoordinator() @@ -30,7 +33,7 @@ export function useCoordinatedConnection(source, connectionFactory, dependencies // Crear/recrear conexión cuando cambia el liderazgo o dependencias useEffect(() => { - if (!coordinatorRef.current) return + if (!coordinatorRef.current || source === 'null_source') return // Limpiar conexión anterior if (connectionRef.current && typeof connectionRef.current.close === 'function') { @@ -83,7 +86,7 @@ export function useCoordinatedConnection(source, connectionFactory, dependencies subscriptionRef.current() } } - }, [source, isLeader, ...dependencies]) + }, [source, isLeader, ...safeDependencies]) // Cleanup final useEffect(() => { @@ -106,6 +109,9 @@ export function useCoordinatedConnection(source, connectionFactory, dependencies export function useCoordinatedPolling(source, fetchFunction, interval = 5000, dependencies = []) { const [connectionError, setConnectionError] = useState(null) + // Ensure dependencies is always an array + const safeDependencies = Array.isArray(dependencies) ? dependencies : [] + const result = useCoordinatedConnection( source, useCallback((onData) => { @@ -169,45 +175,114 @@ export function useCoordinatedPolling(source, fetchFunction, interval = 5000, de } } }, [fetchFunction, interval]), - dependencies + safeDependencies ) return { ...result, connectionError } } /** - * Hook para SSE coordinado + * Hook para SSE coordinado con reconexión automática */ export function useCoordinatedSSE(source, url, dependencies = []) { - return useCoordinatedConnection( - source, + // Ensure dependencies is always an array + const safeDependencies = Array.isArray(dependencies) ? dependencies : [] + + // Always call useCoordinatedConnection to maintain hook order + const result = useCoordinatedConnection( + source || 'null_source', // Use a placeholder when source is null useCallback((onData) => { // Don't create EventSource if URL is null or undefined - if (!url) { - // console.log(`Skipping SSE connection - URL is ${url}`) + if (!url || !source) { + // console.log(`Skipping SSE connection - URL is ${url}, source is ${source}`) return { close: () => {} // Return mock connection with close method } } - // console.log(`Creating SSE connection to ${url}`) - const eventSource = new EventSource(url) + let eventSource = null + let isActive = true + let reconnectAttempts = 0 + const maxReconnectAttempts = 10 + const baseReconnectDelay = 1000 // 1 second - eventSource.onmessage = (event) => { + const createConnection = () => { + if (!isActive) return + try { - const data = JSON.parse(event.data) - onData(data) + // console.log(`Creating SSE connection to ${url} (attempt ${reconnectAttempts + 1})`) + eventSource = new EventSource(url) + + eventSource.onopen = () => { + // console.log(`SSE connection opened for ${source}`) + reconnectAttempts = 0 // Reset attempts on successful connection + } + + eventSource.onmessage = (event) => { + try { + const data = JSON.parse(event.data) + onData(data) + } catch (error) { + console.error('SSE data parse error:', error) + } + } + + eventSource.onerror = (error) => { + console.warn(`SSE connection error for ${source}:`, error) + + if (eventSource.readyState === EventSource.CLOSED) { + // Connection is closed, attempt to reconnect + if (isActive && reconnectAttempts < maxReconnectAttempts) { + reconnectAttempts++ + const delay = Math.min(baseReconnectDelay * Math.pow(2, reconnectAttempts - 1), 30000) + console.log(`Reconnecting SSE in ${delay}ms (attempt ${reconnectAttempts}/${maxReconnectAttempts})`) + + setTimeout(() => { + if (isActive) { + createConnection() + } + }, delay) + } else { + console.error(`Max reconnection attempts reached for ${source}`) + } + } + } } catch (error) { - console.error('SSE data parse error:', error) + console.error(`Failed to create SSE connection for ${source}:`, error) + + // Retry with exponential backoff + if (isActive && reconnectAttempts < maxReconnectAttempts) { + reconnectAttempts++ + const delay = Math.min(baseReconnectDelay * Math.pow(2, reconnectAttempts - 1), 30000) + setTimeout(() => { + if (isActive) { + createConnection() + } + }, delay) + } } } + + // Create initial connection + createConnection() - eventSource.onerror = (error) => { - console.error('SSE error:', error) + return { + close: () => { + isActive = false + if (eventSource) { + eventSource.close() + eventSource = null + } + } } - - return eventSource - }, [url]), - dependencies + }, [url, source]), + safeDependencies ) + + // If source is null or undefined, return null data but maintain hook call consistency + if (!source) { + return { data: null, isLeader: false, isConnected: false } + } + + return result } diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx index e63245f..d82648c 100644 --- a/frontend/src/pages/Dashboard.jsx +++ b/frontend/src/pages/Dashboard.jsx @@ -1320,9 +1320,6 @@ function DatasetManager() { api.getSchema('dataset-variables') ]) - console.log('🔧 Dashboard loaded datasets data:', JSON.stringify(datasetsData, null, 2)) - console.log('🔧 Dashboard loaded variables data:', JSON.stringify(variablesData, null, 2)) - setDatasetsConfig(datasetsData) setVariablesConfig(variablesData) setDatasetsSchemaData(datasetsSchemaResponse) @@ -1414,7 +1411,6 @@ function DatasetManager() { // Get filtered variables for selected dataset (memoized) const selectedDatasetVariables = useMemo(() => { - console.log('🔧 Recalculating selected dataset variables...') if (!variablesConfig?.variables || !selectedDatasetId) { return { dataset_id: selectedDatasetId, variables: [] } } @@ -1494,7 +1490,6 @@ function DatasetManager() { onChange={(e) => { const newDatasetId = e.target.value setSelectedDatasetId(newDatasetId) - // console.log(`🎯 Dataset selection changed to: ${newDatasetId}`) }} placeholder="Choose a dataset to configure..." size="lg" @@ -1555,14 +1550,6 @@ function DatasetManager() { {(() => { const selectedDatasetVars = selectedDatasetVariables - // Debug log to understand what data we're working with - console.log('🔧 Form rendering with data:', { - selectedDatasetId, - selectedDatasetVars, - variablesArray: selectedDatasetVars?.variables, - variablesCount: selectedDatasetVars?.variables?.length || 0 - }) - // Create simplified schema from external schema for single dataset variables let singleDatasetSchema = null let singleDatasetUiSchema = null @@ -1573,13 +1560,6 @@ function DatasetManager() { const datasetItemSchema = variablesSchemaData.schema.properties?.variables?.items const variablesArraySchema = datasetItemSchema?.properties?.variables - console.log('🔧 Schema extraction:', { - datasetItemSchema: !!datasetItemSchema, - variablesArraySchema: !!variablesArraySchema, - variablesArraySchemaKeys: variablesArraySchema ? Object.keys(variablesArraySchema) : null, - itemsSchema: variablesArraySchema?.items - }) - if (variablesArraySchema) { singleDatasetSchema = { type: "object", @@ -1600,13 +1580,6 @@ function DatasetManager() { const datasetItemUiSchema = variablesSchemaData.uiSchema.variables?.items const variablesUiSchema = datasetItemUiSchema?.variables - console.log('🔧 UI Schema extraction:', { - datasetItemUiSchema: !!datasetItemUiSchema, - variablesUiSchema: !!variablesUiSchema, - variablesUiSchemaKeys: variablesUiSchema ? Object.keys(variablesUiSchema) : null, - itemsUiField: variablesUiSchema?.items?.['ui:field'] - }) - if (variablesUiSchema) { singleDatasetUiSchema = { variables: variablesUiSchema @@ -1635,22 +1608,6 @@ function DatasetManager() { variables: selectedDatasetVars.variables || [] } - console.log('🔧 Passing formData to Form:', { - formDataToPass, - variablesLength: formDataToPass.variables.length, - firstVariable: formDataToPass.variables[0] || 'no variables', - allVariables: formDataToPass.variables, - formDataJSON: JSON.stringify(formDataToPass, null, 2) - }) - - console.log('🔧 Final schemas for Form:', { - singleDatasetSchema, - singleDatasetUiSchema, - schemaVariablesType: singleDatasetSchema?.properties?.variables?.type, - schemaVariablesItemsProps: singleDatasetSchema?.properties?.variables?.items ? Object.keys(singleDatasetSchema.properties.variables.items.properties || {}) : null, - uiSchemaVariablesItemsField: singleDatasetUiSchema?.variables?.items?.['ui:field'] - }) - return (
= ping_interval: + yield f"data: {json.dumps({'type': 'ping', 'timestamp': datetime.now().isoformat()})}\n\n" + last_ping_time = current_time + # Check basic preconditions for cache availability if not streamer.plc_client.is_connected(): # PLC not connected - cache won't be populated @@ -3277,6 +3286,7 @@ def stream_variables(): "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Cache-Control", + "X-Accel-Buffering": "no", # Disable nginx buffering }, ) diff --git a/system_state.json b/system_state.json index cc22973..c0ed6af 100644 --- a/system_state.json +++ b/system_state.json @@ -1,10 +1,13 @@ { "last_state": { - "should_connect": false, + "should_connect": true, "should_stream": false, - "active_datasets": [] + "active_datasets": [ + "DAR", + "Test" + ] }, "auto_recovery_enabled": true, - "last_update": "2025-08-29T12:20:04.122435", + "last_update": "2025-08-29T20:13:41.644405", "plotjuggler_path": "C:\\Program Files\\PlotJuggler\\plotjuggler.exe" } \ No newline at end of file