screen.quality
Screen colour & brightness quality
Reports how far a screen's brightness and colour have drifted from its calibrated baseline. Sent from Harvester readings, at most once per screen per windowSeconds, and averaged over that window. Each channel is scored as value / reference * 100, so 100 is exactly on the baseline. On an uncalibrated screen, references are null and status is UNKNOWN.
No event means no data, not a healthy screen. Vojo sends the value, the reference and the score; you decide what counts as bad.
Payload
eventTypestringRequiredeventIdstringRequiredStable per-event id, constant across retries (injected at delivery). Dedupe on this.
screenIdstringRequiredscreenNamestringRequiredbasisstringRequiredwindowSecondsintegerRequiredThe throttle/averaging window this payload covers.
windowEndAtstringRequiredEpoch (seconds) of the latest reading in this window. Use for staleness — absence of events means no data, not "healthy".
thresholdPctnumber or nullRequiredGOOD/BAD band half-width around 100 (your organisation's quality threshold, default 10 = +/-10%). Symmetric, so both over-bright and too-dim are BAD. Same value for brightness and every colour channel. null when no alerting config.
brightnessobjectRequiredThe white / clear channel.
Show 4 fields
valuenumber or nullRequiredThe measured reading (averaged over the window).
referencenumber or nullRequiredThe calibration baseline this channel was scored against. Null when uncalibrated.
scorenumber or nullRequiredround(value / reference * 100). Null when not computable.
statusstringRequiredGOOD within +/- the org quality threshold of 100; UNKNOWN when not assessable.
colourobjectRequiredShow 4 fields
redobjectRequiredOne scored channel.
score = round(value / reference * 100); 100 = on the calibrated baseline.Show 4 fields
valuenumber or nullRequiredThe measured reading (averaged over the window).
referencenumber or nullRequiredThe calibration baseline this channel was scored against. Null when uncalibrated.
scorenumber or nullRequiredround(value / reference * 100). Null when not computable.
statusstringRequiredGOOD within +/- the org quality threshold of 100; UNKNOWN when not assessable.
greenobjectRequiredOne scored channel.
score = round(value / reference * 100); 100 = on the calibrated baseline.Show 4 fields
valuenumber or nullRequiredThe measured reading (averaged over the window).
referencenumber or nullRequiredThe calibration baseline this channel was scored against. Null when uncalibrated.
scorenumber or nullRequiredround(value / reference * 100). Null when not computable.
statusstringRequiredGOOD within +/- the org quality threshold of 100; UNKNOWN when not assessable.
blueobjectRequiredOne scored channel.
score = round(value / reference * 100); 100 = on the calibrated baseline.Show 4 fields
valuenumber or nullRequiredThe measured reading (averaged over the window).
referencenumber or nullRequiredThe calibration baseline this channel was scored against. Null when uncalibrated.
scorenumber or nullRequiredround(value / reference * 100). Null when not computable.
statusstringRequiredGOOD within +/- the org quality threshold of 100; UNKNOWN when not assessable.
statusstringRequiredWorst of the three channels.
attemptIdstringPer-attempt id; CHANGES on each retry. Do not dedupe on this.
calibratedAtstring or nullEpoch (seconds) the active calibration baseline was taken; null when uncalibrated.
Handling this event
Verify the signature, reply with a 2xx within 20 seconds, then process the event in the background. Retries reuse the same event id, so deduplicate on it.