NEWS
VORLAGE: Batterieüberwachung HomematicIP mit Blockly
-
Hallo,
ich habe mir dank der Hilfe im Forum ein Blockly zur Batterieüberwachung meiner HomaticIP-Geräte zusammengeklickt.
(Ich weiß, dass es schon ein Universalskript gibt.)
Es werden automatisch alle Geräte gefunden und mit Ihrem Namen in einer HTML Tabelle formatiert.Die Tabelle wird jede Minute neu generiert.
Das Skript kann für alles verwendet werden, was mit wahr und falsch abgebildet werden kann.
Erreichbarkeit von Geräten, Batterie, Fensterstatus etc. ......Im Script ist denke ich alles soweit erklärt.
Bin nicht soo fit in Blockly, keine Ahnung ob manches Überflüssig oder falsch ist .....
Scheint aber alles zu klappen.Die Formatierung der Tabelle und der Texte kann mit ein wenig HTML angepasst werden.
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="q=Q/4S_nykMJv,R-%5SK">id</variable> <variable id="SKh+R[G%ptX]9uv^hB,!">wahr</variable> <variable id=";O,|I4cqK/q|U6dt.?NN">falsch</variable> <variable id="%62`(Q[9y{,UvP3o}T|/">i</variable> <variable id="GI^dumJfw0)4Nzi2HVw`">ParentID</variable> </variables> <block type="schedule" id="=M?}+$74/A|+fu)hob?*" x="1188" y="463"> <field name="SCHEDULE">* * * * *</field> <statement name="STATEMENT"> <block type="variables_set" id="dZ;P0S=A~Ue9U{sxWFjF"> <field name="VAR" id="SKh+R[G%ptX]9uv^hB,!">wahr</field> <value name="VALUE"> <block type="text" id="1Rdn%LJ,UsyiTo}^fQyi"> <field name="TEXT"></field> </block> </value> <next> <block type="variables_set" id="JoJ{Z)?hFmCa3B.z1B~;"> <field name="VAR" id=";O,|I4cqK/q|U6dt.?NN">falsch</field> <value name="VALUE"> <block type="text" id="I)B703c6WPKo}@_L8ai^"> <field name="TEXT"></field> </block> </value> <next> <block type="controls_forEach" id="VXic[*WK}rqr0-!U:EFy"> <field name="VAR" id="%62`(Q[9y{,UvP3o}T|/">i</field> <value name="LIST"> <block type="selector" id="vI2MD73D2c=a4z1nh`=`"> <field name="TEXT">hm-rpc.0.*.0.LOW_BAT</field> </block> </value> <statement name="DO"> <block type="variables_set" id="5%|F-TdcQ{4t*4:+v!]w"> <field name="VAR" id="GI^dumJfw0)4Nzi2HVw`">ParentID</field> <value name="VALUE"> <block type="text_getSubstring" id="`QFsslqwXJcDRwUQ_z;$" inline="false"> <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="2K5mqiyK-@A,u?+%_r-I"> <field name="VAR" id="%62`(Q[9y{,UvP3o}T|/">i</field> </block> </value> <value name="AT1"> <block type="math_number" id="_q*GktBrg4YS~$oc@#.$"> <field name="NUM">1</field> </block> </value> <value name="AT2"> <block type="math_arithmetic" id="BHxb,^*vvK^,t3OWIp~N" inline="false"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="V4^8g/Fq~(QA(Gn,=_g9"> <field name="NUM">1</field> </shadow> <block type="text_indexOf" id=";@~lMPhmFt@}zblOq8}z" inline="false"> <field name="END">LAST</field> <value name="VALUE"> <block type="variables_get" id="ZxgO1Qq@jpN)?*](o;s%"> <field name="VAR" id="%62`(Q[9y{,UvP3o}T|/">i</field> </block> </value> <value name="FIND"> <shadow type="text" id="xWkYFdwM0dR_rBOFM|zY"> <field name="TEXT">.0.LOW_BAT</field> </shadow> </value> </block> </value> <value name="B"> <shadow type="math_number" id="h-25vZ[WT=N4?QJ3saG%"> <field name="NUM">1</field> </shadow> </value> </block> </value> </block> </value> <next> <block type="controls_if" id="[t4#.[R7stu?S`@$u3BW"> <mutation else="1"></mutation> <value name="IF0"> <block type="get_value_var" id="Iq+@rH{{dyJ9HWgoI~T4"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text"> <field name="TEXT"></field> </shadow> <block type="variables_get" id="B)n%:}PX%zZGvt#JtbR("> <field name="VAR" id="%62`(Q[9y{,UvP3o}T|/">i</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="S+Gd]Tap?Ej$]1P.V.(_"> <field name="VAR" id="SKh+R[G%ptX]9uv^hB,!">wahr</field> <value name="VALUE"> <block type="text_join" id="5?soV=/V!gT:YP;%=C7*"> <mutation items="4"></mutation> <value name="ADD0"> <block type="variables_get" id="t5Hgf|mSwoVqQ}(:~9Y7"> <field name="VAR" id="SKh+R[G%ptX]9uv^hB,!">wahr</field> </block> </value> <value name="ADD1"> <block type="text" id="xa}qmEJ|8{^pBcPkIB|C"> <field name="TEXT"><tr><td></field> </block> </value> <value name="ADD2"> <block type="get_attr" id="N%K=-ar/nF2t;vp68{4;" inline="false"> <value name="PATH"> <shadow type="text" id="NEKfB0mKYNB9yf[p[(LM"> <field name="TEXT">common.name</field> </shadow> </value> <value name="OBJECT"> <block type="procedures_callcustomreturn" id="mBvJ_WhP|}o*z}@Nf9Gx"> <mutation name="GetObjectByID"> <arg name="id"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="D:=8pGehBP5ZOKH2LV2?"> <field name="VAR" id="GI^dumJfw0)4Nzi2HVw`">ParentID</field> </block> </value> </block> </value> </block> </value> <value name="ADD3"> <block type="text" id="2WmqZ^-K89eQ9Z!T.Sg!"> <field name="TEXT"></td> <td ALIGN="CENTER"><font size="3"><b><font color=red>●</font> </td> </tr></field> </block> </value> </block> </value> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="sh;fX7NWP+]`^FcnbVjU"> <field name="VAR" id=";O,|I4cqK/q|U6dt.?NN">falsch</field> <value name="VALUE"> <block type="text_join" id="|Xz[CQA5p*BCe{uu*,ir"> <mutation items="4"></mutation> <value name="ADD0"> <block type="variables_get" id="F4J0jDpn[Na[1p8Ruf=%"> <field name="VAR" id=";O,|I4cqK/q|U6dt.?NN">falsch</field> </block> </value> <value name="ADD1"> <block type="text" id="C+UnHlb%GLN.|tA3o,`C"> <field name="TEXT"><tr><td></field> </block> </value> <value name="ADD2"> <block type="get_attr" id="=z[7ycSqfif0h~4Sz*|=" inline="false"> <value name="PATH"> <shadow type="text" id="C*^0Xt3cP0zy%F4#veYO"> <field name="TEXT">common.name</field> </shadow> </value> <value name="OBJECT"> <block type="procedures_callcustomreturn" id=",{*p|W,%6Npy^h.,(XSP"> <mutation name="GetObjectByID"> <arg name="id"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="dgPrr_H^_1Z}0!cS+Iw{"> <field name="VAR" id="GI^dumJfw0)4Nzi2HVw`">ParentID</field> </block> </value> </block> </value> </block> </value> <value name="ADD3"> <block type="text" id="yNUk#G;)wLb1Xq!/%A[M"> <field name="TEXT"></td> <td ALIGN="CENTER"><font size="3"><b><font color=green>●</font> </td> </tr></field> </block> </value> </block> </value> </block> </statement> </block> </next> </block> </statement> <next> <block type="update" id="|*Wyl;F2(g0J1J^:!x68"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.VIS.Akkumeldungen.hmip_akku_tabelle</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text_join" id="CF52S*}*)[vTA|Y~w+@1"> <mutation items="5"></mutation> <value name="ADD0"> <block type="text" id="yxd%qU_@2Bv39AdiqwQ*"> <field name="TEXT"><table style="width: 100%;"> <tbody> <tr> <td width=100%><b><font size="3">Gerät</b></td></font> <td ALIGN="CENTER"><b><font size="3">Batteriestatus</b></td></font> </tr></field> </block> </value> <value name="ADD1"> <block type="text" id="`hArP:}QO5fa:5w(*q*y"> <field name="TEXT"><tr> <td colspan="2"> <hr> </dt> </tr></field> </block> </value> <value name="ADD2"> <block type="variables_get" id="!NM$6J~B9mGR:#`~#8V_"> <field name="VAR" id=";O,|I4cqK/q|U6dt.?NN">falsch</field> </block> </value> <value name="ADD3"> <block type="variables_get" id="JwXRwyMGnb)]ut6eTQc-"> <field name="VAR" id="SKh+R[G%ptX]9uv^hB,!">wahr</field> </block> </value> <value name="ADD4"> <block type="text" id="#E/@/Eiu!x|i4nvHP^wR"> <field name="TEXT"></tbody> </table></field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> <block type="procedures_defcustomreturn" id="z1v5P%=uhnATnl`x*fMU" x="1287" y="462"> <mutation statements="false"> <arg name="id" varid="q=Q/4S_nykMJv,R-%5SK"></arg> </mutation> <field name="NAME">GetObjectByID</field> <field name="SCRIPT">cmV0dXJuIGdldE9iamVjdChpZCk7</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> <block type="comment" id="7b)G*.(ks+o+9/KF?==d" x="1737" y="462"> <field name="COMMENT">Zum generieren des Namens nötig</field> </block> <block type="comment" id=",nhkIOk5!S-bl(WQ%W2," x="1763" y="562"> <field name="COMMENT">Pfad zum überwachten Status. Überall wo sich der Pfad ändern kann ein "*" setzen</field> </block> <block type="comment" id="E+[,5)F;s:Baq^:PP%:]" x="1388" y="737"> <field name="COMMENT">Generierung Name</field> </block> <block type="comment" id="^}0=ESmiwoVU9u;$fX0$" x="2063" y="712"> <field name="COMMENT">Hier den den ende des Pfades eintragen</field> </block> <block type="comment" id="7[:rRJVBk6Rksi_#t88m" x="1788" y="863"> <field name="COMMENT">Für Tabelle nötig</field> </block> <block type="comment" id="19ql9!tQemk6O^f:c#-L" x="1938" y="913"> <field name="COMMENT">Erzeugung des Namess des Objektes in der Tabelle</field> </block> <block type="comment" id="0i38/qZ%GIMlxFe)xf/#" x="2087" y="988"> <field name="COMMENT">Für Tabelle nötig, hier kann die Farbe des Punktes angepasst werden</field> </block> <block type="comment" id="ywl:gJJfGwXIx+y1.dD{" x="2088" y="1088"> <field name="COMMENT">Alles nochmal für "false"</field> </block> <block type="comment" id="BUtvX0Od,/2F^?SiC^^R" x="1987" y="1238"> <field name="COMMENT">Für Tabelle nötig</field> </block> <block type="comment" id=".aipRCl^|NRuCa:O#P-y" x="1188" y="1287"> <field name="COMMENT">Hier einen selber angelegten Datenpunkt angeben</field> </block> <block type="comment" id="yI+58LiZf6zrWcujT:fK" x="1937" y="1288"> <field name="COMMENT">Trennlinie, bei Bedarf entfernen</field> </block> <block type="comment" id="K9Wwg*_,UJZ|3J{1`}Ry" x="1813" y="1363"> <field name="COMMENT">Für Tabelle nötig</field> </block> </xml>
-
@David-G Danke! Aber ich denke, es hätte auch eine Variable (statt 'falsch' und 'wahr') gereicht.
-
@David-G
Ich mache das hier so ähnlich, nur das ich alias verwende (weil man dann "schöne Namen" vergeben kann) und keinen Zeitplan (oder jede Minute) verwende, dafür könntest Du einen Selektor verwenden, dann wird nur getriggert wenn sich was ändert bzw. eine Batterie leer ausgibt.Edit: sieht dann bei mir z.B. so aus (die HTML Ausgabe ist über die Datenpunkte veränderbar)
-
Das habe ich gemacht, da ich so leichter den grünen und roten Punkt zuweisen kann.
Und ich habe volle und leere Batterien nicht gemischt angezeigt.
Keine Ahnung, ob das beides mit einer Variablen klappt.Ist wenig eigenes Können bei ^^, wirklich viel kombiniert was ich gelesen habe.
Den Trigger könnte ich wirklich noch ändern, da hast du recht.
Mit den Namen stimmt.
Das gute ist, dass in meinem Skript wenigsten der Name genommen wird und nicht die ID.
Im Rega-Adapter kann man ja auch ausstellen, dass der Name synchronisiert wird. So kann man den auch unter rpc.0 ordentliche Namen vergeben.
Habe nicht für alles ein Alias, da grade bei den Heizungen viel in einer Gruppe ist, wo ich nur ein Alias für die Gruppe anlege anstatt für zig Thermostate.. -
@David-G sagte in VORLAGE: Batterieüberwachung HomematicIP mit Blockly:
Das gute ist, dass in meinem Skript wenigsten der Name genommen wird und nicht die ID.
Das hat auch wieder Vor und Nachteile. Ich habe es auch mal so gemacht, aber es gibt viele User, die ganz komische Namen vergeben haben...(in der CCU z.B. oder auch anderen Anwendungen die eigene Namen verwenden). Bei mir werden diese Namen auch zur Sprachansage über Alexa benutzt, die sollten sich dann auch aussprechen lassen und sich vernünftig anhören.
-
@David-G sagte in VORLAGE: Batterieüberwachung HomematicIP mit Blockly:
Im Rega-Adapter kann man ja auch ausstellen, dass der Name synchronisiert wird. So kann man den auch unter rpc.0 ordentliche Namen vergeben.
das stimmt, aber es gibt noch viele andere Adapter in denen Batterien sind.
Habe nicht für alles ein Alias, da grade bei den Heizungen viel in einer Gruppe ist, wo ich nur ein Alias für die Gruppe anlege anstatt für zig Thermostate..
Ich auch nicht, ist ja auch nicht notwendig. Ich möchte ja nur bestimmte Werte auswerten, für die lege ich halt einen alias an.
Aber, nicht falsch verstehen, alles keine Kritik. Wir können schließlich alle voneinander lernen.
Und, jeder kann mach was er möchte. -
Kein Ding, verstehe es nicht falsch.
Erstens hat jeder andere Anforderungen wo und wie es ins Konzept passen muss.
Zweitens hat jeder einen anderen Wissensstand wie Dinge umgesetzt werden können.
Da ist es ja Hilfreich auf andere Vorgehensweisen erfahrenen Usern weitergegeben werden.Habe hier im Forum bisher sehr viel Hilfe erfahren dürfen, da probiere ich das, was ich mir erarbeitet habe weiterzugeben für andere.
-
kannst Du bitte Deinen Blockly Export nochmal überprüfen ? (ich wollte mir das gerade mal importieren)
-
Hab es oben nochmal neu reinkopiert.
Hab grad nur gesehen, dass es noch einen doofen Namen hat. Wenn man sein Testskript dann doch bis zum Ende verwendet ^^.Ich selber bekomme es importiert, gerade mal getestet.
-
Ich stelle jetzt mal zu meinem eigenen Script eine Frage.....
Weiß jemand, ob ich über eine zweite Liste noch die Erreichbarkeit meiner Geräte anzeigen kann?
Man könnte den mittleren Teil des Scripts ja quasi kopieren und auf unreach prüfen.Hab nur Sorge, dass die Reihenfolgen der beiden Listen ggf unterschiedlich sind, da ja nicht jedes Gerät was einen unreach State hat auch einen low_bat State hat.
-
@david-g sagte: nicht jedes Gerät was einen unreach State hat auch einen low_bat State hat.
So ist es. Wie soll die Liste aussehen? Wie bisher, nur zusätzliche Anzeige von "UNREACH"? Oder alle Geräte und keine Anzeige bei "LOW_BAT", wenn kein "LOW_BAT" vorhanden?
-
Am coolsten wäre einfach noch eine zweite Spalte mit grünen Punkten.
Die Tabelle bekomme ich la leicht erweitert, nur der Inhalt ^^.Gerät I Batterie I Empfang
Falls das nicht machbar ist, binde ich einfach 2 Tabellen ein.
-
@david-g sagte: Am coolsten wäre einfach noch eine zweite Spalte mit grünen Punkten.
Das beantwortet meine Frage nicht: Tabelle mit allen Geräten oder nur mit Batterie betriebenen Geräten?
Da ohnehin schon die Geräte-ID ermittelt wurde, muss man nur noch den restlichen Teil dranhängen (".0.UNREACH" bzw. ".0.LOW_BAT") und zusätzlich abfragen.
-
Mit allen Geräten.
Dann könnte man zB bei Geräten ohne Batterie einen grauen Punkt anzeigen anstatt einen grünen oder roten (oder keinen, falls es leichter ist). -
@david-g sagte: Mit allen Geräten.
Dann nimm als Selektor "hm-rpc.0.*.0.UNREACH" und frage zusätzlich
parentID + ".0.LOW_BAT"
ab, wobei erst mit existstState(id) geprüft werden müsste, ob vorhanden.
-
Selektor ändern bekomme ich noch hin ^^.
Danach hört es aber auf. Das mit der parentID verstehe ich eh nicht ganz. Steht da nur Dank deiner Hilfe aus dem Thread wo wir es erarbeitet haben. Genau wie beim existstState(id).
2 neue Variablen bräuchte ich doch bestimmt auch oder? -
@david-g sagte:
2 neue Variablen bräuchte ich doch bestimmt auch oder?
Wenn ich mir das Blockly so ansehe, dann eher 3:
@david-g sagte in VORLAGE: Batterieüberwachung HomematicIP mit Blockly:
bei Geräten ohne Batterie einen grauen Punkt anzeigen anstatt einen grünen oder roten
Die HTML-Geschichten muss ich komplett Dir überlassen, denn damit kenne ich mich gar nicht aus.
Eine JS-Funktion checkBatt(id) mit Ergebnis könnte so aussehen
if(existsState(id)) return getState(id).val; // false / true return -1
Prinzip der Auswertung:
-
Danke, werde ich morgen einbauen.
Hoffe die Kids lassen es zu.
Im Moment sind die nicht so ausgelastet (Hoffentlich macht der Kindergarten bald wieder auf....). -
Die Auswertung packe ich dann "einfach" mit in die Schleife rein, unter das erste "Falls" (nur eben mit getauschten Selektor im oberen Bereich)?
-
@david-g sagte: Die Auswertung packe ich dann "einfach" mit in die Schleife rein, unter das erste "Falls" (nur eben mit getauschten Selektor im oberen Bereich)?
Ja, so sehe ich das.