Hardware Connection

IceBreaker supports both the legacy Shelly Plug S (Gen 1) and the modern Shelly Plus / Gen 3 plugs. Pick an asset to see the right integration path.

Target asset

Integration flow adapts to the selected asset's hardware generation.

Detected · Gen 2 / 3 Plus

Gen 2/3 Plus — Native Edge Scripting

Modern Shelly Plus & Gen 3 plugs run JavaScript directly on-device. Telemetry is posted to IceBreaker's signed ingest bridge over HTTPS — no anon key on-device, no polling, no extra infrastructure.

1Step 1

Open the local Web UI

Browse to the plug's IP on your LAN, sign in, then open Scripts → Create new script.

2Step 2

Paste & Run

Paste the script below, hit Save, then Run. Toggle “Run on startup” so the device auto-reconnects after a power cycle.

3Step 3

Watch it stream

Open the Live Monitor — readings appear within ~1s via the Supabase Realtime channel.

Shelly Gen 2/3 ingest script

Rendering signed ingest script…

POSTs to /api/public/hooks/ingest-telemetry with a signed X-Ingest-Secret header — the publishable anon key never leaves the server.

SQL — schema & Realtime activation

icebreaker-schema.sql
-- IceBreaker schema + Realtime activation
create table public.assets (
  id text primary key,
  name text not null,
  location text,
  device_generation text not null default 'gen2_plus'
    check (device_generation in ('gen1_classic', 'gen2_plus')),
  created_at timestamptz not null default now()
);

grant select on public.assets to anon;
grant select, insert, update, delete on public.assets to authenticated;
grant all on public.assets to service_role;

alter table public.assets enable row level security;
create policy "Anyone can read assets"
  on public.assets for select to anon, authenticated using (true);
create policy "Authenticated can manage assets"
  on public.assets for all to authenticated using (true) with check (true);

create table public.telemetry_logs (
  id bigint generated always as identity primary key,
  asset_id text not null references public.assets(id) on delete cascade,
  created_at timestamptz not null default now(),
  active_power numeric,
  voltage numeric,
  current numeric
);

create index telemetry_logs_asset_created_idx
  on public.telemetry_logs (asset_id, created_at desc);

grant select, insert on public.telemetry_logs to anon;
grant select, insert, update, delete on public.telemetry_logs to authenticated;
grant all on public.telemetry_logs to service_role;

alter table public.telemetry_logs enable row level security;
create policy "Anyone can read telemetry"
  on public.telemetry_logs for select to anon, authenticated using (true);
create policy "Anyone can insert telemetry"
  on public.telemetry_logs for insert to anon, authenticated with check (true);

-- Activate Realtime streaming (single channel used by both Gen 1 + Gen 2/3)
alter table public.telemetry_logs replica identity full;
alter publication supabase_realtime add table public.telemetry_logs;

-- Migration to add hardware generation to an existing install
alter table public.assets
  add column if not exists device_generation text
    not null default 'gen2_plus'
    check (device_generation in ('gen1_classic', 'gen2_plus'));

Already applied to your backend; included here for reference.