Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. SONOFF NSPanel mit Lovelace UI

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

SONOFF NSPanel mit Lovelace UI

Geplant Angeheftet Gesperrt Verschoben Hardware
lovelace uinspanelsonoff
7.8k Beiträge 272 Kommentatoren 6.7m Aufrufe 254 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • W watcherkb

    @armilar sagte in SONOFF NSPanel mit Lovelace UI:

    Den Trashschedule kannst du vergessen...

    nein das würde ich nicht unbedingt sagen. Ich habe das so hinbekommen. Siehe Blockly

    @armilar sagte in SONOFF NSPanel mit Lovelace UI:

    Ich vermute mal die Stadt, Landkreis, Gemeinde oder was auch immer für so einen iCal zu verklagen bringt nix, oder?

    ärgert mich auch jedes Jahr aufs Neue. Aber verklagen...hmmm nee lass mal.

    @armilar sagte in SONOFF NSPanel mit Lovelace UI:

    Ich denke die Farbe rot (63488) ist im Moment dein kleinstes Problem. Aber ja, es gibt auch einen normalen Konverter:
    https://nodtem66.github.io/nextion-hmi-color-convert/index.html

    Danke. Damit bin ich mehr als zufrieden. Jetzt ist alles so wie ich das haben wollte.

    f616c2f8-8936-493c-8e31-2844736b685f-image.png

    <xml xmlns="https://developers.google.com/blockly/xml">
      <variables>
        <variable id="h}CE-n1lS|gRf(0K%./">i</variable>
        <variable id="j5C=K+Z.E:im1#q:;A=6">Muell_JSON</variable>
        <variable id="bz)nOPh@V8j9EuyGo#tR">Event</variable>
        <variable id="9^)S?J=tLkC7cUWc-u9w">Color</variable>
      </variables>
      <block type="on_ext" id="aFeZac36,?)=rfMg%3T|" x="102" y="-571">
        <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
        <field name="CONDITION">ne</field>
        <field name="ACK_CONDITION"></field>
        <value name="OID0">
          <shadow type="field_oid" id="GSzQ}epUa))me3m8yyuD">
            <field name="oid">trashschedule.0.type.json</field>
          </shadow>
        </value>
        <statement name="STATEMENT">
          <block type="controls_for" id="wduAM(OBPzLJ@bfYAK5%">
            <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
            <value name="FROM">
              <shadow type="math_number" id="HK~R2U|xb$U5W+tsHpN">
                <field name="NUM">0</field>
              </shadow>
            </value>
            <value name="TO">
              <shadow type="math_number" id="Ed[L/:1e9-cwxrRaZiIv">
                <field name="NUM">3</field>
              </shadow>
            </value>
            <value name="BY">
              <shadow type="math_number" id="o@5kngFiPpvl5dGo@Q$9">
                <field name="NUM">1</field>
              </shadow>
            </value>
            <statement name="DO">
              <block type="variables_set" id="0T)vK0k8aikvg7mF6XHo">
                <field name="VAR" id="j5C=K+Z.E:im1#q:;A=6">Muell_JSON</field>
                <value name="VALUE">
                  <block type="get_value" id="1~kG;UHn$nw2zzbfOIT]">
                    <field name="ATTR">val</field>
                    <field name="OID">trashschedule.0.type.json</field>
                  </block>
                </value>
                <next>
                  <block type="control_ex" id="UAu,2OBRJp9~Nzyxouyu">
                    <field name="TYPE">false</field>
                    <field name="CLEAR_RUNNING">FALSE</field>
                    <value name="OID">
                      <shadow type="field_oid" id="J_|uu;{e44n5Z-;qE+hP">
                        <field name="oid">Object ID</field>
                      </shadow>
                      <block type="text_join" id="8/|eHqk))j9Po-O*mKe">
                        <mutation items="3"></mutation>
                        <value name="ADD0">
                          <block type="text" id="Zp8GRfdfXujkeM41=PeZ">
                            <field name="TEXT">0_userdata.0.Abfallkalender.</field>
                          </block>
                        </value>
                        <value name="ADD1">
                          <block type="math_arithmetic" id="$!!l@[eJ~4Kdb5/Imo.X">
                            <field name="OP">ADD</field>
                            <value name="A">
                              <shadow type="math_number" id="zaU15{yD43xkuY@?)RY(">
                                <field name="NUM">1</field>
                              </shadow>
                              <block type="variables_get" id="o3pJ(+3KE~Co%u-dy.:W">
                                <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                              </block>
                            </value>
                            <value name="B">
                              <shadow type="math_number" id="_LBb[#z%M$n0~1Y}~8w+">
                                <field name="NUM">1</field>
                              </shadow>
                            </value>
                          </block>
                        </value>
                        <value name="ADD2">
                          <block type="text" id="Vt#-b{iDzusQQx]#0%0,">
                            <field name="TEXT">.date</field>
                          </block>
                        </value>
                      </block>
                    </value>
                    <value name="VALUE">
                      <shadow type="logic_boolean" id="/y1w}eely@o.gl$]#)o=">
                        <field name="BOOL">TRUE</field>
                      </shadow>
                      <block type="text_join" id="Ot@ht^^dx]t.dUS{D-q/">
                        <mutation items="3"></mutation>
                        <value name="ADD0">
                          <block type="text" id="SL}rWlk~qt@@3pdLc214">
                            <field name="TEXT">in</field>
                          </block>
                        </value>
                        <value name="ADD1">
                          <block type="get_attr" id="p~0A1{eb$lD~.99R4K)">
                            <value name="PATH">
                              <shadow type="text">
                                <field name="TEXT">0.date</field>
                              </shadow>
                              <block type="text_join" id="DDs!.^n(V7=A_TK}DFQt">
                                <mutation items="2"></mutation>
                                <value name="ADD0">
                                  <block type="variables_get" id="k1+Dybgb:u2y9v57OrCg">
                                    <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                                  </block>
                                </value>
                                <value name="ADD1">
                                  <block type="text" id="EXgB=?B}IKiUdQ.2tKoa">
                                    <field name="TEXT">.daysLeft</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="OBJECT">
                              <block type="variables_get" id="dzLb1f^T!(MM,d=cYU9y">
                                <field name="VAR" id="j5C=K+Z.E:im1#q:;A=6">Muell_JSON</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <value name="ADD2">
                          <block type="text" id=")w#|wt0P9}b[r$B3-geY">
                            <field name="TEXT"> Tage(n)</field>
                          </block>
                        </value>
                      </block>
                    </value>
                    <value name="DELAY_MS">
                      <shadow type="math_number" id="f8q~r@+q|8Kov#3EufsI">
                        <field name="NUM">0</field>
                      </shadow>
                    </value>
                    <next>
                      <block type="control_ex" id="]_w?GOU-5.~E-i6S#/y]">
                        <field name="TYPE">false</field>
                        <field name="CLEAR_RUNNING">FALSE</field>
                        <value name="OID">
                          <shadow type="field_oid">
                            <field name="oid">Object ID</field>
                          </shadow>
                          <block type="text_join" id="1IWx]e}A.$qn9~[}SmRH">
                            <mutation items="3"></mutation>
                            <value name="ADD0">
                              <block type="text" id="}}vqlPTz3IN2YehTE##l">
                                <field name="TEXT">0_userdata.0.Abfallkalender.</field>
                              </block>
                            </value>
                            <value name="ADD1">
                              <block type="math_arithmetic" id="(A;_Uo2By37YrwU]9mFu">
                                <field name="OP">ADD</field>
                                <value name="A">
                                  <shadow type="math_number">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="variables_get" id=",2)MJ?8)IgaPI`_H|7{+">
                                    <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                                  </block>
                                </value>
                                <value name="B">
                                  <shadow type="math_number" id="Lqx[mK!|G-P}_}Re`aty">
                                    <field name="NUM">1</field>
                                  </shadow>
                                </value>
                              </block>
                            </value>
                            <value name="ADD2">
                              <block type="text" id="zoz4l3;4A!og)lcQa{$e">
                                <field name="TEXT">.event</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <value name="VALUE">
                          <shadow type="logic_boolean" id="s)#y}=/vy2(5j|pWMtdo">
                            <field name="BOOL">TRUE</field>
                          </shadow>
                          <block type="text_join" id="vIN]{HQG+8bum%7aAuX|">
                            <mutation items="2"></mutation>
                            <value name="ADD0">
                              <block type="get_attr" id="H~hW%jrPx3;)!8k_MzJC">
                                <value name="PATH">
                                  <shadow type="text">
                                    <field name="TEXT">0.date</field>
                                  </shadow>
                                  <block type="text_join" id="ufEdj1$Wn(#o_]FG`X$q">
                                    <mutation items="2"></mutation>
                                    <value name="ADD0">
                                      <block type="variables_get" id="dHFn%XN=cKk@n=}+4a[u">
                                        <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                                      </block>
                                    </value>
                                    <value name="ADD1">
                                      <block type="text" id="J[}G3f:sbyCeFGWiN@h7">
                                        <field name="TEXT">.name</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <value name="OBJECT">
                                  <block type="variables_get" id="$)|%;_-Q9.ullt4-k?Y*">
                                    <field name="VAR" id="j5C=K+Z.E:im1#q:;A=6">Muell_JSON</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="ADD1">
                              <block type="text" id="95lxj}AqSKWZvz!%/s(6">
                                <field name="TEXT">e Tonne</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <value name="DELAY_MS">
                          <shadow type="math_number" id="8jmxPB/ICrJtPos/}/79">
                            <field name="NUM">0</field>
                          </shadow>
                        </value>
                        <next>
                          <block type="variables_set" id="%EBcjrb4WrQuDQW#Z(FO">
                            <field name="VAR" id="bz)nOPh@V8j9EuyGo#tR">Event</field>
                            <value name="VALUE">
                              <block type="get_attr" id=";__m$h8Yy1=2Y~r~QE_[">
                                <value name="PATH">
                                  <shadow type="text">
                                    <field name="TEXT">0.date</field>
                                  </shadow>
                                  <block type="text_join" id="M@!Nitlt:hsg0rwnvzI5">
                                    <mutation items="2"></mutation>
                                    <value name="ADD0">
                                      <block type="variables_get" id="n0?tH}eUFPZ)bIDfeN+?">
                                        <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                                      </block>
                                    </value>
                                    <value name="ADD1">
                                      <block type="text" id=")a0G8E@fOVM$`)t*RpD*">
                                        <field name="TEXT">.name</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <value name="OBJECT">
                                  <block type="variables_get" id="bAfJR^zv_5f.5u#!5g(m">
                                    <field name="VAR" id="j5C=K+Z.E:im1#q:;A=6">Muell_JSON</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <next>
                              <block type="controls_if" id="tXaayC+p1w53M0p2$Qz{">
                                <mutation elseif="3"></mutation>
                                <value name="IF0">
                                  <block type="logic_compare" id="Gf?a-8/nEptmd/W(1?AZ">
                                    <field name="OP">EQ</field>
                                    <value name="A">
                                      <block type="variables_get" id="mnE+_j#S55)5tkMyBszO">
                                        <field name="VAR" id="bz)nOPh@V8j9EuyGo#tR">Event</field>
                                      </block>
                                    </value>
                                    <value name="B">
                                      <block type="text" id="l@ux*P`cj+uhYDUGk_zC">
                                        <field name="TEXT">Rot</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <statement name="DO0">
                                  <block type="variables_set" id="`k#VGEVT;q9bd;8%=m44">
                                    <field name="VAR" id="9^)S?J=tLkC7cUWc-u9w">Color</field>
                                    <value name="VALUE">
                                      <block type="text" id="eMh`#rerG7QHO$9^C,HJ">
                                        <field name="TEXT">63488</field>
                                      </block>
                                    </value>
                                  </block>
                                </statement>
                                <value name="IF1">
                                  <block type="logic_compare" id="N+,K`:%@6Xx4vfdpkAE$">
                                    <field name="OP">EQ</field>
                                    <value name="A">
                                      <block type="variables_get" id="|vZqHsotUp9ckk[y|hX@">
                                        <field name="VAR" id="bz)nOPh@V8j9EuyGo#tR">Event</field>
                                      </block>
                                    </value>
                                    <value name="B">
                                      <block type="text" id="^T04d,^Fc%-L-YjzT,uL">
                                        <field name="TEXT">Grün</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <statement name="DO1">
                                  <block type="variables_set" id="7+%yuK|ZU51VG.~UAPX|">
                                    <field name="VAR" id="9^)S?J=tLkC7cUWc-u9w">Color</field>
                                    <value name="VALUE">
                                      <block type="text" id="rF#S_)zhcIR,({D:,6Gg">
                                        <field name="TEXT">2016</field>
                                      </block>
                                    </value>
                                  </block>
                                </statement>
                                <value name="IF2">
                                  <block type="logic_compare" id="~rONaO{}7ailk.P#ulR^">
                                    <field name="OP">EQ</field>
                                    <value name="A">
                                      <block type="variables_get" id="-B;/3`+B8|a:k2dt51|,">
                                        <field name="VAR" id="bz)nOPh@V8j9EuyGo#tR">Event</field>
                                      </block>
                                    </value>
                                    <value name="B">
                                      <block type="text" id="}qRYFseQ;p`M[$.%NXmm">
                                        <field name="TEXT">Blau</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <statement name="DO2">
                                  <block type="variables_set" id="_UGXuK6.EG~z[b473Li3">
                                    <field name="VAR" id="9^)S?J=tLkC7cUWc-u9w">Color</field>
                                    <value name="VALUE">
                                      <block type="text" id="T**J}r52Y?EOO,*TI8/V">
                                        <field name="TEXT">31</field>
                                      </block>
                                    </value>
                                  </block>
                                </statement>
                                <value name="IF3">
                                  <block type="logic_compare" id="acD,Sm68eG7q|b~HE(;%">
                                    <field name="OP">EQ</field>
                                    <value name="A">
                                      <block type="variables_get" id="S@qV6E6CP;#L-p15YxC5">
                                        <field name="VAR" id="bz)nOPh@V8j9EuyGo#tR">Event</field>
                                      </block>
                                    </value>
                                    <value name="B">
                                      <block type="text" id="SZZwEr}.Gx*`Cfs4eD5i">
                                        <field name="TEXT">Gelb</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <statement name="DO3">
                                  <block type="variables_set" id="Fg:grnG/RPtFEm+):MXY">
                                    <field name="VAR" id="9^)S?J=tLkC7cUWc-u9w">Color</field>
                                    <value name="VALUE">
                                      <block type="text" id="?!wdhxoplCDsUalc7tHn">
                                        <field name="TEXT">65504</field>
                                      </block>
                                    </value>
                                  </block>
                                </statement>
                                <next>
                                  <block type="control_ex" id="86u,p}Dxgze{r!N_tOrS">
                                    <field name="TYPE">false</field>
                                    <field name="CLEAR_RUNNING">FALSE</field>
                                    <value name="OID">
                                      <shadow type="field_oid">
                                        <field name="oid">Object ID</field>
                                      </shadow>
                                      <block type="text_join" id="k/AbJMF4QuH#-t6yNWQq">
                                        <mutation items="3"></mutation>
                                        <value name="ADD0">
                                          <block type="text" id="UX(FqRfcaRtglU)#0Ec,">
                                            <field name="TEXT">0_userdata.0.Abfallkalender.</field>
                                          </block>
                                        </value>
                                        <value name="ADD1">
                                          <block type="math_arithmetic" id="[VKD(T)Iu`[%0,`LaO;9">
                                            <field name="OP">ADD</field>
                                            <value name="A">
                                              <shadow type="math_number">
                                                <field name="NUM">1</field>
                                              </shadow>
                                              <block type="variables_get" id="/fJro16A:Q}{xj-y=5Op">
                                                <field name="VAR" id="h}CE-n1lS|gRf(0K%./">i</field>
                                              </block>
                                            </value>
                                            <value name="B">
                                              <shadow type="math_number" id=".5Y^SD+M#T@GvtGLkw8x">
                                                <field name="NUM">1</field>
                                              </shadow>
                                            </value>
                                          </block>
                                        </value>
                                        <value name="ADD2">
                                          <block type="text" id="`BX]qTGgRz$%?lj:xf~Z">
                                            <field name="TEXT">.color</field>
                                          </block>
                                        </value>
                                      </block>
                                    </value>
                                    <value name="VALUE">
                                      <shadow type="logic_boolean">
                                        <field name="BOOL">TRUE</field>
                                      </shadow>
                                      <block type="variables_get" id="V635SZTnwPASkZb%7EG1">
                                        <field name="VAR" id="9^)S?J=tLkC7cUWc-u9w">Color</field>
                                      </block>
                                    </value>
                                    <value name="DELAY_MS">
                                      <shadow type="math_number" id="bF4s2sRvXL?HTka(MqfW">
                                        <field name="NUM">0</field>
                                      </shadow>
                                    </value>
                                  </block>
                                </next>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </statement>
          </block>
        </statement>
      </block>
    </xml>
    
    ArmilarA Offline
    ArmilarA Offline
    Armilar
    Most Active Forum Testing
    schrieb am zuletzt editiert von
    #1594

    @watcherkb 👍

    Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
    https://github.com/joBr99/nspanel-lovelace-ui/wiki

    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

    1 Antwort Letzte Antwort
    0
    • ArmilarA Armilar

      @carlos

      Die id: 0 muss dem Blockly noch hinzugefügt werden. Die visualisiert den mittleren Balken in der cardPower. Bei den meisten wahrscheinlich immer das gleiche.

      C Offline
      C Offline
      carlos
      schrieb am zuletzt editiert von
      #1595

      @armilar
      Das dachte ich mir schon, aber wie mache ich das.
      Bin leider nicht so fit im blockly programmieren.

      ArmilarA 1 Antwort Letzte Antwort
      0
      • ArmilarA Armilar

        @jleg

        da "originale" NSPanel stellt ja i.W. einen Thermostaten (klick-klack) per Relais (und wohl dem internen Temp.fühler) bereit.

        Eigentlich nicht wirklich, da am hinteren Ausgang nur 2 Ausgänge für die Button-Relays zur Verfügung stehen. Die kann man natürlich auch für Thermostate verwenden, allerdings muss das dann mit externer Logik (z.B. Blockly) verarbeitet werden.

        dass die "cardThermo" eine "GUI" für einen existierenden Thermostaten bereitstellt - aber selbst "Themostat spielen" geht nicht.

        Kann das Original NSPanel aber auch nicht... Ist auch nur eine GUI und die hat in der Temperaturlogik sogar noch Fehler...

        Kommt jetzt darauf an, was wie gesteuert werden soll. Ich sag es mal so - wenn es einen Heizungs-Aktor gibt der gesteuert werden kann, dann hat der minimalistisch einen On/Off mit true/false. Dann kann es natürlich mit dem NSPanel gesteuert werden.

        Am Panel stellst du eine Zieltemperatur (mit eigenem Datenunkt in 0_userdata) ein und kannst auch die interne Temperatur (Die Temperatur wird vom TS-Script in 0_userdata bei Veränderung in einen DP geschrieben) abgreifen:

        5a8d949d-20a2-4ffe-b626-ef0cb343cd7b-image.png

        Mittels eines Blocklys realisiert du nun die Steuerung:

        Wenn Sensor-Temperatur (Raumtemperatur) kleiner der Solltemperatur (Setpoint), dann Heizaktor an.
        Wenn Sensor-Temperatur (Raumtemperatur) größer der Solltemperatur (Setpoint), dann Heizaktor aus.

        Wenn eine Heizung an den Relais (hintere 1-2 Ausgänge) hängt, kannst du das Relais ebenfalls mittels Datenpunkt ansteuern und das Panel als Aktor nutzen.

        42ccc260-87f9-477e-bb70-83d297084e0f-image.png

        JLegJ Offline
        JLegJ Offline
        JLeg
        schrieb am zuletzt editiert von
        #1596

        @armilar sagte in SONOFF NSPanel mit Lovelace UI:

        Kommt jetzt darauf an, was wie gesteuert werden soll. Ich sag es mal so - wenn es einen Heizungs-Aktor gibt der gesteuert werden kann, dann hat der minimalistisch einen On/Off mit true/false. Dann kann es natürlich mit dem NSPanel gesteuert werden.
        Am Panel stellst du eine Zieltemperatur (mit eigenem Datenunkt in 0_userdata) ein und kannst auch die interne Temperatur (Die Temperatur wird vom TS-Script in 0_userdata bei Veränderung in einen DP geschrieben) abgreifen:

        Danke, ich glaube, das war dann der springende Punkt - ich kann also eine cardThermo auch benutzen, ohne wirklich einen "richtigen" Thermostaten im Alias zu haben, sondern DPs für Ziel-Temp. und Relais plus Script genügen. Dann probier' ich das doch mal... 🙂

        Btw, der Sonoff-Sprech für NSPanel lässt mich schon erwarten, dass das Ding "selfcontained" Thermostat spielen kann:

        Equipped with a built-in powerful thermostat, and environmental sensors, the NSPanel picks up the surrounding temperature and lets you trigger your heating or cooling appliances so that they always automatically keep the room temperature stable and adjust to the preferred temperature.

        ArmilarA 1 Antwort Letzte Antwort
        0
        • JLegJ JLeg

          @armilar sagte in SONOFF NSPanel mit Lovelace UI:

          Kommt jetzt darauf an, was wie gesteuert werden soll. Ich sag es mal so - wenn es einen Heizungs-Aktor gibt der gesteuert werden kann, dann hat der minimalistisch einen On/Off mit true/false. Dann kann es natürlich mit dem NSPanel gesteuert werden.
          Am Panel stellst du eine Zieltemperatur (mit eigenem Datenunkt in 0_userdata) ein und kannst auch die interne Temperatur (Die Temperatur wird vom TS-Script in 0_userdata bei Veränderung in einen DP geschrieben) abgreifen:

          Danke, ich glaube, das war dann der springende Punkt - ich kann also eine cardThermo auch benutzen, ohne wirklich einen "richtigen" Thermostaten im Alias zu haben, sondern DPs für Ziel-Temp. und Relais plus Script genügen. Dann probier' ich das doch mal... 🙂

          Btw, der Sonoff-Sprech für NSPanel lässt mich schon erwarten, dass das Ding "selfcontained" Thermostat spielen kann:

          Equipped with a built-in powerful thermostat, and environmental sensors, the NSPanel picks up the surrounding temperature and lets you trigger your heating or cooling appliances so that they always automatically keep the room temperature stable and adjust to the preferred temperature.

          ArmilarA Offline
          ArmilarA Offline
          Armilar
          Most Active Forum Testing
          schrieb am zuletzt editiert von
          #1597

          @jleg

          Ja das ist der Vorteil der Alias-Struktur... Dem TS-Script und dem NSPanel ist es völlig egal was für eine Gerät am anderen Ende hängt. Und auch völlig egal, ob es eine "echtes" oder ein "virtuelles" Gerät ist.

          Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
          https://github.com/joBr99/nspanel-lovelace-ui/wiki

          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

          1 Antwort Letzte Antwort
          0
          • C carlos

            @armilar
            Das dachte ich mir schon, aber wie mache ich das.
            Bin leider nicht so fit im blockly programmieren.

            ArmilarA Offline
            ArmilarA Offline
            Armilar
            Most Active Forum Testing
            schrieb am zuletzt editiert von
            #1598

            @carlos

            ich erweitere das Blockly-Beispiel (evtl. heute Abend kurz) um die id: 0

            Dann melde ich mich nochmal dazu ...

            Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
            https://github.com/joBr99/nspanel-lovelace-ui/wiki

            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

            ArmilarA 1 Antwort Letzte Antwort
            1
            • ArmilarA Armilar

              @carlos

              ich erweitere das Blockly-Beispiel (evtl. heute Abend kurz) um die id: 0

              Dann melde ich mich nochmal dazu ...

              ArmilarA Offline
              ArmilarA Offline
              Armilar
              Most Active Forum Testing
              schrieb am zuletzt editiert von Armilar
              #1599

              @carlos

              Ist zwar noch nicht ganz Abend 😉 , aber ich habe mal einen statischen Block für id: 0 eingefügt:

              Blockly:
              https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/Blockly/CardPower_Emulator_Skript.xml

              Einfach den "gelben" Block einsetzen:

              70ed740c-1dde-467e-8fe7-a14e0abab94a-image.png

              Sieht dann so aus:
              78234f26-953a-4ce8-ba7a-157525a5696b-image.png

              Einfach mal aus dem DP herauskopiert (exemplarisch)

              [
                {
                  "id": 0,
                  "value": "",
                  "unit": "",
                  "icon": "home",
                  "iconColor": 0
                },
                {
                  "id": 1,
                  "value": 3,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "battery-charging-60",
                  "iconColor": 10,
                  "speed": -3
                },
                {
                  "id": 2,
                  "value": 4.7,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "solar-power-variant",
                  "iconColor": 3,
                  "speed": 2
                },
                {
                  "id": 3,
                  "value": 4.5,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "wind-turbine",
                  "iconColor": 1,
                  "speed": 3
                },
                {
                  "id": 4,
                  "value": 1.9,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "shape",
                  "iconColor": 10,
                  "speed": 3
                },
                {
                  "id": 5,
                  "value": 2.9,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "transmission-tower",
                  "iconColor": 0,
                  "speed": 2
                },
                {
                  "id": 6,
                  "value": 1.4,
                  "unit": "kW",
                  "direction": "in",
                  "icon": "car",
                  "iconColor": 3,
                  "speed": 3
                }
              ]
              

              Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
              https://github.com/joBr99/nspanel-lovelace-ui/wiki

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              C 1 Antwort Letzte Antwort
              0
              • ArmilarA Armilar

                @ronny130286

                Die Funktion für den Monobutton war damals so

                Ich fasse mal kurz wieder zusammen:
                Stimmt es ging eigentlich darum, dass "true" und "false" im Abstand von 250ms gesendet wird. Kein Problem, dass haben wir schnell mittels eines neuen zusätzlichen PageItem-Parameters ( ggfs. monoButton: 'true' ) drin... Aber dann fällt die Farbe beim Rendern auf "false" zurück und es gibt niemals einen "On"-Zustand beim Visualisieren des Icons. Wenn aber ein Zusätzlicher Datenpunkt genutzt wird, der auf bei Veränderung des Schaltdatenpunktes "false" reagiert und invertiert wird, dann sollte es klappen.

                Wenn man also dem Taster jetzt noch einen separaten State im Alias verpasst, könnte der auch im Zuge des Rendern angezeigt werden, vorausgesetzt dieser neue zusätzliche Parameter im PageItem ist vorhanden.

                Der erste Datenpunkt ist im Adapter deiner Steuerung und benötigt true --> Verzögerung 250ms -->false. Darauf wird ein Alias: ACTUAL gesetzt.

                Der zweite Datenpunkt ist im Prinzip der Aktor der geschaltet wird (z.B. Zustand einer Lampe oder Steckdose, etc.). Darauf wird dann im gleichen Alias STATE gesetzt, der auf den Zustand des Aktors zeigt.

                Damit wäre die Lösung losgelöst von separaten Schalter oder z.B. iot-Adapter, welche ja auch nur den Zustand der S7 veändern. Der Zustand der Aktors wäre eigentlich immer korrekt, oder?

                Wenn das so für dich okay ist, würde ich da mal etwas implementieren und du würdest dann mal testen, ob sich Zustände und Icons entsprechend verhalten...

                R Offline
                R Offline
                ronny130286
                schrieb am zuletzt editiert von ronny130286
                #1600

                @armilar

                Ja so ist es wäre es richtig 😉

                So sieht meine Änderung aus => Änderungen sind dort wo Monobutton seht
                Mein Alias hat dann den zusätzlichen .STATE bekommen, wo von der SPS der eigentliche Ausgange abgefragt wird (der macht dann den Status)

                panel.ts

                ggf. kannst du es gleich so übernehmen, ich würde aber auch deine Lösung testen, am besten schreibst mich per PN an 😉
                Vielleicht kannst du auch gleich das Display Update für die verschieden Panels US-L, US-P, EU mit übernehmen 🙂

                @ronny130286 said in SONOFF NSPanel mit Lovelace UI:

                Gibt es eigentlich eine Möglichkeit einen Monobutton (true/false) einzubinden?
                Weil es steht immer noch oben in der Beschreibung:

                Taste               - Für Szenen oder Radiosender, etc. --> Nur Funktionsaufruf - Kein Taster wie MonoButton - True/False
                

                Dann ist mir noch ein kleiner Bug im Script aufgefallen, die Funktion vom Display Update ignoriert die eigentlich Version des Displays.
                Ich habe mehrere Panels im Einsatz unter anderem auch die US-L Version, leider zerknallt er dann immer die Software auf dem Display 😞
                Kann man die Abfrage nicht noch zusätzlich einpflegen, dass auch wirklich nur die Software genommen wird welche das Panel auch benötigt?

                Edit:
                habe die Funktion mal angepasst:

                function update_tft_firmware() {
                    const tft_version: string = 'v3.8.1';
                    let desired_display_firmware_url =""
                
                    if(getState(NSPanel_Path + '.NSPanel_Version').val =="us-l"){
                        desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-${tft_version}.tft`;
                    }else if (getState(NSPanel_Path + '.NSPanel_Version').val =="us-p"){
                        desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-${tft_version}.tft`;
                    }else{
                        desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-${tft_version}.tft`;
                    }
                    
                    try {
                
                        let urlString = `http://${get_current_tasmota_ip_address()}/cm?cmnd=FlashNextion ${desired_display_firmware_url}`;
                        if (tasmota_web_admin_password != '') {
                            urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=FlashNextion ${desired_display_firmware_url}`;
                        }
                
                        request({
                            url: `${urlString}`,
                            headers: {
                                'User-Agent': 'ioBroker'
                            }
                        }, async function () {
                            await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
                            await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: tft_version, ack: true });
                        });
                    } catch (err) {
                        console.warn('error at function update_tft_firmware: ' + err.message);
                    }
                }
                

                Ich habe noch eine Kleinigkeit festgestellt (bin mir auch nicht sicher ob das schon immer war) aber scheinbar werden die States doppelt gesetzt und es kommt zum hin und her hüpfen (siehe Video) 20230109-190214_gzDhsaJe.mp4

                Wenn ich richtig liegt entsteht das verhalten durch die

                function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = false): string {
                

                an der Stelle:

                // Fallback if no name is given
                            name = pageItem.name !== undefined ? pageItem.name : o.common.name.de;
                                    
                            if (existsState(pageItem.id + '.GET')) {
                                val = getState(pageItem.id + '.GET').val;
                                RegisterEntityWatcher(pageItem.id + '.GET');
                            }
                            // Änderung für Monobutton
                			if (existsState(pageItem.id + ".STATE")) {
                				val = getState(pageItem.id + ".STATE").val;
                				RegisterEntityWatcher(pageItem.id + ".STATE");
                            }
                            if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE")) {
                                val = getState(pageItem.id + '.SET').val;
                                RegisterEntityWatcher(pageItem.id + '.SET');
                            } 
                			// Änderung für Monobutton
                            if (existsState(pageItem.id + '.ACTUAL')) {
                                val = getState(pageItem.id + '.ACTUAL').val;
                                RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                            }
                            if (existsState(pageItem.id + '.ON_ACTUAL')) {
                                val = getState(pageItem.id + '.ON_ACTUAL').val;
                                RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                            } 
                            if (existsState(pageItem.id + '.ON_SET')) {
                                val = getState(pageItem.id + '.ON_SET').val;
                                RegisterEntityWatcher(pageItem.id + '.ON_SET');
                            }
                            if (existsState(pageItem.id + '.ON')) {
                                val = getState(pageItem.id + '.ON').val;
                                RegisterEntityWatcher(pageItem.id + '.ON');
                            }
                

                sobald bsp. .Set und .ACTUAL im Alias hat dann scheint das aufzutreten
                Quick und dirt würde mir einfallen

                            let onlyOneState = 0;
                
                            if (existsState(pageItem.id + '.GET')) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.GET').val;
                                RegisterEntityWatcher(pageItem.id + '.GET');
                            }
                            // Änderung für Monobutton
                			if (existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                onlyOneState = 1;
                				val = getState(pageItem.id + ".STATE").val;
                				RegisterEntityWatcher(pageItem.id + ".STATE");
                            }
                            if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.SET').val;
                                RegisterEntityWatcher(pageItem.id + '.SET');
                            }
                            // Änderung für Monobutton 
                            if (existsState(pageItem.id + '.ACTUAL') && onlyOneState==0) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.ACTUAL').val;
                                RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                            }
                            if (existsState(pageItem.id + '.ON_ACTUAL') && onlyOneState==0) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.ON_ACTUAL').val;
                                RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                            } 
                            if (existsState(pageItem.id + '.ON_SET') && onlyOneState==0) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.ON_SET').val;
                                RegisterEntityWatcher(pageItem.id + '.ON_SET');
                            }
                            if (existsState(pageItem.id + '.ON') && onlyOneState==0) {
                                onlyOneState = 1;
                                val = getState(pageItem.id + '.ON').val;
                                RegisterEntityWatcher(pageItem.id + '.ON');
                            }
                
                ArmilarA 1 Antwort Letzte Antwort
                0
                • R ronny130286

                  @armilar

                  Ja so ist es wäre es richtig 😉

                  So sieht meine Änderung aus => Änderungen sind dort wo Monobutton seht
                  Mein Alias hat dann den zusätzlichen .STATE bekommen, wo von der SPS der eigentliche Ausgange abgefragt wird (der macht dann den Status)

                  panel.ts

                  ggf. kannst du es gleich so übernehmen, ich würde aber auch deine Lösung testen, am besten schreibst mich per PN an 😉
                  Vielleicht kannst du auch gleich das Display Update für die verschieden Panels US-L, US-P, EU mit übernehmen 🙂

                  @ronny130286 said in SONOFF NSPanel mit Lovelace UI:

                  Gibt es eigentlich eine Möglichkeit einen Monobutton (true/false) einzubinden?
                  Weil es steht immer noch oben in der Beschreibung:

                  Taste               - Für Szenen oder Radiosender, etc. --> Nur Funktionsaufruf - Kein Taster wie MonoButton - True/False
                  

                  Dann ist mir noch ein kleiner Bug im Script aufgefallen, die Funktion vom Display Update ignoriert die eigentlich Version des Displays.
                  Ich habe mehrere Panels im Einsatz unter anderem auch die US-L Version, leider zerknallt er dann immer die Software auf dem Display 😞
                  Kann man die Abfrage nicht noch zusätzlich einpflegen, dass auch wirklich nur die Software genommen wird welche das Panel auch benötigt?

                  Edit:
                  habe die Funktion mal angepasst:

                  function update_tft_firmware() {
                      const tft_version: string = 'v3.8.1';
                      let desired_display_firmware_url =""
                  
                      if(getState(NSPanel_Path + '.NSPanel_Version').val =="us-l"){
                          desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-${tft_version}.tft`;
                      }else if (getState(NSPanel_Path + '.NSPanel_Version').val =="us-p"){
                          desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-${tft_version}.tft`;
                      }else{
                          desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-${tft_version}.tft`;
                      }
                      
                      try {
                  
                          let urlString = `http://${get_current_tasmota_ip_address()}/cm?cmnd=FlashNextion ${desired_display_firmware_url}`;
                          if (tasmota_web_admin_password != '') {
                              urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=FlashNextion ${desired_display_firmware_url}`;
                          }
                  
                          request({
                              url: `${urlString}`,
                              headers: {
                                  'User-Agent': 'ioBroker'
                              }
                          }, async function () {
                              await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
                              await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: tft_version, ack: true });
                          });
                      } catch (err) {
                          console.warn('error at function update_tft_firmware: ' + err.message);
                      }
                  }
                  

                  Ich habe noch eine Kleinigkeit festgestellt (bin mir auch nicht sicher ob das schon immer war) aber scheinbar werden die States doppelt gesetzt und es kommt zum hin und her hüpfen (siehe Video) 20230109-190214_gzDhsaJe.mp4

                  Wenn ich richtig liegt entsteht das verhalten durch die

                  function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = false): string {
                  

                  an der Stelle:

                  // Fallback if no name is given
                              name = pageItem.name !== undefined ? pageItem.name : o.common.name.de;
                                      
                              if (existsState(pageItem.id + '.GET')) {
                                  val = getState(pageItem.id + '.GET').val;
                                  RegisterEntityWatcher(pageItem.id + '.GET');
                              }
                              // Änderung für Monobutton
                  			if (existsState(pageItem.id + ".STATE")) {
                  				val = getState(pageItem.id + ".STATE").val;
                  				RegisterEntityWatcher(pageItem.id + ".STATE");
                              }
                              if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE")) {
                                  val = getState(pageItem.id + '.SET').val;
                                  RegisterEntityWatcher(pageItem.id + '.SET');
                              } 
                  			// Änderung für Monobutton
                              if (existsState(pageItem.id + '.ACTUAL')) {
                                  val = getState(pageItem.id + '.ACTUAL').val;
                                  RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                              }
                              if (existsState(pageItem.id + '.ON_ACTUAL')) {
                                  val = getState(pageItem.id + '.ON_ACTUAL').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                              } 
                              if (existsState(pageItem.id + '.ON_SET')) {
                                  val = getState(pageItem.id + '.ON_SET').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON_SET');
                              }
                              if (existsState(pageItem.id + '.ON')) {
                                  val = getState(pageItem.id + '.ON').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON');
                              }
                  

                  sobald bsp. .Set und .ACTUAL im Alias hat dann scheint das aufzutreten
                  Quick und dirt würde mir einfallen

                              let onlyOneState = 0;
                  
                              if (existsState(pageItem.id + '.GET')) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.GET').val;
                                  RegisterEntityWatcher(pageItem.id + '.GET');
                              }
                              // Änderung für Monobutton
                  			if (existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                  onlyOneState = 1;
                  				val = getState(pageItem.id + ".STATE").val;
                  				RegisterEntityWatcher(pageItem.id + ".STATE");
                              }
                              if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.SET').val;
                                  RegisterEntityWatcher(pageItem.id + '.SET');
                              }
                              // Änderung für Monobutton 
                              if (existsState(pageItem.id + '.ACTUAL') && onlyOneState==0) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.ACTUAL').val;
                                  RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                              }
                              if (existsState(pageItem.id + '.ON_ACTUAL') && onlyOneState==0) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.ON_ACTUAL').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                              } 
                              if (existsState(pageItem.id + '.ON_SET') && onlyOneState==0) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.ON_SET').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON_SET');
                              }
                              if (existsState(pageItem.id + '.ON') && onlyOneState==0) {
                                  onlyOneState = 1;
                                  val = getState(pageItem.id + '.ON').val;
                                  RegisterEntityWatcher(pageItem.id + '.ON');
                              }
                  
                  ArmilarA Offline
                  ArmilarA Offline
                  Armilar
                  Most Active Forum Testing
                  schrieb am zuletzt editiert von Armilar
                  #1601

                  @ronny130286 sagte in SONOFF NSPanel mit Lovelace UI:

                  Vielleicht kannst du auch gleich das Display Update für die verschieden Panels US-L, US-P, EU mit übernehmen

                  Habe ich bereits gestern eingefügt 😉

                  ggf. kannst du es gleich so übernehmen, ich würde aber auch deine Lösung testen.

                  Brauchst meine Lösung nicht testen. Ich hätte da keine Zeile anders gemacht 😉 . Ist Top so und wandert 1:1 in den Code.

                  Ich habe noch eine Kleinigkeit festgestellt (bin mir auch nicht sicher ob das schon immer war) aber scheinbar werden die States doppelt gesetzt und es kommt zum hin und her hüpfen (siehe Video) 20230109-190214_gzDhsaJe.mp4
                  Wenn ich richtig liegt entsteht das verhalten durch die

                  Wie ist denn das Verhalten des Aktors? Wenn du den Switch bedienst, schaltet die Lampe dann auch? Oder ist das nur das Steuerelement?

                  Für das Verhalten gibt es zwei Ansätze:

                  • Es läuft noch ein anderes Script im Hintergrund
                  • Es liegt irgendwo ein anderer Trigger, der den gleichen State Datenpunkt verändert.

                  Der RegisterEntityWatcher ist ja nur ein Trigger, der erkennt, ob sich der Zustand .State verändert hat. Wenn der also hüpft, dann wird der Zustand des Aktors an anderer Stelle nochmals verändert und der Trigger greift mehrfach.

                  EDIT:
                  Der Fehler wird vermutlich im .ON_SET ausgelöst, da der true und false mitbekommt (Abstand 250ms). Der wird 2x Triggern. Bekommen wir aber mit einem 300ms Timeout wieder raus.

                  Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  R 1 Antwort Letzte Antwort
                  0
                  • ArmilarA Armilar

                    @ronny130286 sagte in SONOFF NSPanel mit Lovelace UI:

                    Vielleicht kannst du auch gleich das Display Update für die verschieden Panels US-L, US-P, EU mit übernehmen

                    Habe ich bereits gestern eingefügt 😉

                    ggf. kannst du es gleich so übernehmen, ich würde aber auch deine Lösung testen.

                    Brauchst meine Lösung nicht testen. Ich hätte da keine Zeile anders gemacht 😉 . Ist Top so und wandert 1:1 in den Code.

                    Ich habe noch eine Kleinigkeit festgestellt (bin mir auch nicht sicher ob das schon immer war) aber scheinbar werden die States doppelt gesetzt und es kommt zum hin und her hüpfen (siehe Video) 20230109-190214_gzDhsaJe.mp4
                    Wenn ich richtig liegt entsteht das verhalten durch die

                    Wie ist denn das Verhalten des Aktors? Wenn du den Switch bedienst, schaltet die Lampe dann auch? Oder ist das nur das Steuerelement?

                    Für das Verhalten gibt es zwei Ansätze:

                    • Es läuft noch ein anderes Script im Hintergrund
                    • Es liegt irgendwo ein anderer Trigger, der den gleichen State Datenpunkt verändert.

                    Der RegisterEntityWatcher ist ja nur ein Trigger, der erkennt, ob sich der Zustand .State verändert hat. Wenn der also hüpft, dann wird der Zustand des Aktors an anderer Stelle nochmals verändert und der Trigger greift mehrfach.

                    EDIT:
                    Der Fehler wird vermutlich im .ON_SET ausgelöst, da der true und false mitbekommt (Abstand 250ms). Der wird 2x Triggern. Bekommen wir aber mit einem 300ms Timeout wieder raus.

                    R Offline
                    R Offline
                    ronny130286
                    schrieb am zuletzt editiert von ronny130286
                    #1602

                    @armilar
                    Also er schaltet sauber die Lampe ein nur der Status flackert. Mir ist nur aufgefallen bei meiner Änderung zum Monobutton ist es nicht da ich ja hier die den .Set und .State verriegelt habe

                              // Änderung für Monobutton
                    	   if (existsState(pageItem.id + ".STATE") ) {
                    		val = getState(pageItem.id + ".STATE").val;
                    		RegisterEntityWatcher(pageItem.id + ".STATE");
                                }
                                if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE") ) {
                                    val = getState(pageItem.id + '.SET').val;
                                    RegisterEntityWatcher(pageItem.id + '.SET');
                                }
                                // Änderung für Monobutton 
                    

                    Ich hatte mal im RegisterEntityWatcher einen Log eingebaut

                    console.log("RegEntityWatcher wurde aufgerufen: " + id)
                    

                    , da sieht man das ein Alias 2x den RegisterEntityWatcher triggert

                    Ist denke ich nur Kosmetik 😉

                    EDIT:
                    @armilar said in SONOFF NSPanel mit Lovelace UI:

                    EDIT:
                    Der Fehler wird vermutlich im .ON_SET ausgelöst, da der true und false mitbekommt (Abstand 250ms). Der wird 2x Triggern. Bekommen wir aber mit einem 300ms Timeout wieder raus.

                    ich glaube das kommt von den If Bedingungen im function CreateEntity, da ich in einem Alias mehrere States habe die es nach der If-Bedingung gibt.
                    Also hat ein Alias bei mir ein .Set 1. RegisterEntityWatcher hat er dann noch ein .ACTUAL 2. RegisterEntityWatcher für ein und das selbe Item auf der Page.

                    Ich habe gerade mal in mein Backup von älteren Scripten geschaut, dort waren das noch If Else IF Else If Bedingungen, da könnte ich mir vorstellen das er den RegisterEntityWatcher nur einmal gestartet hat

                    ArmilarA 1 Antwort Letzte Antwort
                    0
                    • R ronny130286

                      @armilar
                      Also er schaltet sauber die Lampe ein nur der Status flackert. Mir ist nur aufgefallen bei meiner Änderung zum Monobutton ist es nicht da ich ja hier die den .Set und .State verriegelt habe

                                // Änderung für Monobutton
                      	   if (existsState(pageItem.id + ".STATE") ) {
                      		val = getState(pageItem.id + ".STATE").val;
                      		RegisterEntityWatcher(pageItem.id + ".STATE");
                                  }
                                  if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE") ) {
                                      val = getState(pageItem.id + '.SET').val;
                                      RegisterEntityWatcher(pageItem.id + '.SET');
                                  }
                                  // Änderung für Monobutton 
                      

                      Ich hatte mal im RegisterEntityWatcher einen Log eingebaut

                      console.log("RegEntityWatcher wurde aufgerufen: " + id)
                      

                      , da sieht man das ein Alias 2x den RegisterEntityWatcher triggert

                      Ist denke ich nur Kosmetik 😉

                      EDIT:
                      @armilar said in SONOFF NSPanel mit Lovelace UI:

                      EDIT:
                      Der Fehler wird vermutlich im .ON_SET ausgelöst, da der true und false mitbekommt (Abstand 250ms). Der wird 2x Triggern. Bekommen wir aber mit einem 300ms Timeout wieder raus.

                      ich glaube das kommt von den If Bedingungen im function CreateEntity, da ich in einem Alias mehrere States habe die es nach der If-Bedingung gibt.
                      Also hat ein Alias bei mir ein .Set 1. RegisterEntityWatcher hat er dann noch ein .ACTUAL 2. RegisterEntityWatcher für ein und das selbe Item auf der Page.

                      Ich habe gerade mal in mein Backup von älteren Scripten geschaut, dort waren das noch If Else IF Else If Bedingungen, da könnte ich mir vorstellen das er den RegisterEntityWatcher nur einmal gestartet hat

                      ArmilarA Offline
                      ArmilarA Offline
                      Armilar
                      Most Active Forum Testing
                      schrieb am zuletzt editiert von
                      #1603

                      @ronny130286

                      Da hat er leider auch nicht alle Trigger-Events verarbeitet. Ich teste das mal mit einem virtuellen Taster.

                      Wenn du etwas findest, dann poste es.

                      Habe in Zeile 4046 noch ein "S" bei ON_SET hinzugefügt. Ist irgendwie verloren gegangen aber für die meisten doch nicht so ganz unwichtig ;--)

                      Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                      https://github.com/joBr99/nspanel-lovelace-ui/wiki

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      R 1 Antwort Letzte Antwort
                      0
                      • T TT-Tom

                        @c3b

                        Hast das hier im Wiki schon gelesen. Link Wiki

                        C Offline
                        C Offline
                        c3b
                        schrieb am zuletzt editiert von c3b
                        #1604

                        @tt-tom Hi Leutz
                        Ich noch mal. Ich bin leider noch nicht weiter. Ich habe die drei Datenpunkte angelegt und stecke jetzt bei den Alias fest. Sobald ich einen Alias als Tastensensor anlege, kommt eine leere Seite, anstatt der Zuordnungsliste. Dann kann ich ihn nur noch löschen. Sperrt der iobroker Datenpunkte, wenn sie schon einmal angelegt waren? Ich habe es schon ein paar mal versucht und immer wieder gelöscht.
                        Kennt das Problem jemand? Hab den iobroker schon einmal neu gestartet. Bringt aber nichts. Wenn ich einen anderen Namen nehme, geht es. Ich bekomme aber den DP value nicht angelegt. Deshalb habe ich den DP auch immer wieder gelöscht.

                        Im Protokoll steht folgender Eintrag:

                        	Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 9
                        javascript.0
                        	2023-01-09 20:44:35.442	warn	Could not add alias subscription: Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 12
                        javascript.0
                        	2023-01-09 20:44:35.442	warn	Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 12
                        

                        Ist ja auch klar, da ich die Zuordnungstabelle nicht angezeigt bekomme.

                        LG aus dem Sauerland

                        ArmilarA 1 Antwort Letzte Antwort
                        0
                        • ArmilarA Armilar

                          @ronny130286

                          Da hat er leider auch nicht alle Trigger-Events verarbeitet. Ich teste das mal mit einem virtuellen Taster.

                          Wenn du etwas findest, dann poste es.

                          Habe in Zeile 4046 noch ein "S" bei ON_SET hinzugefügt. Ist irgendwie verloren gegangen aber für die meisten doch nicht so ganz unwichtig ;--)

                          R Offline
                          R Offline
                          ronny130286
                          schrieb am zuletzt editiert von
                          #1605

                          @armilar
                          Konntest du das Verhalten aus dem Video auch erzeugen? Kann auch sein das es nur bei mir ist.

                          Das "S" habe ich auch wieder hinzugefügt 😄

                          ArmilarA 1 Antwort Letzte Antwort
                          0
                          • R ronny130286

                            @armilar
                            Konntest du das Verhalten aus dem Video auch erzeugen? Kann auch sein das es nur bei mir ist.

                            Das "S" habe ich auch wieder hinzugefügt 😄

                            ArmilarA Offline
                            ArmilarA Offline
                            Armilar
                            Most Active Forum Testing
                            schrieb am zuletzt editiert von
                            #1606

                            @ronny130286

                            Nee, habe ich jetzt mit der Code-Änderung auch... nicht mal mit Taster

                            Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                            https://github.com/joBr99/nspanel-lovelace-ui/wiki

                            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                            R 1 Antwort Letzte Antwort
                            0
                            • C c3b

                              @tt-tom Hi Leutz
                              Ich noch mal. Ich bin leider noch nicht weiter. Ich habe die drei Datenpunkte angelegt und stecke jetzt bei den Alias fest. Sobald ich einen Alias als Tastensensor anlege, kommt eine leere Seite, anstatt der Zuordnungsliste. Dann kann ich ihn nur noch löschen. Sperrt der iobroker Datenpunkte, wenn sie schon einmal angelegt waren? Ich habe es schon ein paar mal versucht und immer wieder gelöscht.
                              Kennt das Problem jemand? Hab den iobroker schon einmal neu gestartet. Bringt aber nichts. Wenn ich einen anderen Namen nehme, geht es. Ich bekomme aber den DP value nicht angelegt. Deshalb habe ich den DP auch immer wieder gelöscht.

                              Im Protokoll steht folgender Eintrag:

                              	Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 9
                              javascript.0
                              	2023-01-09 20:44:35.442	warn	Could not add alias subscription: Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 12
                              javascript.0
                              	2023-01-09 20:44:35.442	warn	Alias alias.0.Küche.WLED.Gerät_2.PRESS has no target 12
                              

                              Ist ja auch klar, da ich die Zuordnungstabelle nicht angezeigt bekomme.

                              LG aus dem Sauerland

                              ArmilarA Offline
                              ArmilarA Offline
                              Armilar
                              Most Active Forum Testing
                              schrieb am zuletzt editiert von Armilar
                              #1607

                              @c3b sagte in SONOFF NSPanel mit Lovelace UI:

                              mt eine leere Seite, anstatt der Zuordnungsliste. Dann kann ich ihn nur noch löschen. Sperrt der iobroker Datenpunkte, wenn sie schon einmal angelegt waren? Ich habe es schon ein paar mal versucht und immer wieder gelöscht.
                              Kennt das Problem jemand? Hab den iobroker schon einmal neu gestartet. Bringt aber nichts. Wenn ich einen anderen Namen nehme, geht es. Ich bekomme aber den DP value nicht angelegt. Deshalb habe ich den DP auch immer wieder gelöscht.
                              Im Protokoll steht folgender Eintrag:

                              Du hast bestimmt die Version 1.1.2 vom Geräte-Manager installiert. Die ist sowas von kaputt...

                              Mach mal ein Downgrade von dem Adapter auf die 1.1.1

                              Danach kannst du den .VALUE anlegen

                              EDIT: Ist zwar nicht das Problem, aber versuche Umlaute in Alias-Namen zu vermeiden. Kueche statt Küche. Im PageItem kannst du wieder name: 'Küche...' verwenden

                              Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                              https://github.com/joBr99/nspanel-lovelace-ui/wiki

                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              1 Antwort Letzte Antwort
                              0
                              • ArmilarA Armilar

                                @ronny130286

                                Nee, habe ich jetzt mit der Code-Änderung auch... nicht mal mit Taster

                                R Offline
                                R Offline
                                ronny130286
                                schrieb am zuletzt editiert von ronny130286
                                #1608

                                @armilar

                                dann ist das bei mir durch den Alias, wo es mir aufgefallen ist dieser sieht so aus: c684c2b0-ac99-4daf-a10c-0d3073e832c2-image.png

                                21:08:33.181	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.SET
                                21:08:33.182	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.ACTUAL
                                
                                ArmilarA 2 Antworten Letzte Antwort
                                0
                                • R ronny130286

                                  @armilar

                                  dann ist das bei mir durch den Alias, wo es mir aufgefallen ist dieser sieht so aus: c684c2b0-ac99-4daf-a10c-0d3073e832c2-image.png

                                  21:08:33.181	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.SET
                                  21:08:33.182	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.ACTUAL
                                  
                                  ArmilarA Offline
                                  ArmilarA Offline
                                  Armilar
                                  Most Active Forum Testing
                                  schrieb am zuletzt editiert von
                                  #1609

                                  @ronny130286

                                  schießt bei meinen sogar 4x

                                  Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                  R 1 Antwort Letzte Antwort
                                  0
                                  • R ronny130286

                                    @armilar

                                    dann ist das bei mir durch den Alias, wo es mir aufgefallen ist dieser sieht so aus: c684c2b0-ac99-4daf-a10c-0d3073e832c2-image.png

                                    21:08:33.181	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.SET
                                    21:08:33.182	info	javascript.0 (3893) script.js.NSPanel.NSPanelTest: RegEntityWatcher wurde aufgerufen: alias.0.Licht.Terrasse.ACTUAL
                                    
                                    ArmilarA Offline
                                    ArmilarA Offline
                                    Armilar
                                    Most Active Forum Testing
                                    schrieb am zuletzt editiert von Armilar
                                    #1610

                                    @ronny130286

                                    bau mal ein else vor den ACTUAL

                                               if (existsState(pageItem.id + '.SET')  && !existsState(pageItem.id + '.STATE')) { //Bei MonoButton
                                                    console.log('.SET hat getriggert');
                                                    val = getState(pageItem.id + '.SET').val;
                                                    RegisterEntityWatcher(pageItem.id + '.SET');
                                                } 
                                                else if (existsState(pageItem.id + '.ACTUAL')) {
                                                    val = getState(pageItem.id + '.ACTUAL').val;
                                                    RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                                                }
                                    

                                    Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                    https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                    R 1 Antwort Letzte Antwort
                                    0
                                    • ArmilarA Armilar

                                      @ronny130286

                                      schießt bei meinen sogar 4x

                                      R Offline
                                      R Offline
                                      ronny130286
                                      schrieb am zuletzt editiert von ronny130286
                                      #1611

                                      @armilar

                                      ist der Zustand gewollt?
                                      Weil erzeugt wird es hier:

                                                  if (existsState(pageItem.id + '.GET')) {
                                                      val = getState(pageItem.id + '.GET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.GET');
                                                  }
                                      	    if (existsState(pageItem.id + ".STATE")) {
                                      		val = getState(pageItem.id + ".STATE").val;
                                      		RegisterEntityWatcher(pageItem.id + ".STATE");
                                                  }
                                                  if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE")) {
                                                      val = getState(pageItem.id + '.SET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.SET');
                                                  }
                                                  if (existsState(pageItem.id + '.ACTUAL')) {
                                                      val = getState(pageItem.id + '.ACTUAL').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                                                  }
                                                  if (existsState(pageItem.id + '.ON_ACTUAL')) {
                                                      val = getState(pageItem.id + '.ON_ACTUAL').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                                                  } 
                                                  if (existsState(pageItem.id + '.ON_SET')) {
                                                      val = getState(pageItem.id + '.ON_SET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON_SET');
                                                  }
                                                  if (existsState(pageItem.id + '.ON')) {
                                                      val = getState(pageItem.id + '.ON').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON');
                                                  }
                                      

                                      wenn du alle 6 Bedingungen hast im Alias, dann würde er sogar 6 mal auslösen.
                                      ich habs mal so versucht:

                                                  let onlyOneState = 0;
                                       
                                                  if (existsState(pageItem.id + '.GET')) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.GET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.GET');
                                                  }
                                      	    if (existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                                      onlyOneState = 1;
                                      		val = getState(pageItem.id + ".STATE").val;
                                      		RegisterEntityWatcher(pageItem.id + ".STATE");
                                                  }
                                                  if (existsState(pageItem.id + '.SET') && !existsState(pageItem.id + ".STATE") && onlyOneState==0) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.SET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.SET');
                                                  }
                                                  if (existsState(pageItem.id + '.ACTUAL') && onlyOneState==0) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.ACTUAL').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                                                  }
                                                  if (existsState(pageItem.id + '.ON_ACTUAL') && onlyOneState==0) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.ON_ACTUAL').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON_ACTUAL');
                                                  } 
                                                  if (existsState(pageItem.id + '.ON_SET') && onlyOneState==0) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.ON_SET').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON_SET');
                                                  }
                                                  if (existsState(pageItem.id + '.ON') && onlyOneState==0) {
                                                      onlyOneState = 1;
                                                      val = getState(pageItem.id + '.ON').val;
                                                      RegisterEntityWatcher(pageItem.id + '.ON');
                                                  }
                                      

                                      Dort macht er immer nur einmal (das war er als erstes sieht) oder überall aus If => Else If machen

                                      1 Antwort Letzte Antwort
                                      0
                                      • ArmilarA Armilar

                                        @ronny130286

                                        bau mal ein else vor den ACTUAL

                                                   if (existsState(pageItem.id + '.SET')  && !existsState(pageItem.id + '.STATE')) { //Bei MonoButton
                                                        console.log('.SET hat getriggert');
                                                        val = getState(pageItem.id + '.SET').val;
                                                        RegisterEntityWatcher(pageItem.id + '.SET');
                                                    } 
                                                    else if (existsState(pageItem.id + '.ACTUAL')) {
                                                        val = getState(pageItem.id + '.ACTUAL').val;
                                                        RegisterEntityWatcher(pageItem.id + '.ACTUAL');
                                                    }
                                        
                                        R Offline
                                        R Offline
                                        ronny130286
                                        schrieb am zuletzt editiert von ronny130286
                                        #1612

                                        @armilar

                                        das Else behebt es an der Stelle natürlich auch, aber wenn ich mir die Doku ansehe:
                                        60d773de-d08d-41b3-939a-a7abc6394b8f-image.png
                                        dann brauchst noch mehr Else

                                        ich bin mir halt nicht sicher ob man es in einer bestimmten Konstellation für ein Objekt (siehe Dimmer Bild) benötigt.

                                        ArmilarA 1 Antwort Letzte Antwort
                                        0
                                        • R ronny130286

                                          @armilar

                                          das Else behebt es an der Stelle natürlich auch, aber wenn ich mir die Doku ansehe:
                                          60d773de-d08d-41b3-939a-a7abc6394b8f-image.png
                                          dann brauchst noch mehr Else

                                          ich bin mir halt nicht sicher ob man es in einer bestimmten Konstellation für ein Objekt (siehe Dimmer Bild) benötigt.

                                          ArmilarA Offline
                                          ArmilarA Offline
                                          Armilar
                                          Most Active Forum Testing
                                          schrieb am zuletzt editiert von Armilar
                                          #1613

                                          @ronny130286

                                          Mein Gedanke war, warum sollte es in einer Funktion die immer korrekt gelaufen ist, auf einmal Probleme geben?

                                          Ich habe in der HandleButtonEvent:

                                                      case 'OnOff':
                                                          if (existsObject(id)) {
                                                              let action = false
                                                              if (words[4] == '1')
                                                                  action = true;
                                                              let o = getObject(id);
                                                              switch (o.common.role) {
                                                                  case 'level.mode.fan':
                                                                  case 'socket':
                                                                  case 'light':
                                          
                                                                      let pageItem = findPageItem(id);	
                                          							if(pageItem.monobutton != undefined && pageItem.monobutton == true){	
                                          								triggerButton(id + ".SET")	
                                          							}	
                                          							else {	
                                          								setIfExists(id + '.SET', action);
                                          							}		
                                          							break;
                                          

                                          die Funktion toggleState wieder herausgenommen und gegen das ursprüngliche setIfExists(id + '.SET', action); ersetzt. War vorher auch nicht im Code. Jetzt läufts wieder. Vermute bei dir liegt es dann in der triggerButton.

                                          EDIT: Mit dem einmaligen durchlaufen, kamen viele wichtige Events nicht mehr an.

                                          Ich versuche die mal Events analog des Sliders durch ein Timeout laufen zu lassen und nur das letzte jeweilige Event auszuwerten.

                                          Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                          https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                          R 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          620

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe