NEWS
Adapter für Senic Nuimo
-
Hallo Zusammen,
ich beschäftige mich im Moment mit der Entwicklung eines Adapter für den Nuimo vom Berliner Startup Senic.
Hat ne super Haptik und meine Göttergattin liegt mir schon seit Jahren in den Ohren, warum man das Licht denn nicht mit einem Drehknöpfchen dimmen kann.
Funktionell kann es sicher noch etwas dazulernen - Die aktuelle Software muss ja Endanwenderfreunlich sein - aber in Verbindung mit IOBroker können wir Bastler da bestimmt noch einiges mehr mit anstellen.
Habe bisher leider noch keinen Adapter entwickelt, daher tauchen natürlich noch ein paar Fragen auf und ich hoffe, dass mir hier zwischendurch jemand ein paar Tipps geben kann, damit ich nicht ganz so viel durch trail and error herausfinden muss.
Aktueller Stand von heute ist, dass ich den Template Adapter geladen, umbenannt und installiert habe.
Ich habe die passende nuimojs library geladen (https://github.com/nathankunicki/nuimojs) und eingebunden.
Der Adapter startet bereits korrekt, findet und verbindet sich auch mit dem Nuimo.
Ich kann das DotMatrix Display ansteuern und außerdem bekomme ich schon alle Userinteraktionen mit dem Gerät mit.
Nun ist für mich die Frage, was die bestehe Herangehensweise für die Events ist.
Es gibt folgende Events:
Press
Release
Rotate inkl. eines relativen Gesschwindkeitswertes
Swipe (left,right,up,down)
Fly (Berührungslose Wischgeste links oder recht)
Detect (Hand in der Nähe vom Gerät erkannt ink. Entfernungsangabe
Der Nutzer des Adapters soll ja diese in einem eigenen Javascript subscriben können um dann etwas zu machen.
Muss ich für jeden Event ein State erzeugen und dann bei Auslosung jeweils den State aktualisieren?
Dann wäre die Frage, wenn ich z.B. einen state für „rotate“ anlege und dort den Geschwindigkeitswert eintrage, müsste der Wert dann nicht zurückgesetzt werden, damit das Event nicht mehrfach getriggert wird?
Würde mich freuen, wenn mir jemand erklären kann wie man das am besten Löst.
Viele Grüße,
Malte
-
Hallo Zusammen,
ich beschäftige mich im Moment mit der Entwicklung eines Adapter für den Nuimo vom Berliner Startup Senic.
Hat ne super Haptik und meine Göttergattin liegt mir schon seit Jahren in den Ohren, warum man das Licht denn nicht mit einem Drehknöpfchen dimmen kann.
Funktionell kann es sicher noch etwas dazulernen - Die aktuelle Software muss ja Endanwenderfreunlich sein - aber in Verbindung mit IOBroker können wir Bastler da bestimmt noch einiges mehr mit anstellen.
Habe bisher leider noch keinen Adapter entwickelt, daher tauchen natürlich noch ein paar Fragen auf und ich hoffe, dass mir hier zwischendurch jemand ein paar Tipps geben kann, damit ich nicht ganz so viel durch trail and error herausfinden muss.
Aktueller Stand von heute ist, dass ich den Template Adapter geladen, umbenannt und installiert habe.
Ich habe die passende nuimojs library geladen (https://github.com/nathankunicki/nuimojs) und eingebunden.
Der Adapter startet bereits korrekt, findet und verbindet sich auch mit dem Nuimo.
Ich kann das DotMatrix Display ansteuern und außerdem bekomme ich schon alle Userinteraktionen mit dem Gerät mit.
Nun ist für mich die Frage, was die bestehe Herangehensweise für die Events ist.
Es gibt folgende Events:
Press
Release
Rotate inkl. eines relativen Gesschwindkeitswertes
Swipe (left,right,up,down)
Fly (Berührungslose Wischgeste links oder recht)
Detect (Hand in der Nähe vom Gerät erkannt ink. Entfernungsangabe
Der Nutzer des Adapters soll ja diese in einem eigenen Javascript subscriben können um dann etwas zu machen.
Muss ich für jeden Event ein State erzeugen und dann bei Auslosung jeweils den State aktualisieren?
Dann wäre die Frage, wenn ich z.B. einen state für „rotate“ anlege und dort den Geschwindigkeitswert eintrage, müsste der Wert dann nicht zurückgesetzt werden, damit das Event nicht mehrfach getriggert wird?
Würde mich freuen, wenn mir jemand erklären kann wie man das am besten Löst.
Viele Grüße,
Malte `
Für jedes Event ein State zu haben ist nicht verkehrt. Würde ich genauso machen.Allerdings die Frage :
> müsste der Wert dann nicht zurückgesetzt werden, damit das Event nicht mehrfach getriggert wird?
verstehe ich nicht.Für rotate o.ä. wurde ich 2 states anlegen:
-
rotate: true/false
-
rotateSpeed: number
BTW : das Gerät ist wirklich geil. Schade das es so teuer ist.
-
-
BTW : das Gerät ist wirklich geil. Schade das es so teuer ist. `
Jetzt gerade ist das Ding übrigens für 15% in den Amazon Blitzangeboten:https://www.amazon.de/dp/B01EFZS8KE/ref … SHRFPY3W0Z
Und nein: Ich arbeite nicht bei denen
Allerdings die Frage :
verstehe ich nicht.
Für rotate o.ä. wurde ich 2 states anlegen:
-
rotate: true/false
-
rotateSpeed: number `
Okay, also der Adapter läuft schonmal und verbindet sich automatisch mit dem nächst besten Nuimo.
Die eindeutigen Aktionen werden erkennt und passende States gesetzt, also z.B. pressed oder swipedRight…
Einen State zum aktualisieren der LED Matrix (9x9 Punkt) gibt es auch. Reicht grundsätzlich für den Basteleinsatz schon.
Beim Rotate ist es so, dass ich Eventmäßig nur die Info bekomme, dass mit einer bestimmten Geschwindigkeit gedreht wird, es gibt also keinen absoluten Wert. Das Event wird mehrmals pro Sekunde ausgelöst.
Was ich jetzt im Adapter noch abbilden muss, wären quasi ein Event rotationBegan und rotationEnded.
Denn erstens muss ich während der Drehung die Geschwindkeiten um Auge behalten, um daraus einen absoluten Wert zu machen (Z.B. Thermostat temperatur) außerdem will ich ja nicht jedes mal wenn der roateEvent ausgelöst wird den state vom Heizungsthermostaten updaten.
Diese Events muss ich dann wohl noch im Adapter selbst erzeugen und ein paar Komfortfunktionen z.B. Direkt Ziffern auf die LED Matrix schreiben, ohne dafür die LEDMatrix als BOOLArray übergeben zu müsen.
-
-
Hm. Mein Nuimo ist schon da, aber ich finde kein Adapter dafür?
Gibt es irgendwo? Was braucht man um mit den sich zu verbinden? Von Raspi Z.B?
-
Hi,
also ich habe das Ding jetzt gerade auf GitHub gepusht. Ich hoffe das klappt so, ist ja mein erster Adapter und mit Node.js, npm usw. habe ich kaum Erfahrungen. Den Code müsste ich eigentlich nochmal aufräumen und bereinigen, aber ich will da heute eh noch ran.
Wenn ich es richtig verstanden habe, muss ich dich jetzt auffordern folgendes zu tun:
npm install https://github.com/Muskelkatermann/ioBroker.nuimo/tarball/master/
Allerdings bin ich mir nicht sicher ob die ioBroker.nuimo Schreibweise so richtig ist. Aber im Zweifelsfall kann man es ja erstmal klonen und manuell installieren.
Die Library nathankunicki/nuimojs (https://github.com/nathankunicki/nuimojs) liegt jetzt erstmal statisch im Adapter im Unterorder node_modules (Bin mir nicht sicher ob man dafür einfach irgendwo eine Abhängigkeit hätte angeben können)
Für nuimojs gibt es folgende Anforderungen:
` > Node.js v6.0+ required.npm install nuimojs –save
Nuimo.js uses the Noble BLE library by Sandeep Mistry. On macOS everything should function out of the box.]On Linux and Windows there are certain dependencies which may need installed first:
https://github.com/sandeepmistry/noble#prerequisites
Note: Nuimo.js has been tested on macOS 10.11 and Debian/Raspbian on the Raspberry Pi 3 Model B. `
Ich selbst teste im Moment auf einem Mac, daher lief es auch out of the box.
Sobald der Adapter läuft verbindet er sich mit dem ersten Nuimo den er findet, legt ein Object gemäß der UUID des Gerätes an und erzeugt die States.
Eine Konfiguration ist nicht notwendig.
Danach kann man sich direkt ein Javascript bauen:
var nuimo = "nuimo.0.1464b65de75542c5b82a7cb6a3be91a0."; on({id: nuimo+"pressed", valNe: false}, function(obj) { var display = "000000000"+ "011001110"+ "100101001"+ "100101001"+ "111101111"+ "100101001"+ "100101001"+ "100101110"+ "000000000"; setState(nuimo+"dotMatrix", display); }); on({id: nuimo+"rotationSpeed", valNe: false}, function(obj) { log("Rotate","info"); });
Ich habe im Moment noch folgendes auf der Liste:
Eventhandling für Rotation wie oben beschrieben
Was macht der Adapter wenn mehrere Numinos in Reichweite sind
Einen state für die LED Matrix anlegen, mit dem man direkt Zahlen anzeigen kann ohne die Matrix kompliziert zusammen zu basteln
Eine state anlegen mit dem man "Modis" unterscheiden kann, sodass man per Swipe zwischen Licht, Sonos, Heizung usw. wechseln kann
-
Habe jetzt nochmal eine neue Version gepusht, bei der ich die Rotationsthematik besser umgesetzt habe.
on({id: nuimo+"rotationBegan", valNe: false}, function(obj) { setState(nuimo+"rotationFactor",0.005); // Sets the ratio between hardware rotation and locical rotation setState(nuimo+"rotationAbsolute",22); // Inital Rotation value, for example current TV Volume }); on({id: nuimo+"rotationAbsolute", valNe: false}, function(obj) { var matrix = Math.round(getState(nuimo+"dotMatrixNumber").val); var newVal = Math.round(obj.state.val); if(matrix!=newVal) { // Update LEDMatrix setState(nuimo+"dotMatrixNumber",Math.round(obj.state.val)); if(newVal-matrix >= 1) { // Value increase, increment connected state setState("lgtv.0.volumeUp",true); }else if(newVal-matrix <= -1) { // Value decreased, decrement connected state setState("lgtv.0.volumeDown",true); } } }); on({id: nuimo+"rotationEnded", valNe: false}, function(obj) { log("rotationEnded","info"); });
Sieht dann in Live so aus:
https://www.youtube.com/watch?v=emIdnk4Ix9k
Habe den Adapter noch nicht im Live System.
Wenn man so z.B. einen Homematic Thermostaten ansteuern würde, würde man in rotationAbsolute natürlich nur die LED Anzeige aktualisieren und erst wenn rotationEnded getriggert wird, den state für die Solltemperatur auf den aktuellen wer von rotationAbsolute stellen.
Werde jetzt nochmal den Entwickler von Senic anschreiben, ob man die transition der LED Helligkeit beeinflussen kann, das ist beim Werte umschalten ja nicht gerade elegant.
-
Hallo nochmal ein, zwei allgemeine Fragen zur Adapterentwicklung:
Wenn ich einen state Anlege
adapter.setObject(device.uuid+'.dotMatrixBrightness', { type: 'state', common: { name: 'dotMatrixBrightness', type: 'number', role: 'indicator' }, native: {} });
Was ist dann der eleganteste Weg erstmalig einen defaultValue zu setzen?
Wenn ich den Wert vom State oben dann in der Programmierung verwenden muss, wie kann ich am besten (möglichst direkt) darauf zugreifen?
Bisher habe ich als Krücke nur die Möglichkeit gefunden bei der Scriptinitialisierung den Wert per getState asynchron zu holen und in eine scriptinterne Variable zu übertragen, bei adapter.on('stateChange', function (id, state) { muss ich Änderungen des Wertes zusätzlich noch überwachen um ihn in meine interne Hilfsvariable zu übertragen. Das muss doch einfacher gehen, oder?
-
Hallo nochmal ein, zwei allgemeine Fragen zur Adapterentwicklung:
Wenn ich einen state Anlege
adapter.setObject(device.uuid+'.dotMatrixBrightness', { type: 'state', common: { name: 'dotMatrixBrightness', type: 'number', role: 'indicator' }, native: {} });
Was ist dann der eleganteste Weg erstmalig einen defaultValue zu setzen?
Da wo role und type sind, noch def zu schreiben. Dieses Wert wird automatisch beim Erzeugung eingetragen.
Ich empfehle noch min und max zu definieren. Das ermöglicht mobile zu benutzen.
<code>Wenn ich den Wert vom State oben dann in der Programmierung verwenden muss, wie kann ich am besten (möglichst direkt) darauf zugreifen? Bisher habe ich als Krücke nur die Möglichkeit gefunden bei der Scriptinitialisierung den Wert per getState asynchron zu holen und in eine scriptinterne Variable zu übertragen, bei [i]adapter.on('stateChange', function (id, state) {[/i] muss ich Änderungen des Wertes zusätzlich noch überwachen um ihn in meine interne Hilfsvariable zu übertragen. Das muss doch einfacher gehen, oder? Es gibt tatsächlich kein direkter Zugang auf Zustand. Ich mache immer so, dass beim Start alle Zustände abholen, auf die subscriben und dann beim stateChange Ereignis updaten. Vielleicht muss man dass in Adapter.js auswandern. Ist gute Idee. Aber es wird dauern.</code> ``` `
-
Okay, danke ist ja kein Problem die werte beim Start auszulesen.
Kann ich denn aus dem JavaScript Adapter heraus auch auf Funktionen des Nuimo Adapters zugreifen, um z.B. eine Hilfsfunktionen für die ausgestalten der Matrix ausliefern zu können, oder müsste das auch über States abgebildet werden?
-
Okay, danke ist ja kein Problem die werte beim Start auszulesen.
Kann ich denn aus dem JavaScript Adapter heraus auch auf Funktionen des Nuimo Adapters zugreifen, um z.B. eine Hilfsfunktionen für die ausgestalten der Matrix ausliefern zu können, oder müsste das auch über States abgebildet werden? `
Nein. Du kannst nicht zugreifen.Ich denke du solltest Zustand analysieren und wenn die Länge 1 ist, dann vordefinierte Symbole verwenden.
-
Hallo,
ich versuche den Adapter auf einem Raspberry Pi 2 Model B mit ioBroker_Image_RPi_2-3_20171122_stretch.zip zu implementieren.
Der Adapter wurde durch npm install https://github.com/Muskelkatermann/ioBr … ll/master/ hier abgelegt: /opt/iobroker/node_modules/ioBroker.nuimo/
Auf dem Reiter "Adapter" erscheint danach, wie erwartet, ein weiterer Eintrag: "ioBroker nuimo Adapter"
Das Hinzufügen einer Instanz dieses Adapters führt jedoch zu einer Fehlermeldung:
Fenster: Kommando Ausführen
$ ./iobroker add nuimo
ERROR: host io.Broker-Pi Unknown packetName nuimo
ERROR: process exited with code 5
Die "statische Erweiterung" mit nuimojs ist leider veraltet. Seit August 2017 gibt es die Version 1.0.3. Das Ausführen der Beispielprogramme unter "exampes" funktioniert aber korrekt: info.js, interaction.js und led.js
Ich möchte gerne nuimo mit ioBroker verwenden und freue mich deshalb über jede Unterstützung!