ReleaseResponseBodyDto
releaseDescriptionRelease Description for current release page
assetKeyS3 object key for the release media asset
assetTypeType of media asset (image or video)
assetUrlUrl to access the media asset
ctaLabelOptional call-to-action button label
ctaUrlOptional call-to-action URL. Use {systemId} as a placeholder for the active system.
ctaIsExternalWhether the CTA link should open in a new tab (external) or navigate within the app.
ReleaseResponseDto
_idUnique identifier for the release
releaseTitleRelease Title for current global operation
Array of objects containing respective descriptions and media for the release.
ReleaseBodyDto
releaseDescriptionRelease description for current release page
fileexistingAssetKeyExisting S3 object key for the release media asset
ctaLabelOptional call-to-action button label
ctaUrlOptional call-to-action URL. Use {systemId} as a placeholder for the active system.
ctaIsExternalWhether the CTA link should open in a new tab (external) or navigate within the app.
ReleaseDto
releaseTitleRelease Title for current global operation
Array of objects containing respective descriptions and media for the release.
CreateManufacturerApiKeyDto
labelHuman-readable label for this key
ManufacturerApiKeyCreatedResponseDto
_idlabelkeyPrefixFirst 8 chars of the key (for identification only)
enabledcreatedAtupdatedAtkeyFull API key — shown once only, store it securely
ManufacturerApiKeyResponseDto
_idlabelkeyPrefixFirst 8 chars of the key (for identification only)
enabledcreatedAtupdatedAtDeviceType
Type of device (PLUG, MCB, etc.)
UsageHistoryHour
_idPrimary ID of the UsageHistoryHour
hourNo. What Hour (E.g. 7 means 0700 - 0800)
onStatusStatus of the Plug (ON / OFF)
deviceTypeType of device (PLUG, MCB, etc.)
createdAtDate Time of the Creation
updatedAtDate Time of the Update
actualDateDate Time of the Update
macIdMAC ID of the device
deviceReference to the device
wifiStrengthWiFi signal strength at the time of the hourly record
UsageHistoryDay
_idPrimary ID of the UsageHistoryDay
Usage History of the device (Hourly)
createdAtDate Time of the Creation
updatedAtDate Time of the Update
deviceTypeType of device (PLUG, MCB, etc.)
macIdMAC ID of the device
deviceReference to the device
UsageHistoryDayWithCostBreakdownDto
dateNo. Hour of the Usage History
totalEnergyUsageTotal Energy Usage in a Day (kWh)
costEnergy cost for this day in dollars. Zero (0) if no tariff rate is configured for this day.
totalEnergyUsageAEnergy Usage on phase A in a Day (kWh)
totalEnergyUsageBEnergy Usage on phase B in a Day (kWh)
totalEnergyUsageCEnergy Usage on phase C in a Day (kWh)
activeEnergyActive Energy consumed in a Day (Wh)
reactiveEnergyReactive Energy consumed in a Day (VARh)
apparentEnergyApparent Energy consumed in a Day (VAh)
tariffRateTariff rate applied for this day in cents per kWh/L. Null if no tariff rate is configured.
UsageHistoryDayBreakdownDto
dateNo. Hour of the Usage History
totalEnergyUsageTotal Energy Usage in a Day (kWh)
totalEnergyUsageAEnergy Usage on phase A in a Day (kWh)
totalEnergyUsageBEnergy Usage on phase B in a Day (kWh)
totalEnergyUsageCEnergy Usage on phase C in a Day (kWh)
activeEnergyActive Energy consumed in a Day (Wh)
reactiveEnergyReactive Energy consumed in a Day (VARh)
apparentEnergyApparent Energy consumed in a Day (VAh)
UsageHistoryHourBreakdownDto
hourNo. Hour of the Usage History
totalEnergyUsageTotal Energy Usage in a Hour (kWh)
totalEnergyUsageAEnergy Usage on phase A in a Hour (kWh)
totalEnergyUsageBEnergy Usage on phase B in a Hour (kWh)
totalEnergyUsageCEnergy Usage on phase C in a Hour (kWh)
activeEnergyActive Energy consumed in a Hour (Wh)
reactiveEnergyReactive Energy consumed in a Hour (VARh)
apparentEnergyApparent Energy consumed in a Hour (VAh)
UsageHistoryHourWithTariffResponseDto
Array of hourly usage data
currentTariffRateCurrent tariff rate in cost per kWh. Null if no tariff rate is configured. Useful for frontend calculations.
UsageHistoryEnergyRealtimeDto
onStatusStatus of the device (ON / OFF)
createdAtDate Time of the Creation
currentCurrent in Amperes (A)
voltageVoltage in Volts (V)
powerFactorPower factor (0-1)
powerPower in Watts (W)
voltageAPhase A voltage (V)
voltageBPhase B voltage (V)
voltageCPhase C voltage (V)
currentAPhase A current (A)
currentBPhase B current (A)
currentCPhase C current (A)
activePowerAPhase A active power (W)
activePowerBPhase B active power (W)
activePowerCPhase C active power (W)
reactivePowerAPhase A reactive power (VAR)
reactivePowerBPhase B reactive power (VAR)
reactivePowerCPhase C reactive power (VAR)
apparentPowerAPhase A apparent power (VA)
apparentPowerBPhase B apparent power (VA)
apparentPowerCPhase C apparent power (VA)
powerFactorAPhase A power factor (0-1)
powerFactorBPhase B power factor (0-1)
powerFactorCPhase C power factor (0-1)
frequencyLine frequency (Hz)
rssiWiFi RSSI value at the time of the reading (dBm)
RateSource
Scope level that supplied the rate. Null when no level of the scope chain has a rate and the national default was used.
PeriodCostResolution
Record tier the figure was integrated from
PeriodCostProjectionDto
dailyKWhdailyCostmonthlyKWhmonthlyCostyearlyKWhyearlyCostDevicePeriodCostResponseDto
kWhEnergy consumed by the device over the selected period
costCost of the selected period, in dollars
costPerKWhTariff rate applied, in cents per kWh
resolutionRecord tier the figure was integrated from
windowSecondsLength of the selected period in seconds
coveredSecondsSeconds of the period actually backed by data. Falls short of windowSeconds when the device was offline or reporting sparsely.
coverageRatiocoveredSeconds / windowSeconds, 0–1
sampleCountNumber of source records in the period
Projection assuming this rate of draw continues around the clock.
Projection assuming this exact period repeats once per day — the figure to read as "savings if scheduled off".
rateSourceScope level that supplied the rate. Null when no level of the scope chain has a rate and the national default was used.
avgPowerWMean power across the covered part of the period, in watts. Realtime resolution only.
peakPowerWHighest instantaneous power in the period, in watts. Realtime resolution only.
McbRealtimeDataPointDto
createdAtpowerSummed power at this timestamp in Watts (W)
McbRealtimeSeriesDto
measurementTypeMCB measurement type for this series, or "COMBINED" for the total across all types
maxMaximum power value across all data points in this series (W). Only present for the COMBINED series.
averageAverage power value across all data points in this series (W). Only present for the COMBINED series.
McbMeasurementType
Measurement type, for MCBs only
DeviceRealtimeSeriesDto
deviceIddeviceNamedeviceTypeType of device (PLUG, MCB, etc.)
maxPeak power in the range (W)
averageMean power across the range (W)
measurementTypeMeasurement type, for MCBs only
McbRealtimeResponseDto
One time-series per MCB measurement type found in the room or zone, plus a COMBINED series that sums all types
Per-device breakdown of the same range, for charting the selection split out. Present only on endpoints that provide it. A phase child rolls up into its parent clamp, since the rows belong to the clamp.
DevicesRealtimeRequestDto
deviceIdsDevice ids to read. PLUG and MCB only — other types write no energy realtime rows. Max 20: each id widens a high-frequency time-series scan.
fromRange start
tillRange end
RoomMcbAiInsightResponseDto
summaryOne-liner summary of room energy behaviour
List of predicted devices and why
DeviceEnergyDto
energyTotal energy consumed by the device in watt-hours.
UsageWithCostResponseDto
totalEnergyUsageTotal energy usage in kWh
totalCostTotal cost based on current tariff rate. Null if no tariff rate is configured.
tariffRateCurrent tariff rate in cost per kWh. Null if no tariff rate is configured.
TelemetryHourSmartSwitchResponseDto
hourHour of the day (0–23)
onStatusDevice on/off status for this hour
createdAtRecord creation timestamp
downTimeTotal downtime in milliseconds for this hour (3600000 = full hour down)
gangSwitchStatusGang switch states reported by the device (array index = gang index, 1 = ON, 0 = OFF)
actualDateActual date this hourly record is for
TelemetryAirconControlRealtimeResponseDto
onStatusDevice on/off status
createdAtRecord creation timestamp
ambientTemperatureAmbient temperature in Celsius
ambientHumidityAmbient humidity percentage
motionDetectedWhether motion was detected (MAXWELL_ULTRA only)
rssiWiFi RSSI value at the time of the reading (dBm)
occupancyOccupancy estimate. Absent when the device carries no people counter
TelemetryHourAirconControlResponseDto
hourHour of the day (0–23)
onStatusDevice on/off status for this hour
createdAtRecord creation timestamp
downTimeTotal downtime in milliseconds for this hour (3600000 = full hour down)
ambientTemperatureAmbient temperature in Celsius
ambientHumidityAmbient humidity percentage
motionDetectedWhether motion was detected during this hour (MAXWELL_ULTRA only)
actualDateActual date this hourly record is for
occupancyMedianMedian occupancy over the hour. Prefer over the average — robust to walk-by bursts
occupancyAverageMean occupancy over the hour, rounded
occupancyMinMinimum occupancy over the hour
occupancyMaxMaximum occupancy over the hour
occupancySamplesSettled occupancy figures that fed the hourly aggregate; a low count is a low-confidence hour
WifiHeatmapCellDto
hourHour of day, 0-23
avgRssiMean signal in this hour slot across the window, in dBm
minRssiWorst reading in this slot, in dBm — where a dropout actually starts
sampleHoursHourly snapshots that contributed. Low counts are weak evidence.
WifiHeatmapDeviceDto
deviceIdnamedeviceTypeavgRssiMean signal across the window, dBm
minRssimaxRssisampleHoursHourly snapshots carrying a signal reading
missingHoursHours in the window with no hourly record at all. A device that stops reporting has no weak reading to show — the silence is the signal.
Hour-of-day slots that carried data. Absent hours are omitted, not zeroed.
WifiHeatmapResponseDto
periodStartperiodEndwindowHoursHours spanned by the window, the denominator for missingHours
deviceCountDevices in the system that reported any signal in the window
Weakest average signal first, so dead spots sort to the top
truncatedPresent and true when devices were dropped by limit. Never silently truncated — raise limit or narrow the window.
DeviceBoxplotEntryDto
minq1medianq3maxhourHour of the day (0–23)
deviceCountNumber of distinct entities with data in this hour
DeviceBoxStatsDto
minq1medianq3maxDeviceBreakdownEntryDto
deviceIddeviceNamevalueAggregated value for this entity in the hour
DeviceDrilldownResponseDto
Overall box plot statistics across all entities in the hour
Per-entity breakdown
totalDevicesTelemetryHourEnvironmentSensorResponseDto
hourHour of the day this record covers (0–23, e.g. 7 = 0700–0800)
actualDateDate the hourly bucket belongs to
createdAtRecord creation timestamp
wifiStrengthWiFi signal strength at the time of the hourly record, in dBm
temperatureAverage temperature for the hour, in degrees Celsius
humidityAverage humidity percentage for the hour
carbonDioxideAverage CO2 for the hour, in ppm
luxAverage light level for the hour, in lux (lx)
formaldehydeAverage formaldehyde (HCHO) for the hour, in µg/m³
pm1Average PM1 for the hour, in µg/m³
pm2_5Average PM2.5 for the hour, in µg/m³
pm10Average PM10 for the hour, in µg/m³
totalVolatileOrganicCompoundsAverage total volatile organic compounds for the hour, in ppb
soundLevelAverage sound level for the hour, in dB
motionDetectedWhether motion was detected during the hour
TelemetryEnvironmentSensorRealtimeResponseDto
createdAtStart timestamp of the downsampled bucket
temperatureAverage temperature for the bucket, in degrees Celsius
humidityAverage humidity percentage for the bucket
carbonDioxideAverage CO2 for the bucket, in ppm
luxAverage light level for the bucket, in lux (lx)
formaldehydeAverage formaldehyde (HCHO) for the bucket, in µg/m³
pm1Average PM1 for the bucket, in µg/m³
pm2_5Average PM2.5 for the bucket, in µg/m³
pm10Average PM10 for the bucket, in µg/m³
totalVolatileOrganicCompoundsAverage total volatile organic compounds for the bucket, in ppb
soundLevelAverage sound level for the bucket, in dB
motionDetectedWhether any sample in the bucket detected motion
rssiAverage WiFi RSSI for the bucket (dBm)
TelemetryHourWaterMeterResponseDto
hourHour of the day this record covers (0–23, e.g. 7 = 0700–0800)
onStatusDevice on/off status during this hour
netVolumeNet water volume for this hour (L)
flowRateAverage flow rate for this hour (m³/h)
velocityAverage flow velocity for this hour (m/s)
soundSpeedAverage speed of sound for this hour (m/s)
signalQualityAverage signal quality for this hour (no units)
energyFlowRateAverage thermal energy flow rate for this hour (GJ/h)
energyTotal thermal energy for this hour (GJ)
inletTemperatureAverage inlet water temperature for this hour (°C)
outletTemperatureAverage outlet water temperature for this hour (°C)
actualDateDate the hourly bucket belongs to
createdAtRecord creation timestamp
TelemetryWaterMeterRealtimeResponseDto
onStatusDevice on/off status at the time of the reading
flowRateFlow rate at the time of the reading (m³/h)
velocityFlow velocity at the time of the reading (m/s)
soundSpeedSpeed of sound in fluid at the time of the reading (m/s)
signalQualityUltrasonic signal quality (no units)
createdAtRecord creation timestamp
meterConnectedWhether the meter is physically connected
inletTemperatureInlet water temperature (°C)
outletTemperatureOutlet water temperature (°C)
energyFlowRateThermal energy flow rate (GJ/h)
rssiWiFi RSSI value at the time of the reading (dBm)
TelemetryDayWaterMeterResponseDto
netVolumeTotal net water volume for the day (L)
flowRateAverage flow rate for the day (m³/h)
velocityAverage flow velocity for the day (m/s)
soundSpeedAverage speed of sound for the day (m/s)
signalQualityAverage signal quality for the day (no units)
Hourly rows this daily aggregate was rolled up from
energyTotal thermal energy for the day (GJ)
energyFlowRateAverage thermal energy flow rate for the day (GJ/h)
inletTemperatureAverage inlet water temperature for the day (°C)
outletTemperatureAverage outlet water temperature for the day (°C)
createdAtStart of the day this aggregate covers
updatedAtTimestamp of the last update to this aggregate
Role
Administrator role defining access permissions (SUPERADMIN or ADMIN)
FrontendApp
Frontend app context for app-specific signup flows
SignUpDto
nameFull name of the administrator
emailEmail address for the administrator account (must be unique)
passwordAccount password (minimum 6 characters, optional for invited admins)
roleAdministrator role defining access permissions (SUPERADMIN or ADMIN)
appFrontend app context for app-specific signup flows
unitNameUnit name for B2C signup — used as the zone name for the user's space
acceptedTermsWhether the user accepted the Terms & Conditions. Required (must be true) for base (B2C) self-signup.
approvedWhether the admin account is approved and can access the system
associatedZoneOptional zone ID to associate this admin with a specific zone account
associatedTenantOptional tenant ID to associate this admin with a specific tenant
associatedRoomOptional room ID to associate this admin with a specific room
LoginResponseDto
isSuccessfulIndicates if the login was successful
idUser ID of the authenticated user
mainSystemIdMain system ID associated with the user
requires2FAIndicates if the user has 2FA enabled and needs to complete 2FA verification
tokenJWT access token. Returned to clients that carry their own credentials — native apps identifying as beacon, and any caller that sends no app. A web app that names itself via app receives this as an httpOnly cookie instead and gets no copy here, since a copy readable by JavaScript is what httpOnly exists to prevent. The exception is the pre-2FA step, whose short-lived 10-minute token is returned to every caller because it is not yet a session.
roleRole of the authenticated user
emailEmail of the authenticated user
associatedTenantIdAssociated tenant ID if user has TENANT role
associatedUserIdAssociated user ID if user has USER role
associatedRoomIdAssociated room ID if user has ROOM_ADMIN role
refreshTokenRefresh token used to obtain a new access token. Absent when 2FA verification is still pending, and absent for web callers, which receive it as an httpOnly cookie scoped to /api/auth instead.
expiresInHow many seconds the access token remains valid, counted from when this response was issued. Returned to every caller, including web ones that receive no token at all — a cookie client cannot read the token to find its exp, so this is how it knows when to refresh ahead of a 401. Relative rather than absolute, matching OAuth 2.0 expires_in, so a client whose clock disagrees with the server still refreshes at the right moment. A lifetime is not a credential, so exposing it costs nothing. Absent when the response carries no session (pending approval, or 2FA still to complete).
LoginDto
emailAdministrator email address used for authentication
passwordAdministrator password (minimum 6 characters)
appFrontend app identifier for role-based access control
SignoutDto
refreshTokenThe refresh token to revoke alongside the access token. Optional so existing cookie/header callers keep working; when present it is blacklisted so it can no longer be exchanged.
RefreshTokenDto
refreshTokenThe 30-day refresh token issued at login. Exchanged for a fresh access + refresh token pair. The presented token is revoked (single use). Optional: browser clients omit it and the token is read from the httpOnly refresh cookie instead.
InviteDto
inviterIdID of the administrator sending the invitation
systemIdSystem ID where the new admin will have access
nameFull name of the person being invited
emailEmail address where the invitation will be sent
roleRole to be assigned to the new administrator (SUPERADMIN or ADMIN)
associatedZoneOptional zone ID to link this admin account to an existing zone
associatedTenantOptional tenant ID to associate this admin with a specific tenant for billing
associatedRoomOptional room ID to associate this admin with a specific room
ReInviteDto
inviterIdID of the Admin that is inviting
systemIdID of the System
emailEmail of the Admin
SignUpViaInviteDto
tokenReset password token for the Admin
passwordPassword of the Admin
acceptedTermsWhether the user accepted the Terms & Conditions. Sent by the base (B2C) create-account page.
ResetPasswordDto
tokenReset password token for the Admin
newPasswordNew password for the Admin
GoogleTokenDto
credentialGoogle Identity Services ID token (JWT credential) obtained client-side via the GIS button. Verified server-side against the configured Google client ID.
appFrontend app identifier for role-based access control
MicrosoftTokenDto
credentialMicrosoft Identity Platform id_token (JWT credential) obtained client-side via the native OAuth flow. Verified server-side against Microsoft’s JWKS for the pinned tenant.
appFrontend app identifier for role-based access control
Auth2FAResponseDto
issuerIssuer for the 2FA secret
labelLabel for the 2FA secret
secret2FA secret
Disable2FAResponseDto
messageSuccess message
Disable2FASystemResponseDto
messageSuccess message
affectedUsersNumber of users whose 2FA was disabled
AuditAction
StatusTriggerSource
Trigger source for device actions
GetAuditLogDto
_idPrimary ID of the audit log entry
actionThe action that was performed
outcomeWhether the action succeeded or failed
createdAtWhen the action occurred
actorIdAccount that performed the action
actorNameDisplay name of the acting account (resolved from actorId)
actorRoleRole of the actor at the time of the action
systemIdSystem the action was scoped to
systemNameName of the system the action was scoped to
targetTypeType of resource the action targeted
targetIdID of the targeted resource
triggerSourceTrigger source for device actions
metadataFree-form contextual data; shape varies by action
GetAuditLogsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of audit log entries matching the query parameters
ChatMessageDto
roleRole of the message sender
contentContent of the message
ChatRequestDto
messageThe user's current message
Array of previous messages in the conversation (max 30 messages)
PlugCategoryResponseDto
_idCategory ID
nameUnique category key
displayNameHuman-readable display name
isBuiltInWhether this is a built-in category
createdAtCreation timestamp
createdByAdmin who created this category
CreatePlugCategoryDto
nameUnique category key — must be UPPER_SNAKE_CASE
displayNameHuman-readable display name
SurgeConfig
calculatedThresholdKwhAuto-calculated threshold (median) in kWh
defaultViolationCountDefault number of violations to trigger flagging
defaultViolationWindowDefault rolling window in days for violation counting
manualThresholdKwhManual threshold override in kWh (if provided)
digestTimeLocal time of day (HH:mm, in the system timezone) the digest fires at. Anchors the every-N-days digest so it no longer inherits the moment the config was saved.
digestStartDateLocal date (YYYY-MM-DD, system timezone) of the first digest run. Picks which day of the N-day cycle the digest lands on; defaults to the next occurrence of digestTime.
sentinelPowerRangeRulesSentinel power range rules for suspected device classification
Per-type-key overrides, keyed by the entity type key (e.g. TYPE_A). An entity whose type key has no entry here — including entities with no type key at all — uses the baseline above.
LocationObject
locationInputLocation of the Tenant
typeType of the Tenant
coordinatesGeolocation of the Tenant
FeatureType
Type of the feature
Feature
_idPrimary ID of the feature
nameName of the feature
featureTypeType of the feature
descriptionDescription of the feature
createdAtIndicates the creation time of the feature
updatedAtIndicates the last update time of the feature
SubscriptionTier
_idThe unique identifier of the subscription tier
nameThe name of the subscription tier
descriptionThe description of the subscription tier
The features included in the subscription tier
createdAtThe date when the subscription tier was created
updatedAtThe date when the subscription tier was last updated
isDeletedIndicates whether the subscription tier is deleted
SystemPermission
Array of features that are currently enabled for this system
Subscription tier that defines available features for the system
updatedAtTimestamp when the permission settings were last updated
expiryDateOptional expiry date for the current permission settings
SandboxApiGroup
API groups that sandbox (DEVELOPER) API tokens may call on this System. Empty means none.
ExclusionMode
FULL: skip all schedules for the day. TIMED: skip recurring schedules but run devices within timeStart–timeEnd.
ScheduleExclusion
dateISO date format (YYYY-MM-DD)
nameName of the exclusion day
typeType of exclusion
modeFULL: skip all schedules for the day. TIMED: skip recurring schedules but run devices within timeStart–timeEnd.
countryCodeISO country code (for holidays from API)
timeStartTime (HH:mm) when devices turn ON. Only set when mode is TIMED.
timeEndTime (HH:mm) when devices turn OFF. Only set when mode is TIMED.
SystemTimezone
IANA timezone identifier for the system location. Used for scheduling and public holiday calculations.
EntityLabelPairDto
singularSingular form of the label
pluralPlural form of the label
SystemEntityLabelsDto
Custom label for the zone entity
Custom label for the tenant entity
Custom label for the room entity
System
_idPrimary ID of the system
systemNameName of the system
watchDogTimerRuleNameName of the Watch Dog Timer Rule for the system
inActiveDevicesCronJobRuleNameName of the Inactive Devices Cron Job Rule for the system
remarksRemarks for the system
startPilotDateStart date of the pilot program
endPilotDateEnd date of the pilot program
realTimeToggleOnReal Time Toggle Status for the system
heartBeatIntervalHeart Beat Interval for the system
Locations of the Tenant
createdAtDate Time of the Creation
updatedAtDate Time of the Update
createdAdminAdmin which created the system (ObjectId reference)
adminsSystem Admins of the system (ObjectId references)
tenantsTenants of the system (ObjectId references)
devicesAll IoT devices in the System (ObjectId references — Plugs, MCBs, Environment sensors, etc.)
distributionBoxesAll distribution boxes in the System (ObjectId references)
System permission settings including subscription tier, enabled features, and metadata
countryCodeISO 3166-1 alpha-2 country code for the system. Determines which public holidays are available for scheduling.
timezoneIANA timezone identifier for the system location. Used for scheduling and public holiday calculations.
lockedWhether the system is locked. A locked system is flagged by a SUPERADMIN (e.g. for non-payment or suspension). Toggle via PATCH /system/:systemId/lock.
sandboxApiGroupsAPI groups that sandbox (DEVELOPER) API tokens may call on this System. Empty means none.
Dates when recurring schedules will NOT execute
surgeMonitoringScheduleNameName of the surge monitoring daily check scheduled task rule for this system. If present, surge monitoring is enabled. If absent/undefined, monitoring is disabled.
surgeMonitoringDailyCheckTimeLocal time of day (HH:mm, in this system timezone) the daily surge check runs at. Defaults to 01:00 when unset.
surgeMonitoringDigestScheduleNameName of the surge monitoring digest scheduled task rule for this system
Surge monitoring configuration by entity type (ROOM, TENANT, USER). Map keys are MonitoringEntityType enum values.
scheduleAdjustmentConfigSchedule adjustment configuration for this system. Controls automatic schedule adjustments based on user manual override patterns.
Custom display labels for entity types (zone, tenant, room). Each entry has a singular and plural form. When absent, the frontend uses default names.
Tenant
_idPrimary ID of the Tenant
tenantNameName of the Tenant
remarksRemarks for the Plug
Locations of the Tenant
levelLevel of the Tenant
energyUsageEnergy Usage of the Tenant (Separated from the Tenants)
System of the Tenant
devicesAll IoT devices under the Tenant (ObjectId references — Plugs, MCBs, Environment sensors, etc.)
distributionBoxesAll distribution boxes under the Tenant (ObjectId references)
zonesZones under the Tenant (ObjectId references)
roomsList of Rooms assigned to the Tenant (ObjectId references)
tenantEmailEmail of the Admin
tenantTypeTenant type key — must match a valid tenant type for this system
Zone
_idPrimary ID of the Zone
nameName of the Zone
emailEmail of the Zone
remarksRemarks for the Zone
Tenant tagged to zone
roomsList of Rooms assigned to the zone (ObjectId references)
devicesAll IoT devices under the Zone (ObjectId references — Plugs, MCBs, Environment sensors, etc.)
distributionBoxesAll distribution boxes under the Zone (ObjectId references)
zoneTypeZone type key — must match a valid zone type for this system
floorPlanKeyS3 key for the 2D floor plan image
floorPlanUrlCDN URL for the 2D floor plan image
floorPlan3D floor plan design linked to this zone
floorPlanV2V2 floor plan canvas linked to this zone
Room
_idPrimary ID of the Room
nameName of the Room
remarksRemarks for the Room
devicesAll IoT devices in the Room (ObjectId references — Plugs, MCBs, Environment sensors, etc.)
distributionBoxesAll distribution boxes in the Room (ObjectId references)
System that the room belongs to (optional - derived from tenant if not provided)
Zone tagged to room
Tenant associated with the room (optional for single-tenant systems)
roomTypeRoom type key — must match a valid room type for this system
squareMeterFloor area of the room in square meters
floorPlanKeyS3 key for the floor plan image
floorPlanUrlCDN URL for the floor plan image
QuietHours
enabledWhether Do Not Disturb is active for this account. On its own (no start/end) this suppresses every channel but in-app at all times; paired with start/end it scopes suppression to that window instead.
startQuiet hours start time in HH:mm format (local to timezone). Omit alongside end for an always-on Do Not Disturb toggle instead of a scheduled window.
endQuiet hours end time in HH:mm format (local to timezone). Omit alongside start for an always-on Do Not Disturb toggle instead of a scheduled window.
timezoneTimezone the start/end times are evaluated in, from the supported set
NotificationPreferences
channelsWhich channels this account takes, across every notification type. A channel missing here falls back to NOTIFICATION_CHANNEL_DEFAULTS.
Account-level Do Not Disturb. Suppresses every channel but in-app while active; in-app is never gated.
Admin
_idPrimary ID of the Admin
nameName of the Admin
emailEmail of the Admin (stored and matched in lowercase)
roleRole of the Admin (ENUM)
Profile Image of the Admin
systemsSystems available to use for the Admin (ObjectId references)
approvedWhether the Admin is approved
twoFASecretThe live 2FA secret. Its presence is what marks an account as enrolled — distinct from enable2FA, which only says 2FA is required.
enable2FAIndicates whether 2FA is enabled for the Admin
createdAtDate when the Admin was created
updatedAtDate when the Admin was last updated
lockCountNumber of failed login attempts for the Admin
passwordPassword of the Admin
pendingIndicates whether the Admin's invitation is pending
Reference to the associated Room
Reference to the associated Zone
Reference to the associated Tenant
pendingTwoFASecretA 2FA secret that has been handed to the client but not yet proven by a valid code. Promoted to twoFASecret on first successful verification, so an abandoned setup leaves the account exactly as it was.
lastTwoFATimeStepRFC 6238 time step of the last 2FA code accepted for this account. Codes at or below it are refused, so a code observed in transit cannot be replayed for the remainder of its validity window.
passwordResetJtiOne-time id of the currently-valid password-reset token. Cleared once a reset succeeds so the token cannot be replayed.
sessionsValidFromCutoff for session validity. Any access or refresh token issued before this instant is rejected, which is how a password change evicts every existing session — including one held by an attacker. Unset means no cutoff has ever been applied.
acceptedTermsAtTimestamp when the Admin accepted the Terms & Conditions (set on base signup)
Everything this account chose about how it is notified — per-group channel settings and the Do Not Disturb window.
telegramChatIdTelegram chat ID for this account's personal group. Paired by adding the bot to a group and sending "/connect ". When set, notifications are sent there.
telegramChatTitleTelegram group name/title for this account, as reported by Telegram at pairing time.
writingStylePromptedAtWhen this account was last asked to set up a writing style. Unset means they have never been asked.
CreateSystemDto
systemNameName of the system. Typically represents an organization, building, or facility using the Ecovolt platform.
realTimeToggleOnControls whether plugs in this system should send real-time energy data. When enabled, increases data transmission frequency.
heartBeatIntervalInterval in minutes between heartbeat signals from plugs. Determines how frequently plugs report their online status.
Geographic location details of the system. Includes address, city, country, and coordinates for mapping purposes.
countryCodeISO 3166-1 alpha-2 country code for the system. Determines which public holidays are available for scheduling.
timezoneSystem timezone used for scheduling and public holiday calculations. Should match the country code.
Admin account assigned to manage this system. This field is auto-assigned and should not be provided manually.
subscriptionTierUnique identifier of the subscription tier to assign to this system. Determines available features and usage limits.
costPerKWhOptional initial cost per kilowatt-hour (kWh) in cents. If provided, seeds the first tariff rate period for the system. If omitted, the system uses the national default (SP Group tariff) until a rate is configured. Example: 30.65 cents = $0.3065 per kWh.
remarksAdditional notes or comments about the system. Useful for documenting special configurations or pilot program details.
startPilotDateStart date of the pilot program for this system. Used for tracking trial periods and generating time-based reports.
endPilotDateEnd date of the pilot program for this system. After this date, the system may transition to a permanent subscription.
GetSystemDto
_idUnique identifier of the system
systemNameName of the system
realTimeToggleOnReal-time data toggle status for the system
heartBeatIntervalHeartbeat interval in minutes
numberOfAdminsNumber of admins linked to the system
numberOfDevicesNumber of devices in the system
deviceOnCountNumber of devices currently in ON status for this system.
deviceOffCountNumber of devices currently in OFF status for this system.
deviceInactiveCountNumber of devices currently in INACTIVE status for this system.
Location details of the system
createdAtWhen the system was created
updatedAtWhen the system was last updated
deviceSpareCountNumber of spare devices for this system.
Admin who created the system
subscriptionTierNameName of the subscription tier assigned to this system
subscriptionExpiryDateExpiry date of the system subscription
GetSystemsDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of systems
ScheduleAdjustmentConfigDto
enabledWhether schedule adjustment suggestions are enabled. If false, no suggestions will be generated.
autoApplyEnabledWhether auto-apply is enabled after reaching threshold. If false, always require manual approval. When enabled, patterns are applied on the NEXT manual toggle after threshold.
occurrenceThresholdNumber of occurrences required before auto-apply. Examples: 3 = quick response, 5 = balanced, 10 = conservative
timeWindowMinutesTime window in minutes for grouping similar override times. Overrides within this window are considered the same pattern. Examples: 15 = strict, 30 = moderate, 45 = lenient
minDeltaMinutesMinimum schedule change in minutes for a suggestion to be surfaced. Suggestions that change the schedule by this many minutes or fewer are treated as no-ops and never created (e.g. turning OFF at the exact scheduled OFF time). Examples: 0 = only hide exact no-ops, 1 = default, 5 = stricter
GetSystemDetailDto
_idUnique identifier of the system
systemNameName of the system
realTimeToggleOnReal-time data toggle status for the system
heartBeatIntervalHeartbeat interval in minutes
countryCodeISO 3166-1 alpha-2 country code for the system. Determines which public holidays are available for scheduling.
timezoneIANA timezone identifier for the system location. Used for scheduling and public holiday calculations.
lockedWhether the system is locked. A locked system is flagged by a SUPERADMIN (e.g. for non-payment or suspension).
System permission settings. For non-admin callers subscriptionTier is omitted — only featuresEnabled is returned, so the client can still gate UI on enabled features.
createdAtWhen the system was created
updatedAtWhen the system was last updated
Custom display labels for entity types (zone, tenant, room). When absent, the frontend uses default names.
Location details of the system. Admin-only — omitted for non-admin callers.
Admin who created the system. Admin-only — omitted for non-admin callers.
adminsSystem admins of the system (ObjectId references). Admin-only — omitted for non-admin callers.
tenantsTenants of the system (ObjectId references). Admin-only — omitted for non-admin callers.
devicesAll IoT devices in the system (ObjectId references). Admin-only — omitted for non-admin callers.
distributionBoxesAll distribution boxes in the system (ObjectId references). Admin-only — omitted for non-admin callers.
systemEnergyReportSystem-level energy report reference. Admin-only — omitted for non-admin callers.
remarksRemarks for the system. Admin-only.
startPilotDateStart date of the pilot program. Admin-only.
endPilotDateEnd date of the pilot program. Admin-only.
Dates when recurring schedules will NOT execute. Admin-only.
watchDogTimerRuleNameName of the Watch Dog Timer Rule for the system. Admin-only (internal infrastructure identifier).
inActiveDevicesCronJobRuleNameName of the Inactive Devices Cron Job Rule for the system. Admin-only (internal infrastructure identifier).
surgeMonitoringScheduleNameName of the surge monitoring daily check scheduled task rule. Admin-only (internal infrastructure identifier).
surgeMonitoringDigestScheduleNameName of the surge monitoring digest scheduled task rule. Admin-only (internal infrastructure identifier).
Surge monitoring configuration by entity type (ROOM, TENANT, USER). Admin-only.
Schedule adjustment configuration for this system. Admin-only.
TenantEnergyUsageDto
tenantIdUnique identifier of the tenant
tenantNameName of the tenant
energyUsageTotal energy usage in kilowatt-hours (kWh) for the specified period
GetTenantEnergyUsageResponseDto
systemIdSystem ID for which tenant energy usage was calculated
daysNumber of days the energy usage was calculated over
startDateStart date of the energy usage period (ISO 8601 format)
endDateEnd date of the energy usage period (ISO 8601 format)
List of tenants with their energy usage data
totalTenantsTotal number of tenants found in this system
totalEnergyUsageTotal energy usage across all tenants in kWh
CreateTariffRateDto
costPerKWhCost in cents per kWh
effectiveFromDate when this tariff rate becomes effective (ISO 8601 format)
notesNotes or reason for this tariff rate change
GetTariffRatePeriodDto
_idTariff rate period ID
systemSystem ID that this tariff rate applies to
scopeTypeScope level this rate applies to
scopeIdID of the scope entity (system/tenant/zone/room). Equals system when scopeType is SYSTEM.
costPerKWhCost in cents per kWh
effectiveFromDate when this tariff rate becomes effective
createdAtTimestamp when this record was created
updatedAtTimestamp when this record was last updated
effectiveToDate when this tariff rate expires (null means currently active)
notesNotes or reason for this tariff rate change
createdByAdmin who created this tariff rate
GetTariffRateHistoryDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of tariff rate periods
UpdateTariffRateDto
costPerKWhUpdated tariff rate in cents per kWh
effectiveFromUpdated start date for this tariff rate period
effectiveToUpdated end date for this tariff rate period (null means currently active)
notesNotes or reason for this tariff rate
GetEffectiveTariffRateDto
costPerKWhEffective rate in cents per kWh, or null if no rate is configured anywhere in the scope chain
rateSourceWhere the effective rate came from: the most specific scope level with an active rate, or NATIONAL_DEFAULT when nothing is configured and the SP Group fallback applies. Null only if even the fallback is unavailable.
scopeIdID of the entity that owns the winning rate — the queried entity when it has its own rate, otherwise a broader ancestor. Null when no rate applies.
PublicHolidayResponseDto
datenamecountryCodeISO country code (for holidays from API)
CustomExclusionEntryDto
nameHuman-readable name for this exclusion
modeFULL: skip all schedules for the day. TIMED: skip recurring schedules but run devices within timeStart–timeEnd.
dateSingle date in YYYY-MM-DD format. Cannot be used with startDate/endDate.
startDateRange start in YYYY-MM-DD format. Must be used with endDate.
endDateRange end in YYYY-MM-DD format. Must be used with startDate.
typeExclusion type. Defaults to CUSTOM if omitted.
countryCodeCountry code for HOLIDAY entries (e.g. "SG"). Optional.
timeStartRequired when mode is TIMED. Time (HH:mm, system timezone) when devices turn ON.
timeEndRequired when mode is TIMED. Time (HH:mm, system timezone) when devices turn OFF.
BulkAddCustomExclusionsDto
List of exclusion entries. Each can be a full-day exclusion or a timed override.
replaceExistingOfTypeIf set, all existing exclusions of this type are removed before the new entries are inserted. Use HOLIDAY to sync public holidays without accumulating stale entries.
BulkAddCustomExclusionsResponseDto
exclusionsReplacedNumber of existing exclusions removed (when replaceExistingOfType is set)
exclusionsAddedNumber of new exclusion dates added
duplicatesSkippedNumber of dates skipped because an exclusion already existed
timedOverridesAppliedNumber of TIMED entries processed
oneTimeTasksCreatedTotal one-time ON+OFF tasks created across all TIMED entries and devices
devicesProcessedNumber of devices that received one-time tasks (relevant for TIMED entries)
UpdateSystemDto
systemNameName of the system. Typically represents an organization, building, or facility using the Ecovolt platform.
Geographic location details of the system. Includes address, city, country, and coordinates for mapping purposes.
subscriptionTierUnique identifier of the subscription tier to assign to this system. Determines available features and usage limits.
remarksAdditional notes or comments about the system. Useful for documenting special configurations or pilot program details.
startPilotDateStart date of the pilot program for this system. Used for tracking trial periods and generating time-based reports.
endPilotDateEnd date of the pilot program for this system. After this date, the system may transition to a permanent subscription.
countryCodeISO 3166-1 alpha-2 country code for the system. Determines which public holidays are available for scheduling.
timezoneSystem timezone used for scheduling and public holiday calculations. Should match the country code if both are provided.
Custom display labels for entity types (zone, tenant, room). Each entry has a singular and plural form. When absent, the frontend falls back to default names.
HeartBeatConfigurationDto
toggleOnControls whether plugs in this system should send real-time energy data. When enabled, increases data transmission frequency for live monitoring.
heartBeatIntervalInterval in minutes between heartbeat signals from plugs. Determines how frequently plugs report their online status to the system.
LinkAdminToSystemDto
adminIdUnique identifier of the admin account to be linked to the system. This establishes a management relationship between the admin and the system.
LinkAdminResponseDto
The system entity that was successfully linked to the admin account. Contains full system details including configuration and metadata.
The admin entity that was successfully linked to the system. Contains full admin details including role and permissions.
UnlinkAdminResponseDto
The system entity that was successfully unlinked from the admin account. Contains full system details including configuration and metadata.
The admin entity that was successfully unlinked from the system. Contains full admin details including role and permissions.
UpdateSystemPermissionDto
subscriptionTierUnique identifier of the subscription tier to assign to this system. Changes the base feature set and limitations.
featuresEnabledArray of feature identifiers to enable for this system. Overrides or extends the default features from the subscription tier.
expiryDateExpiration date for the system permission. After this date, the system may lose access to certain features or services.
SandboxApiGroupsResponseDto
groupsAPI groups sandbox (DEVELOPER) API tokens may call on this System. Empty means none.
UpdateSandboxApiGroupsDto
groupsAPI groups sandbox (DEVELOPER) API tokens may call on this System. Replaces the whole list; an empty list disables sandbox API access.
UpdateScheduleAdjustmentConfigDto
enabledWhether schedule adjustment suggestions are enabled
autoApplyEnabledWhether auto-apply is enabled (applies on next manual toggle after threshold)
occurrenceThresholdNumber of occurrences required before auto-apply (1-20)
timeWindowMinutesTime window in minutes for grouping similar override times (5-60)
minDeltaMinutesMinimum schedule change in minutes for a suggestion to be surfaced (0-60). Suggestions changing the schedule by this many minutes or fewer are skipped.
ToggleSystemLockDto
lockedSet to true to lock the system, false to unlock it. Only accessible to SUPERADMIN users.
ToggleSystemLockResponseDto
systemIdSystem ID
lockedWhether the system is now locked.
messageConfirmation message
CronJobType
Type of cron job to schedule
ScheduleCronJobRequestDto
jobTypeType of cron job to schedule
ScheduleCronJobResponseDto
jobTypeType of cron job
scheduleNameAWS EventBridge schedule name
messageSuccess message
DeleteCronJobRequestDto
jobTypeType of cron job to delete
CronJobStatusResponseDto
jobTypeType of cron job
isEnabledWhether the cron job is currently scheduled and enabled
messageStatus message
scheduleNameAWS EventBridge schedule name (if exists)
scheduleExpressionSchedule expression (if exists)
stateCurrent state of the schedule (if exists)
DeviceChipModel
Hardware chip model identifier used in the device
PlugType
Hardware type classification of the plug device (PLUG only)
McbPhase
Set only when the list is requested with expandPhases=true and this row represents a single phase of a split-mode COIL3P MCB. In that mode realTimePower, realTimeCurrent, realTimeVoltage, totalEnergyUsage and powerFactor hold the values of this phase.
AirconControlBrand
Air conditioner brand (AIRCON_CONTROL only)
GangSwitchState
gangNumberGang number (1-4)
onStatusON/OFF status of this gang switch
labelOptional label/name for this gang switch
SwitchType
Type of appliance the switch controls (SMART_SWITCH only)
ScheduledActionType
Action type to execute at scheduled time
OneTimeScheduleEntry
dateTimeScheduled date and time (ISO 8601 format)
actionAction type to execute at scheduled time
actionValueOptional value for actions that require it (e.g., temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS)
ruleNameEventBridge rule name for tracking and management
DailyScheduleEntry
timeScheduled time in HH:mm format
actionAction type to execute at scheduled time
actionValueOptional value for actions that require it (e.g., temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS)
ruleNameEventBridge rule name for tracking and management
ScheduleExecutionMode
Where the weekly schedule executes. CLOUD = AWS EventBridge rules fired by the backend. ON_DEVICE = compiled into an MQTT timer payload stored in firmware, so it survives the device going offline. One-time schedules are always CLOUD.
ScheduleConfirmationState
Whether the device has acked the on-device schedule over MQTT. PENDING until it confirms. Only meaningful when executionMode is ON_DEVICE.
DeviceSchedule
One-time scheduled tasks that execute once and auto-delete after execution
Recurring schedule entries for Monday
Recurring schedule entries for Tuesday
Recurring schedule entries for Wednesday
Recurring schedule entries for Thursday
Recurring schedule entries for Friday
Recurring schedule entries for Saturday
Recurring schedule entries for Sunday
executionModeWhere the weekly schedule executes. CLOUD = AWS EventBridge rules fired by the backend. ON_DEVICE = compiled into an MQTT timer payload stored in firmware, so it survives the device going offline. One-time schedules are always CLOUD.
confirmationStateWhether the device has acked the on-device schedule over MQTT. PENDING until it confirms. Only meaningful when executionMode is ON_DEVICE.
DeviceThresholdsDto
Limits sent to this device but not yet confirmed by its firmware. Keys are the threshold field names below. Present only while a save is outstanding: the device is offline, or its firmware does not echo confirmations. A value here is NOT being enforced by the hardware, and the corresponding field below still holds the last confirmed value (or is absent if there never was one).
thresholdEnabledWhether threshold alerting is switched on for this device. When false the values below are retained but no notification fires.
notificationThresholdHourSustained hours a reading must stay out of range before a notification is sent.
notificationCooldownMinimum time in MILLISECONDS between repeat notifications for the same device — the hardware works in ms. Schema default is 300000 (5 minutes).
voltageMaxMaximum voltage before an alert, in volts.
currentMaxMaximum current before an alert, in amperes.
powerMaxMaximum power before an alert, in watts.
voltageAMinPhase A minimum voltage.
voltageBMinPhase B minimum voltage.
voltageCMinPhase C minimum voltage.
voltageAMaxPhase A maximum voltage.
voltageBMaxPhase B maximum voltage.
voltageCMaxPhase C maximum voltage.
currentAMaxPhase A maximum current.
currentBMaxPhase B maximum current.
currentCMaxPhase C maximum current.
powerAMaxPhase A maximum power.
powerBMaxPhase B maximum power.
powerCMaxPhase C maximum power.
temperatureMinMinimum ambient temperature before an alert, in °C.
temperatureMaxMaximum ambient temperature before an alert, in °C.
humidityMinMinimum relative humidity before an alert, in %.
humidityMaxMaximum relative humidity before an alert, in %.
thresholdGroupNameName of the shared threshold group this environment sensor follows, when one is assigned. The group holds the full per-metric limits (CO₂, PM, VOC, lux, sound); this DTO carries only the sensor-level values.
flowRateMinMinimum flow rate before an alert.
flowRateMaxMaximum flow rate before an alert.
inletTemperatureMinMinimum inlet temperature before an alert, in °C.
inletTemperatureMaxMaximum inlet temperature before an alert, in °C.
outletTemperatureMinMinimum outlet temperature before an alert, in °C.
outletTemperatureMaxMaximum outlet temperature before an alert, in °C.
leakThresholdFlowRateFlow rate that, if sustained, is treated as a leak and raises a leak alert.
DeviceDetailsDto
_idUnique device identifier
deviceNameDevice name
macIdDevice MAC address
deviceTypeDevice type
onStatusCurrent ON/OFF status
systemSystem ID
createdAtDevice creation timestamp
updatedAtLast update timestamp
lastSeenLast time the device was seen/reported
deviceStatusDevice status
systemNameSystem name (only populated in SUPERADMIN /devices endpoint)
Tenant details (populated)
User details (populated)
Room details (populated)
Zone details (populated)
deviceNumberUnique device number for identification
batchNumberManufacturing batch number for tracking production groups
remarksAdditional remarks or notes about the device
locationPhysical location or address where the device is installed
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
isLockedLocked status of the device
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
deviceModelModel name or identifier of the device connected to this plug (PLUG only)
deviceBrandBrand or manufacturer of the device connected to this plug (PLUG only)
plugCategoryCategory classification for the connected device type (PLUG only). See GET /plug-category for valid values.
plugTypeHardware type classification of the plug device (PLUG only)
ecoguardPlugEcoguard power-saving configuration settings reference ID (PLUG only)
ecoguardEnabledWhether EcoGuard is currently enabled for this plug (PLUG only)
realTimePowerReal-time power consumption in watts (PLUG only)
realTimeCurrentReal-time current in amperes (PLUG only)
realTimeVoltageReal-time voltage (PLUG only)
powerFactorPower factor (PLUG only)
totalEnergyUsageTotal energy usage in watt-hours (PLUG only)
ecoguardWattsEcoguard power threshold in watts (PLUG only)
ecoguardMinutesEcoguard time threshold in minutes (PLUG only)
ratedCurrentRated current in amperes (MCB only)
mcbTypeMCB type (MCB only)
tripStatusTrip status - whether the MCB has tripped (MCB only)
distributionBoxDistribution box ID (MCB only)
positionPosition in distribution box (MCB only)
isSingleWhether a COIL3P MCB is treated as one combined 3-phase load (true/undefined) or split into 3 independent single-phase circuits (false) (MCB only)
phaseSet only when the list is requested with expandPhases=true and this row represents a single phase of a split-mode COIL3P MCB. In that mode realTimePower, realTimeCurrent, realTimeVoltage, totalEnergyUsage and powerFactor hold the values of this phase.
phaseNameUser-defined name of this row's phase (expandPhases=true rows only)
externalIdDownstream address of a RIDGE-fronted unit on its gateway bus (EXTERNAL only). Such a row shares its gateway's deviceNumber, so this is what tells the units of one gateway apart — the pair reads as "1660:3", the way a phase leg reads "11/L1".
unitNumberPer-gateway number of a RIDGE-fronted unit (EXTERNAL only). Reads as "1660-3" with the gateway's deviceNumber; preferred over externalId for display.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than directly-connected hardware.
realTimePowerAReal-time active power for phase A in watts (COIL3P MCB only)
realTimePowerBReal-time active power for phase B in watts (COIL3P MCB only)
realTimePowerCReal-time active power for phase C in watts (COIL3P MCB only)
realTimeCurrentAReal-time current for phase A in amperes (COIL3P MCB only)
realTimeCurrentBReal-time current for phase B in amperes (COIL3P MCB only)
realTimeCurrentCReal-time current for phase C in amperes (COIL3P MCB only)
realTimeVoltageAReal-time voltage for phase A in volts (COIL3P MCB only)
realTimeVoltageBReal-time voltage for phase B in volts (COIL3P MCB only)
realTimeVoltageCReal-time voltage for phase C in volts (COIL3P MCB only)
totalEnergyUsageATotal energy usage for phase A in kWh (COIL3P MCB only)
totalEnergyUsageBTotal energy usage for phase B in kWh (COIL3P MCB only)
totalEnergyUsageCTotal energy usage for phase C in kWh (COIL3P MCB only)
temperatureSet temperature in Celsius (AIRCON_CONTROL only)
modeOperating mode (AIRCON_CONTROL only)
fanFan speed setting (AIRCON_CONTROL only)
swingSwing setting (AIRCON_CONTROL only)
brandAir conditioner brand (AIRCON_CONTROL only)
isIRRemoteWhether this device uses IR remote control (AIRCON_CONTROL only)
numberOfGangsNumber of gangs/buttons on the switch (SMART_SWITCH only)
Individual gang switch states with ON/OFF status (SMART_SWITCH only)
switchTypeType of appliance the switch controls (SMART_SWITCH only)
Weekly and one-time schedule configuration for this device
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
sensorDataEnvironmental sensor data (ENV_SENSOR only)
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Omitted entirely when the device has no thresholds set.
GetDevicesResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of devices with their full details. Each device includes base fields plus type-specific fields based on deviceType.
DeviceHistoryItem
_idUnique identifier for the history entry
onStatusStatus of the device (ON/OFF)
triggerSourceSource that triggered the status change
createdAtTimestamp when the status change occurred
temperatureTemperature setting (Aircon Control only) - present when device is an aircon control
modeOperation mode (Aircon Control only) - present when device is an aircon control
fanFan speed (Aircon Control only) - present when device is an aircon control
swingSwing setting (Aircon Control only) - present when device is an aircon control
brandBrand of AC (Aircon Control only) - present when device is an aircon control
Gang switch states (Smart Switch only) - present when device is a smart switch, shows the state of each gang at the time of this history entry
GetDeviceHistoryDto
Array of device history entries
totalTotal number of history entries
MultipleDevicesConfigurationDto
deviceTypeType of devices to configure
deviceIdsArray of unique device identifiers from IoT devices to configure in batch
ssidPrimary network SSID (Wi-Fi name) to configure for all selected devices
passwordPrimary Wi-Fi network password to configure for all selected devices
ssid2Secondary network SSID (Wi-Fi name) to configure for all selected devices
password2Secondary Wi-Fi network password to configure for all selected devices
ssid3Tertiary network SSID (Wi-Fi name) to configure for all selected devices
password3Tertiary Wi-Fi network password to configure for all selected devices
ssidPriorityOrdered list of SSIDs by connection priority. The device will attempt to connect to these networks in the given order.
systemNameSystem name to assign to all selected devices for organizational grouping
useShadowDeliver via the AWS IoT device shadow when the firmware supports it (default). Set false to force the legacy changeWifi publish for every device in this request, e.g. to roll back if shadow delivery misbehaves.
DeviceConfigurationDto
deviceTypeType of device to configure (PLUG, MCB, ENV_SENSOR). Determines which device will receive the configuration.
ssidPrimary network SSID (Wi-Fi name) that the device should connect to
passwordPrimary Wi-Fi network password
ssid2Secondary network SSID (Wi-Fi name)
password2Secondary Wi-Fi network password
ssid3Tertiary network SSID (Wi-Fi name)
password3Tertiary Wi-Fi network password
ssidPriorityOrdered list of SSIDs by connection priority. The device will attempt to connect to these networks in the given order.
systemNameName of the system that the device belongs to for organizational grouping
useShadowDeliver via the AWS IoT device shadow when the firmware supports it (default). Set false to force the legacy changeWifi publish for every device in this request, e.g. to roll back if shadow delivery misbehaves.
ErrorLog
_idError log document ID
errorTypeType or code of the error
errorTitleType or code of the error
errorMessageDetailed error message
createdAtDate Time of the Creation
macIdDevice MAC Address
deviceTypeType of device
deviceIdDevice ID
systemIdTagged System
externalDeviceIdExternalDevice this error belongs to, when the reporting device is a RIDGE gateway relaying a fault from one of the units it fronts. deviceId stays the gateway, so a per-gateway query still returns it.
externalIdDownstream address of the faulting unit as the gateway reported it (iTM pointId / Daikin ac id). Retained even when no ExternalDevice row matched.
GetErrorHistoryDto
Array of error log records for devices matching the query
totalTotal count of error logs available for pagination purposes
CreateWhiteListedDevicesDto
macIdsArray of unique MAC address identifiers from IoT devices to add to the whitelist
deviceTypeType of device
batchNumberManufacturing batch number for tracking device production groups and quality control
chipModelHardware chip model identifier used in the devices (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number installed on the devices in semantic versioning format
WhiteList
_idPrimary ID of the MacId
macIdMac ID of the device (from IoT device)
deviceTypeType of device
batchNumberBatch Number of the device
chipModelChip Model of the device
versionNumberVersion number of the device
deviceNumberAuto-incremented Device Number for whitelisted devices
adminCreatedName of the admin who created the whitelist entry
createdAtDate Time of the Creation
GetWhitelistedDevicesDto
Array of devices that are approved and registered in the whitelist
totalTotal count of whitelisted devices for pagination and tracking
GetIsDeviceWhiteListedDto
isWhiteListedBoolean flag indicating whether the device is approved and present in the whitelist
BulkRemoveWhitelistDto
idsArray of whitelist entry IDs to remove
ManufacturerRegisterDeviceDto
macIdMAC address of the device
deviceTypeType of device being registered
batchNumberManufacturing batch number
chipModelHardware chip model of the device
versionNumberFirmware version number installed on the device
adminCreatedName of the manufacturer or person registering the device. Defaults to "Manufacturer" if not provided.
ManufacturerDeviceResponseDto
macIdMAC address of the device
deviceNumberAuto-assigned device number for this device
alreadyExistedTrue if the MAC was already registered and this was a lookup, false if newly registered
ManufacturerPlugStatusDto
_idDevice ID
macIdMAC address of the device
deviceNumberUnique device number for identification
onStatusCurrent on/off status of the device
ManufacturerSystemPlugsResponseDto
List of plug devices in the system
totalTotal number of plug devices
ManufacturerDeviceStatusDto
_idDevice ID
macIdMAC address of the device
deviceNumberUnique device number for identification
onStatusCurrent on/off status of the device
ManufacturerSystemDevicesResponseDto
List of devices of the requested type in the system
totalTotal number of devices returned
MultipleDevicesChangeSystemDto
deviceIdsArray of unique device identifiers (plugs or MCBs) to reassign to a different system
newSystemIdUnique identifier of the target system to reassign all selected devices to
UpdateMultipleDevicesRelationshipsDto
deviceIdsArray of unique device identifiers to update relationships for
tenantIdUnique identifier of the tenant to assign the devices to. Pass null to remove the tenant relationship.
zoneIdUnique identifier of the zone to assign ownership of the devices to. Pass null to remove the zone relationship.
roomIdUnique identifier of the room to assign the devices to. Pass null to remove the room relationship.
UpdateDeviceBaseDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
DeviceUpdateItem
deviceIdMongoDB ID of the device to update
Fields to update on the device
BulkUpdateDevicesDto
Array of device update operations to perform in a single batch request
UpdateDevicesLockStatusDto
deviceIdsArray of device IDs to lock or unlock
isLockedLock status to set. True to lock devices, false to unlock.
FailedDeviceLockUpdateDto
deviceIdDevice ID that failed to update
reasonReason for failure
UpdateDevicesLockStatusResponseDto
successCountNumber of devices successfully updated
failedCountNumber of devices that failed to update
successfulDeviceIdsList of device IDs that were successfully updated
List of devices that failed to update with reasons
UpdateDevicesSpareStatusDto
deviceIdsArray of device IDs to mark as spare or non-spare
isSpareSpare status to set. True to mark as spare, false to unmark.
UpdateDevicesRelationshipTenantDto
deviceIdsArray of unique device identifiers to update relationships for
zoneIdUnique identifier of the zone to assign ownership of the devices to within the tenant
roomIdUnique identifier of the room to assign the devices to for location tracking
UpdateDevicesRelationshipZoneDto
deviceIdsArray of unique device identifiers to update room assignment for
roomIdUnique identifier of the room to assign the devices to for location tracking
MultipleDevicesCalibrationDto
deviceIdsArray of unique device identifiers to apply calibration settings to
systemNameName of the system containing the devices to calibrate for batch processing
deviceTypeType of device to calibrate (PLUG, MCB, ENV_SENSOR). Determines which devices will receive calibration data.
voltageMultiplierCalibration multiplier to adjust voltage sensor readings for accuracy correction
voltageOffsetCalibration offset value in volts to adjust voltage sensor baseline readings
currentMultiplierCalibration multiplier to adjust current sensor readings for accuracy correction
currentOffsetCalibration offset value in amperes to adjust current sensor baseline readings
powerMultiplierCalibration multiplier to adjust power measurement calculations for accuracy
powerOffsetCalibration offset value in watts to adjust power measurement baseline
InactiveDeviceDto
_idDevice document ID
macIdDevice MAC ID (unique identifier)
deviceNumberDevice number identifier
deviceNameDevice display name
deviceTypeType of device
lastSeenLast time the device sent a heartbeat (last seen timestamp)
inactiveDurationDuration the device has been inactive in milliseconds
inactiveDurationFormattedDuration the device has been inactive in human-readable format
tenantIdTenant ID that owns this device
tenantNameTenant name that owns this device
GetInactiveDevicesDto
Array of inactive devices with their details
totalTotal count of inactive devices found
retrievedAtTimestamp when this data was retrieved
SaveInactiveSnapshotResponseDto
snapshotIdSnapshot document ID
systemIdSystem ID this snapshot belongs to
totalInactiveDevicesNumber of inactive devices captured in this snapshot
snapshotDateTimestamp when the snapshot was taken
messageMessage confirming the snapshot was saved
InactiveDeviceSnapshot
_idSnapshot document ID
System this snapshot belongs to
Array of inactive devices with their details
totalTotal count of inactive devices
retrievedAtTimestamp when this data was retrieved
createdAtTimestamp when this snapshot was created
updatedAtTimestamp when this snapshot was last updated
referenceDateOptional reference date used for duration calculation
GetInactiveSnapshotsDto
Array of inactive device snapshots
totalTotal count of snapshots found
DeviceCountDto
deviceCountTotal number of devices registered in the system across all statuses
deviceOnCountNumber of devices currently in ON status and actively consuming power
deviceOffCountNumber of devices currently in OFF status and not consuming power
deviceInactiveCountNumber of devices marked as inactive or not communicating with the system
deviceSpareCountNumber of spare devices (excluded from total, on, off, and inactive counts)
DeviceTypeBreakdownDto
PLUGNumber of PLUG devices in the system
MCBNumber of MCB (Miniature Circuit Breaker) devices in the system
ENV_SENSORNumber of ENV_SENSOR (Environmental Sensor) devices in the system
SMART_SWITCHNumber of SMART_SWITCH devices in the system
AIRCON_CONTROLNumber of AIRCON_CONTROL (Air Conditioning Controller) devices in the system
WATER_METERNumber of WATER_METER devices in the system
RIDGENumber of RIDGE gateways plus every external device they front
totalTotal number of devices in the system
ChangeDeviceSystemDto
newSystemIdUnique identifier of the system to reassign the device to for organizational management
ToggleDeviceStatusDto
deviceIdUnique identifier of the device to be toggled
onStatusDesired power state. Use ON to turn the device on (all gangs for SmartSwitch), or OFF to turn it off (all gangs for SmartSwitch).
Device
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
BulkToggleDeviceDto
deviceIdsArray of device IDs to toggle
onStatusDesired power state for all devices. Use ON to turn all devices on (all gangs for SmartSwitch), or OFF to turn all devices off (all gangs for SmartSwitch).
DeviceResetScope
Slices of device state to wipe, applied identically to every listed device.
BulkResetDevicesDto
deviceIdsDevices to reset. Ids outside the system are reported back as notFound.
scopesSlices of device state to wipe, applied identically to every listed device.
ResetDevicesResponseDto
requestedNumber of device IDs requested
resetNumber of devices found in the system and reset
notFoundRequested device IDs that were not found in the system
scopesScopes that were applied
ResetDeviceDto
scopesSlices of device state to wipe. Only the listed scopes are touched; everything else is left alone.
BulkDeleteDeviceDto
deviceIdsArray of device IDs to delete
BulkManualBlacklistDto
deviceIdsArray of device IDs to blacklist/unblacklist
blacklistWhether to blacklist (true) or remove blacklist (false)
BulkUnblacklistDto
deviceIdsArray of device IDs to clear from all auto-update blacklists (auto + manual)
EnvironmentType
Environment type to set for the devices. STAGING for staging environment, PRODUCTION for production environment.
ChangeEnvironmentDto
deviceIdsArray of device IDs to change environment for
setEnvironmentEnvironment type to set for the devices. STAGING for staging environment, PRODUCTION for production environment.
BulkUpdateEnergyThresholdsDto
deviceIdsIDs of energy devices (Plugs or MCBs) to update
voltageMaxMax Threshold voltage reading in volts
currentMaxMax Threshold current reading in amps
powerMaxMax Threshold power reading in watts
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device. MCB only.
voltageAMinMin threshold phase A voltage in volts (COIL3P only)
voltageBMinMin threshold phase B voltage in volts (COIL3P only)
voltageCMinMin threshold phase C voltage in volts (COIL3P only)
voltageAMaxMax threshold phase A voltage in volts (COIL3P only)
voltageBMaxMax threshold phase B voltage in volts (COIL3P only)
voltageCMaxMax threshold phase C voltage in volts (COIL3P only)
currentAMaxMax threshold phase A current in amps (COIL3P only)
currentBMaxMax threshold phase B current in amps (COIL3P only)
currentCMaxMax threshold phase C current in amps (COIL3P only)
powerAMaxMax threshold phase A power in watts (COIL3P only)
powerBMaxMax threshold phase B power in watts (COIL3P only)
powerCMaxMax threshold phase C power in watts (COIL3P only)
DeviceBulkEnvironmentThresholdsDto
deviceIdsIDs of environment sensors to update
temperatureMinMin Threshold temperature reading in degrees Celsius
temperatureMaxMax Threshold temperature reading in degrees Celsius
carbonDioxideThreshold CO2 reading in ppm
luxThreshold light level in lux (lx)
formaldehydeThreshold formaldehyde (HCHO) reading in µg/m³
humidityThreshold humidity percentage
pm1Threshold PM1 in µg/m³
pm2_5Threshold PM2.5 in µg/m³
pm10Threshold PM10 in µg/m³
totalVolatileOrganicCompoundsThreshold Total Volatile Organic Compounds in ppb
soundLevelThreshold Sound Level in dB
motionDetectedMotion detection status
notificationThresholdHourHourly notification threshold for the Environment Sensor
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device. MCB only.
DeviceBulkWaterMeterThresholdsDto
deviceIdsIDs of water meters to update
flowRateMaxMax threshold flow rate (m³/h)
flowRateMinMin threshold flow rate (m³/h)
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device
inletTemperatureMaxMax threshold inlet temperature (°C)
inletTemperatureMinMin threshold inlet temperature (°C)
outletTemperatureMaxMax threshold outlet temperature (°C)
outletTemperatureMinMin threshold outlet temperature (°C)
UpdateEnergyDeviceThresholdDto
voltageMaxMax Threshold voltage reading in volts
currentMaxMax Threshold current reading in amps
powerMaxMax Threshold power reading in watts
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device. MCB only.
voltageAMinMin threshold phase A voltage in volts (COIL3P only)
voltageBMinMin threshold phase B voltage in volts (COIL3P only)
voltageCMinMin threshold phase C voltage in volts (COIL3P only)
voltageAMaxMax threshold phase A voltage in volts (COIL3P only)
voltageBMaxMax threshold phase B voltage in volts (COIL3P only)
voltageCMaxMax threshold phase C voltage in volts (COIL3P only)
currentAMaxMax threshold phase A current in amps (COIL3P only)
currentBMaxMax threshold phase B current in amps (COIL3P only)
currentCMaxMax threshold phase C current in amps (COIL3P only)
powerAMaxMax threshold phase A power in watts (COIL3P only)
powerBMaxMax threshold phase B power in watts (COIL3P only)
powerCMaxMax threshold phase C power in watts (COIL3P only)
BulkUniqueEnergyThresholdItemDto
deviceIdDevice ID (Plug or MCB)
BulkUniqueUpdateEnergyThresholdsDto
Array of devices with their individual threshold values
UpdateEnvironmentSensorThresholdDto
temperatureMinMin Threshold temperature reading in degrees Celsius
temperatureMaxMax Threshold temperature reading in degrees Celsius
carbonDioxideThreshold CO2 reading in ppm
luxThreshold light level in lux (lx)
formaldehydeThreshold formaldehyde (HCHO) reading in µg/m³
humidityThreshold humidity percentage
pm1Threshold PM1 in µg/m³
pm2_5Threshold PM2.5 in µg/m³
pm10Threshold PM10 in µg/m³
totalVolatileOrganicCompoundsThreshold Total Volatile Organic Compounds in ppb
soundLevelThreshold Sound Level in dB
motionDetectedMotion detection status
notificationThresholdHourHourly notification threshold for the Environment Sensor
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device. MCB only.
BulkUniqueEnvSensorThresholdItemDto
deviceIdEnvironment sensor device ID
Threshold values for this device. Fields not supported by the sensor type are silently skipped.
BulkUniqueUpdateEnvSensorThresholdsDto
Array of devices with their individual threshold values
UpdateWaterMeterThresholdDto
flowRateMaxMax threshold flow rate (m³/h)
flowRateMinMin threshold flow rate (m³/h)
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device
inletTemperatureMaxMax threshold inlet temperature (°C)
inletTemperatureMinMin threshold inlet temperature (°C)
outletTemperatureMaxMax threshold outlet temperature (°C)
outletTemperatureMinMin threshold outlet temperature (°C)
BulkUniqueWaterMeterThresholdItemDto
deviceIdWater meter device ID
BulkUniqueUpdateWaterMeterThresholdsDto
Array of devices with their individual threshold values
EnergyThresholdBaselineDto
voltageMinMinimum voltage reading (V)
voltageMaxMaximum voltage reading (V)
currentMinMinimum current reading (A)
currentMaxMaximum current reading (A)
powerMinMinimum power reading (W)
powerMaxMaximum power reading (W)
currentAMinMinimum phase-A current reading (A) — MCB only
currentAMaxMaximum phase-A current reading (A) — MCB only
currentBMinMinimum phase-B current reading (A) — MCB only
currentBMaxMaximum phase-B current reading (A) — MCB only
currentCMinMinimum phase-C current reading (A) — MCB only
currentCMaxMaximum phase-C current reading (A) — MCB only
EnvironmentSensorThresholdBaselineDto
temperatureMinMinimum temperature reading (°C)
temperatureMaxMaximum temperature reading (°C)
carbonDioxideMinMinimum CO2 reading (ppm)
carbonDioxideMaxMaximum CO2 reading (ppm)
luxMinMinimum light level reading (lx)
luxMaxMaximum light level reading (lx)
formaldehydeMinMinimum formaldehyde reading (µg/m³)
formaldehydeMaxMaximum formaldehyde reading (µg/m³)
humidityMinMinimum humidity (%)
humidityMaxMaximum humidity (%)
pm1MinMinimum PM1 reading (µg/m³)
pm1MaxMaximum PM1 reading (µg/m³)
pm2_5MinMinimum PM2.5 reading (µg/m³)
pm2_5MaxMaximum PM2.5 reading (µg/m³)
pm10MinMinimum PM10 reading (µg/m³)
pm10MaxMaximum PM10 reading (µg/m³)
totalVolatileOrganicCompoundsMinMinimum TVOC reading (ppb)
totalVolatileOrganicCompoundsMaxMaximum TVOC reading (ppb)
soundLevelMinMinimum sound level (dB)
soundLevelMaxMaximum sound level (dB)
WaterMeterThresholdBaselineDto
flowRateMinMinimum flow rate (m³/h)
flowRateMaxMaximum flow rate (m³/h)
ThresholdBaselineResponseDto
deviceIdDevice ID
deviceTypeDevice type
periodStartStart date of the baseline period
periodEndEnd date of the baseline period
dataPointCountNumber of data points used to calculate the baseline
messageWarning message when insufficient data (< 14 days) was available for the baseline calculation
Energy device baseline (Plug/MCB)
Environment sensor baseline
Water meter baseline
BulkThresholdBaselineRequestDto
deviceIdsIDs of devices to calculate threshold baselines for
FailedThresholdBaselineDto
deviceIdDevice ID that failed to generate a baseline
reasonReason for failure
BulkThresholdBaselineResponseDto
successCountNumber of devices for which baselines were successfully generated
failedCountNumber of devices for which baseline generation failed
Successfully generated baselines
Devices that failed baseline generation with reasons
UpdateInactivityNotificationDto
enabledEnable or disable inactivity notifications for this device
ClaimTokenResponseDto
claimTokenEncrypted claim token for device
claimUrlFull URL for claiming the device
PrintQrRequestDto
macIdMAC address of the device. Provide either macId or deviceNumber.
deviceNumberWhitelist device number of the device. Provide either macId or deviceNumber.
deviceTypeType of device (unused for print lookup)
batchNumberManufacturing batch number (unused for print lookup)
chipModelHardware chip model (unused for print lookup)
versionNumberFirmware version number (unused for print lookup)
adminCreatedName of the requester (unused for print lookup)
PrintQrResponseDto
deviceNumberAuto-assigned device number for this device
macIdMAC address of the device
claimUrlFull URL for claiming the device — encode this as QR
ClaimDeviceResponseDto
messageSuccess message
deviceIdDevice ID
deviceNameDevice name
deviceNumberDevice number
deviceTypeDevice type
systemIdSystem ID the device belongs to
zoneIdZone ID the device was assigned to
zoneNameZone name the device was assigned to
tenantIdTenant ID the device was assigned to (if any)
tenantNameTenant name the device was assigned to (if any)
CreateNotificationDto
titleTitle of the notification
messageMessage of the notification
systemNotification for a specific System
typeType of the notification
recieveTypeReceive type of the notification
deviceNotification for a specific Device (optional - if not provided, finds system-level admin)
Notification
_idPrimary ID of the Notification
adminThe account this copy of the notification belongs to. One document is written per recipient, so this is the audience, not an ownership hint.
titleTitle of the Notification
messageMessage of the Notification
Notification for a specific System
deviceNotification for a specific Device
typeType of the Notification (ENUM)
recieveTypeType of the Notification (ENUM)
isReadWhether the recipient has read this notification. Reading resolves it — there is no separate resolve step.
eventKeyIdentity of the event this notification reports, identical across every recipient copy. Suppression asks whether the event fired, not whether some document exists.
occurrenceIdIdentity of the fan-out batch this copy belongs to, identical across every recipient copy of the same occurrence. Unlike eventKey (stable across re-fires), this distinguishes one occurrence from the next so read-side dedup collapses recipient copies without collapsing history.
createdAtCreation date of the Notification
updatedAtLast update date of the Notification
NotificationGroup
SearchQueryResultDto
resultsSearch results
totalTotal number of results
NotificationGroupsResponseDto
groupsGroups that at least one of the caller visible notifications belongs to. Derived from the notification types actually stored, so a group with nothing in it never appears and the filter cannot offer a dead option.
ReadAllNotificationsResponseDto
readCountNumber of notifications marked as read
BasicEmailNotificationDto
receiverEmailEmail address of the receiver
subjectSubject of the email notification
contentContent of the email notification
BusinessOrderDevice
Device type identifier
BusinessSelectedDeviceDto
deviceTypeDevice type identifier
qtyNumber of units of this device
PublicWebEmailNotificationDto
firstNamefirst name of the sender
lastNamelast name of the sender
phoneNumberphone number of the sender
companycompany name of the sender
emailEmail address of the sender
messageContent of the email notification
Business devices selected with quantities
selectedCategoriesBusiness categories selected
NewsletterSubscriberDto
emailSubscriber email address
nameSubscriber name
subscribedFromSourceSubscriber source
NewsletterSubscriberStatus
Status of the newsletter subscriber
NewsletterSubscriberResponseDto
_idUnique identifier of the newsletter subscriber
emailEmail of the newsletter subscriber
statusStatus of the newsletter subscriber
nameName of the newsletter subscriber
subscribedFromIpIP address from which the user subscribed
subscribedFromSourceSource from which the user subscribed
createdAtTimestamp when the subscriber was created
updatedAtTimestamp when the subscriber was last updated
EmailRecipientsType
Type of recipient list for the email campaign
ManualSelectionRecipientDto
recipientTypeType of recipient
recipientIdID of the recipient
CreateEmailCampaignDto
nameName of the email campaign
templateIdID of the newsletter template to use for the email campaign
recipientTypeType of recipient list for the email campaign
subjectSubject of the campaign email
List of manually selected recipients with their types (required if recipientType is MANUAL_SELECTION)
scheduledAtScheduled send time for the email campaign in ISO 8601 format
EmailCampaignStatus
Current status of the email campaign
EmailCampaign
_idUnique identifier of the email campaign
nameName of the email campaign
sourceTemplateReference to the original template used for this email campaign
subjectSubject of the campaign email
designJsonCopied JSON from template for campaign-specific email customization
renderedHtmlRendered HTML content for this email campaign
plainTextPlain text version of the email campaign
previewTextShort text that appears in email preview before opening
recipientTypeType of recipients for the email campaign
List of manually selected recipients with their types (if recipientType is MANUAL_SELECTION)
statusCurrent status of the email campaign
scheduledAtScheduled send time for the email campaign
scheduleNameAWS EventBridge Scheduler name for the scheduled campaign send
sentAtTime when the email campaign was sent
totalRecipientsTotal number of recipients for the email campaign
errorMessageError message if campaign sending failed
createdByAdmin who created the campaign
updatedByAdmin who last updated the campaign
SendEmailCampaignDto
campaignIdID of the email campaign to be sent
statusCurrent status of the email campaign
messageResult message after attempting to send the email campaign
totalRecipientsTotal number of recipients for the email campaign
SendTestEmailRequestDto
testEmailEmail address to send the test email to
testNameName of the test recipient for personalization
GetEmailCampaignsDto
List of email campaigns
totalTotal number of email campaigns
UpdateEmailCampaignDto
nameName of the email campaign
subjectSubject of the campaign email
recipientTypeType of recipient list for the email campaign
List of manually selected recipients with their types (used when recipientType is MANUAL_SELECTION)
designJsonUnlayer design JSON for campaign-specific email customization
renderedHtmlRendered HTML content of the email campaign
plainTextPlain text version of the email campaign
previewTextShort text that appears in email preview before opening
scheduledAtScheduled send time for the email campaign in ISO 8601 format. Set to null to convert SCHEDULED to DRAFT.
EmailTemplateDto
nameName of the email template
subjectSubject of the email template
designJsonJSON structure of the email template
descriptionDescription of the email template
previewTextPreview text for the email template
renderedHtmlRendered HTML content of the email template
plainTextPlain text version of the email template
EmailTemplateStatus
Indicates status of the email template
EmailTemplate
_idUnique identifier of the email template
nameName of the email template
descriptionDescription of the email template
subjectSubject of the email template
designJsonJSON from Unlayer editor
renderedHtmlCompiled HTML content of the email template
plainTextPlain text version of the email template
previewTextShort text that appears in email preview before opening
statusIndicates status of the email template
thumbnailUrlThumbnail image of the template for superadmin dashboard
createdByAdmin who created the template
updatedByAdmin who last updated the template
GetEmailTemplatesDto
List of email templates
totalTotal number of email templates
PreviewEmailTemplateDto
renderedHtmlRendered HTML preview of the email template
plainTextPlain text version of the email template preview
UpdateEmailTemplateDto
nameName of the email template
descriptionDescription of the email template
subjectSubject of the email template
designJsonJSON structure of the email template
previewTextPreview text for the email template
renderedHtmlRendered HTML content of the email template
plainTextPlain text version of the email template
statusStatus of the email template
CreateFirmwareDto
versionNumberSemantic version number for the firmware release. Must follow the format major.minor.patch (e.g., 1.0.0).
chipModelTarget chip model for this firmware build. Determines which plug devices can receive this firmware.
deviceTypeType of device this firmware is intended for (e.g., PLUG, MCB, ENV_SENSOR).
remarksOptional release notes or comments about this firmware version. Used to document changes and fixes.
filemcbTypeMCB subtype the firmware targets. Required when deviceType === MCB; ignored otherwise.
ReuploadFirmwareDto
fileremarksOptional updated release notes or comments about this firmware version. Used to document changes and fixes.
GetFirmwareResponseDto
_idPrimary ID of the Firmware
adminCreatedName of the admin who created the firmware entry
versionNumberFirmware version number
chipModelChip Model of the Device
deviceTypeType of device this firmware is intended for
createdAtTimestamp when the firmware was created
updatedAtTimestamp when the firmware was last updated
adminLastModifiedName of the admin who last modified/re-uploaded the firmware
mcbTypeMCB subtype this firmware targets. Set only when deviceType === MCB.
remarksRemarks or notes about the firmware
DeleteFirmwareByPrefixResponseDto
deletedNumber of firmware records removed
SendOtaDto
deviceIdsArray of unique plug identifiers to receive the OTA firmware update. Each plug will be notified via MQTT.
versionNumberFirmware version number to push to the specified devices. Must exist in the firmware repository.
chipModelTarget chip model for firmware compatibility validation. Ensures plugs receive compatible firmware.
deviceTypeType of device this firmware is intended for (e.g., PLUG, MCB, ENV_SENSOR).
mcbTypeMCB subtype to match against the firmware record. Required when deviceType === MCB.
targetVersionOptional filter to verify plugs are running this specific firmware version before updating. Used for validation.
streamingDeliver the firmware as an AWS IoT Job with MQTT stream file delivery instead of pushing a download URL. Streaming needs no outbound HTTPS from the device and yields a trackable job id, but the device firmware must implement the IoT Jobs + streams client.
OtaDispatchResponseDto
modeHow the firmware was delivered
jobIdAWS IoT Job id. Streaming mode only — poll it for progress.
streamIdAWS IoT stream id carrying the firmware. Streaming mode only.
targetCountNumber of devices targeted. Streaming mode only.
MassSendOtaRollbackDto
chipModelChip Model of the Plug
deviceTypeType of device this firmware is intended for (e.g., PLUG, MCB, ENV_SENSOR).
SendOtaRollbackDto
deviceIdsList of unique Plug IDs
chipModelChip Model of the Plug
deviceTypeType of device this firmware is intended for (e.g., PLUG, MCB, ENV_SENSOR).
GetFirmwareListDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of firmware objects containing version details, chip models, and metadata. Sorted by creation date. File information is excluded for security.
GenerateDownloadUrlResponseDto
urlClean OTA download URL without embedded token
jwtTokenJWT token for Authorization header (devices should send as Bearer token)
VersionDistributionDto
versionNumberFirmware version number
deviceCountNumber of devices with this firmware version
ChipModelDistributionDto
chipModelChip model
totalDevicesTotal number of devices for this chip model
Distribution of firmware versions for this chip model
DeviceTypeFirmwareDistributionDto
deviceTypeDevice type
totalDevicesTotal number of devices for this device type
Distribution of firmware versions grouped by chip model
GetFirmwareVersionDistributionDto
Firmware version distribution grouped by device type
totalTotal number of device types
DeviceFirmwareInfoDto
_idDevice ID
macIdDevice MAC ID
deviceTypeDevice type
onStatusDevice status
systemNameSystem name
systemIdSystem ID
deviceNameDevice name
deviceNumberDevice number
chipModelChip model
versionNumberFirmware version number
lastSeenLast time the device was seen/reported
autoUpdateAttemptsNumber of auto-update attempts for this device
autoUpdateBlacklistedWhether the device is automatically blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether the device is manually blacklisted from auto-updates by admin
GetDeviceFirmwareListDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of devices with firmware information
CreateAutoUpdatePolicyDto
enabledEnable or disable the auto-update policy
deviceTypeTarget device type for auto-updates
chipModelTarget chip model for auto-updates
targetVersionTarget firmware version to auto-update devices to
mcbTypeMCB subtype the policy targets. Required when deviceType === MCB; ignored otherwise.
sourceVersionsList of source firmware versions to update FROM. If empty or not provided, updates all versions. If specified, only devices on these versions will be auto-updated.
streamingDeliver firmware as an AWS IoT Job + MQTT stream instead of pushing a download URL. One job covers the whole cohort — an offline device picks up its queued execution when it reconnects. Requires firmware that implements the IoT Jobs + streams client.
maxRetriesMaximum number of OTA attempts per device before blacklisting
AutoUpdatePolicyResponseDto
_idPrimary ID of the policy
enabledEnable or disable the auto-update policy
deviceTypeTarget device type for auto-updates
chipModelTarget chip model for auto-updates
targetVersionTarget firmware version to auto-update devices to
streamingWhether the policy delivers firmware as an AWS IoT Job + MQTT stream instead of pushing a download URL.
maxRetriesMaximum number of OTA attempts per device before blacklisting
createdByAdmin email/ID who created this policy
lastModifiedByAdmin email/ID who last modified this policy
createdAtTimestamp when the policy was created
updatedAtTimestamp when the policy was last updated
sourceVersionsList of source firmware versions to update FROM. If empty, updates all versions.
AutoUpdateAffectedDeviceDto
_idPrimary ID of the device
deviceNameDevice name
macIdDevice MAC address
deviceTypeDevice type
chipModelChip model
versionNumberCurrent firmware version
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from further auto-update attempts
System information
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
AutoUpdateAffectedDevicesListDto
List of devices affected by the auto-update policy
totalTotal number of devices matching the policy criteria
policyTargetVersionTarget firmware version from the policy
needsUpdateCountNumber of devices that need updates (version mismatch, not blacklisted)
CreateOtaJobDto
deviceTypeType of device (PLUG, MCB, etc.)
chipModelHardware chip model identifier used in the device
targetVersionFirmware version to roll out to
mcbTypeMCB subtype. Required when deviceType === MCB.
sourceVersionsOnly target devices currently on these versions. Empty/omitted = all older versions.
deviceIdsRestrict the rollout to these specific devices. Intersected with the type/chip/version filter — a listed device still needs the update to be targeted. Omitted = every matching device.
systemIdsRestrict the rollout to devices in these systems. Omitted = every system. Intersected with the type/chip/version filter.
maxPerMinuteRollout rate cap (devices per minute).
abortThresholdPercentageAbort the rollout if this % of executions fail.
OtaJobResponseDto
jobIdAWS IoT Job ID for the rollout
streamIdAWS IoT Stream ID the firmware is delivered through (MQTT)
targetCountNumber of devices targeted by the rollout
fileSizeBytesFirmware size in bytes (streamed in blocks)
OtaJobListItemDto
jobIdAWS IoT Job ID
deviceTypeType of device (PLUG, MCB, etc.)
chipModelHardware chip model identifier used in the device
targetVersiontargetCountDevices targeted at creation
statussucceededExecutions succeeded (last reconcile)
failedExecutions failed/timed out (last reconcile)
createdAtWhen the rollout was created
mcbTypeMCB type (MCB only)
GetOtaJobsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
OtaJobExecutionDto
thingNameTarget Thing name
statusExecution status
detailRaw device-reported progress from statusDetails, when the firmware publishes it. Only populated while the execution is IN_PROGRESS.
progressPercentDownload progress parsed from detail. Absent when the device does not report progress — render an indeterminate bar in that case.
OtaJobStatusDto
jobIdstatusOverall job status
totalTotal target devices
succeededExecutions that succeeded
failedExecutions that failed / timed out / were rejected
queuedExecutions still queued — device has not picked the job up
inProgressExecutions the device is currently running
percentCompletePercent of targets in a terminal state ((succeeded + failed) / total)
CreateTenantDto
tenantNameName of the tenant. Represents a department, unit, or organization within the system.
adminCreationFlag indicating whether an tenant admin should be created, if so send invite.
tenantEmailPrimary email address for tenant contact. Used for notifications and billing communications.
remarksAdditional notes or comments about the tenant. Useful for documenting special arrangements or contact details.
levelFloor number where the tenant is primarily located. Used for organizing tenants within a building.
energyUsageInitial energy usage budget allocated to the tenant in kilowatt-hours. Used for tracking consumption against quotas.
Geographic location details of the tenant. Includes address, city, country, and coordinates for mapping purposes.
tenantTypeTenant type key. Must be a valid type defined for this system via /entity-type/TENANT.
GetTenantDto
_idUnique identifier of the tenant in the database.
tenantNameName of the tenant. Represents a department, unit, or organization within the system.
tenantEmailPrimary email address for tenant contact. Used for notifications and billing communications.
deviceCountTotal count of devices assigned to this tenant. Used for resource allocation tracking.
deviceOnCountNumber of devices currently in ON status for this tenant.
deviceOffCountNumber of devices currently in OFF status for this tenant.
deviceInactiveCountNumber of devices currently in INACTIVE status for this tenant.
totalEnergyUsageEnergy usage budget allocated to the tenant in kilowatt-hours. Tracks consumption against quotas.
Geographic location details of the tenant. Includes address, city, country, and coordinates.
levelFloor number where the tenant is primarily located. Used for organizing tenants within a building.
deviceSpareCountNumber of spare devices for this tenant.
rangeEnergyUsageEnergy consumption over the from..till window in kWh, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
totalFlaggedCountTotal number of rolling windows this tenant has been flagged. Represents how many different time periods the tenant exceeded thresholds.
totalViolationCountTotal number of individual violations across all time. Sum of all daily violations ever recorded for this tenant.
isMonitoringDisabledWhether surge monitoring is disabled for this tenant. If true, the tenant will not be checked for energy threshold violations.
suspectedDeviceTypesDevice types suspected of causing surge violations for this tenant.
confirmedDeviceTypesDevice types an operator has confirmed as the cause of surge violations for this tenant.
tenantTypeTenant type key
GetTenantsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of tenant objects matching the query criteria
GetRoomDto
_idUnique identifier of the room in MongoDB ObjectId format.
nameDisplay name of the room as registered in the system.
deviceCountTotal count of devices currently assigned to this room.
deviceOnCountNumber of devices currently in ON status for this room.
deviceOffCountNumber of devices currently in OFF status for this room.
deviceInactiveCountNumber of devices currently in INACTIVE status for this room.
totalEnergyUsageCumulative energy consumption from all devices in this room, measured in kilowatt-hours (kWh).
tenantIdUnique identifier of the tenant organization that owns this room.
tenantNameName of the tenant organization that owns this room. Included when tenant data is populated.
zoneIdUnique identifier of the zone that has access to this room.
zoneNameName of the zone that has access to this room. Included when zone data is populated.
remarksOptional administrative notes or comments about the room. Used for describing room purpose or equipment.
deviceSpareCountNumber of spare devices for this room.
rangeEnergyUsageEnergy consumption over the from..till window in kWh, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
totalFlaggedCountTotal number of rolling windows this room has been flagged. Represents how many different time periods the room exceeded thresholds.
totalViolationCountTotal number of individual violations across all time. Sum of all daily violations ever recorded for this room.
isMonitoringDisabledWhether surge monitoring is disabled for this room. If true, the room will not be checked for energy threshold violations.
squareMeterFloor area of the room in square meters.
energyIntensityEnergy intensity over the past 30 days in kWh/m²/month. Null if the room has no squareMeter set.
suspectedDeviceTypesDevice types suspected of causing surge violations for this room.
confirmedDeviceTypesDevice types an operator has confirmed as the cause of surge violations for this room.
roomTypeRoom type key
GetZoneDto
_idUnique identifier of the zone in MongoDB ObjectId format.
nameFull name of the zone as registered in the system.
emailEmail address of the zone used for authentication and notifications.
deviceCountTotal count of devices currently assigned to this zone across all their rooms.
deviceOnCountNumber of devices currently in ON status for this zone.
deviceOffCountNumber of devices currently in OFF status for this zone.
deviceInactiveCountNumber of devices currently in INACTIVE status for this zone.
totalEnergyUsageCumulative energy consumption from all devices assigned to the zone, measured in kilowatt-hours (kWh).
remarksOptional administrative notes or comments about the zone. Used for internal tracking and context.
tenantNameName of the tenant organization that the zone belongs to. Included when tenant data is populated.
tenantIdUnique identifier of the tenant organization that the zone is associated with.
deviceSpareCountNumber of spare devices for this zone.
rangeEnergyUsageEnergy consumption over the from..till window in kWh, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
Array of room objects that the zone has access to. Included when room details are populated.
totalFlaggedCountTotal number of rolling windows this zone has been flagged. Represents how many different time periods the zone exceeded thresholds.
totalViolationCountTotal number of individual violations across all time. Sum of all daily violations ever recorded for this zone.
isMonitoringDisabledWhether surge monitoring is disabled for this zone. If true, the zone will not be checked for energy threshold violations.
suspectedDeviceTypesDevice types suspected of causing surge violations for this zone.
confirmedDeviceTypesDevice types an operator has confirmed as the cause of surge violations for this zone.
zoneTypeZone type key
TenantRelationshipDto
_idUnique identifier of the tenant in the database.
tenantNameName of the tenant. Represents a department, unit, or organization within the system.
energyUsageEnergy usage budget allocated to the tenant in kilowatt-hours. Tracks consumption against quotas.
Array of IoT devices assigned to this tenant. Includes all device types: smart plugs, MCBs, distribution boxes, etc.
Array of rooms belonging to this tenant. Provides room hierarchy and organization.
Array of zones assigned to this tenant. Includes zone accounts with access to tenant resources.
numberOfZonesTotal count of zones assigned to this tenant. Used for resource planning and statistics.
numberOfRoomsTotal count of rooms belonging to this tenant. Used for resource planning and statistics.
numberOfDevicesTotal count of IoT devices assigned to this tenant. Used for resource planning and statistics. Includes all device types: smart plugs, MCBs, distribution boxes, etc.
GetTenantsRelationshipDto
Array of tenants with their complete relationship hierarchy including zones, rooms, and devices.
numberOfTenantsTotal count of tenants in the system. Useful for pagination and statistics.
numberOfZonesTotal count of zones across all tenants in the system. Useful for system-wide statistics.
numberOfRoomsTotal count of rooms across all tenants in the system. Useful for system-wide statistics.
numberOfDevicesTotal count of IoT devices across all tenants in the system. Useful for system-wide statistics. Includes all device types: smart plugs, MCBs, distribution boxes, etc.
RoomEnergyUsageDto
roomIdUnique identifier of the room
roomNameName of the room
energyUsageTotal energy usage in kilowatt-hours (kWh) for the specified period
isFlaggedWhether the room is currently flagged by surge monitoring
totalFlaggedCountRolling windows in which the room exceeded its threshold
totalViolationCountIndividual violations recorded for the room, all time
isMonitoringDisabledWhether surge monitoring is disabled for this room
suspectedDeviceTypesDevice types suspected of causing surge violations
confirmedDeviceTypesDevice types an operator has confirmed as the cause
GetRoomEnergyUsageResponseDto
tenantIdTenant ID for which energy usage was calculated
daysNumber of days the energy usage was calculated over
startDateStart date of the energy usage period (ISO 8601 format)
endDateEnd date of the energy usage period (ISO 8601 format)
List of rooms with their energy usage data
totalRoomsTotal number of rooms found for this tenant
totalEnergyUsageTotal energy usage across all rooms in kWh
UpdateTenantDto
tenantNameName of the tenant. Represents a department, unit, or organization within the system.
tenantEmailPrimary email address for tenant contact. Used for notifications and billing communications.
Geographic location details of the tenant. Includes address, city, country, and coordinates for mapping purposes.
remarksAdditional notes or comments about the tenant. Useful for documenting special arrangements or contact details.
levelFloor number where the tenant is primarily located. Used for organizing tenants within a building.
tenantTypeTenant type key. Must be a valid type defined for this system via /entity-type/TENANT.
SurgeConfigTypeOverride
calculatedThresholdKwhAuto-calculated threshold (kWh) for this type key
manualThresholdKwhManual threshold override (kWh) for this type key — wins over calculatedThresholdKwh
sentinelPowerRangeRulesSentinel power range rules for this type key. Replaces the baseline rules entirely when set.
MonitoringEntityType
Type of entity to start usage surge analysis for
StartAnalysisDto
entityTypeType of entity to start usage surge analysis for
startDateStart date for historical analysis (YYYY-MM-DD format). Must be at least 7 days before end date.
endDateEnd date for historical analysis (YYYY-MM-DD format). Must be at least 7 days after start date.
initialFlagThresholdMinimum number of violations required to flag an entity as initially problematic during analysis
McbMeasurementTypeBreakdown
measurementTypeMCB measurement type classification
energyKwhTotal energy consumption in kWh for this measurement type
costAmountTotal cost amount for this measurement type
EntityEnergyBreakdown
Energy breakdown by MCB measurement type
totalEnergyKwhTotal energy consumption across all measurement types (kWh)
totalCostTotal cost across all measurement types ($)
periodDaysNumber of days in the analysis period
dailyAverageKwhDaily average energy consumption (kWh)
predictedMonthlyKwhPredicted monthly energy consumption (kWh)
predictedMonthlyCostPredicted monthly cost ($)
EntityAnalysisDetailDto
entityIdEntity ID
entityNameEntity name
averageDailyUsageKwhAverage daily usage during analysis period (kWh)
totalUsageKwhTotal usage during analysis period (kWh)
validDaysCountNumber of days with valid data in analysis period
exceededThresholdWhether this entity exceeded the threshold during analysis
exceedanceCountNumber of times threshold was exceeded during analysis period
predictedMonthlyKwhPredicted monthly usage (kWh) based on average daily usage
predictedYearlyKwhPredicted yearly usage (kWh) based on average daily usage
predictedMonthlyCostPredicted monthly cost based on tariff
predictedYearlyCostPredicted yearly cost based on tariff
Energy breakdown by MCB measurement type
typeKeyThe entity's own type key (Room.roomType / Tenant.tenantType / Zone.zoneType). Omitted when the entity has none.
ThresholdSource
TYPE when the threshold was calculated from this type key alone; BASELINE when the group had too few entities with valid data and the system-wide threshold was used instead.
TypeKeyAnalysisDto
calculatedThresholdKwhThreshold in kWh for this type key. Feed this into POST /config/:entityType as a per-type override.
thresholdSourceTYPE when the threshold was calculated from this type key alone; BASELINE when the group had too few entities with valid data and the system-wide threshold was used instead.
entitiesAnalyzedNumber of entities of this type key with valid usage data
initialFlaggedCountNumber of entities of this type key flagged against this type key threshold
Detailed analysis for each entity of this type key
typeKeyEntity type key this slice covers (e.g. a Room.roomType). Omitted for entities with no type key configured.
Energy breakdown aggregated across this type key
AnalysisStartResponseDto
successOperation success status
messageConfirmation message
calculatedThresholdKwhCalculated threshold in kWh across all entities of this entity type (the baseline). Per-type thresholds are in byTypeKey.
entitiesAnalyzedNumber of entities analyzed
initialFlaggedCountNumber of initially flagged entities
Detailed analysis for every entity analysed, across all type keys
Analysis split by the entities' own type keys. Entities with no type key are grouped in a single slice with typeKey omitted.
System-wide energy breakdown by MCB measurement type
SentinelPowerRangeRuleDto
idUnique rule identifier (UUID)
labelHuman-readable label for the suspected device type
minWattsMinimum power threshold in Watts (inclusive)
maxWattsMaximum power threshold in Watts (inclusive)
minDurationMinutesMinimum cumulative minutes device must sustain power in range on a violation day to be classified
TypeThresholdOverrideDto
typeKeyEntity type key this override applies to — must be a configured type for this system and entity kind
calculatedThresholdKwhAuto-calculated threshold (kWh) for this type key
manualThresholdKwhManual threshold override (kWh) for this type key — wins over calculatedThresholdKwh
Sentinel power range rules for this type key. Replaces the baseline rules entirely when set.
CreateSurgeConfigDto
calculatedThresholdKwhCalculated threshold (median) in kWh
digestTimeLocal time of day (HH:mm, system timezone) the digest fires at.
digestStartDateLocal date (YYYY-MM-DD, system timezone) the digest cycle starts from. Fixes which day of the N-day cycle the digest lands on, so editing the config later does not re-phase it.
manualThresholdKwhManual threshold override (kWh) - takes precedence over calculated threshold
defaultViolationCountDefault violation count to trigger flag
defaultViolationWindowDefault rolling window in days
Sentinel power range rules for suspected device classification
Per-type-key threshold overrides. Each entry gives one entity type key (e.g. a room type) its own threshold, and optionally its own sentinel rules. Feed the byTypeKey slices returned by the analysis endpoint straight in here so each type is monitored against its own threshold. Entities whose type key has no entry — including entities with no type key set — use the entity-type baseline threshold.
SurgeConfigResponseDto
successOperation success status
entityTypeEntity type
messageSuccess or informational message
Updated configuration
digestScheduleWarningPresent when the configuration was saved but its cloud digest schedule could not be rebuilt. The entity type will send no digest until surge monitoring is re-enabled — surface this to the operator.
SurgeConfigLookupResponseDto
successOperation success status
entityTypeEntity type
configuredWhether a configuration exists for this entity type. When false, config is null and surge monitoring is not set up for this entity type.
messageSuccess or informational message
configCurrent configuration, or null when never configured
UpdateSurgeScheduleDto
dailyCheckTimeLocal time of day (HH:mm, system timezone) the daily surge check runs at. Defaults to 01:00.
SurgeScheduleResponseDto
successOperation success status
dailyCheckTimeLocal time of day the daily surge check now runs at
timezoneIANA timezone the schedule times are interpreted in
scheduleNameName of the recreated daily check schedule. Absent when surge monitoring is not enabled yet — the time is stored and applied when monitoring is enabled.
UpdateSystemSurgeConfigDto
calculatedThresholdKwhAuto-calculated threshold (median) in kWh - can be manually adjusted
manualThresholdKwhManual threshold override (kWh) - takes precedence over calculated threshold
defaultViolationCountDefault violation count to trigger flag
defaultViolationWindowDefault rolling window in days
digestTimeLocal time of day (HH:mm, system timezone) the digest fires at. Must end up set together with digestStartDate — setting only one is rejected.
digestStartDateLocal date (YYYY-MM-DD, system timezone) of the first digest run. Fixes which day of the N-day cycle the digest lands on. Must end up set together with digestTime — setting only one is rejected.
Sentinel power range rules for suspected device classification. Full replacement when present — omit to leave the existing rules untouched, send an empty array to clear them.
Per-type-key threshold overrides. Each entry gives one entity type key (e.g. a room type) its own threshold, and optionally its own sentinel rules. Entities whose type key has no entry — including entities with no type key set — keep using the entity-type baseline threshold. Full replacement when present — omit to leave the existing overrides untouched, send an empty array to clear them.
EntityMetadata
tenantIdTenant ID
tenantNameTenant name
zoneIdZone ID
zoneNameZone name
ViolationResponseDto
_idViolation ID
entityTypeEntity type
entityIdEntity ID
entityNameEntity name
dateViolation date
dailyUsageKwhActual daily usage (kWh)
thresholdKwhThreshold that was exceeded (kWh) — the entity's effective threshold at the time of the violation, so a type-key override is already reflected
exceedanceKwhAmount exceeded (kWh)
exceedancePercentPercentage exceeded (%)
isFlaggedWhether violation triggered alert
entityTypeKeyEntity's own type key (Room.roomType / Tenant.tenantType / Zone.zoneType) — undefined when it has none
supersededAtSet when a counters reset soft-deleted this violation. The row is still listed so the history stays inspectable, but it no longer contributes to any count, flag state or digest total — render it as struck through / greyed out.
Additional contextual metadata
ViolationsListResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of violations
LatestViolationDto
dateDate of latest violation
dailyUsageKwhDaily usage in kWh
thresholdKwhThreshold in kWh
exceedanceKwhExceedance in kWh
exceedancePercentExceedance percentage
ViolationMetadata
entityNameEntity name (room/tenant/zone)
tenantIdTenant ID if applicable
tenantNameTenant name if applicable
userIdZone ID if applicable
zoneNameZone name if applicable
FlaggedEntityDto
entityIdEntity ID
entityNameEntity name
entityTypeEntity type
violationCountTotal violation count
currentPeriodViolationCountCurrent period violation count
totalFlaggedCountTotal times this entity has been flagged
thresholdKwhThe entity's current effective threshold in kWh — active entity adjustment, else its type-key override, else the entity-type baseline
firstViolationDateDate of first violation
lastViolationDateDate of last violation
Latest violation details
allViolationDatesAll violation dates
entityTypeKeyEntity's own type key (e.g. room type) — undefined when it has none
Additional violation metadata
FlaggedEntitiesResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of flagged entities
ResetAllViolationsDto
entityTypeScope the reset to a single policy (entity type). Omit to reset ALL policies (rooms, tenants, and zones) for the system.
ResetAllViolationsResponseDto
successOperation success status
deletedViolationsNumber of violation records deleted
trackersResetNumber of entity trackers reset (unflagged)
messageConfirmation message
entityTypePolicy the reset was scoped to. Absent when all policies were reset.
DisabledEntityDto
entityIdEntity ID
entityNameEntity name
entityTypeEntity type
disabledAtWhen monitoring was disabled for this entity
totalFlaggedCountTimes the entity was flagged before monitoring was disabled
reasonWhy monitoring was disabled
DisabledEntitiesResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
successSuccess status
List of disabled entities
entityTypeEntity type filter applied
ToggleMonitoringDto
isEnabledWhether to enable monitoring (true) or disable it (false)
reasonReason for enabling/disabling monitoring for this entity
MonitoringStatusResponseDto
successOperation success status
entityTypeEntity type
entityIdEntity ID
isMonitoringDisabledWhether entity monitoring is currently disabled
messageConfirmation message
UpdateConfirmedDevicesDto
confirmedDeviceTypesFull list of operator-confirmed device types for this entity. Replaces the existing list — send an empty array to clear it.
ConfirmedDevicesResponseDto
successOperation success status
entityTypeEntity type
entityIdEntity ID
confirmedDeviceTypesConfirmed device types now stored for this entity
messageConfirmation message
ResetViolationsDto
deleteViolationRecordsWhether to delete all violation records from database (default: false). If false, only counters are reset but historical records are preserved.
ResetCounters
totalFlaggedCountTotal flagged count before reset
currentPeriodViolationCountCurrent period violation count before reset
ResetViolationsResponseDto
successSuccess status
entityTypeEntity type
entityIdEntity ID
Counter values before reset
deletedViolationsNumber of violation records deleted
messageSuccess message
EntityEnergyBreakdownResponseDto
entityIdEntity ID
entityNameEntity name
entityTypeEntity type
startDateAnalysis period start date
endDateAnalysis period end date
MCB measurement type breakdown with cost analysis
EntityCheckResultDto
entityIdEntity ID
entityNameEntity name
entityTypeType of entity
dailyUsageKwhDaily usage in kWh
thresholdKwhThreshold in kWh
violatedWhether this entity violated the threshold
currentPeriodViolationCountCurrent period violation count after check
totalFlaggedCountTotal lifetime flagged count after check
entityTypeKeyEntity's own type key (e.g. room type) — drives which threshold was applied
DailySurgeCheckResultDto
systemIdSystem ID that was checked
checkDateCheck date
totalEntitiesCheckedTotal entities checked across all types
totalViolationsDetectedTotal violations detected across all types
Detailed results for each entity checked
summaryByTypeSummary by entity type
FlaggedEntityDigestResultDto
entityIdEntity ID
entityNameEntity name
currentPeriodViolationCountCurrent period violation count
totalFlaggedCountTotal lifetime flagged count
thresholdKwhThreshold in kWh
lastViolationDateLast violation date
SurgeDigestResultDto
systemIdSystem ID
entityTypeEntity type for this digest
startDateRolling window period start date
endDateRolling window period end date
rollingWindowDaysRolling window in days
totalFlaggedEntitiesTotal flagged entities in this digest
totalViolationsTotal violations across all flagged entities
List of flagged entities included in digest
notificationCountHow many recipients this digest was written to — one notification document each
EntityTypeResponseDto
_idEntity type ID
nameUnique type key
displayNameHuman-readable display name
systemSystem ID this type belongs to
createdAtCreation timestamp
createdByAdmin who created this type
CreateEntityTypeDto
nameUnique type key — must be UPPER_SNAKE_CASE, unique within the system
displayNameHuman-readable display name
SingleScheduleEntryDto
actionAction type to perform at the scheduled date-time(s). For simple ON/OFF or complex actions like SET_TEMPERATURE.
dateTimeSingle scheduled date and time in ISO 8601 format when the one-time action should execute. Cannot be used with startDateTime/endDateTime. Must be a future timestamp.
startDateTimeStart date and time of the schedule range in ISO 8601 format. Must be used with endDateTime. Cannot be used with dateTime. Creates daily timers between start and end dates (inclusive) at the specified time.
endDateTimeEnd date and time of the schedule range in ISO 8601 format. Must be used with startDateTime. Cannot be used with dateTime. Creates daily timers between start and end dates (inclusive) at the specified time.
actionValueOptional value for actions that require it (e.g., temperature value for SET_TEMPERATURE, brightness for SET_BRIGHTNESS). Required for certain action types.
ruleNameAWS EventBridge rule name associated with this schedule entry. Used for managing and updating the schedule.
DailyScheduleEntryDto
timeTime when the scheduled action should occur in 24-hour format (HH:MM). Applied to recurring weekly schedules.
actionAction type to perform at the scheduled time. For simple ON/OFF or complex actions like SET_TEMPERATURE.
actionValueOptional value for actions that require it (e.g., temperature value for SET_TEMPERATURE, brightness for SET_BRIGHTNESS). Required for certain action types.
DeviceWeeklyScheduleDto
Array of one-time scheduled actions that occur at specific date-times. These schedules execute once and are automatically removed.
Array of scheduled actions for Monday. These execute weekly at specified times.
Array of scheduled actions for Tuesday. These execute weekly at specified times.
Array of scheduled actions for Wednesday. These execute weekly at specified times.
Array of scheduled actions for Thursday. These execute weekly at specified times.
Array of scheduled actions for Friday. These execute weekly at specified times.
Array of scheduled actions for Saturday. These execute weekly at specified times.
Array of scheduled actions for Sunday. These execute weekly at specified times.
FollowScheduleDto
scheduleIdId of the Schedule the device should follow, or null to follow nothing.
DayOfWeek
Day of the week this time range applies to
DayTimeRange
dayDay of the week this time range applies to
startTimeStart time (device turns ON) in HH:mm format. Absent for an OFF-only entry.
endTimeEnd time (device turns OFF) in HH:mm format. Absent for an ON-only entry.
actionAction to run at this entry's time, for actions beyond plain ON/OFF (e.g. SET_TEMPERATURE, SET_MODE, SET_BRIGHTNESS). Only valid on a single-point entry (startTime or endTime, not both); defaults to ON/OFF when absent.
Value for actions that require one (e.g. temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS, mode for SET_MODE).
Schedule
_idPrimary ID of the Schedule
systemSystem this schedule belongs to
nameUser-provided name
Per-day ON/OFF time ranges. A day may have multiple ranges; days absent have no schedule.
executionModeWhere this schedule executes on every device that follows it. CLOUD = AWS EventBridge rules fired by the backend (device must be online). ON_DEVICE = compiled into an MQTT timer payload stored in firmware, so it keeps running while the device is offline. Followers inherit this, and changing it re-applies the schedule to all of them. A follower whose subtype cannot store firmware timers falls back to CLOUD.
tenantIdTenant this schedule is scoped to (shared-schedule tag).
zoneIdZone this schedule is scoped to (shared-schedule tag).
roomIdRoom this schedule is scoped to (shared-schedule tag).
createdByAccount that created this schedule. Null for schedules created via an API token or a system process.
DeviceSchedulingOptionsDto
followedScheduleIdId of the Schedule this device currently follows, or null if it follows nothing.
All schedules visible to this device by scope.
executionModeWhere this device’s weekly schedule executes. CLOUD when the backend fires it via EventBridge, ON_DEVICE when firmware runs it from a stored MQTT timer payload. Taken from the followed schedule while the device follows one (the schedule owns the mode), otherwise from the device’s own stored schedule; CLOUD for a device with no schedule yet. Always reflects the mode actually in effect — if the schedule asks for ON_DEVICE but this subtype cannot store timers, this reads CLOUD and fellBackToCloud is true.
supportsOnDeviceScheduleWhether this device’s firmware can run an on-device schedule at all. When false the frontend must hide the on-device option — POST .../offline-timer rejects with 400.
confirmationStateAck state of the on-device schedule: PENDING until the device confirms receipt over MQTT. Null when executionMode is CLOUD.
fellBackToCloudTrue when the followed schedule asks for ON_DEVICE but this device’s subtype cannot store firmware timers, so it is being run from the cloud instead. The frontend should show the schedule as online-only for this device.
DayTimeRangeDto
dayDay of the week this time range applies to
startTimeStart time (device turns ON) in HH:mm format. Omit for an OFF-only entry.
endTimeEnd time (device turns OFF) in HH:mm format. Omit for an ON-only entry.
actionAction to run at this entry's time, for actions beyond plain ON/OFF (e.g. SET_TEMPERATURE, SET_MODE, SET_BRIGHTNESS). Only valid on a single-point entry (startTime or endTime, not both); defaults to ON/OFF when absent.
Value for actions that require one (e.g. temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS, mode for SET_MODE). Required when action is one of those types.
ScheduleInputDto
nameUser-provided name
Per-day ON/OFF time ranges. A day may have multiple ranges; days absent have no schedule.
executionModeWhere this schedule executes on every device that follows it. CLOUD (default) = EventBridge rules fired by the backend. ON_DEVICE = stored in firmware over MQTT so it survives the device going offline. Followers whose subtype cannot store firmware timers fall back to CLOUD.
tenantIdTenant this schedule is scoped to
zoneIdZone this schedule is scoped to
roomIdRoom this schedule is scoped to
DeviceSingleScheduleDto
Array of one-time scheduled actions with specific date-times. These schedules execute once and are automatically removed after execution.
EditDeviceSingleTimerDto
ruleNameAWS EventBridge rule name of the one-time timer to edit. Used to identify which schedule to update.
dateTimeUpdated scheduled date and time for the timer in ISO 8601 format. Must be a future timestamp.
actionUpdated action type to perform at the scheduled time. Replaces the existing action in the timer.
actionValueOptional value for actions that require it (e.g., temperature value for SET_TEMPERATURE, brightness for SET_BRIGHTNESS). Required for certain action types.
DeleteDeviceSingleTimerDto
ruleNameAWS EventBridge rule name of the one-time timer to delete. Used to identify which schedule to remove.
MergeMode
Defines how schedules should be merged. REPLACE: Clear all existing schedules and set new ones (default). MERGE: Add new schedules to existing ones, updating duplicates. APPEND: Add new schedules without modifying existing ones.
MassDevicesScheduleDto
deviceIdsArray of unique device identifiers to apply the schedule configuration to. Each device will receive the same schedule.
Schedule configuration containing weekly recurring and one-time schedules to apply to multiple devices.
mergeModeDefines how schedules should be merged. REPLACE: Clear all existing schedules and set new ones (default). MERGE: Add new schedules to existing ones, updating duplicates. APPEND: Add new schedules without modifying existing ones.
executionModeWhere the weekly schedule executes on each device. CLOUD (default): EventBridge rules fired by the backend. ON_DEVICE: compiled into an MQTT timer stored in firmware so it survives the device going offline — only ON/OFF actions are allowed, one-time schedules stay cloud-only, mergeMode must be REPLACE, and every target device type must support on-device schedules.
MassDevicesSingleScheduleDto
deviceIdsArray of unique device identifiers to apply the one-time schedules to. Each device will receive the same schedule.
Array of one-time scheduled actions with specific date-times to apply to multiple devices.
DeviceScheduleInfo
ruleNameAWS EventBridge rule name associated with this device schedule. Used for identifying and managing the schedule.
deviceIdUnique identifier of the device in MongoDB ObjectId format.
deviceNameDisplay name of the device for identification purposes in the UI.
MassEditDeviceSingleTimerDto
Array of device details with EventBridge rule names for the one-time timers to batch edit. All specified timers will be updated with the same new schedule.
newDateTimeNew scheduled date and time to apply to all specified timers. Must be a future timestamp in ISO 8601 format.
newActionNew action type to apply to all specified timers at the scheduled time. Replaces existing actions.
newActionValueOptional value for the new action (e.g., temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS). Required for certain action types.
MassEditDeviceWeeklyTimerDto
Array of device details with EventBridge rule names for the recurring weekly timers to batch edit. All specified timers will be updated.
newTimeNew time in 24-hour format (HH:MM) to apply to all specified weekly timers. Must be valid time between 00:00 and 23:59.
newActionNew action type to apply to all specified weekly timers at the scheduled time. Replaces existing actions.
currentTimeCurrent time (HH:MM) of the timers being edited. Required when any target device runs its schedule in firmware (executionMode ON_DEVICE): those entries have no EventBridge ruleName, so they are matched by their existing time instead. Ignored for cloud timers, which are matched by ruleName.
newActionValueOptional value for the new action (e.g., temperature for SET_TEMPERATURE, brightness for SET_BRIGHTNESS). Required for certain action types.
daysOfWeekOptional filter to only edit timers on specific days of the week. If provided, only rules matching these days will be updated. If omitted, all provided rules will be updated (backward compatible).
MassDeleteDeviceTimerDto
Array of device details with EventBridge rule names for the timers to batch delete. Supports both one-time and recurring weekly schedules.
GroupedRecurringSchedule
timeScheduled time in 24-hour format (HH:MM) when the recurring action executes. Shared by all devices in this group.
actionAction type to perform at the scheduled time. All devices in this group will execute the same action.
daysOfWeekArray of weekday names when this recurring schedule is active. Schedule repeats weekly on these days.
deviceCountTotal number of devices that share this identical recurring schedule pattern.
Array of device details with their EventBridge rule names. Each device has this same recurring schedule configured.
actionValueOptional value for actions that require it (e.g., temperature, brightness). All devices in this group will use the same value.
GroupedOneTimeSchedule
dateTimeScheduled date and time when this one-time action will execute. Shared by all devices in this group.
actionAction type to perform at the scheduled date-time. All devices in this group will execute the same action.
deviceCountTotal number of devices that share this identical one-time schedule configuration.
Array of device details with their EventBridge rule names. Each device has this same one-time schedule configured.
actionValueOptional value for actions that require it (e.g., temperature, brightness). All devices in this group will use the same value.
GetSystemGroupedSchedulesDto
Array of recurring weekly schedules grouped by time and action. Shows which devices share the same recurring schedule pattern.
Array of one-time schedules grouped by date-time and action. Shows which devices share the same one-time schedule.
totalDevicesTotal count of all schedulable devices in the system (includes devices with and without schedules). Only counts device types that support scheduling.
devicesWithSchedulesCount of devices that have at least one active schedule configured. Used to calculate scheduling adoption rate.
ScheduleAdjustmentStatus
AdjustmentType
Type of adjustment suggested
OverrideAction
Override-only. What the user did. Unset on ASCENT rows.
ScheduleMapDto
Monday schedule entries
Tuesday schedule entries
Wednesday schedule entries
Thursday schedule entries
Friday schedule entries
Saturday schedule entries
Sunday schedule entries
RecommendationTier
ASCENT-only. Which analysis tier produced the schedule. Only RULE_BASED rows are eligible for auto-apply, so this explains why an otherwise-confident suggestion still needs review.
ScheduleAdjustmentSuggestionDto
_idSuggestion ID
deviceDevice ID
deviceTypeDevice type
sourceWhat produced this suggestion. MANUAL_OVERRIDE rows carry the override fields below and describe a boundary change; ASCENT rows come from the weekly telemetry pass, use adjustmentType FULL_SCHEDULE, and leave every override field unset.
systemSystem ID
adjustmentTypeType of adjustment suggested
affectedDaysWhich day(s) this adjustment applies to. For ASCENT rows this lists only the weekdays whose entries actually changed, not all seven.
Current schedule before adjustment
Suggested adjusted schedule
statusStatus of this suggestion
confidenceScoreConfidence score 0-1. MANUAL_OVERRIDE derives it from occurrence count and time range; ASCENT uses the pattern confidence it scored the device at.
createdAtWhen this suggestion was created
updatedAtWhen this suggestion was last updated
deviceNameDevice name
deviceNumberDevice number
roomNameRoom name the device belongs to
overrideTimeOverride-only. Time when the user triggered this override. Unset on ASCENT rows.
overrideActionOverride-only. What the user did. Unset on ASCENT rows.
reviewedAtWhen user responded to this
reviewedByUserUser who reviewed this
occurrenceCountOverride-only. Number of times this pattern was detected. Unset on ASCENT rows.
firstOccurrenceFirst time this pattern was detected. On ASCENT rows this is the run timestamp.
lastOccurrenceMost recent time this pattern was detected. On ASCENT rows this is the run timestamp.
occurrenceTimesOverride-only. All override times that contributed to this pattern. Empty on ASCENT rows.
earliestOverrideTimeOverride-only. Earliest time from all occurrences. Unset on ASCENT rows.
latestOverrideTimeOverride-only. Latest time from all occurrences. Unset on ASCENT rows.
timeRangeMinutesOverride-only. Time range in minutes (latest - earliest). Unset on ASCENT rows.
deltaMinutesSigned ON-minutes change if the suggestion is applied. Positive = suggested schedule has less ON time (e.g. turn off earlier); negative = more ON time (e.g. turn on earlier).
tierASCENT-only. Which analysis tier produced the schedule. Only RULE_BASED rows are eligible for auto-apply, so this explains why an otherwise-confident suggestion still needs review.
reasonsHuman-readable justification for the confidence score. On ASCENT rows: Ascent's confidence reasons plus its rule-based flags. Show these next to the score — a bare percentage is not actionable.
SuggestionStatusCountsDto
monitoringreadyForReviewreadyForAutoApplyacceptedrejectedautoAppliedautoApplyFailedGetSystemSuggestionsResponseDto
Every suggestion matching the filters, newest first unless sorted. Narrow with status, filter, source, deviceId or search.
totalRows returned
Totals per status across the whole filtered set
GetDeviceSuggestionsResponseDto
totalTotal number of suggestions
List of suggestions for the device
AcceptSuggestionRequestDto
daysDays to apply. Days listed are taken from the suggested schedule; days omitted keep their current schedule untouched and are never emptied. Omit to apply every affected day.
AcceptSuggestionResponseDto
messageSuccess message
The accepted suggestion
deviceIdDevice ID
deviceNameDevice name
RejectSuggestionResponseDto
messageSuccess message
The rejected suggestion
BulkSuggestionsRequestDto
suggestionIdsSuggestion IDs to process
Days to apply, keyed by suggestion ID. Days listed are taken from the suggested schedule; days omitted keep their current schedule untouched and are never emptied. A suggestion missing from this map applies all of its affected days. Accept-only — ignored by bulk-reject.
BulkSuggestionFailureDto
suggestionIdSuggestion ID that failed to process
reasonFailure reason
BulkSuggestionsResponseDto
messageSummary message
processedCountNumber of suggestions successfully processed
Suggestions that could not be processed
InvoiceItemDto
productReference to the product ID
quantityQuantity purchased
CreateInvoiceDto
dueDateDue date for the invoice
Array of invoice line items
systemIdSystem ID associated with the invoice
tenantIdTenant ID associated with the invoice
invoiceDateInvoice date (defaults to current date)
taxRateTax rate as a percentage (e.g., 10 for 10%)
discountAmountDiscount amount applied to the invoice
notesAdditional notes
Product
_idThe unique identifier of the subscription tier
pricePrice of product
nameName of product
descriptionDescription of the product
createdAtThe date when the product was created
updatedAtThe date when the product was last updated
SystemInvoiceItem
Reference to the product
quantityQuantity purchased
SystemInvoice
_idbillingTypeinvoiceNumberUnique invoice number for tracking and reference
invoiceDateInvoice date
dueDateDue date for payment
subtotalSubtotal before tax
taxRateTax rate percentage
taxTax amount (subtotal x taxRate / 100)
totalFinal total amount
statusCurrent payment status
isDeletedSoft delete flag
createdAtupdatedAtArray of invoice line items
discountDiscount amount
notesAdditional notes
zoneuserUpdateInvoiceDiscountDto
discountAmountDiscount amount to be applied to the invoice
UpdateInvoiceStatusDto
statusNew status of the invoice
UpdateInvoiceNotesDto
notesNotes for the invoice
InvoiceItemInput
productReference to the product ID
quantityQuantity purchased
UpdateInvoiceItemsDto
Array of invoice items to replace the existing items list. Each item requires a product ID and quantity.
TriggerInvoiceGenerationDto
systemIdSystem ID to generate invoice for
fromStart of billing period
toEnd of billing period
taxRateTax rate percentage (0-100)
GenerateInvoiceResultDto
systemIdSystem ID for which the invoice was generated
systemNameSystem name
successWhether invoice generation was successful
plugCountNumber of plugs billed
apiCallCountNumber of API calls billed
Generated invoice (if successful)
errorError message (if failed)
BulkInvoiceGenerationResultDto
totalSystemsTotal number of systems processed
Results for each system
billingPeriodStartBilling period start date
billingPeriodEndBilling period end date
executedAtTimestamp when the cron job ran
CreateBillingConfigDto
billingTypetariffRatePrice per kWh
billingDayDay of month to auto-generate invoice (1-28)
billingEmailEmail address for invoice PDF delivery
tenantIdTenant ID (required if billingType is TENANT)
zoneIdZone ID (required if billingType is ZONE)
userIdUser ID (required if billingType is USER)
replyToReply-to email for invoice emails. Replies go to this address.
UpdateBillingConfigDto
tariffRatebillingDaybillingEmailreplyToReply-to email for invoice emails. Replies go to this address.
isActiveBillingConfig
_idbillingTypesystemtariffRatePrice per kWh
billingDayDay of month (1-28) to auto-generate invoice
billingEmailEmail address to receive the invoice PDF
isActiveisDeletedcreatedAtupdatedAttenantzoneuserreplyToReply-to email for invoice emails. Replies go to this address.
scheduleNameAWS EventBridge schedule name for automated monthly billing
EnergyInvoice
_idbillingTypeinvoiceNumberUnique invoice number for tracking and reference
invoiceDateInvoice date
dueDateDue date for payment
subtotalSubtotal before tax
taxRateTax rate percentage
taxTax amount (subtotal x taxRate / 100)
totalFinal total amount
statusCurrent payment status
isDeletedSoft delete flag
createdAtupdatedAtbillingPeriodFromBilling period start date
billingPeriodToBilling period end date
totalKwhTotal energy consumption in kWh during billing period
tariffRateTariff rate applied at time of billing (price per kWh)
currencyCurrency code (automatically derived from system country code)
emailSentWhether invoice email with PDF attachment was successfully sent
zoneuserTriggerBillingDto
entityIdID of the entity to bill (tenant ID, zone ID, or user ID)
billingPeriodFromStart of billing period (ISO date)
billingPeriodToEnd of billing period (ISO date)
dueDateInvoice due date (ISO date).
taxRateTax rate percentage (0 = no tax)
replyToReply-to email address for the invoice. Replies go to this address.
TriggerBillingResponseDto
entityIdID of the entity (tenant/zone/user) that was billed
entityNameName of the entity that was billed
successWhether the billing operation was successful
totalKwhTotal energy consumption in kWh for the billing period
totalAmountTotal amount billed in the configured currency
emailSentWhether the invoice email was sent successfully
errorError message if the operation failed
CreateProductDto
nameName of the product
pricePrice of the product
descriptionDescription of the product
UpdateProductDto
nameName of the product
descriptionDescription of the product
pricePrice of the product
ApiTokenAudience
Audience of the token. System reaches every API-token endpoint; Tenant is restricted to tenant-scoped endpoints and below; Consumer to consumer-scoped (zone and below) endpoints. Capped at the creating account's own level — ADMIN/SUPERADMIN may mint System, TENANT at most Tenant, USER at most Consumer; requesting higher is a 403. Omit to get that cap.
CreateApiTokenDto
audienceAudience of the token. System reaches every API-token endpoint; Tenant is restricted to tenant-scoped endpoints and below; Consumer to consumer-scoped (zone and below) endpoints. Capped at the creating account's own level — ADMIN/SUPERADMIN may mint System, TENANT at most Tenant, USER at most Consumer; requesting higher is a 403. Omit to get that cap.
regenerateReplace the caller's existing token for this system instead of returning 409. The old token stops working immediately; usage history is kept.
ApiTokenResponseDto
tokenApi token string for accessing external APIs
GetSystemDetailsDto
_idUnique identifier of the system in the database.
systemNameName of the system. Typically represents an organization, building, or facility using the Ecovolt platform. Only returned to SUPERADMIN callers.
numberOfDevicesTotal number of devices in the system. Only returned to SUPERADMIN callers.
deviceOnCountNumber of devices currently reporting ON. Only returned to SUPERADMIN callers.
deviceOffCountNumber of devices currently reporting OFF. Only returned to SUPERADMIN callers.
deviceInactiveCountNumber of devices that are currently inactive. Only returned to SUPERADMIN callers.
GetAdminDto
_idUnique identifier of the admin account in the database.
nameFull name of the admin user. Used for identification and display purposes.
emailEmail address of the admin user. Used for authentication and notifications.
roleAdministrative role determining the level of access and permissions within the system.
Array of systems that are linked to and managed by this admin. Includes full system details for each linked system.
approvedIndicates whether the admin account has been approved by a superadmin.
createdAtTimestamp when the admin account was created in the system.
updatedAtTimestamp when the admin account was last modified.
pendingIndicates whether the admin account is awaiting approval. True if not yet approved.
mainSystemIdMain system ID, typically the first system in the systems array. Used as the default system for the admin.
associatedUserIdReference to the associated User ID if this admin account is linked to a specific user.
associatedTenantIdReference to the associated Tenant ID if this admin account is linked to a specific tenant.
associatedRoomIdReference to the associated Room ID if this admin account is linked to a specific room.
enable2FAIndicates whether two-factor authentication is enabled for this admin account.
ApiTokenGeneratedByResponseDto
Indicates API token has been generated by Admin
ApiTokenUsageDto
_idPrimary ID of the ApiTokenUsage
urlURL accessed using the API token
methodHTTP method used with the API token
createdAtDate when the usage was recorded
updatedAtDate when the usage was last updated
ApiTokenUsageSearchResultDto
Array of API token usage records
totalTotal number of matching records
GetApiTokenDto
_idPrimary ID of the API token
systemIdSystem ID associated with the API token
GetApiTokenWithUsageDto
_idPrimary ID of the API token
Admin associated with the API token
systemIdSystem ID associated with the API token
systemNameSystem name associated with the API token
audienceAudience of the token — how far it reaches. Capped at the creating account's role, so it is not implied by admin.role alone (an ADMIN may deliberately mint below their ceiling).
usageCountNumber of times this API token has been used
createdAtDate when the API token was created
updatedAtDate when the API token was last updated
GetAdminsDto
Array of admin accounts retrieved from the system. Includes all admin details and metadata.
totalTotal count of admin accounts in the database. Used for pagination calculations.
UpdateProfileDto
nameFull name of the account holder.
emailEmail address of the account holder.
currentPasswordCurrent password, required to confirm a password change. Must be provided together with newPassword.
newPasswordNew password for the account. Must be at least 6 characters long and will be hashed before storage. Must be provided together with currentPassword.
NotificationChannelSettingsDto
emailEnable or disable email notifications for this group
smsEnable or disable SMS notifications for this group
pushEnable or disable push notifications for this group
telegramEnable or disable Telegram notifications for this group. Has no effect until the account has paired a personal Telegram chat.
QuietHoursDto
enabledWhether Do Not Disturb is active for this account. On its own (no start/end) this suppresses every channel but in-app at all times; paired with start/end it scopes suppression to that window instead.
startQuiet hours start time in HH:mm format (local to timezone). Omit alongside end for an always-on Do Not Disturb toggle instead of a scheduled window.
endQuiet hours end time in HH:mm format (local to timezone). Omit alongside start for an always-on Do Not Disturb toggle instead of a scheduled window.
timezoneTimezone start/end are evaluated in, from the supported set. Only meaningful when both start and end are set.
NotificationPreferencesResponseDto
Effective channel settings, always fully populated — a channel the account has never touched is returned at its default, so the client never has to reproduce the default rule.
Effective Do Not Disturb setting, disabled when the account has never set one.
UpdateNotificationPreferencesDto
Channels to enable or disable. Merged per channel, so omitting one leaves it as it was.
Do Not Disturb setting. Replaced wholesale rather than merged — disabling drops the window so re-enabling never resurrects a forgotten schedule.
GetSessionDto
sidSession id. Pass to DELETE /admins/me/sessions/:sid to sign this device out.
lastUsedAtWhen this session last rotated its tokens — its most recent activity, to roughly the access-token lifetime.
createdAtWhen the session was opened
isCurrentTrue for the session that made this request, so the UI can label it "This device" and warn before signing it out.
appFrontend the session was opened from. Absent for a client that did not name itself.
userAgentUser-Agent the session was last seen from. Identifies browser and OS for web clients; native clients send a transport UA that names no device.
ipAddressClient IP the session was last seen from. Stored raw; resolve to a location at display time.
UpdateAdminRoleDto
roleThe new administrative role to assign to the admin. Determines the level of access and permissions within the system.
associatedZoneOptional zone ID to associate this admin with a specific zone account
associatedTenantOptional tenant ID to associate this admin with a specific tenant
associatedRoomOptional room ID to associate this admin with a specific room
UpdateAdminDto
nameFull name of the admin user. Used for identification and display purposes within the system.
emailEmail address of the admin user. Used for authentication and system notifications.
passwordNew password for the admin account. Must be at least 6 characters long and will be hashed before storage.
roleAdministrative role determining the level of access and permissions within the system.
LinkSystemToAdminDto
systemIdUnique identifier of the system to be linked to the admin account. This establishes a management relationship between the admin and the system.
UnlinkSystemToAdminDto
systemIdUnique identifier of the system to be unlinked from the admin account. This removes the management relationship between the admin and the system.
CreateZoneDto
nameFull name of the zone to be registered in the system. This will be displayed across the application.
adminCreationFlag indicating whether an tenant admin should be created, if so send invite.
emailUnique email address for the zone account. Required when adminCreation is true. Must not already exist in the system and will be used for authentication.
remarksOptional administrative notes or comments about the zone. Used for internal documentation and context.
zoneTypeZone type key. Must be a valid type defined for this system via /entity-type/ZONE.
LinkMultiplePlugsDto
plugIdsArray of plug identifiers to link to the zone. Used when assigning multiple plugs to a zone at once.
GetZonesResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of zone objects matching the query criteria
UpdateZoneDto
nameUpdated full name for the zone. This will replace the existing name in the system.
emailUpdated email address for the zone. Must be unique and not already in use by another account.
tenantIdUpdated tenant identifier to reassign the zone to a different organization.
remarksUpdated administrative notes or comments about the zone. Replaces existing remarks if provided.
zoneTypeZone type key. Must be a valid type defined for this system via /entity-type/ZONE.
MigratePlugDto
targetPlugIdThe ID of the target plug
sourcePlugIdThe ID of the source plug
hasPreviousSetupIndicates if the source plug has previous setup
EcoguardPlug
_idPrimary ID of the EcoGuard
ecoguardEnabledEcoguard Timer
ecoguardTimerIdle Timeout Duration of the Ecoguard (Minutes)
ecoguardIdleThresholdEcoguard Idle Threshold
Plug
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
plugCategoryPlug category name. See GET /plug-category for all valid values.
plugTypeType of Plug
energyUsageRecommendationReportEnergy Usage Recommendation Report
Ecoguard of the system
migratedToPlug to which this plug has been migrated
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel of the device plugged into this smart plug
deviceBrandBrand of the device plugged into this smart plug
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
voltageMaxMax Threshold voltage reading in volts
currentMaxMax Threshold current reading in amps
powerMaxMax Threshold power reading in watts
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
PlugUpdateItem
plugIdMongoDB ID of the plug to update
plugCategoryCategory of the device connected to this plug. See GET /plug-category for valid values.
deviceBrandBrand of the device connected to this plug
deviceModelModel of the device connected to this plug
remarksAdditional remarks or notes about the plug
BulkUpdatePlugsDto
Array of plug update operations to perform in a single batch
AiCategorizePlugsRequestDto
plugIdsArray of plug IDs to categorize using AI
UpdatePlugDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
plugTypeType of Plug
plugCategoryType of Plug Category
deviceModelModel identifier of the Plug
deviceBrandBrand of the Plug device
batchNumberBatch Number of the Plug
FilteredPlugDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
plugTypeHardware type classification of the plug device (e.g., ADAPTER, EXTENSION)
plugCategoryCategory classification for the connected device type. See GET /plug-category for valid values.
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
rangeEnergyUsageEnergy usage in kWh over the from..till window, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
Ecoguard power-saving feature configuration and settings for this plug
GetPlugsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of plug device objects matching the query criteria
PlugCategoryEnergyBreakdownDto
plugCategoryCategory classification of the plug device. See GET /plug-category for valid values.
totalEnergyUsageTotal energy usage (kWh) for all plugs in this category
PlugCategoriesBreakdownDto
plugCategoryCategory classification of the plug device. See GET /plug-category for valid values.
countTotal count of plugs belonging to this specific category in the system
CreateEcoguardPlugDto
ecoguardEnabledEnable or disable the Ecoguard automatic power-off feature for idle detection. When enabled, the plug monitors power consumption.
ecoguardTimerDuration in minutes before the plug automatically turns off after detecting idle power usage. Applied when power stays below threshold.
ecoguardIdleThresholdPower consumption threshold in watts that defines idle state. When usage falls below this value, the idle timer starts counting.
CoilClampPositionDto
xAbsolute X coordinate of a CT clamp on the digital twin canvas
yAbsolute Y coordinate of a CT clamp on the digital twin canvas
SandboxDevice
idUnique identifier for the sandbox device
typeType of sandbox device
nameUser-defined name for the device
digitalTwinXX position on the digital twin canvas
rowLineRow line position (1-6)
polesNumber of poles. Sets the module width for everything except an MCCB.
widthModulesHow many DIN modules wide the device body is, at 18mm per module. Equals poles for every modular device; an MCCB is sized by frame instead, so it carries its own value. Drives the rendered width on the digital twin.
curveTrip curve stamped on the breaker
confidenceHow sure the reading was when this device came from a digitised photo, 0 to 1. Absent on hand-placed devices.
ratedCurrentRated current in amperes
ratedVoltageRated voltage in volts
mcbTypeMCB type (for DUMB_MCB devices)
leakageCurrentLeakage current in milliamperes (for RCCB devices)
colorCustom color for visual identification
Absolute canvas positions of the 3 CT clamps, for a PLANNED_SMART device standing in for a Wattson Pro. Mirrors MCB.coilClampPositions so a planned hub is wired up on the canvas the same way a real one is.
notesAdditional notes about the device
WireConnection
deviceIdDevice ID (MCB._id or SandboxDevice.id)
deviceTypeType of device being connected
sideSide of the device where the connection is made
SandboxWire
idUnique identifier for the wire connection
Source connection point
Target connection point
colorWire color (hex code)
thicknessWire thickness in pixels
labelOptional label for the wire
DistributionBox
_idPrimary ID of the Distribution Box
nameName/identifier of the Distribution Box
systemSystem to which this distribution box belongs
createdAtDate and time when the distribution box was created
updatedAtDate and time when the distribution box was last updated
boxNumberUnique box number for identification within a system
numberOfRowsNumber of rows in the distribution box
mcbsArray of MCB IDs or partially populated MCB objects (_id, deviceName, macId, onStatus)
hasMainBreakerWhether the distribution box has a main circuit breaker
mainBreakerRatingMain breaker rating in amperes (if hasMainBreaker is true)
locationPhysical location where the distribution box is installed
remarksAdditional remarks or notes about the distribution box
tenantTenant to which this distribution box belongs
zoneZone to which this distribution box belongs
roomRoom where this distribution box is located
Array of sandbox (non-smart) devices in the distribution box
Array of wire connections between devices in the distribution box
digitalTwinWidthWidth of the digital twin canvas in pixels
digitalTwinHeightHeight of the digital twin canvas in pixels
singleLineDiagramKeyS3 key for the single line diagram image
singleLineDiagramUrlCDN URL for the single line diagram image
dbPhotoKeyS3 key for the distribution box photo
dbPhotoUrlCDN URL for the distribution box photo
MCB
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
mcbTypeType of MCB
ratedCurrentRated current capacity in amperes
ratedVoltageRated voltage in volts
realTimeVoltageReal-time voltage in volts
powerFactorPower factor (0-1)
Parent distribution box containing this MCB
isReversePowerWhether power/current readings should be reversed (made absolute). When true, negative values are converted to positive.
isAReversePowerWhether power/current readings should be reversed (made absolute). When true, negative values are converted to positive.
isBReversePowerWhether power/current readings should be reversed (made absolute). When true, negative values are converted to positive.
isCReversePowerWhether power/current readings should be reversed (made absolute). When true, negative values are converted to positive.
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
measurementTypeType of load/circuit being measured by this MCB
digitalTwinXX coordinate for digital twin SVG positioning
digitalTwinYY coordinate for digital twin SVG positioning (free-placed devices such as coils)
Absolute canvas positions of the 3 CT clamps (COIL3P devices only)
coilRotationRotation of the coil body in the digital twin, in degrees (e.g. 0, 90, 180, 270).
rowLineRow line number (1-6) the MCB is connected to
slotNumberSlot/position number on the busbar
voltageMaxMax Threshold voltage reading in volts
currentMaxMax Threshold current reading in amps
powerMaxMax Threshold power reading in watts
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
isSingleCOIL3P only. How the clamp is wired: false (default) = 3 x 1P, three independent circuits shown as three rows with per-phase readings and eligible for a phase split; true = one combined circuit shown as a single row, with thresholds ganged across all three phases.
voltageAMinMin threshold phase A voltage in volts (COIL3P only)
voltageBMinMin threshold phase B voltage in volts (COIL3P only)
voltageCMinMin threshold phase C voltage in volts (COIL3P only)
voltageAMaxMax threshold phase A voltage in volts (COIL3P only)
voltageBMaxMax threshold phase B voltage in volts (COIL3P only)
voltageCMaxMax threshold phase C voltage in volts (COIL3P only)
currentAMaxMax threshold phase A current in amps (COIL3P only)
currentBMaxMax threshold phase B current in amps (COIL3P only)
currentCMaxMax threshold phase C current in amps (COIL3P only)
powerAMaxMax threshold phase A power in watts (COIL3P only)
powerBMaxMax threshold phase B power in watts (COIL3P only)
powerCMaxMax threshold phase C power in watts (COIL3P only)
phaseLabelsCOIL3P only. Optional labels for phases A, B and C (in order). Max 3 entries.
phaseParentPhase children only. The COIL3P clamp this row represents one phase of. The clamp owns the MAC, the telemetry and the firmware; this row owns only the organisational assignment.
phasePhase children only. Which phase of the parent clamp this row draws its readings from.
splitAtPhase children only. Audit record of when this leg's document was created. Nothing filters on it: a COIL3P writes its per-phase columns on every message whatever its wiring, so a leg owns its column for the whole of the parent's history, including rows predating the split.
realTimePowerAPhase A real-time power (W)
realTimePowerBPhase B real-time power (W)
realTimePowerCPhase C real-time power (W)
realTimeVoltageAPhase A real-time voltage (V)
realTimeVoltageBPhase B real-time voltage (V)
realTimeVoltageCPhase C real-time voltage (V)
realTimeCurrentAPhase A real-time current (A)
realTimeCurrentBPhase B real-time current (A)
realTimeCurrentCPhase C real-time current (A)
totalEnergyUsageAPhase A cumulative energy usage (kWh)
totalEnergyUsageBPhase B cumulative energy usage (kWh)
totalEnergyUsageCPhase C cumulative energy usage (kWh)
powerFactorAPhase A power factor (0-1)
powerFactorBPhase B power factor (0-1)
powerFactorCPhase C power factor (0-1)
FilteredMcbDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
mcbTypeType of MCB (trip curve type)
ratedCurrentRated current capacity in amperes
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
rangeEnergyUsageEnergy usage in kWh over the from..till window, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
measurementTypeType of load/circuit being measured by this MCB
ratedVoltageRated voltage in volts
realTimeVoltageReal-time voltage in volts
powerFactorPower factor (0-1)
digitalTwinXX coordinate for digital twin SVG positioning
digitalTwinYY coordinate for digital twin SVG positioning (free-placed devices such as coils)
Absolute canvas positions of the 3 CT clamps (COIL3P devices only)
coilRotationRotation of the coil body in the digital twin, in degrees (e.g. 0, 90, 180, 270).
rowLineRow line number (1-6) the MCB is connected to
slotNumberSlot/position number on the busbar
isReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isAReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isBReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isCReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isSingleCOIL3P only. How the clamp is wired. false = 3 x 1P, three independent circuits, each shown as its own row with per-phase readings; true = one combined three-phase circuit shown as a single row, with one threshold shared by all three phases.
phaseLabelsCOIL3P only. Optional labels for phases A, B and C (in order).
realTimePowerAPhase A real-time power (W)
realTimePowerBPhase B real-time power (W)
realTimePowerCPhase C real-time power (W)
realTimeVoltageAPhase A real-time voltage (V)
realTimeVoltageBPhase B real-time voltage (V)
realTimeVoltageCPhase C real-time voltage (V)
realTimeCurrentAPhase A real-time current (A)
realTimeCurrentBPhase B real-time current (A)
realTimeCurrentCPhase C real-time current (A)
totalEnergyUsageAPhase A cumulative energy usage (kWh)
totalEnergyUsageBPhase B cumulative energy usage (kWh)
totalEnergyUsageCPhase C cumulative energy usage (kWh)
powerFactorAPhase A power factor (0-1)
powerFactorBPhase B power factor (0-1)
powerFactorCPhase C power factor (0-1)
phaseSet only when the list is requested with expandPhases=true and this row represents a single phase of a COIL3P device. In that mode realTimePower, realTimeCurrent, realTimeVoltage, totalEnergyUsage and powerFactor hold the values of this phase.
phaseParentSet when this row is one phase of a split COIL3P. The hardware settings — rated current, thresholds, reverse-power, firmware, panel position — belong to the clamp at this id, not to the leg; only the name and the Room / Zone / Tenant assignment are the leg's own.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a whole device.
phaseNameUser-defined name of this row's phase (expandPhases=true rows only)
GetMCBsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of MCBs with organizational hierarchy details
MCBNameSuggestionDto
mcbIdMCB ID
suggestedNameSuggested device name composed of Distribution Box name, Room name, and Measurement type
distributionBoxNameDistribution Box name
roomNameRoom name
zoneNameZone name
tenantNameTenant name
deviceNumberDevice number
MCBNameUpdateDto
mcbIdMCB ID
deviceNameNew device name to save
SaveBulkMCBNamesDto
Array of MCB ID and name pairs to save
MCBUpdateDto
mcbIdMCB ID
ratedCurrentRated current capacity in amperes (1-100)
ratedVoltageRated voltage in volts
mcbTypeType of MCB
measurementTypeType of load/circuit being measured by this MCB
MassUpdateMCBDto
Array of MCB updates
UpdateMCBDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
deviceNumberUnique device number for identification
mcbTypeType of MCB (trip curve type)
measurementTypeMeasurement type classification for energy usage categorization
onStatusStatus of the MCB
ratedCurrentRated current capacity in amperes
ratedVoltageRated voltage in volts
distributionBoxIdDistribution Box ID containing this MCB
digitalTwinXX coordinate for digital twin SVG positioning
coilRotationRotation of the coil body in the digital twin, in degrees (e.g. 0, 90, 180, 270).
rowLineRow line number (1-6) the MCB is connected to
slotNumberSlot/position number on the busbar
isSingleCOIL3P only. How the clamp is wired. false = 3 x 1P, three independent circuits, each shown as its own row with per-phase readings and thresholds set independently; true = one combined three-phase circuit shown as a single row, with the same threshold applied to all three phases and every phase marked in use.
phaseLabelsCOIL3P only. Optional labels for phases A, B and C (in order). Max 3 entries.
MassMoveMCBsDistributionBoxDto
mcbIdsArray of MCB IDs to move to the new distribution box
newDistributionBoxIdID of the new distribution box to move the MCBs to. If null or undefined, MCBs will be unassigned from their current distribution box.
PhaseAssignmentDto
phaseWhich phase of the clamp this assignment covers
roomIdRoom this phase feeds. At least one of roomId / zoneId / tenantId must be supplied, otherwise the phase has no location and its energy is attributed nowhere.
zoneIdZone this phase feeds
tenantIdTenant this phase is billed to
deviceNameDisplay name for this phase. Defaults to the clamp's own per-phase name, or '
isSpareMark this leg as spare — the clamp is installed but nothing is wired to this phase. A spare leg still exists as a device so it can be assigned later, but is excluded from device counts, energy views and analytics. Clear it with PATCH /mcb/:systemId/:legId { isSpare: false } once the circuit is connected.
SplitMcbPhasesDto
One entry per phase to break out. Supply only the phases that are physically wired — a clamp with two live phases yields two children, not three. Each phase may appear at most once.
PhaseSplitIntegrityDto
parentsStillAttachedSplit clamps that still carry an organisational ref. Each one is counted alongside its own children, so its energy appears twice. The most serious of the three — it reaches invoices silently.
orphanedChildrenActive phase children whose parent clamp is missing or no longer marked as split. Their history cannot be projected, so they report zero.
childrenWithoutLocationActive phase children with no room, zone or tenant, so their energy is attributed to no location. Informational only — it does not affect healthy, because a clamp that was never assigned produces unassigned children too, which is a pre-existing data gap rather than a fault in the split.
healthyTrue when no split clamp is still attached and no child is orphaned — the two states that corrupt reported energy. childrenWithoutLocation is excluded deliberately; see its description.
MCBPositionDto
mcbIdMCB ID
rowLineRow line number (1-6) the MCB is connected to
digitalTwinXX coordinate for digital twin SVG positioning
digitalTwinYY coordinate for digital twin SVG positioning (free-placed devices such as coils)
slotNumberSlot/position number on the busbar
Absolute canvas positions of the 3 CT clamps (COIL3P devices only)
coilRotationRotation of the coil body in the digital twin, in degrees (e.g. 0, 90, 180, 270).
BulkUpdateMCBPositionsDto
Array of MCB positions to update
SetReversePowerDto
isReversePowerWhether to enable reverse power mode. When true, negative power/current values are converted to positive (absolute values).
isAReversePowerWhether to enable reverse power mode. When true, negative power/current values are converted to positive (absolute values).
isBReversePowerWhether to enable reverse power mode. When true, negative power/current values are converted to positive (absolute values).
isCReversePowerWhether to enable reverse power mode. When true, negative power/current values are converted to positive (absolute values).
SetReversePowerResponseDto
mcbIdThe MCB ID that was updated
isReversePowerThe new reverse power status
isAReversePowerThe new reverse power status
isBReversePowerThe new reverse power status
isCReversePowerThe new reverse power status
hourlyRecordsConvertedNumber of hourly usage history records converted to absolute values
dailyRecordsConvertedNumber of daily usage history records converted to absolute values
PeopleCounterConfig
enabledWhether the BLE people counter is scanning. Enabling takes effect only on the next device boot, so a pending enable reports false until then, as does a unit whose BLE radio failed to start
rssiGateRoom boundary in dBm (-100..-20); weaker devices are treated as past the wall. Must be calibrated per site
connectDurationSeconds a BLE device must stay inside the gate before it is counted as connected (10..3600)
disconnectDurationSeconds a BLE device must be unseen before it is counted as disconnected (5..3600)
debugModeEnabledWhether the device publishes the BLE devices it sees on the generic debug topic (feature: peopleCounter)
AirconControlIrType
Type of IR device being controlled (AIRCON or FAN)
AirconControlFanBrand
Brand of the fan unit (only applicable when irType is FAN)
AirconControlSeriesType
Series type — MAXWELL (control only), MAXWELL_PRO (control + ambient temp/humidity sensing), or MAXWELL_ULTRA (control + ambient temp/humidity + motion sensing)
AirconControl
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
isIRRemoteWhether this is an IR remote (true) or wired control (false)
irTypeType of IR device being controlled (AIRCON or FAN)
temperatureTemperature setting in degrees Celsius
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
Settings as last reported by the device into its config shadow
Settings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected — except peopleCounter.enabled: true, which only confirms on the next boot
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
fanBrandBrand of the fan unit (only applicable when irType is FAN)
fanSpeedFan speed setting (only applicable when irType is FAN)
brandBrand of the AC unit being controlled
modelNumberManufacturer model number (e.g. FTKM50QV1M). Required for consumption estimation via AirconModelSpec lookup. Stored uppercased and trimmed.
modeAC operation mode (COOL, HEAT, DRY, FAN, AUTO)
fanFan speed setting (LOW, MEDIUM, HIGH, AUTO)
swingSwing/oscillation setting (ON, OFF, AUTO)
temperatureMinMin ambient temperature threshold in Celsius for alerts
temperatureMaxMax ambient temperature threshold in Celsius for alerts
humidityMinMin ambient humidity threshold percentage for alerts
humidityMaxMax ambient humidity threshold percentage for alerts
notificationThresholdHourMinimum hours between repeated notifications for the same alert type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
seriesTypeSeries type — MAXWELL (control only), MAXWELL_PRO (control + ambient temp/humidity sensing), or MAXWELL_ULTRA (control + ambient temp/humidity + motion sensing)
realTimeMotionDetectedLatest real-time motion detection reading from the device (MAXWELL_ULTRA only)
realTimeOccupancyLatest occupancy estimate from the BLE people counter. null when the last report carried no occupancy — never 0 by default
FilteredAirconControlDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
isIRRemoteWhether this is an IR remote (true) or wired control (false)
irTypeType of IR device being controlled (AIRCON or FAN)
temperatureTarget temperature setting in degrees Celsius
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
fanBrandBrand of the fan unit (only applicable when irType is FAN)
fanSpeedFan speed setting (only applicable when irType is FAN)
brandBrand of the AC unit being controlled
modelNumberManufacturer model number (e.g. FTKM50QV1M). Used with brand for consumption estimation via AirconModelSpec lookup.
modeAC operation mode (COOL, HEAT, DRY, FAN, AUTO)
fanFan speed setting (LOW, MEDIUM, HIGH, AUTO)
swingSwing/oscillation setting (ON, OFF, AUTO)
seriesTypeSeries type — MAXWELL (control only), MAXWELL_PRO (control + ambient temp/humidity sensing), or MAXWELL_ULTRA (control + ambient temp/humidity + motion sensing)
realTimeMotionDetectedLatest real-time motion detection reading from the device (MAXWELL_ULTRA only)
realTimeOccupancyLatest occupancy estimate from the people counter. null or absent means no reading, not an empty room
Settings as last reported by the device into its config shadow
Settings written to the config shadow but not yet reported back
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
GetAirconControlsDto
List of aircon control devices with organizational hierarchy details
totalTotal number of aircon control devices
pageCurrent page number
sizeNumber of items per page
UpdateAirconControlDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
isIRRemoteWhether this is an IR remote (true) or wired control (false)
brandTypeBrand of the AC unit being controlled
modelNumberManufacturer model number used to look up rated power for consumption estimation (e.g. FTKM50QV1M).
irTypeType of IR device being controlled (AIRCON or FAN)
fanBrandBrand of the fan unit (only applicable when irType is FAN)
fanSpeedFan speed setting (only applicable when irType is FAN)
ControlAirconDto
valueonStatusPower state of the AC (ON/OFF/INACTIVE)
temperatureTarget temperature setting in degrees Celsius
modeAC operation mode (COOL, HEAT, DRY, FAN, AUTO)
fanFan speed setting (LOW, MEDIUM, HIGH, AUTO)
swingSwing/oscillation setting (ON, OFF, AUTO)
fanSpeedFan speed setting (only applicable when irType is FAN)
brandTypeBrand of the AC unit (only applicable when irType is AIRCON)
UpdateAirconControlThresholdDto
temperatureMinMin ambient temperature threshold in Celsius
temperatureMaxMax ambient temperature threshold in Celsius
humidityMinMin ambient humidity threshold percentage
humidityMaxMax ambient humidity threshold percentage
notificationThresholdHourMinimum hours between repeated notifications for the same alert type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
thresholdEnabledWhether threshold monitoring is enabled on this device. MCB only.
UpdatePeopleCounterConfigDto
enabledDisabling stops scanning immediately; enabling takes effect only on the next device boot
rssiGateRoom boundary in dBm; weaker devices are treated as past the wall. Must be calibrated per site
connectDurationSeconds a BLE device must stay inside the gate before it is counted as connected. Must stay above the 8 s walk-by bar. Device default 30
disconnectDurationSeconds a BLE device must be unseen before it is counted as disconnected. Device default 20
debugModeEnabledPublish the BLE devices the counter sees, with RSSI, on the generic debug topic for calibrating rssiGate. Stays on, reboots included, until set back to false
MassUpdateBrandAirconDto
idsArray of Aircon Control IDs to update
brandTypeBrand to assign to all specified devices
BulkControlAirconDto
idsArray of Aircon Control IDs to control
onStatusPower state of the AC (ON/OFF/INACTIVE)
temperatureTarget temperature setting in degrees Celsius
modeAC operation mode (COOL, HEAT, DRY, FAN, AUTO)
fanFan speed setting (LOW, MEDIUM, HIGH, AUTO)
swingSwing/oscillation setting (ON, OFF, AUTO)
fanSpeedFan speed setting (only applicable when irType is FAN)
brandTypeBrand of the AC unit (only applicable when irType is AIRCON)
EstimateAirconConsumptionDto
startDateStart of the date range (ISO 8601). Inclusive.
endDateEnd of the date range (ISO 8601). Inclusive.
AirconConsumptionByModeDto
kwhTotal kWh accumulated while in this mode
hoursTotal runtime hours while in this mode
AirconConsumptionIntervalDto
startendmodeOperating mode (AIRCON_CONTROL only)
temperatureCfanFan speed setting (AIRCON_CONTROL only)
hoursDuration in hours
powerKwEstimated instantaneous power draw in kW
kwhEstimated energy consumed during this interval in kWh
AirconConsumptionEstimateDto
airconIdbrandAir conditioner brand (AIRCON_CONTROL only)
modelNumberratedInputPowerKwRated input power (kW) used as the load reference
startDateendDateambientTempCAmbient temperature used in the load-factor calc
ambientSourceWhere the ambient temperature came from
totalKwhtotalRuntimeHourskWh and runtime hours broken down by AirconControlMode. Keys are mode names (COOL, DRY, FAN, AUTO, HEAT). Values are AirconConsumptionByModeDto.
Per-interval breakdown used to build the totals
accuracyNoteDisclaimer on accuracy
tariffCentsPerKwhCurrent system tariff in cents/kWh used to compute cost. Omitted if no active tariff rate is set on the system.
costSgdTotal cost in SGD = totalKwh × (tariffCentsPerKwh / 100). Omitted when no active tariff rate is set on the system.
CreateRoomDto
nameDisplay name for the room. This will be used to identify the room throughout the system.
squareMeterFloor area of the room in square meters.
remarksOptional administrative notes or comments about the room. Used for describing the room purpose or equipment.
systemIdUnique identifier of the system that this room belongs to. Automatically populated from URL parameter.
tenantIdOptional identifier of the tenant organization that owns this room. Can be omitted for single-tenant systems.
zoneIdOptional identifier of the zone to assign this room to. If provided, the room will be accessible by this zone.
roomTypeRoom type key. Must be a valid type defined for this system via /entity-type/ROOM.
GetRoomsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of room objects matching the query parameters. Each room includes plug count and total energy usage.
UpdateRoomDto
nameUpdated display name for the room. This will replace the existing room name.
zoneIdUpdated zone identifier to reassign room access to a different zone.
tenantIdUpdated tenant identifier to reassign the room to a different organization.
squareMeterUpdated floor area of the room in square meters. Pass null to clear the existing value.
remarksUpdated administrative notes or comments about the room. Replaces existing remarks if provided.
roomTypeRoom type key. Must be a valid type defined for this system via /entity-type/ROOM.
AirconModelSpecDto
_idbrandAir conditioner brand (AIRCON_CONTROL only)
modelNumberratedCoolingKwratedInputPowerKwverifiedAtcreatedAtupdatedAtcspfannualKwhSgnotesAirconModelSpecsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Aircon model spec rows matching the query
CreateAirconModelSpecDto
brandAir conditioner brand (AIRCON_CONTROL only)
modelNumberManufacturer model number. Server uppercases + trims.
ratedCoolingKwratedInputPowerKwcspfannualKwhSgverifiedAtWhen this row was verified. Defaults to now if omitted.
notesUpdateAirconModelSpecDto
brandAir conditioner brand (AIRCON_CONTROL only)
modelNumberManufacturer model number. Server uppercases + trims.
ratedCoolingKwratedInputPowerKwcspfannualKwhSgverifiedAtWhen this row was verified. Defaults to now if omitted.
notesRidgeCommunicationType
RidgeUnitStatusCountsDto
onUnits reporting power ON
offUnits reporting power OFF
inactiveUnits the gateway cannot reach, or that have not reported power yet
totalEvery unit the gateway fronts
FilteredRidgeDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
integrationTypeThe kind of external integration this gateway fronts
communicationTypeDownstream transport protocol the gateway uses to reach its external devices
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
configurationPer-integration connection configuration. Shape depends on integrationType.
propertiesDownstream member dictionary (member number → object spec).
ON / OFF / INACTIVE breakdown of the external devices this gateway fronts
GetRidgesDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of RIDGE gateways matching the query parameters
RidgeControllerInfo
versioniTM protocol version reported by the controller
tempUnitTemperature unit the controller reports setpoints/temps in
macMAC address of the controller itself (not the RIDGE gateway macId)
firmwareController firmware version string
Ridge
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
integrationTypeThe kind of external integration this gateway fronts
communicationTypeDownstream transport protocol the gateway uses to reach its external devices
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
configurationPer-integration connection configuration (e.g. Daikin: BACnet deviceInstance, port count, host). Shape depends on integrationType.
propertiesDownstream object/member dictionary for the integration (member number → object type, R/W, value encodings). Seeded from the adapter spec; firmware-reported tables win.
subscriptionGenerationMonotonic generation of the watch set last published to the gateway. Every subscription packet carries it, so the firmware can tell a fresh set from a replay of an older one. Incremented on every publish.
Identity the downstream controller reported in its last discovery session (iTM systemInfo). Absent on BACnet gateways.
lastUnitNumberHighest unitNumber handed to a unit behind this gateway. Only ever incremented, so a deleted unit's number is never reused.
CreateRidgeDto
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
onStatusInitial operational status of the device when created
integrationTypeThe kind of external integration this gateway fronts
communicationTypeDownstream transport protocol the gateway uses to reach its external devices
deviceNameFriendly name for the device for easy identification
configurationPer-integration connection configuration (e.g. Daikin: BACnet deviceInstance, port count, host). Shape depends on integrationType.
propertiesDownstream member dictionary (member number → object spec). Omit to seed from the adapter defaults for the integration.
UpdateRidgeDto
integrationTypeIntegration the gateway fronts (assign after an UNASSIGNED auto-provision)
communicationTypeDownstream transport (assign after an UNASSIGNED auto-provision)
deviceNameFriendly name for the gateway
locationPhysical location of the gateway
remarksAdmin notes
isLockedWhether the gateway is locked from control
configurationPer-integration connection configuration (e.g. Daikin: BACnet deviceInstance, port count, host). Shape depends on integrationType.
propertiesDownstream member dictionary (member number → object spec).
SyncRidgeConfigurationDto
usernameiTM HTTP auth username. Relayed to the gateway, never stored cloud-side.
passwordiTM HTTP auth password. Relayed to the gateway, never stored cloud-side.
RidgeControlFieldSettingDto
keyCommand key this entry positions — matches ExternalDeviceCommand.key
visibleWhether the control UI surfaces this command as a primary control
GetRidgeControlLayoutDto
systemIdThe system the layout belongs to
integrationTypeThe integration type the layout applies to
Ordered control fields with their visibility
isDefaultTrue when no layout has been saved and the integration default is returned
offTargetThresholdCHow far room temperature may sit from setpoint before a unit is reported as not holding target (°C). Absent when the system has not configured one.
UpdateRidgeControlLayoutDto
Ordered control fields with their visibility
offTargetThresholdCHow far room temperature may sit from setpoint before a unit is reported as not holding target (°C). Omit to leave the system on the client default.
ExternalDeviceType
DaikinHvacControlDto
powerPower the unit on (true) or off (false)
setpointSetpoint temperature in °C. The integration narrows this per mode (Daikin: cool 18–32, heat 14–28; rejected in auto).
modeAC mode (1=cool, 2=heat, 3=fan, 4=auto, 5=dry)
fanFan rate (1=low, 2=high, 3=middle, 4=auto)
lockPowerLock (true) or unlock (false) the wired remote power button
lockModeLock (true) or unlock (false) the wired remote mode selector
lockSetpointLock (true) or unlock (false) the wired remote setpoint adjust
forcedOffForced system stop (true) or clear (false) — port-master units only (ac 0/64/128/192). Units stay OFF after clear.
filterResetReset the dirty-filter sign
forcedThermoOffForce the thermostat off (true) or clear (false)
energySavingEnable (true) or clear (false) energy-saving operation
airDirectionLouver / air-direction position. The valid positions are model-specific, so no range is enforced here — a position the unit does not support is rejected by the unit.
ExternalDeviceOneTimeScheduleEntry
dateTimeWhen to apply the control (ISO 8601)
Full control snapshot to apply at the scheduled time
ruleNameEventBridge rule name for tracking and management
ExternalDeviceDailyScheduleEntry
timeLocal time in HH:mm to apply the control
Full control snapshot to apply at the scheduled time
ruleNameEventBridge rule name for tracking and management
ExternalDeviceDto
_idDatabase ID
ridgeIdParent RIDGE gateway ID
systemIdSystem the parent gateway belongs to
externalIdOpaque downstream address on the gateway bus (e.g. Daikin "ac" 0–255, Modbus address) — NOT this document id
tenantIdTenant this unit serves, if assigned
zoneIdZone this unit serves, if assigned
roomIdRoom this unit conditions, if assigned
unitNumberOur 1-based number for this unit within its gateway, shown as "
pointTypeiTM point type from discovery (101 = indoor unit). Absent on BACnet gateways.
deviceNameFriendly name
remarksFree-text remarks about this external device
equipmentTypeSpecific equipment class of the external device
categoryBroad equipment category, derived from equipmentType. Decides which control contract applies.
propertiesIntegration-specific configuration
stateLast-known state snapshot
lastUpdateWhen the state was last updated
watchedWhether the parent gateway actively polls this unit (iTM watch list)
Recurring + one-time control schedule for this device
GetExternalDevicesDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of external devices matching the query parameters
CreateExternalDeviceDto
externalIdOpaque downstream address on the gateway bus (e.g. Daikin "ac" 0–255, Modbus address)
deviceNameFriendly name for the external device
equipmentTypeEquipment category of the external device
propertiesIntegration-specific per-device configuration. Shape depends on the integration.
remarksFree-text remarks about this external device
UpdateExternalDeviceDto
deviceNameFriendly name for the external device
equipmentTypeEquipment category of the external device
propertiesIntegration-specific per-device configuration. Shape depends on the integration.
remarksFree-text remarks about this external device
watchedWhether the parent gateway actively polls this unit (iTM watch list). Toggling this changes the watch set sent on the next gateway config push.
roomIdPlace this unit in a room. Its zone and tenant are derived from the room, so send at most one of roomId / zoneId / tenantId. Must belong to the same system as the parent gateway. Pass null to clear the room only.
zoneIdPlace this unit in a zone. Its tenant is derived from the zone and any room assignment is cleared. Pass null to clear the zone and room.
tenantIdPlace this unit under a tenant directly. Clears any zone and room assignment. Pass null to clear the whole placement.
ExternalDeviceCommandDirection
Whether the command is readable, writable, or both
ExternalDeviceCommandValueType
Value shape the command accepts / reports
ExternalDeviceCommandDto
keyStable code to control / read by
directionWhether the command is readable, writable, or both
nameHuman-friendly label as discovery reported it
valueTypeValue shape the command accepts / reports
valuesAllowed values — an enum map (raw → label) or a numeric range { min, max }
pointTypePoint / equipment type this command applies to (iTM pointType)
ExternalDeviceCommandWriteDto
keyCommand key from the unit's catalog. Semantic where the protocol makes the meaning unambiguous ("energy", "setpoint"), otherwise the object address ("analogValue:1").
Value to write. Validated against the command row: BOOL takes a boolean, NUMBER a number within the advertised range.
ExternalDeviceCommandControlDto
Writes to apply, all in one command to the gateway
BulkControlExternalDeviceDto
externalDeviceIdsExternal device ids to apply this control request to
Control snapshot applied to every listed unit. Omitted fields are left untouched.
BulkControlFailureDto
externalDeviceIdExternal device id that failed
reasonWhy the control request could not be relayed
BulkControlResultDto
successfulExternal device ids whose writes were published to a gateway
publishedCommandsNumber of MQTT commands published — one per gateway with targets in this request
ExternalDeviceOneTimeScheduleEntryDto
dateTimeWhen to apply the control (ISO 8601, must be in the future)
Full control snapshot to apply at the scheduled time
ExternalDeviceScheduleEntryDto
timeLocal time in HH:mm
Full control snapshot to apply at the scheduled time
SetExternalDeviceScheduleDto
One-time control entries (execute once, then auto-remove)
ExternalDevicePendingControl
commandIdId the gateway echoes on its command result
sourceWho issued the command
keysState keys the command writes and has not yet seen reported
atWhen the command was published
confirmedAtWhen the gateway reported the command applied
ExternalDevice
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
ridgeParentParent RIDGE gateway that fronts this device
externalIdOpaque downstream address (e.g. Daikin "ac" id, Modbus address)
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
remarksFree-text remarks about this external device
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
unitNumberOur number for this unit, 1-based and unique within its gateway. Assigned once when the unit is first provisioned and never reassigned; a deleted unit leaves a gap. Unlike externalId, which the gateway dictates, this is readable and sequential.
pointTypeiTM point type reported at discovery (101 = indoor unit). Together with the pointId (stored as externalId) this identifies one equipment point. Absent on BACnet gateways.
equipmentTypeEquipment class of the unit. Distinct from the base deviceType, which is always EXTERNAL for these rows.
watchedWhether the parent gateway actively polls this unit (iTM watch list). The gateway config push derives its point list from the watched units; when none are watched the gateway polls every discovered point (commissioning).
propertiesIntegration-specific configuration. Shape depends on the integration.
stateLast-known state snapshot. Shape depends on the integration.
lastUpdateWhen the state was last updated
Recurring weekly + one-time control schedule for this device. Each entry applies a full control snapshot.
Cloud command awaiting confirmation in a realtime report
BulkApplyExternalDeviceScheduleDto
externalDeviceIdsExternal device ids to apply this schedule to
Schedule applied to every listed unit, replacing whatever each one has (PUT semantics).
BulkScheduleFailureDto
externalDeviceIdExternal device id that failed
reasonWhy the schedule could not be applied
BulkApplyScheduleResultDto
successfulExternal device ids the schedule was applied to
ExternalDeviceHistoryDto
_idDatabase ID
externalDeviceIdExternal device this snapshot belongs to
stateState snapshot at this point in time
createdAtWhen the snapshot row was written
recordedAtWhen the gateway observed this state
triggerSourceWho changed the unit, when this snapshot changed a control field. MANUAL means no cloud command explains the change (wall remote, BMS). Absent otherwise.
changedKeysControl fields this snapshot changed
GetExternalDeviceHistoryDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of state snapshots in the requested date range
EnvironmentSensorType
Type of the environment sensor device (e.g., IAQ4, IAQ9)
EnvironmentSensor
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
environmentSensorTypeType of the environment sensor device (e.g., IAQ4, IAQ9)
notificationThresholdHourHourly notification threshold for the Environment Sensor
carbonDioxideThreshold CO2 reading in ppm
luxThreshold light level in lux (lx)
formaldehydeThreshold formaldehyde (HCHO) reading in µg/m³
temperatureMinMin Threshold temperature reading in degrees Celsius
temperatureMaxMaxThreshold temperature reading in degrees Celsius
humidityThreshold humidity percentage
pm1Threshold PM1 in µg/m³
pm2_5Threshold PM2.5 in µg/m³
pm10Threshold PM10 in µg/m³
totalVolatileOrganicCompoundsThreshold Total Volatile Organic Compounds in ppb
soundLevelThreshold Sound Level in dB
motionDetectedMotion detection status
thresholdGroupNameName of the threshold group this sensor belongs to
realTimeTemperatureReal-time Temperature reading in degrees Celsius
realTimeCarbonDioxideReal-time CarbonDioxide reading in ppm
realTimeHumidityReal-time Humidity reading in percentage
realTimePm1Real-time PM1 reading in µg/m³
realTimePm2_5Real-time PM2.5 reading in µg/m³
realTimePm10Real-time PM10 reading in µg/m³
realTimeTotalVolatileOrganicCompoundsReal-time TotalVolatileOrganicCompounds reading in ppb
realTimeSoundLevelReal-time SoundLevel reading in dB
realTimeMotionDetectedReal-time MotionDetected reading
realTimeLuxReal-time Lux reading in lux
realTimeFormaldehydeReal-time Formaldehyde reading in ppm
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
FilteredEnvironmentSensorDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
temperatureMinMinimum threshold temperature reading in degrees Celsius
temperatureMaxMaximum threshold temperature reading in degrees Celsius
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
environmentSensorTypeType of environment sensor (IAQ4, IAQ9, or temperature sensor)
temperatureCurrent temperature reading in degrees Celsius
carbonDioxideThreshold CO2 reading in ppm
luxThreshold light level in lux (lx)
formaldehydeThreshold formaldehyde (HCHO) reading in ppm
humidityThreshold humidity percentage
pm1Threshold PM1 in µg/m³
pm2_5Threshold PM2.5 in µg/m³
pm10Threshold PM10 in µg/m³
totalVolatileOrganicCompoundsThreshold Total Volatile Organic Compounds in ppm
soundLevelThreshold Sound Level in dB
motionDetectedMotion detection status
thresholdGroupNameName of the threshold group this sensor belongs to
realTimeCarbonDioxideReal-time CO2 reading in ppm
realTimeLuxReal-time light level in lux (lx)
realTimeFormaldehydeReal-time formaldehyde (HCHO) reading in ppm
realTimeHumidityReal-time humidity percentage
realTimePm1Real-time PM1 in µg/m³
realTimePm2_5Real-time PM2.5 in µg/m³
realTimePm10Real-time PM10 in µg/m³
realTimeTotalVolatileOrganicCompoundsReal-time Total Volatile Organic Compounds in ppm
realTimeSoundLevelReal-time Sound Level in dB
realTimeMotionDetectedReal-time motion detection status
GetEnvironmentSensorsDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of environment sensor devices
UpdateEnvironmentSensorDeviceDto
onStatusOperational status of the environment sensor device
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
BulkUpdateEnvironmentSensorThresholdsDto
environmentSensorIdsIDs of environment sensors to update
carbonDioxideThreshold CO2 reading in ppm
luxThreshold light level in lux (lx)
formaldehydeThreshold formaldehyde (HCHO) in µg/m³
temperatureMinMin Threshold temperature in °C
temperatureMaxMax Threshold temperature in °C
humidityThreshold humidity percentage
pm1Threshold PM1 in µg/m³
pm2_5Threshold PM2.5 in µg/m³
pm10Threshold PM10 in µg/m³
totalVolatileOrganicCompoundsThreshold Total Volatile Organic Compounds in ppb
soundLevelThreshold Sound Level in dB
motionDetectedMotion detection enabled
thresholdEnabledWhether threshold notifications are enabled
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
RecommendedThresholdBandsDto
temperatureMinOuter low temperature bound (°C)
temperatureWarnMinInner comfort low temperature bound (°C)
temperatureWarnMaxInner comfort high temperature bound (°C)
temperatureMaxOuter high temperature bound (°C)
humidityMinOuter low humidity bound (%)
humidityWarnMinInner comfort low humidity bound (%)
humidityWarnMaxInner comfort high humidity bound (%)
humidityOuter high humidity bound (%)
carbonDioxideWarnCO2 good cutoff (ppm)
carbonDioxideCO2 poor cutoff (ppm)
pm1WarnPM1 good cutoff (µg/m³)
pm1PM1 poor cutoff (µg/m³)
pm2_5WarnPM2.5 good cutoff (µg/m³)
pm2_5PM2.5 poor cutoff (µg/m³)
pm10WarnPM10 good cutoff (µg/m³)
pm10PM10 poor cutoff (µg/m³)
formaldehydeWarnFormaldehyde good cutoff (µg/m³)
formaldehydeFormaldehyde poor cutoff (µg/m³)
totalVolatileOrganicCompoundsWarnTVOC good cutoff (ppb)
totalVolatileOrganicCompoundsTVOC poor cutoff (ppb)
soundLevelWarnSound level good cutoff (dB)
soundLevelSound level poor cutoff (dB)
EnvironmentSensorThresholdGroup
_idPrimary ID of the Threshold Group
nameUser-defined group name
systemIdSystem this group belongs to
environmentSensorTypeType of environment sensors in this group
sensorIdsSensors assigned to this group
temperatureMinMin temperature threshold in degrees Celsius
temperatureMaxMax temperature threshold in degrees Celsius
temperatureWarnMinInner comfort lower temperature bound (good cutoff). Band: good within [temperatureWarnMin, temperatureWarnMax]; moderate within [temperatureMin, temperatureMax]; else poor. Display-only — not pushed to device.
temperatureWarnMaxInner comfort upper temperature bound (good cutoff). See temperatureWarnMin. Display-only — not pushed to device.
humidityMax humidity threshold percentage (outer high / poor cutoff)
humidityMinMin humidity threshold percentage (outer low / poor cutoff). Below this is poor. Display-only — not pushed to device.
humidityWarnMinInner comfort lower humidity bound (good cutoff). Band: good within [humidityWarnMin, humidityWarnMax]; moderate within [humidityMin, humidity]; else poor. Display-only — not pushed to device.
humidityWarnMaxInner comfort upper humidity bound (good cutoff). See humidityWarnMin. Display-only — not pushed to device.
carbonDioxideMax CO2 threshold in ppm (poor cutoff)
carbonDioxideWarnCO2 good cutoff in ppm. Band: good ≤ warn; moderate ≤ carbonDioxide; else poor. Display-only — not pushed to device.
luxMax light level threshold in lux (lx)
formaldehydeMax formaldehyde (HCHO) threshold in ppm (poor cutoff)
formaldehydeWarnFormaldehyde good cutoff in ppm. Band: good ≤ warn; moderate ≤ formaldehyde; else poor. Display-only — not pushed to device.
pm1Max PM1 threshold in µg/m³ (poor cutoff)
pm1WarnPM1 good cutoff in µg/m³. Band: good ≤ warn; moderate ≤ pm1; else poor. Display-only — not pushed to device.
pm2_5Max PM2.5 threshold in µg/m³ (poor cutoff)
pm2_5WarnPM2.5 good cutoff in µg/m³. Band: good ≤ warn; moderate ≤ pm2_5; else poor. Display-only — not pushed to device.
pm10Max PM10 threshold in µg/m³ (poor cutoff)
pm10WarnPM10 good cutoff in µg/m³. Band: good ≤ warn; moderate ≤ pm10; else poor. Display-only — not pushed to device.
totalVolatileOrganicCompoundsMax TVOC threshold in ppb (poor cutoff)
totalVolatileOrganicCompoundsWarnTVOC good cutoff in ppb. Band: good ≤ warn; moderate ≤ totalVolatileOrganicCompounds; else poor. Display-only — not pushed to device.
soundLevelMax sound level threshold in dB (poor cutoff)
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
soundLevelWarnSound level good cutoff in dB. Band: good ≤ warn; moderate ≤ soundLevel; else poor. Display-only — not pushed to device.
CreateEnvironmentSensorThresholdGroupDto
nameUser-defined group name
environmentSensorTypeType of environment sensors in this group
sensorIdsSensor IDs to assign to this group. Each sensor must match the group's environmentSensorType. Sensors are automatically removed from their previous group.
temperatureMinMin temperature threshold in degrees Celsius
temperatureMaxMax temperature threshold in degrees Celsius
temperatureWarnMinInner comfort lower temperature bound (good cutoff)
temperatureWarnMaxInner comfort upper temperature bound (good cutoff)
humidityMax humidity threshold percentage (outer high / poor cutoff)
humidityMinMin humidity threshold percentage (outer low / poor cutoff)
humidityWarnMinInner comfort lower humidity bound (good cutoff)
humidityWarnMaxInner comfort upper humidity bound (good cutoff)
carbonDioxideMax CO2 threshold in ppm (poor cutoff)
carbonDioxideWarnCO2 good cutoff in ppm
luxMax light level threshold in lux (lx)
formaldehydeMax formaldehyde (HCHO) threshold in ppm (poor cutoff)
formaldehydeWarnFormaldehyde good cutoff in ppm
pm1Max PM1 threshold in µg/m³ (poor cutoff)
pm1WarnPM1 good cutoff in µg/m³
pm2_5Max PM2.5 threshold in µg/m³ (poor cutoff)
pm2_5WarnPM2.5 good cutoff in µg/m³
pm10Max PM10 threshold in µg/m³ (poor cutoff)
pm10WarnPM10 good cutoff in µg/m³
totalVolatileOrganicCompoundsMax TVOC threshold in ppb (poor cutoff)
totalVolatileOrganicCompoundsWarnTVOC good cutoff in ppb
soundLevelMax sound level threshold in dB (poor cutoff)
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
soundLevelWarnSound level good cutoff in dB
UpdateEnvironmentSensorThresholdGroupDto
nameUpdated group name
sensorIdsFull list of sensor IDs to assign to this group (replaces existing assignments). Each sensor must match the group's environmentSensorType. Sensors are automatically removed from their previous group.
temperatureMinMin temperature threshold in degrees Celsius
temperatureMaxMax temperature threshold in degrees Celsius
temperatureWarnMinInner comfort lower temperature bound (good cutoff)
temperatureWarnMaxInner comfort upper temperature bound (good cutoff)
humidityMax humidity threshold percentage (outer high / poor cutoff)
humidityMinMin humidity threshold percentage (outer low / poor cutoff)
humidityWarnMinInner comfort lower humidity bound (good cutoff)
humidityWarnMaxInner comfort upper humidity bound (good cutoff)
carbonDioxideMax CO2 threshold in ppm (poor cutoff)
carbonDioxideWarnCO2 good cutoff in ppm
luxMax light level threshold in lux (lx)
formaldehydeMax formaldehyde (HCHO) threshold in ppm (poor cutoff)
formaldehydeWarnFormaldehyde good cutoff in ppm
pm1Max PM1 threshold in µg/m³ (poor cutoff)
pm1WarnPM1 good cutoff in µg/m³
pm2_5Max PM2.5 threshold in µg/m³ (poor cutoff)
pm2_5WarnPM2.5 good cutoff in µg/m³
pm10Max PM10 threshold in µg/m³ (poor cutoff)
pm10WarnPM10 good cutoff in µg/m³
totalVolatileOrganicCompoundsMax TVOC threshold in ppb (poor cutoff)
totalVolatileOrganicCompoundsWarnTVOC good cutoff in ppb
soundLevelMax sound level threshold in dB (poor cutoff)
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
soundLevelWarnSound level good cutoff in dB
PendingUpdateDto
jobIdActive OTA job the device matches
targetVersionVersion the rollout will bring it to
FilteredSmartSwitchDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
switchTypeType of appliance the switch controls (LIGHT, FAN, AIRCON, or UNREGISTERED)
numberOfGangsNumber of gangs/buttons on the switch (1-4)
Array of gang switch states - each gang has its own independent on/off state
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
Active OTA rollout this smart switch matches and still needs (Mongo-derived, not live progress). Absent if no rollout targets its current version.
GetSmartSwitchesDto
List of Smart Switches with organizational hierarchy details
totalTotal number of Smart Switches
pageCurrent page number
sizeNumber of items per page
UpdateSmartSwitchDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
onStatusStatus of the Smart Switch
switchTypeType of appliance the switch controls
numberOfGangsNumber of gangs/buttons on the switch (1-4)
SmartSwitch
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
switchTypeType of appliance the switch controls (LIGHT, FAN, AIRCON, or UNREGISTERED)
numberOfGangsNumber of gangs/buttons on the switch (1-4)
Array of gang switch states - each gang has its own independent on/off state
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
ControlSmartSwitchDto
gangStatesArray of binary gang switch states where 1 = ON and 0 = OFF. Array index corresponds to gang number (e.g., [1, 0, 0, 1] means gang 1 ON, gang 2 OFF, gang 3 OFF, gang 4 ON)
triggerSourceSource that triggered the control command
BulkControlSmartSwitchDto
idsArray of Smart Switch IDs to control
onStatusDesired power state for all gangs on all Smart Switches. Use ON to turn all gangs on, or OFF to turn all gangs off.
CreateDistributionBoxDto
nameName/identifier of the Distribution Box
systemIdSystem ID to which this Distribution Box belongs
numberOfRowsNumber of rows in the distribution box
hasMainBreakerWhether the distribution box has main circuit breaker
mainBreakerRatingMain breaker rating in amperes (if hasMainBreaker is true)
tenantIdTenant ID to which this Distribution Box belongs
zoneIdZone ID to which this Distribution Box belongs
roomIdRoom ID to which this Distribution Box belongs
mcbIdsArray of MCB IDs to be assigned to this distribution box
locationLocation of the Distribution Box
remarksRemarks for the Distribution Box
digitalTwinWidthWidth of the digital twin canvas in pixels
digitalTwinHeightHeight of the digital twin canvas in pixels
GetDistributionBoxesDto
Array of Distribution Boxes
totalTotal number of Distribution Boxes
pageCurrent page number
sizeNumber of items per page
SandboxDeviceInputDto
idUnique identifier for the sandbox device
typeType of sandbox device
nameUser-defined name for the device
digitalTwinXX position on the digital twin canvas
rowLineRow line position (1-6)
polesNumber of poles. Sets the module width for everything except an MCCB.
widthModulesHow many DIN modules wide the device body is, at 18mm per module. Equals poles for every modular device; an MCCB is sized by frame instead, so it carries its own value.
curveTrip curve stamped on the breaker
confidenceHow sure the reading was when this device came from a digitised photo, 0 to 1. Omit for hand-placed devices.
ratedCurrentRated current in amperes
ratedVoltageRated voltage in volts
mcbTypeMCB type (for DUMB_MCB devices)
leakageCurrentLeakage current in milliamperes (for RCCB devices)
colorCustom color for visual identification (hex code)
Absolute canvas positions of the 3 CT clamps, for a PLANNED_SMART device standing in for a Wattson Pro.
notesAdditional notes about the device
WireConnectionDto
deviceIdDevice ID (MCB._id or SandboxDevice.id)
deviceTypeType of device being connected
sideSide of the device where the connection is made
SandboxWireInputDto
idUnique identifier for the wire connection
Source connection point
Target connection point
colorWire color (hex code)
thicknessWire thickness in pixels
labelOptional label for the wire
UpdateDistributionBoxDto
nameName/identifier of the Distribution Box
numberOfRowsNumber of rows in the distribution box
hasMainBreakerWhether the distribution box has main circuit breaker
mainBreakerRatingMain breaker rating in amperes (if hasMainBreaker is true)
tenantIdTenant ID to which this Distribution Box belongs
zoneIdZone ID to which this Distribution Box belongs
roomIdRoom ID to which this Distribution Box belongs
mcbIdsArray of MCB IDs to be assigned to this distribution box
locationLocation of the Distribution Box
remarksRemarks for the Distribution Box
Array of sandbox (non-smart) devices in the distribution box
Array of wire connections between devices in the distribution box
digitalTwinWidthWidth of the digital twin canvas in pixels
digitalTwinHeightHeight of the digital twin canvas in pixels
AddMCBToDistributionBoxDto
mcbIdMCB ID to add to the distribution box
RemoveMCBFromDistributionBoxDto
mcbIdMCB ID to remove from the distribution box
GetDistributionBoxMcbDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
mcbTypeType of MCB (trip curve type)
ratedCurrentRated current capacity in amperes
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
rangeEnergyUsageEnergy usage in kWh over the from..till window, aggregated from daily usage history. Present only when both query params are supplied — unlike the cumulative totalEnergyUsage, this is windowed.
measurementTypeType of load/circuit being measured by this MCB
ratedVoltageRated voltage in volts
realTimeVoltageReal-time voltage in volts
powerFactorPower factor (0-1)
digitalTwinXX coordinate for digital twin SVG positioning
digitalTwinYY coordinate for digital twin SVG positioning (free-placed devices such as coils)
Absolute canvas positions of the 3 CT clamps (COIL3P devices only)
coilRotationRotation of the coil body in the digital twin, in degrees (e.g. 0, 90, 180, 270).
rowLineRow line number (1-6) the MCB is connected to
slotNumberSlot/position number on the busbar
isReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isAReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isBReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isCReversePowerWhether power/current readings are reversed (made absolute). When true, negative values are converted to positive.
isSingleCOIL3P only. How the clamp is wired. false = 3 x 1P, three independent circuits, each shown as its own row with per-phase readings; true = one combined three-phase circuit shown as a single row, with one threshold shared by all three phases.
phaseLabelsCOIL3P only. Optional labels for phases A, B and C (in order).
realTimePowerAPhase A real-time power (W)
realTimePowerBPhase B real-time power (W)
realTimePowerCPhase C real-time power (W)
realTimeVoltageAPhase A real-time voltage (V)
realTimeVoltageBPhase B real-time voltage (V)
realTimeVoltageCPhase C real-time voltage (V)
realTimeCurrentAPhase A real-time current (A)
realTimeCurrentBPhase B real-time current (A)
realTimeCurrentCPhase C real-time current (A)
totalEnergyUsageAPhase A cumulative energy usage (kWh)
totalEnergyUsageBPhase B cumulative energy usage (kWh)
totalEnergyUsageCPhase C cumulative energy usage (kWh)
powerFactorAPhase A power factor (0-1)
powerFactorBPhase B power factor (0-1)
powerFactorCPhase C power factor (0-1)
phaseSet only when the list is requested with expandPhases=true and this row represents a single phase of a COIL3P device. In that mode realTimePower, realTimeCurrent, realTimeVoltage, totalEnergyUsage and powerFactor hold the values of this phase.
phaseParentSet when this row is one phase of a split COIL3P. The hardware settings — rated current, thresholds, reverse-power, firmware, panel position — belong to the clamp at this id, not to the leg; only the name and the Room / Zone / Tenant assignment are the leg's own.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a whole device.
phaseNameUser-defined name of this row's phase (expandPhases=true rows only)
GetMCBEnergyUsageDto
mcbIdMCB ID
deviceNameMCB name
totalEnergyUsageTotal energy usage in kWh
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
GetDistributionBoxEnergyUsageDto
distributionBoxIdDistribution Box ID
nameDistribution Box name
totalEnergyUsageTotal energy usage in kWh (sum of all MCBs)
mcbCountNumber of MCBs in this distribution box
Individual MCB energy usage details
GetAggregatedDistributionBoxEnergyUsageDto
totalEnergyUsageTotal aggregated energy usage in kWh
distributionBoxCountNumber of distribution boxes included
Individual distribution box energy usage details
CreateSandboxDeviceDto
typeType of sandbox device
nameUser-defined name for the device
digitalTwinXX position on the digital twin canvas
rowLineRow line position (1-6)
ratedCurrentRated current in amperes
ratedVoltageRated voltage in volts
mcbTypeMCB type (for DUMB_MCB devices)
leakageCurrentLeakage current in milliamperes (for RCCB devices)
colorCustom color for visual identification (hex code)
notesAdditional notes about the device
UpdateSandboxDeviceDto
typeType of sandbox device
nameUser-defined name for the device
digitalTwinXX position on the digital twin canvas
rowLineRow line position (1-6)
ratedCurrentRated current in amperes
ratedVoltageRated voltage in volts
mcbTypeMCB type (for DUMB_MCB devices)
leakageCurrentLeakage current in milliamperes (for RCCB devices)
colorCustom color for visual identification (hex code)
notesAdditional notes about the device
ReplaceSandboxDeviceWithMcbDto
mcbIdID of the registered MCB that has been installed in place of the planned device
CreateSandboxWireDto
Source connection point
Target connection point
colorWire color (hex code)
thicknessWire thickness in pixels
labelOptional label for the wire
UpdateSandboxWireDto
Source connection point
Target connection point
colorWire color (hex code)
thicknessWire thickness in pixels
labelOptional label for the wire
UpdateSandboxElementsDto
Array of all sandbox devices (replaces existing)
Array of all sandbox wires (replaces existing)
DeviceTypeForWire
What the device was detected as. SMART_MCB means an Ecovolt breaker, which the client binds to an already-registered MCB rather than creating.
DeviceRole
How the device is fed. The wiring on a real board is mostly hidden behind the busbar, so roles are read off the photo and the wires derived from them.
TwinDeviceDto
idTemporary identifier for this detected device, unique within the response. Wires reference it; the client replaces it with a real MCB id or a generated sandbox device id on save.
typeWhat the device was detected as. SMART_MCB means an Ecovolt breaker, which the client binds to an already-registered MCB rather than creating.
nameName read off the breaker label or directory card
digitalTwinXX position on the digital twin canvas, snapped to the rail
rowLineRow line position (1-6), counted top to bottom
slotNumberModule slot the device occupies on its row, left to right
roleHow the device is fed. The wiring on a real board is mostly hidden behind the busbar, so roles are read off the photo and the wires derived from them.
widthModulesHow many DIN modules wide the device body is, at 18mm per module. Equals poles for every modular device; an MCCB is sized by frame instead.
polesNumber of poles
confidenceDetection confidence from 0 to 1. Anything below ~0.6 is worth flagging in the UI for the user to verify against the photo.
ratedCurrentRated current in amperes, if legible
ratedVoltageRated voltage in volts, if legible
mcbTypeMCB type (manual devices only)
curveTrip curve stamped on the breaker, if legible
leakageCurrentLeakage current in milliamperes (residual current devices)
colorColour for visual identification
notesWhat the model read, when it is worth keeping as a note
GenerateDigitalTwinResponseDto
numberOfRowsNumber of DIN rails detected on the board
digitalTwinWidthSuggested canvas width in pixels
digitalTwinHeightSuggested canvas height in pixels
Every breaker detected, smart and manual alike, already snapped to the rail
Proposed wiring between detected devices, referencing TwinDeviceDto ids
CreateSurgeOverrideDto
nameDisplay name
applicableEntityTypesEntity types this override can be applied to
thresholdKwhAbsolute daily threshold (kWh) granted while the override is active
pricePrice
descriptionCustomer-facing description
isActiveWhether the override is sellable
SurgeOverrideResponseDto
_idnameapplicableEntityTypesthresholdKwhpriceisActivecreatedAtupdatedAtdescriptionUpdateSurgeOverrideDto
nameDisplay name
descriptionCustomer-facing description
applicableEntityTypesEntity types this override can be applied to
thresholdKwhAbsolute daily threshold (kWh) granted while the override is active
pricePrice
isActiveWhether the override is sellable
PurchaseSurgeOverrideDto
surgeOverrideIdSurgeOverride catalog id
entityTypeEntity type the override should apply to
entityIdEntity id (room/tenant/zone)
paymentIdOptional Payment record id to link to this purchase (refunds handled via payment module)
SurgeOverridePurchaseResponseDto
_idsurgeOverridesystementityTypeType of entity to start usage surge analysis for
entityIdthresholdKwhactiveFromstatuspurchasedBycreatedAtupdatedAtpaymentpurchasedByNameDisplay name of the admin who purchased
entityNameDisplay name of the entity (room/tenant/zone)
cancelledAtcancelledBycancelReasonCancelSurgeOverrideDto
reasonReason supplied at cancellation time
SurgeOverridePurchaseListResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
SurgeOverridePurchaseActiveMapResponseDto
Map of entityId → active SurgeOverridePurchase. Only entities with an active override are included.
totalOnboardingPhase
statusstartDateactivationScheduledTaskNameAWS Scheduler task name for auto-activating this phase on startDate
endDateStaticSchedulePhase
statusincludePublicHolidaysstartDateactivationScheduledTaskNameAWS Scheduler task name for auto-activating this phase on startDate
endDateFallback schedule applied to unlocked plugs not in any scheduleGroup
Per-group device schedules. Devices in a group get the group schedule; remaining unlocked devices get defaultStaticSchedule.
ascentAIScheduledTaskNameAscentAIPhase
statusautoSuggestionsEnabledstartDateactivationScheduledTaskNameAWS Scheduler task name for auto-activating this phase on startDate
endDatesuggestionsGeneratedAtsuggestionsActivatedAtOnboardingIterationDto
iterationNumberstatusnamestartedAtcompletedAtascentAiRecommendationsSystemOnboardingResponseDto
_idsystemactiveIterationIndexcreatedAtupdatedAtDefaultStaticScheduleDto
Monday schedule entries
Tuesday schedule entries
Wednesday schedule entries
Thursday schedule entries
Friday schedule entries
Saturday schedule entries
Sunday schedule entries
UpdateOnboardingPhaseDto
startDateISO 8601 date string
endDateISO 8601 date string
includePublicHolidaysDefault schedule auto-applied to unlocked plugs on Phase 2 activation
Per-group device schedules for Phase 2. Devices in a group get the group schedule; remaining unlocked devices get defaultStaticSchedule.
EcoguardRecommendationDto
suitableWhether this device category benefits from EcoGuard
reasonHuman-readable explanation shown to users
suggestedIdleThresholdSuggested idle power threshold in watts (with 1.1x buffer). Only present if suitable is true.
suggestedTimerSuggested auto-shutoff timer in minutes. Only present if suitable is true.
PlugRecommendationDto
deviceIdThe unique identifier of the device (Plug or MCB)
macIdThe MAC address of the device
deviceNameThe name of the device for easy identification
plugCategoryThe category of the plug device (only for Plugs, empty for MCBs)
Array of AI-recommended schedule entries for Monday based on usage patterns
Array of AI-recommended schedule entries for Tuesday based on usage patterns
Array of AI-recommended schedule entries for Wednesday based on usage patterns
Array of AI-recommended schedule entries for Thursday based on usage patterns
Array of AI-recommended schedule entries for Friday based on usage patterns
Array of AI-recommended schedule entries for Saturday based on usage patterns
Array of AI-recommended schedule entries for Sunday based on usage patterns
summaryAI-generated summary explaining the recommended schedule and detected behavioral patterns
predictedIdleEnergyUsagePredicted average power consumption during idle periods in watts based on historical data
totalNumberOfIdleHoursTotal count of hours identified as idle or low-usage periods across the analysis timeframe
averageUsagePerDayAverage daily power consumption in watts calculated over the analyzed time period
flagsArray of flags highlighting anomalies, data gaps, or notable behavioral patterns detected by AI
EcoGuard suitability and suggested configuration for this device
deviceNumberThe device number assigned to the device
tierRecommendation tier used: "rule-based" (fast, ~5ms), "clustering" (medium, ~10ms), or "llm" (slow, ~60s). Indicates the analysis method used.
confidenceScoreConfidence score (0-1) indicating pattern clarity. Higher score = simpler, more predictable pattern.
BulkPlugRecommendationsResponseDto
Map of plug IDs to their AI-generated ON/OFF schedule recommendations. Each key is a plug ID, and the value contains the complete recommendation data including weekday schedules, summary, and metrics.
bulkSummaryAI-generated overall summary analyzing all plugs together. Identifies common patterns (e.g., "Working hours appear to be 9 AM - 6 PM across all devices"), optimization opportunities (e.g., "Coffee machine only used on Tuesdays and Thursdays"), cross-device insights, and collective energy-saving recommendations.
IterationSummaryDto
iterationNumberindexZero-based index in the iterations array
statusisActivenamestartedAtcompletedAtIterationListResponseDto
totalactiveIterationIndexReportSectionCatalogDto
idtitledescriptionWhat this section covers, one line.
kindchartOrFigureTrue when the section renders a computed figure rather than prose, so it cannot be reworded by an instruction.
requiresWhat the data must contain for this section to appear. Show it greyed out rather than letting someone pick a section that silently vanishes.
ReportSelectorLabelDto
typeidnameUndefined when the entity has since been deleted.
ReportWindowKind
RELATIVE re-resolves against the clock each time the report is generated; ABSOLUTE pins it to one period.
ReportWindowDto
kindRELATIVE re-resolves against the clock each time the report is generated; ABSOLUTE pins it to one period.
daysDays back from now. Required for RELATIVE, at most 60.
fromFirst instant covered (ISO 8601). Required for ABSOLUTE.
tillLast instant covered (ISO 8601). Required for ABSOLUTE.
EnergyReportSummaryDto
idReport id
nameName the reader gave it
What the report covers, with each entity’s current name
sectionCountHow many sections the reader curated. 0 means the default set.
updatedAtcreatedAtlatestRunIdMost recent run. Absent until the report is generated.
lastGeneratedAtWhen the report was last generated
ReportSelectorDto
typeidId of the entity at that level
CreateEnergyReportDto
nameName the reader gives this report.
What the report covers. Selectors are unioned, and a room or zone stays a room or zone — the devices behind it are resolved fresh each time the report is generated.
Period the report covers.
briefWhat this report is for, in your own words. Steers both the proposed outline and the writing.
languageLanguage to write the report in, as a BCP 47 tag (e.g. "en", "zh-Hans", "ms"). Defaults to English.
EcovoltEntityType
The entity type to query
EcovoltPanelScopeDto
entityTypeThe entity type to query
entityIdsOne or more MongoDB ObjectIds of the target entities. Hierarchy types (SYSTEM, TENANT, ZONE, ROOM) require exactly one. Device types (PLUG) accept 1–10 to compare multiple devices on the same panel.
EcovoltMetric
The measurement to plot.
EcovoltTimeRange
How far back to query. Omit to let the report’s own period choose.
ReportPanelSpecDto
What to query: an entity type and the ids at that level.
metricThe measurement to plot.
chartTypeHow to draw it.
timeRangeHow far back to query. Omit to let the report’s own period choose.
ReportChartType
How to draw a PANEL or MANUAL section.
ReportChartPointDto
xCategory or timestamp for this point
yReportOutlineEntryDto
idA catalog section id (see GET report-sections), or your own id for a section you are adding.
titleHeading to use. Required for a section you are adding; overrides the catalog title otherwise.
kindRequired for a section you are adding. NARRATIVE and LIST are written from instruction; PANEL draws a dashboard panel; MANUAL plots figures you supply.
instructionWhat to write here, in plain English. Required for a section you are adding — without it the section is an empty heading.
panelAn existing dashboard panel to draw. A PANEL section gives either this or panelSpec, never both.
A chart built here, belonging to this report alone rather than the dashboard. A PANEL section gives either this or panel, never both.
chartTypeHow to draw a PANEL or MANUAL section.
Figures to plot. Required for a MANUAL section — numbers you type in yourself, such as a target line or a utility-bill total we do not meter. They are part of the report, so every generation draws the same chart.
unitUnit for a MANUAL section’s figures.
EnergyReportDailyPointDto
dateCalendar day in the system timezone (YYYY-MM-DD)
kWhEnergy consumed that day
EnergyReportCategorySliceDto
kWhpercentOfTotalShare of the window total, 0-100
deviceCountDevices in this group
categoryPlug category, MCB measurement type, or device type — whichever the devices in this group are classified by
EnergyReportDeviceRowDto
deviceIdnamedeviceTypepathFrontend route for the "view" action
totalKWhEnergy over the window
avgDailyKWhpercentOfTotalShare of the window total, 0-100
categoryClassification the device is grouped by, when it has one
Per-day series for the row sparkline. Omitted when the device reported on fewer than two days.
trendPercentPercent change between the first and second half of the window. Omitted when either half has no data, so a flat "0%" is never invented.
EnergyReportHourPointDto
hourHour of day, 0-23
avgKWhMean energy consumed in this hour across the days observed
EnergyReportWeekSplitDto
weekdayAvgKWhweekendAvgKWhweekendReductionPercentHow much lower the weekend average is, in percent. Negative when weekends consume more.
EnergyReportWeekdayPointDto
weekday0 = Sunday through 6 = Saturday
avgKWhsampleDaysDays of this weekday observed
EnergyReportDeviceTypeSliceDto
kWhpercentOfTotalShare of the window total, 0-100
deviceCountDevices in this group
deviceTypeType of device (PLUG, MCB, etc.)
EnergyReportHeatmapCellDto
weekdayDay of week, 0 = Sunday through 6 = Saturday
hourHour of day, 0-23
avgKWhMean energy in this weekday/hour slot across the window
sampleDaysHow many days contributed to this cell — low counts are weak evidence
EnergyReportDeviceTypeHeatmapDto
deviceTypeType of device (PLUG, MCB, etc.)
totalKWhEnergy this type accounts for across the window
EnergyReportAnomalyDayDto
datekWhsigmaDistance from the window mean in standard deviations. Negative for unusually low days.
EnergyReportDeviceMoverDto
deviceIdnamepreviousAvgDailyKWhDaily average in the preceding window
currentAvgDailyKWhDaily average in this window
changePercentChange in daily average, percent. Negative means it improved.
EnergyReportComparisonDto
previousTotalKWhTotal for the preceding window
previousDaysObservedDays of data in the preceding window
avgDailyChangePercentChange in average daily consumption, in percent. Compared per-day rather than per-total so an unequal number of observed days does not read as a change in behaviour.
EnergyReportCostDto
totalCostCost of the window in dollars
avgDailyCostcostPerKWhRate applied, in cents per kWh
rateSourceScope level that supplied the rate. Null when the national default was used.
EnergyReportMetricsDto
periodStartperiodEnddaysObservedDistinct days that actually carried data. Falls short of the window length when devices were offline — read every average against this, not against the window.
deviceCountDevices in scope
reportingDeviceCountDevices that reported at least one day. A gap against deviceCount is itself a finding.
totalKWhavgDailyKWhtotalKWh over daysObserved
peakDayDateHeaviest day in the window (YYYY-MM-DD). Omitted when nothing reported.
peakDayKWhDaily totals for the trend chart. Omitted when nothing reported.
Donut wedges, largest first. Omitted when every device falls in one category — a single-wedge donut says nothing.
High-load device table, heaviest first. Omitted when no device reported.
topThreeSharePercentShare of total drawn by the three heaviest devices, 0-100. Omitted below five reporting devices, where "top 3" is most of the estate anyway.
devicesWithScheduleDevices with a schedule configured. Omitted when none has one — nothing to report compliance against.
Mean consumption by hour of day. Omitted when no hourly records exist for the window.
peakHourBusiest hour of day, 0-23. Present whenever hourlyProfile is.
Average consumption per day of the week. Omitted when the window covered only one weekday.
Energy split by hardware type (PLUG, MCB, ...), largest first. Distinct from categoryBreakdown, which groups by what a device is for. Omitted when the entity has only one device type.
measurementOverlapTrue when both PLUG and MCB devices are in scope. An MCB meters a whole circuit and the plugs on that circuit meter the same electricity again, so totalKWh double counts by an unknown amount and every percentOfTotal is diluted. Present only when the overlap exists — surface a caveat and prefer the per-type figures over the combined total.
Per-device-type weekday x hour grids, for reading plug load against circuit load. Omitted unless at least two device types each have a week of hourly data.
Weekday x hour-of-day grid. Sparse — only observed cells are present, and an absent cell means never measured, not zero. Omitted below a week of data, where the grid would be mostly holes.
baseloadKWhAlways-on load: each fully-reported day's quietest hour held for 24 hours, summed. This is the energy that never switches off, and the ceiling on what scheduling alone can save.
baseloadSharePercentbaseloadKWh as a share of the window total, 0-100
offHoursKWhEnergy consumed outside business hours (see BUSINESS_HOUR_START/END) plus all weekend energy. The headline number for scheduling work.
offHoursSharePercentoffHoursKWh as a share of the window total, 0-100
Days more than two standard deviations from the window mean, strongest first, for annotating the trend line. Omitted when the window is too short for a standard deviation to mean anything, or when no day qualifies.
Devices whose daily average moved most against the preceding window, largest absolute change first. Present only alongside comparison.
carbonKgScope 2 emissions for the window, in kg CO2e, at the grid factor in CARBON_KG_PER_KWH. Omitted when nothing was consumed.
ReportBlockCitationDto
textThe figure exactly as it appears in the prose
metricKeyField of the run’s metrics the figure came from
blockIdBlock that renders that figure, when one is on the report. The client scrolls there on click.
EnergyReportBlockDto
idkindauthoredByxColumn offset
yRow offset
wWidth in columns
hHeight in grid rows
hiddenRemoved by the reader, kept so it can come back
titlebodyMarkdown body. NARRATIVE and NOTE blocks.
itemsBullet lines. LIST blocks.
chartTypeHow to draw a PANEL or MANUAL section.
metricKeyField of the run's metrics this block renders
The block’s own data: a PANEL block’s resolved series, or the numbers a reader typed into a MANUAL block. Frozen at generation and never re-queried.
panelDashboard panel this block was resolved from.
unitUnit the series is measured in.
periodStartFirst instant this block’s series covers. Stored, never re-derived — a chart drawn over June still says June when opened in September.
periodEndLast instant this block’s series covers.
unavailableReasonWhy this block has no series, when it was asked for but could not be drawn.
Figures this block’s prose quotes, each traced to the metric it came from. Derived server-side — sent back unchanged.
ReportSuggestionKind
Whether this is an action on the site or an edit to the report
ReportSuggestionDto
idkindWhether this is an action on the site or an edit to the report
titleOne-line statement of what to do
detailWhat to do and why, citing the figures it is drawn from
prioritystatusblockIdBlock this is pinned to. Absent when it proposes something the report does not cover yet.
anchorTextExcerpt of the block this refers to, so the comment can anchor to the sentence rather than the whole section.
appliedBlockIdBlock the acceptance wrote to. ACCEPTED suggestions only.
resolvedAtWhen it was accepted or dismissed
ReportRunProvenanceDto
modelModel id that wrote the narrative
promptVersionVersion of the report prompt. Bumped whenever the prompt changes in a way that changes output.
writingStyleHashDigest of the author’s Writing Style at generation time. Not the style itself — enough to tell that it changed, without copying a personal document onto every run.
tokensUsedTokens spent on the narrative.
costCentsEstimated cost of the narrative in cents, at the rates in OPENAI_MODEL_PRICING.
ReportFidelityDto
figuresCheckedFigures quoted in the narrative
unsupportedFigures the narrative states that do not appear in the metrics, with the sentence each came from. Empty is the expected result.
passedTrue when every figure in the narrative traces to a computed one.
EnergyReportRunDto
idRun id
reportIdReport this run generated
statusdeviceIdsDevices the selectors resolved to at generation time — what the figures were computed over, whatever the rooms hold now.
periodStartperiodEndProposals made against this run, each open until accepted or dismissed.
createdAtupdatedAtWhat produced this run, beyond the data.
Whether every figure the narrative states traces back to a computed one.
errorWhy the run failed. FAILED runs only.
EnergyReportDto
idReport id
systemIdSystem the report belongs to
nameName the reader gave it
What the report covers, with each entity’s current name
The table of contents, in reading order. Empty means the default set of sections.
updatedAtcreatedAtbriefWhat this report is for, in the reader’s own words.
languageLanguage the report is written in, as a BCP 47 tag.
Latest run, or the one asked for. Absent until the report is generated.
UpdateEnergyReportDto
nameNew name
Replaces what the report covers. Existing runs keep the devices they were computed over.
Replaces the period the report covers.
briefWhat this report is for, in your own words. Steers both the proposed outline and the writing.
languageLanguage to write the report in, as a BCP 47 tag (e.g. "en", "zh-Hans", "ms"). Defaults to English.
QuestionAnswerDto
questionThe question as it was put to them
answerWhat they answered, in their own words
DraftReportOutlineDto
briefWhat the report is for, in their own words. Saved to the report so later generations keep the same intent.
Answers to whatever else the client asked during setup.
PreviewReportChartDto
titleHeading the section will carry. Used only for error messages here.
ReportChartPreviewDto
Absent when the chart could not be drawn — see unavailableReason.
unitperiodStartThe period the points actually cover.
periodEndunavailableReasonWhy this chart cannot be drawn over the report’s period. Present instead of series — show it in the builder rather than letting someone add a section that will be empty.
SaveReportOutlineDto
The table of contents in reading order. An empty array restores the default set of sections.
SaveReportBlockDto
idkindxColumn offset
yRow offset
wWidth in columns
hHeight in grid rows
hiddenRemoved by the reader, kept so it can come back
titlebodyMarkdown body. NARRATIVE and NOTE blocks.
itemsBullet lines. LIST blocks.
chartTypeHow to draw a PANEL or MANUAL section.
metricKeyField of the run's metrics this block renders
Points for a chart the reader added. Ignored on a block the run already carries.
panelDashboard panel a reader-added block is drawn from.
unitUnit a reader-added series is measured in.
ReportRefineAction
Whether the highlighted text should be improved in place, or new content added around it
RefineReportBlockDto
blockIdId of the block to rewrite, as it appears on the run being read.
actionWhether the highlighted text should be improved in place, or new content added around it
blockContentCurrent full text of the block, used as the rewrite base
selectedTextExcerpt the user highlighted. When omitted the whole block is treated as the target.
instructionWhat the user wants changed or added, in their own words. Omit to let the model decide how to improve the excerpt.
RefineReportBlockResponseDto
blockIdBlock that was rewritten
contentFull replacement text for the block, with the requested change applied
AnalyseReportDto
instructionWhat the reader wants the analysis to focus on, in their own words. Omit for a general pass over the whole run.
AnalyseReportResponseDto
Every suggestion on the run — the ones just written plus any already settled — highest priority first.
ReportChatMessageDto
roleWho sent the message
contentMessage text
ReportChatDto
Conversation so far, oldest first, ending with the user turn to answer. Stateless — resend the history each turn.
ReportMetricChangeDto
keylabelunitbeforeafterchangePercentAbsent when the earlier figure was zero, so a share is meaningless.
ReportDiffDto
fromRunIdtoRunIdfromPeriodStarttoPeriodStartHeadline figures that moved by more than a couple of percent. A figure absent from either run is left out — absent means unknown, not zero.
sectionsAddedSections the newer run has and the older did not
sectionsRemovedSections the older run had and the newer does not
devicesAddedDevices that entered scope
devicesRemovedDevices that left scope
EnergyUsageRecommendationReportDto
Array of AI-recommended schedule entries for Monday based on usage patterns
Array of AI-recommended schedule entries for Tuesday based on usage patterns
Array of AI-recommended schedule entries for Wednesday based on usage patterns
Array of AI-recommended schedule entries for Thursday based on usage patterns
Array of AI-recommended schedule entries for Friday based on usage patterns
Array of AI-recommended schedule entries for Saturday based on usage patterns
Array of AI-recommended schedule entries for Sunday based on usage patterns
summaryAI-generated summary explaining the recommended schedule and detected behavioral patterns
predictedIdleEnergyUsagePredicted average power consumption during idle periods in watts based on historical data
totalNumberOfIdleHoursTotal count of hours identified as idle or low-usage periods across the analysis timeframe
averageUsagePerDayAverage daily power consumption in watts calculated over the analyzed time period
flagsArray of flags highlighting anomalies, data gaps, or notable behavioral patterns detected by AI
EcoGuard suitability and suggested configuration for this device
BulkPlugRecommendationsRequestDto
plugIdsArray of plug IDs to generate AI recommendations for. Minimum 1, maximum 200 plugs per request. For larger batches, split into multiple requests.
AscentDeviceOutcome
What the run concluded for this device
AscentRunDevice
deviceDevice analysed
deviceNameDevice name at run time
outcomeWhat the run concluded for this device
suggestionThe suggestion this device produced, when the outcome is SUGGESTED.
deltaMinutesSigned ON-minutes the proposal would change. Positive = less ON time. Present whenever a schedule was derived, including outcomes that wrote no suggestion — that is how a near-miss stays visible.
confidenceScorePattern confidence 0-1
reasonsShort operator-facing reasons, same form as a suggestion
AscentRunResponseDto
_idRun ID
startedAtWhen the run started
finishedAtWhen the run finished
devicesWalkedDevices walked
suggestedDevices that produced a suggestion
alreadyOptimalDevices whose schedule already matched demand
unchangedDevices whose analysis matched the previous proposal
deferredToOverrideDevices skipped because a manual override was mid-review
constantUsageDevices skipped as constant load
noScheduleDevices whose data supported no schedule
failedDevices whose analysis threw
Every device row matching the filters. The summary counts above always cover the whole run, filters or not.
AscentRunDateDto
runIdstartedAtdevicesWalkedLatestAscentRunResponseDto
Every run this System has, newest first — the date picker. Fetch one by id rather than loading them all.
runThe most recent run, or null when the weekly cron has not covered this System yet. Null is not an error — it distinguishes "never ran" from "ran and found nothing".
AscentRunSummaryResponseDto
_idRun ID
startedAtWhen the run started
finishedAtWhen the run finished
devicesWalkedDevices walked
suggestedDevices that produced a suggestion
alreadyOptimalDevices whose schedule already matched demand
unchangedDevices whose analysis matched the previous proposal
deferredToOverrideDevices skipped because a manual override was mid-review
constantUsageDevices skipped as constant load
noScheduleDevices whose data supported no schedule
failedDevices whose analysis threw
GetAscentRunsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Runs in the requested window, newest first. Counts only — fetch a single run for its per-device rows.
WritingStyleDto
promptedTrue once the account has been offered the first-run step, whether they wrote a profile or declined. The client shows the setup flow only while this is false, so declining sticks.
writingStyleFreeform markdown describing how this account writes. Null until they write one.
UpdateWritingStyleDto
writingStyleFreeform markdown, at most 4000 characters. No required sections — three sentences is a valid profile. Send an empty string to clear it.
DraftWritingStyleDto
samplesThings the account holder has actually written — an email, a memo, a past report. Their own words matter more than the length.
Answers to whatever the client asked during setup. The questions are not defined here, so the wizard can change without a backend deploy.
WritingStyleDraftDto
writingStyleMarkdown for the reader to edit and then save through PUT /writing-style/me.
TransformType
Type of transformation. Raw JSON types: EXTRACT, SELECT, RENAME, FIELDS, FILTER, SORT, LIMIT, REDUCE. DataFrame types: DF_RENAME_FIELDS, DF_ORGANIZE_FIELDS, DF_SELECT_FIELDS, DF_FILTER_FIELDS_BY_NAME, DF_FILTER_BY_VALUE, DF_FILTER_BY_QUERY, DF_CALCULATE, DF_CUMULATIVE, DF_REDUCE, DF_GROUP_BY, DF_JOIN, DF_MERGE, DF_CONCATENATE, DF_TIME_SERIES_LONG_TO_WIDE, DF_TIME_SERIES_WIDE_TO_LONG, DF_TIME_SERIES_TO_ROWS, DF_TIME_SERIES_TO_TABLE, DF_PIVOT, DF_ROWS_TO_FIELDS, DF_LABELS_TO_FIELDS, DF_LOOKUP, DF_CONFIG_FROM_QUERY, DF_REGRESSION, DF_EXTRACT_LABELS.
TransformerResponseDto
_idUnique transformer identifier
panelPanel ID this transformer belongs to
nameHuman-readable name of the transformer
typeType of transformation. Raw JSON types: EXTRACT, SELECT, RENAME, FIELDS, FILTER, SORT, LIMIT, REDUCE. DataFrame types: DF_RENAME_FIELDS, DF_ORGANIZE_FIELDS, DF_SELECT_FIELDS, DF_FILTER_FIELDS_BY_NAME, DF_FILTER_BY_VALUE, DF_FILTER_BY_QUERY, DF_CALCULATE, DF_CUMULATIVE, DF_REDUCE, DF_GROUP_BY, DF_JOIN, DF_MERGE, DF_CONCATENATE, DF_TIME_SERIES_LONG_TO_WIDE, DF_TIME_SERIES_WIDE_TO_LONG, DF_TIME_SERIES_TO_ROWS, DF_TIME_SERIES_TO_TABLE, DF_PIVOT, DF_ROWS_TO_FIELDS, DF_LABELS_TO_FIELDS, DF_LOOKUP, DF_CONFIG_FROM_QUERY, DF_REGRESSION, DF_EXTRACT_LABELS.
enabledWhether this transformer is enabled in the pipeline. Disabled transformers are skipped.
orderExecution order within the pipeline. Lower numbers execute first.
createdAtTimestamp when the transformer was created
updatedAtTimestamp when the transformer was last updated
configConfiguration object whose shape depends on the transform type. See CreateTransformerDto config documentation for schemas per type.
ProxyCallUsageResponseDto
_idUsage document ID
systemSystem ID
methodHTTP method used
urlFinal URL used for the proxy call
statusCodeHTTP status code from external source
authorizationWhether Authorization header was present
createdAtupdatedAtresponseTimeMsResponse time in milliseconds
dataSourceRelated DataSource ID
dashboardRelated Dashboard ID
panelRelated Panel ID
bodyCustom body for the proxy request (for POST/PUT)
ExternalPanelResponseDto
_idPanel ID
systemSystem ID
titleTitle of the panel
panelTypechartTypeType of chart
dataSourceData source ID or populated object
createdAtupdatedAtdescriptionDescription of the panel
colorPaletteColor palette for chart series
endpointAPI endpoint path
httpMethodHTTP method for the proxy request
headersCustom headers for the proxy request
xAxisFieldX-Axis field
yAxisFieldY-Axis field
Populated transformers linked to this panel
optionsVisualization options
Recent proxy call usages for this panel
bodyCustom body for the panel request (for POST/PUT)
GetExternalPanelsResponseDto
External panels matching the query
totalTotal number of results
GetProxyUsagesResponseDto
Proxy call usage rows matching the query
totalTotal number of results
DebugSnapshotDto
transformTypeTransform type applied at this step
orderExecution order of this step
dataData state after this transform step
ProxyDebugResponseDto
dataThe final transformed data
Debug snapshots from the compute service for each transform step (only present when debug=true)
PanelThresholdDto
valueThreshold value
colorThreshold color
labelThreshold label
PanelVisualizationOptionsDto
colorsColor mappings
yMinY-axis minimum value
yMaxY-axis maximum value
showLegendWhether to show legend
showGridWhether to show grid lines
Thresholds for gauge/alert visualizations
unitUnit label
decimalsNumber of decimal places
CreateExternalPanelDto
titleTitle of the panel
chartTypeType of chart
dataSourceID of the Data Source
descriptionDescription of the panel
colorPaletteColor palette for chart series. The frontend cycles through these colors.
endpointAPI endpoint path appended to the data source base URL
httpMethodHTTP method for the proxy request
headersCustom headers to include in the proxy request
xAxisFieldX-Axis field name
yAxisFieldY-Axis field name
Visualization options
bodyCustom body for the panel request (for POST/PUT)
UpdateExternalPanelDto
titleTitle of the panel
descriptionDescription of the panel
colorPaletteColor palette for chart series. The frontend cycles through these colors.
chartTypeType of chart
dataSourceID of the Data Source
endpointAPI endpoint path appended to the data source base URL
httpMethodHTTP method for the proxy request
headersCustom headers to include in the proxy request
xAxisFieldX-Axis field name
yAxisFieldY-Axis field name
Visualization options
bodyCustom body for the panel request (for POST/PUT)
EcovoltPanelResponseDto
_idPanel ID
systemSystem ID
titleTitle of the panel
chartTypeHow to draw it.
panelTypemetricThe measurement to plot.
createdAtupdatedAtdescriptionDescription of the panel
colorPaletteColor palette
timeRangeHow far back to query. Omit to let the report’s own period choose.
GetEcovoltPanelsResponseDto
Ecovolt panels matching the query
totalTotal number of results
EcovoltDataPointDto
valueThe measured value. Null when the device does not report this metric (e.g. AIRCON_AMBIENT_TEMPERATURE_C on a non-Pro unit).
timestampTimestamp for time-series data points. Absent for stat metrics (e.g. ENERGY_KWH_TO_DATE).
EcovoltDataSeriesDto
labelHuman-readable series label (device name, entity name, etc.)
entityIdMongoDB ObjectId string of the entity this series represents
entityTypeThe entity type this series represents
kindWhether this is a primary series or a comparison period series
unitUnit label for the values in this series (e.g. kWh, °C, W)
The data points in this series
EcovoltPanelDataResponseDto
metricThe metric that was resolved
unitUnit label for values in this response (e.g. kWh, °C)
All series for this panel. Primary series have kind="primary", comparison period series have kind="comparison".
panelIdPanel ID. Absent when resolving a preview of an unsaved panel.
timeRangeThe time range used. Absent for stat metrics (e.g. ENERGY_KWH_TO_DATE) where the query always reflects the current month-to-date.
resolvedAtTimestamp when this data was resolved
CreateEcovoltPanelDto
titleTitle of the panel
chartTypeType of chart to render
Scope: system entity to query with optional device type filter
metricThe measurement to display
descriptionDescription of the panel
colorPaletteColor palette for chart series
timeRangeHow far back to query. Defaults to LAST_24H. Has no effect on stat metrics (TO_DATE, FORECAST, COST_MONTHLY_TO_DATE).
UpdateEcovoltPanelDto
titleTitle of the panel
descriptionDescription of the panel
colorPaletteColor palette for chart series
chartTypeType of chart to render
Scope: system entity to query with optional device type filter
metricThe measurement to display
timeRangeHow far back to query. Defaults to LAST_24H. Has no effect on stat metrics (TO_DATE, FORECAST, COST_MONTHLY_TO_DATE).
ToggleEcovoltPanelDto
entityIdID of the device entity to toggle. Must be one of the entity IDs in the panel scope.
actionThe action to perform: ON or OFF.
BuiltinWidgetKey
BUILTIN entries only — the frontend registry key
PanelCatalogLayoutDto
wDefault width in grid units
hDefault height in grid units
minWMinimum width
minHMinimum height
PanelCatalogEntryDto
idStable id for this catalog entry. Format: BUILTIN:
panelTypegroupcategorytitleLabel shown in the picker
descriptionOne-line explanation shown under the label
iconIcon name for the frontend
allowedChartTypesChart types this entry accepts. Empty for BUILTIN entries.
allowedTimeRangesTime ranges this entry accepts. Empty for stat metrics (which reject a time range outright) and for BUILTIN entries.
requiresEntitySelectionWhether the user must pick target entities before the panel can be created, for the preselected scope. False for SYSTEM-scoped and builtin entries.
availableWhether this entry can be added to this system at any of its scopes
widgetKeyBUILTIN entries only — the frontend registry key
defaultConfigBUILTIN entries only — starting widget settings
disabledReasonWhy the entry is unavailable. Absent when available.
PanelCatalogGroupDto
groupEntries in this group, ordered by category then title
PanelCatalogResponseDto
Every panel addable on this system, grouped server-side so two clients cannot disagree on ordering. Flat-list consumers can flatMap.
BuiltinPanelResponseDto
_idPanel ID
systemSystem ID
titleTitle of the panel
panelTypewidgetKeyBUILTIN entries only — the frontend registry key
configWidget-specific settings, opaque to the backend
createdAtupdatedAtdescriptionDescription of the panel
colorPaletteColor palette
GetBuiltinPanelsResponseDto
Builtin panels matching the query
totalTotal number of results
CreateBuiltinPanelDto
titleTitle of the panel
widgetKeyWhich frontend-registered widget renders this panel
descriptionDescription of the panel
colorPaletteColor palette for the widget
configWidget-specific settings. Stored opaquely — the shape is owned by the frontend registry entry for widgetKey.
UpdateBuiltinPanelDto
titleTitle of the panel
descriptionDescription of the panel
colorPaletteColor palette for the widget
widgetKeyWhich frontend-registered widget renders this panel
configWidget-specific settings. Stored opaquely — the shape is owned by the frontend registry entry for widgetKey.
DeviceStatusBreakdownDto
totalTotal number of devices
activeNumber of active devices
inactiveNumber of inactive devices
offlineNumber of offline devices
spareNumber of spare devices (excluded from active/inactive/offline counts)
CostMetricDto
valueCurrent cost value (SGD)
trendTrend indicator (positive = increase, negative = decrease)
trendDirectionTrend direction
CarbonMetricDto
valueCarbon emissions saved (kg CO₂)
indicatorIndicator status
PlatformOverviewDto
totalSystemsTotal number of systems registered
totalTenantsTotal number of active tenants
Total number of plugs with status breakdown
totalZonesTotal number of active zones
totalRoomsTotal number of active rooms
totalEnergyMonitoredTotal energy monitored across all systems (kWh)
Estimated total energy cost (SGD)
Total carbon emissions avoided (kg CO₂)
EnergyDataPointDto
labelDate/time label for the data point
valueEnergy value (kWh)
timestampTimestamp of the data point
EnergyUsageDto
periodTime period used for aggregation
totalEnergyTotal energy consumed in the period (kWh)
Energy usage data points
averageEnergyAverage energy per time unit (kWh)
SystemEnergyDto
systemIdSystem ID
systemNameSystem name
energyConsumedTotal energy consumed (kWh)
plugCountNumber of plugs in the system
percentageOfTotalPercentage of total energy
rankRank position
TopSystemsDto
List of top systems by energy consumption
totalEnergyTotal energy consumed by all systems (kWh)
HourlyUsageDto
hourHour of day (0-23)
energyEnergy consumed during this hour (kWh)
percentageOfDayPercentage of daily total
isPeakIs this a peak hour?
PeakHoursDto
Peak usage hours data
overallPeakHourOverall peak hour
peakHourEnergyPeak hour energy value (kWh)
offPeakAverageEnergyOff-peak average energy (kWh)
GrowthDataPointDto
monthMonth label
countNumber of new active plugs (>1kWh)
cumulativeCumulative total
dateDate of the data point
GrowthTrendDto
Monthly growth data points
totalGrowthTotal growth count
averageMonthlyGrowthAverage monthly growth
growthRateGrowth rate percentage
ProjectionDataPointDto
monthMonth label
projectedCountProjected device count
lowerBoundLower bound estimate
upperBoundUpper bound estimate
dateDate of projection
RegressionParametersDto
slopeSlope coefficient
interceptY-intercept
rSquaredR-squared value (goodness of fit)
GrowthProjectionDto
Projected growth for next 3 months
Linear regression parameters
expectedTotalExpected total devices after 3 months
confidenceConfidence level (0-1)
RoleCountDto
roleRole name
countNumber of admins with this role
percentagePercentage of total
RoleDistributionDto
Role distribution data
totalAdminsTotal number of admins
CategoryCountDto
categoryPlug category
countNumber of plugs in this category
percentagePercentage of total plugs
PlugCategoryDistributionDto
Category distribution data
totalPlugsTotal number of plugs
CategoryEnergyDto
categoryPlug category
energyTotal energy consumed by this category (kWh)
percentagePercentage of total energy
plugCountNumber of plugs in category
averageEnergyPerPlugAverage energy per plug (kWh)
PlugCategoryEnergyDistributionDto
Category energy distribution data
totalEnergyTotal energy consumed (kWh)
SystemPlugCountDto
systemIdSystem ID
systemNameSystem name
plugCountNumber of plugs in this system
percentagePercentage of total plugs
PlugSystemDistributionDto
System distribution data
totalPlugsTotal number of plugs
totalSystemsTotal number of systems
EnergyBreakdownRequestDto
systemIdSystem ID
startDateStart date for energy data (ISO 8601 format)
endDateEnd date for energy data (ISO 8601 format)
granularityTime granularity for data aggregation
compareStartDateStart date for comparison period (optional)
compareEndDateEnd date for comparison period (optional)
EnergyBreakdownPointDto
timestampTimestamp of this data point
energyEnergy consumption in kWh
costCost in SGD (calculated using tariff rate active at this timestamp)
tariffRateTariff rate used for this calculation (cents per kWh)
EnergyPeriodDto
totalEnergyTotal energy consumption for period (kWh)
totalCostTotal cost for period (SGD)
Breakdown by time bucket
EnergyComparisonDto
totalEnergyTotal energy consumption for period (kWh)
totalCostTotal cost for period (SGD)
Breakdown by time bucket
energyDeltaEnergy delta compared to main period (kWh)
costDeltaCost delta compared to main period (SGD)
EnergyBreakdownResponseDto
Main period energy and cost data
calculatedAtTimestamp when these costs were calculated
Comparison period data (if comparison dates provided)
TriggerMetric
TriggerOperator
ActionType
SmartModeSuggestionItemDto
rankconfidenceConfidence score between 0 and 1
occurrencesNumber of times this pattern was observed in the window
descriptionmetricoperatorthresholdValueactionTypesuggestedNamePre-filled trigger name the user can accept or edit
CreateFeatureDto
nameDisplay name of the feature. Used for identification in the user interface.
featureTypeFeature type identifier from the predefined feature enum. Determines the functional category of the feature.
descriptionDetailed description of what the feature does and its purpose within the system.
UpdateFeatureDto
nameDisplay name of the feature. Used for identification in the user interface.
featureTypeFeature type identifier from the predefined feature enum. Determines the functional category of the feature.
descriptionDetailed description of what the feature does and its purpose within the system.
OccupancyTimelineBucketDto
startBucket start
occupiedMinutesMinutes the room was occupied
observedMinutesMinutes a sensor was reporting. occupied < observed is vacancy; the rest of the bucket is a data gap, not vacancy
peakOccupancyHighest people count; null for motion-only sensors
OccupancySessionDto
startFirst occupied reading
endLast occupied reading
durationMinutesDwell length in minutes
peakOccupancyHighest people count in the session; null for motion-only sensors
OccupancyTimelineResponseDto
roomIdRoom id
timezoneSystem timezone buckets are aligned to
granularityContinuous occupied periods, for enter/exit tooltips
OccupancyCurrentStatusDto
statesinceWhen the room entered this state, within the last 24 hours
occupancyLatest people count; null for motion-only sensors
OccupancyDaySummaryDto
dateLocal date, yyyy-MM-dd
firstInAtlastOutAtoccupiedMinutessessionsSessions that started this day
peakOccupancypeakAtOccupancySummaryResponseDto
roomIdutilisationPctOccupied ÷ observed minutes, as a percentage. null when no sensor reported
previousUtilisationPctSame figure for the equal-length period immediately before
utilisationDeltaPctutilisationPct − previousUtilisationPct, in percentage points
peakOccupancypeakAtoccupiedMinutessessionCountavgDwellMinutesvacantEnergisedMinutesVacant minutes while the room drew at least 10 W
OccupancyHeatmapCellDto
weekdayDay of the week this time range applies to
hourLocal hour, 0–23
utilisationPctOccupied ÷ observed minutes; null when no sensor reported
observedMinutesOccupancyHeatmapResponseDto
timezone7 × 24 cells, every weekday/hour present
OccupancyRoomSortField
OccupancySensorStatus
Worst status among the room sensors
OccupancyRoomRowDto
roomIdroomNameutilisationPctoccupiedHourssessionsavgDwellMinutespeakOccupancysensorStatusWorst status among the room sensors
GetOccupancyRoomsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Room rows matching the scope, sorted and paginated
OccupancyWasteWindowDto
roomIdroomNamestartendminutesOccupancyWasteResponseDto
totalVacantEnergisedMinutesContiguous vacant-but-energised periods, oldest first
OccupancySensorHealthDto
deviceIddeviceTypeType of device (PLUG, MCB, etc.)
capabilityroomIdroomNamestatusNO_DATA = online but no occupancy readings in the last day (counter disabled, BLE down); SUSPECT = occupied for the whole last day, likely a stuck reading
deviceNamelastSeenOccupancyDevicesHealthResponseDto
unhealthyCountSensors not ONLINE
Unhealthy sensors first
ToolDefinitionDto
nameTool name (unique identifier)
descriptionTool description for LLM
JSON Schema for tool input parameters
ToolConfirmationDto
toolCallIdTool call ID this confirmation resolves
approvedWhether the user approved this tool call
AgentChatRequestDto
Conversation history including user and assistant messages
systemIdSystem ID the chat operates on. Required — used to enforce the AI_FEATURE entitlement and to scope context-aware tool calls.
sessionIdSession ID for chat history persistence
Approve/deny decisions for pending tool calls that required user confirmation (resolves a prior CONFIRMATION_REQUIRED event on this same conversation).
Deprecated and ignored. Tool definitions are owned by the server; anything sent here has no effect.
AiToolSummaryDto
nameStable tool name — the same identifier used for OpenAI function calling and MCP.
descriptionNatural-language description shown to the model.
kindWhether the tool reads data or mutates it. Write tools are limited to ADMIN and SUPERADMIN.
requiresConfirmationWhether running the tool prompts the user to confirm first. Tools that decide this per-arguments report true.
RangerChatHistorySummaryDto
sessionIdUUID identifying the chat session
messageCountTotal number of messages in the session
previewFirst user message truncated to 120 chars
createdAtTimestamp when the session was first created
updatedAtTimestamp of the last message saved to this session
adminEmailEmail of the account that initiated the session
RangerChatHistoryPaginatedDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Chat session summaries for the current page
RangerChatHistoryDetailDto
sessionIdUUID identifying the chat session
messageCountTotal number of messages in the session
previewFirst user message truncated to 120 chars
createdAtTimestamp when the session was first created
updatedAtTimestamp of the last message saved to this session
adminEmailEmail of the account that initiated the session
CalendarPreviewRoomDto
roomIdRoom ID
roomNameRoom name as stored in the system
deviceCountNumber of devices in this room that would receive schedules
RecurrenceType
Recurrence pattern type. Only present when isRecurring is true.
CalendarPreviewEventDto
uidExternal event ID — Google event ID, iCal UID, or Microsoft event ID
eventTitleOriginal event title from the calendar
startTimeEvent start time
endTimeEvent end time
matchedTrue if at least one room matched the event title
includeWhether to include this event in the confirm step. Defaults to true when matched, false when unmatched.
Rooms matched from the event title. Empty when matched=false.
isRecurringTrue if the event is a recurring event (daily or weekly pattern)
recurrenceTypeRecurrence pattern type. Only present when isRecurring is true.
recurrenceDaysDays of week the event recurs on (0=Sun … 6=Sat). Only present for weekly recurrence.
CalendarPreviewResponseDto
List of calendar events parsed from the calendar source, each with room-match results.
totalMatchedNumber of events that matched at least one room
totalUnmatchedNumber of events that matched no room
ScheduleType
Schedule type: single one-time schedule or recurring weekly schedule
ConfirmCalendarEventDto
uidExternal event ID (from preview response)
eventTitleEvent title (used for mapping storage)
startTimeEvent start time (may be user-adjusted)
endTimeEvent end time (may be user-adjusted)
includeSet to false to skip this event — no schedules will be created for it
roomIdsRoom IDs to schedule (may be user-adjusted from preview)
scheduleTypeSchedule type: single one-time schedule or recurring weekly schedule
daysOfWeekDays of week for recurring schedule (0=Sun … 6=Sat). Required when scheduleType is RECURRING.
onTimeON time for recurring schedule in HH:MM format. Required when scheduleType is RECURRING.
offTimeOFF time for recurring schedule in HH:MM format. Required when scheduleType is RECURRING.
ConfirmCalendarUploadDto
List of calendar events to confirm. Must contain at least one entry.
gracePeriodMinutesGrace period in minutes. Devices turn ON this many minutes before the event starts and turn OFF this many minutes after it ends. Only applies to one-time (SINGLE) schedules. Defaults to 0.
CalendarImportResultDto
importedNumber of events for which schedules were successfully created
skippedNumber of events skipped (include=false, past, or no devices in room)
PreviewIcsUrlDto
icsUrlPublicly accessible ICS calendar feed URL. Must be a valid HTTPS URL pointing to a .ics file. Private/internal network addresses are not permitted.
ConfirmIcsUrlDto
icsUrlPublicly accessible ICS calendar feed URL. Saved for ongoing background polling. Must be HTTPS; private/internal addresses are not permitted.
List of calendar events to confirm. Must contain at least one entry.
gracePeriodMinutesGrace period in minutes. Devices turn ON this many minutes before the event starts and turn OFF this many minutes after it ends. Saved for ongoing syncs. Defaults to 0.
SubscribeIcsUrlDto
icsUrlPublicly accessible ICS calendar feed URL. Must be a valid HTTPS URL pointing to a .ics file. Private/internal network addresses are not permitted.
gracePeriodMinutesGrace period in minutes. Devices turn ON this many minutes before the event starts and turn OFF this many minutes after it ends. Defaults to 0.
CalendarType
The calendar provider type for this connection (e.g., GOOGLE, MICROSOFT, ICS)
ConnectionScope
Scope of this connection — whether it applies system-wide or per-user
CalendarConnectionResponseDto
idUnique identifier of the calendar connection
systemIdSystem this calendar connection belongs to
calendarTypeThe calendar provider type for this connection (e.g., GOOGLE, MICROSOFT, ICS)
scopeScope of this connection — whether it applies system-wide or per-user
isActiveWhether this calendar connection is currently active
createdAtTimestamp when this calendar connection was created
userIdAdmin user ID that owns this connection; null indicates a system-wide connection
googleCalendarIdGoogle Calendar ID used for this connection (e.g., "primary")
icsUrlICS feed URL for ICS-type calendar connections
lastSyncedAtTimestamp of the last successful sync for this connection
Generate2dFloorPlanResponseDto
floorPlanIdFloor plan document ID (upserted)
plan2d2D geometry preview — not yet saved
Room2DDto
idnametypepolygonCCW polygon vertices [[x,z],...]
Wall2DDto
start[x, z] coordinate
end[x, z] coordinate
kindStair2DDto
idbottom[x, z] coordinate
top[x, z] coordinate
widthFloorPlanStyle
Visual style/theme for the 3D floor plan
Save2dFloorPlanDto
widthheightstyleVisual style/theme for the 3D floor plan
FloorPlan
_idzoneZone this floor plan belongs to
systemSystem this floor plan belongs to
nameDisplay name for this floor plan
schemaVersionFloor plan JSON schema version
plan2dStatusstyleVisual style/theme for the 3D floor plan
plan2d2D geometry before 3D conversion
roomMappingsMappings from AI room IDs to real Room documents
GetDevicePlacementV2Dto
_iddeviceTypeType of device (PLUG, MCB, etc.)
devicexyGetDistributionBoxPlacementV2Dto
_iddistributionBoxxyGetFloorPlanV2ResponseDto
_idzonesystemimageWidthimageHeightstatusimageUrlCDN URL of the image
OverlayReadingDto
temperatureTemperature in °C (ENV_SENSOR)
humidityHumidity in % (ENV_SENSOR)
co2CO₂ in ppm (ENV_SENSOR)
powerReal-time power draw in W (PLUG/MCB)
energyAccumulated energy in kWh (PLUG/MCB)
statusOn/off state (PLUG/MCB/SMART_SWITCH)
setpointAircon setpoint in °C (AIRCON_CONTROL)
modeAircon mode: cool/heat/fan/auto (AIRCON_CONTROL)
occupancyPeople count (AIRCON_CONTROL with people counter). null means no reading, not an empty room
motionDetectedMotion detected (AIRCON_CONTROL, MAXWELL_ULTRA only)
flowRateFlow rate in m³/h (WATER_METER)
OverlayPlacementDto
_iddeviceTypeType of device (PLUG, MCB, etc.)
devicedeviceNamexyreadingOverlayDistributionBoxPlacementDto
_iddistributionBoxnamexyFloorPlanV2OverlayResponseDto
imageWidthImage width in pixels — use to size the canvas
imageHeightImage height in pixels — use to size the canvas
RoomDrawingV2Dto
roomID of the existing Room document this drawing represents
polygonCCW polygon vertices as [x, y] pixel pairs. Minimum 3 points. Origin top-left.
colorHex fill colour for canvas rendering
UpsertRoomsV2Dto
Full replacement array of room drawings. Send empty array to clear.
PlacementType
Placement type — DISTRIBUTION_BOX places a distribution box; all others place a Device
DevicePlacementV2Dto
deviceTypePlacement type — DISTRIBUTION_BOX places a distribution box; all others place a Device
deviceDevice or DistributionBox ID — must belong to this system
xPixel distance from left edge of image
yPixel distance from top edge of image
UpsertDevicePlacementsV2Dto
Full replacement array of device placements. Send empty array to clear all pins.
AssetTypeResponseDto
_idAsset type ID
nameUnique type key
displayNameHuman-readable display name
assetCountNumber of assets across every system currently using this type
descriptionWhat this class of asset is for
CreateAssetTypeDto
nameUnique type key, unique across the platform
displayNameHuman-readable display name
descriptionWhat this class of asset is for
UpdateAssetTypeDto
displayNameHuman-readable display name
descriptionWhat this class of asset is for
CreateAssetDto
assetTypeAsset type key. Must match an existing AssetType (see GET /asset-type).
nameOptional label for this specific unit. Omit it to fall back to the AssetType display name.
notesEverything specific to this unit in this system — where it sits, how it is wired, install quirks. The universal description of the equipment lives on the AssetType.
serialNumberManufacturer serial number
installedAtDate the asset was installed on site (ISO 8601)
roomId of the room this asset is installed in. Must be a room in the same system. Omit it for an asset that sits outside any room.
filesInstall photos (max 10MB each, images only)
AssetTypeSummaryDto
nameAsset type key
displayNameHuman-readable display name, shared across all systems
descriptionUniversal description of what this class of equipment is for, shared across all systems
AssetRoomSummaryDto
_idRoom ID
nameRoom name
GetAssetDto
_idAsset ID
nameLabel for this unit. Falls back to the AssetType displayName when the asset has no name of its own, so this is always safe to render.
Universal, catalogue-level facts about this asset type
imageKeysS3 object keys of the install photos
imageUrlsCDN URLs of the install photos, in the same order as keys
systemSystem ID this asset belongs to
createdAtCreation timestamp
customNameThe per-unit label as stored, absent when the asset relies on the type name. Use name to display.
notesEverything specific to this unit in this system — where it sits, how it is wired, install quirks. The universal description lives on assetType.description.
serialNumberManufacturer serial number
installedAtDate the asset was installed on site
Room this asset is installed in. Absent when the asset is not linked to a room, or when the linked room has since been deleted.
systemNameName of the owning system. Only set on cross-system reads, where the caller has no single system in context.
GetAssetsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of asset objects matching the query parameters
UpdateAssetDto
nameLabel for this specific unit. Send an empty string to clear it and fall back to the AssetType display name.
assetTypeAsset type key. Must match an existing AssetType (see GET /asset-type).
notesEverything specific to this unit in this system — where it sits, how it is wired, install quirks. The universal description of the equipment lives on the AssetType.
serialNumberManufacturer serial number
installedAtDate the asset was installed on site (ISO 8601). Send an empty string to clear it.
roomId of the room this asset is installed in. Must be a room in the same system. Send an empty string to unlink the asset from its room.
existingImageKeysS3 keys of existing images to keep. Any current image not listed here is deleted from S3. Omit the field to keep every existing image; send it empty to drop them all.
filesNew install photos to append (max 10MB each, images only)
GetCreditDto
roomIdRoom ID
systemIdSystem ID
balanceCurrent balance in SGD
updatedAtLast updated timestamp
TopupCreditResponseDto
balanceUpdated balance after top-up
amountAmount that was topped up
transactionIdTransaction ID
GetCreditTransactionDto
idTransaction ID
roomIdtypestatusamountAmount in SGD
balanceAfterBalance after transaction
createdAtdescriptionkwhConsumedkWh consumed (USAGE_DEDUCTION only)
GetCreditTransactionsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of transactions
ReleaseNoteDto
tagNameGit tag version of the release
titleTitle of the release (usually same as tag or human readable)
bodyFull markdown content of the release note
publishedAtDate when the release was published
urlURL linking to the release on GitHub
developerNameName of the developer who created the release
developerUrlURL of the developer's GitHub profile
developerAvatarUrlAvatar URL of the developer who created the release
ReportingApp
Which product the feedback is about
CreateProductFeedbackDto
productWhich product the feedback is about
typeWhat kind of submission this is
titleShort summary of the feedback
detailsThe full description the reporter wrote
urgencyHow urgent the reporter thinks this is (1-5). A hint only — triage sets the real ClickUp priority.
contactNumberNumber to follow up on, if the reporter opted in
pageUrlPage the reporter was on. Captured by the app, not asked.
appVersionFrontend build version. Captured by the app, not asked.
userAgentReporter user agent. Captured by the app, not asked.
systemNameSystem in context, when the app has one.
filesSupporting files — up to 5, 10 MB each
ProductFeedbackDto
clickupTaskIdId of the ClickUp task created for this submission
clickupUrlDirect link to the task in ClickUp
notifiedWhether the Telegram notification was sent. False does not mean the submission failed — the ClickUp task is the record.
ProductReviewPromptDto
showWhether the quarterly review dialog should be shown to this account now. False once they have reviewed or dismissed this app for the current quarter.
periodKeyCalendar quarter this answer applies to (Singapore). Returned for display and debugging — the client never sends it back.
CreateProductReviewDto
appApp being reviewed — the one the dialog was shown in
ratingStar rating the account gave, 1-5
commentsFree-text comment. Optional — a rating alone is a valid review.
ProductReviewDto
_idPrimary ID of the stored review
appApp that was reviewed
periodKeyCalendar quarter the review was collected for (Singapore)
ratingStar rating the account gave, 1-5
createdAtTimestamp when the review was submitted
commentsFree-text comment, when the account wrote one
DismissProductReviewDto
appApp whose prompt is being dismissed
WifiDeviceStatusDto
deviceIdmacIddeviceTypeType of device (PLUG, MCB, etc.)
desiredSsidSSID the device was last told to join
statusreportedSsidSSID the device last reported being connected to
wifiErrorReason the last delta failed on the device, when status is FAILED
WifiDeviceStatusResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
pendingCountDevices in the system not yet converged to the desired SSID. Counted across the whole system, not just this page.
CreateSubscriptionTierDto
nameName of the subscription tier. Used for identification and display to customers.
descriptionDetailed description of what the subscription tier includes. Helps customers understand the value proposition.
featuresArray of feature identifiers included in this subscription tier. Determines which features are accessible to subscribers.
UpdateSubscriptionTierDto
nameName of the subscription tier. Used for identification and display to customers.
descriptionDetailed description of what the subscription tier includes. Helps customers understand the value proposition.
featuresArray of feature identifiers included in this subscription tier. Determines which features are accessible to subscribers.
TelegramStatusResponseDto
connectedWhether this account has a personal Telegram chat linked
groupNameName of the linked Telegram group
TelegramPairingCodeResponseDto
codeShort pairing code the admin sends in their Telegram group
expiresInSeconds until the code expires
RegisterWebhookResponseDto
okWhether the request was successful
resultTelegram API result
descriptionDescription from Telegram
ForecastPointDto
hourISO 8601 UTC timestamp
kWhPredicted energy usage (kWh)
lowerLower confidence bound (kWh)
upperUpper confidence bound (kWh)
ForecastReason
Set only when predictions is empty. insufficient_data: device has < 30 days of usage history (expected for new devices). no_forecast_available: device qualifies but no fresh forecast doc exists (precompute failed or has not yet run for this device).
DeviceForecastResponseDto
deviceIdUnique identifier for the device
Forecast data points for the device
modelVersionModel version
granularityGranularity of returned data
hasSufficientDataWhether this device has sufficient data for forecasting
reasonSet only when predictions is empty. insufficient_data: device has < 30 days of usage history (expected for new devices). no_forecast_available: device qualifies but no fresh forecast doc exists (precompute failed or has not yet run for this device).
daysUntilEligibleOnly present when reason = insufficient_data. Number of additional days of usage history needed before the device becomes eligible.
AggregatedForecastResponseDto
entityIdEntity ID (zone, tenant, or system)
entityTypeEntity type (zone, tenant, or system)
Aggregated forecast (sum of all device forecasts under this entity)
totalDevicesTotal devices included in aggregation
devicesWithSufficientDataDevices that contributed predictions to the aggregated forecast
devicesWithInsufficientDataDevices with < 30 days of usage history
devicesWithoutForecastDevices that qualify (>= 30 days) but have no fresh forecast doc — precompute has not yet reached them, or failed for those devices
granularityGranularity of returned data
TrainingStatusDto
statusOutcome of the training run
completedAtISO 8601 timestamp of when training completed
errorError message if training failed
PrecomputeStatusDto
completedAtISO 8601 timestamp of when precompute completed
okForecast documents successfully written
failedDevices that failed during precompute
eligibleDevicesTotal eligible devices processed
skippedDevicesDevices skipped due to insufficient data
HttpRequestMethod
HTTP method of the failed request
CreateErrorLogDto
sourceOrigin of the error
httpMethodHTTP method of the failed request
requestUrlURL of the HTTP request that failed
errorMessageDescription of the error
reportedAppFrontend app the error was reported from (FRONTEND errors)
pageUrlFrontend page URL where the error occurred (FRONTEND errors)
systemSystem the account was operating in when the error occurred
statusCodeHTTP status code received. Omitted when no response was involved — an uncaught JavaScript error or a rejected promise never had one.
stackTraceStack trace string (BACKEND errors)
GetErrorLogDto
_idPrimary ID of the error log
sourceOrigin of the error
httpMethodHTTP method of the failed request
requestUrlURL of the HTTP request that failed
errorMessageDescription of the error
solvedWhether this error has been resolved
createdAtTimestamp when the log was created
updatedAtTimestamp when the log was last updated
reportedAppFrontend app the error was reported from (FRONTEND only)
pageUrlFrontend page URL where the error occurred (FRONTEND only)
System the account was operating in when the error occurred
Admin (Account) that encountered the error — present for FRONTEND errors, absent for BACKEND errors
statusCodeHTTP status code received. Absent when no response was involved — an uncaught JavaScript error or a rejected promise never had one.
stackTraceStack trace string (BACKEND errors only)
resolvedAtTimestamp when the error was marked as resolved
Admin (SUPERADMIN) who resolved the error
GetErrorLogsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of error log entries
BulkUpdateErrorLogsDto
errorLogIdsArray of error log IDs to update
solvedWhether to mark the error logs as solved or unsolved
FailedErrorLogOperationDto
errorLogIdID of the error log that failed
reasonReason the operation failed on this error log
BulkUpdateErrorLogsResponseDto
successCountNumber of error logs successfully updated
failedCountNumber of error logs that failed to update
Successfully updated error logs
Error logs that failed to update with reasons
BulkDeleteErrorLogsDto
errorLogIdsArray of error log IDs to delete
BulkDeleteErrorLogsResponseDto
successCountNumber of error logs successfully deleted
failedCountNumber of error logs that failed to delete
successfulIDs of error logs successfully deleted
Error logs that failed to delete with reasons
PublicDatapoint
Public datapoints to enable. TEMPERATURE/HUMIDITY need an ENV_SENSOR (Euna, Kelvin) or AIRCON_CONTROL (Maxwell Pro/Ultra) in the target. Defaults to [REALTIME_POWER] if omitted.
NfcMode
Whether this link controls the target or only shows a public view. Defaults to CONTROL if omitted, for compatibility with callers that predate this field.
GenerateNfcTokenDto
publicDatapointsPublic datapoints to enable. TEMPERATURE/HUMIDITY need an ENV_SENSOR (Euna, Kelvin) or AIRCON_CONTROL (Maxwell Pro/Ultra) in the target. Defaults to [REALTIME_POWER] if omitted.
rangeDaysHow many days of history to show, for every enabled datapoint. Defaults to 2 if omitted.
expiresAtWhen this link stops working. Omit for a token that never expires — prefer setting it for any tag that is handed out temporarily.
modeWhether this link controls the target or only shows a public view. Defaults to CONTROL if omitted, for compatibility with callers that predate this field.
GenerateNfcTokenResponseDto
tokenEncrypted NFC token
publicUrlPublic URL for NFC page
nfcIdNFC document ID
targetTypeTarget type
targetIdTarget ID (room or device)
targetNameTarget name
createdAtCreated at timestamp
modeWhether this link controls devices or only shows a public view
publicDatapointsPublic datapoints enabled for a VIEW-mode link
rangeDaysDays of realtime power history shown on a VIEW-mode link, counted back from now
expiresAtWhen this link stops working. Absent if it never expires.
NfcViewOptionsDto
publicDatapointsPublic datapoints to enable. TEMPERATURE/HUMIDITY need an ENV_SENSOR (Euna, Kelvin) or AIRCON_CONTROL (Maxwell Pro/Ultra) in the target. Defaults to [REALTIME_POWER] if omitted.
rangeDaysHow many days of history to show, for every enabled datapoint. Defaults to 2 if omitted.
expiresAtWhen this link stops working. Omit for a token that never expires — prefer setting it for any tag that is handed out temporarily.
NfcTokenInfoDto
nfcIdNFC document ID
targetTypeTarget type
targetIdTarget ID
targetNameTarget name
usageCountToken usage count
isActiveWhether token is active
tokenEncrypted token string
createdAtCreated at timestamp
modeWhether this link controls devices or only shows a public view
publicDatapointsPublic datapoints enabled for a VIEW-mode link
rangeDaysDays of realtime power history shown on a VIEW-mode link, counted back from now
lastUsedWhen this token was last used to control or read a target
expiresAtOptional expiration date
ListNfcTokensResponseDto
List of NFC tokens
totalTotal number of tokens
NfcToggleDto
onStatusTarget device status
deviceIdOptional device ID to toggle specific device in room (room tokens only)
NfcToggleResponseDto
successfulSuccessfully toggled device IDs
failedFailed device IDs
totalTotal devices attempted
actionAction performed
targetNameTarget name
NfcAnalyticsQueryDto
startDateStart date for analytics query
endDateEnd date for analytics query
NfcTargetInfoDto
idTarget ID
nameTarget name
typeType of NFC target (DEVICE, ROOM, USER)
onStatusDevice ON/OFF status (only for DEVICE targets)
NfcControllableFeaturesDto
temperatureWhether temperature control is supported
modeWhether operating mode control is supported
fanWhether fan speed control is supported
swingWhether swing control is supported
NfcGangSwitchStateDto
gangNumberGang number (1-4)
onStatusON/OFF status of this gang
labelOptional label for the gang
NfcDeviceInfoDto
idDevice ID
nameDevice name
deviceTypeType of device (PLUG, MCB, etc.)
onStatusDevice ON/OFF status
temperatureTemperature setting in Celsius (AIRCON_CONTROL only)
modeAircon operating mode (AIRCON_CONTROL only)
fanFan speed setting (AIRCON_CONTROL only)
swingSwing setting (AIRCON_CONTROL only)
brandAircon brand (AIRCON_CONTROL only)
Indicates which control features are physically supported by this aircon (AIRCON_CONTROL only)
numberOfGangsNumber of gangs/buttons on the switch (SMART_SWITCH only)
Individual gang switch states (SMART_SWITCH only)
switchTypeType of appliance the switch controls (SMART_SWITCH only)
totalEnergyUsageTotal energy usage in watt-hours (PLUG/MCB only)
DateRangeDto
startDateStart date of the queried range
endDateEnd date of the queried range
EnvironmentRealtimeDataPointDto
createdAtStart timestamp of the downsampled bucket
temperatureAverage temperature for the bucket, in degrees Celsius
humidityAverage relative humidity for the bucket, as a percentage
EnvironmentRealtimeSeriesDto
deviceNamedeviceTypeSubtype the readings came from — ENV_SENSOR (Euna/Kelvin) or AIRCON_CONTROL (Maxwell Pro/Ultra ambient readings)
EnvironmentRealtimeResponseDto
One series per contributing sensor in the target
averageTemperatureMean temperature across the sensors, in degrees Celsius. Omitted when only one sensor reported — its own series is already the answer.
averageHumidityMean relative humidity across the sensors, as a percentage. Omitted when only one sensor reported.
WaterRealtimeDataPointDto
createdAtStart timestamp of the downsampled bucket
flowRateMean flow rate over the bucket, in m³/h
WaterRealtimeResponseDto
One series per contributing water meter in the target
totalFlowRateFlow rate summed across the meters, in m³/h — meters on separate pipes add up rather than averaging. Omitted when only one meter reported.
NfcAnalyticsResponseDto
Target information
Usage history data by day with cost breakdown
Date range queried
modeWhether this link is CONTROL or VIEW mode
deviceTypeDevice type (for device-level tokens only)
Device details with current state (for device-level tokens)
Room details (for room-level tokens)
Device list (only for ROOM tokens, includes all toggleable devices in the room)
Live realtime power series, present only for VIEW-mode links with REALTIME_POWER enabled. Always covers the token rangeDays back from now, not the requested dateRange.
Live ambient temperature/humidity series from the ENV_SENSOR and AIRCON_CONTROL devices in the target, present on any link that enables TEMPERATURE and/or HUMIDITY. A metric that was not enabled is stripped from every point. Always covers the token rangeDays back from now, not the requested dateRange, which may differ from the window usageHistory was computed over.
Live water flow-rate series from the WATER_METER devices in the target, present only on links that enable WATER_FLOW. Always covers the token rangeDays back from now, not the requested dateRange.
NfcAirconControlDto
deviceIdSpecific device ID to control (for room-level tokens)
powerPower ON/OFF control
temperatureTemperature setting in Celsius (16-30)
modeAircon operating mode
fanFan speed setting
swingSwing setting for aircon vents
NfcControlResponseDto
successWhether the control operation was successful
messageHuman-readable message describing the result
Updated device information after control operation
NfcSmartSwitchControlDto
deviceIdSpecific device ID to control (for room-level tokens)
powerPower ON/OFF control
gangNumberGang number to control (1-4). Omit to control all gangs.
onStatusON/OFF status for the targeted gang(s)
NfcControlDto
deviceIdSpecific device ID to control (for room-level tokens)
powerPower ON/OFF control
GenerateSignupTokensDto
roleRole the created accounts receive, which decides what each claim creates: TENANT → a new Tenant entity in the system, USER → a new Zone under parentId, ROOM → a new Room under parentId, ADMIN → nothing (the account just joins the system), DEVELOPER → nothing (a sandbox-only account on the system, issued as a 6-digit code instead of a QR token). SUPERADMIN is never accepted.
countHow many stickers to print. Tokens are interchangeable — none is tied to a particular space — so this is simply the number of boxes you are handing out, and it doubles as the cap on how many accounts the batch can create.
parentIdThe container each claim creates its space inside. Required for USER (a Tenant id) and ROOM (a Zone id), since a Zone needs a parent Tenant and a Room needs a parent Zone. Omit for TENANT and ADMIN.
expiresInDaysDays until the stickers stop working. Set this to the rollout window — a sticker that outlives its handover is a standing credential.
GeneratedSignupTokenDto
_idPrimary ID of the signup token record
roleRole the account created from this sticker will receive
tokenThe plaintext token. Returned once, at generation, and never again.
signupUrlFull URL to encode as the QR code. Host depends on role — TENANT/USER land on base, ROOM on trek, ADMIN on everest.
expiresAtWhen the sticker stops working
GenerateSignupTokensResponseDto
One entry per printable sticker. Capture these now — the plaintext tokens are not retrievable later.
GetSignupTokenDto
_idPrimary ID of the signup token record
roleRole the account created from this sticker receives
statusDerived lifecycle state
expiresAtWhen the sticker stops working
createdAtWhen the sticker was generated
createdEntityLabelName of the space this sticker created when it was claimed. Absent until then — stickers are interchangeable and name nothing in advance.
createdEntityIdID of the space created on claim
claimedByEmailEmail of the account that claimed this sticker
firstScannedAtWhen the sticker was first scanned — the gap to now tells the operator whether a box was ever opened
consumedAtWhen an account was created from this sticker
GetSignupTokensResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Signup tokens matching the query parameters
SignupLinkStatus
Which of the three screens the page should render
SignupLinkInfoDto
statusWhich of the three screens the page should render
systemNameSystem the account will be created in, for the page heading
roleRole the created account will receive
requiresSpaceNameWhether the form must collect a name for the space being created. False only for ADMIN links, which create no space.
windowExpiresAtWhen the current activation window closes. Only present while ACTIVE — a form submitted after this is rejected, and the page should tell the user to scan again.
createdEntityLabelName of the space that was created, once the link has been claimed. Lets the CONSUMED screen say what it registered.
SignUpWithLinkDto
nameFull name of the person registering
emailEmail address for the new account (must be unique)
passwordAccount password (minimum 6 characters)
acceptedTermsWhether the person accepted the Terms & Conditions. Must be true.
spaceNameName for the space being created — the unit, zone or room this person occupies. Required unless the link reports requiresSpaceName: false (ADMIN links, which create no space).
appFrontend app the signup came from. A named web app receives the session as httpOnly cookies instead of in the response body.
OAuthSignUpWithLinkDto
credentialProvider ID token (JWT credential) obtained client-side by the in-page sign-in button. Verified server-side.
acceptedTermsWhether the person accepted the Terms & Conditions. Must be true — the provider cannot consent on their behalf.
spaceNameName for the space being created — the unit, zone or room this person occupies. Required unless the link reports requiresSpaceName: false (ADMIN links, which create no space).
appFrontend app the signup came from. A named web app receives the session as httpOnly cookies instead of in the response body.
WaterMeterSize
Pipe diameter size (DN15, DN20, DN25, etc.)
WaterMeter
_idPrimary ID of the Device
deviceTypeType of device (discriminator field)
macIdMAC ID of the Device (from IoT device)
deviceNameName of the Device
deviceNumberUnique device number for identification
onStatusStatus of the Device (ON / OFF / INACTIVE / ERROR)
locationPhysical location or address where the device is installed
remarksRemarks for the Device
batchNumberManufacturing batch number for tracking production groups
chipModelHardware chip model identifier used in the device
versionNumberFirmware version number currently running on the device
ssidNetwork SSID (Wi-Fi name) that the device is connected to
Tagged Tenant
Tagged Zone
Tagged Room
Tagged System
createdAtDate Time of the Creation
updatedAtDate Time of the Update
lastSeenLast time the device was seen/reported
isLockedWhether the device is locked. When locked, the device on/off status cannot be toggled.
totalEnergyUsageTotal cumulative energy usage in kWh
totalEnergySavedTotal energy saved through optimization in kWh
autoUpdateAttemptsNumber of auto-update OTA attempts sent to this device
autoUpdateBlacklistedWhether device is blacklisted from auto-updates (max retries exceeded)
manualUpdateBlacklistWhether device is manually blacklisted from auto-updates by admin
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
meterSizePipe diameter size (DN15, DN20, DN25, etc.)
flowRateCurrent flow rate (m³/h)
velocityFlow velocity (m/s)
soundSpeedSpeed of sound in fluid (m/s)
signalQualityUltrasonic signal quality (no units)
totalNetVolumeTotal net water volume since device registration (L)
isLeakDetectedWhether a leak is currently detected
leakThresholdFlowRateCurrent leak detection threshold (m³/h)
targetStatePending desired on/off state commanded by backend (cloud / scheduled). Set when a toggle is issued; cleared when the device reports a matching state or a physical (MANUAL) press overrides it. Always ON or OFF when present.
targetStateSetAtTimestamp when targetState was last written. Used to expire stale SCHEDULED intents (24hr TTL). CLOUD intents do not expire.
targetSourceOrigin of the pending targetState. Drives TTL behavior on reconcile. Only CLOUD / SCHEDULED are ever written here.
deviceModelModel name or identifier of the device
deviceBrandBrand or manufacturer of the device
wifiErrorLast WiFi shadow delta failure reported by the device (e.g. join_failed); cleared once it reports a successful join
wifiDesiredSsidPrimary SSID the device was last told to join. Set at send time on both the shadow and legacy changeWifi paths; convergence is ssid matching any desired SSID.
wifiDesiredSsid2Secondary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiDesiredSsid3Tertiary SSID the device was last told to join. See {@link wifiDesiredSsid}.
wifiSsidPriorityDesired SSIDs in the order the device should attempt them.
configSettings as last reported by the device into its config shadow, one block per feature
pendingConfigSettings written to the config shadow but not yet reported back. A key the device reports at a different value was rejected
configRequestedAtWhen settings were last written to the config shadow
configReportedAtWhen the device last reported into its config shadow
rssiLatest WiFi signal strength reported by the device (dBm). Updated on each realtime MQTT report.
isPhaseChildTrue when this row is one phase of a split COIL3P rather than a physical unit. Such rows have no real MAC, never report telemetry, and are excluded from firmware, OTA, provisioning and panel-slot views.
isRidgeChildTrue when this row is a unit behind a RIDGE gateway rather than a directly-connected unit. Such rows have no real MAC, are never fleet-provisioned, and are excluded from firmware, OTA and liveness watchdogs — their gateway carries those.
hasPhaseChildrenTrue when this clamp has been split into per-phase children. Such a clamp is org-detached and excluded from energy and organisational views — its children carry those — while remaining the sole target for firmware, OTA and diagnostics.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
Schedule configuration for the device. Contains recurring weekly schedules and one-time scheduled tasks.
scheduleIdId of the single Schedule (in the schedules collection) this device currently follows. deviceSchedule is compiled from that schedule. When null, the device follows nothing.
realTimePowerReal-time power consumption in watts
realTimeCurrentReal-time current in amperes
lastAutoUpdateAttemptTimestamp of last auto-update OTA attempt
inactivityNotificationSentAtTimestamp when the last inactivity notification was sent for this device
thresholdEnabledWhether threshold monitoring is enabled on this device.
Threshold limits sent to the device but not yet confirmed by its firmware. Keys match DeviceThresholdsDto. Present only while a save is outstanding — a key that persists here is not being enforced by the hardware.
This device's alert thresholds gathered into one object. Which fields are populated depends on deviceType — see DeviceThresholdsDto. Absent when no thresholds are configured. The same values remain available as flat top-level fields.
meterModelMeter model/manufacturer
meterConnectedWhether the meter is physically connected
inletTemperatureLatest inlet water temperature (°C)
outletTemperatureLatest outlet water temperature (°C)
energyFlowRateLatest thermal energy flow rate (GJ/h)
flowRateMaxMax threshold flow rate (m³/h)
flowRateMinMin threshold flow rate (m³/h)
inletTemperatureMaxMax threshold inlet temperature (°C)
inletTemperatureMinMin threshold inlet temperature (°C)
outletTemperatureMaxMax threshold outlet temperature (°C)
outletTemperatureMinMin threshold outlet temperature (°C)
lastLeakNotificationAtTimestamp of last leak notification received
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications of the same type
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
FilteredWaterMeterDto
_idUnique database identifier of the device document in the system
macIdUnique identifier assigned to the device by the IoT hardware (MAC ID)
deviceNameFriendly name for the device for easy identification
onStatusCurrent operational status of the device (ON, OFF, INACTIVE, or ERROR)
totalEnergyUsageCumulative total energy consumption in kilowatt-hours (kWh) since device installation
tenantIdUnique identifier of the tenant organization that owns this device
tenantNameName of the tenant organization that owns this device
zoneIdUnique identifier of the zone that this device is assigned to
zoneNameName of the zone that this device is assigned to
roomIdUnique identifier of the room where this device is physically located
roomNameName of the room where this device is physically located
dbIdUnique identifier of the distribution box that this device is connected to (for MCBs)
dbNameName of the distribution box that this device is connected to (for MCBs)
systemIdUnique identifier of the system that this device belongs to
systemNameName of the system that this device belongs to
realTimePowerReal-time power consumption in watts (W) measured by the device
realTimeCurrentReal-time current draw in amperes (A) measured by the device
ssidNetwork SSID (Wi-Fi name) that the device is currently connected to
meterSizePipe diameter size (DN15, DN20, DN25, etc.)
flowRateCurrent flow rate (m³/h)
velocityFlow velocity (m/s)
soundSpeedSpeed of sound in fluid (m/s)
signalQualityUltrasonic signal quality (no units)
totalNetVolumeTotal net water volume since device registration (L)
isLeakDetectedWhether a leak is currently detected
leakThresholdFlowRateCurrent leak detection threshold (m³/h)
targetStatePending desired on/off state commanded by backend. Present when a toggle was issued but the device has not yet acknowledged (e.g. issued while INACTIVE). Frontend can derive a "Pending" indicator when this differs from onStatus.
targetStateSetAtTimestamp when the pending targetState was last written.
deviceNumberAuto-incremented sequential number for tracking device registration order
batchNumberManufacturing batch number for tracking production groups and quality control
chipModelHardware chip model identifier used in the device (e.g., ESP32C2, ESP8266)
versionNumberFirmware version number currently running on the device
wifiDesiredSsidPrimary SSID the device was last told to join
wifiDesiredSsid2Secondary SSID the device was last told to join
wifiDesiredSsid3Tertiary SSID the device was last told to join
wifiSsidPriorityDesired SSIDs in the order the device should attempt them
Weekly and one-time schedule configuration for automated device control
scheduleIdId of the named Schedule this device currently follows. deviceSchedule is compiled from it. Absent or null when the device follows nothing.
lastSeenTimestamp when the device last communicated with the system
isLockedLock status indicating if the device is locked
inactivityNotificationEnabledWhether inactivity notifications are enabled for this device
thresholdEnabledWhether threshold monitoring is enabled
Alert thresholds configured for this device, gathered into one object. Which fields are populated depends on the device type — see DeviceThresholdsDto. Omitted entirely when nothing is set.
meterModelMeter model/manufacturer
meterConnectedWhether the meter is physically connected
lastLeakNotificationAtTimestamp of last leak notification received
flowRateMaxMax threshold flow rate (m³/h)
flowRateMinMin threshold flow rate (m³/h)
inletTemperatureLatest inlet water temperature (°C)
outletTemperatureLatest outlet water temperature (°C)
energyFlowRateLatest thermal energy flow rate (GJ/h)
inletTemperatureMaxMax threshold inlet temperature (°C)
inletTemperatureMinMin threshold inlet temperature (°C)
outletTemperatureMaxMax threshold outlet temperature (°C)
outletTemperatureMinMin threshold outlet temperature (°C)
GetWaterMetersResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
List of water meters with organizational hierarchy details
UpdateWaterMeterDto
deviceNameName of the device
locationPhysical location of the device
remarksAdditional remarks or notes about the device
tenantIdTenant ID to associate the device with
zoneIdZone ID to associate the device with
roomIdRoom ID to associate the device with
isLockedWhether the device is locked. When locked, the device cannot be toggled ON/OFF.
isSpareWhether the device is a spare/inventory device. Spare devices can be filtered out of user-facing dashboards.
thresholdEnabledWhether threshold monitoring is enabled on this device.
meterSizeSize/diameter of the water meter
meterModelModel name/number of the water meter
SetLeakThresholdDto
flowRateMaxLeak detection threshold flow rate (m³/h)
LeakHistoryResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of leak detection notifications
AlertThresholdHistory
waterMeterWater meter ID
flowRateMaxMax flow rate threshold confirmed by device (m³/h)
createdAtTimestamp when this record was created
updatedAtTimestamp when this record was last updated
inletTemperatureMaxMax inlet temperature threshold confirmed by device (°C)
inletTemperatureMinMin inlet temperature threshold confirmed by device (°C)
outletTemperatureMaxMax outlet temperature threshold confirmed by device (°C)
outletTemperatureMinMin outlet temperature threshold confirmed by device (°C)
ThresholdHistoryResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of threshold configuration history records
WaterMeterLatestReadingDto
flowRateCurrent flow rate (m³/h)
velocityFlow velocity (m/s)
soundSpeedSpeed of sound in fluid (m/s)
signalQualityUltrasonic signal quality (no units)
lastSeenLast time the device sent data
meterConnectedWhether the meter is physically connected
inletTemperatureInlet water temperature (°C)
outletTemperatureOutlet water temperature (°C)
energyFlowRateThermal energy flow rate (GJ/h)
BulkSetLeakThresholdDto
waterMeterIdsArray of water meter IDs to update
flowRateMaxLeak detection threshold flow rate (m³/h)
FailedWaterMeterDto
waterMeterIdWater meter ID that failed
errorError message explaining why it failed
BulkWaterMeterResponseDto
Array of successfully processed water meters
Array of failed water meters with error details
summarySummary of the bulk operation
BulkUpdateWaterMeterThresholdsDto
waterMeterIdsIDs of water meters to update
flowRateMaxMax threshold flow rate (m³/h)
flowRateMinMin threshold flow rate (m³/h)
notificationThresholdHourHourly notification threshold — minimum hours between repeat notifications
notificationCooldownHardware notification cooldown in milliseconds — minimum time the device waits between sending repeated notifications
HealthCheckDto
statusServer health status
timestampISO timestamp of the health check
DashboardLayoutItemDto
iPanel ID reference
xX position in grid
yY position in grid
wWidth in grid units
hHeight in grid units
minWMinimum width
minHMinimum height
maxWMaximum width
maxHMaximum height
staticWhether the item is static/immovable
CreateDashboardDto
nameName of the dashboard
descriptionShort explanation of what this dashboard shows
iconIcon name rendered by the frontend beside the dashboard name
refreshIntervalAuto-refresh interval in seconds. Set to 0 to disable auto-refresh.
Layout configuration
panelIdsPanel IDs to include
globalTransformIdsGlobal Transform IDs
DashboardResponseDto
_idDashboard ID
systemSystem ID
nameName of the dashboard
isDefaultWhether this is the system default dashboard
Layout configuration
panelsPanel IDs or populated panels
createdAtupdatedAtdescriptionShort explanation of what this dashboard shows
iconIcon name for the frontend
templateKeyKey of the template this dashboard was created from
refreshIntervalAuto-refresh interval in seconds. 0 means disabled.
globalTransformsGlobal transform IDs or populated transforms
GetMyDeviceTypesResponseDto
deviceTypesDistinct device types accessible to the authenticated account
DashboardTemplatePreviewItemDto
titlePanel title as the template creates it
xColumn offset in a 12-column grid
yRow offset in grid units
wWidth in grid columns
hHeight in grid units
DashboardTemplateResponseDto
keyStable template key, passed to createDashboardFromTemplate
nameTemplate name shown on the card
descriptionWhat the template sets up
panelCountHow many panels the template creates
requiredFeaturesFeatures the system must have enabled
requiredDeviceTypesThe system must own at least one device of one of these types. Empty means the template works anywhere.
The panels this template lays out, in creation order, so the picker can show what the dashboard will look like before it is created.
matchedDeviceTypesThe required device types this system actually owns. Drives the recommendation and lets the picker say why a template was suggested.
recommendedTrue for the single template that best fits this system's devices. Falls back to the default template when nothing matches more strongly.
availableWhether this template can be applied to this system now
iconIcon name for the frontend
disabledReasonWhy the template is unavailable. Absent when available.
ListDashboardTemplatesResponseDto
Every template, including ones this system cannot use — those come back with available=false and a reason rather than being omitted.
DashboardDetailResponseDto
_idDashboard ID
systemSystem ID
nameName of the dashboard
isDefaultWhether this is the system default dashboard
Layout configuration
Populated panels. Discriminate on panelType — EXTERNAL, ECOVOLT or BUILTIN.
createdAtupdatedAtdescriptionShort explanation of what this dashboard shows
iconIcon name for the frontend
templateKeyKey of the template this dashboard was created from
refreshIntervalAuto-refresh interval in seconds. 0 means disabled.
Populated global transformers
UpdateDashboardDto
nameName of the dashboard
descriptionShort explanation of what this dashboard shows
iconIcon name rendered by the frontend beside the dashboard name
refreshIntervalAuto-refresh interval in seconds. Set to 0 to disable auto-refresh.
Layout configuration
panelIdsPanel IDs to include
globalTransformIdsGlobal Transform IDs
AuthType
How the API key is sent. BEARER = Authorization: Bearer
CreateDataSourceDto
nameName of the data source
typeType of data source
urlBase URL
authTypeHow the API key is sent. BEARER = Authorization: Bearer
apiKeyHeaderNameCustom header name when authType is API_KEY_HEADER (defaults to x-api-key)
apiKeyAPI Key (will be encrypted before storage)
DataSourceResponseDto
_idData source ID
systemSystem ID
nameName of the data source
typeType of data source
urlBase URL
createdAtupdatedAtauthTypeHow the API key is sent
apiKeyHeaderNameCustom header name when authType is API_KEY_HEADER
connectionParamsConnection parameters
DiscoveredFieldDto
nameProperty name in the response payload
kindBest-effort classification used to suggest chart axes. Time fields suit the X axis, numeric fields the Y axis.
DiscoveredOperationDto
pathPath relative to the data source base URL
methodHTTP method
Properties of the success response schema
summaryOperation summary from the spec
operationIdoperationId declared in the spec
DiscoverEndpointsResponseDto
Operations found in the data source API spec
specUrlURL the spec was ultimately read from, when one was found
UpdateDataSourceDto
nameName of the data source
typeType of data source
urlBase URL
authTypeHow the API key is sent. BEARER = Authorization: Bearer
apiKeyHeaderNameCustom header name when authType is API_KEY_HEADER (defaults to x-api-key)
apiKeyAPI Key (will be encrypted before storage)
CreateTransformerDto
nameName of the transformer
typeType of transformation to apply. Raw JSON types: EXTRACT, SELECT, RENAME, FIELDS, FILTER, SORT, LIMIT, REDUCE. DataFrame types (DF_ prefix): DF_RENAME_FIELDS, DF_ORGANIZE_FIELDS, DF_SELECT_FIELDS, DF_FILTER_FIELDS_BY_NAME, DF_FILTER_BY_VALUE, DF_FILTER_BY_QUERY, DF_CALCULATE, DF_CUMULATIVE, DF_REDUCE, DF_GROUP_BY, DF_JOIN, DF_MERGE, DF_CONCATENATE, DF_TIME_SERIES_LONG_TO_WIDE, DF_TIME_SERIES_WIDE_TO_LONG, DF_TIME_SERIES_TO_ROWS, DF_TIME_SERIES_TO_TABLE, DF_PIVOT, DF_ROWS_TO_FIELDS, DF_LABELS_TO_FIELDS, DF_LOOKUP, DF_CONFIG_FROM_QUERY, DF_REGRESSION, DF_EXTRACT_LABELS.
configConfiguration object for the transform. Shape depends on the transform type. See TRANSFORMATIONS.md for the full config reference per type.
enabledWhether this transformer is enabled in the pipeline. Disabled transformers are skipped during execution.
orderExecution order within the pipeline. Lower numbers execute first.
UpdateTransformerDto
nameName of the transformer
typeType of transformation to apply.
configConfiguration object for the transform. Shape depends on the transform type. See TRANSFORMATIONS.md for the full config reference per type.
enabledWhether this transformer is enabled in the pipeline. Disabled transformers are skipped during execution.
orderExecution order within the pipeline. Lower numbers execute first.
DeviceHealthItemDto
deviceIdDevice ID
deviceNameDevice name or macId
healthScoreHealth score 0-100
healthStatusHealth status
openAnomalyCountNumber of open anomalies
monitoringEnabledWhether predictive maintenance monitoring is active for this device
mlRiskScoreML model anomaly risk score 0.0–1.0
mlIsAnomalyWhether ML model flagged this device as anomalous
DeviceHealthSummaryDto
totalTotal device count (after filtering)
pageCurrent page number
sizeItems per page
AnomalyType
DeviceAnomalyResponseDto
_idAnomaly ID
deviceDevice ID
systemSystem ID
anomalyTypeseveritydetectedAtbaselineValueactualValuedeviationPercentageexplanationstatusdeviceNameDevice name (populated for convenience)
notesStaff notes about this anomaly
PaginatedAnomaliesDto
totalpagesizeDeviceBaselineDataDto
dayTypecalculatedAtWhen baseline was last calculated
windowDaysRolling window in days
healthScoreHealth score 0-100
hourlyAvgUsageAverage hourly energy usage (kWh) while ON
hourlyStdDevStd dev of hourly usage
dailyAvgUsageAverage daily energy usage (kWh)
dailyStdDevStd dev of daily usage
peakHourAvgPeak hour average usage (kWh)
offPeakHourAvgOff-peak hour average usage (kWh)
avgPowerFactorAverage power factor
avgCurrentAverage current (A)
avgVoltageAverage voltage (V)
avgPowerAverage power (W)
avgCyclesPerDayAverage on/off cycles per day
avgActiveHoursPerDayAverage active hours per day
monitoringEnabledWhether monitoring is enabled
sampleDaysComparable days that contributed to the reference window
recentHourlyAvgUsageMean hourly usage (kWh) over the last 7 comparable days
recentHourlyStdDevStd dev of hourly usage over the last 7 comparable days
recentActiveHoursPerDayMean ON hours per day over the last 7 comparable days
recentCyclesPerDayMean on/off cycles per day over the last 7 comparable days
avgStandbyPowerMean power (W) drawn while OFF — the learned standby signature
recentStandbyPowerMean power (W) drawn while OFF over the last 7 days
spikeCountRecentHours above 3σ in the last 7 comparable days
spikeCountPriorHours above 3σ in the 7 comparable days before that
dailyAvgSlopeRecentSlope of daily usage over the recent window (kWh/day per day)
dailyAvgSlopeWindowSlope of daily usage across the reference window (kWh/day per day)
powerFactorSlopeSlope of daily mean power factor (PF per day). Negative = drifting down.
baselineResetAtWhen baseline was last reset
mlRiskScoreML anomaly risk score 0.0–1.0
mlIsAnomalyWhether ML flagged as anomalous
mlFailureProbabilitySupervised P(real fault), once the system has enough triaged anomalies
mlModelTypeWhich model produced the ML fields: isolation_forest, hybrid, or unavailable
mlScoredAtWhen ML score was last updated
DeviceDetailResponseDto
deviceIdDevice ID
All anomalies for this device
Weekday baseline
Weekend baseline
UpdateAnomalyStatusDto
statusNew status for the anomaly
notesNotes about what happened or actions taken
BulkMonitoringRequestDto
deviceIdsDevice IDs to enable or disable monitoring for
BulkResetBaselineResponseDto
affectedNumber of devices reset
deviceIdsDevice IDs that were successfully reset
baselineResetAtTimestamp the reset was triggered
weekdayRecalibratingUntilWeekday anomaly detection resumes after this date (28 days from reset)
weekendRecalibratingUntilWeekend anomaly detection resumes after this date (70 days from reset)
messageHuman-readable confirmation message
ResetHealthScoreRequestDto
deviceIdsDevice IDs to reset. Omit to reset every PLUG in the system — the usual case after a run of false positives.
anomalyTypesOnly close open anomalies of these types. Omit to close all of them.
BulkResetHealthScoreResponseDto
affectedNumber of devices rescored
deviceIdsDevice IDs that were rescored
anomaliesClosedNumber of open anomalies marked as false positives
messageHuman-readable confirmation message
BulkMonitoringResponseDto
affectedNumber of devices affected
deviceIdsDevice IDs that were successfully updated
messageHuman-readable confirmation message
MlTrainingResponseDto
samplesUsedNumber of baseline feature vectors submitted for training
trainedWhether a model was actually fitted. False when the compute service was unreachable, or when the batch fell below its per-category minimum — a submitted batch is not a trained model.
messageHuman-readable outcome
categoriesTrainedSamples fitted per plug category, keyed by category name
SupervisedMlTrainingResponseDto
samplesUsedTriaged anomalies that carried a feature snapshot and could be used as labels
confirmedFaultsOf those, how many were RESOLVED — i.e. confirmed real faults
falsePositivesOf those, how many were dismissed as FALSE_POSITIVE
trainedWhether the classifier was fitted. False when there were too few labels, only one class was present, or the compute service was unreachable.
messageHuman-readable outcome
cvRocAucOut-of-sample ROC AUC, measured by cross validation before the final fit. Absent when the minority class could not support at least two folds.
featureImportancesRelative contribution of each feature, keyed by feature name
ConsumerOrderLocation
Location of the customer
ConsumerOrderHousingType
Type of housing
ConsumerOrderDevice
Device type identifier
ConsumerSelectedDeviceDto
deviceTypeDevice type identifier
qtyNumber of units of this device
CreateConsumerOrderDto
firstNameFirst name of the customer
lastNameLast name of the customer
mobileMobile number of the customer
emailEmail address of the customer
locationLocation of the customer
housingTypeType of housing
High-energy appliances the customer wants to monitor, with quantities
CreateConsumerOrderResponseDto
messageConfirmation message
SetSceneDto
sceneIdStable id of the scene to activate (see GET /exhibit/scenes).
setByOptional label for who triggered the change (audit only).
SceneStateResponseDto
sceneIdlabelupdatedAtISO timestamp of when this scene became active.
ExhibitDeviceTelemetryDto
deviceIdnamekindonTrue when the circuit is energised.
onStatusStatus of the device (ON / OFF)
deviceNumbermeasurementTypeMeasurement type, for MCBs only
lockedLocked devices reject toggles upstream.
levelStorey, parsed from the zone name ("Level 3" → 3).
roomNamezoneNameratedCurrentratedVoltagerealTimePowerReal-time power (W)
realTimeVoltageReal-time voltage (V)
realTimeCurrentReal-time current (A)
powerFactorPower factor (0-1)
totalEnergyUsageLifetime accumulated energy (kWh), not a daily figure.
lastSeenWhen the device last reported.
ExhibitTelemetryResponseDto
readAtWhen this snapshot was read from upstream.
ExhibitTelemetryPointDto
atpowerPower (W)
voltageVoltage (V)
currentCurrent (A)
ExhibitDeviceHistoryDto
deviceIdUpstream realtime readings, oldest first.
ExhibitEnvironmentPointDto
attemperatureAmbient temperature (°C)
humidityAmbient humidity (%)
ExhibitEnvironmentSensorDto
deviceIdnameUpstream realtime readings, oldest first.
ToggleExhibitDeviceDto
deviceIdonStatusStatus of the device (ON / OFF)
BulkToggleExhibitDevicesDto
deviceIdsonStatusStatus of the device (ON / OFF)
ControlAirconSmartTempDto
valueaggressivenessProportional gain (0–1). 0 = no compensation, 1 = full compensation. Default: 0.5.
ControlExternalDeviceDaikinAirconDto
externalDeviceIdsIDs of the external devices to control
valuepowerPower the unit on (true) or off (false)
modeAC mode (1=cool, 2=heat, 3=fan, 4=auto, 5=dry)
fanFan rate (1=low, 2=high, 3=middle, 4=auto)
setpointSetpoint temperature in °C (cool 18–32, heat 14–28; rejected in auto mode)
lockPowerLock (true) or unlock (false) the wired remote power button
lockModeLock (true) or unlock (false) the wired remote mode selector
lockSetpointLock (true) or unlock (false) the wired remote setpoint adjust
forcedOffForced system stop (true) or clear (false) — port-master units only (ac 0/64/128/192). Units stay OFF after clear.
filterResetReset the dirty-filter sign
forcedThermoOffForce the thermostat off (true) or clear (false)
energySavingEnable (true) or clear (false) energy-saving operation
CreateActionDto
deviceIdID of the device to perform the action on
actionTypeType of action to perform
Control payload. Required for CONTROL_AIRCON, AIRCON_SMART_TEMP, and CONTROL_EXTERNAL_DEVICE_DAIKIN_AIRCON. Shape is ControlAirconDto for CONTROL_AIRCON; ControlAirconSmartTempDto (value + aggressiveness) for AIRCON_SMART_TEMP; ControlExternalDeviceDaikinAirconDto (externalDeviceIds + Daikin fields) for CONTROL_EXTERNAL_DEVICE_DAIKIN_AIRCON.
SmartModeDeviceDto
_iddeviceTypeType of device (PLUG, MCB, etc.)
deviceNameSmartModeCreatorDto
_idnameemailroleAdministrator role defining access permissions (SUPERADMIN or ADMIN)
NodePositionDto
xX coordinate on the canvas
yY coordinate on the canvas
GetActionDto
_idsystemactionTypecreatedAtupdatedAtControl payload. Shape depends on actionType: ControlAirconDto for CONTROL_AIRCON; ControlAirconSmartTempDto for AIRCON_SMART_TEMP.
GetActionsResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of actions matching the query
UpdateActionDto
deviceIdID of the device to perform the action on
actionTypeType of action to perform
Control payload. Shape is ControlAirconDto for CONTROL_AIRCON; ControlAirconSmartTempDto (value + aggressiveness) for AIRCON_SMART_TEMP; ControlExternalDeviceDaikinAirconDto (externalDeviceIds + Daikin fields) for CONTROL_EXTERNAL_DEVICE_DAIKIN_AIRCON.
Canvas position of this node
TriggerDayTimeRangeDto
dayDay of the week this time range applies to
startTimeStart time in HH:mm format (inclusive)
endTimeEnd time in HH:mm format (exclusive). Must be after startTime — overnight ranges are not supported.
CreateTriggerDto
nameHuman-readable name for this trigger
metricMetric to evaluate
operatorComparison operator
thresholdValueThreshold value to compare the metric against (e.g. 30 for "temperature > 30")
actionsIDs of actions to execute when the condition is met
deviceIdID of the device whose metric will be monitored. Required for device metrics; omit for weather metrics.
latitudeLatitude of the location to check weather for. Required when metric is a weather metric; ignored otherwise.
longitudeLongitude of the location to check weather for. Required when metric is a weather metric; ignored otherwise.
delayMinutesMinutes the condition must be sustained before actions fire. Omit for immediate fire.
intervalMinutesMinutes between repeated action firings while the condition remains true. Absent means fire on every evaluation while the condition is met.
Time windows when this trigger is allowed to fire. If omitted or empty, the trigger fires at any time.
GetTriggerDto
_idsystemnameHuman-readable name for this trigger
metricoperatorthresholdValueThreshold value the metric is compared against
Actions executed when the condition is met
createdAtupdatedAtlatitudeLatitude of the weather location. Present only on weather triggers.
longitudeLongitude of the weather location. Present only on weather triggers.
delayMinutesMinutes the condition must be sustained before actions fire. Absent means fire immediately.
intervalMinutesMinutes between repeated action firings while the condition remains true. Absent means fire only once per condition met.
Time windows when this trigger is allowed to fire. Empty array means no restriction.
CreateTriggerWithActionDto
nameName for the trigger
triggerDeviceIdDevice whose toggle state is monitored as the trigger condition
metricoperatorthresholdValueThreshold value compared against the metric. Use 0 for IS_TRUE/IS_FALSE operators.
actionDeviceIdDevice to control when the trigger fires
actionTypeGetTriggersResponseDto
totalTotal count of items matching filters
pageCurrent page number
sizeItems per page
totalPagesTotal number of pages
Array of triggers matching the query
UpdateTriggerDto
nameHuman-readable name for this trigger
deviceIdID of the device whose metric will be monitored
metricMetric to evaluate
operatorComparison operator
thresholdValueThreshold value to compare the metric against
actionsIDs of actions to execute when the condition is met
latitudeLatitude of the location to check weather for. Only applicable to weather metrics.
longitudeLongitude of the location to check weather for. Only applicable to weather metrics.
delayMinutesMinutes the condition must be sustained before actions fire. Omit to leave unchanged.
intervalMinutesMinutes between repeated action firings while the condition remains true. Absent means fire on every evaluation while the condition is met.
Canvas position of this node
Time windows when this trigger is allowed to fire. Pass an empty array to remove all restrictions.