Weiter zum Inhalt

Skripten / Logik

16.7k Themen 216.0k 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
    Murphy 0M
    Um die Taktung (das „Pulsen“ oder Takten) eines E-Herds in ioBroker zu erkennen und so den Heimspeicher (Akku) vor hohen Lastspitzen oder ständigen Entlade-Wechseln zu schonen, messen Sie die Leistung über einen Energiemesser (z. B. Shelly 3EM) und werten die schnellen Lastwechsel per Skript aus, um den Akku bei Bedarf zu sperren. Für dieses Problem habe ich mir ein JS erstellt. Die Regelung des Zendure Hyper 2000 stoppe ich so lange das Pulsen läuft. Die Umschaltzeiten von Laden auf Entladen habe ich auf 20 Sekunden gesetzt um den Hyper zu schonen. Mein E-Herd pulst nach der Aufwärmphasezwischen 30 und 60 Sekunden. Macht also keinen Sinn. Pulserkennung Elektroherd.js
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    D
    @bullemausberlin ich denke Du hast alles richtig eingebaut. Es liegt vermutlich daran dass Dein Gerät im Json einen anderen Aufbau hat und daher die Reihenfolge der Values angepasst werden muss. Das war es z.B. bei mir. Mit diesen Anpassungen hat es dann funktioniert. Damit du es testen kannst musst du einen wert im Json ändern damit das Skript überhaupt wieder läuft [image: 1786786935571-c72ebed5-1fa5-429c-8268-7634d479d031-image.jpeg] Du siehst in meinem Fall war es 3.value und 3.target für die Temperatur und 2.value für superfrost. Sonst schick doch mal ein Bild von Deinem Json dann kann man das genau sagen.
  • Hilfe für Skripterstellung mit Node-RED

    964 13k
    964 Themen
    13k Beiträge
    P
    Statt des Screenshots am besten den Node-Red-Export hier in Code-Tags posten. Dann kann man sehen, ob man helfen kann.
  • Delay zwischen 2 Befehlen

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    12k 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
    1k 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
    1k 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
    aftershowmanA
    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
    1k Aufrufe
    Niemand hat geantwortet
  • Skripte gelöscht

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    595 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
    619 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
    2k 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
    892 Aufrufe
    Niemand hat geantwortet
  • Script mit mehreren "on" wird 2x ausgeführt -> warum?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    895 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
    883 Aufrufe
    Niemand hat geantwortet
  • Adapter iCal -

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    1k Aufrufe
    D
    Hallo, gut, oder auch nicht… Scheint ein Fehler zu sein. Bei dem Script von Pix (Geburtstag und Müllkalender) wird der table Wert verwendet. Liest der Adapter Entwickler hier mit und ist aktiv oder muss ich Ihn anders kontaktieren? VG Michael
  • HM Aktor nach Astro einschalten und zu einer definierten Uhrzeit ausschalten

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

445

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge