Weiter zum Inhalt

Skripten / Logik

16.6k Themen 214.3k Beiträge

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

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 49k
    3k Themen
    49k Beiträge
    maxclaudiM
    @Daniel-8 sagte: Also habe ich das richtig interpretiert, das eine 8 Sekundenabfrage kein Problem darstellt Richtig. Es kann auch mit 6 Sek. gefahrlos getestet werden. Das Skript arbeitet mit einer Warteschlange (Queue). Das heißt, alle Anfragen (Watt lesen oder Werte schreiben) werden nacheinander abgearbeitet. Damit das stabil bleibt, müssen die Intervalle auf die Timeout-Zeit (2 Sek.) abgestimmt sein. Voraussetzung ist eine gute, stabile und nicht überlastete WLAN-Verbindung. Evtl. ein extra WLAN mit Access Point (AP) nur für Zendure-Gerät(e). Abfrage-Intervall (GET) const intervalGet = 8; Standard (Empfohlen): 8 Sekunden Technisches Minimum: 5 Sekunden @Daniel-8 sagte: und zwischen dem senden immer 5 Sekunden Pause sind? Richtig. Man kann zwar theoretisch schneller Befehle im ioBroker auslösen, aber das Skript lässt diese erst nach der eingestellten Pause, der Reihe nach, in die Warteschlange. Sende-Pause (POST) const minTimeBreakForSetDpSec = 5; Standard (Empfohlen): 5 Sekunden Technisches Minimum: 4 Sekunden Warum diese Mindestwerte? Stabilität. Die 2x-Timeout-Regel: Sobald Du einen Wert sendest (POST), schickt das Skript sofort eine Abfrage (GET) hinterher, um den Status zu aktualisieren. Im Fehlerfall (WLAN-Lag) dauert dieser Vorgang bis zu 4 Sekunden (2x 2 Sek. bei 2000ms Timeout). Die Sende-Pause muss also immer länger als diese 4 Sekunden sein, sonst stauen sich die Befehle in der Warteschlange.. Abfrage-Puffer: Das Abfrage-Intervall (GET) muss deutlich über dem Timeout liegen, damit das Skript Zeit hat, die Warteschlange nach einem Fehler sauber zu leeren. Wichtig: Bei schlechtem WLAN Wenn das WLAN nicht absolut stabil ist, sollte man die Zeiten nicht verringern, sondern eher erhöhen: intervalGet: auf 10–12 Sekunden minTimeBreak (Pause): auf 8 Sekunden Bei schlechtem Empfang laufen Anfragen evtl. oft in den 2-Sekunden-Timeout. Wenn man dann zu schnell neue Anfragen nachschiebt, "verstopft" die Kommunikation zum Zendure-Gerät komplett und der interne Prozessor (ESP) kommt nicht mehr hinterher. Könnte evtl. sogar die Kommunikation beenden. Nur so ist sichergestellt, dass über HTTP alles reibungslos funktioniert. Mir ist kein Weg bekannt, das auf andere Weise "sicherer" über HTTP zu gewährleisten. Mit den Standard-Einstellungen funktioniert es im Dauerbetrieb sehr zuverlässig.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    HumidorH
    @paul53 Danke, du triggerst eine Funktion Alarm1, die selbstständig alle 5min ausgeführt wird, außer der Trigger stoppt diese. [image: 1775796578011-bildschirmfoto-2026-04-10-um-06.49.28.png]
  • Hilfe für Skripterstellung mit Node-RED

    954 13k
    954 Themen
    13k Beiträge
    F
    Hallo ich habe ein Problem mit Nodered und Alexa Echo. Ich habe in Nodered die Wemo Emulation installiert und eine Wemo Steckdose emuliert um an einer Zigbeesteckdosenleiste einen Platz der Leiste zu schalten. "node-red-contrib-wemo-emulator" Das klappt auch wunderbar leider nicht länger als ein zwei Tage. Wenn ich dann den Echo der mit der emulierten Steckdose verbunden ist neu starte geht es wieder. Leider ist das sehr nervig. Hat schon mal jemand gehabt? Durch die Forumssuche habe ich leider nicht gefunden. Gruss Achim
  • Hilfe: Letzte zahl in Blockly vergleichen [6,-48,-41]

    javascript blockly
    24
    0 Stimmen
    24 Beiträge
    2k Aufrufe
    C
    Vielen Dank ich musste das Zeichen nur umdrehen da ich ein - vor der Zahl habe. Nun bekomme ich auch wenn ich test auf true setze die Nachricht Dachfenster sind zu. Aber komischerweise bekomme ich das direkt 2 mal .. Alle anderen werte iben sind false. [image: 1559037971956-hmm.png]
  • JS Adapter Probleme - läuft zusätzlich als "Schattenprozess"?

    javascript
    5
    0 Stimmen
    5 Beiträge
    328 Aufrufe
    H
    Danke für die Info. Ich habe jetzt mal nachgesehen. Ich lasse das Backup tatsächlich im sog. "snapshot mode" laufen. Habe jetzt mal umgestellt auf "stop mode". In der Hilfe steht dazu: "It works by executing an orderly shutdown of the VM, and then runs a background Qemu process to backup the VM data. After the backup is started, the VM goes to full operation mode if it was previously running." Mal sehen, was es bringt.
  • IOBroker - HTTP Post/GET ESP8266 und HTML_WEbFronted

    javascript
    6
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    S
    @Schmeckm sagte in IOBroker - HTTP Post/GET ESP8266 und HTML_WEbFronted: Heisst es dann ich muss in der Url folgenden Code angeben Christian: http://192.168.178.20/con? Da fehlt noch der Parameter: rfc.toString(), true den musst Du noch rausfinden und anhängen. Gruß Christian
  • Waschmaschine plus Verbrauchskosten

    blockly monitoring
    3
    1
    0 Stimmen
    3 Beiträge
    574 Aufrufe
    RöstkartoffelR
    Am besten ist es auch, die Strom- und Leistungsaufnahme mittels History mitzuloggen, das erleichtert das Auswerten
  • (Gelöst) Ausgabewert für VIS umschreiben

    blockly javascript monitoring
    4
    0 Stimmen
    4 Beiträge
    445 Aufrufe
    M
    Hallo noch einmal, habe das 'Problemchen' jetzt selbst lösen können. War vielleicht zu trivial. Ich habe eine Variable definiert und per Skript gesteuert, die den Wert einfach umschreibt. Jetzt lese ich den variablen Wert und nicht den Systemwert aus. War doch kein Hexenwerk, bei einfacheren Logiken. Aber die nächste Frage wird bald kommen. LG, Martin
  • Variable aus Blockly in command fur Hue nutzen?

    Verschoben
    23
    1
    0 Stimmen
    23 Beiträge
    5k Aufrufe
    dslraserD
    @aleks-83 sagte in Variable aus Blockly in command fur Hue nutzen?: {"on":true,"b":0,"bri":0,"ct":2200,"g":0,"hue":0,"level":80,"r":0,"sat":194,"xy":[0.5072,0.4076],"colormode":"xy","transitiontime":50} Das wird bei mir ein "langsames" kräftiges blau {"b":0,"bri":0,"ct":2200,"g":0,"hue":0,"level":80,"r":0,"sat":194,"xy":[0.5072,0.4076],"colormode":"xy","transitiontime":50} und so wird es langsam ausgeschaltet {"b":0,"bri":0,"ct":2200,"g":0,"hue":0,"level":0,"r":0,"sat":194,"xy":[0.5072,0.4076],"colormode":"xy","transitiontime":50} Das "on":true oder false beim ausschalten habe ich aber mal entfernt, weil das ja eigentlich level regelt
  • Tr-064 Gäste da - ja/nein?

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    664 Aufrufe
    M
    @ChristianF Nein, leider nicht. Ich benutze weiterhin den tr-064, doch ohne das Gäste-WLAN.
  • Benachrichtigung Adapter/Instanzen-Ampel

    Verschoben
    11
    1 Stimmen
    11 Beiträge
    3k Aufrufe
    eumatsE
    @deifel sagte in Benachrichtigung Adapter/Instanzen-Ampel: Das Problem mit dem Schedule ist allerdings auch dort vorhanden... In dem von mir verlinkten Skript wird schedule nicht genutzt...
  • Rolladensteuerung wirft Fehler im Log

    blockly javascript scenes
    8
    2
    0 Stimmen
    8 Beiträge
    694 Aufrufe
    T
    @paul53 Oh verdammt manchmal sieht man den Wald vor lauter Bäumen nicht! Hab den Zeitraum in zwischen geändert werde mal schauen ob es jetzt läuft. Kann mir jedoch immernoch nicht erklären warum er aber nichts ins Log geschrieben hat.
  • Probleme mit Shell Skript

    javascript
    5
    0 Stimmen
    5 Beiträge
    287 Aufrufe
    K
    @arteck ich habe aktuell einen Workaround hinbekommen, Ich habe die Abfrage zur HDD-Auslastung in ein extra Skript kopiert: Spoiler ############ # ioBroker # ############ #Disk Usage usageiobroker=$(df | grep /dev/sda1 | awk '{print $5}') iobroker state set javascript.0.ressourcen.iobroker.iobroker_disk_usage $usageiobroker #Disk Free Space freeiobroker=$(df -h | grep /dev/sda1 | awk '{print $4}') freeiobroker=${freeiobroker//G/} iobroker state set javascript.0.ressourcen.iobroker.iobroker_disk_free $freeiobroker ############### # ioBroker-PI # ############### #Disk Usage usagepi=$(ssh root@192.168.4.34 df | grep /dev/root | awk '{print $5}') iobroker state set javascript.0.ressourcen.iobroker-pi.iobroker-pi_disk_usage $usagepi #Disk Free Space freepi=$(ssh root@192.168.4.34 df -h | grep /dev/root | awk '{print $4}') freepi=${freepi//G/} iobroker state set javascript.0.ressourcen.iobroker-pi.iobroker-pi_disk_free $freepi Mein erstes Shell-Skript läuft jetzt wieder rund und alle Uptimes etc. werden korrekt ausgewertet. Die Abfrage der HDD-Auslastung soll eigentlich alle 10 Minuten laufen, aber der letzte Zeitstempel der Datenobjekte ist von 07:21 Uhr
  • Telegram Meldung bei Spannungsausfall

    javascript blockly monitoring security
    7
    0 Stimmen
    7 Beiträge
    1k Aufrufe
    A
    @Samson71 da bekommste aber keine Meldung bei Spg abfall. Evtl von einer Unterspannungsüberwachung, aber das hat der normal User eher nicht im Schrank zuhause :)
  • Suche einfachen Weg, JSON-Daten online zur Verfügung zu stellen

    javascript
    2
    0 Stimmen
    2 Beiträge
    385 Aufrufe
    AlCalzoneA
    Das dürfte gehen mit dem Adapter Simple-API: https://github.com/ioBroker/ioBroker.simple-api Statt in eine Datei kannst du das JSON als String in einen Datenpunkt schreiben und diesen in Rohform mit getPlainValue durch den Client abrufen lassen => https://github.com/ioBroker/ioBroker.simple-api#getplainvalue
  • Schedule per Script mit Start und Endzeit

    javascript
    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    D
    Ok werde ich mal ausprobieren, das muss jetzt wahrscheinlich irgendwie vom VIS kommen oder? Ein Startzeitfeld und Endzeitfeld oder gibt es da ein Kalender zum füttern?
  • Bewässerungssteuerung per Interface in View

    climate monitoring blockly javascript
    3
    0 Stimmen
    3 Beiträge
    419 Aufrufe
    S
    Habe es folgendermaßen gelöst: ![alt text]([image: 1558437235486-bew%C3%A4sserung.jpg] image url) Kreis1,2 und 3 sind meine Bewässerungskreise. Pumpe "Winterbetrieb" (vergessen den Namen zu ändern!) ist die Pumpe für die Kreise1,2 und 3. Pumpe nach Füllstand schalten, ist meine zweite Pumpe, wenn der Füllstand kurz vor Überlauf ist. Dann pumpe ich einen gewissen Level ab. Meine View zum downloaden. In Vis (View importieren) einfügen: View Beregnung.txt Dann unter Scripte einfügen: Eigene States anlegen: createState('javascript.0.AnAus', '', { name: 'Kreis1 Beregnung', type: 'number', unit: '' }); createState('javascript.0.AnAus2', '', { name: 'Kreis2 Beregnung', type: 'number', unit: '' }); createState('javascript.0.AnAus3', '', { name: 'Kreis3 Beregnung', type: 'number', unit: '' }); createState('javascript.0.Kreis1', '', { name: 'Kreis1 Beregnung', type: 'number', unit: '' }); createState('javascript.0.Kreis2', '', { name: 'Kreis1 Beregnung', type: 'number', unit: '' }); createState('javascript.0.Kreis3', '', { name: 'Kreis1 Beregnung', type: 'number', unit: '' }); createState('javascript.0.Countdown.countdown', '', { name: 'Countdown', type: 'number', unit: 'min' }); createState('javascript.0.Countdown.countTrigger', '', { name: 'Trigger', type: 'number', unit: '' }); createState('javascript.0.Countdown.Zeitvorgabe', '', { name: 'Zeitvorgabe', type: 'boolean', unit: '' }); und natürlich einmal ausführen. Script für Countdown, also die Auswahl der Zeit auf dem Zeitbalken. (Ist von pix) /* Countdown // http://forum.iobroker.net/viewtopic.php?f=32&t=3436&hilit=countdown 01.08.2016 pix */ var interval = null; var countdown = 60 * 1000; // 60min * 60s * 1000ms createState('Countdown.Sleeptimer.countdown', seconds2text(countdown), {name: 'Sleeptimer Countdown / Restzeit', type: 'string'}); createState('Countdown.Sleeptimer.countdown_seconds', countdown, {name: 'Sleeptimer Countdown / Restzeit in s', type: 'number', def: countdown}); createState('Countdown.Sleeptimer.afterCount', {name: 'Sleeptimer Countdown / afterCount', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.countTrigger', {name: 'Sleeptimer Countdown / countTrigger', type: 'boolean', def: false}); var idCountdown = 'javascript.'+ instance +'.Countdown.Sleeptimer.countdown', idCountdown_sec = 'javascript.'+ instance +'.Countdown.Sleeptimer.countdown_seconds', idAfterCount = 'javascript.'+ instance +'.Countdown.Sleeptimer.afterCount', idTrigger = 'javascript.'+ instance +'.Countdown.Sleeptimer.countTrigger'; // SPEZIFISCHE UMSETZUNG für a-flow createState('Countdown.Sleeptimer.trigger5min', {name: 'Sleeptimer 5min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger10min', {name: 'Sleeptimer 10min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger15min', {name: 'Sleeptimer 15min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger20min', {name: 'Sleeptimer 20min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger30min', {name: 'Sleeptimer 30min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger40min', {name: 'Sleeptimer 40min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger60min', {name: 'Sleeptimer 60min Timer', type: 'boolean', def: false}); var id5min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger5min', id10min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger10min', id15min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger15min', id20min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger20min', id30min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger30min', id40min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger40min', id60min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger60min'; // Countdown function seconds2text(_seconds) { var sec_num = parseInt(_seconds, 10); // don't forget the second param var hours = Math.floor(sec_num / 3600); var minutes = Math.floor((sec_num - (hours * 3600)) / 60); var seconds = sec_num - (hours * 3600) - (minutes * 60); var time; if (hours > 0) { // if (hours < 4) {hours = "0" + hours;} if (minutes < 4) {minutes = "0" + minutes;} if (seconds < 10) {seconds = "0" + seconds;} // time = hours + ' Stunden, ' + minutes + ' Minuten und ' + seconds + ' Sekunden'; // original time = hours + ':' + minutes + ':' + seconds + ' Std.'; } else if (minutes > 0) { if (minutes < 4) {minutes = "0" + minutes;} if (seconds < 10) {seconds = "0" + seconds;} // time = minutes + ' Minuten und ' + seconds + ' Sekunden'; // original time = minutes + ':' + seconds + 'min'; } else { if (seconds < 10) {seconds = "0" + seconds;} // time = seconds + ' Sekunden'; // original time = seconds + ' s'; } return time; } function count() { // remove trigger if (getState(idTrigger).val) setState(idTrigger, false); // Abbruch bei Knopfdruck if ( getState(id5min).val || getState(id10min).val || getState(id15min).val || getState(id20min).val || getState(id30min).val || getState(id40min).val || getState(id60min).val ) { setState(idCountdown, 00); setState(idAfterCount, false); clearInterval(interval); interval = null; nachricht = "Das Programm wird gestartet"; sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } if (countdown > 1) { setState(idCountdown_sec, parseInt(countdown,10)); setState(idCountdown, seconds2text(--countdown)); } else { clearInterval(interval); interval = null; setState(idCountdown_sec, 0); setState(idCountdown, seconds2text(0)); setState(idAfterCount, true); } } on(idTrigger, function (obj) { if (obj.state.val) { setState(idCountdown_sec, parseInt(countdown,10)); setState(idCountdown, seconds2text(countdown)); setState(idAfterCount, false); if (!interval) { count(); interval = setInterval(count, 1000); } } }); // wenn idAfterCount true wird, kann eine Aktion ausgeführt werden on(idAfterCount, function (obj) { if (obj.state.val) { log('Countdown abgelaufen'); // weitere Aktionen einfügen // Sprachausgabe nachricht = 'Das Programm ist fertig'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe fertig sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); } }); // Taster für VIS createState('Countdown.Sleeptimer.trigger5min', {name: 'Sleeptimer 5min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger10min', {name: 'Sleeptimer 10min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger15min', {name: 'Sleeptimer 15min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger20min', {name: 'Sleeptimer 20min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger30min', {name: 'Sleeptimer 30min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger40min', {name: 'Sleeptimer 40min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger60min', {name: 'Sleeptimer 60min Timer', type: 'boolean', def: false}); var id5min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger5min', id10min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger10min', id15min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger15min', id20min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger20min', id30min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger30min', id40min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger40min', id60min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger60min'; function sleeptimer(dauer) { if (interval) { // wenn Countdown schon läuft clearInterval(interval); interval = null; setState(idCountdown_sec, parseInt(0,4)); setState(idCountdown, seconds2text(0)); log(dauer + 'min Sleeptimer gestoppt'); // Sprachausgabe nachricht = 'Das Programm wird gestoppt'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Teigprogramm ein sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } else { countdown = dauer * 60; // Dauer festlegen (in Minuten) setState(idTrigger, true); // Countdown starten log(dauer + 'min Sleeptimer gestartet'); // Sprachausgabe // nachricht = 'Das Programm wird gestartet'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Teigprogramm ein // sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } } on(id5min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(5); // 5min Zeit übergeben setStateDelayed(id5min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id10min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(10); // 10min Zeit übergeben setStateDelayed(id10min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id15min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(15); // 15min Zeit übergeben setStateDelayed(id15min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id20min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(20); // 20min Zeit übergeben setStateDelayed(id20min, false, 250); // nach viertel Sekunde wieder auf false // Sprachausgabe // nachricht = 'Das Programm wird gestartet'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Teigprogramm ein // sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } }); on(id30min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(30); // 30min Zeit übergeben setStateDelayed(id30min, false, 250); // nach viertel Sekunde wieder auf false // Sprachausgabe // nachricht = 'Das Programm wird gestartet'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Teigprogramm ein // sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } }); on(id40min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(40); // 40min Zeit übergeben setStateDelayed(id40min, false, 250); // nach viertel Sekunde wieder auf false // Sprachausgabe // nachricht = 'Das Pprogramm wird gestartet'; // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Teigprogramm ein // sendTo("paw.0",'TabKueche',{send: 'say', text: nachricht}); // Sprachausgabe ueber PAW // setState("fullybrowser.0.192_168_1_57.Commands.textToSpeech", text: nachricht); } }); on(id60min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(60); // 60min Zeit übergeben setStateDelayed(id60min, false, 250); // nach viertel Sekunde wieder auf false } }); Script für Pumpe Kreis1. Läuft bei mir über 12V Ventile, die ich dann bei Bedarf einschalte plus die Pumpe. // Pumpe: Ausschalten nach x Minuten // http://forum.iobroker.net/viewtopic.php?f=21&t=5067 function weiter() { var Zeitvorgabe = getState('javascript.0.Countdown.Zeitvorgabe').val ; // Zeit auswählen //############################################################# // Bewässerung zunächst ausschalten beim erstmaligen Skriptstart // um im Falle eines Reboots den zuvor laufenden Bewässerungstimer auszuschalten (Not-Aus), // da er nach Reboot den zuvor gesetzten Ausschalttrigger nicht mehr ausführen kann setState("hm-rpc.0.xxxxxxxxxxx.1.STATE", false); setState("hm-rpc.0.xxxxxxxxxxx.4.STATE", false); //############################################################# log (Zeitvorgabe); if (Zeitvorgabe === 0 || Zeitvorgabe === isNaN) Zeitvorgabe = 30; setStateDelayed("hm-rpc.0.xxxxxxxxxx.1.STATE", true); // Kreis 1 Ventil einschalten setStateDelayed("hm-rpc.0.xxxxxxxxxx.4.STATE", true, 1000); // nach 1 Sek. Pumpe ein setState("hm-rpc.0.xxxxxxxxxx.1.ON_TIME", Zeitvorgabe); // OnTime setzen // Countdown starten für Anzeige der Zeit auf View setState('javascript.0.Countdown.countTrigger', true); // Countdown Brunnen starten setStateDelayed("javascript.0.AnAus", 0, (Zeitvorgabe*60*1000)); // nach x Min. ausschalten -> Pumpe setStateDelayed("hm-rpc.0.xxxxxxxxx.2.STATE", false); // Ventil 2 auf false setzen setStateDelayed("hm-rpc.0.xxxxxxxxx.3.STATE", false); // Ventil 3 auf false setzen sendTo('telegram', "Brunnen eingeschaltet. \nNach " + (Zeitvorgabe) + " Minuten wird er wieder automatisch ausgeschaltet."); //log ("Brunnen eingeschaltet. Nach " + (Zeitvorgabe*60*1000) + " Sekunden wird er wieder automatisch ausgeschaltet."); } function weiter2() { setState("hm-rpc.0.xxxxxxxxxx.1.STATE", false); // Brunnen Ventil aus setState("hm-rpc.0.xxxxxxxxxx.4.STATE", false); // Brunnen Pumpe aus sendTo('telegram', "Brunnen ausgeschaltet."); //log ("Brunnen ausgeschaltet."); setState('javascript.0.Countdown.countTrigger', false); // Countdown Pumpe aus setState('javascript.0.Countdown.Zeitvorgabe', 0); // Zeitvorwahl auf Null setzen setState('javascript.0.Countdown.countdown', 0); // Countdown auf Null setzen setState("hm-rpc.0.xxxxxxxxxx.1.ON_TIME", 0); // OnTime auf Null } on({id: "javascript.0.AnAus", change: "ne", val: 1}, function() { // Bewaesserung Kreis1 einschalten //log("Auslöser Schalter - Cux: Brunnen ein"); weiter(); event("Gartenpumpe Kreis1 läuft"); // in eventlist schreiben // Sprachausgabe // nachricht = 'Kreis eins ist eingeschalten ' // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Kreis 1 ein Ausgabe = "Kreis eins ist eingeschalten"; sendTo("paw.0",'TabKueche',{send: 'say', text: Ausgabe}); // Sprachausgabe ueber PAW }); on({id: "javascript.0.AnAus", change: "ne", val: 0}, function() { // Bewaesserung Kreis1 ausschalten weiter2(); event("Gartenpumpe Kreis1 aus"); // Sprachausgabe // nachricht = 'Kreis eins ist ausgeschalten ' // setState("sayit.2.tts.text"/*Text to speech*/, nachricht); // Sprachausgabe Kreis 1 aus Ausgabe = "Kreis eins ist ausgeschalten"; sendTo("paw.0",'TabKueche',{send: 'say', text: Ausgabe}); // Sprachausgabe ueber PAW }); Falls du verschiedene Kreise hast, kannst du das Script dann für deine Kreise anpassen. Ich habe bei mir 3 Scripte laufen. Für jeden Kreis ein eigenes Script. Kann man sicherlich eleganter lösen! Bei mir läuft es jedenfalls sehr gut. Hoffe, dir geholfen zu haben.
  • Yeelight Lampensteuerung

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    652 Aufrufe
    S
    Falls es nicht unbedingt per Script oder Cube gesteuert werden soll: Es funktioniert alles super über Yeelight Adapter in Verbindung mit Alex.
  • Verögerungszeit stoppen

    blockly javascript
    7
    0 Stimmen
    7 Beiträge
    526 Aufrufe
    paul53P
    @Olivbus Nein, in der Funktion steht exakt nur clearStateDelayed(id); Die ID wird an die Funktion bei Aufruf übergeben: [image: 1558274882235-blockly_cleardelay.jpg]
  • [gelöst] Blockly- Telegram an unterschiedliche Empfänger senden

    Verschoben
    17
    1
    0 Stimmen
    17 Beiträge
    11k Aufrufe
    M
    @BuZZy ich habe den grund gefunden. In der Variablen "foto senden hof" musste ich noch den jeweiligen user hinzufügen.
  • Datentyp (Array, String, Number) wirrwarr

    javascript
    5
    2
    0 Stimmen
    5 Beiträge
    3k Aufrufe
    W
    @AlCalzone Um dieses Objekt zu steuern verwende ich gar keinen Code. Das Objekt wird direkt über Alexa per iot Smartobjekt gesteuert. Ich habe dieses Objekt nun aber gelöscht und nochmals das 100% gleiche Objekt neu angelegt. Dadurch wurde das Problem beseitigt und iot überträgt die Information von Alexa nun auch als Zahl. Klappt also nun alles. Danke für Deinen Support!
  • [gelöst] Script für Telegram anpassen-Batteriestatus anzeigen lassen

    Verschoben
    30
    0 Stimmen
    30 Beiträge
    3k Aufrufe
    dslraserD
    @quorle ich habe diese Stellen bei mir mal auf false geändert, dann kamen sofort alle Geräte als Telegram Nachrichten, sobald ich das Script gespeichert habe. Das Script funktioniert also. [image: 1557949000145-bildschirmfoto-2019-05-15-um-21.10.02.png] [image: 1557948884929-bildschirmfoto-2019-05-15-um-21.33.41.png] aber bei LowBat fehlte trotzdem noch was, das habe ich eingefügt... das fehlte ++anzahlLOWBAT Export createState('zählenLowbat.möglicheLOWBAT', 0); // wenn benötigt: Anzahl der vorhandenen Geräte createState('zählenLowbat.anzahlLOWBAT', 0); // wenn benötigt: Anzahl der vorhandenen LOWBAT createState('zählenLowbat.textLOWBAT', " "); // Anzahl LOWBAT, die an sind als Variable unter Javascript.0 anlegen var cacheSelectorLOWBAT = $('channel[state.id=*.LOWBAT]'); var cacheSelectorLOW_BAT = $('channel[state.id=*.LOW_BAT]'); // für Homematic IP, dort LOWBAT in LOW_BAT umbenannt function countLowbat(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.LOWBAT auf 0 var moeglicheLOWBAT = 0; var anzahlLOWBAT = 0; var textLOWBAT = []; if (obj) { log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat } else { log('Ausgelöst bei Timer'); } cacheSelectorLOWBAT.each(function (id, i) { // Schleife für jedes gefundenen Element *.LOWBAT var status = getState(id).val; // Zustand *.LOWBAT abfragen (jedes Element) var obj = getObject(id); if (status === true) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt textLOWBAT.push(obj.common.name); // Zu Array hinzufügen ++anzahlLOWBAT } log("Geräte Nr. " + i + ": " + getObject(id).common.name + ": " + status); ++moeglicheLOWBAT; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status }); cacheSelectorLOW_BAT.each(function (id, i) { // Schleife für jedes gefundenen Element *.LOW_BAT, Homematic IP var status = getState(id).val; // Zustand *.LOW_BAT abfragen (jedes Element) var obj = getObject(id); if (status === true) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt textLOWBAT.push(obj.common.name); // Zu Array hinzufügen ++anzahlLOWBAT } log("Geräte Nr. " + i + ": " + getObject(id).common.name + ": " + status); ++moeglicheLOWBAT; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon LOWBAT zutreffend) ausgegeben log("Text: " + textLOWBAT); log("Anzahl Geräte: " + moeglicheLOWBAT + " # davon LOWBAT erkannt: " + anzahlLOWBAT); // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählenLowbat.textLOWBAT", textLOWBAT.join(',<br>')); // Schreibt die aktuelle Namen der Geräte mit LOWBAT Meldung setState("zählenLowbat.anzahlLOWBAT", textLOWBAT.length); // Schreibt die aktuelle Anzahl der Geräte im System setState("zählenLowbat.möglicheLOWBAT", moeglicheLOWBAT); // Schreibt die aktuelle Anzahl der vorhandene Geräte if(anzahlLOWBAT > 0) setTimeout(telegram,2000); // NEU EINGEFÜGT. Telegram wird um 2 Sekunden verzögert geschickt um sicherzugehen, dass alles andere vorher erledigt ist und auch nur, sofern es leere Batterien gibt (was du in deinem Versuch ja quasi simulierst) } cacheSelectorLOWBAT.on(function(obj) { // bei Zustandänderung *. LOWBAT in allen Gewerken countLowbat(obj); }); cacheSelectorLOW_BAT.on(function(obj) { // bei Zustandänderung *. LOW_BAT in allen Gewerken countLowbat(obj); }); schedule("0 */6 * * *", function () { //ausgelöst alle 6 Stunden countLowbat(); }); // TELEGRAM ALS FUNKTION NEU EINGEFÜGT: function telegram() { var telegramtext = getState("zählenLowbat.textLOWBAT").val.replace(/<br>/g , "\n"); // telegram Liste formatieren, entfernt den HTML Zeilenumbruch und ersetzt mit Zeilenumbruch Telegram telegramtext = telegramtext.replace(/_DEV:0.LOW_BAT/g, ""); sendTo('telegram.0', { // Nachricht per Telegram senden text: "Komponenten mit geringem Ladestand:\n\n" + telegramtext }); } //Bei Scriptstart countLowbat();
  • Datenpunktautomatisierung

    blockly javascript scenes multimedia
    6
    0 Stimmen
    6 Beiträge
    658 Aufrufe
    BerserkerB
    @arteck Ich schalte ja erst zum Beispiel die Musik Anlage an und dann später den TV. Der Datenpunkt Fernseher (auf dem Bild zu sehen) soll aber auf an springen sobald beide Geräte angeschalten werden ohne aber beide Geräte erneut zu schalten

281

Online

32.8k

Benutzer

82.7k

Themen

1.3m

Beiträge