INSTAR Deutschland GmbH

Verwendung von MQTT, um ioBroker zu informieren, dass ein Alarm ausgelöst wurde



Q: Ich habe Ihren Leitfaden zur Verwendung des INSTAR (HTTP)-Alarmservers gefunden. Wäre es nicht sinnvoller, diese Ereignisse über den MQTT-Dienst zu veröffentlichen, den jede Full-HD-Kamera bietet? Auf diese Weise könnte ich sicher sein, dass jedes Alarmereignis von meinem ioBroker registriert wird.

A: Alle Alarmereignisse, die vom INSTAR HTTP Alarmserver veröffentlicht werden sind jetzt auch über den MQTT-Service erhältlich! Das entsprechende MQTT-Topic ist:

MQTT Alarmserver

Das entsprechende MQTT-Topic ist:

alarm/triggered

Sie müssen lediglich ein Abonnement zum Status-Topic hinzufügen, und Sie erhalten Updates über Alarmereignisse sowie darüber, welcher Dienst den Alarm ausgelöst hat:

Angehängte Alarm Trigger

  • Alarmbereich Bereich 1 ausgelöst: 1
  • Alarmbereich Bereich 2 ausgelöst: 2
  • Alarmbereich Bereich 3 ausgelöst: 3
  • Alarmbereich Bereich 4 ausgelöst: 4
  • Alarmeingang / PIR ausgelöst: 5
  • Audioalarm ausgelöst: 6
  • Bewegungserkennung & PIR wurde ausgelöst (Bereich 1): 7
  • Bewegungserkennung & PIR wurde ausgelöst (Bereich 2): 8
  • Bewegungserkennung & PIR wurde ausgelöst (Bereich 3): 9
  • Bewegungserkennung & PIR wurde ausgelöst (Bereich 4): 10

ioBroker einrichten

Wir haben bereits einen Leitfaden zur Verwendung von Node-RED zur Interaktion mit Ihrem MQTT-Alarmserver online gestellt. Sie können dieser Anleitung folgen, wenn Sie den Node-RED-Adapter im ioBroker nutzen möchten.

In diesem Leitfaden wollen wir die Blockly Script Engine anstelle von Node-RED verwenden. Sie können damit beginnen diese über die Registerkarte Adapter zu installieren:

INSTAR MQTT Alarmserver for the ioBroker

Wechseln Sie nun zur Registerkarte Scripts und wählen Sie Blockly, um ein neues Skript hinzuzufügen:

INSTAR MQTT Alarmserver for the ioBroker

Wir werden die Blockly UI zur Erstellung des Alarmserver-Skripts zu verwenden:

INSTAR MQTT Alarmserver for the ioBroker

Im folgenden Beispiel habe ich das Motion Tracking-Beispiel, das wir zuvor in Node-RED gelöst haben auf Blockly übertragen. Bitte lesen Sie in jener Anleitungen nach, wie Sie Ihre Kamera so einrichten müssen, damit dies funktioniert.

Wann immer wir eine Statusaktualisierung für alarm/triggered erhalten, müssen wir prüfen, ob der Alarm durch Bereich 1 - mit Payload {"val": "1"} - oder Bereich 4 - mit der Payload {"val": "4"} ausgelöst wurde. Wenn Bereich 1 ausgelöst wurde - das ist der Bewegungserkennungsbereich, den wir auf der linken Seite hinzugefügt haben - müssen wir unsere Kamera einen Schritt nach links bewegen. Für Bereich 4 müssen wir nach rechts gehen, um das bewegte Objekt im Sichtfeld der Kamera zu zentrieren.

INSTAR MQTT Alarmserver for the ioBroker

Beachten Sie, dass die Kamera, die ich hier benutze, die MQTT-ID 10D1DC21F5DB hat. Wenn Sie das Blockly-Skript importieren, müssen Sie dies entsprechend Ihrer persönlichen Kamera-ID ändern!

Die MQTT Topics, die hier verwendet werden, sind:

  • /status/alarm/triggered: INSTAR MQTT Alarmserver-Status-Topic
  • /features/ptz/movestep/raw: Befehls-Topic, um Ihre Schwenk-Neige-Kamera einen Schritt nach links oder rechts zu bewegen.

Und zusätzlich habe ich ein Skript hinzugefügt, das meine Kamera auf die gespeicherte Position 2 bewegt, wenn der Audio-Alarm {"val": "6"} der Kamera ausgelöst wurde. Dies kann mit den folgenden Topics erreicht werden:

  • /features/ptz/presets/raw Befehls-Topics, um Ihre Kamera auf die Positionen 0 - 7 zu bewegen
  • /alarm/pushalarm Befehls-Topics zum Auslösen eines Audio-Alarms auf Ihrer Kamera und damit dem Auslösen der Preset Funktion in Blockly - dies kann mit anderen Funktionen im ioBroker verknüpft werden.

JSON Export

Sie können das komplette Skript mit dem folgenden JSON-Code in Blockly importieren. Beachten Sie, dass Sie die MQTT-ID 10D1DC21F5DB durch Ihre persönliche Kamera-ID ersetzen müssen:

<xml xmlns="http://www.w3.org/1999/xhtml">
  <block type="on_ext" id="5:E8z%?$kF2:_228=Fsl" x="-62" y="-112">
    <mutation items="1"></mutation>
    <field name="CONDITION">ne</field>
    <field name="ACK_CONDITION"></field>
    <value name="OID0">
      <shadow type="field_oid" id="7K},E#*On`zsq^jhPQ9v">
        <field name="oid">mqtt.0.instar.10D1DC21F5DB.status.alarm.triggered</field>
      </shadow>
    </value>
    <statement name="STATEMENT">
      <block type="controls_if" id="2%z$7WDJUl-dSz+miU(-">
        <value name="IF0">
          <block type="logic_compare" id="9]pjLD{[W^26TPYM6liS">
            <field name="OP">EQ</field>
            <value name="A">
              <block type="on_source" id="-?/H,NwcYjPh~{p`fc`~">
                <field name="ATTR">state.val</field>
              </block>
            </value>
            <value name="B">
              <block type="text" id="hKDWmg?WzR9@$Wo4RHj5">
                <field name="TEXT">{"val":"1"}</field>
              </block>
            </value>
          </block>
        </value>
        <statement name="DO0">
          <block type="control" id="g@M?e*b1_8ezO{_(PUcP">
            <mutation delay_input="false"></mutation>
            <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.movestep.raw</field>
            <field name="WITH_DELAY">FALSE</field>
            <value name="VALUE">
              <block type="text" id="u2H{{k$7nO+({(J4,2,C">
                <field name="TEXT">left</field>
              </block>
            </value>
          </block>
        </statement>
        <next>
          <block type="controls_if" id="}uq*%|F/Nt=*`rn`|hV4">
            <value name="IF0">
              <block type="logic_compare" id="|x2u0AR*aTmVC=lfROzF">
                <field name="OP">EQ</field>
                <value name="A">
                  <block type="on_source" id="In|(S^y0YVoVN#Y^[.5m">
                    <field name="ATTR">state.val</field>
                  </block>
                </value>
                <value name="B">
                  <block type="text" id="uC/+7LgdO]A`UdHW*sHC">
                    <field name="TEXT">{"val":"4"}</field>
                  </block>
                </value>
              </block>
            </value>
            <statement name="DO0">
              <block type="control" id="K58]j^_|1M4|}D2aF?{u">
                <mutation delay_input="false"></mutation>
                <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.movestep.raw</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="text" id="13|%(`^fM,_w499|gkt-">
                    <field name="TEXT">right</field>
                  </block>
                </value>
              </block>
            </statement>
            <next>
              <block type="controls_if" id="JhXZ,A)R?fQ}!et!,!/7">
                <value name="IF0">
                  <block type="logic_compare" id="560g5G|oV?rEcXER(oOD">
                    <field name="OP">EQ</field>
                    <value name="A">
                      <block type="on_source" id="9[A80k}o*RpbflDD2h/:">
                        <field name="ATTR">state.val</field>
                      </block>
                    </value>
                    <value name="B">
                      <block type="text" id="._5?cn:Mi%DWgz;OL}v4">
                        <field name="TEXT">{"val":"6"}</field>
                      </block>
                    </value>
                  </block>
                </value>
                <statement name="DO0">
                  <block type="control" id="]KIbdkEE?:DEhmZ`)wE=">
                    <mutation delay_input="false"></mutation>
                    <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.preset.raw</field>
                    <field name="WITH_DELAY">FALSE</field>
                    <value name="VALUE">
                      <block type="text" id="1HbkwoM-U/]J2go|iNoe">
                        <field name="TEXT">2</field>
                      </block>
                    </value>
                  </block>
                </statement>
              </block>
            </next>
          </block>
        </next>
      </block>
    </statement>
  </block>
</xml>