Umstellung auf IPS 5 -> count() Parameter must be an array or an object that implemen

Hallo zusammen,

ich habe mein Instanz mit knapp 900 Variablen und vielen vielen Modulen und Instanzen erfolgreich migriert.
Leider hat ein (hier aus dem Forum übernommenes) Skript immer eine Warnung.
Es ist ein Register Variable Skript zum Auslesen meiner Jeelink Thermostate.


7/14/2018 13:02:12 | Register Variable | <br />
<b>Warning</b>:  count(): Parameter must be an array or an object that implements Countable in <b>/var/lib/symcon/scripts/52929.ips.php</b> on line <b>90</b><br />

Das gesamte Skript:

<?
//Address-Arrays mit IDs der Variablen
$Addr_ID=11324 /*[System-Geräte\Lacrosse\Register Variable\IDs]*/;
$Addr_ID_array=13343 /*[System-Geräte\Lacrosse\Register Variable\ID_Variables]*/;
$Addr_T_array=39511 /*[System-Geräte\Lacrosse\Register Variable\T_Variables]*/;
$Addr_T2_array=10706 /*[System-Geräte\Lacrosse\Register Variable\T2_Variables]*/;
$Addr_H_array=16435 /*[System-Geräte\Lacrosse\Register Variable\H_Variables]*/;
$Addr_Batt_array=24640 /*[System-Geräte\Lacrosse\Register Variable\Batt_Variables]*/;
$Addr_counter=40409 /*[System-Geräte\Lacrosse\Register Variable\Counter]*/ ;
$Addr_Jeelink=22347 /*[Jeelink_Cutter]*/;

// Arrays einlesen

   $ID_array = array();
    $ID_array = unserialize(GetValue($Addr_ID));
    
    $ID_variable_array = array();
    $ID_variable_array = unserialize(GetValue($Addr_ID_array));
    
    $T_variable_array = array();
    $T_variable_array = unserialize(GetValue($Addr_T_array));
    
    $T2_variable_array = array();
    $T2_variable_array = unserialize(GetValue($Addr_T2_array));
    
    $H_variable_array = array();
    $H_variable_array = unserialize(GetValue($Addr_H_array));
    
    $Batt_variable_array = array();
    $Batt_variable_array = unserialize(GetValue($Addr_Batt_array));

   
    
    
if ($_IPS['SENDER'] == "RegisterVariable")
{
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data = $_IPS['VALUE'];


    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}

    
// Format
  //
  // OK 9 56 1   4   156 37     ID = 56  T: 18.0  H: 37  no NewBatt
  // OK 9 49 1   4   182 54     ID = 49  T: 20.6  H: 54  no NewBatt
  // OK 9 55 129 4 192 56       ID = 55  T: 21.6  H: 56  WITH NewBatt
  // OK 9 ID XXX XXX XXX XXX
  // |  | |  |   |   |   |
  // |  | |  |   |   |   --- Humidity incl. WeakBatteryFlag
  // |  | |  |   |   |------ Temp * 10 + 1000 LSB
  // |  | |  |   |---------- Temp * 10 + 1000 MSB
  // |  | |  |-------------- Sensor type (1 or 2) +128 if NewBatteryFlag
  // |  | |----------------- Sensor ID
  // |  |------------------- fix "9"
  // |---------------------- fix "OK"
  

// Decodierung

# Temperature sensor - Format:
    #      0   1   2   3   4
    # -------------------------
    # OK 9 56  1   4   156 37     ID = 56  T: 18.0  H: 37  no NewBatt
    # OK 9 49  1   4   182 54     ID = 49  T: 20.6  H: 54  no NewBatt
    # OK 9 55  129 4   192 56     ID = 55  T: 21.6  H: 56  WITH NewBatt

    # OK 9 2   1   4 212 106       ID = 2   T: 23.6  H: -- Channel: 1
    # OK 9 2   130 4 225 125       ID = 2   T: 24.9  H: -- Channel: 2

    # OK 9 ID XXX XXX XXX XXX
    # |  | |  |   |   |   |
    # |  | |  |   |   |   --- Humidity incl. WeakBatteryFlag
    # |  | |  |   |   |------ Temp * 10 + 1000 LSB
    # |  | |  |   |---------- Temp * 10 + 1000 MSB
    # |  | |  |-------------- Sensor type (1 or 2) +128 if NewBatteryFlag
    # |  | |----------------- Sensor ID
    # |  |------------------- fix "9"
    # |---------------------- fix "OK"

     $data = RegVar_GetBuffer($_IPS['INSTANCE']);

    $bytes = explode( ' ', $data);
	
if ($bytes[0]=='OK' and count($bytes[0])<=2 )
{
    $addr = $bytes[2] ;
    $battery_new = ($bytes[3] & 0x80) >> 7;
    $battery_low = ($bytes[6] & 0x80) >> 7;
    $type = ($bytes[3] & 0x70) >> 4;
    $channel = $bytes[3] & 0x0F;
    $temperature = ($bytes[4]*256 + $bytes[5] - 1000)/10;
    $humidity = $bytes[6] & 0x7f;
   
   if (in_array($addr, $ID_array))
  {
  
  // Daten in Variable schreiben
    $key=array_search($addr, $ID_array);
    setvalue($ID_variable_array[$key],$addr);
    setvalue($Batt_variable_array[$key],$battery_low);
     if($channel==1){
    setvalue($T_variable_array[$key],$temperature);
    }elseif($channel==2){
    setvalue($T2_variable_array[$key],$temperature);
    }
    if($humidity<100){
    setvalue($H_variable_array[$key],$humidity);
    }else{
    setvalue($H_variable_array[$key],999);
     }
    
  }
  //steffen: müesste neu anlegen sein...
/*  else
  {
  
  $CatID = IPS_CreateCategory();       // Kategorie anlegen
  IPS_SetName($CatID,$addr); // Kategorie benennen
  IPS_SetParent($CatID,IPS_GetParent ( IPS_GetParent ( $_IPS['SELF']))); // Kategorie einsortieren unter dem Objekt mit der ID "12345"
  
  $ID_array[]=$addr;
  SetValue($Addr_ID,serialize($ID_array));
  
  $VarID_ID= IPS_CreateVariable(1);
  IPS_SetName($VarID_ID, "ID"); // Variable benennen
  IPS_SetParent($VarID_ID, $CatID ); // Variable einsortieren
  SetValue($VarID_ID, $addr);
  $ID_variable_array[]=$VarID_ID;
  SetValue($Addr_ID_array,serialize($ID_variable_array));
  
  $VarID_T= IPS_CreateVariable(2);
  IPS_SetName($VarID_T, "Temperatur"); // Variable benennen
  IPS_SetParent($VarID_T,  $CatID ); // Variable einsortieren
  IPS_SetVariableCustomProfile($VarID_T, "~Temperature");
  SetValue($VarID_T, $temperature);
  $T_variable_array[]=$VarID_T;
  SetValue($Addr_T_array,serialize($T_variable_array));
  
  $VarID_T2= IPS_CreateVariable(2);
  IPS_SetName($VarID_T2, "Temperatur2"); // Variable benennen
  IPS_SetParent($VarID_T2,  $CatID ); // Variable einsortieren
  IPS_SetVariableCustomProfile($VarID_T2, "~Temperature");
  SetValue($VarID_T2, $temperature);
  $T2_variable_array[]=$VarID_T2;
  SetValue($Addr_T2_array,serialize($T2_variable_array));
  
  $VarID_H= IPS_CreateVariable(2);
  IPS_SetName($VarID_H, "Luftfeuchtigkeit"); // Variable benennen
  IPS_SetParent($VarID_H,  $CatID ); // Variable einsortieren 
  IPS_SetVariableCustomProfile($VarID_H, "~Humidity.F");
  SetValue($VarID_H, $humidity);
  $H_variable_array[]=$VarID_H;
  SetValue($Addr_H_array,serialize($H_variable_array));
  
  $VarID_Batt= IPS_CreateVariable(0);
  IPS_SetName($VarID_Batt, "Batterie Klimasensor"); // Variable benennen
  IPS_SetParent($VarID_Batt,  $CatID ); // Variable einsortieren 
  IPS_SetVariableCustomProfile($VarID_Batt, "~Battery");
  SetValue($VarID_Batt, $battery_low);
  $Batt_variable_array[]=$VarID_Batt;
  SetValue($Addr_Batt_array,serialize($Batt_variable_array));
  }
  */
}
  
  // Wenn counter =0 Port schließen und LED ausschalten und Arrays ggf. aufräumen, sonst counter dekrement
/*  $count=GetValueInteger($Addr_counter);
  if($count==0)
  {
      SPRT_SendText($Addr_Jeelink, "0a v");
   IPS_SetProperty($Addr_Jeelink, "Open", false);
   IPS_ApplyChanges ($Addr_Jeelink);
   
   //Arrays aufräumen
   
   for ($i = 0; $i <= count($ID_variable_array)-1; $i++) {
   if (IPS_VariableExists($ID_variable_array[$i])){
   }else{
   
   unset($ID_array[$i]);
   $ID_array = array_values($ID_array);
   SetValue($Addr_ID,serialize($ID_array));
   //print_r($ID_array);
   
   unset($ID_variable_array[$i]);
   $ID_variable_array = array_values($ID_variable_array);
   SetValue($Addr_ID_array,serialize($ID_variable_array));
   //print_r($ID_variable_array);
   
   unset($T_variable_array[$i]);
   $T_variable_array = array_values($T_variable_array);
   SetValue($Addr_T_array,serialize($T_variable_array));
   //print_r($T_variable_array);
   
   unset($T2_variable_array[$i]);
   $T2_variable_array = array_values($T2_variable_array);
   SetValue($Addr_T2_array,serialize($T2_variable_array));
   //print_r($T2_variable_array);
   
   unset($H_variable_array[$i]);
   $H_variable_array = array_values($H_variable_array);
   SetValue($Addr_H_array,serialize($H_variable_array));
   //print_r($H_variable_array);
   
   unset($Batt_variable_array[$i]);
   $Batt_variable_array = array_values($Batt_variable_array);
   SetValue($Addr_Batt_array,serialize($Batt_variable_array));
   //print_r($Batt_variable_array);
  
   }
   }
   
  }else
  {
  $count=$count-1;
  SetValueInteger($Addr_counter,$count);
  }
  */
?>

Die fehlerhaften Zeile:

    $data = RegVar_GetBuffer($_IPS['INSTANCE']);

    $bytes = explode( ' ', $data);
	
if ($bytes[0]=='OK' and count($bytes[0])<=2 )

-> Es handelt sich um die UNTERSTE. Ich habe es bereits mit sizeOf probiert. Hier kam der gleiche Fehler / Warning.

Danke schonmal für das lesen des langen Beitrags…

Hallo,

Du überprüfst, ob bytes[0] == ‚OK‘ . Warum benötigst Du noch die Länge? Hast Du es mal mit strlen(String) versucht? Count zählt eigentlich die Elemente in einem Array.

Grüße, Gerhard

Hi Gerhard,

Du hast recht. Genau betrachtet kann der String nur nur = 2 Zeichen lang sein, wenn er ‚OK‘ ist.
Ich denke mal ich kann die Prüfung auf die Länge / Count einfach herausnehmen…
Danke für das Prüfen und den Hinweis geben!