Sonoff NSPanel - ioBroker-Integration

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Sonoff NSPanel - ioBroker-Integration
Sonoff NSPanel - ioBroker-Integration
  • 18.01.2022
  • Level 2
  • 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

Sonoff NSPanel kaufen

oder in weiß

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>

Transparenz-Hinweis (Level 2)

Für diesen Beitrag wurden mir Produkte kostenfrei zur Verfügung gestellt! Es wurden keinerlei Bedingungen, Richtlinien oder Vorgaben bezüglich der Inhalte, welche ich in meiner Bewertung äußern darf, auferlegt.

Darüber hinaus habe ich keine zusätzliche Vergütung erhalten.

Du willst mehr?

Smart-Home-Trainings von A-Z

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