String über XBee senden und zerlegen

Hallo Ulli,

Hier ein Beispiel für ein AT-Kommando (in diesem Fall das Node Discovery). Darauf sollten dann in der Meldeliste alle gefunden Nodes ausgeworfen werden:


<?

	include_once("XBee_Global.ips.php");


	$data = "ND";

	//Frame zusammenbauen
	$frame = chr(0x08).chr(0x01).$data;

	XBee_Send($frame);

?>

Für das Senden der Daten zu den IOs habe ich noch eine Routine dazwischen geschalten (Ist einfach programmtechnisch so gewachsen). Das Ganze sieht dann so aus:

Irgendwo baue ich meine Nutzdaten für eine IO zusammen. Hier am Beispiel ein Telegramm an die IO mit dem Namen HZG (ist meine Heizung). Nutzdaten stehen in der Var $tel:

		IPS_RunScriptEx(21494 /*[HOCO\XBee_Transmit]*/,array("node" => "HZG","data" => $tel));

Und jetzt das Script XBee_Transmit, welche die Sendedaten aufbereitet:

<?

	include_once("XBee_Global.ips.php");


	//Transmit Request
	$frame = chr(0x10).chr(0x01);

	//node suchen
	if ( !($key = array_search ( $node, $nodes )) )
	{
	   //nicht gefunden
	   IPS_LogMessage("XBee","Node for transmit not found: ".$node);
   	return (false);
	}
	//Adressen hinzufügen
   for ($x=0; $x < 20;$x+=2){
	   $frame .= chr(hexdec(substr($key,$x,2)));
	}

	$frame .= chr(00).chr(00);


	//Daten anhängen
	$frame .= $data;


	$len = strlen($frame);
	$debug = "";
   for ($x=0; $x < $len;$x++){
      $debug = $debug." ".dechex(ord(substr($frame,$x,1)));
   }
	if ($xbee_debug) IPS_LOGMESSAGE("XBee","Frame send: ".$debug);


	XBee_Send($frame);

?>

Ist wieder ziemlich gekürzt. Im Original ist noch ein Bootloader-Teil und ein paar andere Dinge für meine IOs enthalten. Hoffe nur, ich habe nicht zu viel entfernt:D

Die XBees auf der Seite meiner ATMEL-IOs sind nicht im API-Mode. Warum auch, die senden immer nur an eine Gegenstelle und der Code wird dadurch viel einfacher.

Gruß und viel Spaß
Rubberduck

Vielen Dank für die gut funktionierten Beispiele.

Jetzt kann ich endlich auf der Router/End Device Seite mit dem Arduino weiter experimentieren / programmieren.

Bis dann Ulli

Blöde Frage (php-Dau usw…)
Ich bekomme eine Fehlermeldung beim includen der XBee_Global.ips.php

Warning: include_once(50592) [function.include-once]: failed to open stream: No such file or directory in C:\IP-Symcon\scripts\56441.ips.php on line 4

Warning: include_once() [function.include]: Failed opening ‚50592‘ for inclusion (include_path=’.;C:\php5\pear’) in C:\IP-Symcon\scripts\56441.ips.php on line 4

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\56441.ips.php on line 17

Notice: Undefined variable: IPS_INSTANCE in C:\IP-Symcon\scripts\56441.ips.php on line 19

Warning: regvar_getbuffer: Instance #0 not found! in C:\IP-Symcon\scripts\56441.ips.php on line 19

Notice: Undefined variable: IPS_INSTANCE in C:\IP-Symcon\scripts\56441.ips.php on line 234

Die ID 50592 ist die ID der XBee_Global.ips.php und damit korrekt .
Ich habe die beiden Variablen in der Global angepasst und entsprechend angelegt. (liegen als Unterpunkt zum Com-Port im Baum)
Hat das etwas mit „C:\php5\pear“ zu tun :confused:

Frohes neues Jahr!!
FipsJr

Bin zwar auch kein PHP-Guru, aber ich würde sagen, include_once(50592) geht nicht!. Wenn das Script auf der Platte „50592.ips.php“ heißt, dann musst du es auch so aufrufen include_once(„50592.ips.php“); (glaube ich zumindest)

Das deutet darauf hin, dass das Script nicht von RegVar aufgerufen wurde, sondern du es händisch ausgeführt hast, oder?

Hoffe, das hilft etwas. Und: Es gibt keine blöden Fragen, maximal blöde Antworten;)

Rubberduck

Hi Rubberduck,

include_once(50592) hat IPS im Logfenster selbst geschrieben. Ich hatte das Global Script angegeben und er hat die ID dazu selbst ergänzt.

Händisch aufgerufen ist korrekt - es hatte sich irgendwie nichts getan.

Dein Bild war sehr hilfreich, ich hatte in der XBee Register Variablen das Global Script angegeben und nicht das aufrufende.
Mein IPS will gerade nichtmehr - werde das morgen nochmal nachschauen…

Viiiielen Dank !!!
:smiley:

Er schreibt jetzt zyklisch (bei jedem vom Arduino gesendeten String) etwas von Frame received :smiley: aber ansonsten kommt die gleiche Meldung mit include_once usw… :frowning:

Kopiere einfach mal probeweise den Code des Global-Script an Stelle der Include-Anweisung in das Skript.

Habe gerade die Global und die Node Discovery alle in ein großes Script eingefügt und ein Script zum zerschnibbeln des Strings gebastelt.

Bin gerade erfolgreich dabei, Temp, Humidity und VOC zu loggen.
Genial !!!
:smiley:
:loveips:

Warum das Include nicht klappt habe ich noch nicht herausgefunden :frowning:

Gruß FipsJr

Hi
Herzlichen Dank erstmal dafür, dass mit Eurer Hilfe endlich die ersten Nachrichten von meinem sendenden Arduino in IPS aufgetaucht sind. Hoffe den Rest kriege ich auch noch hin…

Verstehe ich das richtig, dass es für die Node discovery nochmal ein eigenes Script gibt?

Gruss
royassas

Ja, für das Discovery steht ob dieses Script:

Im Empfangs-Script ist noch ein kleiner Fehler, wenn man Nodes hat welche eine Join Notification senden, wird das erste Zeichen des Node Identifier abgeschnitten.
Ca. in Zeile 216:

$io_name = strtok(substr($data,22),chr(0));

gegen

$io_name = trim(strtok(substr($data,21),chr(0)));

austauschen.

Da ich dennoch Probleme hatte eine Nodes zu erreichen, und im Array der bekannten Nodes teilweise veraltet Einträge waren, hate ich einen Timer auf das Discover-Script gelegt und lösche vorhher noch den Inhalt der Nodes-Var.

Aktuell kämpfe ich damit die Digital-I/O anzusprechen.
Ich möchte einen Ausgang schalten (siehe hier) über ein Remote AT Command.
Bekomme aber immer nur 0x04 (Remote Command Transmission Failed.) als 18. Byte zurück.
Anbei mein Script, vielleicht geht es ja bei jemanden ?

function XBee_RemoteAtCommand($data,$node)
{   
    global $nodes,$xbee_debug;
    //Node suchen
    if ( !($key = array_search ( $node, $nodes )) )
    {
       //nicht gefunden
       IPS_LogMessage("XBee","Node for transmit not found: ".$node);
       return (false);
    }

    //Remote AT Command
    $frame = chr(0x17).chr(0x01);
    //Adressen hinzufügen
    for ($x=0; $x < 20;$x+=2)
    {
       $frame .= chr(hexdec(substr($key,$x,2)));
    }
    //Apply changes on Remote
    $frame .= chr(0x02);
    
    //Daten anhängen (AT Command + Payload)
    $frame .= $data;

    if ($xbee_debug)
    {
	$len = strlen($frame);
	$debug = "";
	for ($x=0; $x < $len;$x++){
		$debug = $debug." ".dechex(ord(substr($frame,$x,1)));
	}
	IPS_LOGMESSAGE("XBee","Frame send: ".$debug);
    }
    XBee_Send($frame);
}

Edit
Ok geht doch :slight_smile:
Den XBee als Router und nicht End Device einstellen, und schon geht es :confused:

Michael

Für Windows IPS3.x gibt es nun das hier:
[Modul] XBee Serie2 - ZigBee Netzwerk
Michael