Skip to content

Skripten / Logik

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

16.5k Themen 213.3k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Themen
    49k Beiträge
    azzkikrboyA
    @arnod OK, dann lass ich es leiber so :-) Als ich die neue Version kopiert habe ist mir aufgefallen, dass es ein neues Design für die Übersicht gibt. Wenn ich das neue .js bei mir einbaue, sieht es aber immer noch so aus wie vorher ... Ist zwar nur die Optik, sieht aber besser aus ;-) Woran kann das liegen? neu: [image: 1770466556270-ea702700-2a5a-49aa-bd8f-f6f4a89477dc-grafik.png] alt? (nach einfügen der neuen .js) [image: 1770467005603-d70df4e6-08b4-4c6b-abbc-914ac65bf5fe-grafik.png]
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    WinniW
    Das habe ich dann wohl falsch verstanden, weil Joachim schrieb: "Nun aber der Haken - betrete ich nach 30min wieder das Haus, soll er ja eigentlich NICHTS gemacht haben, sondern eben erst nach 240min" Aber egal, Hauptsache am Ende kommt eine gute Lösung für den to heraus :)
  • 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?
  • Geht Trigger im Trigger?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    AlCalzoneA
    @Skydream: hmmmm…..glaube ich nicht. ;) Da ist doch kein warte/sleep etc drin. ` Blöd ausgedrückt… ich wollte den inneren Trigger durch eine if-Abfrage ersetzen. Der stand ja im Timeout. Kommt davon, wenn man auf der Arbeit nebenher Fragen beantwortet :D
  • Probleme mit Variablenabfrage

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    483 Aufrufe
    AlCalzoneA
    time ist ein String mit dem Namen des Datenpunkts var time = pfad + raum + "." + neuedatenpunkte["Timeout"].DpName; // DP Timeout to ist der konfigurierte Timeout (Zahl) var to = datenpunkte[raum].Objekt_Timeout; // Timeout-Wert lesen Und hier vergleichst du, ob der Name des Datenpunkts (String) größer oder kleiner als der Timeoutwert (Zahl) ist: if (time >= to) setState(warn, true); if (time < to) setState(warn, false); Das kann nicht funktionieren. Wenn du den Inhalt eines Datenpunkts vergleichen willst, musst du diesen vorher mit getState(datenpunktID) auslesen.
  • [Gelöst] Blockly - Ventilatorsteuerung Verständnisfrage

    Verschoben
    18
    1
    0 Stimmen
    18 Beiträge
    3k Aufrufe
    rantanplanR
    Sieht gut aus. Willkommen im Club :D
  • Cron Job startet mehrmals.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    856 Aufrufe
    L
    @ThomasD: Hallo, sieht nach dem gleichen Problem aus, ich hatte inzwischen den ioBroker mit sudo iobroker stop und start neu gestarte: ` > 0 false javascript.0 2017-12-06 18:58:00.423 1 false javascript.0 2017-12-06 18:57:00.435 0 false javascript.0 2017-12-06 18:56:00.424 1 false javascript.0 2017-12-06 18:55:00.425 0 false javascript.0 2017-12-06 18:54:00.424 1 false javascript.0 2017-12-06 18:53:00.423 0 false javascript.0 2017-12-06 18:52:00.616 1 false javascript.0 2017-12-06 18:51:00.424 0 false javascript.0 2017-12-06 18:50:00.428 1 false javascript.0 2017-12-06 18:49:00.436 0 false javascript.0 2017-12-06 18:48:00.424 1 false javascript.0 2017-12-06 18:47:00.425 0 false javascript.0 2017-12-06 18:46:00.424 1 false javascript.0 2017-12-06 18:45:00.424 0 false javascript.0 2017-12-06 18:44:00.424 ` Jetzt geht es erst einmal. Vielleicht sind meine Anderen Problem jetzt auch erst mal verschwunden :-). Schöne Grüße ThomasD ` Ok. Werde ich dann mal in Telko Reporten. Workaround ist, das Script zu stoppen - aendern- speichern - Script starten. Dann hast du das Problem nicht. Vg looxer Mobile getapt Gesendet von meinem SM-G935F mit Tapatalk
  • [Gelöst]State erstellen mit speziellen Zugriffrechten wie ???

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    501 Aufrufe
    C
    @paul53: Das sollte gehen, wenn setObject in der JS-Komfiguration freigegeben ist. ` Super! Das mit der js config habe ich natürlich überhaut nicht bedacht! Danke!
  • Wert von Somfy IO Temperatursensor in K lesen und in neues Objekt in °C schreiben

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    825 Aufrufe
    paul53P
    @ronny82: Besteht die Möglichkeit den Temperaturwert auf 1 Nachkommastelle zu runden, z.B. 20.1°C? ` setState(idTempC, Math.round(10 * (dp.state.val - 273.1)) / 10, true);
  • Alle Thermostate mit neuem Partymodus updaten

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    L
    Hi, ich beschäftige mich schon eine Zeit lang mit der Steuerung von Thermostaten. (Heizungsscript ist veröffentlicht) Beim Heizungsscript habe ich immer auf den DC geachtet. Ausschläge gibt es nur, wenn ich mehrfach hintereinander an alle Thermostate sende. Hochgerechnet au deine 26 Thermostate dürfte es bei z.B. einer Temperaturänderung nicht zu einer Überschreitung des DC kommen. (PartyMode Änderungen sind allerdings bei mir nicht vorgesehen , da das Konzept ein anderes ist)- könnte also mit längerer Sendezeit bei der Änderung des Party-Modus zusammenhängen) Aus meiner Sicht hast du die folgenden Optionen: du fügst Hardware hinzu, die den DC aufteilt. Das sind z.B. Wandthermostate, die dann mehrere Heizungsthermostate steuern müssten. Ich nehme mal nicht an, dass du 26 Räume hast. Du fügst LAN Adapter hinzu (bei nicht IP-Geräten) du versuchst software technisch den DC in den Griff zu bekommen du Gruppierst die Geräte mit der CCU (wenn es denn keine alten Thermostate sind) und sprichst dann nur jeweils ein Gerät an. Könnte aber sein, dass da ein Problem auftaucht. Ich hatte das mal mit dem Boost Modus. Der wurde zwar weitergereicht, wenn ich den Boost Modus am WT manuell bediene aber nicht per Software. Kommt auf einen Versuch an. du sendest zeitversetzt über Verzögerungen vG Looxer
  • Auf Wert triggern?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    433 Aufrufe
    P
    on({ id: 'mqtt.0.Sensor.RFID', val: 'WUNSCHWERT' }, function (data) { log("Transponder ID: " + data.state.val); }); Gruß Pix
  • Wert wird nicht gelesen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    592 Aufrufe
    K
    Danke für die ausführliche Erklärung!
  • Raumname ermitteln

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    3k Aufrufe
    R
    Nein, geht leider nicht. Ich habe meine Kanäle auch mehr als einem Raum zugewiesen. Eigentlich sollte dann ein Array mit allen Räumen zurückgeliefert werden. Gesendet von meinem A0001 mit Tapatalk
  • Frage: im Skript prüfen, ob ein Datenpunkt vorhanden ist

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    4k Aufrufe
    P
    Hallo paul53, ohne den Code zu versuchen, kann ich aber sagen, dass ich in anderen Teilen des Skriptes schon auf LEVEL_REAL reagiere. Das ist nicht das Problem. Ich zähle grundsätzlich alle Geräte, deren LEVEL_REAL sich ändern. Alle diese Geräte haben virtuelle Kanäle, die ich viel nutze. Meistens sind es drei virtuelle Kanäle, die dann verknüpft sind. LEVEL_REAL ist in jedem Kanal vorhanden, zeigt aber immer den selben Wert, nämlich das Ergebnis der Verknüpfung und damit die tatsächliche Helligkeit (bei einer Lampe). Es gibt nun aber auch Geräte, die nur den LEVEL Datenpunkt haben. Diese kann ich nicht mit dem Subscribe auf LEVEL_REAL überwachen. Daher überwache ich einmal LEVEL_REAL und einmal LEVEL. Letzteres schließt alle Geräte, die LEVEL_REAL besitzen, mit ein. Daher prüfe ich dann noch genau darauf, denn die älteren Dimmer von HM haben kein LEVEL_REAL. Hier nochmal das ganze Skript: ! ```` /* Status Zahl Lichter ! zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Licht" ! Vorraussetzung: globale Funktion deleteDuplicates() ! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564 23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt Log Ausgabe auskommentiert 05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php?f=21&t=473&start=20#p9267 24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens) 06.05.2016 Datenpunkt für Ansagen zugefügt 02.07.2016 abgeschaltet, da Fehler 03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer search statt indexOf und RegEx für Suche nach Virtuellen Kanälen 27.11.2016 Verschoben in Status Code optimiert 19.12.2016 Räume eingebaut 25.12.2016 Doppelte Einträge aus dem Raum-Array werden mit deleteDuplicates gelöscht 12.11.2017 Wenn bei Dimmern zusätzlich zu LEVEL noch der DP LEVEL_REAL vorhanden ist, wird LEVEL ignoriert 04.12.2017 Virtuelle Kanäle nun übner Kanalnummer des Objekts herausgefiltert LEVEL Datenpunkte werden nicht gezählt, wenn Gerät auch einen LEVEL_REAL hat todo: erzeugt noch Fehler, wenn kein LEVEL_REAL vorhanden: State "hm-rpc.0.FEQ0069673.1.LEVEL_REAL" not found */ var logging = false; ! var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein', idAnzahl = 'javascript.0.Status.Lichter.Anzahl', idText = 'javascript.0.Status.Lichter.Text', idRaum = 'javascript.0.Status.Lichter.Raum', idAnsage = 'javascript.0.Status.Lichter.Ansage'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter type: 'number', name: 'Anzahl aller Lichter', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der eingeschalteten Lichter', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Eingeschaltete Lichter', desc: 'Namen der eingeschalteten Lichter', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Eingeschaltete Lichter (Ansage)', desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { // Räume, in denen Lichter brennen type: 'string', name: 'Räume mit eingeschalteten Lichter', desc: 'Namen der Räume, in denen Lichter eingeschaltet sind', def: ' ', role: 'value' }); ! var cacheSelectorState = $('channelstate.id=*.STATE'); // Gewerk Licht var cacheSelectorLevel = $('channelstate.id=*.LEVEL'); var cacheSelectorLevelReal = $('channelstate.id=*.LEVEL_REAL'); ! function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; var textRaum = []; if (logging) { log('++++++ Lichter Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // ENDE VK-Abfrage }); if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.LEVEL aus Text entfernen var raumname = getObject(id, "rooms"); var objid = obj._id; // hm-rpc.0.LEQ1234567.1.LEVEL var objid_arr = objid.split("."); if (parseInt(objid_arr[3]) <= 1 ) { // Kanalnummer kleiner gleich 1 (also keine virtuellen Kanäle) if (!getObject(objid + '_REAL')) { // <<<<<<<<<<<<<< RELEVANTE ZEILE if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } else if (logging) log('Gerät hat auch LEVEL_REAL Datenpunkt, daher wird LEVEL nicht gezählt.'); } else if (logging) log ('keine Zählung, da virtueller Kanal ' + objid); }); cacheSelectorLevelReal.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL_REAL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL_REAL")); //.LEVEL_REAL aus Text entfernen var raumname = getObject(id, "rooms"); var objid = obj._id; // hm-rpc.0.LEQ1234567.1.LEVEL_REAL var objid_arr = objid.split("."); // ########## Abfrage ob Virtueller Kanal? if (parseInt(objid_arr[3]) <= 1 ) { // Kanalnummer kleiner gleich 1 (also keine Virtuellen Kanäle) if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // Ende Abfrage VK }); textRaum = deleteDuplicates(textRaum); ! // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt } ! // Trigger cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat if (!getObject(obj.id + '_REAL').val ) checkDevices(); // <<<<<<<<<<<<<< RELEVANTE ZEILE }); cacheSelectorLevelReal.on(function(obj) { // bei Zustandänderung *.LEVEL_REAL im Gewerk Licht if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); ! function main() { setTimeout(function(){ if (logging) log('Auslöser Skriptstart'); checkDevices(); }, 2000); } ! main(); // Skriptstart-Auslöser ! // Aufbereitung für Ansage function strip_tags(data) { var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " "); return(rueckgabe); } ! on(idText, function (obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet'; setState(idAnsage, text); }); ! ```` Gruß Pix
  • URL Request mit Blockly

    Verschoben
    12
    1
    0 Stimmen
    12 Beiträge
    5k Aufrufe
    G
    Ich werd narrisch :D Genau so funktioniert es! Vielen, herzlichen Dank an Dutchman und AlCalzone. Ich hatte schon in vielen anderen Foren-Beiträgen den Hinweis mit setState gelesen. Ich konnte es aber nie richtig in meinem Script umsetzen (habe z.B. setState("javascript.0.Test_Objekt_JS").val = arr_test; versucht usw…). Aber jetzt habe ich es verstanden. Ich poste hier mal für alle anderen Suchenden meine Lösung. Use-Case: Meine ETA-Heizung (mit Web-Server) liefert mir auf einen URL-Request eine entsprechende Antwort als XML (siehe Beispiel oben). Ich möchte nun diese Antwort in ein (globales) Objekt speichern. Ziel ist diesen String in JS/ Blockly/ vis weiterzuverwenden. Das Objekt "javascript.0.Test_Objekt_JS" bzw. Datenpunkt habe ich in ioBroker im Reiter "Objekte" als Objekt definiert Das Script sieht so aus: var parseString = require('xml2js').parseString; var request = require('request'); arr_test = []; request('http://192.168.178.13:8080/user/var//112/10021/0/0/12000', function (error, response, body) { if (!error && response.statusCode == 200) { parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { if (err) { log("Fehler: " + err); } else { arr_test = (JSON.stringify(result.eta)); setState("javascript.0.Test_Objekt_JS", arr_test); } }); } else { log(error); } }); Kleiner Schönheitsfehler: Es erscheint im log die Warnung```` 10:52:30.773 [warn] javascript.0 at script.js.Skript1:30:15 10:52:30.778 [warn] javascript.0 at Request._callback (script.js.Skript1:20:7)
  • [Gelöst] Monitor per Scriptbefehl aufwecken. (Linux / Raspian)

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    2k Aufrufe
    T
    Hallo, so, ich denke ich hab es. Hier aber trotzdem nach meine Skripte: Javascript Adapter auf dem slave wo auch der Webbrowser läuft: schedule("* * * * *", function (obj) { var wakeup = '/opt/iobroker/wakeup.sh'; exec(wakeup); }); Da ioBroker als root läuft, braucht man den ersten Schritt nicht: > setfacl -m u:the-user:r ~/.Xauthority Hier dann das shell Skript: #!/bin/bash DISPLAY=:0 XAUTHORITY=~pi/.Xauthority xdotool mousemove 10 20 Danke und Schöne Grüße ThomasD
  • Frage zu Script Fenster zählen

    Verschoben
    4
    2
    0 Stimmen
    4 Beiträge
    816 Aufrufe
    dslraserD
    @tempestas: Hallo, die IP Fensterkontake haben als Zustand "1/0" für "offen/zu". Dieser Teil status === 2 /*RHS*/ ist für die Drehgriffkontakte zuständig, die eben für gedreht noch die 2 ausgeben. Eigentlich sollte bei dir da gar nichts kommen, denn deine Kontakte können keine 2 ausgeben als Status für Telegram musst du durch \n ersetzen als Zeilenumbruch ` Ich habe mir das nochmal angesehen. Wenn ich das Script richtig verstehe ist das für Drehgriffe und für "alte Fensterkontakte oder nicht IP Kontakte" gedacht ? Kann das sein ? Denn meine IP Fensterkontakte geben auch 0/1 bei geschlossen/offen aus. (in dem Script sollen aber die TFK bei true reagieren) Kann es sein das die Drehgriffe 0/1/2 für geschlossen/gekippt/offen haben ? Dann würde es das Verhalten erklären und man könnte das Script dann so nicht mit IP Fensterkontakten und IP Drehgriffen verwenden. Dann würde mir nur noch einfallen ein zusätzliches Gewerk für Drehgriffe anzulegen und ein extra Script dafür ein zu richten ? Oder geht das vielleicht einfacher ? 3822_ipfenster.jpg 3822_ipfenster2.jpg
  • [ VORLAGE ] Zeitschaltung von Aktoren / Lampen usw

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    977 Aufrufe
    Niemand hat geantwortet
  • [Gelöst] [Frage] Skript zählen_Fenster

    Verschoben
    19
    0 Stimmen
    19 Beiträge
    2k Aufrufe
    dslraserD
    Hallo Frank, > vielen Dank für dein Script, funktioniert prima mit den "normalen" Fensterkontakten Ich möchte nur kurz richtig stellen das dieses Script nicht von mir ist, sondern hier im Forum "zusammen gesucht" und für mich abgewandelt ist. Zu Deinen Fragen, das sollte eigentlich alles machbar sein. Ich habe aber auch noch eine Frage, da ich (noch) keine Drehgriffe habe. Welche Datenpunkte haben die Griffe bei geschlossen/gekippt/ und offen ? (also geschlossen = 0 / gekippt = 1 / und offen = 2, oder ist das anders ?) Das mit dem extra Blockly Trigger habe ich bei mir übrigens bewußt so gemacht, da man den dann auch mal eben schnell abschalten kann, aber trotzdem in Telegram das Script abfragen kann. (habe ich bei mir über Text2command gelöst, abfragen könnte ich dann über das Wort Fenster, siehe Anhang) PS: ich habe bei mir gerade das original Script nochmal eingebaut und nachgesehen was da passiert. Ich habe nur die "normalen IP Fensterkontakte, die haben als Datenpunkt 0 = geschlossen und 1 = offen.(siehe Anhang) Es scheint aber so zu sein, das der Drehgriff auch 0 = geschlossen und bei gekippt = 1 und bei offen = 2 hat ? Wenn das so ist, dann wäre es blöd, weil dann 1= gekippt(Drehgriff) und 1=offen(TFK) bedeuten würde. Es sei denn der Griff hat 1 als offen und zwei für gekippt, dann würde das Script ja gehen. Die TFK Abfrage scheint für die "nicht IP Fensterkontakte" gedacht zu sein, weil die auf true regieren soll ? PPS: vielleicht sollten wir einen eigenen Thread eröffnen, da dieser hier als gelöst gekennzeichnet ist ? LG Heiko 3822_fenster.jpg 3822_t2cfenster.jpg 3822_fkontakt.jpg
  • [Gelöst] Mehrere tägliche Zeitschaltungen mit 433mhz Steckdosen über Broadlink

    Verschoben
    9
    1
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    N
    Habe das mal zu zusammengewürfelt und werde das mal testen. Einen Kurztest gab es schon. Von 9:30 bis 9:31 und 9:33 bis 9:35. Hat auch funktioniert :) Liebe Grüße Nashi 4304_iobroker_zeitplan.png
  • Hilfe bei - Vis Zeitsteuerung ( JS o. Blocky )

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    T
    Schau mal hier ( topic ist wirklich nicht eingängig, hat sich aber glsube ich zu dem entwickelt, was du suchst): http://forum.iobroker.net/viewtopic.php … 4&start=20 Da gibts eine Zeitschaltung von pix und eine von mir. Hier eins der Skripte ! ```` // ########## // Skript für Ace-K zum Schalten einer Steckdose zwischen zu zwei definierten Zeitpunkten. Steuerbar über Vis // Dank an paul53 für das Schedule Skript // v 0.2, stable, tempestas, 28.11.2017 ! var force = true; // erzwingt bei Neustart des Skript Anlegen der States mti den nachfolgend definierten Werten ! // States anlegen ! createState('Zeitschaltung.Steckdose1.Aktiv', false); ! createState('Zeitschaltung.Steckdose1.Start.Stunde',12, force, { name: 'Startstunde ', type: 'number', min: '0', max: '23', }); ! createState('Zeitschaltung.Steckdose1.Start.Minute',0, force, { name: 'Startminute ', type: 'number', min: '0', max: '59', }); ! createState('Zeitschaltung.Steckdose1.Start.MinuteString',"00", force, { // String für Anzeige in VIS; wird via function an numerischen Wert angeglichen name: 'Startminute ', type: 'string', ! }); ! createState('Zeitschaltung.Steckdose1.Start.Zeit',"12:00", force, { // String der Startzeit name: 'Startzeit ', type: 'string', ! }); ! createState('Zeitschaltung.Steckdose1.Ende.Stunde',13, force, { name: 'Endstunde ', type: 'number', min: '0', max: '23', }); ! createState('Zeitschaltung.Steckdose1.Ende.Minute',0, force, { name: 'Endminute ', type: 'number', min: '00', max: '59', }); ! createState('Zeitschaltung.Steckdose1.Ende.MinuteString','00', force, { // String für Anzeige in VIS; wird via function an numerischen Wert angeglichen name: 'Endminute ', type: 'string', min: '00', max: '59', }); ! createState('Zeitschaltung.Steckdose1.Ende.Zeit',"13:00", force, { // String der Endzeit name: 'Endzeit ', type: 'string', ! }); ! // ############################################################################################################## // ### Functions zur Anpassung der Minuten Strings an die numerischen Werte sowie Anpassung Gesamtzeit Strings ## // ############################################################################################################## ! var idAktiv = 'javascript.1.Zeitschaltung.Steckdose1.Aktiv'; ! var idMinStart = 'javascript.1.Zeitschaltung.Steckdose1.Start.Minute' ; var idStdStart = 'javascript.1.Zeitschaltung.Steckdose1.Start.Stunde' ; var idMinStartString = 'javascript.1.Zeitschaltung.Steckdose1.Start.MinuteString'; var idStartzeit = 'javascript.1.Zeitschaltung.Steckdose1.Start.Zeit'; ! var idMinEnd = 'javascript.1.Zeitschaltung.Steckdose1.Ende.Minute'; var idStdEnd = 'javascript.1.Zeitschaltung.Steckdose1.Ende.Stunde'; var idMinEndString = 'javascript.1.Zeitschaltung.Steckdose1.Ende.MinuteString'; var idEndzeit = 'javascript.1.Zeitschaltung.Steckdose1.Ende.Zeit'; ! // Bei Änderung Minuten Startzeit on(idMinStart, function() { var minuten = getState(idMinStart).val; var minutenString = ""; if(minuten < 10) { minutenString = '0' +minuten; } else minutenString = minuten.toString(); ! setState(idMinStartString, minutenString); // Anpassen der Minuten var stunde = getState(idStdStart).val; // Auslesen Stunde setState(idStartzeit, stunde + ':' + minutenString); // Einsetzen Stunde und Minute in Startzeit-String ! }); ! // Bei Änderung Minuten Endzeit on(idMinEnd, function() { var minuten = getState(idMinEnd).val; var minutenString = ""; if(minuten < 10) { minutenString = '0' +minuten; } else minutenString = minuten.toString(); setState(idMinEndString, minutenString); ! var stunde = getState(idStdEnd).val; // Auslesen Stunde setState(idEndzeit, stunde + ':' + minutenString); // Einsetzen Stunde und Minute in Endzeit-String ! }); ! // Bei Änderung Stunde Startzeit on(idStdStart, function() { var minutenString = getState(idMinStartString).val; var stunde = getState(idStdStart).val; setState(idStartzeit, stunde + ':' + minutenString); ! }); ! // Bei Änderung Stunde Endzeit on(idStdEnd, function() { var minutenString = getState(idMinEndString).val; var stunde = getState(idStdEnd).val; // Auslesen Stunde setState(idEndzeit, stunde + ':' + minutenString); // Einsetzen Stunde und Minute in Endzeit-String ! }); ! // ################################################################################################## // VARIABLEN UND IDS DEFINIEREN // ################################################################################################## ! // STARTZEIT TRIGGER (SCHEDULE) ! var einschalten = getState(idStartzeit).val.split(':'); // erstmaliges einlesen der Startzeit, aufteilen in Stunden und Minuten ! var timerEinschalten = schedule(einschalten[1] + ' ' + einschalten[0] + ' * * 0-6', fEinschalten); // initiales Festlegen des Start-Zeitpunkts ! on(idStartzeit, function(dp) { // Triggern bei Änderung des Startzeit-Strings einschalten= dp.state.val.split(':'); clearSchedule(timerEinschalten); // altes Schedule löschen timerEinschalten = schedule(einschalten[1] + ' ' + einschalten[0] + ' * * 0-6', fEinschalten); }); ! // ENDZEIT TRIGGER ( SCHEDULE) ! var ausschalten= getState(idEndzeit).val.split(':'); // erstmaliges einlesen der Endzeit, aufteilen in Stunden und Minuten ! var timerAusschalten= schedule(ausschalten[1] + ' ' + ausschalten[0] + ' * * 0-6', fAusschalten); // initiales Festlegen des Endzeitpunkts ! on(idEndzeit, function(dp) { // Triggern bei Änderung des Endzeit-Strings ausschalten= dp.state.val.split(':'); clearSchedule(timerAusschalten); // altes Schedule löschen timerAusschalten = schedule(ausschalten[1] + ' ' + ausschalten[0] + ' * * 0-6', fAusschalten); log(ausschalten[1] + " " + ausschalten[0]); ! }); ! // Functions ! function fAusschalten(){ // setState("hm-rpc.1.00021569960FFB.3.STATE"/Kamera_Wohnzimmer_Steckdose:3.STATE/, false); // nur, wenn die Automatik eingeschaltet ist wird die Steckdose geschaltet log("Steckdose wurde ausgeschaltet"); } function fEinschalten(){ // setState( "hm-rpc.1.00021569960FFB.3.STATE"/Kamera_Wohnzimmer_Steckdose:3.STATE/, true); // nur, wenn die Automatik eingeschaltet ist wird die Steckdose geschaltet log("Steckdose wurde eingeschaltet"); } ! ````
  • [Blockly Script] Geht das überhaupt ? Status HM Sensoren abfragen und dann reagieren

    Verschoben
    9
    2
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    R
    @HAL: Ja, das mein 1.Versuch des Script "Käse" ist wurde mir auch klar. ` Versuch macht meistens klug! ;) Die Sache mit den Schleifen haben schon viele hier erfolglos probiert, bzw. damit ihre Javascript-Instanz abschmieren lassen. Die Sache mit den Statusmeldungen, die bleiben doch erhalten, sowohl in der CCU als auch in ioBroker. Dein Ansatz war ja schon nicht schlecht, nur eben ohne diese wiederholen-Blöcke. Die Logik aus den CCU-Programmen würde ich gleich mit in das Skript einarbeiten, dann hast du schon mal einen Anfang. Versuchs mal. Du könntest ja auch mal deinen ersten Versuch exportieren und hier einstellen, dann haben wir schonmal ein paar Datenpunkte aus deinen Objekten. Enrico
  • Blocky - was mache ich falsch?

    Verschoben
    19
    1
    0 Stimmen
    19 Beiträge
    2k Aufrufe
    Holger76H
    Also ohne näher zu schauen, muss das erste steuere oben in die zange geschoben werden, nicht darunter Gesendet von meinem F5121 mit Tapatalk

723

Online

32.6k

Benutzer

82.2k

Themen

1.3m

Beiträge