[{"data":1,"prerenderedAt":386},["ShallowReactive",2],{"doc-\u002Fintegrations\u002Fhome-assistant":3},{"id":4,"title":5,"body":6,"description":376,"edit":377,"extension":378,"meta":379,"navigation":380,"path":381,"seo":382,"stem":383,"vertical":377,"weight":384,"__hash__":385},"content\u002Fintegrations\u002Fhome-assistant.md","Home Assistant",{"type":7,"value":8,"toc":368},"minimark",[9,13,30,35,44,56,64,144,147,150,157,258,265,308,311,315,335,339,353,361,364],[10,11,12],"p",{},"Home Assistant (HA) is a common upstream of OpenSense for prosumers\nwith their own smart-home setup. Two integration directions:",[14,15,16,24],"ol",{},[17,18,19,23],"li",{},[20,21,22],"strong",{},"HA → OpenSense"," — HA reads sensors (Zigbee, Z-Wave, Matter)\nand forwards readings to OpenSense as the system of record.",[17,25,26,29],{},[20,27,28],{},"OpenSense → HA"," — HA reads measurements from OpenSense's API\nto display on its own dashboard.",[31,32,34],"h2",{"id":33},"ha-opensense-recommended","HA → OpenSense (recommended)",[10,36,37,38,43],{},"This is the path the ",[39,40,42],"a",{"href":41},"\u002Fhardware\u002Faqara-th","Aqara TH"," page walks\nthrough in detail. Summary:",[45,46,47,50,53],"ul",{},[17,48,49],{},"Install Zigbee2MQTT (Z2M) in HA.",[17,51,52],{},"Pair Zigbee sensors through Z2M.",[17,54,55],{},"Configure Z2M to also publish to OpenSense's MQTT bridge.",[10,57,58,59,63],{},"Z2M's ",[60,61,62],"code",{},"configuration.yaml",":",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-yaml shiki shiki-themes github-dark github-dark","mqtt:\n  base_topic: opensense\u002Faqara\n  server: mqtts:\u002F\u002Fmqtt.opensense.murzin.digital:8883\n  user: ''\n  password: '\u003Cingest token from dashboard>'\n  reject_unauthorized: true\n","yaml","",[60,72,73,86,99,110,121,132],{"__ignoreMap":70},[74,75,78,82],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sxg3X","mqtt",[74,83,85],{"class":84},"suv1-",":\n",[74,87,89,92,95],{"class":76,"line":88},2,[74,90,91],{"class":80},"  base_topic",[74,93,94],{"class":84},": ",[74,96,98],{"class":97},"s4wv1","opensense\u002Faqara\n",[74,100,102,105,107],{"class":76,"line":101},3,[74,103,104],{"class":80},"  server",[74,106,94],{"class":84},[74,108,109],{"class":97},"mqtts:\u002F\u002Fmqtt.opensense.murzin.digital:8883\n",[74,111,113,116,118],{"class":76,"line":112},4,[74,114,115],{"class":80},"  user",[74,117,94],{"class":84},[74,119,120],{"class":97},"''\n",[74,122,124,127,129],{"class":76,"line":123},5,[74,125,126],{"class":80},"  password",[74,128,94],{"class":84},[74,130,131],{"class":97},"'\u003Cingest token from dashboard>'\n",[74,133,135,138,140],{"class":76,"line":134},6,[74,136,137],{"class":80},"  reject_unauthorized",[74,139,94],{"class":84},[74,141,143],{"class":142},"s8ozJ","true\n",[10,145,146],{},"OpenSense ingests on the bridge side. Devices auto-create channels\non first message.",[31,148,28],{"id":149},"opensense-ha",[10,151,152,153,156],{},"Configure HA's ",[60,154,155],{},"sensor"," platform with our read API:",[65,158,160],{"className":67,"code":159,"language":69,"meta":70,"style":70},"# configuration.yaml\nsensor:\n  - platform: rest\n    name: cafe_walkin_temp\n    resource: https:\u002F\u002Fapi.opensense.murzin.digital\u002Fv1\u002Fchannels\u002Fchn_a1b2\u002Fmeasurements?limit=1&fn=last\n    headers:\n      Authorization: 'Bearer ua_live_4f3c…'\n    value_template: '{{ value_json.data[0][1] }}'\n    unit_of_measurement: '°C'\n    scan_interval: 60\n",[60,161,162,168,174,187,197,207,214,225,236,247],{"__ignoreMap":70},[74,163,164],{"class":76,"line":77},[74,165,167],{"class":166},"sJ8bj","# configuration.yaml\n",[74,169,170,172],{"class":76,"line":88},[74,171,155],{"class":80},[74,173,85],{"class":84},[74,175,176,179,182,184],{"class":76,"line":101},[74,177,178],{"class":84},"  - ",[74,180,181],{"class":80},"platform",[74,183,94],{"class":84},[74,185,186],{"class":97},"rest\n",[74,188,189,192,194],{"class":76,"line":112},[74,190,191],{"class":80},"    name",[74,193,94],{"class":84},[74,195,196],{"class":97},"cafe_walkin_temp\n",[74,198,199,202,204],{"class":76,"line":123},[74,200,201],{"class":80},"    resource",[74,203,94],{"class":84},[74,205,206],{"class":97},"https:\u002F\u002Fapi.opensense.murzin.digital\u002Fv1\u002Fchannels\u002Fchn_a1b2\u002Fmeasurements?limit=1&fn=last\n",[74,208,209,212],{"class":76,"line":134},[74,210,211],{"class":80},"    headers",[74,213,85],{"class":84},[74,215,217,220,222],{"class":76,"line":216},7,[74,218,219],{"class":80},"      Authorization",[74,221,94],{"class":84},[74,223,224],{"class":97},"'Bearer ua_live_4f3c…'\n",[74,226,228,231,233],{"class":76,"line":227},8,[74,229,230],{"class":80},"    value_template",[74,232,94],{"class":84},[74,234,235],{"class":97},"'{{ value_json.data[0][1] }}'\n",[74,237,239,242,244],{"class":76,"line":238},9,[74,240,241],{"class":80},"    unit_of_measurement",[74,243,94],{"class":84},[74,245,246],{"class":97},"'°C'\n",[74,248,250,253,255],{"class":76,"line":249},10,[74,251,252],{"class":80},"    scan_interval",[74,254,94],{"class":84},[74,256,257],{"class":142},"60\n",[10,259,260,261,264],{},"A ",[60,262,263],{},"ua_live_"," API token with read-only scope is recommended:",[65,266,270],{"className":267,"code":268,"language":269,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark github-dark","curl -X POST https:\u002F\u002Fapi.opensense.murzin.digital\u002Fv1\u002Ftokens \\\n  -H \"Authorization: Bearer ua_live_\u003Cowner>\" \\\n  -d '{\"label\":\"home-assistant\",\"scope\":\"read\"}'\n","bash",[60,271,272,290,300],{"__ignoreMap":70},[74,273,274,278,281,284,287],{"class":76,"line":77},[74,275,277],{"class":276},"sFR8T","curl",[74,279,280],{"class":142}," -X",[74,282,283],{"class":97}," POST",[74,285,286],{"class":97}," https:\u002F\u002Fapi.opensense.murzin.digital\u002Fv1\u002Ftokens",[74,288,289],{"class":142}," \\\n",[74,291,292,295,298],{"class":76,"line":88},[74,293,294],{"class":142},"  -H",[74,296,297],{"class":97}," \"Authorization: Bearer ua_live_\u003Cowner>\"",[74,299,289],{"class":142},[74,301,302,305],{"class":76,"line":101},[74,303,304],{"class":142},"  -d",[74,306,307],{"class":97}," '{\"label\":\"home-assistant\",\"scope\":\"read\"}'\n",[10,309,310],{},"The token gives HA read access only; it cannot modify rules or\ndevices.",[31,312,314],{"id":313},"use-cases","Use cases",[45,316,317,323,329],{},[17,318,319,322],{},[20,320,321],{},"HA as the sensor frontend",", OpenSense as the compliance backend.\nBest for a single small operation that already has HA running.",[17,324,325,328],{},[20,326,327],{},"OpenSense as the alarm source",", HA as the dashboard. HA's\nLovelace dashboards are excellent; if you want a wall-mounted\nfridge thermometer with custom theming, build it in HA, feed it\nfrom OpenSense.",[17,330,331,334],{},[20,332,333],{},"OpenSense for the inspector, HA for fun."," A real customer of\nours does this: HA shows the inside temperature with playful\ngraphs, OpenSense prints the boring PDF.",[31,336,338],{"id":337},"what-we-do-not-do","What we do not do",[45,340,341,347],{},[17,342,343,346],{},[20,344,345],{},"First-class HACS integration."," Today HA reads via the rest\nplatform. We may write a HACS integration if usage justifies it.\nToday it does not.",[17,348,349,352],{},[20,350,351],{},"HA-style entity discovery."," OpenSense does not push entities\ninto HA's MQTT discovery topic. The Z2M path is what makes HA\ndiscover the underlying Zigbee sensors; OpenSense is downstream\nof that.",[31,354,356,357,360],{"id":355},"when-not-to-use-ha","When ",[20,358,359],{},"not"," to use HA",[10,362,363],{},"If the operator does not already run HA, do not install HA just to\nuse OpenSense. The setup overhead is several hours; OpenSense's\ndirect ingest (Shelly H&T over WiFi) is 5 minutes. Add HA when there\nis an HA reason to add HA.",[365,366,367],"style",{},"html pre.shiki code .sxg3X, html code.shiki .sxg3X{--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}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);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}",{"title":70,"searchDepth":101,"depth":101,"links":369},[370,371,372,373,374],{"id":33,"depth":88,"text":34},{"id":149,"depth":88,"text":28},{"id":313,"depth":88,"text":314},{"id":337,"depth":88,"text":338},{"id":355,"depth":88,"text":375},"When not to use HA","Two-way bridge",null,"md",{},true,"\u002Fintegrations\u002Fhome-assistant",{"title":5,"description":376},"integrations\u002Fhome-assistant",640,"ErHUDgx9jR8EyU1CDe06mO4sVNxaQXUw5fEVjkw5-kY",1779022955238]