Weiter zum Inhalt

Skripten / Logik

16.7k Themen 215.6k 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
    D
    @maxclaudi sagte: Allen einen wunderschönen, sonnigen guten Morgen, @Rico-Sander sagte: Vieles was hier diskutiert wird im Zusammenhang mit der Firmware- und HEMS-Aktualisierung trifft für mich nicht zu. habe auch kein Update durchgeführt. Weil ich kein HEMS nutze, ist es für mich nicht wichtig. Von den letzten Updates war ich mehr enttäuscht. Echte Verbesserungen gab es - für mich - nicht. Für mich waren es mehr Reglementierungen. @Rico-Sander sagte: Laden über AC-Anschluss, Entladen über AC-Anschluss - sonst nix. Bypass-Funktion und Grid-Dose benötige ich nicht. Selbst wenn Du mehr benötigen würdest, wüsste ich nicht was aktuell unter API 2 dagegen spricht. Die größten Veränderungen/Neuerungen durch das aktuelle Update sind bisher die Einführung von HEMS2 und Umstellung auf TLS. Zendure schreibt zwar: X bekannte Probleme behoben, jedoch welche das sein sollen, wird nicht erwähnt. Bei meinem Gerät sollen es 2 Probleme sein. Kann aber kein Problem feststellen und HEMS nutze ich nicht. @Rico-Sander sagte: Daher: Kann ich gefahrlos bei Verwendung des HTTP-Scriptes die Updates fahren oder gibt es Probleme mit dem SSL- und Port-Problem? Vermutlich nicht, da ich ja kein MQTT nutze - richtig? SSL mit Port:8883 ist nur für (nicht offizilles , Cloud-) MQTT Das Script nutzt reines HTTP mit dem Webserver des Zendure-Geräts. Zendure-Gerät und App nutzen zusätzlich "nicht offizielle" MQTT-Verbindung zur Cloud. Für das Script bedeutet das: Wenn Zendure durch die Firmware zenSDK nicht auch reglementiert oder grundlegend was verändert hat, dann funktioniert es wie zuvor. Es gab mit dem Update ein paar Änderungen und ein zusätzlicher Key. Bisher wurden mir keine Einschränkungen gemeldet. @Daniel-8 sagte: Bei mir ist alles gut. Hey, freut mich. @Daniel-8 sagte: ...hat Zendure bei Hems 2 und den neuen Firmwares was geändert. Ich habe noch kein Update gemacht. Bin etwas vorsichtig, da im Zendure Forum sehr viele Probleme haben. warte auch ab. Evtl. benötige ich keins. @Daniel-8 sagte: Was ist eigentlich der socCompSwitch? Das ist nicht bekannt und noch nicht dokumentiert. Habe eine Vermutung und kann es - ohne Update -nicht testen. socCompSwitch, bedeutet wahrscheinlich: State of Charge Compilation Switch. Denke es wird sich um einen neuen Schalter handeln, der eine Kalibrierung manuell auslösen wird. Damit man die automatische (wöchentliche oder monatliche) SoC-Kalibrierung zu nicht gewollten Zeiten beeinflussen, verhindern oder vorziehen kann? Das ist nur meine Vermutung -reine Spekulation - ! Habe den Schalter mal hinzugefügt, falls jemand auf eigene Gefahr und eigenes Risiko selbst testen möchte, was der Schalter bewirkt. Unter API 2 habe ich den Schalter schon gesetzt und getestet. Befehl wird abgeschickt und Empfang bestätigt. Auswirkungen hatte es bei mir überhaupt keine. War zu erwarten, weil socCompSwitch in der API2-Firmware nicht implementiert ist. Konnte den Schalter mehrmals - unter API 2 - gefahrlos bei meinem 1600AC+ setzen - ohne jede Veränderung. Funktionieren oder was bewirken wird der Schalter (sehr wahrscheinlich nur) erst nach Firmware-Update auf zenSDK API Version: 3. Noch einmal: Alles zu socCompSwitch sind nur Vermutungen aufgrund von Tests und Beobachtungen. edit: Falls jemand set socComp nach Update mit zenSDK API Version: 3 testen sollte, wäre ich über Rückmeldungen sehr dankbar. Habe mich heute doch mal getraut mein Solarflow 800 Pro auf die Firmware 2.0.1 upzudaten. Habe dann mal den setsocComp auf 1 und 2 geschrieben. Konnte aber keinerlei Veränderung feststellen
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    amg_666A
    @emil70 sagte: httpGet(url=http://125.123.6.5/snap.jpeg, error=timeout of 2000ms exceeded) Der erste Fehlereintrag im Log, also der ganz unten, sage, dass das httpGet nicht geklappt hat. Ich würde mal mit den 2 Sekunden im Blockly rumspielen, also erstmal höhersetzen auf 3 Sekunden und dann schauen, obs klappt. Achtung: Bei dem http(Get) im Blockly stehen bei dir Timeout 2 Sek, wenn dud as auf 3 änderst musst du auch das Intervall (das grüne "Ausführen" höher setzen
  • Hilfe für Skripterstellung mit Node-RED

    961 13k
    961 Themen
    13k Beiträge
    Marc BergM
    Man kann einen Flow von außen neu starten, indem man ihn per API deaktiviert und wieder aktiviert. Nicht sehr elegant, aber geht. Hier ein Flow dazu, das könnte man auch im Skript abbilden (hostname und Flow-ID im Inject Node anpassen: [ { "id": "0101b52dd8b0e69c", "type": "inject", "z": "tab_restart", "name": "Flow neu starten", "props": [ { "p": "baseUrl", "v": "http://nuc.fritz.box:1880", "vt": "str" }, { "p": "flowId", "v": "56a35d28dbb8d4c1", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "", "x": 160, "y": 140, "wires": [ [ "ffb73632947a1b74" ] ] }, { "id": "ffb73632947a1b74", "type": "http request", "z": "tab_restart", "name": "GET /flow/:id", "method": "GET", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 370, "y": 140, "wires": [ [ "78e47724692d9c26" ] ] }, { "id": "78e47724692d9c26", "type": "change", "z": "tab_restart", "name": "deaktivieren", "rules": [ { "t": "set", "p": "flow", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "flow.disabled", "pt": "msg", "to": "true", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "flow", "tot": "msg" }, { "t": "set", "p": "headers", "pt": "msg", "to": "{}", "tot": "json" }, { "t": "set", "p": "headers.content-type", "pt": "msg", "to": "application/json", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 570, "y": 140, "wires": [ [ "b570b346c80301a6" ] ] }, { "id": "b570b346c80301a6", "type": "http request", "z": "tab_restart", "name": "PUT (aus)", "method": "PUT", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 770, "y": 140, "wires": [ [ "a062c2baa0932d3e" ] ] }, { "id": "a062c2baa0932d3e", "type": "delay", "z": "tab_restart", "name": "1s warten", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "outputs": 1, "x": 960, "y": 140, "wires": [ [ "664a32887d83b305" ] ] }, { "id": "664a32887d83b305", "type": "change", "z": "tab_restart", "name": "aktivieren", "rules": [ { "t": "set", "p": "flow.disabled", "pt": "msg", "to": "false", "tot": "bool" }, { "t": "set", "p": "payload", "pt": "msg", "to": "flow", "tot": "msg" }, { "t": "set", "p": "headers", "pt": "msg", "to": "{}", "tot": "json" }, { "t": "set", "p": "headers.content-type", "pt": "msg", "to": "application/json", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 140, "y": 220, "wires": [ [ "83d399c90d46240f" ] ] }, { "id": "83d399c90d46240f", "type": "http request", "z": "tab_restart", "name": "PUT (ein)", "method": "PUT", "ret": "obj", "paytoqs": "ignore", "url": "{{{baseUrl}}}/flow/{{flowId}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 320, "y": 220, "wires": [ [ "529c0e1896d1f278" ] ] }, { "id": "529c0e1896d1f278", "type": "debug", "z": "tab_restart", "name": "Ergebnis", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 480, "y": 220, "wires": [] } ]
  • Sonos Musik Steuern mit Taste kurz und Taste lang

    5
    1
    0 Stimmen
    5 Beiträge
    524 Aufrufe
    AsgothianA
    @ft-knorr Du hast die entscheidende Frage nicht beantwortet. Wie sehen die Datenpunkte aus und wie verhalten sie sich. Die Einstellungen auf dem Sonos sind nicht wirklich relevant. A.
  • Eigenen JSON output für SimpleAPI erzeugen

    17
    0 Stimmen
    17 Beiträge
    1k Aufrufe
    E
    @homoran Super. Durch eure Tipps bin ich zur Lösung gekommen. Ich konnte in meinem Service auch das Format konfigurieren und mein getestetes boolean wird gar nicht erst unterstützt. Dieses konnte ich aber durch den Tipp mit dem umwandeln in Text lösen. Wieder was gelernt. Ich danke euch.
  • PVForecast Wert extrahieren

    6
    1
    0 Stimmen
    6 Beiträge
    651 Aufrufe
    paul53P
    @icebear sagte: Man müsste also auch den Tag prüfen. ... was im gezeigten Skript erfolgt.
  • Prüfe letzte Änderung von Wert

    13
    1
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    paul53P
    @romestylez sagte: Was genau macht aber das "nicht" ? Es prüft, ob der Timeout nicht läuft, also abgelaufen ist, da Blockly die Timer-Variable bei Ablauf automatisch auf null setzt.
  • Growatt per rs 485 auslesen

    4
    0 Stimmen
    4 Beiträge
    516 Aufrufe
    C
    @karl-heinz1 Ich habe EVCC laufen, 2 Fronius WR einen Growatt MIC1500 tx WR - die Daten hole ich mir allerdings über einen Shelly PM mini. EVCC ist wirklich leicht zu installieren und läuft sogar auf einem Pi 2W Zero. Welche Komponenten hast Du denn genau?
  • Letzter Tick aus CRON?

    5
    2
    0 Stimmen
    5 Beiträge
    477 Aufrufe
    A
    @stefan-falt wäre es nicht sinnvoller, den letzten lauf immer zu protokollieren? dann hast du zwar mit jeder ausführung eine aktualisierung, aber das wäre dann auch die "wahrheit", falls das script mal abbricht (server startet durch, iobroker stürzt ab, ...). nebeneffekt wäre, dass dann automatisch um 3:59 die aktulaisierung mit drin steht und du das nicht zusätzlich abfangen musst.
  • Kryptokurse von CoinMarketCap abfragen

    9
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    OliverIOO
    @shellyrulestheworld ist hier evtl nicht so wichtig, aber toFixed rundet nicht kaufmännisch (1.104).toFixed(2) = 1.10 (1.105).toFixed(2) = 1.10 (1.106).toFixed(2) = 1.11 besser ist (Math.round(1.104*100)/100).toFixed(2) = 1.10 (Math.round(1.105*100)/100).toFixed(2) = 1.11 (Math.round(1.106*100)/100).toFixed(2) = 1.11 toFixed ist nur als Formatierungsfunktion zu gebrauchen um 0 aufzufüllen damit man auf die Anzahl nachkommastellen kommt Als allgemeine Funktion kann man sowas nehmen, diese Funktion bildet auch andere Zahlsysteme ab, aber alles was anders wie 10 ist, muss man noch weitere Schritte vornehmen. also einfach nur console.log(toFixedNumber(1.105,2)); function toFixedNumber(num, digits, base){ const pow = Math.pow(base ?? 10, digits); return Math.round(num*pow) / pow; }```
  • Object Max Wert lässt setValue Wert nicht zu

    37
    0 Stimmen
    37 Beiträge
    5k Aufrufe
    U
    @tomtomsen sagte in Object Max Wert lässt setValue Wert nicht zu: Funktioniert natürlich einwandfrei Verstehe ich nicht! Was funktioniert einwandfrei? Ausserdem könntest Du ... nachdem Du das Thema aufgebracht hast und auch das Problem hast... ein debug log vom Adapter zur Verfügung stellen. Die Leute hier wollen Dir (und anderen) nur helfen. Mit Deinem sparbetrieb an Informationen beim Wolf Support angefragt wird das gleich im Papierkorb landen @mcm1957 sagte in Object Max Wert lässt setValue Wert nicht zu: OK - wenn der Adapter kein offizielles Api benutzt mag es kontraproduktiv zu sein ioBroker zu erwähnen. Aber wenn es auch am offiziellen Portal (das so wie ich vermute der Adapter ausliest) nicht stimmt dann könnte Wolf helfen. Der Adapter wird schon die "offizielle" API nutzen. Ich habe trotz intensiver Suche noch keine Beschreibung einer API gefunden. Wen da jemand mehr hat?
  • openHASP

    1
    0 Stimmen
    1 Beiträge
    226 Aufrufe
    Niemand hat geantwortet
  • Zeitabhängige Benachrichtigung über Push Over

    6
    0 Stimmen
    6 Beiträge
    384 Aufrufe
    B
    @paul53 Top läüft !! Danke dir ! @Homoran Ja du hast recht, das währe ein Skript gewesen das ich zum Anlass zur Übung nehmen hätte können. Ich war mal schon viel weiter drin, Skripten ist aber scheinbar nicht wie Farad fahren, das verlernt Mann schon :-) Danke euch für eure tolle Arbeit hier, ich ge´b mir mehr mühe. Grüße Balu
  • Plausibilität/Aktualität von Messwerten erkennen?

    monitoring
    4
    0 Stimmen
    4 Beiträge
    510 Aufrufe
    S
    @tugsi Solche Probleme habe ich glücklicherweise nicht und ja das kannst du dann mit dem Zeitstempel abfragen.
  • Frage zu Funktion onLog

    3
    0 Stimmen
    3 Beiträge
    417 Aufrufe
    P
    @mcu Echt jetzt? Was da rauskommt, steht doch in der verlinkten Doku: "To receive all logs the * could be used. In this case, the log output in handler will be disabled completely." Wenn man auf alle Logeinträge triggert ('*') und dann einen Fehler ins Log schreibt, produziert man eine Endlosschleife. Um dies zu verhindern, wird das Schreiben ins Log deaktiviert. Also console.error wird nicht ausgeführt. Oder?
  • Script funktioniert nur bedingt

    14
    0 Stimmen
    14 Beiträge
    1k Aufrufe
    CodierknechtC
    @manolo sagte in Script funktioniert nur bedingt: Thema kann geschlossen werden. Das kannst nur Du, indem Du den Eingangspost bearbeitest und ein "[gelöst] - " vor den Titel setzt.
  • Daten mit Blockly aus InfluxDB abrufen

    35
    1
    0 Stimmen
    35 Beiträge
    5k Aufrufe
    K
    @kdtcat ``` var parm1, parm2, result, BatteryLevel, PowerConsumptionTotal, PowerProductionTotal, EnergyProductionTotalDay, EnergyConsumptionTotalDay, EnergyExternalTotalOutDay, EnergyBatteryChargeDay, EnergyStorageTotalOutDay, StromverbrauchAnteilSolarTag, STromverbrauchAlleTag; // Beschreibe diese Funktion … async function iq(parm1, parm2) { // Beschreibe diese Funktion var ergebnis, fparm, fparm2; fparm = 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == ' + parm1 + ') |> aggregateWindow(every: 2m, fn: mean)'; fparm2 = '0_userdata.0.Enpal.' + parm2; sendTo('influxdb.0', 'query', fparm, async (result) => { test0 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed(fparm2, test0, true, parseInt(((0) || '').toString(), 10), false); }); return ergebnis; } schedule("*/2 * * * *", async () => { result = await iq('"Energy.Battery.Charge.Level"', 'BatteryLevel'); await wait(3000); BatteryLevel = Math.round(getState('0_userdata.0.Enpal.BatteryLevel').val * 100) / 100; setStateDelayed('0_userdata.0.Enpal.BatteryLevel', { val: BatteryLevel, ack: false }, parseInt(((0) || '').toString(), 10), false); result = await iq('"Power.Consumption.Total"', 'PowerConsumptionTotal'); await wait(3000); PowerConsumptionTotal = getState('0_userdata.0.Enpal.PowerConsumptionTotal').val; result = await iq('"Power.Production.Total"', 'PowerProductionTotal'); await wait(3000); PowerProductionTotal = getState('0_userdata.0.Enpal.PowerProductionTotal').val; result = await iq('"Energy.Production.Total.Day"', 'EnergyProductionTotalDay'); await wait(3000); EnergyProductionTotalDay = getState('0_userdata.0.Enpal.EnergyProductionTotalDay').val; result = await iq('"Energy.Consumption.Total.Day"', 'EnergyConsumptionTotalDay'); await wait(3000); EnergyConsumptionTotalDay = getState('0_userdata.0.Enpal.EnergyConsumptionTotalDay').val; result = await iq('"Energy.External.Total.Out.Day"', 'EnergyExternalTotalOutDay'); await wait(3000); EnergyExternalTotalOutDay = getState('0_userdata.0.Enpal.EnergyExternalTotalOutDay').val; result = await iq('"Energy.Battery.Charge.Day"', 'EnergyBatteryChargeDay'); await wait(3000); EnergyBatteryChargeDay = getState('0_userdata.0.Enpal.EnergyBatteryChargeDay').val; result = await iq('"Energy.Storage.Total.Out.Day"', 'EnergyStorageTotalOutDay'); await wait(3000); EnergyStorageTotalOutDay = getState('0_userdata.0.Enpal.EnergyStorageTotalOutDay').val; StromverbrauchAnteilSolarTag = EnergyProductionTotalDay - EnergyExternalTotalOutDay; StromverbrauchAnteilSolarTag = StromverbrauchAnteilSolarTag - EnergyBatteryChargeDay; setStateDelayed('0_userdata.0.Enpal.StromverbrauchAnteilSolarTag', { val: StromverbrauchAnteilSolarTag, ack: false }, parseInt(((0) || '').toString(), 10), false); STromverbrauchAlleTag = StromverbrauchAnteilSolarTag + EnergyStorageTotalOutDay + EnergyConsumptionTotalDay; setStateDelayed('0_userdata.0.Enpal.StromverbrauchAlleTag', { val: STromverbrauchAlleTag, ack: false }, parseInt(((0) || '').toString(), 10), false); console.info((['1: ',BatteryLevel,', 2: ',PowerConsumptionTotal,', 3: ',PowerProductionTotal,', 4: ',EnergyProductionTotalDay,', 5: ',EnergyConsumptionTotalDay,', 6: ',EnergyExternalTotalOutDay,', 7: ',EnergyBatteryChargeDay,', 8: ',EnergyStorageTotalOutDay,', 9: ',StromverbrauchAnteilSolarTag,', 10: ',STromverbrauchAlleTag].join(''))); });
  • Funktion zum Seitenabruf per Get funktioniert nicht mehr

    10
    0 Stimmen
    10 Beiträge
    1k Aufrufe
    jolicJ
    @haus-automatisierung said in Funktion zum Seitenabruf per Get funktioniert nicht mehr: @jolic Dann schau gerne mal in die Doku und verwende die asynchronen Funktionen httpGetAsynx und httpPostAsync. Dann haste auch ein Promise. Danke dir, das ist gut zu wissen! Da der interne httpGet-Befehl in ioBroker nativ verfügbar ist, werde ich mir diesen bei meinem nächsten Projekt genauer anschauen.
  • Telegram-Bot: Anzeige „1 Nutzer“

    27
    0 Stimmen
    27 Beiträge
    3k Aufrufe
    I
    Die Fehlermeldung unten in meinem geposteten Bild sieht ja auch nicht gesund aus. Ist zwar bei allen drei Bots so, daher wird es an dem Problem der Anzeige "1 User" nichts ändern, aber komisch ist es ja schon.
  • Schleife über alle Datenpunkte

    Verschoben
    13
    0 Stimmen
    13 Beiträge
    3k Aufrufe
    R
    @paul53 Mit der Doku tue ich mich noch schwer, daher herzlichen Dank dass Du mir genau die richtige Stelle zum Nachlesen zeigst.
  • [GELÖST] Seit x Javascript Updates keine Module mehr geladen

    23
    1
    0 Stimmen
    23 Beiträge
    3k Aufrufe
    F
    @haus-automatisierung sagte in [GELÖST] Seit x Javascript Updates keine Module mehr geladen: Danke, Ein großes Danke geht vor Allem an Dich für deinen tollen Support und die vielen Neuerungen im Adapter!
  • Datenpunkt extern beschreiben

    monitoring communication
    4
    1
    0 Stimmen
    4 Beiträge
    379 Aufrufe
    R
    glaub hab mein fehler gefunden, datenpunkt anlegen und dann simple_api und web usw neustarten, schon kann beschrieben werden.
  • JAVA - Script Parse Error

    5
    0 Stimmen
    5 Beiträge
    571 Aufrufe
    haus-automatisierungH
    @seeandfeel sagte in JAVA - Script Parse Error: hätte ich wohl genauer suchen müssen das "request" deprecated ist. Normalerweise solltest Du vor dem Upgrade eine große Warnung bekommen haben, dass das der Fall ist. Und diese muss man manuell bestätigen. https://github.com/ioBroker/ioBroker.javascript/blob/d5772eaf30e865c4089b83c1198a86e2aac73774/io-package.json#L343-L383 Es ist erforderlich, alle Skripte zu aktualisieren, die das "Request"-Paket verwenden! Dieses Paket wird in zukünftigen Versionen entfernt. Bitte nutze die neuen "Bockly"-Blöcke für "httpGet" oder nutze eine andere Bibliothek (wie axios) im JavaScript-Code.

284

Online

33.0k

Benutzer

83.4k

Themen

1.3m

Beiträge