Skip to content

Commit bb8e219

Browse files
#276 Integrate COCCON Spain Enclosure (49)
Debug and refine
1 parent 474803e commit bb8e219

6 files changed

Lines changed: 68 additions & 65 deletions

File tree

packages/cli/commands/aemet_enclosure.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,22 @@ def _set_spectrometer_power(state: Literal["true", "false"]) -> None:
9696

9797

9898
@aemet_enclosure_command_group.command(
99-
name="set-enhance-security-mode",
99+
name="set-enhanced-security-mode",
100100
help="Set the variable ENHANCED_SECURITY to 1 (true) or 0 (false).",
101101
)
102-
@click.argument("state")
103-
def _set_enhance_security_mode(state: Literal["true", "false"]) -> None:
104-
logger.info(f'running command "plc set-enhance-security-mode {state}"')
102+
@click.argument("value")
103+
def _set_enhance_security_mode(value: int) -> None:
104+
logger.info(f'running command "plc set-enhance-security-mode {value}"')
105105
enclosure_interface = _get_enclosure_interface()
106-
enclosure_interface.set_enhanced_security_mode(state == "true")
106+
enclosure_interface.set_enhanced_security_mode(int(value) == 1)
107107
_print_green("Ok")
108108

109109

110110
@aemet_enclosure_command_group.command(
111111
name="set-averia-fault-code",
112112
help="Set the variable AVERIA to a given integer value.",
113113
)
114-
@click.argument("state")
114+
@click.argument("value")
115115
def _set_averia_fault_code(value: int) -> None:
116116
logger.info(f'running command "plc set-averia-fault-code {value}"')
117117
enclosure_interface = _get_enclosure_interface()
@@ -123,7 +123,7 @@ def _set_averia_fault_code(value: int) -> None:
123123
name="set-alert-level",
124124
help="Set the variable ALERTA to a given integer value.",
125125
)
126-
@click.argument("state")
126+
@click.argument("value")
127127
def _set_alert_level(value: int) -> None:
128128
logger.info(f'running command "plc set-alert-level {value}"')
129129
enclosure_interface = _get_enclosure_interface()
@@ -135,9 +135,9 @@ def _set_alert_level(value: int) -> None:
135135
name="set-auto-mode",
136136
help="Set the variable AUTO to a given integer value.",
137137
)
138-
@click.argument("state")
138+
@click.argument("value")
139139
def _set_auto_mode(value: int) -> None:
140140
logger.info(f'running command "plc set-auto-mode {value}"')
141141
enclosure_interface = _get_enclosure_interface()
142-
enclosure_interface.set_enclosure_mode("auto" if value == 1 else "manual")
142+
enclosure_interface.set_enclosure_mode("auto" if int(value) == 1 else "manual")
143143
_print_green("Ok")

packages/core/interfaces/enclosures/aemet.py

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -138,25 +138,7 @@ def update_config(
138138
def read(
139139
self,
140140
immediate_write_to_central_state: bool = True,
141-
skip_power_plug_state: bool = False,
142141
) -> types.aemet.AEMETEnclosureState:
143-
em27_has_power: Optional[bool] = None
144-
em27_voltage: Optional[float] = None
145-
em27_current: Optional[float] = None
146-
em27_power: Optional[float] = None
147-
if skip_power_plug_state:
148-
em27_has_power = self.state.em27_has_power
149-
em27_voltage = self.state.em27_voltage
150-
em27_current = self.state.em27_current
151-
em27_power = self.state.em27_power
152-
else:
153-
if self.enclosure_config.use_em27_power_plug:
154-
em27_has_power = self.tasmota_plug.get_power_state()
155-
throughput_state = self.tasmota_plug.get_throughput_state()
156-
em27_voltage = throughput_state["em27_voltage"]
157-
em27_current = throughput_state["em27_current"]
158-
em27_power = throughput_state["em27_power"]
159-
160142
try:
161143
out = self._run_command("DataQuery", mode="most-recent", uri="dl:Public")
162144
headers = [d["name"] for d in out["head"]["fields"]]
@@ -170,11 +152,12 @@ def read(
170152
# d["time"] = out["data"][0]["time"]
171153
# d["no"] = out["data"][0]["no"]
172154
news = types.aemet.AEMETEnclosureState.model_validate(d)
173-
174-
news.em27_has_power = em27_has_power
175-
news.em27_voltage = em27_voltage
176-
news.em27_current = em27_current
177-
news.em27_power = em27_power
155+
if self.enclosure_config.use_em27_power_plug:
156+
news.em27_has_power = self.tasmota_plug.get_power_state()
157+
throughput_state = self.tasmota_plug.get_throughput_state()
158+
news.em27_voltage = throughput_state["em27_voltage"]
159+
news.em27_current = throughput_state["em27_current"]
160+
news.em27_power = throughput_state["em27_power"]
178161

179162
news.dt = datetime.datetime.now(tz=datetime.timezone.utc)
180163
if news.auto_mode is None:
@@ -208,9 +191,7 @@ def set_enhanced_security_mode(self, mode: bool) -> None:
208191
self.logger.info(f"Setting enhanced security mode to {mode}")
209192
self._set_value("dl:Public.ENHANCED_SECURITY", 1 if mode else 0)
210193
dt = tum_esm_utils.timing.wait_for_condition(
211-
is_successful=lambda: (
212-
self.read(skip_power_plug_state=True).enhanced_security_mode == mode
213-
),
194+
is_successful=lambda: self.read().enhanced_security_mode == mode,
214195
timeout_seconds=40,
215196
timeout_message="Enhanced security mode did not update within 30 seconds.",
216197
check_interval_seconds=5,
@@ -224,9 +205,7 @@ def set_enclosure_mode(self, mode: Literal["auto", "manual"]) -> None:
224205
else:
225206
self._set_value("dl:Public.AUTO_", 0)
226207
dt = tum_esm_utils.timing.wait_for_condition(
227-
is_successful=lambda: (
228-
self.read(skip_power_plug_state=True).auto_mode == (1 if mode == "auto" else 0)
229-
),
208+
is_successful=lambda: self.read().auto_mode == (1 if mode == "auto" else 0),
230209
timeout_seconds=40,
231210
timeout_message="Enclosure mode did not update within 30 seconds.",
232211
check_interval_seconds=5,
@@ -238,9 +217,7 @@ def set_averia_fault_code(self, new_value: int) -> None:
238217
self.logger.info(f"Setting averia fault code to {new_value}")
239218
self._set_value("dl:Public.AVERIA", new_value)
240219
dt = tum_esm_utils.timing.wait_for_condition(
241-
is_successful=lambda: (
242-
self.read(skip_power_plug_state=True).averia_fault_code == new_value
243-
),
220+
is_successful=lambda: self.read().averia_fault_code == new_value,
244221
timeout_seconds=40,
245222
timeout_message="Averia fault code did not update within 30 seconds.",
246223
check_interval_seconds=5,
@@ -253,7 +230,7 @@ def set_alert_level(self, new_value: int) -> None:
253230
self.logger.info(f"Setting alert level to {new_value}")
254231
self._set_value("dl:Public.ALERTA", new_value)
255232
dt = tum_esm_utils.timing.wait_for_condition(
256-
is_successful=lambda: self.read(skip_power_plug_state=True).alert_level == new_value,
233+
is_successful=lambda: self.read().alert_level == new_value,
257234
timeout_seconds=40,
258235
timeout_message="Alert level did not update within 30 seconds.",
259236
check_interval_seconds=5,
@@ -269,9 +246,7 @@ def open_cover(self) -> None:
269246
self._set_value("dl:Public.MOTOR_ON", 1)
270247
self._set_value("dl:Public.Estado_actual", "AF") # open releasing fechillo
271248
dt = tum_esm_utils.timing.wait_for_condition(
272-
is_successful=lambda: (
273-
self.read(skip_power_plug_state=True).pretty_cover_status == "open"
274-
),
249+
is_successful=lambda: self.read().pretty_cover_status == "open",
275250
timeout_seconds=90,
276251
timeout_message="Cover did not open within 90 seconds.",
277252
check_interval_seconds=5,
@@ -287,9 +262,7 @@ def close_cover(self) -> None:
287262
self._set_value("dl:Public.MOTOR_ON", 1)
288263
self._set_value("dl:Public.Estado_actual", "C.") # closing
289264
dt = tum_esm_utils.timing.wait_for_condition(
290-
is_successful=lambda: (
291-
self.read(skip_power_plug_state=True).pretty_cover_status == "closed"
292-
),
265+
is_successful=lambda: self.read().pretty_cover_status == "closed",
293266
timeout_seconds=90,
294267
timeout_message="Cover did not close within 90 seconds.",
295268
check_interval_seconds=5,

packages/ui/src/components/configuration/sections/config-section-aemet-enclosure.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export default function ConfigSectionAEMETEnclosure() {
150150
/>
151151
<configurationComponents.ConfigElementLine />
152152
<configurationComponents.ConfigElementBooleanToggle
153-
title="Toggle EM27 Power"
153+
title="Use EM27 Power Plug"
154154
value={localSectionConfig.use_em27_power_plug}
155155
setValue={(v: boolean) =>
156156
setLocalConfigItem('aemet_enclosure.use_em27_power_plug', v)

packages/ui/src/components/overview/system-state.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
renderString,
66
renderNumber,
77
renderColorfulBoolean,
8+
renderColorfulInteger,
89
renderInteger,
910
} from '../../utils/functions';
1011
import { IconCloudRain } from '@tabler/icons-react';
@@ -50,12 +51,12 @@ function StateBarPanel(props: { title: string; value: number | null }) {
5051
}
5152

5253
const COVERR_STATUS_MAP: Record<string, string> = {
53-
AF: 'Opening (Unlocking)',
54-
'A.': 'Opening (Hood)',
55-
A: 'Open',
56-
'C.': 'Closing (Hood)',
57-
CF: 'Closing (Locking)',
58-
C: 'Closed',
54+
AF: 'opening lock',
55+
'A.': 'opening hood',
56+
A: 'open',
57+
'C.': 'closing hood',
58+
CF: 'closing lock',
59+
C: 'closed',
5960
};
6061

6162
export function SystemState() {
@@ -196,11 +197,13 @@ export function SystemState() {
196197
<StatePanel title="Alert Level | Averia Fault Code">
197198
<div className="flex flex-row items-center w-full justitfy-center gap-x-2">
198199
<div className="flex-grow text-center">
199-
{renderInteger(coreState.aemet_enclosure_state.alert_level)}
200+
{renderColorfulInteger(
201+
coreState.aemet_enclosure_state.alert_level
202+
)}
200203
</div>
201204
<div className="bg-slate-300 h-3.5 w-px" />
202205
<div className="flex-grow text-center">
203-
{renderInteger(
206+
{renderColorfulInteger(
204207
coreState.aemet_enclosure_state.averia_fault_code
205208
)}
206209
</div>

packages/ui/src/tabs/control-tab.tsx

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ function renderStringValue(value: string | number | null, postfix: string) {
1919
return `${value} ${postfix}`;
2020
}
2121

22+
const COVERR_STATUS_MAP: Record<string, string> = {
23+
AF: 'opening lock',
24+
'A.': 'opening hood',
25+
A: 'open',
26+
'C.': 'closing hood',
27+
CF: 'closing lock',
28+
C: 'closed',
29+
};
30+
2231
function VariableBlock(props: {
2332
label: string;
2433
disabled: boolean;
@@ -44,8 +53,8 @@ function VariableBlock(props: {
4453
{props.rows.map((r, i) => (
4554
<div className="w-full h-8 flex-row-left" key={i}>
4655
<div className="flex-row-center whitespace-nowrap">
47-
<div className="w-40">{r.variable.key}:</div>{' '}
48-
<span className="w-12 font-semibold text-right">
56+
<div className="w-72">{r.variable.key}:</div>{' '}
57+
<span className="w-20 font-semibold text-right">
4958
{r.variable.value}
5059
</span>
5160
</div>
@@ -57,7 +66,7 @@ function VariableBlock(props: {
5766
variant="white"
5867
onClick={r.action.callback}
5968
key={r.action.label}
60-
className="w-52"
69+
className="w-60"
6170
disabled={props.disabled}
6271
>
6372
{r.action.label}
@@ -68,7 +77,7 @@ function VariableBlock(props: {
6877
initialValue={r.action.initialValue}
6978
onClick={r.action.callback}
7079
key={r.action.label}
71-
className="w-52"
80+
className="w-60"
7281
postfix={r.action.postfix}
7382
disabled={props.disabled}
7483
>
@@ -704,7 +713,7 @@ export function AEMETEnclosureControlTab() {
704713
),
705714
},
706715
action: {
707-
label: 'set enhanced security mode',
716+
label: 'set enhanced security',
708717
callback: setEnhancedSecurityMode,
709718
variant: 'numeric',
710719
initialValue:
@@ -990,7 +999,13 @@ export function AEMETEnclosureControlTab() {
990999
variable: {
9911000
key: 'Cover Status',
9921001
value: renderStringValue(
993-
coreState.aemet_enclosure_state.cover_status,
1002+
(() => {
1003+
const value = coreState.aemet_enclosure_state.cover_status;
1004+
if (value == null) return '-';
1005+
if (COVERR_STATUS_MAP[value])
1006+
return COVERR_STATUS_MAP[value];
1007+
return `unknown (${value})`;
1008+
})(),
9941009
''
9951010
),
9961011
},

packages/ui/src/utils/functions.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,21 @@ export function renderColorfulBoolean(value: undefined | null | boolean) {
2222
return '-';
2323
} else {
2424
return value ? (
25-
<span className="text-red-700">Yes</span>
25+
<span className="font-semibold text-red-700">yes</span>
2626
) : (
27-
<span className="text-green-700">No</span>
27+
<span className="font-semibold text-green-700">no</span>
28+
);
29+
}
30+
}
31+
32+
export function renderColorfulInteger(value: undefined | null | string | number) {
33+
if (value === undefined || value === null) {
34+
return '-';
35+
} else {
36+
return Number(value) == 0 ? (
37+
<span className="font-semibold text-green-700">0</span>
38+
) : (
39+
<span className="font-semibold text-red-700">{Number(value).toFixed(0)}</span>
2840
);
2941
}
3042
}

0 commit comments

Comments
 (0)