Weiter zum Inhalt

Skripten / Logik

16.7k Themen 215.9k 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
    G
    @gto Ich habe aus ästhetischen Gründen zwei Scripts gemacht. Ich mag große Monolithen nicht. Und da hier zwei einigermaßen deutlich unterscheidbare Zwecke zu sehen waren, habe ich auch zwei Scripte daraus gemacht. Technisch könnte man das auch in eins nehmen. Da nichts zu überwachen ist, wenn der Shelly nicht eingeschaltet wurde, braucht man auch beide Scripte aktiv. Der SwitchOnOff.ts behandelt die Anfangswerte, mit denen gestartet wird. Speichert den Zustand des Shelly und setzt die Annahmen an den Ist-Ladezustand und Soll-Ladezustand. Außerdem überwacht es, ob per IOBroker oder auf anderem Wege eingeschaltet wurde. Nach dem Einschalten könnte man dieses Script beenden. Aber warum sollte man das tun? Der Timer "BatteryMonitor.ts" schaltet aus, mit was immer zuerst erreicht wird: Der gewünschte Ladezustand oder das Absinken der Ladekennlinie. Man kann also derzeit auch keine 100% Füllzustand einstellen, fällt mir bei der Frage auf, da die Kennlinie das Laden ja vorher stoppt. Diese Möglichkeit muss ich wohl auch noch einbauen. Denn ab und zu soll ja eine LIB/LFP-Batterie zu hundert Prozent geladen werden, um dem BMS zu ermöglichen, den Füllstand sauber zu bestimmen. Ich habe aber das Einschalten des Ladevorgangs am Steckdosenschalter wieder ermöglicht. Man kann die Kontrolle darüber jetzt in den Uservariablen unter dem Namen ".AppControlledSwitchOn" ein bzw ausschalten. "True" bedeutet hier, Einschalten nur über IOBroker, "False" lässt das Schalten auch über den Stecker zu. BatteryMonitor.ts SwitchOnOff.ts EBikeAkkuSetup.ts
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    W
    Funktioniert wunderbar, aber jetzt jetzt hänge ich an ner anderen Kleinigkeit. Der Wert kommt ja von evcc. Dort wird mir auch der Min, der Max und der Mittelwert der nächsten 5 Tage angezeigt. Im json stehen aber leider die Daten +- 5 Tage. Also auch 5 Tage in die Vergangenheit. Wie lese ich im json denn nur Werte von aktuell bis Ende? [image: 1786597510058-13-08-2026_07-00-59.png] [image: 1786597529062-13-08-2026_07-01-43.png]
  • Hilfe für Skripterstellung mit Node-RED

    964 13k
    964 Themen
    13k Beiträge
    A
    @OliverIO Für mich als ex. Elektroninstallateur ist es eben vielfach einfacher in einer Maske zu sehen was der Code eigentlich machen sollte, als in einem strukturierten Text. Wir verwenden bei uns im Job auch sehr viel strukturierte Text für Steuerungsfunktionen, aber das ist in der Regel eine andere Abteilung, ich bin nur zuständig, dass die Elektropläne korrekt und vollständig für alle sind. Klar, dass interesse an den Möglichkeiten ist schon lange geweckt, aber wie bei allem, wenn man das nicht oft macht, vergisst man sehr vieles wieder. Bei mir ist entstehen solche Dinge eben manchmal aus "dummen" Ideen, oder eben aus "herausforderungen" die man nicht direkt sucht. Ich arbeite mich jetzt mal rund um und schaue was da raus kommt. Nochmals herzlichen Dank Gruss Andi (aus der überhitzten Schweiz)
  • Node-RED Werte aus M-Bus XML Datei auslesen

    Verschoben
    3
    4
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    G
    Hallo Markus, vielen Dank für deine Rückmeldung. Genauso ist es, dass habe ich gestern Abend auch noch herausgefunden. Mein Gefühl, es muss doch einfacher gehen, hatte mich also nicht getäuscht. Kopiert man den path Inhalt so sieht dieser wie folgt aus: payload.MBusData.DataRecord[2].Value[0] Um den Wert in der Array nun weiter verarbeiten zu können, hätte ich dem kopierten Inhalt also nur noch das msg. vorsetzen müssen. Bitte nicht wundern, ich bin inzwischen wieder zum realen Projekt zurückgekehrt, deshalb sieht der Inhalt des JSON Objekt bei mir jetzt ein wenig anders aus. Ziel meines Projektes ist es, aus einem Meter Bus die Daten der angeschlossenen Feldgeräten, wie Energie- und Wärmezähler, auf Anforderung auslesen zu können. Diese dann in ein Modbusregister zu schreiben und durch einen zentralen Regler auszulesen. Das Auslesen der an den Meter Bus angeschlossenen Geräte und das Schreiben des xml-Datenfiles erfolgt mit Hilfe der libmbus libary von rscada auf einem RaspberryPi3. Es freut mich sehr, dass ich hier jemanden gefunden habe, der sich offensichtlich in Node-Red gut auskennt. :D Danke nochmals für deine Hilfe. Gruß Garf
  • Problem mit getEnums()

    Verschoben javascript
    12
    1
    0 Stimmen
    12 Beiträge
    3k Aufrufe
    Jey CeeJ
    Hab das Problem gefunden die enum hatte einfach einen falschen Namen.
  • Blockly-Anfänger braucht einen Tip

    Verschoben
    16
    1
    0 Stimmen
    16 Beiträge
    3k Aufrufe
    I
    aahhhh….. das hat jetzt geklappt, dann werden wir mal sehen. Danke und Grüße Ingo
  • Schalter anlegen und Wert setzten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    AlCalzoneA
    So direkt geht das meines Wissens nach nicht. Für Adapter gibts addStateToEnum, im JS-Adapter existiert sowas nicht. Edit: bei aktiviertem setObject könnte das funktionieren (ungetestet, Benutzung auf eigene Gefahr!) var newStateId = "..."; // die ID deines neuen States var enumName = "enum.rooms.Wohnzimmer"; // die ID der Enum var enum = getObject(enumName); if (enum) { var pos = enum.common.members.indexOf(newStateId); if (pos === -1) { enum.common.members.push(newStateId); enum.from = "system.adapter." + namespace; enum.ts = new Date().getTime(); setObject(enumName, enum); } } else { // hat nicht funktioniert... } Das setzt voraus, dass die Enum für den Raum schon existiert.
  • [Frage] Einfaches Script verursacht JS Absturz - Warum

    Verschoben
    30
    0 Stimmen
    30 Beiträge
    6k Aufrufe
    B
    Hi, ich habe für mich eine Lösung gefunden. Ich habe den Ping Adapter installiert und frage die Erreichbarkeit des Gerätes ab. [image: 654_unbenannt.png] Gruß Lars
  • [Problem] javascript stürzt bei request() ab

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    2k Aufrufe
    MeistertrM
    @ein-bayer: Hallo Meistertr, hast du es mitlerweile hinbekommen? Habe auch Hyperion am laufen und würde es gern per vis Befehl aus bzw einschalten. Könntest du mir kurz erklären wie du Hyperion angesprochen hast? ` Ja nach langem probieren hat es geklappt hier mein script: ! ```` // Zum Ansteuern von Hyperion // Copyright by Meistertr //Version 0.2 ! createState('ambipi.on', false); createState('ambipi.clear', false); createState('ambipi.color'); createState('ambipi.tvmode',true); createState('ambipi.effects'); createState('ambipi.sel_effect'); ! var logging = true; var ip = "ambipi"; //hier die IP oder den Hostname var port = 19444; // Port vin Hyperion nicht ändern var onByOther = false; ! var eff = "Cinema brighten lights;Cinema dim lights;Knight rider;Blue mood blobs;Cold mood blobs;Full color mood blobs;Red mood blobs;Green mood blobs;Warm mood blobs;Police Lights Single;Police Lights Solid;Rainbow mood;Rainbow swirl fast;Rainbow swirl;Running dots;System Shutdown;Snake;Sparks Color;Sparks;X-Mas"; ! setState("javascript.0.ambipi.effects",eff); ! var net = require('net'); ! function sendMessage(message) { var client = net.connect({host:ip, port: port}, function () { ! if(logging)console.log('connected to server!'); try{ client.write(message); }catch(e){ console.log("Konnte Wert nicht an Ambipi senden, Fehler: " + e); } }); } ! subscribe({id:"javascript.0.ambipi.color"}, function (obj) { if (obj.newState.val != obj.oldState.val){ onByOther=true; var r = parseInt(obj.newState.val.substr(1, 2), 16); var g = parseInt(obj.newState.val.substr(3, 2), 16); var b = parseInt(obj.newState.val.substr(5, 2), 16); console.log(r +" "+g+ " "+b); if(logging) log(" Ambipi: Die Farbe wurde auf "+ r + g + b + " gesetzt" ); sendMessage('{ "color": ['+ r +','+ g +','+ b +'], "command": "color", "priority": 100 }\r\n'); if(obj.newState.val !== "#000000")setState("javascript.0.ambipi.on", true); } ! }); ! subscribe({id:"javascript.0.ambipi.on"}, function (obj) { if (obj.newState.val === true && onByOther === false){ turnON(true); } else if(obj.newState.val === false){ turnON(false); } ! }); ! subscribe({id:"javascript.0.ambipi.sel_effect", valNe:""}, function (obj) { if (obj.newState.val !== obj.oldState.val) { onByOther= true; sendMessage('{ "command": "effect", "effect": {"name": "'+ obj.newState.val +'"}, "priority": 100 }\r\n'); if(logging) log(" Ambipi: Ambipi auf Effect " + obj.newState.val + " geschaltet" ); setState("javascript.0.ambipi.on", true); ! } else { ! } }); ! subscribe({id:"javascript.0.ambipi.clear", value:true}, function (obj) { if (obj.newState.val ===true && getState("javascript.0.ambipi.on").val ){ sendMessage('{"command": "clear", "priority": 100 }\r\n'); if(logging) log(" Ambipi: Set to default" ); setState("javascript.0.ambipi.sel_effect",""); } }); ! subscribe({id:"hm-rpc.1.CUX2803003.1.STATE"/TV:1.STATE/}, function (obj) { if (obj.newState.val ===true){ ! setState("javascript.0.ambipi.on", true); turnON (true); if(logging) log(" Ambipi: wurder durch TV eingeschaltet" ); } if (obj.newState.val ===false){ turnON (false); setState("javascript.0.ambipi.on", false); if(logging) log(" Ambipi: wurder durch TV ausgeschaltet" ); } }); ! function turnON (param){ if (param === true) { sendMessage('{"command": "clear", "priority": 100 }\r\n'); if(logging) log(" Ambipi: Ambipi wurde angeschaltet" ); } else { sendMessage('{ "color": [0,0,0], "command": "color", "priority": 100 }\r\n'); if(logging) log(" Ambipi: Ambipi wurde abgeschaltet" ); setState("javascript.0.ambipi.sel_effect",""); onByOther=false; ! } } ! ````
  • Sayit-Adapter sayit.N.tts.cachetext in Blockly nicht verfuegbar?

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    640 Aufrufe
    Niemand hat geantwortet
  • Datenpunkt berechnen

    Verschoben
    70
    1
    0 Stimmen
    70 Beiträge
    17k Aufrufe
    HomoranH
    Ich muss diesen Thread mal wieder nach oben holen. Mein Wechselrichter war ausgefallen/defekt und da dieser Flow ständig Ergebnisse lieferte, die ich nicht gebrauchen konnte, hatte ich ihn gelöscht, ohne zu wissen, dass da per mqtt alle anderen Rechner dranhingen :( Shit happens- Jetzt habe ich einen neuen WR, der aber mit der neuen Firmware (5.4) ausgestattet ist. Auch wenn @Paul53 dazu bereits in einem anderen Thread eine js-Lösung vorgestellt hat, möchte ich es nochmal mit node-red versuchen. Wenn ich jetzt per hhtp-request aufrufe: http://<ip>/api/dxs.json?dxsEntries=33556736&dxsEntries=33555203&dxsEntries=33555459&dxsEntries=67109120</ip> erhalte ich im Browser: {"dxsEntries":[{"dxsId":33556736,"value":1853.714966},{"dxsId":33555203,"value":886.787903},{"dxsId":33555459,"value":966.926941},{"dxsId":67109120,"value":1738.264160}],"session":{"sessionId":0,"roleId":0},"status":{"code":0}} auf rexex101.com erhalte ich ein Array mit den Werten über value":(\d+.\d+) wenn ich einen xml-node benutze erhalte ich wenn ich das richtig interpretiere, die Ergebnisse schön aufgelistet. "<root><dxsentries><dxsid>33556736</dxsid><value>1154.386597</value></dxsentries><dxsentries><dxsid>33555203</dxsid><value>546.535339</value></dxsentries><dxsentries><dxsid>33555459</dxsid><value>607.851196</value></dxsentries><dxsentries><dxsid>67109120</dxsid><value>1081.819824</value></dxsentries><session><sessionid>0</sessionid><roleid>0</roleid></session><status>`0`</status></root>" jetzt will ich nur noch die Werte zwischen <value>…</value> auf verschiedene DPs ausgeben, bekomme es aber ums verrecken nicht mehr hin diese Ausgabe zu splitten. Nehme ich statt dessen einen json-node erhalte ich: msg.payload : Object { dxsEntries: array[4], session: object, status: object } nur an den Inhalt des Arrays komme ich nicht :( Sorry Rainer
  • Hat sich erledigt - bitte loeschen

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    543 Aufrufe
    Niemand hat geantwortet
  • Ausschalttimer Restzeit [Blockly]

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    3k Aufrufe
    DutchmanD
    @Schubi: Okay - ja ich hab die Logik noch nicht so recht verstanden. Meinst du diesen Beitrag: http://forum.iobroker.net/viewtopic.php … =40#p63514 Ich werde mir das morgen genauer ansehen - jetzt mach ich mal Schluss für Heute. Danke schon mal für den Hinweis. ` genau :), musst halt nur die zeiten anpassen und ein bisschen rumspielen bis es passt aber die basis steht da. und wen es nicht weitergeht einfach wieder fragen dafuer ist das forum ja da ! :)
  • Objekttyp Button per Script ändern

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    AlCalzoneA
    @0018: wie kann ich ein Objekttyp "Button" welche vom Harmony Hub angelegt werden, per Script ändern? Funtioniert dieses genauso wie bei Typ boolean mit setState(Objekt, Wert) ? ` Willst du den Typ des Objekts ändern oder den Wert? Letzteres geht mit setState(id, true) Im Prinzip kennt ein Button nur true als Wert und wird betätigt bei Aktualisierung des Werts.
  • Math.abs() in Script / Funktion

    Verschoben
    7
    1
    0 Stimmen
    7 Beiträge
    3k Aufrufe
    R
    > Erwartest du negative Zahlen? Dann brauchst du es, sonst nicht. Nein in meinem Fall erwarte ich sie nicht. Konkret geht es um eine uptime Formatierung. Da reicht parseInt() oder Math.floor(). Ich habe eher gedacht, es gibt eine integer() Funktion und ich find sie bloß nicht. Habs jetzt so gelöst: //hours var h = Math.floor(msg.payload.uptime/3600) ; //rest minutes var mm = msg.payload.uptime % 3600 //minutes var m = Math.floor(mm/60); //seconds var s = (mm % 60); //uptime as string msg.payload = "uptime: " + h + " h " + m + "min " + s + "sec"; return msg; Weis zwar nicht ob es optimalere Lösungen gibt, aber tut erst mal;-)
  • [gelöst]Briefkasten Abfrage Code vereinfachen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    P
    Hallo Paul, danke für dein Skript. Natürlich kann man die Erkennung des Status in eine extra Funktion packen. Die Verzögerung ist nötig, denn die Sensoren lösen im Fall, dass vor allen ein Brief liegt, nacheinander aus. Der erste nach 1s, der zweite nach 2s, der dritte nach 3s. Daher warte ich 3.5s und lesen dann den Status von allen dreien ein. Schließlich hüpfen die Brief auch nicht so schnell wieder raus :lol: Wenn der Bote eine größere Zeitung einsteckt, wird nur der obere Sensor (TFK1) ausgelöst. Beim kleinen Karten evtl. nur der linke untere oder der rechte untere (2 und 3). Gruß Pix
  • Tr-064 command state für weitere Fritzbox Daten

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    6k Aufrufe
    E
    @Meistertr: da ich auch auf der suche war, hab ich es gerade herausgefunden: {"service": "urn:dslforum-org:service:WANCommonInterfaceConfig:1","action": "GetTotalBytesSent","params": {}} ````lifert das ergebnis ` Kannst du mir sagen wie du die Anfrage machst?
  • Problem mit Konvertierung von Buffer()

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    2k Aufrufe
    N
    Moin, dein Beitrag hat mich zum Umdenken gebracht. Dafür vielen Dank. Nach dem Wechsel von Telnet auf TCP habe ich die Probleme in den Griff bekommen und habe nun die ersten Werte zurückerhalten. Das ist übrigens daraus entstanden: http://forum.iobroker.net/viewtopic.php?f=30&t=8803
  • Hilfe: Variable URL erstellen

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    716 Aufrufe
    AlCalzoneA
    @Zippolighter: Hier erhalte ich nie den Wert sondern nur den String "parser.0.kodi" Kann mir bitte jemand sagen wie ich den Inhalt in die URL bekomme. Stehe da voll auf dem Schlauch ` Na du schreibst ja auch den String da rein und nicht den Inhalt des States: > [http://192.168.1.7:8081/jsonrpc?request … layer.open](http://192.168.1.7:8081/jsonrpc?request=%7B%22jsonrpc%22:%222.0%22,%22method%22:%22player.open)", "params": {"item": {"file":getState("parser.0.kodi").val}}} Keine Garantie dass das 1:1 so funktioniert, da ich nicht weiß, wie du diese URL im Skript zusammensetzt.
  • Licht mit BWM schalten Verz. löschen falls läuft

    Verschoben Gelöst blockly
    13
    1
    0 Stimmen
    13 Beiträge
    4k Aufrufe
    DutchmanD
    @RalfR72: Ok aber stört ja nicht. Danke dir vielmals, denke das Hauptproblem war mit der Ausschaltverz. Nun mit Timeouts. Super schöne Nacht noch. Gesendet von iPhone mit Tapatalk ` Jup nur ich bin faul wenn ich Blöcke/Code sparen kann [emoji13] Good night! –----------------------- Send from mobile device
  • ESP8266 und WS2812 / WS2811 Steuerung MQTT - Gartenbeleuchtung

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    3k Aufrufe
    N
    @Marcolotti: Hallo Kai, wie wäre es damit? https://www.aliexpress.com/item/DC5-12V … .45.y2pej5 und damit: https://www.nodo-shop.nl/en/rflink-gate … tenna.html Gruß Marco ` Kann ich den Controller vollständig in IoBroker steuern?
  • Ausgabe von SayIt umbauen und in anderen Objekt State schreiben

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    N
    Okay, folgender Code hat funktioniert: setState (idSayIt,' " ' + 'Anruf von. ' + rufnummer2name(getState(idAnrufer).val) + ' " '); Vielen Dank, Du hast mir jetzt sehr geholfen. Gruss, Nanouk
  • Array durchlaufen und Inhalt erweitern?

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    593 Aufrufe
    C
    Erledigt :)

277

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge