Automatisches Licht mit Blockly

Automatisches Licht mit Blockly ist nicht nur praktisch, sondern auch energieeffizient. In diesem Beitrag zeige ich dir, wie du das Licht automatisch einschaltest, wenn eine Bewegung erkannt oder eine Tür geöffnet wird. Nach mindestens einer Minute ohne Präsenz schaltet sich das Licht wieder aus, sodass du Energie sparen kannst. Dies ist was ein echtes Smart Home ausmacht.

Automatisches Licht mit Blockly

Funktionsweise der Automatisierung

Die Automatisierung nutzt zwei Sensoren, die zusammenarbeiten, um den Betrieb zu optimieren:

  1. Präsenzmelder* (bezahlter Link): Erkennt Bewegungen im Raum und registriert Aktivitäten.
  2. Türkontakt* (bezahlter Link): Erkennt, ob die Tür offen oder geschlossen ist, was zusätzliche Flexibilität bietet.

Ablauf der Automatisierung:

  • Licht einschalten: Sobald die Tür geöffnet wird oder der Präsenzmelder eine Bewegung registriert, schaltet sich das Licht ein. Dadurch musst du das Licht nicht manuell betätigen.
  • Timestamp speichern: Das System speichert den aktuellen Zeitpunkt, um die letzte Aktivität zu verfolgen, sodass es den Status des Lichts entsprechend anpassen kann.
  • Automatische Abschaltung: Nach mindestens einer Minute ohne erkannte Präsenz schaltet das System das Licht automatisch aus, wodurch unnötiger Energieverbrauch vermieden wird.

Umsetzung mit Blockly

Mit Blockly, einer grafischen Programmiersprache, kannst du diese Automatisierung einfach umsetzen. Sie ermöglicht es, logische Abläufe visuell zu gestalten und dabei flexibel anzupassen.

1. Ereignisauslöser für Türkontakt und Präsenzmelder

Der Blockly-Block on überwacht Änderungen bei den beiden Sensoren, sodass das System sofort reagieren kann:

<value name="OID0">
  <field name="oid">Präsenzmelder.Presence</field>
</value>
<value name="OID1">
  <field name="oid">Türkontakt.Open</field>
</value>

Erkennt einer der Sensoren eine Änderung, speichert das System den aktuellen Timestamp und schaltet das Licht ein, um sofort für die nötige Beleuchtung zu sorgen:

<block type="control">
  <field name="OID">Licht_Schalter</field>
  <value name="VALUE">
    <block type="logic_boolean">
      <field name="BOOL">TRUE</field>
    </block>
  </value>
</block>

2. Automatische Abschaltung nach Inaktivität

Das System überprüft alle 30 Sekunden, ob noch Aktivität vorliegt, und berücksichtigt dabei den zuletzt gespeicherten Timestamp:

<block type="schedule">
  <field name="SCHEDULE">*/30 * * * * *</field>
</block>

Wenn das Licht an ist, aber keine Bewegung erkannt wird, vergleicht das System den aktuellen Zeitpunkt mit dem gespeicherten Timestamp. Dadurch erkennt es, ob das Licht weiterhin benötigt wird:

<block type="logic_compare">
  <field name="OP">LT</field>
  <value name="A">
    <block type="get_value">
      <field name="OID">timestamp</field>
    </block>
  </value>
  <value name="B">
    <block type="math_arithmetic">
      <field name="OP">MINUS</field>
      <value name="A">
        <block type="time_get">
          <field name="OPTION">current_time</field>
        </block>
      </value>
      <value name="B">
        <block type="math_number">
          <field name="NUM">60</field>
        </block>
      </value>
    </block>
  </value>
</block>

Liegt der gespeicherte Zeitpunkt mehr als eine Minute zurück, schaltet das System das Licht aus, um Strom zu sparen und die Umwelt zu schonen:

<block type="control">
  <field name="OID">Licht_Schalter</field>
  <value name="VALUE">
    <block type="logic_boolean">
      <field name="BOOL">FALSE</field>
    </block>
  </value>
</block>

Vorteile dieser Lösung

  • Energieeffizient: Das Licht bleibt nur an, wenn es wirklich benötigt wird, wodurch du Stromkosten senken kannst.
  • Benutzerfreundlich: Das Licht schaltet sich automatisch ein und aus, sodass du dich nicht darum kümmern musst.
  • Anpassbar: Du kannst die Wartezeit oder die Sensoren flexibel ändern, damit die Automatisierung perfekt zu deinem Alltag passt.

Erweiterungsmöglichkeiten

  • Passe die Verzögerungszeit an (z. B. 2 oder 5 Minuten statt 1 Minute), um die Automatisierung individueller zu gestalten.
  • Binde zusätzliche Sensoren ein, z. B. für Fenster oder weitere Türen, damit das System noch vielseitiger einsetzbar ist.
  • Füge eine manuelle Steuerung hinzu, um das Licht dauerhaft ein- oder auszuschalten, falls du einmal von der Automatisierung abweichen möchtest.

Hast du eigene Erfahrungen mit Blockly? Teile sie gerne in den Kommentaren!

Vollständiger Blockly Code

Den kompletten Code, zum einfachen importieren, findest du nachfolgend. Denk daran das Variablen, Sensoren und Aktoren angepasst werden müssen.

<xml xmlns="https://developers.google.com/blockly/xml">
  <block type="on_ext" id="event_trigger" x="200" y="-238">
    <mutation items="2"></mutation>
    <field name="CONDITION">true</field>
    <field name="ACK_CONDITION"></field>
    <value name="OID0">
      <shadow type="field_oid" id="sensor_1">
        <field name="oid">alias.0.room.sensors.motion.PRESS</field>
      </shadow>
    </value>
    <value name="OID1">
      <shadow type="field_oid" id="sensor_2">
        <field name="oid">alias.0.room.sensors.door.ACTUAL</field>
      </shadow>
    </value>
    <statement name="STATEMENT">
      <block type="update" id="update_timestamp">
        <mutation delay_input="false"></mutation>
        <field name="OID">0_userdata.0.room.timestamp</field>
        <field name="WITH_DELAY">FALSE</field>
        <value name="VALUE">
          <block type="time_get" id="get_time">
            <mutation format="false" language="false"></mutation>
            <field name="OPTION">sid</field>
          </block>
        </value>
        <next>
          <block type="controls_if" id="check_light_status">
            <value name="IF0">
              <block type="logic_negate" id="negate_condition">
                <value name="BOOL">
                  <block type="get_value" id="get_light_status">
                    <field name="ATTR">val</field>
                    <field name="OID">0_userdata.0.room.light_on</field>
                  </block>
                </value>
              </block>
            </value>
            <statement name="DO0">
              <block type="comment" id="comment_light">
                <field name="COMMENT">Light Control</field>
                <next>
                  <block type="control" id="turn_light_on">
                    <mutation delay_input="false"></mutation>
                    <field name="OID">scene.0.room.light_On</field>
                    <field name="WITH_DELAY">FALSE</field>
                    <value name="VALUE">
                      <block type="logic_boolean" id="set_true">
                        <field name="BOOL">TRUE</field>
                      </block>
                    </value>
                    <next>
                      <block type="comment" id="comment_system">
                        <field name="COMMENT">System State</field>
                        <next>
                          <block type="control" id="update_light_status">
                            <mutation delay_input="false"></mutation>
                            <field name="OID">0_userdata.0.room.light_on</field>
                            <field name="WITH_DELAY">FALSE</field>
                            <value name="VALUE">
                              <block type="logic_boolean" id="set_light_true">
                                <field name="BOOL">TRUE</field>
                              </block>
                            </value>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </statement>
    <next>
      <block type="schedule" id="scheduled_check">
        <field name="SCHEDULE">*/30 * * * * *</field>
        <statement name="STATEMENT">
          <block type="controls_if" id="check_inactivity">
            <mutation elseif="1"></mutation>
            <value name="IF0">
              <block type="logic_operation" id="check_conditions" inline="false">
                <field name="OP">AND</field>
                <value name="A">
                  <block type="get_value" id="get_light_status_check">
                    <field name="ATTR">val</field>
                    <field name="OID">0_userdata.0.room.light_on</field>
                  </block>
                </value>
                <value name="B">
                  <block type="logic_negate" id="negate_motion">
                    <value name="BOOL">
                      <block type="get_value" id="get_motion_status">
                        <field name="ATTR">val</field>
                        <field name="OID">alias.0.room.sensors.motion.PRESS</field>
                      </block>
                    </value>
                  </block>
                </value>
              </block>
            </value>
            <statement name="DO0">
              <block type="comment" id="check_timeout">
                <field name="COMMENT">Check if timeout passed</field>
                <next>
                  <block type="controls_if" id="compare_time">
                    <value name="IF0">
                      <block type="logic_compare" id="time_check">
                        <field name="OP">LT</field>
                        <value name="A">
                          <block type="get_value" id="get_timestamp">
                            <field name="ATTR">val</field>
                            <field name="OID">0_userdata.0.room.timestamp</field>
                          </block>
                        </value>
                        <value name="B">
                          <block type="math_arithmetic" id="subtract_time">
                            <field name="OP">MINUS</field>
                            <value name="A">
                              <block type="time_get" id="current_time">
                                <mutation format="false" language="false"></mutation>
                                <field name="OPTION">sid</field>
                              </block>
                            </value>
                            <value name="B">
                              <block type="math_number" id="timeout_value">
                                <field name="NUM">60</field>
                              </block>
                            </value>
                          </block>
                        </value>
                      </block>
                    </value>
                    <statement name="DO0">
                      <block type="comment" id="comment_turn_off">
                        <field name="COMMENT">Turn off light</field>
                        <next>
                          <block type="control" id="turn_light_off">
                            <mutation delay_input="false"></mutation>
                            <field name="OID">scene.0.room.light_On</field>
                            <field name="WITH_DELAY">FALSE</field>
                            <value name="VALUE">
                              <block type="logic_boolean" id="set_false">
                                <field name="BOOL">FALSE</field>
                              </block>
                            </value>
                            <next>
                              <block type="control" id="update_light_off_status">
                                <mutation delay_input="false"></mutation>
                                <field name="OID">0_userdata.0.room.light_on</field>
                                <field name="WITH_DELAY">FALSE</field>
                                <value name="VALUE">
                                  <block type="logic_boolean" id="set_light_false">
                                    <field name="BOOL">FALSE</field>
                                  </block>
                                </value>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </statement>
                  </block>
                </next>
              </block>
            </statement>
            <value name="IF1">
              <block type="get_value" id="check_motion">
                <field name="ATTR">val</field>
                <field name="OID">alias.0.room.sensors.motion.PRESS</field>
              </block>
            </value>
            <statement name="DO1">
              <block type="update" id="update_timestamp_on_motion">
                <mutation delay_input="false"></mutation>
                <field name="OID">0_userdata.0.room.timestamp</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="time_get" id="get_current_time">
                    <mutation format="false" language="false"></mutation>
                    <field name="OPTION">sid</field>
                  </block>
                </value>
              </block>
            </statement>
          </block>
        </statement>
      </block>
    </next>
  </block>
</xml>