Einsatz:
Implementierung von der Status-Abfrage EM1000Series Energie-Zählern (Devices) mit Anschluss an Datalogger EM1010PC (Splitter) in IP-Symcon
Download: www.tdressler.net
Komponenten:
EM1010PC-Splitter - Auslesen der Sensordaten, die von einem ELV EM1010PC- USB Empfangsgerät bereitgestellt worden sind
EM1010Dev Sensor Device Anzeige der Daten eines spezifischen Sensors
Kompatibilität und Voraussetzungen
IP-Symcon Kernel/SDK Version 2.5+ (die Module sind SDK-Versionsspezifisch)
unterstützten Sensoren (EM1000WZ,EM1000IR/S,EM1000GZ,EM1000FM) . Es wurde auch berichtet, das das Modul mit dem baugleichen Conrad System „Energy Control 3000 USB“ und den Sensoren ES-1 und ES-2 funktioniert.
EM1010PC mit FTDI VCP-Driver enabled (Virtual ComPort assigned) . Es empfielt sich, die aktuellen Treiber von FTDI zusammen mit den angepassten INF-Files zu verwenden (siehe Thread im Forum).
Port.DLL von www.b-kainka.de
Original-Software ist für das Modul nicht notwendig, wird aber noch zum Auslesen und Rücksetzen des Speichers benötigt.
Installation
Die Datei em1010.dll muss in das IP-Symcon Modules Verzeichnis kopiert werden. Die port.dll muss entweder im PATH oder im Verzeichnis liegen, wo sich ips.exe befindet. Anschließend muss der Dienst neu gestartet werden.
Konfiguration:
Als erstes muss in den Geräteeinstellungen bei eingestecktem EM1010PC überprüft werden, ob der Virtual ComPort in den FTDI-Treibereinstellungen enabled und ein COMPort zugewiesen worden ist. Im Gerätemanager ist der neu zugewiesene ComPort zu notieren.

USB Device Konfiguration

VCP aktivieren

Com-Port notieren
Jetzt muss das eine Instanz des Splittermodul angelegt werden. Dazu (entsprechend der jeweils gültigen IP-Symcon-Dokumentation ) in der Verwaltungskonsole "Objekt hinzufügen"->"Instanz-Hinzufügen" auswählen. Im nächsten Fenster erst den Haken bei "Alle Module anzeigen" machen, dann kann man links die Sektion "Splitter auswählen, wodurch rechts alle Splittermodule auftauchen. Dort kann das entsprechende Splittermodul selektiert und der Dialog mit OK verlassen werden.


Es ist keine „parent“-IO-Instance notwendig, da das Modul über eigene IO-Routinen verfügt. Anschliessend ist mittels eines kleinen PHP-Scriptes der vom EM1010PC belegte virtuelle ComPort anzugeben.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 Konfiguration ist von nun an ein Datenempfang und Verarbeitung möglich. Nach Ablauf des vorgegebenen Ausleseintervalles(300s) sollten die Sensoren als neue Objekte angelegt worden sein, für die bereits Datensätze im EM1010PC vorliegen. Das manuelle Erstellen der Sensor-Instanzen ist bei diesem Modul i.d.R. nicht notwendig. Bei Problemen und Fehlanzeigen liefert die Debug-Funktion wertvolle Hinweise

1. EM1010PC
Funktion
Extrahiert Daten aus der USB-Schnittstelle des EM1010PC Loggers
Status-Variablen
keine
Konfiguration
Ein aktueller FTDI-Treiber mit VCP enabled muss installiert und ein ComPort zugewiesen sein.
Der zugewiesene Comport muss mit SetPort dem Modul bekannt gemacht werden
weitere Parameter werden über freigegebene Get/Set PHP-Funktionen eingestellt
PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "EM1010PC_"
procedure SetInterval(Intervall: integer);
setzt das Auslese-Interval in Sekunden. Standard sind 300s=5min
Beispiel: EM1010PC_SetInterval($id,600); //Ausleseintervall=600s
function GetInterval: integer;
liest das zuletzt eingestellte Ausleseintervall
procedure SetLogFile(name:string);
setzt Filename zum Loggen der empfangenen Daten in eine Datei. Relative Pfadnamen beziehen sich auf die Position von ips.exe. Es wird eine CSV-Datei im folgenden Format erzeugt. Ist kein Dateiname gesetzt oder ist dieser leer, wird keine Logdatei erzeugt(Standard). Die Daten werden an eine vorhandene Datei angehangen. Es werden mehr Felder geloggt als angezeigt.
Beispiel: EM1010PC_SetLogFile($id,"em1010data.log"); //Log to %IP-Symcon%\em1010data.log
Date;Device;pulses;pulses_max;EnergyConst;Readings;devs;FirstPage;Cur_Power;Cur_Power_Max;Sum_H_Energy;Sum_D_Energy;Sum_W_Energy;Total_Energy;Price_cf;alarm_pa;iec;Cur_Energy;pulses_total; 2012-01-28 15:28:45;1;7;377;150;6255;1;25;0.560;30.160;1.053;13.473;102.120;751.233;0.224;65283;150;0.047;112685; 2012-01-28 15:28:45;5;6;7;1000;6261;2;26;0.072;0.084;0.019;0.745;5.098;15.618;0.224;2300;1000;0.006;15618; 2012-01-28 15:33:48;1;8;385;150;6256;1;25;0.640;30.800;1.060;13.500;102.127;751.287;0.224;65283;150;0.053;112693; 2012-01-28 15:33:48;5;6;7;1000;6262;2;26;0.072;0.084;0.024;0.750;5.099;15.623;0.224;2300;1000;0.006;15623; 2012-01-28 15:38:51;1;8;358;150;6257;1;25;0.640;28.640;1.033;13.520;102.133;751.340;0.224;65283;150;0.053;112701; 2012-01-28 15:38:51;5;6;8;1000;6263;2;26;0.072;0.096;0.029;0.755;5.102;15.628;0.224;2300;1000;0.006;15628;
function GetLogFile: string;
liest den Namen der eingestellten Logdatei. Leerer String, wenn nicht gesetzt.
function GetPort: integer;
gibt den gespeicherte ComPort als Integer zurück.
function GetVersion: string;
liest die Firmwareversion des EM1010PC und gibt sie als X.Y aus.
function GetTime: integer;
liest die Uhrzeit aus dem EM1010PC aus und gibt sie im Format YYYY-MM-DD HH:MI:SS zurück
procedure SetPort(I: integer);
stellt den zu verwendenden ComPort ein.
procedure SetTime(datum: string);
setzt das Datum in der EM1010PC. Das Format entspricht den LocaleSettings für Land 49 (Deutschland)
function GetVersion:string;
liest die Firmwareversion aus der EM1010PC
procedure update;
entspricht der Funktion "getDevStatus und wird für alle potentiellen Devices von 1-12 ausgeführt
procedure Reset;
führt einen Reset des EM1010 aus.(siehe Doku).
4. EM10101Device
Funktion
Anzeige der von den Splittern aufgearbeiteten Sensor-Daten. Dabei wir für jeden Sensor pro Splitter eine eigene Instanz angelegt und mit dem anlegenden Splitter verknüpft. Jede Instanz referenziert auf die Device-ID des Sensors. Sensoren mit der Device-ID 0-3 gehören zu Em1000WZ und EM1000IR/S-Sensoren, welche die Umdrehungen der Scheibe eines Wechselstromzählers erfassen. Für diese Sensoren muss eine Zählerkonstante für die Anzahl der Umdrehungen(Impulse) pro KW hinterlegt werden. Die Device-ID 4-8 gehören zu EM1010 FM-Messgeräte. Diese senden genau einen Impuls pro Watt, so dass keine Konstante notwendig ist. Die Device-ID 9-12 sind EM1000GZ Gaszählern zugeordnet.
Status-Variablen
Act_Power_5min:aktueller Verbrauch der letzten 5min (kwh bzw m³)
Act_Power_hour:aktueller Verbrauch der letzten 5min skaliert auf eine Stunde (kwh/h bzw m³/h)
Act_Power_Max: höchster gemessener 5min Wert skaliert auf 1Std (kwh/h bzw m³)
Act_Pulses_5min: Zählerpulse letzte 5min
Act_Pulses_max: max Zählerpulse in 5min
EnergyConst: Zählerkonstante Pulse pro kwh bzw. m³
HistoryRecords: Anzahl der gespeicherten Datensätze pro Device
LastHistoryRecord: Letzter (theoretisch) vorhandener Datensatz. Berechnung: now()-(HistoryRecords*300)Sek= Datum LastHistoryRecord
Sum_Daily_Energy, Sum_Weekly_Energy,Sum_1hour_Energy,Total_Energy : Auf den jeweiligen Zeitraum summierter Energieverbrauch
UnitPrice:Im Gerät eingestellter Preis pro Einheit(Kw) in Euro
![]() |
![]() |
|
| IPS Status Variablen | Darstellung im Webfrontend |
Konfiguration
keine Konfiguration erforderlich
PHP-Funktionen
Alle Funktionen haben im PHP den Präfix "EM1010Dev_"
procedure SetDeviceID(DeviceID: Integer);
ist als Schnittstelle zum Konfigurationsdialog gedacht und sollte nur in Ausnahmefällen direkt aufgerufen werden. Damit wird die Sensorid gesetzt, auf die die Instanz reagiert. Es können durchaus mehrere Instanzen pro SensorID gleichzeitig im System sein.
function GetDeviceID:integer;
gibt die aktuell konfigurierte Sensor-ID zurück
function getDevStatus:boolean
fragt den aktuellen Status für das Device am EM1010PC abl
function getlastRecord:string
gibt den letzten übertragenen Status für das Device am EM1010PC im CSV-Format(wie in der log Funktion) zurück. Diese Funktion kann man in ein DB-LoggingScript einbauen, welches von einer beliebigen Variablenänderung für dieses Device getriggert werden
Beispiel zum Loggen in eine Postgresql-DB mittels Eventscript.
procedure SetRperKW(I: integer);
setzt neue Zählerkonstante (Umdrehungen pro KWh).
Default:75.
Nur für Sensor 1-4(WZ) und wird im EM1010PC abgespeichert
procedure SetEnergyConst(I: integer);
setzt neue Zählerkonstante (Umdrehungen pro KWh).
Default:1000 für Sensor 5-8(WZ)
Default: 100 für Sensor 9-12(GZ)
Die Zählerkostante ist eigentlich im EM1010PC fest verdrahtet.
Auf Grund unterschiedlicher Anwendungen z.B. bei Gas nur die 2.Stelle statt der 3.Stelle zählen
(siehe Forum)
habe ich es konfigurierbar gemacht. Diese Einstellung kann nicht im EM1010PC gespeichert werden,
so das dort ggfls andere Daten angezeigt werden können.
procedure SetPrice(P: float);
setzt Price per kmh/m³ für das Device in Euro
procedure update:boolean;
fordert den angeschlossenen Splitter zur Datenaktualisierung auf. Dabei wird die getDevStatus-Funktion ausgeführt.
Stand Dokumentation: Version 2.5.113 28.01.2011