Weiter zum Inhalt

JavaScript

2.5k Themen 49.6k Beiträge

Hilfe für Skripterstellung mit JavaScript

NEWS

  • [Gelöst] Javascript in vis mit button triggern

    javascript
    16
    0 Stimmen
    16 Beiträge
    1k Aufrufe
    I
    @oliverio @BananaJoe Ok, jetzt klappt es auch mit meinem Button, vielen Dank :-) Musste noch eine Abfrage einbauen, damit die funktion auch nur auf die set-Action reagiert und nicht zweimal: on(DPTestPunkt, async (data) => { if (getState(DPTestPunkt).val) { console.log('button pressed'); setTimeout(function() { setState(DPTestPunkt , false); }, 400); } });
  • Obi Bluetooth Lichterkette in IOBroker integrieren

    4
    1
    0 Stimmen
    4 Beiträge
    698 Aufrufe
    F
    @oliverio node-ble und noble habe ich zuerst versucht, das hat überhaupt nicht funktioniert, darum bin ich dann auf dbus gewechselt und das hätte auch super funktioniert, wenn ich rausgefunden hätte, wie ich die Befehle im richtigen Format sende. :) Die Lichterkette erwartet nämlich strings und das habe ich einfach nicht hinbekommen und meine online suche hat gezeigt, ich bin da nicht der Einzige. :D Irgendwie ist alles was mit bluetooth zu tun hat immer ein absoluter krampf! Ich habe jetzt eine neue Version die 100% zuverlässig ist, falls das jemand gebrauchen kann: (diese benutzt das gatttool) const { exec } = require('child_process'); // MAC-Adresse des Geräts und Handle der GATT-Characteristic const deviceAddress = '24:35:02:27:DE:6E'; const characteristicHandle = '0x0025'; // Pfade zu den Datenpunkten const datapointOnOff = 'javascript.0.MeineVariablen.Lichterkette_OnOff'; const datapointBrightness = 'javascript.0.MeineVariablen.Lichterkette_Helligkeit'; // Warteschlange und Status const actionQueue = []; let isProcessing = false; // Funktion: Shell-Befehl ausführen mit Debugging und Timeout function executeCommand(command, timeout = 10000) { console.log(`Führe aus: ${command}`); return new Promise((resolve, reject) => { const process = exec(command, (error, stdout, stderr) => { if (error) { console.error(`Fehler: ${stderr || error.message}`); return reject(stderr || error.message); } console.log(`Erfolg: ${stdout}`); resolve(stdout.trim()); }); setTimeout(() => { process.kill('SIGTERM'); reject('Befehl abgebrochen (Timeout)'); }, timeout); }); } // Funktion: GATT-Wert schreiben mit Wiederholungslogik async function writeGattValueWithRetries(value, maxRetries = 10, initialDelay = 500) { let attempts = 0; let delay = initialDelay; while (attempts < maxRetries) { try { console.log(`Versuch ${attempts + 1}/${maxRetries}: Sende GATT-Befehl`); await writeGattValue(value); console.log('Befehl erfolgreich gesendet.'); return; // Erfolgreich, keine weiteren Versuche notwendig } catch (error) { attempts++; console.error(`Fehler beim Senden (Versuch ${attempts}):`, error); if (attempts >= maxRetries) { console.error('Maximale Anzahl an Versuchen erreicht. Abbruch.'); throw new Error('GATT-Befehl konnte nach mehreren Versuchen nicht gesendet werden.'); } console.log(`Warte ${delay} ms vor erneutem Versuch...`); await new Promise((resolve) => setTimeout(resolve, delay)); delay *= 2; // Verzögerung verdoppeln } } } // Funktion: GATT-Wert schreiben async function writeGattValue(value) { const command = `gatttool -b ${deviceAddress} --char-write-req --handle=${characteristicHandle} --value="${value}"`; console.log(`Sende GATT-Befehl: ${command}`); try { const output = await executeCommand(command); console.log(`GATT-Befehl erfolgreich: ${output}`); } catch (error) { console.error('Fehler beim Schreiben auf die GATT-Characteristic:', error); throw new Error('GATT-Wert konnte nicht geschrieben werden.'); } } // Funktion: Helligkeit berechnen function calculateBrightnessHex(brightnessPercent) { const brightnessHex = Math.round((brightnessPercent / 100) * 0x64).toString(16).padStart(2, '0'); return `030101${brightnessHex}`; } // Funktion: Lichterkette steuern async function controlLight(action, brightness = null) { try { if (action) { if (brightness !== null) { const brightnessValue = calculateBrightnessHex(brightness); await writeGattValueWithRetries(brightnessValue); } else { const value = action === 'on' ? '01010101' : '01010100'; await writeGattValueWithRetries(value); } } } catch (error) { console.error('Fehler bei der Steuerung der Lichterkette:', error); } } // Funktion: Warteschlange abarbeiten async function processQueue() { if (isProcessing) return; // Verhindert gleichzeitige Verarbeitung isProcessing = true; while (actionQueue.length > 0) { const { action, brightness } = actionQueue.shift(); // Nächsten Befehl aus der Warteschlange holen console.log(`Verarbeite Aktion: ${action}, Helligkeit: ${brightness}`); await controlLight(action, brightness); } isProcessing = false; } // Datenpunkte erstellen, falls nicht vorhanden createState(datapointOnOff, false, { name: 'Lichterkette On/Off', type: 'boolean', role: 'switch', read: true, write: true, def: false }, () => { // Event Listener für Zustandsänderungen registrieren on({ id: datapointOnOff, change: 'ne' }, async (obj) => { const action = obj.state.val ? 'on' : 'off'; actionQueue.push({ action, brightness: null }); processQueue(); }); }); createState(datapointBrightness, 100, { name: 'Lichterkette Helligkeit', type: 'number', role: 'level.dimmer', read: true, write: true, def: 100, min: 0, max: 100 }, () => { // Event Listener für Helligkeitsänderungen registrieren on({ id: datapointBrightness, change: 'ne' }, async (obj) => { const brightness = obj.state.val; if (brightness < 3) { // Wenn Helligkeit unter 3%, Lichterkette ausschalten console.log('Helligkeit unter 3% - Lichterkette wird ausgeschaltet.'); setState(datapointOnOff, false); // Setzt On/Off-Datenpunkt auf false } else { // Ansonsten Helligkeit setzen actionQueue.push({ action: 'on', brightness }); processQueue(); } }); }); // Debugging: Manuelle Steuerung /*(async () => { try { console.log('Teste Steuerung: Einschalten mit 50% Helligkeit...'); actionQueue.push({ action: 'on', brightness: 50 }); processQueue(); console.log('Teste Steuerung: Ausschalten...'); actionQueue.push({ action: 'off', brightness: null }); processQueue(); } catch (error) { console.error('Fehler bei manueller Steuerung:', error); } })(); */
  • [gelöst] Speedtest-Skript liefert falsche Werte

    7
    1
    0 Stimmen
    7 Beiträge
    623 Aufrufe
    SKBS
    @thomas-braun Wenns ja dann an einer defekten SSD liegen könnte, könnte man das Thema ja auf "gelöst" setzen ;)
  • Grohe Sense Guard Intelligente Wassersteuerung in Iobroker einlesen...

    13
    0 Stimmen
    13 Beiträge
    4k Aufrufe
    H
    @e-s Schau ich mir mal an...danke
  • GELÖST Sperriges JSON vom Tasmota Stromzähler Script

    9
    0 Stimmen
    9 Beiträge
    782 Aufrufe
    paul53P
    @martinp sagte: Ist die Abfrage ob das Attribut gefunden wurde in der Funktion "TestVar" so korrekt? Wenn der Wert 0 kein gültiger Wert ist, funktioniert diese Prüfung. Falls der Wert 0 ein gültiger Wert sein kann, prüfe "MyVal != null". [image: 1732534835615-blockly_temp.jpg]
  • Skript für ParcelAPP iOS (Alternative zum Parcel Adapter)

    1
    11
    0 Stimmen
    1 Beiträge
    328 Aufrufe
    Niemand hat geantwortet
  • httpGet funktioniert nach update node.js nicht mehr

    4
    0 Stimmen
    4 Beiträge
    496 Aufrufe
    S
    Zur Info: es scheint kein Problem von httpGet zu sein, wie ich zunächst vermutete, sondern ein Problem der node-sonos-http-api in Verbindung mit Node.js 20. Der Entwickler schrieb mir dazu auf GitHub: I think this is related to this global change in Node 20: nodejs/node#43522 The Sonos players probably doesn't like keep-alive, and might not properly respond with a Connection: close. The http api will maintain connections and try to send new requests over the old socket and probably confusing the player. Since this only affects requests that happen within 30-90 seconds (not sure what the default timeout is), this might appear random. I'll see if I can reproduce it, I haven't run this project under newer Node.js versions in a long time. Hat jemand ähnliche Probleme mit der node-sonos-http-api?
  • Skript für Sonnenwenden, Tagundnachtgleiche und Jahreszeiten

    1
    2
    3 Stimmen
    1 Beiträge
    382 Aufrufe
    Niemand hat geantwortet
  • Cronjobs anzeigen [gelöst]

    20
    0 Stimmen
    20 Beiträge
    2k Aufrufe
    J
    @paul53 Brauche keine Scriptgrenzen überschreiten, sondern nur in einem Script mehrere JS-Script Funktionen. Hab alles erledigt, sitze nun am nächsten Problem, welches noch einmal kniffliger ist. Dazu mache ich einen neuen Thread auf. Danke Dir jedenfalls! Du hast mir wieder sehr weitergeholfen!
  • Modul durch module.exports und require einbinden

    6
    0 Stimmen
    6 Beiträge
    794 Aufrufe
    T
    @franzda Das was paul geschrieben hat und das hier: Da gehts um eigene externe Module, Klassen und TS. https://forum.iobroker.net/post/1078253 Edit: habs selbst nochmal gelesen ist noch immer interessant, was man nicht alles vergisst.
  • Trigger stoppen / löschen

    4
    0 Stimmen
    4 Beiträge
    431 Aufrufe
    T
    @dan78 Mir fällt kaum ein Grund ein warum in einem Trigger einen anderen Trigger aktivieren soll außer halt das was ich dem BWM Skript oben habe: Trigger BWM an -> Trigger auf BMWs werden gesetzt Trigger BWM aus -> alle Trigger auf BWMs werden entfernt. Naja bin das aber gerade am entfernen, weil sich da nach nem Jahr wieder einzulesen ist nervig. Ne Variable ist schneller verstanden.
  • Problem mit "Fenster offen Script"

    71
    1
    0 Stimmen
    71 Beiträge
    4k Aufrufe
    werner2000xW
    @paul53 sorry, habe falsch eingefügt. Jetzt klappt es. :-)
  • Hue Lampe alle Zustände auslesen (und später zurückspielen)

    4
    0 Stimmen
    4 Beiträge
    442 Aufrufe
    Ro75R
    @fenderbender OK, aber für was alles sich merken wollen. Bisherige(n) Wert(e) merken - so viele können es sein - neuen Wert setzen und wenn fertig alte Werte wieder rein. Das sind maximal drei Werte. Ro75
  • VIS Slideshow funktioniert nicht mehr

    6
    1
    0 Stimmen
    6 Beiträge
    497 Aufrufe
    T
    @arteck @Homoran Also, da lag tatsächlich der Fehler... Ihr seit TOP !! Vielen Dank.
  • Hilfe für Javascript nicht Versteher

    6
    0 Stimmen
    6 Beiträge
    652 Aufrufe
    A
    @nape1 Hallo Ich habe das gleiche Problem das das script nicht lauft. Habe es dann hir gelesen mit dem c. Bekommst du mittlerweile Daten aus der WP ich bin zwar verbunden aber so wie Beschrieben mit einzelne Daten bekomme ich nichts laut Bespreibung auf der Wiki Seite. Villeicht kannst mir helfen fals du es hinbekommen hast. mfg Andi
  • Signal über Beendigung eines Skriptes

    javascript
    3
    0 Stimmen
    3 Beiträge
    179 Aufrufe
    2
    @paul53 Genau das habe ich gesucht. Besten Dank!
  • Dieses Thema wurde gelöscht!

    6
    -1 Stimmen
    6 Beiträge
    33 Aufrufe
  • Alle Root-Elemente eines Objektbaumes auslesen

    3
    0 Stimmen
    3 Beiträge
    338 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
    937 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
    3k 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.

400

Online

33.0k

Benutzer

83.3k

Themen

1.3m

Beiträge