fhem.js - websocket connection to fhem via node.js proxy

Begonnen von Werner Schäffer, 13 Februar 2015, 21:53:55

Vorheriges Thema - Nächstes Thema

Werner Schäffer

Falls fhem auch durch ein /etc/init.d gestartet wird ändere doch mal in /etc/init.d/fhem.js die 6. Zeile in

# Required-Start: $local_fs $remote_fs $network $syslog $fhem

Dann wird beim boot fhem.js erst gestartet wenn fhem erfolgreich gestartet wurde.

roman1528

Zitat von: Werner Schäffer am 05 Februar 2016, 15:30:05
# Required-Start: $local_fs $remote_fs $network $syslog $fhem
Dann wird beim boot fhem.js erst gestartet wenn fhem erfolgreich gestartet wurde.

Jap... Mal ja mal nicht. Je nachdem wie gut gelaunt Perl gerade ist und den telnet Port onlie bringt  :D Aber so oft wird ja nicht neu gestartet.

Danke.
i3-10305T 4x3GHz;8GB RAM;250GB & 1TB NVMe:
FHEM 6.2;FTUI;8" Tablet's+Fully;NsPanelPro;HUE;ESPRGBWW;HM(CCU3);Duofern; ASC;MQTT(Tasmota);netatmo;SONOS;eBus;DbLog;XiaomiDevice;NUT;ModbusAttr

RPi3+: FHEM 6.2;I²C;GPIO;RFID;G-Tag;XiaomiBTLESens
RPi3: FHEM 6.2;DIY Relais-Board;I²C;GPIO;RFID;Photovoltaik

Werner Schäffer

Es steht jetzt die neue Version 2.2.0 zur Verfügung.

Was ist neu:
- Bug fixed: TypeError: socket.rooms.indexOf is not a function
- neuere Bibliotheken für websockets
- verbesserte Installation

Update und Installation:
Wer bereits fhem.js installiert hat sollte sich erst die params.js sichern, da sie beim Update verloren geht. Zukünftig ist dies nicht mehr notwendig.
Dann sollte man fhem.js deinstallieren mit:

npm uninstall -g fhem.js

Die Installation geschieht mit

npm install -g fhem.js

Bitte dabei die Meldungen beachten. Es muss nämlich anschließend noch ein Postinstall-Script ausgeführt werden.

Die Konfiguration steht in /etc/fhem/params.js

HansDampfHH

Ich nutze fhem.js seit einiger Zeit und bin recht glücklich bisher.
Aktuell habe ich allerdings ein Problem.

Ich habe in der fhem.cfg die Möglichkeit das Gäste-Wlan meiner Fritzbox zu schalten:


define FritzBox7390 FRITZBOX 192.168.178.1
attr FritzBox7390 allowTR064Command 1
attr FritzBox7390 boxUser Test


Nun kann ich direkt in FHEM mit nachfolgenden Befehlen das Gäste-Wlan schalten:


set FritzBox7390 guestWLAN on
set FritzBox7390 guestWLAN off


Wenn ich dies aber nun mit fhem.js versuchen misslingt das:


socket = io.connect('http://192.168.178.80:8086');
socket.emit("comand", "set FritzBox7390 guestWLAN on", function (data) {
});


Kannst du mir bitte einen Hinweis geben was ich falsch mache oder wie/wo ich an weitere Infos zur Ursache komme!?
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Werner Schäffer

Zitat von: HansDampfHH am 11 Februar 2016, 11:05:20
...
Wenn ich dies aber nun mit fhem.js versuchen misslingt das:


socket = io.connect('http://192.168.178.80:8086');
socket.emit("comand", "set FritzBox7390 guestWLAN on", function (data) {
});


Erst mal schauen was in der Javascript Konsole des Clients steht. Dort müsste nämlich eine Fehlermeldung erscheinen. (Javascript Konsole mit Firefox und Firebug oder mit Chrome und Entwicklertools oder mit IE und F12)

Funktionieren müsste es aber folgendermaßen:


socket = io.connect('http://192.168.178.80:8086');
socket.on('connect', function() {
   socket.emit("comand", "set FritzBox7390 guestWLAN on", function (data) {
      console.log(data); // schreibt den command reasponse in die Konsole
   });
});


Kurz gesagt:
Befehle kann man erst senden wenn die Verbindung aufgebaut ist, das heißt erst wenn der Server die Verbindung bestätigt hat. Deshalb ist

socket.on('connect' ....

nötig.

HansDampfHH

#80
Hm, ne. In der Console war kein Output.
Beim request hatte ich vorher auch folgendes gesehen:
Request Payload:
45:420["comand","set FritzBox7390 guestWLAN on"]

Also erfolgt der Aufruf scheinbar, aber das kommt irgendwie nicht an.

Jetzt mit Deiner Variante verhält es sich genau so.
Der request wird abgefeuert aber es tut sich nichts. Also weder ein Fehler in der Console, noch eine Aktion in FHEM :-(

Testweise funktioniert das auch nicht mit anderen Devices, zum Beispiel einer Lampe: set Wohnzimmer.Lampe on
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Werner Schäffer

Zitat von: HansDampfHH am 11 Februar 2016, 12:23:05
Hm, ne. In der Console war kein Output.
Beim request hatte ich vorher auch folgendes gesehen:
Request Payload:
45:420["comand","set FritzBox7390 guestWLAN on"]

Also erfolgt der Aufruf scheinbar, aber das kommt irgendwie nicht an.

Jetzt mit Deiner Variante verhält es sich genau so.
Der request wird abgefeuert aber es tut sich nichts. Also weder ein Fehler in der Console, noch eine Aktion in FHEM :-(

Testweise funktioniert das auch nicht mit anderen Devices, zum Beispiel einer Lampe: set Wohnzimmer.Lampe on

Edit auf dem Server die params.js und setze dort debug = 2. Neustart fhem.js .

Dann schau mal was fhem.js so ausspuckt.

Anderer Test:

telnet localhost 7072

und dann Befehle eingeben (z.B. set FritzBox7390 guestWLAN on). Funktioniert es damit?

HansDampfHH

#82
Also ich habe jetzt noch mal deine Anleitung aus dem 1. Thread genommen und node/fhem.js neu aufgesetzt.

Wenn ich dann:
/etc/init.d/fhem.js stop
-> params.js debug 2
/etc/init.d/fhem.js start
...mache kommt da nichts auf der commandline :-(

Mit telnet kann ich Kommandos schicken, die werden auch gleich ausgeführt.
Wie bekommen ich denn die Debug-Ausgaben auf die Kommandozeile?

Edit: ah, okay....mit nodejs server.js bekomme ich jetzt Output.
Wenn ich ein Kommando abschicke steht da aber auch nur:
11.02.2016 14:16:58 client connected
11.02.2016 14:16:58 emit authenticated cause no auth needed

Edit2: So wie es aussieht muss man nicht command sondern commandNoResp nehmen.
Das scheint zu funktionieren.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Werner Schäffer

Zitat von: HansDampfHH am 11 Februar 2016, 14:13:05
...
Edit2: So wie es aussieht muss man nicht command sondern commandNoResp nehmen.
Das scheint zu funktionieren.

Danke für den Hinweis. Ich werde dies in den nächsten Tagen mal testen.

Werner Schäffer

Zitat von: HansDampfHH am 11 Februar 2016, 14:13:05
...
Wie bekommen ich denn die Debug-Ausgaben auf die Kommandozeile?

Meldungen werden nach /var/log/fhem.js geschrieben.

Tueftler1983

Hallo habe sowohl node als auch fhem.js nach der Anleitung installiert aber bekomme folgende Meldung wenn ich versuche fhem.js zu starten.

pi@fhemserver ~ $ service fhem.js start
Starting fhem.js node instance:
/etc/init.d/fhem.js: /usr/bin/fhem.js: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden


Weiß jemand was ich tun kann?

Werner Schäffer

Diese Fehlermeldung zeigt dass gewisse Files DOS-Zeilenumbrüche enthalten. Dies passiert z.B. wnn man Dateien mit ftp überträgt und dabei der Binär-Modus anstatt des Text-Modus verwendet wird.

Ich empfehle fhem.js komplett zu deinstallieren (npm uninstall -g fhem.js). Eventuell noch die Verzeichnisse und Files /etc/fhem.js, /etc/init.d/fhem.js, /usr/bin/fhem.js und /usr/lib/node_modules/fhem.js manuell löschen, falls sie noch vorhanden sind. Danach nochmals genau nach der Anleitung auf https://github.com/winne27/fhem.js fhem.js neu installieren.


Tueftler1983

Hallo bei mir wird kein Ordner usr/lib/node_modules/fhem.js erstellt dafür ist alles was darin sein sollte unter
usr/local/lib/node_modules/fhem.js

Habe mich via telnet als root angemeldet und dann die Deinstallation und Installation gemacht

root@fhemserver:~# npm uninstall -g fhem.js
unbuild fhem.js@2.1.21
root@fhemserver:~# npm install -g fhem.js
npm WARN optional dep failed, continuing fsevents@1.0.11
/usr/local/bin/fhem.js -> /usr/local/lib/node_modules/fhem.js/bin/fhem.js
/usr/local/bin/forever -> /usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/forever

> fhem.js@2.2.1 postinstall /usr/local/lib/node_modules/fhem.js
> ./bin/postinstall.sh


************************************
finish installation by running as root:

sudo /usr/local/lib/node_modules/fhem.js/bin/postinstall

This puts configuration into folder /etc/fhem.js
************************************

fhem.js@2.2.1 /usr/local/lib/node_modules/fhem.js
├── socket.io@1.4.5 (has-binary@0.1.7, debug@2.2.0, socket.io-parser@2.2.6, engine.io@1.6.8, socket.io-adapter@0.4.0, socket.io-client@1.4.5)
├── forever@0.15.1 (path-is-absolute@1.0.0, object-assign@3.0.0, colors@0.6.2, clone@1.0.2, timespan@2.3.0, optimist@0.6.1, nssocket@0.5.3, shush@1.0.0, cliff@0.1.10, winston@0.8.3, utile@0.2.1, nconf@0.6.9, prettyjson@1.1.3, flatiron@0.4.3, forever-monitor@1.6.0)
└── socketio-auth@0.0.5 (debug@2.2.0, lodash@3.10.1)
root@fhemserver:~# sudo /usr/lib/node_modules/fhem.js/bin/postinstall
sudo: /usr/lib/node_modules/fhem.js/bin/postinstall: command not found
root@fhemserver:~# sudo /usr/local/lib/node_modules/fhem.js/bin/postinstall
rm: Entfernen von �/usr/local/lib/node_modules/fhem.js/params.js� nicht m�lich: Datei oder Verzeichnis nicht gefunden
root@fhemserver:~#

Werner Schäffer

ein rm /usr/local/lib/node_modules/fhem.js/params.js ist in den aktuellen Programmen von fhem.js nicht mehr enthalten. Deshalb vermute ich dass auf deinem Server noch ältere Versionen herumschwirren. Deshalb kann ich nur empfehlen nochmals alles zu löschen und zwar gründlich. Also:

npm uninstall -g fhem.js

Danach prüfen ob es noch irgendwelche Dateien und Verzeichnisse mit fhem.js-Bezug gibt und die alle manuell löschen. Man kann z.B abfragen, das dauert schon ein Weilchen, aber dann hat man alle fhem.js Elemente gefunden:

Schritt 1:
find / -type d | grep "fhem.js"

Dann das erste gefunde Directory mit rm -r löschen und obigen Befehl wieder aufrufen, solange bis nichts mehr gefunden wird.

Schritt 2:
find / | grep "fhem.js"

Falls da noch was gefunden wird jeweils einzeln löschen. Danach eine Neuinstallation durchführen.




Tueftler1983

Die Installation dann als User root oder als User pi?