type Theme {
  iconName: String
  primaryColor: String
}

type Position {
  servo1: Float
  servo2: Float
  servo3: Float
  tilt: Float
  velocity: Float
}

type Home {
  id: ID!
  name: String!
  locationLat: Float
  locationLon: Float
  owner: String
  members: [String]
  rooms(filter: ModelRoomFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelRoomConnection
  shades(filter: ModelShadeFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelShadeConnection
  scenes(filter: ModelSceneFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelSceneConnection
  automations(filter: ModelAutomationFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelAutomationConnection
  remotes(filter: ModelRemoteFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelRemoteConnection
  commands(filter: ModelGatewayCommandFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelGatewayCommandConnection
  gateways(filter: ModelGatewayFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelGatewayConnection
}

type Gateway {
  id: ID!
  name: String
  ipAddress: String
  serialNumber: String
  macAddress1: String
  macAddress2: String
  ssid: String
  home: Home
}

type Room {
  id: ID!
  name: String!
  theme: Theme
  owner: String
  members: [String]
  home: Home
  shades(filter: ModelShadeFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelShadeConnection
  remotes(filter: ModelRemoteFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelRemoteConnection
}

type Shade {
  id: ID!
  mac: String
  name: String!
  displayName: String
  modelID: Int
  capabilities: Int
  firmwareVersion: Int
  position: Position
  lastTimeClockUpdated: AWSDateTime
  ledEnabled: Boolean
  resetRequested: Boolean
  batteryLevel: Int
  owner: String
  members: [String]
  home: Home
  room: Room
  sceneActions(filter: ModelSceneActionFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelSceneActionConnection
  remoteGroups(filter: ModelRemoteGroupFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelRemoteGroupConnection
}

type Scene {
  id: ID!
  name: String!
  theme: Theme
  owner: String
  members: [String]
  home: Home
  actions(filter: ModelSceneActionFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelSceneActionConnection
  automations(filter: ModelAutomationFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelAutomationConnection
}

type SceneAction {
  id: ID!
  position: Position!
  scene: Scene!
  shade: Shade!
}

enum AutomationType {
  clock
  sunrise
  sunset
}

type Automation {
  id: ID!
  type: AutomationType!
  enabled: Boolean!
  dayOfWeekBitmask: Int!
  hour: Int
  minute: Int
  sunriseSunsetOffset: Int
  owner: String
  members: [String]
  home: Home
  scene: Scene
}

enum RemoteGroupSlot {
  group1
  group2
  group3
  group4
  group5
  group6
}

type Remote {
  id: ID!
  name: String!
  owner: String
  members: [String]
  home: Home
  room: Room
  groups(filter: ModelRemoteGroupFilterInput, sortDirection: ModelSortDirection, limit: Int, nextToken: String): ModelRemoteGroupConnection
}

type RemoteGroup {
  id: ID!
  groupSlot: RemoteGroupSlot!
  remote: Remote!
  shade: Shade!
}

enum GatewayCommandType {
  activateScene
  setPositions
  setScene
}

enum GatewayCommandState {
  requested
  inProgress
  completed
  failed
}

enum GatewayCommandChange {
  create
  update
  delete
}

type GatewayCommand {
  id: ID!
  owner: String
  initiaterName: String
  createdAt: AWSDateTime!
  commandType: GatewayCommandType!
  commandState: GatewayCommandState!
  commandError: Int
  home: Home
  activateScene: GatewayCommandActivateScene
  setPositions: GatewayCommandSetPositions
  setScene: GatewayCommandSetScene
}

type GatewayCommandActivateScene {
  sceneId: String!
}

type GatewayCommandSetPositions {
  shadeMacs: [String]!
  positions: [Position]!
}

type GatewayCommandSetScene {
  change: GatewayCommandChange!
  shadeMac: String!
  sceneId: String!
  position: Position
}

enum ModelSortDirection {
  ASC
  DESC
}

type ModelHomeConnection {
  items: [Home]
  nextToken: String
}

input ModelStringFilterInput {
  ne: String
  eq: String
  le: String
  lt: String
  ge: String
  gt: String
  contains: String
  notContains: String
  between: [String]
  beginsWith: String
}

input ModelIDFilterInput {
  ne: ID
  eq: ID
  le: ID
  lt: ID
  ge: ID
  gt: ID
  contains: ID
  notContains: ID
  between: [ID]
  beginsWith: ID
}

input ModelIntFilterInput {
  ne: Int
  eq: Int
  le: Int
  lt: Int
  ge: Int
  gt: Int
  contains: Int
  notContains: Int
  between: [Int]
}

input ModelFloatFilterInput {
  ne: Float
  eq: Float
  le: Float
  lt: Float
  ge: Float
  gt: Float
  contains: Float
  notContains: Float
  between: [Float]
}

input ModelBooleanFilterInput {
  ne: Boolean
  eq: Boolean
}

input ModelHomeFilterInput {
  id: ModelIDFilterInput
  name: ModelStringFilterInput
  locationLat: ModelFloatFilterInput
  locationLon: ModelFloatFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelHomeFilterInput]
  or: [ModelHomeFilterInput]
  not: ModelHomeFilterInput
}

type Query {
  getHome(id: ID!): Home
  listHomes(filter: ModelHomeFilterInput, limit: Int, nextToken: String): ModelHomeConnection
  getGateway(id: ID!): Gateway
  listGateways(filter: ModelGatewayFilterInput, limit: Int, nextToken: String): ModelGatewayConnection
  getRoom(id: ID!): Room
  listRooms(filter: ModelRoomFilterInput, limit: Int, nextToken: String): ModelRoomConnection
  getShade(id: ID!): Shade
  listShades(filter: ModelShadeFilterInput, limit: Int, nextToken: String): ModelShadeConnection
  getScene(id: ID!): Scene
  listScenes(filter: ModelSceneFilterInput, limit: Int, nextToken: String): ModelSceneConnection
  getSceneAction(id: ID!): SceneAction
  listSceneActions(filter: ModelSceneActionFilterInput, limit: Int, nextToken: String): ModelSceneActionConnection
  getAutomation(id: ID!): Automation
  listAutomations(filter: ModelAutomationFilterInput, limit: Int, nextToken: String): ModelAutomationConnection
  getRemote(id: ID!): Remote
  listRemotes(filter: ModelRemoteFilterInput, limit: Int, nextToken: String): ModelRemoteConnection
  getRemoteGroup(id: ID!): RemoteGroup
  listRemoteGroups(filter: ModelRemoteGroupFilterInput, limit: Int, nextToken: String): ModelRemoteGroupConnection
  getGatewayCommand(id: ID!): GatewayCommand
  listGatewayCommands(filter: ModelGatewayCommandFilterInput, limit: Int, nextToken: String): ModelGatewayCommandConnection
}

input CreateHomeInput {
  id: ID
  name: String!
  locationLat: Float
  locationLon: Float
  owner: String
  members: [String]
}

input UpdateHomeInput {
  id: ID!
  name: String
  locationLat: Float
  locationLon: Float
  owner: String
  members: [String]
}

input DeleteHomeInput {
  id: ID
}

type Mutation {
  createHome(input: CreateHomeInput!): Home
  updateHome(input: UpdateHomeInput!): Home
  deleteHome(input: DeleteHomeInput!): Home
  createGateway(input: CreateGatewayInput!): Gateway
  updateGateway(input: UpdateGatewayInput!): Gateway
  deleteGateway(input: DeleteGatewayInput!): Gateway
  createRoom(input: CreateRoomInput!): Room
  updateRoom(input: UpdateRoomInput!): Room
  deleteRoom(input: DeleteRoomInput!): Room
  createShade(input: CreateShadeInput!): Shade
  updateShade(input: UpdateShadeInput!): Shade
  deleteShade(input: DeleteShadeInput!): Shade
  createScene(input: CreateSceneInput!): Scene
  updateScene(input: UpdateSceneInput!): Scene
  deleteScene(input: DeleteSceneInput!): Scene
  createSceneAction(input: CreateSceneActionInput!): SceneAction
  updateSceneAction(input: UpdateSceneActionInput!): SceneAction
  deleteSceneAction(input: DeleteSceneActionInput!): SceneAction
  createAutomation(input: CreateAutomationInput!): Automation
  updateAutomation(input: UpdateAutomationInput!): Automation
  deleteAutomation(input: DeleteAutomationInput!): Automation
  createRemote(input: CreateRemoteInput!): Remote
  updateRemote(input: UpdateRemoteInput!): Remote
  deleteRemote(input: DeleteRemoteInput!): Remote
  createRemoteGroup(input: CreateRemoteGroupInput!): RemoteGroup
  updateRemoteGroup(input: UpdateRemoteGroupInput!): RemoteGroup
  deleteRemoteGroup(input: DeleteRemoteGroupInput!): RemoteGroup
  createGatewayCommand(input: CreateGatewayCommandInput!): GatewayCommand
  updateGatewayCommand(input: UpdateGatewayCommandInput!): GatewayCommand
  deleteGatewayCommand(input: DeleteGatewayCommandInput!): GatewayCommand
}

type Subscription {
  onCreateHome: Home @aws_subscribe(mutations: ["createHome"])
  onUpdateHome: Home @aws_subscribe(mutations: ["updateHome"])
  onDeleteHome: Home @aws_subscribe(mutations: ["deleteHome"])
  onCreateGateway: Gateway @aws_subscribe(mutations: ["createGateway"])
  onUpdateGateway: Gateway @aws_subscribe(mutations: ["updateGateway"])
  onDeleteGateway: Gateway @aws_subscribe(mutations: ["deleteGateway"])
  onCreateRoom: Room @aws_subscribe(mutations: ["createRoom"])
  onUpdateRoom: Room @aws_subscribe(mutations: ["updateRoom"])
  onDeleteRoom: Room @aws_subscribe(mutations: ["deleteRoom"])
  onCreateShade: Shade @aws_subscribe(mutations: ["createShade"])
  onUpdateShade: Shade @aws_subscribe(mutations: ["updateShade"])
  onDeleteShade: Shade @aws_subscribe(mutations: ["deleteShade"])
  onCreateScene: Scene @aws_subscribe(mutations: ["createScene"])
  onUpdateScene: Scene @aws_subscribe(mutations: ["updateScene"])
  onDeleteScene: Scene @aws_subscribe(mutations: ["deleteScene"])
  onCreateSceneAction: SceneAction @aws_subscribe(mutations: ["createSceneAction"])
  onUpdateSceneAction: SceneAction @aws_subscribe(mutations: ["updateSceneAction"])
  onDeleteSceneAction: SceneAction @aws_subscribe(mutations: ["deleteSceneAction"])
  onCreateAutomation: Automation @aws_subscribe(mutations: ["createAutomation"])
  onUpdateAutomation: Automation @aws_subscribe(mutations: ["updateAutomation"])
  onDeleteAutomation: Automation @aws_subscribe(mutations: ["deleteAutomation"])
  onCreateRemote: Remote @aws_subscribe(mutations: ["createRemote"])
  onUpdateRemote: Remote @aws_subscribe(mutations: ["updateRemote"])
  onDeleteRemote: Remote @aws_subscribe(mutations: ["deleteRemote"])
  onCreateRemoteGroup: RemoteGroup @aws_subscribe(mutations: ["createRemoteGroup"])
  onUpdateRemoteGroup: RemoteGroup @aws_subscribe(mutations: ["updateRemoteGroup"])
  onDeleteRemoteGroup: RemoteGroup @aws_subscribe(mutations: ["deleteRemoteGroup"])
  onCreateGatewayCommand: GatewayCommand @aws_subscribe(mutations: ["createGatewayCommand"])
  onUpdateGatewayCommand: GatewayCommand @aws_subscribe(mutations: ["updateGatewayCommand"])
  onDeleteGatewayCommand: GatewayCommand @aws_subscribe(mutations: ["deleteGatewayCommand"])
}

type ModelGatewayConnection {
  items: [Gateway]
  nextToken: String
}

input ModelGatewayFilterInput {
  id: ModelIDFilterInput
  name: ModelStringFilterInput
  ipAddress: ModelStringFilterInput
  serialNumber: ModelStringFilterInput
  macAddress1: ModelStringFilterInput
  macAddress2: ModelStringFilterInput
  ssid: ModelStringFilterInput
  and: [ModelGatewayFilterInput]
  or: [ModelGatewayFilterInput]
  not: ModelGatewayFilterInput
}

input CreateGatewayInput {
  id: ID
  name: String
  ipAddress: String
  serialNumber: String
  macAddress1: String
  macAddress2: String
  ssid: String
  gatewayHomeId: ID
}

input UpdateGatewayInput {
  id: ID!
  name: String
  ipAddress: String
  serialNumber: String
  macAddress1: String
  macAddress2: String
  ssid: String
  gatewayHomeId: ID
}

input DeleteGatewayInput {
  id: ID
}

input ThemeInput {
  iconName: String
  primaryColor: String
}

type ModelRoomConnection {
  items: [Room]
  nextToken: String
}

input ModelRoomFilterInput {
  id: ModelIDFilterInput
  name: ModelStringFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelRoomFilterInput]
  or: [ModelRoomFilterInput]
  not: ModelRoomFilterInput
}

input CreateRoomInput {
  id: ID
  name: String!
  theme: ThemeInput
  owner: String
  members: [String]
  roomHomeId: ID
}

input UpdateRoomInput {
  id: ID!
  name: String
  theme: ThemeInput
  owner: String
  members: [String]
  roomHomeId: ID
}

input DeleteRoomInput {
  id: ID
}

input PositionInput {
  servo1: Float
  servo2: Float
  servo3: Float
  tilt: Float
  velocity: Float
}

type ModelShadeConnection {
  items: [Shade]
  nextToken: String
}

input ModelShadeFilterInput {
  id: ModelIDFilterInput
  mac: ModelStringFilterInput
  name: ModelStringFilterInput
  displayName: ModelStringFilterInput
  modelID: ModelIntFilterInput
  capabilities: ModelIntFilterInput
  firmwareVersion: ModelIntFilterInput
  lastTimeClockUpdated: ModelStringFilterInput
  ledEnabled: ModelBooleanFilterInput
  resetRequested: ModelBooleanFilterInput
  batteryLevel: ModelIntFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelShadeFilterInput]
  or: [ModelShadeFilterInput]
  not: ModelShadeFilterInput
}

input CreateShadeInput {
  id: ID
  mac: String
  name: String!
  displayName: String
  modelID: Int
  capabilities: Int
  firmwareVersion: Int
  position: PositionInput
  lastTimeClockUpdated: AWSDateTime
  ledEnabled: Boolean
  resetRequested: Boolean
  batteryLevel: Int
  owner: String
  members: [String]
  shadeHomeId: ID
  shadeRoomId: ID
}

input UpdateShadeInput {
  id: ID!
  mac: String
  name: String
  displayName: String
  modelID: Int
  capabilities: Int
  firmwareVersion: Int
  position: PositionInput
  lastTimeClockUpdated: AWSDateTime
  ledEnabled: Boolean
  resetRequested: Boolean
  batteryLevel: Int
  owner: String
  members: [String]
  shadeHomeId: ID
  shadeRoomId: ID
}

input DeleteShadeInput {
  id: ID
}

type ModelSceneConnection {
  items: [Scene]
  nextToken: String
}

input ModelSceneFilterInput {
  id: ModelIDFilterInput
  name: ModelStringFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelSceneFilterInput]
  or: [ModelSceneFilterInput]
  not: ModelSceneFilterInput
}

input CreateSceneInput {
  id: ID
  name: String!
  theme: ThemeInput
  owner: String
  members: [String]
  sceneHomeId: ID
}

input UpdateSceneInput {
  id: ID!
  name: String
  theme: ThemeInput
  owner: String
  members: [String]
  sceneHomeId: ID
}

input DeleteSceneInput {
  id: ID
}

type ModelSceneActionConnection {
  items: [SceneAction]
  nextToken: String
}

input ModelSceneActionFilterInput {
  id: ModelIDFilterInput
  and: [ModelSceneActionFilterInput]
  or: [ModelSceneActionFilterInput]
  not: ModelSceneActionFilterInput
}

input CreateSceneActionInput {
  id: ID
  position: PositionInput!
  sceneActionSceneId: ID!
  sceneActionShadeId: ID!
}

input UpdateSceneActionInput {
  id: ID!
  position: PositionInput
  sceneActionSceneId: ID
  sceneActionShadeId: ID
}

input DeleteSceneActionInput {
  id: ID
}

type ModelAutomationConnection {
  items: [Automation]
  nextToken: String
}

input ModelAutomationTypeFilterInput {
  eq: AutomationType
  ne: AutomationType
}

input ModelAutomationFilterInput {
  id: ModelIDFilterInput
  type: ModelAutomationTypeFilterInput
  enabled: ModelBooleanFilterInput
  dayOfWeekBitmask: ModelIntFilterInput
  hour: ModelIntFilterInput
  minute: ModelIntFilterInput
  sunriseSunsetOffset: ModelIntFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelAutomationFilterInput]
  or: [ModelAutomationFilterInput]
  not: ModelAutomationFilterInput
}

input CreateAutomationInput {
  id: ID
  type: AutomationType!
  enabled: Boolean!
  dayOfWeekBitmask: Int!
  hour: Int
  minute: Int
  sunriseSunsetOffset: Int
  owner: String
  members: [String]
  automationHomeId: ID
  automationSceneId: ID
}

input UpdateAutomationInput {
  id: ID!
  type: AutomationType
  enabled: Boolean
  dayOfWeekBitmask: Int
  hour: Int
  minute: Int
  sunriseSunsetOffset: Int
  owner: String
  members: [String]
  automationHomeId: ID
  automationSceneId: ID
}

input DeleteAutomationInput {
  id: ID
}

type ModelRemoteConnection {
  items: [Remote]
  nextToken: String
}

input ModelRemoteFilterInput {
  id: ModelIDFilterInput
  name: ModelStringFilterInput
  owner: ModelStringFilterInput
  members: ModelStringFilterInput
  and: [ModelRemoteFilterInput]
  or: [ModelRemoteFilterInput]
  not: ModelRemoteFilterInput
}

input CreateRemoteInput {
  id: ID
  name: String!
  owner: String
  members: [String]
  remoteHomeId: ID
  remoteRoomId: ID
}

input UpdateRemoteInput {
  id: ID!
  name: String
  owner: String
  members: [String]
  remoteHomeId: ID
  remoteRoomId: ID
}

input DeleteRemoteInput {
  id: ID
}

type ModelRemoteGroupConnection {
  items: [RemoteGroup]
  nextToken: String
}

input ModelRemoteGroupSlotFilterInput {
  eq: RemoteGroupSlot
  ne: RemoteGroupSlot
}

input ModelRemoteGroupFilterInput {
  id: ModelIDFilterInput
  groupSlot: ModelRemoteGroupSlotFilterInput
  and: [ModelRemoteGroupFilterInput]
  or: [ModelRemoteGroupFilterInput]
  not: ModelRemoteGroupFilterInput
}

input CreateRemoteGroupInput {
  id: ID
  groupSlot: RemoteGroupSlot!
  remoteGroupRemoteId: ID!
  remoteGroupShadeId: ID!
}

input UpdateRemoteGroupInput {
  id: ID!
  groupSlot: RemoteGroupSlot
  remoteGroupRemoteId: ID
  remoteGroupShadeId: ID
}

input DeleteRemoteGroupInput {
  id: ID
}

input GatewayCommandActivateSceneInput {
  sceneId: String!
}

input GatewayCommandSetPositionsInput {
  shadeMacs: [String]!
  positions: [PositionInput]!
}

input GatewayCommandSetSceneInput {
  change: GatewayCommandChange!
  shadeMac: String!
  sceneId: String!
  position: PositionInput
}

type ModelGatewayCommandConnection {
  items: [GatewayCommand]
  nextToken: String
}

input ModelGatewayCommandTypeFilterInput {
  eq: GatewayCommandType
  ne: GatewayCommandType
}

input ModelGatewayCommandStateFilterInput {
  eq: GatewayCommandState
  ne: GatewayCommandState
}

input ModelGatewayCommandFilterInput {
  id: ModelIDFilterInput
  owner: ModelStringFilterInput
  initiaterName: ModelStringFilterInput
  createdAt: ModelStringFilterInput
  commandType: ModelGatewayCommandTypeFilterInput
  commandState: ModelGatewayCommandStateFilterInput
  commandError: ModelIntFilterInput
  and: [ModelGatewayCommandFilterInput]
  or: [ModelGatewayCommandFilterInput]
  not: ModelGatewayCommandFilterInput
}

input CreateGatewayCommandInput {
  id: ID
  owner: String
  initiaterName: String
  createdAt: AWSDateTime!
  commandType: GatewayCommandType!
  commandState: GatewayCommandState!
  commandError: Int
  activateScene: GatewayCommandActivateSceneInput
  setPositions: GatewayCommandSetPositionsInput
  setScene: GatewayCommandSetSceneInput
  gatewayCommandHomeId: ID
}

input UpdateGatewayCommandInput {
  id: ID!
  owner: String
  initiaterName: String
  createdAt: AWSDateTime
  commandType: GatewayCommandType
  commandState: GatewayCommandState
  commandError: Int
  activateScene: GatewayCommandActivateSceneInput
  setPositions: GatewayCommandSetPositionsInput
  setScene: GatewayCommandSetSceneInput
  gatewayCommandHomeId: ID
}

input DeleteGatewayCommandInput {
  id: ID
}
