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

Re: XMLRPC mit Java

Beitrag von JSteinhilber » 04.02.2020, 17:51

Hallo Eriban und Familienvater,

Eriban, ich dachte immer die Java-Jünger sind so gut wie ausgestorben (und mir ist auch schon ganz übel). Vielen Dank für das Beispiel.

Familienvater, der Hinweis mit ioBroker und Wireshark war grandios, auch dir herzlichen Dank.

Grüße
Jürgen

Mathias
Beiträge: 1767
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 253 Mal
Kontaktdaten:

Re: XMLRPC mit Java

Beitrag von Mathias » 04.02.2020, 22:13

Vielleicht noch eine andere Idee: Bevor viele immer wieder versuchen, sich mit dem komplexen Schnittstellen der CCU auseinanderzusetzen, habe ich den CCU-Jack ins Leben gerufen. Anderen Entwicklern sollte es möglichst leicht fallen, ihre Applikationen an die CCU anzubinden. In ihm stecken etliche Jahre Erfahrung mit dem CCU-Historian.

CCU-Jack auf GitHub

Gruß
Mathias

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

Re: XMLRPC mit Java

Beitrag von JSteinhilber » 07.02.2020, 20:39

Hallo Matthias,
allergrößten Respekt vor Deiner Arbeit.
Für jemanden wie mich, der zu blöd ist sich auf die Schnelle(!) in Software einzulesen die nicht in Java geschrieben ist, ist es aber oftmals schneller das Rad neu zu erfinden (auch wenn es danach dreieckig ist - das Rad...).

Da ich jedoch ein absoluter Homematic Neuling bin, habe ich aber doch noch ein paar Fragen.
- läßt sich die redseligkeit der IP-Komponenten halbwegs eindämmen? Die Dinger sind ja Quasselstrippen vor dem Herrn.
- Trifft es zu daß bei direkt verknüpften Komponenten events nur mit erheblicher zeitlicher Verzögerung an den XML-Server versandt werden.
Ich habe u.a. eine Fernbedienung mit einer schaltbaren Steckdose verknüpf. Nach dem Tastendruck auf der Fernbedienung wird die Steckdose mit wirklich akzeptabler Verzögerung geschalten. Der zugehörige event, bzw. die Statusänderung der Steckdose wird meinem Server aber nach frühestens(!) 4 sec. zugestellt - muß man damit leben oder kann man da irgend etwas "pimpen"?
- heute habe ich zum ersten Mal ein Update auf meine CCUs aufgespielt. Danach waren sämtliche Thermostate laut WebUI ausgeschaltet. Ist das ein normales Verhalten oder beschränkt sich dies auf das aktuelle Update?
- Ich versuche über eine OpenVPN-Verbindung und XML-RPC zwei Standorte zusammenzuführen. Ergebnis: keine Chance! Mein Server erhält genau gar keine Daten von der entfernten CCU. Hat schon mal jemand erfolgreich einen XML-Server über OpenVPN an eine CCU angebunden?
Sofern ja, könnte ich eventuell eine kleine Schützenhilfe für dieses Problem bekommen?

Grüße an Alle
Jürgen

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: XMLRPC mit Java

Beitrag von Familienvater » 08.02.2020, 00:05

Hi,

man kann da sicherlich beim PSM noch das Timing in der Konfiguration optimieren, wenn Du aber etwas per Direktverknüpfung schaltest, dann kann diese Information über die Schaltung in der Zentrale (und damit als XMLRPC-Event) ankommen, muss sie aber nicht, da nach meinem Kenntnisstand die Zustandsänderung eher ohne Quittungspflicht an die Zentrale gemeldet wird, was anderes ist es, wenn die Zentrale die Schaltung beauftragt.

Die HmIP-Geräte feuern halt "Datenpunkte" ohne Ende, na und?

Das der Zustand von Geräten nach einem Neustart eine ganze Weile falsch sein kann, ist "normal".

Theoretisch sollte auch XMLRPC über eine VPN-Verbindung funktionieren, wenn beide Seiten richtig konfiguriert sind, und die jeweils andere Seite sauber durchgeroutet werden kann, denn Der "Server" in Netzwerk A teilt ja der Zentrale in Netzwerk B mit, das er gerne Events an seine IP-Adresse in Netzwerk A gemeldet bekommen möchte. Und wenn das nur ein "NAT-VPN" ist, dann geht das wegen dem NAT nicht.

Der Familienvater

ReneR
Beiträge: 1
Registriert: 04.09.2020, 20:49
System: Alternative CCU (auf Basis OCCU)

Re: XMLRPC mit Java

Beitrag von ReneR » 05.09.2020, 16:59

Hallo,

Auch wenn der Thread hier schon was älter ist, habe ich hier die Lösung für dein Problem.

Die MyHandlerMapping Klasse ist für Homematic IP Geräte. Weil der Port 2010 im Gegensatz zum Port 2001 „System.* “ nicht mit sendet sondern nur die dazugehörige Klasse. Ich wäre fast dran verzweifelt.

Bei mir zu Hause habe ich es auf einem Raspberry Pi schon einige Monate störungsfrei laufen.

Den init Befehl kannst du ruhig öfter senden. Ich sende ihn wenn die zentrale 10 Minuten keinen neuen Status sendet.

Code: Alles auswählen

public class HomematicServer {

    WebServer webServer;

    //XML-RPC server
    public HomematicServer(int port){
        webServer = new WebServer(port);

        XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();

        PropertyHandlerMapping phm = new MyHandlerMapping();

        try {
            //add handler class
            phm.addHandler("methods", Handler.class);
            phm.addHandler("system", Handler.class);

            xmlRpcServer.setHandlerMapping(phm);

            //server config
            XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
            serverConfig.setEnabledForExtensions(true);
            serverConfig.setContentLengthOptional(false);
        } catch (XmlRpcException e) {
            e.printStackTrace();
        }
    }

    //start listening
    public void start(){
        if (webServer != null){
            try {
                webServer.start();
                System.out.println("Server is ready");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
    MyHandlerMapping is for the Homematic IP client. The port 2010 don't send the handler class!
     */
    private class MyHandlerMapping extends PropertyHandlerMapping {

        public XmlRpcHandler getHandler(String pHandlerName) throws XmlRpcException {

            //System.out.println("somebody asked for a handler for " + pHandlerName);

            XmlRpcHandler result = null;

            try {
                result = super.getHandler(pHandlerName);
            } catch (Exception ex) {
                //ignore
            }

            if (result == null) {
                result = super.getHandler("system." + pHandlerName);
            }

            if (result == null) {
                System.out.println("no handler found: " + pHandlerName);
            }

            return result;
        }
    }
}
Hier ist der dazugehörige github Link mit Beispiel: https://github.com/Bug405/Homematic-XML-RPC

Wenn du nicht weißt wie welche Gerät gesteuert wird sind hier noch zwei Dokumente mit den lassen befehlen.
https://www.eq3.de/Downloads/eq3/downlo ... tation.pdf
https://www.eq-3.de/Downloads/eq3/downl ... punkte.pdf

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“