XML-RPC-Schnittstelle Servicemeldungen

Mal ne Frage kann man ewentuell über XML-RPC-Schnittstelle
die Servicemeldungen der CCU abfragen
bzw.Quittieren
Es gibt eine Funktion 4.3.24 (getServiceMessages)

Ist diese Funktion über IPS ansprechbar ???

schmiddi

Hallo hat keiner eine Idee
Mir wäre eigentlich schon geholfen wenn jemand ein Beispiel hätte
wie man diese Schnittstelle anspricht.

Dann könnte ich das selber mal testen

Wenn ich mir in IPS den HomeMatic Socket im Debug Fenster anschaue
sieht es aus als würde das gleich laufen.

Ich würde mir gerne die Servicemeldungen der CCU auslesen und in IPS Anzeigen damit ich nicht immer die WebUI der CCU öffnen muss wegen nichts.

Danke
schmiddi

Hallo,
ich habe dir mal ein Beispielscript geschrieben.
Dies funktioniert mit dem Lan Adapter.
Für die CCU musst du einen anderen Port eintragen.

Dieses Programm liest die Servicemeldungen und
legt bei vorhandener Meldung unter der Instanz
eine Variable ‚message‘ mit dem übermittelten Text an.

Das benötigte Include steckt im Anhang.

mfg.
Jürgen


<?
include "xmlrpc.inc.php" ;

function HM_GetIdFromAdress($geraet)
{
    $result = -1;
    $instname = "HomeMatic Device";
    $alleInstanzen = IPS_GetInstanceListByModuleType(3); // nur I/O Instanzen auflisten
    // Array ausgeben
    foreach($alleInstanzen AS $id)
    {
          $instanz = IPS_GetInstance($id);
            $instanz = $instanz['ModuleInfo'];
            $instanz = $instanz['ModuleName'];
          if ($instanz == $instname)                                  // Vergleich ob das Array den Instanz-Name ausgibt
          {
             $adresse = HM_GetAddress($id);                                    // HM-Seriennummer ermitteln
             if ($adresse == $geraet)
                {
                    $result = $id;
                }
          }
    }
    return $result;
}
 function CreateVariableByName($id, $name, $type, $profile = "")
 {
     global $IPS_SELF;
     $vid = @IPS_GetVariableIDByName($name, $id);
     if($vid === false)
     {
         $vid = IPS_CreateVariable($type);
         IPS_SetParent($vid, $id);
         IPS_SetName($vid, $name);
         IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
         if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
     }
     return $vid;
 }



$c=new xmlrpc_client("http://192.168.100.30:2001", "", "");
$f=new xmlrpcmsg('getServiceMessages');
$r=$c->send($f);
$messages = php_xmlrpc_decode($r->value());
print_r($messages);
$geraet = $messages[0][0];
$status = $messages[0][1];
foreach($messages AS $msg)
{
   $geraet = $msg[0];
   $status = $msg[1];
   $errNr = $msg[2];
   $moduleId = HM_GetIdFromAdress($geraet);
   print "$geraet 
";
    print "$status 
";
    print "$errNr 
";
    print "$moduleId 
";
    
    $id = CreateVariableByName($moduleId, "message", 3, "~String");
    SetValue($id,$status);

}

?>


xmlrpc.inc.zip (30.5 KB)

Hallo,

klink mich mal ein.
Ich hab Dein Script mal getestet. Bei mir kommt eine Fehlermeldung:

Fatal error:  Call to a member function kindOf() on a non-object in C:\IP-Symcon2\scripts\xmlrpc.inc.php on line 3289

Btw.: Der CCU Port ist 2002, oder?

Ich versuche mal auf Fehlersuche zu gehen.

Edit: Wie es aussieht mag die CCU den Befehl „getServiceMessages“ nicht.

[errstr] => getServiceMessages: unknown method name

cu…

So, bin nun etwas weiter.
Mit dem Port 2001 scheint es zu funktionieren.
Ich bekomme etwas in die message Variable.
Zur Zeit stehen tatsächlich noch Konfigurationsdaten in der CCU an.
Daher macht der Eintrag „CONFIG_PENDING“ Sinn.
Kann ich irgendwoher noch mehr Infos bekommen? Ich muss mal testen, was bei mehreren Meldungen passiert.
Kann man die auch quittieren?

cu…

Super sache dachte schon es interessiert niemanden

Werde es heute Abend mal Testen

Danke
schmiddi

Noch ein Schritt weiter.
Ich hab mal wieder bemerkt wie eingerostet meine HM Kenntnisse sind.
Dein Script bindet die Meldung an das betroffene Gerät. Nur haben die meisten Geräte nicht die „richtige“ Adresse.
Wenn ein Sensor z.b. „EQ0000001:1“ als Adresse hat, werden die Nachrichten aber für „EQ0000001:0“ gesendet.
Ich hab das jetzt so gelöst, dass ich unter die HM-Instanzen eine weitere mit dem Namen „intern“ und der „Unteradresse“ :0 angelegt hab.
Interresanterweise legt IPS dann direkt auch die Meldungen als Variable an.
So dass man das Script eigentlich nur noch zum Triggern bräuchte. :rolleyes:
In meinem Beispiel wurde eine Bool-Variable „CONFIG_PENDING“ mit dem Wert TRUE angelegt.

cu…

Bin noch neu und ich kam erst auf die Variable, als ich durch einen Fehler plötzlich bei einem Drehgriff die Bool-Variable UNREACH eingetragen bekam.
Nun gesellte sich noch CONFIG_PENDING und STICKY_UNREACH dazu.

Gibt es hier eine Lösung? Ja :wink:

Hallo,

ich habe mir erlaubt das obige Script ein wenig umzuschreiben.
Was mich störte war, das Meldungen die in der CCU bereits gelöscht waren, in IPS noch anstanden. Daher ist das Script so umgeschrieben, das es jetzt zu jedem HM-Device eine Variable anlegt. Duch eine zeitliches zyklisches Ereignis werden diese dann aktualisiert.
Das zyklische Ereignis alle x Minuten muß Ihr noch per Hand anlegen.

  • Es muß keine zus. HM-Instanz mit xxx:0 angelegt werden
  • Meldungen die nicht mehr vorhanden sind, werden auch gelöscht.
  • Alle HM-Instanzen bekommen eine Variable SERVICE_MESSAGE
  • Variable wird versteckt angelegt. Wer das nicht möchte, Zeile 63 ändern
<?
// Ursprüngliches Script von belmondo2001
// Modifiziert durch MCS-51
// Version 1.0 vom 25.09.2010
// Das Script ordnet allen HM-Instanzen eine Variable SERVICE_MESSAGE zu.
// Bei Meldungen der CCU zu einer HM-Instanz wird diese in SERVICE_MESSAGE geschrieben bzw. bei keiner Meldung gelöscht.

include "xmlrpc.inc.php" ;

$c=new xmlrpc_client("http://192.168.1.10:2001", "", "");
$f=new xmlrpcmsg('getServiceMessages');
$r=$c->send($f);
$messages = php_xmlrpc_decode($r->value());
// print_r($messages);
print "
";

$alleInstanzen = IPS_GetInstanceListByModuleType(3); // nur I/O Instanzen auflisten
//print_r($alleInstanzen);
foreach($alleInstanzen AS $id)
{
    $instanz = IPS_GetInstance($id);                                           // Beschreibung Instanz Filtern
    $instanz = $instanz['ModuleInfo'];
    $instanz = $instanz['ModuleName'];

    if ($instanz == "HomeMatic Device")                                          // Prüfen obe es sich um ein Homematic Device handelt
    {
        $adresse = HM_GetAddress($id);                                            // HM-Seriennummer ermitteln
//        print "ID: $id - $adresse ";
        $mid = CreateVariableByName($id, "SERVICE_MESSAGE", 3, "~String");      // Variablen ID suchen ggf. Variable anlegen.
        SetValue($mid,"");                                                      // Variableninhalt löschen.

        foreach($messages AS $msg)                                              // Prüfen ob Instanz in der ServiceArray vorhanden ist.
        {
            $geraet =  str_replace(":0",":1",$msg[0]);                           // Service Meldungen haben alle die GeräteNr. xxx:0 welche in IPS nicht genutzt wird. Daher :0 dem :1 Gerät zuordnen
            if ($adresse == $geraet)                                             // Aktuelle Instanz und Service Instanz ist identisch
            {
                $status = $msg[1];                                                // Beschreibung filtern
                $errNr = $msg[2];                                                 // ErrorCode filtern
                print "$id - $adresse ";
                print "ErrorCode:$errNr   $status  ".IPS_GetName($id)."
";
                $old_message = GetValue($mid);                                    // aktuelle Message lesen falls mehere Service Meldungen für ein Gerät vorliegen
                SetValue($mid,$old_message."
".$status);                         // Service Meldung des Gerätes speichern
            }
        }
//        print "
";
    }
}





function CreateVariableByName($id, $name, $type, $profile = "")
 {
     global $IPS_SELF;
     $vid = @IPS_GetVariableIDByName($name, $id);
     if($vid === false)
     {
         $vid = IPS_CreateVariable($type);
         IPS_SetParent($vid, $id);
         IPS_SetName($vid, $name);
         IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            IPS_SetHidden($vid, True);                                                    // Variable verstecken
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
     }
     return $vid;
 }

?>

Ich hoffe euch gefällts. :smiley:

Gruß
MCS-51

Hallo,

habe erstmals mit dem HM-Konfigurator im IPS herumgespielt. Dabei sind mir auch „Geräte“ aufgefallen wie MAINTENANCE einer Tasterschnittstelle. Diese kann ich als Instanz erstellen lassen und bekomme dann u.a. eine Variable namens CONFIG_PENDING. Der Wert steht auf TRUE. In der CCU gibt es eine Servicemeldung, die auf die noch anstehende Übertragung von Konfigdaten verweist. Leider kann ich diese nicht bestätigen (Button ist ausgegraut). Auch das Setzen im IPS auf FALSE löscht die Meldung nicht. Wie bekomme ich diese Meldung weg bzw. die Konfigdaten übertragen (dann ist die Meldung ja weg;)) , ohne die Taster aus der Wand zu bauen und den Anmeldeknopf zu drücken?

Wenn du keine Configdaten übertragen willst, hilft das durchstarten des Bidcos-Service-Dienstes.

Dannach sind alle Servicemeldungen weg.

Hi,

ich würde schon gern die Konfigdaten zwangsübertragen wollen. Geht das ohne „Anmeldeknopfdrücken“? BidCOS kann ich doch nur bei LAN-Adapter starten - nicht bei der CCU, oder?

Geht das ohne „Anmeldeknopfdrücken“? --> leider nein

und an was liegt das, dass die daten nicht übertragen werden ?
Ich habe auch einen Bewegungsmelder, der zwar brav die Bewegungen meldet, aber einfach keine Config-Daten empfangen will…

Anmeldeknopf gedrückt ?

klar - der Melder ist im IPS integriert

So einen Drehgriff habe ich auch.

Letztendlich wenn Ablernen, Werksreset, usw. nicht hilft, dann zurücksenden, weil Defekt.

Kann mir jemand erklären, was anstehende Konfig-Daten mit der IPS-Integration zu tun haben :confused:

Wenn die Grundbegriffe der Bedienung fehlen, wird auch der nächste Bew.melder nicht funktionieren.

Gruß
Bruno

Hatte das Script am laufen, nun seit 2.5 will es nicht mehr, kann mir da jemand weiterhelfen? ich bin im Scripting noch nicht so bewandert :o

Fehlermeldung:

Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\29174.ips.php on line 32

Danke!