Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.1k Beiträge

NEWS

  • [gelöst]Schedule funktioniert nur minütlich

    6
    0 Stimmen
    6 Beiträge
    218 Aufrufe
    Johannes BauerstatterJ
    Oh Mann. Die Systemzeit ist eine Stunde hinter der aktuellen Zeit. Vielen Dank. Problem gelöst.
  • benötige Hilfe bei enigma2 Adapter Erweiterung

    7
    0 Stimmen
    7 Beiträge
    591 Aufrufe
    Matten MattenM
    @Scrounger Die fixe Timerprogrammierung hatte ich schon Mal mit 6 oder sogar 10 timern. Ich denke aber auch das du Recht hast die Timer Datenpunkte fest anzulegen.
  • [gelöst] Eigener DP-Aktualisierung und Status

    javascript
    3
    0 Stimmen
    3 Beiträge
    262 Aufrufe
    oberfraggerO
    @paul53 Danke! Du bist mein Held! Ich schreib gleich mal ne Anleitung. Das hilft vielleicht mal jemanden.
  • Datenpunkt in Javascript anlegen

    Verschoben
    6
    1
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    paul53P
    @plc sagte: wo kann man nachlesen Im Kernkonzept.
  • Script - Info über Datenpunkte sammeln

    javascript template
    291
    4
    5 Stimmen
    291 Beiträge
    43k Aufrufe
    crunchipC
    @liv-in-sky läuft, Problem beseitigt:+1:
  • [gelöst]HM-OU-LED16 Ansteuerung mit JS

    8
    0 Stimmen
    8 Beiträge
    966 Aufrufe
    S
    @Röstkartoffel sagte in HM-OU-LED16 Ansteuerung mit JS: @Stmiko sagte in HM-OU-LED16 Ansteuerung mit JS: Wer hat hier noch die HM-OU-LED16 im Einsatz. Hat niemand ausser mir Probleme mit dem Ding?:anguished: Ich habe diese Anzeige auch im Einsatz und es funktioniert mit dem setState("hm-rpc.2.JEQ0144601.12.LED_STATUS"/*SA_WZ_6.LED_STATUS*/, 2); der RAW Datenpunkt zeigt dieses: { "from": "system.adapter.hm-rpc.2", "ts": 1563378864957, "common": { "name": "LED Bewegung Bad oben.LED_STATUS", "type": "number", "def": 0, "min": 0, "max": 3, "read": true, "write": true, "states": { "0": "OFF", "1": "RED", "2": "GREEN", "3": "ORANGE" } }, "native": { "CONTROL": "NONE", "ID": "LED_STATUS", "TYPE": "ENUM", "UNIT": "", "DEFAULT": 0, "FLAGS": 1, "MAX": 3, "MIN": 0, "OPERATIONS": 7, "TAB_ORDER": 1, "VALUE_LIST": [ "OFF", "RED", "GREEN", "ORANGE" ] }, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "hm-rpc.2.JEQ0144601.12.LED_STATUS", "type": "state" } mein System: js-controller 1.5.14 Javascript Script Engine 3.6.5 [image: 1573568809098-%C3%BCbersicht.png] Hallo Röstkartoffel, vielen dank für Dein Feedback. Bei mir stand,warum auch immer, der MAX-Wert auf -1. Diesen habe ich jetzt, wie bei Dir, auf 3 gesetzt und es funktioniert wieder mit Zahlen. Nochmals vielen Dank für Deine Hilfe! Lg
  • [gelöst]Dimmen mit "Long Press"

    4
    0 Stimmen
    4 Beiträge
    341 Aufrufe
    ?
    Ja ich weiß, aber neues Thema wollte ich dafür nicht extra aufmachen. Und dein Beispiel funktionierte bei mir bisher wunderbar. Danke das du trotzdem geantwortet hast. Du hast es einfach drauf :-)
  • PS4 Waker Play Pause Taste Netflix/Youtube

    6
    0 Stimmen
    6 Beiträge
    267 Aufrufe
    Hermanito33H
    @Jan-Krenz Umgesetzt habe ich es noch nicht. Weil ich es auch eigentlich nicht brauche. Gehen sollte es aber eigentlich.
  • NPM-Modul dgram

    9
    0 Stimmen
    9 Beiträge
    645 Aufrufe
    paul53P
    @AlCalzone Danke. Es hätte mich auch gewundert, wenn der JS-Adapter ein nicht installiertes Modul anfordert.
  • Script für automatisches Backup funktioniert nicht

    9
    0 Stimmen
    9 Beiträge
    325 Aufrufe
    simatecS
    @hg6806 Backitup sichert mit dem Standard Backup exakt nach der gleichen Methode wie der Konsolenbefehl „iobroker backup“ Backitup greift auf genau diese Funktion des js-controllers zu.
  • [gelöst] Schleife mit getState / setState

    9
    0 Stimmen
    9 Beiträge
    646 Aufrufe
    paul53P
    @Johannes-Bauerstatter: dass die {} ausgeführt werden, nur wann? Wenn hm-rpc.1.IEQ053xxxx.1.PRESS_SHORT von 0 auf 1 geht? Was wäre wenn der Wert von False auf True geht? Die Datenpunkte PRESS_SHORT haben immer den Wert true. Bei kurzer Tastenbetätigung wird nur der Zeitstempel aktualisiert, wodurch getriggert wird.
  • [gelöst] split is not a function

    Gesperrt Gelöst javascript
    10
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    CKMartensC
    @paul53 Habe es gefunden. Ein Testscript ist noch gelaufen obwohl es im eigentlich deaktiviert gewesen sein sollte. Jetzt läuft es. Danke nochmals!
  • Hilfe bei Script für Heizungsteuerung

    17
    0 Stimmen
    17 Beiträge
    1k Aufrufe
    H
    @paul53 Hallo, nein läuft leider nicht. Der Unterschied sind die " die sind im Blockly " und im anderen Script ' und da läuft es....kann das sein?
  • [gelöst]Raspberry Shutdown aus Script

    12
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    AlCalzoneA
    @coffee-junk sagte in [gelöst]Raspberry Shutdown aus Script: denn auch der RPI-Adapter hat mit den Zugriffsrtechten seine liebe Not, kann keinen Takt etc. auslesen... Das liegt aber soweit ich weiß daran, dass der echte Root-Rechte benötigt. Da scheint selbst passwordless sudo nicht zu reichen.
  • Enigma / VU+ Statusabfrage

    15
    0 Stimmen
    15 Beiträge
    942 Aufrufe
    Matten MattenM
    @2hot4you Habs oben nochmal überarbeitet, damit das nicht kommt er legt jetzt auch ein device an und verdampft es mit dem Status.
  • Namen von Globale Variablen dynamisch zugreifen

    javascript
    2
    0 Stimmen
    2 Beiträge
    376 Aufrufe
    MarOdeM
    @MarOde Machmal kann das Glück so nahe oder nur eine Nacht Schlaf entfernt sein. Ich habe eine Lösung gefunden, die meine Code übersichtlich und lesbar macht. Wenn ich global ein leeres Objekt definiere var scRaum = new Object(); kann ich genau dieses Objekt anstelle meiner Versuche mit dem globalen Kontext später in einer beliebigen Funktion adressieren und Eigenschaften davon setzen: function setScheduler(strTimer, strSchedule) { var strName = "scTest" + strTimer; scRaum[strName] = schedule(strSchedule, DoThis); } Vieleicht hilft es dem ein oder anderen weiter.
  • Zyklische Ausführung endet nicht

    9
    2
    0 Stimmen
    9 Beiträge
    729 Aufrufe
    paul53P
    @rolf_iobroker sagte: Scheint zu funktionieren. Um zu verhindern, dass mehrere Intervalle gleichzeitig laufen können, füge vor Ausführen Intervall alle 2 Sek ein: stop zyklische Ausführung Intervall
  • Hilfe bei Timeouts JS im Klingelscript

    javascript
    6
    0 Stimmen
    6 Beiträge
    390 Aufrufe
    crunchipC
    @dslraser ich weiss was du meinst, in dem Fall schaltet aber nur telegram ein/aus[image: 1572621523474-6578b063-9fe1-44a0-956a-3a4ed2ae300a-image.png]
  • url decode eines Datenpunktes

    Verschoben javascript
    11
    0 Stimmen
    11 Beiträge
    1k Aufrufe
    nik82N
    Hallo, danke für den Threat, dadurch bin ich erstmal auf den coolen Kodi Adapter gekommen. Aber mit welchem Widget kann ich im VIS das Bild über den Datenpunkt anzeigen lassen? Habe jetzt eine Variable mit dem Namen "Kodi_Cover" mit einer Zeichenkette erstellt. Dort lasse ich den decode string reinschreiben, z.B. "http://image.tmdb.org/t/p/original/iiJcXWPfVBJXvRSSGNrMp8JuzQr.jpg" Im Vis habe ich jetzt ein Basic-Image Widget erstellt und dort als Quelle "javascript.0.Kodi_Cover" eingegeben, leider klappt das aber nicht. Vielleicht kann mir da jemand auf die Sprünge helfen. Danke im Voraus. EDIT Gefunden: [image: 1572512834472-1.jpg]
  • [gelöst] Mi Robot Map per Telegram

    Gesperrt Verschoben Gelöst
    4
    0 Stimmen
    4 Beiträge
    604 Aufrufe
    AxelF1977A
    @Meistertr sagte in Mi Robot Map per Telegram: hiermmit gehts :) createState('vis.RockroboMap', ''); var fs = require("fs"); const { createCanvas, Canvas } = require('canvas') const { Image } = require('canvas') const request = require('request'); const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; //________________________________________________________________________________________________________________________________________________ // Farben änder const COLOR_FLOOR = "#23465e"; const COLOR_WALLS = "#2b2e30"; const COLOR_PATH = "white"; //________________________________________________________________________________________________________________________________________________ //Robot Image const rocky = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAMAAAHGjw8oAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADbUExURQAAAICAgICAgICAgICAgICAgHx8fH19fX19fYCAgIGBgX5+foCAgH5+foCAgH9/f39/f35+foCAgH9/f39/f4CAgH5+foGBgYCAgICAgIGBgX9/f39/f35+foCAgH9/f39/f4CAgIODg4eHh4mJiZCQkJycnJ2dnZ6enqCgoKSkpKenp62trbGxsbKysry8vL29vcLCwsXFxcbGxsvLy87OztPT09XV1d/f3+Tk5Ojo6Ozs7O3t7e7u7vHx8fLy8vPz8/X19fb29vf39/j4+Pn5+f39/f7+/v///9yECocAAAAgdFJOUwAGChgcKCkzOT5PVWZnlJmfsLq7wcrS1Nre4OXz+vr7ZhJmqwAAAAlwSFlzAAAXEQAAFxEByibzPwAAAcpJREFUKFNlkolaWkEMhYPggliBFiwWhGOx3AqCsggI4lZt8/5P5ElmuEX5P5hMMjeZJBMRafCvUKnbIqpcioci96owTQWqP0QKC54nImUAyr9k7VD1me4YvibHlJKpVUzQhR+dmdTRSDUvdHh8NK8nhqUVch7cITmXA3rtYDmH+3OL4XI1T+BhJUcXczQxOBXJuve0/daeUr5A6g9muJzo5NI2kPKtyRSGBStKQZ5RC1hENWn6NSRTrDUqLD/lsNKoFTNRETlGMn9dDoGdoDcT1fHPi7EuUDD9dMBw4+6vMQVyInnPXDsdW+8tjWfbYTbzg/OstcagzSlb0+wL/6k+1KPhCrj6YFhzS5eXuHcYNF4bsGtDYhFLTOSMqTsx9e3iyKfynb1SK+RqtEq70RzZPwEGKwv7G0OK1QA42Y+HIgct9P3WWG9ItI/mQTgvoeuWAMdlTRclO/+Km2jwlhDvinGNbyJH6EWV84AJ1wl8JowejqTqTmv+0GqDmVLlg/wLX5Mp2rO3WRs2Zs5fznAVd1EzRh10OONr7hhhM4ctevhiVVxHdYsbq+JzHzaIfdjs5CZ9tGInSfoWEXuL7//fwtn9+Jp7wSryDjBFqnOGeuUxAAAAAElFTkSuQmCC"; const charger = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAdVBMVEUAAAA44Yo44Yo44Yo44Yo44Yo44Yo44Yo44Yp26q844Yr///9767Kv89DG9t2g8Md26q5C44/5/vvz/fjY+ei19NNV5ZtJ45T2/fmY78KP7r1v6atq6Kjs/PPi+u7e+uvM9+Gb8MSS7r+H7bhm6KVh56JZ5p3ZkKITAAAACnRSTlMABTr188xpJ4aepd0A4wAAANZJREFUKM9VklmCgzAMQwkQYCSmLKWl2+zL/Y9YcIUL7wvkJHIUJyKkVcyy+JIGCZILGF//QLEqlTmMdsBEXi56igfH/QVGqvXSu49+1KftCbn+dtxB5LOPfNGQNRaKaQNkTJ46OMGczZg8wJB/9TB+J3nFkyqJMp44vBrnWYhJJmOn/5uVzAotV/zACnbUtTbOpHcQzVx8kxw6mavdpYP90dsNcE5k6xd8RoIb2Xgk6xAbfm5C9NiHtxGiXD/U2P96UJunrS/LOeV2GG4wfBi241P5+NwBnAEUFx9FUdUAAAAASUVORK5CYII="; //last map let last_map; var canvasimg = new Canvas(); var ctximg = canvasimg.getContext('2d'); var res = {}; var img = new Image(); // Create a new Image img.src = rocky const img_charger = new Image(); img_charger.src = charger; const robotIp = "rockrobo"; // IP of the robot const robotState = "mihome-vacuum.0.info.state" // e.g : "mihome-vacuum.0.info.state" httpGetAsync("http://" + robotIp + "/api/map/latest", updateMapPage); // get actuel map data from Valetudo function httpGetAsync(theUrl, callback) { var xmlHttp = new XMLHttpRequest(); var jdata = {}; xmlHttp.onreadystatechange = function () { //console.log(JSON.stringify(xmlHttp)); if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { try { jdata = JSON.parse(xmlHttp.responseText) //console.log(JSON.stringify(jdata)); } catch (err) {} callback(jdata); } } xmlHttp.open("GET", theUrl, true); // true for asynchronous xmlHttp.send(null); } function updateMapPage(res) { var canvas = createCanvas(); var ctx = canvas.getContext('2d'); let mapImageData; var map; canvas.height = 1024 * 4 //res.image.dimensions.height; canvas.width = 1024 * 4 //res.image.dimensions.width; // Male Boden if (res.image.pixels.floor && res.image.pixels.floor.length !== 0) { ctx.fillStyle = COLOR_FLOOR; res.image.pixels.floor.forEach(function (coord) { ctx.fillRect(coord[0] * 4 + res.image.position.left * 4, coord[1] * 4 + res.image.position.top * 4, 4, 4); }); } // Male Wände if (res.image.pixels.obstacle_strong && res.image.pixels.obstacle_strong.length !== 0) { ctx.fillStyle = COLOR_WALLS; res.image.pixels.obstacle_strong.forEach(function (coord) { ctx.fillRect(coord[0] * 4 + res.image.position.left * 4, coord[1] * 4 + res.image.position.top * 4, 4, 4); }); } // Male den Pfad if (res.path.points && res.path.points.length !== 0) { ctx.fillStyle = COLOR_PATH; let first = true; let cold1, cold2; res.path.points.forEach(function (coord) { if (first) { ctx.fillRect(coord[0] / 12.5, coord[1] / 50, 2, 2); cold1 = coord[0] / 12.5; cold2 = coord[1] / 12.5; } else { ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = "#FFFFFF"; ctx.moveTo(cold1, cold2); ctx.lineTo(coord[0] / 12.5, coord[1] / 12.5); ctx.stroke(); cold1 = coord[0] / 12.5 cold2 = coord[1] / 12.5 } first = false }); } // Zeichne Roboter ctx.beginPath(); if (res.robot){ if (res.path.current_angle && typeof res.robot[0] !== "undefined" && typeof res.robot[1] !== "undefined") { canvasimg = rotateRobo(img, res.path.current_angle); ctx.drawImage(canvasimg, res.robot[0] / 12.5 - 15, res.robot[1] / 12.5 - 15, img.width, img.height); } else { ctx.drawImage(img, res.robot[0] / 12.5 - 15, res.robot[1] / 12.5 - 15, img.width, img.height); } } // Zeichne Ladestation wenn vorhanden if (res.charger){ if (typeof res.charger[0] !== "undefined" && typeof res.charger[1] !== "undefined") { ctx.beginPath(); ctx.drawImage(img_charger, res.charger[0] / 12.5 - 15, res.charger[1] / 12.5 - 15); } } // crop image let canvas_final = createCanvas(); let ctx_final = canvas_final.getContext('2d'); var trimmed = ctx.getImageData(res.image.position.left * 4, res.image.position.top * 4, res.image.dimensions.width * 4, res.image.dimensions.height * 4); canvas_final.height = res.image.dimensions.height * 4; canvas_final.width = res.image.dimensions.width * 4; ctx_final.putImageData(trimmed, 0, 0); map = canvas_final.toDataURL(); last_map= canvas_final; setState("javascript.0.vis.RockroboMap", '<img src="' + canvas_final.toDataURL() + '" /style="width: auto ;height: 100%;">'); //log('<img src="' + canvas_final.toDataURL() + '" />'); } function send(canvas){ var buf = canvas.toBuffer(); fs.writeFile("/opt/iobroker/vac_map.png", buf, (err) => { if (err) throw err; log('The file has been saved!'); }); setTimeout(function(){ // sendTo('telegram.0', '/opt/iobroker/vac_map.png'); sendTo('telegram.0', {text: '/opt/iobroker/vac_map.png', caption: 'Fertig mit saugen!'}); }, 3000); } function rotateRobo(img, angle) { var canvasimg = createCanvas(img.width, img.height); var ctximg = canvasimg.getContext('2d'); const offset = 90; ctximg.clearRect(0, 0, img.width, img.height); ctximg.translate(img.width / 2, img.width / 2); ctximg.rotate((angle + offset) * Math.PI / 180); ctximg.translate(-img.width / 2, -img.width / 2); ctximg.drawImage(img, 0, 0); return canvasimg; } schedule("*/2 * * * * *", function () { var robyState = getState(robotState).val; if (robyState === 5 || robyState === 11 || robyState === 17) httpGetAsync("http://" + robotIp + "/api/map/latest", updateMapPage); }); subscribe({ id: 'mihome-vacuum.0.info.state'/*Vacuum state*/, change: "ne" }, function (obj) { if(obj.newState.val === 8 && obj.oldState.val !== 8){ send(last_map); } }); Guten Morgen, hab´s mal flink eingebaut. Funktioniert! Großartig. Vielen Dank für die schnelle Hilfe!

654

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge