Skip to content

Skripten / Logik

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

16.4k Themen 211.8k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 48k
    2k Themen
    48k Beiträge
    A
    @Modulo-N kannst du mal davor diese LOG Zeile einfügen: const aktivePhase = ergebnis.aktivePhase; log(`aktivePhase = ${JSON.stringify(aktivePhase)}`,'warn') if (!aktivePhase) {log('aktivePhase ist null oder undefined', 'warn');return;}
  • Hilfe für Skripterstellung mit Blockly

    6k 78k
    6k Themen
    78k Beiträge
    paul53P
    @13patrick37 sagte: Kann ich das hier wieder über timeout lösen? Wozu timeout? Damit bei Helligkeitswerten > 200 nicht laufend gesendet wird, würde ich noch prüfen, ob das Licht an ist: [image: 1764704098952-blockly_temp.jpg]
  • Hilfe für Skripterstellung mit Node-RED

    952 13k
    952 Themen
    13k Beiträge
    HomoranH
    @fiddle sagte in [Gelöst]: Adapter per {Node Red | JS} (de)aktivieren: Ok, nicht als "Wert" schreiben, sondern als "Befehl". Dann scheint ihn das zu beeindrucken. du zeigst ja nichts, aber es geht mit true/false [image: 1763416200051-screenshot_20251117-224854_firefox.jpg] gesteuert über eigenen DP vom typ Bool
  • Wie kann ich mit Blockly Variablen Ansagen lassen?

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    3k Aufrufe
    DutchmanD
    @Sven2013: Allerdings geht eins bei mir nicht. Ich kann kein Json Objekt mitschicken. Also Einträge aus ICal lassen sich so nicht verschicken. Weißt du ob ich diese irgenwie in "lesbares wandeln" kann? ` Kein dir ein beispiel geben wie ich einen MQTT JSON query auslese und die werte in variablen und log schreibe. Input MQTT: { "Battery" : 255, "RSSI" : 7, "dtype" : "Lighting 2", "id" : "14879AA", "idx" : 2, "name" : "Deurbel_Voor", "nvalue" : 1, "stype" : "AC", "svalue1" : "OFF", "switchType" : "Doorbell", "unit" : 1} Hieraus hohle ich mir die werte | val | name | und schreibe sie in variabelen + log: //Read value at update on MQTT trigger on({id: RegExp("javascript.0.domoticz."), change: "any"}, function (obj) { var name = obj.name; var value = (getState(id).val); log (value); log (name); // log("request: " + 'http://192.168.1.134:8084/json.htm?type=command¶m=switchlight&idx=7&switchcmd=On'); }); Resultat: 20:38:41.433 [info] javascript.0 script.js.common.Domoticz_Switch: 1 20:38:41.433 [info] javascript.0 script.js.common.Domoticz_Switch: Domoticz Deurbel_Voor Vielleicht hilft das ? :)
  • Übersetzung true/false

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    0
    durch Zufall gefunden : http://forum.iobroker.net/viewtopic.php … it=chat_ID sendTo('telegram.0', { text: 'Testnachricht empfangen.', chatId: '227174xxx', }); gruß
  • Delay zwischen 2 Befehlen

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    11k Aufrufe
    bahnuhrB
    Ausgangslage, was wollte ich: das Script soll mir Bilder meiner Cams senden per Telegram. das Bild soll erst versendet werden wenn es ordnungsgemäß gespeichert ist. (Deshalb zeitverzögert; wenn dies nicht notwendig dann auch gut) das gespeicherte Bild soll nach Versand wieder gelöscht werden (hab ich bisher noch nicht hinbekommen) ich wollte die Nachrichten per Telegram in der richtigen Reihenfolge. Also erst cam 62, dann 63, …. (Deshalb for .. To; dies klappt bisher nicht -> die Nachrichten kommen willkürlich, erst Bild 67, dann 62, dann 64, etc.) So, ich glaub das wars. Fazit: Wie bekomme ich das hin, mit Datei wieder löschen Reihenfolge der Nachrichten Mit freundlichen Grüßen Dieter
  • [gelöst] Loeschen von setStateDelayed Ausschaltplanung moeglich ?

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    4k Aufrufe
    paul53P
    Timer sind Objekte: var el1_timer=null; Timer sollten vor Wiederverwendung gelöscht werden: ... log("Bewegung"); // aber nur wenn Ecklicht auch an war/angehen soll if (getState("hm-rega.0.3416"/*kueche_Ecklicht_war_an*/).val) { log("Ecklicht war an => Licht wird aktualisiert"); meindingsbums.zone(4).on(); //hier schalte ich was ein -geht if(el1_timer) clearTimeout(el1_timer); //Beende späteren Timer, damit die nicht doppelt laufen. el1_timer = setTimeout(function () {setState("javascript.0.EcklichtTimer",199);},200); //setze Timer auf 199, 200ms verzögert } }); // Wenn der EcklichTimer gesetzt wurde, dann starte mit dem Runterzählen var mySubscription = on({id:"javascript.0.EcklichtTimer"/*EcklichtTimer*/, change: 'any' }, function (dp) { log("Trigger:EcklichtTimer triggerte: " + dp.state.val); if (dp.state.val > 2){ log("Subtrahiere 2: " + dp.state.val + "-> " + dp.state.val-2)); if(el1_timer) clearTimeout(el1_timer); el1_timer = setTimeout(function () {setState("javascript.0.EcklichtTimer", dp.state.val-2));}, 2000); } else { // Der Timer ist abgelaufen. Schalte Licht aus... meindingsbums.zone(4).off(); //und aus damit log("AUs!") } });
  • Anfängerproblem Blockly

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    976 Aufrufe
    lobomauL
    @Blackeye: Hallo zusammen, ich möchte über ein Script folgendes erreichen: Wenn über ein Fritzbox ein Anruf ankommt möchte ich wenn ich Amazon oder Fernseh schaue die Sendung pausieren. Die Adapter sind alle installiert und laufen… wenigsten etwas :D Ich habe jetzt das Problem mit einer UND Verknüpfung Also wenn ein Anruf ankommt und ich aktuell TV schaue dann TV Pause Wenn ein Anruf ankommt und ich Amazon anschaue soll Amazon pausiert werden. Danke für eine kleine Hilfe.... Lars ` Ich glaube so könnte es funktionieren: 1146_unbenannt.jpg
  • Regex für selector

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    bentschikB
    Das funktioniert nicht, weil dann auch sowas, wie /EG/FLR_EG/Door/Open gefunden wird. Ich würde damit den Suchraum auch unnötig einschränken. Das liegt in der Natur des Unterschieds zwischen einfachen Wildcards und Regular Expressions. Ich versuche, mein Anliegen mal etwas genauer zu beschreiben: Meine "Systemvariablen" sind folgendermassen aufgebaut: /EG = Erggeschoss /OG = Obergeschoss /EG/Door/Open = irgendeine Tür im Ergeschoss offen /EG/AZB = Arbeitszimmer Ben im Erdgeschoss /EG/BAD = Bad im Erdgeschoss /Door/Open = irgendeine Tür im Haus offen So geht es quasi Spar-MQTT-mässig immer weiter herunter bis zum Datenpunkt eines Sensors. Wenn ich jetzt die Tür bei mir im Arbeitszimmer schliesse, checkt meine Programmierung, ob es irgendwo im Erdgeschoss noch eine weitere offene Tür gibt, ansonsten wird /EG/Door/Open auf false gesetzt. Das triggert ggf. wieder /Door/Open, das checkt, ob in irgendeinen Geschoss eine Tür offen ist. D.h. ich benötige einen Check auf: /UG/Door/Open /EG/Door/Open /OG/Door/Open /DG/Door/Open Erschwerend kommt hinzu, dass ich als alter Informatiker die subscribe bzw. on handler über eine Funktion verallgemeinert habe, d.h. der Funktion ist es völlig egal, ob ich auf (UG|EG|OG|DG)/Door/Open matche, oder auf /EG/(AZB|BAD)/Door/Open. Die Funktion bekommt die übegeordnete SV, wie z.B. /Door/Open, übergeben, sowie die zu beobachtenden untergeordeneten Variablablen, wie (UG|EG|OG|DG)/Door/Open. Mit den Wildcards matche ich bei .each, wie beschrieben, zu viel. Regular Expressions für Selektoren wären in der Situation die Rettung. Beste Grüsse, Bentschik
  • [gelöst]: Nur in bestimmten Zeitbereichen on({id …}

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    wendy2702W
    @Nordlicht: Hallo, ich bin auf der Suche nach dem TimeRange Skript… kann es hier im Forum nicht (mehr) finden Leider führen beide Links von hier - sowohl für Zeitbereich wie auch Datumsbereich - versehentlich zum identischen Skript. http://www.iobroker.net/docu/?page_id=3591&lang=de Vielen Dank. Gruß Thomas ` Time Range Script: ! // isTimeInRange ! function currentDate() { ! var d = new Date(); ! return new Date(d.getFullYear(), d.getMonth(), d.getDate()); ! } ! function addTime(strTime) { ! var time = strTime.split(':'); ! var d = currentDate(); ! d.setHours(time[0]); ! d.setMinutes(time[1]); ! d.setSeconds(time[2]); ! return d; ! } ! function isTimeInRange(strLower, strUpper) { ! var now = new Date(); ! var lower = addTime(strLower); ! var upper = addTime(strUpper); ! var inRange = false; ! if (upper > lower) { ! // opens and closes in same day ! inRange = (now >= lower && now <= upper) ? true : false; ! } else { ! // closes in the following day ! inRange = (now >= upper && now <= lower) ? false : true; ! } ! return inRange; ! } ! // isTimeInRange ENDE ! createState('Sayit.Trigger', false, { ! name: 'Sayit-Ansage bei Bewegung steuern', ! type: 'boolean' ! }); ! createState('Sayit.Zeitsteuerung', false, { ! name: 'Sayit-Ansage nur innerhalb Zeitfenster schalten', ! type: 'boolean' ! }); ! var idBewegung = "hm-rpc.0.MEQ1849741.3.MOTION", ! idTrigger = 'Sayit.Trigger'; ! on({id: idBewegung, val: true}, function (obj) { ! if ( isTimeInRange('06:00:00', '06:45:00') || isTimeInRange('07:00:00', '07:45:00') || isTimeInRange('8:30:00', '9:15:00')) setState(idTrigger, true); // Trigger auslösen ! }); ! // Zurücksetzen vom Trigger ! schedule("46 6 * * *", function () { ! setState(idTrigger, false); ! }); ! schedule("46 7 * * *", function () { ! setState(idTrigger, false); ! }); ! schedule("16 9 * * *", function () { ! setState(idTrigger, false); ! });
  • History Logging per Script ein und ausschalten

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    808 Aufrufe
    L
    Hallo Günther, ja, das sieht so aus als könnte das für mich richtig sein. Ich werde testen. @Dutchman Im Prinzip hast du recht, ich will nur Vermeiden Daten zu loggen, die ich im besten Fall nie brauche.
  • Homematic Taster abfragen (PRESS_SHORT) funkt. nicht

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    P
    Funktioniert so. Danke für den Hinweis.
  • Variable setzen wenn bestimmte Bedingungen erfüllt sind

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    1k Aufrufe
    A
    Hallo, Ich hatte ein ähnliches Problem. Mehrere Homematic Schalt-Aktoren (Weihnachstbeleuchtung) sollten geschaltet werden wenn der Bewegungsmelder "draußen" oder der Bewegungsmelder "Flur-unten" eine Bewegung erkannt hat. Nach ein er bestimmten Zeit sollten "Lichter" wieder "allein" ausgehen. Muß ja nicht die ganze Ncht brennen :lol: Zusätzlich sollte noch die Helligkeit des Bewegungsmelder "draußen" überprüft werden (ob es dunkel genug ist die "Licher" einzuschalten). Ich hab das über eine Funktion gelöst, die von beiden "on" Ereignis Funktionen ausgeführt wird. Hier ist der Script: function Kerze () { var Helligkeit = getState("hm-rpc.0.NEQ0121243.1.BRIGHTNESS"/Aussen Bewegung-1-S.BRIGHTNESS/).val; log ("Helligkeit: " + Helligkeit); if (Helligkeit < 130) { setState("hm-rpc.0.KEQ0171811.1.STATE"/Licht Wand.STATE/,true); //Steckdose Schuppen ein setState("hm-rpc.0.KEQ0171542.1.STATE"/Licht Fenster.STATE/,true); //Steckdose Carport ein setState("hm-rpc.0.KEQ0171848.1.STATE"/Schalter-2.STATE/,true); //Steckdose Terasse ein setState("hm-rpc.0.KEQ0172215.1.STATE"/Schalter-1.STATE/,true); //Steckdose Küche ein setState("hm-rpc.0.LEQ0944756.1.STATE"/Kerze-1S.STATE/,true); //Kerze-1 ein setState("hm-rpc.0.NEQ0603872.1.STATE"/Kerze-2S.STATE/,true); //Kerze-2 ein setState("hm-rpc.0.NEQ0603833.1.STATE"/Kerze-3S.STATE/,true); //Kerze-4 ein setStateDelayed("hm-rpc.0.KEQ0171811.1.STATE"/Licht Wand.STATE/,false,10006020); //Steckdose Schuppen aus, nach 20 min setStateDelayed("hm-rpc.0.KEQ0171542.1.STATE"/Licht Fenster.STATE/,false,10006020); //Steckdose Carport aus, nach 20 min setStateDelayed("hm-rpc.0.KEQ0171848.1.STATE"/Schalter-2.STATE/,false,10006020); //Steckdose Terasse aus, nach 20 min setStateDelayed("hm-rpc.0.KEQ0172215.1.STATE"/Schalter-1.STATE/,false,10006020); //Steckdose Küche aus, nach 20 min setStateDelayed("hm-rpc.0.LEQ0944756.1.STATE"/Kerze-1S.STATE/,false,10006010); //Kerze-1 aus, nach 10 min setStateDelayed("hm-rpc.0.NEQ0603872.1.STATE"/Kerze-2S.STATE/,false,10006010); //Kerze-2 aus, nach 10 min setStateDelayed("hm-rpc.0.NEQ0603833.1.STATE"/Kerze-3S.STATE/,false,10006010); //Kerze-4 aus, nach 10 min } } // auslösen wenn Bewegung in Flur-unten on ({id: "hm-rpc.0.JEQ0264853.1.MOTION"/Flur unten Bewegungsmelder.MOTION/, val: true}, function () { Kerze (); }); // auslösen wenn Bewegung vor dem Haus on ({id: "hm-rpc.0.NEQ0121243.1.MOTION"/Aussen Bewegung-1-S.MOTION/, val: true}, function () { Kerze (); });
  • GPS Track anzeigen

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    987 Aufrufe
    Niemand hat geantwortet
  • Skripte gelöscht

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    520 Aufrufe
    M
    Hallo, ich schreibe mal eine kurze Rückmeldung. Ich habe gesehen, daß im IOBroker.data Verzeichnis ein Backup angelegt wird. Leider hatte das Backup nahezu den gleichen Zeitstempel wie auch die iobroker Daten-Datei, daher war es von wenig Wert (leider). Zum Glück hatte ich kurz vorher mal die Funktion Skripte exportieren genutzt, da ich Dateien verschieben wollte, den Versuch dann aber wieder verworfen. Diese ZIP Datei war noch in meinen temporären Browser-Dateien die ich nehmen konnte für einen erneuten Import. Mein Vorschlag für BlueFox: Wenn schon ein Backup gemacht wird, warum nicht z.B. jeden Tag beim ersten Start eines Skripte kann man über die Oberfläche nicht in entsprechende Ordner verschieben, oder? Das wäre eine echt gute Funktion Grüße, Jens
  • [gelöst]Fremde npm nutzen/einbinden

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    534 Aufrufe
    F
    @Homoran: @Fitti: frage mich nur, ob es einen besseren Weg gibt. Einfach in der Konfiguration des js-Adapters den Paketnamen eintragen und Adapter neu starten :mrgreen: Sch… arghhh wie? :shock: Wo sollten dann meine Modul installiert werden? Ist dann egal vermutlich, da in der npm Liste eingetragen, oder? Kreativ bin ich aber, gell? :mrgreen:
  • Scriptideen / Muster mit Blockly

    Verschoben
    3
    6
    0 Stimmen
    3 Beiträge
    3k Aufrufe
    S
    Hallo Dutchman, gerne, ich habe die Codes oben mit eingefügt. Viel Spaß beim finden weiterer Ideen :-) Gruß Sven
  • Frage zu : Muster "isDateinRange"

    Verschoben
    13
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    P
    Melde mich auch mal dazu: ich habe das neue Skript noch nicht getestet. Das alte Skript habe ich auf der Basis http://forum.iobroker.net/viewtopic.php?f=21&t=1072&p=11167&hilit=istimeinrange&sid=5d5834ef7192dc471724e2fb9e5b80e5#p8484 auf isDateinRange umgebastelt http://forum.iobroker.net/viewtopic.php … 20&p=25886 Bisher hatte ich keine Fehler, aber ich werde es mir ansehen, wenn ich Zeit finde. Danke für die Meldung! Gruß Pix
  • Globales Script: Variablen hinterlegen

    Verschoben
    16
    0 Stimmen
    16 Beiträge
    4k Aufrufe
    paul53P
    @bahnuhr: schreib mal bitte etwas mehr. ` Gerade bei Systemvariablen bietet sich die Verwendung des Namen (common.name) an, die aus der CCU automatisch in die Datenpunkte des Rega-Adapters übernommen werden. Auch den Datenpunkten des RPC-Adapters können Namen vergeben werden. Dies muss allerdings manuell im Reiter "Objekte" erfolgen, da auf der CCU nur Geräte und Kanäle (und SV) frei vergebbare Namen erhalten können, nicht jedoch die Hardware-Datenpunkte. Kein Objekt-Name innerhalb ioBrokers sollte doppelt vergeben werden. getIdByName(name) liefert in diesem Fall ein Array mit zwei/mehreren IDs, womit die Funktionen, in denen die ID verwendet wird, nichts anfangen können.
  • Nebenläufigkeitsproblem in ioBroker.node-red [Pull-Request anbei]

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    860 Aufrufe
    Niemand hat geantwortet
  • Script mit mehreren "on" wird 2x ausgeführt -> warum?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    763 Aufrufe
    bahnuhrB
    Hatte es jetzt so gelöst: filename="bild1.jpg" index="0">~~ Aber deine Lösung gefällt mir besser. Werde ich wieder ändern. Danke.
  • Doppelte Ausführung von Skriptcode.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    M
    Hallo ihr beiden, ja, es war beides korrekt. Sowohl den TImer muss ich zurücksetzten damit es sauber ist, als auch auf das ack flag schauen. Da ich erst mit der Programmierung anfange, bin ich froh über jedes Beispiel und Frage, die ich hier beitragen kann, auch wenn Sie noch so einfach erscheint ;-) Grüße, Jens
  • Verständnisfrage: Event mit Daten von iobroker anreichern…

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    846 Aufrufe
    Niemand hat geantwortet

382

Online

32.4k

Benutzer

81.5k

Themen

1.3m

Beiträge