Open Source im professionellen Einsatz
Linux-Magazin 08/2007
© pixelio.de

© 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.

512

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.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Der Perl-Screencast zum Linux-Magazin 2014/02

    Gesund im Alter: Schon viele mögen den Skript-Altvater Perl für tot erklärt haben. Doch sie irren, wie ein wirklich interessierter Blick auf die Neueingänge des Softwarerepository CPAN zeigt.

  • Klimaforschung

    Hält sich die Hitze noch im Rahmen? Beim Überwachen der Zimmertemperatur mit einem preiswerten USB-Sensor bietet das Holt-Winters-Verfahren aus dem RRDTool-Werkzeugkasten einen Ansatz, um gewöhnliche Schwankungen von Ausreißern zu unterscheiden.

  • Datenfischer

    XML ist ein nicht überall heiß geliebtes, aber viel genutztes Austauschformat. Für Perl gibt es sehr viele Erweiterungen, um bequem in diesem Datenmeer zu fischen. Der heutige Snapshot diskutiert Vor- und Nachteile der gängigen XML-Module — das jeweils zweckmäßigste ist dann schnell gefunden.

  • Daten ausgesiebt

    Ständig reinrieselnde Messdaten müssen die Festplatte nicht vollstopfen. Bei älteren Werten genügt ein Überblick, während fürs aktuelle Geschehen alle Details wichtig sind. Eine Round-Robin-Datenbank wie RRDtool vergisst unwichtige Werte, das System bleibt bis zum Sankt-Nimmerleins-Tag wartungsarm.

  • Selektive Wärme

    Linux-Magazin-Leser Alexander-Philipp Lintenhofer heizt sein Haus mit einer Wärmepumpenanlage. Weil sich deren Steuerung als grottig erwies, startete er ein Selbstbauprojekt. Heute sitzt er stets im Warmen und weiß viel über stimmiges Management von Projekten.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.