Weiter zum Inhalt

JavaScript

2.5k Themen 49.2k Beiträge

Hilfe für Skripterstellung mit JavaScript

NEWS

  • JavaScript Adapter npm Modul deinstallieren

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

    3
    0 Stimmen
    3 Beiträge
    200 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
    108 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
    792 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
    72k 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
    527 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
    356 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
    1k 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
    513 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
    1k 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
    881 Aufrufe
    L
    @paul53 Danke! MfG Wastl
  • Alexa's meckern unterbinden (Gerät nicht...)

    3
    0 Stimmen
    3 Beiträge
    171 Aufrufe
    D3ltoroxpD
    @dr-bakterius Gut mit den Routinen ist halt dann schon recht aufwendig, vor allem am Tablet, wenn man die am PC schreiben könnte wärs noch mal was anderes. NodeRed fällt raus, das hatte ich bis jetzt aber da stimmt irgendwas mit den Alexa Servern nicht. Ich habe 140 + Geräte, eigentlich aber nur 30-40. Ich habe viele doppelt und dreifach, alte Geräte die ich gar nicht mehr habe, alle in der Liste. Dann geht das gespinne ja auch wieder los. Ich habe mehr als ein Gerät..., usw. Daher den Weg den ich gerade versuche. Die Info mit NodeRed ergänze ich mal oben.
  • getAstro date verschieben

    9
    0 Stimmen
    9 Beiträge
    371 Aufrufe
    Ben1983B
    @paul53 sagte in getAstro date verschieben: 600000 Danke. TOP
  • InfluxDB-Größe in einen Datenpunkt schreiben (Grep)

    3
    0 Stimmen
    3 Beiträge
    313 Aufrufe
    E
    @glasfaser Danke das wars!! parseFloat(result) So einfach kann es sein ... aber ich denke soooo kompliziert ;)
  • error: javascript.0 (1178) at Object.<anonymous>

    8
    0 Stimmen
    8 Beiträge
    612 Aufrufe
    Great SUNG
    @wolfgangfb Die methode hat keine Umwandlung zu String und offensichtlich keine saubere Fehlerbehandlung. In eine Datei kannst Du nur Streams schreiben, die normalerweise aus Byte-Arrays generiert werden, deren Grundlage ein String ist. Was Du versuchst zu schreiben ist ein numeric/float/integer, das hat zunächst keine direkte Umwandlungsmöglichkeit in einen Stream / Byte-Array, daher gibt es einen Fehler. Wenn Du es vorher in einen String umwandelst, ist alles grün. Es gibt einige Entwickler, die da Fehler werfen, aber die Umwandlung trotzdem machen, andere implementieren eine Prüfung und brechen dann mit einem sauberen Fehler ab. Hier scheint weder noch der Fall zu sein.
  • Skript zur Bewässerung

    3
    0 Stimmen
    3 Beiträge
    341 Aufrufe
    S
    @paul53 Genial! Genau damit war es lösbar. Vielen Dank für den Input, das war mir nicht bewusst, dass man es in dieser Form realisieren muss.
  • [gelöst] Next Sunrise herausfinden

    1
    1
    0 Stimmen
    1 Beiträge
    138 Aufrufe
    Niemand hat geantwortet
  • setTimeout und Skript-Neustart

    7
    0 Stimmen
    7 Beiträge
    462 Aufrufe
    AlCalzoneA
    @antimon Das ist eine Funktion, die im Skript-Kontext global verfügbar ist.
  • trigger mit regex mit variablen

    javascript
    21
    0 Stimmen
    21 Beiträge
    857 Aufrufe
    Damrak2022D
    @oli Hallo Oliver, ich nutze lediglich die Schlafmatte von Withings. Andere Withings Produkte gibt es bei mir momentan nicht.
  • [gelöst]Problem mit cacheSelectorState

    7
    3
    0 Stimmen
    7 Beiträge
    656 Aufrufe
    paul53P
    @khg sagte älteres Backup von der CCU3 eingespielt habe, funktioniert es wieder. Die von mir gezeigte Version funktioniert unabhängig vom Datenpunktnamen.

521

Online

32.8k

Benutzer

82.7k

Themen

1.3m

Beiträge