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 |