Weiter zum Inhalt

Skripten / Logik

16.7k Themen 215.6k 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
    J
    Hallo, anbei das nun fertige Skript im ersten Post.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    paul53P
    @tiobb [sagte]: wie kann man das lösen? Wenn man Werte auswertet, macht es keinen Sinn, diese im Minutentakt abzufragen. Man sollte auf die Datenpunkte triggern (mit "ist kleiner als letztes"). Dann muss man auch nicht die Meldung basteln, denn auch wenn auf eine Liste von IDs getriggert wird, kann immer nur ein DP zur gleichen Zeit triggern. EDIT: Prinzip mit 3 Sensoren: [image: 1784910380833-blockly_temp.jpg] Wenn die Batteriespannung weiter sinkt, werden erneut Meldungen erzeugt. Will man das nicht, muss man auch den vorherigen Wert prüfen: [image: 1784913791255-blockly_temp.jpg]
  • Hilfe für Skripterstellung mit Node-RED

    961 13k
    961 Themen
    13k Beiträge
    Marc BergM
    Man kann einen Flow von außen neu starten, indem man ihn per API deaktiviert und wieder aktiviert. Nicht sehr elegant, aber geht. Hier ein Flow dazu, das könnte man auch im Skript abbilden (hostname und Flow-ID im Inject Node anpassen: [ { "id": "0101b52dd8b0e69c", "type": "inject", "z": "tab_restart", "name": "Flow neu starten", "props": [ { "p": "baseUrl", "v": "http://nuc.fritz.box:1880", "vt": "str" }, { "p": "flowId", "v": "56a35d28dbb8d4c1", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "", "x": 160, "y": 140, "wires": [ [ "ffb73632947a1b74" ] ] }, { "id": "ffb73632947a1b74", "type": "http request", "z": "tab_restart", "name": "GET /flow/:id", "method": "GET", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 370, "y": 140, "wires": [ [ "78e47724692d9c26" ] ] }, { "id": "78e47724692d9c26", "type": "change", "z": "tab_restart", "name": "deaktivieren", "rules": [ { "t": "set", "p": "flow", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "flow.disabled", "pt": "msg", "to": "true", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "flow", "tot": "msg" }, { "t": "set", "p": "headers", "pt": "msg", "to": "{}", "tot": "json" }, { "t": "set", "p": "headers.content-type", "pt": "msg", "to": "application/json", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 570, "y": 140, "wires": [ [ "b570b346c80301a6" ] ] }, { "id": "b570b346c80301a6", "type": "http request", "z": "tab_restart", "name": "PUT (aus)", "method": "PUT", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 770, "y": 140, "wires": [ [ "a062c2baa0932d3e" ] ] }, { "id": "a062c2baa0932d3e", "type": "delay", "z": "tab_restart", "name": "1s warten", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "outputs": 1, "x": 960, "y": 140, "wires": [ [ "664a32887d83b305" ] ] }, { "id": "664a32887d83b305", "type": "change", "z": "tab_restart", "name": "aktivieren", "rules": [ { "t": "set", "p": "flow.disabled", "pt": "msg", "to": "false", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "flow", "tot": "msg" }, { "t": "set", "p": "headers", "pt": "msg", "to": "{}", "tot": "json" }, { "t": "set", "p": "headers.content-type", "pt": "msg", "to": "application/json", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 140, "y": 220, "wires": [ [ "83d399c90d46240f" ] ] }, { "id": "83d399c90d46240f", "type": "http request", "z": "tab_restart", "name": "PUT (ein)", "method": "PUT", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 320, "y": 220, "wires": [ [ "529c0e1896d1f278" ] ] }, { "id": "529c0e1896d1f278", "type": "debug", "z": "tab_restart", "name": "Ergebnis", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 480, "y": 220, "wires": [] } ]
  • sh script zwecks reboot

    1
    1
    0 Stimmen
    1 Beiträge
    206 Aufrufe
    Niemand hat geantwortet
  • Datenpunkt schalten wenn Licht an oder aus ist

    6
    1
    0 Stimmen
    6 Beiträge
    348 Aufrufe
    paul53P
    @mico sagte: die sollen dann andere Sachen schalten über Scripte wenn das Licht eingeschaltet wird; Weshalb können das nicht die Alias-DP? Die DP unter "0_userdata.0" sind unnötig, wenn sie nur den einzelnen Licht-Wert abbilden. Übrigens macht man es mit 8 Einzel-Triggern, was enorm Ressourcen spart: [image: 1697816889421-blockly_temp.jpg]
  • Wärmeplatte Kunstglucke / PWM / PID-Regler

    23
    0 Stimmen
    23 Beiträge
    1k Aufrufe
    B
    @paul53 sagte in Wärmeplatte Kunstglucke / PWM / PID-Regler: Soll ein bestimmter Sollwert eingehalten werden Das wollte ich damit ausprobieren. Es geht nicht nur um die schlechte Luft, sondern auch um beschlagene Fensterscheiben. Da bin ich am Testen ab wann die Scheiben beschlagen. Ich wollte noch nicht den Taupunkt ins Spiel bringen. Ich hoffe das es auch so geht. Danke für die Hilfe.
  • Warmwasser schalten mit PV Überschuss

    71
    1
    0 Stimmen
    71 Beiträge
    13k Aufrufe
    J
    @paul53 DANKEEE
  • Fehler im Script

    javascript
    3
    1
    0 Stimmen
    3 Beiträge
    149 Aufrufe
    paul53P
    @ticaki sagte: newState.val ist, ist das ein Alias für state.val? Ja, newState ist die ältere Version.
  • Ordner im Skript Verzeichnis werden nicht angezeigt

    3
    2
    0 Stimmen
    3 Beiträge
    345 Aufrufe
    J
    @djmarc75 Danke Manchmal ist es einfacher als man denkt.
  • Kostal Plenticore prognosebasiertes Batterieladung Vorlage

    javascript blockly monitoring
    2
    0 Stimmen
    2 Beiträge
    2k Aufrufe
    R
    @ostpower Ich habe auch einen Kostal WR, an dem allerdings ein BYD Speicher hängt und deshalb direkt eine Frage. Was versteht du/Kostal unter "intelligent laden" beim Kostal und dem schonenden laden? Es ist doch so, dass der WR den PV-Ertrag wie folgt verteilt: Erst den aktuellen Eigendarf decken, mit dem Überschuss den Akku laden und wenn der Akku voll ist wird der Überschuss eingespeist. Dabei kann mein Kostal (gem. Datenblatt) max.13A zur Ladung/Entladung nutzen. Daraus folgert bei den BYD-Akkus eine minimale Zeit von 2 Stunden zur vollständigen Ladung. Vorausgesetzt, es steht genügend Überschuss parat. Also 1/2 C, wie man es im Modellbau bezeichnen würde. Meine LiPos für das Modellauto lade ich sehr schonend mit 1C und sie können mit max. 80C entladen werden. Von daher ist 1/2C schon ein sehr schonender Wert. Bei mir ist der Speicher oft schon am Vormittag voll, sodass der max. Ladestrom selten ausgenutzt wird. Was würde es bringen, die Ladeleistung weiter zu drosseln und gleichzeitig einzuspeisen oder erst einspeisen und später am Tag den eigenen Akku laden? Wenn die PV-Anlage so groß dimensioniert wurde, dass ein Teil des Überschusses nicht eingespeist werden darf (70%-Regelung), würde ich lieber den Speicher vergrößern und mehr/länger einspeichern oder den WR vergrößern (damit dann die 70% kleiner sind als die installierten KWPeak). Was anderes wäre es in Verbindung mit Tibber, wenn du gerne deinen Speicher zu Zeiten von günstigen Tarifen laden möchtest um dann den gespeicherten Strom zu teureren Zeiten zu verbrauchen. Dazu müsstest du die Batteriesteuerung von intern auf extern umstellen. Das kann man nur über den Installateurzugang. Leider habe ich keinen, sonst hätte ich dies längst mal getestet. Wenn du mir an dieser Stelle unter die Arme greifen kannst, würde ich mich über eine private Nachricht freuen :) Ein sehr grober Versuch wäre noch, die Batterieladung/ -entladung über die WR "Zeitgesteuerte Batterienutzung" zu beeinflussen. Dann könnte man zu günstigen Strom-Tageszeiten oder hohen PV-Leistungen die Batterieentladung sperren und zu teurer Zeiten oder geringeren PV-Leistungen freigeben. Jedoch kann der WR die Batterie nicht aus dem Netz aufladen. Evtl. wird also der Speicher nicht voll. Hier würde mir nur einfallen, die min SoC zu billigen Stromzeiten auf 100% zu stellen, in der Hoffnung, dass der WR die Batterie dann auflädt und dazu auch aus dem Netz bezieht. Vorgesehen ist es scheinbar nicht, die Batterie aus dem Netz zu laden. LG RGT
  • Problem mit Bewegwungsmelderskript

    27
    1
    0 Stimmen
    27 Beiträge
    4k Aufrufe
    Karel PuhliK
    @robert_r sagte in Problem mit Bewegwungsmelderskript: Kann ich mittels Schalter einen Dauerbetrieb für Licht aktivieren? Ja. Auch hier der selbe Link. Da hat @paul53 auch eine sehr schöne Lösung für gefunden. Weiter unten folgen dazu Erklärungen... Link Text
  • Gelöst: Auslöser ermitteln

    javascript
    5
    0 Stimmen
    5 Beiträge
    276 Aufrufe
    M
    @paul53 sagte in Auslöser ermitteln: @michihorn sagte: Ja String, Dann muss mit "true" verglichen und "false" gesetzt werden. Ja das ist der Plan. Das Projekt soll eine Anwesenheitüberwachung für meine 3 Familienmitglieder im Geo Umkreis von 500 Meter machen, das klappt auch. Ich habe zwei weitere Dienste im IOT hinterlegt "Ankunft" triggert an der Grenze zu Holland und schaltet schon mal den Kühlschrank im Ferienhaus ein, stellt die Heizung/Klima auf 21Grad. 1h 20 min reichen aus. Ein weiter Dienst heisst Heimreise und der löst schon 30 km nach dem Verlassen des FH aus, Kühlschrank aus, Heizung auf 10 Grad. Der Hintergrund meiner Anfrage ist das Gegeseitige verriegeln von Anreise und Heimreise. Wenn ich z.B Heimreise soll falls meine Frau oder der Sohn noch vor Ort bleiben, nur mein Dienst "Anreise" auf false gesetzt werden. Das Script für Anreise sieht so aus: /*****GEOfancy ANREISE ***************************************** ** Januar 2022 ** IOT, EgiGeo ** (true), (false) ** erstellt: 24.01.22, ** geändert: 14.06.23 ***********************************************************************/ var logging = true; const idFrigo = "tuya.0.bfce754681c6e2c8faowag.2" const idMedia = "tuya.0.bf292a4c8b62843697ntvv.1" const idTempIn = "tuya.0.73103057e868e768284a.3" const idHeizung = "tuya.0.73103057e868e768284a.2" const idAirCo = "daikin.0.control.power" const idAW = "0_userdata.0.Giethoorn.AW.AW" const ids = $('iot.*.services.custom_Anreise'); const idCnt = "0_userdata.0.Giethoorn.AW.Anreise" var text function cntAnreise() { let cnt = 0; ids.each(function (id, i) { if (getState(id).val == 'true') cnt++; }); setState(idCnt, cnt, true); if (getState(idCnt).val >= 1) { log("Anreise erkannt") setState(idFrigo, true) setState(idMedia, true) setState(idHeizung, 22) text = '\ud83d\ude98 Anreise von 🇩🇪 nach 🇳🇱 erkannt ' createEventlog("GTHRN", text) if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+491xxxxx' }); if ((getState(idTempIn).val >= 30)) { setState(idAirCo, true) } } }; cntAnreise(); // Skriptstart ids.on(cntAnreise); EDIT: Anbei der Objektbaum vom IOT [image: 1697463057268-screenshot-2023-10-16-152935.png] Als Lösung funktioniert nun folgendes Script: /*****GEOfancy ANREISE ***************************************** ** Januar 2022 ** IOT, EgiGeo ** (true), (false) ** erstellt: 24.01.22, ** geändert: 14.06.23 ***********************************************************************/ var logging = true; const idFrigo = "tuya.0.bfce754681c6e2c8faowag.2" const idMedia = "tuya.0.bf292a4c8b62843697ntvv.1" const idTempIn = "tuya.0.73103057e868e768284a.3" const idHeizung = "tuya.0.73103057e868e768284a.2" const idAirCo = "daikin.0.control.power" const ids = $('iot.*.services.custom_Anreise'); const idCnt = "0_userdata.0.Giethoorn.AW.Anreise" var text function cntAnreise() { let cnt = 0; ids.each(function (id, i) { if (getState(id).val == 'true') cnt++; }); setState(idCnt, cnt, true); if (getState(idCnt).val >= 1) { log("Anreise erkannt") setState(idFrigo, true) setState(idMedia, true) setState(idHeizung, 22) text = '\ud83d\ude98 Anreise von 🇩🇪 nach 🇳🇱 erkannt ' createEventlog("GTHRN", text) if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+491xxxx149' }); if ((getState(idTempIn).val >= 30)) { setState(idAirCo, true) } } }; cntAnreise(); // Skriptstart ids.on(cntAnreise); var newstring ids.each(function (id) { // Skriptstart if (getState(id).val) setState(id, true); }); ids.on(function (dp) { if (dp.state.val) { log("INFO: " + dp.id); var string = dp.id newstring = string.replace("custom_Anreise", "custom_Heimreise"); log("Ergebnis: " + newstring) setState(newstring, "false") } }); Und für die Heimreise sieht das Script dann so aus. /*****GEOfancy HEIMREISE ***************************************** ** Januar 2022 ** IOT, EgiGeo ** (true), (false) ** erstellt: 24.01.22, ** geändert: 14.6.23 ***********************************************************************/ var logging = true; const idFrigo = "tuya.0.bfce754681c6e2c8faowag.2" const idMedia = "tuya.0.bf292a4c8b62843697ntvv.1" const idTempIn = "tuya.0.73103057e868e768284a.3" const idHeizung = "tuya.0.73103057e868e768284a.2" const idAirCo = "daikin.0.control.power" const idAW = "0_userdata.0.Giethoorn.AW.AW" const ids = $("iot.*.services.custom_Heimreise"); const idCnt = "0_userdata.0.Giethoorn.AW.Heimreise" var text function cntHeimreise() { let cnt = 0; ids.each(function (id, i) { if (getState(id).val == 'true') cnt++; }); setState(idCnt, cnt, true); if (getState(idCnt).val >= 1) { log("Heimreise erkannt") setState(idFrigo, false) setState(idMedia, false) setState(idHeizung, 10) setState(idAirCo, false) text = '\ud83d\ude98 Heimreise von 🇳🇱 nach 🇩🇪 erkannt ' createEventlog("GTHRN", text) if (logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+49xxxxx149' }); } }; cntHeimreise(); // Skriptstart ids.on(cntHeimreise); var newstring ids.each(function (id) { // Skriptstart if (getState(id).val) setState(id, true); }); ids.on(function (dp) { if (dp.state.val) { log("INFO: " + dp.id); var string = dp.id newstring = string.replace("custom_Heimreise", "custom_Anreise"); log("Ergebnis: " + newstring) setState(newstring, "false") } });
  • Gesamtlaufzeit ermitteln

    monitoring javascript
    6
    0 Stimmen
    6 Beiträge
    330 Aufrufe
    amg_666A
    @paul53 @ticaki: Erstmal danke für die Rückmeldung, ich werde das Skript und den Adapter mal anschaun.
  • IR-Codes für Telekom Media Receiver gesucht

    1
    0 Stimmen
    1 Beiträge
    335 Aufrufe
    Niemand hat geantwortet
  • Blockly - Alle Skripte exportieren geht nicht.

    10
    1
    0 Stimmen
    10 Beiträge
    461 Aufrufe
    GlasfaserG
    @stenmic sagte in Blockly - Alle Skripte exportieren geht nicht.: es funktioniert jetzt, kannst du uns mal bitte deine Daten zeigen!! Zeige die Full Ausgabe von iob diag
  • Array befüllen, Abfragen und löschen

    10
    0 Stimmen
    10 Beiträge
    808 Aufrufe
    T
    @great-sun Manchmal sieht man den Wald vor Bäumen nicht. Wie kann ich den Thread schließen?
  • InfluxDB V2 - Daten löschen im Adapter funktioniert nicht

    3
    0 Stimmen
    3 Beiträge
    394 Aufrufe
    Marc BergM
    @tp1de sagte in InfluxDB V2 - Daten löschen im Adapter funktioniert nicht: (InfluxDB Adapter Version 3.2.0) Das Löschen von InfluxDb 2.x Daten wird erst ab der Adapter Version 4.0.0 unterstützt (noch nicht released). Punktlich nach dem Erscheinen von InfluxDB 3 :-)
  • Binding mehrere Werte vergleichen

    19
    0 Stimmen
    19 Beiträge
    2k Aufrufe
    S
    @OliverIO Naja, Sonderzeichen waren ja in der VIN nicht dabei und es funktioniert ja jetzt auch. Aber egal - Hauptsache es tut wie es soll :-) Vielen Dank!
  • Authentication (redirect uri) ??

    9
    0 Stimmen
    9 Beiträge
    969 Aufrufe
    NewpicselN
    @oliverio Doch doch, theoretisch kann der Adapter das schon. Mein Blockly hatte ich erstellt bevor es einen Adapter gab 😅 Ich und ein paar weitere Nutzer, nutzen diesen jedoch weiterhin, weil er etwas mehr Funktionen bietet als der Adapter und ich müsste so ohnehin noch ein zusätzliches Blockly erstellen. Das spare ich mir damit und es läuft einfach sehr gut. Einziges Problem ist halt nun die Token Anfrage für neue Nutzer, bei denjenigen, die das Blockly schon vorher genutzt haben (vor der Umstellung) läuft es weiterhin. Außerdem und wohl das wichtigste, es macht mir Spaß daran zu arbeiten und ich lerne sehr viel 😊👍
  • Problem mit roon-api und iobroker

    1
    0 Stimmen
    1 Beiträge
    257 Aufrufe
    Niemand hat geantwortet
  • Hargassner Heizung Adapter für IOBroker

    3
    0 Stimmen
    3 Beiträge
    517 Aufrufe
    C
    @sborg ok, trotzdem danke.
  • Zweite Leuchte zufällig nach der ersten einschalten

    blockly javascript
    4
    0 Stimmen
    4 Beiträge
    454 Aufrufe
    CluniC
    @feinfinger So könnte es aussehen: [image: 1696401865730-dfb97ad8-451b-4c61-8bba-312e263ae138-image.png] Statt auf den Schalter zu reagieren, kannst du das natürlich auch direkt in das Blockly setzen, wo die andere Lampe eingeschaltet wird. Aber so hättest du das gleiche Verhalten, wenn die Lampe per Hand eingeschaltet wird. <xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="OrYsD!vXmG*)iCRkRbvr">max_ms</variable> <variable type="timeout" id="timeout">timeout</variable> </variables> <block type="on" id="XpbZ[Tmj7D8@KRhOiT=B" x="213" y="88"> <field name="OID">shelly.0.SHSW-1#55E26A#1.Relay0.Switch</field> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="variables_set" id="f#3wpm3R7{E{@]y%/D(m"> <field name="VAR" id="OrYsD!vXmG*)iCRkRbvr">max_ms</field> <value name="VALUE"> <block type="math_number" id="N(,RpK8o[n+$@mcQp~ij"> <field name="NUM">10000</field> </block> </value> <next> <block type="timeouts_settimeout_variable" id="Q9^8eV3{DtixTk.NA!f:"> <field name="NAME">timeout</field> <value name="DELAY_MS"> <block type="math_arithmetic" id="Aj7QYN~GSI|68maE.LVU"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="5A=2M5})|F$TAz@w5dv_"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="rJW$P1w*YV}vv;}P21UR"> <field name="VAR" id="OrYsD!vXmG*)iCRkRbvr">max_ms</field> </block> </value> <value name="B"> <shadow type="math_number" id="m`;3qY)ZQ6xY|e_;Lo)J"> <field name="NUM">1</field> </shadow> <block type="math_random_float" id="@]{0d^;[tiL@F9JmUff4"></block> </value> </block> </value> <statement name="STATEMENT"> <block type="control" id="Lb=G?yzLpZgJ0XG7%#Rx"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">hm-rpc.0.OEQ0360604.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="O=oblat=~*zl$x!_%c,g"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> </block> </next> </block> </statement> </block> </xml>```
  • HyperHDR steuern per ioBroker und JSON

    1
    0 Stimmen
    1 Beiträge
    318 Aufrufe
    Niemand hat geantwortet

245

Online

33.0k

Benutzer

83.5k

Themen

1.3m

Beiträge