<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[script Portainer Api V3.3 - inkl. html Tabelle]]></title><description><![CDATA[<p dir="auto">Edit: Header, Text, Scripte :). vielen Dank an alle die mir hier geholfen haben!</p>
<p dir="auto">Hallo,<br />
wie bekomme ich die Daten aus Portainer in den iobroker?</p>
<p dir="auto">Edit:<br />
Hier das, was chatgpt nach einigen Versuchen mir ausgegeben hat, das Javascript fragt die Portainer-Api in regelmaessigen Abstaenden ab, man kann Docker Container starten/stoppen, bekommt bei Aenderungen eine Msg per Discord, und es werden Cpu, Ram, Uptime, Image, IP, Port angezeigt:</p>
<p dir="auto"></p><section class="spoiler-wrapper"><button class="spoiler-control btn btn-default">Spoiler</button><section style="display:none" class="spoiler-content"><p></p>
<pre><code>// 📦 Portainer Statusboard Version 3.3
// by Ilovegym
// 📜 Änderungsprotokoll
// - Version 3.3: Mobile Ansicht – CPU/RAM ein-/ausblendbar
// - Version 3.2: Mobile Ansicht mit Symbolstatus &amp; 2-zeiligem Layout konfigurierbar
// - Version 3.1: Mobiler Dashboard-Datenpunkt konfigurierbar
// - Version 3.0: Mobiles Dashboard in Datenpunkt StatusMobile
// - Version 2.7: Persistenter Theme-Switch
// - Version 2.6: Persistente Filter und zusätzliche Filterfelder (CPU, RAM, Alter)
// - Version 2.5: Filter für laufende Container eingebaut
// - Version 2.4: "Erstellt" zeigt nun Alter in Tagen an
// - Version 2.3: Alphabetische Standard-Sortierung
// - Version 2.2: Warn-Icons, Farb-Balken für CPU/RAM, letzter Restart-Zeitpunkt
// - Version 2.1: CPU und RAM korrekt aus Stats übernommen
// - Version 2.0: Hinzugefügt: Restarted-Spalte, Tooltip mit IP, Theme-Switch, Sortierung
// - Version 1.x: Basisfunktion: Containerdatenpunkte, Discord/Telegram Benachrichtigungen, Statusboard
const exec = require('child_process').exec;

// 🔧 KONFIGURATION
const mobileLayoutColumns = 1; // 1 = eine Spalte, 2 = zwei Spalten in mobiler Ansicht

const mobileColumnOrder = [
    'name', 'state', 'cpu', 'mem', 'uptime'
]; // Spaltenreihenfolge in der mobilen Ansicht

const tableColumnOrder = [
    'name', 'cpu', 'mem', 'state', 'uptime', 'restartedRecently', 'restartAt', 'image', 'created', 'ports'
]; // Reihenfolge der Spalten im Statusboard

const username = 'admin';
const password = 'supergeheimespassword!';
const portainerHost = 'http://10.10.2.10:9000';
const endpointId = 2;  //default 1
const datapointBase = '0_userdata.0.Portainer.Containers.';
const statusBoardDP = '0_userdata.0.Portainer.Containers.Statusboard';
const updateIntervalMinutes = 3;
const mobileStatusDP = '0_userdata.0.Portainer.Containers.StatusMobile';
const mobileUseSymbol = true;       // true = ✅/❌, false = 'running'
const mobileShowCPU = true;         // true = CPU in mobiler Ansicht anzeigen
const mobileShowRAM = true;         // true = RAM in mobiler Ansicht anzeigen
const mobileTwoLineLayout = true;   // true = Name/Status oben, Details unten
const discordDP = 'discord.0.xxxx.send'; //bitte anpassen

const discordToggleDP = '0_userdata.0.Portainer.Notify.Discord';
const telegramToggleDP = '0_userdata.0.Portainer.Notify.Telegram';
const telegramInstance = 'telegram.0';

// Initiale Schalter
if (!existsState(discordToggleDP)) {
    createState(discordToggleDP, true, { type: 'boolean', name: 'Discord aktivieren', read: true, write: true });
}
if (!existsState(telegramToggleDP)) {
    createState(telegramToggleDP, false, { type: 'boolean', name: 'Telegram aktivieren', read: true, write: true });
}

function getTokenAndContainers() {
    const loginCmd = `curl -s -H "Content-Type: application/json" -X POST -d '{"Username":"${username}","Password":"${password}"}' ${portainerHost}/api/auth`;
    exec(loginCmd, (error, stdout) =&gt; {
        if (error) return log(`❌ Token-Fehler: ${error}`, 'error');
        try {
            const token = JSON.parse(stdout).jwt;
            if (!token) return log('❌ Kein Token erhalten', 'error');
            getContainerList(token);
        } catch (e) {
            log(`❌ Token-Parsing-Fehler: ${e.message}`, 'error');
        }
    });
}

function getContainerList(token) {
    const url = `${portainerHost}/api/endpoints/${endpointId}/docker/containers/json?all=1`;
    const cmd = `curl -s -H "Authorization: Bearer ${token}" "${url}"`;
    exec(cmd, (error, stdout) =&gt; {
        if (error) return log(`❌ Fehler beim Containerabruf: ${error}`, 'error');

        try {
            const containers = JSON.parse(stdout);
            const containerList = [];

            containers.forEach(container =&gt; {
                const id = container.Id;
                const name = container.Names[0].replace(/^\//, '');
                const dp = `${datapointBase}${name}`;

                const image = container.Image;
                const createdDate = new Date(container.Created * 1000);
                const createdDaysAgo = Math.floor((Date.now() - createdDate.getTime()) / (1000 * 60 * 60 * 24));
                const created = `${createdDate.toLocaleString('de-DE', { hour12: false })} (${createdDaysAgo} Tage alt)`;
                const ports = (container.Ports || []).map(p =&gt; `${p.IP || '0.0.0.0'}:${p.PublicPort}-&gt;${p.PrivatePort}/${p.Type}`).join(', ');
                const ip = container.NetworkSettings?.Networks?.bridge?.IPAddress || 'n/a';

                createState(`${dp}.image`, image, true);
                setState(`${dp}.image`, image, true);
                createState(`${dp}.created`, created, true);
                setState(`${dp}.created`, created, true);
                createState(`${dp}.ports`, ports, true);
                setState(`${dp}.ports`, ports, true);
                createState(`${dp}.ip`, ip, true);
                setState(`${dp}.ip`, ip, true);
                createState(`${dp}.control`, false, { type: 'boolean', role: 'button', write: true, read: false });

                const detailUrl = `${portainerHost}/api/endpoints/${endpointId}/docker/containers/${id}/json`;
                const detailCmd = `curl -s -H "Authorization: Bearer ${token}" "${detailUrl}"`;
                exec(detailCmd, (err, detailOut) =&gt; {
                    if (err) return log(`❌ Fehler bei Details für ${name}: ${err}`, 'warn');
                    try {
                        const detail = JSON.parse(detailOut);
                        const isRunning = detail?.State?.Running === true;
                        const state = isRunning ? 'running' : 'exited';
                        const startedAt = new Date(isRunning ? detail.State.StartedAt : 0);
                        const now = new Date();
                        const uptimeMs = isRunning ? now - startedAt : 0;
                        const uptimeText = formatUptime(uptimeMs);

                        const stateDP = `${dp}.state`;
                        getStateAsync(stateDP).then(oldState =&gt; {
                            if (oldState &amp;&amp; oldState.val !== state) {
                                const msg = `🔔 Container \`${name}\` Status: \`${oldState.val}\` → \`${state}\``;
                                sendDiscordMessage(msg);
                                sendTelegramMessage(msg);
                            }
                        });

                        createState(stateDP, state, true);
                        setState(stateDP, state, true);
                        createState(`${dp}.uptimeText`, uptimeText, true);
                        setState(`${dp}.uptimeText`, uptimeText, true);

                        const statsCmd = `curl -s -H "Authorization: Bearer ${token}" "${portainerHost}/api/endpoints/${endpointId}/docker/containers/${id}/stats?stream=false"`;
                        exec(statsCmd, (e, statsOut) =&gt; {
                            if (e) return;
                            try {
                                const stats = JSON.parse(statsOut);
                                const cpuDelta = stats.cpu_stats.cpu_usage.total_usage - stats.precpu_stats.cpu_usage.total_usage;
                                const systemDelta = stats.cpu_stats.system_cpu_usage - stats.precpu_stats.system_cpu_usage;
                                const cpuPercent = systemDelta &gt; 0 ? (cpuDelta / systemDelta) * stats.cpu_stats.online_cpus * 100 : 0;
                                const memMB = Math.round((stats.memory_stats.usage || 0) / 1024 / 1024);

                                createState(`${dp}.cpu`, Math.round(cpuPercent * 10) / 10, true);
                                setState(`${dp}.cpu`, Math.round(cpuPercent * 10) / 10, true);
                                createState(`${dp}.mem`, memMB, true);
                                setState(`${dp}.mem`, memMB, true);

                                const cpuSafe = Math.round(cpuPercent * 10) / 10;
                                const memSafe = memMB;
                                const restartedRecently = isRunning &amp;&amp; (uptimeMs &lt; 2 * 60 * 1000);
                                const restartAt = isRunning ? startedAt.toLocaleString('de-DE', { hour12: false }) : '-';
containerList.push({ name, state, uptime: uptimeText, cpu: cpuSafe, mem: memSafe, image, ports, created, ip, restartedRecently, restartAt });

                                setState(statusBoardDP, buildHTML(containerList), true);
                                setState(mobileStatusDP, buildMobileHTML(containerList), true);
                            } catch (e) {
                                log(`⚠️ Stats-Parsing-Fehler ${name}: ${e.message}`, 'warn');
                            }
                        });

                        

                    } catch (e) {
                        log(`❌ Detail-Parsing-Fehler ${name}: ${e.message}`, 'warn');
                    }
                });
            });
        } catch (err) {
            log(`❌ Containerdaten-Fehler: ${err.message}`, 'error');
        }
    });
}

function formatUptime(ms) {
    const totalSeconds = Math.floor(ms / 1000);
    const days = Math.floor(totalSeconds / 86400);
    const hours = Math.floor((totalSeconds % 86400) / 3600);
    const minutes = Math.floor((totalSeconds % 3600) / 60);
    let str = '';
    if (days &gt; 0) str += `${days}d `;
    if (days &gt; 0 || hours &gt; 0) str += `${hours}h `;
    str += `${minutes}min`;
    return str.trim();
}

on(new RegExp(`${datapointBase}(.*)\.control`), function (obj) {
    if (obj.state.val !== true) return;
    const name = obj.id.split('.')[4];
    const loginCmd = `curl -s -H "Content-Type: application/json" -X POST -d '{"Username":"${username}","Password":"${password}"}' ${portainerHost}/api/auth`;
    exec(loginCmd, (error, stdout) =&gt; {
        if (error) return log(`❌ Loginfehler: ${error}`, 'error');
        try {
            const token = JSON.parse(stdout).jwt;
            const listCmd = `curl -s -H "Authorization: Bearer ${token}" "${portainerHost}/api/endpoints/${endpointId}/docker/containers/json?all=1"`;
            exec(listCmd, (err, out) =&gt; {
                const list = JSON.parse(out);
                const container = list.find(c =&gt; c.Names[0].replace(/^\//, '') === name);
                if (!container) return log(`⚠️ Container ${name} nicht gefunden`, 'warn');
                const action = container.State === 'running' ? 'stop' : 'start';
                const actionUrl = `${portainerHost}/api/endpoints/${endpointId}/docker/containers/${container.Id}/${action}`;
                const actionCmd = `curl -s -H "Authorization: Bearer ${token}" -X POST "${actionUrl}"`;
                exec(actionCmd, () =&gt; {
                    log(`✅ Container ${name} ${action} ausgeführt`);
                    setTimeout(() =&gt; getTokenAndContainers(), 3000);
                    setTimeout(() =&gt; setState(obj.id, false, true), 500);
                });
            });
        } catch (e) {
            log(`❌ Steuerungsfehler: ${e.message}`, 'error');
        }
    });
});

function sendDiscordMessage(message) {
    const discordEnabled = getState(discordToggleDP)?.val === true;
    if (discordEnabled &amp;&amp; existsState(discordDP)) {
        setState(discordDP, message);
        log(`📤 Discord: ${message}`);
    } else {
        log(`ℹ️ Discord deaktiviert oder nicht verfügbar`, 'info');
    }
}

function sendTelegramMessage(message) {
    const telegramEnabled = getState(telegramToggleDP)?.val === true;
    if (telegramEnabled) {
        sendTo(telegramInstance, 'send', { text: message });
        log(`📤 Telegram: ${message}`);
    } else {
        log(`ℹ️ Telegram deaktiviert`, 'info');
    }
}

function buildHTML(list) {
    list.sort((a, b) =&gt; a.name.localeCompare(b.name));
    let html = `&lt;b style="color:#ffffff;"&gt;🧾 Docker Statusboard&lt;/b&gt;&lt;br&gt;
    &lt;label for="runningFilter" style="color:#ffffff;"&gt;🚦 Nur laufende anzeigen&lt;/label&gt;
    &lt;input type="checkbox" id="runningFilter" onchange="filterRunning()" style="margin-bottom:10px;"&gt;
    &lt;label for="themeToggle" style="color:#ffffff;"&gt;🌗 Theme&lt;/label&gt;
    &lt;input type="checkbox" id="themeToggle" checked onchange="toggleTheme()" style="margin-bottom: 10px;"&gt;&lt;br&gt;
    &lt;table id="dockerStatus" border="1" cellspacing="0" cellpadding="6"
        style="font-family:Arial; font-size:13px; border-collapse:collapse;
               text-align:left; background:#1e1e1e; color:#ffffff; border-color:#444; width:100%;"&gt;
        &lt;thead&gt;
        &lt;tr style="background:#333;"&gt;
            &lt;th onclick="sortTable(0)"&gt;Name&lt;/th&gt;
            &lt;th onclick="sortTable(1)"&gt;CPU&lt;/th&gt;
            &lt;th onclick="sortTable(2)"&gt;RAM&lt;/th&gt;
            &lt;th onclick="sortTable(3)"&gt;Status&lt;/th&gt;
            &lt;th onclick="sortTable(4)"&gt;Uptime&lt;/th&gt;
            &lt;th onclick="sortTable(5)"&gt;Restarted&lt;/th&gt;
            &lt;th onclick="sortTable(6)"&gt;Restart-Zeit&lt;/th&gt;
            &lt;th onclick="sortTable(7)"&gt;Image&lt;/th&gt;
            &lt;th onclick="sortTable(8)"&gt;Erstellt&lt;/th&gt;
            &lt;th onclick="sortTable(9)"&gt;Ports&lt;/th&gt;
        &lt;/tr&gt;
        &lt;/thead&gt;&lt;tbody&gt;`;

    for (let c of list) {
        html += `&lt;tr style="background:${c.state === 'running' ? '#2d572c' : '#571b1b'};" title="IP: ${c.ip}"&gt;
            &lt;td&gt;${c.name}&lt;/td&gt;
            &lt;td style="color:${c.cpu &gt; 50 ? '#ff5555' : '#cccccc'}"&gt;${c.cpu}&lt;/td&gt;
            &lt;td style="color:${c.mem &gt; 500 ? '#ff8800' : '#cccccc'}"&gt;${c.mem}&lt;/td&gt;
            &lt;td&gt;${c.state === 'running' ? '✅' : '❌'} ${c.state}&lt;/td&gt;
            &lt;td&gt;${c.uptime}&lt;/td&gt;
            &lt;td style="color: ${c.restartedRecently ? '#ffaa00' : '#cccccc'};"&gt;${c.restartedRecently ? 'ja' : 'nein'}&lt;/td&gt;
            &lt;td&gt;${c.restartAt}&lt;/td&gt;
            &lt;td&gt;${c.image}&lt;/td&gt;
            &lt;td&gt;${c.created}&lt;/td&gt;
            &lt;td&gt;${c.ports}&lt;/td&gt;
        &lt;/tr&gt;`;
    }

    html += `&lt;/tbody&gt;&lt;/table&gt;
    &lt;script&gt;
        function filterRunning() {
            var table = document.getElementById("dockerStatus");
            var rows = table.getElementsByTagName("tr");
            var onlyRunning = document.getElementById("runningFilter").checked;
            for (var i = 1; i &lt; rows.length; i++) {
                var stateCell = rows[i].getElementsByTagName("td")[3];
                if (!stateCell) continue;
                var isRunning = stateCell.textContent.includes("running");
                rows[i].style.display = (onlyRunning &amp;&amp; !isRunning) ? "none" : "";
            }
        }
        function sortTable(n) {
            var table = document.getElementById("dockerStatus");
            var switching = true;
            var dir = "asc";
            var switchcount = 0;
            while (switching) {
                switching = false;
                var rows = table.rows;
                for (var i = 1; i &lt; rows.length - 1; i++) {
                    var shouldSwitch = false;
                    var x = rows[i].getElementsByTagName("TD")[n];
                    var y = rows[i + 1].getElementsByTagName("TD")[n];
                    var xContent = x.textContent || x.innerText;
                    var yContent = y.textContent || y.innerText;
                    var xNum = parseFloat(xContent);
                    var yNum = parseFloat(yContent);
                    var isNumber = !isNaN(xNum) &amp;&amp; !isNaN(yNum);
                    if (isNumber) {
                        if ((dir === "asc" &amp;&amp; xNum &gt; yNum) || (dir === "desc" &amp;&amp; xNum &lt; yNum)) {
                            shouldSwitch = true;
                            break;
                        }
                    } else {
                        if ((dir === "asc" &amp;&amp; xContent.toLowerCase() &gt; yContent.toLowerCase()) ||
                            (dir === "desc" &amp;&amp; xContent.toLowerCase() &lt; yContent.toLowerCase())) {
                            shouldSwitch = true;
                            break;
                        }
                    }
                }
                if (shouldSwitch) {
                    rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                    switching = true;
                    switchcount++;
                } else {
                    if (switchcount === 0 &amp;&amp; dir === "asc") {
                        dir = "desc";
                        switching = true;
                    }
                }
            }
        }
    function toggleTheme() {
            var table = document.getElementById("dockerStatus");
            var isDark = document.getElementById("themeToggle").checked;
            table.style.background = isDark ? "#1e1e1e" : "#ffffff";
            table.style.color = isDark ? "#ffffff" : "#000000";
            var th = table.getElementsByTagName("th");
            for (var i = 0; i &lt; th.length; i++) {
                th[i].style.background = isDark ? "#333" : "#dddddd";
            }
            localStorage.setItem("themeDark", isDark);
        }
        window.addEventListener("load", () =&gt; {
            document.getElementById("themeToggle").checked = localStorage.getItem("themeDark") === "true";
            toggleTheme();
        });
        }
    &lt;/script&gt;`;
    return html;
}

// Start und Zyklus
getTokenAndContainers();
schedule(`*/${updateIntervalMinutes} * * * *`, getTokenAndContainers);

function buildMobileHTML(list) {
    list.sort((a, b) =&gt; a.name.localeCompare(b.name));
    let html = `&lt;div style="font-family:Arial; font-size:14px;"&gt;&lt;b&gt;📱 Docker Übersicht&lt;/b&gt;&lt;br&gt;&lt;br&gt;`;

    const columnWidth = mobileLayoutColumns === 2 ? '48%' : '100%';
    const wrapperStyle = mobileLayoutColumns === 2 ? 'display:flex; flex-wrap:wrap; justify-content:space-between;' : '';

    html += `&lt;div style="${wrapperStyle}"&gt;`;

    for (let c of list) {
        const color = c.state === 'running' ? '#2d572c' : '#571b1b';
        const cpu = parseFloat(c.cpu);
        const mem = parseFloat(c.mem);
        const statusText = mobileUseSymbol ? (c.state === 'running' ? '✅' : '❌') : c.state;
        let metricsLine = '';
        if (mobileShowCPU) metricsLine += ` CPU: ${cpu}%`;
        if (mobileShowRAM) metricsLine += ` RAM: ${mem} MB`;

        let card = '';
        if (mobileTwoLineLayout) {
            card = `&lt;div style="margin-bottom:12px; padding:8px; border-radius:8px; background:${color}; width:${columnWidth}; box-sizing:border-box;"&gt;
                &lt;b&gt;${c.name}&lt;/b&gt;&lt;br&gt;
                &lt;small&gt;${statusText}${metricsLine}&lt;/small&gt;&lt;br&gt;
                &lt;small&gt;Uptime: ${c.uptime}&lt;/small&gt;
            &lt;/div&gt;`;
        } else {
            card = `&lt;div style="margin-bottom:12px; padding:8px; border-radius:8px; background:${color}; width:${columnWidth}; box-sizing:border-box;"&gt;
                &lt;b&gt;${c.name}&lt;/b&gt;&lt;br&gt;
                &lt;small&gt;Status: ${statusText}${metricsLine}, Uptime: ${c.uptime}&lt;/small&gt;
            &lt;/div&gt;`;
        }
        html += card;
    }

    html += `&lt;/div&gt;&lt;/div&gt;`;
    return html;
}


</code></pre>
<p dir="auto"></p></section></section><p></p>
<p dir="auto">Edit2:<br />
Screenshot von den Objects:<br />
<img src="/assets/uploads/files/1754051929406-screenshot-2025-08-01-at-14.38.20.png" alt="Screenshot 2025-08-01 at 14.38.20.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Edit3:<br />
<s>Script um eine html Tabelle aus den States zu erzeugen, Datenpunkte und Container bitte anpassen:</s><br />
wurde alles in ein Script gepackt, ist einfacher.</p>
<p dir="auto">Screenshot: Tabelle<br />
<img src="/assets/uploads/files/1754057754138-screenshot-2025-08-01-at-16.15.07.png" alt="Screenshot 2025-08-01 at 16.15.07.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Screenshot: Mobile Ansicht, 2 Spaltig (konfigurierbar)<br />
<img src="/assets/uploads/files/1754333627983-screenshot-2025-08-04-at-20.53.06-resized.png" alt="Screenshot 2025-08-04 at 20.53.06.png" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.iobroker.net/topic/81808/script-portainer-api-v3-3-inkl-html-tabelle</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 01:03:04 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/81808.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Aug 2025 06:40:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Mon, 04 Aug 2025 18:55:03 GMT]]></title><description><![CDATA[<p dir="auto">@david-g</p>
<p dir="auto">Hi David,<br />
heute ist Montag und wie versprochen, eine neue Version, aktuell V3.3 - ist alles in ein Script gekommen und es gibt jede Menge neue Optionen, siehe Changelog :)</p>
<p dir="auto">Viel Spass damit! (aktuelles Script im ersten Beitrag)</p>
]]></description><link>https://forum.iobroker.net/post/1286876</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286876</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Mon, 04 Aug 2025 18:55:03 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 17:10:16 GMT]]></title><description><![CDATA[<p dir="auto">@david-g</p>
<p dir="auto">Control soll den Container starten / stoppen, das hat bei mir funktioniert..</p>
<p dir="auto">Ich mach spätestens am Montag weiter.. 😃</p>
<p dir="auto">Vielen Dank für das Testen!</p>
]]></description><link>https://forum.iobroker.net/post/1286411</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286411</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Fri, 01 Aug 2025 17:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 15:01:46 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a></p>
<p dir="auto">Die neue Version läuft.<br />
Top.</p>
<p dir="auto">Was ich mir wünschen würde:</p>
<ul>
<li>Discord deaktivieren zu können (hab es mir einfach unten rausgelöscht).</li>
<li>Ggf Telegram hinzufügen (natürlich auch deaktivierbar)</li>
<li>Created auch als TS (Da schaue ich, wann das letzte Update war um Container zu finden die nicht mehr gepflegt werden)</li>
</ul>
<p dir="auto">EDIT<br />
Soll control die Container updaten?<br />
Falls ja klappt es bei mir nicht.</p>
<p dir="auto">EDIT 2<br />
Wenn ich control in einem Container drücke, startet meine JS Instanz neu.</p>
]]></description><link>https://forum.iobroker.net/post/1286387</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286387</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 15:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 13:06:01 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a></p>
<p dir="auto">Die ganzen warns waren mit id 2, der Fehler beim Pharsen mit 1.</p>
<pre><code>1.8.2025, 14:43:04.923	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:43:05.015	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:43:05.037	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:43:05.045	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:43:54.160	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:43:54.208	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:43:54.230	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:43:54.239	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:43:58.696	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:44:01.907	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:44:01.913	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:44:01.918	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:44:15.888	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:44:15.978	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:44:15.986	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:44:15.994	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:45:00.067	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:46:35.734	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:46:35.824	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:46:35.844	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:46:35.851	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:52:03.359	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:52:03.450	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:52:03.474	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:52:03.481	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:52:16.268	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:52:16.358	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:52:16.377	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:52:16.395	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 14:52:29.449	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 14:52:29.537	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 14:52:29.561	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 14:52:29.570	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Kein Token erhalten
1.8.2025, 15:01:54.921	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 15:01:55.010	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 15:01:55.023	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 15:01:55.205	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.205	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:55.206	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.206	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:55.206	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.208	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:55.208	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.208	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:55.208	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.209	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:55.209	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:55.209	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:56.195	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:56.196	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.205	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.206	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.211	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.213	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.218	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.224	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.231	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.233	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.235	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.236	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.236	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.237	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.240	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.240	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:01:57.241	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:96:25
1.8.2025, 15:01:57.241	[warn ]: javascript.0 (1615949)     at script.js.Eigene_Scripte.Portainer:99:25
1.8.2025, 15:02:14.020	[info ]: javascript.0 (1615949) Stopping script script.js.Eigene_Scripte.Portainer
1.8.2025, 15:02:14.111	[info ]: javascript.0 (1615949) Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
1.8.2025, 15:02:14.130	[info ]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
1.8.2025, 15:02:14.221	[error]: javascript.0 (1615949) script.js.Eigene_Scripte.Portainer: ❌ Fehler beim Parsen der Containerdaten: containers.forEach is not a function
</code></pre>
<p dir="auto">Portainer 2.27.9</p>
<p dir="auto">Edit<br />
Evtl kann man den Endpoint automatisch ausfüllen, wenn man diesen leer lässt.</p>
<pre><code>curl -H "Authorization: Bearer &lt;JWT&gt;" \
     http://10.68.xx.zzz:9000/api/endpoints
</code></pre>
<p dir="auto">und dann den ersten falls es mehrere gibt.</p>
]]></description><link>https://forum.iobroker.net/post/1286372</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286372</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 13:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:57:53 GMT]]></title><description><![CDATA[<p dir="auto">@david-g</p>
<p dir="auto">hmm vielleicht Portainer wegen zuvielen falschen Zugriffen geblockt, war bei mir auch am Anfang, als das Script noch fehler hatte.. einfach Portainer neu starten...</p>
]]></description><link>https://forum.iobroker.net/post/1286371</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286371</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:57:53 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:53:20 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a><br />
Hab 2 getestet. Dann kommt keinen token erhalten. Dann wieder 1. Kommt jetzt auch keinen token erhalten.</p>
]]></description><link>https://forum.iobroker.net/post/1286369</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286369</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:33:21 GMT]]></title><description><![CDATA[<p dir="auto">@david-g</p>
<p dir="auto">endpointid richtig? muss nicht 1 sein,bei ist es 2</p>
]]></description><link>https://forum.iobroker.net/post/1286363</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286363</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:29:04 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a></p>
<p dir="auto">Bei mir möchte es auch nicht ganz.</p>
<pre><code>avascript.0	14:28:18.301	info	
Stopping script script.js.Eigene_Scripte.Portainer
javascript.0	14:28:18.359	info	
Start JavaScript script.js.Eigene_Scripte.Portainer (Javascript/js)
javascript.0	14:28:18.382	info	
registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
javascript.0	14:28:18.470	error	
❌ Fehler beim Parsen der Containerdaten: containers.forEach is not a function
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1286362</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286362</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:27:26 GMT]]></title><description><![CDATA[<p dir="auto">@david-g</p>
<p dir="auto">alles gut, bin gerade am erweitern / optimieren des Scripts..</p>
]]></description><link>https://forum.iobroker.net/post/1286361</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286361</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:15:14 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a></p>
<p dir="auto">Hat sich erledigt.<br />
Auch meine Nachricht.</p>
]]></description><link>https://forum.iobroker.net/post/1286352</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286352</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 12:28:13 GMT]]></title><description><![CDATA[<p dir="auto">@david-g <a class="plugin-mentions-user plugin-mentions-a" href="/user/codierknecht" aria-label="Profile: Codierknecht">@<bdi>Codierknecht</bdi></a></p>
<p dir="auto">hab mal meinen "Sheldon" :) gefragt (Chatgpt), und das kam zum schluss raus, habs noch n bisserl verfeinert, da die ersten Ansaetze nix waren..</p>
<p dir="auto">Das Script fragt direkt die Portainer-Api ab, einen Api-Key braucht man nicht und legt die Datenpunkte fuer Status, Ram, CPU und uptime im gewuenschten Ordner an.<br />
Man kann den/die Container starten/stoppen.</p>
<p dir="auto">Script in den ersten Beitrag verschoben, dieser wird immer aktualisiert.</p>
]]></description><link>https://forum.iobroker.net/post/1286347</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286347</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 07:39:59 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a></p>
<p dir="auto">Warum auch immer klappt blockly grad bei mir nicht und darf keine Variablen anlegen.....</p>
<p dir="auto">Du kannst aus der Blockly eine Liste erstellen und dann mit einer Schleife durcharbeiten.</p>
]]></description><link>https://forum.iobroker.net/post/1286261</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286261</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Fri, 01 Aug 2025 07:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to script Portainer Api V3.3 - inkl. html Tabelle on Fri, 01 Aug 2025 06:56:49 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ilovegym" aria-label="Profile: ilovegym">@<bdi>ilovegym</bdi></a> sagte in <a href="/post/1286248">script Dockermon Api</a>:</p>
<blockquote>
<p dir="auto">wie zerlege ich denn am besten das json</p>
</blockquote>
<p dir="auto">Ich mache das erstmal immer mit dem "JSON Path Finder":</p>
<p dir="auto"><img src="/assets/uploads/files/1754030944977-7244da4a-b42f-4251-bfed-087876c54f96-image.png" alt="7244da4a-b42f-4251-bfed-087876c54f96-image.png" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto">vom Dockermon-Container</p>
</blockquote>
<p dir="auto">Geht das nicht auch direkt mit dem Portainer-API?</p>
<p dir="auto"><img src="/assets/uploads/files/1754031403697-a3848f38-9e4f-4d27-95e5-b2761f89e336-image.png" alt="a3848f38-9e4f-4d27-95e5-b2761f89e336-image.png" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto">vor allem, wenn ein Container weg oder dazu kommt.. ?</p>
</blockquote>
<p dir="auto">In Zabbix geht das mit JSONPath, da kann man nach bestimmten Einträgen suchen.<br />
Geht sowas nicht auch mit JSONATA? Da ist vermutlich <a class="plugin-mentions-user plugin-mentions-a" href="/user/mickym" aria-label="Profile: mickym">@<bdi>mickym</bdi></a> der Fachmann ;-)</p>
]]></description><link>https://forum.iobroker.net/post/1286250</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286250</guid><dc:creator><![CDATA[Codierknecht]]></dc:creator><pubDate>Fri, 01 Aug 2025 06:56:49 GMT</pubDate></item></channel></rss>