ioBroker: Status von Instanzen mit Push oder E-Mail überwachen

Du kannst dich ganz bequem über Push oder E-Mail über den Status aller aktiven iobroker-Instanzen informieren lassen. Sobald eine Instanz abgestürzt oder gestoppt wurde, erhälst du eine Mitteilung. Dafür ist lediglich ein einfaches Script notwendig.

Trigger

Zuerst ziehst du dir einen neuen Trigger in den Blockly-Editor. An den Eingang hängst du einen „IDs vom Selektor“-Block aus dem Bereich „System“ mit folgendem Inhalt (mehr zum Thema „IDs vom Selektor“ erfährst du hier):

state[id=system.*.*.*.*connected]

Damit reagiert der Trigger auf den „connected“-Datenpunkt sämtlicher Instanzen, die in den Objekten unter „system…..“ aufgelistet werden:

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

Den Trigger selbst stellst du auf „ist kleiner als letztes“, somit reagiert er nur, wenn ein Datenpunkt von <true> (= 1) auf <false> (= 0) wechselt (mehr zu „Logik-Kurzformen“ erfährst du in diesem Artikel):

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

Wert nach Timeout erneut prüfen

Damit du nur benachrichtigt wirst, wenn eine Instanz gestoppt oder abgestürzt ist und nicht, wenn du sie neu startest, benötigst du ein „timeout“-Block. Vor diesen setzt du einen „stop timeout“-Block, der ein eventuell laufendes Timeout stoppt (über Timeouts und Intervalle kannst du in diesem Artikel mehr erfahren). Als Wert für die Millisekunden habe ich mit „20000“ gute Erfahrungen gemacht:

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

Nach Ablauf des Timeouts soll der Wert des Datenpunkts, der den Trigger ausgelöst hat, erneut ausgelesen und überprüft werden, ob dieser immer noch auf <false> steht. Ziehe dir dafür einen „falls mache“-Block aus dem Bereich „Logik“ in den „timeout“-Block. An den Eingang hängst du einen „nicht“-Block ebenfalls aus „Logik“. Zuletzt steckst du an den „nicht“-Block den Systemblock „Objekt ID mit Dialog selektieren“.

Diese Kurzform des „falls“-Blocks prüft nach folgendem Schema: <falls wert = nicht wahr> und ist somit erfüllt, wenn der angehängte Wert <false> ist (mehr zu „Logik-Kurzformen“ erfährst du in diesem Artikel):

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

In das hellgrüne Feld vom „Objekt ID mit Dialog selektieren“-Block fügst du einen „Objekt ID“-Block aus dem Bereich „Trigger“ ein:

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

Sobald der Trigger aktiviert wurde, prüft das Script also nach 20000 Millisekunden erneut, ob der Wert „connected“ der Instanz noch auf <false> steht. Ist das der Fall, erhältst du die eingestellte Benachrichtigung.

Benachrichtigung

Dafür ziehst du dir einen neuen „SendTo“-Block (in diesem Beispiel mit „Pushover“) in den Trigger und passt ihn wie folgt an:

Blockly-Beispiel: Status von  Instanz mit Push oder E-Mail überwachen

Der Block „Kanalname“ enthält den Namen der Instanz. Im Bereich „Trigger“ ziehst du dir den Block „Objekt ID“ in den „erstelle Text aus“ und stellst ihn auf „Kanalname“.

Solltest du mehrere Instanzen eines Adapters betreiben, kannst du mit der Einstellung „Geräte-ID“ den Namen der Instanz-ID ausgeben lassen und weißt dann, um welche Instanz-Nummer es sich handelt. Diese ID lautet dann zum Beispiel (gegenüber dem Kanalnamen „ical“):

system.adapter.ical.2

Du kannst natürlich auch einen E-Mail, Telegram, Whatsapp oder Pushover-Block verwenden. Wie du diese Adapter einrichten kannst, erfährst du in diesem Artikel.

Fertiges Script

Blockly

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable type="timeout" id="timeout">timeout</variable>
  </variables>
  <block type="on_ext" id="l~94Q]Lp4C7}RN/fyLLG" x="138" y="-362">
    <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
    <field name="CONDITION">lt</field>
    <field name="ACK_CONDITION"></field>
    <value name="OID0">
      <shadow type="field_oid" id="_TzJP)7kl%:!q.%68^57">
        <field name="oid">default</field>
      </shadow>
      <block type="selector" id="17W(wI:Nbj9T]]{HJRbP">
        <field name="TEXT">state[id=system.*.*.*.*connected]</field>
      </block>
    </value>
    <statement name="STATEMENT">
      <block type="timeouts_cleartimeout" id="Vnm~Jlc?k%B0sBApq)/]">
        <field name="NAME">timeout</field>
        <next>
          <block type="timeouts_settimeout" id="L5WG9J6l:_Ps2rSWk$C3">
            <field name="NAME">timeout</field>
            <field name="DELAY">20000</field>
            <field name="UNIT">ms</field>
            <statement name="STATEMENT">
              <block type="controls_if" id="7pL:EIAX8QPMb9YrPddn">
                <value name="IF0">
                  <block type="logic_negate" id="8txt5]*[=|5AxV%(;=,m">
                    <value name="BOOL">
                      <block type="get_value_var" id="6r[{dpn3:H$~#N9Pm2i+">
                        <field name="ATTR">val</field>
                        <value name="OID">
                          <shadow type="text" id="YCE]M!@oOn=pWs:jkfrX">
                            <field name="TEXT"></field>
                          </shadow>
                          <block type="on_source" id="uSD6L!QlUB:$WBdwmyKz">
                            <field name="ATTR">id</field>
                          </block>
                        </value>
                      </block>
                    </value>
                  </block>
                </value>
                <statement name="DO0">
                  <block type="pushover" id="H}#=zS+}E-:Bwe235gFL">
                    <field name="INSTANCE">.0</field>
                    <field name="SOUND"></field>
                    <field name="PRIORITY">0</field>
                    <field name="LOG"></field>
                    <value name="MESSAGE">
                      <shadow type="text" id="4!kPzdUg%X^!a^K]Z$LY">
                        <field name="TEXT">text</field>
                      </shadow>
                      <block type="text_join" id="CWBg@)/L0x(2+|;@+5}O">
                        <mutation items="2"></mutation>
                        <value name="ADD0">
                          <block type="on_source" id="M1#.`MRfN10apU#j=s*C">
                            <field name="ATTR">channelName</field>
                          </block>
                        </value>
                        <value name="ADD1">
                          <block type="text" id="77|j_z`+;[62@g:0*u5i">
                            <field name="TEXT"> ist nicht erreichbar.</field>
                          </block>
                        </value>
                      </block>
                    </value>
                    <value name="TITLE">
                      <block type="text" id="jvVTS%a~KEsk1#%f|#pt">
                        <field name="TEXT">ioBroker</field>
                      </block>
                    </value>
                  </block>
                </statement>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </statement>
  </block>
</xml>

Javascript

on({id: Array.prototype.slice.apply($("state[id=system.*.*.*.*connected]")), change: "lt"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
  timeout = setTimeout(function () {
    if (!getState(obj.id).val) {
      sendTo("pushover.0", "send", {
         message: (String(obj.channelName) + ' ist nicht erreichbar.'),
         sound: "",
         title: 'ioBroker'
      });
    }
  }, 20000);
});

ioBroker: Alias-Datenpunkte anlegen und verknüpfen

ioBroker: Mit Blockly und dem ID-Selektor auf systemweite Änderungen reagieren

War dieser Beitrag hilfreich?
Hat dir der Beitrag geholfen?
Die mit Sternchen (*) gekennzeichneten Links sind sogenannte Affiliate-Links. Wenn du auf so einen Affiliate-Link klickst und über diesen Link einkaufst, bekomme ich von dem betreffenden Online-Shop oder Anbieter eine Provision. Für dich verändert sich der Preis nicht.

17 Kommentare

Kommentieren

Hi,
ich dachte immer wenn man bei „Wert von“ die rote Objekt ID eingibt, nimmt er den Wert der Triggerauslösung?
Müsste da nach dem Timeout nicht ein „Wert vom Objekt“ = false oder 0 stehen damit er bei erneuter Abfrage nicht den Auslösewert nimmt?

Hallo Chris, der „Objekt ID mit Dialog selektieren“-Block holt nach dem Timeout erneut den Wert von der Objekt-ID, die den Trigger ausgelöst hat. Das heißt, nicht der Wert vom Trigger (das wäre der rote Block „Wert“ (roter „Objekt ID“-Block)) wird verglichen, sondern der aktuelle, der nach dem Timeout besteht. Durch das „falls nicht“ wird geprüft, ob der Wert des Objekts „falsch“ ist. Wenn du „nicht“ weglassen würdest, wird auf „true“ geprüft. Viele Grüße

Top, Danke dafür. Kurze Frage noch. Ich habe eine Instanz, die ich bewusst regelmäßig ausschalte (sayit.02, wenn das Kind schläft und die Klingel ausgeschaltet wird). Kann ich diese Instanz hier quasi ausklammern, dass ich KEINE Meldung bekomme, dass die Instanz nicht läuft/nicht erreichbar ist?

Hallo, ich habe ein Blockly für die Beschattung der Terrasse laufen. Darin sind einige Bedingungen angegeben, nach denen sich die Markise auch wieder einfahren soll. Dies soll sie aber nicht gleich machen, wenn nur eine kleine Wolke vor der Sonne ist, sondern erst nach einer bestimmten Zeit. Damit tue ich mich schwer. Wie sollte hier der Time Out aussehen? Vielen Dank.

Hallo, könntest du ein Beispiel dafür erstellen? Nur „ist größer als letztes“ reicht bei mir nicht.

Hallo, Du schreibst oben: „Damit reagiert der Trigger auf den „connected“-Datenpunkt sämtlicher Instanzen, die in den Objekten unter „system…..“ aufgelistet werden“. Ich finde aber bei mir unter Objekte kein „system….“. Woran kann das liegen? Besten Dank.

Hallo Max,
ich hatte gerade einen Stopp der javascript-Instanz. Kann Dein Script auch diese Instanz prüfen, wenn doch javascript selbst gestoppt ist?
Liebe Grüße
Micha

Hallo MAx,

könntest du den Artikel aktualisieren. Man kann mittlerweile mit dem sednto Block keine Pushover Textkreationen anhängen.

Schreibe einen Kommentar