Skip to content

Skripten / Logik

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

16.4k Topics 211.6k Posts

NEWS

Subcategories


  • Hilfe für Skripterstellung mit JavaScript

    2k 48k
    2k Topics
    48k Posts
    MartinPM
    Ich habe das Script etwas angepasst - ich habe nur einen Micro-Inverter von FoxEss (Balkonkraftwerk, keine Batterie (deshalb SOC unnötig, und auch keine Lastmessung deshalb Load unnötig) Da der kleine Wechselrichter auch die Erzeugung in kW ausgibt, habe ich das Round angepasst - es kommen dadurch "glatte" Wattwerte (nicht kW) ohne Komma in den Datenpunkt [image: 1763375763629-14b37deb-eed3-4e1f-abd2-b94db89a25c7-grafik.png] /* Dieses Script ruft alle 2 Minuten die FoxESS Cloud über eine RestAPI auf und speichert die aufgerufenen Informationen an die entsprechenden Objekte im IO-Broker. */ const https = require("https") const crypto = require('crypto') const token = "...."; /* Hier muss der API-Key aus der FoxESS Cloud eingefügt werden */ const sn = "...."; /* Hier muss die Seriennummer vom Inverter aus der FoxESS Cloud eingefügt werden */ schedule("*/2 * * * * ", async function () { try { const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower" /*, "generationPower", "SoC", "loadsPower" */ ] }); const path = "/op/v0/device/real/query"; const milliseconds = new Date().getTime(); const signature = crypto.createHash('md5').update(path + "\\r\\n" + token + "\\r\\n" + milliseconds).digest("hex"); const options = { headers: { "Content-Type": "application/json", "token": token, "timestamp": milliseconds, "signature": signature, "lang": "en" }, hostname: "www.foxesscloud.com", method: "POST", path: path, port: 443 } const request = https.request(options, response => { console.log('STATUS: ' + response.statusCode); //response.setEncoding('utf8'); response.on("data", function (res) { // console.log(res); const datas = JSON.parse(res).result[0].datas; console.log(datas[0]); setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000), true); //setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); //setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true); }); }); request.write(data); request.end(); } catch (e) { console.error(e); } }); Meine Planungen für weitere Ergänzungen am Script: Tagesbudget an Queries sparsamer einsetzen a) zwischen Dämmerungsende und Dämmerungsbeginn keine Werte über die API abfragen (da kann es keine Erträge geben). b) bei niedrigen Erträgen ggfs. auch den Leserhythmus abschwächen. Ertrag Vortag einmalig am Folgetag abfragen Ertrag Vormonat einmalig am ersten Tag des Folgemonats abfragen.
  • Hilfe für Skripterstellung mit Blockly

    6k 78k
    6k Topics
    78k Posts
    HomoranH
    Das wird schon klappen! erstens weil's von @paul53 ist, und zweitens weil es richtig ist (wenn dein JSON korrekt ist)
  • Hilfe für Skripterstellung mit Node-RED

    952 13k
    952 Topics
    13k Posts
    HomoranH
    @fiddle said in [Gelöst]: Adapter per {Node Red | JS} (de)aktivieren: vergesse ich womöglich die Box abzuschalten... wofür? [image: 1763381190297-screenshot_20251117-130522_firefox.jpg] bei mir zieht sie 0W. bzw. im Rahmen der Messungenauigkeit
  • Liste/Anzahl aller Elemente mit Rolle = battery.percent

    Moved
    1
    0 Votes
    1 Posts
    235 Views
    No one has replied
  • Hilfe beim Auslesen eines Wertes (iCal)

    Moved
    42
    3
    0 Votes
    42 Posts
    7k Views
    E
    Das habe ich schon probiert. Dann zeigt er genau an, was auf dem Bild ist. Die Termine für heute UND für Morgen (was ja "1" ja ist). "0" eingeben stattdessen brachte auch nicht das ersehnte. Verstehe nicht warum man nicht im Adapter nur die heutigen Tage einstellen kann.
  • Gibt es einen einfachen Test, ob Skripte generell gehen?

    Moved
    3
    0 Votes
    3 Posts
    341 Views
    padrinoP
    Hi, doch, das hatte ich. Vielen Dank für den Hinweis! Jetzt klappen schon einige Sachen - was aber sicher zu weiteren Fragen führt. :? CU, padrino
  • Wert aus javaScript an CCu2 senden

    Moved
    7
    1
    0 Votes
    7 Posts
    610 Views
    sigi234S
    Es funktioniert auch bei mir…........ehrlicherweise weis ich nicht so genau wie ich das hingebracht habe............ [image: 2858_screenshot2__679_.png]
  • Iobroker startet immer mit sudo (nach Raspberry neustart)

    Moved
    1
    0 Votes
    1 Posts
    261 Views
    No one has replied
  • Script für Türöffner

    Moved
    6
    0 Votes
    6 Posts
    825 Views
    D
    Sicherheit ist gut offene Tür noch besser. Kann mir bitte jemand helfen? Morsen ist ein guter ansatz, nur wie setze ich es in einem Skript um :?: :?:
  • Script ausführen geht aufeinmal nicht mehr

    Moved
    12
    2
    0 Votes
    12 Posts
    2k Views
    P
    Hab schon wieder ein Problem..nachdem ich mein Raspberry neustarte und iobroker automatisch startet kommt das Problem wieder.. Iobroker kann ich auch nur mit sudo stoppen ist das richtig? also wenn ich iobroker normal starte mit iobroker start ohne sudo dann geht alles. Wie kann ich das jetzt ändern das iobroker automatisch ohne sudo startet?
  • Script Homematic per ioBroker herunter fahren?

    Moved
    1
    0 Votes
    1 Posts
    289 Views
    No one has replied
  • Variablen in Global mit Blockly?

    Moved
    3
    0 Votes
    3 Posts
    2k Views
    paul53P
    @Michaelnorge: daß bei einem Neustart automatisch der Tagesbetrieb eingestellt ist? ` Im Skript (<u>nicht</u> unter global !) außerhalb von Triggern (Datenpunkt / Schedule) den Wert in den Sollwert-Datenpunkt schreiben. steuere Sollwert mit 20
  • Suche: JavaScript - Counter Verbrauch tageweise

    Moved
    8
    0 Votes
    8 Posts
    809 Views
    paul53P
    Vorschlag (nicht getestet): const idPower = '...'; const idLaufzeit = 'Heizung1.Laufzeit_gestern'; createState(idLaufzeit, 0, {type: 'number', unit: 'min'}); // Datenpunkt für Laufzeit erzeugen var timer = null; var onTime = 0; on(idPower, function(dp) { if(dp.state.val > 100 && dp.oldState.val <= 100) { timer = setInterval(function() { onTime++; }, 1000); // Sekunden } if(dp.state.val <= 100 && dp.oldState.val > 100) clearInterval(timer); }); schedule('59 23 * * *', function() { setState(idLaufzeit, Math.round(onTime / 60), true); // Laufzeit in Minuten onTime = 0; });
  • Taster Sonoff

    Moved
    1
    0 Votes
    1 Posts
    227 Views
    No one has replied
  • [gelöst] Homeatic IP Alarm siren über Script steuern

    Moved
    18
    0 Votes
    18 Posts
    2k Views
    S
    Super so hat es geklappt. Alarmtröte dudelt schön, nur meine LED blinkt leider nicht, da waren die Lötpunkte aber auch echt enge. Vielen Dank für eure Hilfe
  • Zwischenwert mit Blockly

    Moved
    8
    1
    0 Votes
    8 Posts
    828 Views
    DutchmanD
    Variablen in ioBroker (objecte genannt) oder homematic brauchst du nur wen du die Variable außerhalb des Scripts sehen/abfragen möchtest. In diesem Fall reicht es wenn du die Variable im Script lässt, dafür gibt es einen Baustein. Möchtest du den Wert auch benutzen um zB in VIs an zu zeigen daß der Behälter voll ist erstellenä Dan ein object. (In blockly gibt es da auch einen Baustein für, object wird Dan unter JavaScript.0>object Name< erstellt) Sent from my iPhone using Tapatalk
  • Mit Blockly ein Adapter neustarten

    Moved
    11
    0 Votes
    11 Posts
    4k Views
    J
    So Sigi, jetzt weiß ich endlich was Du meinst. Problem mit Deiner Antwort, es ist VIS und da habe ich noch überhaupt nix mit gemacht. Deshalb war das auch ein Rätsel was Du damit meinst.
  • [Beispiel]Skript errechnet Tage bis Termin

    Moved javascript template
    2
    1
    0 Votes
    2 Posts
    2k Views
    B
    Hallo, ich verwende dieses Script. // Annahme ist, dass jede Müllart mindestens einmal im Monat abgeholt wird. Nicht getestet und eventuell problematisch ist es, wenn Müll seltener abgeholt wird. // Ursprung: tempestas // Erweiterung: PicNic // http://forum.iobroker.net/viewtopic.php?f=21&t=3351&p=92282#p92282 //debug in Log ausgeben debug = true; // Anlegen JS State für VIS createState('javascript.0.muell.json', 0); // Array für Suchvariablen und Farbe des Müll-Icons var obj = { "Papiertonne": "darkblue"}; function muell(){ // Kalender auslesen (HTML Format) // ************************************************************************************** // Termine auswerten aus html. Bereinigung der HTML Tags und Konvertierung in Plain Text // ************************************************************************************** var inhalt = getState("ical.0.data.html"/*HTML iCal table*/); // an deinen eigenen Kalender anpassen var inhaltString = inhalt.val.toString(); var inhaltStringReplace = inhaltString; var inhaltStringText; var i_search; // remove all inside SCRIPT and STYLE tags inhaltStringReplace=inhaltStringReplace.replace(/<script.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, ""); inhaltStringReplace=inhaltStringReplace.replace(/<style.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, ""); // remove BR tags inhaltStringReplace=inhaltStringReplace.replace(/ /gi, ""); inhaltStringReplace=inhaltStringReplace.replace(/<br\s\>/gi, ""); inhaltStringReplace=inhaltStringReplace.replace(/<br\>/gi, ""); // remove all else inhaltStringReplace=inhaltStringReplace.replace(/<(?:.|\s)*?>/g, ""); // get rid of html-encoded characters: inhaltStringReplace=inhaltStringReplace.replace(/ /gi," "); inhaltStringReplace=inhaltStringReplace.replace(/&/gi,"&"); inhaltStringReplace=inhaltStringReplace.replace(/"/gi,'"'); inhaltStringReplace=inhaltStringReplace.replace(/</gi,'<'); inhaltStringReplace=inhaltStringReplace.replace(/>/gi,'>'); if(debug) log(inhaltStringReplace); // n-ten Treffer finden function nthIndex(str, pat, n){ var L= str.length, i= -1; while(n-- && i++ <l){ i="str.indexOf(pat," i);/if/(i/</0)/break;/}/i_search="i;" funktion/zum/tage/im/monat/zählen/function/daysinmonth(month,/year)/{/return/new/date(year,/month,/0).getdate();/wochentage/auf/deutsch/var/wochentag="['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'" ];/json/starten/muelljason="[" ;/schleife/zur/abarbeitung/des/arrays/object.keys(obj).foreach/(function/(val,/key)/","/trennung/der/daten/json./sollte/nur/eine/müllart/angegeben/sein,/dann/die/nächsten/drei/zewilen/auskommentieren/(key="">0) { muellJason += ","; } // Zuweisung der Farbe für das MüllIcon var iconColor = obj[val]; var muellIcon = " <svg class="icon dustbin &quot;+iconColor+&quot;" data-txt="dustbin@&quot;+iconColor+&quot;" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="35" height="35" viewBox="0 0 468 468" id="svg2996"><metadata id="metadata2998"> Created by potrace 1.8, written by Peter Selinger 2001-2007 <rdf:rdf> <cc:work rdf:about=""> <dc:format>image/svg+xml</dc:format> </cc:work> </rdf:rdf> </metadata></svg> "; // Position bestimmen var pos = inhaltStringReplace.indexOf( val, 1); if(debug) log("pos ist: "+pos); var inhaltStringText = inhaltStringReplace.substring((pos-13),pos-3); if(debug) log("Datum ist: "+inhaltStringText); nthIndex(inhaltStringText, ".", 1); var t_m = inhaltStringText.slice(0, i_search); var pos1 = i_search+1; if(debug) log("pos1: " +pos1 ); nthIndex(inhaltStringText, ".", 2); var m_m = inhaltStringText.slice(pos1, i_search); var pos2 = i_search+1; if(debug) log("pos2: " +pos2 ); var j_m = inhaltStringText.slice(pos2, inhaltStringText.len ); // Datum des Abholtages setzen um den Wochentag zu ermitteln var muelldate = new Date(j_m,m_m-1,t_m); // Hier kommt der Wochentag :-) var d = muelldate.getDay(); if(debug) log("Mülldate ist: "+wochentag[d]+", "+muelldate ); if(debug) log("Mülltag ist: "+t_m +" , " +m_m +" , " +j_m); // Datum heute ermitteln var today = new Date(); if(debug) log(today); //Tag ermitteln var t = today.getDate(); // Wochentag ermitteln zum testen var dd = today.getDay(); //Monat ermitteln var m = today.getMonth()+1; //Jahr ermitteln var j = today.getFullYear(); if(debug) log("Datum heute ist: "+wochentag[dd]+", "+t+m+j); // Berechnung Tagesdifferenzen var diff = 0; var tage = ""; var dim = DaysInMonth(m, j); // Tage des aktuellen Monats if(debug) log("Tage aktueller Monat: "+dim); if(j_m > j || m_m > m) { // Prüfung: Jahr_Müll größer als aktuelles Jahr? Relevant bei Jahreswechsel ODEr Monat Müll größer aktueller Monat? diff = parseInt(dim) - parseInt(t) + parseInt(t_m); } else diff = parseInt(t_m) - parseInt(t); if(debug) log("Tage bis zum nächsten Müll: "+diff); if(!isNaN(diff)){ tage = diff } else { tage = "Heute"; } muellJason += "{\"Müllart\":\" "+val+"\",\"Tage\":\""+tage+"\"}"; // PASS DIR AN WIE DU WILLST: \"Ereignis\":\""+muellIcon+"\", \"Tag\":\""+wochentag[d]+"\",\"Datum\":\""+inhaltStringText+"\", }); // Ende forEach // json schließen muellJason += "]"; // und hier nun die Werte eintragen setState('javascript.0.muell.json', muellJason); log("Müllkalender aktualisiert!"); } schedule('30 5 * * *', function(){ // morgens um 5.30h wird aktualisiert muell(); }); // bei Start muell();</l){></br\></br\s\></style.*></script.*> Mein Jason sieht so aus. Heute Wertstoffhof geöffnet Heute Biotonne Morgen Wertstoffhof geöffnet Übermorgen Papiertonne In 5 Tagen Wertstoffhof geöffnet In einer Woche Wertstofftonne In einer Woche Wertstoffhof geöffnet Wie bekomme ich die Tage in das jason? Was mache ich falsch?
  • Runden in Blockly

    Moved
    6
    1
    0 Votes
    6 Posts
    7k Views
    S
    Funktioniert super so (in diesem Fall auf 3 Nachkomma) [image: 5988_bitmap.png]
  • [gelöst]Wie kann ich mcrypt in node-red benutzen?

    Moved
    10
    0 Votes
    10 Posts
    2k Views
    T
    Ich habe herausgefunden wie es geht: Hier die Lösung, wie mcrypt (oder andere module) in node-red eingebunden werden können.Die Schritte: 1. installieren von mcrypt: cd /opt/iobroker/node-modules/iobroker.node-red npm install mcrypt 2. Anpassen der settings.js unter /opt/iobroker/iobroker-data/node-red Ganz am Ende mcrypt einfügen: ! functionGlobalContext: { ! // ! mcrypt:require("/opt/iobroker/node_modules/iobroker.node-red/node_modules/mcrypt") ! // os:require('os'), ! // bonescript:require('bonescript'), ! // arduino:require('duino') ! } 3. In der Function node wo mcrypt verwendet werden soll statt "require" mcrypt mit "global.get" referenzieren: var mcrypt = global.get('mcrypt'); Dann kann mcrypt ganz normal verwendet werden. z.B. zum Verschlüsseln: ! var mcrypt = global.get('mcrypt'); ! var key = " …hex-wert..."; ! var aeskey = new Buffer(key, 'hex'); ! var MCrypt = mcrypt.MCrypt; ! var Ecb = new MCrypt('rijndael-128', 'ecb'); ! Ecb.open(aeskey); ! var post = Ecb.encrypt(msg.payload).toString('base64'); ! msg.payload = post;
  • Sonnenprogramm

    Moved
    53
    1
    0 Votes
    53 Posts
    3k Views
    M
    Hi Paul, das war es glaube ich … zumindest kommt die warnung nicht mehr. Aber für einen Funktionstest war zu wenig Sonne. Zumidest sind die Rollos nicht wild rumgefahren, soweit alles gut... Vielen Dank
  • Trigger mit Bedingung so möglich?

    Moved
    4
    1
    0 Votes
    4 Posts
    495 Views
    paul53P
    @bergjet: ich dachte vielleicht kann man auch einen bestimmten Wert triggern. ` Kann man in Javascript (valLe: 1). In Blockly ist man auf die Auswahl beschränkt. [image: 493_blockly_triggermodi.jpg]
  • Wert aus Google Assistant über IFTTT als Trigger in Szene

    Moved
    9
    0 Votes
    9 Posts
    1k Views
    A
    Nun läuft es plötzlich…warum auch immer...es gibt stundenlang nicht... Hab übrigens einen Logikfehler festgestellt - in der Ausgabe des Applets von IFTTT habe anstatt $# nun $00# gemacht, da das Skript bei einstelligen Angaben immer den letzten Buchstaben mitgezogen hat und die Eingabe in das Rollladen-Objekt natürlich nicht zu lässig ist. Genauso muss ich das SKript auf die letzten drei Stellen erweitern, damit auch 100% als Angabe funktioniert. Danke auch wenn es nun von allein geklappt hat

752

Online

32.4k

Users

81.4k

Topics

1.3m

Posts