Geht so eine Function ?

Hallo zusammen,

ich versuche gerade eine Function die, die IPS Veriablen als String bekommt
und anschliessend die folgenden Operationen ausführt.

  function T_Mittelwert($F_Trend, $Sensor, $Trend_neu, $Trend_Alt, $Trend ){
  /* $F_Trend Parameter -2,-1,0,1,2 */
  /* $F_Trend_Neu erhält wird auf aktuellen Wert gesetzt nach der Trendberechnung*/
  /* $F_Trend_Alt erhält den neuen Trendwert */
  /* Name des Temeparatur Sensors */

  $Schranke  = GetValueFloat("$F_Trend");
  $Mittelwert1 = GetValueFloat("$Trend_Neu") / $Anzahl;
  $Mittelwert2 = GetValueFloat("$Trend_Alt");
  $Trend = T_Trend ($Mittelwert1, $Mittelwert2, $Schranke);
  SetValueInteger("$Trend", $Trend);
  SetValueFloat("$Trend_Alt", $Mittelwert1);
  $Mittelwert1 = GetValueFloat("$Sensor");
  SetValueFloat("$Trend_Neu", $Mittelwert1);
  Return;
  }

Der aufruf sieht dann so aus:

T_Mittelwert ("F_Trend", "Temp_Sensor1", "Temp_Sensor_1_Neu", "Temp_Sensor_1_Alt", "Temp_Sensor_1_Trend");

Beim ausführen bekomme ich folgende Fehlermeldung

Siehe Bild

allen IPS Freunden ein frohes, gesundes und erfolgreiches Jahr 2008.

LG Manfred

Was mir auffällt:

Wenn $trend das Ergebniss sein soll, sollte es von der Funktion zurückgegeben werden (return $Trend; ) und nicht als Parameter übergeben werden. So funktioniert das nicht (Stichwort „call by value“).
2.
Die Stringvariablen müssen nicht noch einmal in Anführungszeichen gepackt werden,GetValueFloat($F_Trend); reicht.
3.
$Trend ist doppelt belegt, einmal als Wert und einmal als Variablenname
SetValueInteger("$Trend", $Trend);

Tommi

Hallo Tommi,
danke für die Antwort. Den Doppelten gebrauch der Veriable habe ich
zwischen durch auch gefunden.

Die Function ist etwas untypisch, da sie keinen Return Parameter hat.
Ich hatte mir das ausgedacht um nicht für jeden Sensor eine Menge
Code erzeugen zu muessen. Die Ergebnisse werden in der Funktion in die
IPS Variablen geschrieben. Was ja nicht ganz und sinn und zweck einer Function ist, aber function ohne Return Parameter sind zulässig in PHP laut meinen Unterlagen.

Es kann eigentlich nur sein, das die Parameter nicht mit Strings vorbesetzt sind, wenn es in die Function geht.

 function T_Mittelwert($F_Trend, $Sensor, $Trend_neu, $Trend_Alt, $Trend_Sensor ){
  /* $F_Trend Parameter -2,-1,0,1,2 */
  /* $F_Trend_Neu erhält wird auf aktuellen Wert gesetzt nach der Trendberechnung*/
  /* $F_Trend_Alt erhält den neuen Trendwert */
  /* Name des Temeparatur Sensors */

  $Schranke  = GetValueFloat($F_Trend);
  $Mittelwert1 = GetValueFloat($Trend_Neu) / $Anzahl;
  $Mittelwert2 = GetValueFloat($Trend_Alt);
  $Trend = T_Trend ($Mittelwert1, $Mittelwert2, $Schranke);
  SetValueInteger($Trend_Sensor, $Trend);
  SetValueFloat($Trend_Alt, $Mittelwert1);
  $Mittelwert1 = GetValueFloat($Sensor);
  SetValueFloat($Trend_Neu, $Mittelwert1);
  Return;
  }

Ich habe es mal so geaendert, aber noch ohne erfolg.
Was ich damit ersetzten will ist der folgende Code:

$Mittelwert1 = GetValueFloat("Temp_Sensor_1_Trend_Neu") / $Anzahl;
  $Mittelwert2 = GetValueFloat("Temp_Sensor_1_Trend_Alt");
  $Trend = T_Trend ($Mittelwert1, $Mittelwert2, $Schranke);
  SetValueInteger("Temp_Sensor_1_Trend", $Trend);
  SetValueFloat("Temp_Sensor_1_Trend_Alt", $Mittelwert1);
  $Mittelwwert1 = GetValueFloat("Temp_Sensor_1");
  SetValueFloat("Temp_Sensor_1_Trend_Neu", $Mittelwert1);
  
  $Mittelwert1 = GetValueFloat("Temp_Sensor_2_Trend_Neu") / $Anzahl;
  $Mittelwert2 = GetValueFloat("Temp_Sensor_2_Trend_Alt");
  $Trend = T_Trend ($Mittelwert1, $Mittelwert2, $Schranke);
  SetValueInteger("Temp_Sensor_2_Trend", $Trend);
  SetValueFloat("Temp_Sensor_2_Trend_Alt", $Mittelwert1);
  $Mittelwwert1 = GetValueFloat("Temp_Sensor_2");
  SetValueFloat("Temp_Sensor_2_Trend_Neu", $Mittelwert1);
  
  $Mittelwert1 = GetValueFloat("Temp_Sensor_3_Trend_Neu") / $Anzahl;
  $Mittelwert2 = GetValueFloat("Temp_Sensor_3_Trend_Alt");
  $Trend = T_Trend ($Mittelwert1, $Mittelwert2, $Schranke);
  SetValueInteger("Temp_Sensor_3_Trend", $Trend);
  SetValueFloat("Temp_Sensor_3_Trend_Alt", $Mittelwert1);
  $Mittelwwert1 = GetValueFloat("Temp_Sensor_1");
  SetValueFloat("Temp_Sensor_3_Trend_Neu", $Mittelwert1);

Das sind gerade mal 3 Temp Sensoren, ich vermute mal im Endstation sind es 10 - 20 und da wollte ich mir diese Zeilen sparen und durch diese ersetzen

function T_Mittelwert("F_Trend", "Temp_Sensor_1", "Temp_Sensor_1_Neu", "Temp_Sensor_1_Alt", "Temp_Sensor_1_Trend" );

Für mich ist nur wichtig zu wissen, ob so was funktioniert im IPS PHP Interpreter.

@ Forum
Wie löst ihr solche Probleme ?

LG Manfred

Hallo,

auf keinen Fall so, dass ich den ganzen Variablen-Krempel in die IPS Variablen reinpacke. Kein Wunder, wenn dann Deine Settings.xml masslos gross wird. Ich speichere nur die Variablen in IPS ab, die ich dort auch fuer Instanzen tatsaechlich benoetige. Alles andere wird extern in Arrays gehalten - das ganze ist dadurch sehr variablel, flexibel und aeusserst schnell.

Beispiele sind in alle Modulen von WIIPS zu finden, in function.ips.php die dazugehoerige Funktion zum schreiben eines solchen Arrays nach der Aenderung von Werten.

Zum Usertreffen kann ich das ganze gern mal detailliert erklaeren, wie es funktioniert, musst Dich halt nur dafuer auch anmelden.

Gruss Torro

Hallo Torro,

die function arbeitet jetzt, der Hauptfehler war, das ich das wort function
vor die Function gesetzt hatte.
Der Einfachheit hatte ich mir den Functionkopf kopiert und die Variablen geändert.

Ich werde mich mal mit der von Dir genannten Methode beschäftigen.

Vermutlich, werde ich nicht zum User treffen kommen, aber wer weiss.

Danke für den Hinweis.

LG Manfred