diff --git a/application_events.json b/application_events.json index 587a353..234c0d3 100644 --- a/application_events.json +++ b/application_events.json @@ -4584,8 +4584,163 @@ "trigger_variable": null, "auto_started": true } + }, + { + "timestamp": "2025-07-28T11:17:42.259176", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-07-28T11:17:42.298212", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "dar", + "variables_count": 6, + "streaming_count": 4, + "prefix": "dar" + } + }, + { + "timestamp": "2025-07-28T11:17:42.303189", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 2 + } + }, + { + "timestamp": "2025-07-28T11:17:57.447529", + "level": "info", + "event_type": "csv_recording_stopped", + "message": "CSV recording stopped (dataset threads continue for UDP streaming)", + "details": {} + }, + { + "timestamp": "2025-07-28T11:17:57.454697", + "level": "info", + "event_type": "udp_streaming_stopped", + "message": "UDP streaming to PlotJuggler stopped (CSV recording continues)", + "details": {} + }, + { + "timestamp": "2025-07-28T11:17:57.540554", + "level": "info", + "event_type": "dataset_deactivated", + "message": "Dataset deactivated: DAR", + "details": { + "dataset_id": "dar" + } + }, + { + "timestamp": "2025-07-28T11:17:57.548515", + "level": "info", + "event_type": "plc_disconnection", + "message": "Disconnected from PLC 10.1.33.11 (stopped recording and streaming)", + "details": {} + }, + { + "timestamp": "2025-07-28T11:18:01.820757", + "level": "error", + "event_type": "udp_streaming_error", + "message": "Cannot start UDP streaming: PLC not connected", + "details": {} + }, + { + "timestamp": "2025-07-28T11:18:07.200757", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "dar", + "variables_count": 6, + "streaming_count": 4, + "prefix": "dar" + } + }, + { + "timestamp": "2025-07-28T11:18:07.212573", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 2 + } + }, + { + "timestamp": "2025-07-28T11:18:07.224850", + "level": "info", + "event_type": "plc_connection", + "message": "Successfully connected to PLC 10.1.33.11 and auto-started CSV recording for 1 datasets", + "details": { + "ip": "10.1.33.11", + "rack": 0, + "slot": 2, + "auto_started_recording": true, + "recording_datasets": 1, + "dataset_names": [ + "DAR" + ] + } + }, + { + "timestamp": "2025-07-28T11:18:46.822611", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 1 + } + }, + { + "timestamp": "2025-08-03T10:18:29.942128", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-03T10:18:30.069067", + "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-03T10:18:30.076657", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 2 + } + }, + { + "timestamp": "2025-08-03T10:18:30.085275", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 1 + } } ], - "last_updated": "2025-07-21T18:38:00.731968", - "total_entries": 436 + "last_updated": "2025-08-03T10:18:30.085275", + "total_entries": 452 } \ No newline at end of file diff --git a/plc_config.json b/plc_config.json index 8213e32..a695352 100644 --- a/plc_config.json +++ b/plc_config.json @@ -16,6 +16,6 @@ "max_days": 30, "max_hours": null, "cleanup_interval_hours": 24, - "last_cleanup": "2025-07-20T23:49:17.540633" + "last_cleanup": "2025-08-03T10:18:30.271685" } } \ No newline at end of file diff --git a/plc_datasets.json b/plc_datasets.json index 239ce3e..0f43c04 100644 --- a/plc_datasets.json +++ b/plc_datasets.json @@ -70,5 +70,5 @@ ], "current_dataset_id": "dar", "version": "1.0", - "last_update": "2025-07-21T18:34:08.728102" + "last_update": "2025-08-03T10:18:30.067100" } \ No newline at end of file diff --git a/static/js/debug-streaming.js b/static/js/debug-streaming.js deleted file mode 100644 index e44e20a..0000000 --- a/static/js/debug-streaming.js +++ /dev/null @@ -1,387 +0,0 @@ -/** - * 🔧 Script de Diagnóstico Detallado para Chart.js Streaming - * Ejecutar en consola del navegador para identificar el problema exacto - */ - -// Función principal de diagnóstico -window.diagnoseStreamingIssue = async function () { - console.log('🔧 DIAGNÓSTICO DETALLADO DE STREAMING'); - console.log('='.repeat(60)); - - const results = { - librariesLoaded: false, - plotManagerReady: false, - sessionExists: false, - backendData: null, - chartConfig: null, - streamingWorking: false, - errors: [] - }; - - try { - // 1. Verificar librerías básicas - console.log('\n1️⃣ VERIFICANDO LIBRERÍAS...'); - results.librariesLoaded = { - chartjs: typeof Chart !== 'undefined', - chartStreaming: typeof window.ChartStreaming !== 'undefined', - plotManager: typeof plotManager !== 'undefined' - }; - - console.log('Chart.js:', results.librariesLoaded.chartjs ? '✅' : '❌'); - console.log('ChartStreaming:', results.librariesLoaded.chartStreaming ? '✅' : '❌'); - console.log('PlotManager:', results.librariesLoaded.plotManager ? '✅' : '❌'); - - if (!results.librariesLoaded.chartStreaming) { - results.errors.push('ChartStreaming plugin no está cargado'); - console.error('❌ ChartStreaming plugin no está disponible'); - return results; - } - - // 2. Verificar PlotManager - console.log('\n2️⃣ VERIFICANDO PLOT MANAGER...'); - const pm = window.plotManager || plotManager; - if (pm && pm.sessions) { - results.plotManagerReady = true; - console.log('✅ PlotManager inicializado'); - console.log('📊 Sesiones activas:', pm.sessions.size); - - if (pm.sessions.size === 0) { - console.log('⚠️ No hay sesiones de plot activas'); - console.log('💡 Crea un nuevo plot para continuar el diagnóstico'); - return results; - } - } else { - results.errors.push('PlotManager no está inicializado'); - console.error('❌ PlotManager no está disponible'); - console.log('💡 Tip: Espera unos segundos e intenta de nuevo, plotManager podría estar inicializándose'); - return results; - } - - // 3. Verificar sesión específica - console.log('\n3️⃣ ANALIZANDO SESIÓN DE PLOT...'); - const sessionId = Array.from(pm.sessions.keys())[0]; - const sessionData = pm.sessions.get(sessionId); - - if (sessionData) { - results.sessionExists = true; - console.log(`📈 Sesión encontrada: ${sessionId}`); - - // Verificar configuración del chart - results.chartConfig = { - hasChart: !!sessionData.chart, - chartType: sessionData.chart?.config?.type, - scaleType: sessionData.chart?.scales?.x?.type, - scaleConstructor: sessionData.chart?.scales?.x?.constructor?.name, - streamingEnabled: !!sessionData.chart?.$streaming?.enabled, - datasets: sessionData.chart?.data?.datasets?.length || 0, - dataPoints: sessionData.chart?.data?.datasets?.reduce((total, d) => total + (d.data?.length || 0), 0) || 0 - }; - - console.log('Chart Config:', results.chartConfig); - - // Verificar si la escala es realtime - if (results.chartConfig.scaleType !== 'realtime') { - results.errors.push('La escala X no es de tipo realtime'); - console.error('❌ Escala X no es realtime:', results.chartConfig.scaleType); - } else { - console.log('✅ Escala realtime configurada correctamente'); - } - - // Verificar streaming - if (!results.chartConfig.streamingEnabled) { - results.errors.push('Streaming no está habilitado en el chart'); - console.error('❌ Streaming no está habilitado'); - } else { - console.log('✅ Streaming habilitado en el chart'); - } - } - - // 4. Verificar datos del backend - console.log('\n4️⃣ VERIFICANDO DATOS DEL BACKEND...'); - try { - const response = await fetch(`/api/plots/${sessionId}/data`); - results.backendData = await response.json(); - - console.log('📊 Respuesta del backend:', { - success: !!results.backendData.datasets, - datasets: results.backendData.datasets?.length || 0, - totalPoints: results.backendData.data_points_count || 0, - isActive: results.backendData.is_active, - isPaused: results.backendData.is_paused - }); - - if (results.backendData.datasets && results.backendData.datasets.length > 0) { - console.log('✅ Backend devuelve datos'); - - // Verificar estructura de datos - const firstDataset = results.backendData.datasets[0]; - console.log('📈 Primer dataset:', { - label: firstDataset.label, - dataPoints: firstDataset.data?.length || 0, - samplePoint: firstDataset.data?.[0] - }); - - if (firstDataset.data && firstDataset.data.length > 0) { - console.log('✅ Dataset tiene puntos de datos'); - - // Verificar formato de timestamps - const firstPoint = firstDataset.data[0]; - const currentTime = Date.now(); - const timeDiff = Math.abs(currentTime - firstPoint.x); - - console.log('⏰ Análisis de timestamps:', { - firstPointTime: firstPoint.x, - currentTime: currentTime, - differenceMs: timeDiff, - differenceSec: Math.round(timeDiff / 1000), - isRecent: timeDiff < 300000 // 5 minutos - }); - - if (timeDiff > 300000) { - results.errors.push('Los timestamps de los datos son muy antiguos'); - console.warn('⚠️ Los datos parecen ser muy antiguos'); - } - } else { - results.errors.push('El dataset no tiene puntos de datos'); - console.error('❌ El dataset está vacío'); - } - } else { - results.errors.push('Backend no devuelve datasets'); - console.error('❌ Backend no devuelve datos válidos'); - } - } catch (error) { - results.errors.push(`Error al obtener datos del backend: ${error.message}`); - console.error('❌ Error del backend:', error); - } - - // 5. Test de funcionalidad streaming - console.log('\n5️⃣ PROBANDO FUNCIONALIDAD STREAMING...'); - if (sessionData && sessionData.chart && results.backendData) { - try { - // Intentar agregar un punto de prueba - const testResult = window.ChartStreaming.addStreamingData(sessionData.chart, 0, { - x: Date.now(), - y: Math.random() * 100 - }); - - console.log('🧪 Test de addStreamingData:', testResult ? '✅' : '❌'); - - if (testResult) { - // Verificar si el punto se agregó - const currentDataPoints = sessionData.chart.data.datasets[0]?.data?.length || 0; - console.log('📊 Puntos después del test:', currentDataPoints); - results.streamingWorking = currentDataPoints > 0; - } else { - results.errors.push('addStreamingData falló'); - } - } catch (error) { - results.errors.push(`Error en test de streaming: ${error.message}`); - console.error('❌ Error en test de streaming:', error); - } - } - - // 6. Resumen final - console.log('\n6️⃣ RESUMEN DEL DIAGNÓSTICO'); - console.log('='.repeat(40)); - - if (results.errors.length === 0) { - console.log('🎉 No se encontraron errores graves'); - if (!results.streamingWorking) { - console.log('⚠️ Sin embargo, el streaming no parece estar funcionando'); - console.log('💡 Intenta: forceStreamingUpdate()'); - } - } else { - console.log('❌ Errores encontrados:'); - results.errors.forEach((error, index) => { - console.log(` ${index + 1}. ${error}`); - }); - } - - // 7. Recomendaciones - console.log('\n7️⃣ PRÓXIMOS PASOS RECOMENDADOS:'); - - if (!results.librariesLoaded.chartStreaming) { - console.log('🔧 1. Recargar la página para asegurar que el plugin se carga'); - } - - if (results.errors.some(e => e.includes('timestamp'))) { - console.log('🔧 2. Ejecutar clearStreamingData() y reiniciar el plot'); - } - - if (results.backendData && !results.streamingWorking) { - console.log('🔧 3. Ejecutar enablePlotDebug() y forceStreamingUpdate()'); - } - - console.log('🔧 4. Si persiste: plotManager.controlPlot("' + sessionId + '", "stop") y luego "start"'); - - return results; - - } catch (error) { - console.error('💥 Error durante el diagnóstico:', error); - results.errors.push(`Error fatal: ${error.message}`); - return results; - } -}; - -// Función para limpiar y reiniciar streaming -window.resetStreaming = function (sessionId = null) { - console.log('🔄 REINICIANDO STREAMING...'); - - const pm = window.plotManager || plotManager; - if (!pm || !pm.sessions) { - console.error('❌ PlotManager no disponible'); - return false; - } - - const targetSessionId = sessionId || Array.from(pm.sessions.keys())[0]; - - if (!targetSessionId) { - console.error('❌ No hay sesiones disponibles'); - return false; - } - - console.log(`🔄 Reiniciando sesión: ${targetSessionId}`); - - try { - // 1. Limpiar datos existentes - if (pm.clearStreamingData) { - pm.clearStreamingData(targetSessionId); - console.log('✅ Datos de streaming limpiados'); - } - - // 2. Pausar y reiniciar - pm.controlPlot(targetSessionId, 'stop'); - console.log('⏹️ Plot detenido'); - - setTimeout(() => { - pm.controlPlot(targetSessionId, 'start'); - console.log('▶️ Plot reiniciado'); - - // 3. Forzar actualización después de un momento - setTimeout(() => { - if (pm.refreshStreamingData) { - const sessionData = pm.sessions.get(targetSessionId); - if (sessionData?.chart) { - pm.refreshStreamingData(targetSessionId, sessionData.chart); - console.log('🔄 Actualización forzada'); - } - } - }, 1000); - }, 500); - - return true; - } catch (error) { - console.error('❌ Error al reiniciar streaming:', error); - return false; - } -}; - -// Función de test rápido -window.quickStreamingTest = function () { - console.log('⚡ TEST RÁPIDO DE STREAMING'); - console.log('-'.repeat(30)); - - const pm = window.plotManager || plotManager; - const checks = { - plotManager: !!pm, - sessions: pm?.sessions?.size || 0, - chartStreaming: !!window.ChartStreaming - }; - - Object.entries(checks).forEach(([key, value]) => { - console.log(`${key}: ${value ? '✅' : '❌'} ${value}`); - }); - - if (checks.sessions > 0) { - const sessionId = Array.from(pm.sessions.keys())[0]; - console.log(`\n🧪 Probando sesión: ${sessionId}`); - - // Ejecutar diagnóstico completo - return diagnoseStreamingIssue(); - } else { - console.log('\n💡 Crea un plot primero, luego ejecuta: quickStreamingTest()'); - return false; - } -}; - -// Función específica para diagnosticar el onRefresh callback -window.diagnoseOnRefreshIssue = function () { - console.log('🔧 DIAGNÓSTICO ESPECÍFICO DEL ONREFRESH CALLBACK'); - console.log('='.repeat(50)); - - const pm = window.plotManager || plotManager; - if (!pm || !pm.sessions) { - console.error('❌ PlotManager no disponible'); - console.log('💡 Tip: Espera unos segundos e intenta de nuevo'); - return; - } - - if (pm.sessions.size === 0) { - console.log('⚠️ No hay sesiones activas. Crea un plot primero.'); - return; - } - - const sessionId = Array.from(pm.sessions.keys())[0]; - const sessionData = pm.sessions.get(sessionId); - - if (!sessionData || !sessionData.chart) { - console.error('❌ No se encuentra el chart para la sesión'); - return; - } - - const chart = sessionData.chart; - const realTimeScale = chart.scales.x; - - console.log('📊 Información del Chart:'); - console.log('- Chart existe:', !!chart); - console.log('- Chart type:', chart.config.type); - console.log('- Chart scales:', Object.keys(chart.scales)); - - console.log('\n📈 Información de la Escala RealTime:'); - console.log('- Scale type:', realTimeScale.type); - console.log('- Scale constructor:', realTimeScale.constructor.name); - console.log('- Scale options:', realTimeScale.options); - console.log('- Scale realtime options:', realTimeScale.options.realtime); - - if (realTimeScale.realtime) { - console.log('\n⚙️ Configuración RealTime:'); - console.log('- Duration:', realTimeScale.realtime.duration); - console.log('- Refresh:', realTimeScale.realtime.refresh); - console.log('- Pause:', realTimeScale.realtime.pause); - console.log('- onRefresh type:', typeof realTimeScale.realtime.onRefresh); - console.log('- onRefresh value:', realTimeScale.realtime.onRefresh); - - if (typeof realTimeScale.realtime.onRefresh === 'function') { - console.log('✅ onRefresh callback está configurado correctamente'); - - // Test manual del callback - console.log('\n🧪 Probando callback onRefresh manualmente...'); - try { - realTimeScale.realtime.onRefresh(chart); - console.log('✅ Callback onRefresh ejecutado sin errores'); - } catch (error) { - console.error('❌ Error al ejecutar callback onRefresh:', error); - } - } else { - console.error('❌ onRefresh callback NO está configurado como función'); - } - } else { - console.error('❌ No se encontró configuración realtime en la escala'); - } - - // Verificar streaming en chart - if (chart.$streaming) { - console.log('\n🔄 Estado del Streaming:'); - console.log('- Streaming enabled:', chart.$streaming.enabled); - console.log('- Interval ID:', chart.$streaming.intervalId); - console.log('- Interval activo:', !!chart.$streaming.intervalId); - } else { - console.error('❌ No se encontró objeto $streaming en el chart'); - } -}; - -console.log('🔧 Scripts de diagnóstico cargados:'); -console.log('- diagnoseStreamingIssue() - Diagnóstico completo'); -console.log('- resetStreaming() - Reiniciar streaming'); -console.log('- quickStreamingTest() - Test rápido'); -console.log('- diagnoseOnRefreshIssue() - Diagnóstico específico del onRefresh'); \ No newline at end of file diff --git a/static/js/main.js b/static/js/main.js index 8f23ce6..916ecb9 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -27,7 +27,6 @@ document.addEventListener('DOMContentLoaded', function () { // 🔑 NUEVO: Inicializar plotManager si existe if (typeof PlotManager !== 'undefined' && !window.plotManager) { window.plotManager = new PlotManager(); - console.log('📈 PlotManager initialized from main.js'); } // Configurar actualizaciones periódicas como respaldo diff --git a/static/js/plotting.js b/static/js/plotting.js index b10c7e8..b8d9103 100644 --- a/static/js/plotting.js +++ b/static/js/plotting.js @@ -3,53 +3,14 @@ * Maneja sesiones de plotting con Chart.js y comunicación con el backend */ -// 🔧 Global debugging para plots -window.enablePlotDebug = () => { - window.plotDebugEnabled = true; - console.log('📈 Plot debugging enabled. Check console for detailed logs.'); -}; - -window.disablePlotDebug = () => { - window.plotDebugEnabled = false; - console.log('📈 Plot debugging disabled.'); -}; - -// Helper function para logging condicional +// Helper function para logging condicional (solo errores graves) function plotDebugLog(...args) { - if (window.plotDebugEnabled) { - console.debug(...args); - } + // Solo mantener para compatibilidad, no hacer nada } -// 🔧 Test function para verificar que todo funciona +// Test function removida - solo mantener para compatibilidad window.testPlotSystem = async () => { - console.log('📈 Testing plot system...'); - - try { - // Test 1: Verificar disponibilidad de variables - const varsResponse = await fetch('/api/plots/variables'); - const varsData = await varsResponse.json(); - console.log('✅ Available variables:', varsData.available_variables.length); - console.log('✅ Boolean variables for triggers:', varsData.boolean_variables.length); - - // Test 2: Verificar plots existentes - const plotsResponse = await fetch('/api/plots'); - const plotsData = await plotsResponse.json(); - console.log('✅ Existing plot sessions:', plotsData.sessions.length); - - // Test 3: Si hay plots, verificar datos - if (plotsData.sessions.length > 0) { - const sessionId = plotsData.sessions[0].session_id; - const dataResponse = await fetch(`/api/plots/${sessionId}/data`); - const dataResult = await dataResponse.json(); - console.log(`✅ Plot ${sessionId} has ${dataResult.datasets?.length || 0} datasets with ${dataResult.data_points_count || 0} points`); - } - - console.log('📈 Plot system test completed. Enable debug with enablePlotDebug() for detailed logs.'); - - } catch (error) { - console.error('❌ Plot system test failed:', error); - } + // Función removida para limpiar debug }; class PlotManager { @@ -88,7 +49,6 @@ class PlotManager { this.startAutoUpdate(); this.isInitialized = true; - console.log('📈 Plot Manager initialized'); } async loadExistingSessions() { @@ -268,8 +228,6 @@ class PlotManager { // Inicializar datasets para las variables del plot this.initializeStreamingDatasets(sessionId, config); - - console.log(`📈 Created streaming plot session: ${sessionId}`); } updateChart(sessionId, plotData) { @@ -693,8 +651,6 @@ class PlotManager { // Actualizar estadísticas del plot this.updatePlotStats(sessionId, sessionInfo); - - console.log(`📈 Created streaming plot tab and chart for session: ${sessionId}`); } updatePlotStats(sessionId, sessionInfo) { @@ -757,7 +713,6 @@ class PlotManager { } // 🔑 NUEVO: Los plots se auto-inician en el backend, no necesitamos start manual aquí - console.log(`Plot session created and auto-started: ${result.session_id}`); showNotification(result.message, 'success'); return result.session_id; @@ -875,11 +830,9 @@ class PlotManager { } showPlotForm(sessionId = null) { - console.log('showPlotForm called with sessionId:', sessionId); // Asegurar que estemos en el tab de plotting if (typeof tabManager !== 'undefined' && tabManager.getCurrentTab() !== 'plotting') { - console.log('Switching to plotting tab'); tabManager.switchTab('plotting'); } @@ -906,31 +859,25 @@ class PlotManager { if (sessionId) { // Modo edición - console.log('Setting up form for editing'); if (formTitle) formTitle.textContent = '✏️ Edit Plot'; if (submitBtn) submitBtn.textContent = 'Update Plot'; this.loadPlotConfigForEdit(sessionId); } else { // Modo creación - console.log('Setting up form for creation'); if (formTitle) formTitle.textContent = '🆕 Create New Plot'; if (submitBtn) submitBtn.textContent = 'Create Plot'; this.resetPlotForm(); } - console.log('Making form visible'); formContainer.style.display = 'block'; // Scroll hacia el formulario para que sea visible setTimeout(() => { formContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); - console.log('Scrolled to form'); }, 100); // Cargar variables disponibles para triggers this.loadTriggerVariables(); - - console.log('showPlotForm completed'); } hidePlotForm() { @@ -1320,7 +1267,6 @@ class PlotManager { if (this.currentEditingSession) { // Modo edición: ELIMINAR el plot existente y crear uno nuevo desde cero - console.log(`Deleting existing plot ${this.currentEditingSession} to recreate it from scratch`); // 1. Eliminar el plot existente const deleteResponse = await fetch(`/api/plots/${this.currentEditingSession}`, { @@ -1353,7 +1299,6 @@ class PlotManager { }); const deleteResult = await deleteResponse.json(); - console.log(`Old plot deleted: ${deleteResult.message || 'Success'}`); } else { // Modo creación normal response = await fetch('/api/plots', { @@ -1414,85 +1359,10 @@ class PlotManager { } } this.sessions.clear(); - - console.log('📈 Plot Manager destroyed'); } } -// 🔧 NUEVAS FUNCIONES DE DEBUG Y VERIFICACIÓN - -/** - * Verifica que chartjs-plugin-streaming esté cargado correctamente - */ -window.verifyStreamingIntegration = function () { - console.log('🧪 Verificando integración de Chart.js Streaming...'); - - const checks = { - chartjsLoaded: typeof Chart !== 'undefined', - streamingLoaded: typeof window.ChartStreaming !== 'undefined', - plotManagerLoaded: typeof plotManager !== 'undefined', - activeStreamingSessions: 0 - }; - - console.log('✅ Chart.js cargado:', checks.chartjsLoaded); - console.log('✅ ChartStreaming cargado:', checks.streamingLoaded); - console.log('✅ PlotManager cargado:', checks.plotManagerLoaded); - - if (checks.plotManagerLoaded && plotManager.sessions) { - checks.activeStreamingSessions = plotManager.sessions.size; - console.log('✅ Sesiones de streaming activas:', checks.activeStreamingSessions); - - // Verificar cada sesión - for (const [sessionId, sessionData] of plotManager.sessions) { - console.log(`📈 Sesión ${sessionId}:`, { - hasChart: !!sessionData.chart, - chartType: sessionData.chart?.config?.type, - scaleType: sessionData.chart?.scales?.x?.type, - datasets: sessionData.chart?.data?.datasets?.length || 0, - lastTimestamps: sessionData.lastTimestamps, - streaming: !!sessionData.chart?.$streaming?.enabled - }); - } - } - - if (checks.streamingLoaded) { - console.log('✅ ChartStreaming functions:', Object.keys(window.ChartStreaming)); - - // Test de configuración - try { - const testConfig = window.ChartStreaming.createStreamingChartConfig({ - duration: 10000, - refresh: 1000 - }); - console.log('✅ Test configuración streaming:', !!testConfig); - } catch (e) { - console.log('❌ Error en test configuración:', e.message); - } - } - - return checks; -}; - -/** - * Fuerza una actualización de datos para todas las sesiones - */ -window.forceStreamingUpdate = function () { - if (!plotManager || !plotManager.sessions) { - console.log('❌ PlotManager no disponible'); - return; - } - - console.log('🔄 Forzando actualización de streaming...'); - - for (const [sessionId, sessionData] of plotManager.sessions) { - console.log(`🔄 Actualizando sesión ${sessionId}...`); - - if (sessionData.chart) { - // Forzar refresh de datos - plotManager.refreshStreamingData(sessionId, sessionData.chart); - } - } -}; +// Funciones de debug removidas para limpiar console.log // Función global para toggle de trigger config window.togglePlotFormTriggerConfig = function () { @@ -1506,10 +1376,6 @@ window.togglePlotFormTriggerConfig = function () { // Función global corregida para editar plots window.editPlotSession = function (sessionId) { - console.log('editPlotSession called with sessionId:', sessionId); - console.log('plotManager available:', !!plotManager); - console.log('tabManager available:', typeof tabManager !== 'undefined'); - if (!sessionId || sessionId.trim() === '') { console.error('Invalid or empty session ID provided to editPlotSession'); showNotification('Error: Invalid session ID', 'error'); @@ -1522,12 +1388,7 @@ window.editPlotSession = function (sessionId) { return; } - console.log('Opening plot form for editing session:', sessionId); - console.log('Current tab:', typeof tabManager !== 'undefined' ? tabManager.getCurrentTab() : 'tabManager not available'); - plotManager.showPlotForm(sessionId); - - console.log('Plot form should now be visible'); } // Función global para remover sesiones de plot @@ -1564,8 +1425,6 @@ window.removePlotSession = async function (sessionId) { // Función de utilidad para notificaciones window.showNotification = function (message, type = 'info') { - console.log(`${type.toUpperCase()}: ${message}`); - // Si tienes un sistema de notificaciones, úsalo aquí if (typeof showAlert === 'function') { showAlert(message, type); @@ -1578,15 +1437,9 @@ window.showNotification = function (message, type = 'info') { let plotManager = null; document.addEventListener('DOMContentLoaded', function () { - console.log('📈 Initializing Plot Manager with streaming support...'); - // Verificar que chartjs-plugin-streaming esté cargado if (typeof window.ChartStreaming === 'undefined') { console.error('❌ ChartStreaming plugin not loaded! The streaming functionality will not work.'); - console.log('💡 Make sure chartjs-plugin-streaming.js is loaded before plotting.js'); - } else { - console.log('✅ ChartStreaming plugin loaded successfully'); - console.log('Available functions:', Object.keys(window.ChartStreaming)); } // Exportar clase PlotManager globalmente @@ -1598,19 +1451,6 @@ document.addEventListener('DOMContentLoaded', function () { // Para compatibilidad plotManager = window.plotManager; - // Auto-verificar integración después de un breve delay - setTimeout(() => { - window.verifyStreamingIntegration(); - - // Si hay plots activos, mostrar información de debugging - if (plotManager.sessions.size > 0) { - console.log('📈 Active plot sessions detected. To debug:'); - console.log('- enablePlotDebug() - Enable detailed logging'); - console.log('- forceStreamingUpdate() - Force data update'); - console.log('- verifyStreamingIntegration() - Check system status'); - } - }, 2000); - // Cerrar modales con Escape (pero prevenir cierre accidental) document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey) { diff --git a/static/js/quick-fix-test.js b/static/js/quick-fix-test.js deleted file mode 100644 index 3ad26de..0000000 --- a/static/js/quick-fix-test.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * 🧪 Test Rápido de Verificación Post-Fix - * Ejecutar después de cargar la página para verificar que todo funciona - */ - -window.quickFixTest = function () { - console.log('🧪 TEST RÁPIDO POST-FIX'); - console.log('='.repeat(40)); - - const results = { - duplicatedElements: false, - plotManagerAvailable: false, - eventsWorking: false, - chartStreamingLoaded: false, - debugFunctionsLoaded: false - }; - - // 1. Verificar elementos duplicados - console.log('\n1️⃣ VERIFICANDO ELEMENTOS DUPLICADOS...'); - const eventsContainers = document.querySelectorAll('#events-container'); - const refreshBtns = document.querySelectorAll('#refresh-events-btn'); - - console.log(`- events-container: ${eventsContainers.length} (esperado: 1)`); - console.log(`- refresh-events-btn: ${refreshBtns.length} (esperado: 1)`); - - results.duplicatedElements = eventsContainers.length === 1 && refreshBtns.length === 1; - console.log(results.duplicatedElements ? '✅ Sin duplicados' : '❌ Hay elementos duplicados'); - - // 2. Verificar PlotManager - console.log('\n2️⃣ VERIFICANDO PLOTMANAGER...'); - const pm = window.plotManager || plotManager; - results.plotManagerAvailable = !!pm; - - console.log(`- window.plotManager: ${!!window.plotManager}`); - console.log(`- plotManager global: ${!!plotManager}`); - console.log(`- PlotManager class: ${!!window.PlotManager}`); - console.log(results.plotManagerAvailable ? '✅ PlotManager disponible' : '❌ PlotManager no disponible'); - - // 3. Verificar Events - console.log('\n3️⃣ VERIFICANDO EVENTS...'); - const eventsContainer = document.getElementById('events-container'); - const eventsCount = document.getElementById('events-count'); - - console.log(`- events-container existe: ${!!eventsContainer}`); - console.log(`- events-count existe: ${!!eventsCount}`); - - results.eventsWorking = !!eventsContainer && !!eventsCount; - console.log(results.eventsWorking ? '✅ Elements de events OK' : '❌ Faltan elementos de events'); - - // 4. Verificar Chart.js Streaming - console.log('\n4️⃣ VERIFICANDO CHART.JS STREAMING...'); - results.chartStreamingLoaded = !!window.ChartStreaming; - - if (results.chartStreamingLoaded) { - const functions = Object.keys(window.ChartStreaming); - console.log(`✅ ChartStreaming cargado con ${functions.length} funciones`); - console.log(`- Funciones: ${functions.join(', ')}`); - } else { - console.log('❌ ChartStreaming no cargado'); - } - - // 5. Verificar funciones de debug - console.log('\n5️⃣ VERIFICANDO FUNCIONES DE DEBUG...'); - const debugFunctions = [ - 'diagnoseStreamingIssue', - 'resetStreaming', - 'quickStreamingTest', - 'diagnoseOnRefreshIssue' - ]; - - const availableFunctions = debugFunctions.filter(fn => typeof window[fn] === 'function'); - results.debugFunctionsLoaded = availableFunctions.length === debugFunctions.length; - - console.log(`✅ Funciones cargadas: ${availableFunctions.join(', ')}`); - if (availableFunctions.length < debugFunctions.length) { - const missing = debugFunctions.filter(fn => typeof window[fn] !== 'function'); - console.log(`❌ Funciones faltantes: ${missing.join(', ')}`); - } - - // 6. Resumen - console.log('\n6️⃣ RESUMEN FINAL'); - console.log('='.repeat(30)); - - const allGood = Object.values(results).every(Boolean); - - if (allGood) { - console.log('🎉 ¡TODOS LOS PROBLEMAS ARREGLADOS!'); - console.log('✅ Ya puedes crear plots y usar el diagnóstico'); - console.log(''); - console.log('📋 Próximos pasos:'); - console.log('1. Ve a la pestaña "Real-Time Plotting"'); - console.log('2. Crea un nuevo plot'); - console.log('3. Ejecuta diagnoseOnRefreshIssue() para verificar streaming'); - } else { - console.log('⚠️ Algunos problemas persisten:'); - Object.entries(results).forEach(([key, value]) => { - if (!value) { - console.log(` ❌ ${key}`); - } - }); - console.log(''); - console.log('💡 Intenta recargar la página (F5) y ejecutar quickFixTest() de nuevo'); - } - - return results; -}; - -// Test básico de events -window.testEventsIntegration = function () { - console.log('🧪 PROBANDO INTEGRACIÓN DE EVENTS...'); - - try { - refreshEventLog(); - console.log('✅ refreshEventLog() ejecutado sin errores'); - - // Test loadEvents - if (typeof window.loadEvents === 'function') { - window.loadEvents(); - console.log('✅ loadEvents() ejecutado sin errores'); - } else { - console.log('❌ loadEvents() no disponible'); - } - - return true; - } catch (error) { - console.error('❌ Error en events:', error); - return false; - } -}; - -console.log('🧪 Funciones de test cargadas:'); -console.log('- quickFixTest() - Verificación completa post-fix'); -console.log('- testEventsIntegration() - Test específico de events'); \ No newline at end of file diff --git a/static/js/status.js b/static/js/status.js index e214d23..2ccf14e 100644 --- a/static/js/status.js +++ b/static/js/status.js @@ -111,7 +111,6 @@ function startStatusStreaming() { statusEventSource = new EventSource('/api/stream/status?interval=2.0'); statusEventSource.onopen = function (event) { - console.log('Status streaming connected'); isStreamingStatus = true; }; @@ -121,7 +120,6 @@ function startStatusStreaming() { switch (data.type) { case 'connected': - console.log('Status stream connected:', data.message); break; case 'status': diff --git a/static/js/tabs.js b/static/js/tabs.js index d746059..7984051 100644 --- a/static/js/tabs.js +++ b/static/js/tabs.js @@ -16,8 +16,6 @@ class TabManager { // Inicializar con el tab activo por defecto this.switchTab(this.currentTab); - - console.log('📑 Tab Manager initialized'); } bindStaticTabs() { @@ -51,8 +49,6 @@ class TabManager { // Eventos específicos por tab this.handleTabSpecificEvents(tabName); - - console.log(`📑 Switched to tab: ${tabName}`); } } @@ -156,7 +152,6 @@ class TabManager { this.plotTabs.add(sessionId); - console.log(`📑 Created plot sub-tab for session: ${sessionId}`); return subTabBtn; } @@ -180,8 +175,6 @@ class TabManager { // Eventos específicos por sub-tab this.handleSubTabSpecificEvents(subTabName); - - console.log(`📑 Switched to sub-tab: ${subTabName}`); } } @@ -220,8 +213,6 @@ class TabManager { plotSessionsContainer.style.display = 'block'; plotSubContent.style.display = 'none'; } - - console.log(`📑 Removed plot sub-tab for session: ${sessionId}`); } updatePlotTabName(sessionId, newName) { diff --git a/static/js/test-streaming.js b/static/js/test-streaming.js deleted file mode 100644 index c44a12c..0000000 --- a/static/js/test-streaming.js +++ /dev/null @@ -1,216 +0,0 @@ -/** - * 🧪 Script de prueba para Chart.js Plugin Streaming - * Ejecutar en consola del navegador para verificar integración - */ - -// Test básico de disponibilidad -function testStreamingAvailability() { - console.log('🧪 Testing Chart.js Streaming Plugin availability...'); - - let results = { - chartjsLoaded: typeof Chart !== 'undefined', - streamingLoaded: typeof window.ChartStreaming !== 'undefined', - realTimeScaleRegistered: false, - streamingPluginRegistered: false - }; - - // Verificar que Chart.js esté cargado - if (results.chartjsLoaded) { - console.log('✅ Chart.js is loaded'); - - // Verificar escala realtime - try { - Chart.register(window.ChartStreaming.RealTimeScale); - results.realTimeScaleRegistered = true; - console.log('✅ RealTime scale is available'); - } catch (e) { - console.log('❌ RealTime scale registration failed:', e.message); - } - - // Verificar plugin de streaming - try { - Chart.register(window.ChartStreaming.streamingPlugin); - results.streamingPluginRegistered = true; - console.log('✅ Streaming plugin is available'); - } catch (e) { - console.log('❌ Streaming plugin registration failed:', e.message); - } - } else { - console.log('❌ Chart.js is not loaded'); - } - - // Verificar ChartStreaming global - if (results.streamingLoaded) { - console.log('✅ ChartStreaming global object is available'); - console.log('Available functions:', Object.keys(window.ChartStreaming)); - } else { - console.log('❌ ChartStreaming global object is not available'); - } - - return results; -} - -// Test de creación de configuración -function testStreamingConfig() { - console.log('🧪 Testing streaming configuration creation...'); - - if (typeof window.ChartStreaming === 'undefined') { - console.log('❌ ChartStreaming not available'); - return false; - } - - try { - const config = window.ChartStreaming.createStreamingChartConfig({ - duration: 30000, - refresh: 1000, - yMin: 0, - yMax: 100 - }); - - console.log('✅ Streaming configuration created successfully'); - console.log('Config structure:', { - type: config.type, - hasRealTimeScale: config.options.scales.x.type === 'realtime', - duration: config.options.scales.x.realtime.duration, - refresh: config.options.scales.x.realtime.refresh - }); - - return true; - } catch (e) { - console.log('❌ Failed to create streaming configuration:', e.message); - return false; - } -} - -// Test de creación de chart (requiere canvas) -function testStreamingChart() { - console.log('🧪 Testing streaming chart creation...'); - - // Buscar un canvas existente o crear uno temporal - let canvas = document.querySelector('canvas'); - let isTemporary = false; - - if (!canvas) { - console.log('Creating temporary canvas for testing...'); - canvas = document.createElement('canvas'); - canvas.id = 'test-streaming-canvas'; - canvas.style.display = 'none'; - document.body.appendChild(canvas); - isTemporary = true; - } - - try { - const ctx = canvas.getContext('2d'); - const config = window.ChartStreaming.createStreamingChartConfig({ - duration: 10000, - refresh: 2000 - }); - - const chart = new Chart(ctx, config); - - console.log('✅ Streaming chart created successfully'); - console.log('Chart info:', { - id: chart.id, - type: chart.config.type, - hasStreamingPlugin: chart.config.plugins.includes('streaming'), - scaleType: chart.scales.x.type - }); - - // Cleanup - chart.destroy(); - if (isTemporary) { - canvas.remove(); - } - - return true; - } catch (e) { - console.log('❌ Failed to create streaming chart:', e.message); - - // Cleanup en caso de error - if (isTemporary && canvas.parentNode) { - canvas.remove(); - } - - return false; - } -} - -// Test completo -function runStreamingTests() { - console.log('🚀 Starting Chart.js Streaming Plugin Integration Tests'); - console.log('='.repeat(60)); - - const results = { - availability: testStreamingAvailability(), - config: testStreamingConfig(), - chart: testStreamingChart() - }; - - console.log('='.repeat(60)); - console.log('📊 Test Results Summary:'); - console.log('- Availability:', results.availability.chartjsLoaded && results.availability.streamingLoaded ? '✅' : '❌'); - console.log('- Configuration:', results.config ? '✅' : '❌'); - console.log('- Chart Creation:', results.chart ? '✅' : '❌'); - - const allPassed = results.availability.chartjsLoaded && - results.availability.streamingLoaded && - results.config && - results.chart; - - if (allPassed) { - console.log('🎉 All tests passed! Chart.js Streaming Plugin is ready to use.'); - } else { - console.log('⚠️ Some tests failed. Check the logs above for details.'); - } - - return results; -} - -// Test específico para la aplicación PLC -function testPlotManagerIntegration() { - console.log('🧪 Testing PlotManager integration...'); - - if (typeof plotManager === 'undefined') { - console.log('❌ PlotManager not available (might not be on plotting tab)'); - return false; - } - - console.log('✅ PlotManager is available'); - console.log('PlotManager info:', { - isInitialized: plotManager.isInitialized, - sessionsCount: plotManager.sessions.size, - colorsAvailable: plotManager.colors.length - }); - - // Verificar métodos de streaming - const streamingMethods = [ - 'setStreamingPause', - 'clearStreamingData', - 'refreshStreamingData', - 'initializeStreamingDatasets' - ]; - - const availableMethods = streamingMethods.filter(method => - typeof plotManager[method] === 'function' - ); - - console.log('Available streaming methods:', availableMethods); - - return availableMethods.length === streamingMethods.length; -} - -// Hacer funciones disponibles globalmente para testing manual -if (typeof window !== 'undefined') { - window.testStreamingAvailability = testStreamingAvailability; - window.testStreamingConfig = testStreamingConfig; - window.testStreamingChart = testStreamingChart; - window.runStreamingTests = runStreamingTests; - window.testPlotManagerIntegration = testPlotManagerIntegration; - - console.log('🧪 Streaming test functions loaded. Available commands:'); - console.log('- testStreamingAvailability()'); - console.log('- testStreamingConfig()'); - console.log('- testStreamingChart()'); - console.log('- runStreamingTests()'); - console.log('- testPlotManagerIntegration()'); -} \ No newline at end of file diff --git a/static/js/variables.js b/static/js/variables.js index 66b99a3..c97da32 100644 --- a/static/js/variables.js +++ b/static/js/variables.js @@ -146,7 +146,6 @@ function startVariableStreaming() { variableEventSource = new EventSource(`/api/stream/variables?dataset_id=${currentDatasetId}&interval=1.0`); variableEventSource.onopen = function (event) { - console.log('Variable streaming connected'); isStreamingVariables = true; updateStreamingIndicator(true); }; @@ -157,7 +156,6 @@ function startVariableStreaming() { switch (data.type) { case 'connected': - console.log('Variable stream connected:', data.message); break; case 'values': @@ -198,7 +196,6 @@ function startVariableStreaming() { break; default: - console.warn('Unknown SSE message type:', data.type); break; } } catch (error) { diff --git a/system_state.json b/system_state.json index 38b4a7d..7d61496 100644 --- a/system_state.json +++ b/system_state.json @@ -1,11 +1,11 @@ { "last_state": { "should_connect": true, - "should_stream": false, + "should_stream": true, "active_datasets": [ "dar" ] }, "auto_recovery_enabled": true, - "last_update": "2025-07-21T18:34:08.746917" + "last_update": "2025-08-03T10:18:30.092426" } \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 500c835..c77eac1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -775,11 +775,7 @@ - - - - \ No newline at end of file