This commit is contained in:
@@ -76,9 +76,10 @@ func (b *Bridge) Refresh(ctx context.Context) error {
|
||||
|
||||
if state == nil {
|
||||
state = &hueSensorState{
|
||||
index: index,
|
||||
uniqueID: sensor.UniqueID,
|
||||
externalID: -1,
|
||||
index: index,
|
||||
uniqueID: sensor.UniqueID,
|
||||
externalID: -1,
|
||||
presenceCooldown: -2,
|
||||
}
|
||||
|
||||
b.sensorStates = append(b.sensorStates, state)
|
||||
|
||||
@@ -92,7 +92,7 @@ type hueSensorState struct {
|
||||
uniqueID string
|
||||
prevData *SensorData
|
||||
prevTime time.Time
|
||||
presenceCooldown bool
|
||||
presenceCooldown int
|
||||
}
|
||||
|
||||
func (state *hueSensorState) Update(newData SensorData) *models.Event {
|
||||
@@ -153,26 +153,36 @@ func (state *hueSensorState) Update(newData SensorData) *models.Event {
|
||||
case "ZLLPresence":
|
||||
{
|
||||
if state.prevData != nil && state.prevData.State.Presence != newData.State.Presence {
|
||||
name := models.ENSensorPresenceStarted
|
||||
if !newData.State.Presence {
|
||||
name = models.ENSensorPresenceEnding
|
||||
state.presenceCooldown = true
|
||||
}
|
||||
if newData.State.Presence {
|
||||
state.presenceCooldown = -1
|
||||
|
||||
return &models.Event{
|
||||
Name: name,
|
||||
Payload: map[string]string{
|
||||
"deviceId": strconv.Itoa(state.externalID),
|
||||
"deviceInternalId": newData.UniqueID,
|
||||
},
|
||||
return &models.Event{
|
||||
Name: models.ENSensorPresenceStarted,
|
||||
Payload: map[string]string{
|
||||
"deviceId": strconv.Itoa(state.externalID),
|
||||
"deviceInternalId": newData.UniqueID,
|
||||
},
|
||||
}
|
||||
} else {
|
||||
state.presenceCooldown = 0
|
||||
}
|
||||
} else if state.presenceCooldown && !newData.State.Presence && time.Since(stateTime) > time.Minute {
|
||||
state.presenceCooldown = false
|
||||
}
|
||||
|
||||
if state.presenceCooldown == -2 {
|
||||
state.presenceCooldown = int(time.Since(stateTime) / time.Minute)
|
||||
}
|
||||
|
||||
nextEventWait := time.Minute * time.Duration(state.presenceCooldown)
|
||||
if state.presenceCooldown != -1 && !newData.State.Presence && time.Since(stateTime) > nextEventWait {
|
||||
state.presenceCooldown += 1
|
||||
|
||||
return &models.Event{
|
||||
Name: models.ENSensorPresenceEnded,
|
||||
Payload: map[string]string{
|
||||
"deviceId": strconv.Itoa(state.externalID),
|
||||
"deviceInternalId": newData.UniqueID,
|
||||
"minutesElapsed": strconv.Itoa(state.presenceCooldown - 1),
|
||||
"secondsElapsed": strconv.Itoa((state.presenceCooldown - 1) * 60),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user