AtmovioAtmovio

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.

  1. Nastavení → Systém → API pro jiné systémy → Vytvořit klíč. Copy the key (starts with at_).
  2. Add the YAML below to configuration.yaml (replace the IP and the key).
  3. 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/statusversion, Frigate, storage, AI usage and threshold, sun times, system, outages, available update
GET /api/v1/camerascameras: online, fps, IP, LAN/VPN, AI on/off, snapshot URL
GET /api/v1/cameras/{name}/snapshot.jpg?h=720current JPEG frame
GET /api/v1/detections?limit=20&camera=&notified=1&min_score=0AI detections (alerts only by default; notified=0 = all evaluations)
GET /api/v1/detections/{id} · /image.jpgone detection and its snapshot
GET /api/v1/videos · /{id}/downloadexported clips with download links; MP4
GET /api/v1/events?limit=20outage / recovery / sky event log
GET /api/healthno 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.

  1. Deploy the receiver (or write your own – the format is documented).
  2. Nastavení → Upozornění → vlastní web: URL + token, “Uložit a otestovat”.
  3. 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.

Full documentation