diff --git a/064d4f6f.79105b8c.js b/064d4f6f.79105b8c.js deleted file mode 100644 index fa91461b8..000000000 --- a/064d4f6f.79105b8c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{64:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return o})),a.d(t,"metadata",(function(){return s})),a.d(t,"toc",(function(){return l})),a.d(t,"default",(function(){return b}));var n=a(3),i=a(7),r=(a(0),a(99)),o={id:"home-assistant",title:"Integration with Home Assistant",sidebar_label:"Home Assistant"},s={unversionedId:"usage/home-assistant",id:"usage/home-assistant",isDocsHomePage:!1,title:"Integration with Home Assistant",description:"The best way to integrate with Home Assistant is to use the official integration.",source:"@site/docs/usage/home-assistant.md",slug:"/usage/home-assistant",permalink:"/frigate/usage/home-assistant",editUrl:"https://github.com/blakeblackshear/frigate/edit/master/docs/docs/usage/home-assistant.md",version:"current",sidebar_label:"Home Assistant",sidebar:"docs",previous:{title:"Advanced",permalink:"/frigate/configuration/advanced"},next:{title:"Web Interface",permalink:"/frigate/usage/web"}},l=[{value:"Installation",id:"installation",children:[]},{value:"Configuration",id:"configuration",children:[]},{value:"Options",id:"options",children:[]},{value:"Entities Provided",id:"entities-provided",children:[]},{value:"Media Browser Support",id:"media-browser-support",children:[]},{value:"API",id:"api",children:[{value:"Notifications",id:"notifications",children:[]}]},{value:"RTMP stream",id:"rtmp-stream",children:[]},{value:"Multiple Instance Support",id:"multiple-instance-support",children:[{value:"Requirements for Multiple Instances",id:"requirements-for-multiple-instances",children:[]}]},{value:"FAQ",id:"faq",children:[{value:"If I am detecting multiple objects, how do I assign the correct binary_sensor to the camera in HomeKit?",id:"if-i-am-detecting-multiple-objects-how-do-i-assign-the-correct-binary_sensor-to-the-camera-in-homekit",children:[]}]}],c={toc:l};function b(e){var t=e.components,a=Object(i.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},c,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"The best way to integrate with Home Assistant is to use the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/blakeblackshear/frigate-hass-integration"}),"official integration"),"."),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("p",null,"Available via HACS as a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://hacs.xyz/docs/faq/custom_repositories"}),"custom repository"),". To install:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Add the custom repository:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"Home Assistant > HACS > Integrations > [...] > Custom Repositories\n")),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Key"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Value"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Repository URL"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://github.com/blakeblackshear/frigate-hass-integration"}),"https://github.com/blakeblackshear/frigate-hass-integration"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Category"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Integration")))),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Use ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://hacs.xyz/"}),"HACS")," to install the integration:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),'Home Assistant > HACS > Integrations > "Explore & Add Integrations" > Frigate\n')),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Restart Home Assistant."),Object(r.b)("li",{parentName:"ul"},"Then add/configure the integration:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"Home Assistant > Configuration > Integrations > Add Integration > Frigate\n")),Object(r.b)("p",null,"Note: You will also need\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/media_source/"}),"media_source")," enabled\nin your Home Assistant configuration for the Media Browser to appear."),Object(r.b)("h2",{id:"configuration"},"Configuration"),Object(r.b)("p",null,"When configuring the integration, you will be asked for the following parameters:"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Variable"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"URL"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The ",Object(r.b)("inlineCode",{parentName:"td"},"URL")," of your frigate instance, the URL you use to access Frigate in the browser. This may look like ",Object(r.b)("inlineCode",{parentName:"td"},"http://:5000/"),". If you are using HassOS with the addon, the URL should be ",Object(r.b)("inlineCode",{parentName:"td"},"http://ccab4aaf-frigate:5000")," (or ",Object(r.b)("inlineCode",{parentName:"td"},"http://ccab4aaf-frigate-beta:5000")," if your are using the beta version of the addon). Live streams required port 1935, see ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"#streams"}),"RTMP streams"))))),Object(r.b)("a",{name:"options"}),Object(r.b)("h2",{id:"options"},"Options"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"Home Assistant > Configuration > Integrations > Frigate > Options\n")),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Option"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"RTMP URL Template"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"A ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://jinja.palletsprojects.com/"}),"jinja2")," template that is used to override the standard RTMP stream URL (e.g. for use with reverse proxies). This option is only shown to users who have ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://www.home-assistant.io/blog/2019/07/17/release-96/#advanced-mode"}),"advanced mode")," enabled. See ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"#streams"}),"RTMP streams")," below.")))),Object(r.b)("h2",{id:"entities-provided"},"Entities Provided"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Platform"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"camera")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Live camera stream (requires RTMP), camera for image of the last detected object.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"sensor")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"States to monitor Frigate performance, object counts for all zones and cameras.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"switch")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Switch entities to toggle detection, clips and snapshots.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"binary_sensor")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),'A "motion" binary sensor entity per camera/zone/object.')))),Object(r.b)("h2",{id:"media-browser-support"},"Media Browser Support"),Object(r.b)("p",null,"The integration provides:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Rich UI with thumbnails for browsing event clips"),Object(r.b)("li",{parentName:"ul"},"Rich UI for browsing 24/7 recordings by month, day, camera, time")),Object(r.b)("p",null,'This is accessible via "Media Browser" on the left menu panel in Home Assistant.'),Object(r.b)("a",{name:"api"}),Object(r.b)("h2",{id:"api"},"API"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Notification API with public facing endpoints for images in notifications")),Object(r.b)("h3",{id:"notifications"},"Notifications"),Object(r.b)("p",null,"Frigate publishes event information in the form of a change feed via MQTT. This\nallows lots of customization for notifications to meet your needs. Event changes\nare published with ",Object(r.b)("inlineCode",{parentName:"p"},"before")," and ",Object(r.b)("inlineCode",{parentName:"p"},"after")," information as shown\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#frigateevents"}),"here"),". Note that some people may not want to expose frigate to\nthe web, so you can leverage the HA API that frigate custom_integration ties\ninto (which is exposed to the web, and thus can be used for mobile notifications\netc):"),Object(r.b)("p",null,"To load an image taken by frigate from Home Assistants API see below:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate/notifications//thumbnail.jpg\n")),Object(r.b)("p",null,"To load a video clip taken by frigate from Home Assistants API :"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate/notifications///clip.mp4\n")),Object(r.b)("p",null,'Here is a simple example of a notification automation of events which will update the existing notification for each change. This means the image you see in the notification will update as frigate finds a "better" image.'),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'automation:\n - alias: Notify of events\n trigger:\n platform: mqtt\n topic: frigate/events\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \'A {{trigger.payload_json["after"]["label"]}} was detected.\'\n data:\n image: \'https://your.public.hass.address.com/api/frigate/notifications/{{trigger.payload_json["after"]["id"]}}/thumbnail.jpg?format=android\'\n tag: \'{{trigger.payload_json["after"]["id"]}}\'\n when: \'{{trigger.payload_json["after"]["start_time"]|int}}\'\n')),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"automation:\n - alias: When a person enters a zone named yard\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'person' }}\"\n - \"{{ 'yard' in trigger.payload_json['after']['entered_zones'] }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"A {{trigger.payload_json['after']['label']}} has entered the yard.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"- alias: When a person leaves a zone named yard\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'person' }}\"\n - \"{{ 'yard' in trigger.payload_json['before']['current_zones'] }}\"\n - \"{{ not 'yard' in trigger.payload_json['after']['current_zones'] }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"A {{trigger.payload_json['after']['label']}} has left the yard.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"- alias: Notify for dogs in the front with a high top score\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'dog' }}\"\n - \"{{ trigger.payload_json['after']['camera'] == 'front' }}\"\n - \"{{ trigger.payload_json['after']['top_score'] > 0.98 }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"High confidence dog detection.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("p",null,"If you are using telegram, you can fetch the image directly from Frigate:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'automation:\n - alias: Notify of events\n trigger:\n platform: mqtt\n topic: frigate/events\n action:\n - service: notify.telegram_full\n data_template:\n message: \'A {{trigger.payload_json["after"]["label"]}} was detected.\'\n data:\n photo:\n # this url should work for addon users\n - url: \'http://ccab4aaf-frigate:5000/api/events/{{trigger.payload_json["after"]["id"]}}/thumbnail.jpg\'\n caption: \'A {{trigger.payload_json["after"]["label"]}} was detected on {{ trigger.payload_json["after"]["camera"] }} camera\'\n')),Object(r.b)("a",{name:"streams"}),Object(r.b)("h2",{id:"rtmp-stream"},"RTMP stream"),Object(r.b)("p",null,"In order for the live streams to function they need to be accessible on the RTMP\nport (default: ",Object(r.b)("inlineCode",{parentName:"p"},"1935"),") at ",Object(r.b)("inlineCode",{parentName:"p"},":1935"),". Home Assistant will directly\nconnect to that streaming port when the live camera is viewed."),Object(r.b)("h4",{id:"rtmp-url-template"},"RTMP URL Template"),Object(r.b)("p",null,"For advanced usecases, this behavior can be changed with the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#options"}),"RTMP URL\ntemplate")," option. When set, this string will override the default stream\naddress that is derived from the default behavior described above. This option supports\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://jinja.palletsprojects.com/"}),"jinja2 templates")," and has the ",Object(r.b)("inlineCode",{parentName:"p"},"camera")," dict\nvariables from ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://blakeblackshear.github.io/frigate/usage/api#apiconfig"}),"Frigate API"),"\navailable for the template. Note that no Home Assistant state is available to the\ntemplate, only the camera dict from Frigate."),Object(r.b)("p",null,"This is potentially useful when Frigate is behind a reverse proxy, and/or when\nthe default stream port is otherwise not accessible to Home Assistant (e.g.\nfirewall rules)."),Object(r.b)("h6",{id:"rtmp-url-template-examples"},"RTMP URL Template Examples"),Object(r.b)("p",null,"Use a different port number:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/front_door\n")),Object(r.b)("p",null,"Use the camera name in the stream URL:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/{{ name }}\n")),Object(r.b)("p",null,"Use the camera name in the stream URL, converting it to lowercase first:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/{{ name|lower }}\n")),Object(r.b)("h2",{id:"multiple-instance-support"},"Multiple Instance Support"),Object(r.b)("p",null,"The Frigate integration seamlessly supports the use of multiple Frigate servers."),Object(r.b)("h3",{id:"requirements-for-multiple-instances"},"Requirements for Multiple Instances"),Object(r.b)("p",null,"In order for multiple Frigate instances to function correctly, the\n",Object(r.b)("inlineCode",{parentName:"p"},"topic_prefix")," and ",Object(r.b)("inlineCode",{parentName:"p"},"client_id")," parameters must be set differently per server.\nSee ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://blakeblackshear.github.io/frigate/configuration/index#mqtt"}),"MQTT\nconfiguration"),"\nfor how to set these."),Object(r.b)("h4",{id:"api-urls"},"API URLs"),Object(r.b)("p",null,"When multiple Frigate instances are configured, ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#api"}),"API")," URLs should include an\nidentifier to tell Home Assistant which Frigate instance to refer to. The\nidentifier used is the MQTT ",Object(r.b)("inlineCode",{parentName:"p"},"client_id")," paremeter included in the configuration,\nand is used like so:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate//notifications//thumbnail.jpg\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate//clips/front_door-1624599978.427826-976jaa.mp4\n")),Object(r.b)("h4",{id:"default-treatment"},"Default Treatment"),Object(r.b)("p",null,"When a single Frigate instance is configured, the ",Object(r.b)("inlineCode",{parentName:"p"},"client-id")," parameter need not\nbe specified in URLs/identifiers -- that single instance is assumed. When\nmultiple Frigate instances are configured, the user ",Object(r.b)("strong",{parentName:"p"},"must")," explicitly specify\nwhich server they are referring to."),Object(r.b)("h2",{id:"faq"},"FAQ"),Object(r.b)("h3",{id:"if-i-am-detecting-multiple-objects-how-do-i-assign-the-correct-binary_sensor-to-the-camera-in-homekit"},"If I am detecting multiple objects, how do I assign the correct ",Object(r.b)("inlineCode",{parentName:"h3"},"binary_sensor")," to the camera in HomeKit?"),Object(r.b)("p",null,"The ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/homekit/"}),"HomeKit integration")," randomly links one of the binary sensors (motion sensor entities) grouped with the camera device in Home Assistant. You can specify a ",Object(r.b)("inlineCode",{parentName:"p"},"linked_motion_sensor")," in the Home Assistant ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/homekit/#linked_motion_sensor"}),"HomeKit configuration")," for each camera."))}b.isMDXComponent=!0},99:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return u}));var n=a(0),i=a.n(n);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var c=i.a.createContext({}),b=function(e){var t=i.a.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},p=function(e){var t=b(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=b(a),d=n,u=p["".concat(o,".").concat(d)]||p[d]||m[d]||r;return a?i.a.createElement(u,s(s({ref:t},c),{},{components:a})):i.a.createElement(u,s({ref:t},c))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,o=new Array(r);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,o[1]=s;for(var c=2;cbinary_sensor to the camera in HomeKit?",id:"if-i-am-detecting-multiple-objects-how-do-i-assign-the-correct-binary_sensor-to-the-camera-in-homekit",children:[]}]}],c={toc:l};function b(e){var t=e.components,a=Object(i.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},c,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"The best way to integrate with Home Assistant is to use the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/blakeblackshear/frigate-hass-integration"}),"official integration"),"."),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("h3",{id:"preparation"},"Preparation"),Object(r.b)("p",null,"The Frigate integration requires the ",Object(r.b)("inlineCode",{parentName:"p"},"mqtt")," integration to be installed and\nmanually configured first."),Object(r.b)("p",null,"See the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/mqtt/"}),"MQTT integration\ndocumentation")," for more\ndetails."),Object(r.b)("h3",{id:"integration-installation"},"Integration installation"),Object(r.b)("p",null,"Available via HACS as a default repository. To install:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Use ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://hacs.xyz/"}),"HACS")," to install the integration:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),'Home Assistant > HACS > Integrations > "Explore & Add Integrations" > Frigate\n')),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Restart Home Assistant."),Object(r.b)("li",{parentName:"ul"},"Then add/configure the integration:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"Home Assistant > Configuration > Integrations > Add Integration > Frigate\n")),Object(r.b)("p",null,"Note: You will also need\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/media_source/"}),"media_source")," enabled\nin your Home Assistant configuration for the Media Browser to appear."),Object(r.b)("h3",{id:"optional-lovelace-card-installation"},"(Optional) Lovelace Card Installation"),Object(r.b)("p",null,"To install the optional companion Lovelace card, please see the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/dermotduffy/frigate-hass-card"}),"separate\ninstallation instructions")," for\nthat card."),Object(r.b)("h2",{id:"configuration"},"Configuration"),Object(r.b)("p",null,"When configuring the integration, you will be asked for the following parameters:"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Variable"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"URL"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The ",Object(r.b)("inlineCode",{parentName:"td"},"URL")," of your frigate instance, the URL you use to access Frigate in the browser. This may look like ",Object(r.b)("inlineCode",{parentName:"td"},"http://:5000/"),". If you are using HassOS with the addon, the URL should be ",Object(r.b)("inlineCode",{parentName:"td"},"http://ccab4aaf-frigate:5000")," (or ",Object(r.b)("inlineCode",{parentName:"td"},"http://ccab4aaf-frigate-beta:5000")," if your are using the beta version of the addon). Live streams required port 1935, see ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"#streams"}),"RTMP streams"))))),Object(r.b)("a",{name:"options"}),Object(r.b)("h2",{id:"options"},"Options"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"Home Assistant > Configuration > Integrations > Frigate > Options\n")),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Option"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"RTMP URL Template"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"A ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://jinja.palletsprojects.com/"}),"jinja2")," template that is used to override the standard RTMP stream URL (e.g. for use with reverse proxies). This option is only shown to users who have ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://www.home-assistant.io/blog/2019/07/17/release-96/#advanced-mode"}),"advanced mode")," enabled. See ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"#streams"}),"RTMP streams")," below.")))),Object(r.b)("h2",{id:"entities-provided"},"Entities Provided"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Platform"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"camera")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Live camera stream (requires RTMP), camera for image of the last detected object.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"sensor")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"States to monitor Frigate performance, object counts for all zones and cameras.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"switch")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Switch entities to toggle detection, clips and snapshots.")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"binary_sensor")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),'A "motion" binary sensor entity per camera/zone/object.')))),Object(r.b)("h2",{id:"media-browser-support"},"Media Browser Support"),Object(r.b)("p",null,"The integration provides:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Rich UI with thumbnails for browsing event clips"),Object(r.b)("li",{parentName:"ul"},"Rich UI for browsing 24/7 recordings by month, day, camera, time")),Object(r.b)("p",null,'This is accessible via "Media Browser" on the left menu panel in Home Assistant.'),Object(r.b)("a",{name:"api"}),Object(r.b)("h2",{id:"api"},"API"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Notification API with public facing endpoints for images in notifications")),Object(r.b)("h3",{id:"notifications"},"Notifications"),Object(r.b)("p",null,"Frigate publishes event information in the form of a change feed via MQTT. This\nallows lots of customization for notifications to meet your needs. Event changes\nare published with ",Object(r.b)("inlineCode",{parentName:"p"},"before")," and ",Object(r.b)("inlineCode",{parentName:"p"},"after")," information as shown\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#frigateevents"}),"here"),". Note that some people may not want to expose frigate to\nthe web, so you can leverage the HA API that frigate custom_integration ties\ninto (which is exposed to the web, and thus can be used for mobile notifications\netc):"),Object(r.b)("p",null,"To load an image taken by frigate from Home Assistants API see below:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate/notifications//thumbnail.jpg\n")),Object(r.b)("p",null,"To load a video clip taken by frigate from Home Assistants API :"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate/notifications///clip.mp4\n")),Object(r.b)("p",null,'Here is a simple example of a notification automation of events which will update the existing notification for each change. This means the image you see in the notification will update as frigate finds a "better" image.'),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'automation:\n - alias: Notify of events\n trigger:\n platform: mqtt\n topic: frigate/events\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \'A {{trigger.payload_json["after"]["label"]}} was detected.\'\n data:\n image: \'https://your.public.hass.address.com/api/frigate/notifications/{{trigger.payload_json["after"]["id"]}}/thumbnail.jpg?format=android\'\n tag: \'{{trigger.payload_json["after"]["id"]}}\'\n when: \'{{trigger.payload_json["after"]["start_time"]|int}}\'\n')),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"automation:\n - alias: When a person enters a zone named yard\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'person' }}\"\n - \"{{ 'yard' in trigger.payload_json['after']['entered_zones'] }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"A {{trigger.payload_json['after']['label']}} has entered the yard.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"- alias: When a person leaves a zone named yard\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'person' }}\"\n - \"{{ 'yard' in trigger.payload_json['before']['current_zones'] }}\"\n - \"{{ not 'yard' in trigger.payload_json['after']['current_zones'] }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"A {{trigger.payload_json['after']['label']}} has left the yard.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"- alias: Notify for dogs in the front with a high top score\n trigger:\n platform: mqtt\n topic: frigate/events\n condition:\n - \"{{ trigger.payload_json['after']['label'] == 'dog' }}\"\n - \"{{ trigger.payload_json['after']['camera'] == 'front' }}\"\n - \"{{ trigger.payload_json['after']['top_score'] > 0.98 }}\"\n action:\n - service: notify.mobile_app_pixel_3\n data_template:\n message: \"High confidence dog detection.\"\n data:\n image: \"https://url.com/api/frigate/notifications/{{trigger.payload_json['after']['id']}}/thumbnail.jpg\"\n tag: \"{{trigger.payload_json['after']['id']}}\"\n when: '{{trigger.payload_json[\"after\"][\"start_time\"]|int}}'\n")),Object(r.b)("p",null,"If you are using telegram, you can fetch the image directly from Frigate:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'automation:\n - alias: Notify of events\n trigger:\n platform: mqtt\n topic: frigate/events\n action:\n - service: notify.telegram_full\n data_template:\n message: \'A {{trigger.payload_json["after"]["label"]}} was detected.\'\n data:\n photo:\n # this url should work for addon users\n - url: \'http://ccab4aaf-frigate:5000/api/events/{{trigger.payload_json["after"]["id"]}}/thumbnail.jpg\'\n caption: \'A {{trigger.payload_json["after"]["label"]}} was detected on {{ trigger.payload_json["after"]["camera"] }} camera\'\n')),Object(r.b)("a",{name:"streams"}),Object(r.b)("h2",{id:"rtmp-stream"},"RTMP stream"),Object(r.b)("p",null,"In order for the live streams to function they need to be accessible on the RTMP\nport (default: ",Object(r.b)("inlineCode",{parentName:"p"},"1935"),") at ",Object(r.b)("inlineCode",{parentName:"p"},":1935"),". Home Assistant will directly\nconnect to that streaming port when the live camera is viewed."),Object(r.b)("h4",{id:"rtmp-url-template"},"RTMP URL Template"),Object(r.b)("p",null,"For advanced usecases, this behavior can be changed with the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#options"}),"RTMP URL\ntemplate")," option. When set, this string will override the default stream\naddress that is derived from the default behavior described above. This option supports\n",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://jinja.palletsprojects.com/"}),"jinja2 templates")," and has the ",Object(r.b)("inlineCode",{parentName:"p"},"camera")," dict\nvariables from ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://blakeblackshear.github.io/frigate/usage/api#apiconfig"}),"Frigate API"),"\navailable for the template. Note that no Home Assistant state is available to the\ntemplate, only the camera dict from Frigate."),Object(r.b)("p",null,"This is potentially useful when Frigate is behind a reverse proxy, and/or when\nthe default stream port is otherwise not accessible to Home Assistant (e.g.\nfirewall rules)."),Object(r.b)("h6",{id:"rtmp-url-template-examples"},"RTMP URL Template Examples"),Object(r.b)("p",null,"Use a different port number:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/front_door\n")),Object(r.b)("p",null,"Use the camera name in the stream URL:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/{{ name }}\n")),Object(r.b)("p",null,"Use the camera name in the stream URL, converting it to lowercase first:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"rtmp://:2000/live/{{ name|lower }}\n")),Object(r.b)("h2",{id:"multiple-instance-support"},"Multiple Instance Support"),Object(r.b)("p",null,"The Frigate integration seamlessly supports the use of multiple Frigate servers."),Object(r.b)("h3",{id:"requirements-for-multiple-instances"},"Requirements for Multiple Instances"),Object(r.b)("p",null,"In order for multiple Frigate instances to function correctly, the\n",Object(r.b)("inlineCode",{parentName:"p"},"topic_prefix")," and ",Object(r.b)("inlineCode",{parentName:"p"},"client_id")," parameters must be set differently per server.\nSee ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://blakeblackshear.github.io/frigate/configuration/index#mqtt"}),"MQTT\nconfiguration"),"\nfor how to set these."),Object(r.b)("h4",{id:"api-urls"},"API URLs"),Object(r.b)("p",null,"When multiple Frigate instances are configured, ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"#api"}),"API")," URLs should include an\nidentifier to tell Home Assistant which Frigate instance to refer to. The\nidentifier used is the MQTT ",Object(r.b)("inlineCode",{parentName:"p"},"client_id")," paremeter included in the configuration,\nand is used like so:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate//notifications//thumbnail.jpg\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{}),"https://HA_URL/api/frigate//clips/front_door-1624599978.427826-976jaa.mp4\n")),Object(r.b)("h4",{id:"default-treatment"},"Default Treatment"),Object(r.b)("p",null,"When a single Frigate instance is configured, the ",Object(r.b)("inlineCode",{parentName:"p"},"client-id")," parameter need not\nbe specified in URLs/identifiers -- that single instance is assumed. When\nmultiple Frigate instances are configured, the user ",Object(r.b)("strong",{parentName:"p"},"must")," explicitly specify\nwhich server they are referring to."),Object(r.b)("h2",{id:"faq"},"FAQ"),Object(r.b)("h3",{id:"if-i-am-detecting-multiple-objects-how-do-i-assign-the-correct-binary_sensor-to-the-camera-in-homekit"},"If I am detecting multiple objects, how do I assign the correct ",Object(r.b)("inlineCode",{parentName:"h3"},"binary_sensor")," to the camera in HomeKit?"),Object(r.b)("p",null,"The ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/homekit/"}),"HomeKit integration")," randomly links one of the binary sensors (motion sensor entities) grouped with the camera device in Home Assistant. You can specify a ",Object(r.b)("inlineCode",{parentName:"p"},"linked_motion_sensor")," in the Home Assistant ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.home-assistant.io/integrations/homekit/#linked_motion_sensor"}),"HomeKit configuration")," for each camera."))}b.isMDXComponent=!0},99:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return u}));var n=a(0),i=a.n(n);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var c=i.a.createContext({}),b=function(e){var t=i.a.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},p=function(e){var t=b(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},m=i.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=b(a),m=n,u=p["".concat(o,".").concat(m)]||p[m]||d[m]||r;return a?i.a.createElement(u,s(s({ref:t},c),{},{components:a})):i.a.createElement(u,s({ref:t},c))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,o=new Array(r);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,o[1]=s;for(var c=2;c Page Not Found | Frigate - + @@ -20,7 +20,7 @@

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + diff --git a/configuration/advanced/index.html b/configuration/advanced/index.html index ddeb410ec..8e91f2d0b 100644 --- a/configuration/advanced/index.html +++ b/configuration/advanced/index.html @@ -8,7 +8,7 @@ Advanced | Frigate - + @@ -22,7 +22,7 @@

Advanced

Advanced configuration#

motion#

Global motion detection config. These may also be defined at the camera level.

motion:
# Optional: The threshold passed to cv2.threshold to determine if a pixel is different enough to be counted as motion. (default: shown below)
# Increasing this value will make motion detection less sensitive and decreasing it will make motion detection more sensitive.
# The value should be between 1 and 255.
threshold: 25
# Optional: Minimum size in pixels in the resized motion image that counts as motion
# Increasing this value will prevent smaller areas of motion from being detected. Decreasing will make motion detection more sensitive to smaller
# moving objects.
contour_area: 100
# Optional: Alpha value passed to cv2.accumulateWeighted when averaging the motion delta across multiple frames (default: shown below)
# Higher values mean the current frame impacts the delta a lot, and a single raindrop may register as motion.
# Too low and a fast moving person wont be detected as motion.
delta_alpha: 0.2
# Optional: Alpha value passed to cv2.accumulateWeighted when averaging frames to determine the background (default: shown below)
# Higher values mean the current frame impacts the average a lot, and a new object will be averaged into the background faster.
# Low values will cause things like moving shadows to be detected as motion for longer.
# https://www.geeksforgeeks.org/background-subtraction-in-an-image-using-concept-of-running-average/
frame_alpha: 0.2
# Optional: Height of the resized motion frame (default: 1/6th of the original frame height)
# This operates as an efficient blur alternative. Higher values will result in more granular motion detection at the expense of higher CPU usage.
# Lower values result in less CPU, but small changes may not register as motion.
frame_height: 180

detect#

Global object detection settings. These may also be defined at the camera level.

detect:
# Optional: Number of frames without a detection before frigate considers an object to be gone. (default: 5x the frame rate)
max_disappeared: 25

logger#

Change the default log level for troubleshooting purposes.

logger:
# Optional: default log level (default: shown below)
default: info
# Optional: module by module log level configuration
logs:
frigate.mqtt: error

Available log levels are: debug, info, warning, error, critical

Examples of available modules are:

  • frigate.app
  • frigate.mqtt
  • frigate.edgetpu
  • frigate.zeroconf
  • detector.<detector_name>
  • watchdog.<camera_name>
  • ffmpeg.<camera_name>.<sorted_roles> NOTE: All FFmpeg logs are sent as error level.

environment_vars#

This section can be used to set environment variables for those unable to modify the environment of the container (ie. within Hass.io)

environment_vars:
EXAMPLE_VAR: value

database#

Event and clip information is managed in a sqlite database at /media/frigate/clips/frigate.db. If that database is deleted, clips will be orphaned and will need to be cleaned up manually. They also won't show up in the Media Browser within Home Assistant.

If you are storing your clips on a network share (SMB, NFS, etc), you may get a database is locked error message on startup. You can customize the location of the database in the config if necessary.

This may need to be in a custom location if network storage is used for clips.

database:
path: /media/frigate/clips/frigate.db

detectors#

detectors:
# Required: name of the detector
coral:
# Required: type of the detector
# Valid values are 'edgetpu' (requires device property below) and 'cpu'.
type: edgetpu
# Optional: device name as defined here: https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api
device: usb
# Optional: num_threads value passed to the tflite.Interpreter (default: shown below)
# This value is only used for CPU types
num_threads: 3

model#

model:
# Required: height of the trained model
height: 320
# Required: width of the trained model
width: 320
- + diff --git a/configuration/cameras/index.html b/configuration/cameras/index.html index 1118cd117..06d1720e5 100644 --- a/configuration/cameras/index.html +++ b/configuration/cameras/index.html @@ -8,7 +8,7 @@ Cameras | Frigate - + @@ -33,7 +33,7 @@
# Optional: Configuration for the jpg snapshots published via MQTT
mqtt:
# Optional: Enable publishing snapshot via mqtt for camera (default: shown below)
# NOTE: Only applies to publishing image data to MQTT via 'frigate/<camera_name>/<object_name>/snapshot'.
# All other messages will still be published.
enabled: True
# Optional: print a timestamp on the snapshots (default: shown below)
timestamp: True
# Optional: draw bounding box on the snapshots (default: shown below)
bounding_box: True
# Optional: crop the snapshot (default: shown below)
crop: True
# Optional: height to resize the snapshot to (default: shown below)
height: 270
# Optional: Restrict mqtt messages to objects that entered any of the listed zones (default: no required zones)
required_zones: []
# Optional: Camera level object filters config.
objects:
track:
- person
- car
# Optional: mask to prevent all object types from being detected in certain areas (default: no mask)
# Checks based on the bottom center of the bounding box of the object.
# NOTE: This mask is COMBINED with the object type specific mask below
mask: 0,0,1000,0,1000,200,0,200
filters:
person:
min_area: 5000
max_area: 100000
min_score: 0.5
threshold: 0.7
# Optional: mask to prevent this object type from being detected in certain areas (default: no mask)
# Checks based on the bottom center of the bounding box of the object
mask: 0,0,1000,0,1000,200,0,200

Camera specific configuration#

MJPEG Cameras#

The input and output parameters need to be adjusted for MJPEG cameras

input_args:
- -avoid_negative_ts
- make_zero
- -fflags
- nobuffer
- -flags
- low_delay
- -strict
- experimental
- -fflags
- +genpts+discardcorrupt
- -r
- "3" # <---- adjust depending on your desired frame rate from the mjpeg image
- -use_wallclock_as_timestamps
- "1"

Note that mjpeg cameras require encoding the video into h264 for clips, recording, and rtmp roles. This will use significantly more CPU than if the cameras supported h264 feeds directly.

output_args:
record: -f segment -segment_time 60 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c:v libx264 -an
clips: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c:v libx264 -an
rtmp: -c:v libx264 -an -f flv

RTMP Cameras#

The input parameters need to be adjusted for RTMP cameras

ffmpeg:
input_args:
- -avoid_negative_ts
- make_zero
- -fflags
- nobuffer
- -flags
- low_delay
- -strict
- experimental
- -fflags
- +genpts+discardcorrupt
- -use_wallclock_as_timestamps
- "1"

Reolink 410/520 (possibly others)#

Several users have reported success with the rtmp video from Reolink cameras.

ffmpeg:
input_args:
- -avoid_negative_ts
- make_zero
- -fflags
- nobuffer
- -flags
- low_delay
- -strict
- experimental
- -fflags
- +genpts+discardcorrupt
- -rw_timeout
- "5000000"
- -use_wallclock_as_timestamps
- "1"

Blue Iris RTSP Cameras#

You will need to remove nobuffer flag for Blue Iris RTSP cameras

ffmpeg:
input_args:
- -avoid_negative_ts
- make_zero
- -flags
- low_delay
- -strict
- experimental
- -fflags
- +genpts+discardcorrupt
- -rtsp_transport
- tcp
- -stimeout
- "5000000"
- -use_wallclock_as_timestamps
- "1"
- + diff --git a/configuration/detectors/index.html b/configuration/detectors/index.html index 5ea0a5cae..0b2b66430 100644 --- a/configuration/detectors/index.html +++ b/configuration/detectors/index.html @@ -8,7 +8,7 @@ Detectors | Frigate - + @@ -22,7 +22,7 @@

Detectors

The default config will look for a USB Coral device. If you do not have a Coral, you will need to configure a CPU detector. If you have PCI or multiple Coral devices, you need to configure your detector devices in the config file. When using multiple detectors, they run in dedicated processes, but pull from a common queue of requested detections across all cameras.

Frigate supports edgetpu and cpu as detector types. The device value should be specified according to the Documentation for the TensorFlow Lite Python API.

Note: There is no support for Nvidia GPUs to perform object detection with tensorflow. It can be used for ffmpeg decoding, but not object detection.

Single USB Coral:

detectors:
coral:
type: edgetpu
device: usb

Multiple USB Corals:

detectors:
coral1:
type: edgetpu
device: usb:0
coral2:
type: edgetpu
device: usb:1

Native Coral (Dev Board):

detectors:
coral:
type: edgetpu
device: ''

Multiple PCIE/M.2 Corals:

detectors:
coral1:
type: edgetpu
device: pci:0
coral2:
type: edgetpu
device: pci:1

Mixing Corals:

detectors:
coral_usb:
type: edgetpu
device: usb
coral_pci:
type: edgetpu
device: pci

CPU Detectors (not recommended):

detectors:
cpu1:
type: cpu
cpu2:
type: cpu
- + diff --git a/configuration/false_positives/index.html b/configuration/false_positives/index.html index 9d322fe5b..bafa7f9e9 100644 --- a/configuration/false_positives/index.html +++ b/configuration/false_positives/index.html @@ -8,7 +8,7 @@ Reducing false positives | Frigate - + @@ -22,7 +22,7 @@

Reducing false positives

Tune your object filters to adjust false positives: min_area, max_area, min_score, threshold.

For object filters in your configuration, any single detection below min_score will be ignored as a false positive. threshold is based on the median of the history of scores (padded to 3 values) for a tracked object. Consider the following frames when min_score is set to 0.6 and threshold is set to 0.85:

FrameCurrent ScoreScore HistoryComputed ScoreDetected Object
10.70.0, 0, 0.70.0No
20.550.0, 0.7, 0.00.0No
30.850.7, 0.0, 0.850.7No
40.900.7, 0.85, 0.95, 0.900.875Yes
50.880.7, 0.85, 0.95, 0.90, 0.880.88Yes
60.950.7, 0.85, 0.95, 0.90, 0.88, 0.950.89Yes

In frame 2, the score is below the min_score value, so frigate ignores it and it becomes a 0.0. The computed score is the median of the score history (padding to at least 3 values), and only when that computed score crosses the threshold is the object marked as a true positive. That happens in frame 4 in the example.

- + diff --git a/configuration/index/index.html b/configuration/index/index.html index 351508df3..776417cb6 100644 --- a/configuration/index/index.html +++ b/configuration/index/index.html @@ -8,7 +8,7 @@ Configuration | Frigate - + @@ -22,7 +22,7 @@

Configuration

For HassOS installations, the default location for the config file is /config/frigate.yml.

For all other installations, the default location for the config file is '/config/config.yml'. This can be overridden with the CONFIG_FILE environment variable. Camera specific ffmpeg parameters are documented here.

It is recommended to start with a minimal configuration and add to it:

mqtt:
host: mqtt.server.com
cameras:
back:
ffmpeg:
inputs:
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
roles:
- detect
- rtmp
width: 1280
height: 720
fps: 5

Required#

mqtt#

mqtt:
# Required: host name
host: mqtt.server.com
# Optional: port (default: shown below)
port: 1883
# Optional: topic prefix (default: shown below)
# WARNING: must be unique if you are running multiple instances
topic_prefix: frigate
# Optional: client id (default: shown below)
# WARNING: must be unique if you are running multiple instances
client_id: frigate
# Optional: user
user: mqtt_user
# Optional: password
# NOTE: Environment variables that begin with 'FRIGATE_' may be referenced in {}.
# eg. password: '{FRIGATE_MQTT_PASSWORD}'
password: password
# Optional: interval in seconds for publishing stats (default: shown below)
stats_interval: 60

cameras#

Each of your cameras must be configured. The following is the minimum required to register a camera in Frigate. Check the camera configuration page for a complete list of options.

cameras:
# Name of your camera
front_door:
ffmpeg:
inputs:
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
roles:
- detect
- rtmp
width: 1280
height: 720
fps: 5

Optional#

clips#

clips:
# Optional: Maximum length of time to retain video during long events. (default: shown below)
# NOTE: If an object is being tracked for longer than this amount of time, the cache
# will begin to expire and the resulting clip will be the last x seconds of the event.
max_seconds: 300
# Optional: size of tmpfs mount to create for cache files (default: not set)
# mount -t tmpfs -o size={tmpfs_cache_size} tmpfs /tmp/cache
# NOTICE: Addon users must have Protection mode disabled for the addon when using this setting.
# Also, if you have mounted a tmpfs volume through docker, this value should not be set in your config.
tmpfs_cache_size: 256m
# Optional: Retention settings for clips (default: shown below)
retain:
# Required: Default retention days (default: shown below)
default: 10
# Optional: Per object retention days
objects:
person: 15

ffmpeg#

ffmpeg:
# Optional: global ffmpeg args (default: shown below)
global_args: -hide_banner -loglevel warning
# Optional: global hwaccel args (default: shown below)
# NOTE: See hardware acceleration docs for your specific device
hwaccel_args: []
# Optional: global input args (default: shown below)
input_args: -avoid_negative_ts make_zero -fflags +genpts+discardcorrupt -rtsp_transport tcp -stimeout 5000000 -use_wallclock_as_timestamps 1
# Optional: global output args
output_args:
# Optional: output args for detect streams (default: shown below)
detect: -f rawvideo -pix_fmt yuv420p
# Optional: output args for record streams (default: shown below)
record: -f segment -segment_time 60 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an
# Optional: output args for clips streams (default: shown below)
clips: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an
# Optional: output args for rtmp streams (default: shown below)
rtmp: -c copy -f flv

objects#

Can be overridden at the camera level. For a list of available objects, see the objects documentation.

objects:
# Optional: list of objects to track from labelmap.txt (default: shown below)
track:
- person
# Optional: filters to reduce false positives for specific object types
filters:
person:
# Optional: minimum width*height of the bounding box for the detected object (default: 0)
min_area: 5000
# Optional: maximum width*height of the bounding box for the detected object (default: 24000000)
max_area: 100000
# Optional: minimum score for the object to initiate tracking (default: shown below)
min_score: 0.5
# Optional: minimum decimal percentage for tracked object's computed score to be considered a true positive (default: shown below)
threshold: 0.7

record#

Can be overridden at the camera level. 24/7 recordings can be enabled and are stored at /media/frigate/recordings. The folder structure for the recordings is YYYY-MM/DD/HH/<camera_name>/MM.SS.mp4. These recordings are written directly from your camera stream without re-encoding and are available in Home Assistant's media browser. Each camera supports a configurable retention policy in the config.

caution

Previous versions of frigate included -vsync drop in input parameters. This is not compatible with FFmpeg's segment feature and must be removed from your input parameters if you have overrides set.

record:
# Optional: Enable recording
enabled: False
# Optional: Number of days to retain
retain_days: 30
- + diff --git a/configuration/nvdec/index.html b/configuration/nvdec/index.html index a4488377b..05e932d45 100644 --- a/configuration/nvdec/index.html +++ b/configuration/nvdec/index.html @@ -8,7 +8,7 @@ nVidia hardware decoder | Frigate - + @@ -35,7 +35,7 @@ processes:

using the fps filter:

output_args:
- -filter:v
- fps=fps=5

This setting, for example, allows Frigate to consume my 10-15fps camera streams on my relatively low powered Haswell machine with relatively low cpu usage.

- + diff --git a/configuration/objects/index.html b/configuration/objects/index.html index ff79dcc35..639de411b 100644 --- a/configuration/objects/index.html +++ b/configuration/objects/index.html @@ -8,7 +8,7 @@ Default available objects | Frigate - + @@ -22,7 +22,7 @@

Default available objects

By default, Frigate includes the following object models from the Google Coral test data.

  • person
  • bicycle
  • car
  • motorcycle
  • airplane
  • bus
  • train
  • car
  • boat
  • traffic light
  • fire hydrant
  • stop sign
  • parking meter
  • bench
  • bird
  • cat
  • dog
  • horse
  • sheep
  • cow
  • elephant
  • bear
  • zebra
  • giraffe
  • backpack
  • umbrella
  • handbag
  • tie
  • suitcase
  • frisbee
  • skis
  • snowboard
  • sports ball
  • kite
  • baseball bat
  • baseball glove
  • skateboard
  • surfboard
  • tennis racket
  • bottle
  • wine glass
  • cup
  • fork
  • knife
  • spoon
  • bowl
  • banana
  • apple
  • sandwich
  • orange
  • broccoli
  • carrot
  • hot dog
  • pizza
  • donut
  • cake
  • chair
  • couch
  • potted plant
  • bed
  • dining table
  • toilet
  • tv
  • laptop
  • mouse
  • remote
  • keyboard
  • cell phone
  • microwave
  • oven
  • toaster
  • sink
  • refrigerator
  • book
  • clock
  • vase
  • scissors
  • teddy bear
  • hair drier
  • toothbrush

Custom Models#

Models for both CPU and EdgeTPU (Coral) are bundled in the image. You can use your own models with volume mounts:

  • CPU Model: /cpu_model.tflite
  • EdgeTPU Model: /edgetpu_model.tflite
  • Labels: /labelmap.txt

You also need to update the model width/height in the config if they differ from the defaults.

Customizing the Labelmap#

The labelmap can be customized to your needs. A common reason to do this is to combine multiple object types that are easily confused when you don't need to be as granular such as car/truck. You must retain the same number of labels, but you can change the names. To change:

  • Download the COCO labelmap
  • Modify the label names as desired. For example, change 7 truck to 7 car
  • Mount the new file at /labelmap.txt in the container with an additional volume
    -v ./config/labelmap.txt:/labelmap.txt
- + diff --git a/configuration/optimizing/index.html b/configuration/optimizing/index.html index 4e468e5ef..32becff3c 100644 --- a/configuration/optimizing/index.html +++ b/configuration/optimizing/index.html @@ -8,7 +8,7 @@ Optimizing performance | Frigate - + @@ -26,7 +26,7 @@ Ensure you increase the allocated RAM for your GPU to at least 128 (raspi-config NOTICE: If you are using the addon, ensure you turn off Protection mode for hardware acceleration.

ffmpeg:
hwaccel_args:
- -c:v
- h264_v4l2m2m

Intel-based CPUs (<10th Generation) via Quicksync (https://trac.ffmpeg.org/wiki/Hardware/QuickSync)

ffmpeg:
hwaccel_args:
- -hwaccel
- vaapi
- -hwaccel_device
- /dev/dri/renderD128
- -hwaccel_output_format
- yuv420p

Intel-based CPUs (>=10th Generation) via Quicksync (https://trac.ffmpeg.org/wiki/Hardware/QuickSync)

ffmpeg:
hwaccel_args:
- -hwaccel
- qsv
- -qsv_device
- /dev/dri/renderD128

AMD/ATI GPUs (Radeon HD 2000 and newer GPUs) via libva-mesa-driver (https://trac.ffmpeg.org/wiki/Hardware/QuickSync) Note: You also need to set LIBVA_DRIVER_NAME=radeonsi as an environment variable on the container.

ffmpeg:
hwaccel_args:
- -hwaccel
- vaapi
- -hwaccel_device
- /dev/dri/renderD128

Nvidia GPU based decoding via NVDEC is supported, but requires special configuration. See the nvidia NVDEC documentation for more details.

- + diff --git a/contributing/index.html b/contributing/index.html index 70823724e..3985aa4fa 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -8,7 +8,7 @@ Contributing | Frigate - + @@ -22,7 +22,7 @@

Contributing

Getting the source#

Core, Web, Docker, and Documentation#

This repository holds the main Frigate application and all of its dependencies.

Fork blakeblackshear/frigate to your own GitHub profile, then clone the forked repo to your local machine.

From here, follow the guides for:

Frigate Home Assistant Addon#

This repository holds the Home Assistant Addon, for use with Home Assistant OS and compatible installations. It is the piece that allows you to run Frigate from your Home Assistant Supervisor tab.

Fork blakeblackshear/frigate-hass-addons to your own Github profile, then clone the forked repo to your local machine.

Frigate Home Assistant Integration#

This repository holds the custom integration that allows your Home Assistant installation to automatically create entities for your Frigate instance, whether you run that with the addon or in a separate Docker instance.

Fork blakeblackshear/frigate-hass-integration to your own GitHub profile, then clone the forked repo to your local machine.

Core#

Prerequisites#

Web Interface#

Prerequisites#

Making changes#

1. Set up a Frigate instance#

The Web UI requires an instance of Frigate to interact with for all of its data. You can either run an instance locally (recommended) or attach to a separate instance accessible on your network.

To run the local instance, follow the core development instructions.

If you won't be making any changes to the Frigate HTTP API, you can attach the web development server to any Frigate instance on your network. Skip this step and go to 3a.

2. Install dependencies#

cd web && npm install

3. Run the development server#

cd web && npm run start

3a. Run the development server against a non-local instance#

To run the development server against a non-local instance, you will need to provide an environment variable, SNOWPACK_PUBLIC_API_HOST that tells the web application how to connect to the Frigate API:

cd web && SNOWPACK_PUBLIC_API_HOST=http://<ip-address-to-your-frigate-instance>:5000 npm run start

4. Making changes#

The Web UI is built using Snowpack, Preact, and Tailwind CSS.

Light guidelines and advice:

  • Avoid adding more dependencies. The web UI intends to be lightweight and fast to load.
  • Do not make large sweeping changes. Open a discussion on GitHub for any large or architectural ideas.
  • Ensure lint passes. This command will ensure basic conformance to styles, applying as many automatic fixes as possible, including Prettier formatting.
npm run lint
  • Add to unit tests and ensure they pass. As much as possible, you should strive to increase test coverage whenever making changes. This will help ensure features do not accidentally become broken in the future.
npm run test
  • Test in different browsers. Firefox, Chrome, and Safari all have different quirks that make them unique targets to interact with.

Documentation#

Prerequisites#

Making changes#

1. Installation#

npm run install

2. Local Development#

npm run start

This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server.

The docs are built using Docusaurus v2. Please refer to the Docusaurus docs for more information on how to modify Frigate's documentation.

3. Build (optional)#

npm run build

This command generates static content into the build directory and can be served using any static contents hosting service.

- + diff --git a/hardware/index.html b/hardware/index.html index 4e7cd5a18..f731cfd8f 100644 --- a/hardware/index.html +++ b/hardware/index.html @@ -8,7 +8,7 @@ Recommended hardware | Frigate - + @@ -23,7 +23,7 @@

Recommended hardware

Cameras#

Cameras that output H.264 video and AAC audio will offer the most compatibility with all features of Frigate and Home Assistant. It is also helpful if your camera supports multiple substreams to allow different resolutions to be used for detection, streaming, clips, and recordings without re-encoding.

Computer#

NameInference SpeedNotes
Atomic Pi16msGood option for a dedicated low power board with a small number of cameras. Can leverage Intel QuickSync for stream decoding.
Intel NUC NUC7i3BNK8-10msGreat performance. Can handle many cameras at 5fps depending on typical amounts of motion.
BMAX B2 Plus10-12msGood balance of performance and cost. Also capable of running many other services at the same time as frigate.
Minisforum GK419-10msGreat alternative to a NUC with dual Gigabit NICs. Easily handles several 1080p cameras.
Raspberry Pi 3B (32bit)60msCan handle a small number of cameras, but the detection speeds are slow due to USB 2.0.
Raspberry Pi 4 (32bit)15-20msCan handle a small number of cameras. The 2GB version runs fine.
Raspberry Pi 4 (64bit)10-15msCan handle a small number of cameras. The 2GB version runs fine.

Unraid#

Many people have powerful enough NAS devices or home servers to also run docker. There is a Unraid Community App. To install make sure you have the community app plugin here. Then search for "Frigate" in the apps section within Unraid - you can see the online store here

NameInference SpeedNotes
M2 Coral Edge TPU6.2msInstall the Coral plugin from Unraid Community App Center info here
- + diff --git a/how-it-works/index.html b/how-it-works/index.html index 68b576109..c4473c88b 100644 --- a/how-it-works/index.html +++ b/how-it-works/index.html @@ -8,7 +8,7 @@ How Frigate Works | Frigate - + @@ -22,7 +22,7 @@
- + diff --git a/index.html b/index.html index 1866b583d..8263b59b5 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ Frigate | Frigate - + @@ -22,7 +22,7 @@

Your Docusaurus site did not load properly.

A very common reason is a wrong site baseUrl configuration.

Current configured baseUrl = /frigate/

We suggest trying baseUrl =

Frigate

A complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.

Use of a Google Coral Accelerator is optional, but highly recommended. The Coral will outperform even the best CPUs and can process 100+ FPS with very little overhead.

  • Tight integration with Home Assistant via a custom component
  • Designed to minimize resource use and maximize performance by only looking for objects when and where it is necessary
  • Leverages multiprocessing heavily with an emphasis on realtime over processing every frame
  • Uses a very low overhead motion detection to determine where to run object detection
  • Object detection with TensorFlow runs in separate processes for maximum FPS
  • Communicates over MQTT for easy integration into other systems
  • 24/7 recording
  • Re-streaming via RTMP to reduce the number of connections to your camera

Screenshots#

Media Browser

Notification

- + diff --git a/installation/index.html b/installation/index.html index b3b9ec726..da51855e7 100644 --- a/installation/index.html +++ b/installation/index.html @@ -8,7 +8,7 @@ Installation | Frigate - + @@ -22,7 +22,7 @@

Installation

Frigate is a Docker container that can be run on any Docker host including as a HassOS Addon. See instructions below for installing the HassOS addon.

For Home Assistant users, there is also a custom component (aka integration). This custom component adds tighter integration with Home Assistant by automatically setting up camera entities, sensors, media browser for clips and recordings, and a public API to simplify notifications.

Note that HassOS Addons and custom components are different things. If you are already running Frigate with Docker directly, you do not need the Addon since the Addon would run another instance of Frigate.

HassOS Addon#

HassOS users can install via the addon repository. Frigate requires an MQTT server.

  1. Navigate to Supervisor > Add-on Store > Repositories
  2. Add https://github.com/blakeblackshear/frigate-hass-addons
  3. Setup your network configuration in the Configuration tab if deisred
  4. Create the file frigate.yml in your config directory with your detailed Frigate configuration
  5. Start the addon container
  6. If you are using hardware acceleration for ffmpeg, you will need to disable "Protection mode"

Docker#

Make sure you choose the right image for your architecture:

ArchImage Name
amd64blakeblackshear/frigate:stable-amd64
amd64nvidiablakeblackshear/frigate:stable-amd64nvidia
armv7blakeblackshear/frigate:stable-armv7
aarch64blakeblackshear/frigate:stable-aarch64

It is recommended to run with docker-compose:

version: "3.9"
services:
frigate:
container_name: frigate
privileged: true # this may not be necessary for all setups
restart: unless-stopped
image: blakeblackshear/frigate:<specify_version_tag>
devices:
- /dev/bus/usb:/dev/bus/usb
- /dev/dri/renderD128 # for intel hwaccel, needs to be updated for your hardware
volumes:
- /etc/localtime:/etc/localtime:ro
- <path_to_config_file>:/config/config.yml:ro
- <path_to_directory_for_media>:/media/frigate
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "5000:5000"
- "1935:1935" # RTMP feeds
environment:
FRIGATE_RTSP_PASSWORD: "password"

If you can't use docker compose, you can run the container with something similar to this:

docker run -d \
--name frigate \
--restart=unless-stopped \
--mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
--device /dev/bus/usb:/dev/bus/usb \
--device /dev/dri/renderD128 \
-v <path_to_directory_for_media>:/media/frigate \
-v <path_to_config_file>:/config/config.yml:ro \
-v /etc/localtime:/etc/localtime:ro \
-e FRIGATE_RTSP_PASSWORD='password' \
-p 5000:5000 \
-p 1935:1935 \
blakeblackshear/frigate:<specify_version_tag>

Calculating shm-size#

The default shm-size of 64m is fine for setups with 3 or less 1080p cameras. If frigate is exiting with "Bus error" messages, it could be because you have too many high resolution cameras and you need to specify a higher shm size.

You can calculate the necessary shm-size for each camera with the following formula:

(width * height * 1.5 * 7 + 270480)/1048576 = <shm size in mb>

The shm size cannot be set per container for Home Assistant Addons. You must set default-shm-size in /etc/docker/daemon.json to increase the default shm size. This will increase the shm size for all of your docker containers. This may or may not cause issues with your setup. https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

Kubernetes#

Use the helm chart.

Virtualization#

For ideal performance, Frigate needs access to underlying hardware for the Coral and GPU devices for ffmpeg decoding. Running Frigate in a VM on top of Proxmox, ESXi, Virtualbox, etc. is not recommended. The virtualization layer typically introduces a sizable amount of overhead for communication with Coral devices.

Proxmox#

Some people have had success running Frigate in LXC directly with the following config:

arch: amd64
cores: 2
features: nesting=1
hostname: FrigateLXC
memory: 4096
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=2E:76:AE:5A:58:48,ip=dhcp,ip6=auto,type=veth
ostype: debian
rootfs: local-lvm:vm-115-disk-0,size=12G
swap: 512
lxc.cgroup.devices.allow: c 189:385 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.mount.entry: /dev/bus/usb/004/002 dev/bus/usb/004/002 none bind,optional,create=file
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:

ESX#

For details on running Frigate under ESX, see details here.

- + diff --git a/mdx/index.html b/mdx/index.html index 353547e02..78b41a5ee 100644 --- a/mdx/index.html +++ b/mdx/index.html @@ -8,7 +8,7 @@ Powered by MDX | Frigate - + @@ -22,7 +22,7 @@

Powered by MDX

You can write JSX and use React components within your Markdown thanks to MDX.

Docusaurus green and Facebook blue are my favorite colors.

I can write Markdown alongside my JSX!

- + diff --git a/runtime~main.35eb7541.js b/runtime~main.85a22073.js similarity index 98% rename from runtime~main.35eb7541.js rename to runtime~main.85a22073.js index 22d5e7231..44f8a4977 100644 --- a/runtime~main.35eb7541.js +++ b/runtime~main.85a22073.js @@ -1 +1 @@ -!function(e){function r(r){for(var n,o,c=r[0],d=r[1],u=r[2],i=0,b=[];i Search the documentation | Frigate - + @@ -18,7 +18,7 @@

Search the documentation

- + diff --git a/troubleshooting/index.html b/troubleshooting/index.html index 95b6e07d3..396917159 100644 --- a/troubleshooting/index.html +++ b/troubleshooting/index.html @@ -8,7 +8,7 @@ Troubleshooting and FAQ | Frigate - + @@ -22,7 +22,7 @@

Troubleshooting and FAQ

How can I get sound or audio in my clips and recordings?#

By default, Frigate removes audio from clips and recordings to reduce the likelihood of failing for invalid data. If you would like to include audio, you need to override the output args to remove -an for where you want to include audio. The recommended audio codec is aac. Not all audio codecs are supported by RTMP, so you may need to re-encode your audio with -c:a aac. The default ffmpeg args are shown here.

My mjpeg stream or snapshots look green and crazy#

This almost always means that the width/height defined for your camera are not correct. Double check the resolution with vlc or another player. Also make sure you don't have the width and height values backwards.

mismatched-resolution

I have clips and snapshots in my clips folder, but I can't view them in the Web UI.#

This is usually caused one of two things:

  • The permissions on the parent folder don't have execute and nginx returns a 403 error you can see in the browser logs
    • In this case, try mounting a volume to /media/frigate inside the container instead of /media/frigate/clips.
  • Your cameras do not send h264 encoded video and the mp4 files are not playable in the browser

"[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5639eeb6e140] moov atom not found"#

These messages in the logs are expected in certain situations. Frigate checks the integrity of the video cache before assembling clips. Occasionally these cached files will be invalid and cleaned up automatically.

"On connect called"#

If you see repeated "On connect called" messages in your config, check for another instance of frigate. This happens when multiple frigate containers are trying to connect to mqtt with the same client_id.

- + diff --git a/usage/api/index.html b/usage/api/index.html index e590dfa6e..9ee11417e 100644 --- a/usage/api/index.html +++ b/usage/api/index.html @@ -8,7 +8,7 @@ HTTP API | Frigate - + @@ -22,7 +22,7 @@

HTTP API

A web server is available on port 5000 with the following endpoints.

/api/<camera_name>#

An mjpeg stream for debugging. Keep in mind the mjpeg endpoint is for debugging only and will put additional load on the system when in use.

Accepts the following query string parameters:

paramTypeDescription
fpsintFrame rate
hintHeight in pixels
bboxintShow bounding boxes for detected objects (0 or 1)
timestampintPrint the timestamp in the upper left (0 or 1)
zonesintDraw the zones on the image (0 or 1)
maskintOverlay the mask on the image (0 or 1)
motionintDraw blue boxes for areas with detected motion (0 or 1)
regionsintDraw green boxes for areas where object detection was run (0 or 1)

You can access a higher resolution mjpeg stream by appending h=height-in-pixels to the endpoint. For example http://localhost:5000/api/back?h=1080. You can also increase the FPS by appending fps=frame-rate to the URL such as http://localhost:5000/api/back?fps=10 or both with ?fps=10&h=1000.

/api/<camera_name>/<object_name>/best.jpg[?h=300&crop=1]#

The best snapshot for any object type. It is a full resolution image by default.

Example parameters:

  • h=300: resizes the image to 300 pixes tall
  • crop=1: crops the image to the region of the detection rather than returning the entire image

/api/<camera_name>/latest.jpg[?h=300]#

The most recent frame that frigate has finished processing. It is a full resolution image by default.

Accepts the following query string parameters:

paramTypeDescription
hintHeight in pixels
bboxintShow bounding boxes for detected objects (0 or 1)
timestampintPrint the timestamp in the upper left (0 or 1)
zonesintDraw the zones on the image (0 or 1)
maskintOverlay the mask on the image (0 or 1)
motionintDraw blue boxes for areas with detected motion (0 or 1)
regionsintDraw green boxes for areas where object detection was run (0 or 1)

Example parameters:

  • h=300: resizes the image to 300 pixes tall

/api/stats#

Contains some granular debug info that can be used for sensors in Home Assistant.

Sample response:

{
/* Per Camera Stats */
"back": {
/***************
* Frames per second being consumed from your camera. If this is higher
* than it is supposed to be, you should set -r FPS in your input_args.
* camera_fps = process_fps + skipped_fps
***************/
"camera_fps": 5.0,
/***************
* Number of times detection is run per second. This can be higher than
* your camera FPS because frigate often looks at the same frame multiple times
* or in multiple locations
***************/
"detection_fps": 1.5,
/***************
* PID for the ffmpeg process that consumes this camera
***************/
"capture_pid": 27,
/***************
* PID for the process that runs detection for this camera
***************/
"pid": 34,
/***************
* Frames per second being processed by frigate.
***************/
"process_fps": 5.1,
/***************
* Frames per second skip for processing by frigate.
***************/
"skipped_fps": 0.0
},
/***************
* Sum of detection_fps across all cameras and detectors.
* This should be the sum of all detection_fps values from cameras.
***************/
"detection_fps": 5.0,
/* Detectors Stats */
"detectors": {
"coral": {
/***************
* Timestamp when object detection started. If this value stays non-zero and constant
* for a long time, that means the detection process is stuck.
***************/
"detection_start": 0.0,
/***************
* Time spent running object detection in milliseconds.
***************/
"inference_speed": 10.48,
/***************
* PID for the shared process that runs object detection on the Coral.
***************/
"pid": 25321
}
},
"service": {
/* Uptime in seconds */
"uptime": 10,
"version": "0.8.0-8883709",
/* Storage data in MB for important locations */
"storage": {
"/media/frigate/clips": {
"total": 1000,
"used": 700,
"free": 300,
"mnt_type": "ext4"
},
"/media/frigate/recordings": {
"total": 1000,
"used": 700,
"free": 300,
"mnt_type": "ext4"
},
"/tmp/cache": {
"total": 256,
"used": 100,
"free": 156,
"mnt_type": "tmpfs"
},
"/dev/shm": {
"total": 256,
"used": 100,
"free": 156,
"mnt_type": "tmpfs"
}
}
}
}

/api/config#

A json representation of your configuration

/api/version#

Version info

/api/events#

Events from the database. Accepts the following query string parameters:

paramTypeDescription
beforeintEpoch time
afterintEpoch time
camerastrCamera name
labelstrLabel name
zonestrZone name
limitintLimit the number of events returned
has_snapshotintFilter to events that have snapshots (0 or 1)
has_clipintFilter to events that have clips (0 or 1)
include_thumbnailsintInclude thumbnails in the response (0 or 1)

/api/events/summary#

Returns summary data for events in the database. Used by the Home Assistant integration.

/api/events/<id>#

Returns data for a single event.

/api/events/<id>/thumbnail.jpg#

Returns a thumbnail for the event id optimized for notifications. Works while the event is in progress and after completion. Passing ?format=android will convert the thumbnail to 2:1 aspect ratio.

/api/events/<id>/snapshot.jpg#

Returns the snapshot image for the event id. Works while the event is in progress and after completion.

Accepts the following query string parameters, but they are only applied when an event is in progress. After the event is completed, the saved snapshot is returned from disk without modification:

paramTypeDescription
hintHeight in pixels
bboxintShow bounding boxes for detected objects (0 or 1)
timestampintPrint the timestamp in the upper left (0 or 1)
cropintCrop the snapshot to the (0 or 1)

/clips/<camera>-<id>.mp4#

Video clip for the given camera and event id.

/clips/<camera>-<id>.jpg#

JPG snapshot for the given camera and event id.

- + diff --git a/usage/home-assistant/index.html b/usage/home-assistant/index.html index 99aaf9219..866f25412 100644 --- a/usage/home-assistant/index.html +++ b/usage/home-assistant/index.html @@ -8,7 +8,7 @@ Integration with Home Assistant | Frigate - + @@ -16,13 +16,18 @@ - +
-

Integration with Home Assistant

The best way to integrate with Home Assistant is to use the official integration.

Installation#

Available via HACS as a custom repository. To install:

  • Add the custom repository:
Home Assistant > HACS > Integrations > [...] > Custom Repositories
KeyValue
Repository URLhttps://github.com/blakeblackshear/frigate-hass-integration
CategoryIntegration
  • Use HACS to install the integration:
Home Assistant > HACS > Integrations > "Explore & Add Integrations" > Frigate
  • Restart Home Assistant.
  • Then add/configure the integration:
Home Assistant > Configuration > Integrations > Add Integration > Frigate

Note: You will also need +

Integration with Home Assistant

The best way to integrate with Home Assistant is to use the official integration.

Installation#

Preparation#

The Frigate integration requires the mqtt integration to be installed and +manually configured first.

See the MQTT integration +documentation for more +details.

Integration installation#

Available via HACS as a default repository. To install:

  • Use HACS to install the integration:
Home Assistant > HACS > Integrations > "Explore & Add Integrations" > Frigate
  • Restart Home Assistant.
  • Then add/configure the integration:
Home Assistant > Configuration > Integrations > Add Integration > Frigate

Note: You will also need media_source enabled -in your Home Assistant configuration for the Media Browser to appear.

Configuration#

When configuring the integration, you will be asked for the following parameters:

VariableDescription
URLThe URL of your frigate instance, the URL you use to access Frigate in the browser. This may look like http://<host>:5000/. If you are using HassOS with the addon, the URL should be http://ccab4aaf-frigate:5000 (or http://ccab4aaf-frigate-beta:5000 if your are using the beta version of the addon). Live streams required port 1935, see RTMP streams

Options#

Home Assistant > Configuration > Integrations > Frigate > Options
OptionDescription
RTMP URL TemplateA jinja2 template that is used to override the standard RTMP stream URL (e.g. for use with reverse proxies). This option is only shown to users who have advanced mode enabled. See RTMP streams below.

Entities Provided#

PlatformDescription
cameraLive camera stream (requires RTMP), camera for image of the last detected object.
sensorStates to monitor Frigate performance, object counts for all zones and cameras.
switchSwitch entities to toggle detection, clips and snapshots.
binary_sensorA "motion" binary sensor entity per camera/zone/object.

Media Browser Support#

The integration provides:

  • Rich UI with thumbnails for browsing event clips
  • Rich UI for browsing 24/7 recordings by month, day, camera, time

This is accessible via "Media Browser" on the left menu panel in Home Assistant.

API#

  • Notification API with public facing endpoints for images in notifications

Notifications#

Frigate publishes event information in the form of a change feed via MQTT. This +in your Home Assistant configuration for the Media Browser to appear.

(Optional) Lovelace Card Installation#

To install the optional companion Lovelace card, please see the separate +installation instructions for +that card.

Configuration#

When configuring the integration, you will be asked for the following parameters:

VariableDescription
URLThe URL of your frigate instance, the URL you use to access Frigate in the browser. This may look like http://<host>:5000/. If you are using HassOS with the addon, the URL should be http://ccab4aaf-frigate:5000 (or http://ccab4aaf-frigate-beta:5000 if your are using the beta version of the addon). Live streams required port 1935, see RTMP streams

Options#

Home Assistant > Configuration > Integrations > Frigate > Options
OptionDescription
RTMP URL TemplateA jinja2 template that is used to override the standard RTMP stream URL (e.g. for use with reverse proxies). This option is only shown to users who have advanced mode enabled. See RTMP streams below.

Entities Provided#

PlatformDescription
cameraLive camera stream (requires RTMP), camera for image of the last detected object.
sensorStates to monitor Frigate performance, object counts for all zones and cameras.
switchSwitch entities to toggle detection, clips and snapshots.
binary_sensorA "motion" binary sensor entity per camera/zone/object.

Media Browser Support#

The integration provides:

  • Rich UI with thumbnails for browsing event clips
  • Rich UI for browsing 24/7 recordings by month, day, camera, time

This is accessible via "Media Browser" on the left menu panel in Home Assistant.

API#

  • Notification API with public facing endpoints for images in notifications

Notifications#

Frigate publishes event information in the form of a change feed via MQTT. This allows lots of customization for notifications to meet your needs. Event changes are published with before and after information as shown here. Note that some people may not want to expose frigate to @@ -48,9 +53,9 @@ identifier used is the MQTT client_id paremeter included in the con and is used like so:

https://HA_URL/api/frigate/<client-id>/notifications/<event-id>/thumbnail.jpg
https://HA_URL/api/frigate/<client-id>/clips/front_door-1624599978.427826-976jaa.mp4

Default Treatment#

When a single Frigate instance is configured, the client-id parameter need not be specified in URLs/identifiers -- that single instance is assumed. When multiple Frigate instances are configured, the user must explicitly specify -which server they are referring to.

FAQ#

If I am detecting multiple objects, how do I assign the correct binary_sensor to the camera in HomeKit?#

The HomeKit integration randomly links one of the binary sensors (motion sensor entities) grouped with the camera device in Home Assistant. You can specify a linked_motion_sensor in the Home Assistant HomeKit configuration for each camera.

+which server they are referring to.

FAQ#

If I am detecting multiple objects, how do I assign the correct binary_sensor to the camera in HomeKit?#

The HomeKit integration randomly links one of the binary sensors (motion sensor entities) grouped with the camera device in Home Assistant. You can specify a linked_motion_sensor in the Home Assistant HomeKit configuration for each camera.

- + @@ -58,6 +63,6 @@ which server they are referring to.

Community Guides

Communitiy Guides/How-To's#

  • Best Camera AI Person & Object Detection - How to Setup Frigate w/ Home Assistant - digiblurDIY YouTube - Article
  • Even More Free Local Object Detection with Home Assistant - Frigate Install - Everything Smart Home YouTube
  • Home Assistant Frigate integration for local image recognition - KPeyanski YouTube - Article
- + diff --git a/usage/mqtt/index.html b/usage/mqtt/index.html index f5d6f1876..fd988ff88 100644 --- a/usage/mqtt/index.html +++ b/usage/mqtt/index.html @@ -8,7 +8,7 @@ MQTT | Frigate - + @@ -25,7 +25,7 @@ "offline": published right before frigate stops

frigate/<camera_name>/<object_name>#

Publishes the count of objects for the camera for use as a sensor in Home Assistant.

frigate/<zone_name>/<object_name>#

Publishes the count of objects for the zone for use as a sensor in Home Assistant.

frigate/<camera_name>/<object_name>/snapshot#

Publishes a jpeg encoded frame of the detected object type. When the object is no longer detected, the highest confidence image is published or the original image is published again.

The height and crop of snapshots can be configured in the config.

frigate/events#

Message published for each changed event. The first message is published when the tracked object is no longer marked as a false_positive. When frigate finds a better snapshot of the tracked object or when a zone change occurs, it will publish a message with the same id. When the event ends, a final message is published with end_time set.

{
"type": "update", // new, update, or end
"before": {
"id": "1607123955.475377-mxklsc",
"camera": "front_door",
"frame_time": 1607123961.837752,
"label": "person",
"top_score": 0.958984375,
"false_positive": false,
"start_time": 1607123955.475377,
"end_time": null,
"score": 0.7890625,
"box": [424, 500, 536, 712],
"area": 23744,
"region": [264, 450, 667, 853],
"current_zones": ["driveway"],
"entered_zones": ["yard", "driveway"],
"thumbnail": null
},
"after": {
"id": "1607123955.475377-mxklsc",
"camera": "front_door",
"frame_time": 1607123962.082975,
"label": "person",
"top_score": 0.958984375,
"false_positive": false,
"start_time": 1607123955.475377,
"end_time": null,
"score": 0.87890625,
"box": [432, 496, 544, 854],
"area": 40096,
"region": [218, 440, 693, 915],
"current_zones": ["yard", "driveway"],
"entered_zones": ["yard", "driveway"],
"thumbnail": null
}
}

frigate/stats#

Same data available at /api/stats published at a configurable interval.

frigate/<camera_name>/detect/set#

Topic to turn detection for a camera on and off. Expected values are ON and OFF.

frigate/<camera_name>/detect/state#

Topic with current state of detection for a camera. Published values are ON and OFF.

frigate/<camera_name>/clips/set#

Topic to turn clips for a camera on and off. Expected values are ON and OFF.

frigate/<camera_name>/clips/state#

Topic with current state of clips for a camera. Published values are ON and OFF.

frigate/<camera_name>/snapshots/set#

Topic to turn snapshots for a camera on and off. Expected values are ON and OFF.

frigate/<camera_name>/snapshots/state#

Topic with current state of snapshots for a camera. Published values are ON and OFF.

- + diff --git a/usage/web/index.html b/usage/web/index.html index e47788293..7749467a6 100644 --- a/usage/web/index.html +++ b/usage/web/index.html @@ -8,7 +8,7 @@ Web Interface | Frigate - + @@ -22,7 +22,7 @@ - +