Piccolo sistema di domotica: il giusto approccio

Buonasera a tutti. Benchè alle prime armi con Arduino e con la programmazione in C, ho deciso di cimentarmi in un progetto che, sicuramente è piu grande di me.
Pertanto, partendo dai vari progetti di esempio, ho iniziato con il combinare tra di loro le varie esperienze fatte per "far mio" quanto imparavo.
Finchè...acquistati i vari moduli RS485, non ho iniziato a far dialogare le varie schede tra di loro. Semplici messaggi, trasmessi con un codice trovato in rete.
Le trame inviate, sono composte come segue:
A questo punto, ho preso carta e penna (bugia...ho usato un foglio di calcolo) ed ho iniziato a scrivere i vari messaggi che master e slaves, si sarebbero scambiati. Da qualche prova fatta, mi son reso conto di un “limite” imposto dal codice trovato in rete. Non ho approfindito per capire in che modo l'autore (non so se posso citarlo, quindi per il momento mi astengo) abbia affrontato questo “problema”.
Il limite sta nel fatto che, al momento della “costruzione” della trama da inviare, i dati “passati” alla funzione sono mittente, destinatario, tipo di dato, dato 1 e dato 2.
La funzione, prima di calcolare il checksum manipola il tipo di dato in questo modo:

dato_da_inviare = tipo_di_dato << 2

I due bit che vengono liberati, vengon posti a 1 qualora dato 1 o dato 2 fossero o 0.
Va da se che i primi due bit a sinistra (MSB) DEVONO essere a 0 in quanto “spariscono” dopo lo shift: ergo...il numero massimo di tipo di dato sarà 63...diciamo che, per iniziare, non è affatto male!

A questo punto, quindi, ho iniziato a giochicchiare un po con varie schede montate “volanti” su breadboard al fine di imparare a trattare i dati da inviare, prepararli per l'invio e, a ricezione avvenuta, decodificarli nel modo corretto.
Non mi sembra il caso di dilungarmi oltremodo e cerco di venire subito al dunque.

Premesso che, caparbio come sono, vi sarei ipergrato se, anche a costo di farmi insultare, mi aiutaste (almeno per il momento) a capire qual è secondo voi, il giusto approccio: il codice bello e pronto è sicuramente comodo, ma...non mi aiuta a capire.

La struttura della rete, sarà composta in un primo momento da
1 master (Mega 2560) sulla quale verrà montato oltre al modulo di comunicazione seriale, un shield Ethernet per la gestione remota
4 slaves preconfigurati per accettare 8 ingressi digitali, 1 ingresso analogico e 7 uscite (le uscite azioneranno dei relays)
Spero in eventuali sviluppi futuri (slaves con display e tasti navigazine menu, ecc) ma per il momento, non posso mettere troppa carne al fuoco.

Il master, in loop, interroga le varie schede le quali, se non hanno subito variazioni sugli input, rispondono con un ACK (anche se saranno menzionati più tardi, non prendo ancora in considerazione gli input analogici).
Nel caso in cui vi fossero variazioni, il master, attiva/disattiva opportunamente le uscite in base alla programmazione utente.
Nei miei “esperimenti” atti ad apprendere, avevo creato diversi “switch” nel fw del master il quale “reagiva” accendendo o spegnendo un determinato led.
Ma...
Intanto gli ingressi possibili sono 40 (senza contare gli analogici) e le uscite sono 28 piu quelle del master stesso! Quindi, il programma perderebbe un tempo infinito alla ricerca dell'uscita (o gruppo di uscite) da attivare/disattivare.
Inoltre, con una programmazione di questo genere, ogni modifica lato utente, richiede una riscrittura del firmware con i vari problemi del caso.
La mia idea pertanto, prevede:
slaves dotati di “poca intelligenza” delegando la manipolazione delle uscite al master
scrittura della programmazione lato utente su carta SD
possibilità di modificare la programmazione utente via Ethernet
possibilità di inserire etichette per personalizzare ogni ingresso/uscita (16 caratteri se non chiedo troppo...)
Non ho mai affrontato un progetto di questa portata e mi rendo conto che il rischio che la mia presenza diventi il vostro incubo, è davvero concreto!
Personalmente, credo che la strada da percorrere, sia di organizzare in una tabella tutti i dati. Quindi qualcosa del genere:
Indirizzo (byte) rappresenta l'indirizzo della risorsa (01 il master, da 02 a 31 gli slaves, 32 il broadcast)
Pin (byte) rappresenta il pin relativo alla scheda
Ingresso/Uscita (boolean) 1: ingresso – 0: uscita
Etichetta (???) rappresenta l'etichetta visibile sugli eventuali display nonchè sull'applicazione LAN
Gruppo di appartenza (byte) rappresenta il gruppo di cui la risorsa fa parte (1)
Gruppo di destinazione (byte) rappresenta il gruppo a cui punta la risorsa (1)
Note: testo presente su SD ma visibile solo tramite PC. Potrebbe essere utile per scrivere annotazioni inerenti la risorsa in questione

(1): i gruppi potrebbero essere composti anche da un solo elemento.

Detto questo....
Quando il master riceve (e interpreta) la trama in ingresso, avrà a disposizione solo i primi due campi della tabella. Il terzo è ovviamente implicito mentre il quarto, non è importante dal punto di vista funzionale.
Il master, a questo punto, deve leggere dalla tabella il gruppo di appartenza e attivare/disattivare le uscite del gruppo di destinazione.
Sempre che quanto detto fin qui, non sia una castroneria unica, devo ammettere che sono un po perso.
Quindi prima di proseguire la mia avventura, vorrei un vostro parere circa quella che è la mia idea.
Come ho detto, sono alle prime armi con Arduino (ho fatto in passato un po di esperienza con vari PIC ma programmando quasi sempre in ASM o al limite in basic tramite l'IDE) quindi chiedo venia...
Sono parecchio testardo e intendo comunque portare avanti il progetto. Lo scopo finale? Sostanzialmente due...intanto poter installare concretamente qualcosa del genere in casa e soprattutto il piacere di poter dire: l'ho fatto io!

Attendo i vostri commenti, suggerimenti, proposte. Quanto agli insulti...se ne arrivassero, me li terrei!

Grazie a tutti!

Scusa, hai già guardato la libreria PJON (che trovi all'inizio di questa sezione del Forum) ?

Perché un protocollo multipoint, ben fatto, affidabile, con tutti i controlli necessari ... è una cosa piuttosto (molto) complessa che NON si mette in piedi così su un pezzo di carta buttando giù due idee prese di qua e di la.

Dedicati all'applicazione (... che già NON è né poco né semplice) e studiati la PJON che si occuperà di tutta la parte colloquio tra master e slave :wink:

Guglielmo

Buonasera Guglielmo e grazie per la risposta.

In tutta onestà...sicuramente guarderò e con attenzione e interesse la libreria che mi proponi.
come come ho detto, e come casualmente è scritto anche nel post che mi indichi...vuoi mettere la soddisfazione di poter dire: l'ho fatto io?
Lo dirò per sempre: sono alle prime armi e mi rendo conto della difficoltà del progetto in cui ho deciso di barcamenarmi. Ma è un qualcosa che "sogno" da davvero tantissimo tempo e quindi...intendo provare a proseguire!

(p.s.: ho comperato il libro che pochi giorni fa mi hai consigliato!)

Grazie ancora e buona serata

DaddyLee:
In tutta onestà...sicuramente guarderò e con attenzione e interesse la libreria che mi proponi.
come come ho detto, e come casualmente è scritto anche nel post che mi indichi...vuoi mettere la soddisfazione di poter dire: l'ho fatto io?

Ci sono cose che TU puoi fare e cose per cui ci vuole un'esperienza specifica di molti anni ... e i protocolli di rete sono una di quelle cose.

Farle così, senza alcuna esperienza in protocolli di rete, è solo fare una "schifezza" (passami l termine) di scarsissima affidabilità e sicurezza.

Come ti ho già detto ... fai TU tutta la parte "applicativa" (dove potrai dire .. l'ho fatto io) e lascia i protocolli di rete a chi ha esperienza in quel settore e c'ha sbattuto la faccia per centinaia di ore/uomo !

Poi ... l'impianto che vuoi fare è il tuo e i casini te li dovrai gestire tu, quindi ... fai come credi ... ::slight_smile:

Guglielmo

DaddyLee:
Ma...
Intanto gli ingressi possibili sono 40 (senza contare gli analogici) e le uscite sono 28 piu quelle del master stesso! Quindi, il programma perderebbe un tempo infinito alla ricerca dell'uscita (o gruppo di uscite) da attivare/disattivare.

Ci sono varie cose in gioco. In quella quotata in particolare non mi è chiaro il "tempo infinito". Ogni slave ha 8 ingressi più un analogico, fanno tre byte in totale da mandare al master (su richiesta dello stesso), mettiamoci due o tre byte di preambolo/controllo (CRC obbligatorio!), considerando anche la enquiry del master a 9600bit/s siamo a circa 10ms per ogni slave. Purtroppo bassa intelligenza degli slave sommata ad un funzionamento non event driven, richiedono un traffico continuo e intenso sul bus di comunicazione.

Ciao a tutti. E' un onore vedere Guglielmo consigliare PJON :slight_smile:
Concordo con Guglielmo che, se la necessita' e' avere un sistema che sia up and running, che sia privo di bug che possano mettere a rischio la tua sicurezza e o la tua incolumita' e' necessario uno studio di centianaia di ore/uomo se non anni/uomo, soprattutto se a lavorarci sei solo tu. Molto spesso e' davvero difficile riuscire a guardare qualcosa che hai realizzato da un altro punto di osservazione e scoprire inghippi e problematiche.

PJON contiene anni/uomo di sviluppo ci hanno lavorato direttamente 23 persone e centinaia hanno riportato bug o dato consigli. Anche io sono partito come te, ammiro la tua passione e pulsione a fare qualcosa di tuo (e' successa la stessa cosa anche a me). Dopo quasi 8 anni sto tutt'ora lavorando al protocollo.

Essendo una soluzione master-slave basata su RS485 (che PJON supporta) ti consiglio di valutare la possibilita' di utilizzare PJON e i suoi layer 2 (data link in questo caso RS485 over Serial) e 3 (Il protocollo di rete PJON) per avere gia a disposizione un controllo di ridondanza sicuro (CRC8 o CRC32, non ti consiglio di usare o scrivere da te una checksum perche' la sua performance sara' di certo bassa rispetto a qualsiasi sistema basato sulla divisione polinomiale binaria), l'invio di ACK sicuro, encoding che supporta la separazione tra frame (SFSP), la feature di indirizzamento device e gruppo, l'infrastruttura software per invio/ricezione di dati e gestione della configurazione di rete. Al di sopra di esso potresti sviluppare un sistema per la gestione delle etichette e cio' che e' relativo all'application layer.

Considera che PJON e' l'unica implementazione open-source di un protocollo di rete in grado di funzionare trasparentemente su Windows, Linux, RPI, AVR, ESP, usando la stessa codebase, e soprattutto l'unica implementazione in grado di supportare trasparentemente molti media diversi (e permettere il routing di pacchetti tra di essi) come LoRa, ASK/FSK, i moduli HC-12, SoftwareBitBang (comunicazione multi-master singolo filo), la seriale, USB, TCP, UDP, RS485 e comunicazione a impulsi di luce usando normali LED o diodi laser (AnalogSampling).

Dai un occhio a ModuleInterface realizzato da Fred: GitHub - fredilarsen/ModuleInterface: Easy config and value sync between IoT modules, database and web pages

Buonasera Gioscarab.
voglio intanto ringraziarti per l'opera che, assieme ad altri metti a disposizione. come gia detto, ho intenzione di studiarla attentamente.
circa la tua risposta, intanto grazie per i consigli e suggerimenti che mi dai.
ci tengo a precisare una cosa. NON è mia intenzione creare un prodotto che possa mettere in pericolo persone o cose. E quando dico che intendo mettermi "sto coso" in casa, sottointendo che, lato 220V, le precauzioni prese saranno quanto meno raddoppiate.

Rifancedomi alla risposta di Claudio, mi rendo conto che quanto ho detto sia una castroneria...

Adesso quindi vado studiare sia cio che è stato già fatto dagli altri, i datasheet dei microcontrollori che intendo usare e guide e tutorial e tutto quanto possa essere utile. Fermo restando inoltre che...non ho fretta! e che se tu ci hai messo 8 anni...beh...parto con l'idea che a me, ne serviranno almeno il doppio!

Grazie per i consigli e a presto

Davide