Homematic - Verspätete Levelanzeige

Moin,

wenn ich einen Homematic-Jallousieaktor steuern möchte, setze ich das LEVEL via HM_WriteValueFloat ab. Wenn ich das gemacht habe sehe ich aber im LogischenBaum noch keinen neuen LEVEL Wert. Dieser aktualisiert sich auch nicht, obwohl der Rolladen gefahren ist. Wenn ich nun noch einen Wert an die HM-CCU schicke dann wird der alte Wert auf den vorherigen Wert aktualisiert, das neue Level erscheint jedoch nicht…

Gibt es hierfür einen Workarround bzw. eine elegante Lösung um möglichst immer aktuelle Werte zu haben?

Hab das ganze mal visualisiert:
http://www.screentoaster.com/watch/stU0pRQEdIR1xdRF1fU1tcUFFd/ips_hm_problem_j_aktor

Viele Grüße
Sascha

…es dauert solang es dauert.
Es ist aber schon merkwürdiges Verhalten - liegt aber nicht an IP-Symcon - in der CCU wird der Wert auch nicht aktualisiert :confused:

Skript zum erneuten Abfragen:

$CCU_IP="192.168.2.60";
$geraet="BidCos-RF.FEQ0009263:1";
$geraet_u="BidCos-RF.FEQ0009263:0";
$ccu_status="";

$ccu_status=Post_Request ("var value = dom.GetObject('".$geraet.".LEVEL').Value();");
echo "L-Value = ".Get_Value("value")."
";

// Script from "Christoph"
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 /*[N-Gebäude\Sauna\Sauna IO 2408\Taster]*/);
        }
    fclose($fp);
 }

return $t;
}

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

Ein Script zum Abfragen der Werte über die XML-Schnittstelle habe ich. Nur werden dann aber die IPS-Variablen (Werte) nicht aktualisiert… Kann man das forcieren?

Grüße
Sascha

… was mir aufgefallen ist:
wenn man den Rollladen mit der FB fährt, wird bei gedrückter Taste LEVEL aktualisiert - ansonsten nicht.
(gilt für IP-Symcon & CCU)

MST

Ist das ein BUG? Oder bekommt IPS wirklich die Änderung nicht mit?

(gilt für IP-Symcon & CCU)

… ist jedenfalls bei meiner CCU so …

Ich habe einiges getestet. Aber so wirklich vernünftig läuft das alles nicht. LEVEL wird irgendwie NIE aktualisiert. Erst sobald wieder eine Bewegung stattfindet, wird dort der ALTE Wert angezeigt. Ein aktueller Wert ist dort nie zu finden…

Hat jemand eine Idee?

ich habe auch beobachtet, das die werte nicht immer stimmen, wo sich die rollos gerade befinden, hatte aber noch keine zeit dem auf die spur zu gehen.

Kann man es nun bestätigen, das selbst die CCU nicht die aktuellen werte hat?
Denn, wenn CCU richtige werte hat, aber IPSymcon nicht, dann ist es wohl ein Fehler in der Schnittstelle.

Ich werde dann mal testen, ob die WORK Variable akutalisert wird, und dann bei änderung dieser, oder (ich weiss ja wie lange meine rollos fahren) entweder die CCU fragen (mit dem script oben) oder einfach dann noch mal auf den gleichen wert stellen, wie das erste mal

Sprich per timer immer 30 sekunden nach dem aufruf, die rollos noch mal auf den wert fahren lassen …

Ich habe mal einen Workarround geschaffen und hoffe dass dieser bei Euch auch funktioniert:

Script anlegen:


<?
require_once "includes/rega_include.php";

if ( $IPS_SENDER == "Variable" )
{
	$obj = IPS_GetObject($IPS_VARIABLE);
	$parent_id = $obj['ParentID'];

	$ips_addr = HM_GetAddress($parent_id);
	$datapoint = "BidCos-RF.$ips_addr.LEVEL";
	$cmd = sprintf("var result = dom.GetObject(\"$datapoint\").State();");
	$result = Post_Request($cmd);

	$position = round($result*100, 2);

	$varid = @IPS_GetObjectIDByName("POSITION", $parent_id);
	if ( $varid != 0 )
	{
		SetValueFloat(IPS_GetObjectIDByName("POSITION", $parent_id), $position);
		IPS_SetVariableCustomAction($varid, $IPS_SELF);
	} else
	{
	   $varid = IPS_CreateVariable(2);
	   IPS_SetName($varid, "POSITION");
	   IPS_SetParent($varid, $parent_id);
	   IPS_SetVariableCustomProfile($varid, "MY-Level.HM");
	   IPS_SetHidden(IPS_GetObjectIDByName("LEVEL", $parent_id), true);
	   IPS_SetVariableCustomAction($varid, $IPS_SELF);

	   SetValueFloat($varid, $position);
	}
}

if ( $IPS_SENDER == "WebFront" )
{
	$obj = IPS_GetObject($IPS_VARIABLE);
	$parent_id = $obj['ParentID'];

	$value = $IPS_VALUE/100;

   HM_WriteValueFloat($parent_id, "LEVEL", $value);
}
?>

Diesem Script fügt ihr für jeden Jallousieaktor ein Ereignis zu. Trigger ist die Variable WORKING eines jeden Aktors.
→ Bei bestimmten Wert: FALSE

False ist wichtig, damit das Script die Variable POSITION nach dem Fahren aktualisiert.

Das Script legt automatisch die Variable POSITION an und versteckt LEVEL. Auch wird der Variablen POSITION des Aktors eine „eigene Aktion“ hinterlegt. Und zwar dieses Script. Es kümmert sich auch um den Request vom WebFrontEnd.

Legt noch im Verzeichnis:
/Scripts

einen Ordner an mit Namen: includes

In diesesm Ordner legt Ihr eine Datei an mit Namen: rega_include.php

Inhalt dieser Datei:


<?php

$host = "<ip der HM-CCU>";
$port = "8181";

function Post_Request ($sdata)
{
 include "config.php";
 $fp = fsockopen ($host, $port, $errno, $errstr, 30);
 
 if (!$fp) 
     echo "$errstr ($errno)<br />
";
 else 
    {
		  $st = "POST /tclrega.exe HTTP/1.1
";
		  $st = $st . "Content-type: application/x-www-form-urlencoded
";
		  $st = $st . "Connection: Close
";
		  $st = $st . "Content-length: ". strlen($sdata) ."

";
      fputs($fp,$st.$sdata); 
      $st = "";
      $t = fgets($fp,100);
      $st = $st . $t . "
";
       while ($t != "
") 
       {
        $t = fgets($fp,100);
       }
      $t = "";
      while (!feof($fp))
        {      
         $t .= fgets($fp,10000);
        }

    fclose($fp);
  }
  $xml = new SimpleXMLElement(utf8_encode($t));
  return utf8_decode($xml->result); 
}

?>

Bei mir läuft das nun vorerst einmal. Interessant wäre jedoch die Lösung des Problems. Ob es nun ein BUG der CCU ist, oder ob irgendwo anders vielleicht noch Informationen abgegriffen werden können.

Viele Grüße
Sascha

Eine Sache habe ich noch vergessen:

Ihr müsst ein neues Variablen-Profil anlegen:

  • Präfix:
  • Min Wert: 0
  • Schrittweite: 10
  • Standard Icon:
  • Suffix: %
  • Max Wert: 100
  • Stellen: 0

Das Profil nennt ihr: MY-Level.HM

Bitte VOR dem ersten ausführen meines Script anlegen. Dieses Profil wird für die Variable POSITION benötigt!