NEWS
Material Design und Javaskript
-
Hallo zusammen,
Das ist der Stand der Dinge:

Hier das Java Skript:
const moment = require("moment"); // Skript Einstellungen ************************************************************************************************************************************************* let dpList = '0_userdata.0.vis.Fenster.Status.jsonList'; // Datenpunkt für IconList Widget (Typ: Zeichenkette (String)) let dpSortMode = '0_userdata.0.vis.Fenster.Status.sortMode'; // Datenpunkt für Sortieren (Typ: Zeichenkette (String)) let dpFilterMode = '0_userdata.0.vis.Fenster.Status.filterMode'; // Datenpunkt für Filter (Typ: Zeichenkette (String)) const checkInterval = 30; // Interval wie oft Status der Skripte aktualisiert werden soll (in Sekunden) let sprache = 'de'; // Sprache für formatierung letzte Änderung let formatierungLastChange = "ddd DD.MM - HH:mm"; // Formatierung letzte Änderung -> siehe momentjs library let farbeFensterZu = 'green'; // Status Bar Farbe wenn Geräte online ist let farbeFensterAuf = 'FireBrick'; // Status Bar Farbe wenn Geräte offline ist let sortResetAfter = 120; // Sortierung nach X Sekunden auf sortReset zurücksetzen (0=deaktiviert) let sortReset = 'name' // Sortierung auf die zurückgesetzt werden soll let filterResetAfter = 120; // Filter nach X Sekunden zurücksetzen (0=deaktiviert) // Ein Array welches alle Geräte beinhaltet, unterteilt noch nach Etagen: var all_fenster_items = new Array (); var iconPfad = '/vis-icontwo/Rooms/' // ### Keller #### var fenster = ''; var open = '0_userdata.0.vis.Fenster.Open'; //DP wann wurde das Fenster geöffnet var toBeOpen = '0_userdata.0.vis.Fenster.ToBeOpen'; //DP wielange war das Fenster auf all_fenster_items[0] = new Array(); // ### Erdgeschoss ### fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18592597'; var fenster_eg_schlafzimmer_1 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Schlafzimmer', // [2] Raum 'Schlafzimmer Links', // [3] Kurzname iconPfad + 'bedroom1.png', // [4] VIS-Icon open + '.Schlafzimmer_Schrank', // [5] Geöffnet toBeOpen + '.Schlafzimmer_Schrank', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18592781'; var fenster_eg_schlafzimmer_2 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Schlafzimmer', // [2] Raum 'Schlafzimmer Rechts', // [3] Kurzname iconPfad + 'bedroom1.png', // [4] VIS-Icon open + '.Schlafzimmer_Wand', // [5] Geöffnet toBeOpen + '.Schlafzimmer_Wand', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A1858FA66' var fenster_eg_toilette = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Toilette', // [2] Raum 'Toilette', // [3] Kurzname iconPfad + 'bathroom2.png', // [4] VIS-Icon open + '.Toilette', // [5] Geöffnet toBeOpen + '.Toilette', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18587C9D' var fenster_eg_kueche_1 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Kueche', // [2] Raum 'Küche Rechts', // [3] Kurzname iconPfad + 'kitchen.png', // [4] VIS-Icon open + '.KuecheWand', // [5] Geöffnet toBeOpen + '.KuecheWand', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18597070' var fenster_eg_kueche_2 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Kueche', // [2] Raum 'Küche Links', // [3] Kurzname iconPfad + 'kitchen.png', // [4] VIS-Icon open + '.KuecheKuehlschrank', // [5] Geöffnet toBeOpen + '.KuecheKuehlschrank', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18590405' var fenster_eg_wohnzimmer = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 1, // [1] EtageID 'Wohnzimmer', // [2] Raum 'TV-Wand', // [3] Kurzname iconPfad + 'livingroom.png', // [4] VIS-Icon open + '.Wohnzimmer', // [5] Geöffnet toBeOpen + '.Wohnzimmer', // [6] wielange auf 'Erdgeschoss' // [7] Etage Text ]; all_fenster_items[1] = new Array( fenster_eg_schlafzimmer_1, fenster_eg_schlafzimmer_2, fenster_eg_toilette, fenster_eg_kueche_1, fenster_eg_kueche_2, fenster_eg_wohnzimmer ); // ### Obergeschoss ### fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A185924F2' var fenster_og_bad = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 2, // [1] EtageID 'Bad', // [2] Raum 'Bad', // [3] Kurzname iconPfad + 'bathroom3.png', // [4] VIS-Icon open + '.Bad', // [5] Geöffnet toBeOpen + '.Bad', // [6] wielange auf 'Obergeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A185904C8' var fenster_og_buero_1 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 2, // [1] EtageID 'Buero', // [2] Raum 'Büro Strasse', // [3] Kurzname iconPfad + 'office.png', // [4] VIS-Icon open + '.BueroStrasse', // [5] Geöffnet toBeOpen + '.BueroStrasse', // [6] wielange auf 'Obergeschoss' // [7] Etage Text ]; fenster = 'bshb.0.hdm:HomeMaticIP:3014F711A000009A1859254A' var fenster_og_buero_2 = [ fenster + '.ShutterContact.value', // [0] Geraete-ID 2, // [1] EtageID 'Buero', // [2] Raum 'Büro Haustuer', // [3] Kurzname iconPfad + 'office.png', // [4] VIS-Icon open + '.BueroHaustuer', // [5] Geöffnet toBeOpen + '.BueroHaustuer', // [6] wielange auf 'Obergeschoss' // [7] Etage Text ]; all_fenster_items[2] = new Array( fenster_og_bad, fenster_og_buero_1, fenster_og_buero_2 ); // ********************************************************************************************************************************************************************** // Fomate für moment Lib moment.locale(sprache); // auf Änderungen der Sortieung hören on({ id: dpSortMode, change: 'any' }, fensterStatus); on({ id: dpSortMode, change: 'any' }, resetSort); // // auf Änderungen der Filter hören on({ id: dpFilterMode, change: 'any' }, fensterStatus); on({ id: dpFilterMode, change: 'any' }, resetFilter); // Funktion adapterStatus alle x Sekunden ausführen //schedule('*/' + checkInterval + ' * * * * *', fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A185904C8.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18592597.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18592781.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A1858FA66.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18587C9D.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18597070.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A18590405.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A185924F2.ShutterContact.value', change: 'any' }, fensterStatus); on({id: 'bshb.0.hdm:HomeMaticIP:3014F711A000009A1859254A.ShutterContact.value', change: 'any' }, fensterStatus); function fensterStatus() { try { let deviceList = []; for (var i = 0; i <= all_fenster_items.length - 1; i++) { var etageArray = all_fenster_items[i]; etageArray.forEach(function(element) { let buttonLink = ''; let temp = element[5]; //let open = getState(temp).val; let open = formatDate(getState(temp).val, "DD-MM-YYYY hh-mm"); temp = element[6]; let toBeOpen = getState(temp).val; let image = element[4]; let listType = 'text'; let imageColor = 'black'; let statusBarColor = farbeFensterZu; let status = 1; if (getState(element[0]).val === 'OPEN') { statusBarColor = farbeFensterAuf; status = 2; }; let subText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;"> <div style="flex: 1;">Etage:</div> <div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${element[7]}</div> </div> <div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;"> <div style="flex: 1;">Raum:</div> <div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${element[2]}</div> </div> <div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;"> <div style="flex: 1;">Geöffnet am:</div> <div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${open}</div> </div> <div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;"> <div style="flex: 1;">Dauer:</div> <div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${toBeOpen}</div> </div>` deviceList.push({ text: element[3], subText: subText, statusBarColor: statusBarColor, deviceName: element[0], image: image, imageColor: imageColor, listType: listType, buttonLink: buttonLink, showValueLabel: false, name: element[3], etageid: element[1], etage: element[7], status: status, raum: element[2] }); }); }; let sortMode = myHelper().getStateValueIfExist(dpSortMode, 'name'); if (sortMode === 'name') { deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } else if (sortMode === 'etageid') { deviceList.sort(function (a, b) { return a[sortMode] == b[sortMode] ? 0 : +(a[sortMode] < b[sortMode]) || -1; }); } else { // default: nach name sortieren sortMode = 'name' deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); }; let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterMode && filterMode !== null && filterMode !== '') { if (filterMode === 'auf') { deviceList = deviceList.filter(function (item) { return item.status === 2; }); } else if (filterMode === 'zu') { deviceList = deviceList.filter(function (item) { return item.status === 1; }); } } let result = JSON.stringify(deviceList); if (getState(dpList) !== result) { setState(dpList, result, true); } } catch (err) { console.error(`[FensterStatus] error: ${err.message}, stack: ${err.stack}`); } } function resetSort() { log("bin in resetsort"); let sortMode = myHelper().getStateValueIfExist(dpSortMode, null); if (sortResetAfter > 0) { setTimeout(function () { if (sortMode !== null && sortMode === myHelper().getStateValueIfExist(dpSortMode, null)) { setState(dpSortMode, sortReset); }; }, sortResetAfter * 1000); } } function resetFilter() { let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterResetAfter > 0) { setTimeout(function () { if (filterMode !== null && filterMode === myHelper().getStateValueIfExist(dpFilterMode, null)) { setState(dpFilterMode, ''); }; }, filterResetAfter * 1000); } } // Beim Staren des Skriptes Geraete Status abrufen fensterStatus(); function myHelper() { return { getStateValueIfExist: function (id, nullValue = undefined, prepand = '', append = '') { if (existsState(id)) { return prepand + getState(id).val + append; } else { return nullValue; } }, getCommonPropertyIfExist: function (object, prop, nullValue = undefined, prepand = '', append = '') { if (myHelper().checkCommonPropertyExist(object, prop)) { return prepand + object.common[prop] + append; } else { return nullValue; } }, checkCommonPropertyExist: function (object, prop) { if (object && object.common && object.common[prop]) { return true; } else { return false; } } } }Filtern nach ist OK.
Sortieren nach
1 Fenster OK
2 Etage mein ProblemEs wird nach Etagen sortiert (siehe Bild) aber ich möchte es so haben:
Keller Keller Keller
Erdgeschoss Erdgeschoss Erdgeschoss Erdgeschoss Erdgeschoss Erdgeschoss
Erdgeschoss
Obergeschoss Obergeschoss Obergeschoss Obergeschoss Obergeschoss Obergeschoss
Dachgeschoss DachgeschossDafür habe ich "EtageID" in die Struktur aufgenommen, wonach bei Auswahl "Sortiert nach ETAGE" sortiert werden sollte
und wie oben dargestellt ausgegeben werden sollte.Wie sieht die Sortieranweisung aus?
Ich hoffe mich einiger Massen verständlich ausgedrückt zu haben, ansonsten ich bin ein absoluter Java Skript-Neuling.
Das Skript habe ich aus mehreren Teilen, die hier im Forum gezeigten wurden, zusammen gebaut.
Auch für Vorschläge wie das Skript besser werden kann, bitte ich um Hilfe.Danke für Eure Hilfe
MfG
Wastl
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden