Upgraded MotionEye support for Home Assistant.
See a complete example and use-case here.
- Automatic discovery of cameras.
- Trigger camera actions with Home Assistant events.
The component can be installed via the Home Assistant UI.
motion_eye:
hosts:
- url: "http://motion-eye.local"
username: !secret motion_username
password: !secret motion_password
Upon restart, Home Assistant will automatically create camera
entities for each camera found at http://motion-eye.local
with the appropriate MotionEye camera name. Each camera entity will contain all of the MotionEye camera attributes.
Examples:
- MotionEyeOS: A Raspberry Pi with MotionEyeOS installed will have a web UI on port 80. I have multiple Raspberry Pi Zero Ws, and I just add each as a separate integration to Home Assistant. Their configuration URLs are
http://192.168.0.161
, etc. - MotionEye Add-On (Supervisor): The easiest approach is to tweak the HA add-on configuration to allow access. From the
Configuration
tab in theNetwork
section, choose a host port, say, 8081. After restarting, you should be able to access the MotionEye UI using the static IP of your Home Assistant device and the port you have chosen. For example,http://192.168.0.100:8081
(note I used the IP and nothomeassistant.local
). This is the correcturl
setting. - Docker/Kubernetes: If you're trying to connect to a MotionEye instance between Docker containers (or Kubernetes pods), you need to make sure that the Home Assistant instance can access the target URL. I happen to run Kubernetes for all of my home automation, so I actually use the URL
http://motion.home.svc.cluster.local:8765
for one of my integrations, as this is the syntax for intra-service DNS lookups.
When in doubt you can use your browser's "Network Inspector" feature while using MotionEye.
In the above screenshot, the correct configuration URL would be https://cameras.snowy-cabin.com
(everything before the /picture
...)
I am using my workshop camera as an example, which has a built-in PAN-TILT hat.
{{ states.camera.workshop.attributes.actions }}
The actions are printed by the template editor:
['snapshot', 'up', 'down', 'left', 'right']
Fire the motion_eye_action
event with the following parameters:
camera_id: camera.workshop
action: up
Where camera_id
is from this example, and up
was a known action from the prior step.
For convenience, I wrapped this into a script:
script:
motion_eye_action:
alias: Motion Eye - Call Action
sequence:
- event: motion_eye_action
event_data_template:
camera_id: "{{ camera_id }}"
action: "{{ action }}"
It's nice to have action buttons in a picture glance card.
title: "Workshop"
camera_image: 'camera.workshop'
entities:
- entity: 'camera.workshop'
icon: 'mdi:arrow-left'
tap_action:
action: call-service
service: script.motion_eye_action
service_data:
action: left
camera_id: 'camera.workshop'
- entity: 'camera.workshop'
icon: 'mdi:arrow-right'
tap_action:
action: call-service
service: script.motion_eye_action
service_data:
action: right
camera_id: 'camera.workshop'
- entity: 'camera.workshop'
icon: 'mdi:arrow-up'
tap_action:
action: call-service
service: script.motion_eye_action
service_data:
action: up
camera_id: 'camera.workshop'
- entity: 'camera.workshop'
icon: 'mdi:arrow-down'
tap_action:
action: call-service
service: script.motion_eye_action
service_data:
action: down
camera_id: 'camera.workshop'
- entity: 'security_feed.workshop'
aspect_ratio: 0%
type: picture-glance
It's a bit annoying to manually code all the actions. I haven't found a good way to templatize a Lovelace card with a for-loop
style iteration of the actions yet. However, if you want to use a config template card you potentially use positional matching against the known set of actions to selectivly enable the required buttons. Let me know if you get that, or anything else working. Failing that, it would probably be easiest to add a custom card with this component.
See the Releases tab to find the current version. Download the source code and move the directory to a folder named motion_eye
in the Home Assistant custom component directory. For example, config/custom_components/motion_eye
should contain all of the source code in this repository.
This custom component interacts with the undocumented MotionEye API. The motion_eye.py
file signs the requests, allowing it to query for the list of cameras. The Home Assistant camera
entity inherits from the mjpeg
camera, and assigns the appropriate attributes for stills and streams. Events are handled and translated into POST
requests to the appropriate action
endpoint.
I have tested this with:
Local VL2 Camera
Network Camera
Remote MotionEye Camera
Simple MJPEG Camera
I have tested connecting to MotionEye instances of the following kinds:
- MotionEyeOS (pre-built image for Raspberry Pis)
- MotionEye Home Assistant Supervisor Add-On
- MotionEye Docker container in Kubernetes