Offene Fenster zählen mit Blockly

Mit einem einfachen Blockly-Script und einem eigenen Datenpunkt kannst du dir die Gesamtzahl geöffneter Fenster oder Türen anzeigen lassen.

Neuen Datenpunkt erstellen

Zunächst legst du dir einen eigenen Datenpunkt der Art „Zahl“ an. Als Name nimmst du zum Beispiel „Fenster offen“:

Sensoren einer Aufzählung zuweisen

Um später nur auf Änderungen deiner Fenster oder Türen zu triggern, solltest du den State jedes Sensors, den du überwachen willst, einer „Funktion“ hinzufügen, zum Beispiel „Fenster“. Lege dazu unter „Aufzählungen“ eine neue Funktion an:

Danach wechselst du in „Objekte“ und wählst deinen Kontaktsensor aus. Dem State, der den „geöffnet“-Zustand überwacht, weist du die Funktion „Fenster“ zu:

Blockly-Script erstellen

Dann erstellst du ein neues Blockly-Script und fügst einen „falls“-Trigger ein. Als Auslöser wählst du „IDs vom Selektor“ (in diesem Artikel erfährst du mehr über diesen Selektor):

state[id=*](functions=fenster)

Dadurch reagiert das Script auf alle Änderungen der States innerhalb der Aufzählung bzw. Funktion „Fenster“.

Als nächstes fügst du einen Logik-Block „falls mache“ mit dem Zusatz „sonst“ ein:

Als „falls“-Bedingung nimmst du aus „Trigger“ den Block „Object ID“ und stellst ihn auf „Wert“. Damit reagiert die „falls“-Logik auf den Trigger-Wert, wenn dieser „true“ oder „1“ ist, hier also „geöffnet“.

Dann fügst du aus „System“ eine „aktualisiere“-Anweisungen in „mache“ und eine in „sonst“ ein:

Als Ziel der Aktualisierung wählst du deinen zuvor erstellen Datenpunkt aus, also „Fenster offen“.

Abschließend fügst du, wie unten zu sehen, jeweils einen Mathematik-Block „1+1“ ein. Den ersten Operator setzt du üer den System-Block „Wert vom Object ID“ ebenfalls auf deinen eben erstellen Datenpunkt. Den zweiten Operator auf „+1“ in der „mache“-Bedingung.

In der „sonst“-Bedingung steht der Operator auf „-1“. Sobald jetzt ein Fenster geöffnet wird, wird der Datenpunkt um 1 erhöht. Wenn ein Fenster wieder geschlossen wird, wird der Datenpunkt um 1 minimiert.

Fertiges Script

Blockly

<xml xmlns="https://developers.google.com/blockly/xml">
  <block type="comment" id="KLVcgIRA)vhniP%5c)fH" x="-113" y="-812">
    <field name="COMMENT">Offene Fenster zählen</field>
    <next>
      <block type="on_ext" id="z.X%xPlq;M3A|{Mry8@q">
        <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 xmlns="http://www.w3.org/1999/xhtml" type="field_oid" id="]Vhtc5Lcd72aZD%%mC6v">
            <field name="oid">default</field>
          </shadow>
          <block type="selector" id="h}j(}%$r(7=t@JR_}@~u">
            <field name="TEXT">state[id=*](functions=fenster)</field>
          </block>
        </value>
        <statement name="STATEMENT">
          <block type="controls_if" id="0l4$k^bVSuS^Xg3qr-Dj">
            <mutation else="1"></mutation>
            <value name="IF0">
              <block type="on_source" id="cqe`;RBzy6../aY(OUw;">
                <field name="ATTR">state.val</field>
              </block>
            </value>
            <statement name="DO0">
              <block type="update" id=".M:Tq}evv22HxT==ASEV">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">Eigene.0.Sonstige.Fester_offen</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="math_arithmetic" id="E}}!lwwahZP_c3={Kr[I">
                    <field name="OP">ADD</field>
                    <value name="A">
                      <shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="wL(N+CZ|/w0qS7f^/Por">
                        <field name="NUM">1</field>
                      </shadow>
                      <block type="get_value" id="(b#{W@,x+5Yf+Ik-mCR=">
                        <field name="ATTR">val</field>
                        <field name="OID">Eigene.0.Sonstige.Fester_offen</field>
                      </block>
                    </value>
                    <value name="B">
                      <shadow type="math_number" id="x*B}v?B|dSA`Rjz%9~%(">
                        <field name="NUM">1</field>
                      </shadow>
                    </value>
                  </block>
                </value>
              </block>
            </statement>
            <statement name="ELSE">
              <block type="update" id="f_{+Blxz3}TNPmEJ.@Me">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">Eigene.0.Sonstige.Fester_offen</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="math_arithmetic" id="6HI$VV644[0E:L#ZfC/I">
                    <field name="OP">MINUS</field>
                    <value name="A">
                      <shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="wL(N+CZ|/w0qS7f^/Por">
                        <field name="NUM">1</field>
                      </shadow>
                      <block type="get_value" id="a~(~eiicI`{@WR}@)~4}">
                        <field name="ATTR">val</field>
                        <field name="OID">Eigene.0.Sonstige.Fester_offen</field>
                      </block>
                    </value>
                    <value name="B">
                      <shadow type="math_number" id="|nrS*:qVigfH*Y:rU/}h">
                        <field name="NUM">1</field>
                      </shadow>
                    </value>
                  </block>
                </value>
              </block>
            </statement>
          </block>
        </statement>
      </block>
    </next>
  </block>
</xml>

Javascript

// Offene Fenster zählen
on({id: Array.prototype.slice.apply($("state[id=*](functions=fenster)")), change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  if ((obj.state ? obj.state.val : "")) {
    setState("Eigene.0.Sonstige.Fester_offen"/*Fester offen*/, (getState("Eigene.0.Sonstige.Fester_offen").val + 1), true);
  } else {
    setState("Eigene.0.Sonstige.Fester_offen"/*Fester offen*/, (getState("Eigene.0.Sonstige.Fester_offen").val - 1), true);
  }
});

Schreibe einen Kommentar