Weiter zum Inhalt

JavaScript

2.5k Themen 49.9k Beiträge

Hilfe für Skripterstellung mit JavaScript

NEWS

  • [gelöst] TR-064 Telefonbuch auslesen

    javascript
    18
    0 Stimmen
    18 Beiträge
    3k Aufrufe
    J
    @d3ltoroxp Hi zusammen, sorry, ich lese hier nicht regelmäßig mit. Hier nochmal das aktuelle Script für den JavaScript-Adapter. Wichtig ist, das der TR-064-Adapter installiert ist. Dann sollte direkt über tr-064.0.states.command das GetPhonebookList abgerufen werden: var xml2js = require('xml2js'); /*var vCardsJS = require('vcards-js');*/ var options = { explicitArray: false, mergeAttrs: true }; var xml2jsParser = new xml2js.Parser(options); var phonebook = JSON.parse("[]"); var phonebookVCard = ""; var phonebookListDetail = JSON.parse("[]"); createState('javascript.0.FritzBox.phonebook' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' }, function() { setState ('javascript.0.FritzBox.phonebook', ''); }); createState('javascript.0.FritzBox.phonebookList' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'}, function() { setState ('javascript.0.FritzBox.phonebookList', ''); }); createState('javascript.0.FritzBox.phonebookListDetail' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'}, function() { setState ('javascript.0.FritzBox.phonebookListDetail', ''); }); createState('javascript.0.FritzBox.phonebookSelected' , {'name':'Status', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def':0 }, function() { setState ('javascript.0.FritzBox.phonebookSelected', 0); }); createState('javascript.0.FritzBox.phonebookVCard' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' }, function() { setState ('javascript.0.FritzBox.phonebookVCard', ''); }); on({ id: "javascript.0.FritzBox.phonebookList" } , function (obj) { //console.log(obj.state.val); if (obj.state.val){ JSON.parse(obj.state.val).NewPhonebookList.split(/\s*,\s*/).forEach(function(myString) { setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebook","params": {"NewPhonebookID":'+Number(myString)+'}}'); }); } }); on({ id: "javascript.0.FritzBox.phonebookSelected" } , function (obj) { phonebook = JSON.parse("[]"); phonebookVCard = ""; for (let i = 0; i < 1000; i++) { setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}'); //console.log('{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}'); } //console.log("getPhonebook ID "+obj.state.val+" completed"); }); on({ id: "tr-064.0.states.commandResult" } , function (obj) { var commRes = JSON.parse(getState('tr-064.0.states.commandResult').val); switch (true){ case commRes.hasOwnProperty('NewPhonebookEntryData'): { //console.log(JSON.stringify(commRes)); var res = commRes.NewPhonebookEntryData; xml2jsParser.parseString(res, function (err, result) { let foundIt = phonebook.find(el => el.contact.uniqueid === result.contact.uniqueid); if (foundIt ){ //console.log(foundIt); }else{ phonebook.push(result); /*fill vcard var vCard = vCardsJS(); vCard.firstName = result.contact.person.realName; for (let j=0; j < result.contact.telephony.number.length;j++){ result.contact.telephony.number[j]._ switch (result.contact.telephony.number[j].type){ case 'work': if( vCard.workPhone.length >0 ){ }else{ vCard.workPhone = result.contact.telephony.number[j]._; } break; case 'home': if( vCard.homePhone.length >0 ){ }else{ vCard.homePhone = result.contact.telephony.number[j]._; } break; case 'mobile': if( vCard.cellPhone.length >0 ){ }else{ vCard.cellPhone = result.contact.telephony.number[j]._; } break; } } phonebookVCard += '\n'+vCard.getFormattedString(); setState ('javascript.0.FritzBox.phonebookVCard', JSON.stringify(phonebookVCard)); */ } }); // sort by name phonebook.sort(function(a, b) { var nameA = a.contact.person.realName.toUpperCase(); // ignore upper and lowercase var nameB = b.contact.person.realName.toUpperCase(); // ignore upper and lowercase if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } // names must be equal return 0; }); setState ('javascript.0.FritzBox.phonebook', JSON.stringify(phonebook)); break; } case commRes.hasOwnProperty('NewPhonebookList'): { setState ('javascript.0.FritzBox.phonebookList', JSON.stringify(commRes)); break; } case commRes.hasOwnProperty('NewPhonebookURL'): { commRes.NewPhonebookExtraID=commRes.NewPhonebookURL.substr(commRes.NewPhonebookURL.length-1); phonebookListDetail.push(commRes); setState ('javascript.0.FritzBox.phonebookListDetail', JSON.stringify(phonebookListDetail)); //console.log(JSON.stringify(commRes)); break; } } }); setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookList","params": {}}'); Die Anzeige habe ich auch etwas verändert: <style> body { background-color: #ababab; } table { border: 1px solid black; border-collapse: collapse; } th, td { border: 1px solid black; } </style> <div id="prev2"></div> <div id="prev1"></div> <script> function updateStat (btn){ var objID1 = "javascript.0.FritzBox.phonebookSelected"; this.servConn._socket.emit('setState', objID1, btn.value ); } vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebookListDetail", function (err, state) { let phonebookListDetail =JSON.parse(state.val); var phonebookID = 1; var text =""; for (var i = 0; i < phonebookListDetail.length; i+=1){ text += '<button style="width: 100%; height: 100%; text-align: left;" value=\"'+ phonebookListDetail[i].NewPhonebookExtraID +'\" onclick=updateStat(this)>'+ phonebookListDetail[i].NewPhonebookName +'</button>'; } document.getElementById("prev2").innerHTML = text; }); vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebook", function (err, state) { let phonebook =JSON.parse(state.val); var text =""; text += "<table width=100% style=\"border:1px solid black;border-collapse: collapse;\"><tr><td>Name</td><td>TelNr 1</td><td>TelNr 2</td><td>TelNr 3</td></tr>"; for (let i = 0; i < phonebook.length; i+=1) { text += "<tr>"; text += "<td>"+phonebook[i].contact.person.realName+"</td>"; //text += "</tr><tr><td>&nbsp;</td>"; var j = 0; if (phonebook[i].contact.telephony.number.length){ for (j=0;j < phonebook[i].contact.telephony.number.length;j+=1) { text += "<td>"+phonebook[i].contact.telephony.number[j]._+"</td>"; } }else { text += "<td>"+phonebook[i].contact.telephony.number._+"</td>"; j+=1; } for(j; j<3; j+=1){ text += "<td>&nbsp;</td>"; } text += "</tr>"; } text += "</table>"; document.getElementById("prev1").innerHTML = text; document.getElementById("prev").innerHTML += "<pre>"+ JSON.stringify(phonebook, null, 3) + "</pre>"; }); </script> <!-- <div style="display:none">{javascript.0.FritzBox.phonebook}</div> <div style="display:none">{javascript.0.FritzBox.phonebookListDetail}</div> --> Allerdings habe ich da seit längerem nicht viel weiter gebaut.
  • Verlorene Anzeige von Dateien im JavaScript Adapter

    13
    1
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    AndreiosA
    @herbiek sagte in Verlorene Anzeige von Dateien im JavaScript Adapter: @glasfaser Leider habe ich vergessen, den Text ins Deutsche zu übersetzen, bevor ich meinen Beitrag abschicke. Deepl.com ist mein bester Freund, lesen Deutsch funktioniert gut für mich, aber das Schreiben ist zu schwierig :-) :-) Ik kom uit de grensdriehoek (NL, B, D) en andersom voel ik dat ook zo, lezen is prima, maar spreken en schrijven zijn alleen geschikt om koffie te bestellen!
  • Hilfe bei string Formatierung

    3
    1
    0 Stimmen
    3 Beiträge
    384 Aufrufe
    fischi87F
    @mcu sagte in Hilfe bei string Formatierung: var devicename = name.substr(6, name.length-6); läuft, danke dir für die schnelle Hilfe!
  • [gelöst] Hilfe für Javascript in Blockly

    4
    0 Stimmen
    4 Beiträge
    238 Aufrufe
    Ronny GerndtR
    @kuddel 👍 Kein Problem
  • Notion Integration in ioBroker Javascript

    1
    4
    1 Stimmen
    1 Beiträge
    399 Aufrufe
    Niemand hat geantwortet
  • Somfy Tahoma kein Register "Commands"

    1
    0 Stimmen
    1 Beiträge
    207 Aufrufe
    Niemand hat geantwortet
  • CPU Auslastung des JavaScript Adapters steigt kontinuierlich

    8
    1
    0 Stimmen
    8 Beiträge
    850 Aufrufe
    OliverIOO
    @wildbill hm mir würde da schon was einfallen. du hast einen ein und Ausschalter und nur wenn der an ist, dann willst du auf bestimmte datenpunkte horchen? klar kann man das auch anders lösen, dann müsste man auf jedes Ereignis der betroffenen datenpunkte horchen und prüfen ob der ein und Ausschalter gesetzt ist. wenn da aber sehr viele Ereignisse auftreten ist es ressourcenschonender wenn man den/die trigger erst mit EIN setzt. Wenn man sorgsam ist, dann geht das schon. viele node bibliotheken sind so programmiert bspw siehe beispiel bei https://nodejs.org/api/http.html#httprequesturl-options-callback dort wird async der request eröffnet (1.trigger) und danach hörst du optional auf weitere trigger/events (data,error,end,etc) daher musst du am ende auch noch end aufrufen um das alles wieder aufzuräumen. wie oben schon gesagt, weiß ich nicht wie sich das in blockly auswirkt bzw. wie man in blockly einen trigger wieder deaktiviert bzw. sorge dafür trägt, das man sich die trigger signatur merkt um sie wieder abzustellen.
  • ClearSchedule funktioniert nicht

    4
    0 Stimmen
    4 Beiträge
    285 Aufrufe
    paul53P
    @roland sagte: Hat jemand eine Idee für mich. Es können mit dem Trigger val: true mehrere Scheduler laufen. Ändere den Trigger in change: 'gt'. Besser nur einen Trigger auf Wertänderung verwenden und innerhalb des Callbacks den Wert prüfen: //Vorgarten var TimerVorgarten=null; on('hm-rpc.1.000D1D89A09811.10.STATE'/*Bewaesserung Kanal:1:10 STATE*/, function(obj) { if(obj.state.val) { // Operationen bei true } else { clearSchedule(TimerVorgarten); setStateDelayed('Bewaesserung.LaufzeitVorgarten','00:00',5000); } });
  • Octoprint-script für thumbnail des aktuellen Drucks

    javascript
    100
    2 Stimmen
    100 Beiträge
    15k Aufrufe
    NegaleinN
    @frana120500 sagte in Octoprint-script für thumbnail des aktuellen Drucks: BlocklyPlus das ist schon installiert :) da es voll auf mein System abgestimmt ist ok, kann man nix machen. Muss ich mal die Blocklys von @dslraser durchschaun.
  • JavaScript Adapter npm Modul deinstallieren

    1
    0 Stimmen
    1 Beiträge
    297 Aufrufe
    Niemand hat geantwortet
  • [Gelöst] Externes npm-Modul im Skript einbetten

    3
    0 Stimmen
    3 Beiträge
    254 Aufrufe
    BananaJoeB
    @oliverio danke, hat funktioniert. jetzt muss ich mal schauen wie ich das Modul dewpoint wieder los werden welches ich nachinstalliert hatte
  • Problem mit FormatDate

    2
    0 Stimmen
    2 Beiträge
    158 Aufrufe
    ?
    @wolfgangfb So vielleicht: new Date(SECONDS * 1000).toISOString().substr(11, 8);
  • mal wieder benötige ich Hilfe bei einer Umsetzung :-)

    15
    0 Stimmen
    15 Beiträge
    1k Aufrufe
    paul53P
    @fischi87 sagte: bekomme ich keine Nachricht mehr ?! Es muss auch updateanzahl aktualisiert werden. const id_updateanzahl = "admin.0.info.updatesNumber"/*Number of adapters to update*/; const id_updateadapter = "admin.0.info.updatesList"/*List of adapters to update*/; var updateadapter = getState(id_updateadapter).val function updates() { let updateanzahl = getState(id_updateanzahl).val; if(updateanzahl > 0) { sendTo('telegram.0', { text: '+++ Update Verfügbar +++' + '\n' + '\n' + updateanzahl + " Adapter zum Updaten" + '\n' + updateadapter, reply_markup: { keyboard: [['Update RPI']], resize_keyboard: true, one_time_keyboard: true } }); setState(id_updateanzahl, 0); } } updates(); // Skriptstart on(id_updateadapter, function(dp) { updateadapter = dp.state.val; updates(); });
  • [Script] MessageHandler: Nachrichten protokollieren +VIS

    336
    2
    14 Stimmen
    336 Beiträge
    95k Aufrufe
    Dominik F.D
    @rehmosch Damit ist gemeint, dass du es unter Root rein packst. Aber Vorsicht, da sollte man eigentlich nur Skripte installieren wenn man sich damit auskennt.
  • array [string] = variable

    javascript
    7
    0 Stimmen
    7 Beiträge
    665 Aufrufe
    paul53P
    @malaus sagte: hier mal das bisherige Skript: Ich vermisse die Deklaration der Konstanten pfad, pfad2, border, start, work.
  • Sauberer Shutdown bei Stromausfall

    javascript
    2
    0 Stimmen
    2 Beiträge
    398 Aufrufe
    arteckA
    @langer die qnap kannst du direkt in dessen Einstellungen konfigurieren.. auf der qnap oberfläche
  • Aktuelles Datum größer als eingegebenes Datum

    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    mickymM
    @pat Wenn Du die moments Bibliothek nutzt dann kannst Du mit after und before über einen Boolean einfach prüfen.
  • Alias manuell anlegen

    14
    0 Stimmen
    14 Beiträge
    715 Aufrufe
    D
    @homoran Ich habe es so verstanden dass es grundsätzlich ja kein Problem ist seine DPs unter javascript.0 zu haben. Aber ich wusste jetzt auch nichts was bei 0_userdata.0 Probleme macht ;)
  • [gelöst]Invalide Date

    javascript
    10
    1
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    Great SUNG
    @sigi234 Also, entsprechend Deiner Rückmeldung hatte ich wohl Recht. Ich war so frei und hab es Dir mal einfach gemacht. Der Code sollte copy&paste funktionieren, wenn der von Dir gepastete code bei Dir im Einsatz ist. Ich hab auch entsprechend eine mini Versionsdoku dazu gepackt. Freu mich auf Deine Rückmeldung! /* Versionshistorie: * * 1.0.3: * - neu: Fix für moment locale um mit lokalen source Daten arbeiten zu können * * 1.0.2: * - neu: Anzeige der letzten An- und Abmeldung * - neu: Verwendung eigener Bilder möglich * * 1.0.1: * - neu: In dem Mapping der IP-Adressen kann jetzt eine URL vergeben werden ('http' oder direkt eine spezifische URL) * - geändert: Styling der Details * - entfernt: MAC-Adresse * * 1.0.0: * - Initial Release */ const moment = require("moment"); // Skript Einstellungen ************************************************************************************************************************************************* let dpList = '0_userdata.0.vis.NetzwerkStatus.jsonList'; // Datenpunkt für IconList Widget (Typ: Zeichenkette (String)) let dpSortMode = '0_userdata.0.vis.NetzwerkStatus.sortMode'; // Datenpunkt für Sortieren (Typ: Zeichenkette (String)) let dpFilterMode = '0_userdata.0.vis.NetzwerkStatus.filterMode'; // Datenpunkt für Filter (Typ: Zeichenkette (String)) const checkInterval = 10; // 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 imagePath = '/vis.0/' // Pfad zu den verwendeten Bildern (bitte über den VIS Dateimanager hochladen) // nach Variable imagePath suchen und die entsprechenden Zeilen aus- bzw. einkommentieren // Das Bild (Dateiformat png) in der Mapping-Liste hinterlegen let defaultImage = 'ip-network-outline'; // Standardbild, falls kein Bild angegeben wurde (Material Design Icons) //let defaultImage = `${imagePath}default.png`; // Standardbild, falls kein Bild angegeben wurde (eigenes Bild) let farbeGeraetOnline = 'lime'; // Status Bar Farbe wenn Geräte online ist let farbeGeraetOffline = 'red'; // 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) const deviceNames = [{ ip: "192.168.178.29", alias: "Echo Dot Bad", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.32", alias: "Echo Dot SZ", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.66", alias: "Echo Dot Büro", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.49", alias: "Echo Dot Küche", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.54", alias: "Show 5 WZ", image: "/vis.0/Echo-Show-5.png", link: "http" }, { ip: "192.168.178.1", alias: "Router Büro", image: "/vis.0/fritzbox_6590_left_de_640x400.png", link: "http" }, { ip: "192.168.178.25", alias: "Yamaha AVR WZ", image: "/vis.0/reeiver1.png", link: "http" }, { ip: "192.168.178.24", alias: "Handy Ilse", image: "/vis.0/Galaxy_S6.jpg", link: "http" }, { ip: "192.168.178.47", alias: "Handy Sigi", image: "/vis.0/huawei.png", link: "http" }, { ip: "192.168.178.44", alias: "Echo Flex Vorraum", image: "/vis.0/echo_flex.png", link: "http" }, { ip: "192.168.178.41", alias: "LG TV Wohnzimmer", image: "/vis.0/LG_TV_2.png", link: "http" }, { ip: "192.168.178.40", alias: "Switch Büro", image: "/vis.0/it_network.svg", link: "http" }, { ip: "192.168.178.33", alias: "BroadLink WiFi Device", image: "/vis.0/broadlink-2-545x410.png", link: "http" }, { ip: "192.168.178.52", alias: "Drucker Wlan Büro", image: "/vis.0/mfc9332cdw_main.png", link: "http" }, { ip: "192.168.178.20", alias: "Medion PC Büro", image: "/vis.0/it_pc.svg", link: "http" }, { ip: "192.168.178.22", alias: "Philips Hue Bridge Büro", image: "/vis.0/PHILIPS-51180000-Hue--Bridge--3-Watt.png", link: "http" }, { ip: "192.168.178.28", alias: "Funksteckdose Drucker Büro", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.56", alias: "Stehlampe Blub Esszimmer", image: "/vis.0/Birne.png", link: "http" }, { ip: "192.168.178.30", alias: "Huawei Sigi alt", image: "/vis.0/huawei.png", link: "http" }, { ip: "192.168.178.99", alias: "CCU3 Büro", image: "/vis.0/ccu3-v_1.png", link: "http://192.168.178.99" }, { ip: "192.168.178.36", alias: "Bosch Geschirrspüler Küche", image: "/vis.0/13271013_SPV4HMX61E_STP_def.png", link: "http" }, { ip: "192.168.178.35", alias: "Steckdosenleiste Bad", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.39", alias: "Fire Tv", image: "/vis.0/fire_tv.png", link: "http" }, { ip: "192.168.178.23", alias: "Funksteckdose Medion PC", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.51", alias: "Samsung TV Büro", image: "/vis.0/LG_TV_2.png", link: "http" }, { ip: "192.168.178.26", alias: "Steckdose Meross WZ", image: "/vis.0/Meross.png", link: "http" }, { ip: "192.168.178.37", alias: "Iphone Sarah", image: "/vis.0/iphone 6.jpg", link: "http" }, { ip: "192.168.178.50", alias: "Samsung Tab", image: "/vis.0/Samsung Tab.png", link: "http" }, { ip: "192.168.178.27", alias: "Meross Blub Esszimmer", image: "/vis.0/Birne.png", link: "http" }, ]; //********************************************************************************************************************************************************************** function getLocaleDateTimeFormatString() { var localeDateStr = new Intl.DateTimeFormat(Intl.DateTimeFormat().resolvedOptions().locale).formatToParts().map( function(e) { switch(e.type) { case 'month': return 'MM'; break; case 'day': return 'DD'; break; case 'year': return 'YYYY'; break; default: return e.value; }; } ).join(''); return localeDateStr + ' HH:mm:ss'; } var localeDateFormatStr = getLocaleDateTimeFormatString(); // auf Änderungen aktiver Skripts hören let activeSelector = `[id=tr-064.*.devices.*.active]`; let deviceActiveList = $(activeSelector); if (deviceActiveList.length === 0) { // Fehlermeldung ausgeben, wenn selector kein result liefert console.error(`no result for selector '${activeSelector}'`) } else { // listener nur für Änderung bei alive deviceActiveList.on(netzwerkStatus); } // auf Änderungen der Sortieung hören on({ id: dpSortMode, change: 'any' }, netzwerkStatus); on({ id: dpSortMode, change: 'any' }, resetSort); // // auf Änderungen der Filter hören on({ id: dpFilterMode, change: 'any' }, netzwerkStatus); on({ id: dpFilterMode, change: 'any' }, resetFilter); // Funktion adapterStatus alle x Sekunden ausführen schedule('*/' + checkInterval + ' * * * * *', netzwerkStatus); function netzwerkStatus() { try { let deviceList = []; for (var i = 0; i <= deviceActiveList.length - 1; i++) { let id = deviceActiveList[i].replace('.active', ''); let obj = getObject(id); let pattern = /(?:\d{1,3}\.){3}\d{1,3}/i; let ipAddress = obj.common.name.match(pattern)[0]; let image = defaultImage; let deviceName = obj.common.name.replace(/ \((?:\d{1,3}\.){3}\d{1,3}\)/g, ''); let device = deviceNames.find(element => element.ip == ipAddress); let listType = 'text'; let buttonLink = ''; if(device) { deviceName = device.alias; image = device.image; //image = `${imagePath}${device.image}.png`; if(device.link) { listType = 'buttonLink'; if(device.link == 'http') { buttonLink = `http://${ipAddress}`; } else { buttonLink = device.link; } } } let macAddress = obj.native.mac; let imageColor = 'white'; let statusBarColor = farbeGeraetOffline; let status = 2; if (getState(deviceActiveList[i]).val) { statusBarColor = farbeGeraetOnline; status = 1; } if(listType === 'buttonLink') { deviceName = `<span style="text-decoration: underline">${deviceName}</span>` } let lastSignIn = 'noch nicht angemeldet'; let lastSignOff = 'noch nicht abgemeldet'; // Letzte Anmeldung auslesen if(existsState(id + '.lastActive')) { lastSignIn = 'angemeldet seit: ' + moment(getState(id + '.lastActive').val, localeDateFormatStr).format("DD.MM.YY HH:mm:ss"); } // Letzte Abmeldung auslesen if(existsState(id + '.lastInactive')) { lastSignOff = 'abgemeldet seit: ' + moment(getState(id + '.lastActive').val, localeDateFormatStr).format("DD.MM.YY HH:mm:ss"); } let subText = `<div style="color: green; font-family: RobotoCondensed-BoldItalic">${ipAddress}</div> <div style="color: black; font-family: RobotoCondensed-Regular">${lastSignIn}</div> <div style="color: black; font-family: RobotoCondensed-Regular">${lastSignOff}</div>` deviceList.push({ text: deviceName, subText: subText, statusBarColor: statusBarColor, image: image, imageColor: imageColor, listType: listType, buttonLink: buttonLink, showValueLabel: false, name: deviceName, ipAddress: ipAddress, status: status }); } let sortMode = myHelper().getStateValueIfExist(dpSortMode, 'name'); if (sortMode === 'name' || sortMode === 'ipAddress') { deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } else if (sortMode === 'status') { 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 === 'offline') { deviceList = deviceList.filter(function (item) { return item.status === 2; }); } else if (filterMode === 'online') { deviceList = deviceList.filter(function (item) { return item.status === 1; }); } } let result = JSON.stringify(deviceList); if (getState(dpList).val !== result) { setState(dpList, result, true); } } catch (err) { console.error(`[netzwerkStatus] error: ${err.message}, stack: ${err.stack}`); } } function 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 Adapter Status abrufen netzwerkStatus(); 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; } } } }
  • (Gelöst) Problem bei createState type "folder"

    javascript
    5
    0 Stimmen
    5 Beiträge
    932 Aufrufe
    L
    @paul53 Danke! MfG Wastl

244

Online

33.1k

Benutzende

83.7k

Themen

1.3m

Beiträge