[{"data":1,"prerenderedAt":760},["ShallowReactive",2],{"doc-\u002Fapi\u002Falerts":3},{"id":4,"title":5,"body":6,"description":750,"edit":751,"extension":752,"meta":753,"navigation":754,"path":755,"seo":756,"stem":757,"vertical":751,"weight":758,"__hash__":759},"content\u002Fapi\u002Falerts.md","Alerts API",{"type":7,"value":8,"toc":737},"minimark",[9,27,31,34,39,49,209,213,219,226,281,288,292,298,306,310,316,322,325,332,336,342,655,659,698,702,708,718,722,733],[10,11,12,13,17,18,21,22,26],"p",{},"Alerts have two halves: ",[14,15,16],"strong",{},"rules"," (the things you configure) and\n",[14,19,20],{},"events"," (the things that happen). The two are joined by ",[23,24,25],"code",{},"channel_id",".",[28,29,30],"h2",{"id":16},"Rules",[10,32,33],{},"A rule is a configuration object attached to a channel. The most basic\nrule is \"stay between ok_min and ok_max\". The richer rules add\ntime-of-day windows and severity escalation.",[35,36,38],"h3",{"id":37},"list-rules-on-a-channel","List rules on a channel",[40,41,46],"pre",{"className":42,"code":44,"language":45},[43],"language-text","GET \u002Fv1\u002Fchannels\u002Fchn_a1b2\u002Frules\n","text",[23,47,44],{"__ignoreMap":48},"",[40,50,54],{"className":51,"code":52,"language":53,"meta":48,"style":48},"language-json shiki shiki-themes github-dark github-dark","{\n  \"data\": [\n    {\n      \"id\":         \"rul_z9y8\",\n      \"channel_id\": \"chn_a1b2\",\n      \"kind\":       \"range\",\n      \"ok_min\":     -2,\n      \"ok_max\":      8,\n      \"grace_min\":   15,\n      \"severity\":   \"alarm\",\n      \"enabled\":     true\n    }\n  ]\n}\n","json",[23,55,56,65,75,81,97,111,125,139,153,167,180,191,197,203],{"__ignoreMap":48},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"suv1-","{\n",[57,66,68,72],{"class":59,"line":67},2,[57,69,71],{"class":70},"s8ozJ","  \"data\"",[57,73,74],{"class":63},": [\n",[57,76,78],{"class":59,"line":77},3,[57,79,80],{"class":63},"    {\n",[57,82,84,87,90,94],{"class":59,"line":83},4,[57,85,86],{"class":70},"      \"id\"",[57,88,89],{"class":63},":         ",[57,91,93],{"class":92},"s4wv1","\"rul_z9y8\"",[57,95,96],{"class":63},",\n",[57,98,100,103,106,109],{"class":59,"line":99},5,[57,101,102],{"class":70},"      \"channel_id\"",[57,104,105],{"class":63},": ",[57,107,108],{"class":92},"\"chn_a1b2\"",[57,110,96],{"class":63},[57,112,114,117,120,123],{"class":59,"line":113},6,[57,115,116],{"class":70},"      \"kind\"",[57,118,119],{"class":63},":       ",[57,121,122],{"class":92},"\"range\"",[57,124,96],{"class":63},[57,126,128,131,134,137],{"class":59,"line":127},7,[57,129,130],{"class":70},"      \"ok_min\"",[57,132,133],{"class":63},":     ",[57,135,136],{"class":70},"-2",[57,138,96],{"class":63},[57,140,142,145,148,151],{"class":59,"line":141},8,[57,143,144],{"class":70},"      \"ok_max\"",[57,146,147],{"class":63},":      ",[57,149,150],{"class":70},"8",[57,152,96],{"class":63},[57,154,156,159,162,165],{"class":59,"line":155},9,[57,157,158],{"class":70},"      \"grace_min\"",[57,160,161],{"class":63},":   ",[57,163,164],{"class":70},"15",[57,166,96],{"class":63},[57,168,170,173,175,178],{"class":59,"line":169},10,[57,171,172],{"class":70},"      \"severity\"",[57,174,161],{"class":63},[57,176,177],{"class":92},"\"alarm\"",[57,179,96],{"class":63},[57,181,183,186,188],{"class":59,"line":182},11,[57,184,185],{"class":70},"      \"enabled\"",[57,187,133],{"class":63},[57,189,190],{"class":70},"true\n",[57,192,194],{"class":59,"line":193},12,[57,195,196],{"class":63},"    }\n",[57,198,200],{"class":59,"line":199},13,[57,201,202],{"class":63},"  ]\n",[57,204,206],{"class":59,"line":205},14,[57,207,208],{"class":63},"}\n",[35,210,212],{"id":211},"create-a-rule","Create a rule",[40,214,217],{"className":215,"code":216,"language":45},[43],"POST \u002Fv1\u002Fchannels\u002Fchn_a1b2\u002Frules\n{\n  \"kind\":      \"range\",\n  \"ok_min\":    -2,\n  \"ok_max\":     8,\n  \"grace_min\": 15,\n  \"severity\":  \"alarm\"\n}\n",[23,218,216],{"__ignoreMap":48},[10,220,221,222,225],{},"Supported ",[23,223,224],{},"kind"," values:",[227,228,229,240,254,263,272],"ul",{},[230,231,232,235,236,239],"li",{},[23,233,234],{},"range"," — ",[23,237,238],{},"value ∈ [ok_min, ok_max]",". The default.",[230,241,242,245,246,249,250,253],{},[23,243,244],{},"delta"," — abs(value − previous) ≤ ",[23,247,248],{},"max_delta"," in ",[23,251,252],{},"interval_s",".\nUseful for \"the freezer door must not let temperature rise faster\nthan 0.5 °C per minute\".",[230,255,256,259,260,26],{},[23,257,258],{},"derivative"," — running 1-h rate of change inside ",[23,261,262],{},"[min_rate, max_rate]",[230,264,265,268,269,26],{},[23,266,267],{},"absence"," — no measurement received for ",[23,270,271],{},"min_interval_s",[230,273,274,235,277,280],{},[23,275,276],{},"comparison",[23,278,279],{},"value compared to another_channel ± offset",".\nUseful for the Legionella supply\u002Freturn delta.",[10,282,283,284,287],{},"A channel can have multiple rules; they are evaluated independently.\nThe channel's state is the ",[14,285,286],{},"most severe"," of all active rule states.",[35,289,291],{"id":290},"update-a-rule","Update a rule",[40,293,296],{"className":294,"code":295,"language":45},[43],"PATCH \u002Fv1\u002Frules\u002Frul_z9y8\n{ \"ok_max\": 6 }\n",[23,297,295],{"__ignoreMap":48},[10,299,300,301,26],{},"Audit-logged. To replay history under the new rule, see\n",[302,303,305],"a",{"href":304},"\u002Fapi\u002Fsensors","POST \u002Fv1\u002Fsensors\u002F...\u002Frecompute",[35,307,309],{"id":308},"time-of-day-windows","Time-of-day windows",[40,311,314],{"className":312,"code":313,"language":45},[43],"{\n  \"kind\": \"range\",\n  \"ok_min\": -2,\n  \"ok_max\":  8,\n  \"windows\": [\n    { \"rrule\": \"FREQ=DAILY;BYHOUR=22;BYMINUTE=0\", \"duration_min\": 30, \"ok_max\": 12 }\n  ]\n}\n",[23,315,313],{"__ignoreMap":48},[10,317,318,321],{},[23,319,320],{},"rrule"," is RFC 5545 (the iCalendar recurrence rule format). During\neach instance, the override values are used in place of the base ones.\nUse for nightly defrost or planned production windows.",[28,323,324],{"id":20},"Events",[10,326,327,328,331],{},"An event is one transition in the channel's state machine:\n",[23,329,330],{},"ok → grace → alarm → acknowledged → cleared",". Events are persisted;\nthe chart's red bars derive from the event log.",[35,333,335],{"id":334},"list-events","List events",[40,337,340],{"className":338,"code":339,"language":45},[43],"GET \u002Fv1\u002Fchannels\u002Fchn_a1b2\u002Fevents?from=…&to=…\n",[23,341,339],{"__ignoreMap":48},[40,343,345],{"className":51,"code":344,"language":53,"meta":48,"style":48},"{\n  \"data\": [\n    {\n      \"id\":          \"evt_4f3c\",\n      \"channel_id\":  \"chn_a1b2\",\n      \"rule_id\":     \"rul_z9y8\",\n      \"kind\":        \"alarm_opened\",\n      \"severity\":    \"alarm\",\n      \"opened_at\":   \"2026-05-17T08:10:00Z\",\n      \"value_at\":     11.2,\n      \"thresholds\":  { \"ok_min\": -2, \"ok_max\": 8 }\n    },\n    {\n      \"id\":          \"evt_4f3d\",\n      \"channel_id\":  \"chn_a1b2\",\n      \"rule_id\":     \"rul_z9y8\",\n      \"kind\":        \"alarm_ack\",\n      \"ack_at\":      \"2026-05-17T08:14:30Z\",\n      \"ack_by\":      \"ops@cafe-bratislava.sk\",\n      \"ack_note\":    \"Door propped open during delivery; closed.\"\n    },\n    {\n      \"id\":          \"evt_4f3e\",\n      \"channel_id\":  \"chn_a1b2\",\n      \"rule_id\":     \"rul_z9y8\",\n      \"kind\":        \"alarm_cleared\",\n      \"cleared_at\":  \"2026-05-17T08:25:00Z\",\n      \"value_at\":     6.1\n    }\n  ]\n}\n",[23,346,347,351,357,361,373,384,395,407,418,430,442,470,475,479,490,501,512,524,537,550,561,566,571,583,594,605,617,630,640,645,650],{"__ignoreMap":48},[57,348,349],{"class":59,"line":60},[57,350,64],{"class":63},[57,352,353,355],{"class":59,"line":67},[57,354,71],{"class":70},[57,356,74],{"class":63},[57,358,359],{"class":59,"line":77},[57,360,80],{"class":63},[57,362,363,365,368,371],{"class":59,"line":83},[57,364,86],{"class":70},[57,366,367],{"class":63},":          ",[57,369,370],{"class":92},"\"evt_4f3c\"",[57,372,96],{"class":63},[57,374,375,377,380,382],{"class":59,"line":99},[57,376,102],{"class":70},[57,378,379],{"class":63},":  ",[57,381,108],{"class":92},[57,383,96],{"class":63},[57,385,386,389,391,393],{"class":59,"line":113},[57,387,388],{"class":70},"      \"rule_id\"",[57,390,133],{"class":63},[57,392,93],{"class":92},[57,394,96],{"class":63},[57,396,397,399,402,405],{"class":59,"line":127},[57,398,116],{"class":70},[57,400,401],{"class":63},":        ",[57,403,404],{"class":92},"\"alarm_opened\"",[57,406,96],{"class":63},[57,408,409,411,414,416],{"class":59,"line":141},[57,410,172],{"class":70},[57,412,413],{"class":63},":    ",[57,415,177],{"class":92},[57,417,96],{"class":63},[57,419,420,423,425,428],{"class":59,"line":155},[57,421,422],{"class":70},"      \"opened_at\"",[57,424,161],{"class":63},[57,426,427],{"class":92},"\"2026-05-17T08:10:00Z\"",[57,429,96],{"class":63},[57,431,432,435,437,440],{"class":59,"line":169},[57,433,434],{"class":70},"      \"value_at\"",[57,436,133],{"class":63},[57,438,439],{"class":70},"11.2",[57,441,96],{"class":63},[57,443,444,447,450,453,455,457,460,463,465,467],{"class":59,"line":182},[57,445,446],{"class":70},"      \"thresholds\"",[57,448,449],{"class":63},":  { ",[57,451,452],{"class":70},"\"ok_min\"",[57,454,105],{"class":63},[57,456,136],{"class":70},[57,458,459],{"class":63},", ",[57,461,462],{"class":70},"\"ok_max\"",[57,464,105],{"class":63},[57,466,150],{"class":70},[57,468,469],{"class":63}," }\n",[57,471,472],{"class":59,"line":193},[57,473,474],{"class":63},"    },\n",[57,476,477],{"class":59,"line":199},[57,478,80],{"class":63},[57,480,481,483,485,488],{"class":59,"line":205},[57,482,86],{"class":70},[57,484,367],{"class":63},[57,486,487],{"class":92},"\"evt_4f3d\"",[57,489,96],{"class":63},[57,491,493,495,497,499],{"class":59,"line":492},15,[57,494,102],{"class":70},[57,496,379],{"class":63},[57,498,108],{"class":92},[57,500,96],{"class":63},[57,502,504,506,508,510],{"class":59,"line":503},16,[57,505,388],{"class":70},[57,507,133],{"class":63},[57,509,93],{"class":92},[57,511,96],{"class":63},[57,513,515,517,519,522],{"class":59,"line":514},17,[57,516,116],{"class":70},[57,518,401],{"class":63},[57,520,521],{"class":92},"\"alarm_ack\"",[57,523,96],{"class":63},[57,525,527,530,532,535],{"class":59,"line":526},18,[57,528,529],{"class":70},"      \"ack_at\"",[57,531,147],{"class":63},[57,533,534],{"class":92},"\"2026-05-17T08:14:30Z\"",[57,536,96],{"class":63},[57,538,540,543,545,548],{"class":59,"line":539},19,[57,541,542],{"class":70},"      \"ack_by\"",[57,544,147],{"class":63},[57,546,547],{"class":92},"\"ops@cafe-bratislava.sk\"",[57,549,96],{"class":63},[57,551,553,556,558],{"class":59,"line":552},20,[57,554,555],{"class":70},"      \"ack_note\"",[57,557,413],{"class":63},[57,559,560],{"class":92},"\"Door propped open during delivery; closed.\"\n",[57,562,564],{"class":59,"line":563},21,[57,565,474],{"class":63},[57,567,569],{"class":59,"line":568},22,[57,570,80],{"class":63},[57,572,574,576,578,581],{"class":59,"line":573},23,[57,575,86],{"class":70},[57,577,367],{"class":63},[57,579,580],{"class":92},"\"evt_4f3e\"",[57,582,96],{"class":63},[57,584,586,588,590,592],{"class":59,"line":585},24,[57,587,102],{"class":70},[57,589,379],{"class":63},[57,591,108],{"class":92},[57,593,96],{"class":63},[57,595,597,599,601,603],{"class":59,"line":596},25,[57,598,388],{"class":70},[57,600,133],{"class":63},[57,602,93],{"class":92},[57,604,96],{"class":63},[57,606,608,610,612,615],{"class":59,"line":607},26,[57,609,116],{"class":70},[57,611,401],{"class":63},[57,613,614],{"class":92},"\"alarm_cleared\"",[57,616,96],{"class":63},[57,618,620,623,625,628],{"class":59,"line":619},27,[57,621,622],{"class":70},"      \"cleared_at\"",[57,624,379],{"class":63},[57,626,627],{"class":92},"\"2026-05-17T08:25:00Z\"",[57,629,96],{"class":63},[57,631,633,635,637],{"class":59,"line":632},28,[57,634,434],{"class":70},[57,636,133],{"class":63},[57,638,639],{"class":70},"6.1\n",[57,641,643],{"class":59,"line":642},29,[57,644,196],{"class":63},[57,646,648],{"class":59,"line":647},30,[57,649,202],{"class":63},[57,651,653],{"class":59,"line":652},31,[57,654,208],{"class":63},[10,656,657,225],{},[23,658,224],{},[227,660,661,667,673,679,689],{},[230,662,663,666],{},[23,664,665],{},"alarm_opened"," — channel entered alarm (after grace expired).",[230,668,669,672],{},[23,670,671],{},"alarm_ack","   — an operator acknowledged with a note.",[230,674,675,678],{},[23,676,677],{},"alarm_cleared"," — value returned to in-range.",[230,680,681,684,685,688],{},[23,682,683],{},"silence_opened"," \u002F ",[23,686,687],{},"silence_closed"," — operator-scheduled silence\nwindows.",[230,690,691,684,694,697],{},[23,692,693],{},"device_offline",[23,695,696],{},"device_online"," — connection state transitions.",[35,699,701],{"id":700},"acknowledge-an-alarm","Acknowledge an alarm",[40,703,706],{"className":704,"code":705,"language":45},[43],"POST \u002Fv1\u002Fevents\u002Fevt_4f3c\u002Fack\n{ \"note\": \"Door propped open during delivery; closed.\" }\n",[23,707,705],{"__ignoreMap":48},[10,709,710,711,713,714,717],{},"Issues an ",[23,712,671],{}," event. The acknowledger identity comes from the\nsession or the ",[23,715,716],{},"ua_live_"," token used.",[35,719,721],{"id":720},"replay-recompute","Replay \u002F recompute",[10,723,724,725,728,729,732],{},"If you change a rule and want to recompute past events under the new\nrule, call the channel-level recompute (see\n",[302,726,727],{"href":304},"Sensors API","). Events emitted by the previous rule are\npreserved; new events from the recompute are tagged\n",[23,730,731],{},"origin = \"recompute\""," so an auditor can distinguish them.",[734,735,736],"style",{},"html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":48,"searchDepth":77,"depth":77,"links":738},[739,745],{"id":16,"depth":67,"text":30,"children":740},[741,742,743,744],{"id":37,"depth":77,"text":38},{"id":211,"depth":77,"text":212},{"id":290,"depth":77,"text":291},{"id":308,"depth":77,"text":309},{"id":20,"depth":67,"text":324,"children":746},[747,748,749],{"id":334,"depth":77,"text":335},{"id":700,"depth":77,"text":701},{"id":720,"depth":77,"text":721},"Rules and events",null,"md",{},true,"\u002Fapi\u002Falerts",{"title":5,"description":750},"api\u002Falerts",290,"FTuU-COXAGkg1ouhJLvlman8pcBOoQ0nCrxRPNCGpqg",1779022954216]