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…