Integrations
REST API & Home Assistant
Everything Atmovio knows is available as JSON inside your network – and pushed to your website if you want. Same field names in both directions.
Home Assistant in five minutes
Create an API key in Atmovio (Nastavení → Systém → API pro jiné systémy), paste it into the YAML below and reload Home Assistant. You get sensors for AI usage and disk, a binary sensor for recording, a camera entity per camera, and the latest detection as a sensor you can automate on.
- Nastavení → Systém → API pro jiné systémy → Vytvořit klíč. Copy the key (starts with
at_). - Add the YAML below to
configuration.yaml(replace the IP and the key). - Restart Home Assistant. Entities appear under Atmovio.
# configuration.yaml – Atmovio status, disk and recording
rest:
- resource: http://192.168.1.20/api/v1/status
headers:
Authorization: "Bearer at_XXXXXXXXXXXXXXXXXXXXXXXX"
scan_interval: 60
sensor:
- name: Atmovio AI requests today
value_template: "{{ value_json.ai.used_today }}"
icon: mdi:weather-sunset
- name: Atmovio disk used
value_template: "{{ value_json.storage.disk_pct }}"
unit_of_measurement: "%"
icon: mdi:harddisk
- name: Atmovio temperature
value_template: "{{ value_json.system.temp | replace(' °C','') }}"
unit_of_measurement: "°C"
device_class: temperature
- name: Atmovio version
value_template: "{{ value_json.version }}"
json_attributes: ["update"]
binary_sensor:
- name: Atmovio recording
value_template: "{{ value_json.frigate.online and value_json.storage.mode in ['recording','legacy'] }}"
device_class: running
- name: Atmovio daytime
value_template: "{{ value_json.ai.daytime }}"
device_class: light
# configuration.yaml – one entity per camera (name = camera id in Atmovio)
camera:
- platform: generic
name: Garden sky
still_image_url: http://192.168.1.20/api/v1/cameras/zahrada/snapshot.jpg?h=720&api_key=at_XXXXXXXXXXXXXXXXXXXXXXXX
verify_ssl: false
# camera status from /api/v1/cameras
rest:
- resource: http://192.168.1.20/api/v1/cameras
headers:
Authorization: "Bearer at_XXXXXXXXXXXXXXXXXXXXXXXX"
scan_interval: 60
binary_sensor:
- name: Garden camera online
value_template: "{{ (value_json.cameras | selectattr('name','eq','zahrada') | first).online }}"
device_class: connectivity
# configuration.yaml – latest alert as a sensor (id changes → new detection)
rest:
- resource: http://192.168.1.20/api/v1/detections?limit=1
headers:
Authorization: "Bearer at_XXXXXXXXXXXXXXXXXXXXXXXX"
scan_interval: 60
sensor:
- name: Atmovio last sky alert
value_template: "{{ value_json.detections[0].phenomenon if value_json.detections else 'none' }}"
json_attributes_path: "$.detections[0]"
json_attributes: ["id", "ts", "score", "camera_label", "description", "image_url", "detail_url"]
# automations.yaml – push a notification with the picture
- alias: Atmovio – sky alert
trigger:
- platform: state
entity_id: sensor.atmovio_last_sky_alert
attribute: id
condition:
- condition: template
value_template: "{{ state_attr('sensor.atmovio_last_sky_alert','score') | int >= 7 }}"
action:
- service: notify.mobile_app_my_phone
data:
title: "{{ states('sensor.atmovio_last_sky_alert') }} · {{ state_attr('sensor.atmovio_last_sky_alert','score') }}/10"
message: "{{ state_attr('sensor.atmovio_last_sky_alert','description') }}"
data:
image: "{{ state_attr('sensor.atmovio_last_sky_alert','image_url') }}?api_key=at_XXXXXXXXXXXXXXXXXXXXXXXX"
url: "{{ state_attr('sensor.atmovio_last_sky_alert','detail_url') }}"
The Pi answers over plain HTTP inside your LAN; Home Assistant must run on the same network or reach it over VPN.
REST API (read-only)
Bearer key in the Authorization header (or X-API-Key, or ?api_key=). Served over HTTP in your LAN/VPN – never expose it to the internet.
curl -H "Authorization: Bearer at_…" http://192.168.1.20/api/v1/status | jq .GET /api/v1/status | version, Frigate, storage, AI usage and threshold, sun times, system, outages, available update |
GET /api/v1/cameras | cameras: online, fps, IP, LAN/VPN, AI on/off, snapshot URL |
GET /api/v1/cameras/{name}/snapshot.jpg?h=720 | current JPEG frame |
GET /api/v1/detections?limit=20&camera=¬ified=1&min_score=0 | AI detections (alerts only by default; notified=0 = all evaluations) |
GET /api/v1/detections/{id} · /image.jpg | one detection and its snapshot |
GET /api/v1/videos · /{id}/download | exported clips with download links; MP4 |
GET /api/v1/events?limit=20 | outage / recovery / sky event log |
GET /api/health | no auth – for uptime monitoring |
A detection looks like this
{
"id": 123, "ts": "2026-09-13T19:12:03", "camera": "zahrada", "camera_label": "Zahrada – západ",
"score": 9, "phenomenon": "Červánky", "phenomena": ["cervanky"],
"description": "Výrazné oranžovo-růžové červánky nad obzorem.",
"notified": true, "exported": true, "error": null,
"image_url": "http://192.168.1.20/api/v1/detections/123/image.jpg",
"detail_url": "http://192.168.1.20/detection/123"
}Webhook – Atmovio pushes to you
For a website that cannot reach the Pi. Every minute a heartbeat with the full API snapshot and camera previews; every alert with the picture. Token-authenticated POST, a PHP receiver is included in the repository.
- Deploy the receiver (or write your own – the format is documented).
- Nastavení → Upozornění → vlastní web: URL + token, “Uložit a otestovat”.
- From now on your site shows the same data as the Atmovio admin.
POST https://your-site.example/atmovio/webhook.php
Authorization: Bearer <token>
{
"type": "event", "kind": "sky", "ts": "2026-09-13T19:12:03",
"camera": "zahrada", "camera_label": "Zahrada – západ",
"subject": "Červánky 9/10", "message": "…", "score": 9, "phenomena": ["cervanky"],
"image": "<base64 JPEG>", "link": "http://192.168.1.20/detection/123"
}Also works with
- Node-RED – HTTP request node → JSON; trigger flows on new detections.
- Grafana / InfluxDB – Poll /api/v1/status once a minute for disk, temperature and AI usage.
- Any script – curl + jq is enough – see the examples in the reference.

