Einsatz:
Implementierung von verschiedenen zusätzlichen ELV-Geräten (Devices) in IP-Symcon
Download: www.tdressler.net
Komponenten:
FS20PCS -Steuerung des ELV USB FS20 Schaltinterfaces FS20PCS
FS20PCE -Steuerung des ELV USB FS20 Empfängers FS20PCE
folgende Geräte sind bei ELV nicht mehr gelistet(Stand Apr 2012)
USB-SI1 -Steuerung des ELV Schaltinterface per USB
ULA200 -Kontrolle der ELV USB ULA200-LCD-Ansteuerung
(U)IO88 – Steuerung des 8+8 In/Out-Moduls über USB bzw. seriellen.Port
UAD8 – Steuerung des ELV USB 8Kanal A/D-Wandlers
M232 – Kontrolle des ELV M232 Messwandlers
Kompatibilität und Voraussetzungen
IP-Symcon Kernel/SDK Version 2.5+ (die Module sind SDK-Versionsspezifisch)
IP-Symcon FTDI-Modul
IP-Symcon ComPort-Modul
IP-Symcon HID-Modul (für USB-SI1, FS20PCE und FS20PCS)
viele (nicht alle) gerätespezifische Features
Installation
Bei einem Update ist der IPS-Dienst als erstes zu stoppen.
Die Datei ELV2.dll muss in das IP-Symcon-“modules“-Unterverzeichnis kopiert werden.
Ist das Verzeichnis noch nicht vorhanden,
muss es manuell im IP-Symcon Hauptverzeichnis angelegt werden.
Anschließend muss der IPS-Dienst neu gestartet werden.
Konfiguration:
Zunächst muss eine Instance für das passende Gerätemodul für die eingesetzte Hardware ausgewählt und angelegt werden. Dazu (entsprechend der jeweils gültigen IP-Symcon-Dokumentation ) in der Verwaltungskonsole "Objekt hinzufügen"->"Instanz-Hinzufügen" auswählen. Bei einem Splitter oder IO-Modul muss die Option "Alle Module anzeigen" gesetzt sein. Dort kann das entsprechende Modul selektiert werden. Erscheint der Name des gewünschten Module als neben "Modulname:" kann der Dialog mit Weiter verfollständigt werden.
Bild zeigt Auswahl für WS300 Splittermodul
Anschließend muss die Konfiguration überprüft werden. Bei Bedarf legen sich einige Module eine passende "Übergeordnete-Instanz" an, verwendet aber bevorzugt schon vorhandene kompatible Parents. Diese Auswahl muss unbedingt geprüft und ggf. korrigiert werden.
Wichtig: Sind im System schon kompatible-IO-Instanzen vorhanden, wird sich das Modul diese Instanz bei Neuanlage als parent suchen. Das kann leider dazu führen, das deren Konfiguration geändert wird. Diese Konflikte müssen z.Z. manuell evtl. mit einer Neuanlage einer IO-Instanz und deren Zuweisung an das Device gelöst werden (siehe "Bekannte Probleme"
Die eingestellte Konfiguration muss nun noch mit "Übernehmen" und "OK" bestätigt werden. Evtl. noch notwendige Zusatzkonfigurationen können leider auf Grund einer Beschränkung des aktuellen IP-Symcon-SDK nicht auf diesen Seiten vorgenommen, aber über PHP-Funktionen eingestellt werden. Dazu ist die Modulreferenz zu konsultieren.
Bei einer richtigen Verknüpfung von Parent (IO-Modul) und Splitter ist von nun an ein Datenempfang und Verarbeitung möglich. Zur Nutzung ist teilweise die Erstellung eines geeigneten PHP-Skriptes notwendig, in dem die Gerätespezifischen Funktionen ausgewählt und Aktiviert werden können(siehe Referenz) Bei Problemen und Fehlanzeigen liefert die Debug-Funktion wertvolle Hinweise
1.FS20PCS und FS20PCE
Diese Splittermodule verbinden existierende FS20-Instancen mit den USB FS20 Sender FS20PCS (Art. 085861) bzw. dem USB FS20 Empfänger FS20PCE (Art. 085853)
Status-Variablen
keine Statusvariablen implementiert
Konfiguration
Zuerst muss bei eingestecktem Gerät jeweils eine neue IO-Instance Type HID angelegt werden. Anschliessend kann die jeweilige Splitterinstance erstellt werden. Dabei ist darauf zu achten, das die zugehörige übergeordnete(parent) HID Instance korrekt auswählt wird. Zum Schluss wird die gewünschte FS20-Instance erstellt. Das Modul FS20PCE wird sich empfangene Geräte als FS20Fernbedienung-Instancen selber anlegen bzw. in vorhandene FS20Fernbedienungs-Instancen neu empfangene Geräte mit gleichem Hauscode eintragen. Bei manueller Erstellung muss das passende Splittermodul (FS20Gerät->FS20PCS, FS20Fernbedienung->FS20PCE) als übergeordnete (parent) Instance zugewiesen werden.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Das FS20Gerät wurde manuell angelegt,die FS20PCE-Geräte automatisch (auch wenn der Device Screen das nicht vorsieht :-)))

FS20x Instancen
PHP-Funktionen
function GetVersion;
liest die übermittelte Firmwareversion aus.
Hinweis:Dieses Feld ist erst nach einer erfolgreichen Kommunikation gefüllt
2.USB-SI1
Funktion
Schaltet eine 220V Steckdose über USB (Artikel 084700, nicht mehr lieferbar)
Status-Variablen
Status (boolean) Profile dpSwitch
StatusText(string) Kommunikations-Status in Textform
StatusData(integer) Kommunikations-Statuscode lt Gerätebeschreibung
Konfiguration
Übergeordnete Instance(HID) und Gerät korrekt auswählen
![]() |
![]() |
PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "SI1_"
Die Syntax orientiert sich an den bekannten FS20-Geräten.
function GetDevStatus;
liest den aktuellen Gerätestatus(integer) aus dem Device und aktualisiert die Statsvariablen
function Switchmode(status:boolean);
schaltet das Device permanent An(true) bzw. Aus(false)
Beispiel: SI1_SwitchMode(false); //Aus
function SwitchDuration(status:boolean;dauer: integer);
Schaltet das Gerät für <dauer> Sekunden in den mit <status> angegebenen zustand und dann wieder zurück. Der Status wird nach Übergabe des Befehls aktualisiert. Wenn das Zurückschalten ebenfalls registriert werden soll, muss nach der angebenen Zeit erneut GetdevStatus aufgerufen werden.
Beispiel:
<?php
//Fügen Sie hier ihren Skriptquellcode ein
SI1_SwitchMode(12037 /*[SI1]*/,true);
sleep(2);
echo SI1_GetDevStatus(12037 /*[SI1]*/);
SI1_SwitchDuration(12037 /*[SI1]*/,false,3);
sleep(5);
echo SI1_GetDevStatus(12037 /*[SI1]*/);
?>
3.ULA200
Funktion
Dieses Device dient zur
Ansteuerung der ELV USB-LCD-Ansteuerung ULA200 (Artikel-Nr. 572-39, nicht mehr lieferbar)
Damit kann ein man übliches LCD-Display mit max 80 Zeichen
gesamt (4x20) ansteuern und 6 masseaktive Kontakte (Tasten) gemeldet
bekommen.
Status-Variablen
Keys(integer) Wert der Tastaturabfrage. Bit0-5 sind jeweils einem Kontakt zugeordnet. Der Wert wird entweder nach einem Kontaktereignis (Set) oder einem Timerevent(Reset) gesetzt
Konfiguration
Übergeordnete Instance(FTDI) und dort das Device ULA200 korrekt auswählen
Der mitgelieferte Treiber(oder ein aktualisierter FTDI-Treiber) muss installiert sein
Ist ein Parent zugewiesen, werden die Parameter des Parents durch Übernehmen der ULA200-Konfiguration neu gesetzt (19200,8,E,1)

PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "ULA200_"
CLS-Löscht die vorhandene Ausgabe und setzt den Cursor auf Position 0,0
Backlight(status:boolean)->schaltet die Hintergrundbeleuchtung ein oder aus
SendText(Text:string) ->sendet String an die aktuelle cursorposition (max 80 chars)
Goto(Spalte(X),Zeile(Y):integer) ->setzt Cursor an die entsprechende Position (Spalte=0..19, Zeile=0..3), je nach eingesetztem Display
Anmerkung: Negative Ergebnisse bedeuten Fehler.
<? //File: ULA200_Test.ips.php $res=ULA200_CLS(62671); //Screen löschen $res=ULA200_LCDBacklight(62671,true); //Hintergrundbeleuchtung einschalten $res=ULA200_LCDSendText(62671,'Hallo'); //Text ausgeben sleep(2); //warten 2s $res=ULA200_LCDGoto(62671,0,2); //Setzt Cursor in Zeile 3, Spalte 0 $res=ULA200_LCDSendText(62671,'Now waiting...'); sleep(5); //warten 5s $res=ULA200_LCDBacklight(62671,false); //Hintergrundbeleuchtung aus $res=ULA200_LCDCLS(62671); //Screen löschen ?>
4. UIO88
Funktion
Dieses Device dient zur
Ansteuerung des ELV USB-Interfaces UIO88 (Artikel-Nr. 539-64, nicht mehr lieferbar)
sowie des seriellen Vorläufers IO88 (Artikel-Nr. 472-69, nicht mehr lieferbar).
Damit kann man 8 Eingänge abfragen und 8 Ausgänge
ansteuern.
Status-Variablen
Input (Integer)->letztes gelesene Byte am Input-Port
Output(Integer) ->letztes Byte am Ausgabeport
Konfiguration
Übergeordnete Instance(FTDI bei UIO88, dort das Device UIO88 bzw. SerialPort bei IO88) korrekt auswählen
Der mitgelieferte Treiber(oder ein aktualisierter FTDI-Treiber)beim UIO88 muss installiert sein
Ist ein Parent zugewiesen, werden die Parameter des Parents durch Übernehmen der UIO88/IO88-Konfiguration neu gesetzt (9600,8,E,1)

PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "UIO88_"
function GetInput():integer-Holt den Zustand der 8 Eingangskanäle .
Function GetOutput():integer;->Holt den Zustand der 8 Ausgangskanäle .
Function SetOutput(value:integer):integer ->setzt alle 8 Ausgangskanäle und liefert den aktuellen Zustand zurück .
function SetOutputBit(Bit:integer,State:boolean):integer->setzt im Ausgangskanal ein Bit(1..8) auf State(true/false) und liefert den aktuellen Zustand aller Ausgangskanäle zurück.
Anmerkung: Negative Ergebnisse bedeuten Fehler.
Hinweis: Dieses Modul ist lediglich eine formale Portierung nach IPS V2.Da ich das Gerät nicht selber besitze, kann ich die Funktionalität nicht testen
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : UIO88_Test.ips.php
Trigger :
Interval:
*/
echo "Try to get state of Input channels\r\n";
$res=UIO88_GetInput(16870);
if ($res<0) {
echo "Operation failed:".$res."\r\n";
}Else {
echo "Return Input State:".$res."\r\n";
}
echo "Try to get state of Output channels\r\n";
$res=UIO88_GetOutput(16870);
if ($res<0) {
echo "Operation failed:$res\r\n";
}Else {
echo "Return Output State:$res\r\n";
}
echo "set Output to 55hex ='01010101'\r\n";
$res=UIO88_SetOutput(16870,85);
if ($res<0) {
echo "Operation failed:$res\r\n";
} Else {
echo "Return Output now:$res\r\n";
}
echo "set Bit 7 Output \r\n";
$res=UIO88_SetOutputBit(16870,7,true);
if ($res<0) {
echo "Operation failed:$res\r\n";
} Else {
echo "Return Output now:$res\r\n";
}
echo "reset Bit 7 Output \r\n";
$res=UIO88_SetOutputBit(16870,7,false);
if ($res<0){
echo "Operation failed:$res\r\n";
} Else{
echo "Return Output now:$res\r\n";
}
?>
5. UAD8
Funktion
Dieses Device dient zur
Ansteuerung des ELV USB 8-Kanal Analog/Digital-Wandlers
UAD8(Artikel-Nr. 563-72, nicht mehr vom Hersteller lieferbar).
Damit kann man auf maximal 8 Kanälen eine Spannung von 0-2,5V
mit 8bit Auflösung angezeigt bekommen.
Status-Variablen
für alle Sensoren
Channel_1-8 Analog-Kanäle
Konfiguration
Übergeordnete Instance(FTDI)und dort das Device UAD8 korrekt auswählen
Der mitgelieferte Treiber(oder ein aktualisierter FTDI-Treiber) muss installiert sein
Ist ein Parent zugewiesen, werden die Parameter des Parents durch Übernehmen der UAD8-Konfiguration neu gesetzt (38400,8,E,1)

PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "UAD8_"
function ActivateChannel(channel:integer):integer-Aktiviert die Wandlung an Kanal <channel>
function GetData(channel:integer):integer->Holt das Ergebnis der A/D-Wandlung für Kanal <channel>.
function RunTest:boolean->alle Channels werden nacheinander aktiviert und abgefragt
Anmerkung: Negative Ergebnisse bedeuten Fehler.
Hinweis: Dieses Modul ist lediglich eine formale Portierung nach IPS V2.Da ich das Gerät nicht selber besitze, kann ich die Funktionalität nicht testen
<?
//UAD8_Test.ips.php
$channel=1;
$res=UAD8_ActivateChannel(45933,$channel,true); //activiere Kanal1
$data=UAD8_GetData(45933,$channel); //Kanal 1 abfragen
If ($data<0) {
echo “Kanal: ”.$channel.”-> Error: ”.$data.”\n”;
} else {
echo "Kanal ".$channel.” -> ”.$data .” Volt\n”;
}?>
6.M232
Dieses Device dient zur Ansteuerung des seriellen ELV Interfaces M232 (Artikel-Nr. 292-30, nicht mehr lieferbar). (Anleitung hier: hier (http://www.elv-downloads.de/service/manuals/M232/M232_UM_G_020423.pdf) )
Damit kann man 8 digitale IO Ports ansteuern/abfragen(5V Logik) und 6 Analoge Kanäle (0-5V) mit 10Bit wandeln. Ein IO-Port ist als 16Bit-Zähler verwendbar.
Status-Variablen
Channel_0-5 Analog-Kanäle
Counter Zähler-Variable
IO In/Out-Byte
Konfiguration
Übergeordnete Instance(SerialPort) korrekt auswählen
Ist ein Parent zugewiesen, werden die Parameter des Parents durch Übernehmen der M232-Konfiguration neu gesetzt (2400,8,N,1)

PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "M232_"
GetIOByte(InstanceID)-Holt den Zustand aller 8 IO-Ports
function GetIOBit(Bit:integer):integer->Holt den Zustand des IO-Port x (0..7)
function SetIOByte(States:integer):integer ->setzt alle 8 IO-Ports
function SetIOBit(Bit:integer,boolean):integer->setzt Port x(0..7) auf State(true/false) und liefert den aktuellen Zustand aller Ausgangskanäle zurück
function GetCounter():integer->Holt den Zählerstand des Counters (IO-Port 7)
function SetCounter(State:boolean):integer ->Stoppt (false) oder Startet/Reset Counter neu(true)
function GetAnalog(Channel:integer):integer->Holt den A/D-Wert von Analogport (0..5)
function StartAnalog(Command:integer):integer ->Startet A/D-Wandler(0..6 siehe Original-Beschreibung)
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : M232_Test.ips.php
Trigger :
Interval:
*/
echo "set Output to 55hex ='01010101'\r\n";
$res=M232_SetIOByte(23879,85);
if ($res<0) {
echo "Operation failed:$res\r\n";
} Else {
echo "Return Output now:$res\r\n";
}
echo "Try to get state of Output channels\r\n";
$res=M232_GetIOByte(23879);
if ($res<0) {
echo "Operation failed:$res\r\n";
}Else {
echo "Return IO State:$res\r\n";
}
echo "Try to start counter\r\n";
$res=M232_SetCounter(23879,true);
if ($res<0) {
echo "Operation failed:$res\r\n";
}Else {
echo "Return State:$res\r\n";
}
echo "set Bit 0 \r\n";
$res=M232_SetIOBit(23879,0,true);
if ($res<0) {
echo "Operation failed:$res\r\n";
} Else {
echo "Return now:$res\r\n";
}
echo "Try to get state of IBit 0\r\n";
$res=M232_GetIOBit(23879,0);
if ($res<0) {
echo "Operation failed:".$res."\r\n";
}Else {
echo "Return Input State:".$res."\r\n";
}
echo "reset Bit 0 \r\n";
$res=M232_SetIOBit(23879,0,false);
if ($res<0){
echo "Operation failed:$res\r\n";
} Else{
echo "Return Output now:$res\r\n";
}
echo "retrieve Counter \r\n";
$res=M232_GetCounter(23879);
if ($res<0) {
echo "Operation failed:".$res."\r\n";
}Else {
echo "Return Counter:".$res."\r\n";
}
echo "Start Analog \r\n";
$res=M232_StartAnalog(23879,2);
if ($res<0){
echo "Operation failed:$res\r\n";
} Else{
echo "Return Output now:$res\r\n";
}
echo "Retrieve Analog Value Channel 1\r\n";
$res=M232_GetAnalog(23879,1);
if ($res<0){
echo "Operation failed:$res\r\n";
} Else{
if ($res<65536) {
echo "Return Analog Port 1 new Value:$res\r\n";
} else {
$res=$res-65536;
echo "Return Analog Port 1 old Value:$res\r\n";
}
}
echo "Retrieve Analog Value Channel 1 again\r\n";
$res=M232_GetAnalog(23879,1);
if ($res<0){
echo "Operation failed:$res\r\n";
} Else{
if ($res<65536) {
echo "Return Analog Port 1 new Value:$res\r\n";
} else {
$res=$res-65536;
echo "Return Analog Port 1 old Value:$res\r\n";
}
}
?>
Statuscodes
const USB_ERROR_UNBEKANNT =-1;
const USB_ERROR_RAHMEN =-2;
const USB_ERROR_QUER =-3;
const USB_ERROR_OVER =-4;
const USB_ERROR_PARITY =-5;
const USB_ERROR_FRAME =-6;
const USB_ERROR_TIMEOUT =-7;
const USB_ERROR_ANTWORT =-8;
const USB_ERROR_N_OFFEN =-9;
const USB_ERROR_ANZAHL =-10;
const ERROR_VERIFY =-11;
const USB_ERROR_CHANNEL=-12;
Bekannte Probleme
Beim Anlegen eines Splitters kann es vorkommen, das eine schon genutzte IO-Instanz als Parent gesetzt und damit verkonfiguriert wird. Workaround: Manuelle Konfiguration eines neuen IO-Moduls und Korrektur der Einstellungen des falsch zugeordneten Moduls
Stand Dokumentation: Version 2.5.66 02.05.2012