Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. paul53

    NEWS

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Profile
    • Following 0
    • Followers 59
    • Topics 50
    • Posts 29401
    • Best 4281
    • Groups 2

    paul53

    @paul53

    4739
    Reputation
    2950
    Profile views
    29401
    Posts
    59
    Followers
    0
    Following
    Joined Last Online
    Location Berlin Age 72

    paul53 Follow
    Pro Most Active

    Best posts made by paul53

    • c't 20-2021

      @apollon77 hat einen Artikel verfasst (c't 20-2021, Seiten 162 - 165).

      posted in ioBroker Allgemein
      paul53
      paul53
    • [Vorlage] Alias per Skript erzeugen

      Im folgenden Skript wird ein Alias zu einem Datenpunkt mit dessen common-Eigenschaften erstellt. Bei gewollten Abweichungen von common-Eigenschaften des Alias zum Original muss man die zugehörigen // (Kommentar) entfernen und den gewünschten Wert zuweisen.

      // Original-Datenpunkt
      const idOrigin = 'mqtt.0.switch.status'; 
      // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
      // Bei Nicht-Verwendung Leerstring '' zuweisen
      const idRead = '';
       
      // Alias-Datenpunkt
      const idAlias = 'Pool.Pumpe.Schalter';
      
      var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
      
      // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
      nameAlias = 'Poolpumpe Ein';
      desc = 'per Script erstellt';
      // typeAlias = 'boolean'; // oder 'number'
      // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
      // write = "val ? String(1) : String(0)";
      // role = 'value';
      // min = 0; // nur Zahlen
      // max = 100; // nur Zahlen
      // unit = '%'; // nur für Zahlen
      // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
      custom = {}; // verhindert doppelte Ausführung von history, ...
      // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
      // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
      
      // Ab hier nichts ändern !!
      function createAlias(idDst, idSrc, idRd) {
         if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
         else {
            var obj = {};
            obj.type = 'state';
            obj.common = getObject(idSrc).common;
            obj.common.alias = {};
            if(idRd) {
                obj.common.alias.id = {};
                obj.common.alias.id.read = idRd;
                obj.common.alias.id.write = idSrc;
                obj.common.read = true;
            } else obj.common.alias.id = idSrc;
            if(typeAlias) obj.common.type = typeAlias;
            if(obj.common.read !== false && read) obj.common.alias.read = read;
            if(obj.common.write !== false && write) obj.common.alias.write = write;
            if(nameAlias) obj.common.name = nameAlias;
            if(role) obj.common.role = role;
            if(desc) obj.common.desc = desc;
            if(obj.common.type == 'number') {
               if(min !== undefined) obj.common.min = min;
               if(max !== undefined) obj.common.max = max;
               if(unit) obj.common.unit = unit;
            } else {
               if(obj.common.min !== undefined) delete obj.common.min;
               if(obj.common.max !== undefined) delete obj.common.max;
               if(obj.common.unit) delete obj.common.unit;
            }
            if(states) obj.common.states = states;
            if(custom && obj.common.custom) obj.common.custom = custom;
            obj.native = {};
            setObject(idDst, obj, function() {
               if(idRd) setState(idRd, getState(idRd).val, true);
               else setState(idSrc, getState(idSrc).val, true); 
            });
            if(raum && existsObject('enum.rooms.' + raum)) {
               let obj = getObject('enum.rooms.' + raum)
               obj.common.members.push(idDst);
               setObject('enum.rooms.' + raum, obj);
            }
            if(gewerk && existsObject('enum.functions.' + gewerk)) {
               let obj = getObject('enum.functions.' + gewerk)
               obj.common.members.push(idDst);
               setObject('enum.functions.' + gewerk, obj);
            }
         } 
      }
       
      createAlias('alias.0.' + idAlias, idOrigin, idRead);
      

      Beispiele für Konvertierung (write);

      write = "val ? 1 : 0"; // boolean --> binary
      write = "val ? 'On' : 'Off'"; // boolean --> string
      write = "val.toString()"; // number --> string dezimal
      write = "val.toFixed(2)"; // number --> string mit 2 Nachkommastellen
      

      EDIT(20.12.2019): obj.native ergänzt.
      EDIT(16.01.2020): Abfrage (Zeile 20) geändert
      EDIT(06.02.2020): obj.common.custom ergänzt

      EDIT(17.02.2020): Da man Raum und Gewerk in die Struktur der Alias-ID einbringen kann, sind enums für Raum und Gewerk oftmals nicht erforderlich. Für diejenigen, die den erzeugten Alias-Datenpunkt zu enum.rooms und/oder enum.functions hinzufügen wollen, wurde das Skript erweitert.

      EDIT(21.04.2020): Erweiterung für getrennte Kommando- und Status-Datenpunkte ab js-controller 3.x.

      EDIT(05.12.2020): Wenn Alias-Typ keine Zahl ist, werden min, max und unit gelöscht, falls vorhanden

      EDIT(16.02.2021): Zeile 23 geändert von leerem Array in leeres Objekt

      posted in JavaScript
      paul53
      paul53
    • [Vorlage] Skript: Erstellen von User-Datenpunkten
      // Datenpunkt unter 0_userdata.0 erstellen
      const idUser = 'EG_Kueche.Rollo.Schaltzeit2';
      const commonUser = { // nicht benötigte Attribute auskommentieren
          type: 'number', 
          read: true, 
          write: true, 
          name: 'Rollo Küche Schaltzeit 2',
          desc: 'Laufzeit Rollo', 
          def: 60,
          min: 0,     // nur bei Zahlen
          max: 200,   // nur bei Zahlen
          unit: 's',  // nur bei Zahlen
      //    states: {  // nur bei Zahlen, Logikwerten
      //        0: 'Aus',
      //        1: 'Auto',
      //        2: 'Ein'
      //    },
          role: 'level.timer'
      };
      
      function createDp(id, common) {
          if(existsState(id)) log('Datenpunkt ' + id + ' existiert bereits !', 'warn');
          else {
              var obj = {};
              obj.type = 'state';
              obj.common = common;
              obj.native = {};
              setObject(id, obj, function (err) {
                  if (err) log('Cannot write object: ' + err)
                  else {
                      var init = null;
                      if(common.def === undefined) {
                          if(common.type === 'number') init = 0;
                          if(common.type === 'boolean') init = false;
                          if(common.type === 'string') init = '';
                      } else init = common.def;
                      setState(id, init, true);
                  }
              });
          }
      }
      
      createDp('0_userdata.0.' + idUser, commonUser);
      

      EDIT: Abfrage geändert, ob Datenpunkt schon vorhanden ist.

      posted in JavaScript
      paul53
      paul53
    • [Vorlage] Wechselseitige Aktualisierung und Bedienung von Datenpunkten

      In Fällen, in denen der Wert von einem Gerät auf ein anderes Gerät (und umgekehrt) übertragen werden soll, muss man ein endloses Hin- und Her vermeiden. Damit ein Triggern auf das setState() verhindert wird, kann im Trigger die Quelle (from) ausgewertet werden.

      // Wechselseitige Aktualisierung von Datenpunkten
      const id1 = '...'; // Datenpunkt-ID vom Gerät 1
      const id2 = '...'; // Datenpunkt-ID vom Gerät 2
      const js = 'system.adapter.javascript.' + instance;
      
      on({id: id1, change: 'ne', fromNe: js}, function(dp) {
         setState(id2, dp.state.val);
      });
      
      on({id: id2, change: 'ne', fromNe: js}, function(dp) {
         setState(id1, dp.state.val);
      });
      
      

      In Blockly muss die aktuelle JS-Instanz fest eingetragen werden.

      493_blockly_wechsseitige_aktualisierung.jpg

      posted in Skripten / Logik
      paul53
      paul53
    • RE: [gelöst] Möglichkeit herausfinden welches Script dp schaltet

      @bishop sagte: welches Script oder Adapter ein DP geschalten hat?

      Debug-Trigger auf den DP:

      Bild_2022-12-25_193151602.png

      posted in ioBroker Allgemein
      paul53
      paul53
    • RE: einfacher Timer, nach x Min Aus

      @maddin77 sagte: wenn ich während den 30min den Schalter drücke ignoriere den Schalter erst wenn Zeit abgelaufen wieder Aktiv

      Blockly_temp.JPG

      posted in Blockly
      paul53
      paul53
    • RE: Variable einmal Pro Monat Protokollieren

      @codierknecht sagte: Dann läuft der Kram 30x im Monat ohne etwas zu tun.

      Das kann man im CRON eingrenzen. Es ist weniger aufwändig und funktioniert auch nach einem Skript-Neustart.

      Blockly_temp.JPG

      posted in Einsteigerfragen
      paul53
      paul53
    • RE: braucht Pi4 8GB ein Gehäuse mit Lüfter?

      @tt-tom sagte: wenn man die Kiste mal festhalten muss

      Topflappen?

      posted in Hardware
      paul53
      paul53
    • RE: Device von einem State abfragen

      @Daniel-R sagte:

      benötige ich nun den Device Namen

      Vorschlag:

      function deviceName(id) { // id = Datenpunkt-ID
          id = id.substring(0, id.lastIndexOf('.'));
          if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
          id = id.substring(0, id.lastIndexOf('.'));
          if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
      }
      
      posted in JavaScript
      paul53
      paul53
    • RE: Datenpunkte in Ordner verschieben?

      @saeft_2003 sagte:

      Wann würdest du zu einem Skript kommen?

      Jetzt.

      // Kopieren von Datenpunkten nach 0_userdata.0
      // Pfade anpassen !
      const pathSrc = 'meineDP.0.'; // abschließenden Punkt angeben
      const pathDst = '0_userdata.0.';
      
      const idsSrc = $(pathSrc + '*');
      
      idsSrc.each(function(id, i) { // Schleife über alle Datenpunkte im Pfad
          let idDst = pathDst + id.substring(pathSrc.length);
          if(existsObject(idDst)) log('Datenpunkt ' + idDst + ' existiert bereits !', 'warn');
          else {
              let obj = getObject(id);
              setObject(idDst, obj, function (err) {
                  if (err) log('Cannot write object: ' + err)
                  else {
                      let init = null;
                      if(existsState(id)) init = getState(id).val;
                      else {
                          let common = obj.common;
                          if(common.def === undefined) {
                              if(common.type === 'number') init = 0;
                              if(common.type === 'boolean') init = false;
                              if(common.type === 'string') init = '';
                              if(common.type === 'array') init = [];
                          } else init = common.def;
                      }
                      setStateDelayed(idDst, init, true, 20 * i + 50);
                  }
              });
          }
      });
      

      Falls ioBroker.linkeddevices verwendet wird: Vorher die Instanz deaktivieren !

      Vor dem manuellen Löschen der alten Datenpunkte (Ordner) sollten alle Scripte angepasst werden, da man sonst viele Warnungen und Fehlermeldungen riskiert.

      posted in ioBroker Allgemein
      paul53
      paul53

    Latest posts made by paul53

    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: Xp jetzt mal auf 4000 gestellt.

      Sind das Lastschwankungen? Zwischen 14:30 Uhr und 14:45 Uhr wird nicht geregelt, also kann die Schwankungen in der Zeit nicht der Regelkreis verursachen.

      Nach 14:55 Uhr sieht es allerdings nach einem instabilen Regelverhalten aus. Deshalb erhöhe Xp auf 5000.

      posted in Blockly
      paul53
      paul53
    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: Chart

      Wirtschaftlich ist es besser, etwas Energie zu verschenken als teuer einzukaufen. Deshalb regelt man besser auf eine geringe Einspeisung (100 W):

      Blockly_temp.JPG

      posted in Blockly
      paul53
      paul53
    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: Chart ohne Luftentfeuchter

      Das sieht gut aus. Vielleicht geht es noch etwas schneller, indem Xp weiter verringert wird (z.B. 4000)? Wenn es instabil wird (schwingt), ist Xp zu klein.
      Die Periodizität in den vorherigen Charts hat offenbar der Zweipunkt-Regler des Entfeuchters verursacht.
      Irgendein Verbraucher erzeugt hohe, kurze Lastspitzen, die aber gut zu erkennen sind.

      EDIT: Ändere mal für die Netzleistung Min auf -200 und Max auf 1200. Dann ist die Null-Linie besser dargestellt.

      posted in Blockly
      paul53
      paul53
    • RE: DP abhängig von mehreren Varianten

      @stefan341 sagte da fehlt doch auf was die Variable gesetzt werden soll oder?

      Wenn die Bedingungen erfüllt sind wird die Variable true, sonst false.

      Sollen 1 und 0 geschrieben werden, dann:

      Blockly_temp.JPG

      posted in Blockly
      paul53
      paul53
    • RE: DP abhängig von mehreren Varianten

      @asgothian sagte: Füge dem falls ein grosses "und" hinzu - neben den 3 Bedingungen der Sensoren muss mit hinein: 'Wert < sollwertThermostat

      Das ist bereits enthalten.

      @asgothian sagte in DP abhängig von mehreren Varianten:

      wird nur aktualisiert wenn der Wert sich auch geändert hat.

      Das würde ich so machen:

      Blockly_temp.JPG

      posted in Blockly
      paul53
      paul53
    • RE: DP abhängig von mehreren Varianten

      @stefan341
      Das Skript reagiert nicht auf eine sinkende Temperatur bei offenem Fenster, da nicht auf die Temperatur getriggert wird.

      posted in Blockly
      paul53
      paul53
    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: einen Luftentfeuchter der aber nur 130 Watt zieht.

      Die periodischen Spitzen (z.B. zwischen 10 und 11 Uhr) betragen nur ca. 130 W. Schalte mal den Entfeuchter ab, um zu sehen, ob es dann stabil aussieht.

      posted in Blockly
      paul53
      paul53
    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: Siehst du noch weiteres Verbesserungspotenzial?

      Gibt es einen Verbraucher, der ca. alle 10 bis 15 Minuten für kurze Zeit einschaltet? Falls nicht, sieht es schon nach etwas Instabilität (Schwingen) aus. In dem Fall würde ich Xp auf 7000 erhöhen.

      posted in Blockly
      paul53
      paul53
    • RE: [gelöst] Größte Ventilstellung von HZK eines Raumes

      @metaxa sagte: Testversion

      Für dem Maximalwert aus einer Liste gibt es einen Mathe-Block.

      Blockly_temp.JPG

      posted in Blockly
      paul53
      paul53
    • RE: PV 0 Einspeisung mehrerer Wechselrichter

      @duffy sagte: das sollte 10 sek meinen.

      Ja, das sind wohl 10 s.

      posted in Blockly
      paul53
      paul53
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo