Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 48.8k Beiträge

NEWS

  • Alle Root-Elemente eines Objektbaumes auslesen

    3
    0 Stimmen
    3 Beiträge
    290 Aufrufe
    W
    @mcu Danke erstmal, da muss aber auf jeden Fall noch rein, dass nicht jeder Rootfolder 100 mal erscheint (für jeden State). let rootFolders = []; $('esphome.0.*').each((id, i) => { const rootId = id.split('.').slice(0, 3).join('.'); if (!rootFolders.includes(rootId)){ rootFolders.push(rootId); } }); console.log(rootFolders); Wie performant das bei großen Objektbäumen ist weiss ich nicht. Ich denke aber dass es da noch elegantere Wege geben müsste.
  • schedules löschen bei Script Neustart

    7
    0 Stimmen
    7 Beiträge
    628 Aufrufe
    S
    Hab ein Enhancement issue erzeugt. Kannst dich ja dran hängen: https://github.com/ioBroker/ioBroker.js-controller/issues/2957
  • PV prognosebasierte Ladung von SMA Bat-WR + Awattar

    10
    2 Stimmen
    10 Beiträge
    2k Aufrufe
    M
    @maverick78 Ich suche nach einer Lösung, mit der ich prognositizeren kann wie voll der Akku an diesem Tag noch wird. Im SMA Adapter finde ich da keinen Datenpunkt. Hier hab ich verstanden, könne dein Script weiterhelfen. Ich habe das JS get_solcast_data_1.2.4.js laufen lassen und es wurden 48 Datenpunkte (vermutlich Stunden?) angelegt. Allerdings bleiben alle mit 0 befüllt. Solcast Credentials sind eingetragen. Brauch es noch etwas? Gibt es eine Möglichkeit noch eine summierte Restprognose für den verbleibenden Tag zu erzeugen, ansonsten baue ich dazu ein Blockly. Gibt es eine Möglichkeit in deinem Script 2 Sites zu summieren? z.B. für die Dachfläche vorne und hinten, die in Solcast ja separat angelegt werden müssen.
  • Skript piHole

    6
    3
    3 Stimmen
    6 Beiträge
    971 Aufrufe
    Ro75R
    @theexpert bei den ersten 4 musst du halt die Daten mit Influx historisieren und dann in Grafana verarbeiten. Das letzte geht über Infinity-Plugin und Simple-API. [image: 1730025477940-2413eba8-dc8c-4bb5-b3c9-695d571b4963-image.png] Ro75.
  • [Telegram] Nachricht bearbeiten

    Ungelöst javascript
    7
    2
    0 Stimmen
    7 Beiträge
    521 Aufrufe
    B
    @mcu das macht tatsächlich keinen Unterschied, aber im absoluten Minimalaufbau von innerhalb desselben Skriptes funktioniert es bei mir auch 🤔 Jetzt ruft zwar das Familienleben, aber so habe ich morgen zumindest einen Anhaltspunkt. Ich werde den Minimalaufbau nach und nach in das Althergebrachte umwandeln und mal schauen, ab welchem Punkt die Funktion aussteigt. Vielen Dank nochmal! Wenn ich eine Ursache ermitteln kann, werde ich sie hier posten.
  • [Vorlage] Alias per Skript erzeugen

    314
    18 Stimmen
    314 Beiträge
    68k Aufrufe
    jmeister79J
    Hi, perfekt genau das was ich suche um jetzt nach fast 5 Jahren ioBroker komplett auf Alias umzusteigen. hab das Script grad mal ausprobiert und es legt den Punkt an so wie ich möchte. Allerdings taucht er dann nicht unter "Geräte" auf. Unter Objects ist er da und wird auch im Lovelace usw erkannt wenn ich n Raum hinzufüge. Wovon Hängt das ab, ob der Alias unter Geräte auftaucht? LG Nils
  • Shelly Verbrauchsdaten direkt aus der Ecoflow Cloud holen

    17
    5
    0 Stimmen
    17 Beiträge
    4k Aufrufe
    B
    @dpleiss Hallo, in meiner ECOFLOW App ist die Serienummer von dem Shelly zu lang. Es wird mir eine Nummer angezeigt und irgendwo mittig wir die Nummer mit Punkten ... aufgefüllt. Wie bekommt man hier jetzt die komplette Seriennummer angezeigt? [image: 1729148611413-img_4150.jpg]
  • Starten eines anderen Script

    3
    0 Stimmen
    3 Beiträge
    406 Aufrufe
    I
    Hi @codierknecht sagte in Starten eines anderen Script: Das aufgerufene Script könnte sich am Ende mit stopScript() selbst beenden. Genau das mache ich ja. Siehe Zeile 4 in "dev3". jedoch müsste ich ja Blockierend warten auf "dev3" und ich suche dafür eine Möglichkeit. @codierknecht sagte in Starten eines anderen Script: Oder Du könntest Dir mit einem Hilfs-DP helfen: Daran hatte auch auch gedacht. Hatte gehofft das es eine bessere Möglichkeit gibt. @codierknecht sagte in Starten eines anderen Script: Aber wozu soll das Ganze gut sein? Das klingt alles sehr nach klassischer prozeduraler Programmierung. Womöglich bist Du da völlig auf dem Holzweg. In diesem Falle ist es auch so (nicht das mit dem Holzweg). Ich würde das an genau zwei Stellen benötigen. Bei meinen _Init Scripten die mir meinem Object Baum erstellen (Wird nur 1 mal aufgerufen wenn neue Hardware z.b. Fenster sensor eingebunden wird). Bei meinen TestScripte ich baue sehr universell einsetzbare Scripte um dieses zu Testen habe ich TestScripte gebaut die Datenpunkte setzten und schauen ob meine Scripte sich richtig verhalten. Diese Rufe ich nur auf wenn ich was in der Programmierung ändere habe und sicher gehen will das alles sich noch so verhält wie gewollt. Um es übersichtliche zu haben sind die Test in einzelnen Dateien Gruppiert. Und da auch die Zeit eine rolle spielt daueren manche Test bis zu 3 Minuten und davon gibt es unterschiedliche viele in den einzelnen Szenarios. Aber ich werde mir dann wohl was mit dem Datenpunkt bauen müssen.
  • Ich kann nichts in Javascript bearbeiten. Was fehlt mir?

    Verschoben
    10
    1
    0 Stimmen
    10 Beiträge
    736 Aufrufe
    crunchipC
    @breyger sagte in Ich kann nichts in Javascript bearbeiten. Was fehlt mir?: taki mam zamiar [image: 1728915274985-1b42b6fb-b664-4714-990f-2ab19ac61bf3-image.png]
  • SSH bzw. simple-ssh ist verschwunden

    5
    0 Stimmen
    5 Beiträge
    230 Aufrufe
    H
    @codierknecht Danke für den Hinweis! Das "Enter drücken" hab ich übersehen! Ich schäme mich über diese Kleinigkeit!
  • [gelöst] Compilerfehler über nicht mehr vorhandene Scripts

    2
    1
    0 Stimmen
    2 Beiträge
    134 Aufrufe
    D
    @delphinis Nach Neustart des Scriptadapters hat sich das Problem gelöst
  • Wechselschaltung in software realisieren -> Endlosscshleife

    15
    0 Stimmen
    15 Beiträge
    878 Aufrufe
    jmeister79J
    @paul53 ja natürlich läuft er seit jahren supersrabil etc. Bis er es dann nicht tut und dann steht man ohne Licht da. Seines ein schiefes Update oder ne kaputte ssd oder n defekter CPU ider ne kaputte Fritzbox oder k kaputter shelly, das system ist einfach zu komplex um sichb100% darauf zu verlassen. Darum ist es bei mir ein nice to have und das haus sollte auch funktionieren wenn der iobroker map husten hat und ich grad im Hansapark sitze. ;-). Ich werf den ZigBee raus und ersetze ihn gegen nen Shelly, nichtsdestoweniger ist auch bei den Shellys sowas möglich. Also sollte ich diesbezüglich entweder diese Möglichkeit ausschließen oder auf diese Schaltung verzichten. Ich hatte nur gedacht, dass ich einfach grad aufm Schlauch stehe, ist ja bei mir öfters der fall ne.
  • [gelöst] Umstellung Proxmox lxc auf vm - Hohe load average

    23
    2
    0 Stimmen
    23 Beiträge
    2k Aufrufe
    BananaJoeB
    @meister-mopper sagte in [gelöst] Umstellung Proxmox lxc auf vm - Hohe load average: uc i3 jupp passt
  • The state contains the forbidden properties notExist!

    16
    0 Stimmen
    16 Beiträge
    841 Aufrufe
    A
    Guten Morgen. Als ich heute Morgen die Sache nochmals getestet habe, musste ich feststellen, dass es doch nicht bei allen Geräten den Namen auslesen kann (weshalb auch immer). Zum Test habe ich jeden Schritt um eine Sekunde verzögert ausführen lassen -> ohne Erfolg. Auch die Verzögerung auf 10 Sekunden zu setzen brachte nicht den gewünschten Effekt. Falls von euch niemand weitere Ideen hat, werde ich das Script wohl so belassen, obwohl ich dies wirklich gerne angezeigt bekommen hätte... :slightly_frowning_face:
  • [gelöst] Werte aus einer JSON-Datei

    Verschoben
    27
    0 Stimmen
    27 Beiträge
    2k Aufrufe
    OliverIOO
    @marcio ok, dann passt es
  • (gelöst) Javascript Fehler

    6
    0 Stimmen
    6 Beiträge
    527 Aufrufe
    ostseereiterO
    Danke an alle kurz und schmerzlos.
  • [gelöst] on Funktion u.Daten Array nimmt immer letzten Wert

    javascript
    14
    0 Stimmen
    14 Beiträge
    1k Aufrufe
    etvE
    Ich hab es!! Hab nun in meinen alten Backups ein Script gefunden, welches ich vor Jahren für das automatische EIN/AUS diverse Geräte in Abhängigkeit von Anwesenheit und Helligkeit draußen geschrieben hab (oder von irgendwo hier im Forum zusammen gebastelt...) und in diesem Script mache ich es "richtig rum"... Anbei nun das gesamte Script falls es noch wer "studieren" möchte. // Kleinverbraucher Logging - V1.0 - 07.10.2024 // Kopie vom ersten Scrit dieser Art, IONIQ5 Logging... // Teil der neuen Logging Scripte - klein, leicht und auf meine Bedürfnisse zugeschnitten // 2do::::::::::::::::::::::::::::::::::::::::: // createState in der History automatisieren... var debug = true; var root = '0_userdata.0.Logging.Kleinverbraucher.'; var was, neuer_Wert, alter_Wert, diff, helper, tag, monat, jahr, wochentag; // WAS soll geloggt werden? const datenpunkt={ 'ScooterCharger':{ id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/ }, 'editPC':{ id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/ } }; // Init fn_init(); // Funktion initialize für die Subscribes function fn_init() {for (was in datenpunkt) {fn_on_Schleifen(was)}}; // Hauptteil function fn_on_Schleifen(was){ on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) { // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers if (compareTime("00:00", "00:01", "between")){ if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')} return; } if (debug){log('========== Update ausgelöst von '+ was +'...')} neuer_Wert = obj.state.val; alter_Wert = getState(root+was+'.internal_counter').val; if (debug){log('========== alter Wert: '+ alter_Wert)} if (debug){log('========== neuer Wert: '+ neuer_Wert)} diff = neuer_Wert - alter_Wert; // ist diff gleuch Null, dann Abbruch... if (diff === 0) { if (debug){log('========== Objekt Update ohne Änderung ... exit!')} return; } // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden // ist es positiv, wird der Wert dazu gezählt if (diff < 0) { if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)} // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen if (neuer_Wert === 0){neuer_Wert = 0.0000000001} setState(root+was+'.internal_counter', neuer_Wert, true); } else { // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen.... if (alter_Wert === 0){ if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')} // nun wird ohne Addition der neue Wert im Counter gespeichert setState(root+was+'.internal_counter', neuer_Wert, true); return; // und Abbruch, weil wir sind fertig...denke ich... } if (debug){log('========== Differenz '+ diff +' wird addiert...')} helper = getState(root+was+'.1-DAY').val; setState(root+was+'.1-DAY', (helper + diff), true); helper = getState(root+was+'.2-WEEK').val; setState(root+was+'.2-WEEK', (helper + diff), true); helper = getState(root+was+'.3-MONTH').val; setState(root+was+'.3-MONTH', (helper + diff), true); helper = getState(root+was+'.4-YEAR').val; setState(root+was+'.4-YEAR', (helper + diff), true); setState(root+was+'.internal_counter', neuer_Wert, true); } }); // Ende on }; // Ende Hauptteil // Tages-/Wochen-/Monats-/Jahreswechsel // läuft jeden Tag um Punkt 00:00:01 clearSchedule(sh_Tageswechel); var sh_Tageswechel = schedule('1 0 0 * * *', fn_Tageswechsel); //fn_Tageswechsel(); function fn_Tageswechsel(){ // erst mal das neue Datum holen UND zwar in eizelnen Variablen tag = formatDate(new Date(), 'TT'); monat = formatDate(new Date(), 'MM'); jahr = parseInt(formatDate(new Date(), 'YYYY')); wochentag = formatDate(new Date(), 'W'); // Start der Schleife für ALLE Datenpunkte in dieser Kategorie for (was in datenpunkt) { log('Schleife START'); // nun check auf die ganzen Wechsel, wobei Jahr vor Monat vor Tag // Check auf JAHRESWECHSEL if ((monat == '01') && (tag == '01')){ jahr = jahr - 1; log('========== JAHRESWECHSEL erkannt: '+datenpunkt[was].id_wert +' =========='); // 1. Jahresverbrauch in HISTORY schreiben setState(root+was+'.HISTORY.'+ jahr, getState(root+was+'.4-YEAR').val, true); // 2. Jahresverbrauch in .BEFORE schreiben setState(root+was+'.4-YEAR.BEFORE', getState(root+was+'.4-YEAR').val, true); setState(root+was+'.4-YEAR', 0, true); } // Ende Jahreswechsel // Check auf MONATSWECHSEL if (tag == '01'){ // if (monat == '01'){jahr = jahr - 1} helper = parseInt(monat); helper = helper - 1; // wir brauchen ja den Vormonat if (helper === 0){helper = 12} if (helper < 10) {monat = '0' + helper.toFixed(0)} else {monat = helper.toFixed(0)} log('========== MONATSWECHSEL erkannt: '+datenpunkt[was].id_wert +' =========='); // 1. Monatsverbrauch in HISTORY schreiben setState(root+was+'.HISTORY.'+ jahr +'.' + monat, getState(root+was+'.3-MONTH').val, true); // 2. Monatsverbrauch in .BEFORE schreiben setState(root+was+'.3-MONTH.BEFORE', getState(root+was+'.3-MONTH').val, true); setState(root+was+'.3-MONTH', 0, true); } // Ende Monatswechsel // Check auf Wochenwechsel if (wochentag == 'Mo'){ log('========== WOCHENWECHSEL erkannt: '+datenpunkt[was].id_wert +' =========='); // 1. Wochenverbrauch in .BEFORE schreiben setState(root+was+'.2-WEEK.BEFORE', getState(root+was+'.2-WEEK').val, true); setState(root+was+'.2-WEEK', 0, true); } // Ende Wochenwechsel // Tageswechsel - der kommt - no na - IMMER dran... setState(root+was+'.1-DAY.BEFORE', getState(root+was+'.1-DAY').val, true); setState(root+was+'.1-DAY', 0, true); } // Ende for-Schleife } // Ende Tages-/Wochen-/Monats-/Jahreswechsel // ENDE Script Im Prinzip das Ersatz Script für den guten alten Betriebsstundenzähler von @looxer01 . Ich hab das Programm geliebt und bis heute in Betrieb, aber es macht mir Sorge, dass immer mehr Fehler im Prorammcode angezeigt werden (rote Wellenlinien) und es irgendwann nicht mehr geht. Viele der Funktionen hab ich in seinem Script nie verwendet - eigentlich hauptsächlich das aufsummieren von Verbräuchen - und so hab ich mir nun das eigene kleine und schlanke Script geschrieben, bevor das alte "absemmelt" 😎 Liebe Grüße Tom PS: @Ro75 : für deine Methode hab ich schon einen Anwendungsfall! Danke für diese Idee...
  • json Object wird unter Objekte nicht richtig angezeigt

    3
    1
    0 Stimmen
    3 Beiträge
    230 Aufrufe
    ofri2607O
    @jok3r würde ich so lösen: const l_tibberlink = "tibberlink.0.Homes.cf930f37-ceea-4c0c-a941-b395fb865fc3.PricesToday."; const l_pvforecast = "pvforecast.0.summary.energy.hoursToday."; const l_Strompreise = "0_userdata.0.Strompreise"; let arr = {}; for (let i = 0; i < 24; i++) { arr[i] = { level: getState(l_tibberlink + i + ".level").val, price: getState(l_tibberlink + i + ".total").val, pvSolcast: (i < 5 || i > 21) ? 0 : getState(l_pvforecast + (i < 10 ? ("0" + i) : i) + ":00:00").val }; } setState(l_Strompreise, JSON.stringify(arr), true); log(JSON.parse(getState(l_Strompreise).val)[18]); //z.b. für Stunde 18
  • Selektor sourceanalytix

    javascript
    4
    0 Stimmen
    4 Beiträge
    296 Aufrufe
    bahnuhrB
    @bananajoe anbei ein kleines Script (für alle die es gebrauchen wollen). var cacheSelectorSA = $('channel[state.id=sourceanalytix.0.*cumulativeReading]'); cacheSelectorSA.each(function (id, i) { id = id.replace(/__/g,"."); id = id.replace(/sourceanalytix.0./g,""); id = id.replace(/.cumulativeReading/g,"") auswahl.push(id); }) Danke @BananaJoe für die Anregung.
  • Script von SQL auf Influx umstellen

    9
    0 Stimmen
    9 Beiträge
    523 Aufrufe
    OliverIOO
    @enrico-hesse im influx adapter readme sind aber beispiele, in der gleichen notation https://github.com/ioBroker/ioBroker.influxdb?tab=readme-ov-file#influx-2x sorry, ich selbst habe aktuell kein influx. hab über sendto früher selbst nicht abgerufen. warum denkst du das das so nicht funktioniert bzw. gibt es eine fehlermeldung?

778

Online

32.6k

Benutzer

82.1k

Themen

1.3m

Beiträge