arlo-go/devices.go

145 lines
5.5 KiB
Go
Raw Normal View History

package arlo
2017-12-09 03:55:38 +00:00
2017-12-10 19:17:09 +00:00
// A Device is the device data, this can be a camera, basestation, arloq, etc.
2017-12-09 03:55:38 +00:00
type Device struct {
arlo *Arlo // Let's hold a reference to the parent arlo object since it holds the http.Client object and references to all devices.
AnalyticsEnabled bool `json:"analyticsEnabled"`
ArloMobilePlan bool `json:"arloMobilePlan"`
ArloMobilePlanId string `json:"arloMobilePlanId"`
ArloMobilePlanName string `json:"arloMobilePlanName"`
ArloMobilePlanThreshold int `json:"arloMobilePlanThreshold"`
Connectivity Connectivity `json:"connectivity"`
CriticalBatteryState bool `json:"criticalBatteryState"`
DateCreated int64 `json:"dateCreated"`
DeviceId string `json:"deviceId"`
DeviceName string `json:"deviceName"`
DeviceType string `json:"deviceType"`
DisplayOrder uint8 `json:"displayOrder"`
FirmwareVersion string `json:"firmwareVersion"`
InterfaceVersion string `json:"interfaceVersion"`
InterfaceSchemaVer string `json:"interfaceSchemaVer"`
LastImageUploaded string `json:"lastImageUploaded"`
LastModified int64 `json:"lastModified"`
MigrateActivityZone bool `json:"migrateActivityZone"`
MobileCarrier string `json:"mobileCarrier"`
MobileTrialUsed bool `json:"mobileTrialUsed"`
PermissionsFilePath string `json:"permissionsFilePath"`
PermissionsSchemaVer string `json:"permissionsSchemaVer"`
PermissionsVerison string `json:"permissionsVerison"` // WTF? Netgear developers think this is OK... *sigh*
PermissionsVersion string `json:"permissionsVersion"`
PresignedFullFrameSnapshotUrl string `json:"presignedFullFrameSnapshotUrl"`
PresignedLastImageUrl string `json:"presignedLastImageUrl"`
PresignedSnapshotUrl string `json:"presignedSnapshotUrl"`
2020-05-27 08:49:40 +00:00
MediaObjectCount uint32 `json:"mediaObjectCount"`
ModelId string `json:"modelId"`
Owner Owner `json:"owner"`
ParentId string `json:"parentId"`
Properties Properties `json:"properties"`
UniqueId string `json:"uniqueId"`
UserId string `json:"userId"`
UserRole string `json:"userRole"`
State string `json:"state"`
XCloudId string `json:"xCloudId"`
2017-12-09 03:55:38 +00:00
}
2018-09-22 19:22:42 +00:00
// Devices is a slice of Device objects.
2020-05-27 08:49:40 +00:00
type Devices []*Device
2017-12-09 03:55:38 +00:00
2017-12-10 19:17:09 +00:00
// A DeviceOrder holds a map of device ids and a numeric index. The numeric index is the device order.
// Device order is mainly used by the UI to determine which order to show the devices.
2017-12-09 03:55:38 +00:00
/*
{
"devices":{
"XXXXXXXXXXXXX":1,
"XXXXXXXXXXXXX":2,
"XXXXXXXXXXXXX":3
}
*/
type DeviceOrder struct {
2017-12-10 19:17:09 +00:00
Devices map[string]int `json:"devices"`
2017-12-09 03:55:38 +00:00
}
2017-12-10 19:17:09 +00:00
// Find returns a device with the device id passed in.
2020-05-27 08:49:40 +00:00
func (ds Devices) Find(deviceId string) *Device {
for _, d := range ds {
2017-12-09 03:55:38 +00:00
if d.DeviceId == deviceId {
2020-05-27 08:49:40 +00:00
return d
2017-12-09 03:55:38 +00:00
}
}
return nil
}
2018-09-22 19:22:42 +00:00
func (ds Devices) FindCameras(basestationId string) Cameras {
2020-05-27 08:49:40 +00:00
cs := Cameras{}
2018-09-22 19:22:42 +00:00
for _, d := range ds {
if d.ParentId == basestationId {
2020-05-27 08:49:40 +00:00
cam := Camera(*d)
cs = append(cs, &cam)
}
}
2020-05-27 08:49:40 +00:00
return cs
}
func (d Device) IsBasestation() bool {
2020-05-27 08:49:40 +00:00
return d.DeviceType == DeviceTypeBasestation
}
func (d Device) IsCamera() bool {
2020-05-27 08:49:40 +00:00
switch d.DeviceType {
case
DeviceTypeCamera,
DeviceTypeArloQ:
return true
}
return false
2020-04-20 21:56:09 +00:00
}
func (d Device) IsArloQ() bool {
return d.DeviceType == DeviceTypeArloBridge
}
func (d Device) IsLight() bool {
return d.DeviceType == DeviceTypeLights
}
func (d Device) IsSiren() bool {
return d.DeviceType == DeviceTypeSiren
}
// GetBasestations returns a Basestations object containing all devices that are NOT type "camera".
2017-12-10 19:17:09 +00:00
// I did this because some device types, like arloq, don't have a basestation.
// So, when interacting with them you must treat them like a basestation and a camera.
// Cameras also includes devices of this type, so you can get the same data there or cast.
2020-05-27 08:49:40 +00:00
func (ds Devices) GetBasestations() Basestations {
var basestations Basestations
for _, d := range ds {
2020-05-27 08:49:40 +00:00
if d.IsBasestation() {
basestations = append(basestations, &Basestation{Device: *d})
2017-12-09 03:55:38 +00:00
}
}
return basestations
2017-12-09 03:55:38 +00:00
}
// GetCameras returns a Cameras object containing all devices that are of type "camera".
2017-12-10 19:17:09 +00:00
// I did this because some device types, like arloq, don't have a basestation.
// So, when interacting with them you must treat them like a basestation and a camera.
// Basestations also includes devices of this type, so you can get the same data there or cast.
2020-05-27 08:49:40 +00:00
func (ds Devices) GetCameras() Cameras {
var cameras Cameras
for _, d := range ds {
2020-05-27 08:49:40 +00:00
if d.IsCamera() {
cam := Camera(*d)
cameras = append(cameras, &cam)
2017-12-09 03:55:38 +00:00
}
}
return cameras
2017-12-09 03:55:38 +00:00
}
2017-12-10 19:17:09 +00:00
// UpdateDeviceName sets the name of the given device to the name argument.
2020-05-27 08:49:40 +00:00
//func (d *Device) UpdateDeviceName(name string) error {
// body := map[string]string{"deviceId": d.DeviceId, "deviceName": name, "parentId": d.ParentId}
// resp, err := d.arlo.put(RenameDeviceUri, d.XCloudId, body, nil)
// return checkRequest(resp, err, "failed to update device name")
//}