Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Art-Net

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    Art-Net

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      alexw85 last edited by

      Soooo meine Damen und Herren… Konnte es jetzt zwar leider noch nicht testen, aber hier ist mal was das sehr vielversprechend anhand des Logs aussieht! 🙂

      Vorarbeit:

      1. In ioBroker den Javascript Adapter installieren, falls noch nicht geschehen

      2. Im ioBroker Verzeichnis (meistens /opt/iobroker) im Unterordner Javascript das ArtnetModul installieren. Genauer gesagt über ssh auf die ioBroker Kiste einwählen, in dieses Verzeichnis hier navigieren: /opt/iobroker/node_modules/iobroker.javascript und dann npm install artnet ausführen.

      3. Ein neues Script anlegen (Javascript, nicht Blockly) und das hier angehängte Script hineinkopieren.

      4. Eure IP Adresse, das Universe (Standard ist 0) anpassen und starten.

      5. Beim Start werden die States angelegt. (Unter Objekte->Javascript.0->Artnet->Universe)

      6. Szene anlegen mit dem Szenenadapter für Rot, Grün, Blau usw. (Wichtig kein Delay, und als virtuelle Gruppe anlegen)

      7. In VIS ein RGB Colorpicker anlegen und bei Rot ID, Grün ID, Blau ID die jeweilige Szene eintragen

      8. Kucken was passiert! 🙂

      Wie gesagt ich konnte es noch nicht an einer Leuchte testen, und ich muss auch noch einbauen (denke ich) das die Werte sich gleichmäßig zum Ziel ändern (momentan wird mit jedem Durchgang einfach ein Wert hoch oder runter gedimmt, beim Farbwechsel kommt es daher zu vermutl. komischen Effekten weil die eine Farbe schneller als die andere ist 🙂

      PS: Es dauert nach dem Start des Scripts ca. 10-15 Sekunden bis Änderungen angenommen werden, das werde ich aber mit dem nächsten Update nach unten korrigieren! 🙂

      Hier der ersehnte Code:

      `var artnet = require('artnet')(options);
      
      //################## Hier IP Adresse des Artnet Gateways eintragen #################//
      var options = {
          host : '192.168.178.123',	// Hier die IP Adresse eintragen
          sendAll : true
      };
      //################ Hier Artnet Universe und Updatefrequenz anpassen ################//
      
      var universe = 0;           // Default Universe ist 0!
      var updatesPerSecond = 50;  // Je nachdem sind hier Werte ab 15 halbwegs flimmerfrei!
      var updateValueSkip = 0;    // Hier können Werte übersprungen werden, default ist 0!
      
      // Standartmäßig wird mit jedem Update ein DMX Wert hoch/runter gezählt, mit updateValueSkip
      // kann ein Wert hinzuaddiert werden: Beispiel: updateValueSkip = 1 -> Es wird mit jedem Update
      // ein Wert + 1 (also 2 *g*) hoch/runter gezählt, somit wird schneller, aber ruppiger gefadet!
      
      //######################## Ab hier ist alles Programmcode! #########################//
      
      var dmx = new Array([]);
      var dmxNew = new Array([]);
      var dmxOldMax = new Array([]);
      var dmxMax = new Array([]);
      var processing;
      var timestamp;
      
      for (i = 1; i < '513'; i++) { 
          dmx[i] = 'null';
      }
      for (i = 1; i < '513'; i++) { 
          dmxNew[i] = 'null';
      }
      
      var main = function() {
          timestamp = Date.now();
      
          for (i = 1; i < '513'; i++) {
              try {
                  if (getIdByName("DMX_Channel_" + i) !== undefined) {
                      //setState("artnet.universe" + universe + "." + "DMX_Channel_" + i , '0', true);
                  } else {
                      createState("artnet.universe" + universe + "." + "DMX_Channel_" + i , {
                          name: 'DMX_Channel_' + i,
                          type: 'string',
                          role: 'value',
                          def: '0',
                          });
                      }
                  }   catch(e){}
              }
              return updateValues();
      };
      
      var updateValues = function() {
          on({id: /^javascript\.\d\.artnet.universe/, change: "ne"}, function (obj) {
              var DMXAddress = obj.name.match(/\d+/);
              var DMXValue = parseInt(obj.state.val);
              var DMXOldValue = parseInt(obj.oldState.val);
              lastChanged = getState(obj.id).lc;
              if (typeof DMXOldValue !== "undefined" && lastChanged > (timestamp + 10000)) {
              console.log("DMX" + DMXAddress + " hat sich von " + DMXOldValue + " auf " + DMXValue + " geändert!");
              dmxOldMax[DMXAddress] = DMXOldValue;
              dmxMax[DMXAddress] = DMXValue;
              dmxNew[DMXAddress] = DMXValue;
              dmx[DMXAddress] = DMXOldValue;
              clearTimeout(processing);
              waitForSending();
              }
          });
      };
      
      var waitForSending = function() {
          processing = setTimeout(function(){ return executeArtnet() }, 500);
      };
      
      var executeArtnet = function() {
          dmxMaxValue = dmxMax.reduce(function(a, b) {
              return Math.max(a, b);
          });
          dmxMinValue = dmxOldMax.reduce(function(a, b) {
              return Math.max(a, b);
          });
          //console.log("dmxMaxValue: " + dmxMaxValue + " dmxMinValue: " + dmxMinValue);
          var r = 0;
          var channel = 1;
          var roundsCalc = Math.round((dmxMaxValue - dmxMinValue)/(updateValueSkip + 1));
          var roundValue = (roundsCalc < 0) ? 1 + updateValueSkip : 1 + updateValueSkip;
          var rounds = Math.abs(roundsCalc);
          setInterval(function() {
              if (r < rounds) {
                  for (i = 1; i < '513'; i++) { 
                      if (dmx[i] !== 'null') {
                          if (dmx[i] < dmxNew[i]) {
                              if (dmx[i] + roundValue > 255) {
                                  dmx[i] = 255;
                                  } else if (dmx[i] + roundValue <= 0) {
                                  dmx[i] = 0;
                                  } else if (dmx[i] == dmxNew[i] ) {
                                  dmx[i] = dmxNew[i];
                                  } else {
                                  dmx[i] = dmx[i] + roundValue;
                              }
                          }
                          if (dmx[i] > dmxNew[i]) {
                              if (dmx[i] - roundValue > 255) {
                                  dmx[i] = 255;
                                  } else if (dmx[i] - roundValue <= 0) {
                                  dmx[i] = 0;
                                  } else if (dmx[i] == dmxNew[i] ) {
                                  dmx[i] = dmxNew[i];
                                  } else {
                                  dmx[i] = dmx[i] - roundValue;
                              }
                          }
                      }
                  }
              r++;
              //console.log("artnet: " + dmx);
              artnet.set(universe, channel , dmx , function (err, res) {
              });
              } 
          if (r == rounds) {
              //console.log("artnet: " + dmxNew);
              artnet.set(universe, channel , dmxNew , function (err, res) {
                  artnet.close;
              });
              r++;
              return;
          }
          },(1000/updatesPerSecond));
      };
      
      main();`[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
      
      1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators last edited by

        Bevor hier nachher einiges vermischt wird, die Frage:
        @alexw85:

        Im ioBroker Verzeichnis (meistens /opt/iobroker) im Unterordner Javascript das ArtnetModul installieren `
        Handelt es sich dabei um ein npm-Modul???

        Dann brauchst du es nur in der Konfiguration des js-Adapters einzutragen und diesen neustarten, dann wird es automatisch installiert 😉

        und keiner muss mit ssh spielen 😉

        Gruß

        Rainer

        1 Reply Last reply Reply Quote 0
        • A
          alexw85 last edited by

          @Homoran:

          Bevor hier nachher einiges vermischt wird, die Frage:
          @alexw85:

          Im ioBroker Verzeichnis (meistens /opt/iobroker) im Unterordner Javascript das ArtnetModul installieren `
          Handelt es sich dabei um ein npm-Modul???

          Dann brauchst du es nur in der Konfiguration des js-Adapters einzutragen und diesen neustarten, dann wird es automatisch installiert 😉

          und keiner muss mit ssh spielen 😉

          Gruß

          Rainer ` ja es ist ein npm Modul… Wenn's so einfach geht, ich machs immer umständlich! [emoji847]

          Gesendet von meinem SM-G955F mit Tapatalk

          1 Reply Last reply Reply Quote 0
          • A
            alexw85 last edited by

            @alexw85:

            @Homoran:

            Bevor hier nachher einiges vermischt wird, die Frage:
            @alexw85:

            Im ioBroker Verzeichnis (meistens /opt/iobroker) im Unterordner Javascript das ArtnetModul installieren `
            Handelt es sich dabei um ein npm-Modul???

            Dann brauchst du es nur in der Konfiguration des js-Adapters einzutragen und diesen neustarten, dann wird es automatisch installiert 😉

            und keiner muss mit ssh spielen 😉

            Gruß

            Rainer ` ja es ist ein npm Modul… Wenn's so einfach geht, ich machs immer umständlich! [emoji847]

            Gesendet von meinem SM-G955F mit Tapatalk ` Vieleicht sei noch zu erwähnen den anderen offiziellen Artnet Adapter zu deaktivieren, sonst gibts Kuddelmuddel 🙂 Und ja, Rainer hat natürlich völlig recht, Schritt 2 könnt ihr einfacher abhaken wenn ihr das NPM Modul einfach in die Adapterconfig schreibt… [emoji16]

            Gesendet von meinem SM-T819 mit Tapatalk

            1 Reply Last reply Reply Quote 0
            • A
              alexw85 last edited by

              Ach Kacke… Gerade getestet, Log sieht phänomenal aus... In der Realität spinnt das Artnet Modul rum und macht nur sch...

              Ich verstehe es gerade nicht, weil console.log das Selbe ausgibt wie an das Artnet Modul übergeben wird, vieleicht liegts an einem Timingproblem, ich raffs grad nicht mehr. Um 4:30Uhr klingelt auch wieder der Wecker, ich hau ihn am besten jetzt schon kaputt solange ich noch wach bin! 🙂

              Mein Testscript läuft dagegen relativ gut?! Wer sichs mal anschauen will... Es wird einfach Kanal 1-18 in Universe 0 auf 255 hoch gefadet und dann ist Ende! 🙂 Nach dem Lauf müsst ihr den Javascript Adapter neu starten, weil sonst im 4 sek. Takt Artnetbefehle weitergesendet werden 😉

              `var artnet = require('artnet')(options);
              
              var options = {
                  host : '192.168.178.67',
                  sendAll : true
              };
              var universe = 0;
              var channel = 1;
              
              var updatesPerSecond = 50;
              var playtimeInSeconds = 1;
              var WertStart = 0;
              var WertEnd = 255;
              
              //##########################################################################//
              
              //var Q = require('q');
              var dmx = new Array([]);
              
              for (i = 0; i < '512'; i++) { 
                  dmx[i] = 'null';
              }
              
              dmx[1] = 0;
              dmx[2] = 0;
              dmx[3] = 0;
              dmx[4] = 0;
              dmx[5] = 0;
              dmx[6] = 0;
              dmx[7] = 0;
              dmx[8] = 0;
              dmx[9] = 0;
              dmx[10] = 0;
              dmx[11] = 0;
              dmx[12] = 0;
              dmx[13] = 0;
              dmx[14] = 0;
              dmx[15] = 0;
              dmx[16] = 0;
              dmx[17] = 0;
              dmx[18] = 0;
              
              var r = 0;
              
              var roundValue = Math.round((WertEnd-WertStart)/(updatesPerSecond*playtimeInSeconds));
              var rounds = updatesPerSecond * playtimeInSeconds;
              
              var fading = function() {
                  dmx.shift();
                          setInterval(function() {
                              if (r < rounds) {
                                  for (i = 0; i < '512'; i++) { 
                                      if (dmx[i] !== 'null' || dmx[i] > 0) {
                                          if (dmx[i] + roundValue > 255) {
                                              dmx[i] = 255;
                                              } else if (dmx[i] + roundValue <= 0) {
                                              dmx[i] = 0;
                                              } else {
                                              dmx[i] = dmx[i] + roundValue;
                                              }
                                  }
                              }
                              r++;
                              console.log("artnet: " + dmx);
                              console.log("round: " + r);
                              artnet.set(universe, channel , dmx);
                          } else if (r == rounds) {
                                  for (i = 0; i < '512'; i++) { 
                                      if (dmx[i] !== 'null' || dmx[i] > 0) {
                                          if (dmx[i] + roundValue > 255) {
                                              dmx[i] = 255;
                                              } else if (dmx[i] + roundValue <= 0) {
                                              dmx[i] = 0;
                                              } else {
                                              dmx[i] = WertEnd;
                                              }
                                  }
                              }
                              console.log("artnet: " + dmx);
                              console.log("round: " + r);
                              artnet.set(universe, channel , dmx , function (err, res) {
                                  artnet.close();
                              });
                              r++;
                          } else {
                              return;
                      }},(1000/updatesPerSecond));
              };
              
              fading();`[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
              
              1 Reply Last reply Reply Quote 0
              • A
                alexw85 last edited by

                So… Jetzt gehts! 🙂

                Auch wenn jetzt die Farben so überhauptnicht stimmen (Muss das Array noch anpassen, weil der Computer bei null anfängt zu zählen, ich will aber das DMX1 die erste Adresse ist 🙂 Außerdem passt bei verschiedenen Endleveln meine Kalkulation mit der Anzahl der Runden noch nicht, von daher macht das Script nicht viel richtig bis jetzt, aber das sind nur Kleinigkeiten... Wichtig ist ES MACHT WAS UND FADED DABEI (meistens) und ihr wollt ja jedes Update von mir geteilt bekommen, also mach ich das 🙂

                Hier der aktualisierte Code:

                `//################## Hier IP Adresse des Artnet Gateways eintragen #################//
                var options = {
                    host : '192.168.201.212',   // Hier die IP Adresse eintragen
                    sendAll : true
                };
                //################ Hier Artnet Universe und Updatefrequenz anpassen ################//
                
                var universe = "0";           // Default Universe ist 0!
                var updatesPerSecond = 40;  // Je nachdem sind hier Werte ab 15 halbwegs flimmerfrei!
                var updateValueSkip = 0;    // Hier können Werte übersprungen werden, default ist 0!
                
                // Standartmäßig wird mit jedem Update ein DMX Wert hoch/runter gezählt, mit updateValueSkip
                // kann ein Wert hinzuaddiert werden: Beispiel: updateValueSkip = 1 -> Es wird mit jedem Update
                // ein Wert + 1 (also 2 *g*) hoch/runter gezählt, somit wird schneller, aber ruppiger gefadet!
                
                //######################## Ab hier ist alles Programmcode! #########################//
                var artnet = require('artnet')(options);
                var dmx = new Array([]);
                var dmxNew = new Array([]);
                var dmxOldMax = new Array([]);
                var dmxMax = new Array([]);
                var processing;
                var timestamp;
                var channel = 1;
                var roundValue;
                
                for (i = 0; i < '513'; i++) { 
                    dmx[i] = 'null';
                }
                for (i = 0; i < '513'; i++) { 
                    dmxNew[i] = 'null';
                }
                
                var main = function() {
                    timestamp = Date.now();
                
                    for (i = 1; i < '513'; i++) {
                        try {
                            if (getIdByName("DMX_Channel_" + i) !== undefined) {
                                //setState("artnet.universe" + universe + "." + "DMX_Channel_" + i , '0', true);
                            } else {
                                createState("artnet.universe" + universe + "." + "DMX_Channel_" + i , {
                                    name: 'DMX_Channel_' + i,
                                    type: 'string',
                                    role: 'value',
                                    def: '0',
                                    });
                                }
                            }   catch(e){}
                        }
                        return updateValues();
                };
                
                var updateValues = function() {
                    on({id: /^javascript\.\d\.artnet.universe/, change: "ne"}, function (obj) {
                        var DMXAddress = obj.name.match(/\d+/);
                        var DMXValue = parseInt(obj.state.val);
                        var DMXOldValue = parseInt(obj.oldState.val);
                        lastChanged = getState(obj.id).lc;
                        if (typeof DMXOldValue !== "undefined" && lastChanged > (timestamp + 500)) {
                        console.log("DMX" + DMXAddress + " hat sich von " + DMXOldValue + " auf " + DMXValue + " geändert!");
                        dmxOldMax[DMXAddress] = DMXOldValue;
                        dmxMax[DMXAddress] = DMXValue;
                        dmxNew[DMXAddress] = DMXValue;
                        dmx[DMXAddress] = DMXOldValue;
                        clearTimeout(processing);
                        waitForSending();
                        }
                    });
                };
                
                var waitForSending = function() {
                    processing = setTimeout(function(){ return executeArtnet() }, 500);
                };
                
                var executeArtnet = function() {
                    dmxMaxValue = dmxMax.reduce(function(a, b) {
                        return Math.max(a, b);
                    });
                    dmxMinValue = dmxOldMax.reduce(function(a, b) {
                        return Math.max(a, b);
                    });
                    //console.log("dmxMaxValue: " + dmxMaxValue + " dmxMinValue: " + dmxMinValue);
                
                    roundsCalc = Math.round((dmxMaxValue - dmxMinValue)/(updateValueSkip + 1));
                    roundValue = (roundsCalc < 0) ? 1 + updateValueSkip : 1 + updateValueSkip;
                    rounds = Math.abs(roundsCalc);
                    var r = 0;
                    runArtnet();
                //    dmx.shift();
                //    dmxNew.shift();
                    function runArtnet () {
                        setTimeout(function () {
                            artnetStep();
                            r++;
                            if (r < rounds) {
                                runArtnet();
                            } else {
                                console.log("artnetEnde: " + dmxNew);
                                console.log("round: " + r);
                                artnet.set(universe, channel , dmxNew);
                                return;
                            }         
                        }, (1000/updatesPerSecond));
                    }
                };
                
                var artnetStep = function() {
                    for (i = 1; i < '513'; i++) {
                        if (dmx[i] < dmxNew[i]) {
                            if (dmx[i] + roundValue > 255) {
                                dmx[i] = 255;
                            } else if (dmx[i] + roundValue <= 0) {
                                dmx[i] = 0;
                            } else if (dmx[i] == dmxNew[i] ) {
                                dmx[i] = dmxNew[i];
                            } else {
                                dmx[i] = dmx[i] + roundValue;
                            }
                        }
                        if (dmx[i] > dmxNew[i]) {
                            if (dmx[i] - roundValue > 255) {
                                dmx[i] = 255;
                            } else if (dmx[i] - roundValue <= 0) {
                                dmx[i] = 0;
                            } else if (dmx[i] == dmxNew[i] ) {
                                dmx[i] = dmxNew[i];
                            } else {
                                dmx[i] = dmx[i] - roundValue;
                            }
                        }
                    }
                    console.log("artnetStep: " + dmx);
                artnet.set(universe, channel , dmx);
                return;
                };
                
                main();`[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
                
                1 Reply Last reply Reply Quote 0
                • N
                  nibblerrick last edited by

                  Danke, ich hoffe, dass ich morgen, sonst am WE zum ausprobieren komme. Wenn es funktioniert teile ich die weiteren Wuensche mit 😉

                  1 Reply Last reply Reply Quote 0
                  • A
                    alexw85 last edited by

                    ICH HABE FERTIG, ES FUNKTIONIERT !!! 🙂

                    Vergesst alle vorherigen Beiträge, hier nochmal zusammenfassend Anleitung und funktionierender Code der auch das Artnet Modul gescheit beendet 🙂 Würde zwar gerne ein Bewisvideo hochladen, hab extra in VGA aufgenommen, ist aber immer noch zu groß 😛 Bitte ausgiebig testen und über evtl. Fehler berichten!

                    Ich nenne die Art des Fadens jetzt "asynchrones Fading", ein synchrones werde ich bei Gelegenheit mal mit einbauen im Adapter. Wobei mir das jetzt hier ehrlich gesagt momentan viel besser gefällt… Gerne würde ich auch noch ein paar Cues mit einbauen, bin da nur sehr unkreativ was das angeht. Alle Farben durchlaufen ist natürlich was (und einfach), ein Kaminfeuereffekt hab ich schon mehrfach gelesen, wobei ich jetzt nicht weiß was man sich darunter vorstellt (unkreativ!) 🙂

                    Vorarbeit:

                    1. In ioBroker den Javascript Adapter installieren, falls noch nicht geschehen

                    2. In den Einstellungen des Javascript Adapters bei zusätzliche NPM-Module artnet reinschreiben (Danke Rainer für den wesentlich einfacheren Weg 🙂 )

                    3. Ein neues Script anlegen (Javascript, nicht Blockly) und das hier angehängte Script hineinkopieren.

                    4. Eure IP Adresse, das Universe (Standard ist 0) anpassen und starten.

                    5. Beim Start werden die States angelegt. (Unter Objekte->Javascript.0->Artnet->UniverseX)

                    6. Szene anlegen mit dem Szenenadapter für Rot, Grün, Blau usw. (Wichtig kein Delay, und als virtuelle Gruppe anlegen)

                    7. In VIS ein RGB Colorpicker anlegen und bei Rot ID, Grün ID, Blau ID die jeweilige Szene eintragen. Ich empfehle da jetzt erstmal den einfachen Colorpicker RGB spectrum Der "farbtastic" zuckt bei mir nur wild hin und her und die Lampe dann hinterher, momentan keine Ahnung was er für Schmerzen hat?!

                    8. Kucken was passiert! 🙂

                    Hier der Code:

                    `//################## Hier IP Adresse des Artnet Gateways eintragen #################//
                    var options = {
                        host : '192.168.178.67',   // Hier die IP Adresse eintragen
                        sendAll : true
                    };
                    var artnet;
                    //################ Hier Artnet Universe und Updatefrequenz anpassen ################//
                    
                    var universe = 1;           // Default Universe ist 0!
                    var updatesPerSecond = 25;  // Je nachdem sind hier Werte ab 15 halbwegs flimmerfrei!
                    var updateValueSkip = 2;    // Hier können Werte übersprungen werden, default ist 0!
                    
                    // Standartmäßig wird mit jedem Update ein DMX Wert hoch/runter gezählt, mit updateValueSkip
                    // kann ein Wert hinzuaddiert werden: Beispiel: updateValueSkip = 1 -> Es wird mit jedem Update
                    // ein Wert + 1 (also 2 *g*) hoch/runter gezählt, somit wird schneller, aber ruppiger gefadet!
                    
                    //######################## Ab hier ist alles Programmcode! #########################//
                    
                    var dmx = [];
                    var dmxNew = [];
                    var dmxOldMinMax = [];
                    var dmxNewMinMax = [];
                    var processing;
                    var timestamp;
                    var channel = 1;
                    var roundValue;
                    
                    for (i = 0; i < '513'; i++) { 
                        dmx[i] = 'null';
                    }
                    for (i = 0; i < '513'; i++) { 
                        dmxNew[i] = 'null';
                    }
                    
                    var main = function() {
                        timestamp = Date.now();
                        for (i = 0; i < '513'; i++) {
                            try {
                                if (getIdByName("DMX_Channel_" + i) !== undefined && i > 0) {
                                    //setState("artnet.universe" + universe + "." + "DMX_Channel_" + i, '0', true);
                                } else if (i > 0) {
                                    createState("artnet.universe" + universe + "." + "DMX_Channel_" + i , {
                                        name: 'DMX_Channel_' + i,
                                        type: 'int',
                                        role: 'value',
                                        def: 0,
                                        });
                                    }
                                }   catch(e){}
                            }
                            return updateValues();
                    };
                    
                    var updateValues = function() {
                        on({id: /^javascript\.\d\.artnet.universe/, change: "ne"}, function (obj) {
                            var DMXAddress = obj.name.match(/\d+/);
                            var DMXValue = parseInt(obj.state.val);
                            var DMXOldValue = parseInt(obj.oldState.val);
                            lastChanged = getState(obj.id).lc;
                            if (typeof DMXOldValue !== "undefined" && lastChanged > (timestamp + 3000)) {
                            console.log("DMX" + DMXAddress + " hat sich von " + DMXOldValue + " auf " + DMXValue + " geändert!");
                            dmxOldMinMax[DMXAddress] = DMXOldValue;
                            dmxNewMinMax[DMXAddress] = DMXValue;
                            dmxNew[DMXAddress] = DMXValue;
                            dmx[DMXAddress] = DMXOldValue;
                            clearTimeout(processing);
                            waitForSending();
                            }
                        });
                    };
                    
                    var waitForSending = function() {
                        processing = setTimeout(function(){ return executeArtnet() }, 500);
                    };
                    
                    var executeArtnet = function() {
                        artnet = require('artnet')(options);
                        dmxNewMinValue = dmxNewMinMax.reduce(function(a, b) {
                            return Math.min(a, b);
                        });
                        dmxNewMaxValue = dmxNewMinMax.reduce(function(a, b) {
                            return Math.max(a, b);
                        });
                        dmxOldMinValue = dmxOldMinMax.reduce(function(a, b) {
                            return Math.min(a, b);
                        });
                        dmxOldMaxValue = dmxOldMinMax.reduce(function(a, b) {
                            return Math.max(a, b);
                        });
                        dmxMaxValue = Math.max(dmxNewMaxValue, dmxOldMaxValue);
                        dmxMinValue = Math.min(dmxNewMinValue, dmxOldMinValue);
                        //console.log("dmxMaxValue: " + dmxMaxValue + " dmxMinValue: " + dmxMinValue);
                    
                        roundsCalc = Math.round((dmxMaxValue - dmxMinValue)/(updateValueSkip + 1));
                        roundValue = 1 + updateValueSkip;
                        rounds = Math.abs(roundsCalc);
                        var r = 0;
                        runArtnet();
                        function runArtnet () {
                            setTimeout(function () {
                                artnetStep();
                                r++;
                                if (r < rounds) {
                                    runArtnet();
                                } else {
                                    console.log("artnetEnde: " + dmxNew.slice(1));
                                    console.log("round: " + r);
                                    artnet.set(universe, channel , dmxNew.slice(1));
                                    return closingArtnet();
                                }         
                            }, (1000/updatesPerSecond));
                        }
                    };
                    
                    var artnetStep = function() {
                        for (i = 0; i < '513'; i++) {
                            if (i > 0) {
                                if (dmx[i] < dmxNew[i]) {
                                    if (dmx[i] + roundValue > 255) {
                                        dmx[i] = 255;
                                    } else if (dmx[i] == dmxNew[i] ) {
                                        dmx[i] = dmxNew[i];
                                    } else {
                                        dmx[i] = dmx[i] + roundValue;
                                    }
                                }
                                if (dmx[i] > dmxNew[i]) {
                                    if (dmx[i] - roundValue <= 0) {
                                        dmx[i] = 0;
                                    } else if (dmx[i] == dmxNew[i] ) {
                                        dmx[i] = dmxNew[i];
                                    } else {
                                        dmx[i] = dmx[i] - roundValue;
                                    }
                                }
                            }
                        }
                        console.log("artnetStep: " + dmx.slice(1));
                    return artnet.set(universe, channel , dmx.slice(1));
                    };
                    
                    var closingArtnet = function() {
                        var dmxOldMinMax = [];
                        var dmxNewMinMax = [];
                        setTimeout(function(){ return artnet.close() }, 500);
                    };
                    
                    main();`[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
                    
                    Q 1 Reply Last reply Reply Quote 0
                    • A
                      alexw85 last edited by

                      @alexw85:

                      ICH HABE FERTIG, ES FUNKTIONIERT !!! 🙂

                      Vergesst alle vorherigen Beiträge, hier nochmal zusammenfassend Anleitung und funktionierender Code der auch das Artnet Modul gescheit beendet 🙂 Würde zwar gerne ein Bewisvideo hochladen, hab extra in VGA aufgenommen, ist aber immer noch zu groß [emoji14] Bitte ausgiebig testen und über evtl. Fehler berichten!

                      Ich nenne die Art des Fadens jetzt "asynchrones Fading", ein synchrones werde ich bei Gelegenheit mal mit einbauen im Adapter. Wobei mir das jetzt hier ehrlich gesagt momentan viel besser gefällt… Gerne würde ich auch noch ein paar Cues mit einbauen, bin da nur sehr unkreativ was das angeht. Alle Farben durchlaufen ist natürlich was (und einfach), ein Kaminfeuereffekt hab ich schon mehrfach gelesen, wobei ich jetzt nicht weiß was man sich darunter vorstellt (unkreativ!) 🙂

                      Vorarbeit:

                      1. In ioBroker den Javascript Adapter installieren, falls noch nicht geschehen

                      2. In den Einstellungen des Javascript Adapters bei zusätzliche NPM-Module artnet reinschreiben (Danke Rainer für den wesentlich einfacheren Weg 🙂 )

                      3. Ein neues Script anlegen (Javascript, nicht Blockly) und das hier angehängte Script hineinkopieren.

                      4. Eure IP Adresse, das Universe (Standard ist 0) anpassen und starten.

                      5. Beim Start werden die States angelegt. (Unter Objekte->Javascript.0->Artnet->UniverseX)

                      6. Szene anlegen mit dem Szenenadapter für Rot, Grün, Blau usw. (Wichtig kein Delay, und als virtuelle Gruppe anlegen)

                      7. In VIS ein RGB Colorpicker anlegen und bei Rot ID, Grün ID, Blau ID die jeweilige Szene eintragen. Ich empfehle da jetzt erstmal den einfachen Colorpicker RGB spectrum Der "farbtastic" zuckt bei mir nur wild hin und her und die Lampe dann hinterher, momentan keine Ahnung was er für Schmerzen hat?!

                      8. Kucken was passiert! 🙂

                      Hier der Code:

                      `//################## Hier IP Adresse des Artnet Gateways eintragen #################//
                      var options = {
                          host : '192.168.178.67',   // Hier die IP Adresse eintragen
                          sendAll : true
                      };
                      var artnet;
                      //################ Hier Artnet Universe und Updatefrequenz anpassen ################//
                      
                      var universe = 1;           // Default Universe ist 0!
                      var updatesPerSecond = 25;  // Je nachdem sind hier Werte ab 15 halbwegs flimmerfrei!
                      var updateValueSkip = 2;    // Hier können Werte übersprungen werden, default ist 0!
                      
                      // Standartmäßig wird mit jedem Update ein DMX Wert hoch/runter gezählt, mit updateValueSkip
                      // kann ein Wert hinzuaddiert werden: Beispiel: updateValueSkip = 1 -> Es wird mit jedem Update
                      // ein Wert + 1 (also 2 *g*) hoch/runter gezählt, somit wird schneller, aber ruppiger gefadet!
                      
                      //######################## Ab hier ist alles Programmcode! #########################//
                      
                      var dmx = [];
                      var dmxNew = [];
                      var dmxOldMinMax = [];
                      var dmxNewMinMax = [];
                      var processing;
                      var timestamp;
                      var channel = 1;
                      var roundValue;
                      
                      for (i = 0; i < '513'; i++) { 
                          dmx[i] = 'null';
                      }
                      for (i = 0; i < '513'; i++) { 
                          dmxNew[i] = 'null';
                      }
                      
                      var main = function() {
                          timestamp = Date.now();
                          for (i = 0; i < '513'; i++) {
                              try {
                                  if (getIdByName("DMX_Channel_" + i) !== undefined && i > 0) {
                                      //setState("artnet.universe" + universe + "." + "DMX_Channel_" + i, '0', true);
                                  } else if (i > 0) {
                                      createState("artnet.universe" + universe + "." + "DMX_Channel_" + i , {
                                          name: 'DMX_Channel_' + i,
                                          type: 'int',
                                          role: 'value',
                                          def: 0,
                                          });
                                      }
                                  }   catch(e){}
                              }
                              return updateValues();
                      };
                      
                      var updateValues = function() {
                          on({id: /^javascript\.\d\.artnet.universe/, change: "ne"}, function (obj) {
                              var DMXAddress = obj.name.match(/\d+/);
                              var DMXValue = parseInt(obj.state.val);
                              var DMXOldValue = parseInt(obj.oldState.val);
                              lastChanged = getState(obj.id).lc;
                              if (typeof DMXOldValue !== "undefined" && lastChanged > (timestamp + 3000)) {
                              console.log("DMX" + DMXAddress + " hat sich von " + DMXOldValue + " auf " + DMXValue + " geändert!");
                              dmxOldMinMax[DMXAddress] = DMXOldValue;
                              dmxNewMinMax[DMXAddress] = DMXValue;
                              dmxNew[DMXAddress] = DMXValue;
                              dmx[DMXAddress] = DMXOldValue;
                              clearTimeout(processing);
                              waitForSending();
                              }
                          });
                      };
                      
                      var waitForSending = function() {
                          processing = setTimeout(function(){ return executeArtnet() }, 500);
                      };
                      
                      var executeArtnet = function() {
                          artnet = require('artnet')(options);
                          dmxNewMinValue = dmxNewMinMax.reduce(function(a, b) {
                              return Math.min(a, b);
                          });
                          dmxNewMaxValue = dmxNewMinMax.reduce(function(a, b) {
                              return Math.max(a, b);
                          });
                          dmxOldMinValue = dmxOldMinMax.reduce(function(a, b) {
                              return Math.min(a, b);
                          });
                          dmxOldMaxValue = dmxOldMinMax.reduce(function(a, b) {
                              return Math.max(a, b);
                          });
                          dmxMaxValue = Math.max(dmxNewMaxValue, dmxOldMaxValue);
                          dmxMinValue = Math.min(dmxNewMinValue, dmxOldMinValue);
                          //console.log("dmxMaxValue: " + dmxMaxValue + " dmxMinValue: " + dmxMinValue);
                      
                          roundsCalc = Math.round((dmxMaxValue - dmxMinValue)/(updateValueSkip + 1));
                          roundValue = 1 + updateValueSkip;
                          rounds = Math.abs(roundsCalc);
                          var r = 0;
                          runArtnet();
                          function runArtnet () {
                              setTimeout(function () {
                                  artnetStep();
                                  r++;
                                  if (r < rounds) {
                                      runArtnet();
                                  } else {
                                      console.log("artnetEnde: " + dmxNew.slice(1));
                                      console.log("round: " + r);
                                      artnet.set(universe, channel , dmxNew.slice(1));
                                      return closingArtnet();
                                  }         
                              }, (1000/updatesPerSecond));
                          }
                      };
                      
                      var artnetStep = function() {
                          for (i = 0; i < '513'; i++) {
                              if (i > 0) {
                                  if (dmx[i] < dmxNew[i]) {
                                      if (dmx[i] + roundValue > 255) {
                                          dmx[i] = 255;
                                      } else if (dmx[i] == dmxNew[i] ) {
                                          dmx[i] = dmxNew[i];
                                      } else {
                                          dmx[i] = dmx[i] + roundValue;
                                      }
                                  }
                                  if (dmx[i] > dmxNew[i]) {
                                      if (dmx[i] - roundValue <= 0) {
                                          dmx[i] = 0;
                                      } else if (dmx[i] == dmxNew[i] ) {
                                          dmx[i] = dmxNew[i];
                                      } else {
                                          dmx[i] = dmx[i] - roundValue;
                                      }
                                  }
                              }
                          }
                          console.log("artnetStep: " + dmx.slice(1));
                      return artnet.set(universe, channel , dmx.slice(1));
                      };
                      
                      var closingArtnet = function() {
                          var dmxOldMinMax = [];
                          var dmxNewMinMax = [];
                          setTimeout(function(){ return artnet.close() }, 500);
                      };
                      
                      main();`Hab jetzt noch ein Problem mit Slidern die mit jedem Zucker Werte ändern, das muss ich noch abfangen sonst stürzt das Script irgendwann ab und macht komische Werte, da bin ich noch dran! [emoji26] Vieleicht gibts heute wieder ein Update... [emoji16]
                      
                      Gesendet von meinem SM-T819 mit Tapatalk[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
                      ``` ` 
                      1 Reply Last reply Reply Quote 0
                      • N
                        nibblerrick last edited by

                        Sollst du wohl hinbekommen 😄

                        1 Reply Last reply Reply Quote 0
                        • A
                          alexw85 last edited by

                          So, lässt sich jetzt nicht mehr von nervösen Slidern etc. beeindrucken, sondern wartet 500ms bis das Zucken aufhört, stoppt da wo er ist und macht mit dem neuen dann weiter! 🙂

                          Is garnet soo einfach wie ich anfangs dachte…. :lol:

                          `//################## Hier IP Adresse des Artnet Gateways eintragen #################//
                          var options = {
                              host : '192.168.178.67',   // Hier die IP Adresse eintragen
                              sendAll : true
                          };
                          var artnet;
                          //################ Hier Artnet Universe und Updatefrequenz anpassen ################//
                          
                          var universe = 0;           // Default Universe ist 0!
                          var updatesPerSecond = 25;  // Je nachdem sind hier Werte ab 15 halbwegs flimmerfrei!
                          var updateValueSkip = 1;    // Hier können Werte übersprungen werden, default ist 0!
                          
                          // Standartmäßig wird mit jedem Update ein DMX Wert hoch/runter gezählt, mit updateValueSkip
                          // kann ein Wert hinzuaddiert werden: Beispiel: updateValueSkip = 1 -> Es wird mit jedem Update
                          // ein Wert + 1 (also 2 *g*) hoch/runter gezählt, somit wird schneller, aber ruppiger gefadet!
                          
                          //######################## Ab hier ist alles Programmcode! #########################//
                          
                          var dmx = [];
                          var dmxNew = [];
                          var dmxNewPending = [];
                          
                          var roundValue;
                          var rounds;
                          var isRunning = 0;
                          var r;
                          var pending;
                          var stopExecution;
                          
                          function filterNull(noNull) {
                              return noNull >= 0;
                          }
                          
                          var initialize = function() {
                          
                              for (i = 0; i < '513'; i++) { 
                                  dmx[i] = 'null';
                                  dmxNew[i] = 'null';
                                  dmxNewPending[i] = 'null';
                          
                                  try {
                                      if (getIdByName("DMX_Channel_" + i) !== undefined) {
                                          if (getState("artnet.universe" + universe + ".DMX_Channel_" + i).val > 0) {
                                          dmx[i] = getState("artnet.universe" + universe + ".DMX_Channel_" + i).val;
                                          }
                                      } else if (i > 0) {
                                          createState("artnet.universe" + universe + "." + "DMX_Channel_" + i , {
                                              name: 'DMX_Channel_' + i,
                                              type: 'int',
                                              role: 'value',
                                              def: 0,
                                          });
                                          if (i == 512) {
                                              console.log("States wurden angelegt!");
                                          }
                                      }
                                  }   catch(e){}
                              }   
                          return idle();
                          };
                          
                          function idle() {
                          
                              var DMXAddress;
                              var DMXNewValue;
                          
                          on({id: /^javascript\.\d\.artnet.universe/, change: "ne"}, function (obj) {
                          
                              DMXAddress = obj.name.match(/\d+/);
                              DMXNewValue = parseInt(obj.state.val);
                              dmxNewPending[DMXAddress] = DMXNewValue;
                              clearTimeout(pending);
                              updateValues();
                          });
                          
                          }
                          
                          var updateValues = function() {
                          
                              pending = setTimeout(function () {
                                      if (dmxNew != dmxNewPending) {
                                          if (isRunning) {
                                              stopExecution = 1;
                                              clearTimeout(pending);
                                              return updateValues();
                                          } if (!isRunning) {
                                              stopExecution = 0;
                                              dmxNew = dmxNewPending.slice();
                                              for (i = 0; i < '513'; i++) { 
                                                  if (dmx[i] == 'null' && dmxNew[i] != 'null') {
                                                  dmx[i] = 0;
                                                  }
                                              }
                                              return executeArtnet();
                                          }
                                      }
                                  },500);
                          };
                          
                          var executeArtnet = function() {
                              isRunning = 1;
                              artnet = require('artnet')(options);
                          
                              var dmxOldMinMax = [];
                              var dmxNewMinMax = [];
                          
                              dmxOldMinMax = dmx.slice(1);
                              dmxNewMinMax = dmxNew.slice(1);
                          
                              dmxNewMinValue = Math.min(...dmxNew.filter(filterNull));
                              dmxNewMaxValue = Math.max(...dmxNew.filter(filterNull));
                              dmxOldMinValue = Math.min(...dmx.filter(filterNull));
                              dmxOldMaxValue =  Math.max(...dmx.filter(filterNull));
                          
                              dmxMaxValue = Math.max(dmxNewMaxValue, dmxOldMaxValue);
                              dmxMinValue = Math.min(dmxNewMinValue, dmxOldMinValue);
                          
                              roundsCalc = Math.round((dmxMaxValue - dmxMinValue)/(updateValueSkip + 1));
                              roundValue = 1 + updateValueSkip;
                              rounds = Math.abs(roundsCalc);
                              r = 0;
                              return runArtnet();
                          };
                          
                          var runArtnet = function() {
                          
                              setTimeout( function() {
                                  artnetStep();
                                  r++;
                                  if (stopExecution) {
                                      return closeArtnet();
                                  } 
                                  if (r <= rounds + 1) {
                                      return runArtnet();
                                  } if (r > rounds) {
                                      return closeArtnet();
                                  }        
                              },(1000/updatesPerSecond));
                          };
                          
                          function artnetStep() {
                              for (i = 0; i < '513'; i++) {
                                  if (i > 0 && dmxNew != 'null') {
                                      if (dmx[i] < dmxNew[i]) {
                                          if (dmx[i] + roundValue > 255) {
                                              dmx[i] = 255;
                                          } else if (dmx[i] == dmxNew[i]) {
                                              dmx[i] = dmxNew[i];
                                          //} else if (dmx[i] == 'null') {
                                              //dmx[i] = 1 + roundValue;
                                          } else {
                                              dmx[i] = dmx[i] + roundValue;
                                          }
                                      }
                                      if (dmx[i] > dmxNew[i]) {
                                          if (dmx[i] - roundValue <= 0) {
                                              dmx[i] = 0;
                                          //} else if (dmx[i] == dmxNew[i] || dmx[i] == 'null') {
                                          } else if (dmx[i] == dmxNew[i]) {
                                              dmx[i] = dmxNew[i];
                                          } else {
                                              dmx[i] = dmx[i] - roundValue;
                                          }
                                      }
                                  }
                              }
                          return artnet.set(universe, 1 , dmx.slice(1));
                          }
                          
                          var closeArtnet = function() {
                              artnet.close();
                              isRunning = 0;
                              return;
                          };
                          
                          initialize();` [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
                          
                          1 Reply Last reply Reply Quote 0
                          • A
                            alexw85 last edited by

                            Jetzt frage ich mich halt trotzdem noch wieso dieser blöde farbtastic Colorpicker bei mir so rumzappelt, hat da jemand eine Erklärung? An meinem Script kanns eigentlich nicht liegen und das es nicht auf Hexwerte umrechnet dürfte auch relativ egal sein, oder? Oder isses weil ich noch kein Ack sende??? Der RGB spectrum funktioniert ja auch einwandfrei, sieht aber net so schön aus und ist umständlicher zu bedienen… :?:

                            1 Reply Last reply Reply Quote 0
                            • Q
                              Qlink last edited by

                              Hi Alex,

                              gibts zu dem artnet adapter schon was neues ?

                              Kommt der irgendwann auch in die admin Oberfläche als neue Version zum installieren per Webbrowser ?

                              Beste Grüße

                              1 Reply Last reply Reply Quote 0
                              • A
                                alexw85 last edited by

                                @Qlink:

                                Hi Alex,

                                gibts zu dem artnet adapter schon was neues ?

                                Kommt der irgendwann auch in die admin Oberfläche als neue Version zum installieren per Webbrowser ?

                                Beste Grüße ` Ja kommt noch, allerdings wird das dieses Jahr nix mehr! 🙂

                                Aber das Javascript sollte funktionieren, habe bis jetzt noch keine Klagen und weitere Wünsche gehört!

                                Ich bastel jetzt gerade noch an einem Script für Bacnet, (etwas kompliziert das Ganze) dann gehts an die Adapter für Artnet, Resol Vbus und hoffentlich auch Bacnet 🙂

                                Gesendet von meinem SM-T819 mit Tapatalk

                                1 Reply Last reply Reply Quote 0
                                • smile
                                  smile last edited by

                                  Ich will hier auch nochmal ganz starkes Interesse daran bekunden, dass der Art Net Adapter nicht ausstirbt / vernachlässigt wird.

                                  Ich bin gerade dabei eine Brücke herzustellen von io.broker zu verschiedeneen DMX Licht Softwares / DMX Controllern.

                                  Da können sehr interessante Dinge bei herauskommen, denn insbesondere richtig spannende Installationen benötigen viele Kanäle und eine gute Steuerung - das kann meistens nur eine entsprchende Licht Software liefern, wie sie für Veranstaltungen aber auch Architekturbeleuchtung gedacht ist.

                                  Ich habe bei verschiedenen Herstellern nun bereits angefragt und stehe mit denen in Kontakt um die Möglichkeiten zu ergründen io.broker mit einer professionellen Licht Software zu verbinden.

                                  Wenn das geht dann können wir seeehr schicke Sachen damit machen.

                                  Daher - auch ich würde mich sehr freuen wenn der Art Net Adapter weiterentickelt wird, denn der spielt ein wichtige Rolle bei dem Thema.

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    alexw85 last edited by

                                    @smile:

                                    Ich will hier auch nochmal ganz starkes Interesse daran bekunden, dass der Art Net Adapter nicht ausstirbt / vernachlässigt wird.

                                    Ich bin gerade dabei eine Brücke herzustellen von io.broker zu verschiedeneen DMX Licht Softwares / DMX Controllern.

                                    Da können sehr interessante Dinge bei herauskommen, denn insbesondere richtig spannende Installationen benötigen viele Kanäle und eine gute Steuerung - das kann meistens nur eine entsprchende Licht Software liefern, wie sie für Veranstaltungen aber auch Architekturbeleuchtung gedacht ist.

                                    Ich habe bei verschiedenen Herstellern nun bereits angefragt und stehe mit denen in Kontakt um die Möglichkeiten zu ergründen io.broker mit einer professionellen Licht Software zu verbinden.

                                    Wenn das geht dann können wir seeehr schicke Sachen damit machen.

                                    Daher - auch ich würde mich sehr freuen wenn der Art Net Adapter weiterentickelt wird, denn der spielt ein wichtige Rolle bei dem Thema. `

                                    Hallo smile,

                                    ich kann dir folgen, du meinst wir machen der GrandMA bald konkurrenz? 🙂

                                    Aber ich vermisse hier so ein wenig Feedback ob das was ich da programmiert habe auch bei anderen funktioniert, obs gut oder schlecht ist, was noch fehlt usw. Der Adapter kommt definitiv, ein lauffähiges Script ist aber schon da. Welche funktionen stellst du dir denn beim Artnetcontroller vor?

                                    Gesendet von meinem SM-T819 mit Tapatalk

                                    1 Reply Last reply Reply Quote 0
                                    • smile
                                      smile last edited by

                                      Hey Alex, ich habe jetzt ein bisschen was an Hardware bestellt um den bisherigen Art-Net Adapter damit zu testen (und die entsprechenden Softwares gleich dazu).

                                      Ich bekomme schon Feedback von den Herstellern und langsam wird ein Schuh draus.

                                      Ich denke dass man nachher für ca. 150€ investieren kann um 4 DMX Universen mit einer Vielzahl an Szenen, Shows, Abläufen etc. über io.broker steuern und triggern zu können. Das wird super 😄

                                      Dein lauffähges Script habe ich noch nicht getestet, zum einen bin ich leider nicht so der Scripter sondern mache in io.broker eigentlich alles in Blockly (dafür damit aber auch viel^^) aber wenn ich die DMX Hardware hier habe dann werd ich da sicher auch mal nen Versuch wagen.

                                      Funktionstechnisch sinnvoll erscheinen mir momentan folgendes:

                                      • Intervall für alle Geräte gleichzeitig einstellbar (ist sonst bei jedem einzelnen je nach Anzahl ganz schönes geclicke)

                                      • Integration in Blockly (oben genannter Grund, denke das würde auch einige andere offener machen damit rumzutesten)

                                      • Unterstützung für mehrere Universen (geht evtl. schon sorry falls ich das übersehen habe)

                                      Das bezieht sich jetzt aufs Script / und den Adapter.

                                      Vielleicht macht hier mittelfristig eine Zusammenlegung Sinn?

                                      Funktionsideen direkt zum Script gebe ich gern wenn ich das ausgiebig getestet habe.

                                      Ich kümmere mich derweil weiter um die Konnektivität zu den angesprochenen Hardwares / Softwares…

                                      Super Arbeit von allen Beteiligten! Danke! :!:

                                      🙂

                                      1 Reply Last reply Reply Quote 0
                                      • Q
                                        Qlink last edited by

                                        @Qlink:

                                        Hi Bluefox,

                                        gibts schon Fortschritte beim Artnet Adapter bezüglich einer colorpicker (Farbwahlrad) Lösung in mobile ?

                                        Es wäre auch toll wenn es für jede Farbe wahlweise einen Ein/Aus Toggle Button geben würde, den man zusätzlich zu den Schiebereglner einblenden kann.

                                        Genial wären auch Buttons für vorgefertigte Playlisten/Programme, die bei Betätigung z.B. einen Kaminfeuereffekt, einen Wasserfalleffekt oder einen permanenten langsamen smoothen Farbwechsel starten.

                                        Beste Grüße `

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          alexw85 last edited by

                                          @smile:

                                          Hey Alex, ich habe jetzt ein bisschen was an Hardware bestellt um den bisherigen Art-Net Adapter damit zu testen (und die entsprechenden Softwares gleich dazu).

                                          Ich bekomme schon Feedback von den Herstellern und langsam wird ein Schuh draus.

                                          Ich denke dass man nachher für ca. 150€ investieren kann um 4 DMX Universen mit einer Vielzahl an Szenen, Shows, Abläufen etc. über io.broker steuern und triggern zu können. Das wird super 😄

                                          Dein lauffähges Script habe ich noch nicht getestet, zum einen bin ich leider nicht so der Scripter sondern mache in io.broker eigentlich alles in Blockly (dafür damit aber auch viel^^) aber wenn ich die DMX Hardware hier habe dann werd ich da sicher auch mal nen Versuch wagen.

                                          Funktionstechnisch sinnvoll erscheinen mir momentan folgendes:

                                          • Intervall für alle Geräte gleichzeitig einstellbar (ist sonst bei jedem einzelnen je nach Anzahl ganz schönes geclicke)

                                          • Integration in Blockly (oben genannter Grund, denke das würde auch einige andere offener machen damit rumzutesten)

                                          • Unterstützung für mehrere Universen (geht evtl. schon sorry falls ich das übersehen habe)

                                          Das bezieht sich jetzt aufs Script / und den Adapter.

                                          Vielleicht macht hier mittelfristig eine Zusammenlegung Sinn?

                                          Funktionsideen direkt zum Script gebe ich gern wenn ich das ausgiebig getestet habe.

                                          Ich kümmere mich derweil weiter um die Konnektivität zu den angesprochenen Hardwares / Softwares…

                                          Super Arbeit von allen Beteiligten! Danke! :!:

                                          🙂 ` Hallo Smile,

                                          also ich habe einen Raspberry als Artnet Node, da gibts die Software OLA (OpenLightingArchitecture) und für paar Euro auch ne fertige RS485 Platine über die man dann DMX schicken kann. Aber was jetzt letztendlich aus Artnet DMX macht ist egal.

                                          Das Script ist immer für ein Universum zuständig, willst du mehr Universen, muss das Script mehrmals laufen.

                                          Wertänderungen werden momentan folgendermaßen durchgeführt:

                                          Im Script lege ich mit updatesPerSecond fest wie oft Wertänderungen pro Sekunde gesendet werden.

                                          Mit der Variable updateValueSkip lege ich fest um wieviel mehr als 1 sich der Wert mit jedem Update erhöht oder verringert. Standard ist 0, liegt der Wert bei 1 wird mit jedem Update der Wert um 1 + 1 (=2) geändert, liegt der Wert bei 2, wird mit jedem Update der Wert um 1 + 2 (=3) geändert usw.

                                          Beispiel:

                                          DMX Adresse 1 wird von 0 auf 100 geändert

                                          DMX Adresse 2 wird von 0 auf 255 geändert

                                          DMX Adresse 3 wird von 0 auf 50 geändert

                                          DMX Adresse 4 wird von 0 auf 25 geändert

                                          updatesPerSecond: 25

                                          updateValueSkip: 1

                                          Dauer bis zum erreichen der Zielwerte

                                          DMX1 = 2 Sekunden

                                          DMX2 = 5 Sekunden

                                          DMX3 = 1 Sekunde

                                          DMX4 = 0,5 Sekunden

                                          Das gibt momentan natürlich Farbeffekte die ich persönlich eher positiv als negativ sehe, aber da denke ich mir noch ne andere Formel zum rechnen aus wenn ich mal ein paar ruhige Minuten habe! 🙂

                                          Mit Blockly ist das aber leider nicht abzubilden, dafür wird da viel zu viel gerechnet usw.

                                          Gesendet von meinem SM-G955F mit Tapatalk

                                          1 Reply Last reply Reply Quote 0
                                          • Q
                                            Qlink last edited by

                                            Ich habe mir bei aliexpress ebenfalls noch einen DMX -> 0-10V Decoder geholt, um damit meine LEDs dimmen zu können.

                                            https://www.aliexpress.com/item/DMX512- … 0.0.xHf1uN

                                            Bin aber noch nicht dazu gekommen das Ding zu verkabeln bzw. zu montieren...

                                            Ansonsten wären meine Anregungen 2 Posts weiter oben eine super Sache, wenn sich das im Adapter wiederfindet ...

                                            Beste Grüße

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            896
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            14
                                            144
                                            21743
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo