Skip to main content

Eventos

Tipos de Eventos

O Hermes utiliza um sistema de eventos assíncronos para reagir a mudanças de estado dos sensores e dispositivos. Todos os eventos são acessados através do objeto global EventBus.

Eventos Disponíveis

EventBus.EventType.SENSOR_MEASUREMENT

Disparado quando um sensor realiza uma nova leitura.

Estrutura do evento:

{
type = integer, -- Tipo do evento
sourceId = integer, -- ID do sensor que gerou o evento
value = integer, -- Valor atual da leitura
previousValue = integer, -- Valor anterior da leitura
timestamp = integer -- Timestamp em microssegundos
}

Exemplo de uso:

-- Monitora todas as leituras do sensor 1
EventBus.subscribe(EventBus.EventType.SENSOR_MEASUREMENT, 1, function(event)
Log.info(string.format("Sensor %d: %d → %d",
event.sourceId,
event.previousValue,
event.value))
end)

EventBus.EventType.DEVICE_STATE_CHANGE

Disparado quando um dispositivo altera seu estado.

Estrutura do evento:

{
type = integer, -- Tipo do evento
sourceId = integer, -- ID do dispositivo que mudou de estado
value = integer, -- Novo estado (0/1 para ON_OFF, 0-100 para PWM, etc)
previousValue = integer, -- Estado anterior
timestamp = integer -- Timestamp em microssegundos
}

Exemplo de uso:

-- Monitora mudanças de estado de todos os dispositivos
EventBus.subscribe(EventBus.EventType.DEVICE_STATE_CHANGE, function(event)
if event.value == 1 then
Log.success(string.format("Device %d LIGADO", event.sourceId))
else
Log.info(string.format("Device %d DESLIGADO", event.sourceId))
end
end)

Formas de Inscrição

Monitorar todos os eventos de um tipo

-- Recebe eventos de TODOS os sensores
EventBus.subscribe(EventBus.EventType.SENSOR_MEASUREMENT, function(event)
print("Algum sensor mediu:", event.value)
end)

Monitorar eventos de um dispositivo/sensor específico

-- Recebe eventos APENAS do sensor com ID 0
EventBus.subscribe(EventBus.EventType.SENSOR_MEASUREMENT, 0, function(event)
print("Sensor 0 mediu:", event.value)
end)

Campos Comuns a Todos os Eventos

CampoTipoDescrição
typeintegerTipo do evento (SENSOR_MEASUREMENT ou DEVICE_STATE_CHANGE)
sourceIdintegerID da origem do evento (sensor ou device)
valueintegerValor atual
previousValueintegerValor anterior
timestampintegerTimestamp em microssegundos desde o boot

Exemplos Práticos

Controlar ventilador baseado em temperatura

EventBus.subscribe(EventBus.EventType.SENSOR_MEASUREMENT, 2, function(event)
local fan = Device.get(1)
local temp = event.value / 10 -- Temperatura em °C × 10

if temp > 30 then
fan:setState(100) -- Velocidade máxima
Log.warn("Temperatura alta: ventilador em 100%")
elseif temp > 25 then
fan:setState(50) -- Velocidade média
else
fan:setState(0) -- Desligado
end
end)

Sincronizar sensor com estado de bomba

EventBus.subscribe(EventBus.EventType.DEVICE_STATE_CHANGE, 0, function(event)
local sensor = Sensor.get(0)

if event.value == 1 then
sensor:resume()
sensor:resetTimer()
else
sensor:pause()
end
end)
Dica

Use event.timestamp para calcular intervalos de tempo entre eventos ou detectar mudanças muito rápidas.