Zweiter Gehversuch mit Perl, ELV ASH2200 und ELV FS20 WUE

Die Lüftersteuerung möchte ich mit mit der home automation software FHEM machen (http://fhem.de/fhem.html). Diese Software habe ich gewählt ich gedacht habe, dass es ja das Modul USB-WDE1 gibt, dass ja den Sensor ASH2200 schon unterstützt. Das scheitert aber an zwei Punkten:
  • Das ELV Modul USB-WDE1 ist nicht einfach dasselbe die zusammengelötete Version von ELV FS20 WUE und ELV Mini-USB-Modul UM2102 (unterschiedliche Baudraten und Text output Format)
  • Beim FHEM Modul 70_USBWX.pm hatte ich nicht den Eindruck, dass es wirklich unter windows getested wurde.
Also habe ich mich dazu entschlossen selber ein perl Modul für FHEM zu schreiben. Da der Textmode des Modules FS20 WUE nicht dokumentiert ist habe ich mich für den hexmode entschlossen, was letztlich viel aufwendiger als gedacht war.


  • Mit $port->are_match(pack( 'H[08]', '020ca201' ));  wird der Start eines Wetterdaten-Paket (Startzeichen, Befehlslänge, Antwort-ID und Sensor-Typ) erkannt - wie ein Prompt.  Die Beschränkung auf die Befehlslänge = 0c und Sensor-Typ=01 ist für mich kein Problem.
  • Das extrahieren der Adresse, der Temperatur und der relativen Feuchtigkeit wird mit pack/unpack gemacht. Da hat das perl pack tutorial weitergeholfen http://perldoc.perl.org/perlpacktut.html. Da ich mit perl v5.8.8 arbeite, ist das unpacken eines signed integers in networking order mit dem nicht ganz eleganten Konstruktunpack('s', pack( 'S', unpack("n", substr $c, 1, 2)))/10; zu erledigen ...
  • Der Code funktioniert und liefert das Wetterpacket, die Temperatur und die Luftfeuchtigkeit: 
00007c02d600000000a:  t: 12.4 h: 72.6

03007b02c000000000a:  t: 12.3 h: 70.4
01000e030500000000a:  t: 1.4  h: 77.3
00007c02d600000000a:  t: 12.4 h: 72.6
03007c02c000000000a:  t: 12.4 h: 70.4
01000e030500000000a:  t: 1.4  h: 77.3
00007c02d600000000a:  t: 12.4 h: 72.6
03007b02c000000000a:  t: 12.3 h: 70.4
01000e030500000000a:  t: 1.4  h: 77.3
00007c02d600000000a:  t: 12.4 h: 72.6
03007c02c000000000a:  t: 12.4 h: 70.4
01000e030000000000a:  t: 1.4  h: 76.8
00007c02d600000000a:  t: 12.4 h: 72.6


  • Verbesserungsbedarf gibt es noch bei
    • unpack der Adresse
    • erkennen und ignorieren von ungültigen Wetterpacket
    • resynchronisieren auf gültige Wetterpackete
    • Verwendung von lookfor statt read






#! C:\perl\bin\perl.exe

use strict;
use warnings;

use Win32::SerialPort;
my $port = Win32::SerialPort->new("COM5");


$port->baudrate(4800);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->write_settings || undef $port;

$port->write(pack( 'H[08]', '0202fb00' )); #hexmode
$port->write(pack( 'H[08]', '0202f201' )); #Wetterdaten sofort ausgeben

$port->are_match(pack( 'H[08]', '020ca201' ));
 
while (1)
{
my $c = $port->lookfor(14);
if (defined($c) && length($c) != 0) {
while (1)
{
my $d = $port->read(13);
if (defined($d) && length($d) != 0) {
$c = $c . $d;
}
last if length($c) >= 10
}
print unpack("H[18]", $c) ;
my $addr = unpack("(H)2", substr $c, 0, 1) ;
my $temp = unpack('s', pack( 'S', unpack("n", substr $c, 1, 2)))/10;
my $humidity = unpack("n", substr $c, 3, 2)/10;

print "a: $addr t: $temp h: $humidity \n";
}

  }


Keine Kommentare:

Kommentar veröffentlichen