Skip to content

Skripten / Logik

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

16.5k Themen 213.2k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

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

    7k 79k
    7k Themen
    79k Beiträge
    OliverIOO
    @IceD112 Das Lesen eines Datenpunkte sollte eigentlich keinen API Call auslösen. Wenn, dann musst du dem Adapter sagen, dass er nicht so oft abfragen soll
  • 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?
  • [GELÖST]on({time…..}) Aufruf

    Verschoben
    54
    0 Stimmen
    54 Beiträge
    13k Aufrufe
    P
    Hallo, ich hatte weiter oben im Thread die Steuerung der Rollläden erwähnt. Sie werden zu einer festen Zeit geöffnet. Diese Zeit wird in paul53's Skript ja wunderbar in Stunde und Minute zerlegt und dann per on(time)-Funktion gestartet. Frage: Lässt sich das auch bis auf die Sekunde genau machen? Die Doku sagt nix dazu ~~@[url=https://github.com/ioBroker/ioBroker.javascript#astro--function:~~ ~~astro Funktion in ioBroker Javascript Github"]~~on({time: {hour: 12, minute: 30}}, function () { log((new Date()).toString() + " - Will be triggered at 12:30!"); }); ` Ich starte die Schließung der Rollläden per Astrofunktion (Sonnenuntergang). Diese lässt sich nicht ohne weiteres mit der on(time)-Funktion aufrufen. Diese on(time)-Funktion brauche ich aber, damit die clearSchedule-Funktion verwendet werden kann. Als lasse ich mir mit getAstroDate die Sonnenuntergangszeit ausrechnen und addiere/subtrahiere den in VIS eingegeben Shift dazu. Diese Zeit ist nun die Basis für die on(time)-Funktion. [image: 261_bildschirmfoto_2016-11-15_um_18.32.53.jpg] Die errechnete Zeit ist sekundengenau. Momentan nutze ich aber nur die Stunde und die Minute. ! ```` // Schließen <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // per Astrofunktion abhängig vom Fensterstatus (Daten von Variable, nicht vom Gerät RHS) createState('Homepilot.Rollladen.Wohnzimmer.zu.Shift', 10, { type: 'number', unit: 'min', name: 'Wohnzimmer Rollläden Schließung Astrosteuerung - Shift in Minuten' }); createState('Homepilot.Rollladen.Wohnzimmer.zu.Shift.Zeit', 10, { type: 'string', unit: 'Uhr', name: 'Wohnzimmer Rollläden tatsächliche Uhrzeit nächste Schließung per Astrosteuerung und Shift' }); createState('Homepilot.Rollladen.Wohnzimmer.zu.Level', 95, { type: 'number', min: 0, max: 100, unit: '%', name: 'Wohnzimmer Rollläden Schließung Astrosteuerung - Level' }); var idSchliessung_Shift = "javascript.0.Homepilot.Rollladen.Wohnzimmer.zu.Shift", idSchliessung_Zeit = "javascript.0.Homepilot.Rollladen.Wohnzimmer.zu.Shift.Zeit", idSchliessung_Level = "javascript.0.Homepilot.Rollladen.Wohnzimmer.zu.Level"; ! // Variablen Definition für Schliessentimer per on()-Funktion var schliessen_timer = null; var schliessen_h; var schliessen_m; var schliessen_s; ! // wenn Shift in VIS verändert wurde, wird die neue Schließenzeit ausgerechnet function astro_shift_berechnen () { var astrotag = isAstroDay(), //sonnenaufgang, // spielt beim Schließen keine Rolle sonnenuntergang, astro_shift_zeit_zu, shift_minuten = parseFloat(getState(idSchliessung_Shift).val); // kann negativ sein var today = new Date(); var tomorrow = today.setDate(today.getDate()+1); if (astrotag) { // Wenn Tag (Aufgang vorbei (erst wieder morgen, Untergang kommt noch heute) sonnenuntergang = getAstroDate('sunset', today); //sonnenaufgang = getAstroDate('sunrise', tomorrow); } else { // nach Nacht (Untergang vorbei (erst wieder morgen, Aufgang kommt heute oder morgen) sonnenuntergang = getAstroDate('sunset', tomorrow); //sonnenaufgang = (today.getHours() > 12 && today.getHours() <= 23) ? getAstroDate('sunrise', tomorrow) : getAstroDate('sunrise', today); // es ist vor Mitternacht (bzw. vor 23:XXUhr), dann morgen, sonst heute } astro_shift_zeit_zu = sonnenuntergang.setMinutes(sonnenuntergang.getMinutes() + shift_minuten); var neue_zeit = new Date(astro_shift_zeit_zu); //log(astro_shift_zeit_zu); //log(shift_minuten); //log(neue_zeit.toLocaleTimeString()); setState(idSchliessung_Zeit, neue_zeit.toLocaleTimeString()); // neue Schliessungszeit für Steuerung per on()-Funktion vorbereiten (vom 16.11.2016) setTimeout( function() { var time_array = getState(idSchliessung_Zeit).val.split(":"); schliessen_h = parseInt(time_array[0], 10); // Stunden schliessen_m = parseInt(time_array[1], 10); // Minuten schliessen_s = parseInt(time_array[2], 10); // Sekunden log('Wohnzimmer Rollläden: Neue Schließenzeit gesetzt: ' + getState(idSchliessung_Zeit).val + ' Uhr'); setSchliessenTimer(); }, 2000); } ! function setSchliessenTimer() { if (schliessen_timer) clearSchedule(schliessen_timer); schliessen_timer = on({time: { hour: schliessen_h, minute: schliessen_m/, // <<<<<<< Sekunden möglich??? second: schliessen_s/} }, function () { var level_rechts = getState(idRolloWZrechts_position).val, level_links = getState(idRolloWZlinks_position).val, level_soll = parseInt(getState(idSchliessung_Level).val, 10); if (level_rechts > level_soll) { //var fenster_rechts = getState(idStatusWZFensterrechts).val; //if (fenster_rechts != 2) { setTimeout(function () { setState(idRolloWZrechts_position, level_soll); // id rechts, 95% log('Rollladen WZ rechts wird herabgefahren - Astrosteuerung'); }, 1000); //} else log('Rollladen Wohnzimmer Fenster rechts nicht herabgefahren, da Fenster offen'); } else log('Rollladen Wohnzimmer rechts war bereits weiter als ' + level_soll + '% geschlossen, deshalb keine Bewegung'); if (level_links > level_soll) { var fenster_links = getState(idStatusWZFensterlinks).val; if (fenster_links != 2) { setState(idRolloWZlinks_position, level_soll); // id links, 95% log('Rollladen WZ links wird herabgefahren - Astrosteuerung'); } else log('Rollladen Wohnzimmer Fenster rechts nicht herabgefahren, da Fenster offen'); } else log('Rollladen Wohnzimmer rechts war bereits weiter als ' + level_soll + '% geschlossen, deshalb keine Bewegung'); //log('Rollladen WZ Fenster links wird derzeit noch nicht automatisch geschlossen'); }); } ! // Berechnung der Uhrzeit, wann Astrosunset und Shift // jede Stunde schedule('9 * * * *', astro_shift_berechnen); // oder bei Änderung der Eingabe von Shift on(idSchliessung_Shift, astro_shift_berechnen); Gruß Pix
  • Was bedeutet die Fehlermeldung?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    HomoranH
    @skorpil: Rainer, Ich habe dazu doch noch einmal eine Frage: hast Du eine Idee, WARUM das Gerät immer wieder die Verbindung zu cuxd verliert? ` Habe halt auch keine Ahnung mehr. Das WLAN fiel mir auch sofort auf, da ich aber davon ausging, dass der rpc.0 auch über das selbe WLAN läuft und zwar ohne Probleme war das für mich auch raus. Irgendetwas muss mit der Konfiguration des rpc.1 oder gar des cuxD in der CCU Probleme machen. Ich habe diese Meldungen nicht, kann es leider auch nicht reproduziern :( BIN-RPC ist in Ordnung - CuxD verstehet IMHO kein XML-RPC. Gruß Rainer
  • Hilfe für den Einstieg in Javascript mit Sayit

    Verschoben
    18
    0 Stimmen
    18 Beiträge
    3k Aufrufe
    N
    @Jeeper.at: hallo, ja, sollte man so auch nicht machen. Wenn du eine bestimmte Zeit hast, dann reicht es auch wenn das Script viel weniger oft läuft. Damit wird zwar die Zeit der Auslösung ungenauer, aber da kommt es halt drauf an was du mit dem Script erreichen willst. Die Variante, das du in der CCU2 eine Variable setzt und im Script darauf reagierst besteht ja immer noch. Dann wird das Programm einmal in der CCU2 gestartet und einmal in IoBroker. Also so wie ich es mit der Waschmaschine mache. ` Ich habe nun auf die Variante "Waschmaschine" umgestellt. Leider spricht weder Ivona (mit Keys) noch Google mit mir. Sayit hat was gegen mich 8-) . [image: 1641_wm.jpg] Thomas
  • Blocky Astrozeit in Variable

    Verschoben
    3
    1
    0 Stimmen
    3 Beiträge
    919 Aufrufe
    rantanplanR
    Hallo Die Abfrage Falls "Aktuelle Zeit von 'Sonnenaufgang'…" gibt Wahr/True zurück, wenn die Bedingung erfüllt ist. Da muss man keinen Wert vergleichen. Ich würde die Abfragen ohne "sonst falls" machen. Zumal sich wohl einige Zeiten überschneiden können. Bei "Sonnenaufgang-Ende" ist eventuell auch noch "Sonnenaufgang" gültig. Also einfach mehrere "Falls mache" chronologisch untereinander. Falls Sonnenaufgang mache Falls Sonnenaufgang-Ende mache usw. Dann wird in "Tagesabschnitt" immer das Richtige stehen. Grüße
  • Astro plus zufallszeit

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    P
    Hallo, var min = 0; // Minimum Minuten var max = 100; // Maximum Minuten // Zufallszahl ermitteln function rand (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var zufall = rand(min,max); schedule({astro: "sunrise", shift: zufall}, function () { log(zufall + " Minuten nach Sonnenaufgang"); }); ````damit bekommst du einen zufälligen Shift zwischen 0 und 100 Minuten nach Sonnenaufgang. Allerdings berechnet sich der Shift nur einmal beim Skriptstart. Wenn er zB täglich neu berechnet werden soll, musst du um Mitternacht noch einen __clearSchedule__ Scheinbar ist aber die Nutzung von __clearSchedule__ in Verbindung mit Astrofunktionen nicht möglich ~~@[url=https://github.com/ioBroker/ioBroker.javascript/blob/master/README.md#clearschedule:~~ > ~~Javascript Github von ioBroker"]~~If no "astro" function used you can cancel the schedule later. To allow this the schedule object must be saved: ` Falls das wirklich nicht geht, kannst du etwas umständlich die Sonnenaufgangszeit mit getAstroDate("sunrise", … abfragen und die Stunden und Minuten in eine Cron-Schreibweise portieren. Daraus kann man dann einen Schedule machen, der sich auch wieder löschen lässt :roll: :o :? :lol: Falls der Schedule beim Beenden des Skriptes gelöscht wird, kann man auch das Skript nach dem Skriptstart um Mitternacht sofort nach dem erreichten Schedule wieder deaktivieren. Das geht mit __ScriptEnabled__. Pix
  • Sonos Lautstärke ändern

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    R
    Hallo Pix, vielen Dank für deine schnelle Antwort und Danke, dass du dich um eine Lösung für die Fehlermeldung bemühst hast. Dass es bei dir läuft und bei mir nicht lief, lag dann doch an was anderem. Seit einem zurückliegenden Update liefen ein paar Sonosinstanzen nicht mehr bei aktiviertem Webserver. Küche lief noch über den Lichttaster, aber eben nicht über den 6-fach-Taster, was ich jetzt erst bemerkt habe. Mit deaktivertem Webserver läuft es wieder. Grüße, Rob
  • Json String extrahieren

    Verschoben
    3
    1
    0 Stimmen
    3 Beiträge
    3k Aufrufe
    C
    Super. Vielen Dank. damit funktioniert es.. Gruss Silvio
  • Script oder Blockly um Daten in die MySQL Datenbank zu schreiben

    Verschoben
    21
    0 Stimmen
    21 Beiträge
    6k Aufrufe
    apollon77A
    Aaaalso UPDATE!! Neue Version von SQL-Adapter zum Testen verfügbar. Fügt das regelmäßige schreiben auch ohne Änderung hinzu: siehe http://forum.iobroker.net/viewtopic.php … 190#p39190 Und zum Thema "Converter History -> SQL" gibt es auch Neuigkeiten: History-Adapter und SQL-Adapter vom Github nehmen und dann gibt unter https://github.com/ioBroker/ioBroker.history in der Readme unter "Data converter" auch Infos und den aktuellen Stand. Ich habe es rudimentär mit SQLite getestet und klappte soweit ... jetzt wären freiwillige gefragt :-) siehe http://forum.iobroker.net/viewtopic.php?f=36&t=3965
  • [gelöst]Howto createState als Bool?

    Verschoben
    4
    2
    0 Stimmen
    4 Beiträge
    11k Aufrufe
    P
    Hallo, ich glaube, mit forceCreation wird der Datenpunkt neu angelegt, egal, ob schon vorhanden oder nicht. Bin im Zug und kann es nicht ausprobieren. ` > createState createState(name, initialValue, forceCreation, common, native, callback) Create state and object in javascript space if does not exist, e.g. "javascript.0.mystate". ####Parameters: name: name of the state without namespace, e.g. "mystate" initialValue: variable can be initialized after created. Value "undefined" means do not initialize value. forceCreation: create state independent of if state yet exists or not. common: common description of object see description here native: native description of object. Any specific information. callback: called after state is created and initialized. It is possible short type of createState: createState('myVariable') - simply create variable if does not exist createState('myVariable', 1) - create variable if does not exist and initialize it with value 1 createState('myVariable', {name: 'My own variable', unit: '°C'}, function () {log('created');}); createState('myVariable', 1, {name: 'My own variable', unit: '°C'}) - create variable if does not exist with specific name and units ` Hier kann man noch tiefer eintauchen: https://github.com/ioBroker/ioBroker/bl … A.md#state Pix
  • Script -> exec funktioniert nicht

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    F
    Hmm, ich hätte fast gedacht, dass man ein Bild auch so holen kann. Ich zeige Dir mal wie es bei mir funktioniert (jedoch mit einer Instar). Letztendlich ist bei vielen aber der gleiche Chinakracher drinnen. Ich habe Dir mal ein Beispielskript beigefügt, welches auch gleich das Bild per Telegram versendet. Ich unterstell einfach mal, dass Du vielleicht sowas auch noch vor hast? So, also hier das Script mit meiner Kamera: var request = require('request'); var fs = require('fs'); request.get({url: 'http://192.168.1.22/tmpfs/auto.jpg?usr=gast&pwd=gast', encoding: 'binary'}, function (err, response, body) { fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) { if (err) { console.error(err); } else { console.log('Snapshot sent'); sendTo('telegram.0', {text: '/tmp/snap.jpg', chatId: 0190666666, caption: 'Achtung Snappschuss'}); } }); }); Ansonsten, wenn es bei Dir gar nicht passt, versuche mal mit dieser Schreibweise: exec('wget -O - http://admin:xxxxxxxxxxxx@192.168.178.63/videostream.flv?usr=admin\&pwd=xxxxxxxxxxxxx | dd count=300 of=/mnt/NAS/Bilder/Haustuer.flv && mplayer -nosound -vo jpeg:outdir=/mnt/NAS/Bilder/ -frames 2 /mnt/NAS/Bilder/Haustuer.flv', function (error, stdout, stderr) { console.log('stdout: ' + stdout); }); Hoffe es passt so. So long, Fitti
  • Zwischenschalter Dauer errechnen

    Verschoben
    18
    0 Stimmen
    18 Beiträge
    2k Aufrufe
    ThisoftT
    Das war der entscheidende Hinweis von @paul53 dass der Zeitstempel jetzt in Millisekunden ist. Hatte ich nicht mehr dran gedacht, ist ja nun wirklich auch schon seeeeehr, sehr lange her von Version 0.9.0 auf 3.1.0 ;)
  • Rolladensteuerung ccu2 Wochenende, Wochentags, Feiertage

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    2k Aufrufe
    F
    Hi, ich steuere auch komplett via CCU2 meine Rollläden. Dabei nutze ich dann auch diverse Situationen, um andere Schaltmodi zu verwenden. Das mache ich mit der CCU2 eigenen Klick-Oberfläche. Wenn So-Do UND kein Feiertag UND kein URLAUB, dann gehe um 22.00 Uhr runter. sonst, wenn Fr-Sa ODER Feiertag morgen ODER URLAUB, dann gehe um 23.00Uhr runter. Usw. "Urlaub" setze ich über eine Variablen. "Feiertag morgen" ermittle ich mittels einem Skript aus dem Homematic Forum, welches auch Variablen setzt. Findest Du schnell wenn DU nach Feiertag suchst. Hilft Dir das? Fitti
  • Flot Chart oder Vis View in eine e-Mail einfügen

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    910 Aufrufe
    F
    Interessante Frage. Wäre auch für Telegram und Co interessant. IMHO würde es mit PhantomJS gehen. Also ein Webseiten-Screendumper. Nur der ist extrem Ressourcen fressend: http://forum.iobroker.net/viewtopic.php … 847#p36531 Aus deiner Signatur erkenne ich, dass Du Himbeeren verwendest. Das wird dann wohl leider nix. Ich habe hier https://github.com/mbochynski/canvas2image noch was schönes gefunden. Kann es leider nicht testen, da mein VPN nicht geht. Aber vielleicht hat der eine oder andere Fuchs 8-) dazu eine Idee? Idee dahinter, man hat irgendwo eine kleine Webseite oder HTML Sniplet mit einem Flotaufruf in einem div. Dann könnte diese lösung daraus ein Bild machen.
  • [gelöst]Script enabled gelöscht…

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    989 Aufrufe
    S
    Hallo Thilo, vielen Dank für die Hilfe. Und tatsächlich hat ein umbenennen der scripte ausgereicht um die 'verschwundenen' Einträge wieder zu bekommen….guter Tip, man lernt nie aus! Lg
  • [gelöst]Frage zu setTimeout Funktion….

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    etvE
    @paul53: Beispiel für Sony starten mit 5 Minuten Verzögerung: var timersony = null; var starte_sony = "http://192.168.68.37:50000/tasker=displayoff"; if(timersony) clearTimeout(timersony); timersony = setTimeout(function() {request(starte_sony);}, 5 * 60000); ```` ` danke dir paul53 - werd' ich gleich einbauen… Liebe Grüße tom
  • HM-PB-2-WM Anfängerfrage

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    P
    Sorry, hab keine HUE. Gruß Pix
  • Einführung Programmieren mit Javascript

    Verschoben javascript
    12
    1 Stimmen
    12 Beiträge
    15k Aufrufe
    G
    Funktionen Wir haben sie bereits verwendet, wir haben selber etliche geschrieben, nur was ist das? Eine Funktion ist eine Zusammenfassung mehrere Anweisungen zu einem Block. Eine Funktion wird (in der Regel) über Ihren Namen aufgerufen. Ihr können Parameter übergeben werden und sie kann einen Rückgabewert haben. Nehmen wir die Funktion getState(). Der Funktion übergeben wir die id des States, den wir haben möchten. Als Rückgabewert erhalten wir dann den Zustand des States. Gut, eine Funktion verwendet man, wenn man sie braucht. Wann aber schreibt man eine Funktion? Dann, wenn man muss, oder wenn man sie braucht. Wir brauchen z.B. eine Funktion bei der Funktion subscribe() bzw. on(). on({id: 'hm-rpc.1.IEQ053xxxx.1.PRESS_SHORT‘}, function (obj) { setState("hm-rpc.1.IEQ038xxxx.3.State",!getState("hm-rpc.1.IEQ038xxxx3.State").val); setState("hm-rpc.1\. IEQ056xxxx.3.State",!getState("hm-rpc.1\. IEQ056xxxx.State").val); }); Die Funktion ist der Bereich > function (obj) { … } In diesem Fall hat die Funktion keinen Namen. Wichtig ist folgendes festzuhalten: Eine Funktion ist mit dem Schlüsselwort function gekennzeichnet. Eine Funktion kann einen Namen haben. Beispiel function irgendetwas. Der Name kann nach den gleichen Regeln wie der Name einer Variablen gewählt werden. Einer Funktion kann ein oder mehrere Werte Übergeben werden. In dem Beispiel wird ein Wert, obj, übergeben. Mehrere Werte werden durch Komma übergeben. Die Werte werden von Runden Klammern eingeschlossen. Wird kein Wert übergeben, so bleibt der Raum zwischen den runden Klammern leer. In den geschweiften Klammern wird dann die Anweisungen wie in einem ganz normalen Programm geschrieben. Eine Funktion kann einen Wert zurückgeben. Nur wann schreibt man sonst noch eine Funktion. Eine Funktion hilft dabei, ein Programm zu strukturieren und übersichtlicher zu gestalten. Gerade wenn ein Programmabschnitt mehrfach verwendet werden soll, macht es Sinn, ihn in eine Funktion auszugliedern. Zum Beispiel wollen wir an verschiedenen Stellen eines Programms die Temperatur schön formatieren. Das Programm könnte so aussehen: console.log('Wohnzimmer: '+formatTemp(20)); console.log('Küche: '+formatTemp(18.27)); function formatTemp(temp) { return(temp.toFixed(1)+'°C'); } Die Funktion selber gibt nichts aus (könnte sie natürlich). Vielmehr gibt sie per return einen Wert zurück, den wir dann ausgeben. Ob sich für so eine einfache Aufgabe bereits eine Funktion lohnt liegt im Auge des Betrachters. Dem typografisch versierten Leser dürfte aufgefallen sein, dass man zwischen der Zahl und °C eigentlich ein Leerzeichen schreibt. Wenn wir dieses in der Funktion korregieren, brauchen wir den Rest des Programms nicht mehr kontollieren. Also auch bei so einem kleinen Programm kann es Sinn machen. Der Name der Funktion ist eine Variable. Daher müsste eigentlich auch folgendes gehen: console.log('Wohnzimmer: '+formatTemp(20)); console.log('Küche: '+formatTemp(18.27)); var formatTemp=function (temp) { return(temp.toFixed(1)+'°C'); }; Das Programm beschert uns jetzt aber leider einen Fehler: > Test: ReferenceError: formatTemp is not defined at script.js Das hängt damit zusammen, dass wir zunächst die Funktion (Variable) verwenden und diese erst später definiert wurde. So geht es: var formatTemp=function (temp) { return(temp.toFixed(1)+'°C'); }; console.log('Wohnzimmer: '+formatTemp(20)); console.log('Küche: '+formatTemp(18.27)); Daher macht es in der Regel Sinn bei der Deklaration der FUnktion auch den Namen anzugeben. Bei dieser Schreibweise kommt es im Skript (fast) nicht darauf an, wo die Funktion deklariert wird. Idealer Weise schreibt man erst das eigentliche Programm und hängt am Ende die Hilfsfunktionen an. Wenn man der Funktion selber den Namen gibt sind Rekursionen möglich. Ein Rekursion ist eine Funktion, die sich selber aufruft. Es gibt Situationen in denen dieses notwendig ist. Nach Möglichkeiten sollte man diese wegen ihrer schlechten Lesbarkeit vermeiden. EIn Beispiel hierzu ist die Fakultät eine Zahl. Die Fakultät von 3 ist 6. Die Fakultät ist eine mathematische Funktion, die einer natürlichen Zahl das Produkt aller natürlichen Zahlen (ohne Null) kleiner und gleich dieser Zahl zuordnet. Bei 3 wird also gerechnet: 123=6 Das Programm könnte hierzu wie folgt aussehen: function fac(n) { if (n<2) { console.log(n); return 1; } else { console.log(n+'*') return n*fac(n-1) } } console.log('='+fac(3)); Wichtig ist die Zeile return n*fac(n-1) Hier ruft sich die Funktion selber auf. Bei der Variablenschreibweise wäre das nicht möglich. Trotzdem wäre ein solches Kontrukt nicht notwendig gewesen. Mit einer for-Schleife wäre das eleganter gewesen: function fac(n) { var ergebnis=1; for(var i=2;i<=n;i++) ergebnis*=i; return ergebnis; } console.log(fac(3)); Einer Funktion können beliebig viele Argumente übergeben werden. Spannend ist es, wenn die Zahl der Argumente variiert. Hier gibt es die Möglichkeit diese mit dem arguments Objekt abzufragen: `function printArgs() { var result = ""; var i; for (i = 0; i < arguments.length; i++) { result += arguments[i] + ', '; } return result; } console.log(printArgs(1,2,3,4,'Maus'));` [/i]
  • Gelöst - Programm funktioniert nicht so wie's soll :(

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    852 Aufrufe
    P
    Kein Problem !!! Ich habe selber schon so viel aus dem Forum an Infos gezogen und Hilfe bekommen, da bin froh wenn ich auch mal helfen kann. Gruß Phantomio
  • Sayit-Adapter mit falschem PFad

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    B
    Hallo Rainer, hab eben noch mal die Konfiguration angesehen. Dort gibt es einen Eintrag "Cache". Dieser war angewählt. Habe den Haken entfernt und siehe da, es läuft. Was für eine Funktion hat "Cache"? Um schneller auf bestimmte Dinge zugreifen zu können?
  • Sleeptimer mit Countdown

    Verschoben
    30
    0 Stimmen
    30 Beiträge
    9k Aufrufe
    B
    Hallo Pix, erstmal danke. Das mit dem Widget habe ich verstanden. Wie muss ich das Skript anpassen, dass der Timer los läuft, wenn eine bestimmte Variable=true ist? Gruß Balu Edit: hab es jetzt angepasst, funktioniert sogar. Wer evtl. das gleiche "Problem" hat, hier das Skript. hm-rega.0.xxxxx startet den Timer (in meinem Fall wenn alle Personen abwesend sind) hm-rega.0.yyyyy schaltet dann den Alarm scharf ` > createState('countdown', 20); function count() { setTimeout(function () { var timer = getState('countdown').val || 20; if (timer > 1) { setState("hm-rega.0.xxxxx", false); setState('countdown', timer - 1); count(); } else { setState('countdown', 0); setState("hm-rega.0.yyyyy", true); } }, 1000); } on("hm-rega.0.xxxxx", function (obj) { if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) { setState('countdown', 20); setState("hm-rega.0.yyyyy", false); count(); } }); ` Super, wie einem hier geholfen wird. Daumen hoch Danke und Gruß Balu

553

Online

32.6k

Benutzer

82.2k

Themen

1.3m

Beiträge