PowerOutage¶
- class lsst.ts.watcher.rules.PowerOutage(config, log=None)¶
Bases:
BaseRule
Monitor the PDUs for signs of a power outage.
- Parameters:
- config
types.SimpleNamespace
Rule configuration, as validated by the schema.
- log
logging.Logger
, optional Parent logger.
- config
Attributes Summary
Get the rule name.
Methods Summary
compute_alarm_severity
(data, **kwargs)Compute and set alarm severity and reason.
Determine the severity and reason for Schneider UPSs.
determine_ups_severity_and_reason
(start_time)Determine the severity and reason for all UPSs.
Return a jsonschema as a
dict
, to validate configuration.is_usable
(disabled_sal_components)Return True if rule can be used, despite disabled SAL components.
make_config
(**kwargs)Make a config from keyword arguments, after applying defaults.
setup
(model)Perform post-constructor setup.
start
()Start any background tasks, such as a polling loop.
stop
()Stop all background tasks.
update_alarm_severity
(**kwargs)Compute and set alarm severity and reason.
Attributes Documentation
- name¶
Get the rule name.
Methods Documentation
- compute_alarm_severity(data: BaseMsgType, **kwargs: Any) tuple[lsst.ts.xml.enums.Watcher.AlarmSeverity, str] | None ¶
Compute and set alarm severity and reason.
- Parameters:
- data
salobj.BaseMsgType
Message from the topic described by topic_callback.
- **kwargs
dict
[str
,typing.Any
] Keyword arguments. If triggered by
TopicCallback
callingupdate_alarm_severity
, the arguments will be as follows:topic_callback :
TopicCallback
Topic callback wrapper.
- data
- Returns:
- None, if no change or unknown, or a tuple of two values:
- severity:
lsst.ts.idl.enums.Watcher.AlarmSeverity
The new alarm severity.
- reason
str
Detailed reason for the severity, e.g. a string describing what value is out of range, and what the range is. If
severity
isNONE
then this value is ignored (but still required) and the old reason is retained until the alarm is reset tonominal
state.
Notes
You may return
NoneNoReason
if the alarm state isNONE
.
- determine_schneider_severity_and_reason()¶
Determine the severity and reason for Schneider UPSs.
Under normal circumstances Schneider UPSs emit telemetry with zeros in between telemetry with non-zero values. During a power outage only zeros are emitted. Therefore only after a certain amount of zeros the condition of a power outage can be ensured. This method checks for that condition before determining the severity and reason.
- Returns:
- severity:
lsst.ts.idl.enums.Watcher.AlarmSeverity
The new alarm severity.
- reason
str
Detailed reason for the severity, e.g. a string describing what value is out of range, and what the range is. If
severity
isNONE
then this value is ignored (but still required) and the old reason is retained until the alarm is reset tonominal
state.
- severity:
- determine_ups_severity_and_reason(start_time: float)¶
Determine the severity and reason for all UPSs.
When a power outage starts, the generator will start. This takes a certain amount of time during which the severity will be WARNING. After that time the severity will be CRITICAL.
- Parameters:
- start_time
float
The start time (TAI seconds) at which the power outage started.
- start_time
- Returns:
- severity:
lsst.ts.idl.enums.Watcher.AlarmSeverity
The new alarm severity.
- reason
str
Detailed reason for the severity, e.g. a string describing what value is out of range, and what the range is. If
severity
isNONE
then this value is ignored (but still required) and the old reason is retained until the alarm is reset tonominal
state.
- severity:
- classmethod get_schema()¶
Return a jsonschema as a
dict
, to validate configuration.Notes
Please provide default values for all fields for which defaults make sense. This makes watcher configuration files easier to write.
If your rule has no configuration then return
None
.We recommend that you write the schema as yaml, for compactness, then use yaml.safe_load to convert it to a dict. For example:
schema_yaml = """ $schema: http://json-schema.org/draft-07/schema# description: Configuration for MyRule type: object properties: ... required: [...] additionalProperties: false """ return yaml.safe_load(schema_yaml)
- is_usable(disabled_sal_components: set[tuple[str, int]]) bool ¶
Return True if rule can be used, despite disabled SAL components.
The default implementation returns true if all remotes used by this rule are enabled. Override if you need something more complicated. The attributes
config
,name
andremote_info_list
are all available when this method is called.
- classmethod make_config(**kwargs: str) SimpleNamespace ¶
Make a config from keyword arguments, after applying defaults.
- Parameters:
- kwargs
The configuration, as a dict of property: name. The allowed properties and values are specified by the rule’s config schema.
- Returns:
- config
types.SimpleNamespace
The rule configuration, with defaults applied as needed.
- config
- Raises:
- jsonschema.ValidationError
If the provided kwargs are incorrect (missing keys, misspelled keys, incorrect data types…).
- setup(model: Model) None ¶
Perform post-constructor setup.
Called after the remotes are constructed and populated with topics, but before the remotes have started.
- Parameters:
- model
Model
The watcher model.
- model
Notes
Possible uses:
Rules in which topics and/or fields are specified in configuration should check that the topics and/or fields exist. They may also set variables pointing to the appropriate topics.
Rules that start a background process may start the process here rather than in the constructor; this is especially helpful if the process needs access to topics or fields.
Few rules require
setup
, so the default implemention is a no-op.
- start() None ¶
Start any background tasks, such as a polling loop.
This is called when the watcher goes into the enabled state.
Notes
Do not assume that
start
is called beforestop
; the order depends on the initial state of the Watcher.Immediate subclasses need not call super().start()
- stop() None ¶
Stop all background tasks.
This is called when the watcher goes out of the enabled state, and must stop any tasks that might trigger an alarm state change.
Notes
Do not assume that
start
is called beforestop
; the order depends on the initial state of the Watcher.This base implementation does nothing, so immediate subclasses need not call
super().stop()
.
- async update_alarm_severity(**kwargs: Any) None ¶
Compute and set alarm severity and reason.
This must run quickly. If computing alarm severity is expensive, override this method to start a thread that computes the data and create a background task to manage the thread, then return.
- Parameters:
- **kwargs
dict
[str
,typing.Any
] Keyword arguments. If called by
TopicCallback
, the arguments will be as follows:data :
salobj.BaseMsgType
Message from the topic described by topic_callback.topic_callback :
TopicCallback
Topic callback wrapper.
- **kwargs