Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Topics 48.9k Posts

NEWS

  • CPU Auslastung des JavaScript Adapters steigt kontinuierlich

    8
    1
    0 Votes
    8 Posts
    707 Views
    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 Votes
    4 Posts
    190 Views
    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 Votes
    100 Posts
    10k Views
    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 Votes
    1 Posts
    251 Views
    No one has replied
  • [Gelöst] Externes npm-Modul im Skript einbetten

    3
    0 Votes
    3 Posts
    198 Views
    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 Votes
    2 Posts
    108 Views
    ?
    @wolfgangfb So vielleicht: new Date(SECONDS * 1000).toISOString().substr(11, 8);
  • mal wieder benötige ich Hilfe bei einer Umsetzung :-)

    15
    0 Votes
    15 Posts
    727 Views
    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 Votes
    336 Posts
    69k Views
    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 Votes
    7 Posts
    454 Views
    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 Votes
    2 Posts
    347 Views
    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 Votes
    8 Posts
    1k Views
    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 Votes
    14 Posts
    495 Views
    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 Votes
    10 Posts
    1k Views
    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 Votes
    5 Posts
    845 Views
    L
    @paul53 Danke! MfG Wastl
  • Alexa's meckern unterbinden (Gerät nicht...)

    3
    0 Votes
    3 Posts
    168 Views
    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 Votes
    9 Posts
    352 Views
    Ben1983B
    @paul53 sagte in getAstro date verschieben: 600000 Danke. TOP
  • InfluxDB-Größe in einen Datenpunkt schreiben (Grep)

    3
    0 Votes
    3 Posts
    295 Views
    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 Votes
    8 Posts
    598 Views
    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 Votes
    3 Posts
    333 Views
    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. :+1:
  • [gelöst] Next Sunrise herausfinden

    1
    1
    0 Votes
    1 Posts
    136 Views
    No one has replied

330

Online

32.6k

Users

82.2k

Topics

1.3m

Posts