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
    maxclaudiM
    @Daniel-8 sagte: Bei wieviel volt schaltest du die einspeisung ab? Und wieviel soc ist das ca? 3.2V ~20 % SoC (Die Batterie neigt sich dem Ende) Bei mir ist es grad häufig so, das der soc nach dem abschalten bei 8% ca ne halbe Stunde bis stunde später gerne mal um 3-4% nach unten springt und dann aber weiter langsam 1-2% sinkt. Somit habe ich in der früh nur noch ca.3% drinnen. tpische Zendure Batterien (AB1000/2000) sind 15S1 LiFePO4 3,35 V – 3,40 V: ~100 % SoC (Voll) 3,28 V: ~50 % SoC (flaches Mittelfeld) 3,20 V: ~20 % SoC (Die Batterie neigt sich dem Ende) 3,15 V: ~10 % SoC (Die Spannung beginnt spürbar zu sinken) weniger Volt sind besser zu vermeiden! Weil meine Batterien indoor betrieben werden verwende ich einen Batteriechutz auch mal mit 3.16V Weniger nicht. Outdoor und sicherer ist m. M. minVol 3.2V. Könnte es auch daran liegen das die Zellen dann kalt werden, weil es ja jetzt abends und nachts bisschen abkühlt .... Wenn Deine Batterien outdoor sind: Ja. und dann die spannung und der soc schlagartig einbricht? Spannung habe ich jetzt nicht beobachtet und geloggt Spannung schlagartig wahrscheinlich nicht. Dein Einsatzzweck und Ziel ist klar. Leider ist eine PV-Batterie nicht für standby gedacht und vor allem nicht im entladenen Zustand zusätzlich an einem kalten/kühlen Ort. Es ist ja noch Sommer. Ich würde es mit 3.2V ca 20% probieren. minVol und energieLevel loggen.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    Murphy 0M
    Nachdem mein Blockly zum Steuern meines Hyper 2000 seit Monaten perfekt läuft habe ich mich mal dem Problem mit meinem Elektroherd angenommen. Wen der Herd eingeschaltet ist und die Vorwärmphase beendet ist fängt er an zu pulsen. Das heist er schaltet alle ca. 30 Sekunden die Last ab und dann wieder nach ca, 30 Skunden die Last aus. Das ist für meinen Hyper suboptimal da der dann wenn die Sonne scheint dauernd zwischen Laden und Einspeisen hin und her schaltet. Auch Abends ohne Sonne schaltet er ständig das Einspeisen ein und aus. Dafür habe ich jetzt mal ein JS erstellt. Wärend dem Pulsen des Herdes hört der Hyper auf zu Laden oder Einzuspeißen. /************************************************************ Elektroherd - Pulserkennung über Hausverbrauch ioBroker JavaScript ************************************************************/ // ============================================================ // EINSTELLUNGEN // ============================================================ const HERD_LEISTUNG_W = 2000; const SCHWELLWERT_W = 1000; // Zeit nach dem letzten Puls bis zum Ende des Pulsens const ZEIT_NACHLAUF_SEKUNDEN = 15; // Anzahl notwendiger Wechsel const MIN_PULSE_WECHSEL = 4; // Zeit ohne Wechsel -> vollständiger Reset const ZEIT_OHNE_WECHSEL_SEKUNDEN = 60; // ============================================================ // OBJEKTE // ============================================================ const HAUSVERBRAUCH = '0_userdata.0.Hausverbrauch'; const AKKU = '0_userdata.0.Laden_Schalter'; const EINSPEISEN = '0_userdata.0.Einspeisen_Schalter'; // ============================================================ // VARIABLEN // ============================================================ let letzterStatus = 'start'; let pulseWechsel = 0; // Pulserkennung aktuell aktiv? let herdPulst = false; // Timer für das Ende des Pulsens let nachlaufTimer = null; // Timer für 60-Sekunden-Reset let wechselResetTimer = null; // Ursprüngliche Schalterzustände let urspruenglicherAkkuZustand = null; let urspruenglicherEinspeisenZustand = null; // ============================================================ // AUSGANGSSTELLUNG WIEDERHERSTELLEN // ============================================================ function ausgangsstellungWiederherstellen() { // Nur wenn vorher tatsächlich ein Pulsbetrieb // aktiviert wurde if (!herdPulst) { return; } // -------------------------------------------------------- // AKKU // -------------------------------------------------------- if (urspruenglicherAkkuZustand !== null) { setState( AKKU, urspruenglicherAkkuZustand ); } // -------------------------------------------------------- // EINSPEISEN // -------------------------------------------------------- if (urspruenglicherEinspeisenZustand !== null) { setState( EINSPEISEN, urspruenglicherEinspeisenZustand ); } log( 'Ausgangsstellung wiederhergestellt: ' + 'Laden=' + urspruenglicherAkkuZustand + ', Einspeisen=' + urspruenglicherEinspeisenZustand, 'warn' ); // Pulserkennung AUS herdPulst = false; // Gespeicherte Zustände löschen urspruenglicherAkkuZustand = null; urspruenglicherEinspeisenZustand = null; } // ============================================================ // VOLLSTÄNDIGER RESET // ============================================================ function vollstaendigerReset() { log( '60 Sekunden kein neuer Wechsel -> ' + 'vollständiger Reset', 'warn' ); // -------------------------------------------------------- // TIMER LÖSCHEN // -------------------------------------------------------- if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); nachlaufTimer = null; } // -------------------------------------------------------- // AUSGANGSSTELLUNG WIEDERHERSTELLEN // -------------------------------------------------------- if (herdPulst) { ausgangsstellungWiederherstellen(); } // -------------------------------------------------------- // PULSZÄHLER ZURÜCKSETZEN // -------------------------------------------------------- pulseWechsel = 0; // -------------------------------------------------------- // STATUS ZURÜCKSETZEN // -------------------------------------------------------- letzterStatus = 'start'; log( 'Pulserkennung AUS / Wechselzähler = 0', 'warn' ); } // ============================================================ // PULSEN STARTEN // ============================================================ function pulsenStarten() { if (herdPulst) { return; } // -------------------------------------------------------- // AUSGANGSSTELLUNG SPEICHERN // -------------------------------------------------------- urspruenglicherAkkuZustand = getState(AKKU).val; urspruenglicherEinspeisenZustand = getState(EINSPEISEN).val; log( 'Pulsen erkannt -> Ausgangsstellung gespeichert: ' + 'Laden=' + urspruenglicherAkkuZustand + ', Einspeisen=' + urspruenglicherEinspeisenZustand, 'warn' ); // -------------------------------------------------------- // PULSERKENNUNG EIN // -------------------------------------------------------- herdPulst = true; // Während des Pulsens beide AUS setState(AKKU, false); setState(EINSPEISEN, false); log( 'HERD PULST -> Laden_Schalter AUS / Einspeisen AUS', 'warn' ); } // ============================================================ // PULSEN NORMAL BEENDEN // ============================================================ function pulsenBeenden() { if (!herdPulst) { return; } log( 'Herdpulsen beendet', 'warn' ); // Ausgangsstellung wiederherstellen ausgangsstellungWiederherstellen(); // Zähler zurücksetzen pulseWechsel = 0; letzterStatus = 'start'; // Reset-Timer löschen if (wechselResetTimer !== null) { clearTimeout(wechselResetTimer); wechselResetTimer = null; } } // ============================================================ // 60-SEKUNDEN-RESET-TIMER // ============================================================ function wechselResetTimerStarten() { // Alten Timer löschen if (wechselResetTimer !== null) { clearTimeout(wechselResetTimer); } // Neuen Timer starten wechselResetTimer = setTimeout(function () { wechselResetTimer = null; // Nur wenn tatsächlich Wechsel gezählt wurden if (pulseWechsel > 0) { vollstaendigerReset(); } }, ZEIT_OHNE_WECHSEL_SEKUNDEN * 1000); } // ============================================================ // NACHLAUF-TIMER // ============================================================ function nachlaufTimerStarten() { if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); } nachlaufTimer = setTimeout(function () { nachlaufTimer = null; const aktuell = Number( getState(HAUSVERBRAUCH).val ); if (aktuell <= SCHWELLWERT_W) { pulsenBeenden(); } }, ZEIT_NACHLAUF_SEKUNDEN * 1000); } // ============================================================ // HAUSVERBRAUCH ÜBERWACHEN // ============================================================ on( { id: HAUSVERBRAUCH, change: 'ne' }, function (obj) { const leistung = Number(obj.state.val); if (isNaN(leistung)) { log( 'Ungültiger Hausverbrauch: ' + obj.state.val, 'warn' ); return; } // ==================================================== // HOHER VERBRAUCH // ==================================================== if (leistung >= HERD_LEISTUNG_W) { // Wechsel NIEDRIG -> HOCH if (letzterStatus === 'niedrig') { pulseWechsel++; log( 'Puls HOCH: ' + leistung.toFixed(0) + ' W | Wechsel=' + pulseWechsel, 'warn' ); // 60-Sekunden-Timer neu starten wechselResetTimerStarten(); } letzterStatus = 'hoch'; // Nachlauf abbrechen if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); nachlaufTimer = null; } // ================================================= // 4 WECHSEL ERREICHT // ================================================= if ( pulseWechsel >= MIN_PULSE_WECHSEL && !herdPulst ) { pulsenStarten(); } return; } // ==================================================== // NIEDRIGER VERBRAUCH // ==================================================== if (leistung <= SCHWELLWERT_W) { // Wechsel HOCH -> NIEDRIG if (letzterStatus === 'hoch') { pulseWechsel++; log( 'Puls NIEDRIG: ' + leistung.toFixed(0) + ' W | Wechsel=' + pulseWechsel, 'warn' ); // 60-Sekunden-Timer neu starten wechselResetTimerStarten(); } letzterStatus = 'niedrig'; // Wenn Herd bereits pulst, // Nachlauf starten if (herdPulst) { nachlaufTimerStarten(); } return; } } ); // ============================================================ // STARTMELDUNG // ============================================================ log( '============================================', 'warn' ); log( 'Elektroherd-Pulserkennung gestartet', 'warn' ); log( 'Herdleistung: ' + HERD_LEISTUNG_W + ' W', 'warn' ); log( 'Schwellwert: ' + SCHWELLWERT_W + ' W', 'warn' ); log( 'Nachlauf: ' + ZEIT_NACHLAUF_SEKUNDEN + ' Sekunden', 'warn' ); log( 'Benötigte Wechsel: ' + MIN_PULSE_WECHSEL, 'warn' ); log( 'Reset nach ' + ZEIT_OHNE_WECHSEL_SEKUNDEN + ' Sekunden ohne Wechsel', 'warn' ); log( '============================================', 'warn' );
  • Hilfe für Skripterstellung mit Node-RED

    964 13k
    964 Themen
    13k Beiträge
    A
    @OliverIO ich versuche morgen noch etwas mehr raus zu holen. Eben es verwirrt mich das es manchmal durchläuft und dann plötzlich nicht mehr. Für mich als Laie sieht es irgendwie so aus, wie wenn das BMS irgendwie auf was warten würde und daher nicht mehr.
  • Hs110 Plug- getConsumption

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    603 Aufrufe
    Niemand hat geantwortet
  • Mehrere schedule

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    a200A
    @bahnuhr: Das heißt oben nicht 06:00; dort ist ein * zu viel. Weiterhin, warum schreibst du nicht: schedule("0 12 * * *", function () { log ("a"); }); schedule("0 6 * * *", function () { log ("b"); }); mfg ` yep. Das ist die Lösung! Vielen Dank.
  • [gelöst] mit setState von Zahl auf bool

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    4k Aufrufe
    frankjokeF
    Übrigens, mein Beispiel von Boolean oben müsste abgeändert werden um für alle Fälle zu gelten. Egal, grundsätzlich erlaubt Javascript selbst beliebige Typen für die Variablen aber wenn man im ioBroker eine Type festlegt dann sollte der Wert auch als solche gespeichert werden (nicht nur im History wo es richtig gemacht wird). Ein Beispiel: Booleans (ein/Aus-states) werden in der Visualisierung als solche behandelt aber eben meist mit Standardabfragen wie if(xxx) oder if(!xxx) behandelt. if('false') erzeugt dabei true! if('true oder sonst was') auch if('') erzeugt hingegen false. Bei Zahlen ist's einfacher, 0 erzeugt false, alles andere true. Umgekehrt ist es schon schwieriger, verschiedene Adapter müssen unterschiedliche Strategien anwenden. Ich habe z.B. ein Gerät bei dem true 100 ist (für 100%) und false 0. Da das Gerät auch Dimmer bedienen kann sind bei diesen 0-100 möglich, bei Schaltern aber nur 0 oder 100. Deshalb muss ich bei Dimmern einen Zahlen-Datentyp mit min/0 ,max/100 und bei Schaltern einen binären Wert vorsehen. Wandelt man nun 'true' auf eine Zahl (z.B. mit 0+'true') ergibt das 1. Mit 1 würde der Dimmer aber nicht eingeschaltet werden. Wird dieser Wert nun in den State als Zahl geschrieben kann er zwar richtig in einen boolean umgewandelt werden, aber wenn wer 'true' hineinschreibt kennt sich das Gerät nicht aus obwohl das script glaubt es ist true. Deshalb ist es wichtig wenigstens zu wissen wie sich ioBroker selbst verhält und Adaptern oder scripts vorzugeben wie sie sich zu verhalten haben. Deswegen sollten auch Default klar definiert sein, wie "" oder "false"== false und "was auch immer" == true genauso wie 0 == false und nicht 0 == true
  • Mit Script zeitverzögert comandos senden.

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    879 Aufrufe
    M
    Den kenne ich auch noch nicht, kannst du das erklären wie ich das sinnvoll einrichte, damit die Scrips ancheinander durchlaufen ? Wenn ich das richtig sehe, kann ich da die Scripts auswählen un dhinzufügen. Als Verzägerung kann ich wie dann die 0,03 sek angeben ? Wie mache ich es dann, mit dem schalten per Alexa ? Ich will einen Datenpunkt nutzen, um die Szene 1 aufzurufen und das PIP einschalten und Szene 2 um das PIP auszuschalten Kann ich auch über einen Datenpunkt szenen schalten wie bei "ein" Szene 1 und bei "aus" Szene 2 ?
  • Funksteckdose per Bewegungsmelder schalten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    S
    So hat es heute früh funktioniert. // 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('Warmwasser.Trigger', false, { name: 'Warmwasser bei Bewegung', type: 'boolean' }); var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder idTrigger = 'Warmwasser.Trigger'; setState("hm-rpc.0.NEQ0707005.1.STATE",true); //Funksteckdose einschalten setStateDelayed("hm-rpc.0.NEQ0707005.1.STATE", false, 10 * 60000); //Funksteckdose nach 10min. ausschalten on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen }); // Zurücksetzen vom Trigger schedule("1 8 * * *", function () { setState(idTrigger, false); }); Kann man das eventuell kürzer fassen? Gruss
  • Werte aus e-mail - Schnittselle zu meter home server

    Verschoben
    10
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    C
    Danke ich brauche es aber zum auslesen einer Mail von eine Sophos AP
  • JS Java Script in Verbindung mit new-samsung-remote

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    763 Aufrufe
    Niemand hat geantwortet
  • [gelöst]: Easymeter bzw. Smart Grid Hub über Javascript auslesen (JSON)

    Verschoben
    27
    0 Stimmen
    27 Beiträge
    5k Aufrufe
    apollon77A
    Alle interessierten können auch gern den neuen Adapter testen … http://forum.iobroker.net/viewtopic.php?f=36&t=5047
  • Zugriff auf Raum

    Verschoben
    27
    0 Stimmen
    27 Beiträge
    10k Aufrufe
    T
    Hallo, vielleicht war der vorige Beitrag etwas unklar formuliert. Ich habe das Testskript erweitert und vergleiche jetzt den Datenpunkt enumNames der "on"-Funktion direkt mit dem Datenpunkt der "getObject"-Funktion. on({id: id_Dimmer.level, change: "ne", val: 0, logic: "and"}, function(obj) { console.log("EnumNames mit on: " + obj.enumNames); var obj2 = getObject(obj.id, '*'); console.log("EnumNames mit getObject: " + obj2.enumNames); }); Auf dem JSAdapter.0 erscheint folgende Ausgabe: ` > javascript.0 script.js.02_Test.checkScript.testObj: EnumNames mit on: Dimmer,Licht,OG javascript.0 script.js.02_Test.checkScript.testObj: EnumNames mit getObject: Dimmer,Licht,OG Auf dem JSAdapter.1 bleiben die "EnumNames mit on" leider leer :| > javascript.1 script.js.02_Test.checkScript.testObj: EnumNames mit on: javascript.1 script.js.02_Test.checkScript.testObj: EnumNames mit getObject: Dimmer,Licht,OG ` Bei einem anderen Produktivskript bleiben die "EnumNames mit on" meistens auf beiden Adaptern leer. Deshalb glaube ich nicht, dass es ein Instanzen-Problem ist. Jedenfalls scheint "getObject" die Daten anders auszulesen, als die "on"-Funktion. Könnte mal jemand testen, ob es auf einem anderen System auch auftritt :?:
  • GetState.val Nachkommastellen festlegen

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    3k Aufrufe
    0
    Perfekt, danke :)
  • Allgemeine Frage zum Einbinden von Scripten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    A
    Danke euch allen. Die Kombination eurer Infos war genau das was ich benötigt habe. Ich mache mich gleich mal ans Werk und probiere mein Glück. Vielen Dank :)
  • Datei auf Netzlaufwerk öffnen

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    ThisoftT
    Muss leider nochmal um Hilfe rufen da ich den Fehler nicht mehr verstehe. Ich erhalte folgende Fehlermeldung: script.js.Test.Testen: Error: EPERM: operation not permitted, open '\\192.168.137.52\BidCos\log\bidcos-2017-01-29.log' Ich habe über den Dateimanager von dem Rechner aus auf welchem ioBroker läuft definitiv Schreibzugriff auf diese Datei (hab's auch mit verschiedenen Dateien auf diesem Laufwerk getestet). Läuft ioBroker irgendwie mit anderen Rechten als der angemeldete Benutzer? Wo könnte denn hier noch das Problem liegen?
  • Hilfe: Scripte Zusammenfassen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    741 Aufrufe
    paul53P
    Das lässt sich in einem Skript realisieren: // Versuche Play, Pause, Stop, Enter via Alexa an Kodi zu senden var request = require('request'); var idStop = 'javascript.0.Manuell.Systemvariable.Badezimmer.Kodi_Stop'; // Stop var idStop_URL = 'http://192.168.1.16:8081/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22Player.Stop%22,%22params%22:{%22playerid%22:%201},%22id%22:2}}}'; var idPlay = 'javascript.0.Manuell.Systemvariable.Badezimmer.Abspielen'; // Play var idPlay_URL = 'http://192.168.1.16:8081/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22Player.PlayPause%22,%22params%22:{%22playerid%22:%201},%22id%22:2}}}'; on({id: idStop, val: true}, function (obj) { // Frage wie kann ich eine URL z.B. var idStop_URL absenden request(idStop_URL, function(error, response){ if(error){ log(error, 'error'); } }); }); on({id: idPlay, val: true}, function (obj) { // wenn neuer Wert true // Frage wie kann ich eine URL z.B. var idStop_URL absenden request(idPlay_URL, function(error, response){ if(error){ log(error, 'error'); } }); });
  • Gibt es eigentlich eine Erklärung zum Java Skript Adapter?

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    868 Aufrufe
    P
    Hallo skorpil, der css-Befehl dafür lautet "selection". Allerdings muss der in der CSS-Steuerdatei in den tiefen des Editor Moduls geändert werden (oder zumindest dessen Parameter/Farbe). Die Änderung ist vermutlich nach dem nächsten Update wieder weg. Evtl kannst du in deinem Browser eine EInstellung finden, die blaue Auswahl zu übersteuern. Gruß Pix
  • Script per Button aufrufen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    3k Aufrufe
    P
    Oder man nutzt die Möglichkeit, einzelne Skripte per Datenpunkt scriptEnabled ein/auszuschalten. Dazu muss man das Skript standardmäßig ausschalten (Pause Knopf). Nehmen wir an, es heisst "Heizung" und liegt im common-Ordner von Javascript Instanz 0. Dann im VIS-Widget den entsprechenden Datenpunkt "javascript.0.scriptEnabled.common.Heizung" zum Skript suchen und in OID einsetzen. Und schließlich im Script am Ende noch den Befehl```` stopScript() Gruß Pix
  • Skript nur einmal am Tag ausführen und dann sperren

    Verschoben
    36
    0 Stimmen
    36 Beiträge
    6k Aufrufe
    T
    Hallo Rainer, ich verstehe Nordlicht sehr gut und finde es super, dass du dir darüber Gedanken machst. ioBroker entwickelt sich seit Beginn mit großen Schritten weiter und auch die Doku hat sich durch eure ständige Arbeit wesentlich verbessert. Was ihr da leistet, ist bemerkenswert. Ein Anfänger kann mit Tutorials im Internet oder mit Literatur JS erlernen, doch bezieht sich das Meiste davon auf Webseiten-Programmierung mit HTML und CSS. All das wird in ioBroker auch eingesetzt, aber nur selten auf die gleiche Art und Weise, wie es die Literatur erklärt. Jedenfalls fehlt dem Anfänger hier noch das Transfervermögen. Ich selbst stehe da irgendwo in der Mitte dieser Phase ;) Speziell beim JavaScript-Adapter würde ich mir zu den Funktionen noch mehr Details mit Erklärungen wünschen. Trotz des gesamten Umfanges sind die einzelnen Beschreibungen extrem kompakt gehalten. Es ist vielmehr ein Nachschlagewerk für erfahrene Anwender, als eine Beschreibung für Einsteiger. Als Beispiel und zur Erklärung möchte ich die "on"-Funktion nennen, mit deren Parametern ich mich zur Zeit intensiver auseinandersetze. Nehmen wir davon mal den ersten Parameter: ` > You can use following parameters to specify the trigger: parameter______type/value _____description –--------------------------------------------------------------------------- logic___________string__________"and" or "or" logic to combine the conditions (default: "and") ` Hierzu ergaben sich folgende Fragen: 1. Lassen sich beliebig viele Parameter verunden bzw. verodern? 2. Kann "and" mit "or" kombiniert werden? z.B. (Licht1 and Licht2) or (Licht3 and Licht4) 3. Wenn ja, wie sieht die Syntax dazu aus? Wer genug Erfahrung hat, würde die Fragen so beantworten 1. Es wurden keine Grenzen angegeben, deshalb können beliebig viele Parameter verwendet werden. 2. Da steht "and" or "or", also geht nur eines von beiden. 3. Geht nicht, wegen Antwort von Frage 2. Als weiteres Beispiel nehme ich einen Ausschnitt aus dem diskutierten Skript von Nordlicht: > on({id: bwm, val: true}, function (obj) { // Trigger auslösen Bei val steht In der Beschreibung: New value must be equal to given one. Als Anfänger bin ich davon ausgegangen, dass sich ein neuer Wert von einem alten Wert im Wert unterscheiden muss, sonst ist es kein neuer Wert. Daher hätte ich erwartet, dass der Trigger nur auslöst, wenn der Wert des bwm von "false" auf "true" wechselt. Das tut er sogar, aber er löst auch aus, wenn der "Zeitstempel" des Wertes aktualisiert wird, weil dann der Wert "true" durch ein neues "true" ersetzt wurde. Im Skript von Nordlicht hat das keine Auswirkungen, da er noch eine Sperrvariabale verwendet, aber in einem anderen Skript sorgt es erstmal für Verwirrung. Zumindest zu dem zweiten Beispiel gab es schon einige Diskussionen, die mit einer etwas umfangreicheren Doku wahrscheinlich nicht entstanden wären. Die Doku ist das wichtigste Instrument, um neue User bei den ersten Schritten mit ioBroker zu begleiten und um den Spaß an der Sache aufrechtzuerhalten. Ich möchte in Bezug auf den JS-Adapter vorschlagen, die Funktionen in der bestehenden GitHubDoku mit weiterführenden Links zu Detailbeschreibungen zu versehen. Die verlinkten Seiten beschreiben dann die gewählte Funktion noch mal genauer (evtl. in Denglisch) und zeigen weitere Beispiele (Codeschnipsel) mit Kommentierung auf. Man könnte das mit den Linux Man-Pages vergleichen, die man dann aufruft, wenn die Kurz-Referenz des –help-Parameters nicht ausreicht. Grüße
  • WebCam Bild refresh per klick

    Verschoben
    3
    1
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    Z
    @pix: Schnell von unterwegs: wenn du mit einem Widget mehrere Datenpunkte setzen willst, empfiehlt sich der Scenes Adapter. Da kann man alle Datenpunkte mit Zielzustand, ggf. verzögert, in einer Szene zusammen fassen. Diese Szene lässt sich dann leicht per Widget in Vis einschalten. Gruß Pix ` Hi Pix, danke für die Antwort - aber irgendwie fehlt mir da der zusammenhang. An sich will ich ja nur einen Datenpunkt setzen wenn ich auf das Webcam bild klicke und nicht mehrere. Hast du evtl ein Bsp. für mich? Evtl seh ich den Wald vor lauter Bäumen nicht. Gruß ztark edit Hab selbst die lösung gefunden: Mit dem widget "HTML STATE" ließ es sich ohne weiteres realisieren. Zum einen kann ich damit ein Objekt setzen und zum anderen den oben erwähnten HTML-Code einfügen. (Eine verzögerung scheint nicht nötig zu sein) Gruß ztark
  • Laufenden Timer abfragen?

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    paul53P
    @MistyReblaus: Schau mal hier: ` oder http://forum.iobroker.net/viewtopic.php?f=21&t=4796&p=47065#p47065.
  • [gelöst] JavaScript Fehler seit letztem Update undefined function…

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    670 Aufrufe
    apollon77A
    machste bitte ein "gelöst" ins Thread Subject !? Danke
  • Homewizard schalten

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    G
    Danke für die schnelle Antwort genaueres werde ich morgen beschreiben :) nach der arbeit. Gruß Gesendet von meinem SM-G925F mit Tapatalk

293

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge