NEWS
[neuer Adapter] Dali
-
Hallo Ihr,
ich bin in den letzten Tagen beschäftigt einen Dali Modbus-fähigen Controller (Dali4Net) mit ioBroker zu verbinden. Das klappt auch alles sehr gut. Da inzwischen das Skript riesig geworden ist, kam mir die Idee, daraus meinen ersten Adapter zu basteln.
Ich hab es inzwischen auf mehrere Skripte aufgeteilt. Und wenn ich das bei anderen Adapter richtig gedeutet hab, kann man z.B. mitconst common = require(__dirname + '/common.js');
Die Skripte miteinander verbinden. Sehe ich das richtig?
Nächste Frage:
Ich möchte gerne beim Start des Adapters prüfen, welche der max 64 Lampen da sind.
[kleine Info: bei Dali gibts vordefinierte Adressen für die Lampen]var DaliAdressLight = ["A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13","A14","A15","A16","A17","A18","A19","A20","A21","A22","A23","A24","A25","A26","A27","A28","A29","A30","A31","A32","A33","A34","A35","A36","A37","A38","A39","A40","A41","A42","A43","A44","A45","A46","A47","A48","A49","A50","A51","A52","A53","A54","A55","A56","A57","A58","A59","A60","A61","A62","A63"] var HexAdressLight = ["01","03","05","07","09","0B","0D","0F","11","13","15","17","19","1B","1D","1F","21","23","25","27","29","2B","2D","2F","31","33","35","37","39","3B","3D","3F","41","43","45","47","49","4B","4D","4F","51","53","55","57","59","5B","5D","5F","61","63","65","67","69","6B","6D","6F","71","73","75","77","79","7B","7D","7F"] firstRun() function firstRun(i){ i = 0; checkLamp(i); //Hier fehlt noch if mit existiert die Lampe schon!!! } function checkLamp(i){ setTimeout (function(){ if (i < HexAdressLight.length){ var hexlight = "0x" + HexAdressLight[i]; log("ID " + hexlight) light = DaliAdressLight[i]; getLampState(hexlight); } else {log("Durchlauf beendet")} },500); } function getLampState(hexlight){ // Erstelle Transaction ID var transid = Transaction_Identifier(); //Hex Nachricht erstellen var hex_data = ["0x00",transid, "0x00","0x00","0x00","0x17",BusNr,"0x17","0x00","0x65","0x00","0x05","0x00","0x64","0x00","0x06","0x0c","0x12",transid,"0x00","0x03","0x00","0x00",hexlight,Query,"0x00","0x00","0x00","0x00" ] var data = Buffer.from(hex_data); sendMessage(ip, port, data); } function sendMessage(host, port, data) { var client = net.connect({host:host, port: port}, function () { log('connected to server!'); log("Message " + JSON.stringify(data)) client.write(data); }); client.on('data', function (data) { log("Response " + data.toJSON().data) log("Resp " + JSON.stringify(data)); checkLamp(i++) response(data); client.end(); }); client.on('end', function () { log('disconnected from server'); }); client.on('error', function (error) { console.error('error: ' + error); client.end(); }); } function Transaction_Identifier (){ const min = 0; const max = 253; const x = Math.floor(Math.random() * (max - min)) + min; return "0x" + x.toString(16); } function response (data){ var obj = [] obj = data.toJSON().data if (obj[10]==130){ log("Lampe existiert: " + light) createState(light,{ name: "Lampe " + light, role: "state", type: "number", read: true, write: true, min: 0, max: 100, def: 0, unit: "%" }); } else{log("Lampe nicht vorhanden")} }
Dabei wird ein Datenpunkt erstellt.
Jetzt möchte ich aber später diese Funktion nutzen:on({id: light , change: "any"},function (obj) { var value = obj.state.val; var name = obj.common.name; CreateLampHex(value, name); });
Kann ich das auch so erstellen lassen und vielleicht sogar noch in ein spezielles Skript kopieren?
Oder ist es sinnvoller sowas von vorne rein als Vorlage zu erstellen? -
Das mit dem require hab ich inzwischen hinbekommen. Kann nun in main.js eine andere Datei (firstStep.js) aufrufen. Und bekomme ein Ergebnis zurück.
//main.js const test = require('./lib/firstStep'); const bla = test; this.log.info('Test bla: ' + bla);
//firstStep.js let test = 'hallo'; console.log('config Bus0: ' + test); module.exports = test;
Wie kann ich nun Variablen übergeben? Noch besser, wo wird die Konfiguration, die man in einem Adapter eingibt abgespeichert? Dann kann ich diese doch bestimmt direkt in der zweiten Datei abrufen.
-
@Malaus hast du zum erstellen den Adapter Creator verwendet? Gibt es schon ein Repo wo man etwas nachschauen kann?
@Malaus sagte in [neuer Adapter] Dali:
Wie kann ich nun Variablen übergeben?
Möchtest du Variablen an dein "firstStep" übergeben? Da musst du entweder Funktionen definieren oder eine Klasse erstellen, die du dann exportierst und dann mit Parametern aufrufst.
@Malaus sagte in [neuer Adapter] Dali:
Jetzt möchte ich aber später diese Funktion nutzen:
Du möchtest also beim ändern eines States eine Lampe erstellen, verstehe ich da richtig? Dazu gibt es Events die du im Adapter nutzen kannst.
-
@J-A-R-V-I-S
ich hab inzwischen zwei Adapter mit dem Adapter Creator gemacht.
Einmal mit create-adapter v1.23.0 und create-adapter v1.17.0.Bei v1.23.0 (Konsole) ging der Adapter sofort auf Grün aber es hat mir "setObjectNotExist" nicht anerkannt. Daher hab ich nun nochmal von vorne angefangen und mit v1.17.0. (Html Seite) einen neuen erstellt. Den bekomm ich nun aber nicht auf Grün.
Zu Variablen übergeben:
Also funktioniert das ganz normal, wie bei JavaScript? Nur das es in diesem Fall global ist?test(varibale1, variable2); function test (variable1, variable2){ .... }
Ich möchte das es später einen Button im Adapter gibt, wo man neue Lampen suchen kann. Das, dann bei FirstStep alles abgewickelt (Neuer Datenpunkt setzen usw...) wird.
Dann gibts es eine weitere Datei, die regelmäßig alle Lampen abfragt (TCP Befehl), ob sich deren State geändert hat und falls ja, dies in den Datenpunkt einträgt.
Also grundsätzlich gleiches Prinzip, wie z.B. der Zigbee Adapter. Hab auch schon so gut wie alles mit dem JavaScript Adapter geschrieben. Muss es also nur noch etwas übersetzen und anpassen.
Hoffe das war verständlich erklärt. Falls nicht, gerne fragen.
Was immoment meine Herausforderung ist, ist den Adapter auf grün zu bekommen, damit ich mal anfangen kann zu testen, ob ich nun den Befehl "setObjectNotExist" ausführen kann oder nicht.
Hat wahrscheinlich einen Vorteil, wenn ich es schon mal auf Github lade, damit z.B. du schon mal ein Auge drauf werfen kannst oder? -
@Malaus soweit habe ich eserstmal verstanden. Nur ohne Code ist es ein bisschen schwierig dir zu helfen.
Push deine Repos am besten mal auf Github, dann kann man mal über den Code schauen.
@Malaus sagte in [neuer Adapter] Dali:
Bei v1.23.0 (Konsole) ging der Adapter sofort auf Grün aber es hat mir "setObjectNotExist" nicht anerkannt. Daher hab ich nun nochmal von vorne angefangen und mit v1.17.0. (Html Seite) einen neuen erstellt. Den bekomm ich nun aber nicht auf Grün.
Am besten sollte aber immer die neuste Version verwendet werden, da dort Fehler bzw Verbesserungen mit drin sind, um Adapter leichter zu erstellen. Wenn es dann noch nicht funktioniert, dann kann man besser nochmal drüberschauen. Lade die aber erstmal hoch.
-
@J-A-R-V-I-S
hier ist der Link:
https://github.com/Malaus-io/ioBroker.dali -
@Malaus hast du heute Zeit um mal in den TS zu kommen? Kannst mir sonst auch eine PN schicken.