NEWS
Art-Net
-
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
-
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
-
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]
-
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]
-
Danke, ich hoffe, dass ich morgen, sonst am WE zum ausprobieren komme. Wenn es funktioniert teile ich die weiteren Wuensche mit
-
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]
-
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] ``` `
-
Sollst du wohl hinbekommen
-
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]
-
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… :?:
-
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
-
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
-
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.
-
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
-
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! :!:
-
-
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 `
-
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
-
-
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
-
Ich habe mir bei aliexpress ebenfalls noch einen DMX -> 0-10V Decoder geholt, um damit meine LEDs dimmen zu können. `
Hallo,
da ich das Ganze hier mal so mitverfolge…
Aber du weißt schon, dass ein 0-10V Lichtsystem nichts mit LED-Dimmer zu tun hat!?
LED´s werden in der Regel über PWM gedimmt.
... es sei denn, du hast eine 0-10V-Lichtsteuerung.
-
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 ` Der Adapter der existiert hat leider mit dem Script nicht viel zu tun, das Script nutzt lediglich den selben Artnet Protokoll Stack von hobbyquaker wie der Adapter. Ich hab das neu geschrieben weil der Adapter mit mehr als einer Wertänderung gleichzeitig nicht klar kommt, das Script sendet das komplette Universe und arbeitet komplett anders und ermöglicht flüssiges Faden eines ganzen Universes und gruppieren mehrer Adressen über den Szenenadapter.
Für den Adapter hab ich einige Ideen, warte aber auf ein paar Anregungen die ja wohl jetzt langsam kommen!
Gesendet von meinem SM-G955F mit Tapatalk