XML-RPC Interface-Beschreibung

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

Moderator: Co-Administratoren


HM_Dev
Beiträge: 5
Registriert: 11.06.2013, 12:29

Re: XML-RPC Interface-Beschreibung

Beitrag von HM_Dev » 09.08.2013, 16:22

Hallo,

hoffentlich passt das hier zu, aber ich wollte nicht schon wieder ein Thema eröffnen, nur weil die Studenten mal wieder zu blöd sind. :D Wir sind mit unserem Studienprojekt in den letzten Zügen, stolpern allerdings über eine kleine Hürde. Erstmal zum Projekt: Ziel ist es, mehrere Smart Home Varianten über eine gemeinsame Middleware zu vereinen. Dank hmcompanion sind wir in Homematic relativ gut reingekommen und können bereits eine Wetterstation und eine Steckdose ansprechen (mehr ist auch nicht geplant ;) ).

Das einzige, was nun noch fehlt, ist eine Methode, die prüft, ob die Geräte überhaupt "online" bzw ansprechbar sind. Bei der Steckdose ging dies einfach. Wir haben über die Variable STATE angefragt und wenn wir "faultCode" zurück bekommen, schmeißt unsere Methode isOnline false zurück. Die Wetterstation hat nicht so etwas wie ein State, sondern nur die Wettervariablen.
Leider speichert die CCU die Daten der letzten Aktualisierung, sprich wir bekommen selbst wenn die WS nicht an ist zB für die Variable TEMPERATURE einen Wert zurück.
Wir haben in der WebUI gesehen, dass dort die letzte Aktualisierung gelistet wird. Nun kam die Idee zu prüfen, ob die letzte Aktualisierung länger als 4 min her war, aber wie kommen wir an diesen Wert? Oder gibt es da eine andere Lösung?

Ich hoffe, es kann uns jemand weiter helfen. :)
Zuletzt geändert von HM_Dev am 09.08.2013, 19:46, insgesamt 2-mal geändert.

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: XML-RPC Interface-Beschreibung

Beitrag von Monty1979 » 09.08.2013, 17:56

Hallo HM_Dev,

ob ein Gerät erreichbar ist oder nicht fragt man eigentlich mit STICKY_UNREACH "Gerätekommunikation war gestört" und UNREACH "Gerätekommunikation ist gestört" ab.
Ob die beiden Kanäle bei der Wetterstation vorhanden sind kann ich dir nicht sagen da ich keine habe.

Gruß Monty

HM_Dev
Beiträge: 5
Registriert: 11.06.2013, 12:29

Re: XML-RPC Interface-Beschreibung

Beitrag von HM_Dev » 10.08.2013, 14:46

Hallo Monty,

danke, für deine schnelle Antwort. Ich habe zwar die beiden von dir angesprochenen Variablen gefunden und bei der Steckdose funktioniert das auch so, wie ich das haben will (hatte es vorher anders gelöst, aber mit UNREACH ist es viel schöner), aber die Wetterstation macht Probleme. Bei der Steckdose kann ich den STATE abfragen und dann die UNREACH Variable prüfen und sofort wird erkannt, dass die Steckdose nicht mehr da ist, aber bei der WS funktioniert es nicht. Die WS reagiert zwar darauf auch ohne dass ich einen Wert abfrage, allerdings erst 10 min nachdem ich sie ausgesteckt habe. Frage ich einen Wert ab, dauert es in etwa auch so lange.

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: XML-RPC Interface-Beschreibung

Beitrag von Monty1979 » 11.08.2013, 09:52

Hallo HM_Dev,

ich vermute mal die Wetterstation wird, wie auch einige andere Sensoren, nur ca. alle 10 Min. ihre aktuellen Daten an die CCU senden.
Um diese schneller abfragen zu können müsstest du VALUE (gecachter Werte der CCU) statt STATE verwenden können. Allerdings löst das immer noch nicht dein UNREACH Problem.

Oder mach das doch einfach andersrum, nicht die Werte holen, sondern last sie dir per init() schicken. Somit hast du immer die aktuellen Werte und kommt von der Wetterstation nach x Zeit keine Daten dann ist sie wahrscheinlich nicht mit der CCU verbunden.

ayngush
Beiträge: 345
Registriert: 02.02.2012, 12:05
Danksagung erhalten: 7 Mal

Re: XML-RPC Interface-Beschreibung

Beitrag von ayngush » 11.08.2013, 12:16

Hallo,

die Wetterstation, wie alle Batteriebetriebenen Aktoren, lassen sich nicht Aktiv von der CCU aus abfragen. Sie "pushen" Ihre(n) Wert(e) in einem pro Sensor unterschiedlich definierten Zeitfenster (mindestens einmal alle 24 Stunden) oder beim Auslösen einer für den Sensor typischen Aktion (Fenster Offen, Kontaktbrücke geschlossen etc.).

Die CCU arbeitet bei diesen Sensoren immer nur mit den zwischengespeicherten Werten, die man mit der Methode VALUE() bekommt. STATE() funktioniert bei diesen Sensoren eigentlich nicht (ich habe keine Wetterstation, kann sein, dass die da eine Ausnahme bildet). Abzufragen, ob das Gerät zu einem definierten Zeitpunkt Online ist oder nicht kann man nicht. Man kann jedoch die UNREACH und STICKY UNREACH und die Batterie-Warnungen Abfangen, die in der Zentrale getriggert werden, sollte das Gerät von sich aus diese Stati setzen.

Nicht umsonst ist die Zentrale eine Zentrale und nicht einfach nur ein Protokolltranslator ;)

Hoffe geholfen zu haben.

Schöne Grüße

HM_Dev
Beiträge: 5
Registriert: 11.06.2013, 12:29

Re: XML-RPC Interface-Beschreibung

Beitrag von HM_Dev » 20.08.2013, 15:02

Wir kamen noch gar nicht dazu uns bei euch zu bedanken. Dankeschön. Projekt ist abgegeben und alles ist nun vorbei. :) Wir haben das jetzt einfach so gelassen. Dann wird halt erst nach 10 min erkannt, dass die Wetterstation nicht mehr da ist. Das soll im Regelfall ja eh nicht passieren. Und der Professor muss das ja nicht unbedingt wissen. 8)

Thisoft
Beiträge: 71
Registriert: 26.10.2013, 00:51
Wohnort: Erzgebirge

Re: XML-RPC Interface-Beschreibung

Beitrag von Thisoft » 16.11.2013, 20:39

Hallo,

ich hoffe Ihr alle die Ihr schon XML-RPC-Connections unter VB.NET realisiert habt seid hier noch aktiv und könnt mir vielleicht helfen.

Ich möchte mit meinem VB-Programm über XML-RPC meinen Homematic-USB-Adapter bzw. den entsprechenden BidCos-Service ansprechen.
Mittlerweile bin ich auch schon Schrittchen für Schrittchen vorangekommen. Das Lesen und Setzen von Werten funktioniert soweit Alles. Nun möchte ich natürlich noch das "Init" zum Laufen bringen. Ich schicke dazu folgenden Request an den BidCos-Server:

Code: Alles auswählen

    <?xml version="1.0"?>
    <methodCall>
       <methodName>init</methodName>
       <params>
          <param><value><string>127.0.0.1:6770/D:/Thilo/Haustechnik/Homematic/TCPServer_1/bin/Debug/ERPService.exe"</string></value></param>
          <param><value><string>123456</string></value></param>
       </params>
    </methodCall>
Darauf hin erhält mein (selbst programmierter) TCP-Listener die folgende Anwort

Code: Alles auswählen

16.11.2013 03:34:43; Der Server wurde gestartet!
16.11.2013 03:35:04; POST /D:/Thilo/Haustechnik/Homematic/TCPServer_1/bin/Debug/ERPService.exe" HTTP/1.1 has joined.
16.11.2013 03:35:04; Gelesen: User-Agent: XMLRPC++ 0.7
16.11.2013 03:35:04; Gelesen: Host: 127.0.0.1:6770
16.11.2013 03:35:04; Gelesen: Content-Type: text/xml
16.11.2013 03:35:04; Gelesen: Content-length: 141
16.11.2013 03:35:04; Gelesen: 
16.11.2013 03:35:04; Gelesen: <?xml version="1.0"?>
16.11.2013 03:35:04; Gelesen: <methodCall><methodName>listDevices</methodName>
16.11.2013 03:35:04; Gelesen: <params><param><value>123456</value></param></params></methodCall>
Anschließend bleibt sowohl meine Prog welches den Request geschickt hat als auch der BidCos-Service hängen.

Nun soll man ja glaube ich, die Init-Rückmeldung des Servers mit einem leeren Request beantworten. Das hat aber keine Wirkung gezeigt.
Ich bin mir da im Moment aber auch ziemlich unsicher was ich denn da genau wohin schicken muß. Allerdings verwirrt mich auch, dass der Server auf die Init-Anfrage irgend was mit "listDevices" zurückgibt...?!?

Kann mir evtl. aml jemand von Euch mit etwas Beispielcode wie Ihr das gemacht habt auf die Sprünge helfen. Das wäre Super nett...

Danke schon mal
Thilo

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: XML-RPC Interface-Beschreibung

Beitrag von Monty1979 » 17.11.2013, 14:25

Hallo,

hier mal der Code aus Ultras(HomeDroid) und meinen Apps. Wir haben einige Stunden daran verbraten bis das auf der CCU1 und CCU2 richtig funktionierte. Eine falsche Antwort und die CCU stand :cry:

Code: Alles auswählen

		ServerSocket myServerSocket = new ServerSocket(port);
		XMLRPCServer server = new XMLRPCServer();

		while (true) {
			Socket mySocket = myServerSocket.accept();
			MethodCall call = server.readMethodCall(mySocket);
			String name = call.getMethodName().trim();

			if (name.equals("system.multicall")) {

				ArrayList<Object> params = call.getParams();
				Object[] children = (Object[]) params.get(0);

				for (int i = 0; i < children.length; i++) {
					@SuppressWarnings("rawtypes")
					Map m = (Map) children[i];
					
					String childName = (String) m.get("methodName");

					Object[] childParams = (Object[]) m.get("params");
					....

					}

				}
				server.respond(mySocket, children);

			} else if (name.equals("event")) {
				
				ArrayList<Object> params = call.getParams();
	
				String i0 = (String) params.get(0);
				String i1 = (String) params.get(1);
				server.respond(mySocket, new Object[] { i0 + i1});

			} else if (name.equals("system.listMethods")) {

				String i = "event";
				server.respond(mySocket, new Object[] { i });

			} else if (name.equals("listDevices") ) {
				
				server.respond(mySocket, new Object[] { "" });

			} else if ( name.equals("newDevices")) {
				
				server.respond(mySocket, new Object[] { "" });
				
			} else {

				server.respond(mySocket, null);
			}

		}

Thisoft
Beiträge: 71
Registriert: 26.10.2013, 00:51
Wohnort: Erzgebirge

Re: XML-RPC Interface-Beschreibung

Beitrag von Thisoft » 19.11.2013, 05:40

Hallo Monty,

vielen Dank erstmal. Dein Code ist Java - oder? Ich mach mich mal ans übersetzen... Welchen XMLRPC-Server hast Du verwendet?

Gruß
Thilo

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“