Weiter zum Inhalt

Skripten / Logik

16.7k Themen 215.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
    Guten Morgen @Daniel-8 @Daniel-8 sagte: @maxclaudi ich führe ja keine Kalibrierung über die app durch.... Ja, ich bat Dich nur darum :-) Sonst wissen wir nicht wann sich was mit welchen Werten ändert. Darf gerne auch jemand anders testen und helfen. Habe grad durch das Update Probleme das er mir über Nacht den Akku leer zieht. Bin aber grad noch am austesten. Der ging nicht mehr in standby wenn es dunkel war und socmin erreicht. Er hat durchgehend mit ca. 9 bis 14 Watt entladen. Ein Grund mehr sich nicht allein auf SoC oder minSoc zu verlassen. Würde ein Batterieschutz aufgrund von minVol verwenden. Blockly-Beispiel dazu habe ich schon gepostet. Habe ihn jetzt per mqtt ein und ausschalten quasi aus der Ferne zu einem Neustart gezwungen. Danach war er sofort im Standby. Mal sehen was morgen verbraucht wurde und ob er morgen abend abschaltet. per ein- und ausschalten zu einem Neustart gezwungen?
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    L
    Ich habe ein Skript das jahrelang funktioniert hat und jetzt auf einmal nicht mehr bei einigen Shelly 2 PM nicht mehr geht. Das interessante ist, dass alle Raffstores damit funktionieren nur anscheinend einer seit 6 Monaten und einer seit 1 Woche nicht mehr. Ich habe ein Tabelt bzw. übers Handy kann ich spezielle Voreinstellungen anfahren. [image: 1785222902917-bildschirmfoto-2026-07-28-um-09.06.26.png] Hierfür habe ich immer einen Datenpunkt erstellt, der ein eigenes Skript ausführt. Was eigentlich mal über den Sprachbefehl ausgeführt werden sollte. [image: 1785223087420-bildschirmfoto-2026-07-28-um-09.17.39.png] Dahinter liegt jeweils ein Skript. z.B. für das schließen des Raffstore. [image: 1785223336267-bildschirmfoto-2026-07-28-um-09.20.17.png] ...oder für das Anfahren eines bestimmten Winkels (etwas komplizierter) [image: 1785223404554-bildschirmfoto-2026-07-17-um-01.32.31.png] Problem ist jetzt, dass bei fast allen es funktioniert und bei zwei fährt der Raffstore z.B. ein Stück hoch und schwenkt dann unkontroliert auf/zu/auf/zu usw. ca. 20 sekunden herum. Ich verstehe nicht was er da macht. [image: 1785223666960-bildschirmfoto-2026-07-28-um-09.03.23-resized.png] Es schaut manchmal so aus als wird das skript sofort abgebrochen. Warum auch immer? Manchmal schaut es so aus als ob viele andere Skripte aktiviert und sofort wieder gestoppt werden. Beim Tastendruck auf den Button von oben soll aber nur ein Skript aktiviert werden. Ich wäre auch offen dafür das alles mal zu aktualisieren wenn jemand hier eine gute Idee hat wie man dies einfacher gestalten kann. Meine Asicht ist es immer noch über node-red das ganze als Sprachbefehl neben der Tablett Handysteuerung einzubinden. @paul53
  • Hilfe für Skripterstellung mit Node-RED

    962 13k
    962 Themen
    13k Beiträge
    Marc BergM
    @Thomas-Braun sagte: In der Konfigurationsdatei von Node Red, also in der settings.js, kann durch hinzufügen der Zeitzone das Problem behoben werden. Wenn man den Adapter nutzt, werden Änderungen in der settings.js immer wieder überschrieben. Das bringt nichts. @taddy81 Was konkret ist denn das Problem? Lösen die inject Nodes falsch aus? Oder geht es nur um diese Meldung, bei der niemand weiß, woher sie kommt? @Taddy81 sagte: Auszug: 7/26/2026, 11:15:23 AMnode: debug 3msg.payload : string[24]
  • Sommerzeit/Winterzeit in Script abfragen…

    Verschoben
    22
    0 Stimmen
    22 Beiträge
    7k Aufrufe
    paul53P
    @autom sagte: funktioniert die umschaltung nur im moment des sommer-/winterzeit-wechsels oder auch mitten drinn? Beim gezeigten Schedule nur sonntags um 3:01 Uhr.
  • HTML Datenpunkt dynamisch erzeugen

    3
    0 Stimmen
    3 Beiträge
    337 Aufrufe
    dirk_1930D
    @liv-in-sky Ich hatte in der Zwischenzeit den Code noch etwas abgeändert und rufe die einzelnen Elemente jetzt wie folgt auf. Die Schleife bekomme ich nicht hin :-( const htmlFile = []; var zaehler = 0; htmlFile.push('<!DOCTYPE html><html lang=\"de\">'); htmlFile.push('<head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>TabelleMeteoblueTbl1h</title>'); htmlFile.push('<style type=\"text/css\">'); htmlFile.push('.table{border-bottom:.1px solid darkgrey;border-top:.1px solid darkgrey;border-right:.1px solid darkgrey;border-left:.1px solid darkgrey;border-collapse:collapse;border-spacing:1;font-family:Arial,sans-serif;font-size:1rem;overflow:hidden;padding:1px 1px;word-break:normal;}'); htmlFile.push('.table .uhrzeit{background-color:#000;color:#dfdfdf;text-align:center;vertical-align:middle;font-size:.7rem;font-weight:bold}'); htmlFile.push('.table .temperatur{text-align:center;vertical-align:middle;font-size:1rem;font-weight:bold}'); htmlFile.push('.table .pictocode{text-align:center;vertical-align:middle}'); htmlFile.push('.table .rainspot{text-align:center;vertical-align:middle padding:0}'); htmlFile.push('.table .iconregen{text-align:center;vertical-align:bottom}'); htmlFile.push('.table .iconuv{text-align:center;vertical-align:bottom}'); htmlFile.push('.table .iconhand{text-align:center;vertical-align:bottom}'); htmlFile.push('.table .windspeed{text-align:center;vertical-align:middle;font-size:.6rem}'); htmlFile.push('.table .precipitation{text-align:center;vertical-align:middle;font-size:.6rem}'); htmlFile.push('.table .felttemperatur{text-align:center;vertical-align:middle;font-size:.6rem}'); await Render(zaehler); await Render(zaehler + 1); await Render(zaehler + 2); await Render(zaehler + 3); await Render(zaehler + 4); await Render(zaehler + 5); await Render(zaehler + 6); await Render(zaehler + 7); await Render(zaehler + 8); await Render(zaehler + 9); await Render(zaehler + 10); await Render(zaehler + 11); async function Render(zaehler) { var uhrzeit = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.uhrzeit').val; var pictocode = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.pictocode_picture').val; var temperaturfelt = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.felttemperature_round').val; var temperaturHg = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.temperatureBackColor').val; var temperaturVg = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.temperatureForeColor').val; var winkel = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.winddirection').val; var windspeed = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.windspeed_avg').val; var rainspot = '<img src="/0_userdata.0/meteoblue/basic-day/data_1h/data_' + zaehler + '/rainspotpic' + zaehler + '.png" height="48" width="48">'; var uvindexcolor = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.uvindex_color').val; var uvindex = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.uvindex').val; var precipitation = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.precipitation').val; var temperatur = getState('0_userdata.0.meteoblue.basic-day.data_1h.data_' + zaehler + '.temp_round').val; htmlFile.push('</style>'); htmlFile.push('<body>'); htmlFile.push('<table class=\"table\" style=\"undefined;table-layout:fixed;width: 100%\">'); htmlFile.push('<colgroup><col style=\"width: 15%\"><col style=\"width: 20%\"><col style=\"width: 10%\"><col style=\"width: 10%\"><col style=\"width: 10%\"><col style=\"width: 10%\"><col style=\"width: 20%\"></colgroup>'); htmlFile.push('<tr>'); htmlFile.push('<td class=\"uhrzeit\">' + uhrzeit + '</td>'); htmlFile.push('<td class=\"pictocode\" rowspan=\"4\">' + pictocode + '</td>'); htmlFile.push('<td class=\"iconuv\" rowspan=\"2\"><img src="/vis.0/baisiepen/images/icons8-uv-index-64.png" height="20" width="20"></td>'); htmlFile.push('<td style=\"text-align:center;vertical-align:middle;transform:rotate(' + winkel + 'deg)" rowspan=\"2\"><img src="/vis.0/Element 1.png" height="20" width="20"></td>'); htmlFile.push('<td class=\"iconregen\" rowspan=\"2\"><img src="/vis.0/baisiepen/images/icons8-drop-64.png" height="20" width="20"></td>'); htmlFile.push('<td class=\"iconhand\" rowspan=\"2\"><img src="/vis.0/baisiepen/images/icons8-ganze-hand-50.png" height="20" width="20"></td>'); htmlFile.push('<td class=\"rainspot\" rowspan=\"4\">' + rainspot + '</td>'); htmlFile.push('</tr>'); htmlFile.push('<tr>'); htmlFile.push('<td style=\"background-color:' + temperaturHg + ';color:' + temperaturVg + ';\" class=\"temperatur\" rowspan=\"3\">' + temperatur + '°C</td>'); htmlFile.push('</tr>'); htmlFile.push('<tr>'); htmlFile.push('<td style=\"color:' + uvindexcolor + ';text-align:center;vertical-align:middle;font-size:1rem;\">' + uvindex + '</td>'); htmlFile.push('<td style=\"color:#dfdfdf;font-size:.6rem;text-align:center; class=\"windspeed\" rowspan=\"2\">' + windspeed + ' m/s</td>'); htmlFile.push('<td style=\"color:#dfdfdf;font-size:.6rem;text-align:center;class=\"precipitation\" rowspan=\"2\">' + precipitation + ' mm </td>'); htmlFile.push('<td style=\"color:#dfdfdf;font-size:.6rem;text-align:center;class=\"felttemperatur\" rowspan=\"2\">' + temperaturfelt + '°C</td>'); htmlFile.push('</tr>'); htmlFile.push('<tr>'); htmlFile.push('</tr>'); } htmlFile.push('</table>'); htmlFile.push('</body>'); let html = htmlFile.join(''); console.log(html); setState('0_userdata.0.meteoblue.htmltest', html, true); [image: 1648328561239-unbenannt.jpg]
  • alle veränderten Objekte eines Ordners (Viessmann Adapter)

    2
    0 Stimmen
    2 Beiträge
    188 Aufrufe
    T
    @mibr85 wenn es um viessmannapi geht dann wird dir hier geholfen https://forum.iobroker.net/topic/46778/test-viessmannapi-v2-0-0
  • Bewässerungsventile sequenziell ansteuern

    4
    1
    0 Stimmen
    4 Beiträge
    387 Aufrufe
    K
    @frank2604 kann aber gut sein, dass ich das Skript dann noch bzgl. Gardena / Smartgarden anpassen muss.
  • [gelöst] Javascript Raum auslesen gibt undefiniert aus

    4
    0 Stimmen
    4 Beiträge
    306 Aufrufe
    P
    @paul53 Hallo Ich hatte genau das gleiche vor. Dein Lösungsvorschlag funktioniert aber enumNames[0] wird als Fehler unterstrichen mit folgenden Text Property 'enumNames' does not exist on type '{ type: "state" | "channel" | "folder" | "device"; common: { [x: string]: any; [x: number]: any; }; acl: { object: number; state: number; owner: string; ownerGroup: string; }; _id: string; native: { [x: string]: any; }; enums: { ...; }; from: string; user: string; ts: number; }'.(2339) Muss ich noch irgendetwas anderes machen oder hat sich was anderes geändert? MfG
  • [gelößt] Variable in curl Befehl nutzen

    3
    1
    0 Stimmen
    3 Beiträge
    667 Aufrufe
    B
    @paul53 Na klar, bin da aber einfach nicht selber drauf gekommen! Das funktioniert. Vielen Dank
  • Objekte KNX: Dokumentation für Objektdaten Skrip

    4
    0 Stimmen
    4 Beiträge
    176 Aufrufe
    M
    @mb001 Ich nutze ebenfalls diesen "KNX" Adapter und dabei ist die Namensgebung der KNX Objekte in der ETS und auch das durchgängig korrekte setzen der Flags immens wichtig. Ich benötigte dabei ca 4-5 h Zeit, seither habe ich zu 99% korrekt Importierte Datenobjekte.
  • Logik zum Abfragen/Schreiben von Werten per REST-API

    7
    0 Stimmen
    7 Beiträge
    794 Aufrufe
    AsgothianA
    @th3g3ntl3man sagte in Logik zum Abfragen/Schreiben von Werten per REST-API: @paul53 Vielen Dank schon mal für die schnelle Hilfe!! Ich glaube, dass ich kein Problem haben werde, die Skripte an sich zu schreiben, mir geht es eher um den "Best-Practice"-Ansatz. Also um das Konzept die Daten zwischen dem IOBroker und dem UniPi sauber zu synchronisieren. Ein Beispiel, welches ich aktuell im Kopf habe: Skript1: Holt alle Temperaturen des UniPis in einem Intervall von bspw. 30 Sekunden ab. Skript2: Holt die Werte der Relays in einem Intervall von ca. 1-2 Sekunden ab, sodass ich diese in meiner Visualisierung direkt anzeigen kann, wenn diese geschaltet werden. Skript3-X: Verwendet die Werte von Skript1 und reagiert mit entsprechenden Schaltungen im Homematic etc. Ich finde diesen Ansatz allerdings etwas "umständlich"(?) und weiß nicht ob man das vielleicht auch sauberer aufsetzen könnte... Zumal weiß ich nicht wie performant das ist alle paar Sekunden die REST-Abfragen durchzuführen... Sofern das System keine Push Benachrichtigung erlaubt wirst du um eine regelmässige abfrage nicht herum kommen. Ich würde an Stelle von "request" die JS Bibliothek "Axios" (https://www.npmjs.com/package/axios) einsetzen - da kannst du (wie in diesem Beispiel beschrieben) mit async / await arbeiten. um Überlappende Anfragen zu verhindern würde ich die regelmässigen Abfragen nicht über ein Intervall sondern eine sich selber verlängernde Kette von Timeouts lösen: var DataTimeout; async function getData() { try { const resp = await axios.get('yourlink'); // handle your response } catch (err) { // Handle Error Here console.error(err); } DataTimeout = setTimeout(getData, 5000) } getData() Kritisch sind bei schnellen Abfragen meiner Ansicht nach genau die überlappenden Anfragen, die entstehen können wenn das Netzwerk langsam ist oder der Server zeit benötigt die Anfrage zu beantworten. Ab welchem Intervall das kritisch ist hängt dabei von vielen Faktoren ab so das du das letztendlich wirst ausprobieren müssen. Wichtig zu beachten ist in diesem Fall auch das es Sinnvoll sein kann Dir innerhalb des Skriptes eine Schattenkopie der Werte der Datenpunkte zu halten deren Quellen du in so schneller Folge abfragst. Dadurch kannst du das aktualisieren der Datenpunkte im ioBroker auf die Fälle begrenzen wo sich der Status geändert hat. Dieses gibt die Möglichkeit ohne den Haken "alle States bei Start abonnieren" zu arbeiten ohne das beim Eintragen der Werte zeitverzögerungen wegen der Notwendigkeit entstehen auf das Ergebnis von "getState" zu warten. Der Ansatz die Aufgaben sauber zu trennen ist meiner Meinung nach sehr sinnvoll: Eine Ebene um die Werte bereitzustellen. (2 in Deinem Fall wegen der unterschiedlichen Intervalle) Eine Ebene um auf die Werte (deren Änderung, Aktualisierung) zu reagieren. Das erlaubt es Dir auch für die beiden Ebenen unterschiedliche Logikmaschinen zu benutzen (JS, Blockly, Rules, NodeRed) - Jeweils immer die für die Aufgabe und Dein wissen bestgeeignete. A.
  • Frage zu Schleifen und Listen

    4
    1
    0 Stimmen
    4 Beiträge
    642 Aufrufe
    AsgothianA
    @stefan1234 sagte in Frage zu Schleifen und Listen: Die Funktion IDs vom Selektor funktioniert aber bei Listen nicht, habe ich gelesen. Da hast du falsch gelesen. Der Baustein IDs vom Selektor $(...) gibt eine Liste zurück, wie man mit einem einfachen Skript verifizieren kann (Vorsicht - ich hab das bei einem 'leeren' Testsystem gemacht. der Selektor in dem Beispiel liefert Dir jeden Datenpunkt.): [image: 1648017965304-screenshot-2022-03-23-at-07.45.59.png] Das Problem des Namens hat @paul53 in seinem Skript bereits schön gelöst (über die JS Funktion mit Ergebnis getName) Du kannst also in seinem Beispiel einfach den Trigger auf Werteänderung umstellen auf einen CRON Trigger. A.
  • Objekte in Unterordnern erstellen

    20
    1
    0 Stimmen
    20 Beiträge
    931 Aufrufe
    HomoranH
    @legro sagte in Objekte in Unterordnern erstellen: Wie gesagt, das Ganze erinnert mich an Homematic, wie ebenfalls bereits gesagt: Da kommt das her! Mal ein deutliches Beispiel: Es gibt dort Geräte, z.B. Mehrfunktionssensoren wie die Wetterstation. Diese hat verschiedenen Kanäle (.0 für die Geräteparameter; .1 für die Messwerte....) und in diesen Kanälen gibt es Datenpunkte, z.B. die Temperatur, die Luftfeuchte, die Windstärke usw. [image: 1647961780182-objects_hm.png] @legro sagte in Objekte in Unterordnern erstellen: das mir in vielen Bereichen bis heute verschlossen blieb wenn man sich damit einmal beschäftigt hat, ist das ganz einfach.
  • Eigenverbrauch genüged Einspeisung ein Relais schalten

    4
    0 Stimmen
    4 Beiträge
    779 Aufrufe
    O
    Servus, Vielen Danke für die Antworten und Hilfe. den 1. Raspi will ich nicht für die Schaltung nutzen, er hat schon 70 % Speicherauslastung. Der 1. Raspi läuft sehr stabil, möchte das nichts ändern, hier liefen vorher noch ein paar sonoffs und ESP´s nicht stabil. Beim 2. Ist schon ein älteres Modell läuft der der iobroker nicht mehr. Meine Waschmaschine läuft auch bei Spannungsausfall weiter wenn die Spannung wieder ansteht, wäre als kein Problem. Ein Stromkreis würde reichen für die Schaltung. Der SDM120-Modbus MID ist über Modbus über einen USB Wandler am Raspi angeschlossen und liefert so seine Werte zum Iobroker. Gibt es keine Möglichkeit die Werte abzugreifen? Mit freundlichen Grüßen, orfix
  • Instanzen neustarten wenn Gerät offline

    6
    0 Stimmen
    6 Beiträge
    552 Aufrufe
    M
    @wintuxx Hallo ich habe von einem freindlichen User dieses Script bekommen, vielleicht hilft es auch dir //Skript startet Tahoma-Adapter bei Warnungen im Log neu var warten = 10; //Wartezeit bis zum Restart var warten_ms = warten * 60000; //Wartezeit bis zum Restart in ms var warten_buf = warten_ms + 120000; let sleep = false; var logging = true; //opt/iobroker/log/iobroker.current.log onLog('warn', data => { var check = data.message.includes("401 retry login"); if (check == true && sleep == false) { sleep = true; var text = "Tahoma Fehler identifiziert. Adapter wird gestoppt und in " + warten + " Minuten wieder aktiviert"; if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253xxxxxx' }); setState("system.adapter.tahoma.0.alive", false); setTimeout(function () { setState("system.adapter.tahoma.0.alive", true); var text = "Tahoma Adapter wieder gestartet"; if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253xxxxxx' }); }, warten_ms); setTimeout(function () { sleep = false; var text = "Adapterüberwachung wieder aktiv"; if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253xxxxx' }); }, warten_buf); } }); Gruß Michael
  • WioBrowser Skalierung einstellen

    1
    1
    0 Stimmen
    1 Beiträge
    201 Aufrufe
    Niemand hat geantwortet
  • Hilfe, Batterie Status von Windows Tablet an Iobroker senden

    48
    0 Stimmen
    48 Beiträge
    5k Aufrufe
    M
    @wal Danke genau das war es
  • Photovoltaik Q.Cell Hansol parsen

    javascript communication monitoring
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    U
    @ulli1 Ich habe mit Paser.... [image: 1647777632703-5d4628f3-b931-4898-9a57-18002f93f4d8-image.png] mir die Werte in Infuxdb gezogen und in Grafana weiter verarbeite. [image: 1647777837194-d15a548b-57df-4de7-b461-7624f38765db-image.png] ... an den Feinheiten bin ich noch am arbeiten.
  • Anwesenheit simulieren (Rolladen)

    2
    1
    0 Stimmen
    2 Beiträge
    254 Aufrufe
    paul53P
    @ionar sagte: funktioniert das Skript so? Ja, sollte. Aber 1 Stunde = 3600000 ms.
  • [gelöst] Problem Anwesenheitskontrolle in Blockly

    Verschoben
    10
    3
    0 Stimmen
    10 Beiträge
    4k Aufrufe
    K
    @homoran die Lösung kann so einfach sein. Vielen Dank, jetzt hab ichs auch verstanden
  • Textformatierung Telegram

    3
    0 Stimmen
    3 Beiträge
    363 Aufrufe
    C
    Top , hat geklappt. sendTo("telegram", "send", {text: 'Tagesverbrauch\n\n Aquarium ' +aq+' kWh\n Strom '+strom+' kWh\n PV '+pv+' kWh\n Gas '+gas+' kWh'});
  • Wert in Variable schreiben

    8
    0 Stimmen
    8 Beiträge
    950 Aufrufe
    H
    @paul53 Der Datenpunkt war nur ein Schalter zum ausprobieren. Jetzt passte es, Dankeschön für deine Hilfe
  • Wemos D1 mini - Schrittmotor auslösen

    5
    0 Stimmen
    5 Beiträge
    490 Aufrufe
    B
    @ralla66 Nicht wirklich. Die Treiberbausteine für Schrittmotoren sind nicht wirklich glücklich darüber wenn die Anschlüsse im Betrieb getrennt werden.

375

Online

33.0k

Benutzer

83.5k

Themen

1.3m

Beiträge