Skip to content

Skripten / Logik

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

16.6k Topics 213.9k Posts

NEWS

Subcategories


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Topics
    49k Posts
    RoddiEFR
    Servus, da ich ja auf sowas stehe (Dashboards), Grafana und influxDB 1.8 nutze, dachte ich mir "komm schau es dir mal an" aber zu meinem Bedauern muss ich sagen ist zwar schön aber nicht so einfach wie gedacht zu nutzen. Ich will damit nicht sagen das es nicht läuft, aber die Einrichtung und die Darstellung in Grafana sind schon eine Hürde die mich als "normaler" Anwender abschreckt. Man weiß nicht so richtig was man wo und wie einstellen muss, welche Datenpunkt man benötigt usw. Ich weiß das eine Anleitung viel Arbeit macht, aber eine kurze mit Beispielen wäre eine nette Zugabe. Aber das ist allen meine persönliche Meinung, die Profis hier im Forum mögen das anders sehen. Trotzdem schöne Arbeit und Respekt meinerseits.
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Topics
    80k Posts
    Murphy 0M
    Viel Spaß
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Topics
    13k Posts
    Marc BergM
    Es gibt in der Verson 1.3.0 einen neuen Node: iob-setObject (Stand 10.02.26 noch beta) Mit dem neuen Node kann man ioBroker-Objektdefinitionen (Metadaten) direkt schreiben und ändern. Hauptfunktionen: Instanz-Konfigurationen ändern - z.B. MQTT publish-Pattern, Intervalle, etc. Objekt-Eigenschaften aktualisieren - Namen, Rollen, Einheiten, Min/Max-Werte ändern es gibt zwei Modi: Merge-Modus : Ändert nur die angegebenen Eigenschaften, alle anderen bleiben erhalten Replace-Modus: Überschreibt das komplette Objekt Typischer Workflow: Objekt mit iob-getobject holen Mit Change-Node gewünschte Properties ändern Mit iob-setobject zurückschreiben
  • Update Js Controler

    javascript
    3
    0 Votes
    3 Posts
    294 Views
    crunchipC
    @albbino [image: 1581671977233-beca7ff8-555b-4421-af39-6600a76e8c5b-image.png]
  • Funk-Master-Slave-Steckdose umsetzen

    multimedia communication
    3
    0 Votes
    3 Posts
    748 Views
    D
    Vielen Dank für die Antwort. Leider hat direkt am nächsten Tag mein NAS defekt angemeldet, so dass ich hier nicht mehr mitlesen konnte... Ich habe es jetzt über PING und folgendes Blockly gelöst: [image: 1581632940910-3aef070a-7a35-4585-9d21-48119c181ca9-grafik-resized.png] Der rechte Teil ist nicht direkt notwendig, aber aus folgenden Gründen vorhanden: Der obere Teil reduziert die Verzögerung beim Einschalten Der untere Teil (Workaround) fordert die Uhrzeit vom Sensor durch Überschreiben des Wertes mit "" erneut an. In ein paar fällen hatte sich die RTC noch nicht aktualisiert und den 01.01.1970 als Wert genannt. Anmerkung: Den Trigger-Parameter "was updated" habe ich noch auf "was changed" geändert, damit nicht so viele Aktionen gefeuert werden.
  • AbstraktionsSchicht

    javascript
    13
    0 Votes
    13 Posts
    522 Views
    A
    Vielleicht noch ein möglicher Ansatz zur Steuerung: Ich finde MQTT als Kommunikationsprotokoll genial. Ich habe mir in ioBroker einen eigenen Tree für Wohnung/Stockwerke/Zimmer/Gewerke gebaut und die States mit der Visualisierung verbunden. Über MQTT sind diese Datenpunkte dann mit anderen Devices (entweder innerhalb von ioBroker oder externe Systeme) synchronisiert. Das ist auch eine Abstraktionsschicht, die ich mir gebaut habe, damit ich z.B. Hue-Bewegungsmelder, HomeMatic-Bewegungsmelder oder selbstgebaute über eine einheitliche Schnittstelle ansprechen kann. Möglicherweise ist da für dich auch ein passender Impuls dabei...
  • Doppelte Ansagen über SayIT bei einfachem Blockly

    Moved
    8
    2
    0 Votes
    8 Posts
    875 Views
    M
    Hi, trotz des älteren Themas mein Senf dazu. Hatte vor kurzem auch das Problem. Meine Lösung war beim Trigger das "anerkannt ist" auf Update zu setzen und dadurch waren die doppelten Ansagen weg. Kann Zufall sein aber bei mir hat's was gebracht.
  • Status Änderungen Debuggen / Nachvollziehen

    blockly
    4
    0 Votes
    4 Posts
    375 Views
    paul53P
    @btiegel sagte in Status Änderungen Debuggen / Nachvollziehen: Komme ich auf der Ebene auch an das auslösende Skript? Nein, es sollten nur ein bis zwei Scripte infrage kommen, in denen der Datenpunkt mit steuere (Bestätigt: false) bzw. aktualisiere(Bestätigt: true) aktualisiert wird.
  • Ansage Fenster geöffnet

    blockly
    12
    1
    0 Votes
    12 Posts
    1k Views
    C
    @panik Ne, welches Fenster offen ist steht ja dann in der neuen Variable FensterText, nur das du so auf eben diese Variable prüfen kannst ob mindestens ein Fenster geöffnet ist. Ich mache mal heute Abend -ich hoffe ich denke dran :P - ein Beispiel
  • 0 Votes
    1 Posts
    147 Views
    No one has replied
  • [gelöst] Script "Zählen von Fenstern" zeigt keine offenen Fenster an

    Moved
    132
    3
    0 Votes
    132 Posts
    21k Views
    NegaleinN
    @e-i-k-e sagte in [gelöst] Script "Zählen von Fenstern" zeigt keine offenen Fenster an: Keiner eine Idee dazu? ich hab das in Verwendung. Fenster zählen /* Status Zahl Fenster Homematic var cacheSelectorLevel = $('channel[state.id=*.STATE](functions="Fenster")'); Mi var cacheSelectorState = $('state[id=*.state](functions="Fenster")'); {1} */ var logging = true; var idAnzahlEin = 'javascript.0.Status.Fenster.Anzahl_auf', idAnzahl = 'javascript.0.Status.Fenster.Anzahl', idText = 'javascript.0.Status.Fenster.Text', idRaum = 'javascript.0.Status.Fenster.Raum', // <---- NEU idAnsage = 'javascript.0.Status.Fenster.Ansage'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter type: 'number', name: 'Anzahl aller Fenster', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der offenen Fenster', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Offene Fenster', desc: 'Namen der offenen Fenster', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Offene Fenster (Ansage)', desc: 'Namen der offenen Fenster (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { // Räume, in denen Lichter brennen // <---- NEU type: 'string', name: 'Räume mit offenen Fenster', desc: 'Namen der Räume, in denen Fenster offen sind', def: ' ', role: 'value' }); //var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); // Gewerk Licht var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="XXX")'); //var cacheSelectorHue = $('state[id=*.on](functions=Licht)'); var cacheSelectorState2 = $('channel[state.id=*.STATE](functions="Fenster")'); //Homematic var cacheSelectorState = $('state[id=*.state](functions="Fenster")'); //Mi function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; var textRaum = []; if (logging) { log('++++++ Fenster Anzahl ++++ '); log('#### Mi ##### '); } cacheSelectorState.each(function(id, i) { // Schleife für jedes gefundenen Element *.state im Gewerk Fenster var status = getState(id).val; // Zustand *.state abfragen (jedes Element) var deviceId = id.substring(0, id.lastIndexOf(".")); var devicename = getObject(deviceId).common.name; var raumname = getObject(id, "rooms").enumNames[0]; if (logging) { log('---Mi----'); log('Raum: ' + JSON.stringify(raumname)); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die Anzahl der Fenster hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); cacheSelectorState2.each(function(id, i) { // Schleife für jedes gefundenen Element *.ON im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // <---- NEU // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('---Homematic----'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die Anzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // ENDE VK-Abfrage }); if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // <---- NEU // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // <---- NEU // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Fenster: " + anzahlLichter + " # davon Fenster offen: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht // setState(idRaum, textRaum.join(',<br>')); // Räume, in denen Licht brennt // <---- NEU setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU } // Trigger cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorState2.on(function(obj) { // bei Zustandänderung *.ON von HUE Lampen im Gewerk Licht if (logging) log('Auslösende Homematic: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); function main() { setTimeout(function() { if (logging) log('Auslöser Skriptstart'); checkDevices(); }, 2000); } main(); // Skriptstart-Auslöser // Aufbereitung für Ansage function strip_tags(data) { var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " "); return (rueckgabe); } on(idText, function(obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0) ? 'Fenster offen: ' + strip_tags(text) : 'Alle Fenster geschlossen'; setState(idAnsage, text); }); oder hier in Blockly (Fenster, Licht, usw.)
  • Kleine Alarmanlage

    blockly
    8
    1
    0 Votes
    8 Posts
    878 Views
    CinimodC
    Dann trigger doch die tür/fensterkontakte, oder was du sonst so als melder benutzen willst und schalte über vis oder yahka dein javascript (alarm) ein und aus [image: 1581272608126-bildschirmfoto-2020-02-09-um-19.19.21.png] mit nem zweiten script kannst dir ja auch über die Anwesenheit, dieses script ein oder ausschalten
  • scenes adapter handling

    scenes
    9
    0 Votes
    9 Posts
    515 Views
    jpgorganizerJ
    @Homoran said in scenes adapter handling: Dann kannst du direkt ein Issue anlegen mit feature request - Stop scene done https://github.com/ioBroker/ioBroker.scenes/issues/42
  • SQL Adapter flutet Log

    monitoring
    13
    0 Votes
    13 Posts
    791 Views
    C
    Hallo zusammen, Hatte das selbe Problem nach Update der node Version (8 auf 10). Mir hat diese Anleitung geholfen: https://forum.iobroker.net/topic/22867/how-to-node-js-für-iobroker-richtig-updaten Gruß Charly
  • Hilfe parser auslesen Wind aus .txt

    monitoring
    12
    0 Votes
    12 Posts
    671 Views
    HomoranH
    @ChrisXY ist aber kein Hexenwerk. du musst nur die Klammern verschieben, je nachdem welchen Teil des Timestamps du haben willst: last24h_wind0_speedmax_time\s+\d\d\d\d\d\d\d\d\d\d\d\d(\d\d) Hier Sekunden
  • [Gelöst]Automatisch zum Standardview nach 2 Minuten

    javascript
    5
    0 Votes
    5 Posts
    710 Views
    T
    @Feuersturm Dann dürftest du die richtigen Stichwörter verwendet haben! Trotzdem danke für die Mühe. LG Thomas
  • [Gelöst] Fensterkontakt + Thermostat: Wie Verzögerung einbauen

    Moved
    5
    0 Votes
    5 Posts
    1k Views
    C
    Hi, leider nur Javascript. Die Funktion Timeout ist aber schön zu erkennen: Hier wird 60 Sekunden bei Fenster auf gewartet und erneut geprüft. Ich kann also in Ruhe ein Bier vom Balkon holen... //Wohnzimmer: on({id: 'javascript.0.Smarthome.fenster_wohnzimmer', change: 'any'}, function (obj) { if (obj.state.val===true) { setTimeout(function(){ if (obj.state.val===true) { setState('fritzdect.0.Comet_119610277592.mode',1); } }, 60000); } else setState('fritzdect.0.Comet_119610277592.mode',0); }); Und falls du Fenster zusammenfassen möchtest (Wohnzimmer hat bei mir 2 Fenster + Balkontür: //Das Script fasst die Wohnzimmer Fenster zusammen const idSammel = 'javascript.0.Smarthome.fenster_wohnzimmer'; const id1 = 'javascript.0.Smarthome.Fenster.Fenster_1'; // ID von 1\. Meldung const id2 = 'javascript.0.Smarthome.Fenster.Fenster_2'; const id3 = 'javascript.0.Smarthome.Fenster.Fenster_3'; const ids = [id1, id2, id3]; var vals = [getState(id1).val, getState(id2).val, getState(id3).val]; function sammel() { if(vals[0] || vals[1] || vals[2] ) setState(idSammel, true, true); else setState(idSammel, false, true); } on(ids, function(dp) { var pos = ids.indexOf(dp.id); if(pos != -1) { vals[pos] = dp.state.val; sammel(); } else log('Trigger-ID nicht im Array !', 'warn'); });
  • (gelöst) Sonos Lautstärke über Alexa "softer" steuern

    blockly javascript
    8
    0 Votes
    8 Posts
    3k Views
    padrinoP
    Hi, "etwas lauter" sollte auch klappen. ;) Ich denke, es wäre am Besten, wenn man dann die Lautstärke komplett selbst steuert, sprich die Finger ganz von nur "lauter" und "leiser" lässt.. Diese kann man dann ja z.B. durch (obige) "mach..." ersetzen. Eigentlich sind "lauter" und "leiser" ja +/-10% ("+" und "-" am Gerät ergeben +/- 0, 3, 7 - was inzwischen auch die kleinstmöglichen Schritte fürs Einstellen über "volume" sind).. "Pfuscht" man aber darin herum, kommt Alexa etwas aus dem Tritt :nerd_face: Wie z.B. Volume = 23% lauter -> 30% Volume = 27% lauter -> 40% Denke, ich werde mein Skript demnächst dahingehend auch mal überarbeiten... :relieved:
  • Helligkeitsabhängiges Script

    javascript blockly
    19
    0 Votes
    19 Posts
    607 Views
    C
    ihr habt beide Recht - und ich 2 dinge vermischt! ich versuche jetzt beide von Euch vorgeschlagenen Scripte und möchte mich sehr herzlich bedanken! :-)
  • Wake on lan mit vis und button

    javascript
    6
    0 Votes
    6 Posts
    895 Views
    JohGreJ
    Bitte schön on('javascript.1.VIS.wakeOnLan', function (obj) { var wol = require('wake_on_lan'); if ( obj.state.val ) { log('wakeOnLan: ' + obj.state.val) if ( !getState('radar2.0.Synology._here'/*Synology here*/).val) { wol.wake('xx:xx:xx:xx:xx:xx'); } else if (getState('radar2.0.Synology._here'/*Synology here*/).val) { setTimeout(function(){this.shutDownNAS;},10*1000); } setState("javascript.1.VIS.wakeOnLan",false); } }); function shutDownNAS() { var SSH = require('simple-ssh'); var ssh = new SSH({ host: 'ip.ad.re.ss', port: 21, user: 'SSH-User', pass: 'SSH-User Passwort' }); log('shutDownNAS'); ssh.exec('echo "SSH-User Passwort"|sudo -S shutdown -h now').start(); } [image: 1581156394980-a898b978-8a76-481d-99d3-99aa2904a9b9-grafik.png]
  • PS4-Waker NPM Modul, Hilfe benötigt

    javascript blockly
    2
    0 Votes
    2 Posts
    343 Views
    S
    @kimbel55 Habe dir hier geantwortet: https://forum.iobroker.net/topic/13749/gelöst-ps4-waker-npm-modul-von-github-installieren-tv-via-hdmi-cec-einschalten/37
  • 0 Votes
    37 Posts
    9k Views
    S
    Hi @kimbel55 , ich habe genau das gleiche Problem wie du und habe gefühlt alle Beiträge, die ich zu dem Thema im Internet gefunden habe, 100 mal gelesen. Auch im issue thread (https://github.com/dhleong/ps4-waker/issues?q=is%3Aissue+is%3Aclosed) auf GitHub war nichts Brauchbares dabei... Egal auf welche Weise ich den ps4-waker installiert und das NPM-Modul in JS eingebunden habe, war auf meinem Pi nie die cmd.js bzw. das /bin Verzeichnis zu finden. Im JSScript liefert mir der getDeviceStatus code auch alles ordnungsgemäß zurück, aber starten oder stoppen geht nicht. [image: 1581121907040-ed5df4a5-4b2f-4510-a952-54c3f65c6a40-image.png] Auch der exec command klappt nicht und es sieht wie bei euch aus. Über die Konsole vom Pi klappt es aber mit den einfachen commands "npx ps4-waker", "ps4-waker", "ps4-waker standby". Leider ließ sich ein simples Shell script mit dem Aufruf nicht sofort in iobroker einbinden und musste etwas tüfteln. Jetzt habe ich aber eine robuste und zuverlässige Lösung für die Einbindung in Alexa gefunden, die sogar echt fix die PS4 per Sprachbefehl startet und in standby schickt. Es führen ja bekanntlich viele Wege nach Rom, aber bei mir klappt es nun mit folgendem Umweg: 1. PS4Switch in Node-RED Alexa Home Skill Bridge (https://alexa-node-red.bm.hardill.me.uk/devices#) anlegen [image: 1581120360930-8965d3d9-95dd-435d-bc06-4def1fe989e3-image.png] 2. PS4StateSzene in ioBroker anlegen wird getriggerd von PS4Switch (alexa) [image: 1581120450946-6206cc88-0952-4618-b3fc-52b5ba268a20-image.png] 3. Blocky Script für On | Off temp files wird getriggerd von PS4StateSzene erzeugt eine temporäre On oder Off datei im filesystem cat >> /opt/iobroker/node_modules/iobroker.javascript/node_modules/ps4-waker/On cat >> /opt/iobroker/node_modules/iobroker.javascript/node_modules/ps4-waker/Off [image: 1581120503162-52ae0df4-3c95-4f3d-bbc1-d28a5dee2358-image.png] 4. ps4-waker-monitor.sh Script erstellen Prüft dauerhaft ob eine On oder Off Datei erstellt wurde Falls ja wird der ps4-waker Befehl ausgeführt und die Datei gelöscht Rechte: [image: 1581120676035-dddbaf56-9648-44de-a2b5-ce4c16e98133-image.png] #!/bin/bash # set n to 1 n=1 # continue until $n equals 5 while [ $n -le 50 ] do file1="/opt/iobroker/node_modules/iobroker.javascript/node_modules/ps4-waker/On" file2="/opt/iobroker/node_modules/iobroker.javascript/node_modules/ps4-waker/Off" if [ -f "$file1" ] then echo "Try to start PS4 - $file1 found." sudo rm $file1 ps4-waker sleep 5.0 else #echo "Nothing to do, $file1 not found." sleep 0.1 fi if [ -f "$file2" ] then echo "Try to stop PS4 - $file2 found." sudo rm $file2 ps4-waker standby sleep 5.0 else #echo "Nothing to do, $file2 not found." sleep 0.1 fi sleep 0.5 done 5. ps4-waker-monitor.sh Script schedulen hiermit wird das script automatisch bei jedem Neustart ausgeführt. sudo crontab -e @reboot [Pfad/zum/Befehl] Es gibt bestimmt elegantere Lösungen, aber ich bin hiermit wirklich glücklich. Bin jetzt komplett von der ioBroker Cloud zu Node-RED umgestiegen und bin begeistert. Der ioBroker Cloud und IoT Adapter war bei mir leider nie so richtig zuverlässig in Verbindung mit Alexa. Meine Lösung für den ps4-waker wäre damit gelaufen, aber sicherlich mit großer Verzögerung. Jetzt wird aber nachdem ich den Sprachbefehlt abgesetzt habe, der Befehl nach ca. 5 Sekunden an die PS4 gesendet. :)
  • Zeichenfolge Parsen

    javascript
    17
    0 Votes
    17 Posts
    515 Views
    T
    [0-9]+(?= Minuten")

707

Online

32.7k

Users

82.5k

Topics

1.3m

Posts