Sistema di messaggistica

Freedomotic adotta un sistema di messaggistica costituito da un MOM (Message Oriented Middleware) che utilizza il protocollo AMQP (Advanced Message Queuing Protocol) per la gestione degli eventi provenienti dai sensori ambientali e l’invio di comandi agli attuatori che a loro volta li inoltrano ai dispositivi hardware in grado di eseguirli.
Freedomotic é basato interamente su eventi ed ogni cambiamento nell’ambiente o interazione con il software da parte degli utenti (es. click sull’interfaccia grafica) genera un evento.
Questi ultimi sono pubblicati sui Channels e intercettati dai Triggers.
Ciascun trigger può essere associato ad uno o più comandi definendo una Reaction.
Tutto ciò consente al programma di modificare dinamicamente il proprio comportamento rendendolo estremamente flessibile ed adattabile ad ogni possibile utilizzo nell’ambito dell’automazione.
Un sensore comunica qualsiasi cambiamento nell’ambiente notificando un evento su uno specifico canale (channel).
Un trigger é a tutti gli effetti un filtro di eventi in ascolto su uno specifico canale. Se un evento é consistente con il trigger, uno o più comandi possono essere inviati all’attuatore in grado di eseguirli.

Riepilogando:

  • un sensore può essere un dispositivo hardware come un sensore di luminosità
  • un evento é notificato da un sensore, ad esempio “luminosità nella cucina pari al 30%”
  • un trigger può definire espressioni del tipo “if luminosity is less than 50%” (“se la luminosità é minore del 50%”)
  • un comando può essere qualcosa del tipo “turn on the light in the kitchen” (“accendi la luce nella cucina”)
  • un attuatore può essere un modulo X10 o qualsiasi altro dispositivo controllabile

Il risultato dell’interazione tra eventi, trigger e comandi é una reaction (automazione). Nel nostro esempio la reaction é “if luminosity is less than 50% turn on the light in the kitchen” (“se la luminosità é minore del 50% accendi la luce nella cucina”).

Nota: trigger e comandi sono definiti dall’utente utilizzando l’EventEditor grafico e salvati in formato XML così come le reaction.

Il percorso di un messaggio

Il processo di comunicazione, dalla notifica di un evento all’esecuzione di un comando, prevede una serie di passi: Evento (notificata dai plugin o dallo stesso Freedomotic) -> Trigger (filtro di eventi) -> Comando (eseguito da un attuatore).

In questo esempio analizzeremo una Reaction costituita da un singolo comando:

If 'Livingroom light turns on or off' then 'say its status using text to speech' 

Si tratta di un evento che descrive il cambiamento di stato di una luce da OFF (powered=false) a ON (powered=true). Questo tipo di eventi é notificato sul canale  app.event.sensor.object.behavior.change da un plugin sensore, come ad esempio un sensore X10.

Nello specifico l’evento informa tutti i processi in ascolto (listener) che un oggetto denominato  “Livingroom Light” é cambiato.

<it.freedomotic.events.ObjectHasChangedBehavior>
 <eventName>ObjectHasChangedBehavior</eventName>
 <sender>Light</sender>
 <payload>
 <payload>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>date.dayname</attribute>
 <operand>EQUALS</operand>
 <value>Sunday</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>date.day</attribute>
 <operand>EQUALS</operand>
 <value>23</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>date.month</attribute>
 <operand>EQUALS</operand>
 <value>September</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>date.year</attribute>
 <operand>EQUALS</operand>
 <value>2012</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>time.hour</attribute>
 <operand>EQUALS</operand>
 <value>9</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>time.minute</attribute>
 <operand>EQUALS</operand>
 <value>45</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>time.second</attribute>
 <operand>EQUALS</operand>
 <value>49</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>sender</attribute>
 <operand>EQUALS</operand>
 <value>Light</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>object.name</attribute>
 <operand>EQUALS</operand>
 <value>Livingroom Light</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>powered</attribute>
 <operand>EQUALS</operand>
 <value>true</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>brightness</attribute>
 <operand>EQUALS</operand>
 <value>0</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>object.currentRepresentation</attribute>
 <operand>EQUALS</operand>
 <value>0</value>
 </it.freedomotic.reactions.Statement>
 </payload>
 </payload>
 <isValid>true</isValid>
 <uid>116</uid>
 <executed>true</executed>
 <isExecutable>true</isExecutable>
 <creation>1348386349837</creation>
 <priority>0</priority>
 </it.freedomotic.events.ObjectHasChangedBehavior>

E’ possibile definire trigger più complessi impostando una lista di condizioni (statement) da soddisfare. Di fatto un trigger costituisce la parte “when/if” di un’automazione (scenario).

All’avvio Freedomotic prevede una serie di trigger predefiniti in grado di coprire i casi d’uso più comuni. In qualsiasi momento é possibile aggiungerne altri partendo da quelli esistenti come modello (template) di base.

<trigger>
 <name>Livingroom Light turns ON or OFF</name>
 <channel>app.event.sensor.object.behavior.change</channel>
 <payload>
 <payload>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>object.name</attribute>
 <!-- allowed operand are EQUALS, REGEX, GREATER_THEN, GREATER_EQUAL_THEN, LESS_THEN, LESS_EQUAL_THEN -->
 <operand>EQUALS</operand>
 <value>Livingroom Light</value>
 </it.freedomotic.reactions.Statement>
 <it.freedomotic.reactions.Statement>
 <logical>AND</logical>
 <attribute>powered</attribute>
 <operand>EQUALS</operand>
 <!-- here you can write true to select only 'turns on' cases -->
 <!-- here you can write false to select only 'turns off' cases -->
 <!-- ANY is used to match any case -->
 <value>ANY</value>
 </it.freedomotic.reactions.Statement>
 </payload>
 </payload>
 </trigger>

Nell’automazione il trigger é associato ad uno o più comandi. Nel nostro esempio l’automazione é “when Livingroom Light turns on then Say electric device status”.

Il comando “Say electric device status” é gestito dal plugin text-to-speech  (http://freedomotic.com/content/plugins/text-speech) ed ha la seguente struttura:

<it.freedomotic.reactions.Command>
 <name>Say electric device status</name>
 <description>say electric device status</description>
 <receiver>app.actuators.media.tts.in</receiver>
 <properties>
 <properties>
 <property name="say" value="=
 if (@current.object.powered)
    say="@current.object.name is on with brightness at @current.object.brightness";
 else
    say="@current.object.name is off";
 "/>
 </properties>
 <tuples/>
 </properties>
 </it.freedomotic.reactions.Command>

Nel momento in cui un trigger “scatta” Freedomotic carica tutti i relativi comandi e li valuta utilizzando le proprietà disponibili a runtime.

Ogni plugin é in grado di accedere ad informazioni temporali (data e ora), alle proprietà specificate nell’evento e allo stato corrente dell’oggetto (se previsto). Tali informazioni possono essere gestite attraverso token substitution e linguaggio di scripting. Ad esempio nel seguente comando la proprietà ‘say’ é “valutata” da Freedomotic prima che lo stesso sia inviato al plugin. Questo significa che il suo valore non é predeterminato ma modificabile a runtime garantendo la massima flessibilità possibile.

<it.freedomotic.reactions.Command>
 <name>Say electric device status [EVALUATED]</name>
 <description>say electric device status</description>
 <receiver>app.actuators.media.tts.in</receiver>
 <properties>
 <properties>
 <!-- Static properties for the text to speech actuator. -->
 <!-- This are defined in data/cmd folder of the actuator itself -->
 <!-- The 'say' property is evaluated using runtime properties -->
 <property name="say" value="Livingroom Light is off."/>
 <!-- ALL PROPERTIES BELOW ARE EVALUATED AT RUNTIME -->
 <!-- generic data taken from the event which started the event-trigger-command chain. -->
 <property name="event.sender" value="Light"/>
 <property name="event.date.dayname" value="Sunday"/>
 <property name="event.date.day" value="23"/>
 <property name="event.date.month" value="September"/>
 <property name="event.date.year" value="2012"/>
 <property name="event.time.hour" value="10"/>
 <property name="event.time.minute" value="30"/>
 <property name="event.time.second" value="24"/>
 <!-- the state of the object Livingroon Light when the event was fired -->
 <property name="event.object.name" value="Livingroom Light"/>
 <property name="event.brightness" value="0"/>
 <property name="event.powered" value="false"/>
 <property name="event.object.currentRepresentation" value="0"/>
 <!-- the current state of the object Livingroom Light (when this command is executed -->
 <property name="current.object.name" value="Livingroom Light"/>
 <property name="current.object.type" value="EnvObject.ElectricDevice.Light"/>
 <property name="current.object.protocol" value="unknown"/>
 <property name="current.object.address" value="unknown"/>
 <property name="current.object.brightness" value="0"/>
 <property name="current.object.powered" value="false"/>
 </properties>
 </properties>
 </it.freedomotic.reactions.Command>

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi