Weiter zum Inhalt

Skripten / Logik

16.7k Themen 216.7k Beiträge

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

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 50k
    3k Themen
    50k Beiträge
    maxclaudiM
    15.10.2026; 16:00h Weiterer Bericht zum Betrieb über MQTT-Port 1883 und zenSDK Fortsetzung von: Da es dazu weltweit quasi null Infos gibt, dachte ich, ich teile meine bisherigen Erkenntnisse mal auszugsweise als kleinen Bericht mit euch. Wer möchte kann den Bericht im spoiler lesen, für alle anderen ist der Beitrag dann kürzer und kann ignoriert werden Spoiler MQTT-Port 1883: Verbindung mit neuen Zendure-Geräten und zenSDK Wenn das Zendure-Gerät über den unverschlüsselten MQTT-Port 1883 gekoppelt ist, läuft das lokale zenSDK-Skript über HTTP spürbar stabiler und reagiert subjektiv deutlich schneller. In meinen Testreihen war ein HTTP-Polling im 3000-ms-Takt absolut problemlos und lückenlos möglich. Im produktiven Betrieb ist ein so schnelles Intervall allerdings sinnfrei. Es ist besser, das Polling bei ≥ 4000 ms zu belassen. Das schont das Netzwerk (Traffic), die Netzwerk-Ressourcen des ESP32 und verhindert das hardwarebedingte Empfangen von identischen Altwerten. Bei meinem aktuellen Test wird keine MQTT-Steuerung/Regelung verwendet. Die gesamte Steuerung erfolgt exklusiv über das zenSDK mittels HTTP-Befehlen aus dem Skript dieses Threads. Über die unverschlüsselte MQTT-Schnittstelle (Port 1883) sende ich lediglich in einem festen Intervall eine minimale Abfrage, um die MQTT-Verbindung im Hintergrund aktiv zu halten. Realisiert durch ein Mini-Skript (ein kleines Blockly ist auch kein Problem), das im festen Intervall den MQTT-Adapter-Datenpunkt mit der stets gleichen Abfrage senden lässt. Für meine eigenen Testreihen habe ich das Skript lediglich um ein paar zusätzliche Helper-Funktionen zum Debuggen erweitert. Genialer Nebeneffekt: Über das zenSDK lassen sich plötzlich auch die erweiterten Limits für minSoc (0–95 %) und socSet (6–100 %) völlig frei einstellen und stabil nutzen. Im herkömmlichen Normalbetrieb über TLS auf Port 8883 sperrt sich die Firmware hier bekanntlich strikt; Werte für socSet unter 70 % sind dort gar nicht möglich. Es sollte aber zwingend darauf geachtet werden, dass der eingestellte minSoc-Wert stets kleiner ist als der socSet-Wert. Ich werde wohl das Skript für mich noch um eine integrierte Schutzlogik erweitern: Sollte diese Bedingung nicht erfüllt sein, wird der Schreibbefehl blockiert. Zudem möchte ich, dass z. B. socSet immer mindestens 2 % höher liegen soll als minSoc, um unlogische Hystereseschleifen der Hardware zu vermeiden. Durch ein niedrigeres socSet funktioniert auch weiterhin alles stabil, wie die Erkennung von socLimit und dass der Bypass (pass) mit socSet indirekt gesteuert werden kann – z. B. dass der Bypass automatisch früher ein- oder ausgeschaltet wird. Befund: Der allseits bekannte und nervige energyLevel- bzw. SoC-Bug (plötzliche Sprünge oder Einfrieren der Prozentwerte) tritt in diesem unverschlüsselten Setup bei mir bisher nicht auf. Es ist möglich, über MQTT, das HTTP-zenSDK und Bluetooth-Properties zu regeln. Alle drei Steuerungsmöglichkeiten sind bzw. wären sogar simultan möglich. MQTT bietet mehr bzw. alle Möglichkeiten, die aber eigentlich nicht für den normalen, lokalen Betrieb nötig sind. Richtet man den Broker zusätzlich als Bridge zur Cloud ein, kann die App weiter verwendet werden. HEMS ist bei mir (bis jetzt) dauerhaft deaktiviert. Außer für eine Zeitsynchronisation hat die Cloud bisher nicht in das System eingegriffen. PS: Ich suche immer noch 1 Tester. Außer einer DNS-Umleitung und der Zendure-App wird nichts benötigt für einen lokalen Betrieb über MQTT-Port 1883. Keine weiteren Tools etc. Um Bots oder Fake-Anfragen auszuschließen, ist ein bestehender Account im ioBroker-Forum oder einem etablierten PV-Forum erforderlich. Interessierte ohne Foren-Historie können leider nicht berücksichtigt werden. Jedes aktive Mitglied – egal ob Profi oder Einsteiger – ist herzlich willkommen! Bei Interesse bitte einfach per PM oder E-Mail melden. Eine Steuerung funktioniert über das zenSDK wie bisher oder auch über MQTT. Allerdings ist man dann von der Cloud befreit, und ohne Bridge funktioniert die App dann natürlich nicht mehr. Wer sich bedanken möchte, weiß ja, wo der Voting-Button ist. Ein extra Post dafür muss nicht sein. ;-)
  • Hilfe für Skripterstellung mit Blockly

    7k 81k
    7k Themen
    81k Beiträge
    skvarelS
    @guitardoc .. nicht direkt eingeben, sondern die Tage und Zeiten einfach auswählen. Ich nutze nur CRON anstatt 'Wizard' oder 'Einfach' Beispiel, jeden Tag um 04:00 [image: image.jpeg] [image: image.jpeg] [image: image.jpeg]
  • Hilfe für Skripterstellung mit Node-RED

    970 13k
    970 Themen
    13k Beiträge
    mickymM
    @ak68 Ich habe zwar diese Nodes nicht. Aber wie die Werte interpretiert werden, hängt meines Erachtens ja auch noch vom topic ab, dass Du mitschicken musst. [image: image.jpeg] Sprich neben der Position musst Du das topic ja noch auf "blindPosition" setzen.
  • ioBroker >> OpenEPaperLink (OEPL)

    10
    3 Stimmen
    10 Beiträge
    2k Aufrufe
    K
    @awd4u Vielen Dank für Deine Anleitung!
  • javascript.0 bricht ab

    javascript
    23
    0 Stimmen
    23 Beiträge
    2k Aufrufe
    CodierknechtC
    @digi-bit sagte in javascript.0 bricht ab: die ins Nevada geführt hat <besserwissermode> Das Ding heißt "Nirvana" </besserwissermode>
  • ioBroker wenn online-sonst OpenCCU

    6
    0 Stimmen
    6 Beiträge
    748 Aufrufe
    BananaJoeB
    @cäptnblaubär sagte in ioBroker wenn online-sonst OpenCCU: Die Zwangsabhängigkeit in Proxmox wegen fehlendem (Ziel-)storage war mir bis dato nicht bewußt. Bin strikt nach Vorgaben zum Einbinden eines QNAP-NAS als Backup-Ziel vorgegangen. Das wird irgendetwas anders gewesen sein, etwas wichtiges des Containers oder der VM muss dort gelegen haben. Und wenn es nur eine ISO oder eine andere Datei war. War wohl dann nicht per Proxmox Backup Server? Wäre aber ein separates Thema. Ich sehe das wie @Samson71 : Ein System richtig redundant halten bzw. auf den Ausfall vorbereitet sein. Und das geht mit ioBroker nun mal super, gerade wenn es als VM (von mir aus auch als Container) und insbesondere mit Proxmox. Mit 2 Stück kann man eine Replikation einrichten so das das 2. Gerät sogar mitlaufen kann und bei Hardwareausfall schnell übernehmen kann. Do kann man dann auch im laufenden Betrieb Updates einspielen und dafür die VMs (geht nicht kit Container) ohne Unterbrechung (Herunterfahren) verschieben. Mit dem Proxmox Backup Server (der gerne ein NAS als Ziel haben kann) kann man duzende Backups bei geringen Speicherbedarf vorhalten. Dahin kann man auch gut das ioBroker Backup senden lassen. Ganz nebenbei kann man vor Upgrades, insbesondere vor größeren Umbauten, z.B. Update Debian von Bookworm auf Trixie, neue NodeJS Version etc. mal eben vorher einen Snapshot (aka Spielstand speichern) machen und so bei Bedarf wieder zurück springen (aka Spielstand laden) Das geht mit einem Bare-Metal-System eher schlecht, und die CCU wäre Bare-Metal, oder?
  • Webhook von homey an IOB-TR064-Adapter löst Anruf aus

    2
    0 Stimmen
    2 Beiträge
    305 Aufrufe
    FriedhofsblondF
    @friedhofsblond Habe mal bischen was getestet - aber ehrlich steh ich auf dem Schlauch wie ich einen Wert vom homey auf IOB senden kann. Ich habe noch die App Simple-API im IOB installiert und einen Datenpunk erzeugt. Dieser Punkt soll dann ja per Webhook geändert werden auf on oder off , damit ich diesen im Blockly nutzen kann. Geht das schon in die Richtung - oder bin ich total falsch ?? [image: 26ed0a36-2e6a-4648-a407-6ad3680b0388-image.png] [image: Screenshot 2025-11-04 182011.png] [image: Screenshot 2025-11-04 182619.png] update: so ist es richtig, setzt den Alarm auf true oder false: [image: Screenshot 2025-11-04 213522.png]
  • [gelöst] Nuos A8T - ESP32 Chipsatz - Scripte

    13
    1
    -1 Stimmen
    13 Beiträge
    946 Aufrufe
    D
    @oliverio Moin, wenn Du den gesamten, auch den Vorthread (wurde leider geschlossen) liest wird es dir klar sein. https://forum.iobroker.net/topic/82370/nuos-a8t-esp32-chipsatz-email-info-protokoll/10?_=1762146987441 VG dojodojo
  • Werte per Telegram an iobroker senden

    10
    0 Stimmen
    10 Beiträge
    1k Aufrufe
    B
    Falls es jemanden interessiert ist hier ein Taschengeld Script: Javascript: // Taschengeld-Verwaltung mit wöchentlicher Gutschrift + VIS-Steuerung // Stand: November 2025 // Anpassungen: 24h-Zeit ohne Sekunden + HTML-Log-Tabelle + nur 20 letzte Einträge const kinder = { Alrik: { konto: '0_userdata.0.Taschengeld.Alrik.Konto', einzahlung: '0_userdata.0.Taschengeld.Alrik.Einzahlung', auszahlen: '0_userdata.0.Taschengeld.Alrik.Auszahlung', btn_einzahlen: '0_userdata.0.Taschengeld.Alrik.Einzahlen', btn_auszahlen: '0_userdata.0.Taschengeld.Alrik.Auszahlen', woechentlich: '0_userdata.0.Taschengeld.Alrik.Woechentlich', log: '0_userdata.0.Taschengeld.Alrik.Log' }, Theda: { konto: '0_userdata.0.Taschengeld.Theda.Konto', einzahlung: '0_userdata.0.Taschengeld.Theda.Einzahlung', auszahlen: '0_userdata.0.Taschengeld.Theda.Auszahlung', btn_einzahlen: '0_userdata.0.Taschengeld.Theda.Einzahlen', btn_auszahlen: '0_userdata.0.Taschengeld.Theda.Auszahlen', woechentlich: '0_userdata.0.Taschengeld.Theda.Woechentlich', log: '0_userdata.0.Taschengeld.Theda.Log' } }; // 🧾 Logik: Eintrag im Log speichern (HTML-Tabelle, 24h-Zeit, max. 20 Einträge) function logEintrag(kind, betrag, art) { const datum = new Date().toLocaleString('de-DE', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }); const logPfad = kinder[kind].log; let aktuellesLog = getState(logPfad).val || ''; // Wenn noch keine Tabelle existiert → Grundstruktur erzeugen if (!aktuellesLog.includes('<table')) { aktuellesLog = ` <table style="width:100%; border-collapse:collapse; font-family:Arial; font-size:12px;" border="1"> <thead style="background:#ddd;"> <tr> <th style="padding:4px;">Datum</th> <th style="padding:4px;">Art</th> <th style="padding:4px;">Betrag</th> </tr> </thead> <tbody></tbody> </table>`; } // Neue Tabellenzeile (neueste Einträge oben) const neueZeile = ` <tr> <td style="padding:4px;">${datum}</td> <td style="padding:4px;">${art}</td> <td style="padding:4px; text-align:right;">${betrag.toFixed(2)} €</td> </tr>`; // Neue Zeile am Anfang des Tabellenkörpers einfügen aktuellesLog = aktuellesLog.replace(/(<tbody>)/, `$1${neueZeile}`); // Nur die letzten 20 Einträge behalten const tbodyInhalt = aktuellesLog.match(/<tbody>([\s\S]*?)<\/tbody>/); if (tbodyInhalt) { const alleZeilen = tbodyInhalt[1].match(/<tr>[\s\S]*?<\/tr>/g) || []; const begrenzteZeilen = alleZeilen.slice(0, 20); // Nur die ersten 20 behalten (neueste zuerst) const neuerTbody = "<tbody>" + begrenzteZeilen.join("") + "</tbody>"; aktuellesLog = aktuellesLog.replace(/<tbody>[\s\S]*?<\/tbody>/, neuerTbody); } setState(logPfad, aktuellesLog); } // 🕗 Wöchentliche Auszahlung (Sonntag 08:00 Uhr) schedule("0 8 * * 0", () => { for (const kind in kinder) { const kontoPfad = kinder[kind].konto; const betragPfad = kinder[kind].woechentlich; const betrag = parseFloat(getState(betragPfad).val) || 0; const standAlt = parseFloat(getState(kontoPfad).val) || 0; const standNeu = standAlt + betrag; setState(kontoPfad, standNeu); logEintrag(kind, betrag, "Wöchentliche Gutschrift"); } }); // 💰 Einzahlung per Button for (const kind in kinder) { on({ id: kinder[kind].btn_einzahlen, change: 'ne' }, () => { const betrag = parseFloat(getState(kinder[kind].einzahlung).val); if (isNaN(betrag) || betrag <= 0) return; const konto = kinder[kind].konto; const stand = parseFloat(getState(konto).val) || 0; setState(konto, stand + betrag); logEintrag(kind, betrag, "Manuelle Einzahlung"); // Reset setState(kinder[kind].einzahlung, 0); setState(kinder[kind].btn_einzahlen, false); }); } // 💸 Auszahlung per Button for (const kind in kinder) { on({ id: kinder[kind].btn_auszahlen, change: 'ne' }, (obj) => { const btnStatus = obj.state.val; if (btnStatus !== true) return; // Nur reagieren, wenn Button gedrückt (true) const betrag = parseFloat(getState(kinder[kind].auszahlen).val); const konto = kinder[kind].konto; const stand = parseFloat(getState(konto).val) || 0; if (isNaN(betrag) || betrag <= 0 || betrag > stand) { console.warn(`[Taschengeld] Ungültiger Auszahlungsbetrag für ${kind}: ${betrag}`); setState(kinder[kind].btn_auszahlen, false); return; } setState(konto, stand - betrag); logEintrag(kind, betrag, "Auszahlung"); // Reset setState(kinder[kind].auszahlen, 0); setState(kinder[kind].btn_auszahlen, false); }); } Objekte unter 0_userdata 0 anlegen: [image: 2025-11-02 21_17_02-Clipboard.png] Hier eine vis-2: [image: 2025-11-02 21_20_28-Clipboard.png]
  • Reagieren auf Homematic Fensterkontakt

    28
    3
    0 Stimmen
    28 Beiträge
    3k Aufrufe
    paul53P
    @jay-jey sagte: Hier noch das andere Blockly Dann verwende direkt den Tasten-Datenpunkt als Trigger zur Abfrage, ob noch Fenster offen sind: [image: Blockly_temp.JPG] EDIT: Die Prüfung ohne Vergleich funktioniert sowohl mit 0/1 als auch mit false/true.
  • Tradfri LED1624G9 und E1524/E1810

    1
    0 Stimmen
    1 Beiträge
    139 Aufrufe
    Niemand hat geantwortet
  • Gelöst: Bilder senden von einen IOB zum anderen IOB

    javascript
    23
    0 Stimmen
    23 Beiträge
    2k Aufrufe
    MartinPM
    @michihorn Die Integration meiner Kameras in iobroker ist rudimentär ... Reolink-Adapter für die beiden richtigen Kameras, und frigate per MQTT für eine experimentell genutzte ESP32 CAM. Bisher keine Web-Visualisierung der Kameras in Vis2 o. Ä. Für das "Angucken" nutze ich die Web-Oberfläche von Frigate bzw die Reolink App und den Browser am PC. "Nach Hause telefonieren" können die Reolink Cams nicht, da sie in der Fritzbox den Internet-Zugang gesperrt bekommen haben. Das Ablagern der Bilder auf dem USB-Drive am Server dient nur der Langzeitarchivierung ... Aus Platzgründen räume ich täglich per Cron Job alle Aufzeichnungen, die älter sind, als 50 Tage auch auf diesem USB-Drive ab. Fand es wichtig, die Dateien "einfach so" in einem Netzwerkshare liegen zu haben...
  • [gelöst] Hargassner HV40 Daten über telnet abgreifen

    heating javascript monitoring
    32
    0 Stimmen
    32 Beiträge
    11k Aufrufe
    A
    @70sman ja bei mir auch, die haben seit Juli eine neue FW, seit dem ist das alles gefixt :) es geht mit dem normalen Adapter von ioBroker. Aber wie fragst du alle Adressen ab, die Digitalen DAQ? MfG
  • Mediola-Adapter Systemvariable befüllen

    1
    0 Stimmen
    1 Beiträge
    142 Aufrufe
    Niemand hat geantwortet
  • Zeitzone bei influxdb - GMT+2 wird nicht angezeigt

    3
    1
    0 Stimmen
    3 Beiträge
    305 Aufrufe
    S
    @haus-automatisierung Den Button, den du beschreibst, habe ich auf local stehen. Trotzdem erscheint nicht die Anzeige "GMT+2". So, ich habe es jetzt selber herausgefunden. In der Darstellungsform ist standardmäßig "Graph" eingestellt. Wenn ich die Werte sehen wollte, habe ich nach Submit den Schalter "View Raw Data" eingeschaltet. Dann werden mir die Werte als UTC angezeigt. Eine Änderung der Darstellungsform bringt jetzt nichts. Jetzt kommts: Wenn ich das Browserfenster aktualisiere (firefox), die Darstellungsform "Table" (nur diese) einstelle, anschließend die Query aufbaue und dann submit betätige, dann werden mir die Zeitangaben in der lokalen Zeit , mit der Ergänzung GMT+2 dargestellt. Wechsel ich jetzt in die Darstellungsform Graph, dann werden dort die UTC-Daten angezeigt. Wieder zurück nach Table als GMT. Muss ich nicht verstehen, weiß jetzt wie es funktioniert. Vielen Dank @haus-automatisierung Gruß Georg
  • Zeile aus JSON löschen

    javascript
    4
    1
    0 Stimmen
    4 Beiträge
    525 Aufrufe
    paul53P
    @michihorn sagte: auch löschen nach "_geht" oder "_kommt"? Den ersten Eintrag? const idTable = '0_userdata.0.Haus.AW.Noel_JSON'; // ID JSON-Tabelle schedule('59 23 * * *', function() { const arr = JSON.parse(getState(idTable).val); if(arr[0].includes('_geht')) { arr.shift(); setState(idTable, JSON.stringify(arr), true); } });
  • [gelöst] Verständnis Attribute mit Blockly ändern

    10
    1
    0 Stimmen
    10 Beiträge
    815 Aufrufe
    padrinoP
    @asgothian Also, ich glaube, der Adapter ist ziemlich tot. ;) Wollte damit auch niemanden behelligen... Hatte schon angefangen zu überlegen ob der Adapter evtl... und wie.... Aber dann dachte ich, ich guck mal, was ich in JS hin bekomme, und wenn's ordentlich klappt mach ich das Skript zugänglich für Interessierte.
  • Zwangsladung mit Sungrow SH10RT

    10
    2
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    D
    Hier noch der Vollständigkeitshalber das 3. Script. [image: Bildschirmfoto vom 2025-10-14 18-15-40.png]
  • per script Rest anfrage senden

    31
    0 Stimmen
    31 Beiträge
    4k Aufrufe
    Great SUNG
    @delphinis Windows ist generell etwas schwieriger, als Linux. Du musst wohl zuerst mal node.js updaten, vorher macht alles andere keinen Sinn (es sei denn, Du hast schon die aktuellste Version). Danach kannst Du iobroker updaten. Ich finde diese Diskussion https://forum.iobroker.net/topic/80988/uralt-system-updaten-oder-umzug ganz gut.
  • IOBroker Automatisiertes Deployment

    12
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    OliverIOO
    @vippis Dann musst du in den Adapter schauen was die gui des Adapters mit dem Passwort macht, was der Nutzer einträgt.
  • Anwesenheit Verzögerung, nochmalige Prüfung einbauen ?

    23
    0 Stimmen
    23 Beiträge
    3k Aufrufe
    Samson71S
    @jolic sagte in Anwesenheit Verzögerung, nochmalige Prüfung einbauen ?: hi, keine Ahnung ob dir das hilft, ich nutze seit Jahren problemlos den TR-064-adapter für meine Anwesenheitserkennung mit Fritzbox und zwei APs im Mesh. Gelesen? @dasbrot sagte in Anwesenheit Verzögerung, nochmalige Prüfung einbauen ?: Ich muss das sowiso umstellen, da ich in Kürze auf ubiquiti umstelle. Dann gibt es keine Fritzbox mehr.
  • Adresse aus GPS Koordinaten ermitteln ?

    87
    0 Stimmen
    87 Beiträge
    14k Aufrufe
    Steffe.S.S
    Vielen Dank für Eure Mühe, das Blockly von @stenmic läuft. Ich werde aber auch mal das Skript von @bahnuhr testen. Vielen Dank für Eure Hilfe
  • Skript - automatisch Eintrag im Google Kalender machen

    7
    0 Stimmen
    7 Beiträge
    667 Aufrufe
    bahnuhrB
    @dirkhe sagte in Skript - automatisch Eintrag im Google Kalender machen: "unsicher" zugelassen unsicher, etc. kam da nicht. Das Blatt sieht anders aus.

467

Online

33.1k

Benutzende

84.0k

Themen

1.4m

Beiträge