← Tutte le idee Casa e famiglia

PaperMono

La lista della spesa su una calamita e-ink da frigo

Cosa fa

Uno schermo e-ink (come quello degli e-reader) attaccato al frigo che mostra la lista della spesa, aggiornabile dal telefono.

Come guadagna

Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: vendita del dispositivo già montato, o di un kit da montare.

Rendilo tuo

  • Parti dalla parte software: lista condivisa per la famiglia, e il display come accessorio.
  • Lo stesso display per i turni delle pulizie o il menù della settimana.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Lista sul Frigo": uno schermo e-ink (come quello degli e-reader) con la calamita, da attaccare al frigo, che mostra la lista della spesa e gli impegni di famiglia, aggiornati dal telefono di tutti. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con le foto del dispositivo e il prezzo del kit
2. Ordine del kit (schermo e-ink, scheda ESP32, batteria, cornice con calamita)
3. App della famiglia: lista della spesa condivisa e promemoria
4. Collegamento del dispositivo con un codice
5. Guida per chi vuole costruirlo da solo con i pezzi

Stile: domestico e pulito: sfondo bianco, grigio carta #E5E5E0, nero, accento verde #16A34A, carattere "Inter"; sullo schermo e-ink solo nero su bianco con caratteri grandi. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "famiglie" e "membri": la famiglia e chi ne fa parte
- "voci": lista della spesa e promemoria, fatte o no
- "dispositivi": codice del dispositivo, token segreto, famiglia, ultimo collegamento, batteria
- "ordini": kit ordinato, indirizzo, pagato

Regole di sicurezza obbligatorie:
- ogni famiglia vede solo le sue voci e i suoi dispositivi
- il dispositivo legge la lista con il suo token segreto, solo della sua famiglia
- "pagato" lo cambia solo il pagamento

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Il dispositivo che legge la lista

Il dispositivo è una scheda ESP32 con uno schermo e-ink da 7,5 pollici e una batteria: si sveglia ogni 30 minuti (o quando si preme il pulsante), si collega al Wi-Fi, chiede la lista alla Edge Function "lista" con il suo token, la disegna e torna a dormire. Così la batteria dura settimane (codice del dispositivo nei Dettagli tecnici).

L'app della famiglia è una PWA: lista della spesa condivisa in tempo reale, voci da spuntare, e promemoria del giorno. La Edge Function restituisce al dispositivo solo un testo semplice già impaginato (titolo, voci, data), così il codice sul dispositivo resta piccolo.

Collegamento: il dispositivo mostra un codice di 6 caratteri, la famiglia lo inserisce nell'app.

4. Kit e versione fai da te

Il kit si ordina e si paga online: schermo, scheda, batteria, cornice stampata in 3D con calamita, già programmato. Pannello amministratori per gli ordini e la spedizione.

Guida gratuita per chi vuole costruirlo da solo: elenco dei pezzi, schema dei collegamenti e codice da caricare. L'app per la famiglia è gratuita per chi ha il kit.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 79 € per il kit spedito. Il pagamento conferma l'ordine del kit.

A pagamento riuscito il webhook imposta "pagato" a true nella tabella "ordini", sulla riga del ordine indicata in client_reference_id.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Batteria: lascia un dispositivo acceso una settimana con aggiornamento ogni 30 minuti e misura quanta batteria consuma.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Il codice del dispositivo (ESP32)

Programma per ESP32 (Arduino): si sveglia, scarica la lista, la disegna sullo schermo e-ink con la libreria GxEPD2 e torna a dormire per 30 minuti.

#include <WiFi.h>
#include <HTTPClient.h>
#include <GxEPD2_BW.h>
#include <Fonts/FreeSansBold12pt7b.h>

// Schermo 7,5" 800x480 (modello da adattare al proprio)
GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> schermo(GxEPD2_750_T7(5, 17, 16, 4));

const char* WIFI = "NOME-WIFI";
const char* PASSWORD = "PASSWORD-WIFI";
const char* URL = "https://TUO-PROGETTO.supabase.co/functions/v1/lista";
const char* TOKEN = "TOKEN-DEL-DISPOSITIVO";

void setup() {
  WiFi.begin(WIFI, PASSWORD);
  for (int i = 0; i < 40 && WiFi.status() != WL_CONNECTED; i++) delay(250);

  String testo = "Nessuna connessione";
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(URL);
    http.addHeader("Authorization", String("Bearer ") + TOKEN);
    if (http.GET() == 200) testo = http.getString();   // testo semplice, una voce per riga
    http.end();
  }

  schermo.init();
  schermo.setRotation(0);
  schermo.setFont(&FreeSansBold12pt7b);
  schermo.setFullWindow();
  schermo.firstPage();
  do {
    schermo.fillScreen(GxEPD_WHITE);
    schermo.setTextColor(GxEPD_BLACK);
    schermo.setCursor(30, 50);
    int y = 50;
    int inizio = 0;
    while (inizio < testo.length() && y < 460) {       // una riga alla volta
      int fine = testo.indexOf('\n', inizio);
      if (fine < 0) fine = testo.length();
      schermo.setCursor(30, y);
      schermo.print(testo.substring(inizio, fine));
      y += 36;
      inizio = fine + 1;
    }
  } while (schermo.nextPage());
  schermo.hibernate();

  esp_sleep_enable_timer_wakeup(30ULL * 60 * 1000000);  // 30 minuti
  esp_deep_sleep_start();
}

void loop() {}

Famiglie, voci e dispositivi

La lista condivisa della famiglia e la funzione che il dispositivo usa con il suo token per leggere solo la sua lista.

create table membri (
  famiglia_id uuid not null,
  utente_id uuid not null references auth.users(id) on delete cascade,
  primary key (famiglia_id, utente_id)
);

create function in_famiglia(f uuid) returns boolean
language sql stable security definer set search_path = public as $
  select exists (select 1 from membri where famiglia_id = f and utente_id = auth.uid());
$;

create table voci (
  id uuid primary key default gen_random_uuid(),
  famiglia_id uuid not null,
  testo text not null,
  tipo text not null default 'spesa' check (tipo in ('spesa', 'promemoria')),
  fatta boolean not null default false,
  creata_il timestamptz not null default now()
);
alter table voci enable row level security;
create policy "lista di famiglia" on voci for all
  using (in_famiglia(famiglia_id)) with check (in_famiglia(famiglia_id));

create table dispositivi (
  codice text primary key,
  famiglia_id uuid,
  token_hash text not null,
  ultimo_collegamento timestamptz
);
alter table dispositivi enable row level security;

-- Usata dalla Edge Function "lista" dopo aver controllato il token del dispositivo
create function testo_per_dispositivo(f uuid) returns text
language sql stable security definer set search_path = public as $
  select 'SPESA - ' || to_char(now() at time zone 'Europe/Rome', 'DD/MM HH24:MI') || E'\n' ||
         coalesce(string_agg('[ ] ' || testo, E'\n' order by creata_il), 'Lista vuota!')
  from voci where famiglia_id = f and not fatta and tipo = 'spesa';
$;
revoke execute on function testo_per_dispositivo(uuid) from public, anon, authenticated;
grant execute on function testo_per_dispositivo(uuid) to service_role;

Pezzi comuni a tutti i progetti

Glossario

E-ink
Lo schermo degli e-reader: consuma corrente solo quando cambia immagine e si legge bene anche alla luce.
ESP32
Una piccola scheda elettronica economica con Wi-Fi, molto usata per i progetti fai da te.
Deep sleep
Un sonno profondo in cui la scheda consuma quasi niente, fino al risveglio programmato.