Introduzione
La batteria del tuo MacBook è un sistema intelligente che misura se stesso in continuazione: conosce la tensione di ogni singola cella, la temperatura interna, la corrente che entra e quella che esce, e tiene traccia di quanto si è degradata rispetto al giorno in cui è uscita dalla fabbrica. Sa anche se le sue celle stanno invecchiando in modo uniforme o se una di esse sta cedendo prima delle altre — un segnale che permette di capire con largo anticipo la durata della batteria inizierà a calare in modo percettibile.
Nessuna di queste informazioni appare nell’interfaccia standard di macOS.
In questo articolo vedremo come accedere ai dati reali della batteria utilizzando il Terminale — uno strumento già presente in ogni Mac, che non richiede installazioni aggiuntive. Non è un’operazione complicata: si tratta di lanciare un comando, leggerlo riga per riga, e sapere cosa significa ciascun valore. Al termine dell’articolo, analogamente a quanto fatto per il caricabatterie, presenterò uno script che, una volta lanciato, illustrerà le informazioni sulla batteria in maniera semplice.
Accedere a questi dati può essere utile in diversi casi concreti. Se stai valutando l’acquisto di un Mac usato, i dati del Terminale ti dicono molto di più dei cicli dichiarati dal venditore: puoi verificare la capacità residua in mAh, controllare il bilanciamento tra le celle e leggere il numero di serie del pacco batteria per confrontarlo con i record Apple. Se hai già fatto sostituire la batteria e vuoi verificare la qualità del componente installato, gli stessi parametri ti dicono se è originale, se è calibrata correttamente e se le celle partono bilanciate. E se il tuo Mac è in uso da qualche anno, questi dati ti permettono di valutare con precisione lo stato di salute reale attraverso informazioni oggettive come la percentuale esatta di capacità rimasta rispetto al progetto originale.
Inizieremo dall’interfaccia grafica, per capire cosa offre e dove si ferma. Poi introdurremo ioreg, lo strumento del Terminale che interroga direttamente il chip di monitoraggio della batteria, e vedremo insieme come interpretare ogni dato che restituisce. Successivamente passeremo alla costruzione dello script e alla sua installazione.
1. La via più semplice: Informazioni di Sistema
Il punto di partenza è quello che fa chiunque quando vuole sapere qualcosa sul proprio Mac: tasto ⌥ (Option) tenuto premuto mentre si apre il menu Apple in alto a sinistra, poi Informazioni di Sistema… e infine la voce Alimentazione nella colonna laterale sinistra.
Il pannello che si apre raccoglie i dati principali in due blocchi: lo stato della batteria e le informazioni sul caricatore connesso.
Cosa otteniamo
Dalla sezione batteria:
- Cicli di carica — il contatore dei cicli completi effettuati
- Condizione — una valutazione qualitativa (Normale / Assistenza consigliata)
- Stato attuale — La percentuale di carica
- Capacità a carica completa — in alcuni recenti versioni di macOS, la quantità di mAh che è possibile caricare
Cosa manca
Il pannello Alimentazione non mostra alcune informazioni che sono comunque rilevabili dal firmwareche controlla i circuiti di gestione della batteria. Mancano:
- La capacità residua in mAh
- La tensione di lavoro delle singole celle
- Il bilanciamento tra le celle — un indicatore precoce di degrado
- La temperatura del pacco batteria
- La corrente e la potenza istantanea
- La tensione e la corrente effettivamente negoziate con il caricatore
- Il numero di serie del pacco batteria e la sua data di produzione
- Il numero di scritture sul chip di monitoraggio — un indicatore dell’intensità d’uso del firmware nel tempo
In pratica: Informazioni di Sistema è utile per una verifica rapida, ma non risponde a domande più precise come quanta capacità ho perso rispetto al nuovo? o le mie celle sono ancora bilanciate nonostante l’usura?
Per rispondere a queste domande serve scendere di un livello, e il Terminale è lo strumento giusto.
2. ioreg: il registro I/O di macOS
Cos’è
ioreg — abbreviazione di I/O Registry — è uno strumento a riga di comando incluso in ogni installazione di macOS. Non è un programma aggiuntivo, non va installato: è già presente tra i comandi disponibili del Terminale.
Il suo scopo è esporre il contenuto dell’I/O Registry, un albero gerarchico che il kernel di macOS costruisce e aggiorna in tempo reale per tenere traccia di tutta l’hardware connessoal sistema: processore, memoria, GPU, dischi, porte, e — quello che ci interessa — la batteria.
Ogni dispositivo hardware nel sistema occupa un nodo nell’albero. Ogni nodo ha un nome, un tipo, e un insieme di proprietà che descrivono lo stato corrente di quel dispositivo. ioreg permette di interrogare questo albero dalla riga di comando e di leggere quelle proprietà direttamente, senza passare per interfacce grafiche che filtrano e, spesso, approssimano e semplificano.
Come funziona il comando
La sintassi base è:
ioreg [opzioni]
Le opzioni che useremo:
- -r — modalità ricorsiva: discende nell’albero a partire dal nodo trovato
- -n NomeNodo — cerca nell’albero il nodo con quel nome specifico
- | grep “parola” — filtra l’output tenendo solo le righe che contengono quella parola
Il nodo della batteria: AppleSmartBattery
Il nodo che ci interessa si chiama AppleSmartBattery. È il driver del kernel che gestisce la comunicazione con il chip di monitoraggio fisicamente saldato sulla scheda della batteria.
Il comando completo che useremo è:
ioreg -rn AppleSmartBattery
Da solo produce un output molto verboso — centinaia di righe. Lo filtreremo con grep o con awk per estrarre solo i campi che ci interessano. Ma prima vale la pena capire come il Mac ottiene quelle informazioni dal chip.
Il protocollo sottostante: SMBus e Smart Battery
La batteria del MacBook non è un componente passivo. Al suo interno, oltre alle celle al litio, c’è un microcontrollore dedicato — nei MacBook Intel tipicamente un chip Texas Instruments della serie BQ — che monitora in continuazione tensione, corrente, temperatura e stato di carica, e che calcola autonomamente parametri derivati come la capacità residua e il numero di cicli.
Questo chip comunica con il resto del sistema attraverso SMBus (System Management Bus), un bus seriale a due fili derivato da I²C e progettato specificamente per la comunicazione tra componenti di gestione dell’alimentazione. È un protocollo robusto ma vecchio e lento, d’altronde per il polline dei dati della batteria non servono velocità stratosferiche.
Il dialogo funziona secondo lo standard Smart Battery System (SBS), una specifica sviluppata negli anni Novanta da Duracell e Intel per standardizzare la comunicazione tra batterie intelligenti e i sistemi che le ospitano. Lo standard definisce un insieme di registri — indirizzi numerici — che il chip della batteria deve esporre. Il sistema operativo può leggere questi registri via SMBus per ottenere i parametri in tempo reale.
Alcuni dei registri definiti dallo standard SBS:
| Registro | Nome | Contenuto |
| 0x09 | Current | Corrente istantanea in mA |
| 0x0A | AverageCurrentI | Corrente media degli ultimi 60 secondi |
| 0x0D | RelativeStateOfCharge | Percentuale di carica (UISoc) |
| 0x0F | Voltage | Tensione ai morsetti in mV |
| 0x17 | CycleCount | Contatore dei cicli |
| 0x18 | DesignCapacity | Capacità originale di progetto in mAh |
Apple implementa lo standard SBS e vi aggiunge un layer proprietario per esporre parametri come CellVoltage, UISoc, ChemID. I blob BatteryData e PowerTelemetryData sono estensioni Apple non documentate pubblicamente, scritte e lette attraverso comandi manufacturer-specific che lo standard SBS prevede come spazio di espansione.
Il driver AppleSmartBattery legge continuamente questi registri, li elabora e li pubblica nell’I/O Registry — da cui ioreg li recupera e ce li mette a disposizione.
il flusso di lettura:
La catena completa è:
Celle → Chip TI (SMBus) → Driver AppleSmartBattery → I/O Registry → ioreg → noi
Ogni passaggio verso destra aggiunge un livello di astrazione e, inevitabilmente, un filtro. Informazioni di Sistema si trova all’estremo destro di questa catena e mostra solo quello che Apple ha deciso di esporre nell’interfaccia grafica. ioreg si ferma un passo prima: legge direttamente dall’I/O Registry, senza ulteriori filtri.
Il risultato è che con ioreg vediamo gli stessi dati grezzi che il sistema operativo usa internamente per prendere decisioni — decidere quando smettere di caricare, quando mostrare l’avviso di sostituzione, come stimare l’autonomia rimanente. Dati che normalmente restano sotto il cofano.
Nella tabella seguente sono riportati tutti i parametri che sono ricavabili con ioreg dalla lettura del nodo batteria, il significato di ogni parametro e il comando del Terminale da lanciare per leggerlo.
| Voce | Unità | Significato | Comando ioreg |
|---|---|---|---|
| Capacità e salute | |||
| Capacità di progetto (Design) | mAh | Capacità originale dichiarata dal produttore nel datasheet. Valore fisso per tutta la vita del dispositivo — il riferimento assoluto per calcolare la degradazione. | ioreg -rn AppleSmartBattery | grep “DesignCapacity” |
| Capacità piena attuale (FCC) | mAh | Quanta carica riesce ad accumulare la batteria oggi. Diminuisce con i cicli e il tempo. Confrontato con il Design dà la salute reale: FCC ÷ Design × 100. | ioreg -rn AppleSmartBattery | grep “FccComp1” |
| Capacità attuale (CurrentCapacity) | mAh | Carica presente nelle celle in questo momento. Varia continuamente durante uso e ricarica. | ioreg -rn AppleSmartBattery | grep “CurrentCapacity” |
| SoC reale (chip) | % | Percentuale di carica calcolata direttamente dal chip di monitoraggio sulla base della carica fisica nelle celle. Dato grezzo, non filtrato. | ioreg -rn AppleSmartBattery | grep “StateOfCharge” |
| SoC visibile (barra menu) | % | Percentuale che macOS mostra in menu bar. Apple applica un offset positivo deliberato: tende a essere più alta del SoC reale per ragioni di esperienza utente e per mascherare la carica ottimizzata. | ioreg -rn AppleSmartBattery | grep “UISoc” |
| Tensione celle (3S) | mV | Tensione di ciascuna delle tre celle in serie che compongono il pacco batteria. Un delta elevato tra le celle (oltre 50–100 mV) indica sbilanciamento e degrado prematuro. | ioreg -rn AppleSmartBattery | grep “CellVoltage” |
| Tensione pack | mV | Tensione totale del pacco batteria, somma delle tre celle. A piena carica si attesta intorno a 12.600 mV (circa 4.200 mV × 3). | ioreg -rn AppleSmartBattery | grep “BatteryData” | grep -o ‘”Voltage”=[0-9]*’ |
| Tensione totale | mV | Tensione letta dal registro LegacyBatteryInfo, campione istantaneo. Coincide sostanzialmente con la tensione pack. | ioreg -rn AppleSmartBattery | grep “LegacyBatteryInfo” |
| Cicli e usura | |||
| Cicli di carica | n | Cicli equivalenti completati. Un ciclo corrisponde al consumo del 100% della capacità totale, anche distribuito su più sessioni. Non conta le volte che hai attaccato il cavo. | ioreg -rn AppleSmartBattery | grep “CycleCount” |
| Cicli (BatteryData) | n | Stesso contatore di cicli letto dal registro BatteryData interno al chip. Solitamente coincide con il precedente; una discrepanza indica problemi di sincronizzazione firmware. | ioreg -rn AppleSmartBattery | grep “BatteryData” | grep -o ‘”CycleCount”=[0-9]*’ |
| Scritture flash gauge | n | Numero di volte che il chip di monitoraggio ha scritto sulla propria memoria flash per aggiornare i parametri di calibrazione. Misura l’intensità d’uso del firmware — invisibile da qualsiasi GUI. | ioreg -rn AppleSmartBattery | grep “DataFlashWriteCount” |
| Corrente e potenza | |||
| Corrente istantanea | mA | Corrente in ingresso (positiva, batteria in carica) o in uscita (negativa, Mac a batteria) nell’istante della lettura. Valori negativi appaiono come grandi interi unsigned: il comando battery-info li riconverte automaticamente. | ioreg -rn AppleSmartBattery | grep “Amperage” |
| Potenza batteria | mW | Potenza istantanea della batteria. 0 = equilibrio energetico (tutto dal caricatore). Negativa = scarica. Positiva = ricarica attiva. | ioreg -rn AppleSmartBattery | grep “BatteryPower” |
| Potenza ingresso sistema | mW | Potenza totale che il sistema sta assorbendo dal caricatore in questo momento. Varia continuamente con il carico CPU/GPU. | ioreg -rn AppleSmartBattery | grep “SystemPowerIn” |
| Corrente ingresso (adapter) | mA | Corrente misurata all’ingresso dal caricatore lato sistema, campionata dalla telemetria di potenza. | ioreg -rn AppleSmartBattery | grep “SystemCurrentIn” |
| Tensione ingresso (adapter) | mV | Tensione misurata all’ingresso dal caricatore lato sistema. Può differire leggermente dalla tensione USB-PD negoziata per caduta di tensione sul cavo. | ioreg -rn AppleSmartBattery | grep “SystemVoltageIn” |
| Caricatore connesso | |||
| Caricatore (Watts) | W | Potenza nominale massima dichiarata dal caricatore durante la negoziazione USB Power Delivery. | ioreg -rn AppleSmartBattery | grep “AdapterDetails” | grep -o ‘”Watts”=[0-9]*’ |
| Tensione USB-PD | mV | Tensione concordata tra Mac e caricatore via USB-PD. Tipicamente 20.000 mV (20 V) per caricatori da 60 W e oltre. | ioreg -rn AppleSmartBattery | grep “AdapterVoltage” |
| Corrente USB-PD | mA | Corrente massima concordata via USB-PD. Moltiplicata per la tensione dà i watt effettivi disponibili sul contratto di alimentazione. | ioreg -rn AppleSmartBattery | grep “AdapterDetails” | grep -o ‘”Current”=[0-9]*’ |
| Tipo caricatore | testo | Stringa descrittiva del tipo di caricatore identificato dal kernel. “pd charger” = caricatore USB Power Delivery generico. Caricatori Apple originali mostrano descrizioni più specifiche. | ioreg -rn AppleSmartBattery | grep “AdapterDetails” | grep -o ‘”Description”=”[^”]*”‘ |
| Stato operativo | |||
| In carica | Yes/No | Il chip sta attivamente immettendo corrente nelle celle. Può essere No anche con il cavo attaccato se la batteria è piena o se la carica ottimizzata ha messo in pausa il ciclo. | ioreg -rn AppleSmartBattery | grep “IsCharging” |
| Completamente carica | Yes/No | Il firmware considera la batteria al suo massimo. Con la carica ottimizzata attiva può diventare Yes all’80–90% fisico anziché al 100%. | ioreg -rn AppleSmartBattery | grep “FullyCharged” |
| Alimentazione esterna | Yes/No | Un caricatore è fisicamente connesso. Non implica che stia caricando la batteria: il Mac potrebbe usare solo il caricatore per alimentare il sistema con la batteria ferma. | ioreg -rn AppleSmartBattery | grep “ExternalConnected” |
| Tempo rimanente (stima) | min | Stima in minuti dell’autonomia residua a batteria, calcolata dal chip in base al consumo medio recente. Assente o 0 quando il Mac è collegato alla corrente. | ioreg -rn AppleSmartBattery | grep “TimeRemaining” |
| Temperatura batteria | °C | Temperatura del pacco batteria convertita da decimi di Kelvin. Sopra i 40 °C il firmware riduce la corrente di carica per proteggere le celle dalla degradazione accelerata. | ioreg -rn AppleSmartBattery | grep “Temperature” |
| Identità e chimica | |||
| Produttore batteria | stringa | Nome del produttore delle celle, letto dal registro SBS 0x20. I valori più comuni sui MacBook Intel sono “SMP” (Simplo Technology) e “ATL” (Amperex Technology). Utile per verificare l’originalità della batteria dopo una sostituzione. | ioreg -rn AppleSmartBattery | grep “Manufacturer” |
| Modello chip gauge | stringa | Nome del dispositivo restituito dal chip di monitoraggio, registro SBS 0x21. Sui MacBook Intel è tipicamente il codice del chip Texas Instruments installato (es. “bq20z451”). Conferma quale gauge è fisicamente presente nella batteria. | ioreg -rn AppleSmartBattery | grep “DeviceName” |
| ChemID (chimica celle) | codice | Codice interno Texas Instruments che identifica la chimica specifica delle celle. Il firmware lo legge per selezionare i parametri corretti di carica e stima della capacità residua. | ioreg -rn AppleSmartBattery | grep “ChemID” |
| Seriale batteria | stringa | Numero di serie del pacco batteria, distinto dal seriale del Mac. Permette di verificare se la batteria è stata sostituita e con quale componente. | ioreg -rn AppleSmartBattery | grep “BatteryData” | grep -o ‘”Serial”=”[^”]*”‘ |
Digitando sul Terminale il comando riportato nell’ultima colonna della tabella, otterrete la lettura del parametro compiutamente descritto dai valori presenti nella stessa riga.
Costruiamo il comando battery-info
Interrogare ioreg ogni volta che si vuole controllare la batteria funziona, ma è scomodo: il comando è lungo, l’output grezzo è verboso, e i valori come la temperatura — espressa in decimi di Kelvin — richiedono un calcolo di conversione per diventare fruibili.
La soluzione è trasformare tutto questo in una funzione permanente del Terminale: un comando che ho chiamato battery-info, che produce in output una tabella formattata con tutti i valori già convertiti nelle unità corrette, ordinati e allineati in colonne.
Questo è possibile grazie a .zshrc, il file di configurazione che il Terminale legge ogni volta che si apre una nuova finestra. Tutto quello che si inserisce in quel file diventa disponibile in ogni sessione.
Come funziona lo script
Lo script definisce una funzione chiamata battery-info che esegue tre operazioni in sequenza.
Prima stampa un’intestazione con la data e l’ora della rilevazione — utile se si vuole confrontare misurazioni prese in momenti diversi, per esempio sotto carico e a riposo.
Poi lancia ioreg -rn AppleSmartBattery e passa l’output a awk, un linguaggio di elaborazione del testo incluso in ogni Mac. Il blocco awk percorre riga per riga l’output di ioreg, riconosce i campi che ci interessano e li estrae con precisione, navigando dentro i blob nidificati come BatteryData, PowerTelemetryData e AdapterDetails. Il risultato viene ordinato alfabeticamente e formattato in colonne pulite tramite column, che allinea automaticamente i valori indipendentemente dalla lunghezza delle etichette.
Il risultato è una tabella come questa:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔋 STATO BATTERIA — 16/06/2026 23:35:50 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Capacità attuale (CurrentCapacity) 7850 mAh Capacità di progetto (Design) 8790 mAh Capacità piena attuale (FCC) 7850 mAh ChemID (chimica celle) 8978 Cicli (BatteryData) 161 Cicli di carica 161 Corrente ingresso (adapter) 0 mA Corrente istantanea -2049 mA (scarica) Corrente USB-PD 4438 mA Modello chip gauge bq40z651 Potenza batteria 0 mW (in equilibrio) Potenza ingresso sistema 0 mW Produttore batteria DSY Scritture flash gauge 16291 Seriale batteria F5D0412GY88K7LQCS SoC reale (chip) 57 % SoC visibile (barra menu) 59 % Tensione celle (3S) 8798,8682,8785 mV Tensione ingresso (adapter) 0 mV Tensione pack 11311 mV Tensione totale 11189 mV ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Dove si trova il file .zshrc e come aprirlo
.zshrc si trova nella cartella home dell’utente. Il punto iniziale nel nome indica che è un file nascosto: non appare nel Finder con la visualizzazione predefinita, ma esiste ed è accessibile dal Terminale.
Per aprirlo con TextEdit
open -e ~/.zshrc
A questo punto ci sono tre situazioni possibili
Caso 1 — Il file non esiste
Su alcune installazioni pulite di macOS il file .zshrc non è ancora stato creato. Per verificarlo:
ls -la ~/.zshrc
Se il Terminale risponde con No such file or directory, il file non esiste. Si crea con:
touch ~/.zshrc
touch è un comando che crea un file vuoto se non esiste, oppure ne aggiorna la data di modifica se esiste già. Dopo averlo creato, si può aprire normalmente con nano.
Caso 2 — Il file esiste ed è vuoto o non contiene altri comandi personalizzati
È il caso più semplice. Si apre con TextEdit, si incolla il blocco dello script in fondo al file, si salva e si esce. Per rendere immediatamente attiva la funzione senza riaprire il Terminale:
source ~/.zshrc
source rilegge il file di configurazione nella sessione corrente. Da questo momento battery-info è disponibile in qualsiasi finestra del Terminale.
Caso 3 — Il file esiste e contiene già personalizzazioni
Questo è un caso comune su Mac usati da qualche tempo. Il file potrebbe contenere alias, variabili d’ambiente, configurazioni di strumenti come homebrew, nvm o conda, o altri comandi personalizzati: se hai seguito il mio articolo precedente(LINK), per esempio, hai probabilmente creato tu stesso il comando “caricabatterie” che valuta le condizione dell’alimentatore collegato al MacBook.
In questo caso la regola è semplice: aggiungere il blocco in fondo al file, dopo tutto quello che c’è già. Le funzioni zsh non interferiscono con alias o variabili definiti altrove, e l’ordine all’interno del file non ha importanza per i nostri scopi.:
Come installare lo script
Il modo più rapido, è copiare e incollare lo script in fondo a, file .zshrc dopo averlo aperto con TextEdit con il comando:
open -e ~/.zshrc
Attenzione! Prima di fare qualunque cosa con TextEdit impostate il tipo di file su solo testo. Per farlo, una volta lanciato il programma premete insieme i tasti ⌘, ⌥ e T oppure scegliete l’a voce corrispondente dal menu Formato. Solo dopo aver selezionato con questa modalità potrete aggiungere in coda al file, il testo del comando.
Dopo l’aggiunta, chiudete TextEdit e ricaricate la configurazione con il comando:
source ~/.zshrc
Quindi, verificate che la funzione sia disponibile:
battery-info
Se tutto è andato bene, appare la tabella con i dati della batteria.
Una nota sull’aggiornamento
Se in futuro si vuole modificare la funzione — aggiungere un campo, cambiare la formattazione, correggere qualcosa — la procedura è aprire .zshrc con TextEdit, trovare il blocco battery-info(), modificarlo, salvare, e rieseguire source ~/.zshrc. Le modifiche diventano attive immediatamente nella sessione corrente e in tutte le nuove finestre del Terminale aperte da quel momento in poi.
il testo da incollare è il seguente:
# ─────────────────────────────────────────────
# battery-info: stato dettagliato batteria e caricatore
# Uso: battery-info
# Compatibile con macOS BSD awk
# ─────────────────────────────────────────────
battery-info() {
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " 🔋 STATO BATTERIA — $(date '+%d/%m/%Y %H:%M:%S')"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
ioreg -rn AppleSmartBattery | awk '
# Soglia oltre la quale un intero uint64 va interpretato come negativo.
# 2^63 = 9223372036854775808
BEGIN { UINT64_MAX = 18446744073709551615; THRESHOLD = 9223372036854775808 }
# Converte uint64 -> intero con segno (complemento a due a 64 bit)
function signed64(n, s) {
s = n + 0
if (s > THRESHOLD) s = s - UINT64_MAX - 1
return s
}
function val(str, key, raw) {
if (match(str, key "\"=(-?[0-9]+)")) {
raw = substr(str, RSTART + length(key) + 2, RLENGTH - length(key) - 2)
return raw
}
return ""
}
function valstr(str, key, s, e) {
# Formato blob interno: key"="value"
if (match(str, key "\"=\"[^\"]+\"")) {
s = RSTART + length(key) + 3
e = RSTART + RLENGTH - 2
return substr(str, s, e - s + 1)
}
# Formato top-level: key" = "value" (con spazi attorno a =)
if (match(str, key "\" = \"[^\"]+\"")) {
s = RSTART + length(key) + 5
e = RSTART + RLENGTH - 2
return substr(str, s, e - s + 1)
}
return ""
}
/LegacyBatteryInfo/ { legacy = 1 }
/BatteryData/ { bdata = 1 }
/PowerTelemetryData/ { telem = 1 }
/AdapterDetails" = \{/ { adapt = 1 }
# ── LegacyBatteryInfo ──
legacy && /Capacity"=/ {
v = val($0, "Capacity"); if (v != "") printf "Capacità attuale (CurrentCapacity):%s mAh\n", v
}
legacy && /Voltage"=/ {
v = val($0, "Voltage"); if (v != "") printf "Tensione totale:%s mV\n", v
}
legacy && /Amperage"=/ {
v = val($0, "Amperage")
if (v != "") {
s = signed64(v)
if (s < 0)
printf "Corrente istantanea:%d mA (scarica)\n", s
else if (s == 0)
printf "Corrente istantanea:0 mA (in equilibrio)\n"
else
printf "Corrente istantanea:%d mA (in carica)\n", s
}
}
legacy && /"Cycle Count"=/ {
if (match($0, "Cycle Count\"=([0-9]+)")) {
v = substr($0, RSTART + 13, RLENGTH - 13)
printf "Cicli di carica:%s\n", v
}
legacy = 0
}
# ── BatteryData ──
bdata && /DesignCapacity"=/ {
v = val($0, "DesignCapacity"); if (v != "") printf "Capacità di progetto (Design):%s mAh\n", v
}
bdata && /FccComp1"=/ {
v = val($0, "FccComp1"); if (v != "") printf "Capacità piena attuale (FCC):%s mAh\n", v
}
bdata && /StateOfCharge"=/ {
v = val($0, "StateOfCharge"); if (v != "") printf "SoC reale (chip):%s %%\n", v
}
bdata && /UISoc"=/ {
v = val($0, "UISoc"); if (v != "") printf "SoC visibile (barra menu):%s %%\n", v
}
bdata && /CycleCount"=/ {
v = val($0, "CycleCount"); if (v != "") printf "Cicli (BatteryData):%s\n", v
}
bdata && /"Voltage"=/ {
v = val($0, "Voltage"); if (v != "") printf "Tensione pack:%s mV\n", v
}
bdata && /CellVoltage/ {
if (match($0, /\([0-9,]+\)/)) {
v = substr($0, RSTART+1, RLENGTH-2)
printf "Tensione celle (3S):%s mV\n", v
}
}
bdata && /DataFlashWriteCount"=/ {
v = val($0, "DataFlashWriteCount"); if (v != "") printf "Scritture flash gauge:%s\n", v
}
bdata && /ChemID"=/ {
v = val($0, "ChemID"); if (v != "") printf "ChemID (chimica celle):%s\n", v
}
bdata && /"Serial"="/ {
v = valstr($0, "Serial"); if (v != "") printf "Seriale batteria:%s\n", v
bdata = 0
}
# ── PowerTelemetryData ──
telem && /SystemPowerIn"=/ {
v = val($0, "SystemPowerIn")
if (v != "") { s = signed64(v); if (s >= 0) printf "Potenza ingresso sistema:%d mW\n", s }
}
telem && /SystemVoltageIn"=/ {
v = val($0, "SystemVoltageIn"); if (v != "") printf "Tensione ingresso (adapter):%s mV\n", v
}
telem && /SystemCurrentIn"=/ {
v = val($0, "SystemCurrentIn"); if (v != "") printf "Corrente ingresso (adapter):%s mA\n", v
}
telem && /BatteryPower"=/ {
v = val($0, "BatteryPower")
if (v != "") {
s = signed64(v)
if (s == 0)
printf "Potenza batteria:0 mW (in equilibrio)\n"
else if (s < 0)
printf "Potenza batteria:%d mW (scarica)\n", s
else
printf "Potenza batteria:%d mW (ricarica)\n", s
}
telem = 0
}
# ── AdapterDetails ──
adapt && /Watts"=/ {
v = val($0, "Watts"); if (v != "") printf "Caricatore (Watts):%s W\n", v
}
adapt && /AdapterVoltage"=/ {
v = val($0, "AdapterVoltage"); if (v != "") printf "Tensione USB-PD:%s mV\n", v
}
adapt && /"Current"=/ {
v = val($0, "Current"); if (v != "") printf "Corrente USB-PD:%s mA\n", v
}
adapt && /Description"="/ {
v = valstr($0, "Description"); if (v != "") printf "Tipo caricatore:%s\n", v
adapt = 0
}
# ── Campi top-level ──
/\"Temperature"=/ {
v = val($0, "Temperature")
if (v != "") printf "Temperatura batteria:%.1f °C\n", (v / 10) - 273.15
}
/\"IsCharging"=/ { if (match($0, /IsCharging"=(Yes|No)/)) { v=substr($0,RSTART+12,RLENGTH-12); printf "In carica:%s\n", v } }
/\"FullyCharged"=/ { if (match($0, /FullyCharged"=(Yes|No)/)) { v=substr($0,RSTART+14,RLENGTH-14); printf "Completamente carica:%s\n", v } }
/\"ExternalConnected"=/ { if (match($0, /ExternalConnected"=(Yes|No)/)) { v=substr($0,RSTART+20,RLENGTH-20); printf "Alimentazione esterna:%s\n", v } }
/\"TimeRemaining"=/ { v = val($0, "TimeRemaining"); if (v != "") printf "Tempo rimanente (stima):%s min\n", v }
# ── Identità produttore (top-level, registro SBS 0x20 e 0x21) ──
/Manufacturer" = "/ {
v = valstr($0, "Manufacturer"); if (v != "") printf "Produttore batteria:%s\n", v
}
/DeviceName" = "/ {
v = valstr($0, "DeviceName"); if (v != "") printf "Modello chip gauge:%s\n", v
}
' | sort -t: -k1,1 | column -t -s ":"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
}
Conclusioni
La batteria è uno dei componenti fondamentali di un MacBook, i comandi di cui vi ho parlato in questo articolo vi aiuteranno a verificarne lo stato di funzionamento ottenendo una notevole ricchezza di informazioni senza bisogno di installare App di terze pari.
Non esitate a chiedere informazioni nei commenti e, per favore, condividete. questo post sui social: facendo conoscere ApplePhilosophy mi aiutate a tenere in vita questo progetto.
Claudio Di Tursi
In questo periodo ci sono parecchie offerte del negozio ufficiale di Apple su Amazon: dai un occhiata, clicca qui: LINK ALLE OFFERTE


