Weiter zum Inhalt

Skripten / Logik

16.6k Themen 214.5k Beiträge

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 49k
    3k Themen
    49k Beiträge
    O
    Da ich tandoor nutze und Bring als Einkaufslistenapp (wird auch mit Alexa synchronisiert), hab ich mir ein Script erstellt, welches mit die Tandoor items ins Bring holt - ggf. kann das ja noch jemand gebrauchen: // --- KONFIGURATION --- const tandoorUrl = 'tandoorURL'; const apiToken = 'tandoorAPI-KEY'; const bringListState = 'bring.XXX.saveItem'; // --- Ab hier keine Konfig mehr --- const axios = require('axios'); const syncInterval = 5; // Alle 5 Minuten // --- HAUPTFUNKTION --- async function syncTandoorToBring() { console.log('Tandoor-Sync: Starte Synchronisierung (Bearer-Mode)...'); try { const response = await axios({ method: 'get', url: `${tandoorUrl}/api/shopping-list-entry/`, headers: { 'Authorization': `Bearer ${apiToken}`, 'Accept': 'application/json' }, timeout: 10000 }); // Tandoor liefert Liste oft in .results let data = Array.isArray(response.data) ? response.data : (response.data.results || []); // Nur nicht-erledigte Items filtern const openEntries = data.filter(entry => !entry.completed); if (openEntries.length === 0) { console.log('Tandoor: Keine neuen Einkaufslisten-Einträge gefunden.'); return; } for (const entry of openEntries) { // Logik-Update: Wir prüfen alle Namensfelder von Tandoor let name = ""; if (entry.food_display) { name = entry.food_display; } else if (entry.description) { name = entry.description; } else if (entry.food && entry.food.name) { name = entry.food.name; } else { name = "Unbekannte Zutat"; } let amount = (entry.amount && entry.amount !== 0) ? entry.amount : ""; let unit = entry.unit_display || ""; // Sauber zusammenfügen und unnötige Leerzeichen entfernen let itemName = `${amount} ${unit} ${name}`.replace(/\s+/g, ' ').trim(); console.log(`Tandoor-Sync: Übertrage "${itemName}" zu Bring!`); // 1. In Bring-Adapter schreiben await setStateAsync(bringListState, itemName); // 2. In Tandoor als erledigt markieren await markAsCompleted(entry.id); } console.log('Tandoor-Sync: Synchronisierung abgeschlossen.'); } catch (error) { if (error.response) { console.error(`Tandoor-Sync Fehler (${error.response.status}): ${JSON.stringify(error.response.data)}`); } else { console.error('Tandoor-Sync Netzwerkfehler: ' + error.message); } } } // --- HILFSFUNKTION: ABHAKEN --- async function markAsCompleted(entryId) { try { await axios({ method: 'patch', url: `${tandoorUrl}/api/shopping-list-entry/${entryId}/`, headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' }, data: { completed: true } }); console.log(`Tandoor-Sync: Item ${entryId} in Tandoor abgehakt.`); } catch (error) { console.error(`Tandoor-Sync Update Fehler für ID ${entryId}: ${error.message}`); } } // --- ZEITSTEUERUNG --- schedule(`*/${syncInterval} * * * *`, syncTandoorToBring); // Sofort-Start beim Speichern syncTandoorToBring();```
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    M
    Gestern war bei VolMax 3,54V Ladeende 100%, das Entladen stoppt halt dann doch relativ bald wenn ich bei Volmin 3,16V stoppe, aber wird wohl Sinn machen. Damit es ein bisschen hinausgezögert wird habe ich aber aktuell schon von 40% (500W) bis 10% verlaufend das Entladelimmit bis zu nur noch maximal 200W runtergesetzt.
  • Hilfe für Skripterstellung mit Node-RED

    956 13k
    956 Themen
    13k Beiträge
    S
    Hallo Zusammen, ich bin gerade am überlegen, wie ich folgende Aufgabe umsetzen könnte: Ein true an einer (Trigger)Node lässt einen Zähler laufen und setzt einen eigenen Ausgang auf true. Ein false der Trigger Node stoppt den Zähler setzt diesen aber nicht auf false. Ein true lässt den Zähler einfach weiterlaufen... Nach Ablauf der Zeit im Zähler wird der Ausgang des Zählers auf false gesetzt. Mehr soll nicht passieren. Ein separater Eingang am Zähler setzt diesen auf 0 zurück. Was ich damit anfangen möchte: Die Laufzeit der Poolpumpe wird auf eine Mindestlaufzeit von bspw. 4h überwacht -kann aber manuell bedient bei Bedarf länger laufen. Ein Trigger um 00:01Uhr setzt die Laufzeit zurück. Die Zählernode gilt hier als "Anforderung Pumpe wegen Mindestlaufzeit unterschritten". Ich habe noch keine brauchbaren Ideen, wie ich dass sauber und mit wenig Aufwand umsetzen könnte... Vielen Dank und VG Torsten
  • 500 Telegramme auf einmal

    5
    1
    0 Stimmen
    5 Beiträge
    216 Aufrufe
    G
    @loni said in 500 Telegramme auf einmal: Ich bekomme morges bei der Statusänderung 100te Ich denke, Du kriegst alle 20 Sekunden eine Nachricht. Denn alle 20 Sekunden änderst Du in 1) die Heizphase und triggerst über die jedesmal ausgeführte Änderung darüber in 2) das Schreiben der Nachricht.
  • Cron für Scenes

    4
    0 Stimmen
    4 Beiträge
    478 Aufrufe
    B
    @paul53 ... unbefriedigend, hat das Problem aber gelöst. Danke.
  • Licht mit BWM schalten aber mit Prio auf Alexa Befehl

    43
    1
    0 Stimmen
    43 Beiträge
    4k Aufrufe
    DuffyD
    @paul53 Hallo Paul53, in deiner Frage war auch schon die Lösung. Wenn man in dem iot Adapter mehrere Datenpunkte eingibt, was ja bei Lampen ganz nützlich sein kann, reagiert das Script nicht mehr. Hier ein Beispiel: [image: 1680620502412-2.png] Wenn man aber nur einen Datenpunkt eingibt erkennt das Skript auch wieder das schalten der Lampe. Hier ein Beispiel: [image: 1680620401215-3.png] In diesem Fall dient "Licht Arbeitszimmer" der Scripsteuerung und "Lampe Arbeitszimmer" dem Dimmen und der Farbänderung. Danke für Deine Mühe und den Denksanstoß. VG Duffy
  • Wert aus Array auslesen

    3
    1
    0 Stimmen
    3 Beiträge
    315 Aufrufe
    TimmerxT
    Super funktioniert perfekt
  • Solar Ertrag Tag/Monat berechnen

    4
    1
    0 Stimmen
    4 Beiträge
    871 Aufrufe
    S
    @rrov1 Danke für die Information. Habe aber nicht geschnallt wie der Adapter funktioniert und bin deshalb auf die Lösung von Paul umgestiegen, Danke für die schnelle Antwort. @paul53 reverse_energy_total So hat es mir die Fa. Kolbe mitgeteilt, werde die Werte einmal beobachten. Sourceanalytix-Adapter Ist jetzt installiert, auch wenn ich den Adapter erst einmal nicht gefunden wurde. Repository auf Beta umgestellt. Auch hier erst einmal nicht geschnallt wie es funktioniert, habe aber eine Anleitung gefunden. Anleitung Smarthomejetzt.de Danke für die schnelle Hilfe. Gruß Hans-Dieter
  • Got unexpected ID: hm-rega -Benötige Hilfe

    25
    0 Stimmen
    25 Beiträge
    3k Aufrufe
    HomoranH
    @tomate sagte in Got unexpected ID: hm-rega -Benötige Hilfe: Des Rätsels Lösung war, dass ich auf die Systemvariable der Homematic im Sekundentakt neue Werte abgeben wollte. das hab ich von Anfang an vermutet.
  • unsubscribe: empty name -- Wie finde ich den Verursacher?

    6
    0 Stimmen
    6 Beiträge
    498 Aufrufe
    GlasfaserG
    @tomate sagte in unsubscribe: empty name -- Wie finde ich den Verursacher?: Der Fehler tritt nicht auf??? Na , dann würde ich beim nächsten mal auf die Uhrzeit schauen wenn es wieder sporalisch im Log erscheint . Was .. bzw. welches Skript um diese Zeit der Auslöser ist !
  • Länge und Breite aus DP auslesen

    8
    0 Stimmen
    8 Beiträge
    496 Aufrufe
    C
    @paul53 Jo nu löppt es Ich hatte es schon richtig, aber weil sich nichts getan hat hab ich weiter versucht und das Ganze verschlimmbessert. Na ja wieder was dazu gelernt. Vielen Dank für die Hilfe.
  • Screenshot wird nicht erstellt.

    35
    1
    0 Stimmen
    35 Beiträge
    3k Aufrufe
    Curtis777C
    @andre Lieber Andre, und Lieber @Glasfaser Das war der Fehler. Danke euch, es läuft schon zumindest teilweise. Leider scheint es noch immer das Problem zu geben, das ich gehofft habe zu umgehen. PhantomJS hat anscheinend auch das Problem die MaterialWidgetAdvanced Widgets anzuzeigen. So sollte es aussehen bzw sieht es im Chrome Browser aus. [image: 1680024873498-2112dc9e-d4a9-4906-a925-0786a25fe962-image.png] und der Screenshot sieht dann so aus: [image: 1680024956475-168a95aa-63ec-4eef-8235-a9cf3ff44468-image.png] Danke euch!
  • Script zum Schalten einer Steckdose am Ecoflow zum laden

    37
    0 Stimmen
    37 Beiträge
    2k Aufrufe
    paul53P
    @würfel sagte: Verzögerung für das Ausschalten einzubauen ? Wo? So kann man unterschiedliche Verzögerungen für Ein- und Ausschalten realisieren: [image: 1680022897274-blockly_temp.jpg]
  • Frage: alias Konvertierungsfunktion

    12
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    G
    @codierknecht said in Frage: alias Konvertierungsfunktion: Wobei Deine Lösung vermutlich etwas weniger Ressourcen frisst Ich habs gerade mal verglichen. Bei 100.000 Konvertierungen ist die Math.round()-Variante meist um 30ms schneller als die parseFloat()-Variante - auf meinem Pi4. 17:10:06.158 info javascript.0 (6125) script.js.common.Testen.Performance: -899 17:10:06.389 info javascript.0 (6125) script.js.common.Testen.Performance: 37 17:10:06.609 info javascript.0 (6125) script.js.common.Testen.Performance: 30 17:10:06.830 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.049 info javascript.0 (6125) script.js.common.Testen.Performance: 1029 17:10:07.269 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.487 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.707 info javascript.0 (6125) script.js.common.Testen.Performance: 30 17:10:07.923 info javascript.0 (6125) script.js.common.Testen.Performance: 28 17:10:08.141 info javascript.0 (6125) script.js.common.Testen.Performance: -973 Die Liste zeigt insgesamt 10 Versuche. Es wird die Dauer der Versuche mit parseFloat() von der Dauer mit Math.round() abgezogen. Das ist das Script: let loops:number = 100000; for (let j=0; j<10; j++) { // Erster Versuch let start=new Date().getMilliseconds(); for (let i=0; i<loops; i++) { parseFloat((i / 1000).toFixed(2)); } let end=new Date().getMilliseconds(); let duration=end-start; // Zweiter Versuch start=new Date().getMilliseconds(); for (let i=0; i<loops; i++) { Math.round(i / 10) / 100 } end=new Date().getMilliseconds(); let duration2=end-start; console.log(duration - duration2); }
  • Tasmota: mit Schalter unterschiedliche Szenen steuern

    21
    0 Stimmen
    21 Beiträge
    3k Aufrufe
    BananaJoeB
    @sorai Öhm, was genau willst du machen? Die von dir zitierte Anleitung dient der folgenden Funktion: Kurzer druck schaltet das direkt angeschlossene Gerät/Licht Langer druck (Hold) schaltet ein anderes Tasmota-Gerät Das mit der SetOption32 ... mhh lauf der offziellen Anleitung, ja es sind inzwischen 0.1 Sekunden-Schritte. Bei läuft es überall wo ich es einsetzt noch mit einer 3, in einem Zimme rnutze ich 5. wenn ich drüber nachdenke sind es keine 5 Sekunden, muss ich mal beobachten. In meiner Anleitung auf meiner Webseite habe ich mal einen Hinweis dazu eingebaut. Das habe ich neulich noch nach meiner eigenen Anleitung eingerichtet. Die Rule reagiert ja auf ON Switch1#State=3 Und das ist Hold laut Dokumentation: [image: 1680016468057-60323010-a4d0-4635-bc65-698f7984b526-image.png] https://tasmota.github.io/docs/Rules/#rule-trigger Hast du noch mehr Rules laufen?
  • Q: [selbst gelöst] Fehler in Scripten (Blockly)

    5
    0 Stimmen
    5 Beiträge
    134 Aufrufe
    R
    @homoran Ok, danke für den Hinweis. Ich hatte zwar schon so eine leise Ahnung, dass mit dem Begriff "global" eine etwas andere "Funktion" verbunden sein könnte, habe das aber ehrlicherweise ignoriert und auch nicht weiter vertieft. Gab ja auch bislang keine Probleme. Und Scripte, die andere Scripte triggern, wirds wohl auf absehbare Zeit bei mir nicht geben. Aber wer weiß... Der Hinweis mit dem Draft-Ordner ist ist gut und eigentlich viel aussagekräftiger, da selbstsprechender Name. Werde ich stehenden Fußes umsetzen. Zu den Logs: Richtig. Logs vorher lesen! Bisher hatte ich zum Glück keine Notwendigkeit auf Fehlersuche zu gehen. Von daher waren die Logs für mich bisher kein Thema. Aber es zeigt sich, dass so eine Community ziemlich nützlich ist. Auch bei Themen, die eher rechts und links von der eigentlichen Frage/vom eigentlichen Problem liegen. Der "Beifang" also :-) Kurz: habe schon eine Menge an kleinen Dingen dazugelernt. Danke Euch dafür... VG Peter
  • SayIt wird ausgeführt obwohl skript nicht mehr existiert

    6
    0 Stimmen
    6 Beiträge
    506 Aufrufe
    H
    @meister-mopper Danke für den Hinweis. Habe ich schon 'durchgekämmt' - nur das aktuelle Skript wurde gefunden.
  • Einen Telegram-User mit Rules-Skript anschreiben

    1
    0 Stimmen
    1 Beiträge
    143 Aufrufe
    Niemand hat geantwortet
  • Fahrzeug Standortabfrage mit Alexa

    12
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    DJMarc75D
    @brunoz immer gerne
  • kleiner Webserver auf Win Tablet

    2
    1
    0 Stimmen
    2 Beiträge
    125 Aufrufe
    liv-in-skyL
    @bahnuhr vielleicht geht dmit was?: https://bobbyhadz.com/blog/npm-warn-old-lockfile-the-package-lock-json-file-was-created npm install --package-lock-only
  • Fehler bei "Installing iobroker.javascript@6.1.4..."

    16
    0 Stimmen
    16 Beiträge
    1k Aufrufe
    O
    @thomas-braun danke, hat sich erledigt. VG
  • [Gelöst] JSON Tabelle per Email oder Telegram senden

    8
    0 Stimmen
    8 Beiträge
    717 Aufrufe
    nik82N
    @paul53 Du bist einfach der Beste! Vielen lieben Dank
  • UDP-Befehl mittels Blockly / JavaScript senden?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    OliverIOO
    @slemy im javascript adapter läuft node. hier ein beispiel direkt aus der node dokumentation import dgram from 'node:dgram'; import { Buffer } from 'node:buffer'; const message = Buffer.from('FF13029CA52580AA7761646D696E0061646D696E002E', 'hex'); const client = dgram.createSocket('udp4'); client.send(message, 8899, '192.168.1.183', (err) => { client.close(); }); https://nodejs.org/docs/latest-v18.x/api/dgram.html#socketsendmsg-offset-length-port-address-callback ich hab hier mal auf die version 18 LTS verlinkt. da hat sich aber mit 19 auch nix verändert. Nicht durch die Doku verwirren lassen. Mit node kannst du auch udp server entwickeln. Das ist ein wenig komplexer die verwendeten module/bibliotheken sind bestandteile von node, daher müssen sie nicht in den javascript adapter einstellungen eingetragen werden. Wenn du das senden willst, FF 13 02 9C A5 25 80 AA 77 61 64 6D 69 6E 00 61 64 6D 69 6E 00 2E musst du nur die hexzahlen der reihe nach ohne leerzeichen schreiben. Ich habe dir den code oben mal aufbereitet. theoretisch einfach nur copy paste. sofern deine angaben alle stimmen. die hex zahlen kann ich nicht überprüfen const message = Buffer.from('FF13029CA52580AA7761646D696E0061646D696E002E', 'hex'); // Prints <Buffer FF 13 02 9C A5 25 80 AA 77 61 64 6D 69 6E 00 61 64 6D 69 6E 00 2E>, all data represented. https://nodejs.org/api/buffer.html#buffers-and-character-encodings (ziemlich am Ende des Abschnitts

607

Online

32.8k

Benutzer

82.8k

Themen

1.3m

Beiträge