XMLRPC mit Java

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

Moderator: Co-Administratoren

JSteinhilber
Beiträge: 9
Registriert: 20.01.2020, 19:12

XMLRPC mit Java

Beitrag von JSteinhilber » 21.01.2020, 11:13

Als absoluter Neuling grüße ich euch erstmal recht herzlich.
Ich betreibe eine CCU3 mit HM- und HM-IP-Geräten und bräuchte hierfür eine funktionierende XMLRPC-Verbindung.

Das Ganze soll in Java erstellt werden. Die von mir verwendeten Apache-Bibliotheken haben die Versionsnummer 3.1.3.
Meine noch recht primitive Serverklasse sieht so aus:

Code: Alles auswählen

public class SmartXmlRpcServer { 

	   public static void main(String[] args) throws Exception {
		   
		      WebServer webServer = new WebServer(6001);
		      XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
		      

		      PropertyHandlerMapping phm = new PropertyHandlerMapping();
		      phm.setVoidMethodEnabled(true);
		      
		      phm.addHandler("system", EchoServiceImpl.class);
		      phm.addHandler("", EchoServiceImpl.class);
		      phm.setVoidMethodEnabled(true);
		      
		      xmlRpcServer.setHandlerMapping(phm);

		      XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
		      serverConfig.setEnabledForExtensions(true);
		      serverConfig.setContentLengthOptional(false);
		      
		      webServer.start();
		      
		      System.out.println("XML-RPC-Server gestartet");
	    }
 }
Die zugehörige Handlerklasse sieht so aus:

Code: Alles auswählen

package smartXmlRpcServer;

import java.util.Map;

public class EchoServiceImpl implements EchoService {
 
	
	public Object[] listDevices(Object[] devices) {
		System.out.println(devices);
		return devices;
	}

	
	public void event(String interface_id, String address, String value_key, Object value) {
		System.out.println(address);
	}
	
	public void listMethods(String methods) {
		System.out.println("Methoden:\n"+methods);
	}
	
	public Boolean[] multicall(Object[] args) {
	    Boolean res[] = new Boolean[args.length];  
	    for (int i=0; i<args.length; i++) {
	      Map<?, ?> call = (Map<?, ?>) args[i];
	      String method = (String)call.get("methodName");
	      Object[] margs = (Object[])call.get("params");
	      System.out.println(method);
	      if ("event".equals(method)) {
	        // hier erfolgt der Aufruf der "event"-Methode
	        event(margs[0].toString(), margs[1].toString(), margs[2].toString(), margs[3]);
	        res[i] = Boolean.TRUE;
	      }
	
	  }
	    return res;
	}  
}    
Wenn ich mit der Clienseite den Server mittels INIT an der CCU anmelden möchte, erhalte ich folgenden Output:

Code: Alles auswählen

XML-RPC-Server gestartet
Methoden:
123456
Jan 21, 2020 10:49:08 AM org.apache.xmlrpc.server.XmlRpcErrorLogger log
SCHWERWIEGEND: No such handler: listDevices
org.apache.xmlrpc.server.XmlRpcNoSuchHandlerException: No such handler: listDevices
	at org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.getHandler(AbstractReflectiveHandlerMapping.java:214)
	at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:45)
	at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
	at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
	at org.apache.xmlrpc.webserver.Connection.run(Connection.java:208)
	at org.apache.xmlrpc.util.ThreadPool$Poolable$1.run(ThreadPool.java:68)
Die Methode system.listMethod wird offensichtlich gefunden, gibt aber lediglich die übergebenen ID "123456" und keine Methodennamen zurück.
Die Methode listDevices wird gar nicht gefunden, und die Events erreichen meinen Server ebenfalls nicht.
Nun habe ich mit Dr. Google bereits einige Beiträge zum Thema XMLRPC hier im Forum gefunden, die mich leider nicht weiter gebracht haben.
Hat zufällig jemand im Forum eine CCU3 mit einem Java-SMLRPC-Server am Laufen und könnte mir etwas auf die Sprünge helfen?
Ich würde mich riesig freuen.
Danke und schöne Grüße schon mal.
Jürgen

JSteinhilber
Beiträge: 9
Registriert: 20.01.2020, 19:12

XMLRPC mit Java

Beitrag von JSteinhilber » 21.01.2020, 11:50

Hallo an alle alten (und neuen) Häsinnen und Hasen,
ich wär dann der Neue und komme HM-technisch aus dem Tal der Ahnungslosen.
Betrieben wird eine CCU3 mit sowohl HM- als auch HM-IP-Geräten
Ich müßte über Zustandsänderungen von der CCU informiert werden und bräuchte dafür einen XMLRPC-Server.
Ich verwende die Apache-Bibliotheken in der Version 3.1.3.
Meine Serverklasse sieht so aus:

Code: Alles auswählen

public class SmartXmlRpcServer { 	

	   public static void main(String[] args) throws Exception {
		   
		      WebServer webServer = new WebServer(6001);
		      XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
		      

		      PropertyHandlerMapping phm = new PropertyHandlerMapping();
		      phm.setVoidMethodEnabled(true);
		      
		      phm.addHandler("system", EchoServiceImpl.class);
		      phm.addHandler("", DefaultHMImpl.class);
		      phm.setVoidMethodEnabled(true);
		      
		      xmlRpcServer.setHandlerMapping(phm);

		      XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
		      serverConfig.setEnabledForExtensions(true);
		      serverConfig.setContentLengthOptional(false);
		      
		      webServer.start();
		      
		      System.out.println("XML-RPC-Server gestartet");
	    }
 
}
Die zugehörige Handlerklasse sieht so aus:

Code: Alles auswählen

public class EchoServiceImpl implements EchoService {
 
	
	public Object[] listDevices(Object[] devices) {
		System.out.println(devices);
		return devices;
	}

	
	public void event(String interface_id, String address, String value_key, Object value) {
		System.out.println(address);
	}
	
	public void listMethods(String methods) {
		System.out.println("Methoden:\n"+methods);
	}
	
	public Boolean[] multicall(Object[] args) {
	    Boolean res[] = new Boolean[args.length];  
	    for (int i=0; i<args.length; i++) {
	      Map<?, ?> call = (Map<?, ?>) args[i];
	      String method = (String)call.get("methodName");
	      Object[] margs = (Object[])call.get("params");
	      System.out.println(method);
	      if ("event".equals(method)) {
	        // hier erfolgt der Aufruf der "event"-Methode
	        event(margs[0].toString(), margs[1].toString(), margs[2].toString(), margs[3]);
	        res[i] = Boolean.TRUE;
	      }
	
	  }
	    return res;
	}  
} 
Sobald ich versuche über den Client mittels INIT den Server zu registrieren erhalte ich folgende Exception:

Code: Alles auswählen

XML-RPC-Server gestartet
Methoden:
123456
Jan 21, 2020 11:31:02 AM org.apache.xmlrpc.server.XmlRpcErrorLogger log
SCHWERWIEGEND: No such handler: listDevices
org.apache.xmlrpc.server.XmlRpcNoSuchHandlerException: No such handler: listDevices
	at org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.getHandler(AbstractReflectiveHandlerMapping.java:214)
	at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:45)
	at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
	at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
	at org.apache.xmlrpc.webserver.Connection.run(Connection.java:208)
	at org.apache.xmlrpc.util.ThreadPool$Poolable$1.run(ThreadPool.java:68)
Die (in apache xmlrpc) integrierte Methode system.listMethods wird offensichtlich gefunden. Ausgegeben wird aber lediglich
die von mir angegebene ID "123456", jedoch keine Mehtodennamen. Die Methode listDevices wird gar nicht gefunden.
Eine event-Benachrichtigung findet ebenfalls nicht statt.
Trotz einiger Beiträge hier im Forum bin ich bislang noch keinen Schritt weitergekommen.
Hat zufällig jemand in einer ähnlichen Konfiguration einen XMLRPC-Server mit Java zum Laufen bekommenm?
Wäre wirlich dankbar für jede hilfreiche Anregung.
Schöne Grüße
Jürgen

P.s.: ich habe einen ähnlichen Beitrag vor ca. 20 Min. erstellt und abgesendet, wobei es scheint als hätte sich derselbe in einen schwarzen Loch verirrt.

ErwinH
Beiträge: 53
Registriert: 15.12.2018, 08:51
Wohnort: Offenbach
Hat sich bedankt: 7 Mal
Danksagung erhalten: 1 Mal

Re: XMLRPC mit Java

Beitrag von ErwinH » 21.01.2020, 16:30

Sorry, aber ich versteh's einfach nicht: was genau willst du denn hier erreichen? Wozu soll dein eigener XMLRPC-Server denn überhaupt gut sein? Die CCU ist doch ein XMLRPC-Server.
In meinem Client sieht das in etwa so aus:

Code: Alles auswählen

                XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
                URL hmURL;
                try {
                    hmURL = new URL(txtURL.getText());
                    config.setServerURL(hmURL);
                }
                catch (MalformedURLException eURL) {
                    eURL.printStackTrace();
                    return;
                }
                client = new XmlRpcClient();
                client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
                client.setConfig(config);
                try {
                    List<Object> params = new LinkedList<Object>();
                    allDevices = new HashMap<String, Device>();
                    Object devices = client.execute("listDevices", params);
                    Object[] devs = (Object[])devices;
...
Vieleicht erklärst du erstmal, was du genau zu erreichen versuchst.

Erwin

JSteinhilber
Beiträge: 9
Registriert: 20.01.2020, 19:12

Re: XMLRPC mit Java

Beitrag von JSteinhilber » 21.01.2020, 18:09

Hallo Erwin,
vielen Dank für Dein Snippet.
Um Deine Frage zu beantworten, was ich mit dem XMLRPC-Server eigentlich vorhabe:
Wenn ich das richtig verstanden habe, dann hat man mit einem eigenen (angemeldeten) Server die Möglichkeit, sämtliche Zustansänderungen von der CCU in der Form eines events geliefert zu bekommen. Und genau das bräuchte ich.

Z.B. die Info, daß in Kabine 4 der Taster XY gedrückt wurde. Diese Information soll dann automatisiert in unserer RehaVerwaltung weiterverarbeitet werden. Z.B. indem auf sämtlichen Monitoren an der Rezeption ein Notfall angezeigt wird mit der Position des Notfalls, der Uhrzeit der Alarmauslösung und der Möglichkeit den Notruf zurückzusetzen.
Nur so als eines von vielen Beispielen.
Ich muß nichts schalten, ich brauche lediglich die Information was gerade geht und was nicht.
Dummerweise funktioniert das bislang noch nicht einmal im Ansatz - leider.
Grüße
Jürgen

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

Re: XMLRPC mit Java

Beitrag von hobbyquaker » 21.01.2020, 18:34

Ein paar Methoden müssen in Deinem XML-RPC Server implementiert sein und die richtigen Antworten liefern damit das funktioniert, mindestens müssen system.listMethods und system.multicall, event und listDevices vorhanden sein. Siehe dazu https://www.eq-3.de/Downloads/eq3/downl ... pc_API.pdf und https://www.eq-3.de/Downloads/eq3/downl ... dendum.pdf

Eine minimale Implementierung als Beispiel findest Du z.B. hier https://github.com/hobbyquaker/binrpc/b ... example.js (das ist zwar BinRPC, aber das funktioniert genauso, nur das URL Schema xmlrpc_bin:// musst Du natürlich durch http:// ersetzen.)

Wenn Du Events von HmIP-Tasten empfangen willst gibt es u.U. noch das "reportValueUsage" Thema zu beachten, dazu einfach die Forensuche bemühen.

Fonzo
Beiträge: 6687
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 478 Mal

Re: XMLRPC mit Java

Beitrag von Fonzo » 21.01.2020, 18:51

JSteinhilber hat geschrieben:
21.01.2020, 11:50
Betrieben wird eine CCU3 mit sowohl HM- als auch HM-IP-Geräten
Ich müßte über Zustandsänderungen von der CCU informiert werden und bräuchte dafür einen XMLRPC-Server.
Ich verwende die Apache-Bibliotheken in der Version 3.1.3.
Wenn Du einen PHP Server nutzten willst um Webseiten zu generieren und Werte aus Homematic auszulesen musst Du das Rad nicht zwingend neu erfinden. Das kann man z.B. mit IP-Symcon erledigen, das ist gleichzeitig PHP Server und liest Dir die Werte aus Homematic aus und kann davon abhängig dann eben individuelle Webseiten generieren bzw. generiert auch automatisch eine Ansicht.
JSteinhilber hat geschrieben:
21.01.2020, 11:50
Hat zufällig jemand in einer ähnlichen Konfiguration einen XMLRPC-Server mit Java zum Laufen bekommenm?
Wenn Du lieber Java nutzten willst, brauchst Du das Rad auch nicht neu erfinden, hier kannst Du z.B. openHAB nutzten das nutzt Java auch da ist bereits alles vorhanden um Homematic auslesen zu können.
JSteinhilber hat geschrieben:
21.01.2020, 11:50
Z.B. die Info, daß in Kabine 4 der Taster XY gedrückt wurde. Diese Information soll dann automatisiert in unserer RehaVerwaltung weiterverarbeitet werden. Z.B. indem auf sämtlichen Monitoren an der Rezeption ein Notfall angezeigt wird mit der Position des Notfalls, der Uhrzeit der Alarmauslösung und der Möglichkeit den Notruf zurückzusetzen.
Nur so als eines von vielen Beispielen.
Auch hier gibt es bereits Projekte, die ähnliche Dinge verfolgen an denen man sich orientieren kann wie z.B. IRiS.
Möglich wäre z.B. auch bei Drücken des Tasters X automatisch einen Anruf auf ein zugewiesenes Handy des Pflegepersonals zu initiieren mit einer Ansage wo der Taster gedrückt wurde und wer Hilfe benötigt. Hier findest Du Skriptbeispiele zum Entgegennehmen eines Telefonanrufs bzw. Auslösen eines Telefonanrufs wenn Du z.B. ein Anruf entgegen nehmen willst bzw. einen Initiieren eines Anrufs wenn ein Homematic Taster gedrückt wurde.
Zuletzt geändert von Fonzo am 21.01.2020, 19:15, insgesamt 1-mal geändert.

JSteinhilber
Beiträge: 9
Registriert: 20.01.2020, 19:12

Re: XMLRPC mit Java

Beitrag von JSteinhilber » 21.01.2020, 19:10

Mein lieber Herr Gesangsverein!
Sich über mangelnde Hilfsbereitschaft in diesem Forum zu beklagen - das wär' schon etwas vermessen!
Und das Ganze in gefühlter Lichtgeschwindigkeit.
Herzlichen Dank für die Unterstützung.
Grüße
Jürgen

P.s.: sollte noch jemand ein Java-Snippet im Keller haben, ich hätte durchaus noch Interesse.

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: XMLRPC mit Java

Beitrag von alchy » 21.01.2020, 19:13

JSteinhilber hat geschrieben:
21.01.2020, 19:10
Sich über mangelnde Hilfsbereitschaft in diesem Forum zu beklagen - das wär' schon etwas vermessen!
Und das nächste Mal unterlässt du einfach noch das doppelte Posting, :wink: das macht die Sache dann rund.
Ich habe jetzt die Themen hier zusammen geführt.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

JSteinhilber
Beiträge: 9
Registriert: 20.01.2020, 19:12

Re: XMLRPC mit Java

Beitrag von JSteinhilber » 21.01.2020, 19:20

Und das nächste Mal unterlässt du einfach noch das doppelte Posting, :wink: das macht die Sache dann rund.
Ich denke die Zusage kann ich machen!
Ich habe jetzt die Themen hier zusammen geführt.
Danke dafür.
Jürgen

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

Re: XMLRPC mit Java

Beitrag von hobbyquaker » 21.01.2020, 19:29

JSteinhilber hat geschrieben:
21.01.2020, 19:10
P.s.: sollte noch jemand ein Java-Snippet im Keller haben, ich hätte durchaus noch Interesse.
Einfach ein Blick in die Sourcen von Java basierender Software werfen die das macht, z.B. das openHAB homematic binding, owagners hm2mqtt oder den ccu-historian (bin mir aber nicht sicher ob der nicht vll in Groovy implementiert ist).

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“