Homematic Gerät Status abfragen...

Hallo,
Mit welchem Befehl könnte ich ein Homematic-Gerät abfragen. Wenn ich überprüfen will ob der „STATE“ Wert einer Instanz auch tatsächlich stimmt? Ich meins echt ernst. Ich weiß es nicht. Wenn ich den Drehgriffkontakt „drehe“, wird der STATE Wert aktualisiert. Aber wenn IPS mal kurz ausfällt, stimmt der Status nach dem IPS wieder online ist, möglicher weise nicht mehr. Also würde ich gern zyklisch oder hi und da manuell, die Statis „forced“ aktualisieren.

Mit „HM_WriteValueBoolean“ könnte man einen Switch schalten, nicht wahr? Aber ich finde keinen „HM_Read…“ Befehl!
Ich dachte HomeMatic ist Bidirectional :cool:

Also gut, wenn ich länger keine Antwort erhalte, dann weiß ich daß die Lösung schon wo zu finden ist :slight_smile: und ihr seid es satt alles 100 mal zu schreiben. verständis zeig. Also begab ich mich auf eine weitere Intensivsuche. Das Ergebnis war aber leider ernüchternd…

Stimmt es so formuliert?: HomeMatic ist nur in Verbindung mit einer CCU wirklich Bidirektional. Denn für diese habe ich einige Scripte von ausgefuchsten IPS’lern gefunden, wie die CCU abfragbar wird.

Stimmt es also auch, daß ich KEIN HM Device direkt abfragen kann? Also ohne CCU!

Hinti,

A couple of months a go I found the following script on the forum. I think it was from Nancilla, but i can’t find it back. The script works in IPS 2.2 version , I haven’t tried it for the 2.3 version.

/*
************************************************** *****************************************
Interpreting the presence of HM-bodies - creating, deleting, renaming the variables
************************************************** *****************************************
File: HM-CCU query the reachability
Trigger: cyclic
Interval: every hour
*/

$ccu = HM_GetHost(55393 /*[HomeMatic Socket]*/);     // IP der Homematic-CCU über Clientsocket-ID abfragen
$function = 2;                                     // Funktion 2 = Abfrage der Erreichbarkeit
echo $ccu;
$suname = "COMMUNICATION";                       // Variablenname für STICKY-UNREACH
$sualtname = "HM-COMMUNICATION";                 // Alternativer Variablenname für STICKY-UNREACH (beim UMBENENNEN)

$create = 0;                                       // ERSTELLEN [Variable 1=Anlegen(Beibehalten) / 0=Löschen]
$rename = 0;                                       // UMBENENNEN [1=JA / 0=NEIN]


if (!$create)  $rename = 0;                        // Wenn Löschen, dann nicht gleichzeitig Umbenennen


// *******************************CCU abfragen - BEGINN**********************************
function GetDeviceStatus($ccu, $function, $devices, &$status)
{
$singleresult = false;

    // Check if $devices is an array or not
    if (is_string($devices))
    {
       $singleresult = true;
        $devicelist = array($devices);
    }
    else
    {
       $devicelist = $devices;
    }

    // Prepare array for status values
    $status = array_flip($devicelist);

    // Build request for CCU
    $request = "";
    foreach($devicelist as $serial)
    {
       if ($function == 1)
       {
            $request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.LOWBAT').Value();
";
        }
        else
        {
            $request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.STICKY_UNREACH').State();
";
        }
    }

    // Open socket for CCU-connection
    $fp = fsockopen ($ccu, 8181, $errno, $errstr, 2);
    if (!$fp)
    {
        $status = $errno . "|" . $errstr;
        return false;
    }

    // Sending request to CCU
    stream_set_blocking($fp, 1); // sicher gehen, dass der stream im non blocking Mode arbeitet
    $st = "POST /tclrega.exe HTTP/1.1
Content-type: application/x-www-form-urlencoded
" .
            "Content-Length: " . strlen($request) . "
Connection: Close

";
    fputs($fp, $st . $request);

    // Receiving result from CCU
    $t = "";
    $start = false;
    while (!feof($fp))
    {
        $st = fgets($fp);
        if ($start) $t .= $st;
        if ($st == "
") $start = true;
    }
    fclose($fp);

    // Convert result to XML
    $xml = new SimpleXMLElement($t);

    // Walk through each key and copy status infos to result-array
   foreach($xml as $key => $value)
    {
       if (array_key_exists($key, $status)) $status[$key] = (strtolower((string)$value) == "true");
    }
    if ($singleresult) $status = $status[$devices];
   return true;
}
// *******************************CCU abfragen - ENDE**********************************



$alleInstanzen = IPS_GetInstanceListByModuleType(3);                     // alle I/O Instanzen suchen

// Array ausgeben
foreach($alleInstanzen AS $id)
   {
   $instanz = IPS_GetInstance($id);
    $instanz = $instanz['ModuleInfo'];
    $instanz = $instanz['ModuleName'];
        if ($instanz == "HomeMatic Device")                            // Vergleich ob das Array den Instanz-Name ausgibt
        {
            if ($create)
            {
            $adresse = HM_GetAddress($id);                                    // HM-Seriennummer ermitteln
            $devices = substr($adresse,0,10);                                     // HM-Seriennummer ohne Sub-Adresse(:xx)
                if ( (@!IPS_GetVariableIDByName($suname, $id) ) > 0)     // Überprüfen ob Variable schon existiert, Ergebnis = NEIN
                {
                $newid = IPS_CreateVariable(0);                                // Variable anlegen
                IPS_SetVariableCustomProfile ($newid, $suname); // Variablenprofil einstellen
                IPS_SetName($newid, $suname);                           // Name für Variable schreiben
                IPS_SetParent($newid, $id);                              // Unter Parent-ID verschieben
                GetDeviceStatus($ccu, $function, $devices, &$status);    // Funktion - Abfrage der CCU
                SetValueBoolean($newid, $status);                        // Wert in Variable schreiben
                }
                else
                {
                $newid = IPS_GetVariableIDByName($suname, $id);         // Überprüfen ob Variable schon existiert, Ergebnis = JA
                    if ($rename)
                    {
                   IPS_SetName($newid, $sualtname);                         // Name für Variable neu schreiben
                   }
                   else
                    {
                    GetDeviceStatus($ccu, $function, $devices, &$status);    // Funktion - Abfrage der CCU
                    SetValueBoolean($newid, $status);                        // Wert in Variable schreiben
                    }
                }
            }
            else
            {
            $newid = IPS_GetVariableIDByName($suname, $id);         // Überprüfen ob Variable existiert, Ergebnis = JA
            IPS_DeleteVariable($newid);                              // Variablen ($lbname) löschen
            }
         echo "ID: $id    S-NR: $adresse   Erreichbarkeit(1=gestört): $status"."
";                     // Instanzen kontrollieren
         echo "$devices ID:$id  $varloc"."
";
        }
    }

It also checks the status of every connected HM device and it generates all the variables.

Hope you can work something out with this :). Have fun :loveips:

Regards,
Robert
I can read and speak it but can’t write it…

Hi!

Folgender Fehler tritt mehrfach in dem CCU Log auf wenn dieses Script ausgeführt wird.

local0.err ReGaHss: Error: IseESP::ExecError= Execution failed: …

Weiß einer ob man das abstellen kann?

HM_RequestStatus: IP-Symcon :: Automatisierungssoftware

sollte sein, was Du suchst.

Guckst du hier

Danke!

Das Script ist nützlich für mich,

aber in deinem Script wird nicht die Erreichbarkeit der Komponenten abgefragt sondern die Variablen.

Ich möchte regelmäßig prüfen ob eine Kommunikationsstörung vorliegt.

Moin,

richtig, mein Skript aktualisiert alle HomematicVariablen in IPS (Hintis Problem war ja der Variablenstatus nach IPS Offline Zeit).

Deine Frage ist eine ganz andere, aber auch hier ein Hinweis - wenn du den Kommunikationsstatus der Geräte prüfen willst: Dazu gibt es je Gerät im Kanal 0 der Homematic-Geräte die beiden Variablen STICKY_UNREACH und UNREACH. Wenn die auf TRUE stehen, war (STICKY_UNREACH) oder ist (UNREACH) die Gerätekommunikation gestört. Per Skript könntest du alle Variablen durchlaufen und so den Status prüfen.

UNREACH.PNG

Hallo Tobias,
ich bin auch noch Anfänger mit IPS und Homematic. Wie hast du denn die „Status“ Variablen in IPS bekommen? Hast du für die HM-Geräte zwei Instanzen, einmal mit ADRESSE:1 und einmal mit ADRESSE:0 angelegt?
Oder gehts das nur wenn man eine CCU hat? Ich habe „nur“ den LAN Adapter.

Nein, geht auch mit dem LAN-Adapter wenn ich mich recht erinnere.

Per Homematic-Konfigurator bekommst Du aber nur die Instanzen ab :1 in IPS rein. Möchtest Du die :0 Instanzen haben mußt Du diese mit der HM-Geräte-ID:0 selbst anlegen.

Hallo Marco,

Werner hat es ja schon beantwortet, mit ADRESSE:0 bekommst du die Statusvariablen. Einfach eine Instanz mit Adresse:0 anlegen, die Variablen legen sich dann selbst an (zumindest bei der CCU).

Geht auch mit LAN-Adapter, kein Problem

Gruß
Bruno

Hallo,

bei mir erscheinen keine Statusvariablen, auch nicht nach 24h :frowning:
Ist meine Vorgehensweise vll. falsch?

[ol]
[li]Wandthermostat an Homematic anlernen (Homematic Konfigurator des LAN Adapters / Bidocs Service)
[/li][li]Instanz in IPS hinzufügen (Adresse suchen, gefunden wird eine Adresse mit :1)
[/li][li]weitere Instanz in IPS hinzufügen Adresse von vorheriger kopieren und statt :1 :0 verwenden.
[/li][/ol]

Hallo Marco,

Vorgehensweise stimmt so, die Status-Variable müsste aber schon unter :1 kommen. Da ich kein Wandthermostat habe, kann ich nur von anderen Geräten berichten.

Es gibt in IPS auch einen Konfigurator für Homematic. Benutzt Du den oder gehst Du über die Suche?

Gruß
Bruno

Der Konfigurator geht in seiner Version nicht. @ Marco, vielleicht solltet Du IPS mal auf den neusten Stand bringen!

Hallo,

soweit ich weiss sind die Status Variable für Low Battery oder Kommunikationsfehler doch auf dem Kanal :0 - oder?

Habe nun ein LiveUpdate auf „Version 2.30 # 1799 vom 07.11.2010“ gemacht. Unter den Instanzen des Wandthermostats Kanal0 und des Stellmotors Kanal 0 sind allerdings immernoch keine Variablen zu sehen :frowning:

UPDATE

Habe nun die Instanzen für Kanal 0 gelöscht und nach ca. 5min neu hinzugefügt. Nun sind pro 0-Kanal 4 Variablen sichtbar. :loveips:

Wenn ich mich nicht irre, werden die Variablen doch auch erst seit einer der letzte IPS Versionen automatisch beim Anlegen der Homematic Instanz angelegt. Vorher kamen die Variablen immer erst wenn ihr Wert vom Homematic Gerät das erste mal geändert wurden. Insofern war IPS Update sicher der richtige Weg!

Hallo,

vielleicht können Sie mir helfen.

Ich habe schon diverse Artikel zur Nutzung des Befehls HM_RequestStatus gelesen, welche aber mein Problem nicht lösen.
Ich habe ein Netbook mit installiertem IPS und Bidcos-Service, dazu einen LAN-Adapter.
Da ich das Netbook (WIN 7 Home Premium), als Alarmanlage einsetze und diese aktuell nur Nachts läuft, möchte ich nach dem Neustart des Netbooks den aktuellen Status meiner Homematic-Sensoren auslesen:

  • ein nicht eingesteckter Zwischenstecker (Funk, Netzbetrieben) wird korrekt als nicht vorhanden enttarnt (Abfrage ist hier korrekt „false“, weil diese nicht korrekt durchgeführt werden kann)
  • die Funk- Tür/Fensterkontakte werden dagegen nicht direkt abgefragt, weil sie batteriebetrieben sind (ist mir klar).

In der Doku steht, siehe unter „http://www.ip-symcon.de/service/dokumentation/modulreferenz/homematic/hm-requeststatus/“:
…„Bei Batteriebetriebenen Geräte wird nur der gespeicherte Status in der CCU/LAN-Adapter abgefragt. Netzbetriebene Geräte werden per Funk direkt abgefragt.“

Mir würde es vollkommen ausreichen, wenn der zuletzt im LAN-Adapter abgelegte Wert (STATE-Variable) in die IP-Symcon Konsole übernommen werden würde, leider wird nur das Aktualisierungsdatum auf den Aufrufzeitpunkt vom HM_RequestStatus-Befehl gesetzt.
Das Ergebnis der Abfrage ist true (Abfrage erfolgreich), obwohl der letzte Status nicht aus dem LAN-Adapter übernommen worden ist.
Ein zwischenzeitlich geöffnetes/geschlossenes Fenster bleibt daher unerkannt, obwohl der Tür-/Fensterkontakt den Befehl an den LAN-Adapter gesendet hat.

Ich setze IP-Symcon 2.5 ein,
ansonsten keine Probleme bei Funkkontakt zum LAN-Adapter aufgetreten,
alle Komponenten sind nicht älter als ~ 1/2 Jahr, inklusive der Software.
Beispielskripte zur Nutzung von HM_RequestStatus bringen keine Symptom-Besserung,

Was kann ich tun, damit ich meine Umgebung entsprechend der Dokumentation zum Laufen bringen kann?

Vielen Dank für Ihre Unterstützung.

Mit freundlichen Grüßen
:rolleyes:

Da ich das Netbook (WIN 7 Home Premium), als Alarmanlage einsetze und diese aktuell nur Nachts läuft, möchte ich nach dem Neustart des Netbooks den aktuellen Status meiner Homematic-Sensoren auslesen:
Ohne laufenden Bidcos-Service, geht hier gar nichts.

Wenn das System komplett läuft, werden auch die Stati nach Betätigung übertragen. Sollte dieses nicht der Fall sein, stimmt die Firewall Einstellung nicht. Rückkanal in der Regel Port 5544.

Wie Rainer schon schrieb…
Woher soll IPS die aktuellen Zustände holen, wenn der Bidcos-Service nicht läuft.
Der LAN-Adapter speichert nichts… er dient nur als Schnittstelle.
Für dein Vorhaben brauchst du eine CCU.

Dann würde folgendes Script reichen, um die aktuellen Zustände nach Start von IPS in die Variablen zu schreiben:

<?
foreach(IPS_GetInstanceListByModuleType(3) as $id)
   {
   $instanz = IPS_GetInstance($id);
   $instanz = $instanz['ModuleInfo'];
	$instanz = $instanz['ModuleName'];
		if ($instanz == "HomeMatic Device")
		{
 		@HM_RequestStatus($id, "STATE");
 		}
	}
?>