REPLACING THE ITEAD SONOFF FIRMWARE

Pubblicato il Lascia un commentoPubblicato in Senza categoria

Replacing the ITEAD Sonoff firmware

 

sonoff_wifi_wireless_smart_switch_4__1

There are two versions, one with and one without RF, I went for the one without, because I will only be using it over WiFi.

Why the Sonoff?

The Sonoff isn’t the first of its kind on the market, so why this, and not one of the other?

The choice of this all comes down to how much control you want to have over your items, and how much you want others to just take care of it for you. As default the Sonoff comes pre-loaded with firmware, and can be controlled from a smartphone from the app for it. This is pretty much the same deal with other devices on the market, but with the Sonoff you are able to take it a step further.

Inside the Sonoff, there is an ESP8266 hidden, and this takes care of everything, and any one spending just a few minutes on this blog, have most likely found this IC mentioned at least once already. Not only does it have a chip easy to program, ITEAD was also nice enough to break the pins out, needed for flashing it. And this is exactly what I am about to do!

Lets flash!

Before ordering the Sonoff, I had been doing a bit of reading on how to flash it, and found it very confusing, but I ordered it, and hoped it would all make sense when I could actually look at it, sadly, it was just as confusing after getting it. So instead I closed all the pages, and decided to give it a shot myself, and it turned out to be simpler than I thought.

2016-05-22 14.13.54

 

schematics-copy

 

 

Before doing anything, disconnect the Sonoff from mains.

First thing you need to do, is to solder a header to the 1×5 row of holes.

These go to the TX and RX pins on the ESP8266, and are also used to provide 3v3 and GND to run the circuit.

Then it should look something like on the picture above.

The connection closest to the button at the top, is 3v3, underneth TX, then RX and last GND. The last connection is not one we are going to use for this.

To attach the programmer, first make sure it is set to 3V3, then connect it as following:

Programmer Sonoff (counting from top to bottom)
3V3 1
TX 2 (RX)
RX 3 (TX)
GND 4
5

Then hold the button down on the Sonoff, and attach the programmer to your computer. Holding the button down while applying power to the ESP8266 will bring it into flash mode, which will allow you to put new firmware onto it.

My choice was to put NodeMCU onto it, which went without a hitch.

Pin functions

After having put another firmware onto the ESP8266, we would probably want to be able to control the relay again, and for that we need the pin number.

Function GPIO NodeMCU
Button 0 3
Relay 12 6
Green LED 13 7
Spare (pin 5) 14 5

The LED on the board is actually a red/green bi-color led, but the red side is only connected to the RF module, which in my version isn’t mounted.

My code

After putting NodeMCU on mine, I modified some of my old code to match the pins on the Sonoff. This code will make it connect to a MQTT borker, turn the relay on and off, flash the led on activity, and allow the button on the Sonoff to act as a toggle switch for the relay too.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
-- Timers
-- 0 = WiFi status + mqtt connect
-- 1 = MQTT offline
-- 2 = Free
-- 3 = Free
-- 4 = Free
-- 5 = MQTT activity
-- 6 = Button debounce
mqttBroker = "192.168.1.247"
mqttUser = "none"
mqttPass = "none"
deviceID="bugzapper"
roomID="1"
wifi.setmode(wifi.STATION)
wifi.sta.config ("SSID", "PASSKEY")
-- Pin which the relay is connected to
relayPin = 6
gpio.mode(relayPin, gpio.OUTPUT)
gpio.write(relayPin, gpio.LOW)
-- Connected to switch with internal pullup enabled
buttonPin = 3
buttonDebounce = 250
gpio.mode(buttonPin, gpio.INPUT, gpio.PULLUP)
-- MQTT led
mqttLed=7
gpio.mode(mqttLed, gpio.OUTPUT)
gpio.write(mqttLed, gpio.HIGH)
-- Make a short flash with the led on MQTT activity
function mqttAct()
    if (gpio.read(mqttLed) == 1) then gpio.write(mqttLed, gpio.HIGH) end
    gpio.write(mqttLed, gpio.LOW)
    tmr.alarm(5, 50, 0, function() gpio.write(mqttLed, gpio.HIGH) end)
end
m = mqtt.Client("Sonoff-" .. deviceID, 180, mqttUser, mqttPass)
m:lwt("/lwt", "Sonoff " .. deviceID, 0, 0)
m:on("offline", function(con)
    ip = wifi.sta.getip()
    print ("MQTT reconnecting to " .. mqttBroker .. " from " .. ip)
    tmr.alarm(1, 10000, 0, function()
        node.restart();
    end)
end)
-- Pin to toggle the status
buttondebounced = 0
gpio.trig(buttonPin, "down",function (level)
    if (buttondebounced == 0) then
        buttondebounced = 1
        tmr.alarm(6, buttonDebounce, 0, function() buttondebounced = 0; end)
     
        --Change the state
        if (gpio.read(relayPin) == 1) then
            gpio.write(relayPin, gpio.LOW)
            print("Was on, turning off")
        else
            gpio.write(relayPin, gpio.HIGH)
            print("Was off, turning on")
        end
        
        mqttAct()
        mqtt_update()
    end
end)
-- Update status to MQTT
function mqtt_update()
    if (gpio.read(relayPin) == 0) then
        m:publish("/home/".. roomID .."/" .. deviceID .. "/state","OFF",0,0)
    else
        m:publish("/home/".. roomID .."/" .. deviceID .. "/state","ON",0,0)
    end
end
 
-- On publish message receive event
m:on("message", function(conn, topic, data)
    mqttAct()
    print("Recieved:" .. topic .. ":" .. data)
        if (data=="ON") then
        print("Enabling Output")
        gpio.write(relayPin, gpio.HIGH)
    elseif (data=="OFF") then
        print("Disabling Output")
        gpio.write(relayPin, gpio.LOW)
    else
        print("Invalid command (" .. data .. ")")
    end
    mqtt_update()
end)
-- Subscribe to MQTT
function mqtt_sub()
    mqttAct()
    m:subscribe("/home/".. roomID .."/" .. deviceID,0, function(conn)
        print("MQTT subscribed to /home/".. roomID .."/" .. deviceID)
    end)
end
tmr.alarm(0, 1000, 1, function()
    if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then 
        tmr.stop(0)
        m:connect(mqttBroker, 1883, 0, function(conn)
            gpio.write(mqttLed, gpio.HIGH)
            print("MQTT connected to:" .. mqttBroker)
            mqtt_sub() -- run the subscription function
        end)
    end
 end)

Installare OpenHab 2 su RaspberryPi 3 con openHABianPi

Pubblicato il Lascia un commentoPubblicato in Senza categoria

In questo articolo vedremo come installare in pochi semplici passaggi OpenHab 2 su RaspberryPi2oppure RaspberryPi 3.
In rete, è possibile scaricare l’immagine openHABianPi.  openHABian è un’ immagine basata sul sistema operativo linux Debian e incorpora OpenHab 2 preinstallato.

Funzionalità incorporate nell’immagine openHABianPi

Oltre ad incorporare l’ultima versione di OpenHab2, nell’immagine openHABian troviamo preinstallato:

  • OpenJDK Java8
  • Un tool di aggiornamento chiamato openHABian Configuration Tool
  • Diversi pacchetti come ad esempio vim, htop, nano.
  • Un tool per analizzare i log (chiamato openHAB Log Viewer)
  • Samba per condividere file e cartelle con Windows
  • Mosquitto, per collegare alcuni dispositivi che usano questo protocollo per comunicare il proprio stato o azione.

Mosquitto infatti, gestisce il protocollo di comunicazione MQTT, usato per esempio dallo script CiaobitHome per comunicare bidirezionalmente con OpenHab2 i cambiamenti di temperatura, umidità, luminosità, presenza, ecc..

Scaricare e installare openHABianPi su Raspberry Pi3

L’installazione è semplicissima, per prima cosa va scaricata l’ultima immagine disponibile seguendo questo link di GitHub:

https://github.com/openhab/openhabian/releases

1) Scrolliamo la pagina fino ad arrivare alla sezione Downloads dove troviamo diverse immagini scaricabili con estensione .xz. Va scelta quella per il RaspBerryPi3 come in figura.

Installare OpenHabian Openhab su RaspberryPi3 ciaobit.com

2) Una volta scaricato il file in formato .xz, che è un formato compresso, deve essere scompattato in una cartella, ad esempio c:\immagine\

NOTA: Per scompattare un archivio con estensione xz è possibile usare programmi come WinRar, WinZip PeaZip 7-Zip

3) Otterremo quindi un file tipo: openhabianpi-raspbian-201706161358-git7ff273e-crc00389b9f.img

4) Per caricare l’immagine nella schedina MicroSD, abbiamo bisogno di scaricare ed installare un tool chiamato Win32 Disk Imager, scaricabile gratuitamente. Avviamo quindi Win32 Disk Imager e inseriamo la MicroSD nel pc.
Verifichiamo bene quale sia la lettera dell’unità che Windows associa alla MicroSD. Avviando la scrittura, ogni dato all’interno della schedina verrà cancellato!

Dal programma WIn32 Disk Imager, selezioniamo l’immagine, selezioniamo la lettera dell’unità che vogliamo scrivere (La MicroSD!) e avviamo la scrittura cliccando sul bottone “Scrivi”.

Scrivere immagine OpenHabian RaspBerryPi3 Ciaobit.com

5) Terminata l’operazione di scrittura, scolleghiamo la schedina MicroSD dal computer per inserirla nel RaspBerryPi3

6) Colleghiamo al RaspBerryPi3 anche il cavo di rete, una tastiera e un monitor, cosi una volta acceso, potremo seguire lo scaricamento e l”installazione dei pacchetti aggiornati.

7) Alimentiamo il RaspBerryPi3 e seguiamo la procedura d’installazione che durerà tra i 15 e 45 minuti.

installazione openhabianpi RaspBerryPi3 ciaobit.com

Al termine dell’installazione vedremo una schermata che suggerisce l’inserimento delle credenziali d’accesso a OpenHABianPi

installazione openhabianpi login RaspBerryPi3 ciaobit.com

Le credenziali di default sono:

USERNAME: openhabian
PASSWORD: openhabian

Una volta entrati si vedrà una schermata con diverse info di riepilogo, come ad esempio l’ip della board.

installazione openhabianpi avviato RaspBerryPi3 ciaobit.com

Consiglio vivamente di cambiare subito la password per questo utente, specialmente se intendiamo rendere accessibile il nostro RaspBerry dall’esterno della rete domestica. Per quanto riguarda invece l’ip, sarebbe meglio impostarlo statico a livello di modem (o dove risiede l’eventuale server DHCP), questo perchè così facendo è possibile aprire le porte verso la rete esterna e quindi accedere ad OpenHab da remoto.

8) ora è possibile accedere all’interfaccia web di OpenHab attraverso l’indirizzo locale http://openhabianpi:8080 oppure più genericamente via ip.

Rete TOR

Pubblicato il Lascia un commentoPubblicato in Senza categoria

Le cronache di tutti i giorni ci hanno abituato a pensare che tutte le operazioni effettuate dagli utenti di Internet possano essere facilmente ricostruite, dal momento che tali azioni attraversano soggetti e oggetti che, a vario titolo, tengono traccia di alcune informazioni scambiate. Ad esempio, i fornitori di connettività internet devono di norma conservare i log degli accessi, mentre i gestori di siti e server Web mantengono dettagliate profilazioni su tutti gli utenti, rendendoli più o meno consapevoli della cosa. Analogo discorso vale anche per tutti i nodi attraversati e quindi coinvolti nel flusso di comunicazione, che tracciano le connessioni e sono in grado di ricostruirne il percorso.

Esiste però un lato oscuro della Rete, il Deep Web, nel quale si utilizza un meccanismo di comunicazione in grado di proteggere l’anonimato degli utenti, nascondendoli dalla possibilità di analisi del traffico.

Principi di funzionamento della rete TOR

Una delle reti più note in questo contesto è TOR, acronimo di The Onion Router, che garantisce l’anonimato grazie all’impiego di server particolari, i cosiddetti Onion Router. In questo speciale netwok, il traffico dati non attraversa più la rete in modo tradizionale, viaggiando tra i client e server, ma viene veicolata mediante un complesso e crittografato circuito virtuale instaurato tra una moltitudine di Onion Router.

Un Onion Router non è altro che un nodo della rete TOR e, solitamente, è reso disponibile da un volontario appartenente alla rete che dona parte della sua banda disponibile alla causa.

Il protocollo di comunicazione all’interno della rete TOR è stato sviluppato per garantire la segretezza della comunicazione, l’integrità dei dati, il controllo della congestione e una serie di politiche di uscita controllate.

Il segreto sta nella distribuzione della richiesta di comunicazione dell’utente, generata in modo che nessuno possa mettere in relazione l’utente stesso con la destinazione richiesta. I pacchetti che contengono la comunicazione vengono infatti distribuiti su un percorso casuale e dinamico, difficilmente predicibile, attraverso router che cancellano ogni traccia della comunicazione e che comunque ignorano la sorgente e la destinazione finale. Ogni router coinvolto instaura inoltre un canale sicuro di comunicazione con il router successivo, mediante lo scambio di specifiche coppie chiavi crittografiche, rendendo più complesso ogni attacco di tipo man-in-the-middle.

Risulta evidente che i punti di maggiore criticità nell’ambito della comunicazione risultano quelli di ingresso e di uscita dalla rete. Per questa ragione solo nodi TOR fidati possono realizzare questo compito e vengono chiamati rispettivamente Guard Node (nodo di guardia) ed Exit Node (nodo di uscita).

Esistono poi altri nodi TOR fidati che detengono un altro compito molto importante, ovvero quello di funzionare come Directory Server. Questi server HTTP detengono le liste dei router e informazioni sullo stato della rete, fornendoli ai client TOR che le richiedono.

Esempio di un flusso di informazioni

Ipotizziamo quindi un possibile flusso di informazioni tra un client TOR e un destinatario e vediamo come questo si realizza mediante una rete TOR. In primo luogo il client contatta un Directory Server per aggiornare la lista dei router e determinare informazioni utili sullo stato della rete. In base a questo, viene individuato un percorso di rete e si instaura una comunicazione sicura con il Guard Node. La comunicazione è crittografata con una apposita chiave di sessione, che viene frequentemente sostituita per ridurre la possibilità di attacco. Il Guard Node, in base alle informazioni contenute nel pacchetto, veicola quindi il messaggio al nodo intermediario su un canale sicuro. In questo momento il pacchetto ha già perso tutte le informazioni che riguardano il nodo sorgente, che pertanto in ogni caso non potrebbero più essere note ad un eventuale attaccante. Il nodo intermediario legge la sua porzione di messaggio e veicola il rimanente all’Exit Node. L’Exit Node a questo punto comunica con il nodo destinatario esterno alla rete e successivamente restituisce l’informazione al nodo sorgente con un meccanismo analogo al flusso di andata. La comunicazione tra Exit Node e destinazione può o meno essere crittografata in funzione del servizio richiesto (ad esempio HTTP o HTTPS).

Dal punto di vista tecnico la comunicazione è basata su protocollo TCP, su cui l’Onion Routing si sovrappone, mentre la crittografia della rete TOR è realizzata tramite TLS.

Il meccanismo che realizza la crittografia nella comunicazione deriva dal principio di digital mixes, inventato da David Chaum negli anni 80, che consente ad un interlocutore di inviare un messaggio segreto ad un destinatario passando attraverso un terzo nodo, senza che quest’ultimo possa leggerlo in alcun modo. Riproponendo l’esempio tradizionale di Alice, che intende inviare un messaggio riservato a Bob attraversando nodi intermedi, si evidenzia come Alice debba cifrare il messaggio più volte utilizzando (in ordine di vicinanza al destinatario) le chiavi private dei nodi intermedi. In questo modo nessuno dei nodi intermedi potrà conoscere il contenuto interno del messaggio, né il destinatario finale (a meno dell’ultimo).

Figura 1. Digital Mixing (click per ingrandire)

Digital Mixing

Questo meccanismo è anche all’origine del simbolo della rete TOR, ovvero una cipolla, pensato proprio per rappresentare la sua caratteristica di crittografia a strati.

TOR_slides