Skip to content

Skripten / Logik

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

16.5k Themen 213.2k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Themen
    49k Beiträge
    P
    @arnod Leider ist das Problem immer noch vorhanden. Welchen Hysteresewert muss ich denn bei mir anpassen, damit ich mein Problem abmindern kann? Ich habe gesehen, dass es mehrere Hysteresewerte im Script gibt.
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    M
    Ich habe einen zweiten Statuspunkt (Briefkasten_State) dazu genommen, den ich über einen Button immer wieder zurücksetze. [image: 1769854217178-screenshot-2026-01-31-110831.png]
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Themen
    13k Beiträge
    S
    welche Palette hast du installiert, damit du den "AND" Baustein hast?
  • Skript zur Prüfung der Erreichbarkeit eines Dienst per Telnet (Port 80)

    Verschoben
    4
    2
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    ruhr70R
    @simpixo: Hallo ruhr70 Wie erstellst du eigentlich diese Eventliste? Sowas hätte ich auch gern… Danke und Gruß Adrian ` Ich habe Skript laufen, welches einen Datenpunkt überwacht. Wenn sich bei dem Datenpunkt etwas ändert, wird die Eventliste den Inhalt des Datenpunks um einen Eintrag erweitert. Skript und Beschreibung, siehe: http://forum.iobroker.net/viewtopic.php … ent#p39480 Dazu gibt es dann ein globales "Skript" event(), damit aus jedem beliebigen Skript ein Ereignis erzeugt werden kann. Das globale "Skript": function event(text) { log("Event: " + text); setState("javascript.0.Ereignisliste.event",text); } Wenn man nun in einem Skript event("ein **neuer** Tag beginnt"); schreibt, wird die Ereignisliste um den Eintrag 05.12. 17:42 ein neuer Tag beginnt erweitert. Man könnte auch mehrere Listen beschreiben. Dann brächte man für jede Liste ein Event-Skript und die globale event() Funktion müsste so erweitert werden, dass man auswählen kann, welche Liste gemeint ist, z.B.: event("Eintrag in die Hauptliste (Default"); event("Eintrag in Liste 1",1); event("Eintrag in Liste Systemereignisse","Systemevents"); Das muss dann halt angepasst werden.
  • Klingel / view umschaltung bei Betätigung… nur wie ?

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    763 Aufrufe
    S
    Hallo Rubi, ich nutze so etwas ähnliches wie du beschreibst. Ich lasse von meiner Klingel eine Variable auf "true" setzen wenn jemand klingelt. Diese nutze ich dann um in meinem "Homeview" ein widget mit dem Inhalt "Es ist jemand an der Haustür" anzeigen zu lassen. Dafür habe ich ein neues VIEW mit den folgenden Widgets erstellt: [{"tpl":"tplHtml","data":{"hm_id":65535,"digits":"","factor":1,"min":0,"max":1,"step":0.01,"html":"Da ist jemand an der Haustür","visibility-cond":"==","visibility-val":1,"refreshInterval":"0","views":["OG","Garten"],"gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"visibility-groups-action":"hide"},"style":{"left":"0px","top":"15px","width":"392px","height":"160px","text-shadow":"","color":"darkred","font-size":"45px","font-family":"Tahoma, Geneva, sans-serif","line-height":"","font-weight":"700","padding":"","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplBasicState","data":{"oid":"hm-rega.0.16791","visibility-cond":"==","visibility-val":1,"gestures-offsetX":0,"gestures-offsetY":0,"value":"false","html":"Schließen","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"visibility-groups-action":"hide","views":["Wetter"]},"style":{"left":"12px","top":"588px","color":"darkred","width":"370px","height":"44px","font-size":"xx-large","text-align":"center","background":"white","font-weight":"bold","font-family":"Tahoma, Geneva, sans-serif"},"widgetSet":"basic"}] Dann habe ich auf dem Hauptview noch das folgende Widget erstellt: [{"tpl":"tplContainerView","data":{"visibility-cond":"==","visibility-val":"true","gestures-offsetX":0,"gestures-offsetY":0,"contains_view":"Haustuer","visibility-oid":"hm-rega.0.16791","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"visibility-groups-action":"hide"},"style":{"left":"490px","top":"104px","width":"390px","height":"680px","z-index":"10"},"widgetSet":"basic"}] Ich hoffe das hilft dir schon mal ein wenig in die richtige Richtung die du möchtest. Gruß Sven
  • Triggern von Scripten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    4k Aufrufe
    P
    Hallo zusammen, wenn ich die Skripte richtig lese, dann wird die Anwesenheit auf CCU2 auf true gesetzt, wenn sich die Anwesenheit auf CCU1 ändert. Also bei jeder Änderung, auch bei Änderung zu false. @hmanfred: CCU1 auf die CCU2 "spiegeln". ` Laut iobroker.javascript-Github readme ist die einfachste Art, zwei States zu synchronisieren doch so (vom ersten zum zweiten State): on("hm-rega.0.41913"/*Anwesend*/, "hm-rega.1.1881"/*Anwesend*/); ````oder für mehr Übersichtlichkeit: var ccu1anwesenheit = "hm-rega.0.41913"/Anwesend/, ccu2anwesenheit = "hm-rega.1.1881"/Anwesend/; on(ccu1anwesenheit, ccu2anwesenheit); Gruß Pix
  • Mein Javascript global und neue Art js-scripte zu schreiben

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    4k Aufrufe
    frankjokeF
    Hallo ruhr! Kein Problem, können/sollen auch sehr wohl Fragen gestellt werden! Man ist ja selbst immer 'betriebsblind'. Nach der kleinen Zwangspause gehts weiter. Habe eins vergessen: Wie schaut ihr welche Node-Version ihr habt? mit node -v geht das ganz leicht. Hatte gestern einen Raspi 3 mit dem neuen Jessie-Image von letzter Woche gestartet und war geschockt dass da noch 0.10.irgendwas dabei war. Das wird in einigen Wochen nicht mehr supported! Um am Raspi (oder anderen Debian Linux) ein neueres node zu installieren lädt man die nodesource mit curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - oder curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install nodejs Die 6er ist die letztgültige Long-Time-Support-Version (Boron). Es gibt auch 7er aber das ist nur für developers da sie nach Erscheinen der 8ter (nächstes halbes Jahr) dann nicht mehr supported werden. Unter Windows rate ich auf https://nodejs.org/de/download/ sich die letzte oder andere Versionen wie 4.6.x dort zu suchen https://nodejs.org/en/download/releases/. Ja, so machen wir mal weiter. In vielen Scripten muss man Variablen anlegen. Ich habe mir das so angewöhnt: function createStates () { "use strict"; // Die Funktion returniert eine Promise damit sie verschachtelt werden kann!, 'use strict' erlaubt verwendung von let usw. _D("Create States"); const states = [ // Ich kreiere eine objekt-Array mit allen zu erzeugenden Objekten { id: alarm, val: false, common: {type: 'boolean',name:alarm, unit: '',role: 'state',write:true}}, { id: alarmPot, val: "", common: {type: 'string',name:alarmPot, unit: '',role: 'state',write:true}}, { id: alarmState, val: 0, common: {type: 'number',name:alarmState, unit: '',role: 'state',write:true,max:2,min:0,states:'0:Aus;1:Nacht;2:Ein'}}, ]; for (let i=0; i<3;i++) // muss 3 Variablem programmatisch anlegen, können ja auch von aussen kommen states.push({ id: dpPfad+'Var_'+i , val: i, common: {type: 'number',name:`${dpPfad}Variable ${i}`, unit: '',role: 'state',write:true}}); return pSeries(states, (item) => pCst(item.id,item.val,item.common,{}).then(() => item.id), 10) // cSt ist die in Promise umgewandelte Form von createState, ruft pSeries ruft es für jedes array-item auf und fügt zwischen den items 10ms Pause ein .then(x => wait(100,_D('end created states:'+_O(x),x))); // am Ende wird die Liste der angelegten ID's ausgegeben und 100ms gewartet } Damit erzeuge ich erstmals ein array von Objekten die die Variablen beschreiben, entweder hard-coded oder programmatisch und dann kreiere ich alle Variablen mittels pSeries. pSeries(iterable, functionPromise, delay) durchläuft die iterable (kann ein Objekt oder Array sein) und ruft functionPromis(item) für jedes item auf. Die Funktion muß eione Promise zurückgeben. Falls delay angegeben wird wird so viele ms gewartet und dann (sonst sofort) das nächste item aufgerufen. der Teil '(item) => pCst(item.id,item.val,item.common,{}).then(() => item.id)' verwendet die umgewandelte createState und gibt eine id and pSeries zurück. pSeries sammelt alle returnbieren Arguimente und wenn es durch ist giebt sie al array zurück. Damit kann '.then(x =>…' dieses Array anzeigen, warten und selbst dann zurückgegeben werden. Am Ende unseres scripts steht die Folge: wait(100) .then(() => createStates()) .then(() => onAnlegen()) // ist ähnlich wie createStates aufgebaut. .then(() => main()) // test functions .catch(error => _W(_O(error))) // war da ein Fehler? .then(() => _I(`Finished Initialization and running ${instanz}${name}`)); Damit wird beim Start des scriptes zuerst 100ms gewartet, dann dies Variablen kreiert, dann onAnlegen ausgeführt, dann main ausgeführte, dann auf eventuellen Fehlern in einigen der vorigen Routinen geprüft und dann die info ausgegeben dass das Script jetzt läuft! Was kann man sonst noch machen? Ich zeig mal ein Beispiel welches fast gleich ich einen Adapter eingeflossen ist (hab dort nur einen cache eingebaut um nicht alle x Sekunden das selbe abzufragen): arp-scan kann unter linux mit sudo apt-get install arp-scan installiert werden uns scannt das lokale Netz nach angeschlossenen/laufenden Geräten. const dns = require('dns'); // inkludiere die 'dns'-funktionen pExec('arp-scan -lgq --retry=10') // rufe arp-scan auf .then(res => res && res.match(/(\d*\.){3}\d*\s*([\dA-F]{2}\:){5}[\dA-F]{2}/gi)) // gib ein Array aus die aus den IP und MAC-Adressen besteht die gefunden wurden .then(res => pSeries(res, item => { // Für jedes gefundene IP/MAC-Paar const s = item.split('\t'); // splitte die IP von der MAC-Adresse, diese sind durch \t getrennt return pGet('http://api.macvendors.com/'+s[1]) // nun prüfe mittels einer web-Api wer der Erzeuge für die HW ist mit dieser Mac-Adresse .then(x => x.trim(), err => 'Vendor not found') // wenn ein Fehler auftritt und der Hersteller nicht gefunden wird gib 'Vendor not found' zurück .then(x => s.push(x) && c2pP(dns.reverse)(s[0])) // hänge an das split array den Herstellernamen an und versuche einen dns.reverse call mit der IP-Adresse um den Namen am lokalen DNS-Server zu erfahren .then(nam => s.concat(nam), err => s.concat(['N/A'])) // Hänge den Namen oder 'N/A' an wenn er nicht gefunden wurde .then(res => res.join('; ')); // Mach aus dem Array ein String mit '; ' getrennt },10)) // warte 10ms nach jedem gefundenen Paar .then(res => pSeries(res,item => _D(_O(item),Promise.resolve()))); // Zeig alle Ergebnisse an. Promise.resolve returniert eine Promise die sofort 'Erfolg' bestätigt. Warum verwende ich lieber const/let? Es reduziert die Proigrammierfehler! Mit const s = xxx sag ich dass ich s diesen Block definiere und es nicht neu zugewiesen werden darf. Mit s.push() kann ich den Inhalt veändern aber ich darf s nich mit s = x neu zuweisen. Mit let definiert man variablen die auch nur in diesem Block gültig sind, also ist `var k = [1,2,3]; for (let i in k) { let j = k[i]; for(let k of [11,22,33]) _D(`${k}:${j}`); } _D(k);` immer eine neue Variable i,j und k und das 'var k' bleibt so wie es ist. Aber Vorsicht: Wenn ihr Node Version 4.x oder darunter (0.12) verwendet ist let nur anwendbar wenn '"use strict";' auf Funktionslevel angewendet wird. Wenn ihr Version 6.9.x verwendet (die momentane Note-LTS = Long Time Support-Version) dann ist let auch im gesamten schript ohne '"use strict";' möglich. In einer weiteren Folge weden wir dann einige weiteren Tricks beleuchten! Liebe Grüße Frank[/i]
  • Scriptersatz für direkte Verknüpfung in iobroker?

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    B
    Naja, da sind deiner Logik keine Grenzen gesetzt. Gäste, Abwesenheit usw sind Variablen die abgeprüft werden. Morgens hoch hängt davon ab wie die realen Lichtverhältnisse sind (Bewegungsmelder oder Lichtsensor außen), abends automatisch runter mögen wir nicht. Drücken beim Schlafen gehen eine zentrale Taste. Laufen lasse ich alles auf der CCU, dafür ist sie da und das funktioniert auch alles. Zu den Berechnungen gibt's im Homematic Forum viele Threads. Das Tageszeiten Script würde ich noch empfehlen. Das gliedert den Tag abhängig von Sonnen auf / Untergang ganz sinnvoll. Grüße Brati von unterwegs gesendet.
  • Optimaler Umgang mit Request Fehlern

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    blauholstenB
    Hi, Hier ist Recht gut beschrieben warum das mit try…Catch nicht funktioniert. <url url="http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html">~~[http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html" target="_blank">](</s><LINK_TEXT text=)~~ [<link_text text=" http://m.heise.de/developer/artikel/Ei … 52531.html">http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html</link_text>](</s><LINK_TEXT text=)</url>
  • Durchschnittswerte errechnen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    826 Aufrufe
    paul53P
    Du kannst sicherlich die Energiewerte (Einspeisung, Verbrauch) täglich zu einer festen Uhrzeit (schedule) abfragen. Die durchschnittliche Leistung eines Tages lässt sich daraus einfach berechnen: 24-h-Durchschnitts-Leistung = (Energie_heute - Energie_gestern) / 24 h
  • Suche einige Funktionen.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    579 Aufrufe
    eric2905E
    Hi, @ThomasD: Danke erst einmal, aber wie führe ich die Kommandos im Javascript aus? ` einmal die Suche genutzt und schon was passendes gefunden ;-) http://forum.iobroker.net/viewtopic.php?t=3228 Gruß, Eric
  • [erledigt]Zeichenkette zerlegen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    701 Aufrufe
    blauholstenB
    Hi, danke für deine schnelle Antwort. Hatte das mit dem Objekt Zugriff auch schon vorhin probiert. Aber das mit dem // Falls es ein JSON-string ist ist mir nicht eingefallen, darum ging es nicht. :oops: DANKE NOCHMAL
  • String in 2 Variable/Objekte

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    4k Aufrufe
    M
    Danke für die ausführliche Antwort, hatte die Anzahl der Ausgänge nur auf 2 erhöht. Werde das heute Abend nochmal versuchen. Gruß Micha Gesendet von iPhone mit Tapatalk
  • Fritzbox bedienen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    L
    Morgen, Hat jemand schon ne Möglichkeit gefunden die Anrufliste im der Fritzbox per HTTP zu löschen? Oder per Command im TR064 Adapter? Mfg Sven
  • Widget Bars Filter

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    M
    Ich habe es wie PIX es bereits beschrieben hat mit 5 Views übereinander realisiert. Ich habe eine Standard View "3". Sollte eine Kamera eine Bewegung fest stellen ändert sich der Wert einer Variablen und das einsprechende View wird sichtbar. Nach zwei Minuten wird dann wieder auf die Standardview umgeschaltet. Läuft sehr gut. Ein Tip vielleicht noch: Im Vis unter Setup habe die Einstellung "Löschen aus RAM nicht aktive Views: nie" gesetzt. Sonst passiert es das auf eine View geschaltet wird und du hast zuerst ein "leeres Bild". Gruß Michael [image: 326_unbenannt.jpg]
  • Anzahl eingeschaltet Lichter (inkl. Dimmer)

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    P
    Hier ein aktueller Link: http://forum.iobroker.net/viewtopic.php … 673#p41673 Pix
  • [GELÖST] Synchronisation zwischen 2 Heizkörper-Thermostaten

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    DutchmanD
    @GerdSo: Nachtrag: Ich habe jetzt in der CCU2 eine Gruppe für die Thermostate angelegt und damit funktioniert es einwandfrei, d.h. es wird nicht mehr per Skript synchronisiert sondern direkt in der Zentrale per direkter Verknüpfung ` Wäre auch mein Vorschlag gewesen dafür sind ja die Gruppen da, Frage gelöst?." (Bitte im Topic erwähnen) Sent from my iPhone using Tapatalk
  • Kopierte Scripts von der Webseite enthalten HTML Kodierung

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    1k Aufrufe
    paul53P
    Jetzt funktieren alle Links :mrgreen:
  • [erledigt]States aus JS Instanz "auslesen"

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    460 Aufrufe
    BluefoxB
    $("[id=javascript.0.*]").each(function (id) { console.log(id); }) https://github.com/ioBroker/ioBroker.ja ... --selector
  • SendTo Ausführung

    Verschoben
    14
    0 Stimmen
    14 Beiträge
    2k Aufrufe
    a200A
    @Bluefox: for (i=0;i<5;i++) { (function (dp) { getHistoryGet(<datum>, dp); })("mein.data.point_"+i); }</datum> ```` ` Funktioniert bei mir top! Danke!
  • Mittelwert erstellen aus 9 Sensoren

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    apollon77A
    Wobei der Mittelwert ggf nicht wirklich sinnvoll ist, vor allem wenn Du Räume mit größeren Abweichungen hast. percentile(50%) wäre sinnvoller. z.B. so: http://stackoverflow.com/questions/2404 … les-in-php :-) Also vorher trotzdem die 9 Werte sammeln und in ein Array packen. Dann das nehmen. So als "Hintergrundwissen" dazu ist der Artiekl hier recht gut: http://apmblog.dynatrace.com/2012/11/14 ... are-great/ Ich bin inzwischen weg von Mittelwerten
  • Geofency 2\. Teilnehmer oder mehrere

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    853 Aufrufe
    apollon77A
    einfach über die URL!! siehe http://forum.iobroker.net/viewtopic.php?f=20&t=2076
  • JavaScript zum Widget

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    3k Aufrufe
    Alex1808A
    kann man das nicht einfach mit variablen realisieren? Für jede taste eine variable, und eine "Clear" für reset. Dann im script bei erfolgreiche Eingabe bzw. Zusammenstellung von variablen, was machen und variablen zurücksetzen auf 0. und so w. nur ab zwei gleiche zahlen wird komplizierter :)

347

Online

32.6k

Benutzer

82.2k

Themen

1.3m

Beiträge