🖥️ ESP32 + OLED

🖥️ ESP32 + OLED: Notifiche visive intelligenti con ESPHome

🔎 Descrizione del progetto

Questo progetto trasforma un microcontrollore ESP32 in un pannello di notifica visiva, utilizzando un display OLED SSD1306 da 128×64 pixel. È pensato per integrarsi con Home Assistant e mostrare messaggi testuali dinamici, come avvisi di sicurezza, stato degli elettrodomestici, promemoria o notifiche personalizzate.

Il cuore del sistema è un’entità input_text in Home Assistant: ogni volta che viene aggiornata, il messaggio appare sul display OLED. Il messaggio rimane visibile finché non ne arriva uno nuovo. Non c’è più alcun timeout automatico: il display mostra sempre l’ultimo messaggio ricevuto.

È una soluzione elegante, modulare e facilmente estendibile per chi vuole aggiungere un feedback visivo alle automazioni domestiche.

🔌 Collegamenti hardware

ComponentePin ESP32Pin periferica
Display OLED SSD1306GPIO 21SDA
Display OLED SSD1306GPIO 22SCL
Alimentazione3.3V / GNDVCC / GND

Il display comunica via I²C, usando i pin GPIO 21 (SDA) e GPIO 22 (SCL). L’indirizzo I²C del display è 0x3C (standard per SSD1306). Non sono richieste resistenze di pull-up esterne: ESPHome le gestisce automaticamente.

📄 Spiegazione riga per riga del file YAML

⚙️ Configurazione generale

esphome:
  name: esphome-web-33da74
  friendly_name: Esp32 LCD
  min_version: 2025.5.0
  name_add_mac_suffix: false
  • name: nome tecnico del dispositivo
  • friendly_name: nome leggibile in Home Assistant
  • min_version: versione minima di ESPHome richiesta
  • name_add_mac_suffix: se false, evita di aggiungere il MAC al nome

🧠 Specifiche hardware

esp32:
  board: esp32dev
  framework:
    type: arduino
  • board: modello della scheda ESP32
  • framework: usa il linguaggio Arduino per la compilazione

🛠️ Servizi di base

logger:
api:
ota:
  - platform: esphome
  • logger: abilita il log seriale per il debug
  • api: consente la comunicazione diretta con Home Assistant
  • ota: permette aggiornamenti firmware via Wi-Fi

📶 Connessione Wi-Fi

wifi:
  networks:
    - ssid: "TechLab_Guest"
      password: "connect1234"
    - ssid: "HomeSecure_5G"
      password: "safezone9876"

Il dispositivo proverà a connettersi alla prima rete disponibile tra quelle elencate.

🔌 Bus I²C per il display

i2c:
  sda: 21
  scl: 22
  scan: true
  • sda e scl: pin di comunicazione I²C
  • scan: true: rileva automaticamente i dispositivi collegati

🔤 Font per il display

font:
  - file: "gfonts://Roboto"
    id: my_font
    size: 12
  • file: scarica il font Roboto da Google Fonts
  • id: nome interno del font
  • size: altezza dei caratteri in pixel

🧾 Sensore testuale da Home Assistant

text_sensor:
  - platform: homeassistant
    name: "Messaggio OLED"
    entity_id: input_text.lcd_message
    id: lcd_text
  • Importa l’entità input_text.lcd_message da Home Assistant
  • Ogni volta che il valore cambia, il display si aggiorna
  • Non c’è più alcun timeout: il messaggio resta finché non ne arriva uno nuovo

🖥️ Display OLED SSD1306

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      if (!id(lcd_text).state.empty()) {
        std::string msg = id(lcd_text).state;
        int line = 0;
        const int max_chars = 20;

        while (msg.length() > 0 && line < 4) {
          std::string segment = msg.substr(0, max_chars);
          msg = msg.length() > max_chars ? msg.substr(max_chars) : "";
          it.printf(0, line * 16, id(my_font), "%s", segment.c_str());
          line++;
        }
      }
  • platform: tipo di display usato
  • model: risoluzione del display
  • address: indirizzo I²C del display
  • lambda: codice inline in C++ che:
    • Verifica se il messaggio è vuoto
    • Divide il testo in righe da 20 caratteri
    • Le stampa verticalmente con spaziatura di 16 pixel
    • Mostra massimo 4 righe (limite del display)

✅ Conclusione

Questo progetto è una soluzione compatta e potente per creare un pannello di notifica visiva con ESP32 e OLED. È perfettamente integrato con Home Assistant, facile da modificare e ideale per chi vuole un feedback immediato e visivo delle proprie automazioni.

Il comportamento è ora più naturale: il messaggio resta visibile finché non viene aggiornato. Nessun timeout, nessuna cancellazione automatica. Il display è sempre sincronizzato con l’ultimo stato dell’automazione.

Aggiungo …

Ecco una spiegazione semplificata del codice fornito:


Funzionamento generale

Il codice gestisce la visualizzazione di un testo su uno schermo LCD (es. 20 caratteri x 4 righe) in ESPHome.


Passaggi principali

  1. Controllo inputif (!id(lcd_text).state.empty())
    • Verifica che il contenuto da visualizzare non sia vuoto (es. “Ciao mondo!” invece di “”).
  2. Inizializzazione variabilistd::string msg = id(lcd_text).state; int line = 0; const int max_chars = 20;
    • msg: memorizza il testo da visualizzare.
    • line: indica la riga corrente (da 0 a 3).
    • max_chars: numero massimo di caratteri per riga (es. 20).
  3. Loop per suddivisione del testowhile (msg.length() > 0 && line < 4)
    • Continua finché ci sono caratteri da visualizzare e non si superano le 4 righe.
  4. Suddivisione in segmentistd::string segment = msg.substr(0, max_chars); msg = msg.length() > max_chars ? msg.substr(max_chars) : "";
    • Estrae i primi max_chars caratteri (es. “Ciao mondo!” → “Ciao mondo” in prima riga).
    • Rimuove il segmento già visualizzato dal testo originale.
  5. Visualizzazione su schermoit.printf(0, line * 16, id(my_font), "%s", segment.c_str());
    • it: riferimento all’oggetto LCD.
    • printf(...): stampa il testo in posizione (0, line*16) (spaziatura tra righe).
    • id(my_font): font utilizzato per la visualizzazione.
  6. Avanzamento rigaline++;
    • Passa alla riga successiva per il prossimo segmento.

Esempio concreto

Se msg = "Questo è un testo lungo", il codice:

  1. Stampa “Questo è un t” (20 caratteri) sulla riga 0.
  2. Stampa “esto lungo” (rimanenti) sulla riga 1.

Perché funziona?

  • Gestisce testi lunghi suddividendoli in segmenti compatibili con le dimensioni dell’LCD.
  • Evita errori di sovraccarico o troncamento non previsto del messaggio.

🚀 Upgrade Proxmox Backup Server 3 → 4: Guida Tecnica Completa

L’upgrade da Proxmox Backup Server (PBS) 3 a PBS 4 comporta anche la migrazione da Debian Bookworm a Trixie. In questa guida vedremo come eseguire l’upgrade in modo sicuro, ordinato e conforme alle best practice APT moderne.

🧰 Requisiti iniziali

Assicurati che il tuo sistema PBS sia aggiornato alla versione 3.4.2-1 o superiore:

bash

proxmox-backup-manager versions

Aggiorna PBS 3 all’ultima versione disponibile:

bash

apt update && apt dist-upgrade

Esegui un backup della configurazione:

bash

tar czf "pbs3-etc-backup-$(date -I).tar.gz" -C "/etc" "proxmox-backup"

Verifica lo spazio libero (consigliati almeno 10 GB):

bash

df -h /

🔍 Verifica compatibilità con PBS 4

Utilizza lo strumento ufficiale per controllare la compatibilità:

bash

pbs3to4 --full

Correggi eventuali problemi segnalati e rilancia il comando finché non ottieni un output pulito.

🛑 (Facoltativo) Abilita modalità manutenzione

Per evitare modifiche ai dati durante l’upgrade, puoi impostare i datastore in modalità sola lettura:

bash

proxmox-backup-manager datastore update DATASTORE-ID --maintenance-mode read-only

🧭 Aggiorna i repository APT

1. Passa da Bookworm a Trixie

bash

sed -i 's/bookworm/trixie/g' /etc/apt/sources.list

Controlla anche i file in /etc/apt/sources.list.d/ e aggiorna se necessario.

2. Aggiungi repository PBS 4 (deb822)

Enterprise

bash

cat > /etc/apt/sources.list.d/pbs-enterprise.sources << 'EOF'
Types: deb
URIs: https://enterprise.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

No-subscription

bash

cat > /etc/apt/sources.list.d/proxmox.sources << 'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

🧱 Integra il repository Debian in formato deb822

Per conformità con Debian Trixie, crea il file debian.sources:

bash

cat > /etc/apt/sources.list.d/debian.sources << 'EOF'
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie trixie-updates
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://security.debian.org/debian-security/
Suites: trixie-security
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF

Svuota il vecchio sources.list:

bash

truncate -s 0 /etc/apt/sources.list

Oppure rimuovilo del tutto:

bash

rm /etc/apt/sources.list

Verifica la configurazione:

bash

apt update && apt policy

⬆️ Esegui l’upgrade a PBS 4

bash

apt update && apt dist-upgrade

Durante l’upgrade:

  • Premi q per uscire da apt-listchanges
  • Mantieni le versioni locali per /etc/issue e /etc/default/grub
  • Per /etc/ssh/sshd_config, accetta la versione del maintainer se non hai modifiche personalizzate

🔁 Riavvia il sistema

bash

systemctl reboot

✅ Verifiche post-upgrade

Controlla che i servizi PBS siano attivi:

bash

systemctl status proxmox-backup-proxy.service
systemctl status proxmox-backup.service

Disabilita la modalità manutenzione:

bash

proxmox-backup-manager datastore update DATASTORE-ID --delete maintenance-mode

(Facoltativo) Modernizza tutti i repository:

bash

apt modernize-sources

🧪 Conclusione

L’upgrade a PBS 4 è un’operazione delicata ma gestibile con metodo. L’integrazione dei repository in formato deb822 garantisce coerenza e compatibilità futura. Se operi in ambienti clusterizzati, considera l’automazione dei controlli EFI, backup e verifica dei repository.

🚀 Come eliminare il pop‑up “Nessuna sottoscrizione” su Proxmox 

🎯 Perché appare quel messaggio?

Dopo aver installato Proxmox in modalità “No Subscription”, la GUI mostra un pop‑up:

“Nessuna sottoscrizione”

Questo avviso blocca l’accesso agli aggiornamenti e al supporto. La soluzione consiste nel modificare il file JavaScript che controlla lo stato della sottoscrizione.

🛠️ Procedura passo‑passo

1. Apri la shell dalla Web‑GUI di Proxmox Esegui: ssh root@<IP-del-tuo-proxmox>

2. Vai alla cartella contenente lo script Esegui: cd /usr/share/javascript/proxmox-widget-toolkit

3. Crea un backup del file originale Esegui: cp proxmoxlib.js proxmoxlib.js.bak

4. Modifica il file con l’editor a tua scelta Esegui: nano proxmoxlib.js oppure vim proxmoxlib.js

5. Trova la riga che verifica lo stato della sottoscrizione Cerca: if (data.status !== 'Active') {

6. Sostituisci l’intero blocco con un “falso” costante Modifica con: if (false) {

7. Salva ed esci dall’editor In nano: Ctrl+O, Enter, Ctrl+X

8. Riavvia il servizio che gestisce la GUI Esegui: systemctl restart pveproxy.service

⚠️ Se stai usando Proxmox Backup Server (PBS) o Mail Gateway, usa uno dei seguenti comandi:

  • PBS → systemctl restart proxmox-backup-proxy.service
  • Mail Gateway → systemctl restart pgmproxy.service

🔁 Cosa succede dopo?

Ogni volta che installi un aggiornamento di Proxmox VE (incluso l’interfaccia GUI), il file JavaScript viene sovrascritto. Dovrai quindi ripetere la procedura sopra descritta dopo ogni upgrade.

Upgrade proxmox 8 to 9

🔧 Passo 1: Sostituzione repository in Trixie

Spegnere o migrare le VM in esecuzione .

Dopo aver eseguito la sostituzione del repo attuale in /etc/apt sources.list con il comando :

sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
  1. Apri il file con un editor (es. nano /etc/apt/sources.list):nano /etc/apt/sources.list
  2. Trova la riga 6 (o quella con pve-no-subscription):
    Esempio di riga esistente:deb http://download.proxmox.com/debian/pve trixie pve-no-subscription
  3. Commenta la riga aggiungendo # all’inizio:# deb http://download.proxmox.com/debian/pve trixie pve-no-subscription
  4. Salva e chiudi il file.

📝 Passo 2: Crea il repository corretto (proxmox.sources)

Contenuto esatto del file:

cat > /etc/apt/sources.list.d/proxmox.sources << EOF
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

✅ Passo 3: Verifica e aggiorna i repository

Esegui questi comandi per confermare la correzione:

apt update && apt policy  # Dovrebbe mostrare "OK" senza warning di duplicati

🔄 Passo 4: Esegui l’upgrade

apt dist-upgrade  # Procedura senza errori (se non compaiono warning)
a fine upgrade eseguire pve8to9

🔍 Passo 5: Riavvia il sistema

🔄 Passo 6 : Creazione Debian.sources

Dopi il riavvio , vuotare il file /etc/apt/sources.list

Creare in /etc/apt/sources.d/debian.sources

Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: trixie trixie-updates
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb deb-src
URIs: http://security.debian.org/debian-security/
Suites: trixie-security
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Controllo finale ed eventuali correzioni

Commentare pve-enterprise.xxx files in :

root@pvetest:/etc/apt/sources.list.d# ls -l
total 10
-rw-r--r-- 1 root root 162 Sep 14 07:37 proxmox.sources
-rw-r--r-- 1 root root  71 Sep 14 11:32 pve-enterprise.list.dpkg-dist
-rw-r--r-- 1 root root 165 Sep 14 11:32 pve-enterprise.sources

Per finire dopo aver riavviato tutto con la nuova versione eseguire :

pve8to9 --full
installare eventuali pacchetti come intel-microcode e chrony 
apt autoremove 
pve8to9 --full

Il file sources.list va lasciato vuoto e non commentato .

Codice in bash per controllo finale repo e versioni proxmox :

#!/bin/bash

echo "🔍 Verifica repository APT (deb822)..."
sources_dir="/etc/apt/sources.list.d"
legacy_sources="/etc/apt/sources.list"

# Check for legacy entries
if grep -q '^deb ' "$legacy_sources"; then
    echo "⚠️  Repository legacy trovati in $legacy_sources"
    grep '^deb ' "$legacy_sources"
else
    echo "✅ Nessun repository legacy in $legacy_sources"
fi

# Check for .list files with legacy format
legacy_list=$(grep -r '^deb ' "$sources_dir"/*.list 2>/dev/null)
if [ -n "$legacy_list" ]; then
    echo "⚠️  Repository legacy trovati in file .list:"
    echo "$legacy_list"
else
    echo "✅ Nessun repository legacy nei file .list"
fi

echo ""
echo "📦 Verifica pacchetti aggiornabili..."
upgradable=$(apt list --upgradable 2>/dev/null | grep -v "Listing...")
if [ -n "$upgradable" ]; then
    echo "⚠️  Pacchetti aggiornabili trovati:"
    echo "$upgradable" | head -n 10
    echo "... (totale: $(echo "$upgradable" | wc -l))"
else
    echo "✅ Tutti i pacchetti sono aggiornati"
fi

echo ""
echo "🔐 Verifica chiavi GPG..."
keyring="/usr/share/keyrings/proxmox-archive-keyring.gpg"
if gpg --quiet --dry-run --import "$keyring" >/dev/null 2>&1; then
    echo "✅ Chiave Proxmox valida: $keyring"
else
    echo "⚠️  Chiave Proxmox non valida o mancante"
fi

echo ""
echo "🧠 Versione Proxmox:"
pveversion

echo ""
echo "🧬 Kernel attivo:"
uname -r

echo ""
echo "✅ Audit completato su $(hostname)"

📦 Progetto ESPHome: Rilevazione temperatura, umidità e movimento con LED RGB controllabile via MQTT

DHT22 + PIR + LED RGB: a cosa serve


1️⃣ Obiettivo del post

In questo articolo mostrerò come realizzare un firmware completo e pronto all’uso per l’ESP32, in grado di:

  • leggere temperatura e umidità con il sensore DHT22;
  • rilevare movimento tramite un modulo PIR;
  • controllare un LED RGB (RGB) con effetti personalizzati;
  • pubblicare tutti i dati su un broker MQTT (discovery per Home Assistant);
  • aggiornarsi in modalità OTA;
  • registrare eventi e errori con livello di log DEBUG.

Il file YAML è stato generato esattamente secondo la tua richiesta ed è pronto da caricare tramite ESPHome.


2️⃣ Requisiti hardware

ComponentePin consigliati (ESP32)
DHT22GPIO4
PIRGPIO12
LED RGBRed → GPIO16, Green → GPIO17, Blue → GPIO18

Nota: collega il VCC del DHT22 a 3.3 V e il GND al terra comune.


3️⃣ Configurazione Wi‑Fi

Il firmware tenta di connettersi alla rete domestica (YOUR_SSID / YOUR_PASSWORD). Se la connessione fallisce, l’ESP32 avvia un punto di accesso “ESP32-DHT-PIR-RGB-Fallback” (password: fallback_password) per consentire la configurazione manuale.


4️⃣ Funzionalità MQTT

  • Broker: YOUR_MQTT_BROKER_IP (porta 1883)
  • Discovery abilitato (homeassistant) → i sensori e il LED vengono aggiunti automaticamente a Home Assistant.
  • Messaggi di “birth” e “will” indicano lo stato online/offline.

5️⃣ Aggiornamenti OTA

Con il modulo ota è possibile aggiornare il firmware senza collegamento fisico, usando l’app ESPHome o la riga di comando. La password OTA è impostata su “OTA_PASSWORD” (sostituire con una stringa sicura).


6️⃣ Logging dettagliato

Il livello di log è DEBUG, così da avere traccia di ogni evento, utile per il debug e la verifica del corretto funzionamento.


7️⃣ Esempio completo di file YAML

esphome:
  name: esp32_dht_pir_rgb
  platform: ESP32
  board: nodemcu-32s

wifi:
  ssid: "YOUR_SSID"
  password: "YOUR_PASSWORD"
  fast_connect: true
  ap:
    ssid: "ESP32-DHT-PIR-RGB-Fallback"
    password: "fallback_password"

captive_portal:

ota:
  password: "OTA_PASSWORD"

logger:
  level: DEBUG

mqtt:
  broker: "YOUR_MQTT_BROKER_IP"
  port: 1883
  username: "MQTT_USER"
  password: "MQTT_PASS"
  discovery: true
  discovery_prefix: homeassistant
  birth_message:
    topic: "homeassistant/status"
    payload: "online"
    qos: 1
    retain: true
  will_message:
    topic: "homeassistant/status"
    payload: "offline"
    qos: 1
    retain: true

sensor:
  - platform: dht
    pin: GPIO4
    temperature:
      name: "Living Room Temperature"
      id: temp_living_room
      filters:
        - lambda: return x * 9 / 5 + 32;   # Convert to Fahrenheit if desired
    humidity:
      name: "Living Room Humidity"
      id: hum_living_room
    update_interval: 60s

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO12
      mode: INPUT_PULLUP
      inverted: true
    name: "Living Room Motion Sensor"

output:
  - platform: ledc
    pin: GPIO16
    id: red_led
    frequency: 1000Hz
  - platform: ledc
    pin: GPIO17
    id: green_led
    frequency: 1000Hz
  - platform: ledc
    pin: GPIO18
    id: blue_led
    frequency: 1000Hz

light:
  - platform: rgb
    name: "Living Room RGB LED"
    red: red_led
    green: green_led
    blue: blue_led
    id: living_room_rgb
    effects:
      - pulse:
          name: "Pulse Effect"
          transition_length: 2s
          update_interval: 1s

interval:
  - interval: 60s
    then:
      - mqtt.publish:
          topic: "homeassistant/sensor/temperature/state"
          payload_template: "{{ states('sensor.living_room_temperature') }}"
          qos: 0

8️⃣ Come procedere

  1. Copia il codice YAML sopra riportato in un nuovo file .yaml su ESPHome.
  2. Sostituisci i segnaposto (YOUR_SSIDYOUR_PASSWORD, ecc.) con le tue credenziali reali.
  3. Compila e carica il firmware sul tuo ESP32 tramite l’interfaccia web di ESPHome.
  4. Verifica la connessione MQTT in Home Assistant o con un client MQTT come Mosquitto.

9️⃣ Conclusioni

Con questo progetto hai a disposizione una soluzione modulare, sicura e pronta all’uso per monitorare temperatura/umidità, rilevare movimento e controllare un LED RGB, tutto gestito tramite MQTT. L’integrazione con Home Assistant è automatica grazie al discovery, mentre l’OTA e il logging garantiscono manutenzione semplice e tracciabilità completa.

📌 Schema di collegamento dei sensori all’ESP32

Di seguito trovi una descrizione testuale del cablaggio, da inserire subito dopo la conclusione dell’articolo.

Sensore / ModuloPin ESP32Descrizione
DHT22GPIO4VCC → 3.3 V, GND → terra comune, DATA → GPIO4 (pull‑up interno).
PIRGPIO12VCC → 5 V (o 3.3 V se il modulo è a 3.3 V), GND → terra comune, OUT → GPIO12 (INPUT_PULLUP con inversione).
LED RGBRed → GPIO16Green → GPIO17Blue → GPIO18VCC → 5 V (o 3.3 V a seconda del LED), GND → terra comune; i pin sono configurati come PWM tramite ledc.

Suggerimento di cablaggio rapido

  • Utilizza un breadboard per una prototipazione veloce.
  • Per il DHT22, inserisci un resistore da 10 kΩ tra VCC e DATA (pull‑up).
  • Se usi un LED RGB a 5 V, aggiungi resistenze limitanti (220 Ω–330 Ω) su ciascun pin di colore.

Con questo schema i componenti sono correttamente collegati all’ESP32 e pronti per essere programmati con il file YAML fornito.

Perché scegliere un computer ricondizionato? Risparmia, sosteni l’ambiente e ottieni performance affidabili 🌱

In un mondo dove la tecnologia è sempre più accessibile ma anche più costosa, i computer ricondizionati offrono una soluzione intelligente per chi cerca equilibrio tra budget, sostenibilità e prestazioni. Ecco perché valori questa scelta:


💰 Risparmio economico senza compromessi

I computer ricondizionati permettono di ridurre i costi iniziali del 30-50% rispetto ai modelli nuovi, senza perdere qualità. Ad esempio, il Fujitsu Esprimo (Mini PC Desktop Intel i5-7500T, RAM 16GB DDR4, SSD 512GB, porte DVI + DP) è un modello perfetto per chi vuole un dispositivo potente a prezzo accessibile.

CaratteristicheSpecifiche
ProcessoreIntel i5-7500T
Memoria RAM16 GB DDR4
StorageSSD 512 GB
PorteDVI + DP

Questo modello è ideale per lavoro remoto, creatività digitale e uso intensivo di applicazioni professionali.


🌱 Sostenibilità ambientale: un impatto positivo

L’uso di computer ricondizionati riduce l’impatto ecologico legato alla produzione di nuovi dispositivi. Secondo dati dell’UNEP, ogni computer ricondizionato evita circa 20 kg di CO₂ emessi durante la sua vita utile.

Perché è importante?

  • Eviti il consumo di risorse naturali (minerale, energia) per la produzione di nuovi dispositivi;
  • Riduci i rifiuti elettronici in discarica;
  • Contribuisci a un futuro più sostenibile con piccole azioni quotidiane.

⚡ Prestazioni affidabili: non è solo “vecchio”

Molte persone pensano che i computer ricondizionati siano meno performanti, ma la realtà è diversa. I dispositivi vengono testati e certificati per garantire prestazioni ottimali. Il Fujitsu Esprimo, ad esempio, offre:

  1. Un processore Intel i5-7500T veloce per multitasking;
  2. 16 GB di RAM DDR4 per applicazioni intensive;
  3. SSD 512 GB per velocità di caricamento senza compromessi.

Non è “vecchio” – è un dispositivo aggiornato e adatto a esigenze moderne.


👥 Adatto a tutti: dalla scuola all’imprenditoria

I computer ricondizionati sono una soluzione universale, perfetta per diverse tipologie di utenti:

  1. Gli studenti possono utilizzarli per studiare e lavorare in modo efficiente;
  2. Le piccole imprese trovano un’ottima soluzione per il loro ambiente di lavoro;
  3. Le famiglie cercano dispositivi economici ma affidabili per la quotidianità.

❓ Risposte alle preoccupazioni comuni

“I computer ricondizionati sono sicuri?” → Sì! I fornitori certificati effettuano controlli approfonditi e eliminano i dati precedenti.
“Posso usare un computer ricondizionato per lavoro professionale?” → Assolutamente sì: molti modelli offrono prestazioni equivalenti a quelli nuovi.


✅ Conclusione: una scelta responsabile per tutti

Scegliere un computer ricondizionato è una decisione che beneficia non solo il tuo portafogli, ma anche l’ambiente e la tua produttività. Con modelli come il Fujitsu Esprimo, puoi ottenere prestazioni elevate a costi ridotti, senza compromettere qualità o sostenibilità.

🛠 Script di aggiornamento automatizzato per Debian/Proxmox e Rocky Linux

In ambienti server, mantenere il sistema aggiornato è fondamentale per la sicurezza e la stabilità. Questo articolo presenta due script bash che eseguono l’aggiornamento del sistema con conferma interattiva e inviano il log via email all’amministratore. I log non vengono salvati su disco, ma solo inviati via sendmail.

📦 Funzionalità comuni

FunzioneDebian/ProxmoxRocky Linux
Aggiornamento pacchettiapt-getdnf
Conferma interattiva
Invio log via email✅ (sendmail)✅ (sendmail)
Log solo in memoria
Nessun file temporaneo

🧬 Script per Debian/Proxmox

#!/bin/bash

# Configurazione
DATA=$(date '+%Y-%m-%d %H:%M')
HOSTNAME=$(hostname)
EMAIL="ammin@internal.lan"
SUBJECT="[$HOSTNAME] Log aggiornamento - $DATA"

# Gestione log con file temporaneo
LOGFILE=$(mktemp)
trap "rm -f $LOGFILE" EXIT

# Funzioni di logging con emoji appropriate
info() { echo -e "🟢 $@" >> "$LOGFILE"; }
warning() { echo -e "🟠 $@" >> "$LOGFILE"; }
error() { echo -e "🔴 $@" >> "$LOGFILE"; }

# Gestione interattività con controllo pipe
yn() {
    local msg="$1"
    if [ -t 0 ]; then
        read -r -p "$msg [s/N]" resp
        [[ "$resp" =~ ^[sS]$ ]]
    else
        echo "N"
    fi
}

info "Inizio aggiornamento su $HOSTNAME: $DATA"

# Aggiorna repository con gestione errori
info "🔄 Aggiorna elenco pacchetti"
apt update || { error "Fallito l'aggiornamento della lista pacchetti"; exit 1; }

# Chiedi conferma per upgrade completo
DO_UPGRADE=$(yn "Vuoi effettuare 'apt upgrade per aggiornare tutti i pacchetti'?")

if $DO_UPGRADE; then
    info "⬆️ Esegui aggiornamento pacchetti"
    apt upgrade -y || { warning "Aggiornamento pacchetti completato con errori"; }    
else
    info "⏭️ Salto aggiornamento pacchetti su richiesta utente"
fi

# Chiedi conferma per autoremove
DO_AUTOREMOVE=$(yn "Vuoi eseguire 'apt autoremove' per pulizia?")

if $DO_AUTOREMOVE; then
    info "🧹 Esecuzione apt autoremove"
    apt autoremove -y --purge || { warning "apt autoremove ha segnalato errori"; }
else
    info "⏭️ Salto apt autoremove su richiesta utente"
fi

info "🔚 Fine aggiornamento su $HOSTNAME: $(date)"

# Invio email con gestione completa
if command -v sendmail >/dev/null 2>&1; then
    cat <<EOF | sendmail -t
To: $EMAIL
Subject: $SUBJECT
Content-Type: text/plain; charset=UTF-8

$(cat "$LOGFILE")
EOF
    info "📧 Log inviato a $EMAIL tramite sendmail"
else
    warning "⚠️ Comando 'sendmail' non trovato. Impossibile inviare email."
fi

# Verifica sistema
info "🧠 Verifica sistema"
uname -a >> "$LOGFILE"
free -h >> "$LOGFILE"
df -h >> "$LOGFILE"
apt list --installed --upgradable | grep -v "^Listing$" >> "$LOGFILE"

warning "Importante: Controllare il log per confermare l'esito riuscito"

🧬 Script per Rocky Linux

#!/bin/bash

# Script di aggiornamento per Rocky Linux con invio log via sendmail
# Autore: Francesco

set -euo pipefail

DATA=$(date '+%Y-%m-%d %H:%M')
HOSTNAME=$(hostname)
EMAIL="ammin@internal.lan"
SUBJECT="[$HOSTNAME] Log aggiornamento Rocky Linux - $DATA"

# 📦 Variabile per accumulare il log
LOG="🟢 Inizio aggiornamento su $HOSTNAME (Rocky Linux): $DATA"$'\n\n'

# Funzione per eseguire un comando con log
esegui_comando() {
    local descrizione="$1"
    local comando="$2"

    LOG+="🔧 $descrizione"$'\n'
    if output=$($comando 2>&1); then
        LOG+="$output"$'\n\n'
    else
        LOG+="❌ Errore durante '$comando':"$'\n'"$output"$'\n\n'
    fi
}

# Aggiorna lista pacchetti
esegui_comando "dnf check-update" "dnf check-update"

# Conferma per upgrade
read -p "Vuoi eseguire 'dnf upgrade'? [s/N] " conferma
if [[ "$conferma" =~ ^[sS]$ ]]; then
    esegui_comando "dnf upgrade -y" "dnf upgrade -y"
else
    LOG+="❌ upgrade annullato dall'utente"$'\n\n'
fi

# Conferma per autoremove
read -p "Vuoi eseguire 'dnf autoremove'? [s/N] " conferma_autoremove
if [[ "$conferma_autoremove" =~ ^[sS]$ ]]; then
    esegui_comando "dnf autoremove -y" "dnf autoremove -y"
else
    LOG+="❌ autoremove annullato dall'utente"$'\n\n'
fi

LOG+="✅ Script completato su $HOSTNAME: $(date)"$'\n'

# 📬 Invio log via sendmail
if command -v sendmail >/dev/null 2>&1; then
    {
        echo "To: $EMAIL"
        echo "Subject: $SUBJECT"
        echo "Content-Type: text/plain; charset=UTF-8"
        echo ""
        echo "$LOG"
    } | sendmail -t
    echo "📨 Log inviato a $EMAIL tramite sendmail"
else
    echo "⚠️ Comando 'sendmail' non trovato. Impossibile inviare email."
fi

Altro codice per Debian

#!/usr/bin/env bash
# safe-update-apt.sh
# Aggiornamento sicuro usando apt, evita freeze e rimozione kernel/MTA accidentale.
# Esegui come root.

set -o pipefail
IFS=$'\n\t'

DATA=$(date '+%Y-%m-%d %H:%M')
HOSTNAME=$(hostname)
EMAIL="ammin@internal.lan"
SUBJECT="[$HOSTNAME] Report aggiornamento - $DATA"

LOGTMP=$(mktemp /tmp/safe-update-log.XXXXXX)
trap 'rm -f "$LOGTMP"' EXIT

SHORT_T=120
LONG_T=600
MAIL_T=30

info(){ echo -e "🟢 $*" | tee -a "$LOGTMP"; }
warn(){ echo -e "🟠 $*" | tee -a "$LOGTMP"; }
err(){ echo -e "🔴 $*" | tee -a "$LOGTMP"; }

# Esegui comando con timeout e log
run_timeout(){
  local t="$1"; shift
  local cmd="$*"
  info "▶ Eseguo (timeout ${t}s): $cmd"
  if timeout --preserve-status "${t}" bash -c "$cmd" >>"$LOGTMP" 2>&1; then
    return 0
  else
    warn "⏱️ Timeout o errore su: $cmd"
    return 1
  fi
}

# Attendi lock dpkg/apt con timeout
wait_for_locks(){
  local wait_s="$1"
  local elapsed=0
  local interval=2
  while fuser /var/lib/dpkg/lock >/dev/null 2>&1 || fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || pgrep -x apt >/dev/null || pgrep -x apt-get >/dev/null || pgrep -x dpkg >/dev/null; do
    if [ "$elapsed" -ge "$wait_s" ]; then
      warn "dpkg/apt ancora occupato dopo ${wait_s}s"
      return 1
    fi
    sleep "$interval"
    elapsed=$((elapsed+interval))
  done
  return 0
}

# Prompt sì/no sicuro
yn(){
  local msg="$1"
  if [ -t 0 ]; then
    read -r -p "$msg [s/N] " resp
    [[ "$resp" =~ ^[sS]$ ]]
  else
    return 1
  fi
}

# Proteggi kernel in uso
protect_kernel(){
  local running_kernel
  running_kernel=$(uname -r)
  local kernel_pkg
  kernel_pkg=$(dpkg -S "/boot/vmlinuz-$running_kernel" 2>/dev/null | cut -d: -f1 || true)
  if [ -n "$kernel_pkg" ]; then
    info "🛡️ Kernel in uso: $running_kernel -> $kernel_pkg (marcato manuale)"
    apt-mark manual "$kernel_pkg" >>"$LOGTMP" 2>&1 || warn "apt-mark manual kernel fallito"
  else
    warn "⚠️ Non ho identificato il pacchetto kernel corrente"
  fi
}

# Simula autoremove e restituisce lista pacchetti candidate
simulate_autoremove(){
  info "🔎 Simulo autoremove"
  apt-get -s autoremove 2>/dev/null | tee /tmp/autoremove-sim.$$ >>"$LOGTMP"
  awk '/^Remv /{print $2} /^Remv:/{for(i=2;i<=NF;i++) print $i}' /tmp/autoremove-sim.$$ 2>/dev/null | sort -u
}

# Invio mail non bloccante con timeout
send_mail_nonblocking(){
  local mailtmp
  mailtmp=$(mktemp)
  {
    echo "To: $EMAIL"
    echo "Subject: $SUBJECT"
    echo "Content-Type: text/plain; charset=UTF-8"
    echo
    cat "$LOGTMP"
  } > "$mailtmp"
  timeout "${MAIL_T}s" sendmail -t < "$mailtmp" >>"$LOGTMP" 2>&1 & disown || warn "sendmail timeout o errore"
  rm -f "$mailtmp"
  info "📧 Tentativo invio log (non bloccante)"
}

# Inizio
info "=== INIZIO aggiornamento su $HOSTNAME : $DATA ==="

export DEBIAN_FRONTEND=noninteractive
export DEBCONF_NONINTERACTIVE_SEEN=true
export APT_LISTCHANGES_FRONTEND=none

wait_for_locks 30 || {
  warn "Lock persistenti: mostro processi rilevanti"
  ps -ef | egrep 'apt-get|apt|dpkg|sendmail' | egrep -v 'egrep|grep' >>"$LOGTMP"
  run_timeout "$LONG_T" "apt-get -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' --fix-broken install -y" || warn "fix-broken timeout/errore"
}

# Update
if ! run_timeout "$SHORT_T" "apt-get update -y"; then
  err "apt-get update fallito: esco"
  send_mail_nonblocking
  exit 1
fi

# Upgrade opzionale
if yn "Vuoi eseguire apt upgrade?"; then
  run_timeout "$LONG_T" "apt-get -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' upgrade -y" || warn "upgrade terminato con errori"
else
  info "⏭️ Upgrade saltato su richiesta"
fi

# Fix broken
run_timeout "$LONG_T" "apt-get --fix-broken install -y" || warn "fix-broken ha segnalato problemi"

# Proteggi kernel e MTA essenziali
protect_kernel
# Proteggi MTA comuni per evitare rimozioni accidentali
apt-mark manual sendmail sendmail-base sendmail-cf sensible-mda 2>/dev/null || true

# Autoremove sicuro
if yn "Vuoi eseguire autoremove sicuro (simulazione + rimozione mirata)?"; then
  to_remove=$(simulate_autoremove)
  safe_list=$(echo "$to_remove" | egrep -v '^(linux-image|linux-headers|linux-modules|sendmail|sendmail-base|sendmail-cf|sensible-mda)' || true)
  if [ -z "$safe_list" ]; then
    warn "Nessun pacchetto sicuro da rimuovere o solo kernel/MTA presenti. Autoremove saltato."
  else
    info "Rimuovo pacchetti sicuri:"
    echo "$safe_list" | tee -a "$LOGTMP"
    run_timeout "$LONG_T" "apt-get -y --purge remove $(echo "$safe_list" | xargs)" || warn "rimozione mirata ha segnalato errori"
  fi
else
  info "Autoremove saltato su richiesta"
fi

info "=== FINE aggiornamento su $HOSTNAME : $(date) ==="

# Report
if [ -f /var/log/apt/history.log ]; then
  echo -e "\n---- /var/log/apt/history.log (ultime 200 righe) ----" >>"$LOGTMP"
  tail -n 200 /var/log/apt/history.log >>"$LOGTMP" 2>&1 || true
fi

{
  echo -e "\n---- Info sistema ----"
  uname -a
  free -h
  df -h
  echo -e "\n---- Pacchetti upgradabili ----"
  apt list --upgradable 2>/dev/null | grep -v "^Listing$" || true
} >>"$LOGTMP"

send_mail_nonblocking

# Se vuoi conservare il log, copia $LOGTMP in /var/log prima che venga rimosso
exit 0

Altro codice per Rocky linux

#!/bin/bash

# 📅 Info iniziali
DATA=$(date '+%Y-%m-%d %H:%M')
HOSTNAME=$(hostname)
EMAIL="ammin@internal.lan"
SUBJECT="[$HOSTNAME] Log aggiornamento - $DATA"
LOGFILE=$(mktemp)
trap "rm -f $LOGFILE" EXIT

# 🔧 Logging
log() { echo -e "$@" >> "$LOGFILE"; }
info() { log "🟢 $@"; }
warn() { log "🟠 $@"; }
err()  { log "🔴 $@"; }

# ❓ Conferma interattiva
ask() {
    local prompt="$1"
    if [ -t 0 ]; then
        read -r -p "$prompt [s/N] " reply
        [[ "$reply" =~ ^[sS]$ ]]
    else
        return 1
    fi
}

info "Inizio aggiornamento su $HOSTNAME: $DATA"

# 🔄 Aggiorna cache
info "Pulizia e aggiornamento cache..."
dnf clean all && dnf makecache || { err "Errore durante 'dnf makecache'"; exit 1; }

# ⬆️ Upgrade
if ask "Vuoi eseguire 'dnf upgrade'?"; then
    info "Eseguo 'dnf upgrade'..."
    dnf upgrade -y || warn "Upgrade completato con errori"
else
    info "Upgrade saltato"
fi

# 🧹 Autoremove
if ask "Vuoi eseguire 'dnf autoremove'?"; then
    info "Eseguo 'dnf autoremove'..."
    dnf autoremove -y || warn "Autoremove ha segnalato errori"
else
    info "Autoremove saltato"
fi

info "Fine aggiornamento: $(date '+%c')"

# 📦 Tracciamento pacchetti aggiornati
info "📜 Storico transazioni DNF"
dnf history list | head -n 10 >> "$LOGFILE"

LAST_ID=$(dnf history | awk '/Upgrade/ {print $1}' | head -n 1)
if [ -n "$LAST_ID" ]; then
    info "📦 Dettagli ultima transazione (ID $LAST_ID)"
    dnf history info "$LAST_ID" >> "$LOGFILE"
else
    warn "Nessuna transazione di upgrade trovata"
fi

# 🧠 Info sistema
info "🧠 Informazioni sistema:"
uname -a >> "$LOGFILE"
free -h >> "$LOGFILE"
df -h >> "$LOGFILE"

# 📌 Aggiornamenti disponibili
info "📌 Aggiornamenti disponibili:"
dnf check-update >> "$LOGFILE"

# 📧 Invio email con gestione dimensione
MAXSIZE=500000  # ~500 KB
LOGSIZE=$(stat -c%s "$LOGFILE")

if command -v sendmail >/dev/null 2>&1; then
    if [ "$LOGSIZE" -lt "$MAXSIZE" ]; then
        {
            echo "To: $EMAIL"
            echo "Subject: $SUBJECT"
            echo "Content-Type: text/plain; charset=UTF-8"
            echo ""
            cat "$LOGFILE"
        } | sendmail -t
        info "📧 Log inviato a $EMAIL"
    else
        {
            echo "To: $EMAIL"
            echo "Subject: $SUBJECT (estratto)"
            echo "Content-Type: text/plain; charset=UTF-8"
            echo ""
            echo "⚠️ Log troppo grande. Invio solo le ultime 500 righe:\n"
            tail -n 500 "$LOGFILE"
        } | sendmail -t
        warn "Log troppo grande: invio parziale"
    fi
else
    warn "Sendmail non disponibile. Email non inviata."
fi

warn "Controlla il log per confermare l'esito e i pacchetti aggiornati"

📌 Considerazioni finali

Questi script sono pensati per ambienti dove è importante avere controllo manuale sull’aggiornamento e una tracciabilità immediata via email. Entrambi sono compatibili con sendmail e non lasciano tracce locali del log.

Analisi di un Script Bash per la Visualizzazione dei Moduli di Memoria 💻🔍

Il codice che hai fornito è uno script Bash chiamato memory.sh progettato per recuperare e visualizzare informazioni dettagliate sui moduli di memoria installati in un sistema Linux. Analizziamolo passo per passo!

#!/usr/bin/env bash
# memory.sh – mostra direttamente i blocchi dei banchi di memoria

set -euo pipefail

if ! command -v lshw >/dev/null 2>&1; then
    echo "lshw non è installato." >&2
    exit 1
fi

echo "=== Moduli di memoria ==="
sudo lshw -C memory | grep -A 10 'bank:' | grep -v -- '--'



Spiegazione riga per riga:

  1. #!/usr/bin/env bash: Questa è la “shebang” line. Indica al sistema operativo di eseguire lo script utilizzando l’interprete Bash. env garantisce che il percorso a bash sia trovato nel sistema, rendendo lo script più portabile. ✨
  2. # memory.sh – mostra direttamente i blocchi dei banchi di memoria: Questa è una riga di commento che descrive lo scopo dello script. 📝
  3. set -euo pipefail: Questa riga imposta diverse opzioni di Bash per una maggiore robustezza:
    • -e (errexit): Lo script termina immediatamente se un comando esce con un codice di errore diverso da zero. ⚠️
    • -u (nounset): Tratta le variabili non inizializzate come errori.
    • -o pipefail: Se una pipeline (una sequenza di comandi collegati tramite pipe) fallisce, lo script termina.
  4. if ! command -v lshw >/dev/null 2>&1; then ... fi: Questa parte controlla se il comando lshw (Hardware Lister) è installato nel sistema. lshw è uno strumento potente per ottenere informazioni dettagliate sull’hardware del sistema. Se lshw non è trovato, lo script stampa un messaggio di errore e termina. 🚫

Come funziona il resto dello script:

  • echo "=== Moduli di memoria ===": Stampa un’intestazione per rendere l’output più leggibile. 📢
  • sudo lshw -C memory | grep -A 10 'bank:' | grep -v -- '--': Questa è la parte cruciale dello script.
    • sudo lshw -C memory: Esegue lshw con i privilegi di amministratore (sudo) per ottenere informazioni sull’hardware, specificamente sulla categoria “memory”.
    • grep -A 10 'bank:': Filtra l’output di lshw per trovare le righe che contengono la parola “bank:” (che indica i banchi di memoria). -A 10 significa che vengono stampate le 10 righe dopo la riga corrispondente.
    • grep -v -- '--': Esclude le righe che contengono il carattere “–” (che spesso indica separatori in lshw).

Esempio di Output:

L’output dello script sarà una serie di righe che mostrano le informazioni sui banchi di memoria. Ecco un esempio (l’output reale varierà a seconda del tuo hardware):

=== Moduli di memoria ===
    descrizione: DDR4-3200 8GB DIMM
    informazioni:  lunghezza: 16 cm
    descrizione: DDR4-3200 8GB DIMM
    informazioni:  lunghezza: 16 cm
    descrizione: DDR4-3200 8GB DIMM
    informazioni:  lunghezza: 16 cm
    descrizione: DDR4-3200 8GB DIMM
    informazioni:  lunghezza: 16 cm
    descrizione: DDR4-3200 8GB DIMM
    informazioni:  lunghezza: 16 cm

Tabella riassuntiva (ipotetica):

ComponenteTipoCapacitàVelocità
Modulo 1DDR4 DIMM8GB3200MHz
Modulo 2DDR4 DIMM8GB3200MHz
Modulo 3DDR4 DIMM8GB3200MHz

(Nota: questa tabella è un esempio, l’output effettivo dello script conterrà informazioni più dettagliate.)

Consigli Pratici:

  • Esecuzione: Salva lo script in un file (ad esempio, memory.sh), rendilo eseguibile con chmod +x memory.sh e poi eseguilo con ./memory.sh.
  • Privilegi: Lo script richiede privilegi di amministratore (sudo) per accedere alle informazioni sull’hardware.
  • Personalizzazione: Puoi modificare lo script per estrarre altre informazioni, come la dimensione totale della memoria o il tipo di memoria.

Questo script è un ottimo punto di partenza per monitorare la tua memoria e assicurarti che il tuo sistema funzioni in modo ottimale! 🚀

DHT22 + ESP32: Come trasformare un semplice sensore in una “smart zone”

1️⃣ Materiale necessario

ElementoQuantitàNote
ESP32 (es. esp32dev o nodemcu‑32s)1Assicurati di avere i driver installati sul PC.
DHT22 (temperatura + umidità)1Più preciso del DHT11.
Resistor 10 kΩ1Pull‑up per il pin DATA.
Condensatore 100 nF (opzionale)1Filtra eventuali rumori sulla linea di alimentazione.
Cavi jumperVariPer collegamenti in breadboard o direttamente ai pin.

2️⃣ Schema di collegamento

🔌 DHT22 → ESP32

DTH22ESP32Commento
VCC3V3Alimentazione a 3,3 V (compatibile con ESP32).
GNDGNDTerra comune.
DATAGPIO4Pin digitale libero; scegli un altro se preferisci.

Pull‑up: collega il resistore 10 kΩ tra VCC e il pin DATA per stabilizzare la linea.
Condensatore (opzionale): posizionalo vicino al DHT22, dal GND a VCC.


3️⃣ Configurazione ESPHome (YAML)

esphome:
  name: dth22_esp32
  platform: ESP32
  board: esp32dev   # cambia se usi un altro modello

wifi:
  ssid: "NOME_Rete"
  password: "PASSWORD"

api:
ota:

logger:

sensor:
  - platform: dht
    pin: GPIO4          # stesso pin usato nel collegamento
    temperature:
      name: "Temperatura DTH22"
      unit_of_measurement: °C
      accuracy_decimals: 1
    humidity:
      name: "Umidità DTH22"
      unit_of_measurement: "%"
      accuracy_decimals: 0
    update_interval: 60s   # lettura ogni minuto

Come procedere

  1. Crea un nuovo file dth22_esp32.yaml nella cartella ESPHome del tuo progetto.
  2. Inserisci le tue credenziali Wi‑Fi al posto di NOME_Rete e PASSWORD.
  3. Carica il firmware: esphome run dth22_esp32.yaml.

4️⃣ Visualizzare i dati in tempo reale

Una volta che l’ESP32 sta inviando le letture, puoi mostrarle ovunque tu voglia:

  • Home Assistant: aggiungi un sensore via API o MQTT.

5️⃣ Consigli pratici

ProblemaSoluzione
Letture errateVerifica la connessione GND; senza terra condivisa il sensore non funziona correttamente.
Rumore di lineaAggiungi un condensatore da 100 nF tra VCC e GND vicino al DHT22.
Pin occupatoSe GPIO4 è già in uso, scegli un altro pin digitale libero (ad es. GPIO5).

🎉 Conclusioni

Con pochi componenti, qualche riga di YAML e la potenza dell’ESP32, hai trasformato un semplice sensore DHT22 in una fonte affidabile di dati ambientali. Ora puoi monitorare temperatura e umidità ovunque tu voglia – dalla tua cucina al tuo laboratorio IoT!

🔍 Verificare Record DNS con Bash: Script Pratico per Admin Reti

In ambienti aziendali o laboratori, è fondamentale sapere se i propri record DNS (A, MX, PTR, SRV…) sono correttamente configurati e risolvibili. Ecco uno script in Bash che permette di eseguire questa verifica in modo semplice, elegante e documentato — con output in un file di log.

🧪 Cos’è questo script?

Un semplice tool scritto in Bash che:

  • interroga una lista personalizzata di record DNS
  • gestisce diversi tipi (A, MX, PTR, SRV)
  • salva i risultati in un file di log con timestamp
  • usa dig per ottenere le risposte dal server DNS specificato

📜 Il codice

#!/bin/bash

# 🔧 Configura IP del tuo DNS server (es. Unbound locale)
DNS_SERVER="192.168.3.123"

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LOGFILE="$SCRIPT_DIR/dnscheck.log"

# 🧹 Pulizia del log: ogni esecuzione parte da zero
> "$LOGFILE"

DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "🔍 DNS Check — $DATE" >> "$LOGFILE"
echo "==========================" >> "$LOGFILE"

# 📋 Lista dei record da interrogare: nome,tipo
RECORDS=$(cat <<EOF
smtp.internal2.lan,A
internal2.lan,MX
192.168.3.83,PTR
_ldap._tcp.internal2.lan,SRV
_kerberos._tcp.internal2.lan,SRV
_kerberos._udp.internal2.lan,SRV
_ldap._tcp.gc._msdcs.internal2.lan,SRV
ns8.internal.lan,A
internal.lan,MX
192.168.3.76,PTR
dc1.ad.internal.lan,A
_ldap._tcp.internal.lan,SRV
_kerberos._tcp.internal.lan,SRV
_kerberos._udp.internal.lan,SRV
_ldap._tcp.gc._msdcs.internal.lan,SRV
EOF
)

# 🔄 Loop per interrogare ogni record e verificare risposta
IFS=$'\n'
for entry in $RECORDS; do
    NAME=$(echo "$entry" | cut -d',' -f1)
    TYPE=$(echo "$entry" | cut -d',' -f2)

    echo -ne "🔎 [$TYPE] $NAME... " >> "$LOGFILE"

    if [ "$TYPE" = "PTR" ]; then
        RESULT=$(dig -x "$NAME" @$DNS_SERVER +short)
    else
        RESULT=$(dig "$NAME" "$TYPE" @$DNS_SERVER +short)
    fi

    if [ -z "$RESULT" ]; then
        echo "❌ Nessuna risposta" >> "$LOGFILE"
    else
        echo "$RESULT" >> "$LOGFILE"
    fi
done

echo -e "✅ Fine verifica\n" >> "$LOGFILE"

🛡️ Come usarlo

  1. Imposta il server DNS in DNS_SERVER (es. 192.168.3.123).
  2. Personalizza la lista RECORDS con i nomi e tipi che vuoi controllare.
  3. Salva lo script come dnscheck.sh, rendilo eseguibile (chmod +x dnscheck.sh) ed eseguilo.
  4. I risultati verranno salvati in dnscheck.log nella stessa directory.