Batteriezustand von HM-Instanzen ab 2.5

Hallo,

Ich habe mich heute getraut meine System ein Update zu verpassen.
Nun Funktioniert aber das Script für den Batteriezustand meiner HM-Geräte nicht mehr.

Vielleicht hat hier ja jemande eine schnelle Lösung für mich. Anbei das genutzte Script und die Fehlermeldung aus der Console.

<?
/*
*******************************************************************************************
Auslesen des Batteriezustands an HM-Instanzen - Erstellen, Löschen, Umbenennen der Variablen
*******************************************************************************************
File     :
Trigger  :
Interval :
*/

$ccu = HM_GetHost(11502 /*[HomeMatic Socket]*/);     // IP der Homematic-CCU abfragen
$function = 1;                                     // Funktion 1 = Abfrage des Batteriezustands

$lbname  = "Batterie";                             // Variablenname für LOW-BATT
$altname = "HM-Batterie";                             // Alternativer Name der Variable (beim UMBENENNEN)

$create = 1;                                       // 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($lbname, $id) ) > 0)     // Überprüfen ob Variable schon existiert, Ergebnis = NEIN
                {
                $newid = IPS_CreateVariable(0);                                // Variable anlegen
                IPS_SetVariableCustomProfile ($newid, "~Battery");       // Variablenprofil einstellen
                IPS_SetName($newid, $lbname);                           // Name für Variable schreiben
                IPS_SetHidden($newid, true); 										//Objekt verstecken
                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($lbname, $id);         // Überprüfen ob Variable schon existiert, Ergebnis = JA
                    if ($rename)
                    {
                   IPS_SetName($newid, $altname);                           // 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($lbname, $id);         // Überprüfen ob Variable existiert, Ergebnis = JA
            IPS_DeleteVariable($newid);                              // Variablen ($lbname) löschen
            }

        }
    }
?>

Fatal error: Call-time pass-by-reference has been removed in [Scripte\Betteriezustand] on line 118

Ich habe hier schon was gefunden aber ich kann es nicht wirklich umsetzten was ich gefunden habe. Vielleicht könnt ihr mir ja die text Zeilen scheinben die ich ändern muss.

Ich bedanke micht für die schnelle hilfe und wünsche allen einen guten rütsch ins neue Jahr.

Dirk

Mit Einführung des Homematic-Configurators in IPS und dem damit verbundenen automatischen Anlegen dieser Statusvariablen, hat sich die Verwendung dieses Scripts erübrigt und bringt mehr Verwirrung als Nutzen, wenn neue HM-Instanzen angelegt werden.
Ich gebe hierzu auch keinen Support mehr, was ich hier am Ende des threads auch schon schrieb.
Das Sinnvollste ist, du legst die Instanzen nochmal über den o. erwähnten Configurator neu an, was natürlich auch die Änderung der Scripte nachsich zieht, inwelchen diese verwendet werden.
Macht je nach Anzahl und Verwendung der HM-Komponenten viel Arbeit, aber es ist die sicherste und letztendlich sinnvollste Alternative für die zukünftige Arbeit mit IPS.

Hab trotzdem mal nach dem Fehler gesucht…

Ändere die Zeile:

function GetDeviceStatus($ccu, $function, $devices, &$status) 

in

function GetDeviceStatus($ccu, $function, $devices, $status) 

…dann sollte es wieder funktionieren.

Siehe auch PHP: Parameterübergabe per Referenz - Manual

P.S. Trotzdem solltest du über die Alternative nachdenken…