Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.1k Beiträge

NEWS

  • (Erledigt) Optimierung Scripte hinsichtlich RAM und CPU

    4
    0 Stimmen
    4 Beiträge
    524 Aufrufe
    U
    zu 1. Habe für mich mal eine funktionierende Lösung in einem neuen Post aufgeschrieben: https://forum.iobroker.net/topic/78632/info-auslagerung-von-scripte-aus-global-aufs-filesystem
  • Script in mehrere Scripts aufteilen, ein Object pro Script

    12
    0 Stimmen
    12 Beiträge
    960 Aufrufe
    U
    Habe für mich mal eine funktionierende Lösung in einem neuen Post aufgeschrieben: https://forum.iobroker.net/topic/78632/info-auslagerung-von-scripte-aus-global-aufs-filesystem
  • Zeitformat von Zuhause

    10
    0 Stimmen
    10 Beiträge
    565 Aufrufe
    D
    @paul53 Ist auch ne Idee
  • alles neu mqtt

    8
    1
    0 Stimmen
    8 Beiträge
    847 Aufrufe
    Fred FreundF
    @mickym said in alles neu mqtt: @fred-freund Du kannst den Flow auch im Standalone modus verwenden - nur musst Du halt das root topic - dass nun auf 0_userdata.0 eingestellt ist - auf Deine Bedürfnisse ändern. Entweder in dem Du im Nachhinein das Topic änderst oder direkt im Subflow. https://forum.iobroker.net/topic/43856/json-oder-javascript-objekt-in-iobroker-datenpunkte-zerlegen Falls Du also in einer Standalone Lösung - statt im iobroker das zerlegen willst musst Du nur das topic ändern, dann geht das auch mit mqtt Nodes. Im Subflow selbst geht es ganz hinten in der Finalisierung des topics. [image: 1734087153449-09f31df6-851d-43f3-85ac-a8591a58695f-image.png] Falls Du noch Hilfe zu dem Subflow brauchst, melde Dich halt - ich habe allerdings auch noch in der Node eine ziemlich ausführliche Hilfe geschrieben. Vielen Dank fuer Deine Hilfe.
  • getState bringt kein val-Wert

    3
    0 Stimmen
    3 Beiträge
    305 Aufrufe
    R
    @mcu sagte in getState bringt kein val-Wert: console.error('State-Wert stateObj.val:'+ stateObj); Danke SUPER
  • Datenbank Backup überwachen

    5
    0 Stimmen
    5 Beiträge
    398 Aufrufe
    O
    @arteck , vielen Dank. Klappt so, wie ich mir das vorgestellt hatte. Du hattest aber einen kleinen Typo in Zeile 14. Für die Nachwelt: So klapp das Überprüfen, ob der Ordner mit dem aktuellen Datum für das Backup angelegt wurde. In den Datenpunkt "0_userdata.0.Backup.DB-Backup-Status" wird bei Erfolg eine "1" und bei Misserfolg eine "2" geschrieben, die dann von einem iobroker Script ausgewertet werden kann. # Script zum automatischen Sichern der Influx Datenbank #!/bin/bash # Backup Pfad und Datum path="/Backup/influx" datum=$(date +"%y-%m-%d") # Alte Backups löschen find $path -maxdepth 1 -mtime +35 -type d -exec rm -rf {} ';' # Neues Backup anlegen influxd backup -db iobroker $path/$datum #check ob ok VERIFY_OUTPUT=$(influx_inspect verify -dir $path/$datum) if echo "$VERIFY_OUTPUT" | grep -q "Broken Blocks: 0"; then wget 'http://192.168.178.40:8087/set/0_userdata.0.Backup.DB-Backup-Status?value=1' else wget 'http://192.168.178.40:8087/set/0_userdata.0.Backup.DB-Backup-Status?value=2' fi Gruß
  • Script schaltet aber shelly nicht

    9
    0 Stimmen
    9 Beiträge
    642 Aufrufe
    P
    @paul53 hat funktioniert danke dir vielmals
  • Cronjob am Ende vom Quartal

    16
    0 Stimmen
    16 Beiträge
    1k Aufrufe
    metaxaM
    @codierknecht sagte in Cronjob am Ende vom Quartal: dieser "nächste Tag" zufälligerweise der 1. ist. Ist das so, befindet man sich aktuell (23:30 Uhr) am letzten des Monat [image: 1733689370212-6d5de3cc-da24-43eb-80d3-e059af49037d-image.png] [image: 1733689451632-d13cfd60-6770-43fc-98a5-977c82445cb1-image.png] @Codierknecht & @paul53 Lieben Dank, verstanden!! 'SmilyMitVikiBeimGeistesblitz'
  • Gelöst: Scriptumbau mit HttpGet...schon wieder

    javascript
    3
    0 Stimmen
    3 Beiträge
    265 Aufrufe
    M
    @paul53 Das ist ein Relikt aus dem HTTP Request und dem alten Adapter, sollte wohl jetzt "response.data" heissen, oder? Die Kurzform sieht jetzt so aus und klappt. const idKlingel = "ring.0.doorbell_90474299.Events.doorbell" on({ id: idKlingel, change: "any" }, function (obj) { if (obj.state.val == true) { httpGet('http://192.168.178.xx/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=wuuPhkmUCeI9WG7C&user=admin&password=rxxxxx', { responseType: 'arraybuffer' }, async (err, response) => { if (!err) { writeFile('vis.0', '/klingelbild/Klingel.jpg', response.data, (err) => { if (err) { console.error(err); } }); } else { console.error(err); } }); } });
  • Scriptoptimierung Solarprognose

    18
    1
    0 Stimmen
    18 Beiträge
    1k Aufrufe
    icebearI
    @arteck said in Scriptoptimierung Solarprognose: poste mal den JSON aus dem Hauptordner {"1733468400":[0,0],"1733472000":[0.144,0.144],"1733475600":[0.443,0.587],"1733479200":[0.668,1.255],"1733482800":[0.702,1.957],"1733486400":[0.753,2.71],"1733490000":[0.63,3.34],"1733493600":[0.56,3.9],"1733497200":[0,3.9],"1733551200":[0,0],"1733554800":[0.144,0.144],"1733558400":[0.21,0.354],"1733562000":[0.443,0.797],"1733565600":[0.614,1.411],"1733569200":[1.962,3.373],"1733572800":[1.775,5.148],"1733576400":[0.951,6.099],"1733580000":[1.068,7.167],"1733583600":[0,7.167],"1733637600":[0,0],"1733641200":[0.048,0.048],"1733644800":[0.157,0.205],"1733648400":[0.506,0.711],"1733652000":[3.037,3.748],"1733655600":[3.281,7.029],"1733659200":[2.798,9.827],"1733662800":[2.275,12.102],"1733666400":[1.092,13.194],"1733670000":[0,13.194],"1733727600":[0,0],"1733731200":[0.144,0.144],"1733734800":[0.443,0.587],"1733738400":[0.641,1.228],"1733742000":[0.761,1.989],"1733745600":[0.78,2.769],"1733749200":[0.65,3.419],"1733752800":[0.421,3.84],"1733756400":[0,3.84],"1733814000":[0,0],"1733817600":[0.144,0.144],"1733821200":[0.443,0.587],"1733824800":[0.614,1.201],"1733828400":[0.702,1.903],"1733832000":[0.699,2.602],"1733835600":[0.59,3.192],"1733839200":[0.396,3.588],"1733842800":[0,3.588]}
  • [gelöst] Typkonvertierung in Typescript

    6
    0 Stimmen
    6 Beiträge
    418 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
    241 Aufrufe
    Niemand hat geantwortet
  • [Gelöst] Javascript in vis mit button triggern

    javascript
    16
    0 Stimmen
    16 Beiträge
    999 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
    486 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
    546 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
    679 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
    293 Aufrufe
    Niemand hat geantwortet
  • httpGet funktioniert nach update node.js nicht mehr

    4
    0 Stimmen
    4 Beiträge
    450 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
    342 Aufrufe
    Niemand hat geantwortet

614

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge