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
| Campo | Tipo | Descrição |
|---|---|---|
type | integer | Tipo do evento (SENSOR_MEASUREMENT ou DEVICE_STATE_CHANGE) |
sourceId | integer | ID da origem do evento (sensor ou device) |
value | integer | Valor atual |
previousValue | integer | Valor anterior |
timestamp | integer | Timestamp 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.