NEWS
Befehle von Neeo nach ioBroker senden
-
@UncleSam sagte in Befehle von Neeo nach ioBroker senden:
if (newValue == 'XXXX') {
Mit "richtigen Wert" meinst du den Wert, welcher vom Schalter her kommt wenn dieser auf "ein" gestellt ist, also z.B. true?
Könnte man diesen ausgegebenen Wert irgendwie auslesen?
-
@Kusi sagte in Befehle von Neeo nach ioBroker senden:
Könnte man diesen ausgegebenen Wert irgendwie auslesen?
Du könntest ihn ja direkt an den Datenpunkt schicken:
http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=" + newValue);
-
@UncleSam Als Antwort im Browser kommt
{"id":"javascript.0.Eigene_Datenpunkte.Neeo-Switch","value":"\" newValue","val":"\" newValue"}
Wert von Datenpunkt ist dann
" newValue
Ist ein Zeichen falsch?
-
@Kusi Im Browser geht das auch nicht - da dort ja die Variable "newValue" nicht gesetzt wird.
@UncleSam meint dass Du in dem Code des Treibers für den Switch direkt den Wert übergibst - also so:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=" + newValue); }, getter: (deviceId) => switchState,})
-
@mickym sagte in Befehle von Neeo nach ioBroker senden:
@UncleSam meint dass Du in dem Code des Treibers für den Switch direkt den Wert übergibst
Genau.
-
@mickym sagte in Befehle von Neeo nach ioBroker senden:
@Kusi Im Browser geht das auch nicht - da dort ja die Variable "newValue" nicht gesetzt wird.
@UncleSam meint dass Du in dem Code des Treibers für den Switch direkt den Wert übergibst - also so:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=" + newValue); }, getter: (deviceId) => switchState,})
ioBroker aktualisiert den Datenpunkt nicht.
-
@Kusi sagte in Befehle von Neeo nach ioBroker senden:
ioBroker aktualisiert den Datenpunkt nicht.
Dann versuch statt dem
http()
aufruf einfach mal auf die Konsole zu loggen:console.log("Neuer Wert:", newValue);
Selbstverständlich muss nach jeder Änderung der Service oder der Driver neu gestartet werden (nicht aber ioBroker)!
-
@UncleSam Ich starte nach jeder Änderung das Raspberry komplett neu, da ich den Dienst nicht stoppen kann.
In welchem Log sollte denn eine Änderung sichtbar sein?
Folgendes ist in der index.js erstellt von mir:actualDriverObject.addSwitch({ name: 'Schalter2', label: 'Schalter2' },{ setter: (deviceId, newValue) => { switchState = newValue; console.log("Neuer Wert:", newValue); }, getter: (deviceId) => switchState,})
Und folgendes kommt bei jedem Start des Dienstes:
pi@raspberrypi:~ $ node /home/pi/node_modules/ioBroker # READY! use the NEEO app to search for: ioBroker ACCESOIRE devices do not have their own recipy slides. You need to add the buttons as shortcuts to an existing device slide, add a dummy device (search for dummy) and add the buttons as shortcut there or change the actualDriverObject.setType line to present this driver as a differe nt device type.
Dies ändert auch nicht, wenn ich den Switch drücke...
Folgendes erscheint (ebenfalls in Putty), wenn ich einen Button drücke:[CONTROLLER] button-h button pressed [CONTROLLER] button-g button pressed
-
@UncleSam said in Befehle von Neeo nach ioBroker senden:
@Kusi sagte in Befehle von Neeo nach ioBroker senden:
ioBroker aktualisiert den Datenpunkt nicht.
Dann versuch statt dem
http()
aufruf einfach mal auf die Konsole zu loggen:console.log("Neuer Wert:", newValue);
Selbstverständlich muss nach jeder Änderung der Service oder der Driver neu gestartet werden (nicht aber ioBroker)!
Na ich glaube hier gehst Du von einem Missverständnis aus. Der Treiber läuft nicht im iobroker - der wird nur innerhalb des iobrokers gestartet, ist aber ein eigenständiger node.js Prozess.
@Kusi Um auszuschliessen, dass es sich einfach bei der Konvertierung um ein Problem handelt, könntest Du den ersten Code von @UncleSam als boolean probieren.
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; if (newValue) { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=wahr" } else { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=falsch" } },
Evtl. fehlt aber in dem Treiber was, der dieses newValue und deviceId setzt - aber da kann ich eben nicht helfen, da dies ein Neeo Kenner machen muss.
Der erste Schritte wäre dann nämlich tatsächlich, dass Du den letzten Code nochmal mit einem Wert nutzt und testest ob bei Bewegen des Schalters überhaupt was im DP ankommt:actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value='Test'" ); }, getter: (deviceId) => switchState,})
Wenn da nun im DP nicht Test steht - dann wird die Funktion gar nicht aufgrufen.
-
@mickym
Dies erscheint nun beim Start des Treibers:pi@raspberrypi:~ $ node /home/pi/node_modules/ioBroker /home/pi/node_modules/ioBroker/index.js:21 http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=wahr" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: missing ) after argument list at wrapSafe (internal/modules/cjs/loader.js:1053:16) at Module._compile (internal/modules/cjs/loader.js:1101:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10) at Module.load (internal/modules/cjs/loader.js:985:32) at Function.Module._load (internal/modules/cjs/loader.js:878:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47
Ich hätte gesagt dass nach dem wahr" noch eine Klammer ) gehört, die habe ich nach wahr" und falsch" eingefügt, dann kommt allerdings folgender Fehler:
pi@raspberrypi:~ $ node /home/pi/node_modules/ioBroker /home/pi/node_modules/ioBroker/index.js:28 actualDriverObject.addButtonHandler((buttonName, deviceId) => { ^ SyntaxError: Unexpected token '.' at wrapSafe (internal/modules/cjs/loader.js:1053:16) at Module._compile (internal/modules/cjs/loader.js:1101:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10) at Module.load (internal/modules/cjs/loader.js:985:32) at Function.Module._load (internal/modules/cjs/loader.js:878:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47
-
@mickym sagte in Befehle von Neeo nach ioBroker senden:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value='Test'" ); }, getter: (deviceId) => switchState,})
Damit ändert sich der Datenpunkt nicht. Gebe ich
http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value='Test'
im Browser ein, dann ändert sich der Datenpunkt auf 'Test'.
-
@Kusi das ist genau das, was ich befürchtet habe. Das es im Browser funktioniert das war relativ klar. Aber Dein Treiber Deiner Neeo ruft die Funktion gar nicht auf. Ein Pushbutton ist simpel da er keinen Status Kennt und einfach den Befehl rausschießt. Alles andere benötigt aber Kenntnisse in der Treiberprogrammierung. Ggf muss man diese Funktionsaufrufe alle selbst programmieren du musst die zur Laufzeit zugewiesene device id ermitteln usw.
-
@Kusi du kannst noch versuchen ob der HTTP Befehl unter getter ausgeführt - viel Hoffnung habe ich aber nicht
-
@Kusi Im SDK Quellcode habe ich gesehen, dass newValue tatsächlich ein boolean ist; damit wäre es true oder false wie @mickym geschrieben hat. Weshalb die Callbacks aber nicht aufgerufen werden, verstehe ich auch nicht. Gemäss allen Beschreibungen, die ich gefunden habe, müssen die genau so angegeben werden.
Bist du sicher, dass alles sauber neu geladen wird im Neeo? Hast du mal versucht, einen Button umzubenennen und zu sehen, ob das auf der Fernbedienung auch geschieht?
Ich glaube nämlich langsam, dass das Problem bei der Art liegt, wie du entwickelst. Es sollte wirklich nicht notwendig sein, den RasPi bei jeder Änderung neu zu starten und auch den Pfad
/home/pi/node_modules/ioBroker
finde ich sehr komisch. Wie bist du auf diesen gekommen? Grundsätzlich sollte man nämlich in einem node_modules-Ordner keine Änderungen machen. -
@UncleSam Wenn ich den Treiber lade, kann ich ihn dann kein erneutes mal laden nach Änderungen. Ich kann ihn zwar pausieren, aber nicht stoppen, aus diesem Grund der Raspi-Neustart.
Den Ordner /ioBroker habe ich erstellt, anstelle von /neeo_driver-test.
Habe /ioBroker jetzt gelöscht und lasse den Standardordner. -
@UncleSam sagte in Befehle von Neeo nach ioBroker senden:
SDK Quellcode habe ich gesehen, dass newValue tatsächlich ein boolean ist; damit wäre es true oder false
Wie muss es genau heissen?
Wie folgt kann ich den Treiber nicht laden:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; if (newValue) { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=wahr" } else { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=falsch" } },
-
@Kusi Die schliessenden Klammern fehlen beim
http(...)
-
@UncleSam das habe ich mir eben auch gedacht und beim zweiten Versuch getestet, aber dann kommt folgender Fehler:
pi@raspberrypi:~ $ node /home/pi/node_modules/neeo_driver-test /home/pi/node_modules/neeo_driver-test/index.js:29 actualDriverObject.addButtonHandler((buttonName, deviceId) => { ^ SyntaxError: Unexpected token '.' at wrapSafe (internal/modules/cjs/loader.js:1053:16) at Module._compile (internal/modules/cjs/loader.js:1101:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10) at Module.load (internal/modules/cjs/loader.js:985:32) at Function.Module._load (internal/modules/cjs/loader.js:878:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47
So sieht es jetzt komplett aus:
"use strict"; const neeoapi = require("neeo-sdk"); const http = require("http.min"); let actualDriverObject; actualDriverObject = neeoapi.buildDevice("ioBroker"); // 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 actualDriverObject.addButton({ name: "button-e", label: "Button E" }); // This makes a new button named button-d, on the remote its shown as Button E actualDriverObject.addButton({ name: "button-f", label: "Button F" }); // This makes a new button named button-d, on the remote its shown as Button F actualDriverObject.addButton({ name: "button-g", label: "Button G" }); // This makes a new button named button-d, on the remote its shown as Button G actualDriverObject.addButton({ name: "button-h", label: "Button H" }); // This makes a new button named button-d, on the remote its shown as Button H actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; if (newValue) { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=wahr") } else { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=falsch") } }, // 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://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=A"); //Just sneds a http get, use this to controll devices that supports a http get } if (buttonName == "button-b") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=B"); } if (buttonName == "button-c") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=C"); } if (buttonName == "button-d") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=D"); } if (buttonName == "button-e") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=E"); } if (buttonName == "button-f") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=F"); } if (buttonName == "button-g") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=G"); } if (buttonName == "button-h") { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Button?value=H"); } }); // 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); });
-
@mickym sagte in Befehle von Neeo nach ioBroker senden:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=" + newValue); }, getter: (deviceId) => switchState,})
Das hier geht, oder? Wenn du etwas änderst, musst du immer schauen, dass die öffnenden und schliessenden Klammern (rund, geschweift, eckig) übereinstimmen.
Ergo sollte es IMHO heissen:
actualDriverObject.addSwitch({ name: 'Schalter', label: 'Schalter' },{ setter: (deviceId, newValue) => { switchState = newValue; if (newValue) { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=wahr" } else { http("http://192.168.1.15:8087/set/javascript.0.Eigene_Datenpunkte.Neeo-Switch?value=falsch" } }, getter: (deviceId) => switchState,})
-
@UncleSam Gemäss Fehler beim vorherigen Laden des Treibers liegt der Fehler vermutlich an einem anderen Ort?
Zeilen 28 und 29 von index.js
// Here is the code that gets executed when a button is pressed. actualDriverObject.addButtonHandler((buttonName, deviceId) => {