IPS 7.0 und IPSLibrary

UPDATE:

Inzwischen wurden die Module der IPSLibrary von @Brownson für IPS 7.0 fit gemacht. Es sind nun keine manuellen Änderungen an den Modulen mehr notwendig.

Stattdessen sollten - vor einem Update auf 7.0 - die Module der Library aktualisiert werden.

Angepasst wurden:

  • IPSLogger 2.50.17
  • IPSTwilight 2.50.10
  • IPSHighcharts 2.50.13






VERALTET (oder wenn man die Änderungen manuell durchführen muss, weil mal zuerst auf Symcon Version 7.0 geupdatet hat):

Aktuell kommt es beim Einsatz der IPSLibrary noch zu Fehlern unter IPS 7.0

Bislang habe ich folgende Stellen abgeändert:

IPSLogger_PhpErrorHandler.inc.php:

	//function IPSLogger_PhpErrorHandler ($ErrType, $ErrMsg, $FileName, $LineNum, $Vars)
	function IPSLogger_PhpErrorHandler ($ErrType, $ErrMsg, $FileName, $LineNum) //$Vars entfernt
	{
		//if (error_reporting() == 0) {return false;}   // No Reporting of suppressed Erros (suppressed @)
		if (error_reporting() !== E_ALL ^ E_DEPRECATED) {return false;}   // No Reporting of suppressed Erros (suppressed by @), see https://www.php.net/manual/en/language.operators.errorcontrol.php#125938

...
			case E_DEPRECATED: 
				IPSLogger_Err("PHP", 'Deprecated: '.$ErrMsg.$ErrorDetails);
				break;
...
	}

...

	//$old_error_handler = set_error_handler("IPSLogger_PhpErrorHandler",E_ALL);
	$old_error_handler = set_error_handler("IPSLogger_PhpErrorHandler",E_ALL ^ E_DEPRECATED);


Hier gab es mehrere Probleme:

  • die Signatur der Funktion hat einen Parameter zu viel ($Vars),
  • E_DEPRECATED muss behandelt werden und
  • E_DEPRECATED muss beim error_handler deaktiviert werden.

IPSHighcharts.inc.php:

	function PopulateValue($val, $serie)
	{
		// Werte ersetzten (sinnvoll für Boolean, oder Integer - z.B.: Tür/Fenster-Kontakt oder Drehgriffkontakt)
		if ($serie['ReplaceValues'] != false)
		{
			//if (isset($serie['ReplaceValues'][$val])) 
			if (is_int($val) && isset($serie['ReplaceValues'][$val]))

Hier kam es zu einem Fehler wenn $val ein Float übergeben wurde
(„Abort Processing during exceed of maximal ErrorCount: Implicit conversion from float 0.06666666666666667 to int loses precision
Error in Script C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php on Line 839“)

	function GetContentVariableString($cfg, $callBy, $callIdent)
	{
...
	//$s = "<iframe src='./user/IPSHighcharts/IPSTemplates/$chartType.php?$callBy="	. $callIdent . "' " .
	$s = "<iframe src='/user/IPSHighcharts/IPSTemplates/$chartType.php?$callBy="	. $callIdent . "' " .

Notwendige Pfadanpassung für neue Visualisierung.

function CreateConfigFile($stringForCfgFile, $id, $charttype = 'Highcharts')
{
    //$path     = "webfront\user\IPSHighcharts\\" . $charttype;
    $path     = "user\IPSHighcharts\\" . $charttype;
    //to be compatible for older IPS versions (<7.0)
    if (file_exists(IPS_GetKernelDir() . 'webfront')) {
        $path = 'webfront\\' . $path;
    } 

Das Unterverzeichnis „webfront“ wurde aufgelöst

IPSTwilight.ips.php

//Zeile 365
//imagegif ($image, IPS_GetKernelDir().'media/'.$fileName.'.gif', 90);
imagegif ($image, IPS_GetKernelDir().'media/'.$fileName.'.gif');
//Zeile 477
//imagegif ($image, IPS_GetKernelDir().'media/'.$fileName.'.gif', 90);
imagegif ($image, IPS_GetKernelDir().'media/'.$fileName.'.gif');

Hier kam es unter PHP 8 zu einem ArgumentCountError.

IPSCam_Manager.class.php

Hier gibt es auch einige Stellen, bei denen das „webfront“ Verzeichnis genutzt wird. Das Modul setze ich aber nicht mehr ein.

2 „Gefällt mir“

Betrifft das auch das Modul?
Vielleicht wäre jetzt der der Zeitpunkt um auf das Modul zu wechseln.
Michael

Das kann ich nicht sagen.

Ich sehe gerade, dass es auch bei der Verwaltung der Library zu Problemen kommt. Z.B. kann ich mir nicht mehr anzeigen lassen, welche Module der Library alles im Einsatz sind :frowning:

Ich vermute, das gibt eine größere Baustelle. Zumal es zum Beispiel für IPSWatering und IPSHighCharts meines Wissens nach keinen Ersatz gibt.

Da müsste @Brownson etwas zu sagen, ob die Library 7.0 unterstützen wird. Ich befürchte aber, dass wenn nicht, der Abschied von der Library für viele eine große Hürde sein wird beim Umstieg auf 7.0

1 „Gefällt mir“

Hi,
Hatte das gleiche Problem siehe im Beta Bereich,

Habe die komplette Library entfernt.
Danach sind in anderen Modulen umfangreiche weitere Fehler aufgetaucht.

Bin dann wieder zurüc auf die 6.4

OhOh, das sind ja keine gute Aussichten. :unamused:
Ich setze das Bewässerungsmodul für das es kein Ersatz gibt.

Moin Bumaas,

ich schätze das ist das selbe Problem wie z.B. bei str_replace, d.h. automatic type conversion scheint meistens/immer nicht mehr zu gehen. Ich vermute mit strval($val) geht es.

Ralf

In dem Fall wurde in PHP 7automatisch in Integer gewandelt. Also

if (isset($serie['ReplaceValues'][(int) $val]))

ginge auch.

Ich bin soeben auf die 7.0 umgestiegen und bekomme die folgende Fehlermeldung:

27.05.2023, 20:14:15 | FlowHandler          | Kann Daten nicht zur Instanz #26811 weiterleiten: 
Fatal error: Uncaught ArgumentCountError: Too few arguments to function IPSLogger_PhpErrorHandler(), 4 passed in D:\Daten\ProgramData\Symcon\modules\.store\info.schnittcher.ips.shelly\ShellyPlug\module.php on line 34 and exactly 5 expected in D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 D:\Daten\ProgramData\Symcon\modules\.store\info.schnittcher.ips.shelly\ShellyPlug\module.php(34): IPSLogger_PhpErrorHandler(8192, 'Function utf8_d...', 'D:\\Daten\\Progra...', 34)
#1 C:\Windows\System32\-(3): ShellyPlug->ReceiveData('{"DataID":"{7F7...')
#2 {main}
  thrown in D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php on line 24

Fatal error: Uncaught ArgumentCountError: Too few arguments to function IPSLogger_PhpErrorHandler(), 4 passed in D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 91 and exactly 5 expected in D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(91): IPSLogger_PhpErrorHandler(8192, 'Function utf8_d...', 'D:\\Daten\\Progra...', 91)
#1 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(506): IPSLogger_OutLog4IPS(1, 'Error', 'PHP', 'Error: Uncaught...')
#2 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(39): IPSLogger_invokeLoggers(1, 'Error', 'PHP', 'Error: Uncaught...', '\n  137 in D:\\Da...', 0)
#3 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php(137): IPSLogger_Out(1, 'Error', 'PHP', 'Error: Uncaught...')
#4 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php(33): IPSLogger_Err('PHP', 'Error: Uncaught...')
#5 D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php(121): IPSLogger_PhpErrorHandler(1, 'Uncaught Argume...', 'D:\\Daten\\Progra...', 24, NULL)
#6 [internal function]: IPSLogger_PhpFatalErrorHandler()
#7 {main}
  thrown in D:\Daten\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php on line 24

Wobei es sich hier um MQTT Instanzen handelt.
Was werden hier noch für Infos benötigt ?

Du solltest die im ersten Post genannten Anpassungen in der IPSLogger_PhpErrorHandler.inc.php machen. Das sind die Ursachen für deine Fehlermeldungen.

1 „Gefällt mir“

Du bist der Beste - und das am Samstag Abend !
Schöne Grüße aus Linz !

Ich hab das erstmal so geloest :
function IPSLogger_PhpErrorHandler ($ErrType, $ErrMsg, $FileName, $LineNum=false, $Vars=false)

$Vars= false geht auch. Macht aber weniger Sinn, da $Vars gar nicht genutzt wird - weder beim Aufruf, noch bei der Verarbeitung.

Nur auf die Schnelle. Ohne zu checken ob nicht ein anderes Programm doch nicht einen 5 Parameter schickt.

Ich hatte leider noch keine Zeit mich mit der 7.0 und den Änderungen in PHP zu beschäftigen :open_mouth:

Nehme aber PULL Requests gerne entgegen :slight_smile:

1 „Gefällt mir“

Kurze Frage an diejenigen, die die Library unter 7.0 nutzen. Funktioniert Sie unter 7.0 mit Anpassungen? Hat jemand das Bewässerungsmodul und läuft es unter 7.0.
Vielleicht kann jemand Licht ins Dunkle bringen :slight_smile:

Die notwendigen Anpassungen habe ich im ersten Beitrag beschrieben.
Im Bewässerungsmodul waren keine Anpassungen notwendig.

1 „Gefällt mir“

Danke für die Info. Dann werde ich mal testen :slight_smile:

Hallo Burkhard,
Bei mir wirft er ein UTF-8 Fehler aus, wenn ich das Skript öffnen will.

Edit: Hat sich erledigt, habe das mit dem Utils Control die UTF-8 Fehler korrigiert.

ICh bekomme bei den Highcharts noch diesen Fehler

03.07.2023, 18:50:00 | ScriptEngine         | Result for Event 33193

Fatal error: Uncaught TypeError: sizeof(): Argument #1 ($value) must be of type Countable|array, bool given in C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php:1176
Stack trace:
#0 C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php(1161): AC_GetLoggedValuesCompatibility(54833, 40140, 1688076000, 1688421599, 0)
#1 C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php(1094): ReadAndAddToLoggedData(Array, 54833, 40140, -1, 1688076000, 1688421599, 'Value', Array)
#2 C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php(782): ReadDataFromDBAndCreateDataArray(Array, Array)
#3 C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php(711): CreateArrayForSeries(Array)
#4 C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php(196): GetHighChartsCfgFile(Array)
#5 C:\ProgramData\Symcon\scripts\HighChartsConfigStrom(318): CreateConfigString(Array)
#6 {main}
  thrown in C:\ProgramData\Symcon\scripts\IPSLibrary\app\modules\Charts\IPSHighcharts\IPSHighcharts.inc.php on line 1176