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
    matze55M
    ich habe ein Icecast2 server installiert. Ich möchte ja möchte gerne aber ob es es geht weis ich nicht ton vom enigma2 api abgreifen......geht das?.......seit 3 tagen sitze ich daran..ich habe auch schon scripte aber das klapt nich einer ne idee?
  • 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.
  • [Frage] Funktion zu bestimmter Uhrzeit starten

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    paul53P
    Wäre http://forum.iobroker.net/viewtopic.php?f=21&t=2040&p=19898#p19906 ein Lösungsansatz bzgl. der Uhrzeit ?
  • ICal / SayIt - Auslesen der Termine am heutigen Tag

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    T
    Übersichtlicher formatiert (hoffe ich) Um auch Eigeninitiative zu zeigen hier mal der Code von Pix/PrinzEisenherz1, den ich als Basis nutzen möchte. Da mein JS Verständnis noch eher rudimentär ist (wenn überhaupt), habe ich als Kommentare eingetragen, was ich denke/verstehe, was dort passiert. Eventuell könnte mir jemand auf dieser Basis dann Hinweise geben, was ich wie ändern muss? Ich lerne gerne :) Ich habe mich mit diesem tollen Thread http://forum.iobroker.net/viewtopic.php?f=21&t=3926 sowie https://www.w3schools.com und https://www.mediaevent.de/javascript/ beschäftigt, um das Skript so gut ich kann zu verstehen. Allerdings liegen meine letzten Programmierversuche in der Jugend, was so ca 20 Jahre her ist. Seitdem habe ich mich nicht mehr damit beschäftigt. // Test mit Variable; // Besser ist es, gleich den Bewegungsmelder hier abzufragen. var idSayVar = 'javascript.0.Sayit.Trigger'; // hier würde ich wie vorgeschlagen direkt auf meinen BWM verweisen. in einem einfacheren Skript funktiniert das auch // Definition var idSayIt = "sayit.0.tts.text"; var lautstaerke = 100 // hier Ansprechen der SayIt Instanz 0, die dann ausgegeben wird (z.B. übeR sonos) -das läuft auch soweit bei mir sowie setzen der Lautstärke als Variable // Quellen var idWetter = "hm-rega.0.23460"; // entfällt bei mir, nutze ich nicht var idTemperatursensor = "hm-rega.0.23642"; // hier verweise ich auf meinen entsprechenden Homematic Außensensor. Läuft auch var idGeburtstage = "javascript.0.Kalenderereignisse.heute"; var idMuell = "javascript.0.Muellereignisse.heute"; /* javascript.0 verweist auf die JS Instanz, hier 0. Kalenderereignisse.heute sowie Muellereignisse.heute sind states, die weiter unten definiert werden. Fragen dazu dann dort. */ function ermitteleAnsagedatum () { //Wochentag ermitteln var d = new Date (); var w = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); var wochentag = w[d.getDay()]; //Tagesdatum ermitteln var tag = d.getDate(); // Variable d wird definiert als ein neu erzeugtes Datum, wobei das "()" bedeuted, dass immer das aktuelle Datum eingelesen wird // Wie zuvor, nur wird ein Array erstellt und gefüllt // Hier wird der String, Z.B. "Montag" anhand des Tages zugeordnet. D.h. wenn Variable "w" = 1 dann "Montag". Das "d" bei "d.getDay()" wurde zuvor als neues Datum definiert, daher funktioniert das hier so. // Dann wird das eigentliche Datum ausgelesen, damit später ausgegeben wird "Montag, der 2te …" //Monat ermitteln var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); var monat = month[d.getMonth()]; //Jahr ermitteln var jahr = d.getFullYear(); //Stunde ermitteln var stunde = d.getHours(); //Minute ermitteln var minute = d.getMinutes(); // Wie beim Tagesdatum, aber natrülich ohne die nochmalige Abfrage der "Monatszahl", da man ja nicht "Monat 12 Dezember" sagt. // Jahr wird ausgewertet und in die Variable eingefügt // Stunde wird ausgewertet und in die Variable eingefügt // Minute wird ausgewertet und in die Variable eingefügt return { // zurückgeben 'Jahr' : jahr, 'Monat' : monat, 'Tag' : tag, 'Wochentag' : wochentag, 'Stunde' : stunde, 'Minute' : minute }; } // Das hier verstehe ich leider nicht ganz. Ich sehe, dass die in Hochkommata gesetzten Werte später im ansagetext genutzt werden, aber wieso so? Was ganz genau passiert hier? Der Ansagetext bezieht sich jeweils auf die function.WERT [z.B. Jahr]. Warum muss ich die function ansprechen und nicht direkt die Variable ? `function ermitteleWetter () { // Wetterbedingungen [color] var wetterdaten = getState(idWetter).val; log('Wetter: ' + wetterdaten); return(wetterdaten); } function ermitteleAnsageTemperatur () { // Die Außentemperatur ist xx. Das Wetter heute ist xx // Einfache Temperaturansage mit SayIt. // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht // "Es sind 18 Punkt 2 Grad " sagt. var temperatursensor = getState(idTemperatursensor).val;` // Hier hätte ich erwartet, dass es "getState("hm-rpc.0.xxxxxxxxx.1.TEMPERATURE"); lautet bzw das oben bereits so definiert werden würde? Oder wird in diesem Skript ein reiner Temperaturfühler angesprochen und der Verweis auf den Temperaturdatenpunkt ist damit hinfällig? (in meinem Fall könnte ja auch humidity abgefragt werden) `~~[code]~~ var temp_string = temperatursensor.toString(); [/code]` //kann " temperatursensor.**~~[b]~~val[/b]**.toString() " das "val" entfallen, weil ja bereits vorher abgefragt? `~~[code]~~ log('Temp ' + temp_string); var temp_array = []; temp_array = temp_string.split("."); [/code]` // die eckigen Klammern definieren einen array-index (d.h. der array wird durchnummeriert beginnend mit 0) // hier wird definiert, dass "temp_array" befüllt wird mit zwei Teilen aus derausgelesenen Temperatur, nämlich vor und nach dem Punkt `~~[code]~~ // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!temp_array[1]) { [ temp_array[1] = "0"; log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } return{ 'Ganzzahl' : temp_array[0 'Nachkommazahl' : temp_array[1] }; } [/code]` color=#BF0000] // Wenn falsy (weil leer), dann setze 0\. Bei Ganzzahlen ist der zweite (d.h. Abfrage 1) index des Arrays leer und wird auf 0 gesetzt, damit der Array befüllt ist ] // Vorkommastelle wird aus erstem Array Teil bestimmt, Nachkomma aus zweitem `~~[code]~~function ermitteleGeburtstage () { var geburtstage = getState(idGeburtstage).val; log(geburtstage); return (geburtstage); } [/code]` // Ab hier fange ich deutlich an zu straucheln /* die Variable "geburtstage" wird befüllt mit dem Wert (val) aus idGeburtstage (eingangs definiert), welche wiederum weiter unten mit createState erschaffen wird? Die function "ermitteleGeburtstage" erhält den Wert aus "geburtstage" und wird dann im Ansagetext angesprochen? Wäre jemand so freundlich, mir den ganz genauen Sinn / Grund für dieses Vorgehen zu erläutern ? */ `~~[code]~~function ermitteleMuell () { var muell = getState(idMuell).val; log(muell); return (muell); } [/code]` // Analog Geburtstage `~~[code]~~// ################################### // Trigger für Ansage // ################################### on(idSayVar, function (data) { var ansagetext = "Guten Morgen, heute ist " + ermitteleAnsagedatum().Wochentag + " der " + ermitteleAnsagedatum().Tag + "te " + ermitteleAnsagedatum().Monat + ' ' + ermitteleAnsagedatum().Jahr + ". Es ist" + ermitteleAnsagedatum().Stunde + " Uhr und " + ermitteleAnsagedatum().Minute + " Minuten." + " Die Aussentemperatur beträgt " + ermitteleAnsageTemperatur().Ganzzahl + "," + ermitteleAnsageTemperatur().Nachkommazahl + " Grad." + " Wetter Bedingungen," + ermitteleWetter() +" ."; // #################################################### // Wenn Geburtstag dann mit ansagen // #################################################### var geburtstage2 = getState(idGeburtstage).val; if (geburtstage2.length > 2) { // wenn der Inhalt des Objektes "idGeburtstage" weniger als 2 Zeichen lang ist (also praktisch leer), dann ... ansagetext = ansagetext + "Nicht vergessen, " + ermitteleGeburtstage() +" ."; } // #################################################### // Wenn Müll dann mit ansagen // #################################################### var muell2 = getState(idMuell).val; if (muell2.length > 2) { // wenn der Inhalt des Objektes "idMuell" weniger als 2 Zeichen lang ist (also praktisch leer), dann ... ansagetext = ansagetext + "Achtung, heute ist Abholung " + ermitteleMuell() +" ."; } log('Trigger: ' + data.state.val); if (data.state.val === true) { setState(idSayIt, lautstaerke + ";" + ansagetext); // hier also ("40;Guten Morgen ...") } }); [/code]` // Wenn (bei mir) BWM ausgelöst dann wird der Text aus den einzelnen functions bzw deren Datenwerten zusammengesetzt. Nehme gerne nochmal Erläuterungen zu diesem Teil in genauerer Art, da ich nicht ganz sicher bin, den Code wirklich zu verstehen // Im letzten Teil (log ..) wird der vollständige Ansagetext samt Zeillautstärke in das Log geschrieben `~~[code]~~/* Kalenderevent auswerten ----> nur Geburtstage sucht im iCal Adapter nach events (heute) auf Anfrage von Skorpil im Forum erstellt. http://forum.iobroker.de/viewtopic.php?f=21&t=2347&p=20627&sid=524f9dda2f313d3cbb183941df61fc38#p20627 27.02.2016 erstellt von Pix 02.03.2016 Anpassung und Aufbereitung für Sprachausgabe 21.07.2016 Umbau auf Müll Kalender */ //Datum als String ermitteln; function ermitteleDatum() { var d= new Date(); //Tagesdatum ermitteln var day = new Array("00","01","02","03","04","05","06","07","06","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"); var t = day[d.getDate().toString()]; //Monat ermitteln var month = new Array("01","02","03","04","05","06","07","08","09","10","11","12"); var m = month[d.getMonth().toString()]; //Jahr ermitteln var j = d.getFullYear().toString(); var datum= t+"."+m+"."+j+" "; //log("datum: " + datum); return (datum); } createState('Kalenderereignisse.heute', '', { name: 'Events von heute', // Wird hier der Name geändert? Falls ja, wieso? Falls nein: was passiert hier genau? Freue mich type: 'string' }); [/code]` Fragen: wieso muss dasTagesdatum als String evaluiert werden? Könnte mir jemand den „createState“ Teil näher erläutern? Ich verstehe es so: erzeugen der Variable "Kalenderereignisse" mit Wert "heute", welcher nachfolgend evaluiert wird. Warum muss das hier über createState gemacht werden? /* Nachfolgend verlässt es mich völlig. Ich habe verstanden, dass das Skript insgesamt doch nach dem "event" Geburtstag sucht. Wo finde ich das? Bin für eine Erklärung, was in den nachfolgenden Zeilen passiert sehr dankbar * `~~[code]~~var idListe = 'Kalenderereignisse.heute'; function pruefeKalender() { var inhalt = getState('ical.2.data.table').val; var heute = ermitteleDatum(); try{ var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String log(ereignisse); var ereignisheute = '', // Liste (kommasepariert) ereignisheute_zeilen = ''; // Liste (mit Zeilenumbruch, zB für Anzeige in VIS) for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(/(inhalt[i].date.indexof(heute)/!="-1)" ||/(inhalt[i].date.indexof('heute')/)/strings/datum/oder/relatives/(nicht/nicht)/gefunden/var/ereignis="inhalt[i].event;" komma/im/namen/ersetzen="">0) ? ', ' : ''; ereignisheute = ereignisheute + komma + ereignis; } } // Aufbereitung für die Ansage (falls vorhanden, wird letztes Komma durch und ersetzt) var lastkomma = ereignisheute.lastIndexOf(','); // letztes Komma in der Reihe if (lastkomma != -1) { var vorn = ereignisheute.slice(0,lastkomma-1); var hinten = ereignisheute.slice(lastkomma+1, ereignisheute.length); ereignisheute = vorn + ' und' + hinten; } // Ende Aufbereitung für die Ansage setState(idListe, ereignisheute); log('Geburtstage: ' + ereignisheute); } catch (fehler_try) { log('Fehler beim Kalenderevent einlesen ' + fehler_try); } }</inhalt.length;>` /*Müll Ignoriert bis ich den Geburtstagsteil verstanden habe */ `~~[code]~~// neuer Teil für Müllkalender createState('Muellereignisse.heute', '', { name: 'Müll-Events von heute', type: 'string' }); var idListe2 = "Muellereignisse.heute"; function pruefeKalender2() { var inhalt2 = getState('ical.1.data.table').val; var heute2 = ermitteleDatum(); try{ var ereignisse2 = JSON.stringify(inhalt2, null, 2); // Ausgabe als String log(ereignisse2); var ereignisheute2 = '', // Liste (kommasepariert) ereignisheute2_zeilen = ''; // Liste (mit Zeilenumbruch, zB für Anzeige in VIS) for(var i = 0; i <inhalt2.length; i++)/{/alle/events/durchgehen/if/(/(inhalt2[i].date.indexof(heute2)/!="-1)" ||/(inhalt2[i].date.indexof('heute')/)/strings/datum/oder/relatives/(nicht/nicht)/gefunden/var/ereignis2="inhalt2[i].event;" komma/im/namen/ersetzen="">0) ? ', ' : ''; ereignisheute2 = ereignisheute2 + komma + ereignis2; } } // Aufbereitung für die Ansage (falls vorhanden, wird letztes Komma durch und ersetzt) var lastkomma = ereignisheute2.lastIndexOf(','); // letztes Komma in der Reihe if (lastkomma != -1) { var vorn = ereignisheute2.slice(0,lastkomma-1); var hinten = ereignisheute2.slice(lastkomma+1, ereignisheute2.length); ereignisheute2 = vorn + ' und' + hinten; } // Ende Aufbereitung für die Ansage setState(idListe2, ereignisheute2); log('Müll: ' + ereignisheute2); } catch (fehler_try) { log('Fehler beim Müll-Kalenderevent einlesen ' + fehler_try); } }</inhalt2.length;>` Im letzten Teil wird die iCal Instanz 2 angesprochen und das zu suchende Event "Geburtstag" definiert. Korrekt? `~~[code]~~// bei Aktualisierung des Kalenders on ({id:'ical.2.events.Geburtstag', change: 'any'}, function(data) { pruefeKalender(); }); on ({id:/\ical.1.events.$/, change: 'any'}, function(data) { // jedes Objekt im ical.1 pruefeKalender2(); }); //bei Skriptstart schedule("5 0 * * *", function () { log("===>Wird einmal am Tag ausgelöst"); pruefeKalender(); pruefeKalender2(); }); [/code]`[/i][/i][/i][/code][/i][/i][/i][/code][/color]
  • [Frage] Skript nach ausführen deaktivieren sinnvoll?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    729 Aufrufe
    AlCalzoneA
    Der Unterschied liegt IMO darin, ob du deinen Host neu startest oder nicht, und was dann mit dem Skript passiert. Ich hatte gerade heute morgen das Problem, dass auf einem Pi ein Setup-Skript (das einen selbst-beenden-Baustein enthält) nicht beendet war. Der Pi hat sich über Nacht neu gestartet und das dann wieder ausgeführte Skript meine Konfiguration überschrieben.
  • [gelöst] Wie Scripte anlegen

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    679 Aufrufe
    HomoranH
    Hier (etwas älter): http://www.iobroker.net/?page_id=6818&lang=de oder hier http://www.iobroker.net/?page_id=5319&l … es_Scripts neu anlegen wie hier, dann aber rechts javascript auswählen. Gruß Rainer
  • [gelöst] Winexe - Fehlermeldung im Log

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    556 Aufrufe
    Niemand hat geantwortet
  • Abfrage "Zustand irgendeines Fensters hat sich geändert"

    Verschoben
    10
    0 Stimmen
    10 Beiträge
    1k Aufrufe
    GoerschG
    ich heb mich mal nach "oben"
  • Warema efsm mit Broadlink in IO Broker einbinden

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    936 Aufrufe
    Niemand hat geantwortet
  • Bitte um Hilfe, Blockly

    Verschoben
    17
    0 Stimmen
    17 Beiträge
    3k Aufrufe
    rantanplanR
    Für die Nachwelt ;) [image: 147_blockly_view-wechsel.png] Grüße
  • [gelöst] mit vis button Sonos Favoriten setzten

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    juergen2908J
    Grüß Euch, danke für den Wink. Funktioniert, ich habe den bestehenden Button in der Object ID den Sonos Parameter ausgewählt:sonos.0.root.192_168_xxx_xx.favorites_set und dann den Namen von den Favoriten hinzugefügt. LG 1693_sonos.png
  • [gelöst] Bitte um Nachhilfe zur "on" Anweisung

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    845 Aufrufe
    AlCalzoneA
    @skorpil: data wurde doch vorher nirgendwo definiert, nur idVariable und idStart? ` Doch, hier (als Funktionsargument): on(idVariable, function (data) { @skorpil: was bedeutet "||" und warum "===", also dreimal = ` || steht in JavaScript für "ODER", d.h. der Teil in geschweiften Klammern hinter if (…) wird ausgeführt, wenn mind. eine der Bedingungen erfüllt ist. === ist ein Vergleich auf Gleichheit. Oft sieht man auch "==", der Unterschied hierbei ist, dass "==" auch Werte unterschiedlicher Typen zulässt, "===" aber nicht. Vermeidet ein paar Probleme die auftreten könnten. So ist "1" == 1 wahr, aber nicht "1" === 1 (da sie unterschiedliche Variablentypen sind). @skorpil: und das verstehe ich auch nicht "data.state.val " ` data.state ist der State in ioBroker, den du in der on-Anweisung überwachst, in deinem Fall also "hm-rega.0.51644". Der wird dir bei der Überwachung mitgegeben, um auf den aktuellen (und alten) Wert ragieren zu können. data.state.val ist der Wert, der aktuell in diesem State steht.
  • Blockly Trigger Zeitplan mit Variablen füttern

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    2k Aufrufe
    rantanplanR
    @Linedancer: Ich tue mich etwas schwer mit Javascript, deshalb kann ich nicht genau sagen ob der Code das richtige für mich ist. ` Javascript kann ich auch nicht. So wie ich das Beispiel von Paul53 verstehe, wird in einer Variablen/Datenpunkt eine Zeit eingetragen und diese wird dann in eine Wecker-Funktion übernommen. Also man kann seinen "Wecker" variabel einstellen. Das wäre die 2. Hälfte Deiner gesuchten Lösung. @Linedancer: Mein Ziel ist folgendes: Ich habe mit blockly eine Wecker erzeugt der zur festgelegten Zeit mit Sonos und Hue weckt. Jetzt möchte ich die Weckzeit abhängig von der mit google Maps ermittelten Fahrzeit ins Büro früher oder später setzen. Die Fahrzeit kommt hier her: http://forum.iobroker.net/viewtopic.php … 235#p38226 ` Wie und wann holst Du die Fahrzeit? Hast Du dann die Fahrzeit in einer Variablen? Mal schauen ob ich es richtig verstanden habe. Normale Fahrzeit 1 Std. Weckzeit bei normaler Fahrzeit 6:00 Uhr Fahrzeit laut Google Maps 1,5 Std. Neue Weckzeit 5:30 Interessant :D Stell doch mal Deinen aktuellen "Wecker" als Export hier rein. Grüße
  • Debug Instanz von Javascript/Coffescript Script Engine

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    L
    :shock: da war ich blind. Danke
  • Frage zum setTimout-Trigger

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    620 Aufrufe
    D
    Danke für die schnelle Antwort. Werde ich mal ausprobieren. Gruß, Thorsten
  • [gelöst] exec ioBroker aus ioBroker abfragen?

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    725 Aufrufe
    ruhr70R
    na prima… var abfrage = 'iobroker update'; funktioniert.
  • Dht22 lokal per rpi_dht auslesen und in vis ausgeben

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    paul53P
    Versuche es mal so: exec('sudo /home/pi/rpi_dht22/rpi_dht 0', function(error, stdout, stderr) { if(error) log('Fehler Pin 0: ' + stderr, 'error'); else setState('meine_datenpunkt_ID', stdout); });
  • Google api contacts - Bilder von Kontakten holen

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    646 Aufrufe
    Niemand hat geantwortet
  • Täglicher Trigger Sonnenuntergang

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    962 Aufrufe
    htreckslerH
    genau, der wird jeden Tag ausgelöst ohne das Du was tun musst. Außer… in den Einstellungen des Javascript Adapters die Koordinaten eintragen, damit auch der SU von deinem Wohnort kommt.
  • XML Daten auslesen

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    Y
    Das könnte mit dem Parser Adapter gemacht werden. Haben wir hier schon gemacht: http://forum.iobroker.net/viewtopic.php … =60#p57065 Dazu den Parser Adapter und eine Instanz davon installieren. Im Adapter sinngemäss dem Drucker-Beispiel eine Regel hinzufügen (+) Da Deine URL eingeben und folgende regex-Regel probieren:```` <rawdata>54014B467FFF0C10FDFF00+</RawData>\n\n<primaryvalue>(\d+.\d+)</primaryvalue></rawdata> Das liest den ersten Sensor-Wert ein (hoffentlich). Für den zweiten Sensor eine zweite Regel erfassen und die RAW Sektion anpassen:```` <rawdata>55014B467FFF0C10BEFF00+<\/RawData>\n\n<primaryvalue>(\d+.\d+)</primaryvalue></rawdata> Hier kannst Du testen: https://regex101.com/r/lmXtPE/1
  • Heizungssteuerung / Raumtemperatur

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    990 Aufrufe
    S
    Hallo Ralf, danke für Deine Hilfe. Werde mir Deinen Beitrag am Wochenende in Ruhe anschauen, würde mich auch zu Testzwecken zur Verfügung stellen. Leider kann ich auf Deine PN nicht antworten, ich war im Forum noch nicht aktiv genug. Gruß, Markus
  • Gleich zwei Probleme

    Verschoben
    6
    1
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    HomoranH
    @HolgerK: Muss ich dann nur noch den Namen eintragen und nicht mehr unter Palette installieren ? ` ja Viel Glück Rainer

256

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge