func (c *HomeCloud) PostConstruct() error { c.log = logger.GetLogger("HomeCloud") c.ExportRPCServices() c.ensureSiteExists() ledController := c.Conn.GetServiceClient("$home/led-controller") err := ledController.Call("enableControl", nil, nil, 0) if err != nil { c.log.Infof("Failed to enable control on LED controller: %s", err) } if syncEnabled { // We wait for at least one sync to happen, or fail <-c.StartSyncing(config.MustDuration("homecloud.sync.interval")) } // This is required to enable sphere-reset to clear out redis, then push this empty db to // cloud. if config.Bool(false, "clearcloud") { c.log.Infof("Just clearing cloud so exiting now!") os.Exit(0) } c.AutoStartModules() return nil }
func (c *HomeCloud) AutoStartModules() { do := func(name string, task string) error { return c.Conn.SendNotification("$node/"+config.Serial()+"/module/"+task, name) } interval := config.MustDuration("homecloud.autoStart.interval") for _, name := range c.findAutoStartModules() { log.Infof("-- (Re)starting '%s'", name) err := do(name, "stop") if err != nil { log.Fatalf("Failed to send %s stop message! %s", name, err) } time.Sleep(interval) err = do(name, "start") if err != nil { log.Fatalf("Failed to send %s start message! %s", name, err) } } }
"reflect" "sync" "time" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/go-ninja/logger" "github.com/ninjasphere/go-ninja/model" "github.com/ninjasphere/redigo/redis" "github.com/ninjasphere/sphere-go-homecloud/models" ) var log = logger.GetLogger("HomeCloud") var syncEnabled = config.Bool(true, "homecloud.sync.enabled") var syncTimeout = config.MustDuration("homecloud.sync.timeout") type HomeCloud struct { Conn *ninja.Connection `inject:""` Pool *redis.Pool `inject:""` ThingModel *models.ThingModel `inject:""` DeviceModel *models.DeviceModel `inject:""` ChannelModel *models.ChannelModel `inject:""` RoomModel *models.RoomModel `inject:""` ModuleModel *models.ModuleModel `inject:""` SiteModel *models.SiteModel `inject:""` log *logger.Logger } func (c *HomeCloud) PostConstruct() error {
package ui import ( "image" "time" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/go-ninja/logger" "github.com/ninjasphere/sphere-go-led-controller/util" ) var onOffTapTimeout = config.MustDuration("led.onoff.tapTimeout") type OnOffPane struct { log *logger.Logger conn *ninja.Connection devices []*ninja.ServiceClient state bool onStateChange func(bool) onImage util.Image offImage util.Image lastTap time.Time ignoringGestures bool }
"encoding/json" "image" "math" "sync" "time" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/channels" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/sphere-go-led-controller/util" "github.com/ninjasphere/go-ninja/logger" ) var volumeModeReset = config.MustDuration("led.media.volumeModeReset") var mediaTapTimeout = config.MustDuration("led.media.tapInterval") var volumeInterval = config.MustDuration("led.media.volumeInterval") var airWheelReset = config.MustDuration("led.media.airWheelReset") type MediaPane struct { log *logger.Logger conn *ninja.Connection volumeMode bool volumeModeReset *time.Timer volumeUpDownMode bool volumeUpDown *bool lastAirWheelTime time.Time lastAirWheel *uint8
"fmt" "image" "image/color" "strings" "time" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/sphere-go-led-controller/fonts/clock" ) var enableClockPane = config.Bool(true, "led.clock.enabled") var enableAlarm = config.Bool(true, "led.clock.alarmEnabled") var alarmFlashTimes = config.Int(2, "led.clock.alarmFlashTimes") * 2 var alarmFlashInterval = config.MustDuration("led.clock.alarmFlashInterval") type ClockPane struct { alarm *time.Time timer *time.Timer tapThrottle *throttle lights []*ninja.ServiceClient tickTock bool } func NewClockPane() *ClockPane { var pane *ClockPane pane = &ClockPane{ timer: time.AfterFunc(time.Minute, func() { pane.alarm = nil pane.DoAlarm()
"image/color" "os" "time" "github.com/bugsnag/bugsnag-go" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/go-ninja/model" owm "github.com/ninjasphere/openweathermap" "github.com/ninjasphere/sphere-go-led-controller/fonts/O4b03b" "github.com/ninjasphere/sphere-go-led-controller/util" ) var enableWeatherPane = config.MustBool("led.weather.enabled") var weatherUpdateInterval = config.MustDuration("led.weather.updateInterval") var temperatureDisplayTime = config.Duration(time.Second*5, "led.weather.temperatureDisplayTime") var globalSite *model.Site var timezone *time.Location type WeatherPane struct { siteModel *ninja.ServiceClient site *model.Site getWeather *time.Timer tempTimeout *time.Timer temperature bool weather *owm.ForecastWeatherData image util.Image }
func main() { log.Infof("Welcome home, Ninja.") if config.Bool(true, "homecloud.waitForNTP") { waitForNTP() } // The MQTT Connection conn, err := ninja.Connect("sphere-go-homecloud") if err != nil { log.Fatalf("Failed to connect to sphere: %s", err) } // An MQTT Connection used for outbound syncing connections syncConn := &models.SyncConnection{} syncConn.Conn, err = ninja.Connect("sphere-go-homecloud.sync") if err != nil { log.Fatalf("Failed to connect to sphere (sync): %s", err) } // Our redis pool pool := &redis.Pool{ MaxIdle: config.MustInt("homecloud.redis.maxIdle"), MaxActive: config.Int(10, "homecloud.redis.maxActive"), IdleTimeout: config.MustDuration("homecloud.redis.idleTimeout"), Wait: true, Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", config.String("", "homecloud.redis.host"), config.MustInt("homecloud.redis.port"))) if err != nil { return nil, err } return c, err }, TestOnBorrow: func(c redis.Conn, t time.Time) error { _, err := c.Do("PING") return err }, } // Not pretty. rpc.RedisPool = pool // Wait until we connect to redis successfully. for { c := pool.Get() if c.Err() == nil { c.Close() break } log.Warningf("Failed to connect to redis: %s", c.Err()) time.Sleep(time.Second) } // Build the object graph using dependency injection injectables := []interface{}{} injectables = append(injectables, pool, conn, syncConn) injectables = append(injectables, &homecloud.HomeCloud{}, &homecloud.TimeSeriesManager{}, &homecloud.DeviceManager{}, &homecloud.ModuleManager{}) injectables = append(injectables, state.NewStateManager()) injectables = append(injectables, &rest.RestServer{}) injectables = append(injectables, models.GetInjectables()...) err = inject.Populate(injectables...) if err != nil { log.Fatalf("Failed to construct the object graph: %s", err) } // Run PostConstruct on any objects that have it for _, node := range injectables { if n, ok := node.(postConstructable); ok { go func(c postConstructable) { if err := c.PostConstruct(); err != nil { log.Fatalf("Failed PostConstruct on object %s: %s", reflect.TypeOf(c).String(), err) } }(n) } } support.WaitUntilSignal() // So long, and thanks for all the fish. }
"math" "os" "sync" "time" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/go-ninja/logger" ) const width = 16 const height = 16 var panDuration = config.MustDuration("led.panDuration") var wakeTransitionDuration = config.MustDuration("led.wakeTransition") var sleepTransitionDuration = config.MustDuration("led.sleepTransition") var sleepTimeout = config.MustDuration("led.sleepTimeout") var forceAllPanes = config.Bool(false, "led.forceAllPanes") var logGestures = config.Bool(false, "led.gestures.log") var enableGestures = config.Bool(true, "led.gestures.enable") type PaneLayout struct { currentPane int targetPane int panes []Pane lastGesture time.Time panTween *Tween
"image/draw" "math" "sync" "time" "github.com/lucasb-eyer/go-colorful" "github.com/ninjasphere/gestic-tools/go-gestic-sdk" "github.com/ninjasphere/go-ninja/api" "github.com/ninjasphere/go-ninja/channels" "github.com/ninjasphere/go-ninja/config" "github.com/ninjasphere/go-ninja/devices" "github.com/ninjasphere/go-ninja/logger" "github.com/ninjasphere/sphere-go-led-controller/util" ) var lightTapInterval = config.MustDuration("led.light.tapInterval") var colorInterval = config.MustDuration("led.light.colorInterval") var colorAdjustSpeed = config.MustFloat("led.light.colorSpeed") var brightnessAdjustSpeed = config.MustFloat("led.light.brightnessSpeed") var brightnessMinimum = uint8(config.MustInt("led.light.brightnessMinimum")) type LightPane struct { log *logger.Logger conn *ninja.Connection onEnable chan bool onOffDevices *[]*ninja.ServiceClient airwheelDevices *[]*ninja.ServiceClient