Homematic: vom Benutzer vergebenen Device Namen auslesen

Hallo,

ich überarbeite/erweitere gerade das HM-Inventory Skript.

Dabei stelle ich fest, das die Funktion zum Auslesen der auf der CCU vergebenen Gerätenamen bei mir nicht funktioniert. Das Skript versucht es über

        $xml_reqmsg = new xmlrpcmsg("getAllMetadata", array(new xmlrpcval($HM_Par_address, "string")) ); 
        $xml_rtnmsg = $xml_client->send($xml_reqmsg);

aber dabei kommt es immer zu einem Fehler (-1).

Hat jemand eine Idee, wie man an die Namen herankommt? Im HM Forum habe ich die Frage auch schon gestellt, aber noch keine Antwort bekommen :slight_smile:

Vielleicht hat von euch einer eine Idee?

Gruß

Burkhard

Soweit ich weiß, kommt man über die normale XML-RPC Schnittstelle nicht an den Namen. Das ist ja auch seit Jahren ein Problem, warum wir in unserem Konfigurator keine Namen anzeigen können :frowning: Sobald eq-3 dort eine offizielle API anbieten würde, würden wir dies sofort nachrüsten :frowning:

paresy

Das musste ich auch feststellen :slight_smile:

Aber im HM Forum konnte mir weitergeholfen werden. Über die Skriptschnittstelle geht es. Man bekommt die Namen über die folgenden Skriptzeilen auf HM Seite:

WriteLine((xmlrpc.GetObjectByHSSAddress(interfaces.Get("BidCos-RF"),"HEQ0137xxx:1")).Name());
WriteLine((xmlrpc.GetObjectByHSSAddress(interfaces.Get("BidCos-Wired"),"HEQ0165xxx:0")).Name());
WriteLine((xmlrpc.GetObjectByHSSAddress(interfaces.Get("HmIP-RF"),"0001D709904xxx:6")).Name());

Dokumentiert ist das aber wohl eher schlecht …

Hallo Burkhard,

es freut mich, dass du nun Erfolg hattest :slight_smile:

Das würde ich dort als Standard bezeichnen :smiley:

Gruß
Hans

Das ist HMScript.
Kannst du ganz komfortabel in IPS über mein HMExtended Modul nutzen.
Dort gibt es eine HMRemoteScript Instanz über welche du aus IPS HM-Script an die Zentrale senden und die Antwort in IPS verarbeiten kannst.
Michael

Genau, so geht’s ganz easy.:loveips:

@paresy:

Ich hole mir die Namen nun über die folgenden Funktionen:

   private function GetHMChannelName($HMAddress, $HMDeviceAddress)
    {
        $HMScript = 'Name = (xmlrpc.GetObjectByHSSAddress(interfaces.GetAt(0), "' . $HMDeviceAddress . '")).Name();' . PHP_EOL;
        $ret = json_decode($this->SendScript($HMAddress, $HMScript))->Name;
        return $ret;
    }

    private function SendScript($HMAddress, $Script)
    {
        $url = 'Script.exe';

        try {
            $HMScriptResult = $this->LoadHMScript($HMAddress, $url, $Script);
            $xml = @new SimpleXMLElement(utf8_encode($HMScriptResult), LIBXML_NOBLANKS + LIBXML_NONET);
        } catch (Exception $exc) {
            throw new Exception($exc->getMessage(), E_USER_NOTICE);
        }
        unset($xml->exec);
        unset($xml->sessionId);
        unset($xml->httpUserAgent);
        return json_encode($xml);
    }

    private function LoadHMScript($HMAddress, $url, $HMScript)
    {
        if ($HMAddress != '') {
            $header[] = 'Accept: text/plain,text/xml,application/xml,application/xhtml+xml,text/html';
            $header[] = 'Cache-Control: max-age=0';
            $header[] = 'Connection: close';
            $header[] = 'Accept-Charset: UTF-8';
            $header[] = 'Content-type: text/plain;charset="UTF-8"';
            $ch = curl_init('http://' . $HMAddress . ':8181/' . $url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_FAILONERROR, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $HMScript);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);
            curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
            $result = curl_exec($ch);
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            if ($http_code >= 400) {
                throw new Exception('CCU unreachable:' . $http_code, E_USER_NOTICE);
            }
            if ($result === false) {
                throw new Exception('CCU unreachable', E_USER_NOTICE);
            }
            return $result;
        } else {
            throw new Exception('CCU Address not set.', E_USER_NOTICE);
        }
    }

Im Grunde sind es nur wenige Zeilen. Wäre das nicht auch für den HM Konfigurator ein gangbarer Weg? Gerade bei Neueinsteigern sind die fehlenden Homematic Namen ein echtes Hindernis.

Auch Stefan von verdrahtet.info ist es in seinem Video gleich aufgefallen :rolleyes:

Gruß

Burkhard

Das ist aber Homematic Script, nicht XMLRPC :wink:

Ich hatte Mal überlegt das EasyInstall Script als Konfigurator in mein HMExtended Modul mit aufzunehmen.

Michael

Das schon, aber zumindest ist xmlrpc.GetObjectByHSSAddress(interfaces.GetAt(0)) irgendwo dokumentiert. Und ioBroker kann es auch :slight_smile:

Sicherlich eine gute Idee, aber Einsteiger beschäftigen sich zunächst damit, wie sie Ihre Geräte einbinden können und gerade am Anfang sollte es so leicht wie möglich sein. Zu Moduln kommt man erst später …

xmlrpc.GetObjectByHSSAddress() ist eine Funktion von HM Script und liefert dir ein Objekt in HM Script.
Das ist keine Funktion welche direkt im XMLRpc zur Verfügung steht, was IPS spricht.
Kannst du gerne in der API Doku von EQ3 nachschauen :wink:
Vermutlich fragt IOBroker einfach auch die Logikschicht per HM Script ab um die Namen zu bekommen.

Habe auch in einem anderen Video gesehen das CUxD mit IOBroker funktioniert.
Das wäre eine Bereicherung :slight_smile:
Allerdings spricht der wohl noch immer zu 99% nur binrpc.
Michael

Ich habe mich bisher noch nicht so wirklich in HM-Skript eingearbeitet. Da aber die HM-Skript Sache seit Ewigkeiten funktioniert und nicht absehbar ist, dass die XML-RPC Schnittstelle die Namen liefern wird bin ich langsam bereit diese „Krücke“ einzubauen… Für die Usability ist das mit den fehlenden Namen ja in der Tat eher ärgerlich.

Könnte jemand mir das HM Skript anpassen, sodass eine Array von allen HomeMatic IDs mit Namen/Gewerken bei rauskommt? Ich würde dann zusehen, dass die Info im HomeMatic Konfigurator verwendet wird.

paresy

HomematicEasyInstall/Script.php at 1a09cb5dcfae9cf64fc3a38a43e6e3aa07e992b1 · Nall-chan/HomematicEasyInstall · GitHub

Leider ist es aufgrund von Problemen mit der Zeichenkodierung oder auch dem (nicht erlaubten) vorhanden sein von Sonderzeichen eher komplex.
Es liefert aber ein XML mit allen ID_ROOMS (Räume), ID_FUNCTIONS (Gewerken) und ID_DEVICES (Geräten) sowie deren Kanälen.

Michael

Diese Funktion kommt endlich zu IP-Symcon 5.1

paresy

Super! Jeder Anfänger mit Homematic wird es zu schätzen wissen.

Vielen Dank.