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

Zitat von: Depechem am 18 Januar 2017, 10:40:33
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:
...
Daraufhin dann ein:Dies wird mit einigen "ERR" ausgeführt.
Danach(auch nach Pi Neustart) wird mir weiterhin die Version v0.10.0 angezeigt!
Schau mal auf den Beitrag von t.huber auf Seite 8, ganz unten, dieses Threads. Der beschreibt wie er node.js auf den neuesten Stand gebracht hat

Werner Schäffer

Zitat von: t.huber am 17 Januar 2017, 23:53:35


Nach Start von fhem.js mit
/usr/local/bin/fhem.js
folgende Rückmeldung:
Das gleich mit Neustart nach Deinstallation hat auch keine Veränderung gebracht.

ersetze mal in /usr/local/bin/fhem.js ganz am Anfang die folgenden Zeilen

SOURCE="${BASH_SOURCE[0]}"
PATH="$(dirname $SOURCE)"
PREFIX="$(dirname $PATH)"


durch

PATH=/usr/local/bin
PREFIX=/usr/local


Dies ist ein Workarround und ich versuche dieses Problem im nächsten Release zu lösen

Werner Schäffer

Zitat von: t.huber am 17 Januar 2017, 23:53:35
Ich hab irgendwie kein Glück.

...


Dein kein Glück ist mein Glück!

Du hast mir schon einige Fehler in der Installationsroutine aufgezeigt, die ich daraufhin analysieren und beheben konnte.
Vielen Dank für deine Geduld!

Depechem

Zitat von: Werner Schäffer am 18 Januar 2017, 12:48:34
Schau mal auf den Beitrag von t.huber auf Seite 8, ganz unten, dieses Threads. Der beschreibt wie er node.js auf den neuesten Stand gebracht hat

Danke das hat geholfen! Nun hab ich node auf aktuellem Stand "v7.4.0"
Und schwups das nächste Problem:

Ich bin bis einschließlich hier hin gekommen:
ZitatInstallation von fhem.js
Die Installation von fhem.js einschließlich aller Submodule geht nun ganz einfach:
sudo npm install --unsafe-perm -g fhem.js

Um den Server dann zu starten müsste ich doch laut GitHubanleitung weitermachen oder?
ZitatAll needed npm packages like socket.io, socket-auth and forever getting installed automatically by this command.
Now follow the instructions made by the installation output, e.g. run:
sudo /usr/lib/node_modules/fhem.js/bin/postinstall
This will establish the config environment in /etc/fhem.js and /etc/init.d.
Have a look to /etc/fhem.js/params.js. Adjust the hostname (default is localhost) and telnet port of fhem.pl if neccessary. Optionally set a connection password or set SSL for connections can be done there.
Now starting the server with
/usr/bin/fhem.js
or when /usr/bin is in your path simply by
fhem.js

Autostart as service
If this package is installed on a system with /etc/init.d for starting init processes in this directory a file named fhem.js is found after installation. Check this file for some parameters in case you don't like the defaults.

Activate autostart by
sudo update-rc.d fhem.js enable
Not in every Linux distribution this folder exists, but the script can also be found in path-to-nodejs-modules/fhem.js/etc/init.d (Default of path-to-nodejs-modules: /usr/lib/node_modules).

schon bei: sudo /usr/lib/node_modules/fhem.js/bin/postinstall wird mir der Fehler gebracht "Kommando nicht gefunden"

Also meine Frage wie muss ich weitermachen damit ich den Server starten kann und ein Autostart hinbekomme?

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

wenn du sudo npm install --unsafe-perm -g fhem.js ausgeführt hast und einen User eingegeben hast, dann ist die Installation fertig ...

... und du kannst starten mit

fhem.js

oder

service fhem.js start

Anmerkung: die Beschreibung auf github war leider nicht ganz aktuell. Inzwischen steht auch dort die korrekte Anleitung

Depechem

Zitat von: Werner Schäffer am 18 Januar 2017, 18:23:58
wenn du sudo npm install --unsafe-perm -g fhem.js ausgeführt hast und einen User eingegeben hast, dann ist die Installation fertig ...

... und du kannst starten mit

fhem.js

oder

service fhem.js start

Anmerkung: die Beschreibung auf github war leider nicht ganz aktuell. Inzwischen steht auch dort die korrekte Anleitung

bei service fhem.js start oder sudo service fhem.js start kommt
Zitatsudo service fhem.js start
Warning: Unit file of fhem.js.service changed on disk, 'systemctl daemon-reload' recommended.
Job for fhem.js.service failed. See 'systemctl status fhem.js.service' and 'journalctl -xn' for details.

Also nochmal wenn ich sudo npm install --unsafe-perm -g fhem.js auführe kommt folgendes:

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

Warning: Unit file of fhem.js.service changed on disk, 'systemctl daemon-reload' recommended.

User for running fhem.js (fhem)? fhem

ok, user is valid

/usr/local/lib
└── fhem.js@2.5.0

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"})


Welchen User muss ich hier angeben? User for running fhem.js (fhem)?
den mit dem ich mich im Putty anmelde oder einfach nur der Name "fhem" ?

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

@Depechem

Führe einfach mal den Befehl aus:

sudo systemctl daemon-reload

Da kann nichts passieren und wenn da Fehlermeldungen kommen: ignorieren (man darf natürlich auch analysieren)

Den Benutzer den man eingeben muss, muss ein User sein der bereits existiert. Am Besten nimmt man den unter dem FHEM ausgeführt wird. Den kann man so feststellen falls FHEM gestartet ist:

sudo ps -elf | grep fhem.pl | grep -v grep

In der dritten Spalte steht der User mit dem FHEM ausgeführt wird.

Jetzt nochmals installieren:

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


Jetzt starten mit (empfohlen zum Test)

fhem.js

oder als Service

service fhem.js start






t.huber

Zitat von: Werner Schäffer am 18 Januar 2017, 13:39:54
Dein kein Glück ist mein Glück!

Du hast mir schon einige Fehler in der Installationsroutine aufgezeigt, die ich daraufhin analysieren und beheben konnte.
Vielen Dank für deine Geduld!
Gerne.
Ich bin ja immer gern für eine gemeinsame Lösungsfindung zu haben. 8-)

t.huber

Nun kommt nach dem Start erst mal:
Zitatwarn:    --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/server.js

Im fhem.js.log steht:
Zitatfs.js:558
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: ENOENT: no such file or directory, open '/var/run/fhem/fhem.js.pid'
    at Object.fs.openSync (fs.js:558:18)
    at Object.fs.writeFileSync (fs.js:1223:33)
    at writePid (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:13:6)
    at exports.Monitor.<anonymous> (/usr/local/lib/node_modules/fhem.js/node_modules/forever/bin/mon
    at exports.Monitor.EventEmitter.emit (/usr/local/lib/node_modules/fhem.js/node_modules/eventemit
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever-monitor/lib/forever-monitor/monitor.
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

Die fhem.js.log.error ist leer

Und FHEMSwitch findet nichts.

Depechem

#144
Zitat von: Werner Schäffer am 18 Januar 2017, 19:09:54
@Depechem

Führe einfach mal den Befehl aus:

sudo systemctl daemon-reload

Da kann nichts passieren und wenn da Fehlermeldungen kommen: ignorieren (man darf natürlich auch analysieren)

Den Benutzer den man eingeben muss, muss ein User sein der bereits existiert. Am Besten nimmt man den unter dem FHEM ausgeführt wird. Den kann man so feststellen falls FHEM gestartet ist:

sudo ps -elf | grep fhem.pl | grep -v grep

In der dritten Spalte steht der User mit dem FHEM ausgeführt wird.

Jetzt nochmals installieren:

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


Jetzt starten mit (empfohlen zum Test)

fhem.js

oder als Service

service fhem.js start

Nach:
Zitatsudo systemctl daemon-reload
kommt keine Fehlermedung


nach
Zitatsudo ps -elf | grep fhem.pl | grep -v grep
kommt
1 S fhem       727     1  8  80   0 - 18518 poll_s Jan18 ?        01:31:40 perl fhem.pl fhem.cfg
sozusagen ist der Benutzer "fhem" oder!?

nach
Zitatsudo npm install --unsafe-perm -g fhem.js
kommt
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.1 postinstall /usr/local/lib/node_modules/fhem.js
> ./bin/postinstall

User for running fhem.js (fhem)? fhem

ok, user is valid

/usr/local/lib
└── fhem.js@2.5.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
Zitatfhem.js
kommt

fhem.js
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/server.js
fs.js:558
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: EACCES: permission denied, open '/var/log/fhem.js.log'
    at Object.fs.openSync (fs.js:558:18)
    at Object.forever.startDaemon (/usr/local/lib/node_modules/fhem.js/node_modules/forever/lib/forever.js:460:14)
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever/lib/forever/cli.js:319:15
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever/lib/forever/cli.js:162:5
    at /usr/local/lib/node_modules/fhem.js/node_modules/forever/lib/forever.js:409:24
    at FSReqWrap.oncomplete (fs.js:112:15)


alternativ habe ich es mit "sudo" ausgeführt:
sudo fhem.js
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/server.js



läuft nun der Server?

hier noch der Inhalt meiner params.js
// set debugging (0,1,2)
exports.debug = 0;

// port on which node.js service is reachable, if fhem.js is running as non-root, port must be greater than 1000
exports.nodePort = 8086;

// Hostname or IP of the FHEM server
exports.fhemHost = 192.168.2.109;

// telnet port of FHEM server
exports.fhemPort = 7072;

// extended mode
// 0 - no JsonList2 pushed on change of device (better performance)
// 1 - JsonList2 of device emitted to clients on changed values
exports.extendedMode = 0;

// poll in seconds for refresh fhem devices
// just for keeping buffer sync to fhem server
// in case of connection problems or configuratuion changes
// that may not sent from fhem by inform on
exports.pollForAllDevices = 600

// webserver root directory:
// path for Webfiles (html,css,js, ...) !! no php !!
// change to path of web directory only if you want to deliver
// web files by this server
// set to false else
exports.pathHTML = false;
//exports.pathHTML = '/var/www/homepage';

// default html page
exports.indexHTML = 'index.html';

// use SSL for connections (true/false)
exports.useSSL = false;

// use connection password (true/false)
// it is recommended to use this only if useSSL is also true
// else the password is send as plain text
exports.useClientPassword = false;

// location of sha-256 hashed password
// only needed if useClientPassword = true
// create it on Linux shell with
// echo -n "mein Passwort" | sha256sum | cut -d' ' -f1 > /etc/fhem.js/pw_client_auth
exports.connectionPasswordFile = '/etc/fhem.js/pw_client_auth';

// location of SSL and client-auth certificats
// only used then useSSL set to true
exports.sslcert =
{
   key:    '/etc/ssl/private/bundle/ssl.key',
   cert:   '/etc/ssl/private/bundle/allcert.pem',
}
exports.cipher = 'HIGH:!aNULL:!MD5';

// use this application for providing mySql values to fhem
// before using this feature first install mysql modul with
// npm install -g mysql

exports.readDB = false;

// fhem.js reads every "refresh" seconds from "table"."column" ordered by "sort" desc one value
// from database "fhem"@"localhost" and set the fhem dummy device "fhem_name" to this value.
//
// in /etc/fhem.js (default) must exist a file named pw_host_user containing password for mysql connection
// every possible combination of host and user from readDBvalues below requires a password file

exports.pwdir = '/etc/fhem.js';

exports.readDBvalues =
[
   {table: 'wetterstation.em1010_readings', column: 'total_energy', sort: 'datetime', fhem_name: 'sunenergy', refresh: 60, host: 'localhost', user: 'fhem' },
   {table: 'wetterstation.em1010_readings', column: 'power', sort: 'datetime', fhem_name: 'sunpower', refresh: 60, host: 'localhost', user: 'fhem' },
   {table: 'wetterstation.weather', column: 'wind_speed', sort: 'datetime', fhem_name: 'windspeed', refresh: 60, host: 'localhost', user: 'fhem' },
   {table: 'wetterstation.weather', column: 'wind_gust', sort: 'datetime', fhem_name: 'windgust', refresh: 60, host: 'localhost', user: 'fhem' },
];

exports.message404 = '<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>404 Not Found</h1></center></body></html>';

// -------------------------------------------------------------
// new for 2.4.11 <-- please don't change or delete this line
// -------------------------------------------------------------

// if fhem.js is running as non-root, nodePort must be greater than 1000

// if fhem.js is running as non-root and useSSL is set to true, make sure that the non-root user has read access
// to the files defined in param sslcert above;
// -------------------------------------------------------------
// new for 2.4.7 <-- please don't change or delete this line
// -------------------------------------------------------------

// do version check for fhem.js after every defined interval
// the result of this check is written to the log and emitted with tag "version" to all connected clients
exports.doCheckVersion = true;
exports.checkVersionInterval = 12;  // in hours

// filter out device values that containing following tag:
exports.filterOutTags = ['deviceMsg:', 'pct:', 'level:', 'timedOn:', 'desired-temp:'];


wenn ich nun auf dem Android im FHEMswitch folgendes eingebe:
URL fhem.js server
Zitathttps://192.168.2.109:8086
im Heimnetz
Zitathttps://192.168.2.109:8087
fhem.js Passwort hab ich leer gelassen
URL FHEM Webserver
Zitathttps://192.168.2.109:8082/fhem
im Heimnetz
Zitathttps://192.168.2.109:8083/fhem
wird mir in der App gesagt:
Keine Verbindung zum fhem.js Server möglich:
-URL prüfen
-ist der Server online
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

rabbit83

Hallo,

sieht hier auf einem RasperryPi 1 genauso aus wie bei Depechem.

Grüße
Jan

Guenni1404

Hallo,

ich habe folgendes Problem:

Nachdem ich fhem.js auf meinen Raspberry 3 installiert habe und gestartet, ist es erreichbar.
Nach einem Neustart kommt folgende Meldung in fhem.js.log:

ZitatError: ENOENT: no such file or directory, open '/var/run/fhem/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/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:13:6)
    at .<anonymous> (/usr/lib/node_modules/fhem.js/node_modules/forever/bin/monitor:46:5)
    at EventEmitter.emit (/usr/lib/node_modules/fhem.js/node_modules/eventemitter2/lib/eventemitter2.js:339:22)
    at /usr/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)

Wenn ich dann das Verzeichnis anlege mit:
Zitatmkdir /var/run/fhem
chown fhem/var/run/fhem

und fhem.js neu starte, bekomme ich eine Verbindung.

Nach Neustart des Rechners ist des Verzeichnis allerdings wieder verschwunden.

Gearbeitet habe ich als User Root, fhem.js  wurde bei der Installation der user fhem genommen

Hat jemand einen Tipp?


qubit

Hallo Guenni1404,

eine Variante ist die Pflege einer Konfigurationsdatei im tmpfile.d Verzeichnis. z.B.:

/usr/lib/tmpfiles.d

Ich habe eine Datei fhem.conf mit folgendem Inhalt erzeugt.

d /var/run/fhem 0755 fhem root -

Das Verzeichnis fhem wird nun bei jedem Systemstart erzeugt.

peterk_de

Hi Werner,

ich habe hier gerade ein Device, für das es noch kein Modul für FHEM gibt, wohl aber ein node.js-Modul. Da kam mir fhem.js in Erinnerung ... ich hab deshalb mal in den Sourcecode reingeschaut und im Prinzip wäre es eigentlich ne feine Sache, fhem.js so zu erweitern oder zu einem separaten Modul zu forken, dass man es direkt per require in eigene node.js Module einbinden könnte (den FHEM-Telnet-Teil, ohne den Socket-Teil) ... denn es ist ja alles da, um eine saubere FHEM-Anbindung für ein einzelnes Device zu machen und wirkt schon sehr gut ausgereift ...

Wenn ich das richtig überblicke würde das - wie z.B. bei forever und forever-monitor - auf ein entschlacktes zweites node Modul hinauslaufen. Was meinst du dazu? Ich bin leider Node.js - Noob und dachte, bevor ich mich damit direkt ins Verderben stütze, melde ich mich mal bei dir :)
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

LuBeDa

#149
Hallo zusammen,
wäre fhem.js nicht eine gute Basis um über Node-Red auf FHEM zuzugreifen?

Node-Red basiert auch auf node.js und so wie ich fhem.js verstehe ist die Funktionalität schon vorhanden. Leider kann ich nicht programmieren, meine Versuche etwas in dieser Richtung zu entwickeln sind gescheitert.

Besteht kein allgemeines Interesse an einer Nore-Red Anbindung von FHEM?

Ich denke, mindestens für mich, wäre es eine Erleichterung komplexere Steuerungslogiken zu zeichen statt zu "programmieren".

Als Beispiel habe ich mal einen Flow und ein DOIF angehangen, die ungefähr dasselbe machen sollten.

defmod DI_HarmonySD DOIF ([HarmonyWZ:currentActivity] eq "PowerOff") \
( # Runterfahren mit 30 Sek Pause\
set WOLAS6 off,\
set SDWZ01_TV off,\
set SDWZ01_WiiU off,\
set VUDUO2 off\
\
)\
(\
set SDWZ01_AS6 off\
) \
DOELSEIF ([HarmonyWZ:currentActivity] eq "WiiU") (\
set SDWZ01_WiiU on,\
set SDWZ01_TV on\
)\
DOELSEIF ([HarmonyWZ:currentActivity] eq "Sofatutor") (\
set SDWZ01_TV on,\
set SDWZ01_AS6 on\
)\
DOELSEIF ([HarmonyWZ:currentActivity] eq "Fernsehen") (\
set SDWZ01_TV on\
)
attr DI_HarmonySD disable 1
attr DI_HarmonySD room Regeln
attr DI_HarmonySD wait 0,30:0:0:0


Falls jemand eine Node-Red Anbindung programmiert stelle ich mich gerne als Betatester zur Verfügung.



Ludger