Pollin AVR Net-I/O

@Snoop2

Kannst du nochmal bitte über mein Script und die Variablen schauen?
Ich hab noch keine Idee, warum das nicht läuft…

Danke im voraus.
Thilo

@thifi:

Ich habe leider erst wieder am Donnerstag Zugriff auf mein IPSymcon, dann kann ich es vergleichen. „append“ war aber m.e. nicht richtig, eingestellt wird es bei der Register-Variablen.
Spiel mal mit einem höheren Wert beim IPS_Sleep, wobei bei mindestens einer Variablen auch jetzt schon ein Wert ankommen müsste.

Das Leerzeichen in „list($varname,$value)=split(’:’,GetValuestring($re gvarID));“ ist doch ein C&P-Fehler, oder?

Viele Grüße

Jens

Hallo Jens,
das Leerzeichen ist durch C&P reingekommen, hab gerade nochmal nachgeschaut.

Wenn ich die RegVar AVR im Debugfenster mitlaufen lasse, bekomme ich nacheinander alle Werte angezeigt, die Übertragung klappt also.
Nur in dem Script ist die Variable $Value immer leer, also fehlt die Verbindung zwischen der RegVar und dem Script, oder muss ich das Script durch die RegVar aufrufen lassen?
Hast du das auch in V2 laufen? Und da funzt es?
Ich zweifle schon an mir. Ich hab zwar keien Ahnung von php, aber ein klein wenig kann ich mich da schon reindenken.

Also schon mal besten Dank für deine Antwort, ich proibiere mal wieter und du kannst ja am Donnerstag nochmal schauen, wie es bei dir aussieht.

Ansonsten ist die AVR-NET-IO schon ein interessantes Teil, gibt viele Möglichkeiten (auch in IPS).

Viele Grüße
Thilo

Hallo Thilo,

in der V2 gibt es bei der Registervariablen kein „append“ oder „overwrite“ mehr. Stattdessen musst Du das Skript angeben, das die Daten weiterverarbeiten soll. In diesem Skript stehen die Daten in der Systemvariablen $IPS_VALUE zur Verfügung.

Das bedeutet, dass Du das Konzept völlig neu überdenken musst. Das jetzige ist nicht mehr anwendbar. :o

Gruß
HJH

So etwas ähnliches dachte ich mir schon, danke für deine Erläuterung.
Da kann ich meine Ernergie jetzt weg von der Fehlersuche in Richtung neues Script lenken, oder hat sich hier schon jemand Gedanken drüber gemacht?

Nochmal Dnake für die leider nicht so gute Nachricht…

Viele Grüße
Thilo

Hi,

hab das Script von Dir auch mal probiert. Copy & Paste Fehler ist jetzt ja raus.

Ein Problem ist, das nicht die Registervariable zum Zuordnen eingelesen wird, er nimmt Deine String Variable gleichen Namens; … und die ist leer!.

Eine Append Möglichkeit bei der Registervariablen konnte ich in V2 auch nicht entdecken.

Nächstes Problem: die Übergabe der Daten aus der Registervariablen ist nur durch Aufruf eines Scriptes möglich. Dieses können wir nicht nehmen wegen der dort integrierten Schleife, sprich dat Dingens fängt an und hört nie wieder auf (Rekursion).

Aus meiner Sicht ist der jetzige Ansatz unglücklich, weil die unterschiedlichen Antwortzeiten in keiner Art und Weise berücksichtigt werden (der IPS_sleep Befehl ist statisch, hat eine fest vorgegebene Zeit). Der Weg, die Antwort durch die „fertig meldende“ Registervariable zu triggern ist besser und sollte alternativ mal umgesetzt werden.

Als letztes fiel mir auf, das bei der Befehlseingabe die laut Manual erforderlichen Parameter „/r/n“ fehlen. Die liefert er auch bei der Antwort zurück, also sollten wir das Cuttermodul mit verwenden um sie zu entfernen.

Ansonsten stocher ich mit meinen analphabetischen PHP Kenntnissen genau so im Nebel rum wie ihr.

mfg

BerndJ

Hallo Thilo,

mit diesem Skript könnte es funktionieren. In einer Schleife werden die einzelnen Werte angefordert. Getriggert wird erstmalig über den „Execute“-Button und anschließend automatisch über die Registervariable.

Damit es funktioniert musst Du noch eine Integervariable anlegen, in der die aktuelle Portnummer zwischengespeichert wird. Die ID dieser Variablen muss in der ersten „define“-Anweisung hinterlegt werden (die „x“ ersetzen).

define("PORTNUM", xxxxx);					      // Integervariable aktuelle Portnummer; !!! ID muss angepasst werden !!!
define("CSCK1",   28669);
define("AVRADC1", 35939);
define("AVRADC2", 28623);
define("AVRADC3", 46636);
define("AVRADC4", 17409);
define("MAXPORT",     4);                          // Anzahl der vorhandenen Ports

switch($IPS_SENDER)                                // ermitteln, wodurch das Skript aufgerufen wurde
{
	case "Execute":                                // von Hand aufgerufen: Schleife starten
	case "TimerEvent":                             // vom Timer aufgerufen: Schleife starten
	   $port = 1;
	   CSCK_SendText(CSCK1, "GETADC ". $port);     // ersten Wert anfordern
	break;
	
	case "RegisterVariable":                       // durch Registervariable aufgerufen: neuer Wert wurde empfangen
	   $port = GetValue(PORTNUM);                  // aktuelle Portnummer holen
	   $varID = constant("AVRADC". $port);         // daraus die varID ermitteln
	   SetValue($varID, $IPS_VALUE);               // empfangenen Wert abspeichern
	   $port += 1;                                 // Portnummer inkrementieren
	   if ($port <= MAXPORT)
       {
			CSCK_SendText(CSCK1, "GETADC ". $port);// nächsten Wert anfordern
			SetValue(PORTNUM, $port);			  // neue Portnummer abspeichern
       }
	   else
			return;								// Schleife beenden
	break;
}

Gruß
HJH

Besten Dank für deine Mühe, kann das Script leider erst heute abend probieren, da der AVR-NET-IO z.Z. nicht eingschaltet ist.

Melde mich nach dem Test.

Viele Grüße
Thilo

Hallo,

für den Preis und mit diesen Schnittstellen ist das kleine Teil ja richtig genial. Überlege mir auch gerade so etwas zuzulegen.

Da stellt sich die Frage ob paresy hierfür ein Modul entwickeln könnte, auch wenn es sich relativ leicht auch ohne in IPS integrieren läßt.

Das hat mir jetzt keine Ruhe gelassen, ich bin per RDP auf meinen IPS Rechner, so sieht es aus und funktioniert auch:

<?

 
$regvarname="AVR RX";
$regvarID=IPS_GetVariableID($regvarname);

for ($port=1;$port<5;$port++)

{

$varname="AVR NetIO ADC $port";

SetValue($regvarID,"$varname:");

$result = CSCK_SendText(18472 /*[AVR Net-IO]*/, "GETADC $port".chr(13));

IPS_sleep(1);

list($varname,$value)=split(':',GetValuestring($regvarID));

$value = substr($value, 0, -2);

$varid=IPS_GetVariableID($varname);
SetValue($varid,$value);

}

?>

Das Script wird alle bei mir alle 3 Minuten vom Timer getriggert, die Register-Variable „AVR NetIO“ gibt an Wert an die String-Variable „AVR RX“, die anderen Variablen hatte ich auch leicht umbenannt in „AVR NetIO ADC #“.

Mit dem Trigger auf der Register-Variable hört sich gut an, ich werde es auch mal ausprobieren. Der Abschluss mit /r/n" ist mir in der AVR-Doku noch gar nicht aufgefallen. Ist der erst seit der V2 drin?

Viele Grüße

Jens

Hi Jens,

meine ersten 3 hatten Software Revision 1.01; da war das schon drin.

Momentan sind wir aktuell bei Firmware 1.03.

Ich hab alle 4 Devices von mir upgedatet auf diesen aktuellen Release, wobei das nur über das Flashen des Bootloaders geht.
Der normale Weg über das Firmwareupdate war bei mir bei einem Wechsel von 1.01 direkt auf 1.03 nicht möglich.

mfg

BerndJ

PS: Im Splittermodul entferne ich rechts die HEX Werte: 0D 0A, dann erscheinen die richtigen 3-stelligen Messwerte.

Nachschlag:
Wir sollten das Script erweitern auf die 4 Digitalports und das
Byte (GETSTATUS) der Ausgangsrelais, welches dann auf 8 Boolean Variablen gelegt wird.
Mir ist nämlich aufgefallen, daß zusätzlich zur bestehenden Verbindung zu IPS auch noch eine weitere Verbindung (Server.exe von Pollin) die Relais betätigen kann und es wäre schade, wenn IPS das nicht merkt.

Ein recht herzliches Hallo an die AVR-NET-IO-Profis,

hätte da mal eine kleine Frage.

Betreibt jemand die Schaltausgänge mit 230V. Das wäre mein primäres Interesse an dieser Karte. Habe deshalb auch schon bei Poll… nachgeshen, dort gibt es folgende Karte.

www.pollin.de - Sonderposten zu Superpreisen

Könnte man die mit dem AVR betreiben oder benutzt Ihr andere Lösungen.

Vielleicht hat jemand einen Tip für mich.

Hallo HJH,
habe das Script mal so eingearbeitet, aber es funzt so nicht.

Erstmal hat es über Zeile 38 (else) gemeckert, ich habe dann geschweifte Klammern vor Else eingefügt, um die IF-Anweisung zusammenzuhalten. Dann kam erstmal keien Fehlermeldung mehr, aber er führt nur den „Execute“-Zweig aus.
Der Variable-Zweig bleibt unberührt, da ja die NET-IO nicht von alleine sendet. Habe dann mal die beiden Zweige vertauscht (Execute und Variable getauscht), so das nur der zweite „Case“ ausgeführt wird.

Da kommt dann ne Fehlermeldung, das er bei „SetValue($varID, $IPS_VALUE);“ die 2 Variablen nicht in String überführen kann (oder so).
Ausserdem wird der Port nicht weiter hochgezählt. Ein anderes Mal meckert er den PORT 0 an, den er nicht handeln kann.

Vielleicht kannst du nochmal drüberschauen, ich bin bei php Analphabet.

Viele Grüße
Thilo

Hi Werner,

Du erwartest doch nicht im Ernst das Dir jemand die Freigabe erteilt: Das darfst Du.

Getreu dem Motto: jeder ist seines Glückes, oder aber Wohnungsbrandes! Schmied,

bist Du als Hersteller dieses Teiles für den Einsatz selbst verantwortlich.

Die Sicherheitsabstände auf der Leiterplatte betragen 7,5 mm und sind mit Lötstopplack versehen. Als Relais kommen bei mir SANYOU SRB-S-1120M zum Einsatz. Aufdruck: 3A bei 275 V AC.

mfg

BerndJ

BTW: Dein Link zeigt auf das richtige Produkt

Hallo Bernd,

erst einmal Danke für deine Antwort.

Das ich auf der AVR nicht mit 230V arbeite war mir im Vorfeld schon klar, arbeite ja schon länger am Thema Hausautomation :smiley:

Meine Hauptfrage die sich stellt ist, kann die im Link genannte Relaisplatine direkt über die, nennen wir sie mal Druckerports, gekoppelt werden.

Die zweite Frage war, wenn nicht so erkannt, welche Lösungen Ihr nutzt um den AVR mit 230V zu betreiben. Habt Ihr selbst eine Platine gebaut, nutzt Ihr eine Fertiglösung. Evtl. könnte man die im Link genannte 24V-Version nutzen und mit dieser einen Schütz ansteuern was aber erstens zu teuer wird und zweitens nicht gerade raumsparend ist.

Bin zwar im Thema Programmieren nicht von gestern aber Lötarbeiten und Platinenbauen ist nicht meine Stärke, deshalb auch meine Frage nach fertigen Lösungen.

Vielleicht habe ich mich jetzt verständlich genug ausgedrückt. :cool:

Nochmal @HJH:

Hier habe ich nochmal die genaue Fehlermeldung:

Warning: Could not convert variant of type (Null) into type (String) in [Test\NET-I/O auslesen] on line 36

In Zeile 36 steht der Befehl:

SetValue($varID, $IPS_VALUE); // empfangenen Wert abspeichern

$VarID hat er richtig, nur die $IPS-Value stimmt irgendwie nicht.

Als 2. Problem kommt das Script nicht in den Case-Fall „Variable“, auch wenn die Register Variable das Script als Zielscript hat.

Vielleicht hilft das bei der Aufklärung.

Danke für deine Mühe.

Viele Grüße
Thilo

Ach so, AVR NET-IO und diese Relaiskarte: Ja, siehe HIER, Stecker passen direkt zusammen, Stromversorgung erfolgt über die Relaiskarte bei gesetztem Jumper.

mfg
BerndJ

PS: für mich persönlich habe ich keine Probleme diese Einheit in einem geeignetem Gehäuse für 230 V AC zu nutzen.

Hallo Thilo,

die geschweiften Klammern haben tatsächlich gefehlt. Ich habe sie inzwischen nachgetragen. Danke für den Hinweis.

Das Skript kennt zwei Triggerquellen: den „Execute“ Button zum Starten und die Registervariable zum Abholen der Werte. Damit die registervariable zur Triggervariablen wird musst Du natürlich bei der Konfiguration der Registervariablen das Skript eintragen, das beim Trigger aufgerufen werden soll. Wenn Du das unterlässt, dann wird die Systemvariable $IPS_VALUE nicht mit dem Wert der Registervariablen beschickt. Das bedeutet, dass sie in dem Fall gar nicht existiert.

Wir reden hier von der Registervariablen „VAR“, nicht von der String-Variablen mit gleichem Namen.

Und nicht vergessen die ID der Integer-Variablen für die laufende Portnummer im Skript einzutragen.

Gruß
HJH

@HJH
Hallo,

habe mir die Registervariable „AVR“ nochmal angeschaut ind das Script als Trigger eingetragen (War auch schon so).

Es kommt trotzdem Die Fehlermeldung:
Warning: Could not convert variant of type (Null) into type (String) in [Test\NET-I/O auslesen] on line 37
Ich habe auch testweise eine Wartezeit eingefügt, aber das bringt auch nichts.

Hier der derzeitige Stand:

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Script AVR-NET-I/O abfragen
Trigger  : Register Variable "AVR"
Interval : 
*/

define("PORTNUM", 32107 /*[Test\PORTNUM]*/);                          // Integervariable aktuelle Portnummer; !!! ID muss angepasst werden !!!
define("CSCK1",   28669 /*[Client Socket AVR-NET-I/O]*/);
define("AVRADC1", 35939 /*[Test\AVR Net-I/O ADC 1]*/);
define("AVRADC2", 28623 /*[Test\AVR Net-I/O ADC 2]*/);
define("AVRADC3", 46636 /*[Test\AVR Net-I/O ADC 3]*/);
define("AVRADC4", 17409 /*[Test\AVR Net-I/O ADC 4]*/);
define("MAXPORT",     4);                          // Anzahl der vorhandenen Ports

//SetValue (32107,1);
//echo $IPS_SENDER;
switch($IPS_SENDER)                                // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "Execute":                                // von Hand aufgerufen: Schleife starten
       $port = 1;
       CSCK_SendText(CSCK1, "GETADC ". $port);    // ersten Wert anfordern
    break;

    case "Variable":                               // durch Registervariable aufgerufen: neuer Wert wurde empfangen
       $port = GetValue(PORTNUM);                  // aktuelle Portnummer holen
       $varID = constant("AVRADC". $port);         // daraus die varID ermitteln
//		echo $IPS_Value;
//              IPS_Sleep(200);
		 SetValue($varID, $IPS_VALUE);               // empfangenen Wert abspeichern
		echo $IPS_VALUE;
		 $port += 1;                                 // Portnummer inkrementieren
       if ($port <= MAXPORT)
            {CSCK_SendText(CSCK1, "GETADC ". $port);// nächsten Wert anfordern
            SetValue(PORTNUM, $port);}              // neue Portnummer abspeichern
        else;
            return;                                // Schleife beenden
    break;
}

?>

Irgendwas scheint bei der Übergabe mit $IPS_Value nicht zu stimmen.
Sorry, das ich mich so blöd anstelle, aber ich bekomme es nicht hin.

Schönen Abend
Thilo

Hallo Thilo,

welches ist die Zeile 37 bei Dir?

Gruß
HJH