(wieder IPSLibary) IPS 7.0 - Skripte funktionieren nicht mehr

Hallo zusammen,

nach der Umstellung auf die Version 7.0 funktionieren einige meiner Skripte nicht mehr, speziell die Abfrage der Daten von meiner Phoenix Contact SPS ILC350PN. Folgend findet ihr mein Skript und die dazugehörige Fehlermeldung.

<?

//include(IPS_GetScriptFile(52434 ));
//
//$file = "pdd.csv";
//$delimiter = ",";

//$data_pdd = get2DArrayFromCsv($file,$delimiter);

// Anlegen der Variablen aus csv Datei
//$anzahl = count($data_pdd); // Anzahl der anzulegenden Variaben

// standard string append
//$str = '';
//for ($i = 1; $i < $anzahl; $i++) {
//	$str .= '<i><n>'.$data_pdd[$i][0].'</n></i>';
//}

//$xml_data = "<body><item_list>".$str."</item_list></body>";


$xml_data = GetValueString(30572   );
$anzahl = GetValue(54739  );


//$xml_data = 15888 ;
//$anzahl = 21730 ;

//<version>1.0</version><client>ILC_PDD</client><client_ver>0.01</client_ver><item_list_size>10</item_list_size>
$URL = "http://192.168.1.152/cgi-bin/ILRReadValues.exe";

			$ch = curl_init($URL);
			//curl_setopt($ch, CURLOPT_MUTE, 1);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
			curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$output = curl_exec($ch);
			curl_close($ch);
			//echo $output;

//Pass results to the SimpleXMLElement function

try{
$xml = new SimpleXMLElement($output);
//print_r($xml);
} catch (Exception $e) {
    echo $e;
    exit;
}

$parID = IPS_GetCategoryIDByName("HTTP", 0);


//Schleife zum Anlegen der Variablen
for($i=0; $i<($anzahl-1); $i++)

//$i=30;

    {

		$varName =  $xml->item_list[0]->i[$i]->n;
		$varWert =  $xml->item_list[0]->i[$i]->v;
		//echo $varWert;
		$varID = IPS_GetVariableIDByName((string)$varName, $parID);
			if ($varID === false)
 				echo "Objekt nicht gefunden!";
			else
 				//echo "Die Objekt-ID lautet: ". $varID;


			$varInfo = IPS_GetVariableCompatibility($varID);
			$varTyp = $varInfo["VariableType"];

			switch ($varTyp) {
    				case 0:

					if ($varWert == '0')
					{
					SetValueBoolean($varID, FALSE); // Boolean
					}

					if ($varWert  == '1')
					{
					SetValueBoolean($varID, TRUE); // Boolean
					}

				  	break;

					case 1:
        			SetValue($varID, (integer)$varWert); // Integer
        			break;

					case 2:
        			SetValue($varID, (float)$varWert); // Float
        			break;

				 	case 3:
        			SetValue($varID, (string)$varWert); // String
        			break;


					}

}
?>

Fehlermeldung:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function IPSLogger_PhpErrorHandler(), 4 passed and exactly 5 expected in C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 [internal function]: IPSLogger_PhpErrorHandler(2, 'Variable mit de...', 'C:\\ProgramData\\...', 67)
#1 C:\ProgramData\Symcon\scripts\14963.ips.php(67): IPS_GetVariableIDByName('ZENTRAL.Zentral...', 56209)
#2 {main}
  thrown in C:\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 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 91 and exactly 5 expected in C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(91): IPSLogger_PhpErrorHandler(8192, 'Function utf8_d...', 'C:\\ProgramData\\...', 91)
#1 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(506): IPSLogger_OutLog4IPS(1, 'Error', 'PHP', 'Error: Uncaught...')
#2 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php(39): IPSLogger_invokeLoggers(1, 'Error', 'PHP', 'Error: Uncaught...', '\n  134 in scrip...', 0)
#3 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php(134): IPSLogger_Out(1, 'Error', 'PHP', 'Error: Uncaught...')
#4 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php(33): IPSLogger_Err('PHP', 'Error: Uncaught...')
#5 C:\ProgramData\Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php(121): IPSLogger_PhpErrorHandler(1, 'Uncaught Argume...', 'C:\\ProgramData\\...', 24, NULL)
#6 [internal function]: IPSLogger_PhpFatalErrorHandler()
#7 {main}

Habe eine ähnlich Fehlermeldung im Forum gefunden und daraufhin auch die IPSLogger_PhpErrorHandler.inc.php angepasst, scheinbar ohne Erfolg. Kann mir evtl. jemand helfen oder einen Tipp geben?

Danke und schöne Grüße
Daniel

Du hättest vor dem Update von symcon die Migrationsanleitung lesen sollen, da steht das man vorher die IPSLibary updaten muss.

Jetzt kannst musst du erstmal per Hand den Logger anpassen und dann den Rest davon updaten:

Michael

Hallo Michael,

danke für den Hinweis, das mit dem Update habe ich natürlich überlesen…
Ich habe die Date IPSLogger_PhpErrorHAndler.inc.php nun folgend geändert:

<?
	/**@addtogroup ipslogger
	 * @{
	 *
	 * @file          IPSLogger_PhpErrorHandler.inc.php
	 * @author        Andreas Brauneis
	 * @version
	 * Version 2.50.1, 31.01.2012<br/>
	 *
	 * Script für PHP ErrorHandler
	 *
	 * Dieses Script dient zur Anbindung des PHP ErrorHandlers. Registriert wird das Script in PHP
	 * durch folgenden Eintrag in der Datei "php.ini" im Root Verzeichnis von IPS:
	 *
	 * <pre>auto_prepend_file="<<ReplacePathToIPSymcon>>\scripts\IPSLogger_PhpErrorHandler.ips.php"</pre>
	 *
	 * Mit der IPS Version 2.5 ist dieses File über die Datei "__autoload.php" zu registrieren, die
	 * bei jedem Script Aufruf automatisch geladen wird.
	 *
	 *	<pre>include_once "\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.ips.php";</pre>
	 *
	 */
	//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
		require_once "IPSLogger.inc.php";

		$ErrorDetails = c_lf."   Error in Script ".$FileName." on Line ".$LineNum;
		$FatalError   = false;
		switch ($ErrType) {
			case E_ERROR:
				IPSLogger_Err("PHP", 'Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_WARNING:
				IPSLogger_Err("PHP", 'Warning: '.$ErrMsg.$ErrorDetails);
				break;
			case E_PARSE:
				IPSLogger_Err("PHP", 'Parsing Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_NOTICE:
				IPSLogger_Err("PHP", 'Notice: '.$ErrMsg.$ErrorDetails);
				break;
			case E_CORE_ERROR:
				IPSLogger_Err("PHP", 'Core Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_CORE_WARNING:
				IPSLogger_Err("PHP", 'Core Warning: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_COMPILE_ERROR:
				IPSLogger_Err("PHP", 'Compile Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_COMPILE_WARNING:
				IPSLogger_Err("PHP", 'Compile Warning: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_USER_ERROR:
				IPSLogger_Err("PHP", 'User Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
			case E_USER_WARNING:
				IPSLogger_Err("PHP", 'User Warning: '.$ErrMsg.$ErrorDetails);
				break;
			case E_USER_NOTICE:
				IPSLogger_Err("PHP", 'User Notice: '.$ErrMsg.$ErrorDetails);
				break;
			case E_STRICT:
				$FatalError = true;
				IPSLogger_Err("PHP", 'Runtime Notice: '.$ErrMsg.$ErrorDetails);
				break;
			case E_DEPRECATED: 
				IPSLogger_Err("PHP", 'Deprecated: '.$ErrMsg.$ErrorDetails);
				break;
			default:
				IPSLogger_Err("PHP", 'Unknown Error: '.$ErrMsg.$ErrorDetails);
				$FatalError = true;
				break;
		}

		global $_IPS;
		if (array_key_exists('ERROR_COUNT', $_IPS)) {
			$errorCount=$_IPS['ERROR_COUNT'] + 1;
		} else {
			$errorCount=1;
		}
		$_IPS['ERROR_COUNT'] = $errorCount;

		// Abort Processing during "Abort Flag"
		if (array_key_exists('ABORT_ON_ERROR', $_IPS) and $_IPS['ABORT_ON_ERROR']) {
			exit('Abort Processing during Error: '.$ErrMsg.$ErrorDetails);
		// Abort Processing during "FATAL Error"
		} elseif ($FatalError) {
			exit('Abort Processing during Fatal-Error: '.$ErrMsg.$ErrorDetails);
		// Abort Processing during maximal Error Counter
		} elseif ($errorCount > 10) {
			IPSLogger_Err("PHP", 'Maximal ErrorCount exceeded for this Session --> Abort Processing');
			exit('Abort Processing during exceed of maximal ErrorCount: '.$ErrMsg.$ErrorDetails);
		} else {
			return false;
		}
	}

	//$old_error_handler = set_error_handler("IPSLogger_PhpErrorHandler",E_ALL);
	$old_error_handler = set_error_handler("IPSLogger_PhpErrorHandler",E_ALL ^ E_DEPRECATED);
	
	function IPSLogger_PhpFatalErrorHandler() {
		if (@is_array($e = @error_get_last())) {
			//print_r($e); echo "Reporting=".error_reporting()."\n";
			$code = isset($e['type']) ? $e['type'] : 0;
			$msg  = isset($e['message']) ? $e['message'] : '';
			$file = isset($e['file']) ? $e['file'] : '';
			$line = isset($e['line']) ? $e['line'] : '';
			switch($code) {
				case E_ERROR:
				case E_PARSE:
				case E_CORE_ERROR:
				case E_CORE_WARNING:
				case E_COMPILE_ERROR:
				case E_COMPILE_WARNING:
					IPSLogger_PhpErrorHandler ($code, $msg, $file, $line, null);
					break;
				default:
					break;
			}
		}
	}

	register_shutdown_function('IPSLogger_PhpFatalErrorHandler');

	/** @}*/
?>

Leider funktioniert das Skript dann immer noch nicht. Passen meine Änderungen überhaupt?

Danke für die Antwort.

Schöne Grüße
Daniel

Hi Zusammen,
auch wir haben nach dem Update auf V7.0 Probleme. Allerdings mit den Zusatzmodulen z. B. Backup und Anwesenheitssimulation. Gibt es mehrere User mit „Problemen“?

Fehlermeldung anbei:

atal error: Uncaught ArgumentCountError: Too few arguments to function IPSLogger_PhpErrorHandler(), 4 passed and exactly 5 expected in /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 [internal function]: IPSLogger_PhpErrorHandler(2, ‚ftp_chdir(): /B…‘, ‚/var/lib/symcon…‘, 82)
#1 /var/lib/symcon/modules/.store/de.symcon.backup/libs/FTP.php(82): ftp_chdir(Object(FTP\Connection), ‚/BackUp/symcon/…‘)
#2 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(332): FTP->is_dir(‚/BackUp/symcon/…‘)
#3 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#4 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#5 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#6 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#7 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#8 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#9 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(335): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon/…‘, ‚/var/lib/symcon…‘)
#10 /var/lib/symcon/modules/.store/de.symcon.backup/Backup/module.php(166): Backup->getDeletableFiles(Object(FTP), ‚/BackUp/symcon‘, ‚/var/lib/symcon‘)
#11 /var/lib/symcon/scripts/__generated.inc.php(163): Backup->CreateBackup()
#12 /-(3): SB_CreateBackup(40381)
#13 {main}
thrown in /var/lib/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 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_Output.inc.php on line 91 and exactly 5 expected in /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php:24
Stack trace:
#0 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_Output.inc.php(91): IPSLogger_PhpErrorHandler(8192, ‚Function utf8_d…‘, ‚/var/lib/symcon…‘, 91)
#1 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_Output.inc.php(506): IPSLogger_OutLog4IPS(1, ‚Error‘, ‚PHP‘, ‚Error: Uncaught…‘)
#2 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_Output.inc.php(39): IPSLogger_invokeLoggers(1, ‚Error‘, ‚PHP‘, ‚Error: Uncaught…‘, ‚\n 137 in IPSLi…‘, 0)
#3 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php(137): IPSLogger_Out(1, ‚Error‘, ‚PHP‘, ‚Error: Uncaught…‘)
#4 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php(33): IPSLogger_Err(‚PHP‘, ‚Error: Uncaught…‘)
#5 /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php(121): IPSLogger_PhpErrorHandler(1, ‚Uncaught Argume…‘, ‚/var/lib/symcon…‘, 24, NULL)
#6 [internal function]: IPSLogger_PhpFatalErrorHandler()
#7 {main}
thrown in /var/lib/symcon/scripts/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php on line 24

System läuft auf einem Pi4.
Programmierung über Prokonsole auf OSX.

Danke für euren Support.

VG

Du hast ein Problem mit der IPSLibary, und das haben alle welche nicht die Migrationsanleitung gelesen haben.
Ja, du bist somit nicht allein :wink:
Lösung steht in Beitrag 2.
Michael

1 „Gefällt mir“

Hi Michael,

in der Tat - das habe ich nicht gelesen. Danke für Dein Support und den Hinweis.
Nur wie gehe ich jetzt vor? Sorry bin wirklich ahnungslos.
Einfach den o. g. Beitrag in Symcon kopieren?

Danke für eine schnelle Rückmeldung.

Vg

Beitrag 2:

Kein Script kopieren, kein Copy & Paste.

Sondern hier lesen welche Dateien du ändern musst:
Jetzt kannst musst du erstmal per Hand den Logger anpassen und dann den Rest davon updaten:

Michael

Hi Michael,

Ok, vermutlich lag es am Copy-Paste Syndrom.
Habe den Logger geöffnet / das per CPS eingefügte gelöscht / gespeichert und das BackUp lief wieder durch.
Ich denke das war reines Glück.

Nur wie komme ich in den Logger - ist das tatsächlich, das Öffnen der Datei aus der ProConsole und dort bearbeiten?

VG und einen schönen Abend