<style>
.reveal {
font-size: 32px;
}
</style>
### <span style="color: dodgerblue">μSCENE</span>
#### uma abordagem orientada a microserviços para desenvolvimento de aplicações de IoT sensíveis a situações
<span style="float:right;font-size:0.5em">`Isaac Pereira`</span>
---
### Agenda
* Contextualização e Objetivos
* **SCENE** Toolkit
* Plataforma μ**SCENE**
* Estudo de Caso (Medicine Quality Control)
* Considerações Finais
---
### Computação Pervasiva (*Ubiquitous computing*)
> **"** the age of calm technology, when technology recedes into the background of our lives
<span style="float:right;font-size:0.5em">`Mark Weiser`</span>
----
#### Internet of Things (<span style="color: dodgerblue">IoT</span>)
* **50 bilhões** de dispositivos conectados em 2020
* Mercado de **$11 trilhões** de dólares (até 2025)
* Adoção de plataformas de nuvem IoT (`Azure IoT Hub`, `Google IoT Cloud`, `AWS IoT`, ...)
----
#### Internet of Things <span style="color: dodgerblue">**+**</span> *Context-Awareness* = :muscle:
Suporte à **context-awareness**...
:globe_with_meridians: Pouco explorada em soluções ou plataformas de IoT mercado
:wrench: Falta de ferramentas como *frameworks*, *toolkits*, etc.
----
#### Objetivos
:dart: Fornecer ferramentas que suportem o desenvolvimento de aplicações IoT sob a ótica da sensibilidade ao contexto
:dart: Facilitar a adoção de abordagens *context-awareness* em soluções IoT existentes
----
#### Evolução e contribuições em trabalhos da área
* SiNOS - Situation Notification Service (`Carol Rizzi`)
* SMaaS - Situation Management (`Higor Borjaille`)
* Um framework de apoio ao des. de aplicações sensíveis a situações (`Bernardo Sunderhus`)
* LAURA architecture: Towards a simpler way of building situation-aware IoT applications (`Sergio Teixeira`)
---
### SCENE - *Situation-awareness* Toolkit :hammer_and_wrench:
Toolkit para gerenciamento de situações orientado à regras em **Drools**
----
#### Situações
> “um estado particular de interesse para aplicações cujos seus constituintes podem ser uma combinação de entidades e de suas condições contextuais.
<span style="float:right;font-size:0.5em">`DOCKHORN (2007)`</span>
----
### Situações em SCENE
*Situation types (templates)* vs. *Situation instances*
<img src="https://i.imgur.com/O2tZulQ.png" style="border: none;background: none;box-shadow:none" height="300">
----
### Características do uso do SCENE
* Especificação *situation-types* em tempo de design
* *Situation-types* usam entidades do domínio e outras *situation-types* como *building-blocks*
* *Situation instances* possuem ***propriedades temporais***
* *runtime* avalia *situation-types* e gerencia ciclo de vida das instâncias.
----
### SCENE-DRL
> **Extensão da DRL com *bindings* específicos para lidar com:**
- [ ] Definições de *situation-types*
- [ ] Identificação de *participantes* e *unificadores*.
- [ ] Regras de situação
----
### SCENE-DRL
```java=
declare Fever extends Situation
febrile: Person @part @key
end
rule "Fever"
@role(situation)
@snapshot(on)
when
$febrile: Person(temperature > 37)
then
SituationHelper.situationDetected(drools, Fever.class)
end
```
----
### *Bindings* e *decorators* do SCENE-DRL
* `role`
* `part` | `key`
* `snapshot`
* `restore` `(first | last | stable)`
----
#### Operações temporais entre situações
<img src="https://i.imgur.com/w2wsWCd.png" style="border: none;background: none;box-shadow:none" height="300">
----
### Composição de situações por operadores temporais
```java=
declare IntermittentFever extends Situation
febrile: Person @part @key
end
rule "IntermittentFever"
@role(situation)
@snapshot(on)
when
$pastFever: Fever($febrile: febrile, !active)
$current: Fever(this.febrile == febrile,
this after[1h,2d] $pastFever, active)
then
SituationHelper.situationDetected(drools, Fever.class)
end
```
----
#### Arquitetura do Toolkit
* ~~Drools Situation Model~~ :arrow_right: ***situation-model* (0.10.2)**
* ~~Drools Situation Helper~~ :arrow_right: ***scene-core* (0.10.7)**
<img src="https://i.imgur.com/LTymO88.png" style="border: none;background: none;box-shadow:none" height="300">
----
#### Situation Model
<span style="font-size:0.5em">Provido como um biblioteca Java independente do Drools</span>

----
#### SCENE Core
O toolkit fornece um *KieModule* pré-configurando as dependências para tornar o processamento de situações possível.
<img src="https://i.imgur.com/YALYM1O.png" style="border: none;background: none;box-shadow:none" height="300">
*Drools Situation Layer* :arrow_right: **SceneKieModule**
----
#### Gerenciamento de Ciclo de Vida de Situações
```java=
rule "SituationActivation"
when
$act: OngoingSituation(
situation == null,
$type: type,
$castset: castset,
$timestamp: timestamp)
then
SituationHelper.activateSituation(
drools,
$castset,
$type,
$timestamp));
end
```
----
#### Gerenciamento de Ciclo de Vida de Situações
```java=
rule "SituationDeactivation"
when
$sit: Situation(active==true)
not(exists OngoingSituation(situation == $sit))
then
SituationHelper
.deactivateSituation(drools, (Object) $sit);
end
end
```
---
### Plataforma μSCENE
> Modelo de PaaS para desenvolvimento, execução e gerenciamento de aplicações *Situation-aware* (**SIaaS**).
*IoT* + *Situation-Awareness*
----
<img src="https://i.imgur.com/T67BsDm.png" style="border: none;background: none;box-shadow:none" height="300">
----
<img src="https://i.imgur.com/XSw09xR.png" style="border: none;background: none;box-shadow:none" height="400">
Uma aplicação *μSCENE* necessita gerenciar recursos em todos os níveis da plataforma
(IoT :arrow_right: Contexto :arrow_right: Situação )
----
### Desenvolvedores de soluções IoT podem...
* Registrar e habilitar dispositivos à rede de coleta e armazenamento da aplicação (MQTT, HTTP, COAP)
* Definir características de hardware e de grandezas observadas (QoS, métricas, amostragem).
* Instanciar, classificar e relacionar entidades e contextos (*context binding*)
* Definir tipos ou templates de situação em SCENE-DRL para inferência de situações.
* SIaaS para consumidores de eventos de situação (pub/sub)
----
### Princípios Arquiteturais
* Modularizável (:building_construction:)
* Orientado à mensagem (:email:)
* Adaptável e não-opinativo ( :electric_plug: )
----
<img src="https://i.imgur.com/ktjWREP.png" style="border: none;background: none;box-shadow:none" height="600">
----
<img src="https://i.imgur.com/GpSDDvE.png" style="border: none;background: none;box-shadow:none" height="600">
----
#### Modelo de Referência de Domínio (:world_map:)
<img src="https://i.imgur.com/VbqoMZg.png" style="border: none;background: none;box-shadow:none" height="620">
----
#### Event Bus :lightning:
<img src="https://i.imgur.com/XjWKDPv.png" style="border: none;background: none;box-shadow:none" height="200">
```javascript=
topic: /devices/sense346112/props/temperature/observations
type: observation
{
"timestamp": 11245362311,
"values": {
"temperature": 24
},
"metadata": {
"unit": "celsius"
}
}
```
----
#### IoT Broker :satellite_antenna:
* Provisionamento, coleta e agregação de dados originados de *sensingDevices*
```javascript=
POST /sensingDevices (registro de um SensingDevice em operação)
{
"id": "sense346112",
"descriptor": "mote@freezer"
"metadata": {
"location": "roomA",
"model": "esp32"
},
"props": {
"temperature": {
"metadata": {
"type": "sensor",
"model": "ds1880",
"precision": 0.1,
"unit": "celsius"
}
}
}
}
```
----
#### Context Manager
* Racionalização dos eventos de baixo-nível. ("entitificação")
* Criação de entidades, contextos, relações contextuais e o provisionamento desses elementos como serviço.
* Permite *context-binding* baseado em fluxo de eventos (do nível de IoT) do barramento
```javascript=
# criação de um contexto com binding
# para observations de um sensingDevice
POST /entities/5eb4c685665a75ec7d90826e/contexts
{
"kind": "temperature",
"label": "temp",
"bind": {
"from": "/devices/sense346112/props/temperature",
"map": "(x) -> x"
}
}
```
----
#### Situation Inference Manager
* Gerencia instância da SCENE runtime (1 engine dedicada por solução )
* Consome *streams* de dados contextuais e roteia para o nó SCENE correto
* publica notificações de eventos de detecção para o *event bus*
<img src="https://i.imgur.com/bvSshuF.png" style="border: none;background: none;box-shadow:none" height="250">
----
#### Regras de situação em aplicações μSCENE
```java=
declare 'Fever' extends Situation
febrile: Entity @part @key
temperature: IntrinsicContext @part
end
rule 'Fever'
@role(situation)
when
temperature: IntrinsicContext(
kind=="temperature",
value!.entries["current"].asNumber > 37.0
)
febrile: Entity(kind=="person") from temperature.bearer
then
SituationHelper.situationDetected(drools);
end
```
----
#### Situation Pub/Sub
* Notificação de eventos situacionais originados no motor de inferência de situação.
* API de assinatura de eventos
```json
Evento de ativicação de situação de febre:
{
"type" : "ACTIVATION",
"timestamp" : 1541978996090,
"situation" : {
"id" : 1,
"type" : "scene.Fever",
"active" : true,
"started" : 1541978996090,
"participations" : {
"febrile" : {
"id" : 1,
"kind" : "Person",
"descriptor" : "Dr. Mary Sue",
"attributes" : {
"age" : 35.0
},
"contexts" : {
"Temperature" : {
"type" : "intrinsic",
"id" : 1,
"descriptor" : "Dr. Mary Sue's temperature",
"kind" : "Temperature",
"value" : {
"timestamp" : 1541066766,
"entries" : {
"value" : 39.0
}
},
"bearer" : 1
}
}
}
}
}
}
```
---
### Estudo de Caso
Medicine Quality Control
----
> Uma clínica que mantém um estoque de produtos dermatologicos sensíveis as condições de ambiente (e.g. botox) precisa de ações de contingência para evitar perdas de produto.
----
> Uma solução de monitoramento e alertas foi proposta para mitigar o problema
----
#### Solução MQC
* O estoque é mantido em **freezers monitorados** por sensores de temperatura
* Os **profissionais da clínica são responsáveis** por atender problemas quando requisitados
* Eles devem se registrar através do **aplicativo mobile** da solução como "vigias" dos estoques
* Quando algum risco é detectado **"vigias" ativos são alertados** para tomarem medidas e protegerem os produtos em risco
----
#### Modelo conceitual do cenário
<img src="https://i.imgur.com/tBNeIiq.png" style="border: none;background: none;box-shadow:none" height="600">
----
### Instanciação do Cenário MQC em
----
Criar profissional/vigilante de lotes de produtos
```json=
POST /entities
{
"kind": "user",
"descriptor": "Dr. Mary Sue",
"attributes": {
"username": "mary",
"email": "marysue@laura.com",
"role": "Doctor"
}
}
```
----
Associar leitura do termostato ao contexto temperatura do freezer da clínica
```json=
POST /entities/5eb4c685665a75ec7d90826e/contexts
{
"kind": "temperature",
"label": "temp",
"bind": {
"from": "/devices/iotFreezer0211/props/temperature",
"map": "(x) -> x"
}
}
```
----
Ativar a vigilância de usuários para lote de produto
```json=
POST /relations
{
"kind": "watch",
"label": "watch",
"parts": {
"observer": "user/5eb4bffe2a95c0dc827f1680",
"observed": "product/5eb4c0546130af7ea1378a5c"
}
}
```
----
#### Definir situações de interesse
----
AbsentTemperatureReading
```java=
declare 'AbsentTemperatureReading' extends Situation
container: Entity @part @key
end
rule 'AbsentTemperatureReading'
@role(situation)
@type(AbsentSensorReading)
when
temperature: IntrinsicContext(kind=="temperature")
container: Entity(kind=="container") from temperature.bearer
not (ContextData(source == temperature)
over window:time( 1m30s ))
then
SituationHelper.situationDetected(drools);
end
```
----
ETAGreaterThanETT
```java=
declare ETAGreaterThanETT extends Situation
person: Entity @part @key
container: Entity @part @key
product: Entity @part @key
eta: Context @part @key
ett: Context @part @key
end
rule ETAGreaterThanETT
@role(situation)
@type(ETAGreaterThanETT)
when
RelationalContext(
kind=="watch",
person: parts["observer"],
product: parts["observed"])
ttt: RelationalContext(
kind=="EstimatedTimeToThreshold",
product == parts["product"],
container: parts["container"])
eta: RelationalContext(
kind == "EstimatedTimeOfArrival",
container == parts["container"],
person == parts["person"],
value!.entries["eta"] != null,
ttt.value!.entries["ett"] != null,
value!.entries["eta"].asNumber > ttt.value!.entries["ett"].asNumber)
not ExceedingThreshold(active, this.product == product)
then
SituationHelper.situationDetected(drools);
end
```
----
#### Avaliação Empírica
* Uma avaliação empírica da arquitetura LAURA (`Teixeira, 2018`) foi aplicada
* 30 participantes avaliaram a facilidade de uso em descrever situações em SCENE-DRL
</br>
</br>
| Factor | Avg. | SD |
|------------------|------|------|
| Ease-of-Use | 4.33 | 0.62 |
| Usefulness | 4.73 | 0.46 |
| Intention of use | 4.47 | 0.64 |
---
### Considerações
* O trabalho fornece um toolkit para gerenciamento de situações baseadas em regras maduro (*battle-tested*)
* A plataforma μSCENE se beneficia do SCENE toolkit em seu núcleo e oferece facilidades para o desenvolvimento de aplicações *situation-awareness* na nuvem.
* Algumas características de modelos PaaS podem ser adotadas para amadurecimento da plataforma
---
### Obrigado! :wave:
{"metaMigratedAt":"2023-06-15T08:18:48.208Z","metaMigratedFrom":"YAML","title":"μSCENE uma abordagem orientada amicroserviços para desenvolvimento deaplicações de IoT sensíveis a situações","breaks":true,"description":"Apresentação da defesa de mestrado","slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"f68e4433-ed93-4564-a6f2-82501df0c6ce\",\"add\":25622,\"del\":11139}]"}