| 1 |
joko |
1.1 |
#!/usr/bin/perl |
| 2 |
|
|
|
| 3 |
|
|
# $Id$ |
| 4 |
|
|
# $Log$ |
| 5 |
|
|
|
| 6 |
|
|
|
| 7 |
|
|
# Konfiguration |
| 8 |
|
|
$cfg_SeriellerPort = '/dev/ttyS0'; |
| 9 |
|
|
$cfg_ASLetzterMessport = 3; |
| 10 |
|
|
|
| 11 |
|
|
# Ausgabe auf der Konsole |
| 12 |
|
|
#$cfg_AusgabeZiel = 'STDOUT'; |
| 13 |
|
|
# Ausgabe in eine Datei |
| 14 |
|
|
$cfg_AusgabeZiel = '/usr/local/httpd/htdocs/axquarium/iksdata.htm'; |
| 15 |
|
|
|
| 16 |
|
|
|
| 17 |
|
|
|
| 18 |
|
|
use Device::SerialPort qw( :PARAM :STAT 0.07 ); |
| 19 |
|
|
|
| 20 |
|
|
$PortName = $cfg_SeriellerPort; |
| 21 |
|
|
|
| 22 |
|
|
$PortObj = new Device::SerialPort ($PortName, $quiet) |
| 23 |
|
|
|| die "Can't open $PortName: $^E\n"; # $quiet is |
| 24 |
|
|
|
| 25 |
|
|
# configuring |
| 26 |
|
|
|
| 27 |
|
|
$PortObj->user_msg(ON); |
| 28 |
|
|
$PortObj->baudrate(9600); |
| 29 |
|
|
$PortObj->databits(8); |
| 30 |
|
|
$PortObj->parity("none"); |
| 31 |
|
|
$PortObj->stopbits(1); |
| 32 |
|
|
$PortObj->handshake("xoff"); |
| 33 |
|
|
|
| 34 |
|
|
$PortObj->write_settings || undef $PortObj; |
| 35 |
|
|
|
| 36 |
|
|
# $PortObj->save($Configuration_File_Name); |
| 37 |
|
|
# $PortObj->baudrate(300); |
| 38 |
|
|
# $PortObj->restart($Configuration_File_Name); # back to 9600 baud |
| 39 |
|
|
|
| 40 |
|
|
|
| 41 |
|
|
# operating |
| 42 |
|
|
|
| 43 |
|
|
# temporäre Variablen initialisieren |
| 44 |
|
|
$bool_insync = 0; |
| 45 |
|
|
$bool_linereach_firstline = 0; |
| 46 |
|
|
$bool_linereach_lastline = 0; |
| 47 |
|
|
|
| 48 |
|
|
while (1) { |
| 49 |
|
|
|
| 50 |
|
|
# Daten vom seriellen Port abholen |
| 51 |
|
|
$data_in = $PortObj->input; |
| 52 |
|
|
print "raw: $data_in", "\n"; |
| 53 |
|
|
|
| 54 |
|
|
# solange nicht "InSync" und nicht leer kommt ... |
| 55 |
|
|
if (!$bool_insync) { |
| 56 |
|
|
if ($data_in =~ m/^E/) { |
| 57 |
|
|
$bool_insync = 1; |
| 58 |
|
|
# we synced |
| 59 |
|
|
print "yeah! synced to any dataline!", "\n"; |
| 60 |
|
|
} else { |
| 61 |
|
|
# Ausgabe .... |
| 62 |
|
|
print "trying to sync to any dataline", "\n"; |
| 63 |
|
|
# ... warten (1 sec. schlafen) ... |
| 64 |
|
|
sleep(1); |
| 65 |
|
|
# ... und weiter |
| 66 |
|
|
next; |
| 67 |
|
|
} |
| 68 |
|
|
} |
| 69 |
|
|
|
| 70 |
|
|
# abschliessende newlines abtrennen |
| 71 |
|
|
chomp($data_in); |
| 72 |
|
|
|
| 73 |
|
|
|
| 74 |
|
|
# block erkennen und speichern |
| 75 |
|
|
|
| 76 |
|
|
# 1. Block-Beginn erkennen |
| 77 |
|
|
# date-Zeile? |
| 78 |
|
|
if ($data_in =~ m/E(.+?):(.+?) (.+?), (.+?)\.(.+?)\./) { |
| 79 |
|
|
$bool_linereach_firstline = 1; |
| 80 |
|
|
$bool_linereach_lastline = 0; |
| 81 |
|
|
|
| 82 |
|
|
%data_block = {}; |
| 83 |
|
|
$data_block{'date'}{'hour'} = $1; |
| 84 |
|
|
$data_block{'date'}{'minute'} = $2; |
| 85 |
|
|
$data_block{'date'}{'weekday'} = $3; |
| 86 |
|
|
$data_block{'date'}{'day'} = $4; |
| 87 |
|
|
$data_block{'date'}{'month'} = $5; |
| 88 |
|
|
} |
| 89 |
|
|
|
| 90 |
|
|
# 2. Block-Ende erkennen |
| 91 |
|
|
$data_in =~ m/E(.) \(.+?\)(.+?) ../ |
| 92 |
|
|
&& ($1 == $cfg_ASLetzterMessport) |
| 93 |
|
|
&& ($bool_linereach_lastline = 1); |
| 94 |
|
|
|
| 95 |
|
|
# 3. Block-Inhalt |
| 96 |
|
|
# Temperatur-Zeile erkennen |
| 97 |
|
|
$data_in =~ m/E. \(Te\+\)(.+?) °C/ |
| 98 |
|
|
&& ($data_block{'temp'} = $1); |
| 99 |
|
|
|
| 100 |
|
|
# pH-Wert-Zeile erkennen |
| 101 |
|
|
$data_in =~ m/E. \(pH\-\)(.+?) pH/ |
| 102 |
|
|
&& ($data_block{'pH'} = $1); |
| 103 |
|
|
|
| 104 |
|
|
# Redox-Zeile erkennen |
| 105 |
|
|
$data_in =~ m/E. \(Rx \)(.+?) rH/ |
| 106 |
|
|
&& ($data_block{'redox'} = $1); |
| 107 |
|
|
|
| 108 |
|
|
|
| 109 |
|
|
# schauen, ob data-block vollständig ... |
| 110 |
|
|
if ($bool_linereach_firstline && $bool_linereach_lastline) { |
| 111 |
|
|
outDataBlock_plain(\%data_block); |
| 112 |
|
|
# outDataBlock_html(\%data_block); |
| 113 |
|
|
} |
| 114 |
|
|
|
| 115 |
|
|
# zwei sekunden warten |
| 116 |
|
|
# (in diesem intervall schickt die aquastar daten-zeilen) |
| 117 |
|
|
sleep(2); |
| 118 |
|
|
|
| 119 |
|
|
} |
| 120 |
|
|
|
| 121 |
|
|
$PortObj->close || die "failed to close"; |
| 122 |
|
|
undef $PortObj; |
| 123 |
|
|
|
| 124 |
|
|
|
| 125 |
|
|
# $count_out = $PortObj->write($output_string); |
| 126 |
|
|
# warn "write failed\n" unless ($count_out); |
| 127 |
|
|
# warn "write incomplete\n" if ( $count_out != length($output_string) |
| 128 |
|
|
|
| 129 |
|
|
|
| 130 |
|
|
|
| 131 |
|
|
|
| 132 |
|
|
# hier sollten die Daten ausgegeben |
| 133 |
|
|
# bzw. das Format der Ausgabe bestimmt/programmiert werden |
| 134 |
|
|
sub outDataBlock_plain { |
| 135 |
|
|
|
| 136 |
|
|
# Übergabe-Parameter: Referenz auf Datenblock holen (Hash) |
| 137 |
|
|
$priv_data_block_ref = shift; |
| 138 |
|
|
# Referenz auf Hash auflösen |
| 139 |
|
|
%priv_data_block = %$priv_data_block_ref; |
| 140 |
|
|
|
| 141 |
|
|
print "data block ready ... ", "\n"; |
| 142 |
|
|
print "$priv_data_block{'temp'}", "\n"; |
| 143 |
|
|
print "$priv_data_block{'pH'}", "\n"; |
| 144 |
|
|
|
| 145 |
|
|
open (FH, '>' . $cfg_AusgabeZiel); |
| 146 |
|
|
|
| 147 |
|
|
print FH <<EOT; |
| 148 |
|
|
<html> |
| 149 |
|
|
<head> |
| 150 |
|
|
<meta http-equiv="refresh" content="5; URL=iksdata.htm"> |
| 151 |
|
|
</head> |
| 152 |
|
|
<body background="img/bg3.gif"> |
| 153 |
|
|
<Table Border=0 Cellpadding=0 Cellspacing=0 width=700 Align=center> |
| 154 |
|
|
<tr> |
| 155 |
|
|
<td width=370 > </td> |
| 156 |
|
|
<td width=330 > |
| 157 |
|
|
<Table Border=0 Align=left Cellpadding=0 Cellspacing=0 width=340> |
| 158 |
|
|
<tr> |
| 159 |
|
|
<td width=120 Align=Center><Font Face=verdana Size=2 Color="#000000">Aktualisierung</td> |
| 160 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color="#000000">Temp.</td> |
| 161 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color="#000000">PH</td> |
| 162 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color="#000000">Redox</td> |
| 163 |
|
|
</tr> |
| 164 |
|
|
|
| 165 |
|
|
EOT |
| 166 |
|
|
|
| 167 |
|
|
print FH |
| 168 |
|
|
"<tr> |
| 169 |
|
|
<td width=120 Align=Center><Font Face=verdana Size=2 Color=#000000><B> ", |
| 170 |
|
|
$priv_data_block{'date'}{'day'}, ".", |
| 171 |
|
|
$priv_data_block{'date'}{'month'}, ". ", |
| 172 |
|
|
$priv_data_block{'date'}{'weekday'}, " ", |
| 173 |
|
|
$priv_data_block{'date'}{'hour'}, ":", |
| 174 |
|
|
$priv_data_block{'date'}{'minute'}, "\n"; |
| 175 |
|
|
|
| 176 |
|
|
print FH |
| 177 |
|
|
"</td> |
| 178 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color=#000000><B>", $priv_data_block{'temp'}, "\n", |
| 179 |
|
|
"</b></td> |
| 180 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color=#000000><B>", $priv_data_block{'pH'}, "\n", |
| 181 |
|
|
"</b></td> |
| 182 |
|
|
<td width=70 Align=Center><Font Face=verdana Size=2 Color=#000000><B>", $priv_data_block{'redox'}, "\n"; |
| 183 |
|
|
|
| 184 |
|
|
print FH |
| 185 |
|
|
"</b></td> |
| 186 |
|
|
</tr> |
| 187 |
|
|
</table> |
| 188 |
|
|
</td> |
| 189 |
|
|
</tr> |
| 190 |
|
|
</table> |
| 191 |
|
|
|
| 192 |
|
|
</body> |
| 193 |
|
|
"; |
| 194 |
|
|
|
| 195 |
|
|
close (FH); |
| 196 |
|
|
|
| 197 |
|
|
} |
| 198 |
|
|
|
| 199 |
|
|
v |