in IP-Symcon 2.5 funktioniert ownet.php nicht mehr

Hallo zusammen,
nach Umstallung auf 2.5 bekomme ich jetzt permanent folgenden Fehler:
Strict Standards: Only variables should be passed by reference in …\IP-Symcon\scripts\ownet.php on line …
Kann jemand helfen?

Quelle: Post von Brownsen

Die Variablen Übergabe per Reference ist mit der neuen PHP Version etwas strikter geworden. War es früher erlaubt das „&“ direkt beim Funktionsaufruf zu verwenden, so ist das jetzt nur mit in der Deklaration erlaubt.
Also falsch:


function test ($inout) {
  $inout='x';
}
$var = 'y';
test(&$var);
echo "Var=$var";

Erzeugt folgende Fehlermeldung:

Fatal error: Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of test().

Richtig:


function test (&$inout) {
  $inout='x';
}
$var = 'y';
test($var);
echo "Var=$var";

Hey,

bei umstellen auf 2.5 bin ich auch auf die fehlermeldung gestossen.

aufruf

$x = socket_select($r = array($this->mSocket), $w = array($this->mSocket), $f = array($this->mSocket), 5);

wäre dann die Umstellung auf Php5.4 so?

$r = array($this->mSocket);
$w = array($this->mSocket);
$f = array($this->mSocket);
$x = socket_select($r,$w,$f, 5);

Gruss Michael

Hallo Paresy,
Danke für die schnelle Hilfe, aber ich kann kein &$ im Skript finden. Einzig in der Zeile:
$ret[‚data_php‘]=&$ret[‚data‘]; (=& erzeugt einen Zeiger bzw. eine Referenz)
Der Fehler kommt immer bei der Funktion stream_select:
$num_changed_sockets = stream_select($read, $write = NULL, $except = NULL, $t1,$t2); // use stream_select
Vielleicht hat sich etwas an der Funktion geändert?

Hallo,
ich konnte mir erst einmal so behelfen:

In __autoinclude.inc.php habe ich folgende Zeilen hinzugefügt:

ini_set(‚display_errors‘, ‚0‘); # don’t show any errors…
error_reporting(E_ALL | E_STRICT); # …but do log them

Hab das im Inet gefunden und es kommen nun keine Meldungen mehr.
Vielleicht gibt es auch noch andere Lösungen?

Hallo,

nach dem Update auf IPS 2.5 hatte ich auch dei Warnmeldungen mit der OWNET.PHP. Ich habe etwas gesucht und zwei kleine Änderung in der OWNET.PHP eingebaut, seitdem habe ich keine Warnmeldungen mehr.
Die von mir genutzte OWNET.PHP hat die Version „VERSION: 2007.01.11 - 17:05 BRST“
Hier die Änderung:
Original Zeile 270-276:

		while ($num_changed_sockets<=0){	// can loop forever? owserver must send something! or disconnect!
			$read=array($this->link);
			if ($this->link_type==OWNET_LINK_TYPE_SOCKET)
				$num_changed_sockets = socket_select($read, $write = NULL, $except = NULL, $t1,$t2);	// use socket_select
			else
				$num_changed_sockets = stream_select($read, $write = NULL, $except = NULL, $t1,$t2);	// use stream_select
			if ($num_changed_sockets===false){	// error handling select

Neue Version:

		while ($num_changed_sockets<=0){	// can loop forever? owserver must send something! or disconnect!
			$read=array($this->link);
			if ($this->link_type==OWNET_LINK_TYPE_SOCKET){
				$write = NULL;
				$except = NULL;
				$num_changed_sockets = socket_select($read, $write, $except, $t1,$t2);	// use socket_select
			}
			else {
				$write = NULL;
				$except = NULL;
				$num_changed_sockets = stream_select($read, $write, $except, $t1,$t2);	// use stream_select
			}
			if ($num_changed_sockets===false){	// error handling select

und ein 2. mal Original Zeile 312-318

		while ($num_changed_sockets<=0){
			$write=array($this->link);
			if ($this->link_type==OWNET_LINK_TYPE_SOCKET)
				$num_changed_sockets = socket_select($read = NULL, $write , $except = NULL, 0,1000);	// use socket_select
			else
				$num_changed_sockets = stream_select($read = NULL, $write , $except = NULL, 0,1000);	// use stream_select
			if ($num_changed_sockets===false){		// error handling

Neue Version:

		while ($num_changed_sockets<=0){
			$write=array($this->link);
			if ($this->link_type==OWNET_LINK_TYPE_SOCKET){
				$read = NULL;
				$except = NULL;
				$num_changed_sockets = socket_select($read, $write, $except, 0,1000);	// use socket_select
			}
			else {
				$read = NULL;
				$except = NULL;
				$num_changed_sockets = stream_select($read, $write, $except, 0,1000);	// use stream_select
			}
			if ($num_changed_sockets===false){		// error handling

Vielleich hilft es dem einen oder anderen ja noch.

Gruß
Helmut

HI,

hehe
Vielen dank, deine Änderungen kommen wie gerufen. Ich habe aber folgendes Problem, ich muss mein Script zweimal aufrufen, da beim ersten mal immer „null“ ankommt.

Das script sieht so aus:

<?
require_once "..\\webfront\\user\\ownet.php";
$ow=new OWNet("tcp://192.168.0.8:4304");
print_r($ow->read("/10.3DD1B0010800/temperature"));
?>

Ich klick also auf „ausführen“ und es passiert nichts, drücke ich danach nochmal ausführen, kommen die Werte.

Ich habe versucht mal ein IPS_SLEEP einzusetzen, da passiert aber nichts.

ich starte meinen owserver unter Linux und mittels upstart so:

/usr/bin/owserver --passive=/dev/ttyS0 -p 4304 --error_level=5 --foreground

Hat wer eine Idee, was da schief läuft?

mfg
kris

Hi,

ich habe einen kleinen workaround für mein Problem, ich lese die Daten bei dem Wert 0 einfach nochmal aus.

Das Gesamte Script ist anbei, es liest rekursiv alle Seriennr. (welches in der Beschreibung der Variablen stehen müssen) aus, und schreibt die Temperatur in die Variablen.

<?

include(IPS_GetKernelDir().'webfront/user/ownet.php');
$ow=new OWNet("tcp://192.168.0.8:4304");

foreach(IPS_GetChildrenIDs($IPS_SELF) as $item){
    $id_info = IPS_GetObject($item);
    $id_typ = $id_info['ObjectType'];
    $id_varid = $id_info['ObjectID'];
    if ($id_typ == 2){
        $id_serial = $id_info['ObjectInfo'];
		  $id_temp=($ow->read("/".$id_serial."/temperature"));
		  if ($id_temp == 0){
		      $id_temp=($ow->read("/".$id_serial."/temperature"));
		   	}
     				SetValueFloat($id_varid,$id_temp);
				//echo "Serial: ".$id_serial." Temp:".$id_temp." Var:".$id_varid." 
"; // Testdaten ausgeben.
			}
}
unset($ow)

?>

Kleines Howto:

  1. erstellt euch eine Kategorie 1-Wire (optional)
  2. erstellt euch ein neues Script und fügt obiges ein, beachtet, das Ihr die ownet.php benötigt (im ownet-Packages enthalten) und das diese wie von „hehe“ beschrieben verändern müsst (ab IP-Symcon v.2.5)
  3. erstellt euch eine Variable pro Sensor unterhalb des scriptes
    Typ: Float, Eigenes Profil: ~Temperature. Im nächsten Schritt könnt Ihr den Namen eingeben (bspw.Wohnzimmer), bei der Beschreibung muss nun die Seriennr. des Sensors rein.

mfg
kris

Hallo,

ich hol den Thread mal nach oben.
Vielen Dank für die Anpassungen an der ownet CLass. Es funktioniert damit auch in IPS 2.7.

Aber auch bei mir kommt oft eine null zurück.
Ich habe nun schon eine Schleife programmiert, und frage jeden Sensor mehrfach ab. Aber das hilft nur begrenzt.

Hat jemand noch eine Idee, wie man das machen könnte, bzw. woran es liegt?

Gruß
Christian