Protocol

The ability to exchange information and commands seamlessly is made possible through the Hivemind Protocol.

Now, let's explore the different message types introduced by the Hivemind Protocol.

Payload Messages

Payload messages contain a OpenVoiceOS Message object, serving as a container for information or commands.

Bus Message

The BUS message facilitates single-hop communication, flowing between slaves and masters. When a master receives a BUS message, it examines its global whitelist/blacklist and slave permissions. If the slave is authorized to inject the message into the ovos-core message bus, the message is injected accordingly. Subsequently, any direct responses from the master's ovos-core, triggered by the injected message, are forwarded back to the originating slave. The permissions can be defined based on criteria such as message type, intent type, skill ID, access key, and IP address rules.

Terminal applications such as the voice-sat usually inject natural language queries from users, others applications such as the Home Assistant integration may inject other messages if authorized to do so

you can authorize message_types via the hivemind-core package

Reference BUS payloads for OVOS can be found here

$hivemind-core allow-msg "speak"

the hivemind-websocket-client package provides an utility to connect to a Mind and send a bus message

$ hivemind-client send-mycroft --help
Usage: hivemind-client send-mycroft [OPTIONS]

  send a single mycroft message

Options:
  --key TEXT       HiveMind access key (default read from identity file)
  --password TEXT  HiveMind password (default read from identity file)
  --host TEXT      HiveMind host (default read from identity file)
  --port INTEGER   HiveMind port number (default: 5678)
  --siteid TEXT    location identifier for message.context  (default read from
                   identity file)
  --msg TEXT       ovos message type to inject
  --payload TEXT   ovos message.data json
  --help           Show this message and exit.

Shared Bus Message

The SHARED_BUS message is designed for single-hop communication, exclusively flowing from slave to master. In this scenario, the master passively monitors the ovos-core message bus on the slave device. It is important to note that the SHARED_BUS functionality needs to be explicitly enabled in the slave device configuration, as the default behavior does not involve sharing the ovos-core bus. In the case of terminals, messages of type BUS are injected into their respective masters and are simultaneously forwarded as SHARED_BUS messages to the subsequent masters in the hierarchy.

NOTE: this is usually done by HiveMind Skill if enabled in settings

Transport Messages

Transport messages contain another HiveMessage object as their payload.

NOTE: these message types only matter for Nested Hives

Broadcast Message

The BROADCAST message plays a crucial role in multi-hop communication, flowing from a master to its associated slaves. It serves as a means to disseminate a message to all slaves connected to a particular master, effectively "sending the message down" the authority chain. Through the use of broadcast messages, information or commands can be efficiently transmitted throughout the hive, facilitating widespread collaboration.

A Mind may decide to broadcast a message at any time

A broadcast message may also contain a "target_site_id"

When a slave receives a broadcast message it will check if it's own "site_id" matches the "target_site_id", and if it does, the BUS message is injected into the slave internal bus

This allows for example a Mind to make all the satellites in site_id: "kitchen" speak a message out loud

Escalate Message

The ESCALATE message is an essential multi-hop message that travels from a slave to its master. It enables the slave to send a message up the authority chain, ensuring that the message reaches higher-level minds within the hierarchy. By employing escalate messages, valuable information or commands can be elevated, allowing for higher-level decision-making within the hive.

the hivemind-websocket-client package provides an utility to connect to a Mind and escalate a message

$ hivemind-client escalate --help
Usage: hivemind-client escalate [OPTIONS]

  escalate a single mycroft message

Options:
  --key TEXT       HiveMind access key (default read from identity file)
  --password TEXT  HiveMind password (default read from identity file)
  --host TEXT      HiveMind host (default read from identity file)
  --port INTEGER   HiveMind port number (default: 5678)
  --siteid TEXT    location identifier for message.context  (default read from
                   identity file)
  --msg TEXT       ovos message type to inject
  --payload TEXT   ovos message.data json
  --help           Show this message and exit.

Propagate Message

The PROPAGATE message is a versatile multi-hop message that flows both from a master to its slaves and vice versa. This message type enables a master to send a message to all its direct connections, ensuring that the message reaches every relevant node within the hive. Propagate messages are instrumental in disseminating critical information or commands throughout the network, enabling comprehensive collaboration and coordination.

the hivemind-websocket-client package provides an utility to connect to a Mind and propagate a message

$ hivemind-client propagate --help
Usage: hivemind-client propagate [OPTIONS]

  propagate a single mycroft message

Options:
  --key TEXT       HiveMind access key (default read from identity file)
  --password TEXT  HiveMind password (default read from identity file)
  --host TEXT      HiveMind host (default read from identity file)
  --port INTEGER   HiveMind port number (default: 5678)
  --siteid TEXT    location identifier for message.context  (default read from
                   identity file)
  --msg TEXT       ovos message type to inject
  --payload TEXT   ovos message.data json
  --help           Show this message and exit.

Protocol Versions

Protocol Version 0 1
json serialization yes yes
binary serialization no yes
pre-shared AES key yes yes
password handshake no yes
PGP handshake no yes
zlib compression no yes

some clients such as HiveMind-Js do not yet support protocol V1