Sonoff NSPanel - ioBroker-Integration

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Sonoff NSPanel - ioBroker-Integration
Sonoff NSPanel - ioBroker-Integration
  • Matthias Kleine
  • 18.01.2022
  • Hardware
  • Nextion
  • ESP32
  • Taster
  • Produkt-Review

Vor einiger Zeit hatte ich das NSPanel von Sonoff schon auf YouTube und hier im Blog vorgestellt. Das Gerät schien sehr vielversprechend zu sein - zumindest aus Hardware-Sicht. Also habe ich mich dazu entschieden, das Thema weiter zu verfolgen. In diesem Video schauen wir uns gemeinsam an, wie man Tasmota auf das Sonoff NSPanel flasht, wie man Tasmota richtig konfiguriert, damit die Software mit dem Display kommunizieren kann und ich zeige einige Beispiele, wie man aus ioBroker mit Widgets arbeitet. Leider ist das Thema nicht mit wenigen Sätzen erklärt, wodurch das Video etwas länger geworden ist. Ich bin mir aber sicher, dass Du so den besten Überblick bekommst, was mit dem Geräte in Kombination mit einem Smart Home System so möglich ist.

Wichtig: Leider passt das NSPanel nicht in alle Unterputz-Dosen (zumindest die erste Version aus dem Video). Die Dosen von Kaiser sind zum Beispiel ein bisschen zu schmal. Es fehlen ein paar Millimeter im Durchmesser. Andere UP-Dosen (z.B. von f-tronic) passen laut einigen Nutzern. Mittlerweile hat der Hersteller hier nachgebessert und liefert die Produkte mit einem angepassten Netzteil aus. Allerdings ist da natürlich die Frage, welches Netzteil man bekommt - in den Lagern liegen sicher noch genügend alte Versionen. Bei Problemen also an den Hersteller wenden und um Nachbesserung bitten!

Video

ioBroker-Kurs

Befehle

In diesem Beispiel legen wir ein Schalter-Widget auf Index 1 an. Dieses Widget kann dann z.B. im ioBroker genutzt werden, um eigene Aktionen anzustoßen.

Weiter unten findest du ein Blockly-Script, welches Dir auch Widgets erstellen kann.

Sende einfach diese Befehle über die Konsole auf der Tasmota-Oberfläche.

NSPSend {"HMI_resources":[{"index":1,"ctype":"device","id":"1","uiid":1}]}
NSPSend {"index":2, "type":"delete"}
NSPSend {"index":3, "type":"delete"}
NSPSend {"index":4, "type":"delete"}
NSPSend {"index":5, "type":"delete"}
NSPSend {"index":6, "type":"delete"}
NSPSend {"index":7, "type":"delete"}
NSPSend {"index":8, "type":"delete"}

Welche Befehle unterstützt werden, ist hier dokumentiert.

Angepasstes Script

Das originale nspanel.be Script macht leider mehr als wir brauchen:

  • Es erstellt “Standard-Widgets” (siehe Video)
  • Es werden Wetter-Infos von einer API abgeholt und dargestellt
  • Auf dem Display werden die Werte des internen Temperatur-Sensors dargestellt

All das können wir nicht gebrauchen, da unser Smart-Home-System die Daten übergeben soll. Daher habe ich das Script angepasst und die überflüssige Logik entfernt.

Das schlankere Script findest du auf GitHub.

Blockly-Beispiel Widgets

Dieses Script reagiert auf das Result-Objekt von Tasmota über MQTT. Das Full Topic unter Tasmota wurde dafür wie folgt konfiguriert: SmartHome/%topic%/%prefix%/. Bitte kontrolliere die IDs und passe diese an dein System an.

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="[pN*7+pI7`mS^v48AI2C">temp</variable>
    <variable id="cgN3b1dG]l9vJae#x%.|">index</variable>
    <variable id="H`0NS77?9z5:L[t(ay.@">ctype</variable>
    <variable id="/a:u~VISw+Afcj|JR|8O">type</variable>
    <variable id="}1#OtR*3yZ8ZdPNuPzT9">params</variable>
    <variable id="~[^+suo|DPeoXQ|a#U$O">mqttCmndId</variable>
    <variable id="aevDUp]R;DeT@4L/rdho">mqttLwtId</variable>
    <variable id="ZpE5jt??D}:s}opX$elU">mqttResultId</variable>
    <variable id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</variable>
    <variable id="tIM,K-nHxcf0DRJN(Y)C">resultObj</variable>
    <variable type="timeout" id="waitForBoot">waitForBoot</variable>
  </variables>
  <block type="procedures_defcustomnoreturn" id="tBm:we7xW3,X53RAG]ER" x="63" y="13">
    <mutation statements="false">
      <arg name="temp" varid="[pN*7+pI7`mS^v48AI2C"></arg>
    </mutation>
    <field name="NAME">setTemperature</field>
    <field name="SCRIPT">Y29uc3QgdGVtcE9iamVjdCA9IHsKICAgIHRlbXBlcmF0dXJlOiB0ZW1wCn07CmNvbnNvbGUubG9nKCdOU1BTZW5kOiAnICsgSlNPTi5zdHJpbmdpZnkodGVtcE9iamVjdCkpOwpzZXRTdGF0ZShtcXR0Q21uZElkLCBKU09OLnN0cmluZ2lmeSh0ZW1wT2JqZWN0KSk7</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defcustomnoreturn" id="QZ(E*R:#^tJDH@B?4EHF" x="63" y="38">
    <mutation statements="false">
      <arg name="index" varid="cgN3b1dG]l9vJae#x%.|"></arg>
    </mutation>
    <field name="NAME">deleteWidget</field>
    <field name="SCRIPT">Y29uc3Qgd2lkZ2V0T2JqZWN0ID0gewogICAgaW5kZXg6IGluZGV4LAogICAgdHlwZTogJ2RlbGV0ZScKfTsKY29uc29sZS5sb2coJ05TUFNlbmQ6ICcgKyBKU09OLnN0cmluZ2lmeSh3aWRnZXRPYmplY3QpKTsKc2V0U3RhdGUobXF0dENtbmRJZCwgSlNPTi5zdHJpbmdpZnkod2lkZ2V0T2JqZWN0KSk7</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defcustomnoreturn" id="Z1gw8,0k6N~]9.0I{c`!" x="63" y="63">
    <mutation statements="false">
      <arg name="index" varid="cgN3b1dG]l9vJae#x%.|"></arg>
      <arg name="ctype" varid="H`0NS77?9z5:L[t(ay.@"></arg>
      <arg name="type" varid="/a:u~VISw+Afcj|JR|8O"></arg>
    </mutation>
    <field name="NAME">createWidget</field>
    <field name="SCRIPT">Y29uc3Qgd2lkZ2V0T2JqZWN0ID0gewogICAgIkhNSV9yZXNvdXJjZXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAiaW5kZXgiOiBpbmRleCwKICAgICAgICAgICAgImN0eXBlIjogY3R5cGUsCiAgICAgICAgICAgICJpZCI6IGluZGV4LnRvU3RyaW5nKCksCiAgICAgICAgICAgICJ1aWlkIjogdHlwZQogICAgICAgIH0KICAgIF0KfTsKY29uc29sZS5sb2coJ05TUFNlbmQ6ICcgKyBKU09OLnN0cmluZ2lmeSh3aWRnZXRPYmplY3QpKTsKc2V0U3RhdGUobXF0dENtbmRJZCwgSlNPTi5zdHJpbmdpZnkod2lkZ2V0T2JqZWN0KSk7</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defcustomnoreturn" id="JjKn(WNnRSx123AsRjB1" x="63" y="88">
    <mutation statements="false">
      <arg name="index" varid="cgN3b1dG]l9vJae#x%.|"></arg>
      <arg name="params" varid="}1#OtR*3yZ8ZdPNuPzT9"></arg>
    </mutation>
    <field name="NAME">setWidgetParams</field>
    <field name="SCRIPT">Y29uc3QgcmVsYXRpb25PYmplY3QgPSB7CiAgICAicmVsYXRpb24iOiBbCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiBpbmRleC50b1N0cmluZygpLAogICAgICAgICAgICAib25saW5lIjogdHJ1ZSwKICAgICAgICAgICAgInBhcmFtcyI6IHBhcmFtcwogICAgICAgIH0KICAgIF0KfTsKY29uc29sZS5sb2coJ05TUFNlbmQ6ICcgKyBKU09OLnN0cmluZ2lmeShyZWxhdGlvbk9iamVjdCkpOwpzZXRTdGF0ZShtcXR0Q21uZElkLCBKU09OLnN0cmluZ2lmeShyZWxhdGlvbk9iamVjdCkpOw==</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defnoreturn" id="9zfL=sT{0k2)6;~l)o|}" x="63" y="138">
    <field name="NAME">initWidgets</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
    <statement name="STACK">
      <block type="comment" id="nb34T~)P67[(*u=je42f">
        <field name="COMMENT">Beispiel: Toggle-Switch an Position 1</field>
        <next>
          <block type="procedures_callcustomnoreturn" id="_Na?8dXXNdmc^z/;c}u^">
            <mutation name="createWidget">
              <arg name="index"></arg>
              <arg name="ctype"></arg>
              <arg name="type"></arg>
            </mutation>
            <value name="ARG0">
              <block type="math_number" id="qhM`lPMISbd_t30tPg)u">
                <field name="NUM">1</field>
              </block>
            </value>
            <value name="ARG1">
              <block type="text" id="fB@CZ9L7Tx)5Ae[S-/Kr">
                <field name="TEXT">group</field>
              </block>
            </value>
            <value name="ARG2">
              <block type="math_number" id="+]TF(%E*q^^u%CHD5z.{">
                <field name="NUM">1</field>
              </block>
            </value>
            <next>
              <block type="comment" id="qbu}K3}n:v$@1qPK=IX7">
                <field name="COMMENT">Restliche Widgets löschen</field>
                <next>
                  <block type="controls_for" id="Zj`7J8U}-2jtZ`_@X*S(">
                    <field name="VAR" id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</field>
                    <value name="FROM">
                      <shadow type="math_number" id="*?tw.{_R[c0jlY6V[[%(">
                        <field name="NUM">2</field>
                      </shadow>
                    </value>
                    <value name="TO">
                      <shadow type="math_number" id="zy3_@3T]3S-l^%-,r%4n">
                        <field name="NUM">8</field>
                      </shadow>
                    </value>
                    <value name="BY">
                      <shadow type="math_number" id=":KMFw#)jV[xkn6C%-7}~">
                        <field name="NUM">1</field>
                      </shadow>
                    </value>
                    <statement name="DO">
                      <block type="procedures_callcustomnoreturn" id="EmNj8nlDc1$gu({hJA9,">
                        <mutation name="deleteWidget">
                          <arg name="index"></arg>
                        </mutation>
                        <value name="ARG0">
                          <block type="variables_get" id="t(|9o:Gv,o,[eX!/lkro">
                            <field name="VAR" id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</field>
                          </block>
                        </value>
                      </block>
                    </statement>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </next>
      </block>
    </statement>
  </block>
  <block type="comment" id="yJ9?Mh}-G^y1Lg}W!ror" x="63" y="488">
    <field name="COMMENT">Full topic in Tasmota: SmartHome/%topic%/%prefix%/</field>
    <next>
      <block type="variables_set" id="!ZL27~%4XS^GIsp$,TjP">
        <field name="VAR" id="~[^+suo|DPeoXQ|a#U$O">mqttCmndId</field>
        <value name="VALUE">
          <block type="text" id="o[[y05]t{qk$F^]AJG]u">
            <field name="TEXT">mqtt.0.SmartHome.nspanel_C79304.cmnd.NSPSend</field>
          </block>
        </value>
        <next>
          <block type="variables_set" id="bun(psdk1Bh4bV(-d^Fw">
            <field name="VAR" id="aevDUp]R;DeT@4L/rdho">mqttLwtId</field>
            <value name="VALUE">
              <block type="text" id="QWxlNCp=-p_%hi!htLQ~">
                <field name="TEXT">mqtt.0.SmartHome.nspanel_C79304.tele.LWT</field>
              </block>
            </value>
            <next>
              <block type="variables_set" id="rITtEbJ*XnsZ%(|)AxGY">
                <field name="VAR" id="ZpE5jt??D}:s}opX$elU">mqttResultId</field>
                <value name="VALUE">
                  <block type="text" id="3yhJLnCi].cjPy0QZX%)">
                    <field name="TEXT">mqtt.0.SmartHome.nspanel_C79304.tele.RESULT</field>
                  </block>
                </value>
                <next>
                  <block type="procedures_callnoreturn" id="5B,M{6073Jx7.7S{}4]G">
                    <mutation name="initWidgets"></mutation>
                    <next>
                      <block type="on_ext" id="IHkIGB_aJ=={[#xJH3Cl">
                        <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
                        <field name="CONDITION">any</field>
                        <field name="ACK_CONDITION">true</field>
                        <value name="OID0">
                          <shadow type="field_oid" id=":%Z+6DxleqY]*,*NLY3Y">
                            <field name="oid">default</field>
                          </shadow>
                          <block type="variables_get" id="7RP1(a[;d4fV2Du[vo+[">
                            <field name="VAR" id="ZpE5jt??D}:s}opX$elU">mqttResultId</field>
                          </block>
                        </value>
                        <statement name="STATEMENT">
                          <block type="variables_set" id="GQp/+B[#cS7*;jJ)bKdg">
                            <field name="VAR" id="tIM,K-nHxcf0DRJN(Y)C">resultObj</field>
                            <value name="VALUE">
                              <block type="convert_json2object" id="6OUSmanN;zWzb;C0f3m{">
                                <value name="VALUE">
                                  <block type="on_source" id="h-A5c/u;9ucgT|K/ntg%">
                                    <field name="ATTR">state.val</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <next>
                              <block type="controls_if" id="=1^,PC#~*rRZtbF{VZjR">
                                <value name="IF0">
                                  <block type="get_attr" id="K1s;#/e2g8YZT/Lu}c_?">
                                    <value name="PATH">
                                      <shadow type="text" id="Hkv+uAyP3^#W~h]99@*t">
                                        <field name="TEXT">NSPanel</field>
                                      </shadow>
                                    </value>
                                    <value name="OBJECT">
                                      <block type="variables_get" id="K31i70L$$?X50OY?$nY{">
                                        <field name="VAR" id="tIM,K-nHxcf0DRJN(Y)C">resultObj</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <statement name="DO0">
                                  <block type="variables_set" id="64^z.-QNoJQ_+6LM5mU9">
                                    <field name="VAR" id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</field>
                                    <value name="VALUE">
                                      <block type="get_attr" id="BHJGBbK,iqHZO^-F@k-q">
                                        <value name="PATH">
                                          <shadow type="text" id="U$LR3~OE*i9S]:NRb.pY">
                                            <field name="TEXT">NSPanel.id</field>
                                          </shadow>
                                        </value>
                                        <value name="OBJECT">
                                          <block type="variables_get" id="r^]pHhk+Xo5t1AKb-O,j">
                                            <field name="VAR" id="tIM,K-nHxcf0DRJN(Y)C">resultObj</field>
                                          </block>
                                        </value>
                                      </block>
                                    </value>
                                    <next>
                                      <block type="comment" id="BWRRa8Il{h-N;zD@jUf=">
                                        <field name="COMMENT">Für welches Widget ist der Befehl?</field>
                                        <next>
                                          <block type="controls_if" id="X}Xt@.~;{y]=C/(R@vo,">
                                            <mutation elseif="1"></mutation>
                                            <value name="IF0">
                                              <block type="logic_compare" id="PzVs*;ol!*KBL*j^t)q|">
                                                <field name="OP">EQ</field>
                                                <value name="A">
                                                  <block type="variables_get" id="n~Bg9~[gqs[,X-E8M}o`">
                                                    <field name="VAR" id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</field>
                                                  </block>
                                                </value>
                                                <value name="B">
                                                  <block type="math_number" id="Oy8gy}|^Q+y-Tg+a.3cx">
                                                    <field name="NUM">1</field>
                                                  </block>
                                                </value>
                                              </block>
                                            </value>
                                            <statement name="DO0">
                                              <block type="comment" id="Awlzupeq7qdMK5AGOi]$">
                                                <field name="COMMENT">Ist es ein Switch-Befehl?</field>
                                                <next>
                                                  <block type="controls_if" id="y=G2tAb|R1EZP-vzy0|%">
                                                    <value name="IF0">
                                                      <block type="get_attr" id="TTx_Jvq)XqxKQ/xbl1Ub">
                                                        <value name="PATH">
                                                          <shadow type="text" id="Szg@1uiFGYgs*N3_Q!2k">
                                                            <field name="TEXT">NSPanel.params.switch</field>
                                                          </shadow>
                                                        </value>
                                                        <value name="OBJECT">
                                                          <block type="variables_get" id="jy4?,JKnm#6S.:3iI[S5">
                                                            <field name="VAR" id="tIM,K-nHxcf0DRJN(Y)C">resultObj</field>
                                                          </block>
                                                        </value>
                                                      </block>
                                                    </value>
                                                    <statement name="DO0">
                                                      <block type="control" id="EeIf8hXqw_zP/[c3iWh~">
                                                        <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                        <field name="OID">hue.0.Schreibtisch.on</field>
                                                        <field name="WITH_DELAY">FALSE</field>
                                                        <value name="VALUE">
                                                          <block type="logic_compare" id="|8Bl3@O7mOZ%*g*n1QYT">
                                                            <field name="OP">EQ</field>
                                                            <value name="A">
                                                              <block type="get_attr" id="X{!@:/Ael+hT^7v10DWK">
                                                                <value name="PATH">
                                                                  <shadow type="text" id="K-MPcd~az/E.B1,4hG3u">
                                                                    <field name="TEXT">NSPanel.params.switch</field>
                                                                  </shadow>
                                                                </value>
                                                                <value name="OBJECT">
                                                                  <block type="variables_get" id="r[3fNz]UId/UyCmdav6]">
                                                                    <field name="VAR" id="tIM,K-nHxcf0DRJN(Y)C">resultObj</field>
                                                                  </block>
                                                                </value>
                                                              </block>
                                                            </value>
                                                            <value name="B">
                                                              <block type="text" id="2IHj$68WOMw=Ts}c+r0H">
                                                                <field name="TEXT">on</field>
                                                              </block>
                                                            </value>
                                                          </block>
                                                        </value>
                                                      </block>
                                                    </statement>
                                                  </block>
                                                </next>
                                              </block>
                                            </statement>
                                            <value name="IF1">
                                              <block type="logic_compare" id="Cg6gGRghF.uMe,Bz0(lH">
                                                <field name="OP">EQ</field>
                                                <value name="A">
                                                  <block type="variables_get" id="O3ish0VOZxQxQ{$n..8H">
                                                    <field name="VAR" id="Hgc9h6j{(_HrOD+W-rN2">widgetIndex</field>
                                                  </block>
                                                </value>
                                                <value name="B">
                                                  <block type="math_number" id="eRbWjErChVYi8A_$)ATO">
                                                    <field name="NUM">2</field>
                                                  </block>
                                                </value>
                                              </block>
                                            </value>
                                          </block>
                                        </next>
                                      </block>
                                    </next>
                                  </block>
                                </statement>
                              </block>
                            </next>
                          </block>
                        </statement>
                        <next>
                          <block type="comment" id="LG9pn}J^;=p3%/.[/ZQH">
                            <field name="COMMENT">LWT überwachen, wenn Gerät wieder online</field>
                            <next>
                              <block type="on_ext" id="7`hBsLcs|]|+gKB9{k:*">
                                <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
                                <field name="CONDITION">ne</field>
                                <field name="ACK_CONDITION">true</field>
                                <value name="OID0">
                                  <shadow type="field_oid" id="OS$aDgD5RMCV0D*w:dOB">
                                    <field name="oid">default</field>
                                  </shadow>
                                  <block type="variables_get" id="S1onAM.%F86D0Y0T:/n,">
                                    <field name="VAR" id="aevDUp]R;DeT@4L/rdho">mqttLwtId</field>
                                  </block>
                                </value>
                                <statement name="STATEMENT">
                                  <block type="controls_if" id="1Zl(bF]sLz$:B:(g2Wvy">
                                    <value name="IF0">
                                      <block type="logic_compare" id="wOI#M-`K)ebeVKAPQJDs">
                                        <field name="OP">EQ</field>
                                        <value name="A">
                                          <block type="on_source" id="09hBZ8={I/z11+RQ0[k)">
                                            <field name="ATTR">state.val</field>
                                          </block>
                                        </value>
                                        <value name="B">
                                          <block type="text" id="2;S`K_QQLlb0L!915(*^">
                                            <field name="TEXT">Online</field>
                                          </block>
                                        </value>
                                      </block>
                                    </value>
                                    <statement name="DO0">
                                      <block type="debug" id="cbdJqZauF,H18x{(8Lt8">
                                        <field name="Severity">log</field>
                                        <value name="TEXT">
                                          <shadow type="text" id="as^JY._XYLiLpq_J[Y|M">
                                            <field name="TEXT">Gerät wieder online - übertrage Widgets in 5 Sekunden</field>
                                          </shadow>
                                        </value>
                                        <next>
                                          <block type="timeouts_settimeout" id="U4S^h#fW?VrNElhm!/9R">
                                            <field name="NAME">waitForBoot</field>
                                            <field name="DELAY">5</field>
                                            <field name="UNIT">sec</field>
                                            <statement name="STATEMENT">
                                              <block type="procedures_callnoreturn" id="#~G1[gfyht#w+ybY9hMt">
                                                <mutation name="initWidgets"></mutation>
                                              </block>
                                            </statement>
                                          </block>
                                        </next>
                                      </block>
                                    </statement>
                                  </block>
                                </statement>
                                <next>
                                  <block type="comment" id=")-n:BsiU4!-O$,NIY#M=">
                                    <field name="COMMENT">Wenn Änderung bestätigt: Feedback an Widget 1</field>
                                    <next>
                                      <block type="on_ext" id="gi)(I1mFU6#J#Q7ED`D$">
                                        <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
                                        <field name="CONDITION">any</field>
                                        <field name="ACK_CONDITION">true</field>
                                        <value name="OID0">
                                          <shadow type="field_oid" id="dVKBso]cCaN;9Na@3Efh">
                                            <field name="oid">hue.0.Schreibtisch.on</field>
                                          </shadow>
                                        </value>
                                        <statement name="STATEMENT">
                                          <block type="procedures_callcustomnoreturn" id="GK@I-l{LOT1f3#6Z1tLr">
                                            <mutation name="setWidgetParams">
                                              <arg name="index"></arg>
                                              <arg name="params"></arg>
                                            </mutation>
                                            <value name="ARG0">
                                              <block type="math_number" id="ql^P-/mY]ALrMTB,]oth">
                                                <field name="NUM">1</field>
                                              </block>
                                            </value>
                                            <value name="ARG1">
                                              <block type="convert_json2object" id="CaBI06^Vk={UOVWiy]Dh">
                                                <value name="VALUE">
                                                  <block type="text_join" id="/gQwArXf4nPPNqJG{fDe">
                                                    <mutation items="3"></mutation>
                                                    <value name="ADD0">
                                                      <block type="text" id="hB*x2{kHp8p(w9Da8dP0">
                                                        <field name="TEXT">{"switch":"</field>
                                                      </block>
                                                    </value>
                                                    <value name="ADD1">
                                                      <block type="logic_ternary" id="^:%04E8=-(Qtga4+wnY.">
                                                        <value name="IF">
                                                          <block type="on_source" id="Waa2QArV=XkB~r`:BK2t">
                                                            <field name="ATTR">state.val</field>
                                                          </block>
                                                        </value>
                                                        <value name="THEN">
                                                          <block type="text" id="{C0x/oMSSFhsp2gl]9qt">
                                                            <field name="TEXT">on</field>
                                                          </block>
                                                        </value>
                                                        <value name="ELSE">
                                                          <block type="text" id="ZgwcG{)XCUZBoGo`xN39">
                                                            <field name="TEXT">off</field>
                                                          </block>
                                                        </value>
                                                      </block>
                                                    </value>
                                                    <value name="ADD2">
                                                      <block type="text" id="(/k^gB{DV7E{Fq)Uedr8">
                                                        <field name="TEXT">"}</field>
                                                      </block>
                                                    </value>
                                                  </block>
                                                </value>
                                              </block>
                                            </value>
                                          </block>
                                        </statement>
                                      </block>
                                    </next>
                                  </block>
                                </next>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

Blockly-Beispiel Wetter

Dieses Script reagiert auf das Result-Objekt von Tasmota über MQTT. Das Full Topic unter Tasmota wurde dafür wie folgt konfiguriert: SmartHome/%topic%/%prefix%/. Bitte kontrolliere die IDs und passe diese an dein System an.

Das Script nutzt den AccuWeather Adapter vom ioBroker um die Wetterdaten regelmäßig auf dem Display zu aktualisieren. Theoretisch ist jeder Wetterdienst nutzbar, welcher folgende Daten bereitstellt:

  • aktuelle Temperatur
  • minimale Tages-Temperatur
  • maximale Tages-Temperatur
  • Icon für Wetter (Mapping erforderlich)

Im Beispiel von AccuWeather habe ich das

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="O{|4Q}KJVRSqG4eTWLm}">mqttCmndId</variable>
    <variable id="y{;7*d2wSl+HC)[!v]6k">accuWeatherIcon</variable>
    <variable id="4QQ$u;|`3:@K7hdmZZMK">weatherIcon</variable>
    <variable id="S|g!Uiy)(N:AKU3[l}k5">temp</variable>
    <variable id="S[P_?[h-MR-d$6%,aF}S">minTemp</variable>
    <variable id="kGu!Ey,Av+$d,hcBJP|j">maxTemp</variable>
  </variables>
  <block type="variables_set" id="4}uPYo@*PCz7m5.s7x}s" x="138" y="-187">
    <field name="VAR" id="O{|4Q}KJVRSqG4eTWLm}">mqttCmndId</field>
    <value name="VALUE">
      <block type="text" id="prK,0qg5{1~$3%mi:`NU">
        <field name="TEXT">mqtt.0.SmartHome.nspanel_C79304.cmnd.NSPSend</field>
      </block>
    </value>
    <next>
      <block type="procedures_callnoreturn" id="U0[:QR+{|t_9QT$sQN$:">
        <mutation name="sendWeather"></mutation>
        <next>
          <block type="on" id=":0#76?-EdaHN-1vo?-Jq">
            <field name="OID">accuweather.0.Current.Temperature</field>
            <field name="CONDITION">ne</field>
            <field name="ACK_CONDITION"></field>
            <statement name="STATEMENT">
              <block type="procedures_callnoreturn" id="2ELiICBH,keOYo}F@`ye">
                <mutation name="sendWeather"></mutation>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </next>
  </block>
  <block type="procedures_defcustomreturn" id="rj9Gwww2XG1=?OR,Zuh{" x="138" y="38">
    <mutation statements="false">
      <arg name="accuWeatherIcon" varid="y{;7*d2wSl+HC)[!v]6k"></arg>
    </mutation>
    <field name="NAME">convertIconId</field>
    <field name="SCRIPT">LyoKICAgIDEgPSBzdW5ueQogICAgMiA9IHN1bitjbG91ZAogICAgNyA9IGNsb3VkK2JsdWUgY2xvdWQKICAgIDExID0gY2xvdWQrZm9nCiAgICAxNSA9IGNsb3VkIHJhaW4gbGlnaHRuaW5nCiAgICAyMCA9IGNsb3VkK3Nub3dmbGFrZQogICAgMjIgPSBjbG91ZCArIDMgc25vd2ZsYWtlcwogICAgMjIgPSBjbG91ZCArIDUgaWNlIGNyeXN0YWxzCiAgICAyMiA9IGNsb3VkICsgcmFpbiArIHNub3cKICAgIDMwID0gcmVkIHRoZXJtb3N0YXQKICAgIDMxID0gYmx1ZSB0aGVybW9zdGF0CiAgICAzMiA9IHdpbmQKICAgIDQwID0gcmFpbnkgY2xvdWQKKi8KCmxldCBuc3BXZWF0aGVySWNvbiA9IDE7IC8vIERlZmF1bHQgInN1bm55IgoKc3dpdGNoIChhY2N1V2VhdGhlckljb24pIHsKICAgIGNhc2UgMTogLy8gU3VubnkKICAgIGNhc2UgMjogLy8gTW9zdGx5IFN1bm55CiAgICBjYXNlIDMzOiAvLyBDbGVhcgogICAgICAgIG5zcFdlYXRoZXJJY29uID0gMTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDM6IC8vIFBhcnRseSBTdW5ueQogICAgY2FzZSA0OiAvLyBJbnRlcm1pdHRlbnQgQ2xvdWRzCiAgICBjYXNlIDU6IC8vIEhhenkgU3Vuc2hpbmUKICAgIGNhc2UgMjE6IC8vIFBhcnRseSBTdW5ueSB3LyBGbHVycmllcwogICAgICAgIG5zcFdlYXRoZXJJY29uID0gMjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDY6IC8vIE1vc3RseSBDbG91ZHkKICAgIGNhc2UgNzogLy8gQ2xvdWR5CiAgICBjYXNlIDg6IC8vIERyZWFyeSAoT3ZlcmNhc3QpCiAgICBjYXNlIDE5OiAvLyBGbHVycmllcwogICAgY2FzZSAyMDogLy8gTW9zdGx5IENsb3VkeSB3LyBGbHVycmllcwogICAgY2FzZSAzNDogLy8gTW9zdGx5IENsZWFyCiAgICBjYXNlIDM1OiAvLyBQYXJ0bHkgQ2xvdWR5CiAgICBjYXNlIDM2OiAvLyBJbnRlcm1pdHRlbnQgQ2xvdWRzCiAgICBjYXNlIDM4OiAvLyBNb3N0bHkgQ2xvdWR5CiAgICBjYXNlIDQzOiAvLyBNb3N0bHkgQ2xvdWR5IHcvIEZsdXJyaWVzCiAgICAgICAgbnNwV2VhdGhlckljb24gPSA3OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMTE6IC8vIEZvZwogICAgY2FzZSAzNzogLy8gSGF6eSBNb29ubGlnaHQKICAgICAgICBuc3BXZWF0aGVySWNvbiA9IDExOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMTI6IC8vIFNob3dlcnMKICAgIGNhc2UgMTM6IC8vIE1vc3RseSBDbG91ZHkgdy8gU2hvd2VycwogICAgY2FzZSAxNDogLy8gUGFydGx5IFN1bm55IHcvIFNob3dlcnMKICAgIGNhc2UgMTU6IC8vIFQtU3Rvcm1zCiAgICBjYXNlIDE2OiAvLyBNb3N0bHkgQ2xvdWR5IHcvIFQtU3Rvcm1zCiAgICBjYXNlIDE3OiAvLyBQYXJ0bHkgU3Vubnkgdy8gVC1TdG9ybXMKICAgIGNhc2UgMTg6IC8vIFJhaW4KICAgIGNhc2UgMzk6IC8vIFBhcnRseSBDbG91ZHkgdy8gU2hvd2VycwogICAgY2FzZSA0MDogLy8gTW9zdGx5IENsb3VkeSB3LyBTaG93ZXJzCiAgICBjYXNlIDQxOiAvLyBQYXJ0bHkgQ2xvdWR5IHcvIFQtU3Rvcm1zCiAgICBjYXNlIDQyOiAvLyBNb3N0bHkgQ2xvdWR5IHcvIFQtU3Rvcm1zCiAgICAgICAgbnNwV2VhdGhlckljb24gPSAxNTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDIyOiAvLyBTbm93CiAgICBjYXNlIDIzOiAvLyBNb3N0bHkgQ2xvdWR5IHcvIFNub3cKICAgIGNhc2UgMjQ6IC8vIEljZQogICAgY2FzZSAyNTogLy8gU2xlZXQKICAgIGNhc2UgMjY6IC8vIEZyZWV6aW5nIFJhaW4KICAgIGNhc2UgMjk6IC8vIFJhaW4gYW5kIFNub3cKICAgIGNhc2UgNDQ6IC8vIE1vc3RseSBDbG91ZHkgdy8gU25vdwogICAgICAgIG5zcFdlYXRoZXJJY29uID0gMjI7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAzMDogLy8gSG90CiAgICAgICAgbnNwV2VhdGhlckljb24gPSAzMDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDMxOiAvLyBDb2xkCiAgICAgICAgbnNwV2VhdGhlckljb24gPSAzMTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDMyOiAvLyBXaW5keQogICAgICAgIG5zcFdlYXRoZXJJY29uID0gMzI7CiAgICAgICAgYnJlYWs7Cgp9CgpyZXR1cm4gbnNwV2VhdGhlckljb247</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defcustomnoreturn" id="D]R.mkLB-$LuV4#fSTH-" x="138" y="63">
    <mutation statements="false">
      <arg name="weatherIcon" varid="4QQ$u;|`3:@K7hdmZZMK"></arg>
      <arg name="temp" varid="S|g!Uiy)(N:AKU3[l}k5"></arg>
      <arg name="minTemp" varid="S[P_?[h-MR-d$6%,aF}S"></arg>
      <arg name="maxTemp" varid="kGu!Ey,Av+$d,hcBJP|j"></arg>
    </mutation>
    <field name="NAME">setWeather</field>
    <field name="SCRIPT">LyoKICAgIDEgPSBzdW5ueSAKICAgIDIgPSBzdW4rY2xvdWQgCiAgICA3ID0gY2xvdWQrYmx1ZSBjbG91ZCAKICAgIDExID0gY2xvdWQrZm9nIAogICAgMTUgPSBjbG91ZCByYWluIGxpZ2h0bmluZyAKICAgIDIwID0gY2xvdWQrc25vd2ZsYWtlIAogICAgMjIgPSBjbG91ZCArIDMgc25vd2ZsYWtlcyAKICAgIDIyID0gY2xvdWQgKyA1IGljZSBjcnlzdGFscyAKICAgIDIyID0gY2xvdWQgKyByYWluICsgc25vdyAKICAgIDMwID0gcmVkIHRoZXJtb3N0YXQgCiAgICAzMSA9IGJsdWUgdGhlcm1vc3RhdCAKICAgIDMyID0gd2luZCAKICAgIDQwID0gcmFpbnkgY2xvdWQgCiovCmNvbnN0IHdlYXRoZXJPYmplY3QgPSB7CiAgICAiSE1JX3dlYXRoZXIiOiB3ZWF0aGVySWNvbiwKICAgICJITUlfb3V0ZG9vclRlbXAiOiB7CiAgICAgICAgImN1cnJlbnQiOiBNYXRoLnJvdW5kKHRlbXApLAogICAgICAgICJyYW5nZSI6IE1hdGgucm91bmQobWluVGVtcCkudG9TdHJpbmcoKSArICcsJyArIE1hdGgucm91bmQobWF4VGVtcCkudG9TdHJpbmcoKQogICAgfQp9Owpjb25zb2xlLmxvZygnTlNQU2VuZDogJyArIEpTT04uc3RyaW5naWZ5KHdlYXRoZXJPYmplY3QpKTsKc2V0U3RhdGUobXF0dENtbmRJZCwgSlNPTi5zdHJpbmdpZnkod2VhdGhlck9iamVjdCkpOw==</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="procedures_defnoreturn" id="#`x/P9FlbrZhO+sQg*gP" x="138" y="88">
    <field name="NAME">sendWeather</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
    <statement name="STACK">
      <block type="comment" id="LUYrgwgupVz$uU~?(kaS">
        <field name="COMMENT">https://developer.accuweather.com/weather-icons</field>
        <next>
          <block type="procedures_callcustomnoreturn" id="pWl-uy05HXR2+p]?NRl7">
            <mutation name="setWeather">
              <arg name="weatherIcon"></arg>
              <arg name="temp"></arg>
              <arg name="minTemp"></arg>
              <arg name="maxTemp"></arg>
            </mutation>
            <value name="ARG0">
              <block type="procedures_callcustomreturn" id="3u8N^00^X@=6p6[m5TXH">
                <mutation name="convertIconId">
                  <arg name="accuWeatherIcon"></arg>
                </mutation>
                <value name="ARG0">
                  <block type="get_value" id="ZhObrG(m;*ab,FW88Eg|">
                    <field name="ATTR">val</field>
                    <field name="OID">accuweather.0.Current.WeatherIcon</field>
                  </block>
                </value>
              </block>
            </value>
            <value name="ARG1">
              <block type="get_value" id="}v0}vIbJ/o4pAeKy9t7r">
                <field name="ATTR">val</field>
                <field name="OID">accuweather.0.Current.Temperature</field>
              </block>
            </value>
            <value name="ARG2">
              <block type="get_value" id="d0f_P*y}8`n?qV-jqFv%">
                <field name="ATTR">val</field>
                <field name="OID">accuweather.0.Daily.Day1.Temperature.Minimum</field>
              </block>
            </value>
            <value name="ARG3">
              <block type="get_value" id="!A%;@.SoQK2ZSVS.!lLs">
                <field name="ATTR">val</field>
                <field name="OID">accuweather.0.Daily.Day1.Temperature.Maximum</field>
              </block>
            </value>
          </block>
        </next>
      </block>
    </statement>
  </block>
</xml>

Produkte

Mittlerweile gibt es das Produkt auch im Shop vom Hersteller.

SONOFF Zigbee 3.0 USB Dongle Plus Gateway, Universal Zigbee mit Antenne für Home Assistant, Open HAB usw., kabelloser Zigbee 3.0 USB-Adapter (1 Stück) **

SONOFF Zigbee Gateway, ZBDongle-E 3.0 USB Dongle Plus,EFR32MG21 + CH9102F Zigbee USB-Stick EFR32MG21 Coordinator für für ZHA in Home Assistant or Zigbee2MQTT,Open HAB etc. **

SONOFF NSPanel Smart Scene WLAN Wandschalter,WiFi Smart Schalter,2 Way Home Control Panel für Temperatur und Feuchtigkeitskontrolle,Smart Lichter, Schalter,Arbeitet mit Alexa & Google Home **

SONOFF NSPanelPro Smart Home Control Panel,Unterstützung der bidirektionalen Synchronisierung mit HA,Mit ZigbeeGateway,Intelligente Sicherheit Funktionen **

SONOFF BASICR3 10A Intelligenter kabelloser WLAN Lichtschalter, Universelles DIY-Modul für Automatisierungslösungen in der intelligenten Haustechnik, funktioniert mit Amazon Alexa, Google Home **

SONOFF POW R2 Intelligenter kabelloser WLAN-Lichtschalter mit Energieüberwachung, Smart Home, Universelles DIY-Modul für die intelligente Haustechnik, funktioniert mit Amazon Alexa/Google Hom/IFTTT **

Smart lichtschalter, SONOFF MINI R2 2PCS 2-Wege wifi Intelligenter, Universelles DIY-Modul für Automatisierungslösungen in der intelligenten Haustechnik, 2.4G wifi, APP control, Alexa Supported **

SONOFF DUALR3 Rollladenschalter, 2 Gänge, 2 Wege, WLAN, Smart Switch mit Energieüberwachung, Motormodus, kompatibel mit Alexa/Google Home/Siri, 15 A/3300 W **

4CH R3 WiFi Schalter Drahtlos Smart Switch Intelligent 4 Gang Inching (0.5-3600s)/Selbsthemmung/Interlock WLAN Schalter Kompatibel mit Alexa und Google Assistant + Abisolierzange **

SONOFF POW R3 25A Energiemessung WiFi Smart Switch Überlastschutz Energieeinsparung Reichweite in Sprachsteuerung ewelink über Alexa **

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte! Über 13.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos