<?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 mit Warema WMS Web Control]]></title><description><![CDATA[<p dir="auto">Hallo beisammen,</p>
<p dir="auto">ich bin neu hier und wollte mich erkundigen, ob es möglich ist, das Warema WMS Web Control mit dem iBroker zu verknüpfen, um dann damit per Alexa Sprachsteuerung die Rollos hoch und runter fahren zu können.</p>
<p dir="auto">Hier mal der Link zu Warema: (das soll mal verbaut werden, also Funkaktoren an jedem Rolloschalter +Gateway für webcontrol)</p>
<p dir="auto"><a href="https://www.warema.de/Produkte/Steuerungssysteme/Funksysteme/WMS_WebControl.php" rel="nofollow ugc">https://www.warema.de/Produkte/Steuerun … ontrol.php</a></p>
<p dir="auto">Da wir gerade beim Hausbau sind und die Alexa bereits in der Wohnung eingezogen ist, möchte ich diese natürlich auch für die zukünftigen elektrischen Rollos verwenden. Hier kommt eben das Warema WMS Web Control ins Spiel, das ganze verbaut der Schwiegervater, somit habe nicht viel Mitspracherecht was verbaut wird, da er das gleiche System zu Hause hat (nur eben nur per App Bedienung).... Leider habe ich im Forum, sowie im WWW nichts gefunden, was mich weitergebracht hätte. Das einzige was ich derzeit gefunden habe, ist die Verknüpfung mit dem Mediola AIO GATEWAY, wovon ich aufgrund der Gebühren jetzt so nicht begeistert bin.</p>
<p dir="auto">Leider bin ich mit dem Thema Ibroker noch nicht wirklich vertraut, also bitte verzeiht mir eventuelle dumme Fragen ;)</p>
<p dir="auto">Danke schon mal!</p>
]]></description><link>https://forum.iobroker.net/topic/7336/iobroker-mit-warema-wms-web-control</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 03:01:52 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/7336.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Aug 2017 14:09:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Mon, 25 Aug 2025 10:49:58 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: Marc-Berg">@<bdi>Marc-Berg</bdi></a></p>
<p dir="auto">Noch eine Änderung des "weatherBroadcast"  für meinen batteriebetrieben Temperatursensor "65".</p>
<pre><code>       case '7080':
            msgType = 'weatherBroadcast';
            params.unknown_1 = payload.substr(0, 2);
            params.wind = parseInt(payload.substr(2, 2), 16) / 2;                  // 2025-06-28 PatrickR68 added / 2
            params.lumen = payload.substr(4, 2) === '00' ? parseInt(payload.substr(12, 2), 16) * 2 : parseInt(payload.substr(4, 2), 16) * parseInt(payload.substr(12, 2), 16) * 2;
            params.unknown_2 = payload.substr(6, 6);
            params.batt = parseInt(payload.substr(14, 2), 16) / 2;                // 2025-08-24 PatrickR68 0.99.111 Battery in V 
            params.rain = payload.substr(16, 2) === 'C8';
            params.temp = parseInt(payload.substr(18, 2), 16) / 2 - 40;           // 2025-07-02 PatrickR68 changed 35-&gt;40 (range -40..87,5)
            params.temp_in = parseInt(payload.substr(20, 2), 16) / 2 - 40;        // 2025-08-24 PatrickR68 0.99.111 indoor °C
            params.unknown_4 = payload.substr(22,4);
            params.humidity = parseInt(payload.substr(26, 2), 16) / 2;            // 2025-08-24 PatrickR68 0.99.111 Humidity in % 
            params.unknown_5 = payload.substr(28,34);
            params.temp_target_in = parseInt(payload.substr(62, 2), 16) / 2 - 40; // 2025-08-24 PatrickR68 0.99.111 indoor target °C
            params.unknown_6 = payload.substr(64,2);                              // 2025-08-24 PatrickR68 0.99.111 
            break;
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1290899</link><guid isPermaLink="true">https://forum.iobroker.net/post/1290899</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Mon, 25 Aug 2025 10:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Sat, 09 Aug 2025 10:52:52 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a><br />
ich hab noch für mich eine Anpassung bzgl. Polling gemacht.<br />
Wenn ein neues Weather broadcast empfangen wird, wird der<br />
der Intervall-Zähler für "Weather polling function" retriggert.</p>
<p dir="auto">///////////// index.js : Info</p>
<p dir="auto">//Neu: Info<br />
let weatherInterval;</p>
<p dir="auto">//Neu: Info<br />
function retriggerWeatherPolling() {<br />
if (weatherInterval) {<br />
clearInterval(weatherInterval);<br />
}<br />
weatherInterval = setInterval(pollWeatherData, pollingInterval);<br />
log.fkt_log_info('046:Restarted weather data polling every ' + pollingInterval + ' ms');<br />
}</p>
<p dir="auto">//Änderung : Info<br />
// Start weather polling with configurable interval<br />
weatherInterval = setInterval(pollWeatherData, pollingInterval);<br />
log.fkt_log_info('045:Started weather data polling every ' + pollingInterval + ' ms');</p>
<p dir="auto">//Neu: Info<br />
//function callback(err, msg)<br />
/////case 'wms-vb-rcv-weather-broadcast':<br />
///////if (!cachedWeather || cachedWeather.hash !== weatherHash || (currentTime - cachedWeather.timestamp) &gt; minTimeDiff) {<br />
/////////if (typeof client !== 'undefined' &amp;&amp; client.connected) {<br />
retriggerWeatherPolling();</p>
<p dir="auto">Gruß<br />
Patrick</p>
]]></description><link>https://forum.iobroker.net/post/1287467</link><guid isPermaLink="true">https://forum.iobroker.net/post/1287467</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Sat, 09 Aug 2025 10:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 05 Aug 2025 20:13:30 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/patrickr" aria-label="Profile: patrickr">@<bdi>patrickr</bdi></a> sagte in <a href="/post/1287047">IoBroker mit Warema WMS Web Control</a>:</p>
<blockquote>
<p dir="auto">Wo noch ein allgemeines Problem liegt, ist bei den Jalousien, der maximale Winkel welcher wie in meinem Fall auf 80° steht.<br />
Und bei der Umrechnung in % muss ich genau diesen maximal Wert als 100% hernehmen, ansonsten verwende ich einen falschen Wert.</p>
</blockquote>
<p dir="auto">Da ich keine Jalousien von Warema besitze, kann ich das nicht nachstellen.</p>
<blockquote>
<p dir="auto">Es gibt bestimmt eine Botschaft um im WMS-Mesh-System die Geräte auf "Abwesend" zu setzen.<br />
Ist Dir da etwas bekannt?</p>
</blockquote>
<p dir="auto">Nein, keine Ahnung.</p>
]]></description><link>https://forum.iobroker.net/post/1287067</link><guid isPermaLink="true">https://forum.iobroker.net/post/1287067</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 05 Aug 2025 20:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 05 Aug 2025 19:09:40 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a> sagte in <a href="/post/1287023">IoBroker mit Warema WMS Web Control</a>:<br />
Wo noch ein allgemeines Problem liegt, ist bei den Jalousien, der maximale Winkel welcher wie in meinem Fall auf 80° steht.</p>
<p dir="auto">Und bei der Umrechnung in % muss ich genau diesen maximal Wert als 100% hernehmen, ansonsten verwende ich einen falschen Wert.</p>
<p dir="auto">So ging es mir anfänglich.</p>
<p dir="auto">Da dieser Maximalwert für jeden Actuator unterschiedlich sein kann,<br />
gibt es für unterschiedliche Werte auch unterschiedliche Winkelwerte die 100% bedeuten.</p>
<p dir="auto">Man müßte eigentlich für jeden Actuator den maxWert als Berechnungsbasis ablegen und diesen in der Konfiguration übergeben (alles machbar aber mit Aufwand).</p>
<p dir="auto">Was anderes noch.<br />
Es gibt bestimmt eine Botschaft um im WMS-Mesh-System die Geräte auf "Abwesend" zu setzen.<br />
Ist Dir da etwas bekannt?</p>
<p dir="auto">Danke.<br />
Patrick</p>
]]></description><link>https://forum.iobroker.net/post/1287047</link><guid isPermaLink="true">https://forum.iobroker.net/post/1287047</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Tue, 05 Aug 2025 19:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 05 Aug 2025 17:05:26 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/patrickr" aria-label="Profile: patrickr">@<bdi>patrickr</bdi></a> sagte in <a href="/post/1286998">IoBroker mit Warema WMS Web Control</a>:</p>
<blockquote>
<p dir="auto">Das wäre bei Dir<br />
wms2mqtt/warema-bridge/srv/warema-wms-venetian-blinds/wms-util.js<br />
Zeile 272<br />
params.temp = parseInt(payload.substr(18, 2), 16) / 2 - 35;</p>
<p dir="auto">Ich muß 40 abziehen, um die korrekten Werte zu erhalten.</p>
</blockquote>
<p dir="auto">Da hast du Recht, das passt nicht. Habe ich aber auch nur aus der original Library übernommen. Ich verwende die Temperatur der Wetterstation nicht, da bei starker Sonneneinstrahlung gern mal Mondwerte ankommen. Auch in der Warema App wird die Temperatur nicht direkt angezeigt, dem Hersteller ist wohl auch klar, dass man darauf nichts geben kann. Passe ich aber trotzdem bei Gelegenheit mal an.</p>
<blockquote>
<p dir="auto">Und vielen Dank für das "Implement comprehensive weather data deduplication"</p>
</blockquote>
<p dir="auto">Ich dachte erst, es sei ein Fehler im Code, aber die Wetterstation sendet wirklich ständig doppelt und dreifach. Wahrscheinlich kann ich noch viel mehr Duplikate rausfiltern, auch das schaue ich mir nochmal an.</p>
]]></description><link>https://forum.iobroker.net/post/1287023</link><guid isPermaLink="true">https://forum.iobroker.net/post/1287023</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 05 Aug 2025 17:05:26 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 05 Aug 2025 15:17:44 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: Marc-Berg">@<bdi>Marc-Berg</bdi></a><br />
Hallo Marc,<br />
ich mußte bzgl. Wetterstation Pro<br />
bei mir im wms-util.js  noch einen Wert ändern.</p>
<p dir="auto">Das wäre bei Dir<br />
wms2mqtt/warema-bridge/srv/warema-wms-venetian-blinds/wms-util.js<br />
Zeile 272<br />
params.temp = parseInt(payload.substr(18, 2), 16) / 2 - 35;</p>
<p dir="auto">Ich muß 40 abziehen, um die korrekten Werte zu erhalten.<br />
Vergleich mit WMS Stick und WMS studio pro.</p>
<p dir="auto">Gruß<br />
Patrick</p>
<p dir="auto">PS: Sieh bitte auch meinen Kommentar zum " Squash deduplication #6"<br />
Und vielen Dank für das "Implement comprehensive weather data deduplication"</p>
]]></description><link>https://forum.iobroker.net/post/1286998</link><guid isPermaLink="true">https://forum.iobroker.net/post/1286998</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Tue, 05 Aug 2025 15:17:44 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 13 May 2025 17:04:00 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a> Vielen Dank</p>
]]></description><link>https://forum.iobroker.net/post/1271747</link><guid isPermaLink="true">https://forum.iobroker.net/post/1271747</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Tue, 13 May 2025 17:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 13 May 2025 15:51:11 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/patrickr" aria-label="Profile: patrickr">@<bdi>patrickr</bdi></a> sagte in <a href="/post/1271680">IoBroker mit Warema WMS Web Control</a>:</p>
<blockquote>
<p dir="auto">vermutlich interessiert meine Frage die wenigsten da HA.</p>
</blockquote>
<p dir="auto">Um ganz ehrlich zu sein: Mich interessiert HA auch nicht. Deshalb kann ich diesbezüglich auch keinen Support leisten.</p>
<p dir="auto">Wenn du dir selbst was zusammenstricken möchtest, dann musst du neben der <code>index.js</code> auch die Module unter <code>addon-warema-wms/warema-bridge/srv/warema-wms-venetian-blinds</code> anpassen, denn diese übernehmen die eigentliche Kommunikation mit dem WMS Netzwerk. Wegen der von mir entfernen HA-Funktionalität kannst du die Dateien aber nicht 1:1 ersetzen.</p>
]]></description><link>https://forum.iobroker.net/post/1271733</link><guid isPermaLink="true">https://forum.iobroker.net/post/1271733</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 13 May 2025 15:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 13 May 2025 13:01:26 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a><br />
Danke für Deine schnelle RM.</p>
<p dir="auto">Ich hab auch 63, 2A, daher bin ich auf Dein Resp gestossen.</p>
<p dir="auto">Hab gerade erst die Chat-Funktion gefunden (what a shame)<br />
Ich chatte Dich mal an, vermutlich interessiert meine Frage die wenigsten da HA.</p>
<p dir="auto">Patrick</p>
]]></description><link>https://forum.iobroker.net/post/1271680</link><guid isPermaLink="true">https://forum.iobroker.net/post/1271680</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Tue, 13 May 2025 13:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 13 May 2025 05:58:28 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/patrickr" aria-label="Profile: patrickr">@<bdi>patrickr</bdi></a> sagte in <a href="/post/1271587">IoBroker mit Warema WMS Web Control</a>:</p>
<blockquote>
<p dir="auto">Dein "wms2mqtt" auf Github, sollte dies auch auf HA laufen?</p>
</blockquote>
<p dir="auto">Mein Ziel war es, das Image um meine zusätzlichen Gerätetypen zu erweitern und unter einer Docker Umgebung laufen zu lassen. Deshalb habe ich alle HA-Funktionalitäten entfernt, um den Code schlank zu halten.</p>
<p dir="auto">Wenn dir die Geräte reichen, die <a class="plugin-mentions-user plugin-mentions-a" href="/user/marco-santarelli" aria-label="Profile: Marco-Santarelli">@<bdi>Marco-Santarelli</bdi></a> drin hat, solltest du sein Image nehmen.</p>
]]></description><link>https://forum.iobroker.net/post/1271594</link><guid isPermaLink="true">https://forum.iobroker.net/post/1271594</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 13 May 2025 05:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Mon, 12 May 2025 23:21:12 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a><br />
Entschuldige bitte mein Anfängerfrage</p>
<p dir="auto">Dein "wms2mqtt" auf Github, sollte dies auch auf HA laufen?<br />
Ich frage, weil ich die Fehlermeldung beim hinzufügen erhalte, dass es kein gültiges Repository wäre,<br />
was ggf. an der fehlenden "repository.json" liegt.</p>
<p dir="auto">Danke schon mal<br />
Patrick</p>
]]></description><link>https://forum.iobroker.net/post/1271587</link><guid isPermaLink="true">https://forum.iobroker.net/post/1271587</guid><dc:creator><![CDATA[PatrickR]]></dc:creator><pubDate>Mon, 12 May 2025 23:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Sun, 26 May 2024 14:54:58 GMT]]></title><description><![CDATA[<p dir="auto">Had been using Tombox' adapter working with the Webcontrol pro for a while. However it suddenly stopped working some time ago. Does someone still have it running with pro?</p>
]]></description><link>https://forum.iobroker.net/post/1163199</link><guid isPermaLink="true">https://forum.iobroker.net/post/1163199</guid><dc:creator><![CDATA[tweefo]]></dc:creator><pubDate>Sun, 26 May 2024 14:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 27 Feb 2024 09:48:44 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marco-santarelli" aria-label="Profile: marco-santarelli">@<bdi>marco-santarelli</bdi></a></p>
<p dir="auto">Yes, that's how I did it too. A fork of your repo and some customisations for my devices. I'm happy with that now.</p>
<p dir="auto"><a href="https://github.com/Marc-Berg/wms2mqtt" rel="nofollow ugc">https://github.com/Marc-Berg/wms2mqtt</a></p>
]]></description><link>https://forum.iobroker.net/post/1133895</link><guid isPermaLink="true">https://forum.iobroker.net/post/1133895</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 27 Feb 2024 09:48:44 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 27 Feb 2024 09:38:39 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marc-berg" aria-label="Profile: marc-berg">@<bdi>marc-berg</bdi></a> No response, i reverse-engineered the code from the npm package and modified it myself. You can see how I use it at <a href="https://github.com/santam85/addon-warema-wms/tree/main" rel="nofollow ugc">https://github.com/santam85/addon-warema-wms/tree/main</a></p>
]]></description><link>https://forum.iobroker.net/post/1133891</link><guid isPermaLink="true">https://forum.iobroker.net/post/1133891</guid><dc:creator><![CDATA[Marco Santarelli]]></dc:creator><pubDate>Tue, 27 Feb 2024 09:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 21 Mar 2023 20:06:12 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/marco-santarelli" aria-label="Profile: marco-santarelli">@<bdi>marco-santarelli</bdi></a> sagte in <a href="/post/920295">IoBroker mit Warema WMS Web Control</a>:</p>
<blockquote>
<p dir="auto">Hello, is the maintaner of warema-wms-venetian-blinds on NPM reading this thread? While I know I can see it and reverse-engineer it from the node_modules folder, Is it possible for this person to put the code on GitHub, so that we can collaborate on it?</p>
<p dir="auto">I have Warema blinds and a weather station at home, as well as the WMS stick and a webcontrol pro, and I became fairly proficient with WMS Studio, so I can help test the integrations and provide bugfixes!</p>
</blockquote>
<p dir="auto">Hi Marco, did you get any response? I am also interested in further development.</p>
]]></description><link>https://forum.iobroker.net/post/966589</link><guid isPermaLink="true">https://forum.iobroker.net/post/966589</guid><dc:creator><![CDATA[Marc Berg]]></dc:creator><pubDate>Tue, 21 Mar 2023 20:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Mon, 02 Jan 2023 09:21:23 GMT]]></title><description><![CDATA[<p dir="auto">Hello, is the maintaner of warema-wms-venetian-blinds on NPM reading this thread? While I know I can see it and reverse-engineer it from the node_modules folder, Is it possible for this person to put the code on GitHub, so that we can collaborate on it?</p>
<p dir="auto">I have Warema blinds and a weather station at home, as well as the WMS stick and a webcontrol pro, and I became fairly proficient with WMS Studio, so I can help test the integrations and provide bugfixes!</p>
]]></description><link>https://forum.iobroker.net/post/920295</link><guid isPermaLink="true">https://forum.iobroker.net/post/920295</guid><dc:creator><![CDATA[Marco Santarelli]]></dc:creator><pubDate>Mon, 02 Jan 2023 09:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Mon, 04 Jul 2022 22:22:17 GMT]]></title><description><![CDATA[<p dir="auto">Hallo zusammen,</p>
<p dir="auto">Vielen Dank euch allen für's Reverse-Engineering, Coding und Testing!</p>
<p dir="auto">Wer von euch hat schonmal über den WMS-Stick die Wetterdaten aus einer Wetterstation ausgelesen? Welche genaue Wetterstation verwendet ihr da?<br />
Klappt das mit der WMS Wetterstation eco oder plus oder welche sollte ich am Besten anschaffen?</p>
<p dir="auto">Vielen Dank und viele Grüße,<br />
Toby</p>
]]></description><link>https://forum.iobroker.net/post/822924</link><guid isPermaLink="true">https://forum.iobroker.net/post/822924</guid><dc:creator><![CDATA[Toby 1]]></dc:creator><pubDate>Mon, 04 Jul 2022 22:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Tue, 15 Mar 2022 19:20:45 GMT]]></title><description><![CDATA[<p dir="auto">Habe das Update nun auch hinter mir und hinterlasse hier nochmal meine aktuelle Version des Skripts.</p>
<pre><code>//updated for serialport 10.x

const { SerialPort } = require('serialport');
const { ReadlineParser } = require('@serialport/parser-readline')
const namespace = '0_userdata.0.Custom.WMS';
log('namespace: ' + namespace);

//config
const PATH = "/dev/ttyWMS";
const CHANNEL = 17;
const PANID = "FFFF"; //inclusion mode: FFFF
const KEY = "00112233445566778899AABBCCDDEEFF"; //inclusion mode: "00112233445566778899AABBCCDDEEFF"
var positionInterval = 60; //how often current position is requested (seconds)
var scanInterval = 10;  //how often to scan for devices (seconds)
var scanDevicesMax = 3; //stop scanning after discovering all devices
//listPorts();  //uncomment to list all available serial ports


/* do not edit below! */
//globals
var knownDevices = {}; //stores known devices
var lastData = ''; //contains last packet
var writeQueue = []; //stores data to be sent to serial port
var timers = {};

/* open serial port and setup parser */
function init() {
    //scan initially
    timers.scanInit = setTimeout(function () {
        wmsScan();
    }, 5000);
    //scan again every scanInterval seconds
    timers.scan = setInterval(function () {
        wmsScan();
    }, scanInterval * 1000);
}

//connect to serial port

const port = new SerialPort({
    path: PATH,
    baudRate: 125000,
    parity: 'none',
    dataBits: 8,
    stopBits: 1,
    autoOpen: false,
});

//create parser with '}' as delemiter
const parser = port.pipe(new ReadlineParser({ delimiter: '}' }))

// handle serial port errors
port.on('error', function () {
    log('serial port error!', 'warn');
    closePort().then((msg) =&gt; {
        log(msg, 'info');
    }).catch((err) =&gt; {
        log(err, 'warn');
    });
});

//parse incomming packets
parser.on('data', parseData);

//open serial port
portOpen().then((msg) =&gt; {
    log(msg);
    writeAndWaitFor('{G}', 'gWMS USB-Stick', true).then((line) =&gt; {
        return writeAndWaitFor('{V}', 'v', true);
    }).then((line) =&gt; {
        log('Stick Version: ' + line);
        return writeAndWaitFor(encodeWMS('setKey', {key: KEY}), 'a', true);
    }).then((line) =&gt; {
        return writeAndWaitFor(encodeWMS('switchChannel', {
            channel: CHANNEL,
            panId: PANID
        }), 'a', true);
    }).then((line) =&gt; {
        return writeAndWaitFor(encodeWMS('switchChannelRequest', {
            panId: PANID
        }), 'a', true);
    }).then((line) =&gt; {
        init();
    }).catch((err) =&gt; {
        log(err, 'warn');
        closePort().then((msg) =&gt; {
            log(msg, 'info');
        }).catch((err) =&gt; {
            log(err, 'warn');
        });
    });
}).catch((err) =&gt; {
    log(err, 'warn');
});


/* serialport helper functions */

//opens port with promise
function portOpen() {
    return new Promise((resolve, reject) =&gt; {
        port.open((err) =&gt; {
            err ? reject(err) : resolve('port opened');
        })
    });
}

//close port if open
function closePort() {
    return new Promise((resolve, reject) =&gt; {
        log('closing open serial ports', 'info');
        clearInterval(timers.scan);
        if (port &amp;&amp; port.isOpen) {
            // close connection
            port.close(() =&gt; {
                resolve('port closed')
            });
        } else {
            reject('no port was opened');
        }
    });
}

//on script stop close port
onStop(() =&gt; {
    clearInterval(timers.scan);
    //@todo clear all timers;
    closePort().then((msg) =&gt; {
        log(msg, 'info');
    }).catch((err) =&gt; {
        log(err, 'warn');
    });

}, 2000);

//handle incomming data
function parseData(data) {
    //trim data
    data = wmsTrim(data);
    //do nothing, if packet is received twice
    if (lastData === data) return
    lastData = data;
    log('received message: ' + data, 'debug');
    //decode data into object
    var obj = decodeWMS(data);
    log('received: ' + JSON.stringify(obj), 'debug');
    //process object
    setTimeout( () =&gt; processWMS(obj), 10);
}

//list available serial ports
function listPorts() {
    SerialPort.list().then((ports) =&gt; {
        log('Serial Ports: ' + JSON.stringify(ports));
    }).catch((err) =&gt; {
        log('error listing ports: ' + JSON.stringify(err));
    });
}

//write to serial port and wait for answer
function writeAndWaitFor(data, expect, rejectOnTimeout, timeout) {
    return new Promise((resolve, reject) =&gt; {
        if (isNaN(timeout)) timeout = 5000;
        let listener = (line) =&gt; {
            log('listener received message: "' + wmsTrim(line) + '" / expected: "' + expect + '"', 'debug');
            if (wmsTrim(line).substr(0, expect.length) === expect) {
                log('received expected answer: ' + expect, 'debug');
                parser.removeListener('data', listener);
                resolve(wmsTrim(line));
            } else {
                log('received unexpected answer (still waiting): ' + wmsTrim(line).substr(0, expect.length) + '!=' + expect, 'debug');
            }
        };
        parser.on('data', listener);
        enqueue(data);
        //remove listener after 5 seconds
        setTimeout(() =&gt; {
            parser.removeListener('data', listener);
            rejectOnTimeout ? reject(expect) : resolve(false);
        }, timeout);
    });
}

var portReady = true;
var sendInterval;
function enqueue(data) {
    if (typeof data === 'string'){
        writeQueue.push(data);
    } 
    clearInterval(sendInterval);
    sendInterval = setInterval(sendData, 50);
}
function sendData() {
    if (writeQueue.length === 0 &amp;&amp; portReady) {
        clearInterval(sendInterval);
        return;
    }
    if (portReady) {
        portReady = false;
        var sendData = writeQueue.shift();
        log('sending ' + sendData, 'debug');
        port.write(sendData);
        port.drain((err) =&gt; {
            portReady = true;
        });
    }
}

/* WMS helper functions */

//trim wms string
function wmsTrim(data) {
    return data.trim().substr(1);
}

//decode wms strings into an object
function decodeWMS(packet) {
    var obj = {};
    switch (packet.substr(0, 1)) {
        case 'g':
            obj.type = 'stickType';
            obj.payload = {name: packet.substr(1)};
            break;
        case 'v':
            obj.type = 'stickVersion';
            obj.payload = {version: packet.substr(1)};
            break;
        case 'f':
            obj.type = 'error';
            break;
        case 'a':
            obj.type = 'ack';
            break;
        case 'r':
            obj.type = 'message';
            obj.payload = decodeWMSMessage(packet.substr(1));
            break;
        default:
            obj.type = 'unknown';
            obj.payload = packet.substr(1);
    }
    return obj;
}

//decode wms messages into an object
function decodeWMSMessage(message) {
    var obj = {};
    obj.src = message.substr(0, 6);
    var type = message.substr(6, 4);
    var payload = message.substr(10);
    switch (type) {
        case '5018':
            obj.type = 'joinNetworkRequest';
            obj.messagePayload = {
                panId: payload.substr(0, 4),
                networkKey: payload.substr(4, 32).match(/../g).reverse().join(""),
                unknown: payload.substr(36, 2),
                channel: parseInt(payload.substr(38, 2), 16)
            };
            break;
        case '5060':
            obj.type = 'switchChannelRequest';
            obj.messagePayload = {
                panId: payload.substr(0, 4),
                deviceType: payload.substr(4, 2),
                channel: parseInt(payload.substr(6, 2), 16)
            };
            break;
        case '50AC':
            obj.type = 'ack';
            obj.messagePayload = {
                unknown: payload.substr(0, 4)
            };
            break;
        case '7020':
            obj.type = 'scanRequest';
            obj.messagePayload = {
                panId: payload.substr(0, 4),
                deviceType: payload.substr(4, 2)
            };
            break;
        case '7021':
            obj.type = 'scanResponse';
            obj.messagePayload = {
                panId: payload.substr(0, 4),
                deviceType: payload.substr(4, 2), //63: wetterstation, 06: webcontrol, 02: stick/software, 20: zwischenstecker, 00: Handsender
                unknown: payload.substr(6) //optional
            };
            break;
        case '7080':
            obj.type = 'weatherBroadcast';
            obj.messagePayload = {
                unknown_1: payload.substr(0, 2),
                wind: parseInt(payload.substr(2, 2), 16),
                lumen: payload.substr(4, 2) === '00' ? parseInt(payload.substr(12, 2), 16) * 2 : parseInt(payload.substr(4, 2), 16) * parseInt(payload.substr(12, 2), 16) * 2,
                unknown_2: payload.substr(6, 6),
                unknown_3: payload.substr(14, 2),
                rain: payload.substr(16, 2) === 'C8',
                temp: parseInt(payload.substr(18, 2), 16) / 2 - 35,
                unknown_4: payload.substr(20)
            };
            break;
        case '7050':
            obj.type = 'beckonRequest';
            break;
        case '7070':
            obj.type = 'controlRequest';
            obj.messagePayload = {
                unknown: payload.substr(0, 2),
                position: parseInt(payload.substr(2, 2), 16) / 2,
                angle: parseInt(payload.substr(4, 2), 16) - 127,
                valance_1: payload.substr(6, 2),
                valance_2: payload.substr(8, 2)
            };
            break;
        case '7071':
            obj.type = 'controlResponse';
            obj.messagePayload = payload;
            break;
        case '8010':
            obj.type = 'parameterGetRequest';
            obj.messagePayload = {
                parameter: payload.substr(0) //01000005: position, 26000046: clock timer settings, 0C000006: auto modes &amp; limits
            };
            break;
        case '8011':
            obj.type = 'parameterGetResponse';
            obj.messagePayload = {
                parameter: payload.substr(0, 8)
            };
            switch (obj.messagePayload.parameter) {
                case '01000003': //position
                case '01000005': //position
                    obj.messagePayload.type = 'position';
                    obj.messagePayload.position = parseInt(payload.substr(8, 2), 16) / 2;
                    obj.messagePayload.angle = parseInt(payload.substr(10, 2), 16) - 127;
                    obj.messagePayload.valance_1 = payload.substr(12, 2);
                    obj.messagePayload.valance_2 = payload.substr(14, 2);
                    break;
                case '0C000006': //auto modes &amp; limits
                    obj.messagePayload.type = 'autoSettings';
                    obj.messagePayload.wind = parseInt(payload.substr(8, 2), 16);
                    obj.messagePayload.rain = parseInt(payload.substr(10, 2), 16);
                    obj.messagePayload.sun = parseInt(payload.substr(12, 2), 16);
                    obj.messagePayload.dusk = parseInt(payload.substr(14, 2), 16);
                    obj.messagePayload.op = parseInt(payload.substr(16, 2), 16);
                    break;
                case '26000046':
                    obj.messagePayload.type = 'clock';
                    obj.messagePayload.unknown = payload.substr(8);
                    break;
                default:
                    obj.messagePayload.type = 'unknown';
                    obj.messagePayload.unknown = payload.substr(8);
            }
            break;
        case '8020':
            obj.type = 'parameterSetRequest';
            obj.messagePayload = {
                parameter: payload.substr(0, 8)
            };
            switch (obj.messagePayload.parameter) {
                case '0B080009':
                    obj.messagePayload.type = 'clock';
                    obj.messagePayload.year = parseInt(payload.substr(8, 2), 16);
                    obj.messagePayload.month = parseInt(payload.substr(10, 2), 16);
                    obj.messagePayload.day = parseInt(payload.substr(12, 2), 16);
                    obj.messagePayload.hour = parseInt(payload.substr(14, 2), 16);
                    obj.messagePayload.minute = parseInt(payload.substr(16, 2), 16);
                    obj.messagePayload.second = parseInt(payload.substr(18, 2), 16);
                    obj.messagePayload.day_of_week = parseInt(payload.substr(20, 2), 16);
                    obj.messagePayload.unknown = payload.substr(22);
                    break;
                default:
                    obj.messagePayload.type = 'unknown';
                    obj.messagePayload.unknown = payload.substr(8);
            }
            break;
        default:
            obj.type = 'unknown';
            obj.messagePayload = payload;
    }
    return obj;
}

//create wms strings
function encodeWMS(type, parameter) {
    log('encoding: ' + type + ' with parameters ' + JSON.stringify(parameter), 'debug');
    if (!parameter) parameter = {};
    switch (type) {
        case 'setKey':
            if (!parameter.key) return false;
            return '{K401' + parameter.key + '}';
            break;
        case 'setScanMode':
            if (isNaN(parameter.channel) || !parameter.panId) return false;
            return '{M#' + parameter.channel + parameter.panId.match(/../g).reverse().join("") + '}';
            break;
        case 'switchChannel':
            if (isNaN(parameter.channel) || !parameter.panId) return false;
            return '{M%' + parameter.channel + parameter.panId + '}';
            break;
        case 'ack':
            if (!parameter.dst) return false;
            return '{R21' + parameter.dst + '50AC}';
            break;
        case 'switchChannelRequest': //channel 17 fixed
            if (!parameter.panId) return false;
            return '{R04FFFFFF5060' + parameter.panId + '021100}'; // dst or FFFFFF???
            break;
        case 'scanRequest':
            return '{R04FFFFFF7020' + parameter.panId + '02}';
            break;
        case 'scanResponse':
            if (!parameter.panId || !parameter.dst || !parameter.deviceType) return false;
            return '{R01' + parameter.dst + '7021' + parameter.panId + parameter.deviceType + (parameter.payload ? parameter.payload : '') + '}'; //fixed to deviceType 02 for now
            break;
        case 'beckonRequest':
            if (!parameter.dst) return false;
            return '{R06' + parameter.dst + '7050}';
            break;
        case 'controlRequest':
            if (!parameter.dst || isNaN(parameter.position) || isNaN(parameter.angle)) return false;
            return '{R06' + parameter.dst + '7070' + '03'
                + ('0' + (Math.min(Math.max(parameter.position, 0), 100) * 2).toString(16)).substr(-2).toUpperCase()
                + ('0' + (Math.min(Math.max(parameter.angle, 0), 90) + 127).toString(16)).substr(-2).toUpperCase()
                + 'FFFF}'; //no idea how valance works
            break;
        case 'parameterGetRequest':
            if (!parameter.dst || !parameter.parameter) return false;
            return '{R06' + parameter.dst + '8010' + parameter.parameter + '}';
            break;
        case 'parameterGetRequestPosition':
            if (!parameter.dst) return false;
            return '{R06' + parameter.dst + '8010' + '01000005}';
            break;
        case 'parameterGetRequestClock':
            if (!parameter.dst) return false;
            return '{R06' + parameter.dst + '8010' + '26000046}';
            break;
        case 'parameterGetRequestAutoSettings':
            if (!parameter.dst) return false;
            return '{R06' + parameter.dst + '8010' + '0C000006}';
            break;
        case 'parameterSetRequestAutoSettings':
            if (!parameter.dst || !parameter.parameter
                || isNaN(parameter.wind) || isNaN(parameter.rain)
                || isNaN(parameter.sun) || isNaN(parameter.dusk))
                return false;
            return '{R06' + parameter.dst + '8020' + '0D000004'
                + ('0' + Math.min(Math.max(parameter.wind, 0), 9).toString(16)).substr(-2).toUpperCase()
                + ('0' + Math.min(Math.max(parameter.rain, 0), 9).toString(16)).substr(-2).toUpperCase()
                + ('0' + Math.min(Math.max(parameter.sun, 0), 9).toString(16)).substr(-2).toUpperCase()
                + ('0' + Math.min(Math.max(parameter.dusk, 0), 9).toString(16)).substr(-2).toUpperCase()
                + (parameter.op ? '01' : '00')
                + '}';
            break;
        case 'parameterSetRequestAutoAll':
            if (!parameter.dst) return false;
            return '{R06' + parameter.dst + '8020' + '0D040001' + (parameter.op ? '01' : '00') + '}';
            break;
        default: //unkown message type
            return false;
            break;
    }
}

//process packets
function processWMS(obj) {
    //log(JSON.stringify(obj));
    if (obj.type !== 'message') return;
    switch (obj.payload.type) {
        case 'switchChannelRequest':
            log('received switchChannelRequest, switching channel to ' + obj.payload.messagePayload.channel, 'debug');
            writeAndWaitFor(encodeWMS('switchChannel', {
                channel: obj.payload.messagePayload.channel,
                panId: PANID
            }), 'a');
            break;
        case 'scanRequest':
            // send scanResponse
            log('received scanRequest, sending scanResponse', 'debug');
            writeAndWaitFor(encodeWMS('scanResponse', {dst: obj.payload.src, panId: PANID, deviceType: '20', payload: '8FFF03000000000000000000000201010000000000000000'}), 'a');
            break;
        case 'joinNetworkRequest':
            log('received joinNetworkRequest:', 'debug');
            log('KEY: ' + obj.payload.messagePayload.networkKey);
            log('CHANNEL: ' + obj.payload.messagePayload.channel);
            log('PANID: ' + obj.payload.messagePayload.panId);
            writeAndWaitFor(encodeWMS('ack', {dst: obj.payload.src}), 'a');
            break;
        case 'scanResponse':
            log('received scanResponse', 'debug');
            log('TYPE: ' + obj.payload.messagePayload.deviceType, 'debug');
            log('SNR:' + obj.payload.src, 'debug');
            if (obj.payload.messagePayload.deviceType === '20') {
                let src = '' + obj.payload.src.trim();
                if (knownDevices[src] === true) {
                    //log('skipping device: ' + src);
                    return;   
                };
                knownDevices[src] = true;
                log('device type 20 found: ' + src);

                scanDevicesMax--;
                if (scanDevicesMax === 0) {  
                    clearInterval(timers.scan);
                    log ('stop scanning for devices');
                }

                
                //log('creating state: ' + namespace + '.Raffstore.' + src + '.position');
                createState(namespace + '.Raffstore.' + src + '.position', 0, {
                    type: 'number',
                    min: 0,
                    max: 100,
                    unit: '%'
                });
                //log('creating state: ' + namespace + '.Raffstore.' + src + '.angle');
                createState(namespace + '.Raffstore.' + src + '.angle', 0, {
                    type: 'number',
                    min: 0,
                    max: 90,
                    unit: '°'
                }, function () {
                    var deviceId = namespace + '.Raffstore.' + src;
                    on({id: deviceId + '.position', change: 'ne', ack: false}, function (obj) {
                        //send parameter
                        writeAndWaitFor(
                            encodeWMS('controlRequest', {
                                dst: src,
                                position: obj.state.val,
                                angle: getState(deviceId + '.angle').val
                            }),
                            'r' + src + '7071'
                        ).then(() =&gt; {
                            clearInterval(timers[deviceId + 'parameterGetRequestPosition']);
                            var lastValueAngle = -1;
                            var lastValuePosition = -1;
                            var noChange = 0;
                            writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            timers[deviceId + 'parameterGetRequestPosition'] = setInterval(function () {
                                //get parameter periodically until no change is detected
                                log(getState(deviceId + '.position').val + ':' + lastValuePosition + ' | ' + getState(deviceId + '.angle').val + ':' + lastValueAngle, 'info')
                                if (getState(deviceId + '.position').val === lastValuePosition &amp;&amp; getState(deviceId + '.angle').val === lastValueAngle) {
                                    noChange++;
                                    if (noChange === 2) {
                                        clearInterval(timers[deviceId + 'parameterGetRequestPosition']);
                                    }
                                } else {
                                    noChange = 0;
                                }
                                lastValuePosition = getState(deviceId + '.position').val;
                                lastValueAngle = getState(deviceId + '.angle').val;
                                writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            },  5000 + Math.random() * 1000);
                            //setState(deviceId + '.position', getState(deviceId + '.position').val, true);
                        });
                    });
                    on({id: deviceId + '.angle', change: 'ne', ack: false}, function (obj) {
                        //send parameter
                        writeAndWaitFor(encodeWMS('controlRequest', {
                                dst: src,
                                position: getState(deviceId + '.position').val,
                                angle: obj.state.val
                            }),
                            'r' + src + '7071'
                        ).then(() =&gt; {
                            clearInterval(timers[deviceId + 'parameterGetRequestPosition']);
                            var lastValueAngle = -1;
                            var lastValuePosition = -1;
                            var noChange = 0;
                            writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            timers[deviceId + 'parameterGetRequestPosition'] = setInterval(function () {
                                //get parameter periodically until no change is detected
                                log(getState(deviceId + '.position').val + ':' + lastValuePosition + ' | ' + getState(deviceId + '.angle').val + ':' + lastValueAngle, 'info');
                                if (getState(deviceId + '.position').val === lastValuePosition &amp;&amp; getState(deviceId + '.angle').val === lastValueAngle) {
                                    noChange++;
                                    if (noChange === 2) {
                                        clearInterval(timers[deviceId + 'parameterGetRequestPosition']);
                                    }
                                } else {
                                    noChange = 0;
                                }
                                lastValuePosition = getState(deviceId + '.position').val;
                                lastValueAngle = getState(deviceId + '.angle').val;
                                writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                            },  3500 + Math.random() * 1000);
                            //setState(deviceId + '.angle', getState(deviceId + '.angle').val, true);
                        });
                    });
                    setTimeout(function () {
                        //get parameter once
                        writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                    }, 5000 + Math.random() * 5000);
                    setInterval(function () {
                        //get parameter periodicaly
                        writeAndWaitFor(encodeWMS('parameterGetRequestPosition', {dst: src}), 'a');
                    }, positionInterval * 1000 + Math.random() * 5000);
                });
            }
            break;
        case 'parameterGetResponse':
            log('received parameterGetResponse', 'debug');
            switch (obj.payload.messagePayload.type) {
                case 'position':
                    setStateDelayed(namespace + '.Raffstore.' + obj.payload.src + '.position', obj.payload.messagePayload.position, true, 100, true);
                    setStateDelayed(namespace + '.Raffstore.' + obj.payload.src + '.angle', obj.payload.messagePayload.angle, true, 100, true);
                default:
                    break;
            }
            break;
        case 'weatherBroadcast':
            log('received weatherBroadcast', 'debug');
            let src = '' + obj.payload.src.trim();
            createState(namespace + '.Wetter.' + src + '.temp', 0, {
                type: 'number',
                unit: '°C',
                write: false
            }, function () {
                setStateDelayed(namespace + '.Wetter.' + src + '.temp', obj.payload.messagePayload.temp, true, 100, true);
            });
            createState(namespace + '.Wetter.' + src + '.wind', 0, {
                type: 'number',
                min: 0,
                unit: 'm/s',
                write: false
            }, function () {
                setStateDelayed(namespace + '.Wetter.' + src + '.wind', obj.payload.messagePayload.wind, true, 100, true);
            });
            createState(namespace + '.Wetter.' + src + '.lux', 0, {
                type: 'number',
                min: 0,
                unit: 'lux',
                write: false
            }, function () {
                setStateDelayed(namespace + '.Wetter.' + src + '.lux', obj.payload.messagePayload.lumen, true, 100, true);
            });
            createState(namespace + '.Wetter.' + src + '.rain', false, {
                type: 'boolean',
                write: false
            }, function () {
                setStateDelayed(namespace + '.Wetter.' + src + '.rain', obj.payload.messagePayload.rain, true, 100, true);
            });
            break;
        case 'beckonRequest':
            writeAndWaitFor(encodeWMS('ack', {dst: obj.payload.src}), 'a');
            break;
        case 'controlRequest':
            writeAndWaitFor(encodeWMS('ack', {dst: obj.payload.src}), 'a');
            break;      
        default:
            break;
    }
}

//scan for devices
function wmsScan() {  
    log('scanning for devices');
    writeAndWaitFor(encodeWMS('scanRequest', {panId: PANID}), 'a');   
}


</code></pre>
]]></description><link>https://forum.iobroker.net/post/777665</link><guid isPermaLink="true">https://forum.iobroker.net/post/777665</guid><dc:creator><![CDATA[Pman]]></dc:creator><pubDate>Tue, 15 Mar 2022 19:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Sat, 12 Mar 2022 14:43:22 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/henry9843" aria-label="Profile: henry9843">@<bdi>henry9843</bdi></a><br />
Es funktioniert!<br />
Vielen Dank!!!!!!!!<br />
Ihr rettet mir mein Wochenende!</p>
]]></description><link>https://forum.iobroker.net/post/775975</link><guid isPermaLink="true">https://forum.iobroker.net/post/775975</guid><dc:creator><![CDATA[Schmoke]]></dc:creator><pubDate>Sat, 12 Mar 2022 14:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Sat, 12 Mar 2022 10:03:38 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/schmoke" aria-label="Profile: schmoke">@<bdi>schmoke</bdi></a> ich stand gerade vor dem gleichen Problem. Nach Studie der Änderungsdoku von Serialport und meinen rudimentären Programmierkenntnissen in Javascript, habe ich es bei mir zum Laufen bekommen. Folgende Änderungen sind vorzunehmen:</p>
<ol>
<li></li>
</ol>
<pre><code>var SerialPort = require('serialport');
</code></pre>
<p dir="auto"><em>ersetzen durch:</em></p>
<pre><code>const {SerialPort} = require('serialport');
const {ReadlineParser} = require('@serialport/parser-readline');
</code></pre>
<ol start="2">
<li></li>
</ol>
<pre><code>const port = new SerialPort(PATH, {

baudRate: 125000,

parity: 'none',

dataBits: 8,

stopBits: 1,

autoOpen: false,

});
</code></pre>
<p dir="auto"><em>ersetzen durch</em></p>
<pre><code>const port = new SerialPort({path:PATH, 
baudRate: 125000,
autoOpen: false});
</code></pre>
<ol start="3">
<li></li>
</ol>
<pre><code>const parser = port.pipe(new SerialPort.parsers.Readline({delimiter: '}'}));
</code></pre>
<p dir="auto">durch</p>
<pre><code>const parser = port.pipe(new ReadlineParser({delimiter: '}'}));
</code></pre>
<p dir="auto">Danach sollte es wieder funktionieren. Bei mir ist PATH als</p>
<pre><code>const PATH = '/dev/ttyUSB0'; 
</code></pre>
<p dir="auto">definiert.</p>
<p dir="auto">An dieser Stelle vielen Dank an <a class="plugin-mentions-user plugin-mentions-a" href="/user/willjoha" aria-label="Profile: willjoha">@<bdi>willjoha</bdi></a> und <a class="plugin-mentions-user plugin-mentions-a" href="/user/pman" aria-label="Profile: Pman">@<bdi>Pman</bdi></a>. Durch die beiden konnte ich erst iobroker in Kombination mit der wms Steuerung einsetzen. Super Job!</p>
<p dir="auto">Henry</p>
]]></description><link>https://forum.iobroker.net/post/775839</link><guid isPermaLink="true">https://forum.iobroker.net/post/775839</guid><dc:creator><![CDATA[Henry9843]]></dc:creator><pubDate>Sat, 12 Mar 2022 10:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Fri, 11 Mar 2022 16:42:27 GMT]]></title><description><![CDATA[<p dir="auto">Hi.<br />
Erstmal danke an alle die sich hier die Mühe machen und Laien wie mich unterstützen :-)<br />
Dann auch großes Dankeschön an alle die am Skript gearbeitet haben um Warema unter iobroker zum Laufen zu bringen. Hat die ganze Zeit tadellos funktioniert! Leider habe ich nun mein System auf die neuste Version gebracht und daher unbemerkt auch serialport V10 installiert.<br />
Da die Version 10 ja "Breaking Changes" hat funktioniert das Skript nun nicht mehr :-(<br />
"Serialport is not a constructor"<br />
Hat jemand ähnliche Probleme gehabt und vllt. schon das Skipt modifiziert? Ich kriege es leider nicht hin...</p>
<p dir="auto">btw -&gt; Der Adapter für das Webcontrol Pro ist klasse, auch dafür vielen Dank! Leider kann ich damit nicht die Daten von meiner Wetterstation auslesen. Bringt mir also nicht sonderlich viel.</p>
]]></description><link>https://forum.iobroker.net/post/775593</link><guid isPermaLink="true">https://forum.iobroker.net/post/775593</guid><dc:creator><![CDATA[Schmoke]]></dc:creator><pubDate>Fri, 11 Mar 2022 16:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Sun, 07 Nov 2021 18:00:36 GMT]]></title><description><![CDATA[<p dir="auto">Hallo, hat jemand den WebSocket (<a href="https://www.npmjs.com/package/warema-wms-venetian-blinds-ws-api" rel="nofollow ugc">warema-wms-venetian-blinds-ws-api</a>) für Node.js im Einsatz? Ich würde diesen gerne nutzen, ohne iobroker zu installieren. Mein Warema WMS Stick wird korrekt erkannt. Die Daten wie PANID, Serial, wmsKey oder Channel sind vorhanden.</p>
<p dir="auto">Hat jemand ein konkretes Beispiel für mich, wie ich z.B. mit CURL den Socket (Webservice) ansprechen kann, um Kommandos wie up, down, stop oder status zu senden/empfangen?</p>
<p dir="auto">Auch würde gerne den Socket als Dienst auf einer Linux Maschine laufen lassen. Die Dokumentation der API ist sehr ausführlich, aber leider reichen meine Kenntnisse nicht aus, um ein praktisches Beispiel mittels CURL aufzusetzen.</p>
<p dir="auto">Vielen Dank für nützliche Hinweise. :-)</p>
]]></description><link>https://forum.iobroker.net/post/699795</link><guid isPermaLink="true">https://forum.iobroker.net/post/699795</guid><dc:creator><![CDATA[9ukj88]]></dc:creator><pubDate>Sun, 07 Nov 2021 18:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Wed, 29 Sep 2021 15:05:09 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bender275" aria-label="Profile: bender275">@<bdi>bender275</bdi></a> kann selber angelernt werden gibt Videos. Keine Ahnung ob die Werte von einer Wetter Station übertragen</p>
]]></description><link>https://forum.iobroker.net/post/682499</link><guid isPermaLink="true">https://forum.iobroker.net/post/682499</guid><dc:creator><![CDATA[tombox]]></dc:creator><pubDate>Wed, 29 Sep 2021 15:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to IoBroker mit Warema WMS Web Control on Wed, 29 Sep 2021 14:55:04 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/tombox" aria-label="Profile: tombox">@<bdi>tombox</bdi></a><br />
Puh, dann brauche ich ja noch den Stick für 50€...<br />
Kann man das dann selbst alles (evtl. mit dem WMS Studio) anlernen, oder brauche ich Warema oder den Monteur dazu?</p>
<p dir="auto">Hat jemand nen Screenshot, wie die Werte von der Wetterstation dargestellt werden?</p>
]]></description><link>https://forum.iobroker.net/post/682497</link><guid isPermaLink="true">https://forum.iobroker.net/post/682497</guid><dc:creator><![CDATA[Bender275]]></dc:creator><pubDate>Wed, 29 Sep 2021 14:55:04 GMT</pubDate></item></channel></rss>