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

An dem Problem bin ich gerade dran. Bisher war das ganze so konzipiert dass es von root gestartet werden musste. In der neuen Version wird dann defaultmäßig mit dem User fhem gestartet. Du kannst noch 1-2 Tage auf das neue Paket warten und nochmals installieren oder ganz einfach folgendes ausführen (Rechteproblem):

sudo touch /var/log/fhem.js.log
sudo touch /var/log/fhem.js.error
sudo chown userxyz /var/log/fhem.js.*


wobei userxyz der User ist mit dem du fhem.js starten willst.

Die Problematik mit /usr/bin vs /usr/local/bin werde ich auch noch checken und in das neue Paket mitaufnehmen




t.huber

Danke für die schnelle Antwort !

Mit dem Fix hat es nun soweit funktioniert das keine direkte Fehlermeldung kommt.
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: /usr/local/lib/node_modules/fhem.js


Jetzt müsste der Server laufen oder ?
Jetzt kann ich mich um die Einrichtung von FHEMSwitch kümmern.
Aber das App meldet das URL falsch ist oder der Server offline ist.

Aber alles weitere ist für diesen Thread off-Topic und gehört eher zum FHEMSwitch-Thread.
(Wenn der Server Online ist und ich nur mit den Ports was falsch eingestellt habe)
(Ich hab nur IP-Adressen für fhem.js im Heimnetz FHEM im Heimnetz eingetragen. Den Heimnetzport für fhem.js habe ich allerdings von 8087 auf 8086 umgestellt da ja in der params.js auch nur der Port 8086 definiert ist)

Werner Schäffer

Wirf mal einen Blick in die Dateien /var/log/fhem.js.log und /var/log/fhem.js.error

Dort sieht man erstens ob fhem.js gestartet wurde und auch Zugriffe von fhemswitch werden protokulliert

t.huber

fhem.js.log liefert:
fs.js:640
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: EACCES: permission denied, open '/var/run/fhem.js.pid'
    at Error (native)
    at Object.fs.openSync (fs.js:640:18)
    at Object.fs.writeFileSync (fs.js:1333:33)
    at writePid (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:13:6)
    at .<anonymous> (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:46:5)
    at EventEmitter.emit (/usr/local/lib/node_modules/fhem.js/node_modules/eventemitter2/lib/eventemitter2.js:339:22)
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever-monitor/lib/forever-monitor/monitor.js:177:10
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)


Und fhem.js.error ist leer.

reboot hatte ich davor durchgeführt.

Werner Schäffer

im File /usr/local/bin/fhem.js Zeile 4 so ändern:

PIDFILE=/var/run/userxyz/fhem.js.pid

Dann folgende Befehle:

mkdir /var/run/userxyz
chown userxyz /var/run/userxyz


Wobei userxyz der User ist mit dem du fhem.js startest.

t.huber

Hmm

Ich hab die Änderungen am File /usr/local/bin/fhem.js
vorgenommen.
#!/bin/bash

NAME=fhem.js
PIDFILE=/var/run/pi/fhem.js.pid
LOGFILE=/var/log/fhem.js.log
ERRORLOG=/var/log/fhem.js.error
FOREVER=/usr/local/bin/forever

while getopts "p:l:e:n:f:" opt; do
  case $opt in
    l)
      LOGFILE=$OPTARG
      ;;
    p)
      PIDFILE=$OPTARG
      ;;
    e)
      ERRORLOG=$OPTARG
      ;;
    n)
      NAME=$OPTARG
      ;;
    f)
      FOREVER=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlin
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
cd $DIR/..
DIR=`pwd`

$FOREVER start --uid "$NAME" --pidFile /var/run/fhem.js.pid -e /var/log/fhem.js.error -l /var/log/fhem.js.log -a --workingDir $DIR  $DIR


Wenn ich dann
/usr/local/bin/fhem.js
aufrufe, steht folgendes im Log:
fs.js:640
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: EACCES: permission denied, open '/var/run/fhem.js.pid'
    at Error (native)
    at Object.fs.openSync (fs.js:640:18)
    at Object.fs.writeFileSync (fs.js:1333:33)
    at writePid (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:13:6)
    at .<anonymous> (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:46:5)
    at EventEmitter.emit (/usr/local/lib/node_modules/fhem.js/node_modules/eventemitter2/lib/eventemitter2.js:339:22)
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever-monitor/lib/forever-monitor/monitor.js:177:10
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)


Also irgendwie ignoriert er dass er das fhem.js.pid im unterordner "pi" (Benutzername) verwenden soll.

Der Unterordner wurde erstellt ist aber leer.

Werner Schäffer

Mein Vorschlag:
du stoppst jetzt die Flickerei und wartest auf die neue Version - spätestens (über)morgen

Falls trotzalledem ungeduldig:
schau mal in /etc/init.d/fhem.js und dort auf PIDFILE ...




t.huber

Auch ein ändern dort hat nichts geändert.
Er sucht immer noch in '/var/run/fhem.js.pid'

Aber danke schon mal für deine Mühe !

Werner Schäffer


t.huber

Nun steht folgendes im Log:
fs.js:640
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: EACCES: permission denied, open '/var/run/fhem.js.pid'
    at Error (native)
    at Object.fs.openSync (fs.js:640:18)
    at Object.fs.writeFileSync (fs.js:1333:33)
    at writePid (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:13:6)
    at .<anonymous> (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:46:5)
    at EventEmitter.emit (/usr/local/lib/node_modules/fhem.js/node_modules/eventemitter2/lib/eventemitter2.js:339:22)
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever-monitor/lib/forever-monitor/monitor.js:177:10
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
15.01.2017 23:04:23 listen for http requests disabled
15.01.2017 23:04:23 listen for websocket requests on port 8086 without SSL
15.01.2017 23:04:24 start connection to fhem server
15.01.2017 23:04:24 connected to fhem server for listen on changed values
15.01.2017 23:04:24 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:04:34 start connection to fhem server
15.01.2017 23:04:34 connected to fhem server for listen on changed values
15.01.2017 23:04:34 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:04:44 start connection to fhem server
15.01.2017 23:04:44 connected to fhem server for listen on changed values
15.01.2017 23:04:44 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:04:54 start connection to fhem server
15.01.2017 23:04:54 connected to fhem server for listen on changed values
15.01.2017 23:04:54 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:05:04 start connection to fhem server
15.01.2017 23:05:04 connected to fhem server for listen on changed values
15.01.2017 23:05:04 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:05:14 start connection to fhem server
15.01.2017 23:05:14 connected to fhem server for listen on changed values
15.01.2017 23:05:14 error: telnet connection closed - try restart in 10 secs
15.01.2017 23:05:24 start connection to fhem server


Der Telnet-Port steht in der param.js und in der fhem.cfg auf 7072

Werner Schäffer

Auf dem npm-Repository steht die Version 2.5.0 von fhem.js zum Download bereit. Die wesentliche Neuerung ist dass fhem.js nicht mehr unter root läuft, sondern bei der Installation ein User angegeben werden kann, mit dem dann fhem.js ausgeführt wird. (Security).

Die Installation von fhem.js einschließlich aller Submodule geht nun ganz einfach:

sudo npm install --unsafe-perm -g fhem.js

Wer Optionen wie unsafe-perm nicht traut, kann diese Option auch weglassen. Allerdings muss dann anschließend die Postinstallation manuell gestartet werden mit:

sudo npm run postinstall

Die zweite Methode bietet die Möglichkeit das Postinstallscript usr/(local/)lib/node_modules/fhem.js/bin/postinstall zu prüfen, bevor es mit Root-Rechten ausgeführt wird.



t.huber

Ich hab irgendwie kein Glück.

Ich habe zwecks Neuinstallation zuerst fhem.js deinstalliert mit:
sudo  npm uninstall -g fhem.js
anschließend mit
find / -type d | grep "fhem.js"
und
find / | grep "fhem.js"
auf Reste durchsucht und diese mit
rm -r [objektname]
gelöscht.

Das war der Ordner
/etc/fhem.js
und die Dateien
/var/log/fhem.js.log
/var/log/fhem.js.log.error
/run/systemd/generator.late/fhem.js.service
/etc/init.d/fhem.js
/etc/init.d/fhem.js.dist

Anschließend Neuinstallation mit
sudo npm install --unsafe-perm -g fhem.js
(Kein Neustart)
Schon während der Installation kam die Nachfrage
ZitatFailed to stop fhem.js.service: Unit fhem.js.service not loaded.

User for running fhem.js (fhem)?

Als Benutzer habe ich pi angegeben. Das ist eigntlich auch der FHEM-User.

Hier der ganze Installtext:
pi@RaspberryPi2:~ $ sudo npm install --unsafe-perm -g fhem.js
/usr/local/bin/forever -> /usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/forever
/usr/local/bin/fhem.js -> /usr/local/lib/node_modules/fhem.js/bin/fhem.js

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

Failed to stop fhem.js.service: Unit fhem.js.service not loaded.

User for running fhem.js (fhem)? pi

ok, user is valid

/usr/local/lib
└─┬ fhem.js@2.5.0
  ├─┬ forever@0.15.3
  │ ├─┬ cliff@0.1.10
  │ │ ├── colors@1.0.3
  │ │ └── eyes@0.1.8
  │ ├── clone@1.0.2
  │ ├── colors@0.6.2
  │ ├─┬ flatiron@0.4.3
  │ │ ├─┬ broadway@0.3.6
  │ │ │ ├── cliff@0.1.9
  │ │ │ └── winston@0.8.0
  │ │ ├── director@1.2.7
  │ │ ├── optimist@0.6.0
  │ │ └─┬ prompt@0.2.14
  │ │   ├─┬ read@1.0.7
  │ │   │ └── mute-stream@0.0.7
  │ │   └── revalidator@0.1.8
  │ ├─┬ forever-monitor@1.7.1
  │ │ ├─┬ chokidar@1.6.1
  │ │ │ ├─┬ anymatch@1.3.0
  │ │ │ │ ├── arrify@1.0.1
  │ │ │ │ └─┬ micromatch@2.3.11
  │ │ │ │   ├─┬ arr-diff@2.0.0
  │ │ │ │   │ └── arr-flatten@1.0.1
  │ │ │ │   ├── array-unique@0.2.1
  │ │ │ │   ├─┬ braces@1.8.5
  │ │ │ │   │ ├─┬ expand-range@1.8.2
  │ │ │ │   │ │ └─┬ fill-range@2.2.3
  │ │ │ │   │ │   ├── is-number@2.1.0
  │ │ │ │   │ │   ├── isobject@2.1.0
  │ │ │ │   │ │   ├── randomatic@1.1.6
  │ │ │ │   │ │   └── repeat-string@1.6.1
  │ │ │ │   │ ├── preserve@0.2.0
  │ │ │ │   │ └── repeat-element@1.1.2
  │ │ │ │   ├─┬ expand-brackets@0.1.5
  │ │ │ │   │ └── is-posix-bracket@0.1.1
  │ │ │ │   ├── extglob@0.3.2
  │ │ │ │   ├── filename-regex@2.0.0
  │ │ │ │   ├─┬ kind-of@3.1.0
  │ │ │ │   │ └── is-buffer@1.1.4
  │ │ │ │   ├── normalize-path@2.0.1
  │ │ │ │   ├─┬ object.omit@2.0.1
  │ │ │ │   │ ├─┬ for-own@0.1.4
  │ │ │ │   │ │ └── for-in@0.1.6
  │ │ │ │   │ └── is-extendable@0.1.1
  │ │ │ │   ├─┬ parse-glob@3.0.4
  │ │ │ │   │ ├── glob-base@0.3.0
  │ │ │ │   │ └── is-dotfile@1.0.2
  │ │ │ │   └─┬ regex-cache@0.4.3
  │ │ │ │     ├── is-equal-shallow@0.1.3
  │ │ │ │     └── is-primitive@2.0.0
  │ │ │ ├── async-each@1.0.1
  │ │ │ ├── glob-parent@2.0.0
  │ │ │ ├── inherits@2.0.3
  │ │ │ ├─┬ is-binary-path@1.0.1
  │ │ │ │ └── binary-extensions@1.8.0
  │ │ │ ├─┬ is-glob@2.0.1
  │ │ │ │ └── is-extglob@1.0.0
  │ │ │ └─┬ readdirp@2.1.0
  │ │ │   ├── graceful-fs@4.1.11
  │ │ │   ├─┬ readable-stream@2.2.2
  │ │ │   │ ├── buffer-shims@1.0.0
  │ │ │   │ ├── core-util-is@1.0.2
  │ │ │   │ ├── isarray@1.0.0
  │ │ │   │ ├── process-nextick-args@1.0.7
  │ │ │   │ ├── string_decoder@0.10.31
  │ │ │   │ └── util-deprecate@1.0.2
  │ │ │   └── set-immediate-shim@1.0.1
  │ │ ├─┬ minimatch@3.0.3
  │ │ │ └─┬ brace-expansion@1.1.6
  │ │ │   ├── balanced-match@0.4.2
  │ │ │   └── concat-map@0.0.1
  │ │ └─┬ ps-tree@0.0.3
  │ │   └─┬ event-stream@0.5.3
  │ │     └── optimist@0.2.8
  │ ├─┬ nconf@0.6.9
  │ │ ├── async@0.2.9
  │ │ ├── ini@1.3.4
  │ │ └── optimist@0.6.0
  │ ├─┬ nssocket@0.5.3
  │ │ ├── eventemitter2@0.4.14
  │ │ └── lazy@1.0.11
  │ ├── object-assign@3.0.0
  │ ├─┬ optimist@0.6.1
  │ │ ├── minimist@0.0.10
  │ │ └── wordwrap@0.0.3
  │ ├── path-is-absolute@1.0.1
  │ ├─┬ prettyjson@1.2.1
  │ │ ├── colors@1.1.2
  │ │ └── minimist@1.2.0
  │ ├─┬ shush@1.0.0
  │ │ ├─┬ caller@0.0.1
  │ │ │ └─┬ tape@2.3.3
  │ │ │   ├── deep-equal@0.1.2
  │ │ │   ├── defined@0.0.0
  │ │ │   ├── jsonify@0.0.0
  │ │ │   ├── resumer@0.0.0
  │ │ │   └── through@2.3.8
  │ │ └── strip-json-comments@0.1.3
  │ ├── timespan@2.3.0
  │ ├─┬ utile@0.2.1
  │ │ ├── async@0.2.10
  │ │ ├── deep-equal@1.0.1
  │ │ ├── i@0.3.5
  │ │ ├─┬ mkdirp@0.5.1
  │ │ │ └── minimist@0.0.8
  │ │ ├── ncp@0.4.2
  │ │ └─┬ rimraf@2.5.4
  │ │   └─┬ glob@7.1.1
  │ │     ├── fs.realpath@1.0.0
  │ │     ├─┬ inflight@1.0.6
  │ │     │ └── wrappy@1.0.2
  │ │     └── once@1.4.0
  │ └─┬ winston@0.8.3
  │   ├── cycle@1.0.3
  │   ├── isstream@0.1.2
  │   ├── pkginfo@0.3.1
  │   └── stack-trace@0.0.9
  ├─┬ socket.io@1.7.2
  │ ├─┬ debug@2.3.3
  │ │ └── ms@0.7.2
  │ ├─┬ engine.io@1.8.2
  │ │ ├─┬ accepts@1.3.3
  │ │ │ ├─┬ mime-types@2.1.14
  │ │ │ │ └── mime-db@1.26.0
  │ │ │ └── negotiator@0.6.1
  │ │ ├── base64id@1.0.0
  │ │ ├── cookie@0.3.1
  │ │ ├─┬ engine.io-parser@1.3.2
  │ │ │ ├── after@0.8.2
  │ │ │ ├── arraybuffer.slice@0.0.6
  │ │ │ ├── base64-arraybuffer@0.1.5
  │ │ │ ├── blob@0.0.4
  │ │ │ └── wtf-8@1.0.0
  │ │ └─┬ ws@1.1.1
  │ │   ├── options@0.0.6
  │ │   └── ultron@1.0.2
  │ ├─┬ has-binary@0.1.7
  │ │ └── isarray@0.0.1
  │ ├── object-assign@4.1.0
  │ ├── socket.io-adapter@0.5.0
  │ ├─┬ socket.io-client@1.7.2
  │ │ ├── backo2@1.0.2
  │ │ ├── component-bind@1.0.0
  │ │ ├── component-emitter@1.2.1
  │ │ ├─┬ engine.io-client@1.8.2
  │ │ │ ├── component-emitter@1.2.1
  │ │ │ ├── component-inherit@0.0.3
  │ │ │ ├── has-cors@1.1.0
  │ │ │ ├── parsejson@0.0.3
  │ │ │ ├── parseqs@0.0.5
  │ │ │ ├── xmlhttprequest-ssl@1.5.3
  │ │ │ └── yeast@0.1.2
  │ │ ├── indexof@0.0.1
  │ │ ├── object-component@0.0.3
  │ │ ├─┬ parseuri@0.0.5
  │ │ │ └─┬ better-assert@1.0.2
  │ │ │   └── callsite@1.0.0
  │ │ └── to-array@0.1.4
  │ └─┬ socket.io-parser@2.3.1
  │   ├── component-emitter@1.1.2
  │   ├─┬ debug@2.2.0
  │   │ └── ms@0.7.1
  │   ├── isarray@0.0.1
  │   └── json3@3.3.2
  └─┬ socketio-auth@0.1.0
    └── lodash@3.10.1

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/fhem.js/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.0.17: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})


Nach Start von fhem.js mit
/usr/local/bin/fhem.js
folgende Rückmeldung:
Zitat/usr/local/bin/fhem.js: Zeile 4: dirname: Kommando nicht gefunden.
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: /lib/node_modules/fhem.js/server.js
error:   Cannot start forever
error:   script /lib/node_modules/fhem.js/server.js does not exist.

Das gleich mit Neustart nach Deinstallation hat auch keine Veränderung gebracht.

JoeALLb

Kann mir jemand erklären, was den Unterschied macht zwischen dieser Implementierung
und der standard-Implementierung unter
attr WEB longpoll websocket
?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Depechem

Hallo,
wenn ich an meinem Pi ein node -v ausführe wird mir die Version v0.10.0 angezeigt.(Demzufolge eine alte Version!?)
Daraufhin mache ich wie beschrieben ein:
Zitatapt-get remove nodejs
apt-get remove npm
apt-get remove node

Daraufhin dann ein:
Zitatcurl -sL https://deb.nodesource.com/setup_6.x | bash -
apt-get install -y nodejs
Dies wird mit einigen "ERR" ausgeführt.
Danach(auch nach Pi Neustart) wird mir weiterhin die Version v0.10.0 angezeigt!

Was mache ich falsch?

Vielen Dank im voraus
Gruß Thomas

RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Werner Schäffer

Zitat von: JoeALLb am 18 Januar 2017, 08:22:39
Kann mir jemand erklären, was den Unterschied macht zwischen dieser Implementierung
und der standard-Implementierung unter
attr WEB longpoll websocket
?

Websocket-Implementierung direkt in FHEM ist relative neu (seit 10/2016) und ist noch in der Entwicklung.

fhem.js wurde vor etwa 2 Jahren als eigenständiges node.js Modul entwickelt um websocket-Verbindungen zu FHEM aufzubauen.