Visualizzazione post con etichetta pubnub. Mostra tutti i post
Visualizzazione post con etichetta pubnub. Mostra tutti i post

martedì 1 settembre 2015

5V Relay controllato via Internet a basso costo






Nel mio post precedente ho fatto una panoramica su come iniziare ad usare il modulo ESP8266-01 [http://mancusoa74.blogspot.it/2015/08/test-del-modulo-wifi-esp8266.html]

In due miei vecchi post [Controllo Remoto per Caldaia - Raspberry e Client SW] e [Controllo Remoto per Caldaia - HW] descrivevo la realizzazione HW e SW per un controllo per caldaia via Internet realizzato con Raspberry Pi.
Il tutto e' installato e funzionante a casa mia con molta soddisfazione.

Ovviamente fin dal primo prototipo non ero soddisfatto di usare una risorsa preziosa e costosa come Raspberry Pi per attivare e deattivare un semplice relay.
Finalmente con il modulo ESP8266 posso rimpiazzare completamente il rasperry in questo progetto.

Per chi non lo sapesse il modulo ESP8266 include un microcontrollore e mette a disposizioni dei piedino di GPIO. Funzinalmente esattamente uguale ad Arduino.
Quindi questo modulo Wifi posso collegarlo ad Internet e con un GPIO pilotare il relay collegato alla mia caldaia esattamente come ho fatto con il raspberry pi.

I vantaggi principali sono:

  • uso di un modulo da 3 Euro rispetto al Raspebbry 30 Euro
  • minor consumo energetico (4 batteria AA)
  • minor ingombro 
  • infine cosa a me cara: uso del miglior strumento per la soluzione del problema (tutti possiamo uccidere una mosca con un bazooka ma non e' il modo migliore) 


Dal lato software come vedrete utilizzero gli stessi strumenti usati su raspberry ed in particolar modo il mio client PubNub che gia' ho usato tutto l'anno con successo. Dovro' solo apportare banali modifiche legati alle chiavi PubNub.




Sicuramente ci sono metodi ancora piu' ottimali e chi ha voglia si faccia avanti, sono sempre curioso nell'imparare cose e soluzioni nuove.

Qui sotto una breve descrizione del piccolo progettino




Relay Internet HW

BoM


I componenti sono:




  • 2x resistenze da 1K
  • 1x resistenza da 2K (io ne uso 2 da 1K in serie siccome non ho quella da 2K)


  • 4x pile AA
  • 1x porta batterie AA (riciclato da una vecchia macchinina telecomandata)

 Schema 



Come si puo' vedere lo schema e' molto molto semplice ed i componenti necessari sono pochissimi






Alimentazione

Come si deve della figura il porta batterie AA e' modificato in quanto ha tre fili di uscita. 




Il motivo principale e' che il modulo relay che ho e' a 5V e lo ESP8266 e' alimentato a ~3.3V.
Quindi in questo progettino ho bisogno di due alimentazioni 5V e 3.3V che ricavo dalle 4x batterie AA da 1m5V ciascuna.

Quindi tra il filo azzurro ed il filo nero all'estrema sinistra del porta batterie misuro con il tester circa 5V (le batterie non sono mai essattamente 1,5V)
Tra il filo azzurro e il filo nero in centro misuro circa 3V (2 batterie AA) in ogni caso abbastanza per alimentare stabilmente lo ESP8266.

Chiaramente e' piu' a scopo didattico che altro. Per impieghi piu' seri le 4x AA potrebbero scaricarsi velocemente e quindi e' necessario un circuito di alimentazione adatto. Comunque la sostanza non cambia questo circuito va alimentato a 3V e 5V.



Funzionamento

In questo post non analizzo i collegamenti tra lo ESP8266 e il modulo TTL-USB in quanto sono esattamente gli stessi del post precedente




Come si vede dallo schema (qui un dettaglio) il GPIO2 dello ESP8266 controllo il relay. Siccome il rele necessita' di un controllo a 5V e il GPIO2 e' a 3.3V ho bisogno di un piccolo transistor.

Il collettore del transistor e' collegato a +5V tramite una resistenza e' un led (il led e' opzionale).

La base del transistor e' pilotata dall'uscita GPIO2 dello ESP8266.
Come notate ho anche inserito un resistenza di pull-up (2K).Questo e' dovuto al funzionamento del fimrware dello ESP8266 [http://www.esp8266.com/viewtopic.php?f=13&t=1730] e [https://zoetrope.io/tech-blog/esp8266-bootloader-modes-and-gpio-state-startup]

L'emettitore del transistor e' collegato al piedino di controllo del modulo a relay.

Tutto molto semplice dal punto di vista del circutio. Se usassi un relay a 3V (che non ho) questa parte del circuito non sarebbe necessaria e nemmeno la doppia alimentazione, ma cosi' e' piu' divertente.



Relay Internet SW

Come spiegato nei post lagati al controllo caldaia io adotto un meccanismo non molto comune sui forum che tipicamente e' di far girare il web server su raspberry o arduino.
Lo trovo di stampo vecchio, mi obbliga ad aprire la mia rete all'esterno e a fare un port forwarding.
Ma soprattutto e' architturalmente non corretto. Immaginate se anziche' avere un modulo relay ne hai 50.000.

Comunque architettura software a parte io uso un servizio molto buono e gratuito che si chiama PubNub e quindi anche con il modulo EPS8266 voglio continuare ad usare questo servizio in modo da non dover riscrivere il mio client.

Al momento non c'e' un client PubNub per ESP8266 e quindi usiamo un altro stratagemma.
PubNub fornisce un bridge per client MQTT [http://www.pubnub.com/blog/mqtt-now-supported-by-pubnub/] che sfrutto.

In sostanza io posso avere un sensore che "parla" MQTT  (il releay Internet/EPS8266) ed un client che "parla" PubNub. Il servizio cloud PubNub fa da bridge tra questi due protocolli.

Per me questo e' fantastico in quanto c'e' una buona libreria MQTT per ESP8266 ed il mio client PubNub che usavo con Raspberry [http://mancusoa74.blogspot.it/2014/11/controllo-remoto-per-caldaia-raspberry.html] funziona anche con EPS8266 senza modifiche.


EPS8266 e Arduino IDE

Come visto nell'articolo precedente il modulo ESP8266 e caricato con un firmware che mette a disposizione un'interfaccia AT. Questo e' comodo per semplici test, ma puo' diventare tedioso per cose piu' complicate.

Quindi esistono varie possibilita' tra cui caricare firmware alternativi [https://github.com/nodemcu/nodemcu-firmware] oppure come ho fatto io programmare lo EPS8266 direttamente con l'IDE Arduino [https://github.com/esp8266/Arduino].

In questo modo programmate lo ESP8266 in maniera molto simile se non identica ad Arduino. Molte se non tutte le maggiori librerie sono disponibili.

Per esempio la libreria Wifi [https://www.arduino.cc/en/Reference/WiFi] che normalmente si usa per lo shield Wifi di Arduino e' stata portata su ESP8266 con un API identica.


Sketch


// MQTT Internet Relay
//
// Antonio "monk" Mancuso - July 2015

#include <ESP8266WiFi.h>
#include <MQTT.h>
#include <PubSubClient.h>


const char* ssid = "YOUR_SSID"; //SSID della rete wifi
const char* pass = "YOUR_WIFI_PASSWORD"; //wifi password


//inizializza la connessione al server mqtt
IPAddress mqtt_server(5,153,35,162); //mqtt.pubnub.com che e' il bridge MQTT messo a disposizione da pubnub

//client wifi
WiFiClient wclient;

//mqtt client
PubSubClient client(wclient, mqtt_server);

//funzione di callback invocata quando riceviamo un messaggio MQTT
void callback(const MQTT::Publish& pub) {
  String command = "";
  Serial.print(pub.topic());
  Serial.print(" => ");
  command = pub.payload_string();
  Serial.println(command);

  //logica triviale: se riceviamo il comando ON allora facciamo scattare il relay portando GPIO2 a stato logico HIGH
  //viceversa per il comando OFF 
  // la logica puo' essere complessa a piacere. qui e' semplificata per scopo didattico
  if (command == "ON") {
    digitalWrite(2, HIGH);
    Serial.println("button ON");
  }  else if (command == "OFF") {
    digitalWrite(2, LOW);
    Serial.println("button OFF");
  }
}

//setup del programma che gira sul ESP8266
void setup()
{
  //inizializzazione console
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();

  //definizione della callback del client mqtt
  Serial.println("set callback");
  client.set_callback(callback);

  //connessione alla rete wifi
  WiFi.begin(ssid, pass);
  Serial.println("wifi begin");


  //verifichiamo che siamo effettivamente connessi al wifi
  int retries = 0;
  while ((WiFi.status() != WL_CONNECTED) && (retries < 10)) {
    retries++;
    delay(500);
    Serial.print(".");
  }
  
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Cannot connect to WiFi network");
  }
  else {
    //ok siamo connessi al wifi e ad Internet (con questo metodo non dobbiamo aprire nessuna porta, nessun port forwarding o simili)
    Serial.println("");
    Serial.println("WiFi connected");    

    //stabilimo la connessione mqtt
    if (client.connect("PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/UNIQUE_CLIENTI_ID")) { 
      Serial.println("MQTT connect"); // a questo punto siamo connessi al server mqtt

      //facciamo il subscribe del topic(canale) che vogliamo
      client.subscribe("PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/MQTT_TOPIC"); //adesso il nostro modulo ESP8266 e' pronto per ricevere i comandi dal nostro client via Internet

      Serial.println("CHECKING MQTT CONNECTION");
      if (client.connected() == true) {
        Serial.println("MQTT connected");
      } else  {
        Serial.println("MQTT NOT connect");
      }
  } else {
      Serial.println("Error in MQTT connection");
  } 
 } 
}

void loop()
{
  //il loop e' banalissimo. il client mqtt rimane in ascolto sul canale/topic specificato
  //quando un messaggio viene ricevuto la callback registrata viene invocata
  client.loop();
}

 


Come vedete ho mantenuto lo sketch semplice appositamente per questo articolo che e' rivolto a principianti.
In un caso piu' reale si dovranno implementare nello sketch una serie di controlli di errore in caso di disconnessione dal server mqtt ed implementare la logica voluta.

Tuttavia questo esempio dimostra come sia facilissimo implementare un moderno controllo remote per relay via Internet.

L'unica nota dolente e che lo ESP8266 non e' potente abbastanza per supportare SSL quindi al momento la connessione a MQTT e' in chiaro quindi richiede qualche stratagemma addizionale per rendere la comunicazione un minimo piu' sicura.

In ogni modo mi pare che qualcuno sta provando ad implementare SSL su EPS8266. Quindi anche se queste prime versioni dei moduli non lo supportano sono fiducioso che future versioni avranno una potenza sufficiente a supportare SSL.

Test

Passiamo ora ad un semplice test.

Carichiamo lo sketch tramiter l'IDE arduino




Adesso proviamo a mandare un messagio allo EPS8266. Per comodita' uso la console di PubNub [http://www.pubnub.com/console/] che mi permette di inviare messaggi al mio ESP8266.








Imposto le chiavi di PUBLISH e SUBSCRIBE e il Canale come spiegato prima.

Poi compongo il messaggio da spedire come in figura:

{"mqtt": "ON", "channel":"PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/MQTT_TOPIC"}

Quindo quando premo il pulsante con la freccia in figura (invio) un messaggio MQTT con body ON viene inviato ad uno specifico topic (canale).
Siccome lo ESP8266 e' in ascolto (subscribe) sullo stesso topic il messagio ON viene ricevuto




siccome alla ricezione del comando ON il GPIO2 viene messo a HIGH la il transistor va in saturazione quindi il led rosso si accende ed il rerlay scatta




Allo stesso modo se inviamo il comando OFF.





il GPIO2 viene messo a LOW e quindi il transistor e' interdetto, il led si spegne ed il relay torna nella posizione originale




Come menzionato in precedenza ora ho tutti gli elementi per rimpiazzare il mio controllo remoto per caldaia basato su raspberry con un piccolo modulo ESP8266 ottenendo la stessa funzionalita' ad una frazione del costo e con un consumo energetico minore.

Ovviamente questo relay controllato via Internet puo' essere usato in mille modi diversi.

Se avete delle idee sul come usarlo e dei suggerimenti fatemi sapere. Come sempre sono aperto a nuovi spunti



domenica 30 novembre 2014

Sensore Temperatura Vano Caldaia

Nel precedente posto  http://mancusoa74.blogspot.it/2014/11/controllo-remoto-per-caldaia-progetto.html abbiamo visto come creare un controllo remoto per caldaia.

In questo articolo faccio vedere come ho aggiunto un sensore di temperatura al mio vano caldaia.

Questo mi serve siccome in inverno la temperatura puo' scendere considerevolmente e danneggiare i tubi della caldaia.
Un controllo della temperatura mi dovrebbe permettere di prevenire ogni sorta di problema.

Ho usato freeboard.io, come spiegato in quest'articolo http://mancusoa74.blogspot.it/2014/11/create-la-tua-dashboard-con-freeboard-e.html , per visualizzare la temperatura del vano caldaia





Sensore di temperatura DTH11

Siccome ho a disposizione un sensore di temperatura DHT11 lo utilizzo nel mio progettino.




Questo sensore implementa un semplice protocollo 1-wire.




Questo articolo http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html mi ha aiutato a capirne meglio il funzionamento e mi ha anche fornito la base del codice per leggere i dati dal sesore.

Io ho apportato delle modifiche al codice siccome non mi interessa il valore di temperatura.

Faccio notare che per il funzionamento di questo codice sul tuo Raspberry deve essere installata la libreria wiringPi qui disponibile http://wiringpi.com/


Cablaggio Sensore





  • filo verde -> Data
  • filo arancione -> +5V
  • filo giallo  -> GND


Come nell'articolo precedente ho cablato il sensore con l'aiuto di un piccolo mammuto, sempre per ragioni di disposizione all'interno della mia scatola a muro.





Come si nota il filo verde (Data) e l'arancione (+5V) ho inserito una resistenza da 10K ohm. Questo per stabilizzare la lettura del sensore.
Ho notato che anche senza resistenza ottengo i medesimi risultati dal sensore quindi se non l'avete potete ometterla. Se invece vedete che avete troppe letture non valide vi consiglio di aggiungerla come in figura.

Infine ho cablato il sensore al Raspebrry in questo modo:




  • filo verde -> pin 26 = GPIO7
  • filo giallo -> pin 25 = GND
  • filo arancio -> pin 4 = +5V

Infine ho rimontato il tutto nella mia scatola a muro e ho lasciato il sensore di temperatura all'esterno



Codice di lettura

Come detto in precedenza ho apportato delle semplicissime modifiche al codice di lettura della temperatura e umidita'.

 /* let's read 3 correct temperature values*/
  while(count < 3) {
      t = dht11_read_val();
      if (t != 9999) {
          temp[count] = t;
          count++;
      }
      delay(500);
  }

  /*calculate the average temperature out of the 3 reads from sensor*/
  avg = (temp[0] + temp[1] + temp[2])/3;

  printf("%.2f", avg);


La funzione  dht11_read_val legge il valore di temperatura dal sensore. Se il valore resitituito e' 9999 significa che c'e' stato un errore di lettura e non e' valido.
Ho implementato un semplicissimo ciclo che legge le temperature fintantoche' non 3 temperature non sono lette correttamente.
A questo punto calcolo la media matematica e stampo il valore.

Questo valore verra' poi utilizzato dal codice python per inviare un messaggio PubNub a freeboard.io per la visualizzazione


 
def update_fb_status_temp():
        command = "/home/pi/SMHA/DTH11/dth11_sensor"
        process = subprocess.Popen(command, stdout=subprocess.PIPE)
        temp = process.communicate()[0]
        log.info("updating Temperature: %s statuys on FB" %temp)
        pubnub.fb_update_status_temp(temp)


def fb_update_status_temp(temp):
    pubnub_mex = '{"temperature":"%s"}' %temp
    log.info("sending pubnub FB message: %s" %pubnub_mex)
    pubnub_freeboard.publish(CHANNEL_FB, json.loads(pubnub_mex))


Come sempre tutto il codice e' disponibile su gitHub

Chiunque voglia apportare delle migliorie o abbia delle idee si faccia vanti. Saro' ben lieto di incorporarle nel mio sistema di controllo remoto della caldaia

giovedì 27 novembre 2014

Create la tua Dashboard con freeboard e PubNub

ciao,
in questo post spiego brevemente come creare una semplice ma efficace dashboard basata su un paio di servizi molto interessanti:



Ci sono due concetti fondamentali:

  • DataSource: cioe' come e da dove la dashbaord riceve i dati da visualizzare
  • Widget: oggetto grafico che visualizza in modo specifico i dati provenienti dal DataSource 







Questi sono i tipi di DataSource supportati ad oggi:




Mentre i Widget supportati sono i seguenti:





E' possibile sviluppare il proprio widget in modo da visualizzare al meglio i propri dati. Questo pero' non fa parte di questo post.


Temperatura Ambienti

Vediamo adesso un esempio pratico. Immaginiamo che in ogni stanza della nostra casa abbiamo un termometro connesso che sia in grado di inviare le letture della temperatura via Internet.

In questo caso immaginiamo che il termometro invii periodicamente il valore di temperatura rilevato come messaggio PubNub su un canale dedicato (e.g. temp1, temp2, temp3)

Per emulare il nostro termometro usiamo PubNub Console. Qui impostate la vostra pub e sub key e inserite il nome del canale.





In questo modo possiamo inviare un semplice messaggio contenente la temperatura della stanza.

Adesso dobbiamo creare la nostra Dashboard:

Dopo aver effettuato il login su freeboard crea una nuova dashboard inserendo il nome.

A questo punto dobbiamo creare un DataSource che "ascolti" il nostro sensore di temperatura (PubNub console nel nostro esempio):

  • Aggiungi un DataSource di tipo PubNub
  • Name: Cucina (o quello che preferisci)
  • Subscriber Key: e' la SUB KEY di PubNub. Deve coincidere con quella inserita in PubNub Console
  • Channel: il canale su cui mettersi in ascolto per le letture di temperatura. Deve coincidere con quello inserito in PubNub Console




Adesso che abbiamo creato un DataSource valido aggiungiamo il widget in questo modo:

  • ADD PANE: un nuovo pannello vuoto viene creato
  • Fai click sull'icona +:
  • TYPE: Sparkline 
  • TITLE: Temperatura Cucina
  • VALUE: datasources["Cucina"]["temperatura"]




A questo punto un nuovo widget vuoto di tipo Sparkline viene aggiunto alla tua dashboard




Adesso non ci resta che inviare le letture di temperatura tramite PubNub Console (prova ad inviare 5 letture diverse di temperatura). In realta' queste saranno inviate dal nostro termometro intelligente in modo automatico

Ogni volta che invierete una nuova lettura di temperatura il vostro widget nella vostra dashboard si aggiornera' automaticamente.





Spero sia utile.

Altre idee su come usare freeboard? dai aspetto i vostri commenti






martedì 25 novembre 2014

Controllo Remoto per Caldaia - Raspberry e Client SW

Dopo aver visto come assemblare la parte HW/elettrica per il nostro  Controllo Remoto per Caldaia - HW in questo post descrivo come ho realizzato il software per il Raspberry

Architettura SW





Raspberry pi SW

Come avrete letto negli altri post sono un estimatore del pattern Publish-Subscribe e la rete PubNub lo implementa egregiamente.

Piu' nello specifico il Raspberry Pi si comporta da Subscriber in quanto ascolta il canale di comunicazione e attende la recezione di messaggi indirizzatti al Raspberri.

Al contrario i vari client (nel mio caso semplicissima web app per mobile e calendario di configurazione per PC) si comportano da Publisher in quanto inviato messaggi di comando indirizzati al Raspberry.

Tutti i messaggi sono protetti da encryption AES e sono veicolati su un canale SSL (PubNub fornisce tutti questi servizi). In aggiunta ho implemntato un semplice meccanismo di autorizzazione in modo da essere sicuro che soltanto i client autorizzati (i miei) possano pilotare la mia caldaia.

Per chi ricorda questo episodio di Big Bang Theory https://www.youtube.com/watch?v=BW9FbjjkKo4 alla fine della puntata dei ragazzi asiatici accendono e spengono le luci di Howard. Ecco noi cerchiamo di evitare questa cosa... :)


Vantaggi

Come e' ovvio altri tipi di arcitetture o meccanismi di comunicazione sono possibili.
Io ho scelto di usare PubNub in quanto:

  • PubNub fornisce un SDK praticamente per qualunque piattaforma esistente
  • Il software su Raspberry e' semplificato al massimo
  • Non devo far girare un webserver e quindi aprire una porta del mio firewall
  • Posso implementare semplicemente un mecchanismo di analytics/monitoring

Codice

Ho messo a disposizione di tutti su GitHub il codice che deve girare sul Raspberry.
Chiunque lo puo' scaricare e migliorare. 


Client SW

Per il lato client ho sviluppato 2 semplicissime applicazioni che girano su OpenShift (come avrete letto nei post precedenti sono un'utente di OpenShift molto soddisfatto - il datacenter e' Cisco UCS).


La prima e' una semplice applicazione web che mi permette di controllare lo stato della caldaia e di accenderla e spegnerla su mio comando.




Come potete vedere la veste grafica e' veramente poco attraente. Se qualcuno di voi ha capacita' grafiche si faccia avanti. Aiutera' certamente a migliorare questo progetto


La seconda e' un'applicazione legegrmente piu' complessa che va usata su PC e permette la programmazione settimanale della caldaia. Esattamente come il termostato a muro ma molto piu' flessibile.



Come vedete in figura io uso nella mia programmazione anche le informazioni relative alle valvole termostatiche applicate sul termosifone ma e' solo una visualizzazione grafica.
Cio' che accende e spegne la caldaia sono solo gli eventi "caldaia" rappresentati in verde nel mio esempio.

Ovviamente le due applicazioni sono utilizzabili parallelamente. Quindi se ho programmato l'accensione della caldaia ad un certo orario e per esempio rietro a casa con 2 ore di ritardo posso decidere di spegnere la caldaia manualmente tramite la prima app.


Il codice di entrambe le applicazioni (e' una sola applicazione Rails) e' disponibile qui SMHAC


Spero questo vi sia utile e spero che qualcuno contribuisca al miglioramento della veste grafica.

venerdì 25 luglio 2014

How easily implement PubSub in your application with PubNub

I have recently got interested in PubSub message exchange pattern.
PubSub is a great way to decouple sender and receiver and to scale to large mass of subscribers.
For networking guys, this is somehow similar to multicast. I send my IP multicat packet and I don't know who is receiving it.
In PubSub is the same, Sender app send a message which is not addressed directly to any specific receiver. On the other side Receiver listen to the communication channel without looking for a specific client.

Here I am showing very basic usage of a great service called pubnub.
The service has a free tier for developer and for testing purposed. Should you find this service the right one for your application then you can purchase service directly on pubnub web site.

Anyway, let's see how to publish (send) a message and how to subscribe (receive) a message using pubnub.
I am showing code sample in Ruby, but please note that pubnub provide API/SDK to an impressive number of platform/languages

First of all register to pubnub. You can register with you Google account or create a free account.

After successful registration you will access to a page similar to this one




Here you need to take note of two important information:

  • Subscribe Key: necessary if you want to subscribe to channels and receive messages
  • Publish Key: necessary to send message to a channel

Let's now see the code of a very simple sender and receiver


# sudo gem install pubnub
# pubnub_receive.rb

#!/usr/bin/ruby

require 'pubnub'


pubnub = Pubnub.new(
 :publish_key   => 'your publish key',
    :subscribe_key => 'your subscribekey',
    :error_callback   => lambda { |msg| puts "Error connecting to PubNub: #{msg.inspect}" },
    :connect_callback => lambda { |msg| puts "Connected to PUBNUB: #{msg.inspect}" }
 )

message_cb = lambda { |msg|
 time = Time.now
 puts "-------Received Message-------"
 puts "Channel:: #{msg.channel}"
 puts "Message:: #{msg.message}"
 puts "Message received at #{time}"
 puts "------------------------------"
}

pubnub.subscribe(
    :channel  => 'mancusoa74demo',
    :callback => message_cb
 ) 

while(1) do
 puts "."
  sleep(5)
end

Pubnub.new creates a new pubnub object and connects us to the PubNub service.
You need to specify your publish and subscribe key otherwise you will not be able to send or receive messages.

Now that we have a valid pubnub object, we can subscribe to a channel.
This is done by calling the subscribe method on pubnub object.
We need to pass (at minimum) a channel name. Here I am also specifying a callback which is executed every time we receive a message from the channel.

In the call back I simply print out the channel name, the received message and the time on which the message has been received.

As we want to listen to the channel forever I have add a simple forever loop. This is obviously not appropriate for a real implementation, but you certainly get the point of this simple example.

That's it: this is all what you need to receive message from anywhere in the world, from any device on any platform. Beauty of PubSub pattern :)


# pubnub_send.rb

#!/usr/bin/ruby

require 'pubnub'
 
pubnub = Pubnub.new(
 :publish_key   => 'your publish key',
    :subscribe_key => 'your subscribekey',
    :error_callback   => lambda { |msg| puts "Error connecting to PubNub: #{msg.inspect}" },
    :connect_callback => lambda { |msg| puts "Connected to PUBNUB: #{msg.inspect}" }
 )

pubnub.publish(
 :channel  => 'mancusoa74demo',
    :message => !ARGV[0].nil?? Time.now.to_s + " ## " + ARGV[0] : "empty message",
 ) { |data| puts "Messaage status is #{data.response_message}" }


 sleep(1)


Similarly to sender, also to receive we need to connect to PubNub network and instantiate a Pubnub object.
Unlike the receiver, to send it is not needed to subscribe to a channel.

So in order to publish/send a message we call the publish method on the pubnub object.
You need to pass the channel name and the message you want to send.

Bam!!! as simple as that. You have now sent a message to all your subscribers around the world on different devices and platform. Again beauty of PubSub pattern :)

This model/service can be used for a tons of different purposes. Example: connect with your mobile subscribers, implement a scalable chat/messaging system, implement a scalable logging system, implement a scalable analytics system, ...

In conclusion I hope it is clear from this post that communicate with your subscribers is very simple and PubNub is offering the infrastructure to support your needs.

If you have ideas or experience how to use it in your domain let me know. I am always interested to discover new things.

Cheers

Note: In this post I discuss about pubnub service. I would like to make it very clear that I have absolutely  NO affiliation with pubsub. This is just the description of my finding while looking for cool technologies out there.