Das Skript soll den String der von einem ESP8266 mit ESPEASY kommt zerlegen und die jeweiligen Variablen verändern.
Das klappte bisher so und aktuell funktioniert es auch, nur leider kommen nun diese meldungen.
laut Google heisst die Meldung, dass mein String angeblich zu lange ist… ???
wie jetz auf einmal?
Hat eine der funktionen strpos, strlen, oder substr seit PHP7.2 eine veränderte Funktion?
Dein String ist zu kurz.
Ob sich da etwas geändert hat, weiß ich gerade nicht.
Aber ich hätte das nie per Hand zerlegt.
Es gibt dafür fertige Funktionen in PHP. PHP: parse_str - Manual
Michael
Leider habe ich einen Wert: namens „swichtcmd=“ und dieser gibt „On“ oder „Off“ zurück.
GET /json.htm?type=command¶m=switchlight&idx=44&switchcmd=Off&rssi=9 HTTP/1.1<CR><LF>Host: 192.168.XXX.XXX<CR><LF>Connection: close<CR><LF><CR><LF>
bei der versuchten rückgrabe mit
echo "Wert Switchcmd: ".$output["switchcmd"]."
";
bekomme ich zurück:
<br />
<b>Notice</b>: Undefined index: switchcmd in <b>/var/lib/symcon/scripts/25363.ips.php</b> on line <b>13</b><br />
Wert Schalter:
<br />
Imho geht das nur mit dem eigentlichen Query. Den Rest musst du entfernen.
Hier kann man den Query-String mit extrahieren. PHP: parse_url - Manual
Um an die URL zu kommen gibt es bestimmt auch andere Wege, aber um den Teil zwischen GET und das HTTP/1.1 zu kommen würde ich einfach str_split auf ein Leerzeichen nutzen.
Michael
ich häng mich hier auch mal dran. Habe selbiges Problem seit der Umstellung auf IPS 5.0. Nur frage ich keinen Switch ab sondern lasse mir Werte (Temp & Luftdruck) in Variablen ausgeben.
Hier die Meldung
27.08.2018, 10:30:21 | PHP | Error: Warning: strpos(): Offset not contained in string
Error in Script /var/lib/symcon/scripts/19796.ips.php on Line 17
134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
37 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
in IPSLogger_PhpErrorHandler
17 in 19796.ips.php (call strpos)
Hier das Skript
<?
if ($_IPS['SENDER'] == 'RegisterVariable'){
$data = $_IPS['VALUE'];
$Prefix1 = "&idx="; // damit fängt der Datensatz an
$Suffix1 = "&";
$Prefix2 = "&svalue="; // damit fängt der Datensatz an
$Suffix2 = "HTTP/1.1";
$Prefix3 = "&switchcmd="; // damit fängt der Datensatz an
$Suffix3 = "HTTP/1.1";
//$Ende1nachZeichen = 2; // und ist xx Zeichen lang
$AnfangID = strlen($Prefix1)+(strpos($_IPS['VALUE'], $Prefix1));
$EndeID = strpos($_IPS['VALUE'], $Suffix1, $AnfangID+1);
$ID = substr($_IPS['VALUE'], $AnfangID, $EndeID-$AnfangID);
$AnfangValue = strlen($Prefix2)+(strpos($_IPS['VALUE'], $Prefix2));
$EndeValue = strpos($_IPS['VALUE'], $Suffix2, $AnfangValue);
$Value = substr($_IPS['VALUE'], $AnfangValue, $EndeValue-$AnfangValue-1);
switch ($ID) {
case "31":
$aValue=explode(";", $Value);
SetValueFloat(55241, $aValue[0]);
SetValueFloat(21966, $aValue[1]);
SetValueFloat(27266, $aValue[3]);
break;
case "32":
$aValue=explode(";", $Value);
SetValueFloat(26720, $aValue[0]);
break;
}
}
?>
Der String sieht so aus
27.08.2018, 10:31:13 | RECEIVED [192.168.xxx.xxx:2901] | GET /json.htm?type=command¶m=udevice&idx=31&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>
Okay, ein ESP hat 2 Sensoren angeschlossen ID 31 und ID 32(hier muss also schon unterschieden werden). Der ESP sendet im Intervall die unten stehenden Strings Richtung IPS an einen Server Socket mit Register Variable. Die Werte im String nach „svalue=“ ändern sich somit auch. Die Daten der RegVar werden abgefragt und in den entsprechenden Variablen gespeichert.
Korrekte Werte werden ja noch geliefert aber seit IPS 5.0 eben mit Warnung im Log.
GET /json.htm?type=command¶m=udevice&[b]idx=31[/b]&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF
GET /json.htm?type=command¶m=udevice&[b]idx=32[/b]&svalue=23.25 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>
Der TE hat das gleiche Skript, wie ich auch, hier aus dem Forum in Verwendung und Nall-chan meinte der String sei zu kurz.
Zu deinem Problem überhaupt. Lies dir mal das durch, vielleicht kommst Du ja drauf. Wenn der Offset nicht exsitent ist kommt es zu solch einer Meldung. PHP: strpos - Manual
Wenn in ID 32 immer der gleiche String vorhanden ist, kannst Du auch ohne explode direkt auswerten!
So kommen die Daten rein und „idx“ ist doch auch im String vorhanden. Keine Ahnung warum er das nicht kennt?
ID31
GET /json.htm?type=command¶m=udevice&idx=31&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF
oder für ID32
GET /json.htm?type=command¶m=udevice&idx=32&svalue=23.25 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>
Die beiden geposteten Strings waren aus dem Debug kopiert und mehr kommt da auch nicht
Okay, jeweils der gleiche String für Received, Connected, Processed, Disconnected aber das war dann auch.
Schön, wäre es ja wenn Du jetzt verstanden hast warum die/der Fehler auftritt auch der TE.
PHP 7 ist da strenger geworden. Das ganze Script hat quasi nie richtig funktioniert, weil einfach Regeln die vorgegeben sind von PHP nicht eingehalten wurden.
strpos gibt es schon ewig und auch mit der selben Prüfung.
Man sollte wenn man etwas kopiert zumindest versuchen warum es so funktioniert oder auch nicht. Da ist die PHP Bibel nun mal das A&O.
Im Endeffekt hat das ganze absolut nix mit der Umstellung auf IPS V5 zutun.
Du kannst auch gerne noch mal ein else dran hängen.
Also, das Problem lag tatsächlich daran, dass der ESP immer wieder „leere“ oder unvollständige nachrichten geschickt hat, und PHP 7 (wie vorher schon erwähnt) hier strenger geworden ist.
Ich wollte es dann auch mit dem Verkürzten Skript basteln, habs aber nicht hin bekommen :mad:
Hab das ganze dann sein lassen, da ich nun prüfe ob „IDX“ vorhanden ist. wenn nicht, dann breche ich die Scriptausführung ab.
Danke für eure hilfen, ich werden nun auch auf das kurze Sript versuchen ein zu binden.
Ich hänge mich mal an das Thema: PHP Probleme nach Update auf 5.0 dran.
Obwohl ich vorsichtig war und erst mal die Raspis ohne Probleme auf die 5.0 upgedated habe, orakelt das Log auf meinen Win7 Haupt-Server nach dem Update mit einer Flut von Warnungen:
Typ 1+2:
29.08.2018 00:10:10 | 39366 | WARNING | ScriptEngine | Ergebnis für Skript 39366
<br />
<b>Deprecated</b>: Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpc_client has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>730</b><br />
<br />
<b>Deprecated</b>: Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcresp has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>1624</b><br />
<br />
<b>Deprecated</b>: Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcmsg has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>1756</b><br />
<br />
<b>Deprecated</b>: Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcval has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>2275</b><br />
<br />
<b>Warning</b>: count(): Parameter must be an array or an object that implements Countable in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>2195</b><br />
Typ 2+3 :
29.08.2018 01:42:39 | 57936 | WARNING | ScriptEngine | Ergebnis für Skript 57936
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>: A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>354</b><br />
<br />
<b>Warning</b>: Variable has no profile assigned in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>277</b><br />
Bekrittelt werden Skripte, die ich schon seit mindestens 3 Jahren nicht mehr angefasst habe und bisher problemlos durchliefen.
Selbstverständlich werde ich allen Beanstandungen nachgehen, aaaber:
Gibt es im PHP-Setting einen Switch, der diese Warnungsflut erst mal vorerst abstellt ?
@T30: Du musst diese Skripte anpassen, da diese nicht mehr mit PHP7 kompatibel sind. Google mal die jeweiligen Fehlermeldungen - es sind immer nur „kleine“ Handgriffe nötig, um die Fehlermeldungen weg zu bekommen.