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 |