Close
0%
0%

Meowtion: on-device AI cat health collar

An open-source cat collar that monitors eating, drinking, and rest, and flags habit changes that appear before illness does.

Similar projects worth following
0 followers
Cats hide illness well. By the time it looks obviously wrong it is often advanced. The early warning is in the routine: a cat drinking more, eating less or grooming less is telling you something days before it shows.

Meowtion is a battery collar that classifies behaviour on the collar itself, so you notice the change rather than the crisis.

Collar nRF52840 Sense, Zephyr, two int8 TFLite models
| BLE
Station ESP32-S3 gateway -> Firebase -> Streamlit dashboard

An IMU model classifies every 5 s window; only when confidence drops below 0.75 does a short audio model wake to confirm. 92.3% on a held-out split from a first single-cat dataset. Audio is classified on-device and discarded, never transmitted. Both models share one 48 KiB tensor arena on a part with 256 KiB of RAM.

Define your own behaviours, label clips, retrain, and the model reaches the collar over the air.

Firmware, STLs and full technical reference:
https://github.com/Jerome-Graves/meowtion

The problem

Cats are experts at hiding illness. By the time something looks obviously wrong it is often already advanced. But the early warning is usually there in the routine: a cat that starts drinking more, eating less, or grooming less is telling you something days before it becomes visible.

Meowtion is a battery-powered collar that watches those habits continuously. It classifies behaviour on the collar itself and surfaces the trend on a dashboard, so you notice the change rather than the crisis.

How it works

  Cat
   |
  Collar     nRF52840 Sense - Zephyr - on-device AI - battery
   |  BLE
  Station    ESP32-S3 - ESP-IDF - WiFi gateway - mains powered
   |  WiFi / HTTPS
  Firebase   Auth - Realtime Database - Storage - Functions
   |
  Dashboard  Streamlit + Firebase web

The collar is Bluetooth-only to keep the power budget survivable, so an always-on station plugged in near the food bowl is its gateway to the cloud. It is multi-user: each owner registers their own cats and stations and sees only their own data.

The cascade, and what it has actually done

The design premise was that eating and drinking should be hard to separate on an accelerometer — head down, rhythmic, similar duration — but easy to separate by sound. Audio is expensive and the collar has a 100 mAh cell, so running it continuously was never an option.

Meowtion runs a confidence-gated cascade instead. An int8 IMU model classifies every 5 s window, and only when its softmax confidence falls below 0.75 does it wake a short audio model to confirm. Most of the time the cheap model is enough; the expensive one fires only when the answer is genuinely uncertain.

Here is how that has performed, on a held-out split of a first single-cat dataset (155 labelled clips, 116/39 train/test):

  • Overall accuracy — 92.3% (36 of 39)
  • Eat — F1 0.94
  • Resting — F1 1.00
  • Drink — F1 0.80 (recall 0.67, from 11 training clips)
  • Moving — F1 0.00 (10 training clips; both test clips read as Eat)

The audio stage fired on 6 of the 39 clips — the 15% below threshold — and changed none of them. The IMU model was already confident and correct on the confusable cases this recording contained, so the cascade's accuracy equals the IMU stage's. The mechanism is built and verified; the accuracy gain I designed it for is not yet demonstrated, and won't be until there is a larger, more behaviourally ambiguous dataset than one cat and eleven drink clips.

What the gate buys unconditionally is memory. The two models share a single 48 KiB tensor arena — legal only because the gate guarantees they are never resident at the same time — and their weights execute in place from the flash model partition rather than being copied into RAM. On a part with 256 KiB total, sitting at 226 KiB static with an encrypted BLE link, that is the difference between two models and one.

Audio is classified on-device and discarded immediately — never recorded, never transmitted. That was a hard requirement, not a feature: a microphone on a pet in someone's home should not be sending audio anywhere.

It is not fixed-function

The pipeline has no hardcoded class list. You define the behaviours you want to recognise in the dashboard, label the captured clips, and the model trains on whatever set you chose. Training runs server-side in a Cloud Function and the new model is delivered to the collar over the air. Scratching, litter-tray use, play — if you can label it, it can learn it.

Build

There is no custom PCB. Each device is a Seeed XIAO board in a 3D-printed shell, which makes this genuinely reproducible: two boards, a LiPo, a filter membrane, a collar strap, and a few hours of printing.

The collar shells are PETG with a flexible TPU skin, bonded with water-resistant glue. A 20 mm hydrophobic PTFE membrane sits over the microphone hole — it passes sound while keeping out water and dust, which matters for something worn by an animal that drinks from bowls and goes outside. The collar mounts to a standard 10 mm quick-release safety strap; the quick-release...

Read more »

  • 1 × Seeed XIAO nRF52840 Sense
  • 1 × 1S LiPo 3.7 V 100 mAh with BMS/protection
  • 1 × 20 mm hydrophobic PTFE filter membrane disc
  • 1 × 10 mm quick-release safety collar
  • 1 × Seeed XIAO ESP32-S3 — BLE to WiFi gateway

View all 6 components

  • 155 clips from one cat: what this data can't tell me

    Jerome Graves6 hours ago 0 comments

    Before discussing any model work, it's worth being straight about what the collar has actually seen.

    The dataset is 191 clips recorded from one cat over 19 capture sessions. 155 of them carry a behaviour label; the other 36 are unlabelled and excluded. Each clip is a 5-second window: 8 kHz mu-law audio paired with time-aligned 6-axis motion at 104 Hz. The train/test split is 116/39, a 25% held-out split stratified by class.

    The class balance is the interesting part, and not in a good way:

      Eat       94
      Resting   40
      Drink     11
      Moving    10

    Eating dominates because a cat eating is easy to catch and easy to label. Drinking is rarer, briefer, and happens when you aren't watching. "Moving" is a catch-all that turned out to be the hardest to record deliberately, because the moment you follow a cat around with a phone, it stops doing whatever it was doing.

    That imbalance sets a ceiling on what any result from this data means. Eleven drink clips is not enough to claim anything general about drinking, and I'll come back to what that does to the numbers in the next log.

    One thing the label set does show: it isn't hardcoded. This particular recording happened to contain eat/drink/resting/moving, discovered from the data rather than fixed in firmware. A different recording produces a different label set without touching the collar.

    Full dataset breakdown and the training pipeline: github.com/Jerome-Graves/meowtion/tree/main/docs/technical

View project log

  • 1
    Build Instructions

    1. Seat the XIAO nRF52840 Sense and the LiPo in the collar back shell.

    2. Fit the 20 mm PTFE membrane over the mic hole on the inside of the front shell.

    3. Close the front and back shells and bond them with water-resistant glue.

    4. Slip the sealed assembly into the TPU skin and attach it to the quick-release collar.

    5. Seat the XIAO ESP32-S3 in the station shell and glue it closed.

    6. Flash both boards and register them to your Firebase project.

    Print files (4 STLs), firmware for both boards, the Firebase setup and the full
    technical reference are all in the repo:
    https://github.com/Jerome-Graves/meowtion

View all instructions

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates