Architecture components

Freedomotic is composed by a core framework and plugins .


The core part is a framework that:

1. implements a language independent messaging system based on Enterprise Integration Pattern. So you can develop in your favorite language and just exchange messages with the other software components. The aim of the messaging system is to link all software modules together in a flexible and abstract way, relating them using the concept of channels (publish-subscribe to different levels of a topics hierarchy)

2. maintains an internal data structure representing the environment (topology, rooms connections as a graph, ...), the things in zones and their state (on, off, open, closed, 50% dimmed, ...)

3. creates an abstraction layer so users and external software modules can use a high level logic like turn on kitchen light instead of send to COM1 port the string #*A01AON##. This way a developer can leverage other plugins features at a high logical level because the modules can see the same environment map as the user. All data components (environment, objects, triggers, commands) can be defined in XML and easily exchanged on the network between different nodes of the P2P Freedomotic network

4. provides a rules engine coupled with a natural language processing system to let the user write automations in plain English like if outside is dark turn on living-room light. You can add, update and delete this automations at runtime using any human computer interface like GUIs, or even speak them.

Freedomotic architecture

Freedomotic architecture


Freedomotic plugins create additional features to the core framework and can be developed and distributed as completely independent packages on the Freedomotic marketplace.

Device plugins

Device plugins are generally developed to communicate with automation hardware like X10, KNX and so on, but also can provide graphical frontends and “web service readers” as Freedomotic plugins just as any other source of info, like webcams, text to speech engines and SMS senders can also be used.

Object plugins

Developers can also create object plugins which are pieces of software that models the behavior of objects like lamps, doors, etc in order to instruct the framework on how these objects should behave.

For example, a lamp object plugin tells the framework that a lamp has a boolean behavior called powered and a dimmer behavior which is represented by an integer from 0 to 100. A lamp can turn on, turn off and dimm. If dimmer = 0% the lamp powered behavior is set to false and if dimmer > 0% powered becomes true.

Plugins, things and automations

Plugins, things and automations

Plugins, Objects and Automations interaction

The final goal is to define an automation which can turn on the living room light when it is tea time (17 o’Clock).

  1. The scheduler plugin notifies to Freedomotic the current time (17:00 PM).
  2. A trigger named “it’s tea time” is configured to listen to all time based events. It carries a rule inside which is event.time.hour == 17 AND event.time.minute == 0.
  3. When the event is received by this trigger, the rule is evaluated. If the evaluation is successful then the trigger fires, indicating that now it is not time to for tea.

#. At this point all the corresponding automation IF (trigger: it's tea time) THEN (command: turn on livingroom light) is loaded by the system and the command is executed which forwards the generic request turn on living room light to the plugin which can transform it to a protocol dependent command (eg: send string A01AON on serial port /dev/ttyUSB0).

Events, triggers, commands and automations

Events, triggers, commands and automations