Skip to content

Skripten / Logik

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

16.4k Themen 211.9k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 48k
    2k Themen
    48k Beiträge
    F
    LIebe Community. Darf ich Euch um Hilfe bitten. Zurzeit steuere ich mein Umwalzpumpe Schaltung anhand der Ventilwerte alle Thermostaten. Da ich nun ein Kacheloffen in EG installiert habe, verfälscht der neuen Heizung die duchschnitliche Ventilwerte über der gesamten Haus. Daher schaltet der Umwalzpumpe frühseitig aus. Meine Idee ist folgendes: ein Filter in diese Skript einbauen, wo die Heizkörper pro Stockwerk gelistet werden, und in mein Blockly ein "OR" einbauen. zB - Wenn die EG Ventilwert < 20% OR Wenn die OG1 Ventilwert < 20% or Wenn die OG2 Ventilwert < 20%, dann der Umwalzpumpe einschalten. Hier der bestehenden Skript - der bis jetzt sehr gut funktioniert hat. Vielen Dank für eure Hilfe ! ############ string itemID; object i = (dom.GetObject(ID_FUNCTIONS)).Get("Heating"); integer test = 0; !Berrechnung der ges. Ventilöffnung string s_device; object o_device; integer i_devices = 0; integer i_cdevices = 0; string s_channel; object o_channel; integer i_channels = 0; integer i_cchannels = 0; string s_typelist = ""; string s_temp; foreach(itemID, i.EnumUsedIDs()) { var ch = dom.GetObject(ID_CHANNELS).Get(itemID); if (ch.TypeName() == "CHANNEL") { ! Sicherheitsabfrage, verhindert Absturz, falls ein falsches Gerät im Gewerk ist ! Datenpunkt für Ventilstellung ermitteln var dp = ch.DPByHssDP("LEVEL"); if (dp) { ! Sicherheitsabfrage, verhindert Absturz, falls ein falsches Gerät im Gewerk "Heizung" ist var name = ch.Name(); WriteLine(name); ! Ventilstellung ermitteln var vent = dp.Value(); var conv = vent*100; WriteLine(conv); test = test + conv; i_channels = i_channels + 1; } } } WriteLine("****************************************************"); WriteLine(name); WriteLine(conv); WriteLine(i_channels); WriteLine(test); var diff = test / i_channels; WriteLine(diff); dom.GetObject("Ventilwert").State(diff); if(diff > 20.0){WriteLine("Bedingung erfüllt"); dom.GetObject("Heizungspumpe").State(1);} else {WriteLine("Bedingung nicht erfüllt"); dom.GetObject("Heizungspumpe").State(0);}
  • Hilfe für Skripterstellung mit Blockly

    6k 78k
    6k Themen
    78k Beiträge
    C
    Vielleicht eine einfache Frage, aber ich habe im Internet nichts gefunden: Gibt es bei Blockly die Möglichkeit, andere Blöcke einzubinden? Ich meine jetzt nicht ein "Import" im Sinne der Import-Funktion von Blockly. Mir geht es darum, dass ich z.B. Standardfunktionen (z.B. Kennlinie auslesen und interpolieren) auslagern möchte, die ich in mehreren Blöcken benötige. Und jetzt soll Sie nicht importiert (=kopiert) werden, sondern nur verlinkt werden. Vergleichbar mit dem import in Python oder dem include bei C.
  • Hilfe für Skripterstellung mit Node-RED

    952 13k
    952 Themen
    13k Beiträge
    HomoranH
    @fiddle sagte in [Gelöst]: Adapter per {Node Red | JS} (de)aktivieren: Ok, nicht als "Wert" schreiben, sondern als "Befehl". Dann scheint ihn das zu beeindrucken. du zeigst ja nichts, aber es geht mit true/false [image: 1763416200051-screenshot_20251117-224854_firefox.jpg] gesteuert über eigenen DP vom typ Bool
  • [Frage] schedule('*/1 * * * *',?????); # eBus_read-f (Einzelwert)

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    414 Aufrufe
    D
    Danke für die Tipps nun wird es sauber abgearbeitet. Nun kommt die nächste Baustelle dass ich gleich mehrere Werte abfrage (Array) Gruß Jürgen
  • LowBatterie abfragen für ein Widget

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    M
    Hallo, vielen dank für die Antworten. Habe es geschafft mit dem Script. Vielen Dank.
  • Parameter Zeit der letzten Statusänderung

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    635 Aufrufe
    R
    Super. Danke. Habs gefunden :-) Grüße
  • [GELÖST] Blockly Bedingung erneut Prüfen

    Verschoben
    9
    1
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    R
    @Spike08122: Habe es jetzt hinbekommen :D ` Schön! :) @Spike08122: Nichts nervt so, wie jemand, der sein Problem gelöst hat und die Lösung für sich behält :!: ` Genau, danke für die Rückmeldung, ist mal ne ganz anders gedachte und durchgeführte Verzögerung. Enrico
  • Bei Filmstart Tradfri runterdimmer

    Verschoben
    25
    0 Stimmen
    25 Beiträge
    4k Aufrufe
    AlCalzoneA
    @Marcel85: edit: Leider etwas zu früh gefreut. Die Lampe schaltet sich bei Filmende (Stop, Pause) wieder kurz ein und danach wieder aus. (Lampe war aus) ` Entferne diese Zeile (recht am Ende): else aus();
  • Wie am besten Nachkommastellen beschränken?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    693 Aufrufe
    R
    "Runde auf" ist glaub ich falsch, du musst nur "Runde" nehmen. Enrico
  • Bei Änderung nach N Sekunden Pushover

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    653 Aufrufe
    S
    Besten Dank für die schnellen Antworten. Ich habe jetzt den Filterwert in der Konfiguration der CCU auf 2 Sekunden gestellt und es funktioniert… Das Skript kann ich super für einen anderen Anwendungsfall weiternutzen ;) Klasse Forum hier! Gesendet von iPad mit Tapatalk
  • Geht Trigger im Trigger?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    AlCalzoneA
    @Skydream: hmmmm…..glaube ich nicht. ;) Da ist doch kein warte/sleep etc drin. ` Blöd ausgedrückt… ich wollte den inneren Trigger durch eine if-Abfrage ersetzen. Der stand ja im Timeout. Kommt davon, wenn man auf der Arbeit nebenher Fragen beantwortet :D
  • Probleme mit Variablenabfrage

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    471 Aufrufe
    AlCalzoneA
    time ist ein String mit dem Namen des Datenpunkts var time = pfad + raum + "." + neuedatenpunkte["Timeout"].DpName; // DP Timeout to ist der konfigurierte Timeout (Zahl) var to = datenpunkte[raum].Objekt_Timeout; // Timeout-Wert lesen Und hier vergleichst du, ob der Name des Datenpunkts (String) größer oder kleiner als der Timeoutwert (Zahl) ist: if (time >= to) setState(warn, true); if (time < to) setState(warn, false); Das kann nicht funktionieren. Wenn du den Inhalt eines Datenpunkts vergleichen willst, musst du diesen vorher mit getState(datenpunktID) auslesen.
  • [Gelöst] Blockly - Ventilatorsteuerung Verständnisfrage

    Verschoben
    18
    1
    0 Stimmen
    18 Beiträge
    2k Aufrufe
    rantanplanR
    Sieht gut aus. Willkommen im Club :D
  • Cron Job startet mehrmals.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    828 Aufrufe
    L
    @ThomasD: Hallo, sieht nach dem gleichen Problem aus, ich hatte inzwischen den ioBroker mit sudo iobroker stop und start neu gestarte: ` > 0 false javascript.0 2017-12-06 18:58:00.423 1 false javascript.0 2017-12-06 18:57:00.435 0 false javascript.0 2017-12-06 18:56:00.424 1 false javascript.0 2017-12-06 18:55:00.425 0 false javascript.0 2017-12-06 18:54:00.424 1 false javascript.0 2017-12-06 18:53:00.423 0 false javascript.0 2017-12-06 18:52:00.616 1 false javascript.0 2017-12-06 18:51:00.424 0 false javascript.0 2017-12-06 18:50:00.428 1 false javascript.0 2017-12-06 18:49:00.436 0 false javascript.0 2017-12-06 18:48:00.424 1 false javascript.0 2017-12-06 18:47:00.425 0 false javascript.0 2017-12-06 18:46:00.424 1 false javascript.0 2017-12-06 18:45:00.424 0 false javascript.0 2017-12-06 18:44:00.424 ` Jetzt geht es erst einmal. Vielleicht sind meine Anderen Problem jetzt auch erst mal verschwunden :-). Schöne Grüße ThomasD ` Ok. Werde ich dann mal in Telko Reporten. Workaround ist, das Script zu stoppen - aendern- speichern - Script starten. Dann hast du das Problem nicht. Vg looxer Mobile getapt Gesendet von meinem SM-G935F mit Tapatalk
  • [Gelöst]State erstellen mit speziellen Zugriffrechten wie ???

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    474 Aufrufe
    C
    @paul53: Das sollte gehen, wenn setObject in der JS-Komfiguration freigegeben ist. ` Super! Das mit der js config habe ich natürlich überhaut nicht bedacht! Danke!
  • Wert von Somfy IO Temperatursensor in K lesen und in neues Objekt in °C schreiben

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    798 Aufrufe
    paul53P
    @ronny82: Besteht die Möglichkeit den Temperaturwert auf 1 Nachkommastelle zu runden, z.B. 20.1°C? ` setState(idTempC, Math.round(10 * (dp.state.val - 273.1)) / 10, true);
  • Alle Thermostate mit neuem Partymodus updaten

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    L
    Hi, ich beschäftige mich schon eine Zeit lang mit der Steuerung von Thermostaten. (Heizungsscript ist veröffentlicht) Beim Heizungsscript habe ich immer auf den DC geachtet. Ausschläge gibt es nur, wenn ich mehrfach hintereinander an alle Thermostate sende. Hochgerechnet au deine 26 Thermostate dürfte es bei z.B. einer Temperaturänderung nicht zu einer Überschreitung des DC kommen. (PartyMode Änderungen sind allerdings bei mir nicht vorgesehen , da das Konzept ein anderes ist)- könnte also mit längerer Sendezeit bei der Änderung des Party-Modus zusammenhängen) Aus meiner Sicht hast du die folgenden Optionen: du fügst Hardware hinzu, die den DC aufteilt. Das sind z.B. Wandthermostate, die dann mehrere Heizungsthermostate steuern müssten. Ich nehme mal nicht an, dass du 26 Räume hast. Du fügst LAN Adapter hinzu (bei nicht IP-Geräten) du versuchst software technisch den DC in den Griff zu bekommen du Gruppierst die Geräte mit der CCU (wenn es denn keine alten Thermostate sind) und sprichst dann nur jeweils ein Gerät an. Könnte aber sein, dass da ein Problem auftaucht. Ich hatte das mal mit dem Boost Modus. Der wurde zwar weitergereicht, wenn ich den Boost Modus am WT manuell bediene aber nicht per Software. Kommt auf einen Versuch an. du sendest zeitversetzt über Verzögerungen vG Looxer
  • Auf Wert triggern?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    424 Aufrufe
    P
    on({ id: 'mqtt.0.Sensor.RFID', val: 'WUNSCHWERT' }, function (data) { log("Transponder ID: " + data.state.val); }); Gruß Pix
  • Wert wird nicht gelesen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    591 Aufrufe
    K
    Danke für die ausführliche Erklärung!
  • Raumname ermitteln

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    3k Aufrufe
    R
    Nein, geht leider nicht. Ich habe meine Kanäle auch mehr als einem Raum zugewiesen. Eigentlich sollte dann ein Array mit allen Räumen zurückgeliefert werden. Gesendet von meinem A0001 mit Tapatalk
  • Frage: im Skript prüfen, ob ein Datenpunkt vorhanden ist

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    3k Aufrufe
    P
    Hallo paul53, ohne den Code zu versuchen, kann ich aber sagen, dass ich in anderen Teilen des Skriptes schon auf LEVEL_REAL reagiere. Das ist nicht das Problem. Ich zähle grundsätzlich alle Geräte, deren LEVEL_REAL sich ändern. Alle diese Geräte haben virtuelle Kanäle, die ich viel nutze. Meistens sind es drei virtuelle Kanäle, die dann verknüpft sind. LEVEL_REAL ist in jedem Kanal vorhanden, zeigt aber immer den selben Wert, nämlich das Ergebnis der Verknüpfung und damit die tatsächliche Helligkeit (bei einer Lampe). Es gibt nun aber auch Geräte, die nur den LEVEL Datenpunkt haben. Diese kann ich nicht mit dem Subscribe auf LEVEL_REAL überwachen. Daher überwache ich einmal LEVEL_REAL und einmal LEVEL. Letzteres schließt alle Geräte, die LEVEL_REAL besitzen, mit ein. Daher prüfe ich dann noch genau darauf, denn die älteren Dimmer von HM haben kein LEVEL_REAL. Hier nochmal das ganze Skript: ! ```` /* Status Zahl Lichter ! zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Licht" ! Vorraussetzung: globale Funktion deleteDuplicates() ! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564 23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt Log Ausgabe auskommentiert 05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php?f=21&t=473&start=20#p9267 24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens) 06.05.2016 Datenpunkt für Ansagen zugefügt 02.07.2016 abgeschaltet, da Fehler 03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer search statt indexOf und RegEx für Suche nach Virtuellen Kanälen 27.11.2016 Verschoben in Status Code optimiert 19.12.2016 Räume eingebaut 25.12.2016 Doppelte Einträge aus dem Raum-Array werden mit deleteDuplicates gelöscht 12.11.2017 Wenn bei Dimmern zusätzlich zu LEVEL noch der DP LEVEL_REAL vorhanden ist, wird LEVEL ignoriert 04.12.2017 Virtuelle Kanäle nun übner Kanalnummer des Objekts herausgefiltert LEVEL Datenpunkte werden nicht gezählt, wenn Gerät auch einen LEVEL_REAL hat todo: erzeugt noch Fehler, wenn kein LEVEL_REAL vorhanden: State "hm-rpc.0.FEQ0069673.1.LEVEL_REAL" not found */ var logging = false; ! var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein', idAnzahl = 'javascript.0.Status.Lichter.Anzahl', idText = 'javascript.0.Status.Lichter.Text', idRaum = 'javascript.0.Status.Lichter.Raum', idAnsage = 'javascript.0.Status.Lichter.Ansage'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter type: 'number', name: 'Anzahl aller Lichter', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der eingeschalteten Lichter', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Eingeschaltete Lichter', desc: 'Namen der eingeschalteten Lichter', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Eingeschaltete Lichter (Ansage)', desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { // Räume, in denen Lichter brennen type: 'string', name: 'Räume mit eingeschalteten Lichter', desc: 'Namen der Räume, in denen Lichter eingeschaltet sind', def: ' ', role: 'value' }); ! var cacheSelectorState = $('channelstate.id=*.STATE'); // Gewerk Licht var cacheSelectorLevel = $('channelstate.id=*.LEVEL'); var cacheSelectorLevelReal = $('channelstate.id=*.LEVEL_REAL'); ! 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('++++++ Lichter Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE 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"); // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('-------'); 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); } ++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")); //.LEVEL aus Text entfernen var raumname = getObject(id, "rooms"); var objid = obj._id; // hm-rpc.0.LEQ1234567.1.LEVEL var objid_arr = objid.split("."); if (parseInt(objid_arr[3]) <= 1 ) { // Kanalnummer kleiner gleich 1 (also keine virtuellen Kanäle) if (!getObject(objid + '_REAL')) { // <<<<<<<<<<<<<< RELEVANTE ZEILE 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); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } else if (logging) log('Gerät hat auch LEVEL_REAL Datenpunkt, daher wird LEVEL nicht gezählt.'); } else if (logging) log ('keine Zählung, da virtueller Kanal ' + objid); }); cacheSelectorLevelReal.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_REAL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL_REAL")); //.LEVEL_REAL aus Text entfernen var raumname = getObject(id, "rooms"); var objid = obj._id; // hm-rpc.0.LEQ1234567.1.LEVEL_REAL var objid_arr = objid.split("."); // ########## Abfrage ob Virtueller Kanal? if (parseInt(objid_arr[3]) <= 1 ) { // Kanalnummer kleiner gleich 1 (also keine Virtuellen Kanäle) 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); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // Ende Abfrage VK }); textRaum = deleteDuplicates(textRaum); ! // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + 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(', ')); // Räume, in denen Licht brennt } ! // 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(); }); 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 if (!getObject(obj.id + '_REAL').val ) checkDevices(); // <<<<<<<<<<<<<< RELEVANTE ZEILE }); cacheSelectorLevelReal.on(function(obj) { // bei Zustandänderung *.LEVEL_REAL 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(/( |<([^>]+)>)/ig, " "); return(rueckgabe); } ! on(idText, function (obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet'; setState(idAnsage, text); }); ! ```` Gruß Pix
  • URL Request mit Blockly

    Verschoben
    12
    1
    0 Stimmen
    12 Beiträge
    5k Aufrufe
    G
    Ich werd narrisch :D Genau so funktioniert es! Vielen, herzlichen Dank an Dutchman und AlCalzone. Ich hatte schon in vielen anderen Foren-Beiträgen den Hinweis mit setState gelesen. Ich konnte es aber nie richtig in meinem Script umsetzen (habe z.B. setState("javascript.0.Test_Objekt_JS").val = arr_test; versucht usw…). Aber jetzt habe ich es verstanden. Ich poste hier mal für alle anderen Suchenden meine Lösung. Use-Case: Meine ETA-Heizung (mit Web-Server) liefert mir auf einen URL-Request eine entsprechende Antwort als XML (siehe Beispiel oben). Ich möchte nun diese Antwort in ein (globales) Objekt speichern. Ziel ist diesen String in JS/ Blockly/ vis weiterzuverwenden. Das Objekt "javascript.0.Test_Objekt_JS" bzw. Datenpunkt habe ich in ioBroker im Reiter "Objekte" als Objekt definiert Das Script sieht so aus: var parseString = require('xml2js').parseString; var request = require('request'); arr_test = []; request('http://192.168.178.13:8080/user/var//112/10021/0/0/12000', function (error, response, body) { if (!error && response.statusCode == 200) { parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { if (err) { log("Fehler: " + err); } else { arr_test = (JSON.stringify(result.eta)); setState("javascript.0.Test_Objekt_JS", arr_test); } }); } else { log(error); } }); Kleiner Schönheitsfehler: Es erscheint im log die Warnung```` 10:52:30.773 [warn] javascript.0 at script.js.Skript1:30:15 10:52:30.778 [warn] javascript.0 at Request._callback (script.js.Skript1:20:7)
  • [Gelöst] Monitor per Scriptbefehl aufwecken. (Linux / Raspian)

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    2k Aufrufe
    T
    Hallo, so, ich denke ich hab es. Hier aber trotzdem nach meine Skripte: Javascript Adapter auf dem slave wo auch der Webbrowser läuft: schedule("* * * * *", function (obj) { var wakeup = '/opt/iobroker/wakeup.sh'; exec(wakeup); }); Da ioBroker als root läuft, braucht man den ersten Schritt nicht: > setfacl -m u:the-user:r ~/.Xauthority Hier dann das shell Skript: #!/bin/bash DISPLAY=:0 XAUTHORITY=~pi/.Xauthority xdotool mousemove 10 20 Danke und Schöne Grüße ThomasD

828

Online

32.4k

Benutzer

81.5k

Themen

1.3m

Beiträge