Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.1k Beiträge

NEWS

  • Skript zur Visualisierung von Sendungen (Parcel-Adapter)

    55
    6
    2 Stimmen
    55 Beiträge
    7k Aufrufe
    Ro75R
    @matze55 alles was du wissen musst und was gebraucht wird, findest du im ersten Post. Ro75.
  • sento to photo

    5
    0 Stimmen
    5 Beiträge
    442 Aufrufe
    M
    @kellerkind-86 Sehr einfach ist auch die Variante über den Reolink Adapter /*****Bewegung Teich **************************************************** * Mai 2025 * Adapter: Reolink * geä: *************************************************************************/ const idtuer ="hm-rpc.0.LEQ1176852.1.STATE" const idmotion = "reolink.0.sensor.motion" on({ id: idmotion, change: "any" }, function (obj) { if ((obj.state.val == true) && getState(idtuer).val == false) { log("Motion Teich") sendTo("reolink.0", { action: "snap" }, function (result) { const buffer = Buffer.from(result.base64, "base64"); sendTo('telegram.0', { text: buffer, type: "photo", caption: 'Teich' }); }); } });
  • channelName von einem State holen

    6
    0 Stimmen
    6 Beiträge
    441 Aufrufe
    mcm1957M
    @ben1983 nur falls es nicht klar ist Ein state muss sich nicht unterhalb eines devices oder channels befinden.
  • Passwort Schutz javascript

    security
    10
    1 Stimmen
    10 Beiträge
    847 Aufrufe
    mcm1957M
    @peterfido Ja - das kann aber durchaus der Betreuer sein. Es muss nicht der "user" sein. Sollte auch mit fernwartung gehen. Aber das ist m.E. ein anderes Thema. Derzeit ist mir jedenfalls keine Möglichkeit bekannt das Ändern von Scripts / Blocklies zu sperren außer den Zugang zum System (via admin Passwort) zu sperren. Ich galub das beantwortet die urspüngliche Frage.
  • Smartfox Pro XML keine Daten

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    409 Aufrufe
    OliverIOO
    @peterfido ja genau. ich hätte noch dazu schreiben sollen das ich hiermit die TLDs meine. @oliverio sagte in Smartfox Pro XML keine Daten: In Lan haben die meisten Geräte lan oder local Leider erst seit kurzem mit internal standardisiert, aber keine Pflicht https://www.heise.de/news/Ueberfaellig-ICANN-legt-sich-auf-Namen-fuer-interne-Domain-fest-9612253.html
  • Erste Schritte beim Scripten - Einsteigerfrage

    43
    0 Stimmen
    43 Beiträge
    4k Aufrufe
    D
    @doppellhelix Nach langer Sucherei habe ich es gefunden. Ich hatte im Adapter pv.forecast nicht den Haken gesetzt bei: "Werte in W statt kW." :face_palm:
  • regex von "www.esyoil.com"

    28
    1
    0 Stimmen
    28 Beiträge
    2k Aufrufe
    OliverIOO
    @haus-automatisierung Hab ich mir gedacht. Wie gesagt, es verhindert Adapter Updates. Sobald der Adapter maintainer es eingebaut hat ist es dann nicht mehr empfohlen sondern für Nutzer Pflicht um weitere Updates zu erhalten
  • Datentyp eines Boolean Datenpunktes ist String?

    7
    0 Stimmen
    7 Beiträge
    544 Aufrufe
    I
    @paul53 Ja, aber wie ich geschrieben hab, ordnet der wahr/falsch eben 1/0 zu und nicht true/false. Bin gerade am überlegen, ob ich auf vis2 oder webui wechsle. Die Controls in vis fühlen sich ziemlich gebastelt an und sind nicht standardisiert. (jqui-widgets haben alle andere Grössen und Stile, mal kann man jQuery style rausnehmen, mal nicht usw). Aber ich weiss nicht wie aufwendig es ist, meine rund 30 Seiten auf ein anderes gui umzustellen....
  • Skript läuft seit heute nicht mehr

    21
    0 Stimmen
    21 Beiträge
    2k Aufrufe
    M
    // Datenpunkte anlegen (Kann unter Umständen auskommentiert werden, wenn die Datenpunkte manuell angelegt wurden.) createState( trigger_auto, false, {name: 'Datenpunkt zur autmatischen Auslösung'}); createState( trigger_manu, false, {name: 'Datenpunkt zur manuellen Auslösung'}); createState( trigger_more_img, false, {name: 'Datenpunkt zur Abfrage weiterer Bilder'}); createState( disable, false, {name: 'Aktivierung/Deaktivierung des Versands per telegram'}); // Variablendeklaration und Initialisierung bei Scriptstart var stateTrigger_auto = getState(trigger_auto).val; var stateTrigger_manu = getState(trigger_manu).val; var stateTrigger_more_img = getState(trigger_more_img).val; var stateDisable = getState(disable).val; var request = require('request'); var fs = require('fs'); var timer; // Funktionen // ------------------------------------------- // Funktion Bilder versenden function sendImage (pfad) { setTimeout(function() { sendTo('telegram.4', { text: pfad, // reply_markup: { // keyboard: [ // ['Mehr Bilder', 'Danke'] // ], // resize_keyboard: true, // one_time_keyboard: true // } }); log('Webcam Bild per telegram verschickt.'); }, 2000); } // Funktion Bilder speichern function saveImage() { //get({url: cam_img, encoding: 'binary'}, function (err, response, body) { httpGet(cam_img, { responseType: 'arraybuffer' }, async (err, response) => { writeFile(img_path + 'cam1_1.jpg', body, 'binary', function(err) { if (err) { log('Fehler beim Speichern von Bild 1: ' + err, 'warn'); } else { log('Bild 1 gespeichert.'); sendImage(img_path + 'cam1_1.jpg'); } }); }); if (timer) { clearTimeout(timer); timer = null; } timer = setTimeout(function () { //get({url: cam_img, encoding: 'binary'}, function (err, response, body) { httpGet(cam_img, { responseType: 'arraybuffer' }, async (err, response) => { writeFile(img_path + 'cam1_2.jpg', body, 'binary', function(err) { if (err) { log('Fehler beim Speichern von Bild 2: ' + err, 'warn'); } else { log('Bild 2 gespeichert.'); } }); }); }, interval); timer = setTimeout(function () { // get({url: cam_img, encoding: 'binary'}, function (err, response, body) { httpGet(cam_img, { responseType: 'arraybuffer' }, async (err, response) => { writeFile(img_path + 'cam1_3.jpg', body, 'binary', function(err) { if (err) { log('Fehler beim Speichern von Bild 3: ' + err, 'warn'); } else { log('Bild 3 gespeichert.'); } }); }); }, 2 * interval); } // Trigger für die verschiedenen Aktionen // ------------------------------------------- // trigger_auto on(trigger_auto, function(dp) { stateTrigger_auto = dp.newState.val; stateDisable = getState(disable).val; if (stateTrigger_auto === true && stateDisable === false) { saveImage(); // setState(trigger_auto, false); // Option zum Zurücksetzen des Triggers. Standardmäßig auskommentiert, da sich der Bewegungsmelder automatisch zurück setzt. Bei Bedarf "//" am Zeilenafang entfernen. } }); // trigger_more_img on(trigger_more_img, function(dp) { stateTrigger_more_img = dp.newState.val; if (stateTrigger_more_img === true) { sendImage(img_path + 'cam1_2.jpg'); sendImage(img_path + 'cam1_3.jpg'); setState(trigger_more_img, false); } }); // trigger_manu on(trigger_manu, function(dp) { stateTrigger_manu = dp.newState.val; if (stateTrigger_manu === true) { saveImage(); setState(trigger_manu, false); } });
  • Alternative für createState (da deprecated)

    9
    0 Stimmen
    9 Beiträge
    725 Aufrufe
    mcm1957M
    @paul53 said in Alternative für createState (da deprecated): Das sollte wegen Abwärtskompatibilität unterbleiben! Major Releases können und werden immer wieder mal Breaking Changes enthalten. Das ist hier aber nicht wirklich das Thema. Der TE sollte nur mal seine Java Script Version 7 (!) aktualisieten. Dass diese mit js-controller 8 ggF inkompatibel werden könnte (betone könnte, derzeit ist mir das nicht bekannt) ist nicht auszuschliessen.
  • [gelöst/verschwunden] Warnung bei setState eines Alias

    javascript
    9
    0 Stimmen
    9 Beiträge
    718 Aufrufe
    SchmakusS
    Leute, was soll ich sagen….. Problem hat sich in Luft aufgelöst. Keine Ahnung. War von heute auf morgen verschwunden. 🤷‍♂️🤷‍♂️
  • Dateien kopieren mit Fehlerauswertung stdout,stderr,error

    7
    1
    0 Stimmen
    7 Beiträge
    512 Aufrufe
    OliverIOO
    @martinsu Oh Mann. Lese meinen ersten Post nochmal gaaaaanz genau durch. Ganz speziell den Part wo ich das Wort sudo erwähnte. Auch lese die Beschreibung von rsync mal genau durch, Du scheinst die Funktionsweise noch nicht ganz verstanden haben. Woher soll dieser Befehl den nun wissen von wo nach wohin er da was kopieren soll? Auch würde ich ihn nicht mit ssh ausführen. Rsync kann selbst ssh und wendet das beim kopieren auch an, wenn du die richtigen Parameter angibst. Alle Befehle des JavaScript Adapters werden mit dem Benutzer iobroker auf dem lokalen Rechner ausgeführt. Ausprobieren kannst du die shellbefehle wenn du auf der Konsole sudo -u iobroker bash Ausführst. Dann bist du mit der Berechtigung iobroker unterwegs und du kannst rsync oder ssh ausprobieren.
  • Hoymiles WR mit 1600W regeln

    3
    0 Stimmen
    3 Beiträge
    298 Aufrufe
    agreenA
    Da du sowieso OPENDTU verwendest, verwende OpenDTU on Battery. Damit kannst du den Wechselrichter nach aktuellem Strombedarf steuern. https://github.com/hoylabs/OpenDTU-OnBattery
  • Probleme getHistory im History Adapter v3.0.1- Invalid call

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    677 Aufrufe
    G
    @paul53, @Homoran Kurzes Update: async function erstelleUndLoggeTestDatenpunkt() { const testDpId = '0_userdata.0.testVerlaufDp'; // Erstelle den Datenpunkt, falls er noch nicht existiert const existiert = await existsStateAsync(testDpId); if (!existiert) { await createStateAsync(testDpId, 0, { name: 'Test Verlauf Datenpunkt', type: 'number', role: 'state', read: true, write: true, }); log(`Datenpunkt ${testDpId} wurde erstellt.`); } // Protokolliere einige Werte mit Zeitstempeln const jetzt = Date.now(); await setStateAsync(testDpId, { val: 10, ack: false, ts: jetzt - 60000 }); // Protokolliere Wert 10 vor einer Minute await setStateAsync(testDpId, { val: 20, ack: false, ts: jetzt - 30000 }); // Protokolliere Wert 20 vor dreißig Sekunden await setStateAsync(testDpId, { val: 30, ack: true, ts: jetzt }); // Protokolliere Wert 30 jetzt log('Rufe leseTestVerlauf auf...'); // Versuchen wir nun, den Verlauf dieses Datenpunkts abzurufen await leseTestVerlauf(testDpId); } async function leseTestVerlauf(dpId) { log('Testausgabe leseTestVerlauf'); const historyInstanz = 'history.0'; const jetzt = Date.now(); const startZeit = jetzt - 120000; // Lese Verlauf der letzten zwei Minuten const endZeit = jetzt; const optionen = { start: startZeit, end: endZeit, aggregate: 'none', addId: true, returnNewestEntries: false, }; log(`Versuche Verlauf für ${dpId} abzurufen...`); log(`Sende an ${historyInstanz} 'getHistory' mit Optionen (verschachtelt): ${JSON.stringify({ id: dpId, options: optionen })}`); try { const verlaufsDaten = await sendToAsync(historyInstanz, 'getHistory', { id: dpId, options: { ...optionen } }); log(`Verlaufsdaten (raw) für ${dpId}: ${JSON.stringify(verlaufsDaten)}`); if (verlaufsDaten && verlaufsDaten.result) { log(`Verlaufsdaten für ${dpId}: ${JSON.stringify(verlaufsDaten.result)}`); } else { log(`Fehler beim Abrufen der Verlaufsdaten für ${dpId}: ${JSON.stringify(verlaufsDaten)}`, 'warn'); } } catch (e) { log(`Fehler beim Aufruf von getHistory für ${dpId}: ${e}`, 'error'); } } erstelleUndLoggeTestDatenpunkt(); Das Problem mit "Invalid call. No options for getHistory provided" ist gelöst! Der Schlüssel war, die Optionen für getHistory im sendToAsync-Aufruf unter der Eigenschaft options zu verschachteln. Dies funktioniert sowohl mit der direkten Übergabe des optionen-Objekts als auch mit dem Spread-Operator: await sendToAsync(historyInstanz, 'getHistory', { id: dpId, options: optionen }); oder await sendToAsync(historyInstanz, 'getHistory', { id: dpId, options: { ...optionen } }); Der History Adapter erwartet die Optionen in dieser Struktur. Die Abfrage funktioniert nun wie erwartet. Als Nächstes werde ich nun mein ursprüngliches Skript anpassen, um die getHistory-Aufrufe entsprechend zu gestalten. Danke für die Unterstützung!
  • txt2command generelle frage

    2
    0 Stimmen
    2 Beiträge
    220 Aufrufe
    A
    hi! die verarbeitung eigener "txt2command" befehle, geht anscheinend nur der weg über eine "Processor state ID". klappt auch soweit ganz gut, aber die vordefinierten regeln (per gui angelegt), werden nicht mehr verarbeitet. ist das so gedacht? entweder eigene verarbeitung oder interne? ich verstehe den beispielcode für die eigene verarbeitung so, dass im "else" fall, die vordefinierten/internen regeln verarbeitet werden - klappt aber bei mir nicht. hab ich was übersehen? gruß arno createState("textProcessor", '', function () { on({id: "javascript.0.textProcessor", ack: false, change: 'any'}, function (obj) { var task = JSON.parse(obj.state.val); if (task.command === 'switch light on') { // mach was, z.b. setState(...) } else { // let it process with predefined rules setState("javascript.0.textProcessor", '', true); } }); });
  • Verwendung des externen JS-Modules three.js

    6
    0 Stimmen
    6 Beiträge
    550 Aufrufe
    OliverIOO
    @exmatador Sieht gut aus. Fehler beim View Wechsel entstehen wahrscheinlich dadurch, das das javascript weiterläuft, aber die html Elemente wo reingemalt wird, dann nicht mehr ansprechbar sind (weil hidden). Man müsste das pausieren und bei Reaktivierung der View dann wieder einschalten. Hängt aber auch von der genauen Fehlermeldung ab.
  • gelöst-wie writeFile() in js script nutzen

    javascript
    117
    1 Stimmen
    117 Beiträge
    23k Aufrufe
    S
    @michihorn sagte in gelöst-wie writeFile() in js script nutzen: Was ist die Ursache? Ich würde die Bildauflösung mit im Link der Kamera dabei lassen, dann geht es schneller das Bild zu holen.
  • Tibber Pulse: Verbrauchsdaten lokal auslesen

    107
    1 Stimmen
    107 Beiträge
    28k Aufrufe
    Philipp FortenbacherP
    @waly_de leider wird mein Zähler noch nicht von deinem Script unterstützt. Könntest du mir weiterhelfen? Mein Zähler kommt von EBZ Typ DD3 2R06 und hat folgenden HEX dump: 2f45425a35444433325230364454415f3130370d0a312d303a302e302e302a323535283145425a30313032333439363433290d0a312d303a39362e312e302a323535283145425a30313032333439363433290d0a312d303a312e382e302a323535283030383238342e32363830363939382a6b5768290d0a312d303a312e382e312a323535283030333331332e3434312a6b5768290d0a312d303a312e382e322a323535283030343937302e3832362a6b5768290d0a312d303a322e382e302a323535283030303131312e34383334353034382a6b5768290d0a312d303a31362e372e302a323535283030303038352e37322a57290d0a312d303a33362e372e302a323535283030303038352e39312a57290d0a312d303a35362e372e302a323535282d3030303035372e32302a57290d0a312d303a37362e372e302a323535283030303035372e30312a57290d0a312d303a39362e352e302a323535283030314332313034290d0a302d303a39362e382e302a323535283032464245324344290d0a210d0a Vielen Dank dir schon einmal fürs Anschauen.
  • Änderungen aller Datenpunkte in einem Ordner überwachen

    6
    0 Stimmen
    6 Beiträge
    321 Aufrufe
    R
    @homoran MMmmm... muss ich mal drüber nachdenken. Ich könnte im Skript wo ich alle Werte in eine JSON-Tabelle packe noch die letzte Änderung mit aufnehmen, dann habe ich die Datenpunkte identifiziert. Aber ja, ich werde mal über den Schraubenschlüssel bei allen SQL aktivieren.
  • Bei höherer Temperatur und heating-Mermal Teleg. versenden

    6
    1
    0 Stimmen
    6 Beiträge
    435 Aufrufe
    paul53P
    @mitch sagte: ist ein ioBroker Standard? Ja, siehe Doku.

638

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge