// static/js/app.js – MK Control Frontend document.addEventListener('DOMContentLoaded', () => { const statusBadge = document.getElementById('connection-status'); function updateStatus(connected) { if (!statusBadge) return; if (connected) { statusBadge.className = 'badge bg-success px-3 py-2'; statusBadge.innerHTML = ' Verbunden'; reconnectSection.style.display = 'none'; } else { statusBadge.className = 'badge bg-danger px-3 py-2'; statusBadge.innerHTML = ' Getrennt'; showReconnect(); } } // Nach erfolgreichem Connect / Reconnect // in if (result.success) { ... } updateStatus(true); // Nach Fehler in sendControl (z. B. am Ende von sendControl) updateStatus(false); const config = window.mkConfig || {}; console.log("app.js verwendet config:", config); console.log('MK Control Frontend geladen'); // ── Elemente ─────────────────────────────────────────────────────────────── const connectBtn = document.getElementById('connect-btn'); const connectSection = document.getElementById('connect-section'); const controlSection = document.getElementById('control-section'); const channelsContainer = document.getElementById('channels-container'); const stopAllBtn = document.getElementById('stop-all-btn'); const reconnectSection = document.getElementById('reconnect-section'); const reconnectBtn = document.getElementById('reconnect-btn'); if (!connectBtn) { console.warn('Nicht auf der Steuerseite – Connect-Button nicht gefunden'); return; } // ── Config aus Template (von Flask eingebettet) ─────────────────────────── //const config = window.config || {}; // Sicherstellen, dass config existiert // ── Connect-Button ──────────────────────────────────────────────────────── connectBtn.addEventListener('click', async () => { connectBtn.disabled = true; connectBtn.innerHTML = ' Verbinde...'; try { console.log("→ Sende /api/connect ..."); const response = await fetch('/api/connect', { method: 'POST', headers: { 'Content-Type': 'application/json' } }); console.log("→ Antwort erhalten:", response.status); const result = await response.json(); console.log("→ Resultat:", result); if (result.success) { console.log("→ Connect erfolgreich – blende Sections um"); connectSection.style.display = 'none'; controlSection.style.display = 'block'; reconnectSection.style.display = 'none'; console.log("→ Rufe renderChannels() auf"); renderChannels(); console.log("→ renderChannels() abgeschlossen"); } else { console.warn("→ Connect fehlgeschlagen:", result.message); alert('Verbindung fehlgeschlagen:\n' + (result.message || 'Unbekannter Fehler')); } } catch (err) { console.error("→ Connect-Fehler:", err); alert('Netzwerk- oder Verbindungsfehler: ' + err.message); } finally { connectBtn.disabled = false; connectBtn.innerHTML = ' Mit Hub verbinden'; } }); // ── Alle stoppen ────────────────────────────────────────────────────────── if (stopAllBtn) { stopAllBtn.addEventListener('click', async () => { if (!confirm('Wirklich ALLE Kanäle stoppen?')) return; try { const res = await fetch('/api/stop_all', { method: 'POST' }); const data = await res.json(); if (data.success) { // Alle Motor-Slider zurücksetzen document.querySelectorAll('.motor-slider').forEach(slider => { slider.value = 0; const display = slider.parentElement.querySelector('.value-display'); if (display) display.textContent = '0 %'; }); console.log('Alle Kanäle gestoppt'); alert('Alle Kanäle gestoppt'); } else { alert('Fehler beim Stoppen:\n' + (data.message || 'Unbekannt')); } } catch (err) { console.error('Stop-all Fehler:', err); alert('Netzwerkfehler beim Stoppen aller Kanäle'); } }); } // ── Erneut verbinden ────────────────────────────────────────────────────── if (reconnectBtn) { reconnectBtn.addEventListener('click', async () => { reconnectBtn.disabled = true; reconnectBtn.innerHTML = ' Verbinde...'; try { const response = await fetch('/api/reconnect', { method: 'POST', headers: { 'Content-Type': 'application/json' } }); const result = await response.json(); if (result.success) { reconnectSection.style.display = 'none'; controlSection.style.display = 'block'; alert('Verbindung wiederhergestellt!'); // Optional: Kanäle neu rendern oder Status aktualisieren } else { alert('Erneute Verbindung fehlgeschlagen:\n' + (result.message || 'Unbekannt')); } } catch (err) { console.error('Reconnect-Fehler:', err); alert('Netzwerkfehler beim erneuten Verbinden'); } finally { reconnectBtn.disabled = false; reconnectBtn.innerHTML = ' Erneut verbinden'; } }); } // ── Kanäle dynamisch rendern ────────────────────────────────────────────── function renderChannels() { console.log("renderChannels() START"); console.log("→ config.channels existiert?", !!config?.channels); console.log("→ channels.length:", config?.channels?.length ?? "undefined"); if (!channelsContainer) { console.error("→ channelsContainer nicht gefunden im DOM!"); return; } channelsContainer.innerHTML = ''; console.log("→ Container geleert"); if (!config?.channels || config.channels.length === 0) { console.warn("→ Keine Kanäle erkannt – zeige leere Meldung"); channelsContainer.innerHTML = '
Keine Kanäle in der Konfiguration definiert.
'; return; } console.log("→ Beginne mit Rendern von", config.channels.length, "Kanälen"); // function renderChannels() { // if (!channelsContainer) return; // channelsContainer.innerHTML = ''; // if (!config.channels || config.channels.length === 0) { // channelsContainer.innerHTML = 'Keine Kanäle in der Konfiguration definiert.
'; // return; // } config.channels.forEach(channel => { const col = document.createElement('div'); col.className = 'col-md-6 mb-4'; let controlHTML = ''; if (channel.type === 'motor') { controlHTML = `