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
    D
    @ArnoD Nein im Log sehe ich keinenfehler was das betrifft. Habe nur den Node js aktualisiert und den ganzen PC neu gebootet (hätte ich das nicht tun sollen?) Was ich seit längerem (seit charge control läuft) habe ist 4 warn. ERROR WB_REQ_ENERGY_ALL ERROR WB_REQ_PM-POWER_L1 ERROR WB_REQ_PM-POWER_L2 ERROR WB_REQ_PM-POWER_L3 kann mann die irgend wie abschalten oder instandstellen?
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    paul53P
    @Mestro [sagte]: wenn nach 18:30 die 1x die Haustür geöffnet wird, eine Sprachausgabe gestartet wird ! Danach erst wieder am nächsten Tag [image: 1777039077509-blockly_temp.jpg]
  • Hilfe für Skripterstellung mit Node-RED

    955 13k
    955 Themen
    13k Beiträge
    mickymM
    @Tontechniker Man kann solche Filter aber auch OHNE neue Nodes zu installieren mit einfachen Standard-Switch Nodes realisieren: [image: 1776865319208-af3cab3c-2716-43f4-b7df-7f74e8bf051b-image.jpeg] ggf. einfach nochmal meinen alten Thread anschauen: https://forum.iobroker.net/topic/50086/datum-und-zeitverarbeitung-mit-nodered
  • [gelöst] Gelegentlich Fehler bei Homematic

    21
    0 Stimmen
    21 Beiträge
    2k Aufrufe
    grrfieldG
    @rene55 Ich meinte alle Rollos, die in der Direktverknüpfung sind. Ich persönlich finde es schöner, wenn alle (zumindest in einem Raum) geleichzeitig arbeiten - ist aber Geschmackssache.
  • *Erledigt* JSON Parsen

    7
    0 Stimmen
    7 Beiträge
    432 Aufrufe
    Stephan SchleichS
    @liv-in-sky Perfekt, Vielen Dank
  • 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
    288 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
    167 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
    316 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
    254 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
    602 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
    147 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
    708 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
    420 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
    702 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
    714 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
    469 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
    170 Aufrufe
    Niemand hat geantwortet
  • Hilfe, Batterie Status von Windows Tablet an Iobroker senden

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

    javascript communication monitoring
    6
    0 Stimmen
    6 Beiträge
    1k 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
    214 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
    298 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'});

446

Online

32.8k

Benutzer

82.8k

Themen

1.3m

Beiträge