It’s certainly possible to download all of your videos, but it may require the subscription to do so (I’m not 100% sure as I have the subscription but some of the documentation I’ve seen implies that you do).
If you look at the camera.front_door (or whatever yours is called) there should be an attribute called video_url. That should contain a url to download the latest video. If you watch that URL and download it when it changes you should get all of the videos locally.
The ring.com component documentation isn’t 100% clear on how all of that works but it does work for me at least. I decided to try and implement the automation in Node Red (mainly as a project to teach myself Node Red). It’s not 100% perfect but it seems to work for me.
[
{
"id": "2b6552b3.374a9e",
"type": "server-state-changed",
"z": "f368bccc.a1abc",
"name": "",
"server": "cd82d495.c5b69",
"entityidfilter": "camera.front_door",
"entityidfiltertype": "substring",
"outputinitially": false,
"haltifstate": "",
"x": 154.5,
"y": 388,
"wires": [
[
"e7f892f5.a7"
]
]
},
{
"id": "4e9cbec0.0e72f8",
"type": "server-state-changed",
"z": "f368bccc.a1abc",
"name": "",
"server": "cd82d495.c5b69",
"entityidfilter": "camera.side_door",
"entityidfiltertype": "substring",
"outputinitially": false,
"haltifstate": "",
"x": 153,
"y": 447,
"wires": [
[
"e7f892f5.a7"
]
]
},
{
"id": "70e044e4.50ba64",
"type": "api-call-service",
"z": "f368bccc.a1abc",
"name": "",
"server": "cd82d495.c5b69",
"service_domain": "downloader",
"service": "download_file",
"data": "",
"render_data": false,
"mergecontext": "",
"x": 945.5,
"y": 572,
"wires": [
[
"be7aa092.e462d8"
]
]
},
{
"id": "5d66822d.4302a4",
"type": "change",
"z": "f368bccc.a1abc",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\t \"data\":{\t \"url\": data.new_state.attributes.video_url,\t \"subdir\": topic,\t \"filename\": $join([new.groups[0], \"_\", new.groups[1], \".mp4\"])\t }\t}",
"tot": "jsonata"
},
{
"t": "delete",
"p": "topic",
"pt": "msg"
},
{
"t": "delete",
"p": "data",
"pt": "msg"
},
{
"t": "delete",
"p": "new",
"pt": "msg"
},
{
"t": "delete",
"p": "old",
"pt": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 677.5,
"y": 576,
"wires": [
[
"70e044e4.50ba64"
]
]
},
{
"id": "be7aa092.e462d8",
"type": "debug",
"z": "f368bccc.a1abc",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 1063,
"y": 494,
"wires": []
},
{
"id": "4b7c8619.d2ec3",
"type": "server-state-changed",
"z": "f368bccc.a1abc",
"name": "",
"server": "cd82d495.c5b69",
"entityidfilter": "camera.backyard",
"entityidfiltertype": "substring",
"outputinitially": false,
"haltifstate": "",
"x": 153,
"y": 503,
"wires": [
[
"e7f892f5.a7"
]
]
},
{
"id": "ce6ed3ed.47d57",
"type": "change",
"z": "f368bccc.a1abc",
"name": "",
"rules": [
{
"t": "set",
"p": "old",
"pt": "msg",
"to": "$match(data.old_state.attributes.video_url, /\\/(\\d+)\\/(\\d+)\\.mp4\\?/)",
"tot": "jsonata"
},
{
"t": "set",
"p": "new",
"pt": "msg",
"to": "$match(data.new_state.attributes.video_url, /\\/(\\d+)\\/(\\d+)\\.mp4\\?/)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 716,
"y": 752,
"wires": [
[
"f36911e4.b5d1c"
]
]
},
{
"id": "f36911e4.b5d1c",
"type": "switch",
"z": "f368bccc.a1abc",
"name": "",
"property": "(old.groups[0] = new.groups[0]) and (old.groups[1] = new.groups[1])",
"propertyType": "jsonata",
"rules": [
{
"t": "false"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 569.5,
"y": 510,
"wires": [
[
"5d66822d.4302a4",
"cd87ca57.0a22a8"
]
]
},
{
"id": "cd87ca57.0a22a8",
"type": "debug",
"z": "f368bccc.a1abc",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 775,
"y": 491,
"wires": []
},
{
"id": "71446db9.0e1fb4",
"type": "switch",
"z": "f368bccc.a1abc",
"name": "new video url is a string",
"property": "data.new_state.attributes.video_url",
"propertyType": "msg",
"rules": [
{
"t": "istype",
"v": "string",
"vt": "string"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 363.5,
"y": 696,
"wires": [
[
"ce6ed3ed.47d57"
],
[
"1d611991.cf2dce"
]
]
},
{
"id": "e7f892f5.a7",
"type": "switch",
"z": "f368bccc.a1abc",
"name": "old video url is a string",
"property": "data.old_state.attributes.video_url",
"propertyType": "msg",
"rules": [
{
"t": "istype",
"v": "string",
"vt": "string"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 349,
"y": 573,
"wires": [
[
"71446db9.0e1fb4"
],
[
"48764d51.11c0dc"
]
]
},
{
"id": "48764d51.11c0dc",
"type": "change",
"z": "f368bccc.a1abc",
"name": "set old url to a string",
"rules": [
{
"t": "set",
"p": "data.old_state.attributes.video_url",
"pt": "msg",
"to": "",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 145.5,
"y": 642,
"wires": [
[
"71446db9.0e1fb4"
]
]
},
{
"id": "1d611991.cf2dce",
"type": "change",
"z": "f368bccc.a1abc",
"name": "set new url to a string",
"rules": [
{
"t": "set",
"p": "data.new_state.attributes.video_url",
"pt": "msg",
"to": "",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 298,
"y": 758,
"wires": [
[
"ce6ed3ed.47d57"
]
]
},
{
"id": "cd82d495.c5b69",
"type": "server",
"z": "",
"name": "Home Assistant",
"legacy": false,
"hassio": false,
"rejectUnauthorizedCerts": true
}
]