[{"data":1,"prerenderedAt":446},["ShallowReactive",2],{"doc-\u002Fapi\u002Fsensors":3},{"id":4,"title":5,"body":6,"description":436,"edit":437,"extension":438,"meta":439,"navigation":440,"path":441,"seo":442,"stem":443,"vertical":437,"weight":444,"__hash__":445},"content\u002Fapi\u002Fsensors.md","Sensors API",{"type":7,"value":8,"toc":428},"minimark",[9,28,33,44,278,301,305,311,314,318,326,330,336,343,347,353,356,360,424],[10,11,12,13,17,18,21,22,27],"p",{},"A ",[14,15,16],"strong",{},"sensor"," is the logical input on a device — one device may carry many.\nA ",[14,19,20],{},"channel"," is the sensor + its rules. In the API we collapse the two,\nbecause in practice you always edit them together. See\n",[23,24,26],"a",{"href":25},"\u002Fgetting-started\u002Fconcepts","Concepts"," for the data model rationale.",[29,30,32],"h2",{"id":31},"list-sensors-on-a-device","List sensors on a device",[34,35,40],"pre",{"className":36,"code":38,"language":39},[37],"language-text","GET \u002Fv1\u002Fdevices\u002Fdev_b1d2\u002Fsensors\n","text",[41,42,38],"code",{"__ignoreMap":43},"",[34,45,49],{"className":46,"code":47,"language":48,"meta":43,"style":43},"language-json shiki shiki-themes github-dark github-dark","{\n  \"data\": [\n    {\n      \"id\":          \"snr_a1b2\",\n      \"channel_id\":  \"chn_a1b2\",\n      \"device_id\":   \"dev_b1d2\",\n      \"kind\":        \"temperature\",\n      \"label\":       \"front\",\n      \"unit\":        \"°C\",\n      \"ok_min\":      -2,\n      \"ok_max\":       8,\n      \"grace_min\":   15,\n      \"rule_enabled\": true,\n      \"last_value\":   4.2,\n      \"last_ts\":     \"2026-05-17T08:22:00Z\",\n      \"state\":       \"ok\"\n    },\n    ...\n  ]\n}\n","json",[41,50,51,60,70,76,92,106,120,134,148,161,175,188,201,215,228,242,253,259,266,272],{"__ignoreMap":43},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"suv1-","{\n",[52,61,63,67],{"class":54,"line":62},2,[52,64,66],{"class":65},"s8ozJ","  \"data\"",[52,68,69],{"class":58},": [\n",[52,71,73],{"class":54,"line":72},3,[52,74,75],{"class":58},"    {\n",[52,77,79,82,85,89],{"class":54,"line":78},4,[52,80,81],{"class":65},"      \"id\"",[52,83,84],{"class":58},":          ",[52,86,88],{"class":87},"s4wv1","\"snr_a1b2\"",[52,90,91],{"class":58},",\n",[52,93,95,98,101,104],{"class":54,"line":94},5,[52,96,97],{"class":65},"      \"channel_id\"",[52,99,100],{"class":58},":  ",[52,102,103],{"class":87},"\"chn_a1b2\"",[52,105,91],{"class":58},[52,107,109,112,115,118],{"class":54,"line":108},6,[52,110,111],{"class":65},"      \"device_id\"",[52,113,114],{"class":58},":   ",[52,116,117],{"class":87},"\"dev_b1d2\"",[52,119,91],{"class":58},[52,121,123,126,129,132],{"class":54,"line":122},7,[52,124,125],{"class":65},"      \"kind\"",[52,127,128],{"class":58},":        ",[52,130,131],{"class":87},"\"temperature\"",[52,133,91],{"class":58},[52,135,137,140,143,146],{"class":54,"line":136},8,[52,138,139],{"class":65},"      \"label\"",[52,141,142],{"class":58},":       ",[52,144,145],{"class":87},"\"front\"",[52,147,91],{"class":58},[52,149,151,154,156,159],{"class":54,"line":150},9,[52,152,153],{"class":65},"      \"unit\"",[52,155,128],{"class":58},[52,157,158],{"class":87},"\"°C\"",[52,160,91],{"class":58},[52,162,164,167,170,173],{"class":54,"line":163},10,[52,165,166],{"class":65},"      \"ok_min\"",[52,168,169],{"class":58},":      ",[52,171,172],{"class":65},"-2",[52,174,91],{"class":58},[52,176,178,181,183,186],{"class":54,"line":177},11,[52,179,180],{"class":65},"      \"ok_max\"",[52,182,142],{"class":58},[52,184,185],{"class":65},"8",[52,187,91],{"class":58},[52,189,191,194,196,199],{"class":54,"line":190},12,[52,192,193],{"class":65},"      \"grace_min\"",[52,195,114],{"class":58},[52,197,198],{"class":65},"15",[52,200,91],{"class":58},[52,202,204,207,210,213],{"class":54,"line":203},13,[52,205,206],{"class":65},"      \"rule_enabled\"",[52,208,209],{"class":58},": ",[52,211,212],{"class":65},"true",[52,214,91],{"class":58},[52,216,218,221,223,226],{"class":54,"line":217},14,[52,219,220],{"class":65},"      \"last_value\"",[52,222,114],{"class":58},[52,224,225],{"class":65},"4.2",[52,227,91],{"class":58},[52,229,231,234,237,240],{"class":54,"line":230},15,[52,232,233],{"class":65},"      \"last_ts\"",[52,235,236],{"class":58},":     ",[52,238,239],{"class":87},"\"2026-05-17T08:22:00Z\"",[52,241,91],{"class":58},[52,243,245,248,250],{"class":54,"line":244},16,[52,246,247],{"class":65},"      \"state\"",[52,249,142],{"class":58},[52,251,252],{"class":87},"\"ok\"\n",[52,254,256],{"class":54,"line":255},17,[52,257,258],{"class":58},"    },\n",[52,260,262],{"class":54,"line":261},18,[52,263,265],{"class":264},"sX7ps","    ...\n",[52,267,269],{"class":54,"line":268},19,[52,270,271],{"class":58},"  ]\n",[52,273,275],{"class":54,"line":274},20,[52,276,277],{"class":58},"}\n",[10,279,280,283,284,287,288,287,291,287,294,287,297,300],{},[41,281,282],{},"state"," is one of ",[41,285,286],{},"ok",", ",[41,289,290],{},"grace",[41,292,293],{},"alarm",[41,295,296],{},"silent",[41,298,299],{},"no_data",".",[29,302,304],{"id":303},"update-a-channels-thresholds","Update a channel's thresholds",[34,306,309],{"className":307,"code":308,"language":39},[37],"PATCH \u002Fv1\u002Fsensors\u002Fsnr_a1b2\n{\n  \"ok_min\": -1,\n  \"ok_max\": 6,\n  \"grace_min\": 30\n}\n",[41,310,308],{"__ignoreMap":43},[10,312,313],{},"Changes are audit-logged. The previous threshold is preserved in the\naudit trail and shown on the channel page.",[29,315,317],{"id":316},"add-a-custom-rule","Add a custom rule",[10,319,320,321,325],{},"For complex cases (windows, multiple bounds), use the\n",[23,322,324],{"href":323},"\u002Fapi\u002Falerts","alerts"," endpoint, not this one. This endpoint is for the\nsingle-rule simple case (one operating range, optional grace, optional\nwindows).",[29,327,329],{"id":328},"silence-a-channel","Silence a channel",[34,331,334],{"className":332,"code":333,"language":39},[37],"POST \u002Fv1\u002Fsensors\u002Fsnr_a1b2\u002Fsilence\n{\n  \"from\": \"2026-05-17T22:00:00Z\",\n  \"to\":   \"2026-05-18T02:00:00Z\",\n  \"reason\": \"scheduled defrost\"\n}\n",[41,335,333],{"__ignoreMap":43},[10,337,338,339,342],{},"Silence windows do not suppress measurements or audit-log events; they\nsuppress ",[14,340,341],{},"notifications"," only. The alarm still appears in the dashboard\nand the PDF report; the operator does not get woken up.",[29,344,346],{"id":345},"recompute-state","Recompute state",[34,348,351],{"className":349,"code":350,"language":39},[37],"POST \u002Fv1\u002Fsensors\u002Fsnr_a1b2\u002Frecompute\n",[41,352,350],{"__ignoreMap":43},[10,354,355],{},"Replays the rule engine over the last 24 h of measurements and emits\nany missed events. Idempotent. Use after editing a rule retroactively\n(rare); the audit trail records the recompute and the new events.",[29,357,359],{"id":358},"errors","Errors",[361,362,363,380],"table",{},[364,365,366],"thead",{},[367,368,369,373,377],"tr",{},[370,371,372],"th",{},"HTTP",[370,374,375],{},[41,376,41],{},[370,378,379],{},"When",[381,382,383,397,412],"tbody",{},[367,384,385,389,394],{},[386,387,388],"td",{},"404",[386,390,391],{},[41,392,393],{},"sensor_not_found",[386,395,396],{},"Wrong id or sensor in another account",[367,398,399,402,407],{},[386,400,401],{},"422",[386,403,404],{},[41,405,406],{},"invalid_range",[386,408,409],{},[41,410,411],{},"ok_min > ok_max",[367,413,414,416,421],{},[386,415,401],{},[386,417,418],{},[41,419,420],{},"grace_too_long",[386,422,423],{},"Grace > 6 h (sanity check; raise on request)",[425,426,427],"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 pre.shiki code .sX7ps, html code.shiki .sX7ps{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}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":43,"searchDepth":72,"depth":72,"links":429},[430,431,432,433,434,435],{"id":31,"depth":62,"text":32},{"id":303,"depth":62,"text":304},{"id":316,"depth":62,"text":317},{"id":328,"depth":62,"text":329},{"id":345,"depth":62,"text":346},{"id":358,"depth":62,"text":359},"Logical inputs on a device, with channels and bounds",null,"md",{},true,"\u002Fapi\u002Fsensors",{"title":5,"description":436},"api\u002Fsensors",270,"2BvQbt2FQqeTZixw-T1D8ddxQTnO4xKgJ0rCsJ2puu8",1779022954145]