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?
  • Einführung Programmieren mit Javascript

    Moved javascript
    12
    1 Votes
    12 Posts
    15k Views
    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 :(

    Moved
    5
    0 Votes
    5 Posts
    852 Views
    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

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

    Moved
    30
    0 Votes
    30 Posts
    9k Views
    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
  • [nicht mehr relevant] Anzeige des Duty Cycles in VIS

    Moved
    5
    0 Votes
    5 Posts
    947 Views
    Jeeper.atJ
    Ja, habe ich. Aber mir sträubt es sich, etwas alle paar Minuten auszuführen nur damit mein Spieltrieb befriedigt ist. LG Günther
  • Metro Tile Dialog

    Moved
    2
    0 Votes
    2 Posts
    647 Views
    M
    Genau die Anforderung habe ich auch. Habe einen älteren Thread gefunden in dem Bluefox geantwortet hat, dass das möglich ist, er das aber noch nicht eingebaut hat. Würde das gerne wieder pushen! :-)
  • Io.broker.javascript WebSocket ansprechen

    Moved
    5
    0 Votes
    5 Posts
    3k Views
    D
    Hallo! Ich verzweifle mit dem WebSocket Zeug … ich habe nun folgendes in ein Script kopiert: var WebSocketClient = require('websocket').client; var client = new WebSocketClient(); client.connect('ws://192.168.178.103:99'); client.onopen = function () { console.log('Sending...'); client.send('Ping'); }; client.onclose = function(){ console.log('Server offline.'); }; client.onmessage = function(msg){ console.log(msg.data); }; client.onerror = function(msg){ console.log('Sorry but there was an error.'); }; per OC-console sehe ich auch etwas auf dem RS485 Bus ankommen: 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET / HTTP/1.1.. 55 70 67 72 61 64 65 3A 20 77 65 62 73 6F 63 6B Upgrade: websock 65 74 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 et..Connection: 55 70 67 72 61 64 65 0D 0A 53 65 63 2D 57 65 62 Upgrade..Sec-Web 53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 Socket-Version: 31 33 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 13..Sec-WebSocke 74 2D 4B 65 79 3A 20 75 65 5A 4C 33 73 32 67 2F t-Key: ueZL3s2g/ 61 39 30 72 67 35 58 74 2B 5A 2F 77 51 3D 3D 0D a90rg5Xt+Z/wQ==. 0A 48 6F 73 74 3A 20 31 39 32 2E 31 36 38 2E 31 .Host: 192.168.1 37 38 2E 31 30 33 3A 39 39 0D 0A 0D 0A 78.103:99.... Aber jetzt komme ich nicht weiter, "onopen" wird nicht ausgelöst, alle Versuche etwas zu senden gehen leer aus!!! Hat jemand mit io.broker JavaScript schon mal einen eigenen WebSocket Client entwickelt?
  • Blockly logic Not

    Moved
    3
    1
    0 Votes
    3 Posts
    871 Views
    A
    Super Danke für den Vorschlag!! So funktioniert es jetzt! mfg Arminhh
  • Finde fehler im Script nicht if/else Verschachtelung

    Moved
    5
    0 Votes
    5 Posts
    2k Views
    G
    Kleine Anregungen: Das Ereignis soll letztendlich nur ausgeführt werden, wenn der Wert von idAbwesendKurzVariable false wird. Hier dürfte es effizienter sein, die Prüfung gleich bei on() vorzunehmen: on({id: idAbwesendKurzVariable', value: false},...) Da Programm würde sich dadurch noch mal verkürzen. /* Programm Abwesend Kurz Ablösen des CCU2 Programms Mit Hilfe von Jey Cee, Pix und Paul53 */ // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus" // Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz idLichthelligkeit = "hm-rega.0.19606", idAstro = 'hm-rega.0.7961'; // kurze Schreibweise on({id: idAbwesendKurzVariable, value: false}, function (obj) { var helligkeit = getState(idLichthelligkeit).val, astro = getState(idAstro).val; if (!astro) { // wenn Astro ist Nacht if (!helligkeit) starteAktion2(); } else { // wenn Astro ist Tag if (helligkeit) starteAktion3(); else starteAktion4(); } }); Warum verwendest Du Variablen von der Homematic? Wenn es geht solltest DU in Betracht ziehen, dass zu ändern. Die Variablen von Homematic werden nur von Zeit zu Zeit aktualisiert (gewollt). Daher kann es zu deutlichen Verzögerungen kommen. Ich habe bei mir nach und nach alle Abhängigkeiten der Homematic soweit möglich entfernt. Auch der Zustand Tag/Nacht wäre ein Punkt den man nach ioBroker verschieben könnte.
  • Unterstützung gesucht ($): Entwicklung eines Scripts

    Moved
    9
    2
    0 Votes
    9 Posts
    2k Views
    HomoranH
    @ChristianF: Das Script funktioniert übrigens prima ` @ChristianF: eider scheint gerade keine Sonne, aber ich probiere es morgen natürlich sofort aus ` Wieso konntest du das denn gestern abend nicht testen. Hast du bei der Planung der Anlage vergessen auch einige Lunarmodule einzubauen? :lol: :lol: Schön das jetzt alles klappt. Gruß Rainer
  • Zeitsteuerung über Variable

    Moved
    8
    0 Votes
    8 Posts
    2k Views
    K
    Oh vielen Dank für die rasche Antwort.
  • (Gelöst)Blockly auf 2 States reagieren

    Moved
    5
    0 Votes
    5 Posts
    3k Views
    L
    Moin, Danke Apollon77 und Rantanplan. Soweit war ich fast auch ;) aber hat nie funktioniert,glaub ich habe immer gleich den Steuere-Baustein genommen. So funktioniert es vielen Dank für den Schupser! Gruß Sven
  • [GELÖST]var.split(" ")[1]; was mach ich hieran Falsch?

    Moved
    4
    0 Votes
    4 Posts
    2k Views
    G
    Gerne geschehen. Dürfte auch ein Thema für die Einführung in Javascript sein. Thema Datentypen und Typenumwandlung. Hast damit für ein weiteres Thema gesorgt. Danke, wird anderen auch helfen.
  • Blockly Beispiele - keine Fragen

    Moved
    9
    1
    0 Votes
    9 Posts
    12k Views
    S
    @a-flow2: Wie installiere ich dieses Blockly? ` Was steht im Titel dieses Threades? :lol: Blockly ist Bestandteil von dem Javascript-Adapter.
  • 0 Votes
    1 Posts
    1k Views
    No one has replied
  • [gelöst] Text oder CSV auslesen, ist das möglich?

    Moved
    17
    0 Votes
    17 Posts
    5k Views
    T
    ….das war es! Danke! Grüße, Torsten
  • Hilfe!!! Meine Javascript Instanzen arbeiten nicht mehr!!!!

    Moved
    3
    0 Votes
    3 Posts
    856 Views
    BluefoxB
    fix ist auf dem GitHub. Danke.
  • [gelöst] Noobfrage: Wie Status zu iobroker Objekt bringen?

    Moved
    3
    1
    0 Votes
    3 Posts
    2k Views
    S
    Es klappt! 1000 Dank! Ich dachte der Name wird erzeugt durch das Feld "Name" und oben unter Topic kommt nur der Pfad rein.
  • Eigenartiger Fehler bei Syntax-check: Too many errors. (xx% scanned).

    Moved
    2
    2
    0 Votes
    2 Posts
    592 Views
    S
    Hallo, kann den Fehler auch bestätigen. Hängt von der Zahl der Variablen ab. Das Problem trat bei mir bei der Definition von globalen Variablen auf. Habe die Variablen auf mehrere Dateien aufgeteilt. Damit bin ich das Problem erst mal los. Wahrscheinlich kann der Syntax-Checker nur mit einer begrenzten Anzahl von Variablen umgehen.
  • LOG Werte in CSV.Datei exportieren

    Moved
    4
    0 Votes
    4 Posts
    1k Views
    P
    Das heißt lastchange - letzte Änderung, während ts timestamp die letzte Aktualisierung ist.

644

Online

32.6k

Users

82.3k

Topics

1.3m

Posts