Zur Fensterüberwachung nutze ich die Kontaktsensoren von Aqara im versteckten Einbau am Fenster (mehr dazu).
Das erwartet dich in diesem Artikel
Verschiedene Varianten
- Variante 1: Ausgabe als reine Textliste
Zum Beispiel für Benachrichtungen über Pushover, Whatsapp, Telegram oder E-Mail - Variante 2: Ausgabe als HTML-Liste
Notwendig für die machs-smart.de-Visualisierung
Vorbereitung
Zuerst benötigst einen neuen Datenpunkt
Zunächst legst du dir einen eigenen Datenpunkt der Art „gemischt“ an. Als Name nimmst du zum Beispiel „Fenster“.
Sensoren einer Aufzählung zuweisen
Um später nur auf Änderungen deiner Fenster oder Türen zu triggern, solltest du den State jedes Sensors, den du überwachen willst, einer „Funktion“ hinzufügen, zum Beispiel „Fenster“. Lege dazu unter „Aufzählungen“ eine neue Funktion an:
Danach wechselst du in „Objekte“ und wählst deinen Kontaktsensor aus. Dem State, der den „geöffnet“-Zustand überwacht, weist du die Funktion „Fenster“ zu:
Datenpunkt benennen
Außerdem solltest du den State in der Spalte „Name“ einen aussagekräftigen Namen geben, beispielsweise „Badfenster“ (hier im Beispiel: „Fenster“):
Raum zuweisen
Damit zusätzlich der Raum, in dem sich das Fenster befindet, angezeigt wird, solltest du dem State (oder dem übergreifendem Kanal) einen Raum zuweisen:
Blockly-Script aufbauen
Variante 1: Ausgabe als reine Textliste
Listen „geöffnet“ und „geschlossen“ erstellen
Dann erstellst du ein neues Blockly-Script und fügst einen „falls“-Trigger ein. Als Auslöser wählst du „IDs vom Selektor“ (in diesem Artikel erfährst du mehr über diesen Selektor):
state[id=*](functions=fenster)
Dadurch reagiert das Script auf alle Änderungen innerhalb der Aufzählung bzw. Funktion „Fenster“.
Als nächstes benötigst du 3 neue Variablen, die du wie folgt auf Text bzw eine leere Liste setzt:
Dann fügst du aus dem Bereich „Schleifen“ eine neuen „für jeden Wert aus Liste“-Block ein. An den Eingang hängst du ebenfalls einen „IDs vom Selektor“ mit dem gleichen Inhalt wie eben (mehr zum Thema „automatische Listen“ erfährst du hier):
Ziehe dir nun einen „falls mache“-Block aus der Logik in die grüne Schleife und stelle ihn über das Zahnrad auf „falls mache sonst“ um:
Als Bedingung hängst du einen „Wert von Objekt“ aus dem Bereich „System“ an und weißt ihm die Variable „i“ (aus der Schleife) zu. Damit löst die Bedingung „mache“ aus, wenn der Wert von „i“ wahr ist:
Dann steckst du einen „in der Liste setze für“-Block aus dem Bereich „Liste“ in den grünen Schleifen-Block. Als Einstellung benötigst du „füge als Erste“. Als Listen-Variable nimmst du die Variable „Liste offen“:
Anschließend steckst du einen „erzeuge Liste mit“-Block aus dem Bereich „Listen“ an den Ausgang „ein“. An den Eingang des neuen „erzeuge Liste mit“-Blocks fügst du die Javascript-Funktion „Name“ mit „i“ an:
Hinweis: je nach Version deines Javascript-Adapters musst du für das „Raum“-Script einen anderen Code verwenden! Mehr dazu hier im Artikel.
Nun kopierst du dir den „in der Liste setze für“-Block und fügst ihn unter „sonst“ ein. Dann änderst du die Variable hinter „in der Liste“ auf „Liste-geschlossen“:
Sortieren und Ausgabe
Füge außer- und unterhalb der grünen Schleife 2 weitere „falls dann“-Blöcke aus der „Logik“ ein und stecke an den Eingang jeweils einen „nicht“-Block aus „Logik“ sowie ein „ist leer“-Block aus „Listen“. Füge in diese wie unten zu sehen deine beiden Variablen ein:
Jetzt brauchst du zweimal den „Text“-Block „zu Element Text anhängen“. Setze ihn jeweils in die „falls mache“-Logik und stelle „Liste-komplett“ als Variable ein:
Text für „Liste-offen“:
Geöffnet:
Text für „Liste-geschlossen“:
Geschlossen:
Für das Sortieren benötigst du das Sortieren-Script (absteigende Sortierung) und eine neue „für jeden Wert aus der Liste“-Schleife. Erstelle die Sortieren-Funktion und hänge diese an den Eingang der Schleife. An den Eingang „Liste“ der Funktion sollte die Variable „Liste-offen“ gesteckt werden und an den „Wert“ die Zahl „3“ (letzte Änderung):
Anschließend baust du die eigentliche Ausgabe-Logik zusammen. Füge dazu wieder einen „Text“-Block „zu Element Text anhängen“ in die grüne Schleife:
- Eingang: „in der Liste nimm das Element“
mit Variable „j“ und Wert „1“ als Zahl
Als vorletzten Schritt kopierst du die grüne Schleife (Rechtsklick -> kopieren) und fügsr sie im nächsten, noch leeren „falls mache“-Block ein, allerdings mit der Variable „Liste-geschlossen“:
Zum Schluss kannst du nun die Variable „Liste-komplett“ an einen „sendto“-Block stecken und dir die Liste schicken lassen. In diesem Beispiel habe ich den „pushover“-Block genutzt:
Fertiges Script
Blockly
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="Fwt*3`3ScyT(qDt?gf(T">ObjectID</variable>
<variable id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</variable>
<variable id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</variable>
<variable id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</variable>
<variable id="9sl@{VQ/amrd~ZTB}e/O">i</variable>
</variables>
<block type="procedures_defcustomreturn" id="]lQM=r`L^2M}s^@n(USH" x="-112" y="-887">
<mutation statements="false">
<arg name="ObjectID" varid="Fwt*3`3ScyT(qDt?gf(T"></arg>
</mutation>
<field name="NAME">Name</field>
<field name="SCRIPT">bGV0IG5hbWUgPSBnZXRPYmplY3QoT2JqZWN0SUQpLmNvbW1vbi5uYW1lOwovL2lmKHR5cGVvZiByb29tID09ICdvYmplY3QnKSByZXR1cm4gcm9vbS5kZTsKcmV0dXJuIG5hbWU7</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="on_ext" id="RT3@Kxqxg#w3f=(kzwCu" x="-112" y="-862">
<mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<value name="OID0">
<shadow type="field_oid" id="0)0sp$I1ccfm%4Sde-mT">
<field name="oid">default</field>
</shadow>
<block type="selector" id=",lvP%A]1J?Mf^@0s2D%[">
<field name="TEXT">state[id=*](functions=fenster)</field>
</block>
</value>
<statement name="STATEMENT">
<block type="variables_set" id="EaZb.Nmx4%jg9Z;%%B!-">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="VALUE">
<block type="text" id="Wh^sL0z$W-HIc=.KAWpS">
<field name="TEXT"></field>
</block>
</value>
<next>
<block type="variables_set" id="SS-}=kJy|nP`aiAV1-xb">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
<value name="VALUE">
<block type="lists_create_with" id="$AFtq:sq?.LYHWTSs$x|">
<mutation items="0"></mutation>
</block>
</value>
<next>
<block type="variables_set" id="o_#fa#./grwL0VYZXhV1">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
<value name="VALUE">
<block type="lists_create_with" id="P~^2(u_E4rR`PYMfolf}">
<mutation items="0"></mutation>
</block>
</value>
<next>
<block type="controls_forEach" id="~PaFX`X@5n{TM9K^{Jw6">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
<value name="LIST">
<block type="selector" id="xQ^Q5{h5V@5PLI+YO@i.">
<field name="TEXT">state[id=*](functions=fenster)</field>
</block>
</value>
<statement name="DO">
<block type="controls_if" id="-3J;6~}7Ac!D}IR`/Dr1">
<mutation else="1"></mutation>
<value name="IF0">
<block type="get_value_var" id=")kSAuROX6lA-U2N,FJ1Q">
<field name="ATTR">val</field>
<value name="OID">
<shadow type="text" id="e+?Z+-m0_DLYGl{zT3ix">
<field name="TEXT"></field>
</shadow>
<block type="variables_get" id="!fALmmY3PSF+?rGHUXQ,">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="lists_setIndex" id="-zUiNM(}BsoQ].Hu.|mx" inline="false">
<mutation at="false"></mutation>
<field name="MODE">INSERT</field>
<field name="WHERE">FIRST</field>
<value name="LIST">
<block type="variables_get" id="Q0Hct8=ken4m!!W]js)U">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
<value name="TO">
<block type="procedures_callcustomreturn" id="2fUjFt9g8rVF/XheoN.x">
<mutation name="Name">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="k:Is?gkGPl/=r1X^,k3K">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
</block>
</statement>
<statement name="ELSE">
<block type="lists_setIndex" id="-jTzj32XiFWfi?n1Y/LN" inline="false">
<mutation at="false"></mutation>
<field name="MODE">INSERT</field>
<field name="WHERE">FIRST</field>
<value name="LIST">
<block type="variables_get" id="2~tv/YW~42Q$E*%G;Pqi">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
<value name="TO">
<block type="procedures_callcustomreturn" id="`Zdw5Kh*[(IY72pyr_o(">
<mutation name="Name">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="dTq}?1$ruG%K+237sR}z">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
</block>
</statement>
</block>
</statement>
<next>
<block type="controls_if" id="%xroGCihVu8$~$xQ{]ke">
<value name="IF0">
<block type="logic_negate" id="u(+LUZ2=D}K8JRKt()tg">
<value name="BOOL">
<block type="lists_isEmpty" id="zS,AjUzHt0uWh$(li$,h">
<value name="VALUE">
<block type="variables_get" id="b),0*5k:oMF~4H^Xx.Hw">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="text_append" id="xgCK}K@KSx){tg%A(xl5">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text" id="-HV%tM;_jbL/K_)=V78_">
<field name="TEXT">Geöffnet: </field>
</block>
</value>
<next>
<block type="text_append" id="mQWs]oKZy!!UBi#)2pN:">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="lists_split" id="vo;Gre#7RVr3M6$mk7E:">
<mutation mode="JOIN"></mutation>
<field name="MODE">JOIN</field>
<value name="INPUT">
<block type="variables_get" id="o(LRYzD:?:_v5aTHyYuJ">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
<value name="DELIM">
<shadow type="text" id="lIp}_n+[0|`={eJh]aEe">
<field name="TEXT">, </field>
</shadow>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
<next>
<block type="controls_if" id="L!}N25QKJ[D61;a?bf%?">
<value name="IF0">
<block type="logic_negate" id="P#;v$=eLxCHvoTF^|O)k">
<value name="BOOL">
<block type="lists_isEmpty" id="7GdP`ErgKtT#V1*MU9gK">
<value name="VALUE">
<block type="variables_get" id="T`YMrp]-^RFDhRULk,7z">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="text_append" id="rr-Lu!{,+|n3Pz}r,/|q">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text" id="u#~AR/M~-4pVtl1Oc_:7">
<field name="TEXT"></field>
</shadow>
<block type="text" id="rHg4[Q1;k=YZ/r;j3e$B">
<field name="TEXT">Geschlossen: </field>
</block>
</value>
<next>
<block type="text_append" id="(`NHR}HYpw]:P`ZNgy6X">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text" id="LHw-8A|w9lQp3_kLp8XM">
<field name="TEXT"></field>
</shadow>
<block type="lists_split" id="s{W^YIjtci(NGf{R![Df">
<mutation mode="JOIN"></mutation>
<field name="MODE">JOIN</field>
<value name="INPUT">
<block type="variables_get" id="u4US1gL%m8Myl{MI]BFp">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
<value name="DELIM">
<shadow type="text" id="),t^.5%yN_V(;k~5h}?^">
<field name="TEXT">, </field>
</shadow>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
<next>
<block type="debug" id="U,|}xqE%tY43.c|@LblL">
<field name="Severity">log</field>
<value name="TEXT">
<shadow type="text" id="]gA]y`d?X#o3Te0Qtj7?">
<field name="TEXT">test</field>
</shadow>
<block type="variables_get" id="1nD3!n%U[$sq3eX2[GiY">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</xml>
Javascript
var ObjectID, Liste, Wert, Liste_komplett, Liste_offen, Liste_geschlossen, i;
function Name(ObjectID) {
let name = getObject(ObjectID).common.name;
//if(typeof room == 'object') return room.de;
return name;
}
on({id: Array.prototype.slice.apply($("state[id=*](functions=fenster)")), change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
Liste_komplett = '';
Liste_offen = [];
Liste_geschlossen = [];
var i_list = Array.prototype.slice.apply($("state[id=*](functions=fenster)"));
for (var i_index in i_list) {
i = i_list[i_index];
if (getState(i).val) {
Liste_offen.unshift(Name(i));
} else {
Liste_geschlossen.unshift(Name(i));
}
}
if (!!Liste_offen.length) {
Liste_komplett += 'Geöffnet: ';
Liste_komplett += String(Liste_offen.join(', '));
}
if (!!Liste_geschlossen.length) {
Liste_komplett += 'Geschlossen: ';
Liste_komplett += String(Liste_geschlossen.join(', '));
}
console.log(Liste_komplett);
});
Variante: Ausgabe als HTML-Liste
Listen „geöffnet“ und „geschlossen“ erstellen
Dann erstellst du ein neues Blockly-Script und fügst einen „falls“-Trigger ein. Als Auslöser wählst du „IDs vom Selektor“ (in diesem Artikel erfährst du mehr über diesen Selektor):
state[id=*](functions=fenster)
Dadurch reagiert das Script auf alle Änderungen innerhalb der Aufzählung bzw. Funktion „Fenster“.
Als nächstes benötigst du 3 neue Variablen, die du wie folgt auf Text bzw eine leere Liste setzt:
Dann fügst du aus dem Bereich „Schleifen“ eine neuen „für jeden Wert aus Liste“-Block ein. An den Eingang hängst du ebenfalls einen „IDs vom Selektor“ mit dem gleichen Inhalt wie eben (mehr zum Thema „automatische Listen“ erfährst du hier):
Ziehe dir nun einen „falls mache“-Block aus der Logik in die grüne Schleife und stelle ihn über das Zahnrad auf „falls mache sonst“ um:
Als Bedingung hängst du einen „Wert von Objekt“ aus dem Bereich „System“ an und weißt ihm die Variable „i“ (aus der Schleife) zu. Damit löst die Bedingung „mache“ aus, wenn der Wert von „i“ wahr ist:
Dann steckst du einen „in der Liste setze für“-Block aus dem Bereich „Liste“ in den grünen Schleifen-Block. Als Einstellung benötigst du „füge als Erste“. Als Listen-Variable nimmst du die Variable „Liste offen“:
Anschließend steckst du einen „erzeuge Liste mit“-Block aus dem Bereich „Listen“ an den Ausgang „ein“ und stellst über das blaue Zahnrad den Wert auf 3. An den ersten Eingang des neuen „erzeuge Liste mit“-Blocks fügst du die Javascript-Funktion „Name“ mit „i“, an den zweiten Eingang die Javascript-Funktion „Raum“ mit „i“ und an den dritten Eingang einen „Wert von Objekt ID“ mit „i“ aus dem Bereich „System“ mit der Eeinstelung „letzte Änderung“.
Hinweis: je nach Version deines Javascript-Adapters musst du für das „Raum“-Script einen anderen Code verwenden! Mehr dazu hier im Artikel.
Nun kopierst du dir den „in der Liste setze für“-Block und fügst ihn unter „sonst“ ein. Dann änderst du die Variable hinter „in der Liste“ auf „Liste-geschlossen“:
Sobald du nun ein Fenster öffnest oder schließt, wird es mit Namen und Zustand in die entsprechende Liste geschrieben. Weiter geht es mit der Sortierung und der Ausgabe.
Sortieren und Ausgabe
Jetzt brauchst du zweimal den „Text“-Block „zu Element Text anhängen“. Setze ihn jeweils in die „falls mache“-Logik und stelle „Liste-komplett“ als Variable ein:
Als Text fügst du folgenden HTML-Code ein. Dieser formatiert die Ausgabe nachher als Tabelle. Über die CSS-Klassen „table-status“ und „inactive“ kannst du die beiden Tabellen nachher unterschiedlich gestalten (siehe auch meine iobroker-Visualisierung für FireHD bzw. 1024 x 640 Pixel).
Text für „Liste-offen“:
<div class="headline"><b>Geöffnet</b></div><table class="table-status"><tbody>
Text für „Liste-geschlossen“:
<div class="headline"><b>Geschlossen</b></div><table class="table-status inactive"><tbody>
Jetzt folgt die Sortierung und das Einsetzen der einzelnen Listeneinträge in die HMTL-Tabelle. Hierfür benötigst du das Sortieren-Script (absteigende Sortierung) und eine neue „für jeden Wert aus der Liste“-Schleife. Erstelle die Sortieren-Funktion und hänge diese an den Eingang der Schleife. An den Eingang „Liste“ der Funktion sollte die Variable „Liste-offen“ gesteckt werden und an den „Wert“ die Zahl „2“ Zahl „3“ (letzte Änderung):
Zusätzlich benötigst du noch einen „Text“-Block „zu Element Text anhängen“. Setze ihn unter die „falls mache“-Logik und stelle „Liste-komplett“ als Variable ein. Als Text fügst du wieder folgenden HTML-Code ein:
</tbody></table>
Anschließend baust du die eigentliche Ausgabe-Logik zusammen. Füge dazu wieder einen „Text“-Block „zu Element Text anhängen“ in die grüne Schleife und stecke an den Einang einen „erstelle Text aus“-Block mit 8 Eingängen (blaues Zahnrad):
- Eingang 1: Leeres Text-Feld
(Das Bild dazu findest du weiter unten zum Download)
<tr><td><img src="/vis.0/main/icons/noun_open.png"></td><td>
- Eingang 2: „in der Liste nimm das Element“
mit Variable „j“ und Wert „1“ als Zahl - Eingang 3: „in der Liste nimm das Element“
mit Variable „j“ und Wert „2“ als Zahl - Eingang 4: Leeres Text-Feld
</td><td><span class=""><i>Letzte Änderung:</i><br>
- Eingang 5: „Datum/Zeit“ mit „in der Liste nimm das Element“
mit Variable „j“ und Wert „3“ als Zahl, formatiert nach „TT.MM“ - Eingang 6: Leeres Text-Feld
, [1 x LEERTASTE]
- Eingang 7: „Datum/Zeit“ mit „in der Liste nimm das Element“
mit Variable „j“ und Wert „3“ als Zahl, formatiert nach „SS.mm“ - Eingang 7: Leeres Text-Feld
Uhr</span></td></tr>
Als vorletzten Schritt kopierst du die grüne Schleife (Rechtsklick -> kopieren) und fügsr sie im nächsten, noch leeren „falls mache“-Block ein, allerdings mit der Variable „Liste-geschlossen“:
Jetzt fehlt nur noch der Befehl, die komplette Ausgabe in deinen Datenpunkt zu schreiben. Dafür benötigst du den „steuere mit“-Block aus dem Bereich „System“. Wähle den oben erstellten Datenpunkt („Fenster“) aus. In das leere Feld „mit“ setzt du die Variable „Liste-komplett“ ein:
Sobald du nun deine Fenster öffenst oder schließt, wird automatisch eine Liste erstellt, die nach beiden Zuständen unterscheidet. Füge in deiner Visualisierung ein „Basic – String (unescaped)“-Widget ein und verknüpfe es mit dem Datenpunkt:
Du kannst dieser Aufzählung jederzeit weitere Datenpunkte/Geräte hinzufügen, ohne das Script anpassen zu müssen.
Hinweis: Nach dem ersten Start des Scripts ist es notwendig, dass du eins deiner Fenster testweise öffnest/schließt, damit die Script-Logik initiiert wird und alle Fenster-Zustände ausgewertet werden.
Notwendige Bilder
Bitte lade das Bild über den Dateimanager des VIS-Editors in das Verzeichnis:
vis.0/main/icons
Notwendiges Stylesheet / CSS
Damt deine Ausgabe wie die in meiner ioBroker-Visualisierung (oben dargestellt) aussieht, musst du im Reiter „CSS“ folgende Styles einfügen:
.table-status {
width: 100%;
margin: 0px 0px 40px;
}
.table-status tr {
background: none!important;
border-bottom: 1px dotted #ccc;
height: 48px;
}
.table-status tr:last-child {
background: none!important;
border-bottom: 0px solid #ccc;
}
.table-status th:nth-child(1),
.table-status td:nth-child(1) {
padding: 5px 0px 0px!important;
text-align: left!important;
width: 10%!important;
vertical-align: top;
}
.table-status th:nth-child(1) img,
.table-status td:nth-child(1) img {
width: 40px;
height: auto;
margin-left: -6px;
}
.table-status.inactive img {
opacity: 0.6;
}
.table-status th:nth-child(2),
.table-status td:nth-child(2) {
padding: 0px 0px 0px 10px!important;
text-align: left;
width: *;
-moz-hyphens: none;
-o-hyphens: none;
-webkit-hyphens: none;
-ms-hyphens: none;
hyphens: none;
white-space: nowrap;
font-size: large;
line-height: 1;
}
.table-status th:nth-child(3),
.table-status td:nth-child(3) {
padding: 9px 0px 0px!important;
vertical-align: top;
text-align: right;
}
Hier geht es zum Download des Visualisierungs-Templates.
Fertiges Script
Blockly
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="Fwt*3`3ScyT(qDt?gf(T">ObjectID</variable>
<variable id="./q,SFeGV,;)[@g=ERgm">Liste</variable>
<variable id="K@h0-NY5VaI|@t!5/iJh">Wert</variable>
<variable id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</variable>
<variable id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</variable>
<variable id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</variable>
<variable id="9sl@{VQ/amrd~ZTB}e/O">i</variable>
<variable id="}7$%uuGc-M*ZU6ZQ%SJ[">j</variable>
</variables>
<block type="procedures_defcustomreturn" id="]lQM=r`L^2M}s^@n(USH" x="-112" y="-887">
<mutation statements="false">
<arg name="ObjectID" varid="Fwt*3`3ScyT(qDt?gf(T"></arg>
</mutation>
<field name="NAME">Name</field>
<field name="SCRIPT">bGV0IG5hbWUgPSBnZXRPYmplY3QoT2JqZWN0SUQpLmNvbW1vbi5uYW1lOwovL2lmKHR5cGVvZiByb29tID09ICdvYmplY3QnKSByZXR1cm4gcm9vbS5kZTsKcmV0dXJuICI8Yj4iK25hbWUrIjwvYj4iOw==</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="procedures_defcustomreturn" id="v;YxDy}cJ+i39]iq7oim" x="-112" y="-862">
<mutation statements="false">
<arg name="ObjectID" varid="Fwt*3`3ScyT(qDt?gf(T"></arg>
</mutation>
<field name="NAME">Raum</field>
<field name="SCRIPT">bGV0IHJvb20gPSBnZXRPYmplY3QoT2JqZWN0SUQsICdyb29tcycpLmVudW1OYW1lc1swXTsKcmV0dXJuICI8YnI+PHNwYW4gY2xhc3M9Jyc+PHNtYWxsPiIrcm9vbS5kZSsiPC9zbWFsbD48L3NwYW4+Ijs=</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="procedures_defcustomreturn" id="!t;U0AgoNU@W*^{W;)1~" x="-112" y="-837">
<mutation statements="false">
<arg name="Liste" varid="./q,SFeGV,;)[@g=ERgm"></arg>
<arg name="Wert" varid="K@h0-NY5VaI|@t!5/iJh"></arg>
</mutation>
<field name="NAME">Multisort</field>
<field name="SCRIPT">dmFyIFdlcnQgPSBXZXJ0IC0gMTsgCkxpc3RlLnNvcnQoZnVuY3Rpb24oYSwgYil7CiAgICByZXR1cm4gYltXZXJ0XSAtIGFbV2VydF07Cn0pOwpyZXR1cm4gTGlzdGU7</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="on_ext" id="RT3@Kxqxg#w3f=(kzwCu" x="-112" y="-762">
<mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<value name="OID0">
<shadow type="field_oid" id="0)0sp$I1ccfm%4Sde-mT">
<field name="oid">default</field>
</shadow>
<block type="selector" id=",lvP%A]1J?Mf^@0s2D%[">
<field name="TEXT">state[id=*](functions=fenster)</field>
</block>
</value>
<statement name="STATEMENT">
<block type="variables_set" id="EaZb.Nmx4%jg9Z;%%B!-">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="VALUE">
<block type="text" id="Wh^sL0z$W-HIc=.KAWpS">
<field name="TEXT"></field>
</block>
</value>
<next>
<block type="variables_set" id="SS-}=kJy|nP`aiAV1-xb">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
<value name="VALUE">
<block type="lists_create_with" id="$AFtq:sq?.LYHWTSs$x|">
<mutation items="0"></mutation>
</block>
</value>
<next>
<block type="variables_set" id="o_#fa#./grwL0VYZXhV1">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
<value name="VALUE">
<block type="lists_create_with" id="P~^2(u_E4rR`PYMfolf}">
<mutation items="0"></mutation>
</block>
</value>
<next>
<block type="controls_forEach" id="~PaFX`X@5n{TM9K^{Jw6">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
<value name="LIST">
<block type="selector" id="xQ^Q5{h5V@5PLI+YO@i.">
<field name="TEXT">state[id=*](functions=fenster)</field>
</block>
</value>
<statement name="DO">
<block type="controls_if" id="-3J;6~}7Ac!D}IR`/Dr1">
<mutation else="1"></mutation>
<value name="IF0">
<block type="get_value_var" id=")kSAuROX6lA-U2N,FJ1Q">
<field name="ATTR">val</field>
<value name="OID">
<shadow type="text" id="e+?Z+-m0_DLYGl{zT3ix">
<field name="TEXT"></field>
</shadow>
<block type="variables_get" id="!fALmmY3PSF+?rGHUXQ,">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="lists_setIndex" id="-zUiNM(}BsoQ].Hu.|mx">
<mutation at="false"></mutation>
<field name="MODE">INSERT</field>
<field name="WHERE">FIRST</field>
<value name="LIST">
<block type="variables_get" id="Q0Hct8=ken4m!!W]js)U">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
<value name="TO">
<block type="lists_create_with" id="6a@[p]s)BEL%k0#L3dY#">
<mutation items="3"></mutation>
<value name="ADD0">
<block type="procedures_callcustomreturn" id="2fUjFt9g8rVF/XheoN.x">
<mutation name="Name">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="k:Is?gkGPl/=r1X^,k3K">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<value name="ADD1">
<block type="procedures_callcustomreturn" id="}$wVs/^YVcjh{n/kS,q!">
<mutation name="Raum">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="E+iVny-H8b?jxnc3eZ/_">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="get_value_var" id="ZH.h{PJzN,EeXI-)JVDH">
<field name="ATTR">lc</field>
<value name="OID">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="variables_get" id="!@Z.|vd8M+75I$7U.crR">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
</block>
</value>
</block>
</statement>
<statement name="ELSE">
<block type="lists_setIndex" id="-jTzj32XiFWfi?n1Y/LN">
<mutation at="false"></mutation>
<field name="MODE">INSERT</field>
<field name="WHERE">FIRST</field>
<value name="LIST">
<block type="variables_get" id="2~tv/YW~42Q$E*%G;Pqi">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
<value name="TO">
<block type="lists_create_with" id="2h-G=W]Wb-8[:@[C~H,Y">
<mutation items="3"></mutation>
<value name="ADD0">
<block type="procedures_callcustomreturn" id="`Zdw5Kh*[(IY72pyr_o(">
<mutation name="Name">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="dTq}?1$ruG%K+237sR}z">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<value name="ADD1">
<block type="procedures_callcustomreturn" id="U=T2KtRYql2nS!LoW{0d">
<mutation name="Raum">
<arg name="ObjectID"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="gkj|GlgH+B$28{6w8,WN">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="get_value_var" id="mc2z(j0*wy9u3b.3zwJ[">
<field name="ATTR">lc</field>
<value name="OID">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="variables_get" id="Voni%mnoR.KzD5a!J:7a">
<field name="VAR" id="9sl@{VQ/amrd~ZTB}e/O">i</field>
</block>
</value>
</block>
</value>
</block>
</value>
</block>
</statement>
</block>
</statement>
<next>
<block type="controls_if" id="%xroGCihVu8$~$xQ{]ke">
<value name="IF0">
<block type="logic_negate" id="u(+LUZ2=D}K8JRKt()tg">
<value name="BOOL">
<block type="lists_isEmpty" id="zS,AjUzHt0uWh$(li$,h">
<value name="VALUE">
<block type="variables_get" id="b),0*5k:oMF~4H^Xx.Hw">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="text_append" id="+f`#OFcL{@YyO@sI#uCn">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text" id="_u=h#j1gG^*i^j^JZqD6">
<field name="TEXT"><div class="headline"><b>Geöffnet</b></div><table class="table-status"><tbody></field>
</block>
</value>
<next>
<block type="controls_forEach" id="eWuU?Rt40RRVcn@?$@eq">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
<value name="LIST">
<block type="procedures_callcustomreturn" id="(AShS`,jO5uhez@2%ZNO">
<mutation name="Multisort">
<arg name="Liste"></arg>
<arg name="Wert"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="a;$8#B,;I75h-Hy}~}q3">
<field name="VAR" id="MLrrG!H:mqglsc.Y_Ljh">Liste-offen</field>
</block>
</value>
<value name="ARG1">
<block type="math_number" id="y28xQ%[n;@7Wa:a77wl!">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
<statement name="DO">
<block type="text_append" id="gf^b8UA.=3P(K5[$j)Bj">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text_join" id=";7`[nwtLmM9SXh2[VePK">
<mutation items="8"></mutation>
<value name="ADD0">
<block type="text" id="j?`NI/7Gacv}dFN.+$PE">
<field name="TEXT"><tr><td><img src="/vis.0/main/icons/noun_open.png"></td><td></field>
</block>
</value>
<value name="ADD1">
<block type="lists_getIndex" id="@5OV65,;$.kv#!TecfHZ">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="EWa-I_dccB@]^nQe/W^d">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="g}BE:?b{VIm/+ZX2V0__">
<field name="NUM">1</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="lists_getIndex" id="q)iY@.m/$og@3$~)uH,K">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="g@zqTh)Ok*(KS$Z@eyc2">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="xcqlR!$Dwpu}DNdHJgy5">
<field name="NUM">2</field>
</block>
</value>
</block>
</value>
<value name="ADD3">
<block type="text" id=",FstDM5*y1X5@,$t;^[k">
<field name="TEXT"></td><td><span class=""><i>Letzte Änderung:</i><br></field>
</block>
</value>
<value name="ADD4">
<block type="convert_from_date" id="jhQmJJ_|F9dP%V#G7f2(">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">DD.MM.</field>
<value name="VALUE">
<block type="lists_getIndex" id="P3nC5W6:Y!7hvvwb[W4(">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="J]=7|JP6XXE0=iPV#!cV">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id=",;WKYc]epU}2fK^CNY~Q">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
</block>
</value>
<value name="ADD5">
<block type="text" id="@n3wTEG3`D{hPv(e[Wr)">
<field name="TEXT">, </field>
</block>
</value>
<value name="ADD6">
<block type="convert_from_date" id="XCt-c7RmMEAIAg:,hF]Y">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">hh:mm</field>
<value name="VALUE">
<block type="lists_getIndex" id="[aoz%*sr^}=m)|rI2a(t">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="{#={{3Gtp:2fb/o-ure(">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="2k8J6XGU%Y%uqN%8q5H|">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
</block>
</value>
<value name="ADD7">
<block type="text" id="w]zt{}A*8rLlwGa7H=Ty">
<field name="TEXT"> Uhr</span></td></tr></field>
</block>
</value>
</block>
</value>
</block>
</statement>
<next>
<block type="text_append" id="yrfmMVllibE1D[1,T-8c">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text" id="^^w-UuG$rGsR==gG(FoC">
<field name="TEXT"></tbody></table></field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</statement>
<next>
<block type="controls_if" id="L!}N25QKJ[D61;a?bf%?">
<value name="IF0">
<block type="logic_negate" id="P#;v$=eLxCHvoTF^|O)k">
<value name="BOOL">
<block type="lists_isEmpty" id="7GdP`ErgKtT#V1*MU9gK">
<value name="VALUE">
<block type="variables_get" id="T`YMrp]-^RFDhRULk,7z">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="text_append" id="rr-Lu!{,+|n3Pz}r,/|q">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text" id="u#~AR/M~-4pVtl1Oc_:7">
<field name="TEXT"></field>
</shadow>
<block type="text" id="rHg4[Q1;k=YZ/r;j3e$B">
<field name="TEXT"><div class="headline"><b>Geschlossen</b></div><table class="table-status inactive"><tbody></field>
</block>
</value>
<next>
<block type="controls_forEach" id=",E%-hd9aNijDQS~xb6IG">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
<value name="LIST">
<block type="procedures_callcustomreturn" id="zJBJ-|TKh/:ffe,W~G//">
<mutation name="Multisort">
<arg name="Liste"></arg>
<arg name="Wert"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="u4US1gL%m8Myl{MI]BFp">
<field name="VAR" id="}K$K4dup~Vnv!`[}vnQy">Liste-geschlossen</field>
</block>
</value>
<value name="ARG1">
<block type="math_number" id="sRy6vLJv{L4*zM1h$Vw.">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
<statement name="DO">
<block type="text_append" id="IM7}q13Z,USrjHB5d^`n">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text_join" id="5rJbRkW+.9IHmSei:Rem">
<mutation items="8"></mutation>
<value name="ADD0">
<block type="text" id="Lx-~aJu?UNp)TMQLkg}`">
<field name="TEXT"><tr><td><img src="/vis.0/main/icons/noun_open.png"></td><td></field>
</block>
</value>
<value name="ADD1">
<block type="lists_getIndex" id="AoaEUJWKFdo)%+D*Yk3`">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="HP7dg7+GTepvUBFM3uVT">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="bpTIbgw@cw;ar+uBuXbB">
<field name="NUM">1</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="lists_getIndex" id="9?X`MaNlZ1NZS6C-SYS|">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="k%z{z]Lw~_bKfP=YRX^;">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="MFyongfno_TN#AtpmSJm">
<field name="NUM">2</field>
</block>
</value>
</block>
</value>
<value name="ADD3">
<block type="text" id="$$]eY9QbaR[AgXw{/~~j">
<field name="TEXT"></td><td><span class=""><i>Letzte Änderung:</i><br></field>
</block>
</value>
<value name="ADD4">
<block type="convert_from_date" id="aBK1xf.=O3@4B{}t+hse">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">DD.MM.</field>
<value name="VALUE">
<block type="lists_getIndex" id="v4J?rf;_y|w){2wYgI}^">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="9UQY?lUs2WHo1:QMD*,.">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="k:!a*P$0iS!w(w=%ZI#~">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
</block>
</value>
<value name="ADD5">
<block type="text" id="s.!yxzz@DmF9$ljS.E[4">
<field name="TEXT">, </field>
</block>
</value>
<value name="ADD6">
<block type="convert_from_date" id="BdIPI^$}|(8fhQ`Lg-@]">
<mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
<field name="OPTION">hh:mm</field>
<value name="VALUE">
<block type="lists_getIndex" id="~A$+{3Nnp%6Sw6m$nef$">
<mutation statement="false" at="true"></mutation>
<field name="MODE">GET</field>
<field name="WHERE">FROM_START</field>
<value name="VALUE">
<block type="variables_get" id="S_D%98-`g28xsoQgC@*a">
<field name="VAR" id="}7$%uuGc-M*ZU6ZQ%SJ[">j</field>
</block>
</value>
<value name="AT">
<block type="math_number" id="=gOAYbL~nFne0k:Eo/^|">
<field name="NUM">3</field>
</block>
</value>
</block>
</value>
</block>
</value>
<value name="ADD7">
<block type="text" id="F7-vgXOBbexh|4M^!v5G">
<field name="TEXT"> Uhr</span></td></tr></field>
</block>
</value>
</block>
</value>
</block>
</statement>
<next>
<block type="text_append" id="WRGYm57Dr)oU(kB+1fT?">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
<value name="TEXT">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
<block type="text" id="`r/el3B4b=](jn!@`y,1">
<field name="TEXT"></tbody></table></field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</statement>
<next>
<block type="control" id="dI4yke%zrI0vqI$=7|!P">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">Eigene.0.Vis.Fenster</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="variables_get" id="1Q0Efv^4i*zZNN~`bBg,">
<field name="VAR" id="cTIvd#0frb]}?DN^7oUd">Liste-komplett</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</xml>
Javascript
var ObjectID, Liste, Wert, Liste_komplett, Liste_offen, Liste_geschlossen, i, j;
// Beschreibe diese Funktion …
function Name(ObjectID) {
let name = getObject(ObjectID).common.name;
//if(typeof room == 'object') return room.de;
return "<b>"+name+"</b>";
}
// Beschreibe diese Funktion …
function Raum(ObjectID) {
let room = getObject(ObjectID, 'rooms').enumNames[0];
return "<br><span class=''><small>"+room.de+"</small></span>";
}
// Beschreibe diese Funktion …
function Multisort(Liste, Wert) {
var Wert = Wert - 1;
Liste.sort(function(a, b){
return b[Wert] - a[Wert];
});
return Liste;
}
on({id: Array.prototype.slice.apply($("state[id=*](functions=fenster)")), change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
Liste_komplett = '';
Liste_offen = [];
Liste_geschlossen = [];
var i_list = Array.prototype.slice.apply($("state[id=*](functions=fenster)"));
for (var i_index in i_list) {
i = i_list[i_index];
if (getState(i).val) {
Liste_offen.unshift([Name(i), Raum(i), getState(i).lc]);
} else {
Liste_geschlossen.unshift([Name(i), Raum(i), getState(i).lc]);
}
}
if (!!Liste_offen.length) {
Liste_komplett += '<div class="headline"><b>Geöffnet</b></div><table class="table-status"><tbody>';
var j_list = Multisort(Liste_offen, 3);
for (var j_index in j_list) {
j = j_list[j_index];
Liste_komplett += String(['<tr><td><img src="/vis.0/main/icons/noun_open.png"></td><td>',j[0],j[1],'</td><td><span class=""><i>Letzte Änderung:</i><br>',formatDate(getDateObject((j[2])), "DD.MM."),', ',formatDate(getDateObject((j[2])), "hh:mm"),' Uhr</span></td></tr>'].join(''));
}
Liste_komplett += '</tbody></table>';
}
if (!!Liste_geschlossen.length) {
Liste_komplett += '<div class="headline"><b>Geschlossen</b></div><table class="table-status inactive"><tbody>';
var j_list2 = Multisort(Liste_geschlossen, 3);
for (var j_index2 in j_list2) {
j = j_list2[j_index2];
Liste_komplett += String(['<tr><td><img src="/vis.0/main/icons/noun_open.png"></td><td>',j[0],j[1],'</td><td><span class=""><i>Letzte Änderung:</i><br>',formatDate(getDateObject((j[2])), "DD.MM."),', ',formatDate(getDateObject((j[2])), "hh:mm"),' Uhr</span></td></tr>'].join(''));
}
Liste_komplett += '</tbody></table>';
}
setState("Eigene.0.Vis.Fenster"/*Fenster*/, Liste_komplett);
});
61 Kommentare
Kommentieren[…] View „Fenster“Offene und geschlossene Fenster als Liste ausgeben […]
Habe jetzt eine geschlagene Stunde versucht das Blocky zu debuggen bei mir,… ich habe testweise was in das Feld reinschreiben lassen, aber ich springt nicht in die erste Schleife mit i.
Muss ich denn außer dem Blockly Script was importieren?
Fenster sind alle mit Aufzählung „Fenster“ geschlüsselt.
Die Ausgabe heißt bei mir Fensterstatus, das hab ich ganz unten geändert.
Hallo Björn, ich verstehe nicht so recht, wo das Problem ist? Viele Grüße
Sorry,..
ich hab das blockly importiert und das Feld angelegt. Zudem meine Fenster als Fenster markiert.
Skript schreibt aber nix in mein Feld nix rein beim öffnen und schließen.
Ich habe dann versucht zu debuggen, leider ohne Erfolg.
Meine Frage war, muss ich noch etwas importieren, außer dein Blockly?
Hast du eine Ahnung woran es liegen könnte 🙂 ?
Habe dir eine E-Mail geschickt.
Viele Grüße
Hallo Max, bin vor ein paar Tagen auf deiner Seite gelandet und muss sagen, sehr gut gemachte Anleitungen, die man so selten findet.
Ich habe mir die Erstellung der Fenster-offen/geschlossen-Tabellen vorgenommen. Das Blokly habe ich nicht importiert, sondern Stück für Stück erstellt. Anpassungen auf meine Homematic Fensterkontakte waren nötig bei IDs vom Selektor — [state.id=*STATE](functions=fenster) –. Dann der erste Startversuch: Keine Errors, aber es wurden auch keine Räume aufgelistet. Ursache war/ist offensichtlich die letze Zeile der entsprechenden Funktion — return room.de; –.Ich dachte, das Anhängsel Punkt de kann nicht sein und das habe ich an vergleichbarer Stelle auch noch nicht gesehen. Nachdem ich es entfernt hatte, sind die Räume erschienen. Anschließend habe ich das Sortierverhalten überprüft und festgestell, dass nichts sortiert wird. Nach langer Suche auf einschlägigen Javascript-Seiten bin ich hier fündig geworden: stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value und habe den Code im Funktionsblock sortieren geändert in:
var Wert = Wert – 1;
Liste.sort(sortFunction);
function sortFunction(a, b) {
if (a[Wert] === b[Wert]) {
return 0;
}
else {
return (a[Wert] < b[Wert]) ? -1 : 1;
}
}
return Liste;
Danach hat das Sortieren nach Spalten entsprechend dem eingegebenen Wert funktioniert.
Getestet habe ich mit dem Beispiel Apfel-Birne-Salat. Das Sortieren in Abhängigkeit von Wert funktioniert, wenn die Listenelemente aus Ziffern bestehen. Sobald Zeichen a-z A-Z vorkommen wird nicht mehr danach sortiert.
Vielen Dank für den Beitrag, der mir beim Einstieg mit Listenblöcken sehr geholfen hat.
Viele Grüße Herbert
Hallo Herbert, danke für dein Feedback! Ich hatte bereits mit dem Javascript-Adapüter 4.10 gearbeitet, der offenbar anders sortiert und die Räume anders ausliest. Mit 4.8.4 jedoch erhalte ich auch den Raum mit „rooms.de“. Ich habe die Anleitungen aber um einen entsprechenden Hinweis ergänzt.
Zum Sortieren: Dein Script hat bei mir nicht funktioniert und einen Fehler produziert, jedoch habe ich festgestellt, dass der Wert nicht „2“ sein sollte, sondern „3“. Auch das habe ich oben überarbeitet.
Grüße, Max
[…] ist es einfacher (z. B. wenn du das Script für die Fensterzählung nachbaust oder verscheiene Geräte verschiedene Namen für ihre States verwenden) reagieren […]
Hallo Max,
wie bekomme ich den Datenpunkt in meiner VIS dargestellt?
Wenn ich eine basic-HTML-widget nehme wird es viel zu groß. So wie du es darstellst gefällt es mir schon ganz gut.
Ich hab dein Blockly-Skript verwendet und angepasst. Die entsprechenden Daten erhalte ich.
Danke für deine Hilfe
Hallo Ronny, die Größe der Bilder und der Tabelle kannst du über CSS anpassen, genauer gesagt über die Klassen, die die Tabellen haben. Lade dir gerne mal meine Visualisierung für das Fire HD herunter und kopiere dir die entsprechenden Zeilen aus dem CSS-Reiter heraus (table-status). Viele Grüße
wenn ich mir die Visualisierung herunterlade bekomm ich sie nicht angezeigt sondern nur eine Demoview.
Hast du das ZIP importiert und danach den Adapter neu gestartet?
ja hab ich versucht. Es steht dann dort, das irgendeine json nicht existiert??
Kannst du mir die Darstellung irgendwie anders zukommen lassen?
Ich schicke dir das CSS per E-Mail. Viele Grüße
Super und vielen Dank dafür.
Nehme ich trotzdem das HTML-Basic -widget?
Hallo Ronny, bitte nutze das „Basic – String (unescaped)“-Widget und den CSS-Code, den ich dir gesendet habe. Zusätzlich habe ich diesen im Artikel hinterlegt. Grüße
Hallo Max,
ich habe, wie bei dir beschrieben, den Namen des State geändert. Jetzt ist es aufgetreten das wieder alle ihren Ursprünglichen Namen bekommen haben. Woran kann das liegen?
Gruß Ronny
Über was liest du die Fenster ein? DeConz? Homematic?
Über Homematic
Hallo Max,
hast du schon eine eventuelle Lösung gefunden?
Gruß Ronny
Hallo Ronny, bisher konnte ich mich nicht damit beschäftigen. Du kannst aber gerne im ioBroker-Forum oder in der ioBroker-Facebook-Gruppe mal nachfragen. Grüße
Hallo Max,
erst mal Danke für dein Script, mit einer kleinen Anpassung ( [state.id=*STATE] ) überwache ich damit meine Homematic Drehgriffkontakte. Nun ist es halt so, dass auch bei gekippten Fenstern eine Öffnung erfasst wird, das möchte ich aber nicht.
Hast du mir da einen Tipp?
Wenn der Wert „gekippt“ ein anderer ist als „geöffnet“, kannst du eine „falls“-Logikabfrage dazwischen schalten. Grüße
Hallo Max,
vielen lieben Dank für die ausführlichen Erläuterungen und die Unmenge an Zeit, welche Du hier investierst.
Ich habe heute versucht das Ganze mal nachzustellen. Da ich nicht wirklich der Programmierer bin, wollte ich es mir einfach machen und das fertige Blockly Skript importieren (die Variante ohne html).
Leider hatte ich wenig Erfolg, ich denke der Teil des Sortierens ist nicht enthalten, oder? Dann habe ich versucht, diesen zu ergänzen, ging leider nicht.
Dürfte ich dich fragen, ob Du mal das gesamte Blockly Skript einstellen oder per Mail zusenden würdest?
Lieben Dank
Frank
Noch ein Nachtrag zu meiner Anfrage:
Alle Fenster werden bei mir immer in die Liste-offen eingetragen, egal ob offen oder geschlossen. Die Reakation auf das Öffnen der Fenster funktioniert aber gut 🙂 Vielleicht hilft dies auch etwas .
Viele Grüße
Frank
Hallo nochmal,
ich denke nun habe ich es hinbekommen. Bei mir lag es wohl daran, des der Wert für Fenster offen/geschlossen kein true/false Wert ist, sondern ein Textfeld mit OPEN/CLOSED und dieses musste ich berücksichtigen.
Danke
Frank
Hi,
vielen Dank für deine unendlichen Tips!
Bei mir erscheint der Raum nicht unter dem Objekt, sondern direkt dahinter ohne Freizeichen.
Wundert mich auch eigentlich nicht da ja die ersten beiden Objekte der Liste ja auch im Zusammenbau des htmls direkt hintereinander stehen.
Habe ich da was übersehen?
mfg
Thomas
Hallo Thomas, welchen Code hast du denn in der JavaScript-Funktion?
let room = getObject(ObjectID, ‚rooms‘).enumNames[0];
return room;
Mit room.de schmeißt mir das Script keinen Raum raus.
Im Übrigen nutze ich die Sortierfunktion nicht, aber ich denke nicht, dass das etwas ändert.
Ein in der 3. Textzeile löst das Problem, allerdings ist das halt anders, als das, was du gemacht hast. Zudem verstehe ich noch nicht so ganz, wie du die einzelnen Textelemente in den s im html formatierst. Bei mir ist z.B die Schrift überall gleich groß und auch die Sättigung sieht bei dir unterschiedlich aus. Der css code ist eingefügt (auch wenn einige Warnhinweise dabei sind). Aber dort finde ich auch nicht zwingend Klassen, die für die unterschiedlichen Schriftgrößen und Farbe sorgen sollten.
In der dritten Zeile sollte zwischen „Ein“ und „in“ ein br in spitzen Klammern stehen, aber das hat die Bereinigungsfunktion wohl rausgeschmissen.
Also ein Line-Break bringt was.
Hast Du schon Erkenntnisse, warum das bei mir so ist?
Ja, das liegt am CSS. Importiert dir mal mein VIS-Dashboard und teste es mal damit. Viele Grüße
Hallo Max. Tolles Skript – vielen Dank dafür.
Ich habe es mit kleinen Änderungen nachgebaut und es funktioniert prinzipiell sehr gut – bis auf die Tatsache, dass es das erste offene Fenster am Tag nicht „merkt“.
Das erscheint mir unlogisch – hättest du eine Idee, was ich evtl. vergessen haben könnte?
Hi,
leider bekomme ich in Vis nur eine null ausgegeben. Aber das Icon, welches leuchtet sobald etwas geöffnet wird funktioniert hervorragend 😀
Ich weiß nicht mehr weiter 🙁
Habe die Liste hinbekommen. Lag am ID selector meine Fenster Funktion ID hieß window… Hatte ich vergessen zu ändern.
Aber eine andere Frage hätte ich jetzt. Ich habe die Aqara Sensoren im Einsatz und der eine heißt KindFenstersensor. Der State für Open heißt in Broker „KindFenstersensor open“ und leider wird dieser Name mir im Vis ausgegeben. Das Ändern im Objektbaum bringt leider nichts springt immer wieder zurück. Gibts da eine Möglichkeit?
Hallo Claus, prima! Das Namen-Phänomen habe ich auch, vermutlich bzw. hoffentlich wird das in einer der nächsten Adapter-Versionen gefixed. Vg Max
Hallo, auch ich bekomme nur eine NULL angezeigt – und der ID Selektor stimmt – habe auch alles mit „Fenster“ bezeichnet.
Den Datenpunkt am Ende habe ich auch auf 0_userdata.0.Fenster gesetzt.
Bin relativ ratlos.
Danke Frank
Was sagt ein Debug-Block?
Leider nicht viel:
5.1.2022, 12:33:30.491 [info ]: javascript.0 (1228) Stop script script.js.Skript_1
5.1.2022, 12:33:31.224 [info ]: javascript.0 (1228) Start javascript script.js.Skript_1
5.1.2022, 12:33:31.237 [info ]: javascript.0 (1228) script.js.Skript_1: registered 0 subscriptions and 0 schedules
5.1.2022, 12:33:33.902 [info ]: javascript.0 (1228) Stop script script.js.Skript_1
5.1.2022, 12:33:33.904 [info ]: javascript.0 (1228) Start javascript script.js.Skript_1
5.1.2022, 12:33:33.909 [info ]: javascript.0 (1228) script.js.Skript_1: registered 0 subscriptions and 0 schedules
„registered 0 subscriptions and 0 schedules“ heißt, dass der Selektor keine Werte abfragt. Wie schaut der Selektor aus? „registered“ sollte größer als 0 sein, dann werden Datenpunkte überwacht. Wie heißt der Datenpunkt? Ggf mit „open*“ probieren.
Datenpunkt habe ich Fenster benannt und liegt und 0_userdata, hat den Zustand gemischt und die Rolle Liste.
Selektor ist die Funktion Fenster (enum.functions.fenster).
Verbaut habe ich die Sensoren von Aqara und Homematic.
Würde Dir gerne Screenshots senden – aber geht hier leider nicht….
Probier den Selektor mal so „state[id=o*](functions=fenster)“
kommt leider immer noch:
javascript.0 (1228) script.js.Skript_1: registered 0 subscriptions and 0 schedules
Hast du nach dem zuweisen der Functions den JavaScript-Adapter neu gestartet?
Jetzt ja – keine Änderung.
kann es ein Thema sein, das die Aqaras nicht mit open 7 close sonder mit true / false antworten?
@Max – hast Du mir noch einen gute Tipp?
Probier mal mit dem Listen-Block im Zusammenhang mit dem ID-Selektor und dem Debug-Block solange, bis eine Debug-Ausgabe erfolgt.
Guten Morgen,
leider habe ich seit 19.12. eine Error Meldung und die Anzeige klappt nicht mehr. Gab es eventuell ein Update was ich nicht mitbekommen habe? 😀
Ich erhalte folgende Errormeldung im Protokoll:
javascript.0 error at Object. (script.js.common.Allgemein.FensterListe:38:55)
javascript.0 error at Raum (script.js.common.Allgemein.FensterListe:13:46)
javascript.0 error script.js.common.Allgemein.FensterListe: TypeError: Cannot read property ‚de‘ of undefined
Ich habe nichts an den Script oder Datenpunkten geändert 🙁
Probiere es mal hiermit:
let room = getobject (ObjectID,’rooms‘).enumNames[0];
if(typeof room ==’object‘) return „
„+room.de+“„:
return „
„+room+“ „;
Super das hat geholfen!
Habs nur nicht verstanden wieso 😀
Guten Tag,
vielen Dank für das Blockly script! Soweit funktioniert alles, nun möchte ich folgendes realisieren…
Ich möchte mir die Liste mit Telegram abrufen, aber nicht wenn eine Änderung statt gefunden hat, sondern wenn ich es manuell über ein weiteres Telegram Script Menü abrufe.
Wäre klasse, wenn Sie mir dabei helfen können.
Mfg Timur
Hallo!
Ich würde das Script (Blockly) auch gern für mich nutzen. Allerdings habe ich das Problem, dass der Wert nicht true/false sondern OPEN/CLOSED ist. Was muss ich denn da ändern, damit dies funktioniert?
LG
Markus
Es müsste genau so ohne Anpassung funktionieren
Dann mache ich irgendwas falsch 🙁 Mir werden alle Fenster als geöffnet angezeigt und der Raum als undefined
Dann musst du die falls-Abfrage ändern auf „falls Wert von i = open bzw closed“
Hab es jetzt hinbekommen. Juchhu !!! Allerdings klappt das mit der Raumabfrage nicht
ähhh …. ich checks nicht … sorry
Moin, erstmal vielen vielen Dank für die ganze Arbeit, ich habe nach deinen Anleitungen versucht das Script nachzubauen und in VIS-2 darzustellen. Da ich noch relativ neu in der ganzen Thematik IO Broker bin, hat mir das den Einstieg sehr erleichtert.
Jedoch gibt es noch ein Problem. Nach Anpassungen auf meine Homematic IP Fensterkontakte, wird mir im Debug-Modus ein Ergebnis angezeigt. Jedoch funktioniert das erstellen der Liste wie in deiner FIRE-HD VIS nicht. Ich habe es schon mal hinbekommen, dass er mir die Leeren Listen mit den Headern darstellt, aber selbst ging am nächsten Tag ohne das etwas geändert wurde nicht mehr.
Gibt es hier eine Änderung in Bezug auf die VIS1?
Der manuelle DP „Fenster“ soll laut deiner Anleitung die Rolle STATE sein, in einem Kommentar schreibt ein User davon das er LIST gewählt hat? Funktioniert es mit beidem?
Die Zuordnung zu einem Raum hab ich denke ich hinbekommen, nachdem ich das Script gemäß eines Forenbeitrages angepasst hatte. Hast du noch eine Idee?
Moin,
versuche das grade nachzubauen und scheitere an dem Feld Name mit: Object ID
Wie wird dieses Feld erzeugt?
Danke