Aggiornamento Led scrivania

DevLog dove vi porterò assieme a me nel processo di aggiornamento del software che gestisce i miei led della scrivania.

Sulla mia scrivania ho sempre avuto una luce ambientale che illuminasse la stanza in modo soffuso e ho sempre approfittato di questa luce per dare colore e personalità a camera mia durante la sera. La luce in questione è situata sul bordo della mia scrivania che è appoggiato al muro, dietro ai monitor del computer e agli altri oggetti presenti sulla scrivania. In origine questa luce era un neon blu, dato però l’elevato consumo di corrente di questo e la sua tendenza a “sfarfallare” in modo fastidioso, è stato successivamente sostituito da 5m di led Addressable RGB che percorrono anche tutto il mobile attaccato alla scrivania e mi permettono di creare giochi di luce che oltre a illuminare,
“decorano” anche la parete della stanza.

vecchia foto di camera mia con i led accesi

I giochi di luce consistono principalmente in quelli presenti nella libreria Arduino “FastLED” nello sketch di esempio “DemoReel100” con l’aggiunta di una modalità per tenerli spenti, una per tenerli quanto più possibile bianchi e una per colorarli tutti di un colore unico.

Screenshot del modo per selezionale gli esempi della libreria FastLED

La striscia è controllata da una NodeMCU ed alimentata da un grosso alimentatore 5v da 3.5A riciclato da chissà quale apparecchiatura elettronica.

Il software per la scheda è una mia modifica dello sketch di esempio citato sopra il quale include anche il codice per interfacciare la scheda con internet e i servizi di un’app chiamata “Blynk IOT”. Fino a poco tempo fa riuscivo bene a interfacciare la striscia LED con l’app di Blynk per telefono, Home Assistant e Google Home, ma da qualche mese, l’integrazione tra Google Home e Home assistant che usavo per i LED ha iniziato a funzionare sempre meno bene e successivamente, anche l’integrazione tra Home Assistant e Blynk (questa realizzata da me attraverso Node Red) ha iniziato ad essere sempre meno affidabile, finchè un giorno, circa un paio di mesi fa, un aggiornamento di Home Assistant ha fatto crashare Node Red, facendomi perdere il flow di controllo dei led.

Nel ricostruire il flow, ho notato che le librerie che usavo per interfacciare Node Red a Blynk, dopo alcune modifiche effettuate a questo servizio lato server (Leggesi: l’aggiunta di un nuovo servizio a pagamento che taglia fuori dal piano “free” parte della comunicazione tra Node Red e Blynk) mi sono visto costretto a modificare il programma presente sulla NodeMCU per mantenere una comunicazione attraverso i dispositivi di casa mia e i miei led.

Iniziano le madonne: la ricerca del mio vecchio programma in Blynk all’interno del mio pc

Il primo passaggio, per quanto brutto, all’apparenza banale e noioso, richiede una missione alquanto complicata per il mio disordine cronico: Trovare e decifrare il mio vecchio codice per “salvare il salvabile” e portare nel nuovo programma, ciò che di buono c’era in quello vecchio

Una volta recuperato il file in questione, travasato i pezzi necessari e importate le prime librerie il codice è diventato così:

*inserire spoiler per codice, ricordarsi la censura per il wifi e l’agent*

Ora posso passare a configurare il Broker MQTT e iniziare a scrivere il firmware per la NodeMCU

Configurazione del broker MQTT

Il Setup domotico di casa mia è organizzato così: I dispositivi “Non Fai da te” che sono stati installati prima del 2020 sono collegati alla loro app/server e la loro app è collegata a Google Home, dopo il 2020 io e mio padre abbiamo tirato su il nostro server con una Raspi 4 e installato sopra questa Home Assistant OS (da qui in poi chiamato HASSIO), La maggior parte dei sensori e attuatori in casa si collegano a questo e a sua volta, questo si collega a Google Home per i comandi vocali. Ci sono inoltre alcuni script personalizzati che si interfacciano ad HASSIO tramite Node-Red, qui realizzerò anche i comandi MQTT che si interfacceranno con HASSIO.

Inizio sviluppo nuovo firmware

L’inizio del programma

Una volta configurato su HASSIO il broker MQTT è tempo di iniziare lo sviluppo del software che andrà sulla NodeMCU.
Inizio cercando informazioni riguardanti quale libreria è meglio usare per l’MQTT sulla NodeMCU e alla fine decido di optare per PubSubClient, installo quella, aggiorno FastLED e cancello quella di Blynk dalla mia IDE.
Dopodichè apro gli esempi di PubSubClient e cerco di capire quali siano i comandi indispensabili per fare comunicare NodeMCU con il broker, configuro lo sketch di base, verifico che funzioni e osservandolo funzionare finalmente riesco a capire cosa mi serve per far funzionare il mio precedente codice con questo nuovo protocollo. Apro il vecchio sketch, tolgo tutte le parti riguardanti Blynk e al posto incollo le linee configurate sul codice di esempio, faccio cambiamenti minimi per interfacciare questi nuovi comandi con la parte vecchia e finalmente carico tutto sulla scheda dopo aver risolto alcune incompatibilità tra le nuove versioni di FastLED e le schede esp8266 e esp32.

I primi test e il debug

MQTT Explorer

A questo punto devo trovare un modo per leggere e inviare i comandi tramite MQTT: a leggerli avevo già imparato durante i primissimi test a causa della ricerca in Home Assistant per i parametri del server locale, quello che ora mancava era il modo di inviare dei comandi alla NodeMCU, all’inizio scarico MQTT Explorer e cerco di collegare la scheda ad un broker MQTT pubblico. Esperienza terribile: messaggi MQTT in arrivo al server da tutto il mondo che intasano lo schermo e nessuna possibilità di distinguere i messaggi della mia scheda con quelli delle altre persone che sul server usavano caratteri occidentali. Fortunatamente poco dopo trovo il modo per inviare i comandi MQTT da Mosquitto installato su HASSIO e con quelli e il monitoraggio del traffico locale da MQTT Explorer, riesco a dedbuggare i primi problemi di comunicazione e a fare accendere e spegnere i led di camera mia

Integrare il vecchio codice in quello nuovo

Le varie iterazioni del programma

Ora non restava che sviluppare un modo per controllare le funzioni delle luci che avevo precedentemente programmato sulla mia esp. I messaggi MQTT sono molto più complicati di quelli di Blynk ma grazie a delle guide online e la documentazione di come HA comunica tramite MQTT (questa informazione è stata vitale poichè i messaggi MQTT devono seguire una logica ben precisa per essere correttamente riconosciuti come entità di HA, per fortuna questa parte è molto ben documentata sul sito di HA e quindi è stato sufficiente seguire quella, almeno non mi sono dovuto inventare io una struttura di comando, sennò sarebbe stata molto meno efficente e fonte di molti più grattacapi) riesco a ottenere i primi messaggi diversificati per controllare Luminosità, colore, stato e soprattutto, effetto luminoso dei miei led. Da lì la battaglia è stata creare una struttura logica che su NodeMCU fosse in grado di decifrare i comandi di HA e applicarli nel modo corretto, la difficoltà sta nel fatto che i comandi arrivano come puntatori di stringhe e vettori di byte, due formati poco malleabili per il C++ semplificato della IDE di Arduino. Dopo un po’ di grattacapi ho optato per una struttura (Probabilmente poco efficiente) che sfrutta una serie di “else if” per confrontare i dati convertiti con i comandi ai quali dovrebbero corrispondere e richiamare la regolazione delle luci giusta.

Controllare le luci con Home Assistant

I controlli dei led da HASSIO

Questa parte stranamente è andata molto liscia, una volta configurato tutto è stato sufficiente inserire nella configurazione di HASSIO il dispositivo, quali comandi fossero destinati a HA e cosa significassero, quali comandi HA doveva mandare alla MCU a seconda del comando desiderato e dare un nome a tutte le variabili coinvolte nella transazione, una volta configurato tutto bene è bastato riavviare HA e l’entità del dispositivo era presente e controllabile. Incredibilmente non solo era presente ma anche funzionante! Salvo qualche problema di loop causati dai comandi inviati dalla funzione di Loop della NodeMCU (risolti togliendo alcune comunicazioni di feedback da parte della NodeMCU non necessarie) risolti in poco, le luci finalmente funzionavano tramite HA e potevo modificare tutti i parametri programmati. Ora rimaneva solo l’ultimo passo: esporre le entità a Google Home per reinserire il controllo dei led all’interno delle mie routine avviate da comandi vocali.

Il complicato rapporto tra Home Assistant e Google Home

Come si può immaginare, ai servizi Google non piacciono molto i progetti di domotica DIY, infatti questi, sono abbastanza complicati da inserire nella domotica dell’azienda ma esistono dei WorkAround che permettono di far sì che alcune entità possano essere controllate dagli assistenti vocali. Non starò a spiegare come questo funziona nel mio caso perchè ci sono un sacco di guide su internet in merito ma dirò semplicemente che è bastato aggiungere il nuovo dispositivo all’interno della configurazione di questi precedentemente creati workaround. Il problema però consiste nel fatto che Google Home non riconosce tutti i parametri da me programmati per Home Assistant, in particolar modo non riconosce i diversi effetti luminosi. Il modo di controllare questi ultimi ancora non l’ho trovato. ho un paio di idee ma verranno provate nel futuro, per ora mi sto accontentando del fatto che i led possano essere accesi e spenti dalle routine vocali di Google Home

Conclusioni temporanee

Questo progetto non è stato facile e nemmeno troppo voluto, essendo però i led della mia scrivania la luce che viene usata più spesso e più a lungo era necessario per me riportarli in funzione. Sono molto fiero di come sono usciti (nonostante sia ancora presente qualche bug che se mi andrà in futuro correggerò) e spero presto di trovare un modo per controllare gli effetti luminosi attraverso le mie routine vocali. Per il momento è tutto e non resta che testare l’affidabilità del sistema usandolo il più possibile!


Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *