Hallo zusammen,
nachdem ich nun schon viel hier im Forum gelesen und mir diverse Anregungen geholt habe, möchte ich nun mal ein eigenes, kleines Blockly Projekt vorstellen.
Zur "Vorgeschichte", ich habe eine Eufy Klingel, die ich mit dem Beta Adapter im IOBroker eingebunden habe. Ich wollte nun im VIS nicht nur das letzte Bild auf dem Startbildschirm haben, sondern auch eine Benachrichtigung angezeigt bekommen, dass es geklingelt hat.
Dazu habe ich mir der Alarm Benachrichtigung des Material Designs bedient. https://github.com/Scrounger/ioBroker.vis-materialdesign#alerts, da mir das sehr gut gefallen hat.
Diese Funktion bedient sich ja eines JSON Tabelle, die ich als Datenpunkt im IOBroker angelegt habe und mittels einer Überwachung einer Statusänderung des im Eufy Adapter abgespeicherten Bildes, mit einem JSON String (Tabelle) befüllt habe.
Jetzt sollte der Alarm aber nicht durch einen neuen Alarm "einfach" überschrieben, sondern um weitere Alarme ergänzt werden, so das alle Alarme "gesammelt" und angezeigt sowie einzeln bestätigt werden können. Dafür musste ich beim Befüllen des Datenpunktes den alten Wert auslesen, die Klammern [] entfernen und in einen neuen JSON String einbauen. Dazu habe ich viel gesucht, aber leider irgendwie nichts finden können, wie man sowas mittels Blockly macht, also habe ich ein Blockly geschrieben, was dies erledigt. Da ich auch gern zukünftig von weiteren Scripten Alarme generieren lassen will, habe ich mir einen neuen Datenpunkt angelegt, der einfach vom jeweiligen Script, mit dem Alarm-Text befüllt wird:
Wird dieser Datenpunkt nun durch ein Script oder anders, befüllt/ aktualisiert, liest mein Notification Script den Text aus, außerdem wird der vorhandene Alarm als JSON String ausgelesen, die beiden Klammern entfernt und ein neuer JSON String zusammengestellt und in den Alarm Datenpunkt geschrieben.:
Falls die Alarme leer sind, wird natürlich nur ein neuer Alarm generiert.
So bin ich nun völlig flexibel und kann aus diversen Scripten Alarme generieren, die auf meiner Startseite angezeigt und bestätigt werden können, einfach in dem ich den Alarmtext in den Datenpunkt schreibe. So sieht dass dan bei mir im Moment aus, wenn ein Alarm als "Popup" angezeigt wird:
Erweitern könnte man das nun noch um unterschiedlich farbige Alarme oder verschiedene Status ... das kommt im nächsten Schritt.
Ob ich den elegantesten Weg gefunden habe, den JSON String zu erweitern, weiß ich nicht, ich konnte zumindest keine Beispiele im Netz für Blockly dazu finden. Ein Script hatte ich gefunden, das war aber für meinen Zweck zu umfangreich. Mit dem konnte man diverse Zeichen innerhalb eines Textes suchen und ersetzen, ich wollte aber nur das erste und letzte Zeichen löschen. Wenn jemand eine elegantere, unkomplizierte Variante in Blockly hat, kann er mir das hier ja mal schreiben. Bin für alle Anregungen offen.
hier mal noch der Code des Blockly Scripts:
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</variable>
<variable id="~zY;uP/|B*bH5;+*1zS)">new_notification</variable>
<variable id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</variable>
<variable id="8(y2F!sD{20ihwYLAhGP">klammer_auf</variable>
<variable id="^sS2_jh}Eg@LYPb7kS%:">klammer_zu</variable>
<variable id="v!-nOTt,~*ahZ_2F,iKy">temp_NAK_old_Notification</variable>
</variables>
<block type="on" id="B9fR=CxTNz;%7xa_,,Pe" x="63" y="-112">
<field name="OID">0_userdata.0.new_notification</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="t0OA%5zmX%aefRbL/^WT">
<mutation else="1"></mutation>
<value name="IF0">
<block type="logic_compare" id="#5^[?`;l?%H(N,r(E-Jw">
<field name="OP">NEQ</field>
<value name="A">
<block type="get_value" id="N3mLH=N?pwEbS2GOs!r2">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Notification</field>
</block>
</value>
<value name="B">
<block type="text" id="Mx_!U?Bo8*)W5!uL#fYo">
<field name="TEXT">[]</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="variables_set" id="-.lkh[k0lA#KsG]LUI:X">
<field name="VAR" id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</field>
<value name="VALUE">
<block type="get_value" id="RrAuJquy{bA@=JL0VH)8">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.Notification</field>
</block>
</value>
<next>
<block type="debug" id="F`gnslIV976beILAY}gF">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="ZKIcw7VMU#+oBI[Um#mg">
<field name="TEXT">Zwischenwert:</field>
</shadow>
<block type="variables_get" id="+A|`/K}$v}.I$;=yQ)D+">
<field name="VAR" id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</field>
</block>
</value>
<next>
<block type="variables_set" id="eTCe{uW4k1?h=a@3=)ee">
<field name="VAR" id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</field>
<value name="VALUE">
<block type="text_length" id="$E7d5XoGw[bB)dCTwq#,">
<value name="VALUE">
<shadow type="text" id="`;vnY_GZD_nL2cRgpXEK">
<field name="TEXT">abc</field>
</shadow>
<block type="variables_get" id="cn3%tY~g6/{Mj%]Kv0NY">
<field name="VAR" id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</field>
</block>
</value>
</block>
</value>
<next>
<block type="variables_set" id="/hN`0On0c6NrEeQC+K=+">
<field name="VAR" id="~zY;uP/|B*bH5;+*1zS)">new_notification</field>
<value name="VALUE">
<block type="get_value" id="u`=m4m{HbTI1z6rpl-A4">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.new_notification</field>
</block>
</value>
<next>
<block type="debug" id="gr%7S]NAmV`UoB`tY+uX">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT">Wert vorhanden</field>
</shadow>
<block type="variables_get" id="){Yv,$6hGvd{//:}ntqE">
<field name="VAR" id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</field>
</block>
</value>
<next>
<block type="math_change" id="w3[UhY`EE7/T)@$,~*}-">
<field name="VAR" id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</field>
<value name="DELTA">
<shadow type="math_number" id="tdJ4+bm@!X?E*4MS#;u3">
<field name="NUM">-1</field>
</shadow>
</value>
<next>
<block type="debug" id="h:+D~[9fD7Rgw7^XqO8@">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT">Wert vorhanden</field>
</shadow>
<block type="variables_get" id="$f{ddyYhh.X*?HNF{(4h">
<field name="VAR" id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</field>
</block>
</value>
<next>
<block type="variables_set" id="w;lE*uu/Duk.JPviB{mR">
<field name="VAR" id="8(y2F!sD{20ihwYLAhGP">klammer_auf</field>
<value name="VALUE">
<block type="text" id="8^OcF4-PF+|O,f1fd0Hr">
<field name="TEXT">[</field>
</block>
</value>
<next>
<block type="variables_set" id="md,IsX@Bd([e:+{oAXyH">
<field name="VAR" id="^sS2_jh}Eg@LYPb7kS%:">klammer_zu</field>
<value name="VALUE">
<block type="text" id="(@01}z)jw,(aes(Y@xnQ">
<field name="TEXT">]</field>
</block>
</value>
<next>
<block type="variables_set" id="i?G5FMLd[~}/w#(j_c(]">
<field name="VAR" id="v!-nOTt,~*ahZ_2F,iKy">temp_NAK_old_Notification</field>
<value name="VALUE">
<block type="text_getSubstring" id=",*U%uqzpEXcOG.Rz=hU%">
<mutation at1="true" at2="true"></mutation>
<field name="WHERE1">FROM_START</field>
<field name="WHERE2">FROM_START</field>
<value name="STRING">
<block type="variables_get" id="I$RwkkdBsNYTi($|R*PS">
<field name="VAR" id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</field>
</block>
</value>
<value name="AT1">
<block type="math_number" id="Y{d6j}r#`K;j8n$SYYP#">
<field name="NUM">2</field>
</block>
</value>
<value name="AT2">
<block type="variables_get" id="BF.%#]YP+p!#8Tlfd_Q!">
<field name="VAR" id="hlvpmQcY1Ebs+;z0}4uE">laenge_NAK_Notification</field>
</block>
</value>
</block>
</value>
<next>
<block type="debug" id="ax(5HOLmi`HizA(OfprM">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="mQMszb_NQhL:3_vE`77C">
<field name="TEXT">Zwischenwert:</field>
</shadow>
</value>
<next>
<block type="debug" id="Yd#RC{w{E3nqcp2r77YW">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT">Wert vorhanden</field>
</shadow>
<block type="variables_get" id="PABuZ2)K^qe7$oK#)+jN">
<field name="VAR" id="+OE0Stg|GrQ-SL#usNx|">NAK_Notification</field>
</block>
</value>
<next>
<block type="debug" id="n%ebdPXVo?|u=q.%)-9m">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="NQ84^`$5Tzh?d{6$rOj`">
<field name="TEXT">Zwischenwert2:</field>
</shadow>
</value>
<next>
<block type="debug" id="r^{s2]AB||EWvY8|Zu9M">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id=";i542OrbVoz9hH_To),L">
<field name="TEXT">Wert vorhanden</field>
</shadow>
<block type="variables_get" id="h=nZ.2qCXI*fm94w|Pjv">
<field name="VAR" id="v!-nOTt,~*ahZ_2F,iKy">temp_NAK_old_Notification</field>
</block>
</value>
<next>
<block type="control_ex" id="gc?0VC2o[{ge_!XC^Vgw">
<field name="TYPE">true</field>
<field name="CLEAR_RUNNING">FALSE</field>
<value name="OID">
<shadow type="field_oid" id="n_QKxXV{DS+uy:tL4_Le">
<field name="oid">0_userdata.0.Notification</field>
</shadow>
</value>
<value name="VALUE">
<shadow type="logic_boolean">
<field name="BOOL">TRUE</field>
</shadow>
<block type="text_join" id="=F-3djMGFW1Cv^`N14``">
<mutation items="11"></mutation>
<value name="ADD0">
<block type="text" id="/zdJwxT-D;rBN*3q3K%Q">
<field name="TEXT">[</field>
</block>
</value>
<value name="ADD1">
<block type="variables_get" id="bEL,Aq/R]$aAZ04js^Nw">
<field name="VAR" id="v!-nOTt,~*ahZ_2F,iKy">temp_NAK_old_Notification</field>
</block>
</value>
<value name="ADD2">
<block type="text" id="n+6,|z58p][kb*[z@y%M">
<field name="TEXT">,</field>
</block>
</value>
<value name="ADD3">
<block type="text" id="1v/(ocytq`Ge#SQAF72j">
<field name="TEXT">{"text": "</field>
</block>
</value>
<value name="ADD4">
<block type="variables_get" id="6CFpt-d3j|zBG8+H{4?Z">
<field name="VAR" id="~zY;uP/|B*bH5;+*1zS)">new_notification</field>
</block>
</value>
<value name="ADD5">
<block type="text" id="rllQyhN^O$ddIN|S9U`m">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD6">
<block type="time_get" id="0n}/x_HNn-{E~9-9)VAY">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">DD.MM.</field>
</block>
</value>
<value name="ADD7">
<block type="text" id="2Ob;gAMq!x=_n1AP$W+w">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD8">
<block type="time_get" id=",OvgJbt}^?kZ0fas:aak">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">hh:mm</field>
</block>
</value>
<value name="ADD9">
<block type="text" id="70j$}Y#=S(d`~A`/.~?j">
<field name="TEXT">","backgroundColor":"","borderColor":"darkred","icon":"message-alert-outline","iconColor":"darkred","fontColor":"blue"}</field>
</block>
</value>
<value name="ADD10">
<block type="text" id="(.469hX5L15}K+qC?:?S">
<field name="TEXT">]</field>
</block>
</value>
</block>
</value>
<value name="DELAY_MS">
<shadow type="math_number" id="L,CO!fV9)Tk;GDMMxm47">
<field name="NUM">0</field>
</shadow>
</value>
<next>
<block type="debug" id="8/c3?Mt[op7oT/6!Nli_">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="G@/3[ak3ZK1$__)~r!?8">
<field name="TEXT">JSON Warnung ergänzt</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
<statement name="ELSE">
<block type="variables_set" id="m6[vQxBd2`P)XvyPlLvS">
<field name="VAR" id="~zY;uP/|B*bH5;+*1zS)">new_notification</field>
<value name="VALUE">
<block type="get_value" id="|EzwK?fcJWCD?r86=!m~">
<field name="ATTR">val</field>
<field name="OID">0_userdata.0.new_notification</field>
</block>
</value>
<next>
<block type="debug" id="$gx*w9%pG4C,?@[7IjjO">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="@L|LE+IHNoD[a)sk1Km2">
<field name="TEXT">kein Wert in Tabelle</field>
</shadow>
</value>
<next>
<block type="control_ex" id="@D0P:SZY!v,U`C8ZBpv=">
<field name="TYPE">true</field>
<field name="CLEAR_RUNNING">FALSE</field>
<value name="OID">
<shadow type="field_oid" id="}E@uq41#YOg!}5IWnA!X">
<field name="oid">0_userdata.0.Notification</field>
</shadow>
</value>
<value name="VALUE">
<shadow type="logic_boolean" id=":;PQ$[1a#7[{9xB|ue4$">
<field name="BOOL">TRUE</field>
</shadow>
<block type="text_join" id="x)7~)=M|i|9Ql2)Tl%K0">
<mutation items="7"></mutation>
<value name="ADD0">
<block type="text" id="`R/#@8Yg?s7,izp{IQq^">
<field name="TEXT">[{"text": "</field>
</block>
</value>
<value name="ADD1">
<block type="variables_get" id="3nosCDpL!z{RK77X[U/^">
<field name="VAR" id="~zY;uP/|B*bH5;+*1zS)">new_notification</field>
</block>
</value>
<value name="ADD2">
<block type="time_get" id="|Znw6Q)]dcGUf@!;:DAv">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">DD.MM.</field>
</block>
</value>
<value name="ADD3">
<block type="text" id="*5A?QSo/pN7-Ay)JIsv4">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD4">
<block type="time_get" id="xlJQJ~Sb.MsSPPsO5f+o">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">hh:mm</field>
</block>
</value>
<value name="ADD5">
<block type="text" id="LzI?y$@)UVbzv=6ZGIlY">
<field name="TEXT">","backgroundColor":"","borderColor":"darkred","icon":"message-alert-outline","iconColor":"darkred","fontColor":"blue"}</field>
</block>
</value>
<value name="ADD6">
<block type="text" id="k{w8-2Gj-}IieInJJ4P=">
<field name="TEXT">]</field>
</block>
</value>
</block>
</value>
<value name="DELAY_MS">
<shadow type="math_number" id="L^Ty6R!JyE.L]PO/@P_M">
<field name="NUM">0</field>
</shadow>
</value>
<next>
<block type="debug" id="b/(9tBN`TiT,vxx$kBQx">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="d?prDSm?b+]*[qAD1KaR">
<field name="TEXT">neue JSON Tabelle geschrieben</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</statement>
</block>
</xml>
für die, die es interessiert, hier noch der Code des Türklingel Alarms, welcher den Alarmtext generiert und in den Datenpunkt schreibt:
<xml xmlns="https://developers.google.com/blockly/xml">
<block type="on" id="B9fR=CxTNz;%7xa_,,Pe" x="188" y="-12">
<field name="OID">eufy-security.0.T8200N00202800BE.cameras.T8200N00202800BE.last_event_pic_url</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="control_ex" id="gc?0VC2o[{ge_!XC^Vgw">
<field name="TYPE">true</field>
<field name="CLEAR_RUNNING">FALSE</field>
<value name="OID">
<shadow type="field_oid" id="n_QKxXV{DS+uy:tL4_Le">
<field name="oid">0_userdata.0.new_notification</field>
</shadow>
</value>
<value name="VALUE">
<shadow type="logic_boolean">
<field name="BOOL">TRUE</field>
</shadow>
<block type="text_join" id="=F-3djMGFW1Cv^`N14``">
<mutation items="4"></mutation>
<value name="ADD0">
<block type="text" id="_2Vt,u+Q79JvX]|zj=J:">
<field name="TEXT">Türklingel verpasst </field>
</block>
</value>
<value name="ADD1">
<block type="time_get" id="0n}/x_HNn-{E~9-9)VAY">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">DD.MM.</field>
</block>
</value>
<value name="ADD2">
<block type="text" id="2Ob;gAMq!x=_n1AP$W+w">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD3">
<block type="time_get" id=",OvgJbt}^?kZ0fas:aak">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">hh:mm</field>
</block>
</value>
</block>
</value>
<value name="DELAY_MS">
<shadow type="math_number" id="L,CO!fV9)Tk;GDMMxm47">
<field name="NUM">0</field>
</shadow>
</value>
<next>
<block type="debug" id="8/c3?Mt[op7oT/6!Nli_">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="G@/3[ak3ZK1$__)~r!?8">
<field name="TEXT">JSON Warnung ergänzt</field>
</shadow>
</value>
</block>
</next>
</block>
</statement>
</block>
</xml>