type Query { me: User! controller(controllerId: Int!): Controller contractorsByName(searchString: String!): [PublicContractorProfile]! contractorsByGeoLocation(latitude: Float!, longitude: Float!, radius: Float!): [PublicContractorProfile]! zone(zoneId: Int!): Zone configuration: Configuration controllerModelBySerialNumber(serialNumber: String!): ControllerModel controllerConfigurationUploadStatus(transactionId: Int!): ConfigurationUploadStatus! } type User { id: Int! customerId: Int! name: String! email: String localeName: String! lastContact: String validated: Boolean! appValidated: Boolean! adminType: Int! type: String! userType: UserTypeEnum userAvatar: File contractor: Contractor managedByContractor: PublicContractorProfile currentController: Controller bocTopologyDesired: [BocTopology] bocTopologyActual: [BocTopology] gateways: [BocGateway] repeaters: [BocRepeater] controllers: [Controller] controllerWatchList: [Controller] customer: Customer notifications: [Notification] units: UnitsSummary! messageApp: MessageApp! dashboardNotifications(timeZoneId: String!): [DashboardNotification!]! nativeApp(appType: Int!): NativeApp } enum UserTypeEnum { READ_WRITE READ_ONLY CUSTOMER_ADMIN SUPER_ADMIN } type File { id: Int! fileName: String url: String fileSize: Int fileDate(timeZoneId: String!): DateTime presignedUrl: String } type DateTime { value: String! timestamp: Int! largeTimestamp: Float! timeZone: TimeZone! relativeTime: String! } type TimeZone { name: String! offset: Int! options: [String] } type Contractor { id: Int customerId: Int avatar: String business: String coordinates: GeoCoordinates location: String contact: String @deprecated(reason: "Use name, phone, phoneCountryCode, email instead") description: String name: String email: String phoneLocalNumber: String phoneCountryCode: String online: Boolean website: String statistic: [ContractorStatistic] plans: [CustomerPlan] events(length: Int = 1500): [Event] customer(customerId: Int!): Customer directCustomers: [Customer] customers: [Customer] pendingCustomers: [RestrictedCustomer] alerts: [Alert] customerReports: [CustomerReport] wateringPrograms: [WateringProgram] defaultWateringTriggers: WateringTriggers defaultProgramStartTimes: [ProgramStartTime] } type GeoCoordinates { latitude: Float longitude: Float } type ContractorStatistic { id: Int! controllersOnline: Int! @deprecated controllersOffline: Int! @deprecated actualWateringWeek: Int! normalWateringWeek: Int! customers: Int! customersPending: Int! customerId: Int! epoch: Int! wateringSavingMinute: Int! wateringSavingPercentage: Int! } type CustomerPlan { id: Int! planId: Int! name: String! expiry: String! } type Event { id: String! customerId: Int! controllerId: Int eventTime: String! severity: String! message: String! isAlert: Boolean! customer: Customer user: User controller: Controller actions: [String] } type Customer { id: Int! customerKey: String apiKey: String organization: String created: String! contractor: Contractor bocTopologyDesired: [BocTopology] bocTopologyActual: [BocTopology] gateways: [BocGateway] repeaters: [BocRepeater] controllers: [Controller] notifyUser: User users: [User] plan: Plan plans: [CustomerPlan] availablePlans: [AvailablePlan] files: [File] statistics: CustomerStatistics sensors: [Sensor] sensorCategories: [SensorModelCategory] customSensorTypes: [SensorModel] alerts: [Alert] programs(includeZoneSpecific: Boolean! = false): [Program!]! wateringPrograms: [WateringProgram] @deprecated(reason: "Use programs property") } type BocTopology { id: Int! parentDeviceId: Int! childDeviceId: Int! } type BocGateway { id: Int! deviceId: Int! name: String serialNumber: String status: String lastContactTime: DateTime inSync: Boolean @deprecated(reason: "Use online status") online: Boolean location: Location timeZone: TimeZone! siteId: Int! rfChannel: Int! rescanPeriod: Int! snrThreshold: Int! firmware: BocGatewayStatistics @deprecated(reason: "Use modules") modules: [Module] retries: Int! sensors: [Sensor] sensorCategories: [SensorModelCategory] connectedControllersDesired: [Controller] connectedRepeatersDesired: [BocRepeater] } type Location { id: Int! coordinates: GeoCoordinates address: String country: String state: String locality: String forecast(days: Int = 1): [Forecast] nearbyWeatherStations: [WeatherStation] historicalWeather: WeatherStatisticsStation currentWeatherObservations: [WeatherObservation!]! } type Forecast { time: String! updateTime: String highTemperature: LocalizedValueType lowTemperature: LocalizedValueType evapotranspiration: LocalizedValueType probabilityOfPrecipitation: Float precipitation: LocalizedValueType averageHumidity: Float averageWindSpeed: LocalizedValueType conditions: String icon: Icon } type LocalizedValueType { value: Float unit: String } type Icon { name: String url: String } type WeatherStation { id: Int! key: String! coordinates: GeoCoordinates source: Int! location: String currentObservation: Observation distance: LocalizedValueType } type Observation { time: String! updateTime: String! temperature: LocalizedValueType precipitation: LocalizedValueType precipitationLastHour: LocalizedValueType humidity: Float wind: LocalizedValueType windGust: LocalizedValueType dewPoint: Float pressure: LocalizedValueType evapotranspiration: LocalizedValueType } type WeatherStatisticsStation { coordinates: GeoCoordinates name: String! monthlyData: [WeatherStatistics] peakIrrigationMonth: String! } type WeatherStatistics { maxTemperature: LocalizedValueType minTemperature: LocalizedValueType precipitation: LocalizedValueType evapotranspiration: LocalizedValueType deltaEvapotranspiration: LocalizedValueType } type WeatherObservation { time: DateTime! precipitation: LocalizedValueType precipitationLastFewDays: LocalizedValueType precipitationAccumulationPeriod: Int! temperature: LocalizedValueType evapotranspiration: LocalizedValueType humidity: Float windSpeed: LocalizedValueType } type BocGatewayStatistics { version: String } type Module { id: Long! name: String! serialNumber: String! moduleType: String! firmwareVersion: String! showInApp: Boolean! properties: ModuleProperties! } scalar Long union ModuleProperties = CommonModuleProperties | AppModuleProperties type CommonModuleProperties { type: String! } type AppModuleProperties { type: String! rssi: Int } type Sensor { id: Int! name: String! model: SensorModel! input: SensorInput! zones: [Zone] status: SensorStatus! """ Required parameters: **start**: UTC epoch time. **end**: UTC epoch time. """ flowSummary(start: Int!, end: Int!): SensorFlowSummary } type SensorModel { id: Int! name: String modeType: CustomSensorModeTypeEnum! mode: CustomSensorModeTypeEnum! active: Boolean offLevel: Int offTimer: Int delay: Int divisor: Float flowRate: Float customerId: Int sensorType: CustomSensorTypeEnum type: SelectedOption! category: SensorModelCategory } enum CustomSensorModeTypeEnum { START STOP REPORT } enum CustomSensorTypeEnum { LEVEL_OPEN LEVEL_CLOSED FLOW THRESHOLD } type SelectedOption { value: Int! label: String options: [Option] } type Option { value: Int! label: String! } type SensorModelCategory { id: Int! name: String! models: [SensorModel] } type SensorInput { number: Int! label: String! } type Zone { id: Int! number: SelectedOption! name: String! icon: ZoneIcon! images: [FileWithThumbnail] schedulingMethod: SelectedOption! @deprecated(reason: "Get the scheduling method from ProgramType") wateringSettings: WateringSettings! permittedProgramStartTimes: [ProgramStartTime] @deprecated(reason: "Use wateringSettings(AdvancedWateringSettings)::programStartTime property") scheduledRuns: ScheduledZoneRuns! pastRuns: PastZoneRuns! runsBetween(from: Int!, until: Int!): [ScheduledZoneRun]! runEvents(from: Int!, until: Int!): [RunEventType!]! status: ZoneStatus! sensors: [Sensor] """ -1 means that the global setting is accepted, 0 is that global settings are ignored and master valve is always disabled """ masterValve: Int! suspensions: [ZoneSuspension]! runSummary: ZoneRunSummary! } type ZoneIcon { id: Int fileName: String customImage: File } type FileWithThumbnail { id: Int! name: String! url: String thumbnail: File! } interface WateringSettings { fixedWateringAdjustment: Int! cycleAndSoakSettings: CycleAndSoakSettings wateringProgram: WateringProgram! @deprecated(reason: "Use either advancedProgram or standardProgramApplications") wateringAdjustment: Int! @deprecated(reason: "Use fixedWateringAdjustment property") } type CycleAndSoakSettings { """Watering cycle duration in minutes""" cycleDuration: Int! """Watering pause duration in minutes""" soakDuration: Int! } type WateringProgram { id: Int syntheticId: String! originId: Int type: SelectedExtendedOption! name: String runDuration: RunTime! frequency: WateringFrequency! @deprecated(reason: "Use ProgramWateringFrequency") programAdjustment: SelectedOption @deprecated(reason: "Use conditionalWateringAdjustments in ProgramType") seasonalAdjustment: [Int] wateringProgramMode: SelectedOption! fixedWateringProgram: FixedWateringProgram! virtualSolarSyncWateringProgram: VirtualSolarSyncWateringProgram! smartWateringProgram: SmartWateringProgram! controllerWateringProgramAdjustments(controllerId: Int!, isContractor: Boolean = false): [WateringProgramAdjustment] @deprecated(reason: "Use conditionalWateringAdjustments") } type SelectedExtendedOption { value: Int! label: String! description: String! options: [ExtendedOption] } type ExtendedOption { value: Int! label: String! description: String! } type RunTime { base: Int! adjusted: Int! } type WateringFrequency { label: String! period: WateringPeriod! description: String! } type WateringPeriod { value: Int label: String } type FixedWateringProgram { runDuration: Int period: FixedWateringPeriod programAdjustment: SelectedOption @deprecated(reason: "Use conditionalWateringAdjustments in ProgramType") } type FixedWateringPeriod { value: Int label: String } type VirtualSolarSyncWateringProgram { runDuration: Int period: VirtualSolarSyncWateringPeriod } type VirtualSolarSyncWateringPeriod { value: Int label: String } type SmartWateringProgram { runDuration: Int period: SmartWateringPeriod seasonalAdjustment: [Int] } type SmartWateringPeriod { value: Int label: String } type WateringProgramAdjustment { id: Int! label: String! applicableSchedulingMethod: ApplicableSchedulingMethod! } type ApplicableSchedulingMethod { value: Int label: String } type ProgramStartTime { id: Int! type: SelectedExtendedOption! time: Time! wateringDays: [AdvancedProgramDayPatternEnum] application: ProgramStartTimeApplication! } scalar Time enum AdvancedProgramDayPatternEnum { EVEN ODD MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY DAYS } type ProgramStartTimeApplication { all: Boolean! zones: [Zone] wateringPrograms: [WateringProgram] @deprecated(reason: "use appliesToPrograms property") } type ScheduledZoneRuns { summary: String! currentlyRunning: Boolean! @deprecated(reason: "Use currentRun") currentRun: ScheduledZoneRun nextRun: ScheduledZoneRun status: String currentWaterUsage: LocalizedValueType runs: [ScheduledZoneRun!]! waterUsage(since: Int!): LocalizedValueType } type ScheduledZoneRun { id: String! startTime: DateTime! endTime: DateTime! """in minutes""" normalDuration: Int! """in minutes""" duration: Int! """in seconds""" remainingTime: Int! status: RunStatus! } type RunStatus { value: Int label: String } type PastZoneRuns { lastRun: ScheduledZoneRun runs: [ScheduledZoneRun] } type RunEventType { """A synthetic run even ID""" id: String! zone: Zone! standardProgram: StandardProgram advancedProgram: AdvancedProgram programStartTime: ProgramStartTime """Normal start time for the zone to run""" normalStartTime: DateTime """Scheduled start time, i.e. normal start time offset by the scheduler""" scheduledStartTime: DateTime """Actual run start time as reported by controller""" reportedStartTime: DateTime """Normal end time for the zone to run""" normalEndTime: DateTime """Scheduled end time, i.e. normal end time offset by the scheduler""" scheduledEndTime: DateTime """Actual run end time as reported by controller""" reportedEndTime: DateTime """Normal run duration in seconds""" normalDuration: Int """Scheduled run duration in seconds""" scheduledDuration: Int """Reported run duration in seconds""" reportedDuration: Int """Run status as determined by scheduler""" scheduledStatus: RunStatusType """Run status as reported by controller""" reportedStatus: RunStatusType reportedWaterUsage: LocalizedValueType reportedStopReason: RunStopReasonType reportedCurrent: LocalizedValueType } type StandardProgram implements Program { id: Int! name: String! schedulingMethod(hideProgramName: Boolean = false): SelectedOption! monthlyWateringAdjustments: [Int!]! appliesToZones: [Zone!]! conditionalWateringAdjustments(controllerId: Int!, isContractor: Boolean = false): [WateringProgramAdjustment!]! applications: [StandardProgramApplication!]! startTimes: [Time!]! timeRange: Unit! ignoreRainSensor: Boolean! wateringDays: [String]! @deprecated(reason: "Use daysRun") daysRun: [DaysOfWeekEnum]! standardProgramDayPattern: String! periodicity: StandardProgramPeriodicity } interface Program { id: Int! name: String! schedulingMethod(hideProgramName: Boolean = false): SelectedOption! monthlyWateringAdjustments: [Int!]! appliesToZones: [Zone!]! conditionalWateringAdjustments(controllerId: Int!, isContractor: Boolean = false): [WateringProgramAdjustment!]! } type StandardProgramApplication { zone: Zone! standardProgram: StandardProgram! runTimeGroup: RunTimeGroup! } type RunTimeGroup { id: Int! name: String duration: Int! } type Unit { validFrom: Int validTo: Int } enum DaysOfWeekEnum { SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY } type StandardProgramPeriodicity { period: Int! seriesStart: DateTime! } type AdvancedProgram implements Program { id: Int! name: String! schedulingMethod(hideProgramName: Boolean = false): SelectedOption! monthlyWateringAdjustments: [Int!]! zoneSpecific: Boolean! appliesToZones: [Zone!]! conditionalWateringAdjustments(controllerId: Int!, isContractor: Boolean = false): [WateringProgramAdjustment!]! advancedProgramId: Int! """Defines if the program applies to customer or contractor""" scope: AdvancedProgramScopeEnum! wateringFrequency: ProgramWateringFrequency! runTimeGroup: RunTimeGroup } enum AdvancedProgramScopeEnum { CUSTOMER CONTRACTOR } type ProgramWateringFrequency { label: String! period: WateringPeriodicity! description: String! } type WateringPeriodicity { value: Int label: String } type RunStatusType { value: Int! label: String! } type RunStopReasonType { finishedNormally: Boolean! description: [String!]! } type ZoneStatus { relativeWaterBalance: Int! suspendedUntil: DateTime lastRun: DateTime! nextRun: DateTime! } type ZoneSuspension { id: Int! zone: Zone! startTime: DateTime endTime: DateTime createdCustomer: RestrictedCustomer! createdByContractor: Boolean! } type RestrictedCustomer { id: Int! organization: String user: RestrictedUser } type RestrictedUser { id: Int! name: String! email: String } type ZoneRunSummary { """Weekly zone run summary. Data is accumulated on daily basis""" weekly(startWeek: Int!, endWeek: Int!, year: Int!): ZoneRunSummaryDetails """Monthly zone run summary. Data is accumulated on daily basis""" monthly(startMonth: Int!, endMonth: Int!, year: Int!): ZoneRunSummaryDetails """Annual zone run summary. Data is accumulated on daily basis""" annual(startYear: Int!, endYear: Int!): ZoneRunSummaryDetails """Zone run summary from the start of the week, excluding the current run""" currentWeek: ZoneRunSummaryDetails } type ZoneRunSummaryDetails { """Total normal watering run time in minutes""" totalNormalRunTime: Int """Total actual watering run time in minutes""" totalActualRunTime: Int """Total water volume in litres or gallons""" totalWaterVolume: LocalizedValueType } type SensorStatus { waterFlow: LocalizedValueType active: Boolean } type SensorFlowSummary { """Total water volume in litres or gallons""" totalWaterVolume: LocalizedValueType } type Controller { id: Int! deviceId: Int! name: String wizardComplete: Boolean! hardware: ControllerHardware! boc: Boolean! @deprecated softwareVersion: String connectedGatewayActual: BocGateway bocTopologyDesired: BocTopology bocStatistic: BocStatistic lastContactTime: DateTime lastAction: DateTime inSync: Boolean @deprecated(reason: "Use online status") online: Boolean settings: ControllerSettings location: Location wateringTriggers: WateringTriggers sensors: [Sensor] expanders: [Expander] zones: [Zone] masterZone: MasterValve programMode: ControllerProgramModeEnum! programs(includeZoneSpecific: Boolean! = false): [Program!]! runTimeGroups: [RunTimeGroup!]! permittedProgramStartTimes: [ProgramStartTime] wateringPrograms: [WateringProgram] @deprecated(reason: "Use programs property") weatherStations: [WeatherStation] customer: Customer events(length: Int = 1500, page: Int = 0): [Event] alerts(after: String! = "0"): [Event!]! zoneNumbers: [ZoneNumber] status: ControllerStatus! observationsSummary: ObservationsSummary! reporting(option: Int!, startTime: Int, endTime: Int): Reporting! @deprecated(reason: "Will be deprecated in future releases.") reportTypeGroups: [ReportTypeGroup]! @deprecated(reason: "Will be deprecated in future releases.") reports: Reports! runSummary: ControllerRunSummary! dashboardNotifications(timeZoneId: String!): [DashboardNotification!]! } type ControllerHardware { serialNumber: String version: String status: String installationDate: String model: ControllerModel firmware: [ControllerFirmware] modules: [Module] } type ControllerModel { id: String! family: ControllerFamily name: String! image: String! description: String! dedicatedMasterValve: Boolean! perZoneMasterValveSelectable: Boolean! maxZones: Int! maxZoneExpanders: Int! isBoc: Boolean! @deprecated visible: Boolean! skus: [ControllerSku] advancedModeSupported: Boolean! standardModeSupported: Boolean! dowSupported: Boolean! growInProgramSupported: Boolean! } type ControllerFamily { id: Int! name: String! description: String image: String controllerModels: [ControllerModel] } type ControllerSku { id: Int! sku: String! modelId: String! } type ControllerFirmware { type: String! version: String } type BocStatistic { id: Int! signalStrength: Int battery: Int } type ControllerSettings { offline: ControllerOfflineSettings! zones: ControllerZoneSettings! timeZone: TimeZone! hidePassword: SelectedOption! disableLocalAccess: SelectedOption! hibernateStatus: Boolean } type ControllerOfflineSettings { mode: SelectedOption notificationDelay: SelectedOption notificationUser: RestrictedUser @deprecated(reason: "Use prop notificationUsers instead") notificationUsers: SelectedOption seasonalAdjustments: [Int] } type ControllerZoneSettings { interZoneDelay: Int! masterZone: MasterValve! } type MasterValve { zoneNumber: SelectedOption delay: Int postTimer: Int } type WateringTriggers { id: Int! extendWaterTemperature: LocalizedValueType extendWaterTemperatureEnabled: Boolean! extendWaterTemperaturePercentage: Int! extendWaterHumidity: Int! extendWaterHumidityEnabled: Boolean! suspendWaterWeekRain: LocalizedValueType suspendWaterRainDays: Int! suspendWaterWeekRainEnabled: Boolean! suspendWaterRain: LocalizedValueType suspendWaterRainEnabled: Boolean! suspendWaterTemperature: LocalizedValueType suspendWaterTemperatureEnabled: Boolean! suspendProbabilityOfPrecipitation: Int! suspendProbabilityOfPrecipitationEnabled: Boolean! suspendWind: LocalizedValueType suspendWindEnabled: Boolean! enableEvapotranspirationForecastTemperature: Boolean! enableEvapotranspirationForecastRain: Boolean! reduceWaterTemperatureEnabled: Boolean! reduceWaterTemperature: LocalizedValueType reduceWaterTemperaturePercentage: Int! } type Expander { id: Int! name: String! number: Int! hardware: ExpanderHardware! status: ExpanderStatus! controller: Controller! } type ExpanderHardware { model: ExpanderModel! firmware: [ExpanderFirmware] } type ExpanderModel { id: String! } type ExpanderFirmware { type: String! version: Float bank: Int } type ExpanderStatus { lastSeen: String lastNotified: String } enum ControllerProgramModeEnum { ADVANCED STANDARD } type ZoneNumber { value: Int label: String } type ControllerStatus { summary: String! icon: String! online: Boolean! accumulatedWaterSavings: Int! actualWaterTime: ActualWaterTime normalWaterTime: NormalWaterTime lastContact: DateTime } type ActualWaterTime { value: Int label: String } type NormalWaterTime { value: Int label: String } type ObservationsSummary { """Max temperature since midnight""" maxTemperatureSinceMidnight: LocalizedValueType """Max temperature since midnight""" currentTemperature: LocalizedValueType """Recorded rainfall for the last 24 hours""" rainfallLast24Hours: LocalizedValueType """Recorded rainfall for the last 7 × 24 hours""" rainfallLast168hours: LocalizedValueType } type Reporting { calendarType(type: ReportCalendarCategoryEnum!): [ReportCalendar]! chartType(type: ReportChartCategoryEnum!): ChartReport! wateringSchedules: [ReportCalendar]! wateringHistory: [ReportCalendar]! weatherForecast: ChartReport! stationTemperature: ChartReport! stationRainfall: ChartReport! stationWindGust: ChartReport! evapotranspiration: ChartReport! waterSaving: ChartReport! flowMeterMeasurement: ChartReport! totalWaterUsage: ChartReport! flowRate: ChartReport! sensorLevel: ChartReport! smartWaterBalance: ChartReport! virtualSolarSync: ChartReport! latePollType: ChartReport! solenoidLoadType: ChartReport! mqttConnType: ChartReport! latePollSummary: ChartReport! scheduleUpdates: ChartReport! observationUpdate: ChartReport! dailyCustomers: ChartReport! dailyAverageObservations: ChartReport! dailyRunTimes: ChartReport! dailyScheduleUpdatePerformance: ChartReport! hourlyScheduleUpdatePerformance: ChartReport! queueSize: ChartReport! monthlyEvapotranspiration: ChartReport! monthlyTemperatureRainfall: ChartReport! waterUsage: TableReport! upcomingWatering: TableReport! } enum ReportCalendarCategoryEnum { WATERING_SCHEDULE_TYPE WATERING_HISTORY_TYPE } scalar ReportCalendar enum ReportChartCategoryEnum { WEATHER_FORECAST_TYPE STATION_TEMPERATURE_TYPE STATION_RAINFALL_TYPE STATION_WIND_GUST_TYPE EVAPOTRANSPIRATION_TYPE WATERING_SAVING_TYPE FLOW_METER_MEASUREMENT_TYPE TOTAL_WATER_USAGE_TYPE FLOW_RATE_TYPE SENSOR_LEVEL_TYPE SMART_WATER_BALANCE_TYPE VIRTUAL_SOLAR_SYNC_TYPE LATE_POLL_TYPE SOLENOID_LOAD_TYPE MQTT_CONN_TYPE LATE_POLL_SUMMARY SCHEDULE_UPDATES OBSERVATION_UPDATE DAILY_CUSTOMERS DAILY_AVERAGE_OBSERVATIONS DAILY_RUN_TIMES DAILY_SCHEDULE_UPDATE_PERFORMANCE HOURLY_SCHEDULE_UPDATE_PERFORMANCE QUEUE_SIZE MONTHLY_EVAPOTRANSPIRATION MONTHLY_TEMPERATURE_RAINFALL } type ChartReport { statistics: ChartStatistics! title: GeneralJson subtitle: GeneralJson results: [GeneralJson]! xaxisArray: GeneralJson! yaxisArray: [GeneralJson] xmin: Float! xmax: Float! ymin: Int yaxis: String message: String } scalar ChartStatistics scalar GeneralJson type TableReport { header: [String] row: [[String]] message: String } type ReportTypeGroup { label: String! name: String! nameKey: String! types: [ReportCategory]! } type ReportCategory { token: String! label: String! format: ReportFormatEnum! tokenKey: String! } enum ReportFormatEnum { CALENDAR_FORMAT CHART_FORMAT TABLE_FORMAT } type Reports { overviews: ReportOverview watering(from: Int!, until: Int!): [WateringReportEntry!]! } type ReportOverview { periodSummary(year: Int!, period: ReportingPeriodEnum!, periodNumber: Int): ReportPeriodSummary comparison: WaterUsageComparison! } enum ReportingPeriodEnum { WEEK MONTH QUARTER YEAR } type ReportPeriodSummary { summary: String! sections: [Section] details: Details } type Section { key: String! header: String! subHeader: String! deprecationReason: String } type Details { waterSavingSummary: WaterSavingSummary! topWateringZones: TopWateringZonesOverview! waterSchedulePerformance: WaterSchedulePerformance } type WaterSavingSummary { normalDuration: Int! scheduledDuration: Int! } type TopWateringZonesOverview { zones: [WateringZone] @deprecated byVolume: TopWateringZones! byDuration: TopWateringZones! } type WateringZone { zone: Zone! facet: String! scheduledDuration: Int! reportedDuration: Int! reportedWaterUsage: LocalizedValueType } type TopWateringZones { zones: [WateringZone] } type WaterSchedulePerformance { topTriggerSummary: String! triggers: [Trigger] } type Trigger { status: RunStatusType! count: Int! normalDuration: Int! scheduledDuration: Int! } type WaterUsageComparison { annualWaterUsageComparison(year: Int!): DatasetsReportOverview monthlyWaterUsageComparison(year: Int!, month: Int!): DatasetsReportOverview } type DatasetsReportOverview { summary: String! @deprecated datasets: [Datasets] @deprecated byDuration: DatasetsReport! byVolume: DatasetsReport } type Datasets { title: String! facet: String! summary: String! categories: [String] values: [DataArray] } type DataArray { title: String! values: [Float] } type DatasetsReport { datasets: [Datasets] } type WateringReportEntry { runEvent: RunEventType } type ControllerRunSummary { """Weekly controller run summary. Data is accumulated on daily basis""" weekly(startWeek: Int!, endWeek: Int!, year: Int!): ControllerRunSummaryDetails """Monthly controller run summary. Data is accumulated on daily basis""" monthly(startMonth: Int!, endMonth: Int!, year: Int!): ControllerRunSummaryDetails """Annual controller run summary. Data is accumulated on daily basis""" annual(startYear: Int!, endYear: Int!): ControllerRunSummaryDetails } type ControllerRunSummaryDetails { """Total normal watering run time in minutes""" totalNormalRunTime: Int """Total actual watering run time in minutes""" totalActualRunTime: Int } type DashboardNotification { key: DashboardNotificationKeyEnum! message: String! callToAction: String priority: Int! policy: DashboardNotificationPolicyEnum! obsoleteAfter: DateTime } enum DashboardNotificationKeyEnum { MISSING_SERIAL_NUMBER PLAN_NEAR_EXPIRY PLAN_NEAR_LIMIT_ON_CONTROLLERS CONTROLLER_OFFLINE CONTROLLER_HIBERNATED UNREAD_MESSAGES_FROM_CONTRACTOR UNREAD_MESSAGES_FROM_CLIENTS CONTROLLER_ONLINE WATER_USAGE WEATHER_STATION_OFFLINE WIZARD_NOT_COMPLETED RAIN_SENSOR_STOPPED_IRRIGATION PLANNED_MAINTENANCE MANUAL_RUN ALL_ZONES_SUSPENDED SERVER_ERROR ALERTS_COUNT } enum DashboardNotificationPolicyEnum { DISMISSIBLE DISMISSIBLE_FOR_A_DAY DISMISSIBLE_FOR_A_WEEK NON_DISMISSIBLE } type BocRepeater { id: Int! deviceId: Int! name: String serialNumber: String status: String lastContactTime: DateTime inSync: Boolean @deprecated(reason: "Use online status") online: Boolean firmware: BocRepeaterStatistics location: Location timeZone: TimeZone! connectedGatewayActual: BocGateway bocTopologyDesired: BocTopology bocStatistic: BocStatistic } type BocRepeaterStatistics { version: String! } type Plan { name: String! freeWeatherStationsQuantity: Int! weatherStationsQuantity: Int! smsQuantity: Int! controllerQuantity: Int! fileLimit: Int! contractor: Boolean! boc: Boolean! cost: Cost } type Cost { defaultValue: Int! us: Int! au: Int! eu: Int! ca: Int! uk: Int! } type AvailablePlan { planId: Int! name: String! quantity: Int! length: Int! } type CustomerStatistics { imageUsage: Int! fileUsage: Int! totalUsage: Int! smsUsed: Int! controllerUsed: Int! numberOfZoneSuspensions: Int! } type Alert { id: Int! name: String! unitOfMeasurement: Int value: Float phoneNumber: String alertType: AlertType notificationUser: User applications: [AlertApplication] sendAppNotification: Boolean isContractorLevel: Boolean addToEventLog: Boolean valveShutoffActive: Boolean! valveShutoffValue: Int sendEmailActive: Boolean! emailNotificationUser: User } type AlertType { id: Int! conditionId: Int triggerId: Int caption: String! category: String! groupKey: String unitsOfMeasurement: [String] valueRequired: Boolean description: String! actions: [AlertTypeAction] } type AlertTypeAction { id: Int! value: String! description: String } type AlertApplication { contractorOwned: Boolean! customer: Customer controller: Controller sensor: Sensor } type CustomerReport { id: Int! name: String! instruction: String type: CustomerReportTypes! frequency: CustomerReportTypesFrequency! customerId: Int! applyToAllCustomer: Boolean! sendEmail: Boolean! sendAppNotification: Boolean! applications: [CustomerReportApplication] } type CustomerReportTypes { id: Int! name: String! frequency: [CustomerReportTypesFrequency] } type CustomerReportTypesFrequency { id: Int! value: String! } type CustomerReportApplication { customer: Customer } type PublicContractorProfile { id: Int customerId: Int! avatar: String business: String coordinates: GeoCoordinates location: String contact: String email: String name: String phoneLocalNumber: String phoneCountryCode: String description: String website: String highestPlan: PublicCustomerPlan! } type PublicCustomerPlan { id: Int! name: String! } type Notification { type: NotificationTypeEnum! header: String content: String! version: String! displayMode: String! } enum NotificationTypeEnum { GENERIC CONTRACTOR_INFO } type UnitsSummary { id: Int! unitsName: String! temperatureUnit: String rainUnit: String temperatureMax: String! temperatureMin: String! rainMax: String! rainMin: String! rainMaxWeek: String! windMin: String! windMax: String! windUnit: String! sensorUnit: String! longUnit: String! } type MessageApp { conversations: [Conversation]! conversation(id: Int!): Conversation! } type Conversation { id: Int! type: String! participants: [PublicUser]! precedingMessages(offset: Int!): [Message]! lastMessages: [Message]! followingMessages(offset: Int!): [Message]! lastMessage: Message } type PublicUser { id: Int! customerId: Int! name: String! userAvatar: File } type Message { id: Int! authorParticipantId: Int! created: Int! content: String! shortContent: String! messageStateId: Int! read: Boolean! authorDetails: User! conversationId: Int! } type NativeApp { url: String } type Configuration { units: [UnitsSummary] timeZones: [String] model(name: String!): ControllerModel plans: [PlanWithFeatures]! weatherSources: [WeatherSource] sensorInputs(hardware: String = ""): [SensorInput] controllerFamilies: [ControllerFamily] sensorCategories: [SensorModelCategory] alertTypes: [AlertType] customerReportTypes: [CustomerReportTypes] zoneIcons: [ZoneIcon] customSensorTypes: [CustomSensorTypeOptions] wateringProgramTypes: [WateringScheduleRunType] wateringProgramAdjustmentOptions: [WateringProgramAdjustmentOption] @deprecated(reason: "Use controllerWateringProgramAdjustments") controllerWateringProgramAdjustments(controllerId: Int!, isContractor: Boolean = false): [WateringProgramAdjustment] supportedFeatures(module: String!, version: String!): [BluetoothFeaturesEnum] locales: [LocaleOption] } type PlanWithFeatures { id: Int! contractor: Boolean! name: String! cost: Cost price: Price! features: [String]! } type Price { amount: Int! label: String! } type WeatherSource { id: Int! title: String! description: String! style: String } type CustomSensorTypeOptions { value: String label: String } type WateringScheduleRunType { value: Int label: String } type WateringProgramAdjustmentOption { value: Int label: String } enum BluetoothFeaturesEnum { BluetoothX2Provision BluetoothRemoteControl BluetoothScheduleTransfer BluetoothDiagnostics } type LocaleOption { value: String label: String } type ConfigurationUploadStatus { id: String! serialNumber: String! sentEpoch: Int! receivedEpoch: Int! status: Int! programs: String! } type Mutation { acknowledgeEvent(eventId: String!, controllerId: Int!): Boolean acknowledgeAllEvents(controllerId: Int!): Boolean updateLocation(deviceId: Int!, address: String!): Location updateLocationCoordinates(deviceId: Int!, latitude: Float!, longitude: Float!): Location updateSeasonalAdjustments(controllerId: Int!, factors: [Int]!): Boolean updateControllerWatchList(controllerIds: [Int]!, customerId: Int!): Boolean createExpander(controllerId: Int!, name: String!, number: Int!): Expander updateExpander(expanderId: Int!, name: String!, number: Int!): Expander deleteExpander(expanderId: Int!): Boolean createSensor(controllerId: Int!, name: String!, modelId: Int!, inputNumber: Int!, zoneIds: [Int]!): Sensor updateSensor(sensorId: Int!, controllerId: Int!, name: String!, modelId: Int!, inputNumber: Int!, zoneIds: [Int]): Sensor deleteSensor(sensorId: Int!): Boolean createCustomSensorType(customerId: Int!, name: String!, customSensorType: CustomSensorTypeEnum!, modeType: CustomSensorModeTypeEnum!, delay: Int, offTimer: Int, flowSensorRate: Float): SensorModel updateCustomSensorType(customSensorTypeId: Int!, customerId: Int!, controllerId: Int!, name: String!, customSensorType: CustomSensorTypeEnum!, modeType: CustomSensorModeTypeEnum!, delay: Int, offTimer: Int, flowSensorRate: Float): SensorModel deleteCustomSensorType(id: Int!): Int clearAllEventLogs(controllerId: Int!): Boolean clearReports(controllerId: Int!): Boolean addWeatherStation(controllerId: Int!, weatherStationId: Int!): Boolean addVirtualWeatherStation(controllerId: Int!): Boolean! removeWeatherStation(controllerId: Int!, weatherStationId: Int!): Boolean removeAllWeatherStations(controllerId: Int!): Boolean createAlert(controllerId: Int!, name: String!, alertTypeId: Int!, alertUnitId: Int, value: Int!, customers: [Int], controllers: [Int], sensors: [Int], addToEventLog: Boolean!, sendAppNotification: Boolean!, notificationUserId: Int, phoneNumber: String, valveShutoffActive: Boolean, valveShutoffValue: Int, sendEmailActive: Boolean, emailNotificationUserId: Int, applyToAll: Boolean!, isContractorLevel: Boolean!): Alert @deprecated(reason: "Use CreateNewAlertMutation instead") updateAlert(alertId: Int!, controllerId: Int!, name: String!, alertTypeId: Int!, alertUnitId: Int, value: Int!, customers: [Int], controllers: [Int], sensors: [Int], addToEventLog: Boolean!, sendAppNotification: Boolean!, notificationUserId: Int, phoneNumber: String, valveShutoffActive: Boolean, valveShutoffValue: Int, sendEmailActive: Boolean, emailNotificationUserId: Int, applyToAll: Boolean!, isContractorLevel: Boolean!): Alert createNewAlert(controllerId: Int!, name: String!, alertTypeId: Int!, alertUnitId: Int, value: Float!, customers: [Int], controllers: [Int], sensors: [Int], addToEventLog: Boolean!, sendAppNotification: Boolean!, notificationUserId: Int, phoneNumber: String, valveShutoffActive: Boolean, valveShutoffValue: Int, sendEmailActive: Boolean, emailNotificationUserId: Int, applyToAll: Boolean!, isContractorLevel: Boolean!): Alert updateNewAlert(alertId: Int!, controllerId: Int!, name: String!, alertTypeId: Int!, alertUnitId: Int, value: Float!, customers: [Int], controllers: [Int], sensors: [Int], addToEventLog: Boolean!, sendAppNotification: Boolean!, notificationUserId: Int, phoneNumber: String, valveShutoffActive: Boolean, valveShutoffValue: Int, sendEmailActive: Boolean, emailNotificationUserId: Int, applyToAll: Boolean!, isContractorLevel: Boolean!): Alert deleteAlert(alertId: Int!): Boolean createCustomerReport(customerId: Int!, name: String!, instruction: String, typeId: Int!, frequencyId: Int!, applyToAllCustomer: Boolean!, customers: [Int], sendEmail: Boolean!, sendAppNotification: Boolean!): CustomerReport updateCustomerReport(customerReportId: Int!, customerId: Int!, name: String!, instruction: String, typeId: Int!, frequencyId: Int!, applyToAllCustomer: Boolean!, customers: [Int], sendEmail: Boolean!, sendAppNotification: Boolean!): CustomerReport deleteCustomerReport(customerReportId: Int!): Int! createZone(controllerId: Int!, icon: Int, name: String!, number: Int!, wateringMode: Int!, globalMasterValve: Int!, scheduleAdjustmentIds: [Int]!, wateringAdjustment: Int!, wateringType: Int!, runTime: Int, wateringFrequencyMode: Int!, fixedWateringFrequency: Int, smartWateringFrequency: Int, virtualSolarSyncWateringFrequency: Int, runNextAvailableStartTime: Int, preConfiguredWateringScheduleId: Int, cycleSoakEnable: Int, cycleCustomTime: Int, soakCustomTime: Int, factors: [Int], sensorIds: [Int], reusableSchedule: Boolean, reusableScheduleName: String): Zone updateZone(zoneId: Int!, icon: Int, iconFileId: Int, name: String!, number: Int!, wateringMode: Int!, globalMasterValve: Int!, scheduleAdjustmentIds: [Int]!, wateringAdjustment: Int!, wateringType: Int!, runTime: Int, wateringFrequencyMode: Int!, fixedWateringFrequency: Int, smartWateringFrequency: Int, virtualSolarSyncWateringFrequency: Int, runNextAvailableStartTime: Int, preConfiguredWateringScheduleId: Int, cycleSoakEnable: Int, cycleCustomTime: Int, soakCustomTime: Int, factors: [Int], sensorIds: [Int], reusableSchedule: Boolean, reusableScheduleName: String): Zone createZoneStandard(controllerId: Int!, icon: Int, name: String!, number: Int!, globalMasterValve: Int!, wateringAdjustment: Int!, cycleSoakEnable: Boolean!, cycleCustomTime: Int, soakCustomTime: Int, sensorIds: [Int]): Zone updateZoneStandard(zoneId: Int!, icon: Int, iconFileId: Int, name: String!, number: Int!, globalMasterValve: Int!, wateringAdjustment: Int!, cycleSoakEnable: Boolean!, cycleCustomTime: Int, soakCustomTime: Int, sensorIds: [Int]): Zone deleteZone(zoneId: Int!): Boolean updateMasterValve(zoneNumber: Int!, controllerId: Int): MasterValve @deprecated(reason: "Use UpdateControllerMasterValve") updateControllerMasterValve(zoneNumber: Int!, controllerId: Int!): MasterValve removeZoneImage(imageId: Int!): Boolean cancelAllControllerRuns: String cancelAllZoneRuns: String cancelRunsForZone(zoneId: Int!): StatusCodeAndSummary! startAllZones(controllerId: Int!, markRunAsScheduled: Boolean = false, customRunDuration: Int): StatusCodeAndSummary! startSelectedZones(zoneIds: [Int!]!, runDurations: [Int!]!, markRunAsScheduled: Boolean = false, stackRuns: Boolean = false): StatusCodeAndSummary! deleteAccount(password: String): DeleteAccountResult! startZones(zoneIds: [Int]!, markRunAsScheduled: Boolean = false, customRunDuration: Int): StatusCodeAndSummary! startZone(zoneId: Int!, markRunAsScheduled: Boolean = false, stackRuns: Boolean, customRunDuration: Int): StatusCodeAndSummary! stopAllZones(controllerId: Int!): StatusCodeAndSummary! stopZone(zoneId: Int!): StatusCodeAndSummary! startZonesWithProgramStartTime(programStartTimeId: Int!, markRunAsScheduled: Boolean!, customDuration: Int): StatusCodeAndSummary! startZonesWithProgram(programId: Int!, markRunAsScheduled: Boolean!, customDuration: Int): StatusCodeAndSummary! createController(customerId: Int!, controllerName: String!, controllerModel: String, serialNumber: String, address: String, isContractorLevel: Boolean!, parentDeviceId: Int): Controller deleteController(deviceId: Int!): Int assignPlanCodeToCustomer(customerId: Int!, upgradeKey: String!): StatusCodeAndSummary! hibernateController(controllerId: Int!): Boolean wakeController(controllerId: Int!): Boolean updateSerialNumber(serialNumber: String!, deviceId: Int!, deviceType: DeviceTypeEnum!): StatusCodeAndSummary! contractorAddCustomer(organizationName: String, userName: String, userEmail: String, userType: ContractorCustomerUserTypeEnum!, notifyUserId: Int!, sendEmail: Boolean!, controllerAddMethod: ControllerAddMethodEnum!, targetControllerId: Int, contractorCustomerId: Int!): Customer! setCurrentController(controllerId: Int!): Controller assignSerialNumber(controllerId: Int, serialNumber: String!, deviceId: Int, deviceType: DeviceTypeEnum): StatusCodeAndSummary! removeSerialNumber(controllerId: Int, deviceId: Int, deviceType: DeviceTypeEnum): StatusCodeAndSummary! updateControllerProgramMode(controllerId: Int!, programMode: ControllerProgramModeEnum): Controller moveCustomerDevice(deviceId: Int!, customerId: Int!): StatusCodeAndSummary! createGateway(customerId: Int!, name: String!, serialNumber: String, address: String): BocGateway @deprecated updateGateway(customerId: Int!, deviceId: Int!, name: String!, serialNumber: String, address: String!, siteId: Int!, rfChannel: Int!, snrThreshold: Int!, retries: Int!, sensorId: Int, sensorType: Int, zoneIds: [Int]): BocGateway @deprecated deleteGateway(deviceId: Int!): Int @deprecated createRepeater(customerId: Int!, name: String!, serialNumber: String, address: String, parentDeviceId: Int!): BocRepeater @deprecated updateRepeater(customerId: Int!, deviceId: Int!, name: String!, serialNumber: String, address: String!, parentDeviceId: Int!): BocRepeater @deprecated deleteRepeater(deviceId: Int!): Int @deprecated addBocTopology(customerId: Int!, childDeviceId: Int!, parentDeviceId: Int!): Boolean @deprecated removeBocTopology(customerId: Int!, childDeviceId: Int!): Boolean @deprecated refreshBocStatus(controllerId: Int!): StatusCodeAndSummary! @deprecated rescanNode(deviceId: Int!): StatusCodeAndSummary! @deprecated updateFile(id: Int!, fileName: String!): File deleteFile(id: Int!): Int createUser(name: String!, email: String, userType: UserTypeEnum, customerId: Int, currentControllerId: Int): User updateUserType(userId: Int!, userType: UserTypeEnum!): User deleteUser(userId: Int!): Int updateUserAndUserSettings(userId: Int!, name: String!, email: String!, unitId: Int!): User updateUserAndUserType(userId: Int!, name: String!, email: String, userType: UserTypeEnum!): User unlinkCustomer(customerId: Int!, isPendingCustomer: Boolean = false): Int removeContractor: Boolean! checkExistingCustomer(emailOrSerialNumber: String!, customerId: Int!): StatusCodeWithEmailAndSerialNumber requestLinkCustomer(emailOrSerialNumber: String!, contractorCustomerId: Int!): StatusCodeAndSummary! createCustomer(name: String!, email: String, userType: UserTypeEnum!, notifyUserId: Int, sendEmail: Boolean!, contractorCustomerId: Int!): Customer! sendActivationEmail(email: String!): StatusCodeAndSummary! initialisePassword(email: String!, key: String!, password: String!): StatusCodeAndSummary! loginAs(key: String!, email: String!): StatusCodeAndSummary! updateTandcVersion(email: String!, tandcVersion: Int!): StatusCodeAndSummary! resetPassword(email: String!): StatusCodeAndSummary! updatePassword(oldPassword: String!, newPassword: String!): StatusCodeAndSummary! updateWateringTriggers(extendWaterTemperature: Float!, extendWaterTemperatureEnabled: Boolean!, extendWaterTemperaturePercentage: Int!, extendWaterHumidity: Int!, extendWaterHumidityEnabled: Boolean!, suspendWaterWeekRain: Float!, suspendWaterRainDays: Int!, suspendWaterWeekRainEnabled: Boolean!, suspendWaterRain: Float!, suspendWaterRainEnabled: Boolean!, suspendWaterTemperature: Float!, suspendWaterTemperatureEnabled: Boolean!, suspendProbabilityOfPrecipitation: Int!, suspendProbabilityOfPrecipitationEnabled: Boolean!, suspendWind: Float!, suspendWindEnabled: Boolean!, enableEvapotranspirationForecastTemperature: Boolean!, enableEvapotranspirationForecastRain: Boolean!, reduceWaterTemperatureEnabled: Boolean!, reduceWaterTemperaturePercentage: Int!, reduceWaterTemperature: Float!, controllerId: Int, contractorId: Int, isContractor: Boolean!): WateringTriggers applyContractorWateringTriggersSettings(contractorId: Int!, controllers: [Int] = [], applyAll: Boolean!): Boolean! createProgramStartTime(contractorId: Int, isContractor: Boolean!, controllerId: Int, applyAll: Boolean!, zones: [Int], schedules: [Int], time: String!, wateringType: Int!, timeType: String!, sunday: Int!, monday: Int!, tuesday: Int!, wednesday: Int!, thursday: Int!, friday: Int!, saturday: Int!): ProgramStartTime updateProgramStartTime(id: Int!, contractorId: Int, isContractor: Boolean!, controllerId: Int, applyAll: Boolean!, zones: [Int], schedules: [Int], time: String!, wateringType: Int!, timeType: String!, sunday: Int!, monday: Int!, tuesday: Int!, wednesday: Int!, thursday: Int!, friday: Int!, saturday: Int!): ProgramStartTime deleteProgramStartTime(id: Int!, controllerId: Int, isContractor: Boolean!): Int createStandardProgram(controllerId: Int!, name: String!, programType: Int!, dayPattern: String!, standardProgramDayPattern: StandardProgramDayPatternEnum, interval: Int, seriesStart: Int, startTimes: [String]!, zoneRunTimes: [ZoneRunTime!]!, scheduleAdjustmentIds: [Int]!, seasonalAdjustmentFactors: [Int]!, validFrom: Int, validTo: Int, ignoreRainSensor: Boolean): StandardProgram updateStandardProgram(programId: Int!, controllerId: Int!, name: String!, programType: Int!, dayPattern: String!, standardProgramDayPattern: StandardProgramDayPatternEnum, interval: Int, seriesStart: Int, startTimes: [String]!, zoneRunTimes: [ZoneRunTime!]!, scheduleAdjustmentIds: [Int]!, seasonalAdjustmentFactors: [Int]!, validFrom: Int, validTo: Int, ignoreRainSensor: Boolean): StandardProgram deleteStandardProgram(programId: Int!, controllerId: Int!): Int applyContractorProgramStartTime(contractorId: Int!, controllers: [Int], applyAll: Boolean!): Boolean! selectLocale(locale: String!): Boolean! createTimeBasedWateringProgram(wateringProgramName: String!, wateringProgramType: Int, fixedWateringRunTime: Int!, fixedWateringFrequencyMode: Int!, fixedWateringFrequencyValue: Int, wateringProgramAdjustment: Int, scheduleAdjustmentIds: [Int], controllerId: Int!, seasonalAdjustment: [Int]): WateringProgram! createSmartBasedWateringProgram(wateringProgramName: String!, smartWateringRunTime: Int!, smartWateringFrequencyValue: Int!, wateringProgramType: Int = 0, controllerId: Int!, seasonalAdjustment: [Int], scheduleAdjustmentIds: [Int]): WateringProgram! createVirtualSolarSyncWateringProgram(wateringProgramName: String!, wateringProgramType: Int, virtualSolarSyncWateringRunTime: Int!, virtualSolarSyncWateringFrequencyMode: Int!, virtualSolarSyncWateringFrequencyValue: Int, controllerId: Int!, scheduleAdjustmentIds: [Int]!, seasonalAdjustment: [Int]): WateringProgram! updateTimeBasedWateringProgram(wateringProgramId: Int!, wateringProgramName: String!, wateringProgramType: Int, fixedWateringRunTime: Int!, fixedWateringFrequencyMode: Int!, fixedWateringFrequencyValue: Int, wateringProgramAdjustment: Int, scheduleAdjustmentIds: [Int], controllerId: Int!, seasonalAdjustment: [Int]): WateringProgram! updateSmartBasedWateringProgram(wateringProgramId: Int!, wateringProgramName: String!, wateringProgramType: Int, smartWateringRunTime: Int!, smartWateringFrequencyValue: Int!, controllerId: Int!, seasonalAdjustment: [Int], scheduleAdjustmentIds: [Int]): WateringProgram! updateVirtualSolarSyncWateringProgram(wateringProgramId: Int!, wateringProgramName: String!, wateringProgramType: Int, virtualSolarSyncWateringRunTime: Int!, virtualSolarSyncWateringFrequencyMode: Int!, virtualSolarSyncWateringFrequencyValue: Int, controllerId: Int!, scheduleAdjustmentIds: [Int]!, seasonalAdjustment: [Int]): WateringProgram! removeWateringProgram(wateringProgramId: Int!): Int! updateCustomerOrganization(customerId: Int!, organization: String!): Customer appointNotificationUser(userId: Int!): Customer createApiKey: StatusCodeAndSummary! registerDevice(uuid: String = "", deviceType: Int!, token: String = "", manufacturer: String = "", serial: String = "", model: String = "", nativeVersion: String = ""): Boolean createOrUpdateUserDeviceWithTokenAndAppVersions(uuid: String!, nativeVersion: String!, codePushVersion: String, deviceToken: String): UserDevice registerFreePlan(planId: Int!, customerId: Int!): CustomerPlan! upgradePlanCode(customerId: Int!, upgradeCode: String!): CustomerPlan! removeUserThumbnail(userId: Int!): Boolean removeCustomerThumbnail(customerId: Int!): Boolean sendChatMessageToSpecificUsers(conversationId: Int, conversationType: String!, toUserIds: [Int]!, message: String!): Message sendChatMessageToAllUsers(conversationId: Int, message: String!): Message deleteConversation(conversationId: Int!): Boolean markMessagesAsRead(conversationId: Int!, messageIds: [Int]!): Boolean suspendAllZones(controllerId: Int!, until: String!): StatusCodeAndSummary! suspendZone(zoneId: Int!, until: String!): StatusCodeAndSummary! resumeAllZones(controllerId: Int!): StatusCodeAndSummary! resumeZone(zoneId: Int!): StatusCodeAndSummary! createZoneSuspensions(zoneIds: [Int]!, startTime: Int, endTime: Int!): [Zone]! createZoneSuspensionsByControllers(controllerIds: [Int]!, startTime: Int, endTime: Int!): StatusCodeAndSummary! createZoneSuspensionsByCustomers(customerIds: [Int]!, startTime: Int, endTime: Int!): StatusCodeAndSummary! deleteZoneSuspension(id: Int!): Boolean! deleteZoneSuspensions(zoneSuspensionIds: [Int]!): Boolean! resumeZones(zoneIds: [Int]!): Boolean! resumeZonesByControllers(controllerIds: [Int]!, resumeForOtherCustomers: Boolean = false): StatusCodeAndSummary! resumeZonesByCustomers(customerIds: [Int]!, resumeForOtherCustomers: Boolean = false): StatusCodeAndSummary! updateZoneSpecificSeasonalAdjustment(zoneId: Int!, factors: [Int]): Zone @deprecated(reason: "Use UpdateZoneMutation") removeZoneSpecificSeasonalAdjustment(zoneId: Int!): Boolean! @deprecated(reason: "Use DeleteZoneMutation") updateProgramSpecificSeasonalAdjustment(wateringProgramId: Int!, factors: [Int]): Boolean! @deprecated(reason: "Use UpdateProgramStartTimeMutation") removeProgramSpecificSeasonalAdjustment(wateringProgramId: Int!): Boolean! @deprecated(reason: "Use DeleteProgramStartTimeMutation") sendAppNotification(userId: Int!, message: String!): StatusCodeAndSummary sendTestSmsNotification(mobileNumber: String!, controllerId: Int!): Boolean! createJobSheet(controllerId: Int!, number: String!, action: String!, emails: [String]!, instruction: String!, includeZoneDetails: Boolean!, includeZonePictures: Boolean!, includeAlerts: Boolean!, attachFiles: Boolean!): JobSheet assignAvailablePlan(planId: Int!, planLength: Int!, customerId: Int!, contractorCustomerId: Int!): CustomerPlan linkCustomerToContractor(contractorCustomerId: Int!, customerId: Int!): Boolean addOrUpdateContractorDetails(customerId: Int!, business: String!, website: String!, description: String!, contact: String, location: String!, name: String, email: String, phoneLocalNumber: String, phoneCountryCode: String, online: Boolean!): Boolean updateControllerModel(controllerId: Int!, value: String!): Boolean updateControllerName(controllerId: Int!, value: String!): Boolean updateControllerOffline(controllerId: Int!, value: Int!): Boolean updateControllerHidePassword(controllerId: Int!, value: Int!): Boolean updateControllerTimeZone(controllerId: Int!, value: String!): Boolean updateControllerZoneDelay(controllerId: Int!, value: Int!): Boolean updateControllerMasterDelay(controllerId: Int!, value: Int!): Boolean updateControllerWizardComplete(controllerId: Int!, value: Boolean!): Boolean notifyEmailLinkedAccount(serialNumber: String!): StatusCodeAndSummary! updateControllerNotifyUser(controllerId: Int!, value: Int): Boolean updateControllerNotifyOffline(controllerId: Int!, value: Int): Boolean updateControllerUnit(controllerId: Int!, value: Int!): Boolean updateControllerDisableAccess(controllerId: Int!, value: Int): Boolean uploadControllerConfiguration(controllerId: Int!): Int updateConfigurationUploadStatus(controllerId: Int!, transactionId: Int!, operation: Int!): Int } type StatusCodeAndSummary { status: StatusCodeEnum! summary: String! } enum StatusCodeEnum { OK WARNING ERROR } type DeleteAccountResult { result: DeleteAccountResultEnum! message: String! } enum DeleteAccountResultEnum { deleted deletion_pending } enum DeviceTypeEnum { controller } enum ContractorCustomerUserTypeEnum { READ_WRITE READ_ONLY } enum ControllerAddMethodEnum { NO_CONFIGURATION COPY_FROM_OTHER_CONTROLLER MOVE_FROM_MY_ACCOUNT } type StatusCodeWithEmailAndSerialNumber { status: StatusCodeEnum! message: String! validEmail: Boolean! validSerialNumber: Boolean! } enum StandardProgramDayPatternEnum { dow even odd interval } input ZoneRunTime { zoneNumber: Int! runTimeGroupId: Int runDuration: Int } type UserDevice { id: Int! nativeVersion: String codePushVersion: String """ Device token is from cordova PushNotification plugin. We can only get the token if and only if the user allow to receive notification in their device """ deviceToken: String } type JobSheet { fileName: String! downloadUrl: String! } type AdvancedWateringSettings implements WateringSettings { fixedWateringAdjustment: Int! cycleAndSoakSettings: CycleAndSoakSettings advancedProgram: AdvancedProgram! wateringProgram: WateringProgram! @deprecated(reason: "Use either advancedProgram or standardProgramApplications") wateringAdjustment: Int! @deprecated(reason: "Use fixedWateringAdjustment property") programStartTimes: [ProgramStartTime!]! } type StandardWateringSettings implements WateringSettings { fixedWateringAdjustment: Int! cycleAndSoakSettings: CycleAndSoakSettings standardProgramApplications: [StandardProgramApplication!]! wateringProgram: WateringProgram! @deprecated(reason: "Use either advancedProgram or standardProgramApplications") wateringAdjustment: Int! @deprecated(reason: "Use fixedWateringAdjustment property") defaultRunDuration(currentTime: Int): Int! }