Das erwartet dich in diesem Artikel
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:
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):
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:
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):
In das hellgrüne Feld vom „Objekt ID mit Dialog selektieren“-Block fügst du einen „Objekt ID“-Block aus dem Bereich „Trigger“ ein:
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:
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
17 Kommentare
KommentierenHi,
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?
Klar, über einen Logik-Block den Namen des Kanals oder Geräts abfragen und abfangen. Grüße
Wärest du so nett und würdest darauf näher eingehen und beschreiben wie das umzusetzen ist?
Klar, schau mal hier: https://ibb.co/Sn08xJY
Mist, ich hab die Lösung verpennt. Wie genau meinst du das mit dem Logikblock?
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önnte man auch eine Meldung generieren, wenn der Adapter wieder connected ist.
Klar, dafür musst du mit „ist größer als letzter“ triggern.
Hallo, das funktioniert leider nicht.
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 Markus, dafür musst du den Expertenmodus aktivieren (oben die Icons).
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.
Mache ich, danke! Mann kann mit dem HTTP-Block (request) die Pushover-API direkt ansprechen.