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
    D
    Danke habe ich gemacht. ( 1punkt) Die Objekt-ID "aktuell erzeugte Energie" wäre bei mir: Objekt-ID: 0_userdata.0.Charge_Control.Allgemein.IstPvErtragLM0_kWh plus Objekt-ID: 0_userdata.0.Charge_Control.Allgemein.IstPvErtragLM1_kWh (zusatz WR) wie kann ich das bewerkstelligen?
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    paul53P
    @Duffy sagte: Kannst du mir bitte saen warum das nicht geht? Nein, für das Verhalten der BWM habe ich keine Erklärung. @Duffy sagte in Licht geht nicht mehr aus nach austausch Steckdose -> Birne: sage Alexa Licht Arbeitsplatte aus Hast du dann die Küche bereits verlassen?
  • 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
  • Sprachausgabe Alexa / Blockly

    Verschoben
    20
    1
    0 Stimmen
    20 Beiträge
    12k Aufrufe
    P
    @dslraser ich habe den Adapter aktualisiert auf 3.9.2 war noch die ältere Version drauf. Unter Status am Adaptor sehe ich, dass Verbunden mit Host: falsch , Lebenszeichen: falsch, Verbunden mit alexa2: wahr. Habe den Adaptor mehrmals neu gestartet. Kurz nach dem Start geht alles auf grün dann wieder die beiden oberen Indikatoren auf rot. Hmmm. Vielen Dank für Unterstützung. Ich habe den Adapter gelöscht und neu installiert. Adapter funktioniert wieder und die Sprauchausgabe ebenfalls.
  • skript problem mit BWM und lampen

    12
    4
    0 Stimmen
    12 Beiträge
    395 Aufrufe
    paul53P
    @wurzeldoktor sagte: wie mache ich es dann beim ersten am besten? Genauso mit "wurde geändert". Man kann sich den Umweg über den zusätzlichen Datenpunkt "Bewegung erkannt" sparen: [image: 1633802304267-bild_2021-10-09_195823.png]
  • Datenpunkte für Alexa erstellen

    3
    4
    0 Stimmen
    3 Beiträge
    469 Aufrufe
    C
    @cinimod Danke Funktioniert
  • Tesla Adapter - aufwecken

    1
    0 Stimmen
    1 Beiträge
    129 Aufrufe
    Niemand hat geantwortet
  • Thread-Geräte in ioBroker integrieren

    Gesperrt
    7
    0 Stimmen
    7 Beiträge
    538 Aufrufe
    I
    @homoran Stimmt, da war was, sorry! Leider hat sich allerdings nicht wirklich viel getan. Ich will nicht „meckern“, kann programmiertechnisch leider nichts beisteuern, aber eine Integration von Thread-fähigen Geräten (z.B. von „Eve“) wäre als erster Schritt im „Matter-Thema“ doch nicht verkehrt?
  • Farbwechsel: Script für verschiedene LED Lampen erstellen?

    2
    0 Stimmen
    2 Beiträge
    261 Aufrufe
    CinimodC
    @vocaris klar machbar ist das. erstell dir einen Datenpunkt den du mit Alexa ansprechen kannst, und nimmst den als trigger in wie fern du die farben wechseln willst weiß ich nicht, kenne die Standart Szenen nicht
  • Einschalt-Grund Lampe

    blockly
    3
    0 Stimmen
    3 Beiträge
    301 Aufrufe
    MrDJSageM
    Du könntest dir auch per InfluxDB / Grafana etc. die Uhrzeit und oder das Einschaltverhalten deiner anderen Geräte loggen / visualisieren. Damit kannst du ggf. eine Korrelation feststellen. Zum Beispiel die Terrasse geht immer an, wenn du das Bad Licht an machst etc.
  • Fehlermeldung Javascript in Verbindung mit Wallpanel / MQTT

    3
    1
    0 Stimmen
    3 Beiträge
    280 Aufrufe
    Thomas JansenT
    @paul53 Oh Sorry, betrifft diesen Post: https://forum.iobroker.net/topic/37134/script-wallpanel-mqtt-daten-interpretieren ganz unten ist das Script /* *** MduiUpdateWallpanelMQTT Die Android-App "Wallpanel" bietet, ähnlich wie Fully Kiosk Browser, die Möglichkeit Web-Seiten als Vollbild darstellen zu lassen. Weiterhin kann sie Sensorwerte des Android-Devices via MQTT Client an einen MQTT Broker übertragen. Wenn unter iobroker der Adapter "MQTT Broker/Client" installiert und als Broker (Server) konfiguriert wurde, kann dieser die MQTT Medlungen empfangen und speichert sie z.B. unter mqtt.0.wallpanel.<devicename> ab. Bsp: mqtt.0.wallpanel.<devicename>.sensor.batterie = {"value":51,"unit":"%","charging":false,"acPlugged":false,"usbPlugged":false} mqtt.0.wallpanel.<devicename>.sensor.light = {"value":80,"unit":"lx","id":"EPL_SENSOR ALS\/PS EPL_SENSOR"} . Diese Daten kann man in derForm in der vis nicht direkt weiter verwenden, sondern die JSON Angaben müssen erst in eigene States überführt werden. Diesen Zweck erfüllt dieses Script. Es erzeugt aus dem obigen Beispiel die Struktur/States: . 0_userdata.0.mdui.wallpanel.<devicename>.sensor.batterie.value = 51 0_userdata.0.mdui.wallpanel.<devicename>.sensor.batterie.unit = "%" 0_userdata.0.mdui.wallpanel.<devicename>.sensor.batterie.charging = false 0_userdata.0.mdui.wallpanel.<devicename>.sensor.batterie.acPlugged = false usw. . Diese können in der vis direkt verwendet werden. Weiterhin richtet es einen subscriber auf die MQTT States ein und hält die selbst erzeugten States aktuell. . . **** Voraussetzungen (a) Android Device mit installierter App "Wallpanel" und dort konfiguriertem MQTT Client. (b) Installierter Adapter "MQTT Broker/Client" in IOBroker . **** Installation Einfach als serverseitiges Script installieren und starten. Beim 1.Start werden die notwendigen States erzeugt und es findet automatisch ein erneuter Start nach 10 Sek statt. Erst nach diesem 2.Start instanziiert das Script die Event-Handler und läuft dann. . **** Konfiguration Eigentlich ist keine notwendig. Optional im Absatz KONFIGURATION vornehmen . **** Tipps zur Wallpanel-App * Zum Steuern der Wallpanel-App: iobroker Adapter "Wallpanel" (https://forum.iobroker.net/topic/36438/test-adapter-wallpanel/10) * "Camera on" nur, wenn das Android Device eine Stromversorgung hat * die "Bildschirm-Ausschaltzeit" kann nicht kürzer als die unter Android eingestellte sein; also die auch verringern; wirkt sich auch auf "screenOff" aus * . . **** Lizenz (c) 2020 by UH, MIT License, no warranty, use on your own risc . *** Changelog 2020.09.26 UH * Geburt */ // ------------------------------------------------------------------------------------- // KONFIGURATION // ------------------------------------------------------------------------------------- // state-Pfad unter dem die States angelegt werden sollen const CONFIG_STATE_PATH = '0_userdata.0.mdui.wallpanel'; // zu überwachender MQTT Pfad const CONFIG_MQTT_PATH = 'mqtt.0.wallpanel'; // ------------------------------------------------------------------------------------- // MduiBase // ------------------------------------------------------------------------------------- class MduiBase { constructor() { this.init(); } // init() { // const this.DEBUG = false; this.VERSION = '1.0/2020-01-01'; this.NAME = 'mduiBase'; this.STATE_PATH = '0_userdata.0.mdui.base.'; this.STATE_UNKNOWN = 0; this.STATE_INSTALLING = 10; this.STATE_INSTALLED = 11; this.STATE_STARTING = 20; this.STATE_STARTED = 21; this.STATE_STOPPING = 30; this.STATE_STOPPED = 31; // var this.installed = false; this.states = []; this.state = this.STATE_UNKNOWN; this.subscribers = []; this.schedulers = []; this.doInit(); // init der states this.states.push( { id:'version', common:{name:'installed script-version', write:false, def:this.VERSION} } ); } // // start the script/class // start() { // beim 1.Start nur die States erzeugen if ( !this.existsState("version") || (this.getState('version').val!=this.VERSION) ) { for (let s=0; s<this.states.length; s++) { this.createState( this.states[s].id ); } this.logWarn('first script start, creating states for version '+this.VERSION+', automatic restarting script again in 10 sec ...'); setStateDelayed(this.STATE_PATH + 'version', this.VERSION, 3000); setTimeout( this.start.bind(this), 10000 ); this.state = this.STATE_INSTALLED; return; } switch (this.state) { case this.STATE_UNKNOWN : ; case this.STATE_INSTALLING : ; case this.STATE_INSTALLED : ; case this.STATE_STOPPED : { this.state = this.STATE_STARTING; if (this.doStart()) { this.log('script started'); this.state = this.STATE_STARTED; } break; } case this.STATE_STARTING : ; case this.STATE_STARTED : { this.logWarn('script already starting/started'); break; } case this.STATE_STOPPING : { this.logWarn('script is stopping, pls start later again'); break; } } } // // stop the script/class // stop() { switch (this.state) { case this.STATE_STARTED : { this.state = this.STATE_STOPPING; if (this.doStop()) { for (let i=0; i<this.subscribers.length; i++) if (this.subscribers[i] !== undefined) unsubscribe( this.subscribers[i] ); this.subscribers = []; for (let i=0; i<this.schedulers.length; i++) if (this.schedulers[i] !== undefined) clearSchedule( this.schedulers[i] ); this.schedulers = []; this.state = this.STATE_STOPPED; this.log('script stopped'); } break; } default : { this.log('cant stopp script, because not startet'); } } } // --------------------- virtual functions, overwrite it doInit() { return true; } doStart() { return true; } doStop() { return true; } // --------------------- helper functions logDebug(msg,func='') { if (this.DEBUG) console.log(`[${this.NAME}.${func}] ${msg}`); } log(msg,func='') { console.log(`[${this.NAME}.${func}] ${msg}`); } logWarn(msg,func='') { console.warn(`[${this.NAME}.${func}] ${msg}`); } logError(msg,func='') { console.error(`[${this.NAME}.${func}] ${msg}`); } // einen on-Handler registrieren subscribe( handler ) { this.subscribers.push( handler ); } // einen timer registrieren schedule( handler ) { this.schedulers.push( handler ); } // über den $-Operator nachsehen, ob der state bereits vorhanden ist // getState().notExists geht auch, erzeugt aber Warnmeldungen! existsState(id) { return existsState(this.STATE_PATH + id); // return ( $(this.STATE_PATH+id).length==0?false:true); } // wrapper, adds statepath to state-ID getState(id) { return getState(this.STATE_PATH + id); } // like setState(), but adds statepath to state_ID and checks if state exists, when not, creates it setState(id,value) { if ( !this.existsState(id) ) this.createState(id,value,undefined); else setState( this.STATE_PATH + id, value); } // like cresteState(), but adds statepath to state_ID and checks if state exists, when not, creates it createState(id,value,common) { if ( !this.existsState(id) ) { if (common===undefined) { // id im states-Array suchen for (var i=0; i<this.states.length; i++) { if (this.states[i].id==id) { if (this.states[i].hasOwnProperty('common')) common = this.states[i].common; break; } } } if ( (typeof value === 'undefined') && (typeof common !== 'undefined') && (common.hasOwnProperty('def'))) value = common.def; // unter "0_userdata.0" let obj = {}; obj.type = 'state'; obj.native = {}; obj.common = common; setObject(this.STATE_PATH + id, obj, (err) => { if (err) { this.log(`cant write object for state "${this.STATE_PATH}${id}": ${err}`); } else { this.log(`state "${this.STATE_PATH}${id}" created`); } }); setTimeout( setState, 3000, this.STATE_PATH + id, value ); } } // true, if str contains filter string or regexp fitsFilter(str, filter) { if ( (filter===undefined) || !filter || (filter=='') ) return true; if ( filter instanceof RegExp ) { if (str.match( filter ) != null) return true; } else if (typeof filter == 'string') { if(str.includes(filter)) return true; } return false; } // escapeRegExp(str) { return str.replace(/[.*+?^${}()|[]\]/g, '\\$&'); } } // ------------------------------------------------------------------------------------- // MduiUpdateWallpanelMQTT // ------------------------------------------------------------------------------------- class MduiUpdateWallpanelMQTT extends MduiBase { constructor() { super(); } // init doInit() { super.doInit(); // const this.DEBUG = false; this.VERSION = '1.0/2020-09-26'; this.NAME = 'mduiUpdateWallpanelMQTT'; this.STATE_PATH = CONFIG_STATE_PATH; this.MQTT_PATH = CONFIG_MQTT_PATH; if (this.STATE_PATH.slice(-1)!='.') this.STATE_PATH += '.'; if (this.MQTT_PATH.slice(-1)!='.') this.MQTT_PATH += '.'; return true; } // start the script/class doStart() { super.doStart(); // subscriber erzeugen this.subscribe( on( new RegExp( `${this.MQTT_PATH}*` ), obj => { this.onChangeMQTT(obj.id) } )); this.initMQTT(); return true; } // stop the script/class doStop() { super.doStop(); return true; } onChangeMQTT( id ) { // this.log(id,'onChangeMQTT'); if (id.indexOf(".command")!=-1) return; if ( existsState(id) ) { let state = getState(id); let o = JSON.parse(state.val); for (var prop in o) { let name = id.slice(this.MQTT_PATH.length,1000); name += '.' + prop; // this.log(`${name} = ${o[prop]}`,'onChangeMQTT'); if (this.existsState(name) ) this.setState(name,o[prop]); else this.createState(name, o[prop]); } } } initMQTT() { $(`channel[state.id=${this.MQTT_PATH}*]`).each( (id, i) => { // this.log(id,'initMQTT'); this.onChangeMQTT( id ); }); } } // create instance and start var mduiUpdateWallpanelMQTT = new MduiUpdateWallpanelMQTT( ); mduiUpdateWallpanelMQTT.start(); // on script stop, stop instance too onStop(function () { mduiUpdateWallpanelMQTT.stop(); }, 1000 );
  • Script für USV Wartung

    2
    1
    0 Stimmen
    2 Beiträge
    252 Aufrufe
    G
    @drake Zuerst muss der Trigger im Trigger geändert werden! Pack den 2.Teil einfach darunter. Wird denn die Ladung als String oder als Zahl ausgegeben, da solltest Du auch nochmal gucken! Wenn Du weisst, wie lange Deine Batterie normalerweise braucht bis sie 40 % erreicht hat, kannst Du ja eine Zeit zum wiedereinschalten mit einem "oder" zur battery-charge 40% machen
  • Cronjob auf Slave um VPN Verbindung wieder herzustellen

    security
    5
    0 Stimmen
    5 Beiträge
    319 Aufrufe
    SBorgS
    @myzerat Jepp, fast schon gut. Shell-Skripte müssen aber auch ausführbar sein, nur "lesen" genügt da nicht ;) sudo chmod +x /etc/openvpn/startopenvpn.sh Dannn sollte es "rwxr--r-- root root ..." sein.
  • [gelöst] NodeRed Dashoard mehrere Tabs oder Pages

    Verschoben
    10
    0 Stimmen
    10 Beiträge
    5k Aufrufe
    F
    @garf said in [gelöst] NodeRed Dashoard mehrere Tabs oder Pages: Die Dashboardseiten kann man dann natürlich einzeln im Tab eines Browsers aufrufen. Ich würde das unter Apple mit Floato machen. sieht dann so aus.! Screenshot at Oct 01 23-02-42.png
  • Skript für Bluetooth-Heizkörperthermostat unter IoBroker

    Verschoben
    21
    0 Stimmen
    21 Beiträge
    4k Aufrufe
    A
    @kr4mb3 Hallo Freunde, vielen Dank für den Skript. Funktioniert ganz gut. Meine Frage: hat ihn jemand weiter verbessert? ToDo: Mehrere Thermostate gleichzeitig Sicherheit Zum Punkt "Sicherheit": Es ist ja jedem klar, dass die Thermostate nicht durch Verschlüsselung geschützt sind. Wünschenswert wäre eine Funktion im Skript, die eine Fremdeinwirkung erkennt und gegensteuert. Umsetzbar wäre dies z.B. durch das Speichern des Status und regelmäßigen Vergleich der Strings. Hat da jemand eine Idee?
  • [Gelöst] Javascript.0 "spinnt" - Fehlermeldungen

    javascript
    6
    0 Stimmen
    6 Beiträge
    361 Aufrufe
    qqolliQ
    @guergen Danke für den Tipp, das war es tatsächlich. Hatte ein Skript mit Request() und einem Abfrageintervall von 5s (Danke auch an @paul53 ). Somit, Problem gelöst. Ich liebe dieses Forum! :-)
  • Rolladen script - bitte um Hilfe :)

    7
    3
    0 Stimmen
    7 Beiträge
    587 Aufrufe
    W
    Danke euch, solange ich das teil ned "kalibriert" bekomme, brauch ich auch kein script machen :( Die automatische calibration fahrt macht irwie nix...🤷‍♂️
  • Mittelwertbildung für die Windrichtung mit JavaScript

    1
    2
    2 Stimmen
    1 Beiträge
    658 Aufrufe
    Niemand hat geantwortet
  • [GELÖST] Im Skript eigene ID (Name) ermitteln?

    3
    0 Stimmen
    3 Beiträge
    227 Aufrufe
    NewpicselN
    @paul53 Ja richtig perfekt! Ich danke dir :pray:
  • Bei Eingabe über Tastatur oder Tablet Timer zurücksetzen

    2
    0 Stimmen
    2 Beiträge
    245 Aufrufe
    liv-in-skyL
    @fleck-a87 das problem dabei ist , dass die vis das wissen muss, wann du etwas eingibst und die vis dann den timeout unterbrechen soll du müßtest ein script in der vis am laufen haben, dass dies überprüft und ausführt - machbar - aber nicht ganz trivial du könntest dir aber einen button machen, der das unterbricht - also einen extra schalter dafür (der auf jeder view zu sehen ist, der einen datenpunkt setzt. den dp fügst du dann in dein obiges script ein (if-abfrage ob true/false und stoppen des timeouts) .
  • Uhrzeitabhängiges Dimmen mit Skript

    3
    0 Stimmen
    3 Beiträge
    272 Aufrufe
    T
    @ft-knorr Hier ein Ausschnitt aus meinem Skript das etwas ähnliches tut. Der Code unten ist aus dem Skript kopiert das deutlich umfangreicher ist. EDIT: Dachte ich wäre im Unterforum Javascript. :) const DEBUG = false; const maxCt = 500; const minCt = 250; const maxBri = 190; const minBri = 80; const endHourOfFade = 22;//1-24 const startHourOfFade = 20 ; function main() { var currentSunSet = getAstroDate("sunset"); if (timeIsBetween(new Date(),currentSunSet, endHourOfFade+':00') ) { if (DEBUG) console.log('Fade 1. Abschnitt: Sonnenuntergang:'+currentSunSet+' aktuelle Zeit:'+new Date()); fadeLights(currentSunSet, new Date()); myInterval = setInterval(function(){ fadeLights(currentSunSet, new Date()); },5000); // bleibe Nachts bei den zurückhaltenden Einstellungen, ab 4 Uhr ist die Automatik beendet } else if (timeIsBetween(currentTime,endHourOfFade+':00','04:00')){ if (DEBUG) console.log('Fade 2. Abschnitt'); setState('deconz.0.lights.0017880103a0037c.action', '"on": true, "bri": '+minBri+', "ct": '+maxCt); } else { setState('deconz.0.lights.0017880103a0037c.on', true); } } function fadeLights (currentSunSet,currentTime) { var endTime = new Date(currentSunSet); endTime.setHours(endHourOfFade, 0, 0); endTime = currentSunSet < endTime ? endTime : new Date(new Date(currentSunSet).setMinutes(new Date(currentSunSet).getMinutes() + 15)); var startTime = new Date(new Date(currentSunSet).setHours(startHourOfFade,0,0)); startTime = currentSunSet < startTime ? startTime : new Date(currentSunSet); var currentDiff = (endTime.getTime() - currentTime.getTime()); var currentMaxDiff = (endTime.getTime() - startTime.getTime()); if (currentDiff > currentMaxDiff) currentDiff = currentMaxDiff; var ct = minCt + (maxCt - minCt) * (currentMaxDiff - currentDiff) / currentMaxDiff; ct = Math.round(ct); if (ct > maxCt) ct = maxCt; //Passe die Helligkeit an var bri = maxBri; if (currentTime > startTime) { bri = minBri + (maxBri - minBri) * currentDiff / currentMaxDiff; bri = Math.round(bri); } setState('deconz.0.lights.0017880103a0037c.action', '"on": true, "bri": '+bri+', "ct": '+ct); } // Hilfsfunktion: function timeIsBetween(fTime,start,ende) {//Dateobjekt,hh:mm,hh:mm var eTime = new Date(), sTime = new Date(); if (typeof start == 'object') { sTime = new Date(start); } else { start = start.split(':'); sTime.setHours(parseInt(start[0]), parseInt(start[1]), 0); } if (typeof ende === 'object') { eTime = new Date(ende); } else { ende = ende.split(':'); eTime.setHours(parseInt(ende[0]), parseInt(ende[1]), 0); } if (sTime.getTime()>eTime.getTime()) { if (fTime.getTime() < eTime.getTime()) sTime.setDate(eTime.getDate()-1); if (fTime.getTime() > sTime.getTime()) eTime.setDate(sTime.getDate()+1); } if ( compareTime(sTime, eTime, 'between', fTime) ) return true; return false; }
  • Variable verzögert setzen und wieder löschen (Fehler)

    javascript
    5
    0 Stimmen
    5 Beiträge
    163 Aufrufe
    liv-in-skyL
    @alcalzone Ich glaube dass war früher anderes Hatte auch plötzlich irgendwann ein Problem mit einem Script, was vorher lief Ist aber schon länger her. Kann mich nur noch daran erinnern, dass es mit dem setstatedelayed war
  • (GELÖST) JSON Zeitplan auslesen

    javascript
    4
    0 Stimmen
    4 Beiträge
    149 Aufrufe
    L
    @paul53 @mickym Guten Morgen Ihr beiden, Danke für die Hilfe, hat funktioniert!!!! MfG Wastl

706

Online

32.7k

Benutzer

82.4k

Themen

1.3m

Beiträge