Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Topics 48.4k Posts

NEWS

  • Ein Level des Objektbaums auslesen?

    6
    0 Votes
    6 Posts
    435 Views
    paul53P
    @heikow sagte: bewegt ja jede Menge unnötige Daten. Das lässt sich nicht vermeiden, da der Javascript-Adapter zur Suche in der ID-Struktur nur den $Selektor bietet, der Datenpunkte sucht. Das Erstellen des Selektor-Objektes ist die aufwändigste Funktion im Skript. Die Schleife ist dagegen harmlos.
  • Java Script Ressourcen optimal nutzen

    javascript
    15
    0 Votes
    15 Posts
    1k Views
    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
  • (Erledigt) Optimierung Scripte hinsichtlich RAM und CPU

    4
    0 Votes
    4 Posts
    439 Views
    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 Votes
    12 Posts
    803 Views
    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 Votes
    10 Posts
    491 Views
    D
    @paul53 Ist auch ne Idee
  • alles neu mqtt

    8
    1
    0 Votes
    8 Posts
    707 Views
    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 Votes
    3 Posts
    257 Views
    R
    @mcu sagte in getState bringt kein val-Wert: console.error('State-Wert stateObj.val:'+ stateObj); Danke SUPER
  • Datenbank Backup überwachen

    5
    0 Votes
    5 Posts
    347 Views
    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 Votes
    9 Posts
    547 Views
    P
    @paul53 hat funktioniert danke dir vielmals
  • Cronjob am Ende vom Quartal

    16
    0 Votes
    16 Posts
    1k Views
    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 Votes
    3 Posts
    259 Views
    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 Votes
    18 Posts
    1k Views
    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 Votes
    6 Posts
    345 Views
    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 Votes
    1 Posts
    234 Views
    No one has replied
  • [Gelöst] Javascript in vis mit button triggern

    javascript
    16
    0 Votes
    16 Posts
    817 Views
    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 Votes
    4 Posts
    420 Views
    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 Votes
    7 Posts
    479 Views
    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 Votes
    13 Posts
    3k Views
    H
    @e-s Schau ich mir mal an...danke
  • GELÖST Sperriges JSON vom Tasmota Stromzähler Script

    9
    0 Votes
    9 Posts
    570 Views
    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 Votes
    1 Posts
    261 Views
    No one has replied

766

Online

32.5k

Users

81.6k

Topics

1.3m

Posts