Open Source im professionellen Einsatz

© pixelio.de

Perl misst Stromverbrauch mit Multimeter

E-Werke

Digitale Multimeter messen nicht nur Strom und Spannung, sondern auch Kapazität und Temperatur. Es gibt sogar in der 50-Euro-Preisklasse einige, die mit der seriellen Schnittstelle eines PC reden. Mit einfachen Perl-Skripten lassen sich hier die Daten auslesen und grafisch aufbereiten.

Beim Blättern im Katalog eines Elektronikversandhändlers fielen mir neulich preiswerte digitale Multimeter mit RS-232-Schnittstelle auf. Bei Ebay fand ich schließlich das Modell MAS-345 der Firma Mastech zum günstigen Preis von 35 Dollar und drückte ruck, zuck! auf den Buy-it-now-Button.

Windows? Nein danke!

Als das Gerät ins Haus kam, lag natürlich nur eine Windows-CD bei, aber eine kurze Suche im Netz förderte das Marsh-Projekt [2] zutage, das mit etwas C-Code unter anderem das Mastech MAS-345 ansteuert. Das Protokoll auf der seriellen Leitung ist nicht weiter kompliziert: Nach einigen einleitenden Signalen zur Leitungsklärung schickt der PC ein Newline-Zeichen an das Messgerät. Es antwortet mit einem 14 Byte langen String, der den auf der LCD-Anzeige des Multimeters dargestellen Wert enthält.

Optional sendet es zusätzlich auch noch die eingestellte Maßeinheit. Steht im zurückgelieferten String zum Beispiel »V -120.3 mV«, befindet sich das Multimeter im Modus für die Spannungsmessung und zeigt -120,3 Millivolt an. Die Kommunikation mit dem Multimeter dauert etwa eine Sekunde, sodass der Computer maximal einen Messwert pro Sekunde abholen kann.

Objektorientiertes RS-232

Listing 1 zeigt ein Testskript, das einen Wert vom Multimeter holt. Das CPAN-Modul Device::SerialPort bietet eine objektorientierte Schnittstelle, um mit einem seriellen Port des Rechners zu kommunizieren. Der wiederum spricht per RS-232-Protokoll mit dem Multimeter am anderen Ende der Leitung.

Listing 1:
»mmread«

01 #!/usr/bin/perl -w
02 use strict;
03 use Device::SerialPort;
04
05 my $serial = Device::SerialPort->new(
06   "/dev/ttyS0");
07
08 $serial->baudrate(600);
09 $serial->databits(7);
10 $serial->purge_all();
11 $serial->rts_active(0);
12 $serial->dtr_active(1);
13
14  # Send request
15 $serial->write("n");
16  # Wait one second
17 select(undef, undef, undef, 1);
18
19  # Read response
20 my($count, $data) = $serial->read(14);
21 print "$datan";

Das in Listing 1 vorgestellte »mmread« verbindet sich zunächst mit dem ersten seriellen Port, dessen Device-Eintrag »/dev/ttyS0« ist. Damit das Skript auch unter normalen User-Accounts läuft, sollte Root vorher der Allgemeinheit für diesen Port mit »chmod a+rw /dev/ttyS0« Schreib- und Leserechte einräumen. Wessen neumodischer Computer keine serielle Schnittstelle mehr hat, kann sie mit einer PCI-Karte für etwa zehn Euro nachrüsten.

Zunächst stellt das Skript die Baudrate auf 600 und die Anzahl der Datenbits auf 7 ein. Die danach aufgerufene Methode »purge_all()« nutzt intern die Unix-Funktion »tcflush(2)« mit dem Flag »TCIOFLUSH« und löscht damit etwa noch herumgeisternde Daten. Das anschließende Klären der RTS- und Setzen der DTS-Leitung leitet die Kommunikation mit dem Multimeter ein. Die Methode »write()« schickt jetzt ein Newline-Zeichen an das Multimeter, das nach kurzer Verzögerung mit den Daten antwortet, die sein Display darstellt.

Das Skript wartet deswegen erst einmal eine Sekunde, bevor es die Daten abholt. Das könnte ich einfach mit »sleep(1)« machen, aber »select()« unterstützt auch Sekundenbruchteile. Während der Skriptentwicklung habe ich verschiedene Werte probiert, bin aber bei einer Sekunde als zuverlässiger Lösung hängen geblieben. Die Funktion »read()« liest genau die 14 Zeichen, die das Multimeter schickt. Die Ausgabe mit »print« in Zeile 21 bestätigt, dass ein korrekt formatierter Datenstring angekommen ist.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook