Skip to main content


Instructions follow this pattern:

every <time period>
<function chain>
<function chain>;
<function chain>;
<function chain>;
<function chain>;

I've illustrated the then and until here with multiple function chains, but it's fine to only have one.

Every instruction needs a when clause, but you can leave out then if you have an until or vice versa. You should also leave out the every clause unless you are using time functions within the when part of your instruction.

Time Period

The parameter to every is a time period. It understands a range of type periods, including weeks, days, hours, minutes and seconds, and abbreviations of those measures, such as 3 mins or 2s.

These time periods and abbreviations are supported:

  • week, weeks, w, wk
  • day, days, d
  • hour, hours, h
  • minute, minutes, min, mins, m
  • second, seconds, sec, s


A function call looks like this:

object(type="airplane", capacity>50)

The function name is followed by brackets. Inside the brackets are the arguments for the function call. Arguments are separated by commas, and they can be simple values, or comparisons. Comparisons are expressed with a label followed by an operator, followed by a value. Allowed operators are =, <, >, !=, >=, <=.

Where you would write a simple value, you can instead write another function call.

object(type="sensor", value < object(type="dial").get("value"))

Bear in mind that functions return groups of things. In this case, object(type="dial").get("value") returns a group of all the value attributes of all the objects of type dial in the realm. Assuming these are numbers, when you use them in a comparison, they are implicitly averaged.

Functions operate on a group of values (called a context), they take arguments and comparisons, and they produce another context - often a filtered version of the one they received.

Function Chain

Since functions operate on a context and produce another context, this allows them to be chained:

    <initial context>.func1(...arguments).func2(...arguments).func3(...arguments)

For example:

    object(type="bike").near(10, type="danger")

There is often an implicit context at the beginning of a function chain. In a then clause, it's the set of items that are newly joining the group defined by the when function chain. For an until chain, it's the set of items newly leaving that group.


A context is a group of values. Currently, HiveScript supports the following kinds of groups:

  • Objects
  • Areas
  • Strings. Strings are comparable, so a set of strings has a minimum and a maximum value.
  • Numeric. A set of numbers, stored as 64 bit floats. Numbers are comparable, so a set of numbers has a minimum and a maximum value. They are also accumulable, so a Numeric set also has a total and a mean which is used in comparisons.
  • Pairs. A set of pairs of values.

Not all functions work with all kinds of contexts, check the function documentation if you are uncertain.


Hivescript supports comments starting with the # character and running until the end of the line.

# A really cool instruction
when # it does something
object(fred < 23) # involving
then # sending information
sendToUrl("") # to another server