Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 48.8k Beiträge

NEWS

  • [gelöst] Typkonvertierung in Typescript

    6
    0 Stimmen
    6 Beiträge
    385 Aufrufe
    T
    @iob69 https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#best-practice
  • Statistics Daten auf einen anderen Datenpunkt übertragen

    1
    0 Stimmen
    1 Beiträge
    234 Aufrufe
    Niemand hat geantwortet
  • [Gelöst] Javascript in vis mit button triggern

    javascript
    16
    0 Stimmen
    16 Beiträge
    935 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
    458 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
    537 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
    3k 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
    623 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
    274 Aufrufe
    Niemand hat geantwortet
  • httpGet funktioniert nach update node.js nicht mehr

    4
    0 Stimmen
    4 Beiträge
    424 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
    309 Aufrufe
    Niemand hat geantwortet
  • Cronjobs anzeigen [gelöst]

    20
    0 Stimmen
    20 Beiträge
    1k 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
    642 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.
  • Plötzlich ReferenceError: request is not defined

    75
    1
    0 Stimmen
    75 Beiträge
    12k Aufrufe
    K
    @root_ Ich benutzte das Script, um mir von tibber den SOC meines Polestar 2 abzurufen. Mittlerweile gibt es eine direkte API, mit der ich über HA und evcc darauf zugreife. Deshalb muss ich den Umweg über tibber nicht mehr gehen. Hatte eh das Problem, dass wenn die Kommunikation zwischen den tibber- und Polestar-Apps auf meinem Handy nicht klappt, ich keine Daten in evcc hatte. Das ist jetzt auch Vergangenheit.
  • Trigger stoppen / löschen

    4
    0 Stimmen
    4 Beiträge
    364 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
    354 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
    389 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
    499 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
    155 Aufrufe
    2
    @paul53 Genau das habe ich gesucht. Besten Dank!
  • Dieses Thema wurde gelöscht!

    6
    -1 Stimmen
    6 Beiträge
    33 Aufrufe

527

Online

32.6k

Benutzer

82.1k

Themen

1.3m

Beiträge