1
/* apcsmart.h - command table for APC smart protocol units
3
Copyright (C) 1999 Russell Kroll <rkroll@exploits.org>
4
(C) 2000 Nigel Metheringham <Nigel.Metheringham@Intechnology.co.uk>
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
#include <sys/ioctl.h>
26
#define APC_TABLE_VERSION "version 2.2"
28
/* Basic UPS reply line structure */
29
#define ENDCHAR 10 /* APC ends responses with LF */
31
/* characters ignored by default */
32
#define IGNCHARS "\015+$|!~%?=#&" /* special characters to ignore */
34
/* these one is used only during startup, due to ^Z sending certain characters such as # */
35
#define MINIGNCHARS "\015+$|!" /* minimum set of special characters to ignore */
37
/* normal polls: characters we don't want to parse (including a few alerts) */
38
#define POLL_IGNORE "\015&|"
40
/* alert characters we care about - OL, OB, LB, not LB, RB, OVER, not OVER */
41
#define POLL_ALERT "$!%+#?="
43
#define UPSDELAY 50000 /* slow down multicharacter commands */
44
#define CMDLONGDELAY 1500000 /* some commands need a 1.5s gap for safety */
46
#define SER_WAIT_SEC 3 /* wait up to 3.0 sec for ser_get calls */
47
#define SER_WAIT_USEC 0
49
/* dangerous instant commands must be reconfirmed within a 12 second window */
53
/* it only does two strings, and they're both the same length */
60
#define APC_STAT_CAL 1 /* calibration */
61
#define APC_STAT_TRIM 2 /* SmartTrim */
62
#define APC_STAT_BOOST 4 /* SmartBoost */
63
#define APC_STAT_OL 8 /* on line */
64
#define APC_STAT_OB 16 /* on battery */
65
#define APC_STAT_OVER 32 /* overload */
66
#define APC_STAT_LB 64 /* low battery */
67
#define APC_STAT_RB 128 /* replace battery */
69
/* serial protocol: special commands - initialization and such */
70
#define APC_STATUS 'Q'
71
#define APC_GOSMART 'Y'
72
#define APC_GODUMB 'R'
73
#define APC_CMDSET 'a'
74
#define APC_CAPABILITY 26 /* ^Z */
75
#define APC_NEXTVAL '-'
79
/* Driver command table flag values */
81
#define APC_POLL 0x0001 /* Poll this variable regularly */
82
#define APC_PRESENT 0x0004 /* Capability seen on this UPS */
84
#define APC_RW 0x0010 /* read-write variable */
85
#define APC_ENUM 0x0020 /* enumerated type */
86
#define APC_STRING 0x0040 /* string */
88
#define APC_NASTY 0x0100 /* Nasty command - take care */
89
#define APC_REPEAT 0x0200 /* Command needs sending twice */
91
#define APC_FORMATMASK 0xFF0000 /* Mask for apc data formats */
93
#define APC_F_PERCENT 0x020000 /* Data in a percent format */
94
#define APC_F_VOLT 0x030000 /* Data in a voltage format */
95
#define APC_F_AMP 0x040000 /* Data in a current/amp format */
96
#define APC_F_CELSIUS 0x050000 /* Data in a temp/C format */
97
#define APC_F_HEX 0x060000 /* Data in a hex number format */
98
#define APC_F_DEC 0x070000 /* Data in a decimal format */
99
#define APC_F_SECONDS 0x100000 /* Time in seconds */
100
#define APC_F_MINUTES 0x110000 /* Time in minutes */
101
#define APC_F_HOURS 0x120000 /* Time in hours */
102
#define APC_F_REASON 0x130000 /* Reason of transfer */
103
#define APC_F_LEAVE 0 /* Just pass this through */
106
const char *name; /* the variable name */
107
unsigned int flags; /* various flags */
108
char cmd; /* command character */
111
apc_vartab_t apc_vartab[] = {
113
{ "ups.firmware.old", 0, 'V' },
114
{ "ups.firmware", 0, 'b' },
115
{ "ups.firmware.aux", 0, 'v' },
116
{ "ups.model", 0, 0x01 },
118
{ "ups.serial", 0, 'n' },
119
{ "ups.mfr.date", 0, 'm' },
121
{ "ups.temperature", APC_POLL|APC_F_CELSIUS, 'C' },
122
{ "ups.load", APC_POLL|APC_F_PERCENT, 'P' },
124
{ "ups.test.interval", APC_F_HOURS, 'E' },
125
{ "ups.test.result", APC_POLL, 'X' },
127
{ "ups.delay.start", APC_F_SECONDS, 'r' },
128
{ "ups.delay.shutdown", APC_F_SECONDS, 'p' },
130
{ "ups.id", APC_STRING, 'c' },
132
{ "ups.contacts", APC_POLL|APC_F_HEX, 'i' },
133
{ "ups.display.language",
136
{ "input.voltage", APC_POLL|APC_F_VOLT, 'L' },
137
{ "input.frequency", APC_POLL|APC_F_DEC, 'F' },
138
{ "input.sensitivity", 0, 's' },
139
{ "input.quality", APC_POLL|APC_F_HEX, '9' },
141
{ "input.transfer.low", APC_F_VOLT, 'l' },
142
{ "input.transfer.high",
144
{ "input.transfer.reason",
145
APC_POLL|APC_F_REASON, 'G' },
147
{ "input.voltage.maximum",
148
APC_POLL|APC_F_VOLT, 'M' },
149
{ "input.voltage.minimum",
150
APC_POLL|APC_F_VOLT, 'N' },
152
{ "output.current", APC_POLL|APC_F_AMP, '/' },
153
{ "output.voltage", APC_POLL|APC_F_VOLT, 'O' },
154
{ "output.voltage.nominal",
157
{ "ambient.humidity", APC_POLL|APC_F_PERCENT, 'h' },
158
{ "ambient.humidity.high",
159
APC_F_PERCENT, '{' },
160
{ "ambient.humidity.low",
161
APC_F_PERCENT, '}' },
163
{ "ambient.temperature",
164
APC_POLL|APC_F_CELSIUS, 't' },
165
{ "ambient.temperature.high",
166
APC_F_CELSIUS, '[' },
167
{ "ambient.temperature.low",
168
APC_F_CELSIUS, ']' },
170
{ "battery.date", APC_STRING, 'x' },
172
{ "battery.charge", APC_POLL|APC_F_PERCENT, 'f' },
173
{ "battery.charge.restart",
174
APC_F_PERCENT, 'e' },
176
{ "battery.voltage", APC_POLL|APC_F_VOLT, 'B' },
177
{ "battery.voltage.nominal",
180
{ "battery.runtime", APC_POLL|APC_F_MINUTES, 'j' },
181
{ "battery.runtime.low",
182
APC_F_MINUTES, 'q' },
184
{ "battery.packs", APC_F_DEC, '>' },
185
{ "battery.packs.bad", APC_F_DEC, '<' },
186
{ "battery.alarm.threshold",
190
I = alarm enable (hex field) - split into alarm.n.enable
191
J = alarm status (hex field) - split into alarm.n.status
193
0x15 = output voltage selection (APC_F_VOLT)
194
0x5C = load power (APC_POLL|APC_F_PERCENT)
201
/* ------ instant commands ------ */
203
#define APC_CMD_FPTEST 'A'
204
#define APC_CMD_CALTOGGLE 'D'
205
#define APC_CMD_SHUTDOWN 'K'
206
#define APC_CMD_SOFTDOWN 'S'
207
#define APC_CMD_GRACEDOWN '@'
208
#define APC_CMD_SIMPWF 'U'
209
#define APC_CMD_BTESTTOGGLE 'W'
210
#define APC_CMD_OFF 'Z'
212
#define APC_CMD_ON 0x0E /* ^N */
213
#define APC_CMD_BYPTOGGLE '^'
221
apc_cmdtab_t apc_cmdtab[] =
223
{ "load.off", APC_NASTY|APC_REPEAT, APC_CMD_OFF },
224
{ "load.on", APC_REPEAT, APC_CMD_ON },
226
{ "test.panel.start", 0, APC_CMD_FPTEST },
228
{ "test.failure.start", 0, APC_CMD_SIMPWF },
230
{ "test.battery.start", 0, APC_CMD_BTESTTOGGLE },
231
{ "test.battery.stop", 0, APC_CMD_BTESTTOGGLE },
233
{ "shutdown.return.grace",
234
APC_NASTY, APC_CMD_GRACEDOWN },
235
{ "shutdown.return", APC_NASTY, APC_CMD_SOFTDOWN },
236
{ "shutdown.stayoff", APC_NASTY|APC_REPEAT, APC_CMD_SHUTDOWN },
238
{ "calibrate.start", 0, APC_CMD_CALTOGGLE },
239
{ "calibrate.stop", 0, APC_CMD_CALTOGGLE },
241
{ "bypass.start", 0, APC_CMD_BYPTOGGLE },
242
{ "bypass.stop", 0, APC_CMD_BYPTOGGLE },
247
/* compatibility with hardware that doesn't do APC_CMDSET ('a') */
250
const char *firmware;
251
const char *cmdchars;
255
{ "0XI", "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 },
256
{ "0XM", "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 },
257
{ "0ZI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
258
{ "5UI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
259
{ "5ZM", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
261
{ "6QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
262
{ "6QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
263
{ "6TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
264
{ "6TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
266
{ "7QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
267
{ "7QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
268
{ "7TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
269
{ "7TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
271
{ "7II", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
273
{ "9II", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
274
{ "9GI", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
276
{ "8QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
277
{ "8QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
278
{ "8TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
279
{ "8TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
281
{ "5.4.D", "\1ABPQRSUYbdfgjmnx9", 0 },
283
{ "D9", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
284
{ "D8", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
285
{ "D7", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
286
{ "D6", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
287
{ "D5", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
288
{ "D4", "789ABCEFGKLMNOPQRSUVWXYZ", 0 },