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
    J
    Hallo, anbei das nun fertige Skript im ersten Post.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    paul53P
    @emil70 [sagte]: schaut da mal drüber. Ich würde es vereinfachen: [image: 1784832594678-blockly_temp.jpg]
  • 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": [] } ]
  • Dateien anlegen, die im Reiter Dateien sichtbar werden?

    4
    1
    -1 Stimmen
    4 Beiträge
    535 Aufrufe
    haus-automatisierungH
    @hauwi112 Weil man nicht direkt in das Dateisystem schreibt und daher die Meta-Daten fehlen. Wenn man zB redis nutzt, liegen die Datein auch gar nicht mehr an der Stelle, sondern in der Datenbank. Das sollte @MartinP eigentlich wissen :) Habe Dir das doch ganz ausführlich erklärt nachdem Du die Doku bemängelt hast… Lies die Doku vom JavaScript-Adapter. Du suchst writeFile
  • JS: wie Datenpunkte Unterstrukturen lesen?

    10
    1
    0 Stimmen
    10 Beiträge
    1k Aufrufe
    paul53P
    @haus-automatisierung sagte: Ja der hat ja Subscriptions auf alle States und Objekte Gerade getestet: Funktioniert. EDIT: Früher hat es nicht funktioniert. Es musste erst die JS-Instanz neu gestartet werden, um neue Objekte / Zustände einzulesen, die nicht durch den Javascript-Adapter selbst erzeugt wurden.
  • erweiterung einer rule geschichte

    1
    2
    0 Stimmen
    1 Beiträge
    275 Aufrufe
    Niemand hat geantwortet
  • Shelly Plus 1PM schaltet eigenständig aus?

    15
    1
    0 Stimmen
    15 Beiträge
    1k Aufrufe
    H
    @bananajoe Die Temperatur wird auch im iobroker gelistet. Diese wird via Grafana zusammen mit der Leistung visualisiert. Ich konnte bisher keinen Zusammenhang feststellen...der Shelly hat auch bei "niedriger" Temperatur abgeschaltet. @MichaelF könnte sein. @haselchen danke...werde ich mal versuchen.
  • OpenDtu persistent / non persistent senden

    javascript
    5
    1
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    Ralla66R
    @peterfido Danke für die Info, nö, Module 600 Watt Verbrauch 200 Watt Limit 200 Watt macht 400 Watt für den Speicher
  • IP-Adresse von Gerät herausfinden

    6
    0 Stimmen
    6 Beiträge
    806 Aufrufe
    David G.D
    @puls200 Das macht man idr in der Weboberäche der Kamera. Ansonsten sieht man den Namen normal auch im Router.
  • Script manuel "am Trigger vorbei" starten

    8
    1
    0 Stimmen
    8 Beiträge
    466 Aufrufe
    HomoranH
    @wcag22 sagte in Script manuel "am Trigger vorbei" starten: warum eine Schleife dazu nicht geeignet @homoran sagte in Script manuel "am Trigger vorbei" starten: wiederhole solange feuert im Millisekundentakt. Das wird ioBroker ruckzuck lahmlegen
  • Etwas nur tagsüber laufen lassen

    27
    1
    0 Stimmen
    27 Beiträge
    4k Aufrufe
    haus-automatisierungH
    Weil ich eh gerade dran bin, gibts bald ein kleines Ausrufezeichen mit einer Warnung wenn man den Block dort verbindet :) Ist erstmal nur ein Hinweis - könnte ja sein, dass der Wert eine Objekt-ID ist. Und dann würde es wieder gehen... [image: 1711022857218-screenshot-2024-03-21-at-13.07.00.png]
  • Öffnungszeiten aus Googleseite auslesen

    Verschoben Ungelöst
    4
    1
    0 Stimmen
    4 Beiträge
    563 Aufrufe
    haus-automatisierungH
    @oli Projekt anlegen API-Key anlegen und speichern API (Places API) dem Projekt/Key zuweisen Daten mit dem Key abfragen
  • Skript aktivieren mit lovelace ohne Aus-Schalter

    4
    1 Stimmen
    4 Beiträge
    412 Aufrufe
    F
    @johannesf Ja, Szene mit Aktivieren Schaltfläche ist genau das was ich suche. Danke!
  • Dump1090-fa/PiAware - json in ein Objekt schreiben

    javascript
    4
    0 Stimmen
    4 Beiträge
    868 Aufrufe
    HomoranH
    @wannseesprinter da gab es eine Änderung. musst du mal im Netz suchen. Hab meine Piaware im Moment nicht mehr laufen.
  • Java Script https selfsigned certificate

    4
    0 Stimmen
    4 Beiträge
    305 Aufrufe
    C
    Hi, vielen Dank fuer Deine Antwort / Anleitung. Es funktioniert so wie beschrieben auf jeden Fall. Man konnte noch ergaenzen, dass mal den iobroker einmal neu starten muss. Leider bin ich immer noch zu doof das Ergebnis(result) in eine Variable schreiben zu lassen und damit weiter zu arbeiten. Zum Glueck gab es in der Zwischenzeit ein Blockly update. Damit glaube ich auch, dass das hier obsolete ist und man Script Engine ab 7.9.0 verwenden sollte. Vielen Danke fuer Deine Hilfe auf jeden Fall... LG
  • geparstes html aus Website in Visu einfügen

    14
    1
    0 Stimmen
    14 Beiträge
    998 Aufrufe
    JensenJ
    @jey-cee Danke, ich teste das morgen. Ha, ging ja ganz schnell, kaum macht man's richtig, schon geht's. Vielen, vielen Dank für die Hilfe. [image: 1710702719347-vis.png]
  • Strom-Verbrauch mit verschiedenen Tarifzeiten rechnen

    16
    0 Stimmen
    16 Beiträge
    2k Aufrufe
    M
    @Massimo müsste auch so funktionieren: [image: 1710619421983-5b52d812-e08f-4cbc-a9f6-201e0f56a781-image.png]
  • Autarkiegrad (aktuell und gesamt) berechnen

    33
    1
    0 Stimmen
    33 Beiträge
    6k Aufrufe
    SchmakusS
    Hi, also ich hab jetzt mal ein Script erstellt, mit dem ich denke, alle abgedeckt zu haben. Bin mir jedoch noch nicht sicher, ob alle Berechnungen stimmen. Vielleicht kann ja jemand mal drüberschauen. // Bezug Hauszähler const oidLeistungHaus = 'alias.0.Energie.Zaehler.Leistung_Zähler_Gesamt'; const oidBezugkWh = 'alias.0.Energie.Zaehler.Stromzaehler_Zaehlerstand_kWh'; const oidBezugWh = 'alias.0.Energie.Zaehler.Stromzähler_Zählerstand_in_Wh'; const oidZaehlerAbPVkWh = '0_userdata.0.PV.Haus_Zählerstand_ab_PV'; const oidTagesbezugkWh = '0_userdata.0.PV.Tagesbezug_in_kWh'; const oidNeededPower = '0_userdata.0.PV.Benötigte_Leistung_Haus_Aktuell'; const oidWerksreset = '0_userdata.0.PV.Werksreset'; const oidWerksresetFreischalten = '0_userdata.0.PV.Werksreset_Freischalten'; const oidWerksresetDatum = '0_userdata.0.PV.Werksreset_Datum'; const oidTagesverbrauchkWh = '0_userdata.0.PV.Tagesverbrauch_in_kWh'; const BezugkWh = getState(oidBezugkWh).val; const BezugWh = getState(oidBezugWh).val; let LeistungHaus = 0; let LeistungPV = 0; let NeededPower = 0; let ZaehlerNeuAbPVkWh = 0; let TagesbezugkWh = 0; let TagesverbrauchkWh = 0; let GesamtverbrauchkWh = 0; // Einspeisung Hauszähler const oidWhEinspeisung = '0_userdata.0.PV.Einspeisung_ins_Netz'; const oidkWhEinspeisung = '0_userdata.0.PV.Einspeisung_ins_Netz_in_kWh'; const oidkWhEinspeisungHeute = '0_userdata.0.PV.Einspeisung_ins_Netz_Heute_kWh'; let EinspeisungWh = 0; let EinspeisungkWh = 0; let EinspeisungHeutekWh = 0; // PV const oidPVPower = 'opendtu.0.total.power'; const oidPVYieldTotal = 'opendtu.0.total.yieldtotal'; const oidGesamtertragkWh = '0_userdata.0.PV.PV_Zaehlerstand_Gesamt'; const oidZaehlerstandOpenDTU = '0_userdata.0.PV.PV_Zaehlerstand_openDTU'; const oidEigenverbrauchkWh = '0_userdata.0.PV.Eigenverbrauch_in_kWh'; const oidEigenverbrauchHeutekWh = '0_userdata.0.PV.Eigenverbrauch_Heute_in_kWh'; const oidTagesertragkWh = '0_userdata.0.PV.PV_Zaehlerstand_Heute'; let GesamtertragkWh = 0; let TagesertragkWh = 0; let EigenverbrauchkWh = 0; let EigenverbrauchHeutekWh = 0; let ZaehlerstandOpenDTU = 0; //******* Zählerstand Haus ab PV */ ZaehlerNeuAbPVkWh = getState(oidZaehlerAbPVkWh).val; on({ id: oidBezugWh, change: 'ne' }, async (obj) => { const value = obj.state.val; const oldValue = obj.oldState.val; const differenz = (value - oldValue) / 1000; ZaehlerNeuAbPVkWh += differenz; await setStateAsync(oidZaehlerAbPVkWh, Math.round(ZaehlerNeuAbPVkWh * 1000) / 1000, true); }); //******* Zählerstand direkt von OpenDTU */ on({ id: oidPVYieldTotal, change: 'ne'}, async(obj) => { ZaehlerstandOpenDTU = (await getStateAsync(oidZaehlerstandOpenDTU)).val; if (obj.state.val > ZaehlerstandOpenDTU) { await setStateAsync(oidZaehlerstandOpenDTU, obj.state.val, true); } }) //******* Zähler PV Einspeisung und Bezug*/ EinspeisungWh = getState(oidWhEinspeisung).val; EinspeisungkWh = getState(oidkWhEinspeisung).val; EinspeisungHeutekWh = getState(oidkWhEinspeisungHeute).val; TagesbezugkWh = getState(oidTagesbezugkWh).val; on({ id: oidLeistungHaus, change: 'ne'}, async (obj) => { const state = obj.state; const oldState = obj.oldState; LeistungHaus = state.val; if (oldState.val < 0) { EinspeisungWh += (oldState.val * (state.lc - oldState.lc)) / -3600000; EinspeisungHeutekWh += ((oldState.val * (state.lc - oldState.lc)) / -3600000) / 1000; EinspeisungkWh = EinspeisungWh / 1000; await Promise.all([ setStateAsync(oidWhEinspeisung, Math.round(EinspeisungWh), true), setStateAsync(oidkWhEinspeisung, Math.round(EinspeisungkWh * 1000) / 1000, true), setStateAsync(oidkWhEinspeisungHeute, Math.round(EinspeisungHeutekWh * 1000) / 1000, true) ]); } else if (obj.oldState.val > 0) { TagesbezugkWh += (obj.oldState.val * (obj.state.lc - obj.oldState.lc)) / 3600000000; await setStateAsync(oidTagesbezugkWh, TagesbezugkWh, true); }; await NeededPowerCurrent(); }); //******** PV Zählerstand Total und Heute und Berechnung des Eigenverbrauchs */ GesamtertragkWh = getState(oidGesamtertragkWh).val; TagesertragkWh = getState(oidTagesertragkWh).val; EigenverbrauchHeutekWh = getState(oidEigenverbrauchHeutekWh).val; on({ id: oidPVPower, change: 'ne'}, async (obj) => { const oldValue = LeistungPV = obj.oldState.val; const value = (oldValue * (obj.state.lc - obj.oldState.lc)) / 3600000000; GesamtertragkWh += value; TagesertragkWh += value EigenverbrauchkWh = Math.round((GesamtertragkWh - EinspeisungkWh) * 1000) / 1000; EigenverbrauchHeutekWh = Math.round((TagesertragkWh - EinspeisungHeutekWh) * 1000) / 1000; await Promise.all([ setStateAsync(oidGesamtertragkWh, GesamtertragkWh, true), setStateAsync(oidEigenverbrauchkWh, EigenverbrauchkWh, true), setStateAsync(oidEigenverbrauchHeutekWh, EigenverbrauchHeutekWh, true), setStateAsync(oidTagesertragkWh, TagesertragkWh, true) ]); await NeededPowerCurrent(); }); //******* Tagesertrag / Tagesbezug resetten */ const zeitplan = schedule('59 23 * * *', async() => { TagesertragkWh = TagesbezugkWh = EinspeisungHeutekWh = 0 await Promise.all([ setStateAsync(oidTagesertragkWh, 0, true), setStateAsync(oidTagesbezugkWh, 0, true), setStateAsync(oidkWhEinspeisungHeute, 0, true) ]); }); // Autarkie schedule("*/5 * * * * *", async () => { const autarkieHeute = Math.round((((TagesverbrauchkWh - TagesbezugkWh) / TagesverbrauchkWh) * 100) * 1) / 1; const autarkie = Math.round((((GesamtverbrauchkWh - ZaehlerNeuAbPVkWh) / GesamtverbrauchkWh) * 100) * 1) / 1; let autarkieAktuell = Math.round(Math.min(Math.max((100 * (1 - (LeistungHaus / NeededPower))), 0), 100) * 1) / 1; await Promise.all([ setStateAsync('0_userdata.0.PV.Autarkie_Gesamt', autarkie, true), setStateAsync('0_userdata.0.PV.Autarkie_Tag', autarkieHeute, true), setStateAsync('0_userdata.0.PV.Autarkie_Aktuell', autarkieAktuell, true) ]); }); // Aktuelle Leistung Haus und Verbräuche berechnen async function NeededPowerCurrent() { // Benötigte Leistung Haus aktuell in W NeededPower = LeistungHaus + LeistungPV; await setStateAsync(oidNeededPower, (Math.min(Math.max(NeededPower, 0), 10000)), true); // Benötigter Tagesverbrauch und Gesamtverbrauchin kWh TagesverbrauchkWh = TagesbezugkWh + TagesertragkWh - EinspeisungHeutekWh; GesamtverbrauchkWh = ZaehlerNeuAbPVkWh + GesamtertragkWh - EinspeisungkWh; await setStateAsync(oidTagesverbrauchkWh, TagesverbrauchkWh, true); return true; } //Werksreset on({id: oidWerksreset}, async (obj) => { const freigeschaltet = (await getStateAsync(oidWerksresetFreischalten)).val; if (freigeschaltet) { TagesbezugkWh = TagesertragkWh = EinspeisungWh = EinspeisungkWh = EinspeisungHeutekWh = EigenverbrauchHeutekWh = GesamtertragkWh = ZaehlerNeuAbPVkWh = TagesverbrauchkWh = 0; const date = formatDate(new Date(), 'DD.MM.YYYY'); await Promise.all([ setStateAsync(oidTagesbezugkWh, 0, true), setStateAsync(oidWhEinspeisung, 0, true), setStateAsync(oidEigenverbrauchHeutekWh, 0, true), setStateAsync(oidkWhEinspeisungHeute, 0, true), setStateAsync(oidkWhEinspeisung, 0, true), setStateAsync(oidTagesertragkWh, 0, true), setStateAsync(oidGesamtertragkWh, 0, true), setStateAsync(oidZaehlerAbPVkWh, 0, true), setStateAsync(oidTagesverbrauchkWh, 0, true), setStateAsync(oidWerksresetFreischalten, false, true), setStateAsync(oidWerksresetDatum, date, true) ]); } });
  • Steuerung mehrerer Steckdosen in einem einzigen Skript

    9
    1
    0 Stimmen
    9 Beiträge
    424 Aufrufe
    da_WoodyD
    @ketanest da bin ich völlig dabei! Mich stören nur immer die Rechnungen um ein paar W, oder Cent. Smart Home kann sparen, kostet aber auch. Bei meinem Hauskauf hab ich erstmal, so weit wie möglich, auf LED umgerüstet, dann auf die Steuerung geschaut. Ja, der Mini PC verbraucht auch. Relativiert sich aber durch die PV mit Speicher.
  • Auswertung für smartmeter

    Verschoben
    62
    0 Stimmen
    62 Beiträge
    13k Aufrufe
    E
    @a200 Das Skript ist super... ich habe noch eine Baustelle. Wenn iobroker neu gestartet wird (zB update controller) dann werden "null" Werte geschrieben. Wie kann ich die loswerden? Einmal ist es mit ack false und einmal mit true. Beide an Zeiten wo eigentlich nichts erscheinen soll. Hier zB ein Beispiel wo um 1 vor der volle Stunde was geschrieben wird, am um 9:38 und 9:38 wurden nulls geschrieben. [image: 1710410415021-3cc3e87e-403f-4de2-b5fe-5e0334ad7b94-image.png]
  • 1x im Jahr Wert erhöhen?

    7
    0 Stimmen
    7 Beiträge
    285 Aufrufe
    BertDerKleineB
    @paul53 sagte in 1x im Jahr Wert erhöhen?: Aber für jedes Feld (Minuten, Stunden, Tage, Monate) hat man ein Auswahl-Menü. [image: 1710266144408-blockly_temp.jpg] Das wirkte auf mich viel komplizierter und 3x so viele Klicks. Hat es irgendwelche negativen Konsequenzen, über den Wizard zu gehen?
  • ioBroker mit Kurzbefehle vom Iphone

    30
    0 Stimmen
    30 Beiträge
    4k Aufrufe
    J
    Hi! Wollte auch einen Datenpunkt im IOB mit Shortcuts ändern, ich bekomme folgendes: Es kommt immer die Fehlermeldung: KONVERTIERUNGSFEHLER Inhalte von URL abrufen fehlgeschlagen: Keine Konvertierung von Formatierter Text in URL. Habt ihr eine Idee dazu? Der Datenpunkt: http://192.168.1.41:8087/set/0_userdata.0.SimpleAPI.NFC1?value=false Im Browser funktioniert es einwandfrei! Liebe Grüße Jürgen[image: 1710260921393-bildschirmfoto-2024-03-12-um-17.28.21-resized.png] ERledigt!
  • offene Fenster zählen über functions [ERLEDIGT]

    13
    2
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    T
    @Codierknecht, @lessthanmore: Vielen Dank für die Hinweise. Werde es gleich mal ausprobieren.

305

Online

33.0k

Benutzer

83.5k

Themen

1.3m

Beiträge