Suggerimento per progetto Domotico "ambizioso"

Salve, vorrei realizzare un progetto domotico con funzioni di antifurto che dovrebbe contenere sicuramente più di un arduino.

Volevo capire se facendo scrivere i dati acquisiti dai vari sensori in un database mysql posizionato in locale su un raspberry potrei usare questo database per leggere e scrivere dati da tutti gli arduino interessati?
Questo per avere magari un display per visualizzare le info, possibilità di telecontrollo tramite web/app.
Secondo qualcuno più esperto e navigato nel settore, sarebbe questa la strada migliore per questo progetto?

Credo proprio sia possibile, ma ovviamente da Arduino non vai a scrivere direttamente nel MySql, ma ti serve "qualcosa" che riceva le informazioni e scriva lui sul database (e/o che leggendo le info dal db le fornisca su richiesta all'Arduino che le richiede).

Quindi tutto sta nel definire l'infrastruttura sia come comunicazione (es. Ethernet? WiFi? Altro?) sia come "server" centrale su Raspberry (come debba funzionare e quindi come implementarlo dipende dalla precedente scelta).

Grazie per la risposta, avrei bisogno di capire meglio il "qualcosa" che scrive nel db cosa potrebbe essere, l'infrastruttura sarà basata o su ethernet o wifi se sarò costretto.
Se il raspberry rappresenta un problema o una complicazione lo posso rimpiazzare tranquillamente con un pc windows o linux.

Un'idea potrebbe semplicemente essere che i vari Arduino, via WiFi, fanno delle banali HTTP GET ed inviano i dati ad un programma in PHP che gira sulla raspberry e che provvede a metterli nel DB MySQL.

Guglielmo

Grazie per la risposta, il programma php lo dovrei scrivere io? (questo potrebbe essere un problema)

la questione interscambio dati e consultazione tra gli arduino è corretto farla quindi con database o ci sono strade migliori/più semplici?

geniusmiki:
Grazie per la risposta, il programma php lo dovrei scrivere io?

Ovviamente SI ... visto che sei TU che sai che dati devi trattare, come li devi registrare e come li vuoi poi elaborare. ::slight_smile:

Guglielmo

geniusmiki:
Grazie per la risposta, il programma php lo dovrei scrivere io? (questo potrebbe essere un problema)

:o

Famme capi'... Tu vorresti realizzare un progetto di domotica basato su Arduino e con database MySQL, e non sai come scrivere n programma che accetta delle connessioni ed in base a questo scrive in un DB?

:smiley: se no non era abbastanza "ambizioso" no?

(@geniusmiki ...si fa per ridere neH!)

Grazie a tutti per le risposte,
@docdoc, purtroppo ho conoscenze di programmazione molto basilari, solo per passione mi diverto con arduino.
Speravo che arduino avesse una libreria che scrivesse semplicemente in un db mysql. Se devo creare il connettore non ne sono in grado.

@Patrick_M :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

geniusmiki:
... Speravo che arduino avesse una libreria che scrivesse semplicemente in un db mysql ...

Premesso che stai confondendo un qualche cosa che è nato per fare controlli/automazione (una piccola MCU a 8 bit) con un qualche cosa che è un piccolo computer (un sistema Linux adatto a fare certe cose), ricordo che qualcuno aveva scritto una libreria mySQL per Arduino, ma ... NON ho mai saputo se veramente funzionasse.

La strada da seguire te l'ho indicata, se vuoi arrischiarti con una libreria raramente usata e dall'incerto funzionamento ... prova a cercare su Google e forse qualche cosa troverai.

Guglielmo

Guglielmo grazie per il tempo che hai speso per rispondermi ancora una volta, proverò la libreria perchè in realtà non posso fare altrimenti, in php non so mettere mano

a presto

QUI trovi la libreria ... poi facci sapere se funziona :smiley:

Guglielmo

Il progetto è interessante. Usare una comunicazione IP su ethernet significa non doversi occupare di collegamento fisico, instradamento, collisione, controllo errori, tutti i tormentoni dei link più "semplici".

Naturalmente l'intera infrastruttura deve essere a prova di blackout, quindi alimentazione tramite UPS di tutti gli elementi (router, switch, sensori, nodi remoti ecc).

L'uso di un Rpy come macchina server mi sembra azzeccato per il basso consumo, ma qualsiasi cosa su cui possa girare un sistema operativo decente va bene.

Personalmente per piccoli messaggi su una rete di sensori interna non userei il TCP (e quindi neppure il protocollo HTTP che viene trasportato dal TCP), se un'unità non risponde si resta bloccati in attesa della connessione.

Piuttosto l'UDP, che mi sembra più simile alla seriale: si spedisce senza alcun ritardo e "si spera" che all'altro lato abbiano ricevuto... eventualmente si pensa a un ACK.

Non ho approfondito, ma lato Arduino per inviare pacchetti UDP dovrebbero bastare queste informazioni: https://www.arduino.cc/en/Tutorial/UDPSendReceiveString

Rimane naturalmente il lato server, da scrivere in un qualsiasi linguaggio che permette l'uso dei socket UDP/IP per ricevere i messaggi dagli Arduino sensori. In Python ad esempio bastano una ventina di righe o meno (in Java immagino anche), ma non so se in questo forum (in quanto discorso complessivo legato ad Arduino) se ne può parlare...

Ad esempio come spunto un server UDP minimale in Python3 è questo (stampa i messaggi ricevuti da Arduino o da chi altro, e risponde ACK):

from socketserver import UDPServer, BaseRequestHandler

class Gestore(BaseRequestHandler):

    def handle(self):
        messaggio = self.request[0].decode('utf-8')
        socket = self.request[1]
        print('L\' IP {} ha inviato:'.format(self.client_address[0]))
        print(messaggio)
        socket.sendto('ACK'.encode('utf-8'), self.client_address)

server = UDPServer(('', 8000), Gestore)
server.serve_forever()

Per quanto riguarda il database invece non ne so nulla, magari non è neppure necessario.

Se non ricordo male per scrivere in un db MySql dovrebbe bastare connettersi alla sua porta e usare i comandi SQL.

@geniusmiki,
ultimamente sta andando di moda il database InfluxDB, vedi se può fare al caso tuo.

zoomx:
Se non ricordo male per scrivere in un db MySql dovrebbe bastare connettersi alla sua porta e usare i comandi SQL.

Ma no, non funziona così, c'è un protocollo di comunicazione che non puoi gestire così...

Al massimo se la macchina è Linux potresti fare una connessione Telnet, ed accedere al DB con l'apposito comandio poi dare le istruzioni SQL. Ma è una procedura non semplice da gestire (mandare un comando, attendere una risposta prima di dare il successivo o riconoscere eventuali messaggi di errore, eccetera...).

Potrebbe fare qualcosa in php ad esempio ma in ogni caso se non sa programmare in generale, la vedo difficile se prima non studia gli aspetti tecnici (o paga qualcuno per realizzarlo per suo conto ;)).

Ma come, prima scrivi

docdoc:
Ma no, non funziona così, c'è un protocollo di comunicazione che non puoi gestire così...

e poi scrivi

docdoc:
Al massimo se la macchina è Linux potresti fare una connessione Telnet, ed accedere al DB con l'apposito comandio poi dare le istruzioni SQL.

che è quello che avevo scritto io.

docdoc:
Ma è una procedura non semplice da gestire (mandare un comando, attendere una risposta prima di dare il successivo o riconoscere eventuali messaggi di errore, eccetera...).

Non è scienza dei razzi. Ci sono un sacco di esempi di connessioni del genere con gestione degli errori, ad esempio quelle ai server SMTP.

docdoc:
Potrebbe fare qualcosa in php ad esempio ma in ogni caso se non sa programmare in generale, la vedo difficile se prima non studia gli aspetti tecnici (o paga qualcuno per realizzarlo per suo conto ;)).

Questa inceve è una obiezione valida.

zoomx:
Ma come, prima scrivie poi scrivi
che è quello che avevo scritto io.

No, scusa, forse sei tu ad aver scritto una cosa imprecisa, differente da ciò che intendevi (ma ci si basa su ciò che hai scritto, non su quello che intendevi)...
Tu hai detto:

scrivere in un db MySql dovrebbe bastare connettersi alla sua porta e usare i comandi SQL

Con "alla sua porta", visto che il soggetto è il "db MySql", in italiano si intende "la porta di MySQL" ossia la 3306 TCP, e da qui per "usare i comandi SQL" ho detto che non si può fare in quel modo.

Una cosa diversa sarebbe stata dire "connettersi tramite telnet al sistema" (che implica prima loggarsi al sistema, poi lanciare mysql da prompt dando le ceredenziali utente MySQL) e allora ci si intende...

zoomx:
Non è scienza dei razzi. Ci sono un sacco di esempi di connessioni del genere con gestione degli errori, ad esempio quelle ai server SMTP.

Certo, e l'ho fatto anche io stesso a suo tempo (implementai anche POP3 ad esempio), ma quello è un preciso protocollo, con precise risposte codificate, non una interfaccia pensata per "umani" che va interpretata da un software che cerca di simulare le operazioni...

Si, intendevo quello e ho sbagliato io.

La libreria del link del post di Guglielmo mette la query in ASCII dentro un pacchetto con altri dati binari e poi li spara sulla porta 3306 o quella che è. Non c'è una CLI.

zoomx:
Si, intendevo quello

Ok, immaginavo! ;D
Comunque l'OP non sta intervenendo nel thread, quindi aspettiamo di sentire se ha qualcosa da dire o chiedere, altrimenti inutile proseguire secondo me... :wink: