Skip to content

Skripten / Logik

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

16.6k Themen 213.6k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Themen
    49k Beiträge
    G
    @Waly_de Hi Markus, schön von Dir zu hören und vor allem sehr cool, dass Du noch aktiv bist! Ich wäre da prinzipiell dabei, kenne mich aber im iobroker Adapter Umfeld noch gar nicht aus ... ich werde den Adapter bei Gelegenheit mal ausprobieren. Eigene Änderungen (ich habe ja noch ein paar Sachen eingebaut) sind bei einem Andapter nicht so einfach möglich bzw. müssten über das Repository gemacht werden, richtig?
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    HomoranH
    @Takahara sagte in Objekt ID auf Textinhalt prüfen // Current Radio Station: Wie kann ich den Textinhalt des Objektes "Current Radio Station" was immer "Textinhalt" sein soll, wäre vermutlich "Wert von"
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Themen
    13k Beiträge
    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
  • Javascript Adapter rot

    91
    1
    0 Stimmen
    91 Beiträge
    7k Aufrufe
    GlasfaserG
    @chrisprefect .... schön das es wieder geht . :) Ein weiteres "rumbastel" wäre auch sinnlos gewesen ... deshalb habe ich auch geschrieben : @glasfaser sagte in Javascript Adapter rot: Erlich ...... nimm ein Backup .... installiere ioBroker neu und lass die Finger von root
  • Javascript Adapter rot

    21
    0 Stimmen
    21 Beiträge
    2k Aufrufe
    Thomas BraunT
    @chrisprefect sagte in Javascript Adapter rot: Was muss ich tun? Meldungen aus dem LogFile beibringen. In einem eigenen Thread.
  • (gelöst) Falsche Uhrzeit

    5
    1
    0 Stimmen
    5 Beiträge
    923 Aufrufe
    stefu87_CHS
    @wendy2702 Hab ich nun gemacht. Jetzt stimmt es auf dem NUC und in Iobroker auf dem Skript.
  • Wie kann ich Wertaktualisierungen mit Blockly überwachen?

    blockly communication
    4
    0 Stimmen
    4 Beiträge
    254 Aufrufe
    GregorSG
    Vielen lieben Dank. Werde beide Lösungen mal ausprobieren. Bleibt gesund ! Gregor
  • Softwareunterstützung für Zustandsübergangsgraphen

    9
    0 Stimmen
    9 Beiträge
    190 Aufrufe
    D
    @alcalzone Thx, habe mich da gerade zurück gehalten da ich auch den Eindruck hatte Dein Vorschlag funktioniert in die andere (Entwicklungs) Richtung. Nun bin ich happy doch noch ein paar mehr als die grauen Zellen zu haben :) Lass es mich selbstkritisch so sagen. Wenn man mit einem Mindmapper mal das Vorhaben strukturiert hat und somit das Chaos im Kopf sortiert hat, ist der Rest auch mit vorhanden Mitteln durchaus gut umsetzbar....aus meiner Sicht. Das Gefühl einen Zettel und Stift auszupacken für diese Sache hat mich nur dazu bewogen Alternativen zu suchen, da ich mir doch sehr "Oldschool" vorkam. Aber wie nicht das erste Mal, hat man erst mal Struktur geschafft, sei es auf dem Papier, lösen sich die Wolken im Kopf und der Rest ist eigentlich recht easy. Für mich als Nicht-Programmierer und eher Automatisierer sind vorhandene Boardmittel also super ausreichend und keep it simple kann auch schön sein :)
  • State offen in true konvertieren

    16
    0 Stimmen
    16 Beiträge
    1k Aufrufe
    WalW
    @robert_r , erstelle einfach ein Alias mit einer rule und nutze die in der Vis. "read": "val == 'offen' ? false : true"
  • Simatic S7 Logo

    Ungelöst
    10
    0 Stimmen
    10 Beiträge
    783 Aufrufe
    P
    @oli8x8x8x Eingänge, Ausgänge und Merker sind bei mir leer. DB sieht do aus: [image: 1641982642952-31f555c4-b25f-4856-aa30-393f5cbf701d-image.png] Im Logo-Programm sieht es so aus: (Ausschnitt) [image: 1641982762767-e8b61450-80e9-4309-90ee-fa5fc0594fc9-image.png] [image: 1641983027748-4fcf4a06-9a68-4664-9ff3-556f617cab28-image.png]
  • Telegram Bot via NFC steuern

    4
    0 Stimmen
    4 Beiträge
    690 Aufrufe
    D
    @altmann Super. Freut mich wenn ich helfen konnte...
  • Wenn Datenpunkt älter als 14 Tage, dann

    15
    0 Stimmen
    15 Beiträge
    906 Aufrufe
    Lukas VFL99L
    @oliverio @Homoran danke danke danke Hab's jetzt folgender Maßen gelöst. Muss morgen Mal gucken ob die Umrechnung in Tage passt aber die 2 Minuten funktionieren sehr gut soweit. {lastchange:0_userdata.0.Papa.Platz1.lc;wert:0_userdata.0.Papa.Platz1;((new Date()-lastchange)/1000/60) > 2 ? "#d6061f" : wert == "" ? "#FFFFF" : "#00000"}
  • Datenstruktur in iobroker Verständnissfrage

    2
    1
    0 Stimmen
    2 Beiträge
    151 Aufrufe
    arteckA
    @markusn78 wir kennen halt räume abe rnicht so wie du die brauchst..da musst du selber Hand anlegen und manuell splitten
  • Modbus Wert zu Boolean splitten

    3
    0 Stimmen
    3 Beiträge
    193 Aufrufe
    M
    @paul53 Danke für den Hinweis, ich habe mir jetzt einen passenden Flow bei Node-Red angelegt. Habe den aber nicht selber erfunden sondern nur auf meine Bedürfnisse angepasst. [ { "id": "7b93b0c.402c65", "type": "tab", "label": "Flow 2", "disabled": false, "info": "" }, { "id": "df41c583.24ff58", "type": "function", "z": "7b93b0c.402c65", "name": "word to binary", "func": "// initialize bit array to 0s\nvar bits0thru31 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];\n\nfor (i = 0; i < 32; i++){\n bits0thru31[i] = (msg.payload >> i) & 0x1;\n}\n\nvar bit0 = {payload: bits0thru31[0]};\nvar bit1 = {payload: bits0thru31[1]};\nvar bit2 = {payload: bits0thru31[2]};\nvar bit3 = {payload: bits0thru31[3]};\nvar bit4 = {payload: bits0thru31[4]};\nvar bit5 = {payload: bits0thru31[5]};\nvar bit6 = {payload: bits0thru31[6]};\nvar bit7 = {payload: bits0thru31[7]};\nvar bit8 = {payload: bits0thru31[8]};\nvar bit9 = {payload: bits0thru31[9]};\nvar bit10 = {payload: bits0thru31[10]};\nvar bit11 = {payload: bits0thru31[11]};\nvar bit12 = {payload: bits0thru31[12]};\nvar bit13 = {payload: bits0thru31[13]};\nvar bit14 = {payload: bits0thru31[14]};\nvar bit15 = {payload: bits0thru31[15]};\n\nreturn[ bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14, bit15 ];\n", "outputs": 16, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 640, "y": 400, "wires": [ [ "aa201119.796068" ], [ "8756f456.0d6bf" ], [ "6d516811.372178" ], [ "948f3ad4.183b88" ], [ "8f435811.a4be68" ], [ "cdb17f80.fac8e8" ], [ "75ff10d8.fba63" ], [ "e5d55421.de459" ], [ "86b811c3.0ac84" ], [ "e45a7d02.79caa" ], [ "b2aefbfc.aa2338" ], [ "2617a6bb.218c8a" ], [ "97ee1c07.1628" ], [ "79b46191.21538" ], [ "7e37e721.5da318" ], [ "3b04cc79.d38d54" ] ] }, { "id": "aa201119.796068", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 260, "wires": [] }, { "id": "8756f456.0d6bf", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "false", "x": 850, "y": 300, "wires": [] }, { "id": "6d516811.372178", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "false", "x": 850, "y": 340, "wires": [] }, { "id": "948f3ad4.183b88", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 380, "wires": [] }, { "id": "8f435811.a4be68", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 420, "wires": [] }, { "id": "cdb17f80.fac8e8", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 460, "wires": [] }, { "id": "75ff10d8.fba63", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 500, "wires": [] }, { "id": "e5d55421.de459", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 850, "y": 540, "wires": [] }, { "id": "e3ba4514.dd9e88", "type": "ioBroker in", "z": "7b93b0c.402c65", "name": "", "topic": "modbus.0.holdingRegisters.1.12326_MW38_OG_Stat_Kind2", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "true", "x": 280, "y": 400, "wires": [ [ "df41c583.24ff58" ] ] }, { "id": "86b811c3.0ac84", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 850, "y": 580, "wires": [] }, { "id": "e45a7d02.79caa", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 620, "wires": [] }, { "id": "b2aefbfc.aa2338", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 660, "wires": [] }, { "id": "2617a6bb.218c8a", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 700, "wires": [] }, { "id": "97ee1c07.1628", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 740, "wires": [] }, { "id": "79b46191.21538", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 780, "wires": [] }, { "id": "7e37e721.5da318", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 820, "wires": [] }, { "id": "3b04cc79.d38d54", "type": "debug", "z": "7b93b0c.402c65", "name": "", "active": true, "console": "false", "complete": "payload", "x": 850, "y": 860, "wires": [] } ] [image: 1641888092681-screenshot-2022-01-11-090115.png] Im Modbus-Adapter habe ich dann Unsigned 16bit (Little Endian) verwendet. In der Wago SPS schreibe ich auf ein %MW. Falls mal jemand diese Informationen brauchen sollte.
  • Symbole aus global scripts werden nicht aufgelöst

    8
    0 Stimmen
    8 Beiträge
    489 Aufrufe
    S
    @paul53 Danke! habe damit erst verstanden das ich es in einen anderen Ordner legen muss. Vorher hatte ich versucht das beide scrips über den Editor auf der Webplatform an zu legen. Also mit JavaScript funktioniert es jetzt. Eigendlich wollte ich aber in TypeScript programmieren und da habe ich dann noch ein bisschen länger dran gehangen. Habe es schließlich aber auch geschafft. Für alle mit ähnlichem Problem: Ich mich an dem vorletzten post in diesem Thread hier orientiert: Modulare Skripe Anstatt dann in dem neuen node module in JavaScript zu programmieren habe ich dort TypeScript über npm als dev-dependency installiert. Jetzt kann ich dort mit TypeScript programmieren, und das Ergebnis per Import in ioBroker scripteditor benutzen. Nachteil ist das ich das externe TypeScript extra nochmal compilieren und dann Adapter neu starten muss. Allerdings kann ich so auf meinem Desktop in WebStorm entwickeln und dann am ende nur die compilierten .js Dateien synchronisieren. Bin also ganz zufrieden mit der Lösung. Danke nochmal @paul53 und @Ahnungsbefreit für eure Hilfe!
  • ioBroker out - Update von mehreren States mit einer Message

    node-red javascript
    12
    0 Stimmen
    12 Beiträge
    933 Aufrufe
    mickymM
    gelöscht
  • Homematic Systemvariable ändern mit Iobroker

    21
    2
    0 Stimmen
    21 Beiträge
    1k Aufrufe
    HomoranH
    @richibln sagte in Homematic Systemvariable ändern mit Iobroker: ich weiß nicht woran das liegt das ich den EM1000 den ich im cuxd erstellt habe nicht verändern kann. ich auch nicht, solange du mir nicht die Rohdaten des Datenpunkts zeigst @richibln sagte in Homematic Systemvariable ändern mit Iobroker: ich hab schon versucht alle punkte zu Steuern aber ohne Erfolg die werte werden nicht übernommen. Glaskugelmodus: Wahrscheinlich sind das Werte, die vom Gerät geliefert werden und nicht beschreibbar sind. Wieso sollten sie auch überschrieben werden können. Das Gerät würde sie nach der nächsten Aktualisieruung ja wieder mit seinen Werten überschreiben. @richibln sagte in Homematic Systemvariable ändern mit Iobroker: muss ich halt ein Script schreiben welches mir den Verbrauch Woche , Monat und Gesamt errechnet. nicht unbedingt. Dafür gibt es den sourceAnalytics Adapter
  • Gelöst: In entfernten Datenpunkt schreiben

    javascript
    9
    0 Stimmen
    9 Beiträge
    751 Aufrufe
    M
    @sborg sagte in In entfernten Datenpunkt schreiben: @michihorn Na damit kann man arbeiten :) Das ist die Antwort der Web-Site: No connection to home Requested instance (web, admin, ...) is not started, has SSL or authentication enabled ...und dann schau dir nochmals obigen Link an was da etwas weiter unten zu erkennen ist: "No connection..." ;) Vielen Dank...hab das "@" in der Cloud Pro Bezeichnung vergessen **@**pro_giethoorn20@gmail.com Mein Testscript sieht jetzt so aus und tut was es soll: var request = require('request'); const idWind = "hm-rpc.2.00185BE98B3FCA.1.WIND_SPEED" on({ id: idWind, change: "ne" }, function () { var url="https://iobroker.pro/service/simpleApi/@pro_giethoorn20@gmail.com_xxxxxx-6x11-xxxx-bxxc-d9eaa1exxxxx/set/javascript.0.Castrop.Test?value="+getState(idWind).val; request({url : url}, function (error, response, body) { log("Änderung übertragen"); }); });
  • Blockly Skript Kalenderwochen als und Bedingung

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    B
    @paul53 oh man so einfach :) Vielen Dank
  • Netatmo Welcome und Alexa

    blockly javascript node-red communication
    18
    0 Stimmen
    18 Beiträge
    1k Aufrufe
    CinimodC
    @slipkorn_dh88 Schön das du es hin bekommen hast :+1:
  • Einzelwerte extrahieren aus MQTT-Datenpunkt

    3
    0 Stimmen
    3 Beiträge
    151 Aufrufe
    M
    @fastfoot danke, das funktioniert super
  • Datetime für VIS auswerten

    9
    0 Stimmen
    9 Beiträge
    651 Aufrufe
    P
    @init5 said in Datetime für VIS auswerten: @paul53 Sorry für die späte Antwort. Ich habe immer ein Problem mit diesen Skripten. Ich weiß nicht wie ioBroker damit umgeht, aber für meine Verständnis laufen dann die Skripte über die gesamte Dauer. Normale Skripte laufen nur 1 Mal...nämlich beim Starten des Brokers. z.B. zum Initialisieren von irgendwelchen Werten o.ä. Wenn Du jedoch einen "Trigger" einbaust, dann meldet sich Dein Skript am System bei einem Eventhandler an und sagt diesem: "Starte meine angegebene Callback-Funktion und übergieb dieser bestimmte Daten , wenn ein bestimmtes Ereignis eingetreten ist. (z.B. eine Wertänderung bei einem Knoten oder Ablauf eines Timers). Das eigentliche Skript läuft also nicht weiter sondern wartet im Hintergrund darauf, dass es vom Eventhandler erneut aufgerufen wird (nicht das komplette Skript sondern nur die jeweis übergebene Callback-Funktion). Nur als kleines Beispiel: on({id: "mqtt.0.esp32.temperature", change: "ne"}, async function (obj) { var value = obj.state.val; // hier können weitere Anweisungen innerhalb der Callback-Funktion stehen } ); bedeutet on {(Ereignis}, rufe meine asynchrone Funktion "function(obj)" auf und übergieb ihr als Parameter das Objekt, in dem das Ereignis stattfand.}) Auf dieses Objekt kann man dann innerhalb der Funktion problemlos zugreifen var value = obj.state.value; Jetzt zu Deinem eigentlichen Problem mit der Überprüfung des Temperatursensors: Wie oben gerade gesagt, reagieren die Trigger nur bei "Veränderungen" (welcher Art auch immer) und rufen entsprechende Routinen (callback-Funktionen) auf. Aber genau das hast Du ja eben nicht! Es verändert sich ja nichts... Du bräuchtest also quasi so eine Art "timeout" Funktion, die aufgerufen wird, wenn sich ein Meßwert z.B. über 8 Std nicht verändert (bzw aktualisiert) hat. Ich selber beschäftige mich jetzt erst ein paar Wochen mit dem Broker und weiß nicht, ob das Developer Team sowas evtl bereits umgesetzt (programmiert) hat Daher würde ich für so eine Überwachung auf einen Timer zurückgreifen, der alle paar Minuten überprüft, ob meine Meßdaten aktualisiert wurden oder ob z.B. ein Meßfühler ausgefallen ist. Je nach Wichtigkeit könnte dann sogar eine Alarmmeldung rausgeschickt werden (z.B. e-mail oder Telegram o.a.) Damit das aber auch im VIS angezeigt wird, würde ich mir einen User-definierten Alarm-Knoten einrichten, der nur true oder false enthält. Bsp: Neues Objekt hinzufügen: 0_userdata.0.Temperaturalarm parent: 0_userdata.0 Typ: Datenpunkt Zustandstyp: boolean Name: Temperaturalarm Wenn man diesen neuen Knoten anlegt, bekommt er vom System sofort den default-Wert: false... In diesem Knoten wird dann vom Timer regelmäßig abgelegt, ob der Messfühler noch aktiv ist (Alarm=false) ...wenn nicht, wird der Wert "true" gesetzt, was einem Alarm gleichkommt. Der Timer: interval = setInterval(async function () {}, 60000); //alle 60000 ms = 1 Min starten Jetzt nur noch die Funktion "füllen": Das Script sieht dann später so aus: var interval; // Describe this function... async function getTimeDiffMin() { var aktDateTime= new Date(); return (aktDateTime.getTime() - getState("mqtt.0.esp32.temperature").ts)/1000/60; } interval = setInterval(async function () { if (await getTimeDiffMin() >= 1) { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, true, true); } else { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, false, true); } }, 60000); oder das Blockly: [image: 1641421947498-unbenannt-2.jpg] Somit kann man im Blocly einstellen, in welchem Intervall geprüft wird und wie groß die 'Zeitspanne maximal sein darf... (jeweils in Minuten)
  • Wie Scripts mit hoher CPU-Last finden?

    5
    0 Stimmen
    5 Beiträge
    226 Aufrufe
    crunchipC
    @joergh sagte in Wie Scripts mit hoher CPU-Last finden?: Schneller geht 50% abschalten, @oxident Is ja eh auf 2 Instanzen aufgeteilt, also eine einfach mal abschalten, wäre am schnellsten

787

Online

32.7k

Benutzer

82.4k

Themen

1.3m

Beiträge