<?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[Handhabung von Socket für VIS-Alternative]]></title><description><![CDATA[<p dir="auto">Moin,<br />
ich bin gerade dabei meine eigene VIS-Alternative zu schreiben, die genau auf meine Bedürfnisse zugeschnitten ist. Bin jetzt schon so weit, dass die Website die aktuellen Zustände über <a href="http://Socket.io" rel="nofollow ugc">Socket.io</a> empfängt, visualisiert und auch vom User geänderte Zustände wieder an ioBroker überträgt. Das klappt meistens auch ganz gut, doch manchmal komme ich in eine Art Schleife, in der ein empfangener Wert gesetzt wird und zeitgleich ein geänderter Wert wieder an den Server übertragen wird. Weil das setzen eines Wertes wieder die Senden-Funktion triggert, wird dieser Wert wieder gesendet und zeitgleich wieder der vorherige Wert vom Server empfangen und gesetzt. Das führt dazu, dass z.B. der Slider im Screenshot sehr schnell zwischen diesen beiden Werten hin und her springt.</p>
<p dir="auto">Bisschen anschaulicher erklärt:<br />
1 . Server-Wert = 80 und wird empfangen<br />
1 . Zeitgleich wird Slider auf Lokal-Wert = 30 gesetzt und an den Server gesendet<br />
2 . jetzt wird der empfangene Wert (80) auf den Slider übertragen<br />
2 . Änderung des Sliders --&gt; Sende Wert 80 an Server<br />
3 . Zeitgleich wird der vorherige Wert (30) empfangen und wieder auf Slider übertragen<br />
4 . Änderung führt wieder zum Senden an Server<br />
5 . und das geht dann ewig</p>
<p dir="auto">Beide Seiten kämpfen richtig darum, ihren eigenen Wert durchzudrücken und dabei tauschen sie dann immer nur die jeweiligen Werte zyklisch aus.</p>
<p dir="auto">Bis jetzt das Grundgerüst. Wenn die Verbindung erstmal vernünftig funktioniert, ist der Rest einfach:<br />
<img src="https://forum.iobroker.net/assets/uploads/files/1586957752783-dad406d1-b0b1-4a89-88b2-199b5a857f4a-image.png" alt="Bild Text" class=" img-fluid img-markdown" /></p>
<p dir="auto">Aktueller Code.<br />
Wenn <code>servConn()</code> ein Update bekommt, werden die States emitted. Der nächste Abschnitt ist der Event Listener, der auf dieses Update hört, alle HTML Elemente mit der Klasse <code>.iobroker-state</code> sucht und je nach Typ (bis jetzt Toggle oder Slider) dann die entsprechenden Werte aus dem Array <code>States</code> setzt. Die HTML-Elemente haben noch ein Tag <code>data-id="Shelly.blabla"</code> über die ich dann die richtigen Werte aus dem Array zuordne.<br />
Der letzte Abschnitt achtet auf alle Elemente mit der Klasse <code>.iobroker-state</code> und bei einer Änderung wird wieder nach Typ unterschieden und dann mit der entsprechenden ID der neue Wert an den Server gesendet.</p>
<pre><code>var states = [];
servConn.init({
  
  onUpdate: function (id, state) {
      setTimeout(function () {
        states[id] = state;
        app.emit('smarthomeStates', states);
      }, 0);
    },
  [...]
});


// RECEIVE states and update
app.on('smarthomeStates', function (states) {
  elements = document.getElementsByClassName("iobroker-state")

  for(var i = 0; i &lt; elements.length; i++) {
    if ((elements[i].classList).contains("toggle")) {
      app.toggle.get(elements[i]).checked = states[elements[i].dataset.id]["val"];

    } else if ((elements[i].classList).contains("range-slider")) {
      app.range.get(elements[i]).setValue(states[elements[i].dataset.id]["val"]);
    }
  }
});


// TRANSMIT states on change
// erst wenn Änderung abgeschlossen wurde, also nicht kontinuierlich senden, während man den Slider noch verschiebt
$('.iobroker-state').on('touchend mouseleave', function (e) {
  if ((e.srcElement.classList).contains("toggle")) {
    var toggle = app.toggle.get(e.target);
    servConn.setState(e.srcElement.dataset.id, toggle.checked)
  
  } else if ((e.srcElement.classList).contains("range-slider")) {
    var range = app.range.get(e.target);
    servConn.setState(e.srcElement.dataset.id, range.value)
  }

});
</code></pre>
<p dir="auto">Wie wird das bei VIS gehandhabt bzw. wie kann ich verhindern, dass Client und Server sich darum prügeln, immer den aktuellen Wert an den jeweils anderen zu senden?</p>
]]></description><link>https://forum.iobroker.net/topic/32370/handhabung-von-socket-für-vis-alternative</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 20:14:03 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/32370.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Apr 2020 15:48:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Handhabung von Socket für VIS-Alternative on Mon, 03 Aug 2020 11:12:27 GMT]]></title><description><![CDATA[<p dir="auto">Moin,<br />
es ist etwas Zeit ins Land gegangen, aber nun habe ich auch wieder mehr Zeit für die Entwicklung. Die Funktion achtet jetzt auf <code>touchend mouseup keydown</code> und solange man den Schalter nicht gedrückt hält und hin und her schiebt, funktioniert das alles auch. Zusätzlich unterbreche ich den Event listener, der für das aktualisieren der Zustände verantwortlich ist, sobald man die Schalter benutzt hat. Aktueller Ablauf ist jetzt:</p>
<ul>
<li>Zustände aktualisieren, wenn der Socket <code>onUpdate()</code> auslöst</li>
<li>Wenn z.B. ein Schalter geändert wurde (<code>touchend ...</code>), dann stoppe Aktualisierung, sende neuen Zustand, starte Aktualisierung</li>
</ul>
<p dir="auto">Dieses Flackern tritt immer noch auf, doch ich denke, dass es an dem Framework liegt, das ich für die Darstellung benutze. Das hat ein paar Kinderkrankheiten und sendet unter anderem ein Event, bevor die Animation durchgelaufen ist, was schon für ordentlich Verwirrung gesorgt hat. Ich muss wohl noch ein paar Timeouts/waits einfügen, damit eine State-Änderung erst als abgeschlossen gilt, wenn die betroffenen Elemente geändert wurden und auch mit den Animationen fertig sind.</p>
<p dir="auto">Den Code von VIS habe ich mir angesehen und konnte auch ein paar Tricks finden. Auch deinen (<a class="plugin-mentions-user plugin-mentions-a" href="/user/scrounger" aria-label="Profile: Scrounger">@<bdi>Scrounger</bdi></a> ) Code für die Widgets habe ich gelesen, konnte jetzt aber nicht die Stelle finden, an der ein neuer Zustand gesendet wird.</p>
]]></description><link>https://forum.iobroker.net/post/469505</link><guid isPermaLink="true">https://forum.iobroker.net/post/469505</guid><dc:creator><![CDATA[KLVN]]></dc:creator><pubDate>Mon, 03 Aug 2020 11:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to Handhabung von Socket für VIS-Alternative on Fri, 17 Apr 2020 20:00:44 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/klvn" aria-label="Profile: KLVN">@<bdi>KLVN</bdi></a><br />
Das gezappel kenn ich von der Entwicklung der Material Design Widgets.<br />
Du musst den Slider so auslegen, dass er nur bei touchend / mouse up / key up einen Wert schreibt bzw. an iob schickt.</p>
<p dir="auto">Bzgl. handling der state change events würde ich dir empfehlen, anzuschauen wie das der VIS Adapter macht: <a href="https://github.com/ioBroker/ioBroker.vis/blob/master/www/js/vis.js" rel="nofollow ugc">https://github.com/ioBroker/ioBroker.vis/blob/master/www/js/vis.js</a></p>
]]></description><link>https://forum.iobroker.net/post/414004</link><guid isPermaLink="true">https://forum.iobroker.net/post/414004</guid><dc:creator><![CDATA[Scrounger]]></dc:creator><pubDate>Fri, 17 Apr 2020 20:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Handhabung von Socket für VIS-Alternative on Fri, 17 Apr 2020 19:46:18 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/scrounger" aria-label="Profile: Scrounger">@<bdi>Scrounger</bdi></a><br />
Danke, das behebt schon mal den unendlichen Loop. Wenn ich den Slider gedrückt halte und verschiebe, zappelt er danach noch etwas, aber pendelt sich dann auch wieder ein - das war vorher nicht der Fall. Ich bin deinem Ansatz gefolgt und ignoriere jetzt States, die von <code>system.adapter.web.0</code> oder <code>system.adapter.socketio.0</code> kommen. Damit bleiben nur noch die Adapter der eigentlichen Geräte, wie z.B. <code>system.adapter.shelly.0</code> übrig. Zusätzlich pausiere ich die Funktion, die für das Aktualisieren sorgt, wenn der Benutzer gerade ein Element ändert.<br />
Ich werde die Sache noch etwas verfeinern.</p>
]]></description><link>https://forum.iobroker.net/post/413993</link><guid isPermaLink="true">https://forum.iobroker.net/post/413993</guid><dc:creator><![CDATA[KLVN]]></dc:creator><pubDate>Fri, 17 Apr 2020 19:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Handhabung von Socket für VIS-Alternative on Fri, 17 Apr 2020 17:40:32 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/klvn" aria-label="Profile: KLVN">@<bdi>KLVN</bdi></a><br />
Ohne jetzt deinem Beispiel wirklich folgen zu können, würde ich es über die state property <code>from</code> versuchen. Diese gibt an von wem der Wert geändert wurde. D.h. wenn eine Änderung durch vis erfolgte, darfst du mit deinem Code dann nicht darauf reagieren. Kommt die Änderung z.B. vom Shelly Adapter, dann in VIS darauf reagieren.</p>
]]></description><link>https://forum.iobroker.net/post/413910</link><guid isPermaLink="true">https://forum.iobroker.net/post/413910</guid><dc:creator><![CDATA[Scrounger]]></dc:creator><pubDate>Fri, 17 Apr 2020 17:40:32 GMT</pubDate></item></channel></rss>