RegisterVariable Verbosity

Hallo zusammen,

ich nutze ein Script um einen Lacrosse Jeelink Adapter via Register Variable auszulesen.
Leider „spamt“ er mir den Message Bereich so zu, dass dieser nicht sinnvoll nutzbar ist.
Die im Sekundentakt kommen mehrere Einträge wie diese hier:

11/02/2018 22:40:15*| Register Variable*| //$Addr_ID=11324;
//$Addr_ID_array=13343;
//$Addr_T_array=39511;
//$Addr_H_array=16435;
//$Addr_Batt_array=24640;

Kann ich das irgendwie suppressen?

Danke!

Einfach die Ausgaben im Script entfernen oder auskommentieren.
Michael

Hallo Michael,

es gibt leider keine logs oder prints im Code.
Es gibt z.B. konkret für Addr_ID_array eine Zuweisung

$Addr_ID_array=13343

und ein getValue

$ID_variable_array = unserialize(GetValue($Addr_ID_array));

Irgendwas muss da aber sein, sonst wäre da keine Ausgabe :slight_smile:
Sonst poste das ganze Script.
Michael

Danke für’s Angebot, mal draufzuschauen.
Ich habe es selber im Forum gefunden.
Den unteren Teil habe ich auskommentiert, aber dennoch hier mit reingenommen. Nicht, dass ich was beim Kommentar falsch gemacht habe. :banghead:


//$Addr_ID=11324 /*[_System\Lacrosse\Register Variable\IDs]*/;
//$Addr_ID_array=13343 /*[_System\Lacrosse\Register Variable\ID_Variables]*/;
//$Addr_T_array=39511 /*[_System\Lacrosse\Register Variable\T_Variables]*/;
//$Addr_H_array=16435 /*[_System\Lacrosse\Register Variable\H_Variables]*/;
//$Addr_Batt_array=24640 /*[_System\Lacrosse\Register Variable\Batt_Variables]*/;


 <?
//Address-Arrays mit IDs der Variablen

$Addr_ID=11324 /*[_System\Lacrosse\Register Variable\IDs]*/;
$Addr_ID_array=13343 /*[_System\Lacrosse\Register Variable\ID_Variables]*/;
$Addr_T_array=39511 /*[_System\Lacrosse\Register Variable\T_Variables]*/;
$Addr_T2_array=10706 /*[_System\Lacrosse\Register Variable\T2_Variables]*/;
$Addr_H_array=16435 /*[_System\Lacrosse\Register Variable\H_Variables]*/;
$Addr_Batt_array=24640 /*[_System\Lacrosse\Register Variable\Batt_Variables]*/;
$Addr_counter=40409 /*[_System\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);
  }
  */
?> 

Der Fehler ist gleich am Anfang.

Alles war vor <? Und nach ?> Steht wird immer ausgegeben.
Hier ist PHP nicht aktiv und somit kannst du da auch nix auskommentieren.
Verschiebe das <? In die erste Zeile und gut ist :slight_smile:
Michael

Lach… Danke, klar logisch… :slight_smile:

Jetzt habe ich nur noch den Output

12/02/2018 19:35:55 | Register Variable | 

jede Sekunde. Das ist systembedingt, oder?

Leerzeile vor <? Oder nach ?>

Und wenn ich das richtig überflogen habe, wird der Buffer der RegVar nie leer und wächst immer weiter.
Hast du keine Warnungen im Log, dass der Buffer eine Größe von 8kB überschritten hat?
Michael

War tatsächlich ein blank nach dem ?>. Jetzt ist Ruhe im Log. Super!

Ich habe den Code nicht im Detail angesehen. Allerdings sehe ich hier ein
RegVar_SetBuffer($_IPS[‚INSTANCE‘], $data);
Sollte das nicht den Buffer überschreiben?

Aber vorher wird immer mehr an $data angehängt.
Nachdem die Daten erfolgreich zerlegt und in Variablen geschrieben wurden, sollte der Buffer geleert werden:
RegVar_SetBuffer($_IPS[‚INSTANCE‘], ‚‘);
Michael

Hmm… pro Aufruf vom Cutter wird das Script doch neu aufgerufen und somit neu instanziiert, oder?
Ich hätte da am ehsten Sorgen, dass die Variablen evlt. nicht Threadsafe befüllt werden…? (Habe mich mit PHP und RegisterVariable allerdings nicht wirklich befasst).
Der Buffer sollte doch nur so lange sein, wie eine Zeile vom Cutter ist. Daher verstehe ich das konstrukt nicht so ganz.

Wenn du einen Cutter nutzt, brauchst du den Buffer der RegVar doch gar nicht.
Der Buffer ist persistent, sonst hätte er ja keinen Sinn im Gegensatz zu normalen PHP-Variablen im Script.

Der Buffer ist dazu gedacht, unvollständige Daten dort abzulegen bis der Datensatz komplett ist. Wenn man diese Prüfung der Daten in einem Script macht und somit die unvollständigen Daten irgendwo speichern muss.

Wenn du allerdings diese Prüfung der Datensätze schon im Cutter erledigst, brauchst du das im Script ja nicht noch mal machen und folglich auch den Buffer der RegVar nicht.

Wie das nun im Detail bei dir aussieht bzw. optional aussehen sollte, kann ich dir aber nicht sagen. Kenne jetzt das Protokoll und die zu erwartende Datensätze nicht.
Michael