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
    OliverIOO
    @jwerlsdf weiter gehts mit der nächsten version. vorgehensweise wie oben. es sind ein paar mehr datenpunkte dazugekommen bitte vorher die datenpunkte anlegen. typ und detailanweisung im zeilenkommentar beachten const dp_doorstop = '0_userdata.0.omlet.doorstop'; // datenpunkt mit typ bool und rolle button anlegen und namen hier eintragen const dp_doortimeopen = '0_userdata.0.omlet.doortimeopen'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_doortimeclose = '0_userdata.0.omlet.doortimeclose'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_devicedata = '0_userdata.0.omlet.devicedata'; //// datenpunkt mit typ string, hier wird nach jeder aktualisierung der aktuelle device status abgerufen und eingetragen wenn im datenpunkt dp_doortimeopen und dp_doortimeclose etwas eingetragen wird, dann sollte die jeweilige zeit gesetzt werden. im Anschluss wird die Konfiguration gleich abgerufen und im Datenpunkt dp_devicedata abgespeichert, sowie auch dp_doortimeopen und dp_doortimeclose wieder aktualisiert der button doorstop führt die entsprechende aktion aus. um mit dem angeschlossenen gerät nicht zu viel unruhe zu erzeugen, habe ich (hoffentlich) nur die lesenden aktionen ausgeführt. die schreibenden aktionen habe ich mal ausgelassen, was aber auch mangels test zu höheren fehlerrisiko neigt. aber mal schauen. bitte möglichst genau darüber berichten // -- configuration area const token = 'apitoken'; const outdoorDeviceId = 'laTnMsWSJxBMGgJD'; const dp_light = '0_userdata.0.omlet.light'; // datenpunkt mit typ bool anlegen und namen hier eintragen const dp_door = '0_userdata.0.omlet.door'; // datenpunkt mit typ bool anlegen und namen hier eintragen const dp_doorstop = '0_userdata.0.omlet.doorstop'; // datenpunkt mit typ bool und rolle button anlegen und namen hier eintragen const dp_doortimeopen = '0_userdata.0.omlet.doortimeopen'; const dp_doortimeclose = '0_userdata.0.omlet.doortimeclose'; const dp_devicedata = '0_userdata.0.omlet.devicedata'; // -- const axios = require("axios/dist/browser/axios.cjs"); const BASE_URL = 'https://x107.omlet.co.uk/api/v1'; //kann hier geprüft werden https://smart.omlet.de/developers/api let omlet = undefined; async function connect() { console.log("start main2"); omlet = await omletAPIClient(token); await getDevices(true); //console.log(JSON.stringify(await getDevices(), null, 2)); } async function getDevices(info = false) { try { const devices = await getRequest('/device'); if (devices && info) { devices.forEach(device => { console.log(`Device name: ${device.name}, deviceId: ${device.deviceId}`); }); } return devices; } catch (error) { console.log(error); return []; } } async function getDevice(deviceId) { try { const device = await getRequest(`/device/${deviceId}`); return device; } catch (error) { console.log(error); return {}; } } async function getConfiguration(deviceId) { try { const configuration = await getRequest(`/device/${deviceId}/configuration`); return configuration; } catch (error) { console.log(error); return {}; } } async function setConfiguration(deviceId, configuration) { try { const result = await patchRequest(`/device/${deviceId}/configuration`, configuration); return result; } catch (error) { console.log(error); return {}; } } async function getDeviceInfo(deviceId) { const device = await getDevice(deviceId); setState(dp_devicedata, JSON.stringify(device, null, 2), device); setState(dp_doortimeopen, device.configuration.door.openTime); setState(dp_doortimeclose, device.configuration.door.closeTime); } async function doAction(deviceId, actionName) { const devices = await getDevices(); const device = devices.find(device => device.deviceId === deviceId); if (device) { const action = device.actions.find(action => action.actionName === actionName); if (action) { await postRequest(action.url); await getDeviceInfo(outdoorDeviceId); } } } async function lightOn(deviceId) { await doAction(deviceId, 'on'); } async function lightOff(deviceId) { await doAction(deviceId, 'off'); } async function doorOpen(deviceId) { await doAction(deviceId, 'open'); } async function doorClose(deviceId) { await doAction(deviceId, 'close'); } async function doorStop(deviceId) { await doAction(deviceId, 'stop'); } async function setDoorTimeClose(deviceId, time) { const configuration = getConfiguration(deviceId); const newConfiguration = { ...configuration, door: { ...configuration.door, closeTime: time } }; await setConfiguration(deviceId, newConfiguration); await getDeviceInfo(outdoorDeviceId); } async function setDoorTimeOpen(deviceId, time) { const configuration = getConfiguration(deviceId); const newConfiguration = { ...configuration, door: { ...configuration.door, openTime: time } }; await setConfiguration(deviceId, newConfiguration); await getDeviceInfo(outdoorDeviceId); } function omletAPIClient(token) { return axios.create({ baseURL: BASE_URL, headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, }); } function isValidTime24h(value) { return /^(?:[01]\d|2[0-3]):[0-5]\d$/.test(value); } async function getRequest(url) { try { const data = await omlet.get(url); console.debug(`get request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function postRequest(url) { try { const data = await omlet.post(url); console.debug(`post request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function patchRequest(url, data) { try { const data = await omlet.patch(url, data); console.debug(`patch request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } function watchTimeState(id, label) { on({ id: id, change: 'ne' }, async (obj) => { const newVal = String(obj.state.val || '').trim(); const oldVal = obj.oldState && obj.oldState.val != null ? String(obj.oldState.val) : ''; if (isValidTime24h(newVal)) { log(`${label}: gültige Zeit gesetzt -> ${newVal}`, 'debug'); let configuration = await getConfiguration(outdoorDeviceId); return; } log(`${label}: ungültige Zeit "${newVal}" - setze auf "${oldVal}" zurück`, 'warn'); // ungültige Eingabe zurücksetzen setState(id, oldVal); }); } async function main() { await connect(); await getDeviceInfo(outdoorDeviceId); on({ id: dp_door, change: 'ne' }, async (evt) => { //log(evt); if (evt.state.val) { await doorOpen(outdoorDeviceId); } else { await doorClose(outdoorDeviceId); } }); on({ id: dp_light, change: 'ne' }, async (evt) => { //log(evt); if (evt.state.val) { await lightOn(outdoorDeviceId); } else { await lightOff(outdoorDeviceId); } }); on({ id: dp_doorstop, change: 'any' }, async (evt) => { log(evt); doorStop(outdoorDeviceId); setState(dp_doorstop, false); }); watchTimeState(dp_doortimeopen, 'Öffnungszeit'); watchTimeState(dp_doortimeclose, 'Schließzeit'); // await lightOn(outdoorDeviceId); // await lightOff(outdoorDeviceId); let configuration = await getConfiguration(outdoorDeviceId); let a = 0; } main(); für astro hat der iobroker ja bereits ereignisse eingebaut, wenn die dann aufgerufen werden musst du dann einfach nur die Funktionen doorOpen und doorClose mit der deviceId (die in der Variable outdoorDeviceId steht) aufrufen Sind die Funktionen soweit verständlich? Brauchst du mehr Detaildokumentation für spätere Anpassungen?
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Topics
    80k Posts
    paul53P
    @Lottemann sagte: ein + als nächstes rein Addition und Multiplikation sind der 2. Mathe-Block von oben. Schritte: [image: 1773072613287-blockly_temp.jpg]
  • 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
  • #solved / Datenpunkt auslesen um Rechnung zu erstellen

    9
    3
    0 Votes
    9 Posts
    473 Views
    D
    @paul53 Das werde ich noch genauer verfolgen warum das so ist. Jetzt geht es, also mein Problem ist dank dir gelöst! Danke dir <3 Grüße und /closed Dices
  • Alexa und SSML Audio Files

    Moved
    14
    0 Votes
    14 Posts
    3k Views
    E
    @i-punkt Ich weiß, ist alt, aber wie kann man Klingeltöne für Alexa kaufen?
  • Bitte um Unterstützung beim Sprinklecontrol Adapter...

    7
    0 Votes
    7 Posts
    551 Views
    dieckfrD
    @mickym said in Bitte um Unterstützung beim Sprinklecontrol Adapter...: ben gesehen das ich da vor ein paar Wochen sogar gefragt hab, und nu war ich zu blöd den Beitrag zu finden, und da nochmal nachzuhaken. Ganz trivialer Grund... Danke Danke für den Hinweis :) Mal am Ball bleiben meistens auch :innocent: aber meistens warte ich lieber ein paar Versionsnummern ab... Die Bequemlichkeit des Alters... :)
  • Bitte um Hilfe bei Umsetzung (mit linked devices und Szenen)

    javascript scenes
    1
    0 Votes
    1 Posts
    143 Views
    No one has replied
  • Sonoff SNZB-01

    4
    1
    0 Votes
    4 Posts
    682 Views
    K
    @ingenii ok, zur Sonoff Bridge kann ich leider nichts sagen. Ich arbeite zwar auch ohne USB und über LAN aber mit einem CC2652P.
  • Fehler im Blockly Skript?

    blockly
    5
    2
    0 Votes
    5 Posts
    182 Views
    paul53P
    @surfer09 sagte: aber es wird dennoch der falsche Wecker aktiviert. Mit "squeezebox" kenne ich mich nicht aus.
  • Alte Dateien löschen

    javascript
    9
    0 Votes
    9 Posts
    638 Views
    OliverIOO
    @michihorn der befehl sieht nach linux aus. aber selbst dafür scheint da etwas zu fehlen. ich denke da müsste am anfang was mit find und noch parameter vor dem verzeichnisnamen stehen. aber wie schon gesagt. auf windows wird dir das gar nicht helfen. mit iobroker kenn ich mich nur auf linux aus.
  • Warnung im Logfile von Blockly script

    6
    3
    0 Votes
    6 Posts
    437 Views
    F
    @crunchip entschuldige, hab gestern erst wieder spät am Abend weiter suchen können. Also es funktioniert jetzt. Was ich zuerst falsch gemacht habe (anscheinend). Ich habe den Werttyp wie unten im Screenshot zu sehen, dort von String auf Number geändert. Obwohl "Number angezeigt wurde, war es trotzdem noch ein "String" Typ [image: 1629033182631-fdcc59e9-0c6f-4427-b7aa-f95f5afdae66-image.png] erst als ich den Typ hier geändert habe wurde dieser übernommen. :face_with_rolling_eyes: mein Fehler?? [image: 1629033398318-1e0fa811-d641-4d87-b74f-58d73820ba86-image.png] Vielleicht hilft das ja jemanden mal. Der Eintrag von meinem Flot Adapter war übrigends nur dieses eine mal. Ist jetzt auch weg. Vielen dank nochmal an alle. Immer wieder super wie einem hier geholfen wird
  • Senertec Dachs BHKW

    heating javascript monitoring
    20
    0 Votes
    20 Posts
    3k Views
    X
    @paul53 Ging leider auch nicht. Ich habe es jetzt mal so probiert: var request = require('request'), username = "glt", password = "", url = 'http://192.168.0.76:8080/getKeys', body = "Stromf_Ew.Anforderung_GLT.bAktiv=1&Stromf_Ew.Anforderung_GLT.bAnzahlModule=1" auth = "Basic " + new Buffer(username + ":" + password).toString("base64"); request.post({ url : url, body: body, headers : {'Authorization' : auth} }, function (error, response, body) { log('error: ' + error); log('response: ' + JSON.stringify(response)); log('body: ' + body); } es kommen folgende Logmeldungen: 12:26:13.060 info javascript.0 (129) Stop script script.js.common.Senertec.Energieanforderung_2 12:26:13.062 info javascript.0 (129) Start javascript script.js.common.Senertec.Energieanforderung_2 12:26:13.070 info javascript.0 (129) script.js.common.Senertec.Energieanforderung_2: registered 0 subscriptions and 0 schedules 12:26:13.074 info javascript.0 (129) script.js.common.Senertec.Energieanforderung_2: error: null 12:26:13.074 info javascript.0 (129) script.js.common.Senertec.Energieanforderung_2: response: {"statusCode":200,"body":"","headers":{"content-length":"0","date":"Sun, 15 Aug 2021 10:26:13 GMT"},"request":{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"192.168.0.76:8080","port":"8080","hostname":"192.168.0.76","hash":null,"search":null,"query":null,"pathname":"/getKeys","path":"/getKeys","href":"http://192.168.0.76:8080/getKeys"},"method":"POST","headers":{"Authorization":"Basic Z2x0Og==","content-length":76}}} 12:26:13.075 info javascript.0 (129) script.js.common.Senertec.Energieanforderung_2: body: Immerhin keine Fehlermeldung. Aber es tut sich leider nichts. Die gewünschte, im Handbuch beschriebene Antwort ist auch leider nicht dabei.
  • [gelöst] Alexa Silk direkt mit URL starten

    5
    0 Votes
    5 Posts
    2k Views
    liv-in-skyL
    @brainbug habe auch bewertet :-) :star: :star: :star: :star: :star:
  • Meine Zeitpläne werden nicht durchgeführt

    11
    0 Votes
    11 Posts
    735 Views
    HomoranH
    @philipp_sh sagte in Meine Zeitpläne werden nicht durchgeführt: Meine Steuerung für das Aquarium Licht funktioniert immer noch nicht. eine xml datei nutzt am Handy nix blocklys immer als scteenshots, code in code-tags ist gut, dann aber den js-code
  • Kann keinen Datenpunkt anlegen

    31
    1
    0 Votes
    31 Posts
    4k Views
    I
    @idstone Update: Der mit dem neuen Admin-GUI erstellte Switch war wohl fehlerhaft?! Nach Umschalten auf die ältere GUI klappte es nun wieder...
  • Logik für Shelly 3EM + Balkonkraftwerk

    4
    0 Votes
    4 Posts
    2k Views
    C
    Entweder du machst eigene DP und mittels JS rechnest du es aus. In der Vis kannst du dann ohne Skript machen.
  • Datenpunkte Allgemein und .....

    38
    2
    0 Votes
    38 Posts
    4k Views
    apollon77A
    So, ich habe den Thread per Link gefunden, ist ja auch hier recht "Heiss" geworden. Zu "mqtt" als "Sonderfall den man nochmal diskutieren sollte" haben wir glaube Samstag schon gerschrieben und ein GitHub Issue angelegt weil es auch in meinen Augen sinn macht hier Objekterstellung ala javascript.0/0_userdata.0 zu erlauben. Das Thema wurde im ganzen mehrere Monatigen dmin5 Beta test VON KEINEM auch nur einmal aufgebracht ... jetzt gebt uns auch paar Tage das zu lösen. Alle tief durchatmen bitte, GitHub Issue voten und Geduld haben und im Notfall über zweite Admin Instanz alte UI vorerst nutzen.
  • Restart bei fehlerhafter Verbindung Smartmeter

    3
    0 Votes
    3 Posts
    154 Views
    T
    @homoran Manchmal ist die Lösung so einfach und nah - besten Dank! PS: Installation ist etwas fummelig, aber iobroker läuft ohne Probleme auf Pi Zero W!
  • Telegram - Verlinkung auf iOS-App in Nachricht

    1
    0 Votes
    1 Posts
    183 Views
    No one has replied
  • [gelöst] mehrere setTimeouts unterbrechen?

    javascript
    5
    0 Votes
    5 Posts
    374 Views
    M
    @xenon danke für den Hinweis. Ich habe Pauls Lsg umgesetzt, war für mich in dem Moment logischer - kapiere aber auch dein Vorgehen :) Danke
  • [ Geklärt ]Welchen Datenpunkt für DWS verwenden

    blockly
    21
    2
    0 Votes
    21 Posts
    468 Views
    A
    @crunchip sagte in Welchen Datenpunkt für DWS verwenden: steht doch oben in deinem blockly drin, dieser ist doch dann logischerweise aktiv, wenn du das blockly nicht verändert hast Nein, habe ich nicht verändert. Danke für die Unterstützung Mit freundlichen Grüßen Michael
  • State-Datenpunkt über Alexa steuern?

    21
    0 Votes
    21 Posts
    2k Views
    dslraserD
    @sichreid sagte in State-Datenpunkt über Alexa steuern?: Ja, eben das war auch mein Ziel, dass dies automatisch im Skript abgedeckt ist und man im Fall der Fälle, dass man mal alles neu aufsetzen muss, nicht bei jedem Punkt den smartNamen wieder neu eintragen muss. Wie gesagt war der vorher auch gegeben, doch beim Hinzufügen zum iot wurde dieser nicht verwendet. Nun sind diese nicht nur mit den richtigen smartNamen versehen sondern ich muss diese nicht mal mit + hinzufügen sondern sind gleich automatisch da drinnen. Ich habe mir diesen Weg angewöhnt. In jedem Blockly oder Script, wo ich eigene Datenpunkte verwende, diese dann gleich mit erstellen zu lassen. Dieser Weg hat auch den Vorteil schnell mal einen anderen "Installationsort" zu vergeben. Ich nutze normalerweise 0_userdata.0 , aber zum testen dann auch mal javascript.0. Das kann man im Blockly ja schnell umstellen.
  • [Gelöst] Unifi Voucher Anzeige

    9
    0 Votes
    9 Posts
    402 Views
    draexlerD
    @jensus11 Hast du schon die Datenpunkte angelegt wie sie auch im extrahierten Blockly sind? Auch die in der JS Funktion[image: 1628351101657-bildschirmfoto-2021-08-07-um-17.44.27.png] Ich halte die Datenpunkte im 0_Userdata fest, damit ich alles an einen Ort habe.

498

Online

32.7k

Users

82.5k

Topics

1.3m

Posts