<?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[Vis mit Kamerabild von Ring]]></title><description><![CDATA[<p dir="auto">Hallo,<br />
ich habe seit geraumer Zeit Probleme mein Kamerabild (gemeint ist eine Dauerschleife des letzten Events) in der Vis darzustellen.</p>
<p dir="auto">Das Problem fing an mit einem Update des Ring-Adapters vor ewiger Zeit. Nun möchte ich das nochmal angehen.</p>
<p dir="auto">Ich hatte vorher ein Blockly, dass das aktuelle Video lokal heruntergeladen hat. Dies finde ich aber nicht mehr. Wie habt ihr das gelöst (evtl. vorherige Verarbeitung des Videos, welches Widget in der Vis, Code für das Widget etc)?</p>
]]></description><link>https://forum.iobroker.net/topic/84336/vis-mit-kamerabild-von-ring</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 06:17:23 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/84336.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Apr 2026 08:40:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Tue, 28 Apr 2026 05:40:16 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/dr.-bakterius" aria-label="Profile: Dr.-Bakterius">@<bdi>Dr.-Bakterius</bdi></a><br />
Du benutzt das Bild, nicht das Video.</p>
<p dir="auto">Ich hatte es damals so, dass das Video nach einem Event in Dauerschleife abgespielt wurde.</p>
<p dir="auto">Also hatte ich ein Script, mit dem Trigger auf die Zeit des Events. Kam ein neues Event, änderte sich die Zeit. Dann hat das Script das Video lokal gespeichert und die Vis hat das lokale Video in Dauerschleife wiedergegeben.</p>
]]></description><link>https://forum.iobroker.net/post/1336799</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336799</guid><dc:creator><![CDATA[Stefan341]]></dc:creator><pubDate>Tue, 28 Apr 2026 05:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Mon, 27 Apr 2026 08:27:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/stefan341" aria-label="Profile: Stefan341">@<bdi>Stefan341</bdi></a> Ich habe das etwas umständlich gelöst weil ja etwa 30 Minuten nach dem Anläuten das Kamerabild (angeblich) immer wieder neu ist. Daher wird eine Checksum vom Bild erstellt und nur wenn die geändert wurde wird das Bild als neu erkannt. Dieses Bild wird in den VIS Ordner kopiert. Dann setze ich einen Datenpunkt für 30 Sekunden auf true. Wenn der DP 'true' ist, wird das Bild angezeigt, sonst ist es unsichtbar.</p>
<p dir="auto">In VIS habe ich ein einfaches 'basic - image' genommen und so konfiguriert:<br />
<img src="/assets/uploads/files/1777278102607-a29ed173-86fe-4b02-b742-aaec868d57aa-image.jpeg" alt="a29ed173-86fe-4b02-b742-aaec868d57aa-image.jpeg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Hier noch das JS für die Behandlung vom Bild:<br />
</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>const fs = require('fs');
const path = require('path');
const crypto = require('crypto');

const dir = '/opt/iobroker/bilder/cocoa_700536663/';

function bildHash(dateiPfad) {
   const data = fs.readFileSync(dateiPfad);
   return crypto.createHash('md5').update(data).digest('hex');
}

function writeFilePromise(adapter, dateiname, daten) {
   return new Promise((resolve, reject) =&gt; {
       writeFile(adapter, dateiname, daten, (err) =&gt; {
           if (err) reject(err);
           else resolve();
       });
   });
}

const files = fs.readdirSync(dir)
   .filter(f =&gt; f.startsWith('snapshot') &amp;&amp; f.endsWith('.jpg'))
   .map(f =&gt; ({
       name: f,
       mtime: fs.statSync(path.join(dir, f)).mtimeMs
   }))
   .sort((a, b) =&gt; b.mtime - a.mtime);

if (files.length === 0) return false;

const newestFile = path.join(dir, files[0].name);
const aktuellerHash = bildHash(newestFile);
const letzterHash = getState('0_userdata.0.Ring.letzterHash').val || '';

if (aktuellerHash === letzterHash) {
   log('Bild ist identisch – wird übersprungen', 'warn');
   return false;
}

setState('0_userdata.0.Ring.letzterHash', aktuellerHash, true);
const imageData = fs.readFileSync(newestFile);

try {
   await writeFilePromise('vis.0', 'Ring-Bild.jpg', imageData);
   log('Neues Bild gespeichert');
   setState('0_userdata.0.Ring.ringBildTimestamp', Date.now());
   return true;
} catch (err) {
   log('Fehler beim Speichern: ' + err, 'error');
   return false;
}
</code></pre>
<p dir="auto"></p></section></section><p></p>
]]></description><link>https://forum.iobroker.net/post/1336603</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336603</guid><dc:creator><![CDATA[Dr. Bakterius]]></dc:creator><pubDate>Mon, 27 Apr 2026 08:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Sun, 26 Apr 2026 11:21:14 GMT]]></title><description><![CDATA[<p dir="auto">Soweit ich mich erinnere musste man die Datei lokal speichern lassen und diese dann ausgeben.</p>
]]></description><link>https://forum.iobroker.net/post/1336457</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336457</guid><dc:creator><![CDATA[Stefan341]]></dc:creator><pubDate>Sun, 26 Apr 2026 11:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Sun, 26 Apr 2026 11:06:28 GMT]]></title><description><![CDATA[<p dir="auto">Ich hab mir nun ein Script erstellt und lasse das image mit dem Binding ausgeben.</p>
<pre><code>// Eingangs-Datenpunkt
const dpInput = 'ring.0.cocoa_72320xxxx.Snapshot.file';

// Ausgangs-Datenpunkt (dein gewünschter)
const dpOutput = '0_userdata.0.VIS-2_config.ringImagePfad';

// Datenpunkt anlegen (falls nicht vorhanden)
createState(dpOutput, '', { type: 'string', read: true, write: true });

// Trigger auf Änderungen
on({ id: dpInput, change: 'any' }, obj =&gt; {

    let val = obj.state.val;
    if (!val) return;

    // Position von "/ring" suchen
    let pos = val.indexOf('/ring');

    if (pos !== -1) {
        // neuen relativen Pfad bauen
        let neu = '..' + val.substring(pos);

        // nur schreiben wenn sich etwas geändert hat
        setStateChanged(dpOutput, neu, true);
    }
});
</code></pre>
<p dir="auto">und Binding im Image Widget</p>
<pre><code>{0_userdata.0.VIS-2_config.ringImagePfad}
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1336451</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336451</guid><dc:creator><![CDATA[australien]]></dc:creator><pubDate>Sun, 26 Apr 2026 11:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Sun, 26 Apr 2026 10:45:08 GMT]]></title><description><![CDATA[<p dir="auto">Das ist ja mein Problem. Früher ging das mit mit einem einfachen htlm-Widget. Jetzt geht es scheinbar nicht mehr.</p>
]]></description><link>https://forum.iobroker.net/post/1336445</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336445</guid><dc:creator><![CDATA[Stefan341]]></dc:creator><pubDate>Sun, 26 Apr 2026 10:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vis mit Kamerabild von Ring on Sun, 26 Apr 2026 10:25:08 GMT]]></title><description><![CDATA[<p dir="auto">wie schafst du es das Bild darzustellen? mit welchem Widget?<br />
Egal welches ich versuche und den DP ring.0.cocoa_723202349.Snapshot.file verwende kommt immer nur die Fehlermeldung 404.</p>
]]></description><link>https://forum.iobroker.net/post/1336440</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336440</guid><dc:creator><![CDATA[australien]]></dc:creator><pubDate>Sun, 26 Apr 2026 10:25:08 GMT</pubDate></item></channel></rss>