Homematic Initialisierung beim Start

Hallo Leute,

ich habe das Problem das ich die Zustände der Homematic wired Schaltaktoren nach einem Start der IPS erst geliefert bekomme wenn diese einmal geschaltet worden sind. Gibt es eine Art „Sende mal alle Zustände“ Funktion ansonsten ist mein IPS nicht syncron mit der tatsächlichen Situation im Haus.

Macht sich schlecht wenn im System steht Tür ist zu aber in Wirklichkeit ist sie auf.

Danke für eure Hilfe

Gibt es nicht und ist kurzfristig auch nicht geplant.

Denn:
Das IP-Symcon darauf Ausgelegt ist, dass das System 24/7 läuft, gibt es diesen Fall auch nicht. Der einzige mir erklärliche Grund ist ein Absturz des Systems und das sollte im seltensten Fall vorkommen.

paresy

Es gibt ja immer mal wieder Situationen, wo man einen „Server“ neu starten muss, wie z.B. Windows-Updates, Treiberaktualisierungen etc.
Da wäre so eine Initialabfrage nicht schlecht. Andererseits gehts ja mit anderen Systemen auch nicht. Da ist IPS immer auf dem Stand vor dem Beenden.

Ich weiss nun nicht, ob so eine Abfrage generell bei der HM-CCU möglich wäre, aber wenn ja, dann wäre das ein deutliches Plus als Feature!

Die Aussage ist so nicht richtig. Bei LCN und mit Sicherheit auch bei anderen bidirektionalen Systemen kann man den Zustand abfragen.

Ich habe ein Startscript, um beim Neustart die aktuellen LCN-Daten automatisch abzufragen ;).

Ralf hat recht, auch bei XComfort von Moeller gibt es das. Ich habe ein Script welches nach Neustart von IPS den Status mittels MXC_RequestStatus(); abfragt.

Wenn Paresy sagt gibt es nicht dann ist das wohl verbindlich oder?

Vielleicht denkt trotzdem mal einer über das Feature nach. Ist wichtig für mich und bestimmt auch für alle anderen Homematic - Anwender.

Damke und schönes WE für alle.

Hi,

mit dem Script, das ich gerade hier eingestellt habe kannst Du alle aktuellen Statis auslesen.

Entweder aus der CCU (per Value) oder direkt vom Aktor (per State). Das ist aber sehr viel Arbeit. Ich bin mir nicht sicher ob das wirklich Sinn macht.

Wenn Du per IPS Deine HM-Komponenten steuerst, dann sollte der IPS-Rechner auch immer an sein. Wenn Dein Rechner nicht immer an ist, dann steuerst Du Deine Anlage wahrscheinlich über die CCU. Das mache ich auch so.

Da ich Abends den Rechner in Standby setze, stimmen bei meinem IPS die Statis auch nicht. Da die Steuerung aber ohnehin komplett über die CCU läuft habe ich auf der CCU auch gleich einen PHP-Server installiert. Damit kann ich dann auch bei „schlafender“ IPS alles steuern und die Statusmeldungen sind immer aktuell.

Ich wünsche einen schönen Tag.

Christoph.

Ja klar, ich dachte in diesem Moment nur gerade an meine FS20-Komponenten :rolleyes:

Hallo Christoph und alle Anderen,

erst einmal Danke für die Hilfe ,

Gilt Dein Script auch für Wired Komponenten? Da habe ich das Problem auch.

Danke Dirk

Guten Abend an Alle,

ich habe folgenden Code in meiner IPS aber $Result ist immer Null.


<?

function Post_Request ($sdata)
{
 $start=time();
 $fp = fsockopen ("192.168.176.230", 8181, $errno, $errstr, 2);
// $fp = fsockopen ("127.0.0.1", 8181, $errno, $errstr, 30);

 if (!$fp)
     echo "$errstr ($errno)<br />
";
 else
    {
    stream_set_blocking  ( $fp  , 1 ); // sicher gehen, dass der stream im non blocking Mode arbeitet
          $st = "POST /tclrega.exe HTTP/1.1
";
          $st = $st . "Content-type: application/x-www-form-urlencoded
";
          $st = $st . "Content-Length: ". strlen($sdata) ."
";
          $st = $st . "Connection: Close

";

      fputs($fp,$st.$sdata);
      $st = "";
      $t = fgets($fp,500);
      $st = $st . $t . "
";

       while ($t != "
")
       {
        $t = fgets($fp,500);
       }
      $t = "";

      while (!feof($fp))
        {
         $t .= fgets($fp,10000);
        }

    fclose($fp);
  }

//  $xml = new SimpleXMLElement($t);
//  return $xml->result;



ereg("<result>(.*)<\/result>",$t,$result);
//print_r($result);


return $result[1];

}

?>



und dann folgenden Aufruf wobei FEQ0036933:3 die Adresse eines Schaltmoduls ist.

<?

include(IPS_GetScriptIDByName("Init_Homematic_Include",47963 /*[HomeMatic Socket]*/).".ips.php");
$befehl = "var result = dom.GetObject('BidCos-RF.FEQ0036933:3.STICKY_UNREACH');";
$result = Post_Request ($befehl);
IPS_LogMessage("Result HM : ",$result);

?>

Hat jemand eine Idee?

Ich wäre sehr dankbar.

Viele Grüsse Dirk

Hilfe! Das kann doch keiner lesen.
Bringe das mal mit der Code (#)-Funktion in Reine:D

Danke für den Tip:)

ich bin neu hier und lerne.

Hier die Funktion von Christoph. Ich hab nur die IP geändert.


<?

function Post_Request ($sdata)
{
 $start=time();
 $fp = fsockopen ("192.168.176.230", 8181, $errno, $errstr, 2);
// $fp = fsockopen ("127.0.0.1", 8181, $errno, $errstr, 30);

 if (!$fp)
     echo "$errstr ($errno)<br />
";
 else
    {
    stream_set_blocking  ( $fp  , 1 ); // sicher gehen, dass der stream im non blocking Mode arbeitet
          $st = "POST /tclrega.exe HTTP/1.1
";
          $st = $st . "Content-type: application/x-www-form-urlencoded
";
          $st = $st . "Content-Length: ". strlen($sdata) ."
";
          $st = $st . "Connection: Close

";

      fputs($fp,$st.$sdata);
      $st = "";
      $t = fgets($fp,500);
      $st = $st . $t . "
";

       while ($t != "
")
       {
        $t = fgets($fp,500);
       }
      $t = "";

      while (!feof($fp))
        {
         $t .= fgets($fp,10000);
        }

    fclose($fp);
  }

//  $xml = new SimpleXMLElement($t);
//  return $xml->result;



ereg("<result>(.*)<\/result>",$t,$result);
//print_r($result);


return $result[1];

}

?>

und hier mein Aufruf wobei FEQ0036933:3 das die Adresse des Schaltaktors ist.
Ich habe nur den Include Befehl eingefügt.

$result ist immer Null


<?

include(IPS_GetScriptIDByName("Init_Homematic_Include",47963 /*[HomeMatic Socket]*/).".ips.php");
$befehl = "var result = dom.GetObject('BidCos-RF.FEQ0036933:3.STICKY_UNREACH');";
$result = Post_Request ($befehl);
IPS_LogMessage("Result HM : ",$result);

?>

nochmal Danke

Sorry, jetzt lag ich selbst falsch… :rolleyes::mad:

Ich meinte die

-Funktion:


```php
<?

function Post_Request ($sdata)
{
 $start=time();
 $fp = fsockopen ("192.168.176.230", 8181, $errno, $errstr, 2);
// $fp = fsockopen ("127.0.0.1", 8181, $errno, $errstr, 30);

 if (!$fp)
     echo "$errstr ($errno)<br />
";
 else
    {
    stream_set_blocking  ( $fp  , 1 ); // sicher gehen, dass der stream im non blocking Mode arbeitet
          $st = "POST /tclrega.exe HTTP/1.1
";
          $st = $st . "Content-type: application/x-www-form-urlencoded
";
          $st = $st . "Content-Length: ". strlen($sdata) ."
";
          $st = $st . "Connection: Close

";

      fputs($fp,$st.$sdata);
      $st = "";
      $t = fgets($fp,500);
      $st = $st . $t . "
";

       while ($t != "
")
       {
        $t = fgets($fp,500);
       }
      $t = "";

      while (!feof($fp))
        {
         $t .= fgets($fp,10000);
        }

    fclose($fp);
  }

//  $xml = new SimpleXMLElement($t);
//  return $xml->result;



ereg("<result>(.*)<\/result>",$t,$result);
//print_r($result);


return $result[1];

}

?>


<?

include(IPS_GetScriptIDByName("Init_Homematic_Include",47963 /*[HomeMatic Socket]*/).".ips.php");
$befehl = "var result = dom.GetObject('BidCos-RF.FEQ0036933:3.STICKY_UNREACH');";
$result = Post_Request ($befehl);
IPS_LogMessage("Result HM : ",$result);

?>

Hi,

sorry, dass ich mich nicht gemeldet habe, aber ich komme nur noch am Wochenende mal vorbei uns lese im Forum da ich selbst im Moment an IPS keine Änderungen mehr durchführt.

Die Adresse Deines Aktors (FEQ0036933:3) ist korrekt? Ich vermute mal Du hast Sie aus dem WebUI ausgelesen.

Wie Du geschrieben hast, möchtest Du den aktuellen Status auslesen. Hier gibt es zwei Möglichkeiten. Du kannst direkt (über die CCU) den Aktor fragen (dauert länger und lohnt sich nicht, da die CCU den korrekten Status ohnehin gespeichert hat). Oder Du liest den in der CCU gespeicherten Status aus.

Die notwendigen Befehle sind State (direkt am Aktor lesen) oder Value (gespeicherter Status aus der CCU lesen)

Du hast jetzt STICKY_UNREACH benutzt. Das geht leider nicht. Hiermit kannst Du prüfen ob ein Wettermodul (Temperatur, Feuchtigkeit…) erreichbar ist.

Nur zur Info noch vorneweg. Wenn Du prüfen willst ob ein Aktor erreichbar ist, dann musst Du UNREACH benutzen. Allerdings wird UNREACH über einen anderen Kanal (immer 0) abgefragt.

Ich schlage vor, Du fängst noch mal neu an. Ich hoffe Du hast einen Schaltaktor, der in eine Steckdose gesteckt wird. Den bitte holen und in eine Steckdose an Deinem Arbeitsplatz einstecken.

Bitte die Verwaltungskonsole öffnen und folgendes Script neu anlegen:

<?

$CCU_IP="192.168.178.99";
$geraet="BidCos-RF.FEQ0072971:1";
$geraet_u="BidCos-RF.FEQ0072971:0";
$ccu_status="";

// Schalten
//$result=Post_Request ("var result = dom.GetObject('".$geraet.".STATE').State(true);");
//$result=Post_Request ("var result = dom.GetObject('".$geraet.".STATE').State(false);");
//echo "result=$result";

// Status abfragen
$ccu_status=Post_Request ("var state = dom.GetObject('".$geraet.".STATE').State();");
echo "State=".Get_Value("state")."
";
// oder
$ccu_status=Post_Request ("var value = dom.GetObject('".$geraet.".STATE').Value();");
echo "Value=".Get_Value("value")."
";

$ccu_status=Post_Request ("var value = dom.GetObject('".$geraet_u.".UNREACH').State();");
echo "unreach=".Get_Value("value")."
";




function Post_Request ($sdata)
{

global $CCU_IP;

 $fp = fsockopen ($CCU_IP, 8181, $errno, $errstr, 2);

 if (!$fp)
     echo "$errstr ($errno)<br />
";
 else
    {
	stream_set_blocking  ( $fp  , 1 ); // sicher gehen, dass der stream im non blocking Mode arbeitet
		  $st = "POST /tclrega.exe HTTP/1.1
";
		  $st = $st . "Content-type: application/x-www-form-urlencoded
";
		  $st = $st . "Content-Length: ". strlen($sdata) ."
";
		  $st = $st . "Connection: Close

";

      fputs($fp,$st.$sdata);
      $st = "";

      $t = fgets($fp,500);
      $st = $st . $t . "
";

       while ($t != "
")
       {
        $t = fgets($fp,500);
       }
      $t = "";

      while (!feof($fp))
        {
         $t .= fgets($fp,10000 /*[Objekt #10000 existiert nicht]*/);
        }

    fclose($fp);
  }

return $t;

}


function Get_Value($var)
{global $ccu_status;
ereg("<".$var.">(.*)<\/".$var.">",$ccu_status,$tmp);
return($tmp[1]);
}


?>

Die benötigten Variablen findest Du am Anfang des Scripts:

$CCU_IP=„192.168.178.99“;
dürfte klar sein

$geraet=„BidCos-RF.FEQ0072971:1“;
Hier bitte Deine Adresse BidCos-RF.xxxx:1 eintragen.

$geraet_u=„BidCos-RF.FEQ0072971:0“;
Hier wird die selbe Adresse eingetragen aber für Kanal 0 (UNREACH)

Danach kannst Du oben rechts auf ausführen klicken und solltest z. B. folgende Ausgabe erhalten:
State=false
Value=false
unreach=false

Das bedeutet jetzt: Das Gerät meldet, dass es ausgeschaltet ist. Der Status in der CCU ist „ausgeschaltet“. Unreach ist false, also ist das Gerät erreichbar.

Du kannst mal etwas rumspielen, die Steckdose einschalten, wieder abfragen, oder mal einschalten, aus der Steckdose ziehen und dann abfragen (sollte dann dies ergeben):
State=false
Value=true
unreach=true

Der Aktor sagt er ist aus, (oder meldet sich nicht) der gespeicherte Status in der CCU ist „ein“. Der Aktor ist nicht erreichbar.

Du wolltest ja den Status abfragen, daher würdest Du den Befehl value benutzen:

$ccu_status=Post_Request ("var value = dom.GetObject('".$geraet.".STATE').Value();");

Das ganze andere Gedöns (State und UNREACH) brauchst Du nicht.

Ich wünsche einen schönen Tag.

Christoph.

Hi Christoph,

ich bin gerade über diesen Beitrag von dir gestolpert. Nach dem ich das mal spontan ausprobiert habe (und es funktioniert sogar, danke dafür), frag ich mich ob es so nicht auch möglich ist eine anstehende Batteriewarnung eines Senders abzufragen.

Bei mir laufen auf der CCU nur die Grundfunktionen, alles was komfort ist läuft auf IPS. Und deshalb würde ich ungemein gerne die Batteriemeldungen in IPS erfassen und visualisieren - genauso wie z.B. die Verbindungsstörungen.

Nur für Homematic ist gerade bei diesen sensiblen Themen (Statusmeldungen, Zustandsabfrage) von IPS-Seite irgendwie nicht wirklich was geboten… :frowning: da ist sogar die Software H. von Herrn S. noch besser… :eek: :eek: - und das will schon was heissen.

BTW @Paresy: Wenn du deinen Windoof-Rechner ohne Updates laufen lässt ist das ja deine Sache. Wer aber solche Software auf Windows packt und dann was von 24/7 erzählt, dem kann ich nur mein bedauern aussprechen, das er etwas an der Realität vorbei gerutscht ist. Es kann ja wohl niemand behaupten, das ein regelmäßig mit Sicherheitsupdates aktualisiertes Windows-System länger als 2 Monate ohne Shutdown auskommt (und 2 Monate sind da wohl schon hoch geriffen).

Hi,

Du kannst auch den Batteriestatus abfragen. Das läuft immer über Kanal 0 mit dem Befehl LOWBAT.

Also z.B.:

$bat=Post_Request ("var value = dom.GetObject('BidCos-RF.FEQ0084055:0.LOWBAT').Value();");

Ich wünsche einen schönen Abend.

Christoph.

Hallo Christoph,

wie läuft es mit „wired-Aktoren“?
Ich hatte es mit

$geraet=„BidCos-Wir.GEQ0009005:1“;

$geraet_u=„BidCos-Wir.GEQ0009005:0“;

versucht, und bekomme immer dies:

State=null
Value=null
unreach=null

Wo liegt der Fehler?

MFG
ODIN

Hi,

ich habe nur Funkkomponenten in Benutzung, daher habe ich keine Ahnung, wie die Kabelgebundenen Aktoren angesprochen werden können.

In der HM-Doku habe ich folgendes gefunden:

Die HomeMatic Zentrale verfügt derzeit über drei Schnittstellen:
• BidCos-RF für Funkkomponenten
• BidCos-Wired für drahtgebundene Geräte
• System für interne Geräte

In Teil 4 der Doku steht eigentlich, dass die Wired Geräte so nicht abgefragt werden können, aber probiere es mal.

Ich wünsche einen schönen Tag.

Christoph.

Hallo Gemeinde,

ich stoße beim Ausführen des Scripts auf folgenden Fehler:

Deprecated: Function ereg() is deprecated in C:\IP-Symcon\scripts\53095.ips.php on line 70
State=false

Deprecated: Function ereg() is deprecated in C:\IP-Symcon\scripts\53095.ips.php on line 70
Value=false

Deprecated: Function ereg() is deprecated in C:\IP-Symcon\scripts\53095.ips.php on line 70
unreach=false

Was läuft da falsch?

Danke und Gruß
Dirk

Eine Suchmaschine deines Vertrauens hätte dir sicher die Antwort gegeben. :wink:

PHP: ereg - Manual