FHEMSync (Alternative zu FHEM2FHEM/RFHEM)

Begonnen von dominik, 18 März 2020, 21:55:46

Vorheriges Thema - Nächstes Thema

dominik

Hallo,

ich habe seit ein paar Tagen 2 FHEM RPis am Laufen, da ich den 2. RPi zur "Reichweitenerhöhung" für Bluetoothgeräte benötige. Nun habe ich mit FHEM2FHEM versucht die Geräte des "Remote FHEM" in meine Hauptinstallation zu bekommen, das hat leider nicht zu dem Ergebnis geführt das ich wollte. Daher habe ich entschieden ein eigenes Modul dafür zu schreiben.

Folgende Funktionen werden von FHEMSync abgedeckt:
- FHEM Devices werden von einer Remote FHEM Instanz in die FHEM Master Instanz synchronisiert
- Reading Updates werden automatisch gemacht
- Commands können aus den FHEM Master direkt an die Remote FHEM Instanz geschickt werden
- Attribute und Internals werden ebenfalls vom Remote Device übertragen (außer "room", da das keinen Sinn machen würde)
- Das Device wird daher 1:1 dargestellt, einziger Unterschied ist der TYPE des Devices

Wie erfolgt die Einrichtung von FHEMSync?
Begriffsdefinition:
- Master FHEM: FHEM Instanz wo die Devices hin synchronisiert werden sollen
- Remote FHEM: FHEM Instanz von wo die Devices zu Master synchronisiert werden sollen
Installation:
Master
- Sofern noch kein node am Master installiert, muss noch folgendes ausgefuehrt werden:
$ curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
$ sudo apt install -y nodejs

- 10_FHEMSYNC ins FHEM Verzeichnis kopieren und reload 10_FHEMSYNC ausführen
- 10_FHEMSYNC_DEVICE ins FHEM Verzeichnis kopieren und reload 10_FHEMSYNC_DEVICE ausführen
- sudo npm install -g fhemsync
- In der Haupt-FHEM Instanz:
     - define fhemsync FHEMSYNC
     - attr fhemsync remote-server IP-VON-REMOTE-FHEM
     - Folgende weitere remote-* Attribute koennen gesetzt werden wenn diese von Default abweichen, default:
            server: MUSS GESETZT WERDEN
            port: 8083
            webname: fhem
            filter: room=FHEMSync
            auth: ""
            ssl: false,
            selfsignedcert: false
     - FHEMSync-* Werte definieren den Zugriff auf die Master Instanz, default:
            server: 127.0.0.1
            port: 8083
            webname: fhem
            auth: ""
            ssl: false,
            selfsignedcert: false
Remote
- In der Remote-FHEM Instanz einen Raum FHEMSync erstellen wo die zu synchronisierenden Devices hinterlegt werden müssen

Der Rest läuft vollautomatisch.
Logfile ist im Logverzeichnis mit dem Namen fhemsync-YYYY-MM-DD.log zu finden.

Changelog
- v0.9.9
Fix uninitialized value
- v0.9.8
Fix some attr sync issues (fhemsync v2.7.2 required)
- v0.9.7
Bugfixes
- v0.9.6
Sync Attributes from Master to Slave
- v0.9.5
Get working now
- v0.9.4
Fix key=value parameters in set commands
- v0.9.3
Bugfixes
- v0.9.1
Support up to 5 remote FHEMs (untested, bitte um Feedback)
Fix get (untested, bitte um Feedback)
- v0.9.0
Support Get (erfordert fhemsync v2.1.0)

Aktuelle Einschränkungen die in den nächsten Tagen behoben werden:
- Readings/Attribute die gelöscht werden, werden in der Hauptinstanz nicht gelöscht
- Authentifizierung (falls bei FHEM WEB genutzt) wird noch nicht unterstützt
- Commandref ist noch nicht korrekt

- Der Name des Devices wird 1:1 aus dem Remote FHEM übernommen und darf nicht geändert werden

Wer es ausprobieren möchte, anbei die beiden Files. Bitte um Feedback.
Wenn alles funktioniert, werde ich das Modul auch ins offizielle Repository einspielen.

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

marvin78

Hey dominik,

ich habe mir das Modul nicht angeschaut. Aber wenn es das macht, was es machen soll, wäre es nicht in einem anderen Unterforum (Automatisierung oder Sonstiges!?)  besser aufgehoben? Hier schauen in der Regel ja nur die Entwickler rein.


CoolTux

Was ich nicht ganz verstehe, wieso muss da noch was mittels npm installiert werden? Ich finde eine solche Abhängigkeit schon riesig. Gerade für so eine kleine Funktion der Synchronisierung.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dominik

Danke für den Hinweis wegen Unterforum, ich werde es in Automatisierung verschieben.

@CoolTux, weil ich in NodeJS aus gassistant schon so gut wie alle Funktionalitäten parat hatte. Generell bin ich in NodeJS auch schneller als in Perl, daher bevorzuge ich das. Ich denke die meisten haben aufgrund von Alexa oder Google Assistant sowieso schon npm installiert und daher ist die Installation wahrscheinlich nur eine Kleinigkeit.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Wzut

Zitat von: dominik am 19 März 2020, 07:50:41
Ich denke die meisten haben aufgrund von Alexa oder Google Assistant sowieso schon npm installiert
das glaube ich kaum wenn man den FHEM Stats Glauben schenkt ....
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

marvin78

Ich denke, auch, dass das eine Abhängigkeit ist, die viele User ausschließt. Mich zum Beispiel.

DS_Starter

ZitatIch denke die meisten haben aufgrund von Alexa oder Google Assistant sowieso schon npm installiert
Alexa kommt bei mir nicht ins Haus solange ich das vermeiden kann !
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Ich kann Dominik verstehen. Die benötigten Funktionen standen halt schon mit Code fertig.
Ich persönlich würde aber so etwas vermeiden. Die selbe Funktionalität hätte sich auch in der FHEM Ausgangssprache (Perl) lösen lassen. Ich finde diese Abhängigkeit extrem. Ist aber nur meine persönliche Meinung.


Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dominik

#8
@Wzut, da gebe ich dir natürlich recht.

@marvin78, ausschließen tu ich niemanden, es kann jeder selbst entscheiden ob er node installiert. Gleiches gilt für alle Abhängigkeiten, egal ob Perl Module, externe Binaries, etc..

Wer mag, kann das gerne auch nativ in Perl implementieren. Nachdem einige andere Module ebenfalls nodejs Module erfordern, sehe ich das (für mich) nicht soooo kritisch.
Es ist natürlich jeden selbst überlassen ob man node installiert oder nicht. Ich zwinge niemanden dazu :) Wer es nutzen mag nutzt es, die anderen nicht. Ich wollte es nur allen zur Verfügung stellen.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

ToKa

Hallo Dominik,

da ich zum Kreis der Alexa / Google Anwender gehöre, ist die Abhängigkeit kein Hindernis für mich. Ich finde Deinen Ansatz spannend und werde es mal ausprobieren, da ich gerade dabei bin meine Raspi Installation aufzuteilen. Habe es bisher über MQTT2 Funktionaliät getestet, was auch geht, aber natürlich mit Kanonen auf Spatzen geschossen ist.

Beste Grüße
Torsten
RaspberryPi3 mit RaZberry2 und Conbee II
Fibaro: FGWPE/F-101 Switch & FIBARO System FGWPE/F Wall Plug Gen5, FGSD002 Smoke Sensor
EUROtronic: SPIRIT Wall Radiator Thermostat Valve Control
Shelly2.5 Rollladenaktoren
Zipato Bulb 2, Osram und InnrLight

rudolfkoenig

Die Loesung mit npm/node.js ist aus Sicht der Benutzer zwar doof, vmtl. noch mehr die Tatsache, dass es eine weitere (die dritte?) Alternative ist, und als Anfaenger nicht so recht weiss, was man nehmen soll.

Aus meiner Sicht ist das anders, weil Konkurrenz das Geschaeft belebt, und man was dazulernen kann :)

Z.Bsp ueber das "wie":
- Theorie: FHEM kontaktiert lokalen node.js, das wiederum das remote FHEMWEB anspricht.
- Welches Protokoll wird bei der lokalen und bei der remote Verbindung verwendet?
- Welche Benachrichtigungsmechanismus wird verwendet? Wenn FHEMWEB: welche der etlichen inform Varianten?
- Wie/Wann werden Internals uebertragen?

punker

Habs jetzt mal versucht zu installieren, aber leider schon ein Fehler bei der npm installation:
npm install -g fhemsync
/root/.nvm/versions/node/v10.16.3/bin/fhemsync -> /root/.nvm/versions/node/v10.16.3/lib/node_modules/fhemsync/fhemsync.js
npm WARN request-promise@4.2.5 requires a peer of request@^2.34 but none is installed. You must install peer dependencies yourself.
npm WARN request-promise-core@1.1.3 requires a peer of request@^2.34 but none is installed. You must install peer dependencies yourself.


im fhemsync.log steht:

###
### The "request" library is not installed automatically anymore.
### But is a dependency of "request-promise".
### Please install it with:
### npm install request --save
###

/usr/lib/node_modules/fhemsync/node_modules/request-promise/lib/rp.js:23
    throw err;
    ^

Error: Cannot find module 'request'
Require stack:
- /usr/lib/node_modules/fhemsync/node_modules/request-promise/lib/rp.js
- /usr/lib/node_modules/fhemsync/fhemsync.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:982:15)
    at Function.Module._load (internal/modules/cjs/loader.js:864:27)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at /usr/lib/node_modules/fhemsync/node_modules/request-promise/lib/rp.js:11:16
    at module.exports (/usr/lib/node_modules/fhemsync/node_modules/stealthy-require/lib/index.js:62:23)
    at Object.<anonymous> (/usr/lib/node_modules/fhemsync/node_modules/request-promise/lib/rp.js:10:19)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (/usr/lib/node_modules/fhemsync/fhemsync.js:8:17)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/lib/node_modules/fhemsync/node_modules/request-promise/lib/rp.js',
    '/usr/lib/node_modules/fhemsync/fhemsync.js'
  ]
}


FHEMSYNC startet nicht!
LG

Dieter

The truth is out there!

KölnSolar

#12
ZitatWer mag, kann das gerne auch nativ in Perl implementieren. Nachdem einige andere Module ebenfalls nodejs Module erfordern, sehe ich das (für mich) nicht soooo kritisch.
Ich schon. Wir schaffen uns immer mehr "externen Ballast". So etwas wie node/npm sollte nur im absoluten "Notfall" eingesetzt werden, wenn die Funktionalität EXTREM komplex ist und eine Umsetzung in Perl fast unmöglich ist. Ich nehme mal meine Beispiele der Deebot-Implementierung und SamsungAV. Beides funktionierent mit Python. ABER: Python-Installation ist meines Erachtens extrem kompliziert, da unterschiedlichste Versionen implementiert und umgekehrt Voraussetzung für die Funktionsweise der Python-Module ist. Daher hab ich extra alles in Perl oder sonstige FHEM-Funktionalität(MQTT) umgesetzt. Irgendwann ufert das so aus, dass wir im Forum nur noch über die Installation von nicht-Perl supporten müssen.
Zitat@CoolTux, weil ich in NodeJS aus gassistant schon so gut wie alle Funktionalitäten parat hatte. Generell bin ich in NodeJS auch schneller als in Perl, daher bevorzuge ich das.
Schneller kann nicht das Argument sein. Schlanke Installationen mit wenig OS-Gefummel sind das Gegenargument.
Edit: Und bereits parat ist doch vermutlich nur, weil Du nicht sofort in Perl entwickelt hast, sonst wären die Funktionalitäten in Perl vorhanden gewesen. Da bewahrheitet sich dann: Wehret den Anfängen...

Grüße Markus

Edit: und schon geht es wieder los, wie punker beweist.... :'(
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

dominik

@rudolfkoenig
- Theorie: FHEM kontaktiert lokalen node.js, das wiederum das remote FHEMWEB anspricht.
Exakt, wobei nodejs eine Verbindung sowohl zum "Master FHEM" als auch zum "Remote FHEM" herstellt.

- Welches Protokoll wird bei der lokalen und bei der remote Verbindung verwendet?
longpoll, eventuell später websocket wenn Interesse besteht

- Welche Benachrichtigungsmechanismus wird verwendet? Wenn FHEMWEB: welche der etlichen inform Varianten?
longpoll inform=type=status, falls du das meinst?

- Wie/Wann werden Internals uebertragen?
Beim einmaligen Anlegen der Devices im Master FHEM. Gleiches gilt für Attributes.

Wie gesagt, mich hat nur gestört, dass FHEM2FHEM es nicht so gemacht hat, wie ich es wollte ;) Wenn FHEM2FHEM erweitert wird auf "Command senden" und das Device wirklich nahezu 1:1 im Master FHEM darstellen, steige ich gleich wieder um. Das fehlte mir jedoch.

@punker
sudo npm install request
Da fehlt eine Abhängigkeit, werde ich aktualisieren. Danke für die Rückmeldung!

@KölnSolar
Ich nutze gerne bestehende Libraries, weil ich damit nicht selbst die Weiterentwicklung vornehmen muss - warum auch doppelt entwickeln? Für Perl gibt es leider nicht immer das was ich benötige, daher nutze ich dann auch mal andere Sprachen...und ja, jeder kann gerne FHEMSync in Perl implementieren.
Ich hatte ja schon mal gesagt, ich fände ein FHEM NodeJS Binding super...aber das möchte ich nun hier nicht diskutieren.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

carlos

Hallo,
Ich habe jetzt auch mal versucht FHEMSync zu installieren.
Nachdem ich request nach installiert habe bekomme ich folgenden Fehler:
(node:9433) UnhandledPromiseRejectionWarning: RequestError: Error: read ECONNRESET
    at new RequestError (/usr/lib/node_modules/fhemsync/node_modules/request-promise-core/lib/errors.js:14:15)
    at Request.plumbing.callback (/usr/lib/node_modules/fhemsync/node_modules/request-promise-core/lib/plumbing.js:87:29)
    at Request.RP$callback [as _callback] (/usr/lib/node_modules/fhemsync/node_modules/request-promise-core/lib/plumbing.js:46:31)
    at self.callback (/usr/lib/node_modules/request/request.js:185:22)
    at Request.emit (events.js:311:20)
    at Request.onRequestError (/usr/lib/node_modules/request/request.js:877:8)
    at ClientRequest.emit (events.js:311:20)
    at Socket.socketErrorListener (_http_client.js:426:9)
    at Socket.emit (events.js:311:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
(node:9433) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:9433) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.


Allerdings steht mein FHEM drausen im Internet, sollte aber doch kein Problem sein. Zum Test habe ich ein FHEM WEB ohne Anmeldung definiert.

Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly