Bases: KPFFunction
Set KPF to a low power mode.
This is intended for use during power outages. This reduces power use in
the AO electronics room. We do not currently recommend any changes in the
basement due to the sensitivity of the spectrograph to thermal changes.
Procedure:
- If a script is running exit or terminate it (depending on --force arg)
- Disable HK detector
- Stop HK cooling
- Power off HK systems: J1, J2, J5
- Stop CRED2 exposures (CONTINUOUS and SAVE)
- Stop CRED2 cooling (if on)
- Power off CRED2 (K2, K3)
KTL Keywords Used:
kpfconfig.CA_HK_ENABLED
kpfpower.OUTLET_J1%
kpfpower.OUTLET_J2%
kpfpower.OUTLET_J5%
kpfpower.OUTLET_K2%
kpfpower.OUTLET_K3%
kpfmon.HKTEMPDIS
kpfmon.ST_EXPOSE2DIS
kpfmon.OUTLET_J1_OODIS
kpfmon.OUTLET_J2_OODIS
kpfmon.OUTLET_J5_OODIS
kpfmon.OUTLET_K2_OODIS
kpfmon.OUTLET_K3_OODIS
kpf_hk.COOLING
kpf_hk.EXPSTATE
kpfguide.CONTINUOUS
kpfguide.SAVE
Source code in kpf/scripts/EnterLowPowerMode.py
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 | class EnterLowPowerMode(KPFFunction):
'''Set KPF to a low power mode.
This is intended for use during power outages. This reduces power use in
the AO electronics room. We do not currently recommend any changes in the
basement due to the sensitivity of the spectrograph to thermal changes.
Procedure:
- If a script is running exit or terminate it (depending on --force arg)
- Disable HK detector
- Stop HK cooling
- Power off HK systems: J1, J2, J5
- Stop CRED2 exposures (CONTINUOUS and SAVE)
- Stop CRED2 cooling (if on)
- Power off CRED2 (K2, K3)
KTL Keywords Used:
- `kpfconfig.CA_HK_ENABLED`
- `kpfpower.OUTLET_J1%`
- `kpfpower.OUTLET_J2%`
- `kpfpower.OUTLET_J5%`
- `kpfpower.OUTLET_K2%`
- `kpfpower.OUTLET_K3%`
- `kpfmon.HKTEMPDIS`
- `kpfmon.ST_EXPOSE2DIS`
- `kpfmon.OUTLET_J1_OODIS`
- `kpfmon.OUTLET_J2_OODIS`
- `kpfmon.OUTLET_J5_OODIS`
- `kpfmon.OUTLET_K2_OODIS`
- `kpfmon.OUTLET_K3_OODIS`
- `kpf_hk.COOLING`
- `kpf_hk.EXPSTATE`
- `kpfguide.CONTINUOUS`
- `kpfguide.SAVE`
'''
@classmethod
def pre_condition(cls, args):
pass
@classmethod
def perform(cls, args):
CA_HK_ENABLED = ktl.cache('kpfconfig', 'CA_HK_ENABLED')
kpfpower = ktl.cache('kpfpower')
kpfmon = ktl.cache('kpfmon')
log.warning('Configuring KPF for Low Power Mode')
# Power down Ca HK detector systems
kpf_hk = ktl.cache('kpf_hk')
log.warning('Disabling Ca HK detector')
CA_HK_ENABLED.write('No')
log.warning('Disabling HKTEMP alarm for next 24 hours')
kpfmon['HKTEMPDIS'].write('1 day hence')
log.warning('Disabling ST_EXPOSE2 alarm for next 24 hours')
kpfmon['ST_EXPOSE2DIS'].write('1 day hence')
log.warning('Turning Ca HK detector cooling off')
kpf_hk['COOLING'].write('off')
time.sleep(5)
log.warning('Powering off Ca HK detector systems')
# Wait for HK ready to avoid confusing kpfexpose EXPLAIN%
log.warning('Waiting for kpf_hk.EXPSTATE = Ready')
ready = kpf_hk['EXPSTATE'].waitFor("== 'Ready'", timeout=60)
while ready == False:
log.warning('Asking for user input')
print()
print("###############################################################")
print(" Continue waiting for hpf_hk.EXPSTATE=Ready or shut down now?")
print()
print(" Wait (w) or Abort (a)? [w]")
print("###############################################################")
print()
user_input = input()
log.debug(f'response: "{user_input}"')
if user_input.lower() in ['a', 'abort', 'q', 'quit']:
return
else:
log.debug('Waiting for kpf_hk.EXPSTATE = Ready')
ready = kpf_hk['EXPSTATE'].waitFor("== 'Ready'", timeout=60)
log.warning(f"Disabling {kpfpower['OUTLET_J1_NAME'].read()} alarm for next 24 hours")
kpfmon['OUTLET_J1_OODIS'].write('1 day hence')
log.warning(f"Powering off {kpfpower['OUTLET_J1_NAME'].read()}")
kpfpower['OUTLET_J1'].write('Off')
log.warning(f"Disabling {kpfpower['OUTLET_J2_NAME'].read()} alarm for next 24 hours")
kpfmon['OUTLET_J2_OODIS'].write('1 day hence')
log.warning(f"Powering off {kpfpower['OUTLET_J2_NAME'].read()}")
kpfpower['OUTLET_J2'].write('Off')
log.warning(f"Disabling {kpfpower['OUTLET_J5_NAME'].read()} alarm for next 24 hours")
kpfmon['OUTLET_J5_OODIS'].write('1 day hence')
log.warning(f"Powering off {kpfpower['OUTLET_J5_NAME'].read()}")
kpfpower['OUTLET_J5'].write('Off')
# Power down CRED2 detector systems
kpfguide = ktl.cache('kpfguide')
log.warning('Powering off CRED2 detector systems')
kpfguide['CONTINUOUS'].write('Inactive')
kpfguide['SAVE'].write('Inactive')
time.sleep(5)
log.warning(f"Disabling {kpfpower['OUTLET_K2_NAME'].read()} alarm for next 24 hours")
kpfmon['OUTLET_K2_OODIS'].write('1 day hence')
log.warning(f"Powering off {kpfpower['OUTLET_K2_NAME'].read()}")
kpfpower['OUTLET_K2'].write('Off')
log.warning(f"Disabling {kpfpower['OUTLET_K3_NAME'].read()} alarm for next 24 hours")
kpfmon['OUTLET_K3_OODIS'].write('1 day hence')
log.warning(f"Powering off {kpfpower['OUTLET_K3_NAME'].read()}")
kpfpower['OUTLET_K3'].write('Off')
@classmethod
def post_condition(cls, args):
pass
|