Pollin AVR Net-I/O

Hallo thifi,

das ist eigentlich ganz einfach :slight_smile:

Das Skipt habe ich ein bissel angepasst, eine Anmeldung ohne Benutzername war da nicht geplant :slight_smile:

meins sieht ab Zeile 66 so aus


				$this->loginprompt=$r[count($r)-1];

				if ($user!='') {
					fputs($this->fp,"$user\r");
					$this->Sleep();

					fputs($this->fp,"$pass\r");
					if ($this->use_usleep) usleep($this->loginsleeptime);
					else sleep(1);
					$this->GetResponse($r);
					$r=explode("
",$r);
				
					if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
						$rv=3;
						$this->Disconnect();
					}
				}
			} else $rv=1;
		}

dann das eigentliche Skript:


$dir=IPS_GetKernelDir();
include $dir.'\scripts	elnet.ips.php';
$telnet = new PHPTelnet();
$result = $telnet->Connect('10.11.1.242','50290','','');

if ($result == 0) {

$telnet->DoCommand('getadc 1', $result1);
$telnet->DoCommand('getadc 2', $result2);
$telnet->DoCommand('getadc 3', $result3);
$telnet->DoCommand('getadc 4', $result4);

//Hier die weiteren Berechnungen und die IPS-Vars setzen

}
$telnet->Disconnect();


und schon funktioniert es.

Bei Fragen … immer raus damit :smiley:

Andreas

@saerdna76
Ich danke Dir, genau das hat mir gefehlt.
das php-Script für IPS hatte ich schon richtig, nur die Änderung in TelnetPHP habe ich nicht geschafft.
Jetzt läuft das Ganze, wenn auch relativ langsam. Eine Abfrage der 4 Analogports dauert ca. 8 Sekunden, das weitere Setzen der Ausgabeports je Port ca. 1 Sekunde.
Ist da in der TelnetPHP noch irgendein Timer drin, den man noch ein bisschen kleiner machen kann? Das Herstellen der Verbindung dauert per IPS ca. 4-5 Sekunden.

Ansonsten bin ich mit der Möglichkeit des Zugriffs schon ganz zufrieden, besser aus die Geschichte mit ClientSocket, REgisterVariable und Cutter …

Vielen Dank nochmal für Deine schnelle Hilfe, binin Sachen php ein blutiger Anfänger…

Viele Grüße
Thifi

Hallo thifi,

sorry da kann ich Dir auch nicht weiter helfen … bei mir läuft das komplette Skript (Abfrage der 4 analog-Port und ein paar Berechnungen) unter 900ms und dass obwohl ich den AVR über WLAN anspreche.

Hast Du so lange Zeiten auch, wenn du das „manuell“ über Telnet machst ??

VG

Andreas

Habe das Ganze jetzt nochmal über Telnet (Putty) getestet.
Da läuft sowohl der Verbindungsaufbau, als auch das Ausführen der Befehle viel schneller ab, das wird sicherlich an die Zeiten rankommen, die saerdna76 gepostet hat.
Ich kann mir das Ganze noch nicht so richtig erklären. Aber 4 Analogports abfragen, 8 Digitalports setzten (1) und wieder rücksetzten (0) dauert zwischen 27 und 30 Sekunden (lauf Zeitmesssung Script). Ist ein bisschen viel.
Wo kann ich ansetzen zu suchen?

Für Hinweise und Ratschläge bin ich dankbar.

Viele Grüße
Thifi

Hi,

poste doch mal dein komplettes Skript … vielleicht erkennt ja jemand was … falls es daran liegen sollte …

Hast du Putty auf dem Rechner mit IPS getestet oder von einem anderen ???

Ansonsten könntest Du mal Wireshark installieren und einen Mitschnitt des Netzwerktraffics anfertigen, da schaue ich dann mal drüber.

VG

Andreas

Hallo,
anbei das Script zum Telnet-Test der AVR-I/O:

<?
$dir=IPS_GetKernelDir();
include $dir.'\scripts\PHPTelnet.php';
$telnet = new PHPTelnet();
$result = $telnet->Connect('192.168.11.4','50290','','');

if ($result == 0) {

$telnet->DoCommand('getadc 1', $adc1);
$telnet->DoCommand('getadc 2', $adc2);
$telnet->DoCommand('getadc 3', $adc3);
$telnet->DoCommand('getadc 4', $adc4);
$telnet->DoCommand('getport 1',$p1);
$telnet->DoCommand('getport 2',$p2);
$telnet->DoCommand('getport 3',$p3);
$telnet->DoCommand('getport 4',$p4);

//Testausgabe ADCs und Digi-IN

echo $adc1;
echo $adc2;
echo $adc3;
echo $adc4;
echo $p1;
echo $p2;
echo $p3;
echo $p4;

//Hier die weiteren Berechnungen und die IPS-Vars setzen
//Testausgabe DIGI-OUT 

$telnet->DoCommand('setport 1.1');
$telnet->DoCommand('setport 2.1');
$telnet->DoCommand('setport 3.1');
$telnet->DoCommand('setport 4.1');
$telnet->DoCommand('setport 5.1');
$telnet->DoCommand('setport 6.1');
$telnet->DoCommand('setport 7.1');
$telnet->DoCommand('setport 8.1');

$telnet->DoCommand('setport 1.0');
$telnet->DoCommand('setport 2.0');
$telnet->DoCommand('setport 3.0');
$telnet->DoCommand('setport 4.0');
$telnet->DoCommand('setport 5.0');
$telnet->DoCommand('setport 6.0');
$telnet->DoCommand('setport 7.0');
$telnet->DoCommand('setport 8.0');

}
$telnet->Disconnect();

?>


Wie schon geschrieben gibt es bei mir große Zeitproblem, d.h. die Ausführung dieses Script dauert ca. 30 Sekunden.

Putty hab ich NICHT auf dem IPS-Rechner gestartet, sondern auf einem anderen Rechner im Netzwerk, von dem ich auch per Remote-Console IPS bediene. Also Hardware-technisch die gleichen Voraussetzungen.

Ich kann bei Bedarf auch nochmal die „TelnetPHP.php“ anhängen, wenn es interessieren sollte. Dort hab ich nur ab Zeile 66 den Code von saerdena76 eingefügt (und den vorherigen gelöscht).

Na vielleicht fällt jemandem was auf…

Viele Grüße
Thifi

Hallo thifi
hallo saerdna76

habt ihr schon versucht das LCD anzusteuern?

Grüße
andrge

Hallo andrge,

ich habe noch nichts mit einel LCD probiert … brauche den Net-IO im Moment nur zum Messwerte sammeln :slight_smile:

Aber mal eine vielleicht blöde Frage, geht das mit der Orginal-Firmware von Pollin überhaupt, oder muss ich da was andere aufspielen und wenn ja, was am besten ?

Viele Grüße

Andreas

Hallo thifi

Putty hab ich NICHT auf dem IPS-Rechner gestartet, sondern auf einem anderen Rechner im Netzwerk,

ich würde Putty mal auf dem IPS-Rechner starten, dann kannst du entwerder IPS oder die Hardware als Fehlerquelle ausschließen.

Wenn es mit Putty auf dem IPS-Rechner genau so langsam läuft, würde ich auf ein Problem mit dem Netzwerk tippen :wink:

Viele Grüße

Andreas

PS: HAst Du schonmla deinen Switch resettet ?? Ich weiß klingt blöde, aber ich hab schon erlebt das der Switch was weg hatte und es nach einem Reset wieder lief … der wurde dann aber schnellstmöglich ausgetaucht :smiley:

@saerdna76
Das Ausführen auf dem IPS-Rechner probiere ich mal, komme aber erst morgen abend dazu.

@andrge
Ich habe kein LCD an der AVR-Net-I/O dran und möchte den Controller wie auch saerdna76 nur als Datensammelstelle mit Netzwerkanschluss benutzen.
Wenn du aber Erfahrungen damit sammelst, wäre es interessant, wenn du uns dies hier mitteilst. Vielleicht entstehen ja auch ganz neue Einsatzzwecke für diesen „billigen“ Controller…
Eventuell auch mit anderer Firmware, siehe AVR für wenig Geld im LAN - mikrocontroller.net

Viele Grüße
Thifi

Hallo,

ich hab schon ein LCD dran, aber mit den Befehlen aus der Doku bekomm ich es nicht zum Fliegen.
Neben einem Datensammler stell ich mir ein Display mit ein paar Eingabetastern vor. Damit wäre dann eine Menüauswahl möglich. Unter 1W geht das einfach nicht.

Danke für den Link. Hab mir schon einen ISP Programmer gekauft, vielleicht test ich mal U.Radigs Software.

Grüße
Andrge

Hallo,

leider kann ich bei alternativer Software im Moment auch nicht weiterhelfen. Wollte aber mach nachfragen, ob sich inzwischen weiteres KnowHow irgendwo gesammelt hat :smiley:

Mein Stand ist folgender:

  • AVR Orginal-Software

  • per Telnet funkioniert super … hab auch mein Skript etwas erweitert, dass er im Fehlerfall den Befehl mehrfach versucht zu senden.

  • über WLAN hat gelegentlich Aussetzer, die ich aber auf WLAN-Seite vermute …

bei Interesse kann ich den neuen Code-Snipsel mal posten :slight_smile:

Grüße

Andreas

Hallo,

ich habe den ARV NET IO mit der Software RoBue 1.5 am laufen (AVR für wenig Geld im LAN - Mikrocontroller.net ewig langer Thread ). Die Version hat den Vorteil, dass der vierte AD-Port als 1-Wire arbeitet. Daran habe ich eine DS18S20 seit mehreren Wochen ohne einen einzigen Aussetzer in Betrieb. Die RoBue-Software (Abwandlung von U. Radig) arbeitet als WEB- und Telnetserver. Bisher lese ich die Software über WWW-Reader und Textparser ein. Leider kann man damit nur Werte lesen und keine Ports setzen. Dies muss wie bei der Pollin-Software über Telnet gemacht werden und der ist ein wenig zickig. Es benötigt teilweise mehrere Schleifen mit Fehlerüberprüfung, bis das Kommando angenommen ist. Anbei meine ersten Versuche mit Telnet. Bin leider noch blutiger PHP-Anfänger. Deshalb bitte nicht über den Code wundern. Der Ursprungscode ist von Antone Roundy ( PHP Telnet: freeware script to make Telnet connections from PHP scripts ).

?php
$telnet = new PHPTelnet();

$server = "192.168.1.212";	 		// Adresse des AVR NET IO
$port = 23;							// Telnet Port
$kommando = "OW";					// Kommando um 1-Wire Daten auszulesen


// if the first argument to Connect is blank,
// PHPTelnet will connect to the local host via 127.0.0.1
$result = $telnet->Connect($server,$port);

if ($result == 0) {
$telnet->DoCommand($kommando , $result);
// NOTE: $result may contain newlines

// Aus der Telnetantwort den Wert für Sensor 0 heraushohlen 
$findme   = 'Sensor 0:';
$pos = strpos($result, $findme);
$temp = substr($result,$pos+10,4);
$Sensor = str_replace(",", ".", $temp);

// Wert von Sensor 0 zurück geben, man könnte auch in eine IP-Symconvariable schreiben
// SetValue(27185 /*[WWW\AVR\Telnet Temperatur Sensor 0]*/,$Sensor);
echo $Sensor;

// say Disconnect(0); to break the connection without explicitly logging out
$telnet->Disconnect();
}

/*
PHPTelnet 1.1
by Antone Roundy
adapted from code found on the PHP website
public domain
*/

class PHPTelnet {
	var $show_connect_error=1;

	var $use_usleep=0;	// change to 1 for faster execution
		// don't change to 1 on Windows servers unless you have PHP 5
	var $sleeptime=125000;
	var $loginsleeptime=1000000;

	var $fp=NULL;
	var $loginprompt=NULL;

	/*
	0 = success
	1 = couldn't open network connection
	2 = unknown host
	3 = login failed
	4 = PHP version too low
	*/
	function Connect($server,$port) {
		$rv=0;
		$vers=explode('.',PHP_VERSION);
		$needvers=array(4,3,0);
		$j=count($vers);
		$k=count($needvers);
		if ($k<$j) $j=$k;
		for ($i=0;$i<$j;$i++) {
			if (($vers[$i]+0)>$needvers[$i]) break;
			if (($vers[$i]+0)<$needvers[$i]) {
				$this->ConnectError(4);
				return 4;
			}
		}

		$this->Disconnect();

		if (strlen($server)) {
			if (preg_match('/[^0-9.]/',$server)) {
				$ip=gethostbyname($server);
				if ($ip==$server) {
					$ip='';
					$rv=2;
				}
			} else $ip=$server;
		} else $ip='127.0.0.1';

		if (strlen($ip)) {
			if ($this->fp=fsockopen($ip,$port)) {
				$this->Sleep();
				$this->GetResponse($r);
				$r=explode("
",$r);
	

				fputs($this->fp,"\r");
				$this->Sleep();

				if ($this->use_usleep) usleep($this->loginsleeptime);
				else sleep(1);
				$this->GetResponse($r);
				$r=explode("
",$r);
			 } else $rv=1;
		}

		if ($rv) $this->ConnectError($rv);
		return $rv;
	}

	function Disconnect($exit=1) {
		if ($this->fp) {
			if ($exit) $this->DoCommand('exit',$junk);
			fclose($this->fp);
			$this->fp=NULL;
		}
	}

	function DoCommand($c,&$r) {
		if ($this->fp) {
			$error = false;
			$i = 0;
			do {
				  fputs($this->fp,"$c\r");
				  $this->Sleep();
			      $this->GetResponse($r);
			      $r=preg_replace("/^.*?
(.*)
[^
]*$/","$1",$r);
			      if(strpos($r,"ERROR")!==false) $error=true;
			      if(strpos($r,"Ready")!==false) $error=false;
			      $i++;
		    } while ($i<4 and $error);
		}
		return $this->fp?1:0;
	}

	function GetResponse(&$r) {
		$r='';
		do {
			$r.=fread($this->fp,1000);
			$s=socket_get_status($this->fp);
		} while ($s['unread_bytes']);
	}

	function Sleep() {
		if ($this->use_usleep) usleep($this->sleeptime);
		else sleep(1);
	}

	function ConnectError($num) {
		if ($this->show_connect_error) switch ($num) {
		case 1: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break;
		case 2: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break;
		case 3: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break;
		case 4: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break;
		}
	}
}

?>

In Summe ist die RoBue-Software auf den AVR NET IO nicht schlecht. Vor allem weil man mehrere 1-Wire-Busse (puls 3analog IN, 4 digital IN, 8 * digital OUT) über TCP/IP an IP Symcon anschließen kann. Somit benötigt man nur eine LAN/WLAN PowerLAN oder was auch immer für eine Verkabelung. Nur der zickige Telnet stört mich noch etwas. Bei Pollin gibt es sogar noch ein IO-Board für 10 Euronen, mit dem man 8 Relais schalten kann (230V nicht von Pollin freigeben, die Bauteile könnten es aber - also Vorsicht bei sowas).

Gruss
Icey

Hallo, ich mische mich mal mit meinen bisherigen Erfahrungenzum Pollin Board ein:
Habe das Board mit Originalsoftware laufen, per Dashboard steuere ich digitalen Ports und schreibe (zum Test) Text (z.B. den Schaltstatus) auf das angeschlossenen LCD Display.
Ich hatte eine Anfrage wie ich das Displays angeschloosen habe:
Verwenden tue ich ein LCD Display von Pollin (Best.Nr. 120420) für sage und schreibe €4,95. Zum Anschluß das Datenblatt aus der Downloadsektion von Pollin herunterladen (D120120D.pdf).
In der Anleitung (V2) vom Net I/O der Belegung unter <Befehle><Punkt 11> (LCD initialisieren) folgen (Anschluß LCD Modul an Steckerleiste „EXT.“ :
Pin 1 (PD2) geht an LCD R/W
Pin 2 (PD3) geht an LCD RS

Pin 10 (+5V) geht an LCD Pin1 (VDD)
Den Spannungsteiler zur Kontrasteinstellung nicht vergessen ! Ich habe ein einfaches 10K Poti, Schleifer auf V0 (LCD Pin 3), genommen. Ohne dieses Poti läuft nichts … es diehnt der Kontrasteinstellung => also Einstellung ausprobieren bis sich etwas auf dem Display tut.
Zur Kontrolle: Pin 8 der Net I/O Buchse bleibt unbelegt, gleiches gilt für Pin 7 bis 10 (DB0…DB3) auf der LCD Seite.

==> wenn das Net I/O Board jetzt unter Spannung gesetzt wird kann man das Poti so einstellen, das die Pixel der 1. Zeile sichtbar werden.
Der erste Test zum beschreiben am besten mit der Netserver Software von Pollin …(LCD INIT und dann Send …).
Hat’s geklappt kann man das genauso per Script via IPS machen. Bei Interesse kann ich mein Script gerne hier veröffentlichen.
Ein Hinweis: kleine IPS_Sleeps zwischen den CSCK_SendText Befehlen sind hilfreich zum korrekten Empfang der Antworten.

Vielleicht hilft’s dem einen oder anderen …

Gruß, Michael

Hallo Michael,

ach ja, poste doch mal dein Script, ich bekomme aus IPS kein Zeichen auf das Display. Nur mit der Pollinsoftware :frowning:

Grüße
Andrge

Hallo Andrge,

 /*
*******************************
 Net-I/O Sauna & Pool
 Stand: 27.04.2009
 Port schalten EIN / AUS
*******************************
*/

define("CSCK1",   59415 /*[AVR IO-NET]*/);
define("Test",    25973 /*[AVR IO-NET\Test]*/);
define("Sauna",   57517 /*[AVR IO-NET\Sauna]*/);
define("PPool",   53308 /*[Objekt #53308 existiert nicht]*/);
define("Port",    28970 /*[AVR IO-NET\Port]*/);

switch ($IPS_SENDER)
{
	CASE "Designer":
		$port = $IPS_COMPONENT;
		CSCK_SendText(CSCK1 ,"INITLCD
");
		IPS_Sleep(20);
		CSCK_SendText(CSCK1 ,"WRITELCD 1. $IPS_SENDER
");
		IPS_Sleep(100);
		CSCK_SendText(CSCK1 ,"GETSTATUS
"); //Antwort Status IO-NET in Registervariable "AVR Status"
		IPS_Sleep(100);
		$antwort = substr(GetValueString(44817 /*[AVR IO-NET\AVR Status]*/),9-$port,1);
		//SetValue(Test, $antwort);
		Switch ($antwort)
		{
			CASE 1:
				SetValue(Port, $port);
				CSCK_SendText(CSCK1,"SETPORT $port.0");
				CSCK_SendText(CSCK1,"WRITELCD 2. Port: $port AUS
");
				Switch ($port)
				{
					CASE 1:
					   SetValueBoolean(Sauna,FALSE);
					break;
					CASE 2:
					   SetValueBoolean(PPumpe,FALSE);
					break;
				}
			break;
			CASE 0:
				SetValue(Port, $port);
				CSCK_SendText(CSCK1,"SETPORT $port.1");
				CSCK_SendText(CSCK1,"WRITELCD 2. Port: $port EIN
");
				Switch ($port)
				{
					CASE 1:
					   SetValueBoolean(Sauna,TRUE);
					break;
					CASE 2:
					   SetValueBoolean(PPumpe,TRUE);
					break;
				}
			break;
		}
		break;
	CASE "RegisterVariable":
		SetValue(44817 /*[AVR IO-NET\AVR Status]*/, $IPS_VALUE);
	break;
}
?>

falls du noch etwas brauchst … bitte Info

Gruß, michael

Kann man mit der RoBue-Soft auch über RS232 schalten und walten?

Gruß Helmut

Hallo,

soweit ich mich noch an die Config Einstellung fürs compilieren erinnern kann, wird Telnet entweder auf Ethernet oder RS232 gelegt.

CONFIG.H

/*----------------------------------------------------------------------------
Copyright: Radig Ulrich mailto: mail@ulrichradig.de
Author: Radig Ulrich
Remarks:
known Problems: none
Version: 03.11.2007
Description: Webserver Config-File


Modifiziert für AVR-NET-IO von Pollin durch RoBue u.a.

//Commandos und Ausgaben erfolgen über Telnet
//UART/RS232 geht dann nicht mehr!
#define CMD_TELNET 1

Beides gleichzeitig geht nicht

Gruss
Icey

Hallo zusammen,

heute mal mein aktueller Status mir dem AVR :slight_smile:

Außer das der AVR heute stehengeblieben ist … soweit alles klar :rolleyes: Auf Pings antwortete er noch … telnet war ende gelände.

Leider haben die PHP-Hänger scheinbar meim IPS mitgenommen, nach ca .10h AVR ausfall musste ich den Rechner rebooten. Damit das nicht mehr passiert hab ich mein Skript wie folgt erweitert:

ganz oben im Skript


if ( GetValue(45881 /*[.Skripte\AVR Helligkeit\ConnectErrorCount]*/) >= 5 ) {
	exit;
	}

unten im Skript … das else erweitert …


if ($result == 0) {

//viel Code

	}
else {
	// Connect ERROR
	$ErrCNT=GetValue(45881 /*[.Skripte\AVR Helligkeit\ConnectErrorCount]*/);
	SetValue(45881 /*[.Skripte\AVR Helligkeit\ConnectErrorCount]*/,$ErrCNT+1);
	}

Hi icey,

vielleicht kannst Du mir bei meinen 2 kleinen Frage weiterhelfen …

  1. Wie bekomme ich die RoBue-Soft auf das Board … einen IPS-Programmer habe ich … aber irgendwie fehlt mir da noch der Durchblick

  2. Kann man das 1W auf dem 4. AD-Port abschalten ??

Danke & Grüße