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
    D
    @maxclaudi sagte: @Daniel-8 sagte: Aber beides braucht man ja eigentlich nicht... Richtig, beides benötigt man nicht. @Daniel-8 sagte: ....oder gibt es da einen Vorteil? Vorteile mit Cloud-Ersatz-Broker MQTT: MQTT ist komfortabler und schneller, weil es dann nicht reglementiert ist, wie das offizielle lokale MQTT. Es bietet viel mächtigere Möglichkeiten. (Was auch eine Gefahr birgt, wenn man nicht weiß, welche Topics beschrieben werden, was sie als Antwort erwarten usw.) MQTT ist schneller, weil nicht gepollt werden muss. Wenn Werte sich ändern, wird es automatisch published. Man muss nur Änderungen triggern und nicht alle x Sek. die Werte abfragen. WiFi / HTTP(S) wird entlastet. Man bekommt alle wahren Topics und kann Werte setzen, die sonst nicht gesetzt werden können. (Birgt auch eine Gefahr in sich, wenn man wild experimentiert oder Werte setzt, die normaler Weise für Funktionen bestimmt sind, die die Cloud nur im HEMS setzen würde. Am besten man nutzt nur zum Schreiben "properties" wie mit zenSDK.) Dann sollte ja nichts passieren wenn man nur die properties nutzt. Mehr brauche ich ja sowieso nicht. Eigentlich brauche ich nur die einspeiseleistung und den min soc. Vorteil von zenSDK mit Cloud-Ersatz-Broker: Bei der Umstellung erst mal alles bleiben kann wie es ist und läuft dann wirklich lokal. Schneller wie bisher, weil es keine Cloud gibt, die permanent irgendwas abfragen, senden oder "dazwischen funken" kann. zenSDK prüft immer wieder, ob die Verbindung zur Cloud besteht. Das ist sie ja – in Form eines lokalen Brokers. Kann ich es riskieren mit dem direkten mqtt Adapter vom iobroker den Speicher auf lokal umzustellen? Müsste man erst testen. Ich verwende nur mosquitto. Ausgereift, zuverlässig, schlank, ressourcenarm und schnell.. Das kann ich ja mal machen. Ich kann ja zur Not mit deinem Programm immer wieder auf die cloud umstellen falls es nicht geht. @Daniel-8 sagte: Aber dafür muss ich mir mal Zeit nehmen. Das geht nicht mehr vor dem Urlaub. Schönen Urlaub Deiner Familie und Dir. Danke.
  • 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.
  • Skript von Hand starten?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    P
    Hallo, man kann gleich das Objekt Skriptname_scriptEnabled nutzen und per Vis schalten. Ist auch boolean. Pix
  • [Frage] Googlekalendereintrag erzeugen mit Script

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    arteckA
    @bahnuhr: @arteck: also ich bitte euch …bissel Eigeninitiative.. ich weiss das es geht gemacht hab ich es auch nicht nicht... http://www.googleappsscript.org/calendar-services/create-calendar-events-by-submitting-form ich werde auch keinen fertigen Code liefern.. ` Also, Eigeninitiative habe ich ne Menge und das fehlen einer solchen lasse ich mir auf keinen Fall vorwerfen: api reference versucht zu lesen (da auf Englisch) Diese übersetzt in Deutsch. Beispiele von Google api angeschaut. Diese passen aber nicht zu JavaScript bei iobroker. Versucht diese nach iobroker zu kopieren und umzuschreiben. Hat aber nicht geklappt. zu Thema "Bilder von Google Kontakten" issus bei Entwickler von tr064 erzeugt (auf github). Dieser wollte auch helfen. Hat es aber selber nicht hinbekommen. Thema wurde dann vertagt bzw. geschlossen. avm angeschrieben; nur Standard Antworten zurück. Dann nochmal tiefer nachgefragt; trotzdem keine konkrete Antwort. Fazit von mir: jede menge Eigeninitiative -> Entwickler von tr064, AVM eingebunden, threads hier im Forum Konkrete Hilfe gab es bisher nicht -> von keinem. Du schreibst: …es geht .... code liefere ich nicht ! Klasse Anwort, muss ich schon sagen. mfg von einem der trotz viel Eigeninitiative dies bisher nicht hinbekommen hat. ` verstehe mich bitte nicht falsch.. iobroker ist halt eine Bastellösung.. es sind Leute beteiligt die ES NICHT HAUPTBERUFLICH machen.. deshalb auch die "Eigeninitiative".. es ist mir auch klar, dass es nicht Programmierer schwer ist was zu entwickeln…. ich habe vor Jahren was in die Richtung gemacht.. deshalb auch von mir "ich habe keinen fertigen Code dafür" ich müsste mich da selber hinsetzten .. da ich aber auch eigene Projekte habe die höhere Prio haben als dein Kaleder ... sry.. ich dachte ich kann dir was an die Hand geben... :roll:
  • SetState funktioniert nicht mehr

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    AlCalzoneA
    1. hinter log(…) fehlt ein ; 2. was sollte denn passieren? Für mich sieht der Log normal aus. Wenn setState ohne Fehler durchläuft bekommst du davon normalerweise nichts mit. Wenn du "614" nach erfolgreichem setState ausgeben willst, musst du das im Callback machen: setState( "tr-064.0.states.ring", '**611,20', function() {log('614');} );
  • [Gelöst] Zugriff auf Adaptereinstellungen von Javascript

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    833 Aufrufe
    BlackmikeB
    vielen dank, das war der ansatz, den ich gesucht habe… nu kann ich mal bisschen coden. greetz, Black
  • [Gelöst] Blockly: Setzen einer Variablen sobald ein Zustand wahr ist

    Verschoben
    18
    2
    0 Stimmen
    18 Beiträge
    8k Aufrufe
    rantanplanR
    @RandyAndy: Was isch benötige ist eine Art Gruppenverwaltung mit x Gruppen (derzeit 3). Ziel ist es 3 Stockwerke unabhängig zu kontrollieren, wobei die Gruppe 1 nur den 2 Stock kontrollieren kann, die Gruppe 2 nur den 1. Stock und die Gruppe 3 nur das EG. am besten per Password. Gibt es sowas ? ` Prima das es klappt. Die Frage gilt aber für Vis nicht für Blockly. Bitte dafür neuen Thread erstellen und in Deinem 1. Beitrag, in diesem Thread, [gelöst] in den Titel setzen. Grüße
  • Zweite javascript Instanz

    Verschoben
    14
    0 Stimmen
    14 Beiträge
    2k Aufrufe
    GoerschG
    hier bitte nichts mehr posten - Problemchen ist hierhin verschoben worden : http://forum.iobroker.net/viewtopic.php?f=22&t=6057
  • [Problem] Ungewollte SayIt-Ansage nach ioBroker-Neustart

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    965 Aufrufe
    paul53P
    @dtp: Gibt es keine Möglichkeit, den Neustart von ioBroker abzufragen und dann eine entsprechende if-Abfrage einzufügen? ` Genau das passiert mit der zusätzlichen Auswertung von startDelay. Da mit ioBroker-Neustart alle Adapter und somit alle Skripte gestartet werden, wird startDelay erst auf false und nach 10 s auf true gesetzt. Folglich können Wertänderungen der Vitotronic-Datenpunkte innerhalb der ersten 10 s nach ioBroker-Neustart keine Reaktion (sayit) auslösen.
  • [Frage] Blockly - "if" mit Wochentage eingrenzen

    Verschoben
    22
    3
    0 Stimmen
    22 Beiträge
    6k Aufrufe
    S
    Jein. Das was du gesagt hast war schon der Fehler. Habe dann beim Trigger Zeitplan noch einen Fehler eingebaut, weil kein Leerzeichen zwischen den Sternen war.
  • [Gelöst] Funktion mit der man Eingangswert multiplizieren kann

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    3k Aufrufe
    T
    Super hat funktioniert ! Danke!
  • [Gelöst] clearInterval will nicht so wie ich

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    2k Aufrufe
    C
    Vielen herzlichen Dank schonmal. Die Timer-Variablen an den Anfang zu setzten hatte ich tatsächlich schon versucht, aber halt nicht mit "= null" oder leer, sondern gleich mit setInterval. Da wurden die aber immer sofort ausgeführt… Auf sowas wie die Deklaration muß man als Laie erst mal kommen (hab ich aus Beispielen auch nie verständlich rausgelesen...) Das if bei clearInterval hatte ich auch schon probiert, aber kann ja nicht gehen, wenn die Timer nicht richtig funktionieren... Wunderbar, da kann ich jetzt mal weiter dran arbeiten und mein eigentliches Script neu entwerfen/überarbeiten... Puh, ich glaub, für die JS-Logik bin ich zu alt... :( :mrgreen:
  • [Gelöst] Werte aus Datenpunkte addieren

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    3k Aufrufe
    D
    Hallo Pix, vielen Dank, dein Skript Funktioniert. Grüße Dirk
  • [Gelöst] Zeitbereich als Trigger für On()

    Verschoben
    10
    1
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    DolomitiD
    Super. Vielen Dank und schöne Ostern. Mir ging es auch nur um den Schedule-Part. Dann werde ich mich jetzt mal ans ausprobieren begeben.
  • Kombinieren von Zeit und Lichwert (LUX)

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    lobomauL
    @peoples: Super Lösung! Hier fehlt aber noch die Wochentag bzw. Wochenende Abfrage oder? Wenn man es um: daytype = new Date().getDay(); if (getState("hm-rpc.0.MEQ0692930.1.BRIGHTNESS").val > 150 && compareTime("06:30", "22:30", "between") && (daytype !== 0 || daytype != 6 )) { setState("hm-rpc.0.JEQ0116457.1.LEVEL"/*Rollo_Kueche:1.LEVEL*/, 100); erweitert solle es funktionieren. Vielen Dank auf jeden Fall, ich werde es später mal probieren und berichten. Peoples ` Ja, stimmt. Aus Versehen rausgeworfen. Aber in Kombination sollte es dann gehen. Viel Erfolg beim Testen :)
  • Wertänderung im Zeitraum überwachen und Aktion ausführen

    Verschoben
    10
    0 Stimmen
    10 Beiträge
    1k Aufrufe
    0
    OK, danke für die Erklärung. Dann verwende ich jetzt true, dann ist es auch gleich dem state.
  • IoBroker und Unify Controller

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    I
    Hi Jens Super Sache hab mir das Plug-in installiert und die Instanz konfiguriert. Refresh Intervall ist 60s. Im Object tree ist unify.0 sichtbar. Die Daten sind jedoch nicht synchron. Ich sehe im iobroker Clients, die im Unify Controller nicht mehr sichtbar sein. Das auch nach 5 Minuten. Eine Idee, was ich machen könnte.
  • AVM DECT200/smartfritz

    Verschoben
    28
    0 Stimmen
    28 Beiträge
    8k Aufrufe
    R
    Wäre cool wenn der OutoftheBox dabei wäre… Danke schon mal vorab wenn er übernommen wird.
  • Verwendung Objekte finden

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    755 Aufrufe
    GoerschG
    sowas fände ich auch gut - würde mir aber nur bedingt helfen, da ich die ids in den Skripten häufig erst zusammensetze (und zudem fast nur noch bei meinen Homematic-Geräten die Namen des Objekts und nicht mehr die ids verwende). Wenn, dann müsste setState/getState diese Liste füllen - allerdings: wann sollen nicht mehr verwendete ids aus der Liste entfernt werden - schwierig.
  • Schedule

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    GoerschG
    OK - danke!
  • [gelöst] Blockly - letzte Änderung/Aktualisierung auslesen

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    3k Aufrufe
    lobomauL
    Ist ja einfach. Kann ich mir selbst beantworten: Im Baustein System -> "Wert, vom Objekt ID, ID auswählen", kann ich für "Wert" ja Zeitstempel oder letzte Änderung auswählen. :) Edit.: Bilder dazu: [image: 1727266264502-617f9241-140c-4f66-99f4-d08ecc1d5950-image.png] [image: 1727266287675-44151b73-9d28-4e8a-b9dc-831f289fa850-image.png]
  • Hue dimmen mit Taster

    Verschoben
    18
    0 Stimmen
    18 Beiträge
    6k Aufrufe
    wendy2702W
    Hi, für alle die Probleme mit dem "Press Long" oder "Press Short" haben gibt es hier hilfe: http://forum.iobroker.net/viewtopic.php?p=61627#p61627 Damit kann ich mit dem 6-fach Wandtaster z.B. meine Hue Go ein/auschalten, heller/dunkler machen. Aber welchen Datenpunkt muss ich nehmen um die Farbe zu ändern…. Ist "hue" der richtige? [image: 999_hue_go_datenpunkte.jpg] Danke und Gruß Mirko

321

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge