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
    Das könnten sie ja dann nur per Firmwareupdate beheben oder? Da warte ich immer bisschen ab welche Probleme da auftauchen.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    hg6806H
    Danke für die Antworten. Der Adapter ist dafür etwas überdosiert, ist aber interessant, dass es sowas gibt. Das mit dem Zeitplan hatte ich mir auch schon überlegt, dachte es gibt was anderes oder besseres. Ich denke stündlich reicht in dem Fall.
  • 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: In entfernten Datenpunkt schreiben

    javascript
    9
    0 Stimmen
    9 Beiträge
    759 Aufrufe
    M
    @sborg sagte in In entfernten Datenpunkt schreiben: @michihorn Na damit kann man arbeiten :) Das ist die Antwort der Web-Site: No connection to home Requested instance (web, admin, ...) is not started, has SSL or authentication enabled ...und dann schau dir nochmals obigen Link an was da etwas weiter unten zu erkennen ist: "No connection..." ;) Vielen Dank...hab das "@" in der Cloud Pro Bezeichnung vergessen **@**pro_giethoorn20@gmail.com Mein Testscript sieht jetzt so aus und tut was es soll: var request = require('request'); const idWind = "hm-rpc.2.00185BE98B3FCA.1.WIND_SPEED" on({ id: idWind, change: "ne" }, function () { var url="https://iobroker.pro/service/simpleApi/@pro_giethoorn20@gmail.com_xxxxxx-6x11-xxxx-bxxc-d9eaa1exxxxx/set/javascript.0.Castrop.Test?value="+getState(idWind).val; request({url : url}, function (error, response, body) { log("Änderung übertragen"); }); });
  • Blockly Skript Kalenderwochen als und Bedingung

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    B
    @paul53 oh man so einfach :) Vielen Dank
  • Netatmo Welcome und Alexa

    blockly javascript node-red communication
    18
    0 Stimmen
    18 Beiträge
    1k Aufrufe
    CinimodC
    @slipkorn_dh88 Schön das du es hin bekommen hast
  • Einzelwerte extrahieren aus MQTT-Datenpunkt

    3
    0 Stimmen
    3 Beiträge
    151 Aufrufe
    M
    @fastfoot danke, das funktioniert super
  • Datetime für VIS auswerten

    9
    0 Stimmen
    9 Beiträge
    669 Aufrufe
    P
    @init5 said in Datetime für VIS auswerten: @paul53 Sorry für die späte Antwort. Ich habe immer ein Problem mit diesen Skripten. Ich weiß nicht wie ioBroker damit umgeht, aber für meine Verständnis laufen dann die Skripte über die gesamte Dauer. Normale Skripte laufen nur 1 Mal...nämlich beim Starten des Brokers. z.B. zum Initialisieren von irgendwelchen Werten o.ä. Wenn Du jedoch einen "Trigger" einbaust, dann meldet sich Dein Skript am System bei einem Eventhandler an und sagt diesem: "Starte meine angegebene Callback-Funktion und übergieb dieser bestimmte Daten , wenn ein bestimmtes Ereignis eingetreten ist. (z.B. eine Wertänderung bei einem Knoten oder Ablauf eines Timers). Das eigentliche Skript läuft also nicht weiter sondern wartet im Hintergrund darauf, dass es vom Eventhandler erneut aufgerufen wird (nicht das komplette Skript sondern nur die jeweis übergebene Callback-Funktion). Nur als kleines Beispiel: on({id: "mqtt.0.esp32.temperature", change: "ne"}, async function (obj) { var value = obj.state.val; // hier können weitere Anweisungen innerhalb der Callback-Funktion stehen } ); bedeutet on {(Ereignis}, rufe meine asynchrone Funktion "function(obj)" auf und übergieb ihr als Parameter das Objekt, in dem das Ereignis stattfand.}) Auf dieses Objekt kann man dann innerhalb der Funktion problemlos zugreifen var value = obj.state.value; Jetzt zu Deinem eigentlichen Problem mit der Überprüfung des Temperatursensors: Wie oben gerade gesagt, reagieren die Trigger nur bei "Veränderungen" (welcher Art auch immer) und rufen entsprechende Routinen (callback-Funktionen) auf. Aber genau das hast Du ja eben nicht! Es verändert sich ja nichts... Du bräuchtest also quasi so eine Art "timeout" Funktion, die aufgerufen wird, wenn sich ein Meßwert z.B. über 8 Std nicht verändert (bzw aktualisiert) hat. Ich selber beschäftige mich jetzt erst ein paar Wochen mit dem Broker und weiß nicht, ob das Developer Team sowas evtl bereits umgesetzt (programmiert) hat Daher würde ich für so eine Überwachung auf einen Timer zurückgreifen, der alle paar Minuten überprüft, ob meine Meßdaten aktualisiert wurden oder ob z.B. ein Meßfühler ausgefallen ist. Je nach Wichtigkeit könnte dann sogar eine Alarmmeldung rausgeschickt werden (z.B. e-mail oder Telegram o.a.) Damit das aber auch im VIS angezeigt wird, würde ich mir einen User-definierten Alarm-Knoten einrichten, der nur true oder false enthält. Bsp: Neues Objekt hinzufügen: 0_userdata.0.Temperaturalarm parent: 0_userdata.0 Typ: Datenpunkt Zustandstyp: boolean Name: Temperaturalarm Wenn man diesen neuen Knoten anlegt, bekommt er vom System sofort den default-Wert: false... In diesem Knoten wird dann vom Timer regelmäßig abgelegt, ob der Messfühler noch aktiv ist (Alarm=false) ...wenn nicht, wird der Wert "true" gesetzt, was einem Alarm gleichkommt. Der Timer: interval = setInterval(async function () {}, 60000); //alle 60000 ms = 1 Min starten Jetzt nur noch die Funktion "füllen": Das Script sieht dann später so aus: var interval; // Describe this function... async function getTimeDiffMin() { var aktDateTime= new Date(); return (aktDateTime.getTime() - getState("mqtt.0.esp32.temperature").ts)/1000/60; } interval = setInterval(async function () { if (await getTimeDiffMin() >= 1) { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, true, true); } else { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, false, true); } }, 60000); oder das Blockly: [image: 1641421947498-unbenannt-2.jpg] Somit kann man im Blocly einstellen, in welchem Intervall geprüft wird und wie groß die 'Zeitspanne maximal sein darf... (jeweils in Minuten)
  • Wie Scripts mit hoher CPU-Last finden?

    5
    0 Stimmen
    5 Beiträge
    226 Aufrufe
    crunchipC
    @joergh sagte in Wie Scripts mit hoher CPU-Last finden?: Schneller geht 50% abschalten, @oxident Is ja eh auf 2 Instanzen aufgeteilt, also eine einfach mal abschalten, wäre am schnellsten
  • Taskmanager(win)/top(unix) aber für Scripte im iobroker?

    2
    0 Stimmen
    2 Beiträge
    84 Aufrufe
    Thomas BraunT
    @mrpit Per skript? Nein, geht nicht, das läuft alles in einem gemeinsamen Prozess ab.
  • Zahl in Datenpunkt springt zwischen + und -

    6
    3
    0 Stimmen
    6 Beiträge
    726 Aufrufe
    AsgothianA
    @bostil sagte in Zahl in Datenpunkt springt zwischen + und -: Weitere Pausen einarbeiten bewirkt auch nichts, oder? Weitere Pausen machen das Skript langsamer lassen zu das du um die Problematik herum unsauber arbeitest anstatt gleich sauber zu arbeiten sorgen dafür das das Problem "nur manchmal" auftritt machen das Skript schwer zu debuggen. Neben dem normalen "Async" Problem hast du: die Berechnung von Nebenkosten_Gesamtsumme_FC und Nebenkosten_Gesamtsumme_YTD jeweils um 1 Sekunde verzögert die Berechnung von Nebenkosten_Gesamtsumme_YTD_proMonat, welche auf die oben berechnete Nebenkosten YTD zugreift nicht verzögert die Berechnung von Nebenkosten_Gesamtsumme_FC_proMonat nach dem gleichen Muster nicht verzögert. Dadurch finden die Berechnungen der Summen pro Monat statt bevor die Aufsummierung der Kosten stattfindet. Aber das ist nur die Spitze des Eisberges: Du definierst Konstanten im Skript (echte konstanten) und aktualisierst diese jede Minute, obwohl diese sich nicht ändern können Du berechnest aus diesen Konstanten weitere Konstanten (fix) und speicherst diese auch jede Minute in weiteren Datenpunkten Du führst Berechnungen durch die sich nur monatlich bzw. täglich ändern, und das jede Minute. Letztendlich solltest du das Skript in 3 Teile teilen. Einmal den der nur bei Start ausgeführt wird. Darin sind alle Konstanten abgelegt. Du kannst sie dann im Skript anpassen, und wenn du das Skript neu startest wird ab dann mit den neuen Konstanten gerechnet. Dabei sollten die Werte zunächst in Variablen gespeichert und dann in die Datenpunkte geschrieben werden. Im Skript selber rechnest Du dann weiter mit den Variablen. Einmal den der nur einmal pro Tag laufen muss, in dem du deine Monatlichen und Täglichen Werte berechnest. Auch hier gilt: Berechnung von Zwischenwerten in Variablen machen so das du nie auf Datenpunkte zugreifen musst die du vorher aktualisiert hast. Als letztes den Teil der schneller läuft. Da reicht es die Werte zu berechnen die sich auf die States beziehen die den Stromverbrauch bzw. die Stromlieferung dieses Jahr und/oder diesen Monat referenzierten. Ob dieser wirklich einmal pro Minute laufen soll musst Du dann bewerten. @bostil sagte in Zahl in Datenpunkt springt zwischen + und -: Nun muss ich mich nur noch mit Variablen befassen. Mit variablen solltest Du dich sowieso befassen. Betrachte sie einfach als 'Datenpunkte die nur einen Wert behalten wenn das Skript läuft' A.
  • zeitliche Ausnahme bei Steckdosenschaltung

    8
    1
    0 Stimmen
    8 Beiträge
    243 Aufrufe
    AsgothianA
    @mading Was machst Du falsch: Die Zeitbedingung passt nicht. Der Baustein Zeit zwischen A und B erwartet das A < B. Diese Regel verletzt du in deinem Falls. Besser wäre hier gewesen: nicht Zeit zwischen 0:00 und 3:00 Uhr die zusätzliche Abfrage im Sonst-Falls ist unnötig, ein "Sonst" hätte gereicht (wenn das Falls denn ok gewesen wäre. Die Falls Bedingung wird nur beim Start des Skriptes überprüft, sprich welchen Zweig der Bedingung du ausführst hängt nur davon ab wann das Skript gestartet wird. Die Variable BatterieLevel ist unnötig. Du kannst an Stelle dieser Variablen den Baustein aus dem Trigger-Bereich nutzen, der mit "Object ID" vorbelegt ist, sofern du diesen auf "Wert" umstellst. Die Sondermeldung bei Batterie < 5 % ist ungünstig in einem sonst Falls verbaut. Das führt dazu das wenn die Batterie unter 5% und die Ladesteckdose noch aus ist keine Warnmeldung das die Batterie so niedrig ist ausgegeben wird Ich würde auf eine gesonderte Meldung verzichten und statt dessen den Text in der Meldung über Bausteine aus dem Textbereich so zusammen setzen: erstelle Text aus Vis Tablett Batterie auf BatterieLevel %. Schalte Strom ein. Dabei hat der Erstelle Text aus Baustein 3 Knoten an denen die 3 folgenden Bausteine angedockt sind. Generell gilt: Trigger (auch Cron Trigger) machen hinter Falls Abfragen nur in Sonderfällen Sinn. Meistens ist es besser, den Trigger allgemein zu definieren und mit einer Falls Abfrage innerhalb des Triggers Zusatzbedingungen (wie die Uhrzeit) abzuprüfen. Was du brauchst: Im Trigger eine Abfrage auf die Uhrzeit, die verhindert das die Steckdose zwischen 0 und 3 Uhr abgeschaltet wird. Einen cron Trigger, der die Steckdose um 0:00 Uhr auf jeden Fall einschaltet. A. p.s. Ich hasse Autokorrektur, insbesondere wenn sie verschlimmbessert.
  • Einige Fragen zu Blockly

    10
    1
    0 Stimmen
    10 Beiträge
    269 Aufrufe
    AsgothianA
    @gluecksmann Anbei mal ein Vorschlag als Pseudocode. Damit solltest Du Dir das ganze zusammen bauen können. Kern ist die Kombination von "Timeout" zum abschalten nach 3 Minuten und "Intervall" um die Lampen jede Sekunde umzuschalten zum Blinken. Trigger auf "IsOpen", Wert ist kleiner als vorher stopTimeout ausführen Timeout in 3 Minuten Szene Blau ausschalten, alle Lampen ausschalten stopIntervall Lampen Einschalten Lampen auf Blau schalten Warnmeldung per Speak ausgeben ausführen Intervall alle 1 sek Lampen mit "Umschalten" Baustein von an auf aus oder umgekehrt schalten Wenn Du das so aufbaust sollte es nur aktiv werden wenn das "is Open" Objekt von wahr auf falsch wechselt. A.
  • URL Request: CA signature digest algorithm too weak

    javascript security multimedia
    6
    0 Stimmen
    6 Beiträge
    938 Aufrufe
    patrickbs96P
    Hallo @ichbinsmart, ich bin gerade zufällig über den Beitrag gestolpert. Hast du mittlerweile eine Lösung gefunden? Ich selbst nutze das Skript hier und damit klappt es ohne Probleme. Ich habe es zwar etwas an meine Bedürfnisse angepasst aber mit der Version sollte es trotzdem funktionieren :-)
  • Uhrzeit: Eingabe in VIS und Skriptbearbeitung

    7
    0 Stimmen
    7 Beiträge
    569 Aufrufe
    M
    @paul53 ah ja, der Befehl zum stoppen hat mir gefehlt. Sonst hatte ich es ähnlich aufgebaut. Super, vielen Dank.
  • Cron Monthly Rain Counter zurücksetzen

    2
    3
    0 Stimmen
    2 Beiträge
    160 Aufrufe
    CinimodC
    @drake Mit dem Wizard Zeitplan gibt es so einige Probleme. Nimm besser Cron. Ggf. solltest du auch den Zahlenblock "0" nehmen, wenn dein Datenpunkt numerisch ist.
  • Scriptumstellung CCU ==> iobroker

    2
    0 Stimmen
    2 Beiträge
    256 Aufrufe
    T
    @tcfigge Selbst herausgefunden: im Bockly unter exec: /usr/bin/curl -s -k --data value=1803 'http://192.168.178.44:8080//user/var/40/10021/0/0/12080' Vielleicht hilft es jemandem...
  • 'request' läuft aus - Umstellen auf `axios` - ein Beispiel

    Verschoben
    24
    0 Stimmen
    24 Beiträge
    2k Aufrufe
    SBorgS
    @homoran Noch mal bisserl gepimpt: https://forum.iobroker.net/post/730745 Auswahl des Bundeslandes (hab aktuell nur zwei eingepflegt ^^ ) initial nach Start einmalig Daten holen (unabhängig vom schedule) Anlegen der Datenpunkte Wenn schon, dann auch richtig...
  • Szenenadapter / Script bzw. Blockly starten

    2
    0 Stimmen
    2 Beiträge
    217 Aufrufe
    CinimodC
    @fuxxz2 Am besten erstellst du dir einen eigenen Datenpunkt, den du mittels Szene ansteuerst, und den ebenfalls als Trigger für Blockly nutzt. (optional kannst du ja auch einen anderen Datenpunkt benutzen den du mit der Szene sowieso ansteuerst) Wenn du aber sowieso mit Blockly hantieren willst, kannst dir auch die gewünschten SzenenBefehle direkt mit Blockly machen.
  • VIS Datenpunkt mit Javascript

    4
    2
    0 Stimmen
    4 Beiträge
    469 Aufrufe
    K
    @jamesb du kannst im Javascript den Trigger (ObjectID) nennen, auf welches das Script reagieren soll. Sprich wenn du z.B. auf der VIS einen Schalter hast, musst du diesem eine ObjectID zuordnen. Im Script sagst du dann, dass auf diese ObjectID getriggert werden soll. Bin Javascript-Neuling, konnte dir aber anhand eines bestehenden Scripts dies anpassen und bei mir funktioniert es so: on('0_userdata.0.Nachtmodus.Nachtmodus_ein/aus', function(obj) { if (obj.state.val) { log('eingeschaltet'); } else { log('ausgeschaltet'); } });
  • Einen Sensor überwachen, ob dieser noch Erreichbar ist

    9
    0 Stimmen
    9 Beiträge
    737 Aufrufe
    Andre 0A
    @bigchris Ich mach das so in Blockly. [image: 1640902455268-30-12-_2021_23-13-51.jpg] Spoiler <xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="vK5H@#I*^M/lcgeE@PRB">gartentor_kontakt</variable> </variables> <block type="controls_if" id="t3;@zJrP8;CshBO=leo" x="84" y="719"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="rU:Gudg8L?)6YAOZY5,i"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="2oCy$Pv4O}CUtN}3R^g"> <field name="VAR" id="vK5H@#I*^M/lcgeE@PRB">gartentor_kontakt</field> </block> </value> <value name="B"> <block type="get_value" id="xC=k;KAoSu;JNEteJxEJ"> <field name="ATTR">ts</field> <field name="OID">zigbee.0.00158d0003122049.contact</field> </block> </value> </block> </value> <statement name="DO0"> <block type="controls_if" id="c2pi$JJp5_@[rqX13Er#"> <value name="IF0"> <block type="logic_compare" id="y=E?U!qZvcnTQGsWeCBr"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="!GY;5QaQ6bN$9qd1g0E8"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.alive_check.kontakt.gartentor</field> </block> </value> <value name="B"> <block type="logic_boolean" id="y5wg5=D=d1sAvo)sK2f"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="telegram" id="7CF?dqO4L~;4.:T|c%"> <field name="INSTANCE"></field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <value name="MESSAGE"> <shadow type="text"> <field name="TEXT">Temperatur</field> </shadow> <block type="text_join" id="6mr=w-tS^/=cKv,E]?i1"> <mutation items="5"></mutation> <value name="ADD0"> <block type="text" id="Nqcwf:lWk1e{z;!XDsW"> <field name="TEXT">Der Kontaktsensor</field> </block> </value> <value name="ADD1"> <block type="text_newline" id="TYmsFcSPv9its@eR9XfP"> <field name="Type">\n</field> </block> </value> <value name="ADD2"> <block type="text" id="*Lka:pXH$5R{x%RHGer"> <field name="TEXT">Gartentor</field> </block> </value> <value name="ADD3"> <block type="text_newline" id="b]@FQC)^446MEN2L~wd"> <field name="Type">\n</field> </block> </value> <value name="ADD4"> <block type="text" id="F1.mII:L*|_lnF+CTbRD"> <field name="TEXT">hat keine Verbindung!</field> </block> </value> </block> </value> <next> <block type="control" id="s{s7$)2lE}HTx~R8T$KE"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.alive_check.kontakt.gartentor</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=":jrO(.y4q?mh)a)Cn(U"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="$1A3@m9)fZo-+8Y8Ss.8"> <field name="VAR" id="vK5H@#I^M/lcgeE@PRB">gartentor_kontakt</field> <value name="VALUE"> <block type="get_value" id="EI{?gF/btN4y{T^H7-+x"> <field name="ATTR">ts</field> <field name="OID">zigbee.0.00158d0003122049.contact</field> </block> </value> <next> <block type="control" id="wJhCK|P.!}Gt|m6Xv^^@"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.alive_check.kontakt.gartentor</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="yRm2P{,~`kuT|D:ngP=0"> <field name="BOOL">TRUE</field> </block> </value> </block> </next> </block> </statement> </block> </xml>
  • Dyn.Auswahlliste->HTML Widget mit DP Steuerung

    javascript
    10
    0 Stimmen
    10 Beiträge
    796 Aufrufe
    XantroxX
    @bananajoe Hintergrund für diese Variante war Hauptsächlich das ich aus einer beliebigen API-JSON den "Index" ziehen möchte um sie danach bei Übereinstimmung eines Datenpunktes mit Zusatzdaten anzureichern. Beispiel: API -> weather.api [{"data": {"wind_cdir":"SW", "rh":90, "pod":"n", "timestamp_utc":"2021-12-30T21:00:00", "pres":982.9, "solar_rad":0, "ozone":270.5, "weather":{ usw..... jetzt könnte ich mir rein theoretisch für "Index" Windrichtung zusätzlich Datenpunkte ablegen wie z.B. HTML mit bebilderten Kompass etc. Wenn man das Script einmal hat, ist es easy sich das entsprechend der Anwendung anzupassen
  • Das smarte Bad

    22
    0 Stimmen
    22 Beiträge
    2k Aufrufe
    F
    @mickym mit diesem gedanken hatte ich auch schon gespielt. Da Problem ist das die Dauer bis die Luftfeuchtigkeit oder der Anstieg davon am BWM ankommt länger ist als die dauer bis das Licht ausgeschaltet wird. Deshalb würde das auch nicht Zuverlässig funktionieren... aber wie gesagt... an dem Gedanken bin ich auch dran. Quasi das Licht icht zu Schalten wenn die Luftfeuchtigkeit gleich einem bestimmten Wert ist... und dann aber auch irgendwie sobald der BWM zum ersten mal danach wieder bewegung erkennt... das wäre ja dann nach dem Duschen das ganz normale skript wieder zu aktiveiren... sonst würde das Licht ja zu lange nicht ausgehen...

247

Online

32.8k

Benutzer

82.8k

Themen

1.3m

Beiträge