NEWS
Befehle von Neeo nach ioBroker senden
-
Anbei die Vorgehensweise, um von der Neeo-Fernbedienung Befehle an ioBroker zu senden.
Voraussetzung ist Node.js, ioBroker läuft auf einem Raspberry Pi 4.
Zuerst muss die Neeo-SDK installiert werden.
npm install git+https://github.com/NEEOInc/neeo-sdk.git
Optional können noch Beispiel SDK´s installiert werden, welche dann unter /home/pi/node_modules erscheinen.
npm install git+https://github.com/NEEOInc/neeo-sdk-examples.git
Danach muss ein Treiber installiert werden, um die Kommunikation von Neeo zu ioBroker zu ermöglichen.
npm install git+https://github.com/nklerk/neeo_driver-simple.git
Jetzt muss die Datei index.js im Ordner /home/pi/node_modules/neeo_driver-test geöffnet werden. Ich selber habe dafür die Remoteverbindung benutzt. Natürlich kann dies auch über Putty gemacht werden.
"use strict"; const neeoapi = require("neeo-sdk"); const http = require("http.min"); let actualDriverObject; actualDriverObject = neeoapi.buildDevice("My first driver"); // change "My first driver" to anything you like but keep the "" characters actualDriverObject.setType("ACCESSOIRE"); // can be changed to "ACCESSOIRE" or "AVRECEIVER" or "DVB" or "DVD" or "GAMECONSOLE" or "LIGHT" or "MEDIAPLAYER" or "MUSICPLAYER" or "PROJECTOR" or "TV" or "VOD" actualDriverObject.addButton({ name: "button-a", label: "Button A" }); // This makes a new button named button-a, on the remote its shown as Button A actualDriverObject.addButton({ name: "button-b", label: "Button B" }); // This makes a new button named button-b, on the remote its shown as Button B actualDriverObject.addButton({ name: "button-c", label: "Button C" }); // This makes a new button named button-c, on the remote its shown as Button C actualDriverObject.addButton({ name: "button-d", label: "Button D" }); // This makes a new button named button-d, on the remote its shown as Button D // Here is the code that gets executed when a button is pressed. actualDriverObject.addButtonHandler((buttonName, deviceId) => { console.log(`[CONTROLLER] ${buttonName} button pressed`); if (buttonName == "button-a") { http("http://www.google.com"); //Just sneds a http get, use this to controll devices that supports a http get } if (buttonName == "button-b") { http("http://www.google.com"); } if (buttonName == "button-c") { http.post("https://httpbin.org/post", { data: "hello" }); //Sends a http post with json data {data: "hello"} } if (buttonName == "button-d") { http.post("https://httpbin.org/post", { data: "hello" }); } }); // change this to set your NEEO brain IP. change 10.2.1.64 to the IP address of your NEEO brain. const neeoSettings = { brain: "192.168.1.80", port: 1104, name: "eigeneTasten", devices: [actualDriverObject] }; /////////////////////////////////////////////////////////////////////////////////////////////////// // Do not change the code below this point. /////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// // Do not change the code below this point. /////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// // Do not change the code below this point. /////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// // Do not change the code below this point. /////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// neeoapi .startServer(neeoSettings) .then(() => { console.log("# READY! use the NEEO app to search for: " + actualDriverObject.devicename); if (actualDriverObject.type == "ACCESSOIRE") { console.log("\r\n ACCESOIRE devices do not have their own recipy slides."); console.log(" You need to add the buttons as shortcuts to an existing device slide,"); console.log(" add a dummy device (search for dummy) and add the buttons as shortcut there or"); console.log(" change the actualDriverObject.setType line to present this driver as a different device type."); } }) .catch(err => { console.error("ERROR!", err); process.exit(1); });
In der Zeile 32 muss die IP-Adresse des Brains eingetragen/ersetzt werden.
In der Zeile 17 muss ein *http get"-Befehl hinterlegt werden. Dieser wird dann gesendet, wenn die Taste "button-a" gedrückt wird. Meiner sieht hier wie folgt aus:if (buttonName == "button-a") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=A");
Die IP-Adresse ist diese von ioBroker (Raspberry Pi), der Datenpunkt welcher der gesteuert werden soll. Dieser muss vorgängig erstellt werden. Bei mir schickt der Button A den Wert "A" an den Datenpunkt, Button B den Wert "B", usw.
Ausserdem muss noch der Simple RESTful API-Adapter in ioBroker installiert werden.Wenn die index.js angepasst und gespeichert wurde, dann können wir wieder zurück zu Putty wechseln und starten dann den Treiber wie folgt:
node /home/pi/node_modules/neeo_driver-test
Der Treiber wird nun geladen und in der Neeo-App kann nach einem neuen Device nach "neeo_driver-test" suchen. Wurde dies gefunden und einem Raum zugeordnet, dann können im gewünschten Recipe die Buttons eingefügt werden. Werden diese gedrückt, dann ändert sich der Datenpunkt in ioBroker.
Wird der Treiber im Putty beendet, dann funktionieren die Tasten auf der Neeo nicht mehr.
Dies habe ich gelöst, indem ich mit Blockly eine Javascript-Funktion mit folgendem Befehl erstellt habe:exec('node /home/pi/node_modules/neeo_driver-test');
Natürlich kann der Treiber auch per Autostart vom Raspberry Pi gestartet werden. Damit kenne ich mich aber noch zu wenig aus.
In Blockly kann dann definiert werden, was bei der Änderung des Datenpunktes geschehen soll.
Ich habe zu Testzwecken die Tasten den Shellys für auf/ab zugeordnet. -
@Kusi Hier habe ich schon mal einen Treiber gefunden, bei dem Du HTTP Requests absetzen kannst:
https://github.com/nklerk/neeo_driver-simplehttps://github.com/nklerk/neeo_driver-simple/blob/master/index.js
aus
-
@mickym Der Treiber konnte ich auf meiner Neeo laden. Die Tasten A, B, C und D konnte ich einfügen.
Wie muss folgende Codezeilen abgeändert werden, damit "http get" funktioniert?
// Here is the code that gets executed when a button is pressed. actualDriverObject.addButtonHandler((buttonName, deviceId) => { console.log(`[CONTROLLER] ${buttonName} button pressed`); if (buttonName == "button-a") { http("http://www.google.com"); //Just sneds a http get, use this to controll devices that supports a http get } if (buttonName == "button-b") { http("http://www.google.com"); } if (buttonName == "button-c") { http.post("https://httpbin.org/post", { data: "hello" }); //Sends a http post with json data {data: "hello"} } if (buttonName == "button-d") { http.post("https://httpbin.org/post", { data: "hello" }); } });
-
@Kusi mach mal einen DP unter 0_userdata.0 also z.Bsp 0_userdata.0.test
-
@Kusi Du könntest ggf. den Treiber noch automatisch starten - bin mir aber nicht ganz sicher, ob das so funktioniert wie ich mir das denke:
Du könntest eine neue Datei erstellen
sudo nano /etc/systemd/system/neeo_simple.service
In diese neue Datei kannst mal probieren, ob das mit folgenden Einträgen funktioniert:
[Unit] Description=Neeo Simple Service Wants=network.target After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/node_modules ExecStart=node /home/pi/node_modules/neeo_driver-test Restart=no [Install] WantedBy=multi-user.target
dann Service bekannt machen
sudo systemctl daemon-reload
dann mal versuchen zu starten (vorher stoppen, wenn das vorher mit iobroker schon gestartet war):
sudo systemctl start neeo_simple
Überprüfen ob das Ding läuft geht ohne sudo
systemctl status neeo_simple
wenn das alles klappt und Du auf Deiner Fernebdienung Deine Tasten siehst - dann mit
sudo systemctl enable neeo_simple.service
dafür sorgen, dass der Dienst nach dem Hochfahren als nach Neustart automatisch startet!
Ich mach das aber auch nur nach Kochrezept - bei großen Fehler müssen hier die UNIX Profis ran.
-
@Kusi sagte in Befehle von Neeo nach ioBroker senden:
Anbei die Vorgehensweise, um von der Neeo-Fernbedienung Befehle an ioBroker zu senden.
Hi Kusi
Freut mich, dass es noch andere Neeo-ioBroker-Benutzer gibt. Cool wäre, wenn du aus deinen Erkenntnissen einen Adapter machen könntest. Damit wäre der Autostart auch geregelt und die Integration würde viel einfacher sein als per HTTP Requests und dann "Gebastel" in Blockly.
Ich hätte gerne schon lange mal einen Neeo Adapter geschrieben, aber erstens habe ich aktuell keine Zeit und zweitens dachte ich mir, würde sich das für ein nicht mehr produziertes Produkt nicht mehr lohnen. Das zweite hast du ja nun widerlegt!
/UncleSam -
@UncleSam Hallo UncleSam, Danke für deine Worte. Leider bin ich nicht der Programmierer. Wie man nur mit dem Erstellen eines Adapters beginnt, ist mir bereits nicht klar.
Ohne die Hilfe von @mickym hätte ich diese Integration nie hinbekommen!!!
Ich könnte ggfs. mitwirken, aber selber von Beginn zu Programmieren wird nie klappen, zumindest mit dem jetzigen Wissensstand nicht.
Einen Neeo-Adapter gibt es bereits und habe ich auch installiert, jedoch erkennt dieser lediglich die Recipes (Rezepte) und ob diese momentan gestartet/gestoppt sind, sowie kann man diese auch per ioBroker starten/beenden.Ich bin der Meinung, auch wenn die Neeo seitens Hersteller ggfs. bald nicht mehr supportet wird, kann man diese trotzdem noch Jahre im Gebrauch halten. Ich habe Zuhause 3 Neeo-Fernbedienungen und 2 Brains, und bin damit mehr als zufrieden. Dank der Ankündigung des Supportendes sank der Preis stark, zum Teil sind sie für unter 100.- Franken im Netz zu finden.
-
@Kusi sagte in Befehle von Neeo nach ioBroker senden:
Einen Neeo-Adapter gibt es bereits
Das habe ich irgendwie verpasst :-). Dann müsste man aber schauen, dass all die Features, die du (und vielleicht auch ich) nutzt, in diesen Adapter einfliessen: https://github.com/jobe451/ioBroker.neeo
Hast du mal mit dem Daniel gesprochen?
-
@UncleSam sagte in Befehle von Neeo nach ioBroker senden:
Hast du mal mit dem Daniel gesprochen?
Ich habe Daniel vor mehreren Wochen angeschrieben, mich bedankt für seinen Adapter und dass ich bereit wäre fürs Testen. Leider habe ich nie eine Antwort erhalten.
-
@mickym sagte in Befehle von Neeo nach ioBroker senden:
Treiber noch automatisch starten
Der Service kann gestartet werden, und mit dem Befehl
systemctl status neeo_simple
kommt die Meldung, dass der Dienst aktiv ist.
pi@raspberrypi:~ $ sudo systemctl start neeo_simple pi@raspberrypi:~ $ systemctl status neeo_simple * neeo_simple.service - Neeo Simple Service Loaded: loaded (/etc/systemd/system/neeo_simple.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-10 21:38:06 CEST; 4s ago Main PID: 5731 (node) Tasks: 7 (limit: 4915) CGroup: /system.slice/neeo_simple.service `-5731 /usr/bin/node /home/pi/node_modules/ioBroker Sep 10 21:38:06 raspberrypi systemd[1]: Started Neeo Simple Service. Sep 10 21:38:07 raspberrypi node[5731]: # READY! use the NEEO app to search for: ioBroker Sep 10 21:38:07 raspberrypi node[5731]: [1B blob data] Sep 10 21:38:07 raspberrypi node[5731]: ACCESOIRE devices do not have their own recipy slides. Sep 10 21:38:07 raspberrypi node[5731]: You need to add the buttons as shortcuts to an existing device slide, Sep 10 21:38:07 raspberrypi node[5731]: add a dummy device (search for dummy) and add the buttons as shortcut there or Sep 10 21:38:07 raspberrypi node[5731]: change the actualDriverObject.setType line to present this driver as a different device
Nach dem Neustart des Raspberry funktioniert der Service aber nicht mehr.
Folgender Fehler wird angezeigt:pi@raspberrypi:~ $ systemctl status neeo_simple * neeo_simple.service - Neeo Simple Service Loaded: loaded (/etc/systemd/system/neeo_simple.service; enabled; vendor pres Active: failed (Result: exit-code) since Thu 2020-09-10 21:31:20 CEST; 3min 4 Process: 463 ExecStart=/usr/bin/node /home/pi/node_modules/ioBroker (code=exit Main PID: 463 (code=exited, status=1/FAILURE) Sep 10 21:31:20 raspberrypi node[463]: [Symbol(corked)]: 0, Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kOutHeaders)]: [Object: nul Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: _currentUrl: 'http://192.168.1.80:300 Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kCapture)]: false Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: response: undefined Sep 10 21:31:20 raspberrypi node[463]: } Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Main process exited Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Failed with result lines 1-16/16 (END)...skipping... * neeo_simple.service - Neeo Simple Service Loaded: loaded (/etc/systemd/system/neeo_simple.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2020-09-10 21:31:20 CEST; 3min 48s ago Process: 463 ExecStart=/usr/bin/node /home/pi/node_modules/ioBroker (code=exited, status=1/FAILURE) Main PID: 463 (code=exited, status=1/FAILURE) Sep 10 21:31:20 raspberrypi node[463]: [Symbol(corked)]: 0, Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kOutHeaders)]: [Object: null prototype] Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: _currentUrl: 'http://192.168.1.80:3000/systeminfo', Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kCapture)]: false Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: response: undefined Sep 10 21:31:20 raspberrypi node[463]: } Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Main process exited, code=exited, status=1/FAILURE Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Failed with result 'exit-code'. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ lines 1-16/16 (END)...skipping... * neeo_simple.service - Neeo Simple Service Loaded: loaded (/etc/systemd/system/neeo_simple.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2020-09-10 21:31:20 CEST; 3min 48s ago Process: 463 ExecStart=/usr/bin/node /home/pi/node_modules/ioBroker (code=exited, status=1/FAILURE) Main PID: 463 (code=exited, status=1/FAILURE) Sep 10 21:31:20 raspberrypi node[463]: [Symbol(corked)]: 0, Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kOutHeaders)]: [Object: null prototype] Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: _currentUrl: 'http://192.168.1.80:3000/systeminfo', Sep 10 21:31:20 raspberrypi node[463]: [Symbol(kCapture)]: false Sep 10 21:31:20 raspberrypi node[463]: }, Sep 10 21:31:20 raspberrypi node[463]: response: undefined Sep 10 21:31:20 raspberrypi node[463]: } Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Main process exited, code=exited, status=1/FAILURE Sep 10 21:31:20 raspberrypi systemd[1]: neeo_simple.service: Failed with result 'exit-code'.
-
@Kusi Ok - dann investier da keine Zeit - dazu bin ich auch zuwenig Fachmann - dann schau vielleicht eher ob Du es automatisch übder den Javascript Adapter zum Laufen bringst.
-
@mickym Weist du wofür system.host.raspberrypi ist? Dort hat man den Datenpunkt "alive", welcher anzeigt ob der Adapter gestartet oder beendet ist. Mit diesem könnte man das Skript starten...
-
@Kusi Nein weiß ich leider nicht. Im Prinzip gibt es zu jedem Adapter ein "alive" der true wird, sobald der Adapter gestartet ist - also auch den Javascript-Adapter selbst. Nur Du brauchst ja wieder ein Script, der auch diese Datenpunkte auswertet. Wie willst Du das anstellen?
-
@mickym Den Datenpunkt "system.host.raspberrypi.alive" kann man nicht benutzen, da zu diesem Zeitpunkt der Adapter Javascript noch nicht läuft, somit die Änderung nicht wahrgenommen wird.
Ich habe es jetzt mit dem Datenpunkt "system.adapter.simple-api.0.alive" gelöst und es funktioniert:
// Beschreibe diese Funktion … function ioBroker_starten() { exec('node /home/pi/node_modules/ioBroker'); } on({id: "system.adapter.simple-api.0.alive"/*simple-api.0 alive*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; ioBroker_starten(); });
-
@Kusi Das ist eine gute und schlüssige Idee - da der Adapter ja nötig ist. Und nachdem Du es ja getestet hast ist das ja gelöst. Ich hatte nur Bedenken wenn der dass der Datenpunkt "system.adapter.simple-api.0.alive bereits true ist, bevor der Javasript Adapter läuft - aber das scheint dann ja nicht der Fall zu sein.
-
@mickym ich müsste nochmals genau hinsehen, in welcher Reihenfolge die Adapter starten. So funktioniert es jedenfalls einwandfrei und wie du richtig sagtest, der SimpleAPI-Adapter habe ich gewählt, weil dieser für Neeo erforderlich ist.
-
actualDriverObject.addButton({ name: "button-a", label: "Button A" }); // This makes a new button named button-a, on the remote its shown as Button A
Kann man den Button zu einem Switch (Schalter: aus-ein) ändern?
Gibt es die Möglichkeit einer Rückmeldung an Neeo? Sprich, wenn der Datenpunkt auf true gewechselt wird, der Schalter dann auf der Neeo auch auf "ein" wechselt? -
@Kusi Das Problem ist, dass Du das jemand fragen musst, der sich mit Neeo ausgekennt. Zum einen bietet ja kannst du sicher von iobroker HTTP Befehle zu Deinem Brain zu schicken, aber ich wüßte nicht, wie man das in Neeo verarbeiten sollte.
Das gleiche gilt, dass selbst wenn Neeo den iobroker abfragen würde - wie wird es dort weiterverarbeitet.
Die Simple API Schnittstelle bietet sehr wohl die Möglichkeit jeden x-beliebigen Punkt aus iobroker auszulesen:
http://192.168.1.15:8087/getPlainValue/javascript.0.Eigene_Datenpunkte.Neeo-Button
oder alle Infos zum DP
http://192.168.1.15:8087/get/javascript.0.Eigene_Datenpunkte.Neeo-Button
Generell kannst die simple API ohne Parameter aufrufen und Du siehst die Möglichkeiten - das Problem ist die Neeo Seite.
Im Prinzip hängt das von dem Widget ab: s. SDK https://github.com/NEEOInc/neeo-sdk#power-control-capability
siehe.
Power Control Capability
If your device supports Power control (power on device, power off device), add this capability - the generated recipe will power on and off your device automatically.You need to add support for the following buttons (addButton({..):
POWER ON
POWER OFF
or just use the shortcut function .addButtonGroup('POWER')aber wie Du das dann machst - da muss sich jemand wirklich Neeo besser auskennen - da bin ich überfragt!
-
@mickym Die Volume-Gruppe konnte ich einfügen.
Wie ich allerdings z.B. nur Volume UP einfüge, ist mir noch ein Rätsel.
Wobei ich natürlich die ganze Volume-Gruppe zum Treiber hinzufügen kann, und dann nur Volume UP auf die Benutzeroberfläche.Ein Slider lässt sich auch einfügen...
Der Switch konnte ich auch einfügen...
Weist du wie ich
node /home/pi/node_modules/ioBroker
stoppen kann??
-
@Kusi Folgendes ist der Code, um einen Switch einzufügen:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{setter: (deviceId, newValue) => switchState = newValue,getter: (deviceId) => switchState,})
Hättest du mir eine Idee, wie ich die Weiterleitung zu ioBroker konfigurieren muss? Ich möchte ja gerne 2 States, einmal für Schalter links und einmal für Schalter rechts.
if (buttonName == "Switch") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=S1"); }