You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

90 lines
1.6 KiB

package mill
import (
"fmt"
lucifer3 "git.aiterp.net/lucifer3/server"
"git.aiterp.net/lucifer3/server/device"
"git.aiterp.net/lucifer3/server/events"
"strings"
)
type Bridge interface {
// SetBus to apply a bus that changes will be sent to
SetBus(bus *lucifer3.EventBus)
// SetState updates device state
SetState(id string, state device.State) bool
// Start triggers the event emitting part, including device discovery
Start()
// IsStarted returns true when it's running
IsStarted() bool
}
func MakeBridge(id, apiKey string) (Bridge, bool) {
parts := strings.Split(id, ":")
if len(parts) < 3 {
return nil, false
}
driver := parts[0]
version := parts[1]
target := parts[2]
if driver != "mill" {
return nil, false
}
id = fmt.Sprintf("%s:%s:%s", driver, version, target)
switch version {
case "2":
return &OnlineBridge{
ID: id,
Email: target,
Password: apiKey,
Gen2: true,
Gen3: false,
}, true
case "23":
return &OnlineBridge{
ID: id,
Email: target,
Password: apiKey,
Gen2: true,
Gen3: true,
}, true
case "3":
if strings.Contains(target, "@") {
return &OnlineBridge{
ID: id,
Email: target,
Password: apiKey,
Gen2: false,
Gen3: true,
}, true
} else {
return &WifiBridge{
ID: id,
IP: target,
}, true
}
}
return nil, false
}
func deviceFailed(id string, err any) events.DeviceFailed {
msg := "(no message)"
switch typed := err.(type) {
case string:
msg = typed
case error:
msg = typed.Error()
}
return events.DeviceFailed{
ID: id,
Error: msg,
}
}