Unerklärlicher Fehler

Guten Morgen,

ich schreibe gerade an einem Modul und erhalte interessanterweise einen Fehler, den ich mir nicht erklären kann. Hier der Code

Und hier der Fehlercode.

Das interessante daran ist, dass die Funktion alle 10 Sekunden aufgerufen wird, der Fehler aber nur bei jedem zweiten Mal auftaucht. #52127 ist die ID der Modulinstanz selbst. Ich verstehe halt nicht, wie die Funktion hexdec diesen Fehler auslöst?

Lass dir doch mal mit IPS_LogMessage ausgeben, was in $Data drin ist. Da sind bestimmt jedes 2. Mal Zeichen dir, die nicht Hexadezimal dekodiert werden können.

paresy

Ja, der Splitter liefert da in der Tat gelegentlich Datenmüll. Kann ich das irgendwie unterbinden bzw. den Fehler abfangen, damit der mir nicht das Log zumüllt.

Klassisches IPSmodule oder IPSModuleStrict als Basisklasse?
Und was für ein Patent benutzt du? Bzw. welches Typ vom Datenfluss?
Michael

Ja ist klassisches IPSModule einfach erweiterst so wie es in der Doku steht. Die Daten kommen von einem Modbus-Splitter.

class Seplos extends IPSModule

Der Splitter schiebt einfach nur durch, weshalb ich mal davon ausgehe, dass der nicht die Ursache für die fehlerhaften Zeichen ist.

{
    "id": "{1A6A3230-2612-DA0C-9E5E-D008DBB316F7}",
    "name": "SeplosSplitter",
    "type": 2,
    "vendor": "Seplos",
    "aliases": ["Seplos Splitter"],
    "parentRequirements": ["{79827379-F36E-4ADA-8A95-5F8D1DC92FA9}"],
    "childRequirements": ["{FB6BD06E-1499-1676-AB5F-3FB88C340926}"],
    "implemented": ["{018EF6B5-AB94-40C6-AA53-46943E824ACF}", "{FC9EF969-7AD6-D032-7BCE-C927A6ED6FB4}"],
    "prefix": "SEPLS"
}

die module.php vom Splitter

class SeplosSplitter extends IPSModule
{

    public function Create()
    {
	//Never delete this line!
        parent::Create();
		
		//These lines are parsed on Symcon Startup or Instance creation
        //You cannot use variables here. Just static values.
		$this->RequireParent("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); //  I/O
    }

    public function ApplyChanges()
    {
	//Never delete this line!
        parent::ApplyChanges();
       
    }
    
    // Data an Child weitergeben
    // Type String, Declaration can be used when PHP 7 is available
    //public function ReceiveData(string $JSONString)
	public function ReceiveData($JSONString)
	{
	 
		// Empfangene Daten vom I/O
		$data = json_decode($JSONString);
		$dataio = json_encode($data->Buffer);
		$this->SendDebug("Splitter ReceiveData:",$dataio,0);
			
		// Hier werden die Daten verarbeitet
		
	 
		// Weiterleitung zu allen Gerät-/Device-Instanzen
		$this->SendDataToChildren(json_encode(Array("DataID" => "{FB6BD06E-1499-1676-AB5F-3FB88C340926}", "Buffer" => $data->Buffer))); // Splitter Interface GUI
	}
	
	// Type String, Declaration can be used when PHP 7 is available
    //public function ForwardData(string $JSONString)
    public function ForwardData($JSONString)
	{
	 
		// Empfangene Daten von der Device Instanz
		$data = json_decode($JSONString);
		$datasend = $data->Buffer;
		$datasend = json_encode($datasend);
		$this->SendDebug("Splitter Forward Data:",$datasend,0);
			
		// Hier würde man den Buffer im Normalfall verarbeiten
		// z.B. CRC prüfen, in Einzelteile zerlegen
		
		// Weiterleiten zur I/O Instanz
		$result = $this->SendDataToParent(json_encode(Array("DataID" => "{79827379-F36E-4ADA-8A95-5F8D1DC92FA9}", "Buffer" => $data->Buffer))); // TX GUI
			
		return $result;
	 
	}
}

Ich hab den Code im eigentlichen Modul mal umgeschrieben, so dass er die Daten vorab auf korrekte Länge prüft. Da kommt der Fehler nur noch ganz sporadisch.

Das sind Rohdaten vom Client Socket.
Das sind binäre Daten, die musst du noch mit utf8_decode verarbeiten.
Ist hier im Beispiel auch so zu sehen:

Michael

Hallo Michael,

ich hatte mir den Code für die ReceiveData in der Geräteinstanz aus einem anderen Modul herauskopiert und das sah so aus.

		$receive = json_decode($JSONString);
		$Data = $receive->{'Buffer'};

Das geht also demzufolge so nicht und ich müsste das so umbauen?

		$receive = json_decode($JSONString);
		$Data = utf8_decode($receive->Buffer);