<?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[ioBroker Forum Widget – Forum-Daten direkt in Visu]]></title><description><![CDATA[<p dir="auto">Ich wollte euch kurz ein kleines JS vorstellen was ich gestern Abend mehr oder weniger aus Langeweile mit Claude geschrieben habe.</p>
<p dir="auto">Es ruft die "Wichtigsten" Infos aus diesem Forum ab und schreibt diese in DPs, zusätzliche wird noch ein konfigurierbares Widget erstellt.</p>
<p dir="auto">Das Widget zeigt:</p>
<ul>
<li>Eigene Benachrichtigungen (ungelesen/gelesen)</li>
<li>Ungelesene Topics mit Kategorie, Postanzahl und Autor</li>
<li>Eigene letzten Topics &amp; Posts der letzten X Tage</li>
<li>Neueste Forum-Topics</li>
<li>Forum-Stats (Online-User, Themen, Beiträge)</li>
</ul>
<p dir="auto">Alles als einzelne DPs verfügbar – nicht nur das Widget</p>
<p dir="auto"><img src="/assets/uploads/files/1778394245152-1000070142.jpg" alt="1000070142.jpg" class=" img-fluid img-markdown" /></p>
<pre><code>// ═══════════════════════════════════════════════════════════════
//  ioBroker Forum Widget
//  Autor:   David G. (David G.)
//  Version: 1.0.1
//  Forum:   https://forum.iobroker.net/topic/84513/iobroker-forum-widget-forum-daten-direkt-in-visu
//
//  Zeigt Forum-Daten als Datenpunkte und HTML-Widget an:
//  Benachrichtigungen, ungelesene Topics, eigene Posts &amp; Topics,
//  neueste Topics und Forum-Stats.
// ═══════════════════════════════════════════════════════════════

// ── Zugangsdaten ──────────────────────────────────────────────
const FORUM_URL          = 'https://forum.iobroker.net';
const USERNAME           = 'deine@email.de';
const PASSWORD           = 'deinPasswort';
const SIMPLE_API         = 'http://192.168.99.33:8087';

// ── Datenpunkte ───────────────────────────────────────────────
const BASE_DP            = '0_userdata.0.forum.iobroker.';

// ── Intervall &amp; Limits ────────────────────────────────────────
const INTERVAL_MIN       = 15;
const OWN_POST_DAYS      = 7;
const OWN_POSTS_MAX      = 10;
const OWN_TOPICS_MAX     = 5;
const LATEST_TOPICS_MAX  = 20;
const UNREAD_MAX         = 20;
const NOTIFICATIONS_MAX  = 10;

// ── Sektionen ein/ausblenden ──────────────────────────────────
const SHOW_STATS         = true;
const SHOW_NOTIFICATIONS = true;
const SHOW_UNREAD        = true;
const SHOW_OWN_TOPICS    = true;
const SHOW_OWN_POSTS     = true;
const SHOW_LATEST        = true;

// ── Widget Design ─────────────────────────────────────────────
const BG_COLOR           = '#1e1e2e';
const BG_OPACITY         = 1.0;
const TEXT_COLOR         = '#ccc';
const LINK_COLOR         = '#cdd6f4';
const ACCENT_COLOR       = '#89b4fa';
const BADGE_BG           = '#f38ba8';
const BADGE_TEXT         = '#1e1e2e';
const STATS_COLOR        = '#a6e3a1';
const MUTED_COLOR        = '#6c7086';
const DIVIDER_COLOR      = '#313244';

// ═══════════════════════════════════════════════════════════════

const axios = require('axios');
var cookieJar = '';
var csrfToken = '';

function extractCookies(arr) {
    if (!arr) return '';
    return arr.map(function(c) { return c.split(';')[0]; }).join('; ');
}

function stripHtml(str) {
    return (str || '').replace(/&lt;[^&gt;]*&gt;/g, '')
        .replace(/&amp;lt;/g,'&lt;').replace(/&amp;gt;/g,'&gt;')
        .replace(/&amp;amp;/g,'&amp;').replace(/&amp;#x27;/g,"'");
}

function dp(path) { return BASE_DP + path; }

function hexToRgba(hex, opacity) {
    var r = parseInt(hex.slice(1,3), 16);
    var g = parseInt(hex.slice(3,5), 16);
    var b = parseInt(hex.slice(5,7), 16);
    return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';
}

function apiGet(path, callback, retry) {
    axios.get(FORUM_URL + path, {
        headers: { Cookie: cookieJar },
        validateStatus: function(s) { return s &lt; 500; }
    })
    .then(function(res) {
        if (res.status === 401 &amp;&amp; !retry) {
            log('Session abgelaufen – logge neu ein... (' + path + ')');
            login(function() { apiGet(path, callback, true); });
            return;
        }
        try { callback(res.data); }
        catch(e) { log('Callback Fehler ' + path + ': ' + e, 'error'); }
    })
    .catch(function(err) { log('GET Fehler ' + path + ': ' + err, 'error'); });
}

function extractStats(data) {
    var stats = { online: '?', topics: '?', posts: '?' };
    try {
        var footer = data.widgets.footer[0].html;
        var vals = footer.match(/title="([^"]+)"&gt;/g) || [];
        if (vals[0]) stats.online = vals[0].replace('title="','').replace('"&gt;','');
        if (vals[2]) stats.topics = vals[2].replace('title="','').replace('"&gt;','');
        if (vals[3]) stats.posts  = vals[3].replace('title="','').replace('"&gt;','');
    } catch(e) {}
    return stats;
}

function createDPs(callback) {
    var dps = [
        { id: 'info.connected',            val: false,  type: 'boolean', role: 'indicator', write: false },
        { id: 'info.lastUpdate',           val: '',     type: 'string',  role: 'text',       write: false },
        { id: 'info.lastError',            val: '',     type: 'string',  role: 'text',       write: false },
        { id: 'info.username',             val: '',     type: 'string',  role: 'text',       write: false },
        { id: 'stats.online',              val: '?',    type: 'string',  role: 'text',       write: false },
        { id: 'stats.topics',              val: '?',    type: 'string',  role: 'text',       write: false },
        { id: 'stats.posts',               val: '?',    type: 'string',  role: 'text',       write: false },
        { id: 'topics.latest',             val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'unread.count',              val: 0,      type: 'number',  role: 'value',      write: false },
        { id: 'unread.list',               val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'notifications.unreadCount', val: 0,      type: 'number',  role: 'value',      write: false },
        { id: 'notifications.unreadList',  val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'notifications.list',        val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'ownPosts.list',             val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'ownTopics.list',            val: '[]',   type: 'string',  role: 'json',       write: false },
        { id: 'cmd.reload',                val: false,  type: 'boolean', role: 'button',     write: true  },
        { id: 'widget.html',               val: '',     type: 'string',  role: 'html',       write: false }
    ];

    var done = 0;
    dps.forEach(function(d) {
        createState(dp(d.id), d.val, {
            name: d.id, type: d.type, role: d.role, read: true, write: d.write
        }, function() {
            done++;
            if (done &gt;= dps.length) callback();
        });
    });
}

function buildHtml(topics, unread, unreadTotal, notifs, stats, ownPosts, ownTopics, user) {
    var unreadNotifs    = notifs.filter(function(n) { return !n.read; }).slice(0, NOTIFICATIONS_MAX);
    var unreadSliced    = unread.slice(0, UNREAD_MAX);
    var topicsSliced    = topics.slice(0, LATEST_TOPICS_MAX);
    var ownPostsSliced  = ownPosts.slice(0, OWN_POSTS_MAX);
    var ownTopicsSliced = ownTopics.slice(0, OWN_TOPICS_MAX);
    var updated         = new Date().toLocaleString('de-DE');
    var apiBase         = SIMPLE_API + '/set/' + BASE_DP;

    var css = '&lt;style&gt;'
        + '.nb{font-family:sans-serif;font-size:13px;color:' + TEXT_COLOR + ';background:' + hexToRgba(BG_COLOR, BG_OPACITY) + ';border-radius:12px;padding:12px;box-sizing:border-box}'
        + '.nb .hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}'
        + '.nb h2{margin:0;font-size:15px;color:' + TEXT_COLOR + '}'
        + '.nb .reload{background:transparent;border:1px solid ' + DIVIDER_COLOR + ';color:' + MUTED_COLOR + ';border-radius:6px;padding:2px 8px;cursor:pointer;font-size:11px;}'
        + '.nb .reload:hover{color:' + TEXT_COLOR + ';border-color:' + ACCENT_COLOR + '}'
        + '.nb .usr{font-size:11px;color:' + ACCENT_COLOR + ';margin-bottom:2px}'
        + '.nb .upd{font-size:11px;color:' + MUTED_COLOR + ';margin-bottom:10px}'
        + '.nb .sec{margin-bottom:12px}'
        + '.nb .sec-hd{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid ' + DIVIDER_COLOR + ';padding-bottom:3px;margin-bottom:5px}'
        + '.nb .sec-t{font-size:11px;font-weight:bold;color:' + ACCENT_COLOR + ';text-transform:uppercase;letter-spacing:1px}'
        + '.nb table{width:100%;border-collapse:collapse}'
        + '.nb td{padding:4px;border-bottom:1px solid ' + DIVIDER_COLOR + ';vertical-align:top;font-size:12px}'
        + '.nb .num{text-align:center;color:' + MUTED_COLOR + ';white-space:nowrap}'
        + '.nb .cat{font-size:10px;color:' + MUTED_COLOR + ';display:block}'
        + '.nb a{color:' + LINK_COLOR + ';text-decoration:none}'
        + '.nb .nf{padding:4px 0;border-bottom:1px solid ' + DIVIDER_COLOR + ';font-size:12px;color:' + TEXT_COLOR + '}'
        + '.nb .badge{background:' + BADGE_BG + ';color:' + BADGE_TEXT + ';font-size:10px;font-weight:bold;padding:1px 5px;border-radius:8px;margin-right:4px;white-space:nowrap}'
        + '.nb .stats{display:flex;gap:8px;flex-wrap:wrap}'
        + '.nb .stat{background:' + hexToRgba(DIVIDER_COLOR, 1) + ';border-radius:8px;padding:8px;flex:1;text-align:center}'
        + '.nb .sv{font-size:16px;font-weight:bold;color:' + STATS_COLOR + '}'
        + '.nb .sl{font-size:10px;color:' + MUTED_COLOR + '}'
        + '&lt;/style&gt;';

    var statsHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Stats&lt;/span&gt;&lt;/div&gt;&lt;div class="stats"&gt;'
        + '&lt;div class="stat"&gt;&lt;div class="sv"&gt;' + stats.online + '&lt;/div&gt;&lt;div class="sl"&gt;Online&lt;/div&gt;&lt;/div&gt;'
        + '&lt;div class="stat"&gt;&lt;div class="sv"&gt;' + stats.topics + '&lt;/div&gt;&lt;div class="sl"&gt;Themen&lt;/div&gt;&lt;/div&gt;'
        + '&lt;div class="stat"&gt;&lt;div class="sv"&gt;' + stats.posts  + '&lt;/div&gt;&lt;div class="sl"&gt;Beitraege&lt;/div&gt;&lt;/div&gt;'
        + '&lt;div class="stat"&gt;&lt;div class="sv"&gt;' + unreadNotifs.length + '&lt;/div&gt;&lt;div class="sl"&gt;Neue Notifs&lt;/div&gt;&lt;/div&gt;'
        + '&lt;/div&gt;&lt;/div&gt;';

    var notifHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Benachrichtigungen (' + unreadNotifs.length + ')&lt;/span&gt;&lt;/div&gt;';
    if (unreadNotifs.length &gt; 0) {
        unreadNotifs.forEach(function(n) {
            notifHtml += '&lt;div class="nf"&gt;&lt;span class="badge"&gt;NEU&lt;/span&gt;' + stripHtml(n.bodyShort) + '&lt;/div&gt;';
        });
    } else {
        notifHtml += '&lt;div style="font-size:12px;color:' + MUTED_COLOR + ';padding:4px 0;"&gt;Keine ungelesenen&lt;/div&gt;';
    }
    notifHtml += '&lt;/div&gt;';

    var unreadHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Ungelesen (zeige ' + unreadSliced.length + ' von ' + unreadTotal + ')&lt;/span&gt;&lt;/div&gt;'
        + '&lt;table&gt;&lt;tr style="font-size:10px;color:' + MUTED_COLOR + '"&gt;&lt;td&gt;Titel&lt;/td&gt;&lt;td class="num"&gt;Posts&lt;/td&gt;&lt;td class="num"&gt;Von&lt;/td&gt;&lt;/tr&gt;';
    unreadSliced.forEach(function(t) {
        unreadHtml += '&lt;tr&gt;&lt;td&gt;'
            + '&lt;span class="cat"&gt;' + stripHtml(t.category.name) + '&lt;/span&gt;'
            + '&lt;a href="' + FORUM_URL + '/topic/' + t.slug + '" target="_blank"&gt;' + stripHtml(t.title) + '&lt;/a&gt;'
            + '&lt;/td&gt;&lt;td class="num"&gt;' + t.postcount
            + '&lt;/td&gt;&lt;td class="num"&gt;' + stripHtml(t.user.username) + '&lt;/td&gt;&lt;/tr&gt;';
    });
    unreadHtml += '&lt;/table&gt;&lt;/div&gt;';

    var ownTopicsHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Meine letzten ' + OWN_TOPICS_MAX + ' Topics (' + ownTopicsSliced.length + ')&lt;/span&gt;&lt;/div&gt;';
    if (ownTopicsSliced.length &gt; 0) {
        ownTopicsHtml += '&lt;table&gt;&lt;tr style="font-size:10px;color:' + MUTED_COLOR + '"&gt;&lt;td&gt;Titel&lt;/td&gt;&lt;td class="num"&gt;Posts&lt;/td&gt;&lt;/tr&gt;';
        ownTopicsSliced.forEach(function(t) {
            ownTopicsHtml += '&lt;tr&gt;&lt;td&gt;'
                + '&lt;span class="cat"&gt;' + stripHtml(t.category ? t.category.name : '') + '&lt;/span&gt;'
                + '&lt;a href="' + FORUM_URL + '/topic/' + t.slug + '" target="_blank"&gt;' + stripHtml(t.title) + '&lt;/a&gt;'
                + '&lt;/td&gt;&lt;td class="num"&gt;' + t.postcount + '&lt;/td&gt;&lt;/tr&gt;';
        });
        ownTopicsHtml += '&lt;/table&gt;';
    } else {
        ownTopicsHtml += '&lt;div style="font-size:12px;color:' + MUTED_COLOR + ';padding:4px 0;"&gt;Keine eigenen Topics&lt;/div&gt;';
    }
    ownTopicsHtml += '&lt;/div&gt;';

    var ownPostsHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Meine letzten ' + OWN_POSTS_MAX + ' Posts - letzte ' + OWN_POST_DAYS + ' Tage (' + ownPostsSliced.length + ')&lt;/span&gt;&lt;/div&gt;';
    if (ownPostsSliced.length &gt; 0) {
        ownPostsHtml += '&lt;table&gt;&lt;tr style="font-size:10px;color:' + MUTED_COLOR + '"&gt;&lt;td&gt;Inhalt&lt;/td&gt;&lt;/tr&gt;';
        ownPostsSliced.forEach(function(p) {
            var date = new Date(p.timestamp).toLocaleString('de-DE');
            ownPostsHtml += '&lt;tr&gt;&lt;td&gt;'
                + '&lt;span class="cat"&gt;' + date + ' · ' + stripHtml(p.topic ? p.topic.title : '') + '&lt;/span&gt;'
                + '&lt;a href="' + FORUM_URL + '/post/' + p.pid + '" target="_blank"&gt;' + stripHtml(p.content).substring(0, 80) + '...&lt;/a&gt;'
                + '&lt;/td&gt;&lt;/tr&gt;';
        });
        ownPostsHtml += '&lt;/table&gt;';
    } else {
        ownPostsHtml += '&lt;div style="font-size:12px;color:' + MUTED_COLOR + ';padding:4px 0;"&gt;Keine eigenen Posts in diesem Zeitraum&lt;/div&gt;';
    }
    ownPostsHtml += '&lt;/div&gt;';

    var topicsHtml = '&lt;div class="sec"&gt;&lt;div class="sec-hd"&gt;&lt;span class="sec-t"&gt;Neueste ' + LATEST_TOPICS_MAX + ' Topics&lt;/span&gt;&lt;/div&gt;&lt;table&gt;'
        + '&lt;tr style="font-size:10px;color:' + MUTED_COLOR + '"&gt;&lt;td&gt;Titel&lt;/td&gt;&lt;td class="num"&gt;Posts&lt;/td&gt;&lt;td class="num"&gt;Von&lt;/td&gt;&lt;/tr&gt;';
    topicsSliced.forEach(function(t) {
        topicsHtml += '&lt;tr&gt;&lt;td&gt;'
            + '&lt;span class="cat"&gt;' + stripHtml(t.category.name) + '&lt;/span&gt;'
            + '&lt;a href="' + FORUM_URL + '/topic/' + t.slug + '" target="_blank"&gt;' + stripHtml(t.title) + '&lt;/a&gt;'
            + '&lt;/td&gt;&lt;td class="num"&gt;' + t.postcount
            + '&lt;/td&gt;&lt;td class="num"&gt;' + stripHtml(t.user.username) + '&lt;/td&gt;&lt;/tr&gt;';
    });
    topicsHtml += '&lt;/table&gt;&lt;/div&gt;';

    var userLine = user ? ('&lt;div class="usr"&gt;Eingeloggt als ' + user.username + '&lt;/div&gt;') : '';

    return css
        + '&lt;div class="nb"&gt;'
        + '&lt;div class="hd"&gt;'
        + '&lt;h2&gt;ioBroker Forum&lt;/h2&gt;'
        + '&lt;button class="reload" onclick="fetch(\'' + apiBase + 'cmd.reload?value=true\',{mode:\'no-cors\'})"&gt;Reload&lt;/button&gt;'
        + '&lt;/div&gt;'
        + userLine
        + '&lt;div class="upd"&gt;Stand: ' + updated + ' · alle ' + INTERVAL_MIN + ' Min.&lt;/div&gt;'
        + (SHOW_STATS         ? statsHtml      : '')
        + (SHOW_NOTIFICATIONS ? notifHtml      : '')
        + (SHOW_UNREAD        ? unreadHtml     : '')
        + (SHOW_OWN_TOPICS    ? ownTopicsHtml  : '')
        + (SHOW_OWN_POSTS     ? ownPostsHtml   : '')
        + (SHOW_LATEST        ? topicsHtml     : '')
        + '&lt;/div&gt;';
}

function setAllDPs(results) {
    var now          = new Date().toLocaleString('de-DE');
    var notifs       = results.notifs   || [];
    var unreadNotifs = notifs.filter(function(n) { return !n.read; });
    var stats        = results.stats    || {};
    var user         = results.user     || {};

    setState(dp('info.connected'),            true,                                    true);
    setState(dp('info.lastUpdate'),           now,                                     true);
    setState(dp('info.username'),             user.username || '',                     true);
    setState(dp('stats.online'),              stats.online  || '?',                   true);
    setState(dp('stats.topics'),              stats.topics  || '?',                   true);
    setState(dp('stats.posts'),               stats.posts   || '?',                   true);
    setState(dp('topics.latest'),             JSON.stringify(results.topics   || []),  true);
    setState(dp('unread.count'),              results.unreadTotal || 0,                true);
    setState(dp('unread.list'),               JSON.stringify(results.unread   || []),  true);
    setState(dp('notifications.unreadCount'), unreadNotifs.length,                     true);
    setState(dp('notifications.unreadList'),  JSON.stringify(unreadNotifs),            true);
    setState(dp('notifications.list'),        JSON.stringify(notifs),                  true);
    setState(dp('ownPosts.list'),             JSON.stringify(results.ownPosts  || []), true);
    setState(dp('ownTopics.list'),            JSON.stringify(results.ownTopics || []), true);
    setState(dp('widget.html'), buildHtml(
        results.topics    || [],
        results.unread    || [],
        results.unreadTotal || 0,
        notifs,
        stats,
        results.ownPosts  || [],
        results.ownTopics || [],
        user
    ), true);

    log('Alle DPs aktualisiert: ' + now);
}

function loadData() {
    var results = {};
    var done    = 0;
    var total   = 6;
    var since   = Date.now() - (OWN_POST_DAYS * 24 * 60 * 60 * 1000);

    function check() {
        done++;
        if (done &gt;= total) setAllDPs(results);
    }

    apiGet('/api/recent',        function(d) { results.topics = d.topics        || []; check(); });
    apiGet('/api/notifications', function(d) { results.notifs = d.notifications || []; check(); });
    apiGet('/api/',              function(d) { results.stats  = extractStats(d);        check(); });

    apiGet('/api/unread', function(d) {
        results.unread      = d.topics     || [];
        results.unreadTotal = d.topicCount || results.unread.length;
        if (d.loggedInUser) {
            results.user = {
                uid:      d.loggedInUser.uid,
                username: d.loggedInUser.username,
                userslug: d.loggedInUser.userslug
            };

            apiGet('/api/user/' + results.user.userslug + '/posts', function(p) {
                results.ownPosts = (p.posts || []).filter(function(post) {
                    return post.timestamp &gt;= since;
                });
                check();
            });

            apiGet('/api/user/' + results.user.userslug + '/topics', function(t) {
                results.ownTopics = (t.topics || []).slice(0, OWN_TOPICS_MAX);
                check();
            });

        } else {
            results.ownPosts  = [];
            results.ownTopics = [];
            check();
            check();
        }
        check();
    });
}

function login(callback) {
    axios.get(FORUM_URL + '/api/config')
        .then(function(res) {
            csrfToken = res.data.csrf_token;
            cookieJar = extractCookies(res.headers['set-cookie']);
            return axios.post(FORUM_URL + '/login',
                { username: USERNAME, password: PASSWORD },
                { headers: {
                    'x-csrf-token': csrfToken,
                    'Content-Type': 'application/json',
                    'Cookie': cookieJar
                }, maxRedirects: 0, validateStatus: function(s) { return s &lt; 500; } }
            );
        })
        .then(function(res) {
            var newCookies = extractCookies(res.headers['set-cookie']);
            if (newCookies) cookieJar = newCookies;
            if (res.data &amp;&amp; res.data.next) {
                log('Eingeloggt');
                if (callback) callback();
            } else {
                log('Login fehlgeschlagen: ' + JSON.stringify(res.data), 'error');
                setState(dp('info.connected'), false, true);
                setState(dp('info.lastError'), 'Login fehlgeschlagen', true);
            }
        })
        .catch(function(err) {
            log('Login Fehler: ' + err, 'error');
            setState(dp('info.connected'), false, true);
            setState(dp('info.lastError'), err.toString(), true);
        });
}

createDPs(function() {
    on({id: dp('cmd.reload'), ack: false}, function(obj) {
        if (!obj.state.val) return;
        log('Manueller Reload...');
        setState(dp('cmd.reload'), false, true);
        loadData();
    });

    login(function() {
        loadData();
        setInterval(function() {
            loadData();
        }, INTERVAL_MIN * 60 * 1000);
    });
});
</code></pre>
<p dir="auto">Die SimpleApi wird für den Button zum Aktualisieren des Widgets benötigt. Auf den Weg klappt es in jeder Visualisierung. Muss man nicjt korrekt ausfüllen, dann klappt nur der reload Button nicht.</p>
<p dir="auto">Falls jemand weiß, wie ich Daten senden kann, darf er das gerne schreiben. Mir scheint, als ob es über API und <a href="http://Socket.io" rel="nofollow ugc">Socket.io</a> deaktiviert ist. Im Forum.<br />
Wollte eigentlich noch machen, dass man die Benachrichtigungen löschen kann über das Widget.</p>
]]></description><link>https://forum.iobroker.net/topic/84513/iobroker-forum-widget-forum-daten-direkt-in-visu</link><generator>RSS for Node</generator><lastBuildDate>Wed, 13 May 2026 08:10:48 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/84513.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 10 May 2026 06:30:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 09:53:47 GMT]]></title><description><![CDATA[<p dir="auto">die Ki's sind eine Minderheit und sollten nicht diskriminiert werden 😀😎 - denkt an cyberdyne systems..</p>
]]></description><link>https://forum.iobroker.net/post/1338891</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338891</guid><dc:creator><![CDATA[ilovegym]]></dc:creator><pubDate>Sun, 10 May 2026 09:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 07:15:09 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/homoran" aria-label="Profile: homoran">@<bdi>homoran</bdi></a> <a class="plugin-mentions-user plugin-mentions-a" href="/user/mcm1957" aria-label="Profile: mcm1957">@<bdi>mcm1957</bdi></a><br />
Da bin ich ganz bei euch beiden.<br />
Sicherheit geht vor, und KI soll hier definitiv nicht selber im Forum tippen.</p>
<p dir="auto">Hab es eben probiert weil es ein schönes "Upgrade" in Widget gewesen wäre ^^.</p>
]]></description><link>https://forum.iobroker.net/post/1338874</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338874</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Sun, 10 May 2026 07:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 07:10:04 GMT]]></title><description><![CDATA[<p dir="auto">Außerdem schadet es nichts wenn Postings manuell getippt werden müssen. Claude und Co können und sollen einen Menschen als Frontend benutzen :-)</p>
]]></description><link>https://forum.iobroker.net/post/1338872</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338872</guid><dc:creator><![CDATA[mcm1957]]></dc:creator><pubDate>Sun, 10 May 2026 07:10:04 GMT</pubDate></item><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 07:12:42 GMT]]></title><description><![CDATA[<p dir="auto">@David-G. Read more... ;-)</p>
<blockquote>
<p dir="auto">As of NodeBB v1.15.0, this plugin is deprecated</p>
</blockquote>
<p dir="auto">Ist aber auch eine Frage der Sicherheit.<br />
Wir haben genug mit den bisherigen ungewünschten Aktionen zu tun.</p>
]]></description><link>https://forum.iobroker.net/post/1338871</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338871</guid><dc:creator><![CDATA[Homoran]]></dc:creator><pubDate>Sun, 10 May 2026 07:12:42 GMT</pubDate></item><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 06:57:07 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/homoran" aria-label="Profile: Homoran">@<bdi>Homoran</bdi></a><br />
<a href="https://github.com/NodeBB/nodebb-plugin-write-api" rel="nofollow ugc">https://github.com/NodeBB/nodebb-plugin-write-api</a></p>
]]></description><link>https://forum.iobroker.net/post/1338870</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338870</guid><dc:creator><![CDATA[David G.]]></dc:creator><pubDate>Sun, 10 May 2026 06:57:07 GMT</pubDate></item><item><title><![CDATA[Reply to ioBroker Forum Widget – Forum-Daten direkt in Visu on Sun, 10 May 2026 06:38:33 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto">@David-G. <a href="/post/1338866">sagte</a>:</p>
<p dir="auto">wie ich Daten senden kann</p>
</blockquote>
<p dir="auto">Das ist eine<br />
<img src="/assets/uploads/files/1778395096184-773.jpg" alt="773.jpg" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.iobroker.net/post/1338868</link><guid isPermaLink="true">https://forum.iobroker.net/post/1338868</guid><dc:creator><![CDATA[Homoran]]></dc:creator><pubDate>Sun, 10 May 2026 06:38:33 GMT</pubDate></item></channel></rss>