Skip to content

Commit 6c36793

Browse files
authored
Merge pull request #1370 from TrumanPar/pdu_dev
Adding PDU typhos screen support
2 parents 36bf3e3 + 2685d66 commit 6c36793

File tree

5 files changed

+4003
-0
lines changed

5 files changed

+4003
-0
lines changed

pcdsdevices/pdu.py

Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
1+
"""
2+
Standard classes for L2SI DC power devices.
3+
"""
4+
import logging
5+
6+
from ophyd import Component as Cpt
7+
from ophyd import Device, EpicsSignal, EpicsSignalRO
8+
from ophyd import FormattedComponent as FCpt
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
class PDUChannel(Device):
14+
"""
15+
Class to define a particular channel of the PDU.
16+
17+
Parameters
18+
---------
19+
prefix : str
20+
The base PV of the relevant PDU.
21+
22+
channel : str
23+
The output channel on the PDU, e.g. '1', '2', etc.
24+
"""
25+
26+
ch_index = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_index}', kind='hinted', string=True)
27+
ch_name = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_name}', kind='hinted', string=True)
28+
ch_status = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_status}', kind='hinted', string=True)
29+
ch_ctrl_state = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_ctrl_state}', kind='hinted', string=True)
30+
ch_ctrl_command_on = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_command_on}', kind='omitted', string=True)
31+
ch_ctrl_command_off = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_command_off}', kind='omitted', string=True)
32+
ch_ctrl_command_reboot = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_command_reboot}', kind='omitted', string=True)
33+
34+
def __init__(self, prefix, *, name=None, parent=None, channel=None, **kwargs):
35+
self._ch = f'{channel}'
36+
self._ch_index = 'GetID'
37+
self._ch_status = 'GetStatus'
38+
self._ch_name = 'SetName'
39+
self._ch_ctrl_state = 'GetControlState'
40+
self._ch_command_on = 'TurnOn'
41+
self._ch_command_off = 'TurnOff'
42+
self._ch_command_reboot = 'CycleOffOn'
43+
44+
super().__init__(prefix, name=name, **kwargs)
45+
46+
47+
class TripplitePDUChannel(Device):
48+
"""
49+
Class to define a particular channel of a Tripplite PDU.
50+
51+
Parameters
52+
---------
53+
prefix : str
54+
The base PV of the relevant PDU.
55+
56+
channel : str
57+
The output channel on the PDU, e.g. '1', '2', etc.
58+
59+
"""
60+
ch_index = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_index}', kind='hinted', string=True)
61+
ch_name = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_name}', kind='hinted', string=True)
62+
ch_status = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_status}', kind='hinted', string=True)
63+
ch_ctrl_state = FCpt(EpicsSignalRO, '{self.prefix}:Outlet:{self._ch}:{self._ch_ctrl_state}', kind='hinted', string=True)
64+
ch_ctrl_command = FCpt(EpicsSignal, '{self.prefix}:Outlet:{self._ch}:{self._ch_command}', kind='hinted', string=True)
65+
66+
def __init__(self, prefix, *, name=None, parent=None, channel=None, **kwargs):
67+
self._ch = f'{channel}'
68+
self._ch_index = 'getPduOutletIndex'
69+
self._ch_status = 'getPduOutletState'
70+
self._ch_name = 'setPduOutletName'
71+
self._ch_ctrl_state = 'getPduOutletControllable'
72+
self._ch_command = 'setPduOutletCommand'
73+
74+
super().__init__(prefix, name=name, **kwargs)
75+
76+
77+
class PDU(Device):
78+
"""
79+
Class to define a non-Tripplite PDU
80+
81+
Parameters
82+
---------
83+
prefix : str
84+
The base PV of the relevant PDU.
85+
86+
num_channels : int
87+
The output channels for the PDU.
88+
89+
pdu_type : str
90+
The pdu type, e.g Leviton, or Sentry4
91+
"""
92+
93+
tower_name = FCpt(EpicsSignal, '{prefix}{self._tower}:SetTowerName', kind='hinted')
94+
location = Cpt(EpicsSignal, ':SetSystemLocation', kind='hinted')
95+
status = FCpt(EpicsSignalRO, '{prefix}{self._tower}:GetTowerStatus', kind='hinted')
96+
output_c_max = FCpt(EpicsSignal, '{prefix}{self._tower}:SetInfeedLoadHighThresh', kind='hinted')
97+
output_c = FCpt(EpicsSignalRO, '{prefix}{self._tower}:GetInfeedLoadValue', kind='hinted')
98+
output_c_status = FCpt(EpicsSignalRO, '{prefix}{self._tower}:GetInfeedLoadStatus', kind='hinted')
99+
output_p = FCpt(EpicsSignalRO, '{prefix}{self._tower}:GetTowerActivePower', kind='hinted')
100+
101+
temperature_lo = FCpt(EpicsSignal, '{prefix}{self._tower}:Sensor:All:SetTempLowThresh', kind='hinted')
102+
humidity_lo = FCpt(EpicsSignal, '{prefix}{self._tower}:Sensor:All:SetHumidLowThresh', kind='hinted')
103+
temperature_hi = FCpt(EpicsSignal, '{prefix}{self._tower}:Sensor:All:SetTempHighThresh', kind='hinted')
104+
humidity_hi = FCpt(EpicsSignal, '{prefix}{self._tower}:Sensor:All:SetHumidHighThresh', kind='hinted')
105+
106+
sensor1_id = Cpt(EpicsSignal, ':Sensor:1:GetID', kind='hinted')
107+
sensor1_status = Cpt(EpicsSignal, ':Sensor:1:GetStatus', kind='hinted')
108+
sensor1_temperature = Cpt(EpicsSignal, ':Sensor:1:GetTempStatus', kind='hinted')
109+
sensor1_humidity = Cpt(EpicsSignal, ':Sensor:1:GetHumidStatus', kind='hinted')
110+
111+
sensor2_id = Cpt(EpicsSignal, ':Sensor:2:GetID', kind='hinted')
112+
sensor2_status = Cpt(EpicsSignal, ':Sensor:2:GetStatus', kind='hinted')
113+
sensor2_temperature = Cpt(EpicsSignal, ':Sensor:2:GetTempStatus', kind='hinted')
114+
sensor2_humidity = Cpt(EpicsSignal, ':Sensor:2:GetHumidStatus', kind='hinted')
115+
116+
channel_ctrl = FCpt(EpicsSignal, '{prefix}{self._ctrl}:SetControlAction', kind='hinted')
117+
118+
tab_component_names = True
119+
120+
def __init__(self, prefix, num_channels, pdu_type=None, name=None, **kwargs):
121+
122+
if pdu_type.lower() == 'sentry4':
123+
self._tower = ":1"
124+
if num_channels == 8:
125+
self._ctrl = ":Outlet:G1"
126+
else:
127+
self._ctrl = ":Outlet:All"
128+
else:
129+
self._tower = ":"
130+
self._ctrl = ":Outlet:All"
131+
132+
self.num_channels = num_channels
133+
134+
super().__init__(prefix, name=name, **kwargs)
135+
136+
137+
class PDU8(PDU):
138+
"""8-channel PDU with static channel definitions for Typhos"""
139+
140+
channel1 = Cpt(PDUChannel, '', channel=1, kind='normal')
141+
channel2 = Cpt(PDUChannel, '', channel=2, kind='normal')
142+
channel3 = Cpt(PDUChannel, '', channel=3, kind='normal')
143+
channel4 = Cpt(PDUChannel, '', channel=4, kind='normal')
144+
channel5 = Cpt(PDUChannel, '', channel=5, kind='normal')
145+
channel6 = Cpt(PDUChannel, '', channel=6, kind='normal')
146+
channel7 = Cpt(PDUChannel, '', channel=7, kind='normal')
147+
channel8 = Cpt(PDUChannel, '', channel=8, kind='normal')
148+
149+
def __init__(self, prefix, pdu_type=None, name=None, **kwargs):
150+
super().__init__(prefix, num_channels=8, pdu_type=pdu_type, name=name, **kwargs)
151+
152+
153+
class PDU16(PDU):
154+
"""16-channel PDU with static channel definitions for Typhos"""
155+
156+
channel1 = Cpt(PDUChannel, '', channel=1, kind='normal')
157+
channel2 = Cpt(PDUChannel, '', channel=2, kind='normal')
158+
channel3 = Cpt(PDUChannel, '', channel=3, kind='normal')
159+
channel4 = Cpt(PDUChannel, '', channel=4, kind='normal')
160+
channel5 = Cpt(PDUChannel, '', channel=5, kind='normal')
161+
channel6 = Cpt(PDUChannel, '', channel=6, kind='normal')
162+
channel7 = Cpt(PDUChannel, '', channel=7, kind='normal')
163+
channel8 = Cpt(PDUChannel, '', channel=8, kind='normal')
164+
channel9 = Cpt(PDUChannel, '', channel=9, kind='normal')
165+
channel10 = Cpt(PDUChannel, '', channel=10, kind='normal')
166+
channel11 = Cpt(PDUChannel, '', channel=11, kind='normal')
167+
channel12 = Cpt(PDUChannel, '', channel=12, kind='normal')
168+
channel13 = Cpt(PDUChannel, '', channel=13, kind='normal')
169+
channel14 = Cpt(PDUChannel, '', channel=14, kind='normal')
170+
channel15 = Cpt(PDUChannel, '', channel=15, kind='normal')
171+
channel16 = Cpt(PDUChannel, '', channel=16, kind='normal')
172+
173+
def __init__(self, prefix, pdu_type=None, name=None, **kwargs):
174+
super().__init__(prefix, num_channels=16, pdu_type=pdu_type, name=name, **kwargs)
175+
176+
177+
class PDU24(PDU):
178+
"""24-channel PDU with static channel definitions for Typhos"""
179+
180+
channel1 = Cpt(PDUChannel, '', channel=1, kind='normal')
181+
channel2 = Cpt(PDUChannel, '', channel=2, kind='normal')
182+
channel3 = Cpt(PDUChannel, '', channel=3, kind='normal')
183+
channel4 = Cpt(PDUChannel, '', channel=4, kind='normal')
184+
channel5 = Cpt(PDUChannel, '', channel=5, kind='normal')
185+
channel6 = Cpt(PDUChannel, '', channel=6, kind='normal')
186+
channel7 = Cpt(PDUChannel, '', channel=7, kind='normal')
187+
channel8 = Cpt(PDUChannel, '', channel=8, kind='normal')
188+
channel9 = Cpt(PDUChannel, '', channel=9, kind='normal')
189+
channel10 = Cpt(PDUChannel, '', channel=10, kind='normal')
190+
channel11 = Cpt(PDUChannel, '', channel=11, kind='normal')
191+
channel12 = Cpt(PDUChannel, '', channel=12, kind='normal')
192+
channel13 = Cpt(PDUChannel, '', channel=13, kind='normal')
193+
channel14 = Cpt(PDUChannel, '', channel=14, kind='normal')
194+
channel15 = Cpt(PDUChannel, '', channel=15, kind='normal')
195+
channel16 = Cpt(PDUChannel, '', channel=16, kind='normal')
196+
channel17 = Cpt(PDUChannel, '', channel=17, kind='normal')
197+
channel18 = Cpt(PDUChannel, '', channel=18, kind='normal')
198+
channel19 = Cpt(PDUChannel, '', channel=19, kind='normal')
199+
channel20 = Cpt(PDUChannel, '', channel=20, kind='normal')
200+
channel21 = Cpt(PDUChannel, '', channel=21, kind='normal')
201+
channel22 = Cpt(PDUChannel, '', channel=22, kind='normal')
202+
channel23 = Cpt(PDUChannel, '', channel=23, kind='normal')
203+
channel24 = Cpt(PDUChannel, '', channel=24, kind='normal')
204+
205+
def __init__(self, prefix, pdu_type=None, name=None, **kwargs):
206+
super().__init__(prefix, num_channels=24, pdu_type=pdu_type, name=name, **kwargs)
207+
208+
209+
class TripplitePDU(Device):
210+
"""
211+
Class to define a Tripplite PDU.
212+
213+
Parameters
214+
---------
215+
prefix : str
216+
The base PV of the relevant PDU.
217+
218+
num_channels : int
219+
The output channels for the PDU.
220+
"""
221+
222+
tower_name = Cpt(EpicsSignal, ':setDeviceName', kind='hinted')
223+
location = Cpt(EpicsSignal, ':setDeviceLocation', kind='hinted')
224+
status = Cpt(EpicsSignalRO, ':getDeviceStatus', kind='hinted')
225+
226+
num_inputs = Cpt(EpicsSignalRO, ':getPduIdentNumInputs', kind='hinted')
227+
num_outputs = Cpt(EpicsSignalRO, ':getPduIdentNumOutputs', kind='hinted')
228+
num_outlets = Cpt(EpicsSignalRO, ':getPduIdentNumOutlets', kind='hinted')
229+
num_groups = Cpt(EpicsSignalRO, ':getPduIdentNumOutletGroups', kind='hinted')
230+
num_phases = Cpt(EpicsSignalRO, ':getPduIdentNumPhases', kind='hinted')
231+
num_circuits = Cpt(EpicsSignalRO, ':getPduIdentNumCircuits', kind='hinted')
232+
num_breakers = Cpt(EpicsSignalRO, ':getPduIdentNumBreakers', kind='hinted')
233+
num_heatsinks = Cpt(EpicsSignalRO, ':getPduIdentNumHeatsinks', kind='hinted')
234+
235+
input_f = Cpt(EpicsSignalRO, ':getPduInputPhaseFrequency', kind='hinted')
236+
237+
input_v = Cpt(EpicsSignalRO, ':getPduInputPhaseVoltage', kind='hinted')
238+
input_v_min = Cpt(EpicsSignalRO, ':getPduInputPhaseVoltageMin', kind='hinted')
239+
input_v_max = Cpt(EpicsSignalRO, ':getPduInputPhaseVoltageMax', kind='hinted')
240+
241+
output_f = Cpt(EpicsSignalRO, ':getPduOutputFrequency', kind='hinted')
242+
output_v = Cpt(EpicsSignalRO, ':getPduOutputVoltage', kind='hinted')
243+
output_p = Cpt(EpicsSignalRO, ':getPduOutputActivePower', kind='hinted')
244+
output_c = Cpt(EpicsSignalRO, ':getPduOutputCurrent', kind='hinted')
245+
output_c_min = Cpt(EpicsSignalRO, ':getPduOutputCurrentMin', kind='hinted')
246+
output_c_max = Cpt(EpicsSignalRO, ':getPduOutputCurrentMax', kind='hinted')
247+
248+
channels_on = Cpt(EpicsSignal, ':setPduControlPduOn', kind='hinted')
249+
channels_off = Cpt(EpicsSignal, ':setPduControlPduOff', kind='hinted')
250+
channels_reboot = Cpt(EpicsSignal, ':setPduControlPduReboot', kind='hinted')
251+
252+
tab_component_names = True
253+
254+
def __init__(self, prefix, num_channels, name=None, **kwargs):
255+
256+
self.num_channels = num_channels
257+
258+
super().__init__(prefix, name=name, **kwargs)
259+
260+
261+
class TripplitePDU8(TripplitePDU):
262+
"""8-channel Tripplite PDU with static channel definitions for Typhos"""
263+
264+
channel1 = Cpt(TripplitePDUChannel, '', channel=1, kind='normal')
265+
channel2 = Cpt(TripplitePDUChannel, '', channel=2, kind='normal')
266+
channel3 = Cpt(TripplitePDUChannel, '', channel=3, kind='normal')
267+
channel4 = Cpt(TripplitePDUChannel, '', channel=4, kind='normal')
268+
channel5 = Cpt(TripplitePDUChannel, '', channel=5, kind='normal')
269+
channel6 = Cpt(TripplitePDUChannel, '', channel=6, kind='normal')
270+
channel7 = Cpt(TripplitePDUChannel, '', channel=7, kind='normal')
271+
channel8 = Cpt(TripplitePDUChannel, '', channel=8, kind='normal')
272+
273+
def __init__(self, prefix, name=None, **kwargs):
274+
super().__init__(prefix, num_channels=8, name=name, **kwargs)
275+
276+
277+
class TripplitePDU16(TripplitePDU):
278+
"""16-channel Tripplite PDU with static channel definitions for Typhos"""
279+
280+
channel1 = Cpt(TripplitePDUChannel, '', channel=1, kind='normal')
281+
channel2 = Cpt(TripplitePDUChannel, '', channel=2, kind='normal')
282+
channel3 = Cpt(TripplitePDUChannel, '', channel=3, kind='normal')
283+
channel4 = Cpt(TripplitePDUChannel, '', channel=4, kind='normal')
284+
channel5 = Cpt(TripplitePDUChannel, '', channel=5, kind='normal')
285+
channel6 = Cpt(TripplitePDUChannel, '', channel=6, kind='normal')
286+
channel7 = Cpt(TripplitePDUChannel, '', channel=7, kind='normal')
287+
channel8 = Cpt(TripplitePDUChannel, '', channel=8, kind='normal')
288+
channel9 = Cpt(TripplitePDUChannel, '', channel=9, kind='normal')
289+
channel10 = Cpt(TripplitePDUChannel, '', channel=10, kind='normal')
290+
channel11 = Cpt(TripplitePDUChannel, '', channel=11, kind='normal')
291+
channel12 = Cpt(TripplitePDUChannel, '', channel=12, kind='normal')
292+
channel13 = Cpt(TripplitePDUChannel, '', channel=13, kind='normal')
293+
channel14 = Cpt(TripplitePDUChannel, '', channel=14, kind='normal')
294+
channel15 = Cpt(TripplitePDUChannel, '', channel=15, kind='normal')
295+
channel16 = Cpt(TripplitePDUChannel, '', channel=16, kind='normal')
296+
297+
def __init__(self, prefix, name=None, **kwargs):
298+
super().__init__(prefix, num_channels=16, name=name, **kwargs)
299+
300+
301+
class TripplitePDU24(TripplitePDU):
302+
"""24-channel Tripplite PDU with static channel definitions for Typhos"""
303+
304+
channel1 = Cpt(TripplitePDUChannel, '', channel=1, kind='normal')
305+
channel2 = Cpt(TripplitePDUChannel, '', channel=2, kind='normal')
306+
channel3 = Cpt(TripplitePDUChannel, '', channel=3, kind='normal')
307+
channel4 = Cpt(TripplitePDUChannel, '', channel=4, kind='normal')
308+
channel5 = Cpt(TripplitePDUChannel, '', channel=5, kind='normal')
309+
channel6 = Cpt(TripplitePDUChannel, '', channel=6, kind='normal')
310+
channel7 = Cpt(TripplitePDUChannel, '', channel=7, kind='normal')
311+
channel8 = Cpt(TripplitePDUChannel, '', channel=8, kind='normal')
312+
channel9 = Cpt(TripplitePDUChannel, '', channel=9, kind='normal')
313+
channel10 = Cpt(TripplitePDUChannel, '', channel=10, kind='normal')
314+
channel11 = Cpt(TripplitePDUChannel, '', channel=11, kind='normal')
315+
channel12 = Cpt(TripplitePDUChannel, '', channel=12, kind='normal')
316+
channel13 = Cpt(TripplitePDUChannel, '', channel=13, kind='normal')
317+
channel14 = Cpt(TripplitePDUChannel, '', channel=14, kind='normal')
318+
channel15 = Cpt(TripplitePDUChannel, '', channel=15, kind='normal')
319+
channel16 = Cpt(TripplitePDUChannel, '', channel=16, kind='normal')
320+
channel17 = Cpt(TripplitePDUChannel, '', channel=17, kind='normal')
321+
channel18 = Cpt(TripplitePDUChannel, '', channel=18, kind='normal')
322+
channel19 = Cpt(TripplitePDUChannel, '', channel=19, kind='normal')
323+
channel20 = Cpt(TripplitePDUChannel, '', channel=20, kind='normal')
324+
channel21 = Cpt(TripplitePDUChannel, '', channel=21, kind='normal')
325+
channel22 = Cpt(TripplitePDUChannel, '', channel=22, kind='normal')
326+
channel23 = Cpt(TripplitePDUChannel, '', channel=23, kind='normal')
327+
channel24 = Cpt(TripplitePDUChannel, '', channel=24, kind='normal')
328+
329+
def __init__(self, prefix, name=None, **kwargs):
330+
super().__init__(prefix, num_channels=24, name=name, **kwargs)

0 commit comments

Comments
 (0)