Xmlrpc mit NodeJS

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

Antworten
pHoEnIx
Beiträge: 9
Registriert: 01.11.2017, 10:13

Xmlrpc mit NodeJS

Beitrag von pHoEnIx » 18.12.2017, 22:20

Hallo zusammen,

ich benutze die CCU2 mit Firmware Version 2.27.8 und versuche von meinem lokalen Rechner auf die Xmlrpc Schnittstelle zuzugreifen. Mit `binrpc` (npm package) auf Port 2001 funktioniert das auch ohne Probleme mich bei der CCU zu initialisieren und auf die Events (system.multicall) zu hören. Da bekomme ich auch alle Events geliefert. Wenn ich jedoch versuche mit `homematic-xmlrpc` (npm package) auf Port 2010 zu lauschen kommen keine Daten an. Das Projekt ioBroker benutzt homematic-xmlrpc im ioBroker.hm-rpc Adapter. Auf einem Raspberry Pi habe ich das auch am Laufen und dort bekomme ich Daten für die Events. Mir gehen leider die Ideen aus woran es liegen könnte. Hat hier jemand schonmal mit dem homematic-xmlrpc Paket gearbeitet?

Folgendermaßen sieht mein Code aus:

Code: Alles auswählen

const xmlrpc = require('homematic-xmlrpc/lib/xmlrpc');

let client = xmlrpc.createClient({ host: '192.168.178.24', port: '2010', path: '/' });
client.methodCall('init', ['http://192.168.178.22:2010','smarthome'], (err, data) => {
});

let server = xmlrpc.createServer({ host: '192.168.178.22', port: '2010' });

server.on('NotFound', function (method, params) {
    console.log("Notfound: " + method + " with " + params);
});

server.on('system.multicall', function (method, params, callback) {
    console.log("multicall", params);
    callback(null, '');
});

server.on('system.listMethods', function (err, params, callback) {
    console.log("listMethods", params);
    callback('', ['event', 'deleteDevices', 'listDevices', 'newDevices', 'system.listMethods', 'system.multicall']);
});

server.on('event', function (err, params, callback) {
    console.log("Event", params);
    callback('');
});

server.on('newDevices', function (err, params, callback) {
    console.log("newDevices");
    callback('');
});

server.on('deleteDevices', function (err, params, callback) {
    console.log("deleteDevices");
    callback('');
});

server.on('listDevices', function (err, params, callback) {
    console.log("listDevices", err, params);
    callback('');
});
Aktive Anfragen an den Client kann ich senden, also sprich ein Ping an die CCU senden. Da kommt auch der `pong`zurück. Also eine Verbindung zur Api ist durchaus da.

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Xmlrpc mit NodeJS

Beitrag von anli » 18.12.2017, 23:04

Hm, eventuell den Server vor init anlegen. Wenn der Prozess läuft, siehst du den offenen Port z. B. via netstat? Kannst du an den Server etwas per zum Beispiel postman schicken?
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

pHoEnIx
Beiträge: 9
Registriert: 01.11.2017, 10:13

Re: Xmlrpc mit NodeJS

Beitrag von pHoEnIx » 18.12.2017, 23:13

Habe dem Client auch schon einen Timeout gegeben. Hat aber auch nichts geändert. Wie bereits erwähnt, mit dem binrpc läuft das exakt so ohne Probleme. Kann an den Server Daten schicken. Hab es eben auch nochmals getestet.

zap
Beiträge: 66
Registriert: 05.12.2014, 17:57

Re: Xmlrpc mit NodeJS

Beitrag von zap » 19.12.2017, 15:01

Der Server muss laufen, bevor das Init geschickt wird. Während der Ausführung von Init schickt die CCU ein ListDevice Request an den Server. Diesen sollte der Server mit einem leeren Array beantworten. Daraufhin kehrt Init zurück und die CCU schickt NewDevice Requests mit allen ihren Geräten.

Sowohl BidCos-RF (Port 2001) als auch HMIP (Port 2010) laufen mit ASCII-RPC, also ohne BinRPC. Lediglich CUXD kann nur binrpc.

pHoEnIx
Beiträge: 9
Registriert: 01.11.2017, 10:13

Re: Xmlrpc mit NodeJS

Beitrag von pHoEnIx » 19.12.2017, 18:34

zap hat geschrieben:Während der Ausführung von Init schickt die CCU ein ListDevice Request an den Server. Diesen sollte der Server mit einem leeren Array beantworten. Daraufhin kehrt Init zurück und die CCU schickt NewDevice Requests mit allen ihren Geräten.
Das war das Problem. Ich hatte mit einem leeren String geantwortet weil ich nicht wusste welche Antwort erwartet wird. Nun funktioniert es. Vielen Dank :-)

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Xmlrpc mit NodeJS

Beitrag von hobbyquaker » 21.12.2017, 21:12

zap hat geschrieben:Sowohl BidCos-RF (Port 2001) als auch HMIP (Port 2010) laufen mit ASCIIXML-RPC, also ohne BinRPC. Lediglich CUXD kann nur binrpc.
Dennoch würde ich wenn immer möglich (also auch mit rfd und hs485d) empfehlen BinRPC zu nutzen.

Nicht nur weil ich es "schöner" finde dass BinRPC quasi mit 0 Overhead (bei XML-RPC ist der Overhead ein mehrfaches der Nutzdaten...) von statten geht und das Erzeugen und Parsen der Nachrichten vermutlich um eine Größenordnung oder mehr schneller und deutlich ressourcenschonender als XML-RPC ist (XML Parsen ist "teuer"...) - sondern auch weil das BinRPC Modul über einen relativ langen Zeitraum (> 3 Jahre) und wesentlich intensiver genutzt, getestet und verbessert wurde als das XML-RPC Modul.
Zuletzt geändert von hobbyquaker am 21.12.2017, 21:13, insgesamt 1-mal geändert.
Grund: typo

zap
Beiträge: 66
Registriert: 05.12.2014, 17:57

Re: Xmlrpc mit NodeJS

Beitrag von zap » 22.12.2017, 08:57

Ja, was Nodejs angeht hast du natürlich recht. Ich komme aus der FHEM/Perl Welt. Da ist es umgekehrt, d.h. es gibt kein (brauchbares) binrpc Modul, daher habe ich es für FHEM selbst implementiert.

pHoEnIx
Beiträge: 9
Registriert: 01.11.2017, 10:13

Re: Xmlrpc mit NodeJS

Beitrag von pHoEnIx » 26.12.2017, 20:21

Was mich jedoch verwundert ist, dass sich HMIP auf Port 2010 an manchen Stellen anders verhält. Wenn ich bei BidCos-RF mit methodCall einen Ping ausführe ist dieser im Multicall gelistet, mit HMIP jedoch nicht. Ebenso wird auch kein listMethods call von HMIP ausgeführt. Weiss jemand weswegen es zu diesen Unterschieden kommt?

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Xmlrpc mit NodeJS

Beitrag von hobbyquaker » 29.12.2017, 18:26

Ist halt eine komplett andere Implementierung die an manchen Stellen etwas stiefmütterlich gemacht zu sein scheint. Die XML-RPC Schnittstelle wird von eQ-3 übrigens auch als "Legacy API" bezeichnet - das darf frei interpretiert werden... :wink:

Siehe dazu auch:
https://github.com/eq-3/occu/issues
http://www.eq-3.de/Downloads/eq3/downlo ... dendum.pdf

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“