Renesas GR-Peach integrated with dweet.io

Dependencies:   EthernetInterfaceprivate HTTPClient PubNub mbed-rtos mbed picojson spxml

Files at this revision

API Documentation at this revision

Comitter:
nikhilchaturtvedi
Date:
Fri Oct 23 20:18:55 2015 +0000
Commit message:
Renesas GR-Peach dweet test

Changed in this revision

EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
HTTPClient.lib Show annotated file Show diff for this revision Revisions of this file
PubNub.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
picojson.lib Show annotated file Show diff for this revision Revisions of this file
spxml.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/nikhilchaturtvedi/code/EthernetInterfaceprivate/#8abeba0c20c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HTTPClient.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/donatien/code/HTTPClient/#277279a1891e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PubNub.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/PubNub/code/PubNub/#c9f79982b5ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,218 @@
+#include "HTTPClient.h"
+#include "picojson.h"
+#include "spdomparser.hpp"
+#include "spxmlnode.hpp"
+#include "spxmlhandle.hpp"
+#include "PubNub.h"
+#include "mbed.h"
+#include "EthernetInterface.h"
+
+/*****Function defs*****/
+void read_temp();
+char* get_time();
+void get_weather();
+void parseWeather(SP_XmlElementNode *node);
+void read_and_execute_message(PubNub &pn, const char *jsonmsg);
+void publish_to_pubnub(PubNub &pn);
+int pubnub_main();
+/***********************/
+
+/********Change these values accordingly********/
+const char* ip_address = "143.103.6.188"; //change to your ip address
+const char* subnet     = "255.255.255.0"; 
+const char* gateway    = "143.103.6.254"; //change this
+/***********************************************/
+
+/*********Keys for PubNub************/
+const char pubkey[] = "pub-c-0fee6373-fae0-4aa9-9fe9-b9b48605a82f"; //fill from the pubnub application
+const char subkey[] = "sub-c-62761692-404d-11e5-976c-02ee2ddab7fe"; //fill from the pubnub application
+const char channel[] = "peach-channel"; //name given to your channel
+/************************************/
+
+Serial pc_console(USBTX, USBRX);
+EthernetInterface ethernet;
+
+/*Temp sensor ; for this example, used a MAX31723 sensor interfaced through SPI*/
+SPI temp_sensor(P4_6, P4_7, P4_4);
+DigitalOut chip_select(P4_5);
+
+PubNub pubnub(pubkey, subkey);
+
+
+int main()
+{
+    pc_console.baud(115200); //set the serial com baud rate
+
+    ethernet.init(ip_address, subnet, gateway);
+    pc_console.printf("Init eth\n");
+
+    ethernet.connect();
+    pc_console.printf("Connected eth\n");
+    
+    pubnub_main(); //start the PubNub main loop
+
+}
+
+/*Publish a message to PubNub*/
+void publish_to_pubnub(PubNub &pubnub)
+{
+    char message[128];
+    PubNubRes ret = pubnub.publish(channel, message);
+    if (ret != PNR_OK) {}
+
+}
+
+/*Read message from PubNub and perform an operation*/
+void read_and_execute_message(PubNub &pubnub, const char *message)
+{
+    picojson::value msg;
+    std::string err = picojson::parse(msg, message, message + strlen(message));
+    if (!err.empty()) {
+        return;
+    }
+
+    /*Use this message to read temp sensor value and send it to PubNub*/
+    if (msg.get("send_temperature").get<bool>()) 
+    {
+        publish_to_pubnub(pubnub);
+    }
+    /*Use this message to read the weather from openweather service and send the values to dweet.io
+     The message sent from PubNub console is { "weather": "get" }*/
+    if(msg.get("weather").is<std::string>())
+    {
+        get_weather();
+    }
+}
+
+/*The main PubNub loop function*/
+int pubnub_main()
+{
+
+    publish_to_pubnub(pubnub);
+    pc_console.printf("publish done\n");
+
+    while (1) 
+    {
+
+        pc_console.printf("Subscribing\n");
+
+        char *reply = NULL;
+        PubNubRes result = pubnub.subscribe(channel, &reply);
+        if (result != PNR_OK) {
+
+            pc_console.printf("Error %d \n", result);
+            wait(1.0);
+            continue; //try again
+        }
+
+        if (reply) 
+        {
+            read_and_execute_message(pubnub, reply);
+        }
+
+        wait(2); // just to avoid unnecessary busy loops
+    }
+}
+
+void get_weather()
+{
+    HTTPClient weather_client;
+    char weather_message[128] = "";
+    char weather_response[812];
+    picojson::value msg;
+    
+    sprintf(weather_message,"http://api.openweathermap.org/data/2.5/weather?q=%s,%s&mode=xml", "London", "uk");
+    pc_console.printf("URL %s\n", weather_message);
+    HTTPResult result;
+    
+    result = weather_client.get(weather_message, weather_response, sizeof(weather_response));
+    
+    pc_console.printf("Resp %s %d\n", weather_response, strlen(weather_response));
+   
+    if(!result)
+    {
+        pc_console.printf("Weather response %s \n", weather_response);
+    }
+    else
+    {
+        pc_console.printf("Error code %d - %d - %s \n", result, weather_client.getHTTPResponseCode(), weather_response);
+    }
+    
+    /*Parse the XML from openweather service
+    * Parsing is done here just for simplicity's sake*/
+    SP_XmlDomParser parser;
+    parser.append(weather_response, strlen(weather_response));
+    
+    SP_XmlHandle rootHandle(parser.getDocument()->getRootElement());
+    
+    SP_XmlElementNode *city_child = rootHandle.getChild("city").toElement();
+    SP_XmlElementNode *city_coord_child = rootHandle.getChild("city").getChild("coord").toElement();
+    
+    SP_XmlElementNode *temperature_child;
+    
+    temperature_child = rootHandle.getChild("temperature").toElement();    
+    pc_console.printf("Child %s\n", temperature_child->getAttrValue("value"));
+    pc_console.printf("Temp unit %d\n", temperature_child->getAttrValue("unit"));
+    
+    SP_XmlElementNode *humidity_child = rootHandle.getChild("humidity").toElement();
+    
+    SP_XmlElementNode *wind_child = rootHandle.getChild("wind").getChild("speed").toElement();
+    pc_console.printf("Wind speed %s\n", wind_child->getAttrValue("value"));
+    pc_console.printf("Wind name %s\n", wind_child->getAttrValue("name"));
+    
+    SP_XmlElementNode *wind_direction_child = rootHandle.getChild("wind").getChild("direction").toElement();
+    pc_console.printf("Wind direction %s\n", wind_direction_child->getAttrValue("name"));
+    
+    SP_XmlElementNode *sky_child = rootHandle.getChild("weather").toElement();
+    pc_console.printf("Weather type %s\n", sky_child->getAttrValue("value"));
+    
+    char dweet_resp[512];
+    char message_to_dweet[128] = "";
+    char thing_name[] = "Peach"; //name of the "thing" on dweet; change this for your own "thing name"
+    
+    /*Uploading only the city name, temperature and its unit; can upload many more parsed values in the same format as below
+    Also, time stamp for the update can be posted by using the get_time() function*/
+    sprintf(message_to_dweet,"http://dweet.io/dweet/for/%s?City=%s&Temperature=%s&TempUnit=%s", 
+            thing_name, city_child->getAttrValue("name"),
+            temperature_child->getAttrValue("value"), 
+            temperature_child->getAttrValue("unit"));
+    
+    pc_console.printf("Sending to dweet %s\n",message_to_dweet);
+    HTTPClient http;
+    int response = http.get(message_to_dweet, dweet_resp, sizeof(dweet_resp));
+
+    if(!response) 
+    {
+        pc_console.printf("Response from dweet %s \n", dweet_resp);
+    } else 
+    {
+        pc_console.printf("Error %d - HTTP response code = %d\n", response, http.getHTTPResponseCode());
+    }
+    
+    wait(2);
+}
+
+/*Simple helper function for getting a child node*/
+char* get_child_value(SP_XmlElementNode *node, char *value)
+{
+    return (char*)node->getAttrValue(value);
+}
+
+
+/*Get the time for having a timestamp for dweet.io updates*/
+char* get_time()
+{
+    time_t seconds = time(NULL);
+    pc_console.printf("Seconds %d", seconds);
+    pc_console.printf("Time %s"  ,ctime(&seconds));
+    
+    char time_buf[32];
+    strftime(time_buf, sizeof(time_buf), "%I %M %p \n", localtime(&seconds));
+    pc_console.printf("Formatted time %s \n", time_buf);
+    
+    return ctime(&seconds);
+}
+
+/*Unimplemented temp sensor read function; use it for your own sensor device*/
+void read_temp()
+{}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#5aed8bae1001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/34e6b704fe68
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/picojson.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mimil/code/picojson/#2bb500b021e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spxml.lib	Fri Oct 23 20:18:55 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/hlipka/code/spxml/#3fa97f2c0505