[Tutorial domotica] Sonoff + Python = punto luce intelligente

La possibilità di incrementare le prestazioni dell’interruttore wifi economico Sonoff della iTead grazie al firmware della Tasmota che, tra l’altro, lo svincolano dall’uso tramite App proprietaria, mi ha fatto venire l’idea di far accendere al Raspberry Pi nella mia stanza un punto luce in maniera automatica e magari intelligente (è la domotica baby!)

  • Livello di difficoltà: medio/basso
  • Costoestremamente ridotto (~10 €)

Ingredienti:

  • Sonoff Basic (acquistabile su Amazon.it)
  • saldatore e cavetti prototipazione
  • conoscenza di Python
  • spina elettrica maschio
  • spina elettrica femmina
  • filo elettrico bipolare q.b.
  • server controllo (es. Raspberry Pi)

Procedimento:

  • Innanzitutto occorre programmare il Sonoff con il firmware Tasmota. Per farlo ci sono diversi metodi, tutti magnificamente descritti nella relativa Wiki. Per conto mio non ho avuto fortuna con l’installazione via OTA: il mio interruttore montava un firmware di fabbrica troppo recente, risultato incompatibile con questa modalità di upload. Scartato il metodo via adattatore USB/TTL (che non trovo più nel cassetto e per il quale avevo trovato quest’ottima guida in italiano) mi sono arrangiato via Arduino Uno (e un saldatore) che ho sfruttato per trasferire il nuovo firmware dal PC al Sonoff, seguendo questa chiarissima guida in italiano. Cmq in caso si può fare affidamento sulla community di smanettoni che potete trovare in questo Forum o in questo canale Discord. Infine per chi proprio non se la sente, consiglio di farsi un giro su Ebay e di acquistare un dispositivo già pronto e funzionante con firmware Tasmota pre-installato.
  • Collegamenti elettrici. Ho utilizzato un cavo bipolare tipo H03VVH2 2×0,75mm, una spina elettrica maschio per il collegamento alla rete elettrica e una spina elettrica femmina per il collegamento al punto luce. Ovviamente la lunghezza dei cavi deve essere predisposta secondo necessità.
    ATTENZIONE CON LA CORRENTE 220V NON SI SCHERZA!!!
  • Il software di controllo. Il firmware Tasmota consente già di programmare (tramite la funzione timer) l’orario di accensione e di spegnimento del carico collegato all’interruttore, ma io voglio qualcosa di più intelligente.
    Voglio che il punto luce si accenda in mia presenza e al verificarsi di precise condizioni. Quindi ho creato uno script in Python (che ho chiamato myTwilight) che gira avviato via crontab sul Raspberry Pi. Lo script completo è disponibile sulla mia pagina Github e fa le seguenti cose:


    • Controlla che il Sonoff sia effettivamente operativo:

      • def pingSonoff(): ##Test ping SonOff
            var = os.popen("ping sonoff -c 1").read()
            l = var.index('received')
            l = l-2
            if var[l] == '1':
                return 'ON'
            else:
                return 'OFF'
        

      Ho assegnato l’hostname ‘sonoff’ al mio interruttore così da non essere costretto, per contattarlo, a ricordare il suo indirizzo IP.


    • Controlla via API l’ora del crepuscolo del giorno preciso (calcolata sulle coordinate geografiche della mia stanza);

      • def tramonto(lat, lng): ##Orario calcolato secondo GMT (senza ora legale/ora solare)
            request = requests.get("http://api.sunrise-sunset.org/json?lat="+lat+"&lng="+lng+"&formatted=0")
            return datetime.strptime(str(request.json()['results']['sunset'][11:16]), '%H:%M')
        

      Le coordinate geografiche della stanza le ho ottenute facilmente via Google Maps,  e la richiesta all’API del sito “sunrise-sunset.org” è gratuito e molto semplice da utilizzare, purtroppo il valore orario restituito è calcolato sull’ora GMT. Ho quindi dovuto calcolare l’offset dell’ora legale con una richiesta ad un’altra API di “worldtimeapi.org”:

      • def oralegale(): ##controllo ora legale
            request = requests.get("http://worldtimeapi.org/api/timezone/Europe/Rome")
            utc_offset = str(request.json()['utc_offset'])
            return int(utc_offset[2])
        

      E quindi l’ora del tramonto risulta essere così determinata (richiamando le suddette funzioni):

      • tramonto = tramonto(lat, lng)
        ora_tramonto = str(int(str(tramonto)[11:13])+oralegale())+':'+str(tramonto)[14:16]
        

    • Controlla la situazione meteo (indice copertura delle nuvole e quindi situazione luminosa);

      • def clima(lat, lng, api_key):
            url = "https://api.darksky.net/forecast/"+api_key+"/"+lat+","+lng+"?units=si&lang=it&exclude=daily,hourly,alerts,minutely"
            request = requests.get(url)
            print "Situazione clima: " + request.json()['currently']['summary']
            cloud = request.json()['currently']['cloudCover'] # controllo indice copertura cielo (da 0 a 1, da sereno a molto coperto)
            if  cloud > 0.50:
                if cloud > 0.75: 
                    return -600 # molto coperto
                else:
                    return -300 # coperto
            else:
                if cloud < 0.25:
                    return 0    # sereno
                else:
                    return 750  # molto sereno
        

      La suddetta funzione si è resa necessaria perché voglio che il punto luce si accenda anticipando l’ora del tramonto di qualche minuto nel caso il cielo risulti essere particolarmente coperto e quindi la stanza sia particolarmente buia, piuttosto che rimandare l’accensione di qualche minuto in caso di cielo sereno. Il sito “darksky.net” mette a disposizione via API (gratuitamente fino al limite di 1000 richieste giornaliere) diversi parametri meteorologici calcolati sulla base delle coordinate geografiche tra le quali l’indice ‘cloudCover’ che da 0 a 1 mostra lo statodella nuvolosità del cielo.


    • Controlla se sono presente nella stanza (quindi controlla se almeno uno dei due pc che solitamente utilizzo risultano accesi);

      • def ping(): ##Check presenza (attraverso ping PC e Laptop)
            var1 = os.popen("ping 192.168.1.124 -c 1").read()
            l1 = var1.index('received')
            l1 = l1-2
            if var1[l1] == '1':
                stato1 = 'OK'
            else:
                stato1 = 'NO'	
            var2 = os.popen("ping 192.168.1.111 -c 1").read()
            l2 = var2.index('received')
            l2 = l2-2
            if var2[l2] == '1':
                stato2 = 'OK'
            else:
                stato2 = 'NO'	
            if stato1 == 'OK' or stato2 == 'OK':
                return 'OK'
            else:
                return 'NO'
        

      Anche in questo caso utilizzo il ping per verificare se uno dei due PC che di solito utilizzo risultano accesi, determinando così l’effettiva mia presenza in stanza.


    • La funzione ‘main’ controlla se tutte le condizioni sono soddisfatte:

      • def main(ora, delay):
            diff = int((max(ora) - min(ora)).total_seconds())
            if ora[1] > ora[0] and diff >= delay:
                if pingSonoff() == 'ON':
                    if ping() == 'OK':
                        print 'Accendo Sonoff'
                        powerOn()
                    else:
                        print 'Sole tramontato, ma non rilevo presenza attiva...'
                else:
                    print 'Sole tramontato, ma Sonoff non operativo...'
            else:
                print 'Ancora troppo presto...'
        

      Ovviamente nel caso in cui non sussistano le condizioni il programma prosegue con questo loop:

      • while count <24:
            print str(count)+' - Check: '+strftime("%d-%m-%Y %H:%M:%S", localtime())
            adesso = datetime.strptime(strftime("%H:%M", gmtime()), '%H:%M')
            ora = [tramonto,adesso]
            delay = clima(lat, lng)
            main(ora, delay)
            print '\n'
            count += 1
            time.sleep(750) #loop ogni 15'
        

      Il programma procede quindi per un numero massimo di 24 volte, a distanza di 15 minuti, a controllare le condizioni impostate. Facendo partire il programma alle 16:00 il numero di loop è sufficiente per coprire i possibili scenari.


    • … e nel caso accende il punto luce eccitando il relé del Sonoff:

      •  
        def powerOn(): ##attivazione Sonoff
            r = requests.get("http://sonoff/cm?cmnd=Power%20ON")
            print(r.content)
            sys.exit()
        
    • Una volta provveduto ad accendere il punto luce lo script Python ha terminato la sua funzione quindi viene terminato.

Considerazioni finali:

  • Con poca spesa e un po’ di ingegno ho centrato il mio obiettivo: avere un interruttore intelligente in grado di accendere un punto luce al verificarsi di determinate condizioni (presenza, orario e luminosità).
  • Una peculiarità del Sonoff Basic è quella di consumare veramente poco (circa 0,70-0,80W o qualcosina in più quando il relè è eccitato), inoltre è possibile ridurne ‘sensibilmente’ i consumi impostando il valore Sleep del firmware Tasmota da 50 a 200 espresso in millisecondi. Inoltre ho spento le funzionalità MQTT che di fatto non utilizzo (tramite il comando PowerRetain)..
  • Sempre via console ho disattivato l’accensione del led presente sul Sonoff (comando LedPower e LedState) che quindi ora lampeggia brevemente solo al momento in cui si connette alla rete elettrica segnalando la ricerca della connessione Wifi.
  • La presenza del bottoncino sulla parte alta della copertura di plastica del Sonoff mi consente di accendere e di spegnere manualmente il punto luce.
  • Una prossima versione del programma di controllo, a cui sto già pensando, prevede di modificare il rilevamento di presenza integrando funzionalità via bluetooth (in questo caso andrei a rilevare o meno la connessione con il mio smartphone).
  • Ho già pensato/realizzato un’integrazione con il client Telegram che è già in esecuzione sul mio Raspberry Pi così da ricevere comunicazioni sul funzionamento del Sonoff.
  • Lo script Python completo è disponibile sulla mia pagina Github insieme agli altri progetti.
  • Ho già ordinato un Sonoff Dual (quindi in grado di comandare due uscite) da collegare alla tapparella motorizzata che si abbasserà e si alzerà a seconda delle condizioni da me impostate…

[Tutorial] Come controllare lo stato di salute di un’unità SSD in Linux

Uno dei componenti che ‘lavorano’ di più nel nostro computer e che consideriamo meno è l’hard disk. Ci accorgiamo della sua esistenza magari quando finiamo lo spazio disponibile o se siamo più sfortunati quando si rompe.

Negli ultimi anni i ‘vecchi’ dischi ferromagnetici sono stati sostituiti con i più performanti dischi a stato solido (SSD), dimenticandoci di operazioni diventate obsolete come la deframmentazione dei dati.

Una tecnologia che è sempre valida e la S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) ovvero del monitoraggio dei dischi per rilevare e fornire diversi indicatori di affidabilità, nella speranza di anticipare i malfunzionamenti. Essenzialmente, i malfunzionamenti degli hard disk sono di due tipi:

  • quelli prevedibili, specialmente dovuti all’usura o all’invecchiamento, che si manifestano gradualmente.
  • quelli imprevedibili, che accadono improvvisamente e senza preavviso, come nel caso di un componente elettronico che si brucia.

Il monitoraggio può predire circa il 60% dei possibili malfunzionamenti. S.M.A.R.T. ha lo scopo di avvisare l’utente o l’amministratore di sistema che il disco rigido sta per guastarsi, in modo che questi abbia il tempo di copiare i dati su un altro dispositivo di archiviazione (fonte Wikipedia).

Esistono diversi tool software che permettono di monitorare lo stato di salute dei dischi installati nel nostro sistema. Quello che uso abitualmente sulla mio workstation Ubuntu Linux è smartctl. Continua a leggere

[Risolto] Reset router Openwrt

Il modem router è quell’accessorio informatico che negli ultimi anni ha letteralmente invaso le nostre case. Chi cerca la posizione migliore per coprire con il segnale tutto l’appartamento, chi cerca di nasconderlo in un cassetto, chi lo lascia sulla scrivania, chi lo accende alla bisogna, chi lo lascia sempre acceso (leggi:il router va lasciato acceso la notte?).

Perché accontentarsi di un firmware proprietario che non consente di capire che cosa fa effettivamente il nostro router quando oramai pure il modello scalcagnato ha un corredo hardware che consente di installarvi un vero e proprio sistema operativo come Openwrt? Oramai certe operazioni sono alla portata di quasi tutti.openwrt_logo

61uIpBXY7nL._SL1280_Il problema è che continuando a smanettare sul router c’è pure il pericolo di combinare disastri. Il consiglio è quello di lasciarsi aperte più porte possibili: ad esempio il mio TD-Link TD-W8970v1 l’ho modificato in maniera tale da rendere possibile il collegamento via seriale tramite USB.

Di queste accortezze se ne rende grazie il cielo solo in caso di problema. L’altro giorno dopo un aggiornamento fatto all’ultima trunk disponibile ho voluto sperimentare un po’ troppo con il risultato che non era più possibile accedere al router via IP né via web né via SSH.

Niente panico. Nel mio caso è bastato collegare il cavo usb al pc e stabilire un collegamento seriale con Putty al router. Una volta dentro non ho fatto nient’altro che dare i seguenti comandi, per resettare il router ai valori di default:


>root:~# mount_root
>root:~#
>root:~# firstboot
This will erase all settings and remove any installed packages. Are you sure? [N/y]
y
>root:~# reboot -s

(in verde i comandi da lanciare in console)


Ed ecco resettato il mio router, pronto per nuove stupende avventure.

VOCORE: MINI PC CON OPENWRT

VoCore Mini Linux è l’ultimo nato tra i mini PC che montano il sistema operativo del pinguino che si stanno rivelando l’ideale per coloro che hanno intenzione di realizzare progetti di robotica oppure nell’ambito dell’internet delle cose (IoT).

Istantanea_2016-04-20_10-31-56

Istantanea_2016-04-20_10-45-03VoCore Mini Linux è dotato di una CPU Ralink/Mediatek 360 MHz RT5350 MIPS accoppiata con 32MB di Ram. Il sistema operativo è lo stesso OpenWrt (Linux 3.10.44) molto conosciuto nell’ambito dei dispositivi embedded sopratutto per i router (e che da tempo spinge il mio TP-Link W8870), che oltre ad offrire flessibilità agli utenti ha il pregio di risiedere tranquillamente all’interno di una memoria da 8MB SPI Flash.

Con la vocazione di essere il device perfetto per progetti di robotica oppure piccoli sistemi automatizzati, VoCore Mini Linux è  dotato di una porta USB 2.0, di una porta Ethernet 10/100M e di un modulo WIFI Dual band 802.11n. Completano la dotazione 20 pin GPIO che consentono la connessione con hardware extra (è già disponibile un modulo webcam) e una pletora di sensori.

Istantanea_2016-04-20_10-46-19Essendo una macchina dedicata ai sistemi embedded i suoi consumi sono molto bassi, si parla di un In-out voltage range che oscilla tra i 3.3V e i 6V e i consumi energetici si assestato tra i 200-220mA.

L’intero progetto è nato con una campagna crowfunding ed è ben supportato da una community abbastanza attiva.

La versione ‘nuda’ costa $19.99, mentre quella completa del suo ‘dock’ costa $44.99 e sono acquistabili direttamente nello store di VoCore.

VIA | VoCore

[RISOLTO] Usare un cavo convertitore da USB a seriale TTL (chipset Prolific PL-2303HXA) su Windows 10 – 8.1 – 8

Vediamo come far digerire un cavo convertitore da USB a RS232 TTL (Chipset PL2303HXA) a Windows 10 (ma la magia funziona anche con Windows 8.1 e 8).

ttl

[PROBLEMA]

E’ stato frustrante accorgersi che non è così semplice utilizzare la comunicazione seriale per dialogare con il mio router momentaneamente impazzito: fortunatamente avevo nel cassetto un cavo convertitore serial USB-TTL, fortunatamente me la cavicchio con il saldatore e non ho avuto problemi a saldare i terminali ai corretti pin sulla motherboard del router, fortunatamente a Cambridge un milione di anni fa un certo Simon Tathan ha  creato quel software magico che si chiama Putty, sfortunatamente  un po’ per dispetto e un po’ perché al giorno d’oggi chi è che usa la seriale (!?!) Windows 10 non carica i driver dell’USB controller e non riconosce il cavo. C’è da rimboccarsi le maniche.

[SOLUZIONE] Continua a leggere

Quanto costa lasciare i caricatori attaccati alla presa anche quando non li usiamo?

Le persone che possiedono uno smartphone si dividono in due categorie: quelli che staccano la spina del caricabatteria quando non lo utilizzano e quelli che lo lasciano attaccato alla presa convinte che tanto non consuma niente.
In pratica ci sono i pigri che non vogliono perdere nemmeno un minuto a cercare il caricabatteria quando gli serve e quelli che sono fissati contro i dispositivi succhia-corrente lasciati in stand-by.Immagine

Un semplice esperimento ha cercato di chiarire una volta per tutte i reali consumi dei caricabatteria quando non sono collegati allo smartphone.

Immagine

Utilizzando un misuratore di consumo elettrico, di quelli che si possono acquistare per una decina di euro e una volta attaccati alla presa a muro consentono di visualizzare il consumo di corrente dei dispositivi ad esso collegato, si è testato il comportamento dei caricabatteria dei cellulari più presenti sul mercato (*).

La risposta dell’esperimento è stata che, Continua a leggere

Non accettate chiavette USB dagli sconosciuti

Dark Purple ha realizzato una chiavetta USB in grado di friggere in pochi istanti un computer: un gadget da incubo che potrebbe portare a conseguenze terribili.

main_usbkillerL’USB Killer funziona in un modo abbastanza semplice: sfrutta i 5V della porta USB per caricare un condensatore ad un voltaggio che in una versione rilasciata qualche mese fa toccava i -110V, in quella nuova arriva a -220V. Quando il condensatore è carico la tensione viene inviata sul canale “dati” della porta USB distruggendo tutto quello che trova sul suo cammino, friggendo la mainboard in 2 secondi. TV, set top box, e ogni altro apparecchio dotato di una porta USB può essere attaccato e annientato senza alcuna difesa.

Inutile ribadire la pericolosità di questa chiavetta: dagli scherzi di pessimo gusto al danneggiamento volontario di prodotti  gli obiettivi dell’USB Killer sono infiniti. Sebbene lo schema del circuito non è stato divulgato e non  è stata data la possibilità di acquistarlo, il funzionamento è talmente banale che replicarlo per i malintenzionati è molto facile. Nessuna porta USB è più sicura.

[Risolto] Configurare OpenWrt per il riavvio automatico settimanale del router

Una volta sostituito il firmware originale del proprio router con OpenWrt ci ritroveremo in mano un device molto più potente e in grado di fare molte più cose di prima.

Openwrt_logoNon dico che sia cosa alla portata di tutti (nel mio caso ho dovuto munirmi di un cavo Usb/Ttl e saldarne i contatti direttamente sulla mainboard del router), ma con un po’ di pazienza e dopo aver letto per benino le istruzioni e i consigli sul web, è cosa più che fattibile e che da un sacco di soddisfazioni. Me ne sono accorto da qualche settimana a questa parte da quando ho installato sul mio TP-Link TD-W8970v1 la distro linux OpenWrt grazie al progetto portato avanti da Ambrosa (qui il link alla sua pagina su GitHub). VI consiglio di dare un’occhiata alla lista dei router supportata da OpenWrt e decidere di conseguenza.

Per incrementare l’efficienza del sistema può essere utile prevedere un riavvio automatico del proprio router OpenWrt, magari con cadenza settimanale.

Con l’interfaccia web LuCI (a partire dalla versione 10.03.1 in avanti) la questione si risolve in maniera molto semplice.

E’ infatti sufficiente entrare nella scheda System -> Scheduled Tasks e digitare l’istruzione che verrà salvata automaticamente nel file /etc/crontabs/root dopo aver clikkato sul pulsante Submit.Immagine

Inserendo come nell’esempio qui sopra l’istruzione 0 6 * * 0 reboot il sistema si riavvierà automaticamente alle 06:00 di mattina di ogni domenica.

Di seguito la legenda per configurare l’istruzione secondo le proprie necessità:

  • la prima cifra si riferisce ai minuti (0-59). Nell’esempio 0 sta per le 00;
  • la seconda cifra si riferisce all’ora (0-23). Nell’esempio 6 sta per le 6 AM;
  • la terza cifra si riferisce al giorno del mese (1-31). Nell’esempio l’asterisco ignora questo comando;
  • la quarta cifra si riferisce al mese (1-12). Nell’esempio l’asterisco ignora questo comando;
  • la quinta cifra si riferisce al giorno della settimana (0-6), iniziando da domenica. Nell’esempio 0 sta appunto per la domenica;
  • da ultimo abbiamo il comando che il programma cron di Linux avvierà con privilegi di root. Nell’esempio reboot è il comando di riavvio del sistema.

Il router wifi va spento durante la notte?

Visto che sono molti quelli che mi chiedono se è meglio tenere spento il router wifi quando non lo si utilizza e ho pensato di scrivere questo post in maniera tale da fare chiarezza sulla questione.

wi-fi-router

Personalmente ritengo sia MEGLIO TENERE SEMPRE ACCESO IL ROUTER WIFI.

Ciò che occorre considerare è che non è tanto l’uso, ma il deterioramento dei componenti elettronici dovuto agli shock causati ad ogni accensione. La vita media dei componenti elettronici aumenta col diminuire del numero delle accensioni e quindi, lasciando gli apparecchi sempre accesi, contrariamente a quanto comunemente si è portati a pensare, essi durano più a lungo presentando un numero minore di guasti.

Qualche ulteriore considerazione: Continua a leggere

[Risolto] Cyanogenmod ROM – Recuperiamo spazio nella memoria interna

Screenshot_2014-11-22-22-05-18Il mio Samsung Galaxy S2 va sempre alla grande grazie alle ROM cucinate dalla celeberrima crew di CyanogenMod.

L’unico modo per mantenere aggiornato anche uno smartphone datato, ma che può dire ancora la sua è quella di abbandonare il firmware stock per una ROM cucinata. Mentre Samsung per questo modello è ferma da tempo ad Android 4.2 con tutti i suoi problemi di drain battery, la CyanogenMod gira con Android 4.4.4 sempre in versione ottimale grazie ai continui aggiornamenti (praticamente mensili).

Per mantenere prestazioni accettabili sono utili le solite App per la pulizia del sistema (Screenshot_2014-11-24-00-02-16ottima quella di CCleaner di Piriform per Android) e ogni tanto è bene fare un giro al file system. E proprio in una di queste escursioni mi sono accorto che proprio CyanogenMod mi rubava un sacco di spazio riservato alle copie delle ROM man mano scaricate.

Più di 1,5Gb di spazio nella memoria interna liberati semplicemente cancellando le vecchie versioni delle ROM installate che credevo venissero eliminate automaticamente dopo l’installazione.

Per coloro che utilizzano le ROM di CyanogenMod e per gli aggiornamenti si appoggiano alla sua utility per scaricare le nuove ROM, consiglio di entrare in impostazioni > info sul telefono > aggiornamento CyanogenMod e selezionare nel menù Elimina i download per liberare un sacco di spazio.

%d blogger hanno fatto clic su Mi Piace per questo: