Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
The core of the platform are the rules and the rule configurator. The rule configurator allows a customer to edit the pre-defined rules that are available or to add and edit new rules.
The editor consists of six main components:
This documentation guides you through all the core features and contains relevant information for the integration with your systems.
Click the card below to start exploring our documentation.
The core of the platform are the rules. A rule is a combination of datasets, conditions, settings and notification which should be sent to the household.
When navigating to the Rules Menu the first screen that is presented is the Rules Overview. It displays all rules that are currently activated for your customer.
MOOST has a pre-defined set of rules that can be activated for a customer. Each customer has the possibility to add custom new rules to the platform by clicking "Add Rule".
You have the option of analyzing the performance of each individual rule by clicking on the round analysis icon or checking and editing each rule in the rule configurator by clicking on the pencil icon next to the rule.
To be able to login to the Recommender Platform you need a login. The User Management is currently done by MOOST. If you need a new user to be added to an existing customer please fill out the ticket here and the MOOST Support will get back to you asap.
When you already have an account for the Recommender Platform fill in the form on the right of the screen using the email address which was provided to MOOST during the onboarding process and the corresponding password.
The Notification Overview is a powerful tool to keep track of recent notifications and analyze data over a certain period. The page's features, such as search functionality, column selection, time frame adjustment, and pagination, make it easy for users to customize the view according to their needs.
The dashboard provides users with additional insight into their notification strategy, allowing them to quickly identify which rules are generating the most notifications, how users are engaging with notifications, and how effective the notification delivery process is.
The Dashboard provides users with additional insight into their notification strategy.
The "Rules" chart shows how many notifications of a specific rule were sent in percent, allowing users to quickly identify which rules are generating the most notifications.
The "Interactions" chart shows the interaction rate of the sent notifications in percent, providing insight into how users are engaging with notifications.
The "Delivery Status" chart shows the rate in percent if notifications were actually delivered or dropped, providing insight into how effective the notification delivery process is.
The "Delivered Notifications" heatmp gives you insights which rules are sending most recommendations to endusers on a daily basis. It helps to identify if there is an imbalance in one of the rules configured on your tenant.
The table on the bottom of the page displays detail information about the latest notifications sent. The table includes columns such as the notification name, date and time, recipient, and other relevant information. Each row in the table represents a single notification, and users can adjust how many notifications are shown at once by adjusting the page limit.
Located on top of the page is the toolbar which allows you to adjust which information is shown in the charts and the data table.
The filter functionality on the top of the page allows users to filter for specific notifications by building, rule, delivery status, interactions and time range.
This page describes what is displayed in the rule configurator graph and how you can interact with it.
The part on top of the rule configurator is called the data graph. It visualizes the data which is defined by the datasets of the rule for a certain building.
The bar at the top of the data graph is called the action bar. It features settings, like
the active toggle of a rule
the building and time range selector, which define which data is visualized within the datagraph
the drop down menu, which contains Delete, Export and Import functionality.
The filter is able to reduce the displayed buildings of the building selector. By default the "Dataset scoped buildings" option is turned on, so that the building only displays buildings which match to the dataset of the rule.
On top of the data graph is the building selector. The building selector allows you to visualize the datasets of a rule for a specific building.
Next to the building selector is the date range selector. The date range selector defines for which date range the datasets will be visualized. It also defines for which date range a simulation run will be executed when clicking on "RUN SIMULATION" in the action bar.
On top of the graph are the notifications as a envelop icon, which were generated by the rule. Below the notifications, the datasets that have been defined in the rule are displayed as a time series.
Each line is a the representation of a set of datapoints which we have in the system for the selected building. By hovering over a data point of the line the value of the respective datapoint is displayed.
Datasets are the basis of each rule. You may attach one or multiple event types, and optionally a set of event sources to a dataset.
The created datasets are rendered in the graph as a single line per event and source type. The displayed datasets can be found in the legend on top of the graph. By clicking on the name of a dataset in the legend the line for the dataset can be hidden or displayed.
They y-axis is dynamically changed according to the types which are defined on the datasets.
The y-axis differ in the scale that they provide, and it is able to display data types, even when having a mixed dataset of different unit types. For example if a dataset is temperature based, and another one is power based, the y-axis renders both a scale for temperature in °C, and for power in W.
At the top of the graph you may see notifications that were generated by the rule. They are represented by small envelops. The color of the envelops represent the status of the notification:
Green
Delivered Notifications
Notifications which were actually sent to the customers endpoint and marked for delivery to the building.
Gray
Dropped Notifications
Notifications which were generated by the rule but were dropped by the message queue for various reasons (e.g. hitting delivery threshold).
Light Green
Simulated Delivered Notifications
Notifications which were generated by the rule simulator and were neither sent to a building nor to the message queue.
Light Gray
Simulated Dropped Notifications
Notifications which were generated by the rule simulator and would have been dropped by the message queue for various reasons (e.g. hitting delivery threshold).
Hover over the notification icon to see the notification message which was generated. This is the same content that users saw on their device, if the notification was delivered.
Delete a dataset by clicking on the "x"-cross icon on the right side of a dataset.
A dataset defines a set of data points which can be included in the rule's condition and the notification message.
A dataset consists of the following properties:
The name of the dataset. It is recommended to use a self-explaining name. This name can be used as variable in rule condition and rule message.
This field may be used to describe the dataset in more detail. This field is optional
This field defines whether we are interested only in a single value, or a whole time series:
Single Value: only the last matching event is relevant
Time Series: all matching events of specified timeframe are relevant
This field defines which event type(s) shall be matched.
This field defines which source(s) shall be matched. This field is optional
This field is only visible if type Time Series is selected, and it defines the size of the timeframe for the time series.
A condition defines a boolean expression. If this condition is fulfilled (true), then a notification is created which eventually then is going to be delivered to the customer.
The condition can be expressed as a mathematical expression producing a boolean value, which consists of:
dataset references
E.g. $MyConsumption
refers to the dataset with name MyConsumption
values
E.g. number 1000
operators
E.g. plus operator +
, or comparison operator =
functions
E.g. average function AVG(...)
, which calculates the average of specified time series
The list below the represents the datasets that are configured for the rule. Each dataset has a color assigned so that it is clear which line in the Data graph belongs to which dataset.
Change a dataset by clicking on the dataset name, which opens the
Create a dataset by clicking on "Add Dataset", which opens the .
Have a look at to see the full feature set of the expression language.
When a rule's condition matches, then a message is created and possibly sent to the customer. A message consists of a title, a message text, and actions (primary & secondary). It needs to be defined for languages German, English and optionally French.
This field contains the content for the message title.
This field contains the content for the message text, and may contain dynamic data, so that e.g. the effective grid power consumption of the last week may be embedded into the message, with a suitable formatting.
dataset references
E.g. $MyConsumption
refers to the dataset with name MyConsumption
values
E.g. text "Excpected consumption is..."
(text can be wrapped in single or double quotes)
operators
E.g. plus operator +
(for text concatination, or number addition), or format operator |
to format numbers, etc
functions
E.g. average function MAX(...)
, which finds the maximum value of specified time series
This field contains the text which should be displayed for the primary and secondary action.
This field defines the action category of the primary and secondary action.
A rule can be used for Streaks. Therefore you can turn on the "Streak" feature, and define a streak condition.
The streak condition can be expressed as a mathematical expression producing a boolean value. It works exactly the same as the "Condition" field.
A notification is sent if both the "Condition" and the "Streak Condition" expression is fulfilled. If the "Streak Condition is fulfilled, the streak counter is incremented, otherwise the streak counter is reseted.
IMPORTANT: this field does not expect a static text, like in the message title, but same syntax as expected in the field. I.e. it has to be expressed as a mathematical expression which produces a text. It consists of:
Have a look at to see the full feature set of the expression language.
Have a look at to see the full feature set of the expression language.
Besides datasets, condition and message, the rule has a couple of additional settings which are required.
The name of the rule. The name is for internal use only (i.e. is not customer-facing), has to be unique, and should give a good understanding what the rule is about.
This field may be used to describe the rule in more detail. This is for internal use only (i.e. is not customer-facing).
This field defines, how often a condition has to be met, before the message is delivered.
If this value is set to "0" (default), then it will always be delivered.
When a message has been delivered, we might want to make sure that the same rule does not trigger another message for the same building for some time. This can be defined in this field.
Messages which would have been sent, but were within this time range, can be seen in the as Dropped Notifications.
When writing a new rule, you may turn on the rule only for early adopter buildings. This is great to gain in-sight and to collect feedback from early adopters, before turning on this rule for all buildings.
The Rule Simulator is a logical component which allows us to simulate changes or new rules based on existing data of existing buildings.
The simulator runs the current rule configuration against the datasets and the time rang which is selected. The notifications which would have been generated and sent to the message queue and eventually to the user are shown as green letters on top.
When hovering over the green notification icons, the text is shown, which would have been transmitted to the customer and eventually to the end user. Even placeholders are replaced with the actual text so that logic components within the message can be tested, before a new rule or changes to an existing rule go live.
In this example we see already all core elements of the language.
In the following chapters you see many more examples, and all details about what kind of functions and operations exist, and how you can compose the data.
Example of a condition term:
Example of a message term:
Following syntax base components exist:
Example of a variable referring to the dataset with name "PowerConsumption"
Example of a number value
Example of a text value
Example of a timespan value
Example of a time value
Example for calculating the average
Example for multiplying two numbers
Brackets may be needed to control the resolution order of the terms in the expression. This is very familiar to us of course in mathematical terms:
The Rule Language is a powerful feature which we use in the Recommender Platform to process event streams, test condition rules, and produce relevant and precise recommendation messages.
Expressions in Rule Language look similar to expressions in Excel or other comparable tools or script/program languages.
To give a first impression, have a look at the following examples, which give an idea how the language can be used:
Example of a boolean expression which compares multiple values and uses AND/OR operators:
Example of a text expression, which concatenates static text and dynamic data:
Read in the next sub-chapters about the language , the and , and how to process these with the help of and .
In the next step you need to enter the email address which was used during the onboarding for which the password should be reset.
If the entered email is registered on the Recommender Platform you will receive an email with a link to reset your password, after clicking on the "Continue" Button.
If you have forgotten your password please use the forgot password flow to set a new password. The forgot password process can be started with a click on "" on the Login Screen.
When a rule's condition matches, then the notification will not only contain a message but the evaluated expression.
Example
Optionally, you may specify a command containing an instruction for a machine-to-machine interface so that some actions could be triggered. The command is expected to be a expression.
Have a look at to see the full feature set of the expression language.
When having a look at some previous examples, it might not be directly obvious, but we are actually not always working just with single values, such as a number. We also had a look at examples which are actually working with a multi-value set, such as when calculating an average.
A single value is stored in a Scalar data structure.
Example with $PowerConsumption
with dataset of name PowerConsumption of type Single Value:
A set of values is stored in a Vector data structure.
Example with $PowerConsumption
with dataset of name PowerConsumption of type Time Series:
A list of single values, grouped by device or time.
A list of list of value sets, grouped by device or time.
So each literal has not only a , but also a . Here you see the full list:
Generally all are Scalars, but you typically also get Scalars when evaluating boolean or arithmetic operations.
Generally only , or operations and functions on top of , may produce Vectors.
Generally only in combination with a GROUP_BY_DEVICE
or GROUP_BY_TIME
function may produce a GroupedScalar.
Generally only in combination with a GROUP_BY_DEVICE
or GROUP_BY_TIME
function may produce a GroupedVector.
In the following list, each function is listed, including the and of each argument, and the return value. This is done by using form DataStructure<DataType>
.
true
Value for true / fulfilled
false
Value for false / not fulfilled
A decimal number
A time which consists of date and day time.
Besides of event times, we can also use one of following supported literals:
now
The current time. This produces e.g. 2023-09-25 23:26
lastHour
The last full hour. E.g. 2023-09-25 23:00
lastZeroHour
The last zero hour (midnight). E.g. 2023-09-25 00:00
startOfLastMonth
The first day of the previous month. E.g. 2024-05-01 00:00
endOfLastMonth
The last day of the previous month. E.g. 2024-05-31 00:00
startOfMonthBeforeLast
The first day of the penultimate month E.g. 2024-04-01 00:00
endOfMonthBeforeLast
The last day of the penultimate month E.g. 2024-04-30 00:00
startOfCurrentMonth
The first day of the current month. E.g. 2024-06-01 00:00
endOfCurrentMonth
The last day of the current month. E.g. 2024-06-30 00:00
A timespan.
A timespan literal is a combination of a number and a time unit. Following time units are supported:
d
Days
h
Hours
min
Minutes
s
Seconds
A text element
Everything that begins and ends with a single or double quotation mark is considered a text element. This also includes elements that cannot be assigned to one of the other data types. For example, if $Event was used but no such variable was defined, it would also be considered a text element.
Remark: we recommend to use one of the quoted forms, which makes it crystal clear for the readers that this is a text.
An event, which consists of:
Value
Timestamp
DeviceName
DeviceId
Id
RegistrationTimestamp
DeviceTypes
See Streakfor more details about the Streak feature.
In the featured already some data types. Each literal has a specific data type. Here you see the full list:
The value of the event, which is of type
The timestamp of the event, which is of type
The name of the device which is the source of this event. It is of the of type
The ID of the device, which is the source of this event. It is of the of type
The building related to the event, so that building related data can be accessed via Attribute Accessor, see:.
The value of the event, which is of type
The timestamp when the building was registered, i.e. the on-boarding timestamp on the customer side. It is of type
The set of device types (which relates to the "source" entries in the events). It is a Vector of type .
When the rule has the "Streak" feature enabled, then the literal "StreakCounter" returns the current streak of this rule. It is of type .
Calculates the average on a set of numbers or event values
Calculate the average as Scalar<any> from the given parameter.
vector
A vector of type <Number/Event>
Returns the average as Scalar<Number>
Calculate the average as Scalar<any> from the given parameter.
group
A GroupedScalar of type <any, Number/Event>
Returns the average as Scalar<Number>
Calculate the average as GroupedScalar<any> from the given parameter.
group
A GroupedVector of type <any, Number/Event>
Returns the average as Scalar<Number>
Retrieve the average of the GridPowerConsumption time series.
Removes duplicate entries. So if applying on ascending ordered data, you would get a descending ordered data set.
Returns the same scalar (because a scalar cannot have any duplicates).
scalar
A scalar of type any
Returns the same elements, but without any duplicates.
vector
A vector of type any
Returns the same GroupedScalar (because a scalar cannot have any duplicates).
group
A GroupedScalar of type <any, any>
Returns the same GroupedVector, but removes all duplicates in the values of each group.
group
A GroupedVector of type <any, any>
Removes duplicated entries in the building's device types Vector.
Filter data on a vector, grouped scalar or grouped vector, by comparing with a threshold. Only data which fulfills that boolean condition is kept.
Filter data in the given vector by comparing with the threshold.
vector
A vector whose data is to be filtered
comparisonSymbol
The comparison symbol. One of: <
, <=
, =
, !=
, >=
, >
threshold
A scalar which is used to filter data.
Vector of same type as from the first function parameter, with filtered data.
Filter events, so that only values > 1000 are kept in the vector.
Filter data in the given grouped scalar by comparing with the threshold. Empty groups are removed from the grouped scalar.
groupedScalar
A vector whose data is to be filtered.
comparisonSymbol
The comparison symbol. One of: <
, <=
, =
, !=
, >=
, >
threshold
A scalar which is used to filter data.
Grouped scalar of same type as from the first function parameter, with filtered data.
Filter events in the grouped scalar, so that only values > 1000 are kept in the vector.
Filter data in the given grouped vector by comparing with the threshold. Empty groups are removed from the grouped vector.
groupedVector
A vector whose data is to be filtered.
comparisonSymbol
The comparison symbol. One of: <
, <=
, =
, !=
, >=
, >
threshold
A scalar which is used to filter data.
Grouped vector of same type as from the first function parameter, with filtered data.
Filter events, so that only values > 1000 are kept in the grouped vector.
Evaluates the buildingSelector
for the given datasetName
and returns a GroupedVector
, where:
The key is the customerBuildingId
.
The value is a Vector
containing all event values from the dataset, grouped by customerBuildingId
.
datasetName
The datasetName for which we want to load all events for the buildings specified by the buildingSelector.
buildingSelector
The buildingSelector as AttributeOperator which specifies for which buildings we want to load the events specified by datasetName. Valid values are:
Building::IsSelfSufficiencyMotivated Building::IsEcologicalMotivated Building::IsSelfSufficiencyMotivated Building::IsMultiPerson Building::IsSinglePerson Building::IsResidential Building::IsCommercial Building::IsInSameCountry Building::IsInSameConsumptionCategory Building::All
Returns a GroupedVector
where:
The key is the customerBuildingId
.
The values are vectors containing event values, grouped by household as specified in datasetName
.
Converts vector to a grouped vector, by gouping by timespans, so that we have a list of events per timespan. The timespan either is fixed on the latest event, or can be fixed on another time if specified.
Groups the events in the given vector in spans defined by timespan, starting from the latest event.
vector
A vector of type Event
timespan
A timespan in which the events should be grouped
A GroupedVector of type <Time, Event>.
Group the vector in the given timespans starting at the given time.
vector
A vector of type Event
timespan
A timespan in which the events should be grouped
time
The time form which we want to start grouping.
A GroupedVector of type <Time, Event>.
Group events in 1h spans starting from latest event
Group events in 1d spans on full day spans (i.e. 00:00-23:59)
Converts vector to a grouped vector by grouping by devices. I.e. each device has its own list of events.
Groups the events in the given vector by deviceId.
vector
A vector of type Event
A GroupedVector of type <Device,Event>.
Group the events in the GridPowerConsumption vector by device id.
Counts the number of entries on a vector, grouped scalar, or grouped vector.
Count the entries of the given Vector<any>.
Returns how many elements are within the given vector as Scalar<Number>
Count the entries of the given GroupedScalar<any, any>.
Returns how many elements are within the given group as Scalar<Number>
Count the entries of the given GroupedVector<any, any>.
Returns how many elements are within the given group as Scalar<Number>
Count the elements within the GridPowerConsumption time series.
vector
A vector of type <any>
group
A GroupedScalar of type <any, any>
group
A GroupedVector of type <any, any>
Extracts the maximum on a set of numbers or event values.
Extract the highest value as Scalar<any> from the given parameter.
vector
A vector of type <Number/Event>
Returns the highest value as Scalar<Number>
Extract the highest value as Scalar<any> from the given parameter.
group
A GroupedScalar of type <any, Number/Event>
Returns the highest value as Scalar<Number>
Extract the highest value as Scalar<any> from the given parameter.
group
A GroupedVector of type <any, Number/Event>
Returns the highest value as Scalar<Number>
Retrieve the maxiumum of the GridPowerConsumption time series.
Returns the Position of an element within a vector as Scalar<Number>. The position of the element within the vector is the index of the element within the vector plus 1.
Returns the position of the given targetElement within the given Vector.
vector
A vector of type <Number> within we search the position of targetElement.
targetElement
The targetElement of type <Number> we are searching within given vector.
Returns the position of the searched element within the vector as Scalar<Number>.
Sorts the entries of the given parameter in ascending order.
Sort the entries of the given Scalar<any> in ascending order.
scalar
A scalar of type any
Returns the given scalar sorted in ascending order as type Scalar<any>.
Sort the entries of the given Vector<any> in ascending order.
vector
A vector of type any
Returns the given vector sorted in ascending order as type Vector<any>.
Sort the entries of the given GroupedScalar<any, any> in ascending order by values.
group
A GroupedScalar of type <any, any>
by
The by parameter is optional.
Specifies by which attribute of the vector it should be sorted.Allowed values are byGroupKey and byGroupValue.
Default is byGroupValue.
Returns the given group sorted by the specified property in ascending order as type GroupedScalar<any, any>.
Sort the entries of the given GroupedVector<any, any> in ascending order by values.
group
A GroupedVector of type <any, any>
by
The by parameter is optional.
Specifies by which attribute of the vector it should be sorted.Allowed values are byGroupKey and byGroupValue.
Default is byGroupValue.
Returns the given group sorted by the specified property in ascending order as type GroupedScalar<any, any>.
Sort GridPowerConsumption in ascending order.
Sort GroupedByDevicePowerConsumption in ascending order by event
Extracts a subset of elements from a given Vector.
Extract the first or last x entries.
Returns a Vector of type any.
Extract entries from time start until the latest event (left argument is excluding, right is including)
A Vector of type Event.
Extract entries from time start until time end (left argument is excluding, right is including the time border)
A Vector of type Event.
Extract the last entry from the vector GridPowerConsumption.
Extract all events from zero hour (midnight) until now.
Extract all events 2 days ago until 1 day ago.
vector
A vector of type any.
x
A positive or negative number. When x is a positive number it starts to extract the number of entries stated in param2 from the beginning, when param2 is a negative number it starts to extract the number of entries stated in param2 from the end of the vector.
vector
A vector of type any.
x
Position from which to start extracting elements. If negative, then position is counted from the end of the vector.
y
Position until which to extract elements. If negative, then position is counted from the end of the vector.
vector
A vector of type Event.
start
The start time from which to start extracting entries until the latest.
vector
A vector of type Event
start
The start time from which to start extracting entries. (Excluded)
end
The end time until which to extract entries. (Included)
Extracts the minimum on a set of numbers or event values
Extract the lowest value as Scalar<any> from the given parameter.
vector
A vector of type <Number/Event>
Returns the lowest value as Scalar<Number>
Extract the lowest value as Scalar<any> from the given parameter.
group
A GroupedScalar of type <any, Number/Event>
Returns the lowest value as Scalar<Number>
Extract the lowest value as Scalar<any> from the given parameter.
group
A GroupedVector of type <any, Number/Event>
Returns the lowest value as Scalar<Number>
Retrieve the minimum of the GridPowerConsumption time series.
Reverses the entries. So if applying on ascending ordered data, you would get a descending ordered data set.
Reverse the order of the given Scalar<any>
scalar
A scalar of type any
Returns the given scalar in reversed order with type Scalar<any>
Reverse the order of the elements in the given Vector<any>
vector
A vector of type any
Returns the given vector in reversed order with type Vector<any>
Reverse the order of the elements in the given GroupedScalar<any, any>
group
A GroupedScalar of type <any, any>
Returns the given group in reversed order with type GroupedScalar<any, any>.
Reverse the order of the elements in the given GroupedVector<any, any>
group
A GroupedVector of type <any, any>
Returns the given group in reversed order with type GroupedVector<any, any>.
Reverse the elements in the GridPowerConsumption Vector.
Adding or concat two values with each other.
Two arguments of type Scalar<Numbers> added to each other result in a Scalar<Number> which is the sum of both arguments.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Adding a Scalar<Time> with a Scalar<Timespan> results in a Scalar<Time> which is a point in time after the Scalar<Time>.
Adding a Scalar<Timespan> to a Scalar<Time> results in a Scalar<Time> which is far more in the future as stated by the Scalar<Timespan>
Calculating 1 + 2 equals 3
Adding 8 hours to the last full hour results in 13:00 o'clock, when the lastZeroHour was 5:00 o'clock.
Adding 30min to 1h results in 1h30m
Concat Text with the result of a function
Adding a scalar or vector of type Boolean, Number, Time, Timespan, Text to a scalar or vector of type Text results in a new Scalar<Text with concatenated text elements. Non-text elements are implicitly formatted (see ). Vector elements are joined with commas.
Calculates the sum on a set of numbers or event values
Calculate the sum as Scalar<any> from the given parameter.
vector
A vector of type <Number/Event>
Returns the sum as Scalar<Number>
Calculate the sum as Scalar<any> from the given parameter.
group
A GroupedScalar of type <any, Number/Event>
Returns the sum as Scalar<Number>
Calculate the sum as Scalar<any> from the given parameter.
group
A GroupedVector of type <any, Number/Event>
Returns the sum as Scalar<Number>
Retrieve the sum of the GridPowerConsumption time series.
Subtracting two values from each other.
Two arguments of type Scalar<Numbers> subtracted from each other result in a Scalar<Number> which is the result of the division.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Subtracting a Scalar<Time> from another Scalar<Time> results in a Scalar<Time> which is a point in time before the first operator.
Subtracting a Scalar<Timespan> from a Scalar<Time> results in a Scalar<Time> which is a point in time before the Scalar<Time>.
Subtracting a Scalar<Timespan> from a Scalar<Timespan> results in a Scalar<Time> which is further in the past as stated by the Scalar<Timespan>
Calculating 1 - 2 equals -1
Subtracting 8 hours to the last full hour results in 00:00 o'clock, when the lastZeroHour was 8:00 o'clock.
Subtracting 30min from 1h results in 30m.
In the following list, each operation is listed, including the and of each argument, and the return value. This is done by using form DataStructure<DataType>
.
Multiply two values with each other.
Two arguments of type Scalar<Number> multiplied with each other result in a Scalar<Number> which is the result of the multiplication.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Calculating 1.5 multiplied by the SUM of the PowerConsumption
Checks whether first argument is less or equal than the second argument.
Comparing if a Scalar<any> is less or equal than another Scalar<any>. Returns a Scalar<Boolean> either true if the first operator is less or equal than the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is less or equals than the PowerProduction
Divide two values by each other.
Two arguments of type Scalar<Number> divded by each other result in a Scalar<Number> which is the result of the division.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Calculating 3 divided by 2 results in 1.5
Checks whether first argument is less than the second argument.
Comparing if a Scalar<any> is less than another Scalar<any>. Returns a Scalar<Boolean> either true oif the first operator is less than the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is less than the PowerProduction
Negate a Scalar<Event>
An argument of type Scalar<Event> prefixed by a - negates the value of the Event.
If it is a Vector, GroupedScalar or GroupedVector, then the operation is performed on each value, and results in another Vector, GroupedScalar or GroupedVector.
Calculating 3 divided by 2 results in 1.5
Checks whether first argument is equal to the second argument.
Comparing if a Scalar<any> is equal to another Scalar<any>. Returns a Scalar<Boolean> either true if the first operator equals to the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is equals to the PowerProduction
Checks whether first argument is greater than the second argument.
Comparing if a Scalar<any> is greater than another Scalar<any>. Returns a Scalar<Boolean> either true if the first operator is greater as the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is greater than the PowerProduction
Checks whether first argument and the second argument are true.
Comparing if a Scalar<Boolean> and Scalar<Boolean> are both true. Returns a Scalar<Boolean> with true when both terms result in true otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is greater 0 AND the PowerProduction is > 0. Only returns true if both are valid.
Checks whether first argument or the second argument is true.
Comparing if one of Scalar<Boolean> OR Scalar<Boolean> is true. Returns a Scalar<Boolean> with true when one of the terms result in true. Returns false when both terms are false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is greater 0 OR the PowerProduction is > 0. Only returns false if both are false.
Checks whether first argument is not equal to the second argument.
Comparing if a Scalar<any> is not equal to another Scalar<any>. Returns a Scalar<Boolean> either true if the first operator equals to the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is equals to the PowerProduction
Checks whether argument is not true.
Negate the Scalar<Boolean> after the NOT keyword. This means a Scalar<Boolean> with value true will return false and vise versa.
If it is a Vector, GroupedScalar or GroupedVector, then the operation is performed on each value, and results in another Vector, GroupedScalar or GroupedVector.
Check if the PowerConsumption is NOT greater than the PowerProduction.
Formats numbers, time and timestamp.
Format on Vector will result in a comma-separated list of formatted values.
E.g.: Device Link Car, Fronius Symo
Format on GroupedScalar will result in a comma-separated list of group identifier, double-quote and formatted value; the group identifier is rendered as device name, if grouped by device, else the time span index is taken.
E.g.: 'Device Link Car': 1035, 'Fronius Symo': 8012
Format on GroupedVector will result in a slash-separated list of group identifier, double-quote and comma-separated formatted values; the group identifier is rendered as device name, if grouped by device, else the time span index is taken.
E.g.: 'Device Link Car': 1035, 2012, 3097 / 'Fronius Symo': 8012
Format pattern semantic
Format the Result of the AVG($Consumption) function (which is a Scalar<Number) in format '#,##0'.
Format the Timestamp of the $Event (which is Scalar<Event>) as hours and minutes.
Fromat the resulting Timestamp as Hours suffixed with the word Hours.
Format pattern semantic, see
Format pattern semantic, see
Format pattern semantic, see
ADAPATIVE
Means that it chooses the time unit automatically depending on the value size
SECONDS
Redners the value in seconds.
MINUTES
Renders the value in minutes.
HOURS
Renders the value in hours.
DAYS
Renders the value days.
WORD
Is in the word form (e.g. Hours)
SYMBOL
Is in the abbreviation of the unit (e.g. h)
Checks whether first argument is greater or equal than the second argument.
Comparing if a Scalar<any> is greater or equal than another Scalar<any>. Returns a Scalar<Boolean> either true if the first operator is greater or equals to the second otherwise false.
If one argument is a Scalar, and the other one a GroupedScalar, then the operation is performed by taking the Scalar value and the value of each group value, which results another GroupedScalar (it has same group size, as the one from the input argument).
If both arguments are GroupedScalar, then the operation is performed by taking values with same group key, which results in another Grouped Scalar (the group size is equal or smaller than the ones of the input arguments).
Check if the PowerConsumption is greater or equal than the PowerProduction
The Events Overview page is a powerful tool for users who need to keep track of recent events, monitor changes in real-time, and analyze data over a certain period. The page's features, such as search functionality, column selection, time frame adjustment, and pagination, make it easy for users to customize the view according to their needs.
The page provides a comprehensive view of the latest events received and allows users to quickly and efficiently navigate through the information.
The table on the Events Overview page displays information about the latest events received. The table includes columns such as the event name, date and time, location, and other relevant information. Each row in the table represents a single event, and users can view multiple events at once by adjusting the pagination.
The filter functionality on the Events Overview page allows users to search for specific events by filtering by building, event type, event source, device name and date range.
The table has pagination enabled, which means that users can navigate through the table by clicking the page numbers or using the previous and next buttons. Users can also select how many elements per page they want to display. This feature can be accessed by clicking the "Page Size" button located above the table. A drop-down menu will appear, and users can select the number of elements they want to be displayed per page.
Our rule configurator often provides the possibility to get to your goal in different ways. This page shows examples on how you can combine the different functions and operations to write a rule.
Subsets are often used to select a certain time period from a timeseries.
For example, we want to send a message if the minimum of the newest two entries of a time series of 5 days in Grid Power Consumption is greater than the minimum of the remaining time series.
Alternatively, we can also take the newest entries in a certain time period. Here we want to get the minimum of all registered Grid Power Consumption events from the last 30 minutes until now.
Let us continue with the first version. We now want to compare this minimum value with the minimum of the rest of the time series.
The beginning of this snippet is therefore the first value of the vector at position 0 up to and including the third most recent event. As before, we can get the minimum by applying a MIN function to the resulting subset.
The user profile can be access by clicking on the avatar in the right corner of the header and then clicking on your username. On the user profile you can start the following processes:
Change Username
Change Password
, we simply can add the number of entries we want to extract from a vector, as long as they are at the beginning or end of the vector. As we want the most recent entries, we must precede that value with a minus sign.
We now have a snippet of the two newest entries from the original time series. By adding the , we end up with the lower value of those two.
So we would need to add an additional minute (or at least some seconds) to include the event that occurred exactly 30 minutes ago.
Finally, we simply have to combine the two parts for our condition by adding a between them:
This page provides an overview of all buildings within the system, allowing you to view and manage their details. Below is a detailed guide to help you navigate and utilize the features available on this page.
At the top of the page, you will find several filters and a search bar to help you find specific buildings quickly.
ID: Search or filter buildings by their unique Building ID.
Location: Filter buildings based on their location.
Status: Filter buildings by their status (e.g., Active, Inactive).
Event Types: Filter buildings by the types of events associated with them.
Event Sources: Filter buildings based on the sources of their events.
Below the filter and search bar, you will see a list of buildings with the following columns:
Building ID: The unique identifier for each building.
Location: The location of the building, including city and country code.
Status: The current status of the building (e.g., Active).
For each building listed, there are action buttons available to perform various tasks:
View (Circle Icon): Click to view detailed information about the building.
Edit (Pencil Icon): Click to edit the building’s information.
Early Adopter (Hat Icon): Indicates if the building is in the list of early adopters.
Star (Star Icon): Click to mark the building as a favorite for quick access.
Items per Page: Select the number of items to display per page (e.g., 10, 25, 50).
Page Navigation: Use the arrows to navigate between pages if there are more buildings than can be displayed on one page.
Access sub-data of the argument.
Returns the event value, device id, device name, timestamp or forecast timestamp.
Remark: if there is no forecast timestamp, "0" is returned
Get the value of the event stored in the PowerConsumption Variable.
Returns the first or last element of the Vector as Scalar<any>
Get the first Event from the $PowerGeneration vector.
Returns the set of event values, device ids, device names, timestamps or forecast timestamps.
Remark: if there is no forecast timestamp, "0" is returned
Get the values of all events in the vector $PowerConsumption as new Vector<Number>
Returns the set of event values, device ids, device names, timestamps or forecast timestamps, grouped by device or time spans.
Get the values of all events in the group $PowerConsumption as new Vector<Number>
Returns the device id or name of the device which is part of the GroupedScalar key.
Get all device names from all the devices in the $PowerConsumption group.
Returns the value of the group as new Vector<any>.
Get all Values from the $PowerConsumption group.
Returns a GroupedScalar, which holds the first or last value of each group.
Get all Values from the $PowerConsumption group.
Returns the values, device ids, device names, timestamps or forecast timestamps of all events in the group and return as new GroupedVector<Number>.
Get the values of all events in the group $PowerConsumption as new Vector<Number>
Returns the device ids or device names of all devices which are the groups key, and return as new Vector<Text>.
Get all device names from all the devices in the $PowerConsumption group.
Selects the event related building, and returns the specified building data, such as the building id, the registration date when the building was registered, the activation date when the building was activated on MOOST side, or the types of all devices.
See Building
Get all device types from the event related device.
The Billing Portal is a self-service portal where you can manage your subscription billing, update payment information, view past invoices, and perform other billing-related tasks.
By selecting the navigation point "Billing" in the navigation, you will be redirected to the Billing Portal.
By clicking on the link "Edit information" you can update the billing address for your company.
The Household Profile page provides detailed information about a specific building or household within the recommender platform. This page is structured to present key metrics and data points related to the building's characteristics, user motivations, and interaction history. Below is a detailed description of each section on this page.
Status
Indicates the current state of the building profile. Either the building is "Active" or a timestamp is shown for when the building was set Inactive.
Early Adopter
The Badge Early Adopter tells us tha this building is part of the early adopter group which can be activated for rules to be tested before they are set accessible for all buildings.
Location Details
PLZ: The postal code associated with the building (e.g., 8000
).
City: The city where the building is located (e.g., Zürich
).
Country: The country code, such as CH
for Switzerland.
This section includes a radar chart that visualizes the building occupants' motivations across three axes:
Ecological: Represents interest in sustainability and environmental impact.
Economical: Reflects the importance placed on cost-saving measures.
Self-Sufficiency: Indicates the desire for independence in resources, such as energy.
The position of the plot on the chart indicates the building's relative emphasis on these three factors.
Behind the motivation scores are complex algorithms that determinate the motivation of a household through multiple factors like their Power Consumption, their Device Settings, their Interaction with the Recommendations etc. For a deep-dive into the algorithms behind the platform feel free to reach-out to hello@moost.io
Household Gauge: A semi-circular gauge that displays the likelihood of the building being a single-person or multi-person household.
Value: The gauge shows a numerical value (e.g., 0.692
) that leans towards a multi-person household.
Per Rule: A pie chart that breaks down user interactions based on different rule sets or categories. Each segment represents a specific rule or interaction type, labeled with its identifier and percentage.
Delivery Status: This section contains a pie chart that details the status of interactions or deliveries:
Delivered: The percentage of interactions successfully delivered (e.g., 43.75%
).
Dropped (Time Between...): Represents interactions dropped due to timing issues (e.g., 53.12%
).
Dropped (Match Counter Not Reached): Indicates interactions that were dropped for not meeting specified criteria (e.g., 3.13%
).
Interaction Types: Another pie chart that categorizes user engagement:
Viewed: The proportion of interactions where content was viewed (e.g., 87.5%
).
Open App: The percentage of interactions where users opened an application (e.g., 12.5%
).
The Building Profile page is intended to provide a quick and comprehensive overview of the building's profile, including motivations, household type, and interaction patterns. This information is crucial for tailoring recommendations, understanding user behavior, and optimizing engagement strategies.
The Weather Forecast service provides accurate and up-to-date weather information for a given location. It offers various meteorological data points, such as temperature, humidity, wind speed, precipitation, and more.
With the Weather Forecast service we can leverage weather conditions to enhance the quality of recommendations.
The Weather Forecast generates events with the following types. This information is available for all customers of the recommender platform which provide a ZIP for their buildings.
EXPECTED_OUTSIDE_TEMPERATURE
The expected outside temperature on the location of a given building for the next calendar day in degrees celsius.
EXPECTED_OUTSIDE_TEMPERATURE_4DAYS
The expected outside temperature on the location of a given building in 4 days in degrees celsius.
At the bottom of the billing portal you see the last invoices which have been processed. After clicking on the link icon next to an invoice, you will be redirected to the invoice screen on which you can download a copy of the invoice or a receipt for the charge.
If you want to terminate your subscription you can do this be clicking on the "terminate" button in the MOOST Billing Platform.
The Recommender Platform offers multiple context services that provide valuable information for making recommendations. The available context services include Weather Forecast, Solar Production Forecast and Power Consumption Forecast.
You find information about each context service and how to utilize them within the recommendation platform on the next pages.
The Solar Production Forecast service predicts the amount of solar energy that can be generated from a solar power system at a specific location. It takes into account factors like solar radiation, cloud cover, and other environmental conditions to provide accurate solar production forecasts.
By incorporating the Solar Production Forecast service into the recommendation platform, we can optimize recommendations based on expected solar energy availability.
The Solar Production Forecast generates events with the following types. This information is available for all customers of the recommender platform which provide a ZIP for their buildings.
POWER_GENERATION_FORECAST_1H
The expected power generated in the next hour in Watt.
POWER_GENERATION_FORECAST_24H
The expected power generated in the next 24 hours in Watt.
POWER_GENERATION_FORECAST_48H
The expected power generated in the next 48 hours in Watt.
POWER_GENERATION_FORECAST_TOMORROW
The expected power generated on the next calendar day.
POWER_GENERATION_FORECAST_DAY_AFTER_TOMORROW
The expected power generated on the day after tomorrow in Watt.
The Power Consumption Forecast is a context service that applies machine learning algorithms to historical power consumption data to forecast the power consumption for a building. The Power Consumption Forecast can be used within rules as a normal event type.
The Energy Consumption Forecast generates events with the following types.
POWER_CONSUMPTION_FORECAST_1H
The expected power consumption in exacly one hour in Watt.
POWER_CONSUMPTION_FORECAST_24H
The expected power consumption in exactly 24hours from now in Watt.
NOTE: The Power Consumption Forecast is only available in the Premium Subscription
The Power Generation Forecast is a context service that applies machine learning algorithms to historical power generation data to forecast the power generation for a building. The Power Generation Forecast can be used within rules as a normal event type.
The Power Generation Forecast generates events with the following types.
POWER_GENERATION_FORECAST_1H
The expected power generation in exacly one hour in Watt.
POWER_GENERATION_FORECAST_24H
The expected power generation in exactly 24hours from now in Watt.
NOTE: The Power Generation Forecast is only available in the Premium Subscription
This guide helps you as a customer with the necessary steps on how to integrate your cloud offering with the MOOST Recommender Platform. The integration consists of four sections. Each section covers a part of the information flow that is needed to integrate your cloud platform with the MOOST Recommender Platform.
The cloud-to-cloud integration consists of following steps:
As a first step ask MOOST to on-board you onto the MOOST Recommender Platform.
Organisation name - optionally you may provide an organisation logo URL.
Email addresses of members of your organizations which need access to the admin frontend. Of course, we can add more members to the group at a later stage.
Email address and mobile number of a member which is responsible for the API integration. We will send parts of the API secrets via these two channels. We use two channels due to security reasons.
Email address of billing administrator.
Set of desired Notification Languages. By default we activate languages English, German and French.
We create a customer on the MOOST Recommender Platform. This key element is needed for many processes, such as e.g. registering buildings, and then feed events.
We set up logins to the MOOST admin frontend for members of your organization. The frontend enables you to get in-sights about the MOOST Recommender Platform, so that you are able to see the available rules and buildings, processed events or delivered notifications.
We set up API secrets and send them to the person on your side which will be responsible for the API integration. The API secrets will enable you to access our API's, so that you may e.g. read delivered notifications.
We set up the rules by selecting the relevant ones from our use-case library.
We set up the pricing for the monthly billing.
We set up the Training Jobs that are needed to periodically train our Machine Learning Models with our Events to get more precise results over time.
Each rule of the Recommender Platform may eventually emit notifications.
On the MOOST Help Center you can choose the type of issue you are facing and create a ticket which will be handled by the MOOST Support regarding the SLA's for the Recommender Platform.
The MOOST Recommender Platform delivers Notifications to Customer’s specified REST Endpoint. The Endpoint that should be used can be configured as a per Customer, per End-user or a combination of both.
To send notifications to the REST Endpoint, the Endpoint has to be exposed on a public domain that can be accessed via Internet. Any REST Endpoint that is accessible via Internet should be protected via authentication. The MOOST Recommender Platform is able to authenticate against a Customer’s REST Endpoint via various authentication methods.
The Recommender Platform is able to authenticate against a Customer REST Endpoint via various authentication methods as listed below.
The Recommender Platform can be configured to authenticate against a customer’s REST endpoint with username and password (i.e. “Basic” authentication).
The Recommender Platform can be configured to use an API-Token to authenticate against a customer REST Endpoint.
The Recommender Platform can be configured to use a Bearer Token to authenticate against a Customer REST Endpoint.
If the Customer’s REST Endpoint is protected against DDOS attacks with some kind of request throttling the Customer should inform MOOST during the integration phase about the limitations that are in place. MOOST will configure the Recommender Platform accordingly.
If the limits are exceeded, the MOOST Recommender Platform will not able to send all notifications back to the Customer’s REST Endpoint. Cusermers are encouraged to ensure that the chosen limitation is in line with the expected notifications per time unit.
An example of a notification object which will be sent to the Customer’s REST Endpoint is shown below. The notification object will be posted to the specified Customer’s REST Endpoint as a JSON message in the body.
A notification includes two actions that should be presented to the End-user. The actions consists out of a text field which contains the text that should be presented to the End-user in the different languages, and a action qualifier field, which describes the type of action (and which should be returned to the MOOST API when the action is selected by the end-user).
The Recommender Platform has the following action qualifiers:
DISMISS
OPENAPP
STOPDELIVERY
OPENWEB
The DISMISS
actionQualifier states that the push notification should be dismissed when this action is selected be the end-user.
The OPENAPP
action states that when this action is selected by the the end-user, then the app should be opened. The optional parameter attribute may contain a language specific value, such as e.g. an URL or a use case name.
The STOPDELIVERY
action states that when this action is selected the push-notification should be dismissed and the actionQualifier should be returned to the MOOST API implicating that no more notifications of this type should be sent to the End-user.
The OPENWEB
action states that when this action is selected by the the end-user, then a browser should be opened. The optional parameter attribute may contain a language specific value, typically an URL.
Optionally, you may specify a command when defining a notification in a rule. The command
field may contain an instruction for a machine-to-machine interface so that some changes could be triggered.
As this is customer specific, this field is initially empty, but can be defined by the customer to his preferred format.
In order to receive these emitted notifications, you are able to configure this via the MOOST admin frontend: . There you can configure, how MOOST shall send the notifications to you. More details, see REST Endpoint
At the bottom of the navigation pane on the left you find a link called "" which will bring you to our support center after clicking it.
MOOST delivers the generated notifications to a REST Endpoint which can be specified by you ("Customer"). You can then deliver these notifications to your households ("End-users") e.g. via .
In case your organization is implementing the MOOST API integration on your own, you are in charge to synchronize necessary building and device data, and then feed events into MOOST Recommender Platform.
MOOST API is OAuth2 based. Therefore first you have to obtain an access token with your client id and client secret. Then you are able to call the MOOST API's, by using the provided access token.
The access token can be re-used for multiple calls, but eventually expires after some hours.
In the next steps we will guide you through the needed steps to be able to setup buildings, send events and send interactions with notifications to the MOOST recommender platform
The MOOST API is published as Swagger API documentation and can be found here: .
To integrate MOOST Notifications into your iOS Application you can use Firebase Cloud Messaging (FCM). With FCM you have a centralized tool to send notifications to your End-users either to Android or iOS Apps. For more information on how to setup Firebase for iOS you can consult .
To perform operations with the MOOST API, it is essential to obtain a new access token from the Auth API. This token is required for authenticating and authorizing your requests. The steps to lease a new access token are as follows:
Request a New Token: Send a request to the https://api.moost.io/auth/token/v1 endpoint with the provide client id and client secret to obtain a new access token. This endpoint will issue a token that is valid for 86400 seconds (24 hours).
Use the Token: Include the access token in the Authorization header of your API requests to authenticate them. This token grants access to the API's functionalities as documented.
Token Expiration: Be aware that the access token will expire after 86400 seconds. It is crucial to monitor the token's validity and request a new one before it expires to maintain uninterrupted access to the API.
Refresh the Token: Once the token expires, repeat the process by sending a request to the /auth/token/v1
endpoint to lease a new access token. Ensure this is done promptly to continue using the API services without any interruptions.
By following these steps, you can efficiently manage the access tokens required for seamless interaction with the API.
You may store the access token in another variable, if you plan to call some MOOST API from the shell:
Make sure that event data, which shall be taken into consideration by MOOST Recommender Platform, are forwarded to MOOST via MOOST API.
See Event Types to get an overview which Events should be forwarded for which Devices in which periodicity.
Following example depicts an event structure of a energy consumption event.
id
The event ID on MOOST side (is generated when inserting a new event)
customerId
The ID of the customer (cannot be set or change)
customerBuildingId
The building ID on customer side
deviceId
deviceName
The name of the device which is producing this event. Remark: if devices have not an own name, the product name can be used.
source
type
value
The value of the event datapoint. Remark: must be a number
timestamp
Time of the event (Epoch Time in seconds (UTC))
For sending new Events to the MOOST Recommender Platform the below Endpoint can be used.
Below you can find a list of Device Types that are known to the MOOST Recommender Platform and which Event Types you can send for each Device Type. If you cannot send all the information for a device, this does not significantly impact the number of possible use cases.
The ID of the device which is producing this event (should refer to the device within the building, see
The device which is related to this event. See
Remark: device type GATEWAY
is used, when this is a data point for the whole household / building.
The event type of this event. This value also implies the data unit. See
APPLIANCE
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
Every appliance that does not fit into any other category.
BATTERY
CHARGING_MODE DEVICE_STATUS ENERGY_EXPORT ENERGY_EXPORT_YESTERDAY ENERGY_IMPORT ENERGY_IMPORT_YESTERDAY POWER_CONSUMPTION
A battery which is used to store energy in a household.
CAR
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION STATE_OF_CHARGE_RATE
A car that is connected to your HEMS.
CAR_CHARGER
CHARGING_MODE DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION SWITCH_STATE STATE_OF_CHARGE_FORECAST_RATE
A car charger which is used to charge a car in the household.
ENERGY_MEASUREMENT
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
A small device which is solely used to measure energy.
GATEWAY
DEVICE_STATUS
ENERGY_CONSUMPTION ENERGY_CONSUMPTION_YESTERDAY
ENERGY_CONSUMPTION_LAST_24H
ENERGY_EXCESS_LAST_24H
ENERGY_EXCESS_YESTERDAY
ENERGY_GENERATION_LAST_24H
ENERGY_GENERATION_YESTERDAY
GRID_POWER_CONSUMPTION
MIN_POWER_CONSUMPTION
PEAK_POWER_CONSUMPTION POWER_CONSUMPTION
POWER_EXCESS
POWER_GENERATION
POWER_GENERATION_FORECAST_1H
POWER_GENERATION_FORECAST_24H
POWER_GENERATION_FORECAST_48H SELF_CONSUMPTION_RATE_YESTERDAY SELF_SUFFICIENCY_RATE
SELF_CONSUMPTION_RATE
The household itself is referred to as GATEWAY. Every event that is received with device type GATEWAY represents a value for the total of the household.
HEAT_PUMP
CHARGING_MODE DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY HEAT_PUMP_MODE POWER_CONSUMPTION WATER_TEMPERATURE
A heat pump which is connected to your system
INPUT_DEVICE
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
INVERTER
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
A power inverter which changes DC to AC and is connected to your HEMS.
SMART_METER
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
A smart meter which can be placed in an outlet which is used to monitor the energy that passes through and has no control ability like a SMART_PLUG.
SMART_PLUG
CHARGING_MODE DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION SWITCH_STATE
A smart plug which can be placed in an outlet to control the connected device.
SOLAR_PANEL
DEVICE_STATUS POWER_PRODUCTION ENERGY_PRODUCTION
A solar panel which is connected to your system
SWITCH
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION SWITCH_STATE
A smart switch which is used e.g. to control lights.
THERMOSTAT
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
A thermostat which is used to measure the current temperature.
WATER_HEATER
CHARGING_MODE DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION WATER_TEMPERATURE
A water heater which is connected to your system.
WALL_TABLET
DEVICE_STATUS ENERGY_CONSUMPTION_YESTERDAY POWER_CONSUMPTION
A wall tablet which is used to control your HEMS.
Make sure all buildings, which shall be taken into consideration by the MOOST Recommender Platform, are synchronized to MOOST. I.e. new buildings shall be created, and changed building states shall be updated (incl. deactivation and reactivation) via MOOST API.
Following example depicts a data structure of a building located in Dresden, with a couple of connected devices, with dual tariff.
id
The building ID on MOOST side (is generated when inserting a new building)
customerBuildingId
The building ID on customer side
customerId
The ID of the customer (cannot be set or changed)
zip
Postal code
city
Name of the city
countryCode
timeZoneId
registrationTimestamp
Time (Epoch Time in seconds (UTC)) when the building was registered on customer side.
activationTimestamp
Time (Epoch Time in seconds (UTC)) when the building was added to MOOST Recommender Platform. This time is automatically added by MOOST when inserting a new building.
deactivatedTimestamp
If building has been deregistered, and shall no longer receive notifications, then this attribute is set, and contains Epoch Time in seconds (UTC)
isEarlyAdopter
If building is marked as early adopters, then he/she also receives notifications of rules marked for "Early Adopter" (these are typically new designed rules which shall be tested on a small user (aka building) base.
devices
List of devices. Each device mainly contains following attributes
id
,
product_name
settings.tariff
You may add tariff data of a building. If dual or dynamic tariff settings are defined, then MOOST is able to generate additional tariff related events. The tariff sub-structures are explained in table cells below. Remark: attributes "currency", "minPrice" and "maxPrice" are optional.
Single tariff settings
Dual tariff settings: defines the low-tariff time for a whole week.
Dynamic tariff settings: defines the dynamic tariff slices for the next couple of hours (typically for 1 - 2 days)
Remark: when reading building data, there might be additional attributes set, such as profile
or geolocation
. These fields are calculated by MOOST and is not to be modified by the customer.
Make sure that devices of buildings, which shall be taken into consideration by MOOST Recommender Platform, are synchronized to MOOST via MOOST API.
Remark: it is also possible to manage the devices via the upper mentioned building API's.
Country Code,
The time zone id of the building, This is automatically added by MOOST if not provided (and if provided, it would be verified).
type
(see )
Event type: DEVICE_STATUS
Below are the device status values and a short description
-1
Undefined
No defined device status
0
Not connected
Device is not connected
1
Connected
Device is connected
2
Inactive
Device is inactive
3
Deleted
Device was deleted
4
Missing
Device is missing
To train our algorithms based on the actions taken by End-users, it is important that the action qualifier, which identifies the action that was taken by the End-user, is returned to the Recommender Platform.
Notification interactions must be returned to MOOST on any interaction the enduser has with a notification. This includes to following interactions:
Pressing the primary button
Pressing the secondary button
Pressing on the notification itself
Dismissing the Notification (Swipe left)
Use following MOOST API to achieve that
When the push notification is sent to a end-customer (typically to a mobile app), then this person shall have the possibility to interact to the notification. The app shall then send the interaction type with following API call:
Example with CURL
The app shall have the possibility to display the generated notifications. Following API can be used to fulfill this need.
Example with CURL
You need to be authenticated to be able to send the interaction back to the Recommender Platform API. Please refer to “” for further details on how to obtain a valid bearer token.
Each notification is delivered with a unique ID to the customer’s REST Endpoint. (See for a full list of fields that are contained on the notification object). The MOOST Recommender Platform exposes the interaction endpoint on to which the actionQualifer of the clicked action can be sent.
The notifications are sent to you via the configured endpoint, see . Nevertheless you might want to render a list of delivered notifications at a later time.
Not connected
The car is not connected to the car charger.
Connected and not charging
The car is connected to the car charger but currently not charging.
Connected and charging
The car is connected to the car charger and currently charging.
Error
The car charger is in an error state.
Unknown
Unknown status
Not connected
No device is connected to the smart plug.
Connected
Device is connected to the smart plug.
The meaning of the value of the event type CHARGING_MODE differs due to selected Source type. This means for example the CHARGING_MODE value 5 for a CAR_CHARGER means "Minimal and Solar" where as the CHARGING_MODE value 5 for a HEAT_PUMP means "noControl".
Event type: CHARGING_MODE
Source type: CAR_CHARGER
Below are the charging modes which can be set for a EV Charger.
Fast charge / Always charge
Charge with maximum possible power.
Only solar
Only charge if sufficient solar power is available. The power is regulated depending on the available solar power.
Solar and tariff optimized
Charge during the day if sufficient solar power is available. If the battery is not full at the start of low tariff hours, charging occurs with maximum possible power.
Do not charge
Do not charge the car.
Constant current
Charge with a constant current.
Minimal and solar
Charges with a minimum current (mostly 6A and single-phase, if supported). If there is a solar power surplus, this is used on top.
Minimum charge quantity
Charge minimum quantity
Charging Target (%)
Charge until target percentage is reached
Event type: CHARGING_MODE
Source type: BATTERY
Below are the charging modes which can be set for a BATTERY.
Passive / Passive Control
Active / Active Control
Charge
Discharge
OFF
Event type: CHARGING_MODE
Source type: HEAT_PUMP
Below are the charging modes which can be set for a HEAT_PUMP.
No Mode
ON / Overheating
OFF / Reduction
Only Solar / Solar optimized
Solar & Tariff optimized
No Control
(Normal operation)
Event type: CHARGING_MODE
Source type: SMART_PLUG
Below are the charging modes which can be set for a SMART_PLUG.
No Mode
ON
OFF
Only Solar
Solar & Tariff optimized
No Control
Event type: CHARGING_MODE
Source type: WATER_HEATER
Below are the charging modes which can be set for a WATER_HEATER.
No Mode
ON
OFF
Only Solar
Solar & Tariff optimized
No Control
ECO
The List of MOOST Provided Types contains state types of events that are generated by context services that are part of the Recommender Platform.
CHARGING_MODE
ID [0..7]
Each time the value changes
CAR_CHARGER WATER_HEATER HEAT_PUMP BATTERY SMART_PLUG
DEVICE_STATUS
ID [-1..4]
Each time the value changes
ALL
ENERGY_CONSUMPTION
Wh
Every 30min
ALL
The energy consumption of the last time interval that has occurred.
ENERGY_CONSUMPTION_LAST_24H
Wh
Once a day
GATEWAY
The energy consumed over the last 24 Hours at the time the event is created.
ENERGY_CONSUMPTION_YESTERDAY
Wh
Once a day
ALL
The energy consumed on the previous calendar day.
ENERGY_EXCESS_LAST_24H
Wh
Once a day
GATEWAY
The energy excess over the last 24 Hours at the time the event is created.
ENERGY_EXCESS_YESTERDAY
Wh
Once a day
GATEWAY
The energy excess on the previous calendar day.
ENERGY_GENERATION
Wh
Every 30min
GATEWAY
The energy generation of the last time interval that has occurred.
ENERGY_GENERATION_LAST_24H
Wh
Once a day
GATEWAY
The energy generated over the last 24 hours.
ENERGY_GENERATION_YESTERDAY
Wh
Once a day
GATEWAY
The energy generated on the previous calendar day.
ENERGY_IMPORT
Wh
Every 30min
BATTERY
The energy used to load a battery over the last 30 minutes at the time the event is created.
ENERGY_IMPORT_YESTERDAY
Wh
Once a day
BATTERY
The energy used to load a battery on the previous calendar day.
ENERGY_EXCESS
Wh
Every 30min
GATEWAY
The energy excess of the last time interval that has occurred.
ENERGY_EXPORT
Wh
Every 30min
BATTERY
The energy used from a battery over the last 30 minutes at the time the event is created.
ENERGY_EXPORT_YESTERDAY
Wh
Once a day
BATTERY
The energy used from a battery on the previous calendar day.
GRID_ENERGY_CONSUMPTION
Wh
Every 30min
GATEWAY
The energy consumption from the grid of the last time interval that has occurred.
GRID_ENERGY_CONSUMPTION_YESTERDAY
Wh
Once a day
GATEWAY
The energy consumption from the grid of the previous day.
GRID_POWER_CONSUMPTION
W
Every 30min
GATEWAY
The current power consumed from the grid at the time the event is created.
POWER_CONSUMPTION
W
Every 30min
ALL
The current power consumed at the time the event is created.
POWER_EXCESS
W
Every 30min
GATEWAY
The current power excess at the time the event is created.
POWER_GENERATION
W
Every 30min
GATEWAY
The current power generated at the time the event is created.
SELF_CONSUMPTION_RATE
%
Every 30min
GATEWAY
The current self-consumption rate in percent
SELF_CONSUMPTION_RATE_YESTERDAY
%
Once a day
GATEWAY
The self-consumption rate in percent on the previous calendar day.
SELF_SUFFICIENCY_RATE
%
Every 30min
GATEWAY
The current self sufficiency rate in percent.
SELF_SUFFICIENCY_RATE_YESTERDAY
%
Once a day
GATEWAY
The self sufficiency rate in percent on the previous calendar day.
STATE_OF_CHARGE_FORECAST_RATE
%
Once a day
CAR CAR_CHARGER
The target state of charge with the forecast time, when this should be reached.
STATE_OF_CHARGE_RATE
%
Each time the value changes
CAR
The target state of charge.
SWITCH_STATE
ID
Each time the value changes
SMART_PLUG CAR_CHARGER SWITCH
WATER_TEMPERATURE
°C
Every 30min
HEAT_PUMP WATER_HEATER
The current temperature of the water measured by the given device.
The Recommender Platform offers multiple context services. These context services generate additional events of state types which can be used within the Recommender Platform without the need to be provided by you. The current context events available on the Recommender Platform are the following.
DYNAMIC_TARIFF_LOWEST_PRICE_FORECAST_TOMORROW
currency
Once a day
MOOST
The lowest tariff price of the next day of a building with dynamic pricing. Remark: the currency and tariff plan for the next day has to be applied to the building data.
DYNAMIC_TARIFF_PRICE
currency
Every 30min
MOOST
The current tariff price of a building with dynamic pricing. Remark: the currency and tariff plan for the next day has to be applied to the building data.
DYNAMIC_TARIFF_PRICE_FORECAST_1H
currency
Every 30min
MOOST
The tariff price of next hour of a building with dynamic pricing.
ENERGY_BASE_CONSUMPTION
Wh
Once a day
MOOST
This value is calculated out of the energy consumption data of the last view days.
ENERGY_CONSUMPTION_FORECAST_1H
Wh
Every hour
MOOST
The expected energy consumption of a building in the next hour during 1h
ENERGY_CONSUMPTION_FORECAST_24H
Wh
Every hour
MOOST
The expected energy consumption of a building in the next hour during 1h.
ENERGY_GENERATION_FORECAST_1H
Wh
Every hour
MOOST
The expected energy generation of a building in the next hour.
ENERGY_GENERATION_FORECAST_24H
Wh
Every hour
MOOST
The expected energy generation of a building in the next hour during 1h.
EXPECTED_OUTSIDE_TEMPERATURE
°C
Once a day
MOOST
The expected outside temperature on the location of a given building for the next calendar day.
EXPECTED_OUTSIDE_TEMPERATURE_4DAYS
°C
Once a day
MOOST
The expected outside temperature on the location of a given building in 4 days.
GRID_ENERGY_CONSUMPTION_ANOMALY_SCORE
Score
Calculated for every incoming GRID_ENERGY_CONSUMPTION event
MOOST
A numerical value indicating the likelihood of an anomaly in grid energy consumption for a given building. This score is calculated using historical energy consumption data and patterns and ranges, with higher scores representing a greater probability of a consumption anomaly.
GRID_POWER_CONSUMPTION_ANOMALY_SCORE
Score
Calculated for every incoming GRID_POWER_CONSUMPTION event
MOOST
A numerical value indicating the likelihood of an anomaly in grid power consumption for a given building. This score is calculated using historical power consumption data and patterns and ranges, with higher scores representing a greater probability of a consumption anomaly.
POWER_CONSUMPTION_BASE_LOAD
W
Once a day
MOOST
The base consumption of the household. This value is calculated out of the power consumption data of the last view days.
POWER_CONSUMPTION_FORECAST_1H
W
Every hour
MOOST
The expected power consumption of a building in the next hour.
POWER_CONSUMPTION_FORECAST_24H
W
Every hour
MOOST
The expected power consumption of a building in 24 hours.
POWER_GENERATION_FORECAST_1H
W
Every hour
MOOST
The expected power generated in the next hour.
POWER_GENERATION_FORECAST_24H
W
Every hour
MOOST
The expected power generated in the next 24 hours.
POWER_GENERATION_FORECAST_48H
W
Every hour
MOOST
The expected power generated in the next 48 hours.
IS_LOW_TARIFF_HOURS
[0, 1]
Every 30min
MOOST
Is "1" if given building has currently low tariff. Remark: if building has dynamic pricing, then is is set to "1" if current price is in the lower 25% band.
IS_HIGH_TARIFF_HOURS
[0, 1]
Every 30min
MOOST
Is "1" if given building has currently high tariff. Remark: if building has dynamic pricing, then is is set to "1" if current price is in the upper 25% band.
Every event that occurs on a sensor or actor within a building can be seen as a . Every event sent to the Recommender Platform needs to describe for which type of state it is sent.
Below you can find a List of Customer Provided Typesthe Recommender Platform can receive from your environment.
The current charging mode of a device. See
The state of a device See
Connection state of a switch. See
How often should I send events to the platform server? Typically, you should send events whenever a significant state change occurs in the sensors. Avoid excessive event generation to prevent unnecessary processing and network overhead.
MOOST recommends an update for each sensor every 30 minutes.
Can I customize the recommendation algorithms used by the platform? Currently, the MOOST Recommender Platform provides a set of predefined algorithms. However, we are working on introducing customization options in future updates to allow Platform users to tailor the recommendation algorithms based on their specific needs.
How can I integrate the platform's recommendations into my application? The platform provides configuration options to receive recommendations via API or SDK.
A User Acceptance Test (UAT) is an instrument in Software Development which helps to ensure that a system or application meets the needs and expectations of its intended users.
In this section you can find a blueprint on how you can run a UAT with the MOOST Recommender Platform to test if the engagement of your users can be increased (and the churn rate reduced).
To observe an impact of a new system on your users behavior it will take some time. MOOST proposes to plan for a 8 week long UAT with 4 checkpoints every two weeks to check on how your KPI's have evolved.
By comparing the engagement and churn rate of the both groups an impact can be observed while seasonalities can be subtracted from the influence onto the users.
To determinate if the MOOST Recommender Platform has an impact on the behavior of your end users the best way is to compare a test user group to a control user group.
The test user group will receive recommendations from the MOOST Recommender Platform while the Control user group won't.
To be of statistical significance MOOST recommends to have a test and a control user group of at least each 600 users.
In contrast to the quantative approach also a qualitative approach can be selected. In this approach a test user group would be selected which receives the notifications from the MOOST Recommender Platform.
After each partial time frame a survey can be send to the test users to gather feedback of the impact and acceptance of the notifications sent by the MOOST Recommender Platform.
A survey for a qualitative test could have the following content.
If you want to test the notifications from the MOOST Recommender Platform with your users MOOST recommends that you send upfront a message e.g. via email that informs the users about the test and gives them the option to opt-in to the test user group.
Select notifications of specified building.
^[a-zA-Z0-9:._-]{1,100}$
If specified, then filter for notifications with specified status.
^[a-zA-Z0-9]{24}$
^[a-zA-Z0-9:._-]{1,100}$
^[a-zA-Z0-9:._-]{3,64}$
^.{1,100}$
No Content
^[a-zA-Z0-9:._-]{1,100}$
^[a-zA-Z0-9]{24}$
^[A-Z0-9 -]{3,10}$
^.{1,100}$
^[A-Z]{2}$
^[a-zA-Z0-9/_+-]{1,32}$
^[a-zA-Z0-9:._-]{1,100}$
^[a-zA-Z0-9]{24}$
^[A-Z0-9 -]{3,10}$
^.{1,100}$
^[A-Z]{2}$
^[a-zA-Z0-9/_+-]{1,32}$
Set devices of specified building.
^[a-zA-Z0-9:._-]{1,100}$
^[a-zA-Z0-9:._-]{3,64}$
^.{1,100}$
^.{1,100}$
^.{1,100}$
^.{0,1000}$
No Content