Batteriezustand per Script auslesen läuft auf einen Fehler

Hi zusammen,

ich nutze nun schon seit geraumer Zeit das Script für Homematic hier aus dem Forum, das den Batteriezustand abruft.

Nun ist mir aufgefallen, dass dieses Script nicht mehr läuft und ein rotes Ausrufezeichen hat.

Das Script läuft auf folgenden Fehler: Fatal error: Call-time pass-by-reference has been removed in [.Scripts\Batterie-Status-Homematic EG] on line 117

Hier noch mein Script:

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

$ccu = HM_GetHost(28719 /*[HomeMatic EG]*/);     // 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_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
            }

        }
    }
?>

Vielleicht weiss ja jemand, woran es liegt.

Gruß

Jimmy

Prego die Skripte mal in php-Tags (das ist im Editor das Blatt mit php drauf) setzen, ist leichter zu lesen :rolleyes:

Sorry, vergessen.

Vor dem Fragen Suchen wohl auch :rolleyes:

Gruß
Bruno

Nein, das hat der Jimmy getan und ist von oben nach unten die Posts durchgegangen und auf diesen Thread (den Hauptthread gestossen, weil letzte Antwort am Aktuellsten war).

Da es in diesem „Hauptthread“ keinen Link zu dem von dir genannten gab, habe ich einen Neuen eröffnet.

Nach einem 12 Stunden-Arbeitstag lese ich nicht mehr ALLE historischen Threads durch.

Ein Fehler :wink:

Gruß

Jimmy

Du machst aber auch Sachen, dachte schon ich hab das Vergnügen allein :wink:

Freut mich, wenn es wieder geht

Schönen Abend
Bruno

Hallo Bruno,

geht leider nicht. Nehme ich das „&“ in Zeile 117 raus, kommt ein Fehler in Zeile 129. Nehme ich da auch das „&“ raus, schmeisst mir das Script Fehler in Zeile 129 und 130 raus „undefined Variable“

Vielleicht weisst du ja noch eine Möglichkeit. Zeit ist genug, ich gehe jetzt in die Heia, Morgen kündigt sich ein ähnlicher Tag an.

Gruß

Jimmy

P.S.: Ist nur ein Batterie-Script, also Status „alles andere ist wichtiger“ :wink:

Also mein Skript läuft und läuft schon viele Monate und hat mir erst gestern wieder ne kritische Batterie gemeldet. ???

Das Script läuft bei mir :

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

$ccu = HM_GetHost(45074  /*[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
            }

        }
    }
?>