Alerts

Top  Previous  Next

An Alert is a response of the system to a custom user-defined event or condition.

Alerts are activated ("raised") by triggers (alert conditions). A trigger can be an event, a state or a change of state of a system component/hardware device. See the triggers section for details.

When alert is raised, the system responds to it:

The alert owner may be immediately notified, if they are connected to the server. They may be also prompted to acknowledge the alert.
An E-mail messages may be sent to the alert owner, to a system user(s) or to a custom E-mail address(es).
The alert may be stored in the event history as a usual event.
Some corrective actions may be executed, in interactive or non-interactive mode.
The alert may change its state.

note_further-wt

Every user has his own set of alerts.

Administering Alerts

Two contexts are used to administer alerts: One is the general Alerts context, which serves as a container. The other is the Alert context, which holds the information for one alert.

ls_alerts

Alert Triggers

 

Alerts are activated by triggers. Every alert may have several triggers associated with it. Each trigger defines a condition in which the alert should be raised. There are two types of triggers, described below:

Event Triggers
Variable State Triggers

note_glossary-term

Trigger: an act that sets in motion some course of events.

Each alert may define zero or more triggers of every type. If no triggers are defined, the alert is never raised. If several triggers are defined, they act separately -- each trigger may raise the alert (they don't all have to exist at the same time - just one is enough to raise the alert).

Event Triggers

An Event trigger is activated when a certain event fires in a context, and conforms to a condition specified in trigger settings. This event may be generated by LinkServer itself or may come from a Data Terminal.

The event trigger's parameters are described here. Each trigger causes LinkServer to "listen" for the event specified by the Event setting in every context that matches the Context Mask setting. When such an event is detected, the server evaluates the expression specified by the Expression setting. This expression usually refers some data associated with the event, but it may also refer some "external" data, such as the values of some context variables.

note_tip-wt

If the Expression parameter is not specified, every occurrence of the event will activate the trigger.

note_example-wt

Example of event trigger:

Let's say we're running a vehicle monitoring system, which has Devices in various factory vehicles. These Devices fire various events, such as the Impact event, which fires when the vehicle bumps (or crashes...) against something. So the Context Mask would match the Device monitoring the vehicle, the event would be something like impact, and we could also have an expression, referring to the strength field of the impact event, which would cause the trigger to activate if the strength of the impact exceeds a certain value.

In this case, the Event Trigger parameters may be as follows:

Context Mask

users.user123.deviceservers.vehicle12.devices.vehicle_monitoring (This mask matches a single Data Terminal context - could be a wildcard matching several, too)

Event

impact

Expression

{strength} > 5.5

(Of course, impact and strength are just theoretical events coming from some made-up Device - they're not built-in LinkServer system events).

VARIABLE STATE TRIGGERS

A Variable state trigger may be activated:

When a variable state satisfies some condition
When a variable state changes

Selection between these two methods is performed by the Monitor State Changes parameter of the trigger. Other parameters of variable state trigger are described here.

Every variable state trigger periodically inspects value the variable in every context matching the mask defined by the Context Mask setting. Polling period is defined in seconds, by the Check Period parameter. A Data Table containing the value of the variable is retrieved from the context, and then something happens, according to the value of the Monitor State Changes setting:

If this setting it disabled, the server evaluates the expression defined by the Expression setting. This expression must evaluate to a Boolean result in this case. It may contain references to the cells of the Data Table containing the variable value, but may also refer other variables and functions of LinkServer contexts. If evaluation result is TRUE and the result of the previous evaluation was FALSE (or this is the first time the variable is inspected since LinkServer was started or since the properties for this alert were last changed), the trigger fires and raises an alert. If the evaluation is TRUE and was also TRUE during the last check, no action is performed. If it changes from TRUE to FALSE, no action it performed either, but subsequent change back to TRUE will fire the trigger.
If Monitor State Changes is enabled, the Expression is evaluated every Check Period exactly like in the previous scenario, but its result may be of any type. The server will remember the last evaluation result. If the new evaluation result is different than the last one, the trigger fires and raises the alert.

If the Context Mask parameter points to more than one context, each context context is separately inspected, and the alert is raised every time the variable state satisfies the condition (or changes, depending on the Monitor State Changes setting) in any of these contexts.

Delay parameter is relevant only when Monitor State Changes is off. It defines the time interval between time when trigger expression becomes true and time when alert is raised. If it is set to zero (the default), the alert is raised immediately when Expression evaluates to TRUE. When Delay is non-zero, the server waits for the specified number of seconds before activating trigger and raising and alert. If Expression evaluates back to FALSE before the Delay time expires, the alert is not raised and the time counter is reset.

note_tip-wt

Delay parameter is very convenient for setting up alerts like "Warning, if temperature is less than 10 degrees for over one hour".

note_further-wt

Regardless to the Delay value, trigger expression is re-evaluated only once per Check Period. For example, if Check Period is 10 seconds and Delay is 15 seconds alert will be raised 20 seconds after the time when expression has been first evaluated to true.

note_example-wt

Example of variable state trigger without "monitor state changes":

Let's say we're monitoring the Current Temperature variable, coming from a temperature sensor. In this case, Expression may refer to the Celsius Temperature field of this variable and cause a trigger to fire if the temperature exceeds certain limit.

The trigger parameters may be as follows:

Context Mask

users.user123.deviceservers.ds123.devices.temperature_sensor (This mask matches a single Data Terminal context)

Variable

currentTemperature

Expression

{celsiusTemperature} > 100

Monitor State Changes

disabled

Check Period (seconds)

10

Delay (seconds)

0

Alert Level

Warning

 

note_example-wt

Example of variable state trigger with "monitor state changes":

Now let's say we're monitoring a Warning List variable, coming from a piece of medical equipment monitoring several critical parameters of a patient. The value of this variable is a Data Table with up to five records, and every record has a single String field called Warning, containing a textual warning about the state of patient. In this scenario, the Expression may aggregate all warning messages by appending them to each other, and activate the alert when any of the warnings is removed, added or changed.

The parameters of may look like this:

Context Mask

users.user123.deviceservers.medical12.devices.monitor1 (This mask matches to a single Data Terminal context)

Variable

warningList

Expression

{warning[0]} + {warning[1]} + {warning[2]} + {warning[3]} + {warning[4]}

Monitor State Changes

enabled

Check Period (seconds)

100

Alert Level

Warning

Alert Notifications

When an alert is raised because one of its triggers is fired, LinkServer starts dealing with its notifications. Notification settings are described here.

NOTIFYING ALERT OWNER

The LinkServer user owning the alert is notified if the Notify Owner If Connected To The Server setting is enabled and this user is logged in to a LinkServer User Interface. For example, in AggreGate Client, a popup message is shown to the user:

ls_alerts_notification

The alert notification popup contains:

Alert description
The event causing the alert
The context where this event is defined
Alert message

If the Acknowledgement Is Required parameter is active, the user is prompted to enter an acknowledgement text for the alert in the same popup box. Here is what it looks like in AggreGate Client:

ls_alerts_ack

If owner notification is enabled, you can specify a "Notification sound" (.WAV file) that will be played in LinkServer User Interface before the notification popup is shown. The sound file is saved on the server, and sent to the AggreGate Client every time the alert is raised.

SENDING E-MAIL NOTIFICATIONS

note_warning-wt

Alert notification e-mails will be sent only if mail server settings are properly configured and mail sending is enabled. See Mail Sending Settings in LinkServer Global Configuration for details.

LinkServer can prepare and send an alert notification e-mail message. This message may be sent to three recipient categories:

Alert Owner
Other LinkServer user(s)
Custom e-mail address(es)

Sending mail to alert owner is enabled by the Send E-mail To Owner setting. E-mail Recipients table contains a list of LinkServer users that will receive e-mail notification.

note_further-wt

Only users whose e-mail address is specified in the user profile may be added to the recipient list.

It is also possible to send e-mail notifications to custom e-mail addresses. These addresses should be listed in the Additional E-mail Recipients field and separated by commas.

Contents of the email:

Alert description
Event causing the alert
Context where the event is defined
Alert message
Alert time
Data of the event that caused the alert (if activated by Event Trigger) of state of the variable that caused it (it activated by Variable State Trigger)

This is what such an email looks like:

ls_alerts_notification_email_html

Text version of alert email:

ls_alerts_notification_email

SENDING SMS NOTIFICATIONS

note_warning-wt

Alert notification may be sent by SMS only if SMS sending settings are properly configured and SMS sending is enabled. See SMS Sending Settings in LinkServer Global Configuration for details.

LinkServer can send an alert notification via SMS to any number of cellular phones. Specify recipients using the SMS recipients setting located in the Alert Notifications section.

The sender's number is defined by Sender Number Global Configuration option.\

note_example-wt

Example: For Impact Warning alert that may inform Vehicle Monitoring System operator about impact occurred to a vehicle, the following SMS notification will be sent:

Alert: Impact Warning

EXECUTING ACTIONS ON ALERTS

LinkServer is capable of running actions when an alert is raised. These are called "corrective actions" because they're intended to correct the problem automatically or by interacting with humans.

Actions may be run in interactive or non-interactive mode. In non-interactive mode, all action input is pre-defined and action output is sent to the server log or written to event history. This mode is also used by the scheduler. In interactive mode, the action interacts with the alert owner by using UI Procedures. He must be logged in to an LinkServer User Interface (e.g. AggreGate Client) to allow interactive actions execution. See the actions section for details.

Non-interactive execution is controlled by the Execute non-interactive actions on alert property. This property lets you configure multiple actions to run on alert, and has several parameters: Every action will be launched from every context matching the Context Mask parameter. Action name is defined by the Action parameter. Parameters is the list of action-specific parameters (this might be confusing, but keep in mind that Parameters here is, itself, a parameter. Get it?).  These parameters are used to substitute user input when the alert processing engine executes an action in non-interactive mode. For example, if a given action requires confirmation (i.e. asks user something like "Delete query?" and lets the user click OK or Cancel), this field will contain a Delete query? parameter with two possible choices: OK or Cancel.

Interactively executed actions are listed in a table called Execute interactive actions on alert if owner is connected to the server. Every action has two parameters: Context Mask and Action, which work just like in non-interactive execution (see above). There is no Parameters field in this list, since all input for interactive actions is provided by a human user.

Alert States

Alerts can be in one of the following states:

Enabled (st_alert_0)
Pending (st_alert_2)
Escalated (st_alert_3)
Disabled (st_alert_1)

The initial state for a newly created alert is Enabled. This means that all triggers are active and may raise the alert. You can disable the alert (put it in Disabled state, technically speaking) by switching off the Alert is enabled basic option. A disabled alert is never raised and doesn't do anything, because all triggers are inactive. For descriptions of Pending and Escalated states see Pending Alerts and Alert Escalation below.

Pending Alerts

When an alert is raised, a special Alert event is generated and persistently stored in LinkServer database. By default, alerts expire after 500 days (a bit longer than the normal 10 days for all other events...). Alert events that are not acknowledged are called "pending alert instances". See the events topic for more information about events and event acknowledgement. The pending instances of every alert may be managed using the View Pending Alerts action, defined in the Alert context. This action shows when and why the alert was raised, and lets you delete or acknowledge pending alerts. Alert instances that have already been acknowledged are not shown in the list.

When configuring an alert, one of the properties is called "Allow Pending Alerts". If you disable this (i.e, disallow pending alerts for this particular alert you're configuring), the alert won't be shown in the Pending Alerts list even if it wasn't acknowledged. It also won't be escalated.

Here is what the list of pending alerts looks like (screenshot made in AggreGate Client):

ls_alerts_pending_list

When one or more unacknowledged alert events exist, the alert may be put in the "Pending" state. This state is indicated in LinkServer User Interfaces by a special st_alert_2 icon. The "Pending" state indicates that some attention is required to solve the problem indicated by an alert. When the problem is solved, system operator may launch the View Pending Alerts action and acknowledge all pending alert instances. Alert will be put back in the "Enabled" (normal) state, indicated by the st_alert_0 icon.

An alert may be put in the Pending state only if the Allow pending alerts setting is enabled.

Alert Acknowledgement

Every alert raised is persistently stored as a LinkServer event (see Alert Event for details). These events may be acknowledged exactly like all other LinkServer events. Acknowledging an alert is the same as acknowledging its "Alert" event. The acknowledgement is stored in the event history, just like any other event acknowledgement. Its parameters (author, time and text) may be viewed when browsing event history (for example, using the Event Log in AggreGate Client).

E-Mail Acknowledgements

LinkServer provides an E-mail alert acknowledgement service letting operators acknowledge events by replying to alert notification e-mail message. To start using this service, enable mail receiving in Mail Settings section of LinkServer Global Configuration and configure incoming mail server properties (POP3 server address, login and password).

note_warning-wt

E-mail alert acknowledgements will function properly only if replies to the alert notification e-mails will be delivered to the mailbox monitored by LinkServer. Alert notification e-mails are sent with the Reply-to header set to the address specified in Sender address for mail messages global configuration setting. Thus, LinkServer must receive all e-mail that were sent to this address. This will allow notification e-mail recipients to use "Reply" function of their mail clients and enter acknowledgement text in the reply e-mail.

To acknowledge an alert by e-mail, reply to the alert notification e-mail and enter the acknowledgement text in the first line of reply. Alert acknowledgement will be added once the reply is delivered and received by LinkServer. LinkServer checks for new mail periodically, according to Incoming mail check period global configuration option.

note_warning-wt

It is important to preserve the subject of original alert notification e-mail when replying. The mail client may add text (usually "Re: "), and this is fine. However, the ID pattern in the message subject should not be removed or changed.

Alert Escalation

Pending alerts may be escalated. Escalation is usually used to draw attention to some critical conditions. In most cases, escalated alerts, indicated with the st_alert_3 icon, require the system operators to take quick action.

For an alert to be escalated, there has to be at least one pending (unacknowledged) instance of it, and it must satisfy at least one of the escalation rules defined by the Alert Escalation property. There are two escalation types:

Number-based escalation
Time-based escalation

With number-based escalation, an alert is escalated if the number of pending alert instances exceeds the limit specified by the Number of pending alerts requited to initiate escalation setting.

With time-based escalation, an event is escalated if it's not acknowledged within the time frame specified by its Time before escalation setting.

When an alert is escalated, an Escalation Notification is emailed to all recipients defined by the Notifications setting. This notification contains the time of escalation, and the reason for it:

ls_alerts_escalation_email

The reason is also shown in a tooltip that appears when the mouse hovers over the alert in LinkServer User Interfaces. Here is what it looks like in AggreGate Client:

ls_alerts_escalation_tooltip

To put an alert back in pending or normal state, acknowledge some of its pending instances so that escalation rules will not be satisfied.

Alert Event

When alert is raised, a special LinkServer event is generated in the Alert context. It is called "Alert event" or "Alert instance", and has several uses:

When this event is not acknowledged, it is called "pending alert instance". When an alert has pending instances, the alert itself is put into the Pending state. Its icon changes to st_alert_2. This is similar to how an email client works -- you can see your mailbox as "Unread" if it has unread messages in it.
When you View Pending Alerts, you are actually looking at the history of all Alert Events for a particular alert. You can only access this action if the "Allow Pending Alerts" setting is enabled for this alert.

Format of Alert Event:

Alert Name

Name of alert context.

Context

Path of context for which the alert was raised.

Entity

Event or variable which caused the alert.

Details

Detailed information about the alert.

Message

Alert message. This is a manually configured string, which is supposed to be a human-readable description of the alert (i.e, "The house is on fire"). See Alert Properties below.

Alert Data

Data associated with the event causing the alert. This field is NULL (not defined) if the alert was caused by a certain variable state or by a variable state change. For a login event defined in the Users context, this data table will contain one record with two fields: Username and Permissions.

Example of Alert event:

ls_alerts_alert_event

Alert Configuration

Alert Properties

This defines the basic options for an alert.

Field Description

Field Name

Alert Name. Name of the alert context, required to refer to this alert from other parts of the system. It should satisfy the context naming conventions, and cannot be changed once the alert is created.

name

Alert Description. Textual description of the alert. This is also a description of the alert context.

description

Alert is Enabled. Disabling an alert deactivates all its triggers. It will never be raised.

enabled

Message. Alert message. It will be shown in all alert notifications including visual notifications, notification e-mails, alert event etc.

message

These may be accessed via the childInfo variable.

Triggers Activated by Events

This defines a list of Event Triggers.

Field Description

Field Name

Context Mask. This mask is resolved during trigger processing. If the event specified by the Event parameter is fired in any context matching this mask, the trigger activates an alert. In most cases, this context mask points to one explicit context, being a context path, rather than a mask.

mask

Event. Name of the event to be monitored.

event

Filter Expression. An AggreGate Expression which must evaluate to TRUE to activate the trigger. May contain references to the cells in the Data Table associated with the event.

filter

Alert Level. Level of this alert event. In addition to the fixed values, may be set to Same As Event (this is a default setting). In this case level of alert event will be same as level of event that caused the alert.

level

These may be accessed via the eventTriggers variable.

Triggers Activated by Variable State

Every variable state trigger periodically inspects value the variable in every context matching the mask defined by the Context Mask setting. Polling period is defined in seconds, by the Check Period parameter. A Data Table containing the value of the variable is retrieved from the context, and then something happens, according to the value of the Monitor State Changes setting:

This property defines a list of Variable State Triggers.

Field Description

Field Name

Context Mask. This mask is resolved during trigger processing. The value the variable specified by the Variable parameter will be monitored in any context matching the mask. In most cases, this context mask points to one explicit context, being a context path, rather than a mask.

mask

Variable. Name of context variable to be monitored.

variable

Expression. AggreGate Expression used to check the variable value. The result of this expression will be processed according of the Monitor State Changes flag.

expression

Monitor State Changes. It this setting is disabled, the trigger fires whenever the result of Expression changes from FALSE to TRUE. If it's enabled, trigger fires whenever the result of Expression changes (from one value to another, not necessarily TRUE/FALSE). This is comprehensively described above, under variable triggers.

monitorStateChange

Check Period (seconds). Time interval between inspections of Variable.

period

Delay (seconds). Time interval between time when trigger expression become true and time when alert is raised.

delay

Alert Level. Level of this alert event.

level

These may be accessed via the variableTriggers variable.

Alert Notifications

This property defines alert notification rules.

Field Description

Field Name

Notify owner if connected to the server. Show a popup message to the user owning this alert if he happens to be logged on to a LinkServer User Interfaces (such as AggreGate Client) when the alert is raised.

notifyOwner

Acknowledgement is required. Force user to acknowledge an alert when the alert notification is shown.

ackRequired

Notification sound. Sound that will be played to the alert owner before notification popup is shown.

sound

Send e-mail to owner. E-mail the owner, to the address specified in his user profile.

mailToOwner

E-mail recipients. List of LinkServer users who will receive e-mail notifications of the alert.

mailRecipients

Additional e-mail recipients. Comma-separated list of e-mails addresses. Alert notification will be sent to each of these addresses.

additionalMailRecipients

SMS recipients. List of phone numbers to those SMS notification message will be sent upon alert. This list may contain both LinkServer users who have phone numbers in their account settings and raw phone numbers. All numbers must be written in international format.

smsRecipients

These may be accessed via the notifications variable.

Alert Escalation

This property defines processing options for pending alerts and alert escalation rules.

Field Description

Field Name

Allow pending alerts. When enabled, allows the alert to switch to "Pending" state. Disabling pending alerts also disables escalation.

pending

Number-based escalation. Enables escalation due to a certain number of pending alert instances.

numberEscalation

Number of pending alerts requited to initiate escalation. When the number of pending alert instances (of this type) exceeds this limit, alert is escalated.

numberThreshold

Time-based escalation. Enables escalation due to alert instances that are pending longer than the specified time limit.

timeEscalation

Time before escalation (minutes). If any pending alert instances are not acknowledged within this time, alert is escalated.

timeThreshold

These may be accessed via the escalation variable.

[new!]Execute non-interactive actions on alert

This property defines the actions to be executed in non-interactive mode when the alert is raised. A good example illustrating application of this feature is execution of an external application on alert.

Field Description

Field Name

Context Mask. Action will be executed from every context matching this mask.

mask

Action. Name of the action to be executed.

action

Parameters. Action-specific parameters. This allows to specify pre-defined input for different UI Procedures like Confirmation, Edit Data etc. This is done within the AggreGate Client GUI, in a very simple manner, while configuring the alert.

input

These may be accessed via the alertActions variable.

Execute interactive actions on alert if owner is connected to the server

This property defines the actions to be executed in interactive mode when the alert is raised while its owner is connected to the server.

Field Description

Field Name

Context Mask. Action will be executed from every context matching this mask.

mask

Action. Name of the action to be executed.

action

These may be accessed via the interactiveActions variable.

Examples

Now that we've covered all the theory, let's see some examples of real-world alert configuration.

IMPACT WARNING ALERT

Let's assume that our hardware device is a forklift controller that may generate Impact event when forklift collides with some obstacle. This event contains Level field that represents impact level, higher levels indicate more severe impacts.

The Impact Warning alert has a single Event Trigger which fires due to the Impact event in the Data Terminal context if the Integer level field in event data is greater than 50 (i.e. alert is raised only for severe impacts) .

Alert Info

Field

Value

Alert Name

impact_warning

Alert Description

Impact Warning

Alert is Enabled

TRUE

Message

Severe impact occurred to the vehicle

Triggers Activated by Events

Context Mask

Event

Filter Expression

users.admin.devices.forklift

impact

{level} > 50

Alert Notifications

Field

Value

Notify owner if connected to the server

TRUE

Acknowledgement is required

FALSE

Notification sound

<Not set>

Send e-mail to owner

TRUE

E-mail recipients

NONE

Additional e-mail recipients


SEVERAL HARDWARE DEVICES IN TROUBLE

This complex example show how integration of two powerful features, alerts and queries, may be helpful to detect error conditions that involve several Device.

Assuming that ten temperature sensors are connected to LinkServer through a single Device Server called sensors and owned by user john. The Data Terminal context of every sensor has a Temperature variable (variable name: temperature) whose value has an Integer field, celsius, containing the temperature in Celsius. Suppose the temperature of every individual sensor is not critical, but if three or more sensors report temperature greater than 100 degrees this may lead to problems in the future, and an alert should be raised to let the operators know there's a problem.

We'll use a query that helps to find all thermometers reporting temperature over than 100 degrees:

SELECT * FROM users.john.deviceservers.sensors.devices.*:temperature WHERE temperature$celsius > 100

This query returns a table (Data Table) containing one record per every sensor showing high temperature.

We can execute the above query by calling the executeQuery function from the Root context and passing the query text to it as an input parameter. So the idea is to set up an alert with a trigger that periodically executes this query and checks the number of records in its output. If the number is greater than three, the trigger fires.

Variable triggers may not be used to check function output directly, but here we must check a function's output -- executeQuery is a function. As covered above, alerts can be triggered in two ways -- when an event (so-called "event triggers") happens, or according to the state of some variable ("variable trigger"). For our example, we'll use a "variable" trigger, but we'll hack it a little bit. A variable trigger always has a context, a variable and an expression. Now, expressions can actually invoke functions.

So we're going to create an alert which has a meaningless context, a meaningless variable (which is still valid for that context), and a very meaningful expression. This expression won't even refer to the context and variable of the alert. We care only about the expression in this case, because it causes the query to be executed for us. The other parts (context and variable) are just placeholders. As placeholders, we'll use the "" (root) context and the version read-only variable, containing the server version.

Out alert will be raised when the expression evaluates to true.

To access the number of records contained in the output of the executeQuery function we will use the records property (see References for details about the reference resolving process). So, the final reference that will return the number of thermometers registering a high temperature looks like this:

{:executeQuery("SELECT * FROM users.john.deviceservers.sensors.devices.*:temperature WHERE temperature$celsius > 100")#records}

How it works:

1. The trigger periodically polls the Root context for the value of the version variable.
2. This value is discarded as it is not used in trigger expression.
3. The expression is evaluated. During evaluation, Default Reference Resolver resolves the above reference - it calls the "Execute Query" function and returns the number of rows in the result. This number is compared to the numeric constant "3". The resulting expression returns TRUE if it is greater or equal to it and FALSE otherwise.
4. If the expression returns TRUE, the trigger raises the alert and all notifications are sent.

Alert Info

Field

Value

Alert Name

temperature_warning

Alert Description

Temperature Warning

Alert is Enabled

TRUE

Message

Three or more sensors show high temperature

Triggers Activated by Variable State

Context Mask

Variable

Expression

Monitor State Changes

Check Period (seconds)

Level

"" (empty string - Root context)

version

{:executeQuery("SELECT * FROM users.john.deviceservers.sensors.devices.*:temperature WHERE temperature$celsius > 100")#records} >= 3

FALSE

10

Error

Alert Notifications

Field

Value

Notify owner if connected to the server

TRUE

Acknowledgement is required

FALSE

Notification sound

<Not set>

Send e-mail to owner

TRUE

E-mail recipients

NONE

Additional e-mail recipients


note_tip-wt

Additional examples may be found in the Triggers section.