Skip to content

Skripten / Logik

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

16.5k Topics 213.4k Posts

NEWS

Subcategories


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Topics
    49k Posts
    B
    Hi, Würde gerne meinen Solarflow 800 Pro mit 4 PV Modulen (gesamt ca. 1700 Wp) zur Null-Einspeisung mit iobroker und Tasmota smartmeter betreiben. Sollte das mit dem Script möglich sein?
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Topics
    79k Posts
    paul53P
    @Cephalopod sagte: Also "schlampig" Programmiert? Sieht so aus. Ich hätte die Button so programmiert: // NET USB Down if (id === adapter.namespace + '.Device.MediaDown' && state.val === true) { const new_val = 'NTCDOWN'; adapter.log.debug('new_val: ' + new_val); adapter.setState(adapter.namespace + '.Device.command', {val: new_val, ack: false}); }
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Topics
    13k Posts
    S
    welche Palette hast du installiert, damit du den "AND" Baustein hast?
  • Wie am besten Nachkommastellen beschränken?

    Moved
    3
    0 Votes
    3 Posts
    707 Views
    R
    "Runde auf" ist glaub ich falsch, du musst nur "Runde" nehmen. Enrico
  • Bei Änderung nach N Sekunden Pushover

    Moved
    4
    0 Votes
    4 Posts
    685 Views
    S
    Besten Dank für die schnellen Antworten. Ich habe jetzt den Filterwert in der Konfiguration der CCU auf 2 Sekunden gestellt und es funktioniert… Das Skript kann ich super für einen anderen Anwendungsfall weiternutzen ;) Klasse Forum hier! Gesendet von iPad mit Tapatalk
  • Geht Trigger im Trigger?

    Moved
    8
    0 Votes
    8 Posts
    1k Views
    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

    Moved
    4
    0 Votes
    4 Posts
    483 Views
    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

    Moved
    18
    1
    0 Votes
    18 Posts
    3k Views
    rantanplanR
    Sieht gut aus. Willkommen im Club :D
  • Cron Job startet mehrmals.

    Moved
    4
    0 Votes
    4 Posts
    856 Views
    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 ???

    Moved
    3
    0 Votes
    3 Posts
    501 Views
    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!
  • 0 Votes
    4 Posts
    827 Views
    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

    Moved
    4
    1
    0 Votes
    4 Posts
    2k Views
    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?

    Moved
    3
    0 Votes
    3 Posts
    433 Views
    P
    on({ id: 'mqtt.0.Sensor.RFID', val: 'WUNSCHWERT' }, function (data) { log("Transponder ID: " + data.state.val); }); Gruß Pix
  • Wert wird nicht gelesen

    Moved
    6
    0 Votes
    6 Posts
    592 Views
    K
    Danke für die ausführliche Erklärung!
  • Raumname ermitteln

    Moved
    8
    0 Votes
    8 Posts
    3k Views
    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

    Moved
    11
    0 Votes
    11 Posts
    4k Views
    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

    Moved
    12
    1
    0 Votes
    12 Posts
    5k Views
    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)

    Moved
    12
    0 Votes
    12 Posts
    2k Views
    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

    Moved
    4
    2
    0 Votes
    4 Posts
    816 Views
    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

    Moved
    1
    0 Votes
    1 Posts
    977 Views
    No one has replied
  • [Gelöst] [Frage] Skript zählen_Fenster

    Moved
    19
    0 Votes
    19 Posts
    2k Views
    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
  • 0 Votes
    9 Posts
    1k Views
    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 )

    Moved
    2
    0 Votes
    2 Posts
    1k Views
    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"); } ! ````

546

Online

32.6k

Users

82.3k

Topics

1.3m

Posts