Probleme mit AVR-NET-IO

Hallo Freunde des AVR-NET-IO,

habe heute meinen als Fertiggerät erhalten und ins Netzwerk eingebunden.

Anbindung mit ClientSocket klappt hervorragend, auch das Schalten der Ausgänge funktioniert mit SETPORT x hervorragend.

Und nun zum Verständnis mit folgendem Befehl die Version ab

$antwort = CSCK_SendText(46633, "VERSION");
SetValue(19603,$antwort);
echo $antwort;

Somit sollte doch in $antwort der String der Version stehen, oder sehe hier etwas falsch.

Auch die Abfrage der Port per GETSTATUS liefert mir nur eine 1.

Hat jemand eine Idee?

Anbei noch die Bilder vom Debugfenster sowie das Skript.

Hallo Werner,

um die Antworten vernünftig zu erfassen solltest Du folgenden Weg gehen:

Cutter: (für gefilterte Rückmeldungen, ohne /r/n)
Neue Instanz hinzufügen, Haken bei „alle Module anzeigen“ setzen, (Splitter) auswählen, dann Cutter wählen und erstellen.
In der Konfiguration dann dort als übergeordnete Instanz Deinen Client Socket auswählen.
In Benutze Zeichen für Schnitte bei: Rechte Trennzeichen 0D 0A als HEX setzen.

Register Variable: (für die Rückmeldungen)
Neue Instanz hinzufügen, Haken bei „alle Module anzeigen“ setzen, (None) auswählen, dann Register Variable wählen und erstellen.
In der Konfiguration dann dort als übergeordnete Instanz den obigen Cutter auswählen.

In der Registervariablen dann den Script eintragen welcher aufgerufen wird, wenn neue Daten eingetroffen sind.

So läuft es.

Als Hilfe dient der SCRIPT von HJH und SEINE ERKLÄRUNGEN zur REGISTERVARIABLEN (ganz unten).

mfg

BerndJ

Hallo Werner,

wie in dem von BerndJ schon erwähnten Thread http://www.ip-symcon.de/forum/f19/pollin-avr-net-i-o-6389/ geht nichts ohne die RegisterVariable, sonst empfängst Du immer nur den Deine „1“ oder „True“.

Den Cutter kannst Du Dir auch sparen, das geht schneller direkt im Script.

Viele Grüße

Jens

Hallo Bernd,
hallo Jens,

ich sag schon einmal vielen Dank für die Tipps. Da lag mein Kumpel (bmwm3) doch richtig das im Antwort-String nicht das Rückmeldung des AVR ist.

Werde heute Abend berichten, muss jetzt erst einmal auf die Messe (IHM).

Hallo Bernd,
hallo Jens,

hier das Ergebnis eurer Tipps.

Habe auf Basis von HJHs Skript das Ganze mal für die Ausgänge gebaut.

switch($IPS_SENDER)                                
{
    case "Execute":                                
    case "TimerEvent":                             
  CSCK_SendText(34705 /*[AVR-NET-IO]*/, "GETSTATUS");
    break;
 
    case "RegisterVariable":                       
  SetValue(19603 /*[.Entwicklung\AVR\AVR_Status]*/, $IPS_VALUE);
   $allport = GetValue(19603 /*[.Entwicklung\AVR\AVR_Status]*/);
 
  if (substr($allport,0,1) == 'S')
  {
  SetValue(28557 /*[.Entwicklung\AVR\AVR A Port 1]*/, substr($allport,8,1));
  SetValue(25435 /*[.Entwicklung\AVR\AVR A Port 2]*/, substr($allport,7,1));
  SetValue(20488 /*[.Entwicklung\AVR\AVR A Port 3]*/, substr($allport,6,1));
  SetValue(27171 /*[.Entwicklung\AVR\AVR A Port 4]*/, substr($allport,5,1));
  SetValue(53061 /*[.Entwicklung\AVR\AVR A Port 5]*/, substr($allport,4,1));
  SetValue(12259 /*[.Entwicklung\AVR\AVR A Port 6]*/, substr($allport,3,1));
  SetValue(25274 /*[.Entwicklung\AVR\AVR A Port 7]*/, substr($allport,2,1));
  SetValue(36103 /*[.Entwicklung\AVR\AVR A Port 8]*/, substr($allport,1,1));
  }
    break;

Skript wird im Moment im Sekundentakt getriggert, wird später sicherlich ein längerer Zyklus.

Wie im obigen Skript zu sehen wird der Antwort-String aus der Register-Variable in einer Stringvariable zwischengespeichert, kann später wahrscheinlich auch entfallen.

Anschließend wird der Antwortstring in seine Einzelteile zerlegt und in die entsprechende Boolean-Variable geschrieben.

Soweit so gut.

Jetzt habe ich nur noch ein kleines Problem das ich nach ein gewissen Zeit, ca. zwischen 20 und 60 Sekunden keine Antwort mehr vom AVR-NET-IO erhalte. Erst nach einem SET-Befehl oder wenn ich nebenbei den NetServer starte funktioniert das Antwortverhalten wieder einwandfrei.

Kann mir hier jemand einen Tipp geben, könnte zwar die NetServer-Anwendung mitlaufen lassen aber das ist ja nicht im Sinne des Erfinders.

@paresy: Gibt es vielleicht eine Chance für den AVR ein Modul zu bekommen?

Hallo Werner,

Kann mir hier jemand einen Tipp geben, könnte zwar die NetServer-Anwendung mitlaufen lassen aber das ist ja nicht im Sinne des Erfinders.

nach … Sekunden dürfte ein Time-Out des Telnetservers im AVR-Net-IO die Verbindung trennen.

Ein Set-Befehl, bzw. das Starten der NetServer-Anwendung starten ihn wieder.

Lösung:

Eine regelmässige „Keep-Alive“ Meldung schicken. Zum Beispiel alle 30 oder … Sekunden:

IPS_ApplyChanges(49292);

Wobei 49292 die ObjektID des Client-Socket ist.

Dadurch wird die Telnetverbindung regelmässig neu gestartet.

Hallo Ernst,

bist Du sicher, dass der IPS_ApplyChanges() Befehl etwas über den ClientSocket sendet? Woher weißt Du da?

Wenn das stimmt, dann würde ja bei jedem Aufteten dieses Befehl etwas versendet werden, und zwar auch dann, wenn man es vielleicht gar nicht wünscht.

Ich kann mir das eigentlich nicht vorstellen.

Gruß
HJH

Hallo Hans-Jörg,

hab’s hier im Testaufbau vor mir liegen.

Ein AVR-Net-IO mit eine alternativen Software (Ursprung von Ulli Radig), verbunden mit IPS per ClientSocket.

Beim „IPS_ApplyChanges()“ wird der ClientSocket zurückgesetzt, und schickt eine Verbindungsanforderung an den Telnetserver im AVR-Modul, der wiederum eine neue Telnet-Session startet.

Ja,
zu dem Ding gibt es einiges.
Gerade gesehen, Auszug der Möglichkeiten, die jemand beschrieb:

IP 192.168.1.99
ATmega 32

Funktionen Aktiv:
- FS20 Steckdosen ansteuern PD7
- OW auslesen (ID) PD6
- OW einfach anschließen liest jeden Sensor am BUS aus
- und Alle AD aktiv
- Portübersicht (Steuerbar)

Absteuerbar alles über netcat oder über browser zum testen nicht
schlecht.

zb. OW auslesen über browser

- http://192.168.1.99/ecmd?1w+list
- http://192.168.1.99/ow.ht
- http://192.168.1.99/Xow.ht (Grafik)

fs20 ansteuern (mein code)

- http://192.168.1.99/ecmd?fs20+send+0x3836+0x59+0x00 aus
- http://192.168.1.99/ecmd?fs20+send+0x3836+0x59+0x10 ein
oder netcat
echo fs20 send 0x3836 0x59 0x10 | nc 192.168.1.99 2701 -d 1 ein
echo fs20 send 0x3836 0x59 0x00 | nc 192.168.1.99 2701 -d 1 aus

Gruß Gerd

Gesehen hier

Hallo Werner,
Hallo AVR´ler

hab mal das Script von Werner getestet, aber ich bekomme von meinem AVR über das Script nichts zurück. Wenn ich einen „GETPORT“ schicke erhalte ich eine 1 zurück, was ja bedeutet das mein AVR im Netz antwortet.
Him, eine Idee?:confused:

Mein Script:


$AVR_aktiv = GetValueBoolean (18000 /*[AVR-Net-IO\Ping, AVR-Net_IO aktiv?]*/ ); //Ist der AVR aktiv?

If ($AVR_aktiv == true)
{
	switch($IPS_SENDER)
	{
   	case "Execute":
   	case "TimerEvent":
  		CSCK_SendText(31975 /*[Client Socket AVR]*/ , "GETSTATUS");
  		//echo ("Send Text ");
   	break;

   	case "RegisterVariable":
  		SetValue(29921  /*[AVR-Net-IO\Digital IO Outputs abfragen\Daten AVR-Net-IO]*/ , $IPS_VALUE);
  		$allport = GetValue(29921  /*[AVR-Net-IO\Digital IO Outputs abfragen\Daten AVR-Net-IO]*/  );

		if (substr($allport,0,1) == 'S')
  			{
			SetValue(57311 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-1]*/ , substr($allport,8,1));
			SetValue(58050 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-2]*/ , substr($allport,7,1));
			SetValue(13314 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-3]*/ , substr($allport,6,1));
			SetValue(40524 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-4]*/ , substr($allport,5,1));
			SetValue(45257 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-5]*/ , substr($allport,4,1));
			SetValue(26550 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-6]*/ , substr($allport,3,1));
			SetValue(18203 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-7]*/ , substr($allport,2,1));
			SetValue(48135 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR-I/O-8]*/ , substr($allport,1,1));
			}
    	break;
	}
	IPS_RunScript(15588 /*[AVR-Net-IO\Digital IO Outputs abfragen\AVR Keep Alive]*/  );  //Starten des Skripts "VAR Keep Alive"
}


else
	{
	Echo ("keine Netzwerkverbindung zum AVR-NET-IO");
	}

Grüße
Andrge

Hallo andrge,
hast Du auch die Registervariable angelegt? Cuttert? hab mal ein paar Bilder mit angehängt. Die Werte siehst Du nur in der RegisterVariable. Die muss dan dementsprechend ausgelesen werden.

Ach ja hier noch mal ein Skript zum Testen.

<?
$time=50;
$status = 1;

CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 1.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 2.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 3.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 4.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 5.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 6.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 7.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 8.$status");
IPS_Sleep($time);

CSCK_SendText(19711 /*[Client SocketAVR]*/,"GETSTATUS");

$status = 0;

CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 1.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 2.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 3.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 4.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 5.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 6.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 7.$status");
IPS_Sleep($time);
CSCK_SendText(19711 /*[Client SocketAVR]*/,"SETPORT 8.$status");
IPS_Sleep($time);

CSCK_SendText(19711 /*[Client SocketAVR]*/,"GETSTATUS");
?>

cutter.gif

rv.gif

clientsocket.gif

Hallo bmwm3

danke für deine Antwort.
Aha, ein Cutter. Ich hab das Skript vom Werner so verstanden, das der String der vom AVR zurück kommt im Script auf die einzelnen Variablen, in dem Teil nach dem „if (substr($allport,0,1) == ‚S‘)“, aufteilt wird. Hab ich das falsch verstanden?
Ich hatte den Eindruck als ob das Skript nicht durch eine „RegisterVariable“ getriggert wird. Him? Klar, ich muß das Skript ja durch die AVR Antwort Triggern, oder?

Ciao
Andrge

Moin andrge,
ja die RegisterVariable Triggert das Skript für die Portabfrage.Ich selber habe es auch schon ohne Cutter gemacht, funktioniert auch.