Ich habe mich ein bischen mit RegisterVariablen auseinandergesetzt und rumprobiert. Bei mir ist es der Fall, dass ich innerhalb eines vom Benutzer ausgelösten Scriptes mehrere „Calls“ nacheinander absetze (z.B. via ClientSocket) und die zurückgegebenen Ergebnisse dann auswerten will. Das ist m.e. nicht ganz so einfach, weil man ja warten muss, bis die Response da ist und das innerhalb des Scripts nicht mitbekommt (? ist das so oder gibt’s nen Trick?).
Damit keine zurückgelieferten Werte verloren gehen, muss man sich einen eigenen „Heap“ basteln, und diesen dann abarbeiten.
Damit RegisterVariablen „in aller Ruhe“ oder auch zu einem späteren Zeitpunkt ausgewertet werden können (z.B. in einem Batch-Run) habe ich ein kleines PHP geschrieben, welches eine (beliebige) RegisterVariable ausliest und deren gelieferten Wert dann in eine verkettet Liste schreibt. Der Aufbau dieserListe ist:
<delimiter><Wert 1><delimiter><Wert 2><delimiter> … <delimiter><Wert n)
Damit das script möglichst universell benutzt werden kann (sozusagen als „standard-event bei Registervariablen“ ist noch eine Parameter-Variable hinzugekommen … dazu gleich mehr.
Ohne jegliche weitere Anpassung legt das Script eine Buffervariable an. Sie ist „Child“ der Registervariable und hat den Namen der RegisterVariable plus Erweiterung „.Buffer“. Diese Buffervariable wird dann mit den Werten der Registervariablen gefüllt, als Trennzeichen wird das „^“ verwendet und die maximale Anzahl Werte ist 20. Alles wird natürlich als String gespeichert.
Wem das nicht passt, der kann die Buffervariable selbst anlegen (Namenskonvention ist allerdings wie oben) und dann weine weitere Variable als Child unter der Buffervariablen anlegen, die „Parameters“ heisst. Der Inhalt miss dann ein Text sein, der wie folgt interpretiert wird: erstes Zeichen ist der Trenner für einzelne Werte (so kann ein anderes Zeichen als „^“ verwendet werden) und die folgenden Zeichen (bis max. 5) werden als Integer interpretiert und stellen die maximale Länge der Liste dar.
Wer also z.B. „#“ als Trenner und nur 5 Zeilen möchte, der trägt dort ein: „#5“.
/* ***************************************************************************
GLOBAL SCRIPT TO HANDLE REGISTER VARIABLES AND PURGE CONTENT INTO BUFFERS
reads Register variable and writes new received values into Buffer variable.
- if Buffer var does not exist, creates it
- if Buffer var exists, appends values just received
- WITHOUT child variable named "Parameters"
- - max. 20 lines are retained, rest is cut
- - default delimiter is ^
- WITH child variable named "Parameters"
- - format shall be <1 digit delimiter><1-5 digit number> i.e.: ".10"
- - first char is interpreted as maxlines (i.e. ".")
- - second to 5th char is interpreted as number of lines (i.e. 10)
TO BE DONE:
semaphore to prevent crash if quick calls on same register variable
V 0.1
author: jw
last change: n/v
*************************************************************************** */
// help to allow to test this script from editor
if ($IPS_SENDER == 'Execute'):
$RegVarID = 21212;
$RegVarValue = date('Y.m.d H:m:s');
else:
$RegVarID = $IPS_INSTANCE;
if (is_string($IPS_VALUE)):
$RegVarValue = rawurldecode( rtrim($IPS_VALUE, "\x0D" ) );
else:
$RegVarValue = strval($IPS_VALUE);
endif;
endif;
// ######################## CHANGE VALUES HERE ##############################
$BufferLinesDelimiter = "^";
$BufferLinesMax = 20; // max values kept in buffer
$BufferLinesMax = 3; //
$RegVarBufferNameExt = '.Buffer';
$RegVarBufferParametersName = 'Parameters';
// ##################### NO CHANGE BEHIND THIS LINE #########################
$RegVarObject = IPS_GetObject( $RegVarID );
$RegVarName = $RegVarObject['ObjectName'];
$RegVarBufferName = $RegVarName . $RegVarBufferNameExt;
$RegVarBufferID = @IPS_GetVariableIDByName( $RegVarBufferName , $RegVarID );
if ( $RegVarBufferID === false ) :
// buffer variable does not exist --> create [ALLWAYS STRING !!]
$RegVarBufferID = IPS_CreateVariable( 3 );
IPS_SetParent( $RegVarBufferID, $RegVarID );
IPS_SetName( $RegVarBufferID, $RegVarBufferName);
else:
// buffer exists, read first [timing] and append actual buffer value to existing buffer lines
$RegVarBufferVal = GetValue( $RegVarBufferID );
// now, look if parameters are supplied
$RegVarBufferParametersID = @IPS_GetVariableIDByName( $RegVarBufferParametersName , $RegVarBufferID );
if ( ! ( $RegVarBufferParametersID === false ) ) :
// read parameters defined
$Parameters = GetValueString( $RegVarBufferParametersID );
if ( $Parameters <> "" ) :
$Delimiter = substr($Parameters,0,1);
$NewBufferLinesMax = intval(substr($Parameters,1,5));
if ( $Delimiter <> "" ) :
$BufferLinesDelimiter = $Delimiter;
endif;
if ( $NewBufferLinesMax > 0 ):
$BufferLinesMax = $NewBufferLinesMax;
endif;
endif;
endif;
endif;
// NOW APPEND THE NEW VALUES, CUT TO APPROPRIATE LENGHT, WRITE TO BUFFER VARIABLE
$Delimiter = substr($RegVarBufferVal,0,1);
$BufferLinesARR = explode($Delimiter, $RegVarBufferVal);
array_shift($BufferLinesARR); // 1st empty due to delimiter in list = 1st char
$BufferLinesARR[] = $RegVarValue; // APPEND ACTUAL
$BufferLinesCount = count($BufferLinesARR);
$BufferLinesARR = array_slice($BufferLinesARR, -$BufferLinesMax);
$RegVarBufferVal = $BufferLinesDelimiter . implode( $BufferLinesDelimiter, $BufferLinesARR);
SetValue( $RegVarBufferID, $RegVarBufferVal);
Der Zugriff auf Werte erfolgt dann wie folgt:
- auslesen der BufferVariable
- $delimiter=substr( $var, 0, 1);
- $array = explode( $delimiter, $var);
Das erste Arr-Element ist dann natürlich leer, was hilft „menschlicher“ zu zählen (Start von Index=1). Wer’s klassisch haben will, nutzt noch zusätzlich
array_shift($array)
jwka