Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 48.9k Beiträge

NEWS

  • Log Error aus Script: Read-only state ... written without...

    5
    0 Stimmen
    5 Beiträge
    213 Aufrufe
    M
    @rtwl Zeilen 268 - 276 müssten auch angepasst werden. Bei einigen steht noch: 'write':false
  • Datenpunkt der über Google Assistant abfragbar ist

    3
    0 Stimmen
    3 Beiträge
    134 Aufrufe
    Marcus 1M
    @marcus-1 Das Problem wurde gelöst: https://forum.iobroker.net/topic/62890/google-assistant-soll-string-aus-datenpunkt-ansagen
  • Daten jede Stunde in JSON schreiben

    4
    1
    0 Stimmen
    4 Beiträge
    358 Aufrufe
    A
    @chris76e sorry, falsch verstanden. Das kommt davon, wenn man schnell am Handy liest und dabei mit der Enkelin spielt 🙄
  • immer wieder Problem mit "is not defined"

    13
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    Thorsten MissenbergerT
    hab jetzt mal einen neuen Container mit ioBroker aufgesetzt. Hier geht das script ohne Fehlermeldungen. Auch das HueScript macht keine Probleme. Ich habe jetzt schon den Javascript-Adapter gelöscht und wieder installiert. Brachte nix und was komisch war, das alles Scripte wieder da waren. Kann man das nicht komplett löschen? Will jetzt nicht alles neu aufsetzen aus dem Backup, da ich Vermute, das das den Fehler mitschleift, da ich das Problem schon auf dem NUC hatte und jetzt im Proxmox auch.
  • await is only valid in async functions ...

    26
    0 Stimmen
    26 Beiträge
    1k Aufrufe
    W
    @codierknecht Richtig, ist aber ein Punkt den ich an der Stelle ignoriere. Warum? Die Schleife die alle X Minuten (Aktuell 10) einen neuen Wert würfelt berücksichtigt den Zeitplan. Der "falsche" Wert greift also maximal für die Schlafzeit des Scriptes. Für mich verkraftbar.
  • Button Alle Lichter aus Logik+Vis (hqwidgets+inventwo)

    13
    3
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    FuchsbauF
    @iobit Ja, auch ich habe mir diesen Adapter erste zu Weihnachten etwas genauer angeschaut und bin begeistert. [image: 1675966585452-36c2d0b7-19bd-4f1a-b364-677f319ce2c5-image.png]
  • [Gelöst] Funktion wird scheinbar nicht ausgeführt

    15
    0 Stimmen
    15 Beiträge
    308 Aufrufe
    CodierknechtC
    @wolfgangfb sagte in [Gelöst] Funktion wird scheinbar nicht ausgeführt: Nein, ich habe eben seit über 20 Jahren fast nichts anderes mer als Delphi (mit meinen Einstellungen) gemacht und fange jetzt mer oder weniger mit Javaskript an. Willkommen im Club. Was ich mir partout nicht abgewöhnen kann ist die Mischung aus englischen und deutschen Bezeichnungen. Bei mir steht auch überall GetNewAuftragsnummer oder SaveVersandauftragToDB :grin:
  • ns panel lovelace ui

    Ungelöst
    7
    0 Stimmen
    7 Beiträge
    553 Aufrufe
    T
    @venice alles klar. löschen kannst du kein Post, nur bearbeiten.
  • Shutdown remote linux raspi

    2
    0 Stimmen
    2 Beiträge
    269 Aufrufe
    mickymM
    @rupobk 1. Musst Du die ssh keys im Homeverzeichnis des jeweiligen Users einrichten und 2. Wenn Dein Script läuft, läuft es mit dem User iobroker, wenn Du die Befehlszeile aufmachst mit dem User, mit dem Du Dich angemeldet hast. Du musst also den User iobroker auch auf dem Zielsystem die entsprechenden Rechte einrichten.
  • HTML-Table für VIS oder Iqontrol (js und blockly)

    javascript template blockly
    295
    23
    10 Stimmen
    295 Beiträge
    72k Aufrufe
    liv-in-skyL
    hier geht es weiter mit fuelpricemonitor https://forum.iobroker.net/post/942817
  • JS - setState - von Syntax keine Ahnung :disappointed:

    5
    1
    0 Stimmen
    5 Beiträge
    179 Aufrufe
    metaxaM
    @paul53 Funktioniert auf den ersten Blick, danke. Somit kann ich mir den ganzen Schmarren mit "Alias" sparen. Lediglich die Warnmeldung stört mich: [image: 1675719570974-36fac489-0a4e-483b-9678-17d3f7023949-image.png] MEIN DP ist string, ich erwartete ursprünglich string. Kurzer Hand auf Number umgestellt und schon funktioniert es :-) Wieder einmal lieben Dank @paul53 !
  • Timestamp - Welches Format für DP?

    11
    0 Stimmen
    11 Beiträge
    292 Aufrufe
    haus-automatisierungH
    @paul53 sagte in Timestamp - Welches Format für DP?: In den Datenpunkt wird die UTC-Zeit geschrieben. Erzeuge einen String mit der lokalen Zeit mittels new Date().toLocaleString() Dann aber bitte nicht role: date setze, weil dann versucht z.B. der Admin das zu parsen / gibt den Inhalt an new Date(). Und bei einem Deutschen Datumsformat geht das oft schief. Sonst lieber als UTC-String oder halt als Timestamp (s.o.).
  • Sleep bei Ereignis unterbrechen

    3
    0 Stimmen
    3 Beiträge
    122 Aufrufe
    haus-automatisierungH
    Beispiel (ungetestet): const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); async function sleep(ms) { return new Promise(resolve => { const timeout = setTimeout(resolve, ms * 1000); eventEmitter.on('cancel', () => { clearTimeout(timeout); resolve(); }); }); } on({ id: ...}, () => { eventEmitter.emit('cancel'); }); Eventuell wäre es schlauer mit .once() und/oder .removeAllListeners() zu arbeiten. Aber einfach mal rumspielen. Reicht das als Denkanstoß? const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); async function sleep(ms) { return new Promise(resolve => { let timeout = undefined; timeout = setTimeout(() => { timeout = undefined; eventEmitter.removeAllListeners('cancel'); resolve(); }, ms * 1000); eventEmitter.once('cancel', () => { if (timeout) { clearTimeout(timeout); } resolve(); }); }); } on({ id: ...}, () => { eventEmitter.emit('cancel'); });
  • Problem mit CompareTime()

    2
    0 Stimmen
    2 Beiträge
    88 Aufrufe
    paul53P
    @wolfgangfb sagte: Ursache dafür nennen? Mit vorgegebener Zeit funktioniert es offenbar nicht über den Tageswechsel. So funktioniert es: var NowDate = new Date(); if (compareTime("18:00", "19:00", "not between", NowDate)){ console.log("Ja"); }
  • Shelly EM3

    9
    0 Stimmen
    9 Beiträge
    614 Aufrufe
    I
    @paul53 Danke ich werde es mal so versuchen. Ja liefert er, aber ich möchte den Gesamtverbrauch abzüglich dem Kellerverbrauch. Damit ich den Verbrauch für den Wohnbereich habe und den vom Keller für Waschmaschine usw.
  • [gelöst] Shelly Überwachungs-Skript: Frage zu Trigger

    6
    1
    0 Stimmen
    6 Beiträge
    583 Aufrufe
    K
    @wobbix Spoiler function shelly(obj) { //Devices-Anzahl erstellen if(!existsState('0_userdata.0.shelly-devices.Anzahl')){ createState('0_userdata.0.shelly-devices.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Devices', type: 'number'}); }; //Sortierung erstellen if(!existsState('0_userdata.0.shelly-devices.Sortierung')){ createState('0_userdata.0.shelly-devices.Sortierung', 0, {name: 'Sortierung',type: "number", def: 0, states: {0:"Name",1:"IP",2:"Raum",3:"Update",4:"Gereat",5:"Status",6:"Uptime"}}); }; var counter = 0; var status_counter = 0; var offline_devices = 0; let list_of_devices = []; var cacheSelector = $('[id=shelly.0.*.name]'); counter = counter+1; cacheSelector.each(function(id, i) { var id = id.replace('.name',''); geraetename = getState(id + ".name").val; devicename = id devicenameName = devicename.replace('shelly.0.',''); //Gerätetatus var connected = getState("shelly.0." + devicenameName + ".online").val; if(connected == true) {var status = 1} else{var status = 0} //IP-Adresse var ip = getState("shelly.0." + devicenameName + ".hostname").val; //Raum if(geraetename.indexOf("_AZ_") > 0 ){ raum = "Ankleide";} if(geraetename.indexOf("_BZ_") > 0 ){ raum = "Badezimmer";} if(geraetename.indexOf("_BR_") > 0 ){ raum = "Buero";} if(geraetename.indexOf("_FL_") > 0 ){ raum = "Flur";} if(geraetename.indexOf("_GA_") > 0 ){ raum = "Garten";} if(geraetename.indexOf("_KE_") > 0 ){ raum = "Keller";} if(geraetename.indexOf("_KZ_") > 0 ){ raum = "Kinderzimmer";} if(geraetename.indexOf("_KU_") > 0 ){ raum = "Kueche";} if(geraetename.indexOf("_SZ_") > 0 ){ raum = "Schlafzimmer";} if(geraetename.indexOf("_WZ_") > 0 ){ raum = "Wohnzimmer";} if(geraetename.indexOf("Test") > 0 ){ raum = "Test";} //Typ var geraet = getState("shelly.0." + devicenameName + ".id").val; if(geraet == 'shelly1') {geraet = 'Shelly 1';} if(geraet == 'shelly1pm') {geraet = 'Shelly 1 PM';} if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';} if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';} if(geraet == 'shellyplug') {geraet = 'Shelly Plug';} if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';} if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';} //Infos abfragen if(status == 1 ) { var status = "1" //Uptime var uptime = getState("shelly.0." + devicenameName + ".uptime").val; var tage = Math.floor(uptime / (24*3600)); var stunden = Math.floor((uptime % (24*3600))/3600); var minuten = Math.floor((uptime % (3600))/60); //var sekunden = Math.floor(uptime % 60); if (stunden < 10) {stunden = "0"+stunden}; if (minuten < 10) {minuten = "0"+minuten}; if (tage == 1) {uptime = tage.toString()+" Tag, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";}; if (tage != 1) {uptime = tage.toString()+" Tage, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";} //var gereat = gereat.charAt(0).toUpperCase() + gereat.slice(1); //Power if(geraet != "Shelly RGBW 2") { var power = getState("shelly.0." + devicenameName + ".Relay0.Switch").val; } else{ var power = getState("shelly.0." + devicenameName + ".lights.Switch").val; } //Verbauch if(geraetename.startsWith("SD_")){ var verbrauch = getState("shelly.0." + devicenameName + ".Relay0.Power").val; //verbrauch = Number(verbrauch); } else{var verbrauch = 0;} //Update var update = getState("shelly.0." + devicenameName + ".firmware").val; if(update == true) {update = "veraltet"} else{update = "aktuell"} if(!(update)) {update = ""} //Version var version = getState("shelly.0." + devicenameName + ".version").val; //Shelly Plus 1 if(geraet == 'Shelly Plus 1') { //Version in String konverteiren version = String(version); //Suchen vom Slash in der Version indexslash = version.indexOf('/'); //Funktion zum Suchen des - in der Versionsnummer function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;} //Minus in der Versionsnummer suchen position = getPosition(version, '-', 2); //Version auslesen version = version.substring(indexslash +1, position); } //normale Shellys else{ //Version in String konverteiren version = String(version); //Suche vom v in Version indexv = version.indexOf('v'); //Funktion zum Suchen des 2. Punktes in der Versionsnummer function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;} //2. Punkt in der Versionsnummer suchen position_punkt = getPosition(version, '.', 2); //Version auslesen if(position_punkt < 25){version = version.substring(indexv +1, position_punkt +2);} else{ position_bindestrich = getPosition(version, '-', 2); version = version.substring(indexv +1, position_bindestrich); } } } if(status == false){ var status = "0" var uptime = "" var version = "" //var ip = "" //var geraet = "" var power = false var update = "" var verbrauch = 0 offline_devices = offline_devices+1; } //Alle Werte eines Gerätes in JSON schreiben list_of_devices.push({"DeviceName": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Geraet": geraet, "Power": power, "Update": update, "Raum": raum, "Verbrauch": verbrauch}); }); //JSON sortieren var sortierung = getState("0_userdata.0.shelly-devices.Sortierung").val; //Nach Namen sortieren if(sortierung == 0){ list_of_devices.sort((a, b) => { return a.DeviceName.localeCompare(b.DeviceName); }); }; //Nach IP sortieren if(sortierung == 1){ list_of_devices.sort((a, b) => { return a.IP.localeCompare(b.IP); }); }; //Nach Raum sortieren if(sortierung == 2){ list_of_devices.sort((a, b) => { //return a.Raum.localeCompare(b.Raum); return a.Raum.localeCompare(b.Raum) || a.DeviceName.localeCompare(b.DeviceName); }); }; //Nach Gerätetyp sortieren if(sortierung == 3){ list_of_devices.sort((a, b) => { return a.Geraet.localeCompare(b.Geraet) || a.DeviceName.localeCompare(b.DeviceName); }); }; //Nach Firmware sortieren if(sortierung == 4){ list_of_devices.sort((a, b) => { return a.Version.localeCompare(b.Version) || a.DeviceName.localeCompare(b.DeviceName); }); }; //Nach Status sortieren if(sortierung == 5){ list_of_devices.sort((a, b) => { return a.Status.localeCompare(b.Status) || a.DeviceName.localeCompare(b.DeviceName); }); }; //Nach Uptime sortieren if(sortierung == 6){ list_of_devices.sort((a, b) => { return a.Uptime.localeCompare(b.Uptime) || a.DeviceName.localeCompare(b.DeviceName); }); }; //console.log(list_of_devices) //Inhalt aus JSON in DPs schreiben counter = 0; list_of_devices.forEach(device => { //Device Counter counter = counter+1; // Device-Name dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Device-Name"; createState(dp, 'empty', { name: 'Device-Name', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.DeviceName, 800); // Uptime dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Uptime"; createState(dp, 'empty', { name: 'Uptime', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Uptime, 800); // Status dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Status"; createState(dp, 'empty', { name: 'Status', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Status, 800); // Version dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Version"; createState(dp, 'empty', { name: 'Version', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Version, 800); // IP dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".IP"; createState(dp, 'empty', { name: 'IP', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.IP, 800); // Gereatetyp dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Geraet"; createState(dp, 'empty', { name: 'Geraet', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Geraet, 800); // Power dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Power"; createState(dp, 'empty', { name: 'Power', desc: '', type: 'boolean', role: '',read: true, write: true }); setStateDelayed(dp, device.Power, 800); // Verbrauch dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Verbrauch"; createState(dp, 'empty', { name: 'Verbrauch', desc: '', type: 'number', role: '',read: true, write: true }); setStateDelayed(dp, device.Verbrauch, 800); // Update dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Update"; createState(dp, 'empty', { name: 'Update', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Update, 800); // Raum dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Raum"; createState(dp, 'empty', { name: 'Raum', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, device.Raum, 800); // Raum }); // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), da der Shelly von der Druckerbeleuchtung nicht immer an ist var shellyrgbw2 = getState("shelly.0.SHRGBW2#A89CF7#1.online").val; if(shellyrgbw2 == false) {offline_devices = offline_devices -1}; // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), wenn der Pool abgebaut ist (Letzte Änderung Leistung > 12h) var whirlpool_power_last_change = getState("alias.0.Garten.SD_GA_Whirlpool.POWER").lc; var date1 = new Date(whirlpool_power_last_change); var date2 = new Date(); var diff = date2.getTime() - date1.getTime(); var stunden = Math.floor(diff / (1000 * 60 * 60)); if(stunden > 0){offline_devices = offline_devices -1;} //Gesamt Anzahl der online Geräte berechnen dp="0_userdata.0.shelly-devices.Anzahl"; createState(dp, 'empty', { name: 'Anzahl', desc: '', type: 'number', role: '',read: true, write: true }); setStateDelayed(dp, counter, 800); //Letzte aktualisierung var datum = new Date(); var heute = datum.getDate()+ "." + (datum.getMonth()+ 1)+"." + datum.getFullYear()+" " +datum.getHours() +":" + datum.getMinutes() +":" + datum.getSeconds() + " Uhr" ; createState('0_userdata.0.shelly-devices.Letztes_Update', 0, { name: 'Letztes_Update', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed('0_userdata.0.shelly-devices.Letztes_Update', heute, 800); //Alle Geräte online if(status_counter == counter) { dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden"; createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, "1", 800); } else{ dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden"; createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); setStateDelayed(dp, "0", 800); } //Anzahl offline Geräte dp="0_userdata.0.shelly-devices.Anzahl_offline_Devices"; createState(dp, 'empty', { name: 'Anzahl_offline_Devices', desc: '', type: 'number', role: '',read: true, write: true }); setStateDelayed(dp, offline_devices, 800); } //Trigger definieren schedule("* * * * *", shelly); on({ id: "0_userdata.0.shelly-devices.Sortierung" }, shelly); $('shelly.0.*.online').on(shelly); shelly();
  • Change / Parse Wert Feld

    8
    1
    0 Stimmen
    8 Beiträge
    674 Aufrufe
    Gernot TaussG
    @codierknecht Thanx....Jetzt passts...vielen Dank für deine Hilfe
  • IoBroker-Logging abschalter per Skript

    javascript
    2
    0 Stimmen
    2 Beiträge
    264 Aufrufe
    paul53P
    @do1osc sagte: Logging aller Adapter und dem Iobroker kurzzeizig ( 5 Min.) abzuschalten. Man kann den Log-Level auf höchstens "error" hochsetzen, was wahrscheinlich nicht hilft. Besser, man deaktiviert die Instanzen (außer "admin.0" und "javascript.0"). Das Beispiel zu extendObject() zeigt, wie es geht.
  • Mit RegEX einen Ordner ausschließen

    4
    0 Stimmen
    4 Beiträge
    256 Aufrufe
    Ben1983B
    @asgothian Ich habe es schon so versucht.... const idAnwesenheit = /^fb-checkpresence\.0\.familyMembers\..*?\.presence/; und gehofft, dass dann nur bis zu ersten auftretenden "." gesucht wird. Aber leider macht er das nicht. (Auch Unterordner werden subscribt).
  • MQTT -> {Value: XX} im Wert

    18
    0 Stimmen
    18 Beiträge
    2k Aufrufe
    Gernot TaussG
    @seeandfeel Hi, könntest du mir das ganze Script schicken? lg

669

Online

32.6k

Benutzer

82.3k

Themen

1.3m

Beiträge