Skript läuft unter IPS 2.6 aber nicht unter 3.1

Hallo,

mir wurde geholfen ein Skript zur Abfrage einer Empfangenen SMS aus einem Mobile-Baustein zu realisieren. Zur Programmierung haben wir ein Notebook benutzt auf dem leider noch ein älteres IPS installiert ist, ich glaube ist 2.6.

Nun hab ich das Skript und die Variable auf meinem 3.1 System eingerichtet, und…:eek: …geht nicht.

Ich vermute es liegt an dem if ($IPS_VALUE{0} == ‚+‘) //wenn an erster stelle ein „+“ - finde aber nicht wie es anders geht.

$jahrhundert = 20;

$Arbeitsspeicher = getValueString(22697 /*[Objekt #22697 existiert nicht]*/ );  //hole Zustand von Variable - ist gerade an oder aus?

if ($IPS_VALUE{0} == '+')
//if(isset($IPS_VALUE) && (substr($IPS_VALUE,0,1) == '+'))
{
  $response = substr($IPS_VALUE,0,5);

  switch($response)
  {
    case "+CMTI":
		 // Neue SMS eingegangen
		 // Z.B. +CMTI: "ME",1
		 // Auslesen mit AT+CMGR=1
		 $nachricht = "";
		 $nachricht = trim(substr($IPS_VALUE,12,2));
		 echo "Nachricht: ".$nachricht."
";
		 COMPort_SendText(49891 /*[Serial Port 08 / 3-7a RFID]*/ , "AT+CMGR=".$nachricht."
");
		 IPS_Sleep (500); // Warte auf '>' Antwort vom Modem
		 COMPort_SendText(49891 /*[Serial Port 08 / 3-7a RFID]*/ , "AT+CMGD=".$nachricht."
");
		 
		 
//		 IPS_Sleep (500); // Warte auf '>' Antwort vom Modem
		 break;
	 case "+CMGR":
	   // SMS lesen
#echo "MSG Beginn
";
	   if($Arbeitsspeicher == "") //ist Variable leer
		{
	   	$Arbeitsspeicher = $IPS_VALUE;
	   	SetValueString(22697 /*[Objekt #22697 existiert nicht]*/,$Arbeitsspeicher);
	   }
#echo $Arbeitsspeicher."
";
	   
	   break;
	 default:
	 //Wenn kein case zutrifft
echo "default 
";
	   break;
  }//switch
}//if
elseif(substr($IPS_VALUE,0,3) != "AT+")
//dann wenn IPS_VALUE ersten 3 zeichen nicht AT+ sind, mache hier weiter
{
   $Arbeitsspeicher .= $IPS_VALUE;
//   $Arbeitsspeicher = $Arbeitsspeicher.$IPS_VALUE; lang IPS_value angehangen an dem was im Arbeitsspeicher schon steht
	SetValueString(22697 /*[Objekt #22697 existiert nicht]*/,$Arbeitsspeicher);
#echo "MSG weiter
";
#echo $Arbeitsspeicher."
";
	if(substr($Arbeitsspeicher,-4,4)== "OKOK")
	//wenn okok, dann ende der nachricht
	{
#echo "MSG ende
";
	   //+CMGR: "REC UNREAD","+49199999999",,"15/1/19,16:18:25+04"NachrichtOKOK
			$len = strlen($Arbeitsspeicher);
			$string = substr($Arbeitsspeicher,21); //SMS ohne Anfangsquark
			$posRufnummerEnde = strpos($string,"\"");
		$rufnummer = substr($string,0,$posRufnummerEnde);
			$string = substr($string,$posRufnummerEnde+1); //SMS ohne Anfangsquark und Rufnummer
			$posDatumStart = strpos($string,"\"")+1;
			$string = substr($string,$posDatumStart); //SMS ohne Anfangsquark und Rufnummer und Zwischengedoens
			$posDatumEnde = strpos($string,"\"", $posDatumStart);
		$datum = substr($string,0,$posDatumEnde);
		   $string = substr($string,$posDatumEnde+1); //SMS ohne Anfangsquark und Rufnummer und Zwischengedoens und Datum
		$nachricht = substr($string,0,strlen($string)-4);
		
		// Datum aufteilen
		//           1             character position 10er
		// 01234567890123456789    character position 1er
		// 15/01/20,16:18:25+04    datumstring
		$tag = substr($datum,6,2);
		$monat = substr($datum,3,2);
		$jahr = substr($datum,0,2);
		$std = substr($datum,9,2);
		$min = substr($datum,12,2);
		$sec = substr($datum,15,2);
		$addon = substr($datum,18,2);
#echo $std."
";
#echo $min."
";
#echo $sec."
";
#echo $addon."
";

echo "
SMS empfangen am ".$tag.".".$monat.".".$jahrhundert.$jahr." um ".$std.":".$min.":".
				$sec." von ".$rufnummer." mit dem Inhalt: ".$nachricht."
";

		//Vriablen leeren
	   SetValueString(22697 /*[Objekt #22697 existiert nicht]*/,"");
	   $rufnummer = $datum = $nachricht = $tag = $monat = $jahr = $std = $min = $sec = $addon = ""; //dies wird eigendlich nicht benötigt
	}

}//else
?>

Habt Ihr ne Lösung für die Abfrage oder eine Idee ob es wo anders dran liegt?

Danke

Jan

Moin Jan,

fang mal mit $_IPS[‚VALUE‘] anstatt $IPS_VALUE an :wink: und wenn das nicht hilft, welche Fehlermeldung in welcher Zeile?

Die „neue“ Schreibweise der Systemvariablen gilt schon ein paar Jahre.

Und $IPS_VALUE{0} gibt es nicht, Alternative wäre z.B. substr, das nutzt du ja zwei Zeilen tiefer.

Hi Jan!

An mehreren Stellen steht in deinem Skript „22697 /[Objekt #22697 existiert nicht]/“, sollte das aktuell sein, dann ist das sicher auch ein Problem :slight_smile:

@Ralf: Dieses in geschweiften Klammern funktioniert schon. Siehe Test-Skript, welches „OK“ ausgibt.

<?
$test = "12345";

if ($test{2} == 3) {
	echo "OK";
}
?>

Grüße,
Chris

Ja, „geht nicht“ ist extrem mager.
Außer den ganzen ($IPS_VALUE,X,Y) die schon recht merkwürdig sind, ist schon die zweite Zeile falsch.

getValueString(22697 /[Objekt #22697 existiert nicht]/ )
Es fehlt mehrfach die ID und Get wird groß geschrieben. Das kann nie unter 2.6 gelaufen sein.

Die Variablen existieren nicht weil ich für das Forum die Datei von dem IPS 2.6 Rechner mit dem IPS 3.1 geöffnet habe. In der anderen hatte ich schon so viel probiert, aber natürlich auch die ID des Com-Ports wie auch der Variable angepasst.
Fehlermeldung erhalte ich keine.

Dann lass dir doch mit echo mal ein paar Variablen ausgeben an verschiedenen Stellen, damit du eingrenzen kannst wo es klemmt…
Die echos siehst du ja dann im Meldungsfenster. Mach ein Prefix davor, dann kannste im Meldungsfenster filtern, falls zuviel durchläuft.

-Chris-

Ja, hab ich ganz viele ECHOS eingebaut (z.B. echo "Zeile 7 : „.$Arbeitsspeicher.“ –
"; ).
Deshalb wollt ich euch auch nicht das verschluderte Skript senden, sondern hatte das Originale vom anderen Rechner geholt - nur blöderweise nicht daran gedacht die ID´s noch für Euch anzupassen (vons wegen der Falschmeldungen).
Das GROSSE „G“ vom Get war es auch nicht.
Versuche gerade mit meinem super PHP-Wissen das if ($IPS_VALUE{0} == ‚+‘) zu ersetzen.

Warum willst du das ersetzen? Kommt nicht immer ein + am Anfang?

Was sagen die echos denn? Wo kommt etwas das nicht sein sollte? Wo kommt nichts?

Sorry, aber wir müssen so doof Fragen, weil ist halt schlecht nachzustellen und so weiß halt keiner was bei dir nicht geht…Glaskugel mangel :wink: Ist halt problematisch mit einer Ferndiagnose…

Grüße,
Chris

Das die Ferndiagnose schwierig wird hab ich mir gedacht wenn nicht ein Befehl sichtbar ist der unter 3.1 nicht läuft. Ich bekomme ja auch keine Fehlermeldung.
Ersetzen wollt ich den Befehl, da weiter oben etwas zweifel dazu aufkam.
Ich werde mal was mit den Echos / Meldungen /… zusamen schreiben.

Danke

Jan - der leider auch keine Kugel aus Glas hat

Cool, das kannte ich noch nicht :).

Chris hat mir gestern seeeehr lang geholfen bis das Skript lauffähig umgebastelt war. Die Vermutung ist nun das die Seriellen-Schnittstellen in der neuen IPS-Version anders gehändelt werden.

An die IPS-Michaels, hat sich an den Seriellen_Schnittstellen etwas geändert?

Nochmal Danke an Chris der viel Geduld hatte:loveips:

Waren doch nur 3 Stunden :smiley: :smiley:

Seine alte Version ist, glaube ich, IPS v2.7 und die mit der wir das Skript komplett umschreiben musste, war v3.10 …
… kann es sein, dass bei den COM-Ports die Daten da anders übertragen werden? Also die Blöcke anders gebildet werden oder irgendwie sowas? Anders kann ich mir nicht erklären, warum wir das Skript komplett umstricken mussten :confused:

ODER ist es möglich, dass ein anderer Computer mit einer anderen COM-Schnittstelle die Daten anders übermittelt? Also gleiches Skript, gleiches COM-Modem, aber halt andere COM-Schnittstelle, weil anderer Computer?!?!?

Grüße,
Chris

Letzteres ist Wahrscheinlich. Habe ich auch schon mit Sniffern erlebt. Mal die Daten am Stück, mal Byteweise.
Dafür gibt es in IPS ja den Cutter oder den Buffer der RegVar.
Direkt den Value auswerten ist eine schlechte Idee, weil der feuert so schnell / langsam wie die Daten eintreffen.
Schönes Beispiel wie man es machen kann, ist das CUL oder APCUPSD-Script.
Michael

Hab mich gestern zum 1. Mal mit der COM-Schnittstelle und IPS beschäftigt…war „speziell“ :smiley: Ich nutze so alten Kram zum Glück nicht :smiley: :wink: :stuck_out_tongue:
…da kann Jan sich ja, wenn er Lust hat, nochmal mit seinem anderen Programmier-Bekannten zusammensetzen und probieren und die Lösung hier posten :slight_smile:

Erstmal läuft es so, wie wir es gemacht haben, wenn natürlich wieder ein anderer Computer ins Spiel kommt, dann bin ich mal gespannt :rolleyes:

MfG,
Chris

PS: Mit RegVar haben wir gearbeitet :slight_smile: Nur mit dem Cutter nicht…

Kannst ja auch den Buffer der Regvar nutzen. Immer mit SetBuffer die ganzen Daten aus GetBuffer und Value zusammensetzen, und dann prüfen ob der Datensatz komplett ist. Wenn nein nix tun (passiert ja automatisch beim Empfang des nächsten Datenpaketes), wenn komplett dann verarbeiten und Buffer leeren.
Das gilt auch für das Netzwerk also den Client/Serversocket.
Wenn du also ca 3000 Bytes empfangen willst, wird das Script vermutlich pro Paket getriggert, somit hat es beim ersten Aufruf nur die Hälfte der Daten. Beim zweiten Datenpaket dann nur die zweite Hälfte. Dafür brauchst du dann auch den Buffer der Regvar.
Michael

Ja, mein „Programmierer“ und ich nehmen uns dessen noch mal an. Wenn Ihr noch Tips und Hinweise habt wäre das sehr nett, da er kein IPSler ist und daher die Eigenheiten nicht kennt.
Ich werde aber die Version von Chris weiterhin erst eimal auf verschiedenen Rechnern testen und zum Vergleich auch die Version von oben auf anderen Rechnern einsetzten. Ich bin ja neugirig ob es an der Hardware liegt. Wird aber etwas an Zeit dauern, da man ja nicht mal eben einen Anderen Rechner unter IPS setzt.
Wenn dann die kommende Skript Version fertig ist werde ich sie zum Vergleich hier zeigen und wenn Chris einverstanden ist auch seine.

Klar, meinetwegen kannst du gern alles veröffentlichen, dazu ist das Forum ja da :slight_smile: Vlt. können ja noch andere von der Arbeit profitieren :slight_smile:
…aber bereinige das Skript erstmal ein wenig, sonst bekommt man ja einen Schock :smiley:

Grüße,
Chris

Eigentlich hat sich von der 2.7 zur 3.1 nichts diesbezüglich verändert. Ich vermute also eher, dass die Pakete anders ankommen als auf deinem Laptop, was die anderen auch schon vermutet haben :slight_smile:

paresy