Simple IoT boardと電力計測モジュールINA226PRCを使ったサンプルプログラムです。計測したデータをIFTTTのMakerチャネルに送っています。 サンプリングは0.1秒刻みで、10秒間(100回計測)したら電圧、電流、電力それぞれについて平均、最大値、最小値を計算してIFTTTに送る仕様になっています。

Dependencies:   INA226PRC SimpleIoTBoardLib mbed

Committer:
leibun
Date:
Wed Dec 09 16:02:42 2015 +0000
Revision:
0:0b921803a9ba
first commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leibun 0:0b921803a9ba 1 /* mbed Microcontroller Library
leibun 0:0b921803a9ba 2 * Copyright (c) 2006-2013 ARM Limited
leibun 0:0b921803a9ba 3 *
leibun 0:0b921803a9ba 4 * Licensed under the Apache License, Version 2.0 (the "License");
leibun 0:0b921803a9ba 5 * you may not use this file except in compliance with the License.
leibun 0:0b921803a9ba 6 * You may obtain a copy of the License at
leibun 0:0b921803a9ba 7 *
leibun 0:0b921803a9ba 8 * http://www.apache.org/licenses/LICENSE-2.0
leibun 0:0b921803a9ba 9 *
leibun 0:0b921803a9ba 10 * Unless required by applicable law or agreed to in writing, software
leibun 0:0b921803a9ba 11 * distributed under the License is distributed on an "AS IS" BASIS,
leibun 0:0b921803a9ba 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
leibun 0:0b921803a9ba 13 * See the License for the specific language governing permissions and
leibun 0:0b921803a9ba 14 * limitations under the License.
leibun 0:0b921803a9ba 15 */
leibun 0:0b921803a9ba 16
leibun 0:0b921803a9ba 17 #include "mbed.h"
leibun 0:0b921803a9ba 18 #include "ifttt.h"
leibun 0:0b921803a9ba 19 //#include <string>
leibun 0:0b921803a9ba 20 #include "SoftSerialSendOnry.h"
leibun 0:0b921803a9ba 21
leibun 0:0b921803a9ba 22 extern SoftSerialSendOnry pc;
leibun 0:0b921803a9ba 23
leibun 0:0b921803a9ba 24 #if 1
leibun 0:0b921803a9ba 25 #define DBG(x, ...) pc.printf("[IFTTT : DBG]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
leibun 0:0b921803a9ba 26 #define WARN(x, ...) pc.printf("[IFTTT : WARN]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
leibun 0:0b921803a9ba 27 #define ERR(x, ...) pc.printf("[IFTTT : ERR]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
leibun 0:0b921803a9ba 28 #else
leibun 0:0b921803a9ba 29 #define DBG(x, ...) //wait_us(10);
leibun 0:0b921803a9ba 30 #define WARN(x, ...) //wait_us(10);
leibun 0:0b921803a9ba 31 #define ERR(x, ...)
leibun 0:0b921803a9ba 32 #endif
leibun 0:0b921803a9ba 33
leibun 0:0b921803a9ba 34 #if 0
leibun 0:0b921803a9ba 35 #define INFO(x, ...) pc.printf("[IFTTT : INFO]"x" \r\n",##__VA_ARGS__);
leibun 0:0b921803a9ba 36 #else
leibun 0:0b921803a9ba 37 #define INFO(x, ...)
leibun 0:0b921803a9ba 38 #endif
leibun 0:0b921803a9ba 39
leibun 0:0b921803a9ba 40 //
leibun 0:0b921803a9ba 41 // Initialize object with Event, Key, and valid socket.
leibun 0:0b921803a9ba 42 // TODO: accept hostname parameter / implement DNS lookup
leibun 0:0b921803a9ba 43 //
leibun 0:0b921803a9ba 44 IFTTT::IFTTT(const char * event, const char * key, TCPSocketConnection * s)
leibun 0:0b921803a9ba 45 {
leibun 0:0b921803a9ba 46 // Error Check
leibun 0:0b921803a9ba 47 if(sizeof(event) > IFTTT_MAX_SIZE_EVENTNAME) {
leibun 0:0b921803a9ba 48 ERR("Given event > IFTTT_MAX_SIZE_EVENTNAME, increase the max event string size in ifttt.h");
leibun 0:0b921803a9ba 49 }
leibun 0:0b921803a9ba 50 if(sizeof(key) > IFTTT_MAX_SIZE_SECRETKEY) {
leibun 0:0b921803a9ba 51 ERR("Given key > IFTTT_MAX_SIZE_SECRETKEY, increase the max secret key string size in ifttt.h");
leibun 0:0b921803a9ba 52 }
leibun 0:0b921803a9ba 53 // Copy event name and secret key into object instance
leibun 0:0b921803a9ba 54 strcpy(this->eventName,event);
leibun 0:0b921803a9ba 55 strcpy(this->secretKey,key);
leibun 0:0b921803a9ba 56
leibun 0:0b921803a9ba 57 // Set up Socket
leibun 0:0b921803a9ba 58 if(NULL == s) {
leibun 0:0b921803a9ba 59 WARN("Given Socket Pointer is NULL, will try opening a socket.");
leibun 0:0b921803a9ba 60 }
leibun 0:0b921803a9ba 61 this->socket = s;
leibun 0:0b921803a9ba 62
leibun 0:0b921803a9ba 63 // Set up Host / Port
leibun 0:0b921803a9ba 64 this->port = IFTTT_PORT;
leibun 0:0b921803a9ba 65 this->host = IFTTT_IP;
leibun 0:0b921803a9ba 66
leibun 0:0b921803a9ba 67 // Initialize ingredient values to empty strings.
leibun 0:0b921803a9ba 68 v1 = "";
leibun 0:0b921803a9ba 69 v2 = "";
leibun 0:0b921803a9ba 70 v3 = "";
leibun 0:0b921803a9ba 71 }
leibun 0:0b921803a9ba 72
leibun 0:0b921803a9ba 73 //
leibun 0:0b921803a9ba 74 // Add ingredients to be sent.
leibun 0:0b921803a9ba 75 //
leibun 0:0b921803a9ba 76 bool
leibun 0:0b921803a9ba 77 IFTTT::addIngredients( char * value1, char * value2, char * value3)
leibun 0:0b921803a9ba 78 {
leibun 0:0b921803a9ba 79 // update internal pointers. If variable not given then pass an empty string
leibun 0:0b921803a9ba 80 v1 = (NULL == value1)?"":value1;
leibun 0:0b921803a9ba 81 v2 = (NULL == value2)?"":value2;
leibun 0:0b921803a9ba 82 v3 = (NULL == value3)?"":value3;
leibun 0:0b921803a9ba 83 return true;
leibun 0:0b921803a9ba 84 }
leibun 0:0b921803a9ba 85
leibun 0:0b921803a9ba 86 //
leibun 0:0b921803a9ba 87 // This function sends data to maker.ifttt.org via GET query commands
leibun 0:0b921803a9ba 88 // return true on sucess, false on fail
leibun 0:0b921803a9ba 89 //
leibun 0:0b921803a9ba 90 bool IFTTT::get()
leibun 0:0b921803a9ba 91 {
leibun 0:0b921803a9ba 92 // Connect to maker.ifttt.org
leibun 0:0b921803a9ba 93 int retry = 0;
leibun 0:0b921803a9ba 94 for(retry=0; retry<IFTTT_MAX_RETRY; retry++) {
leibun 0:0b921803a9ba 95 int ret = this->socket->connect(this->host, this->port);
leibun 0:0b921803a9ba 96 if(ret == 0) {
leibun 0:0b921803a9ba 97 DBG("Successfully Connected socket to host");
leibun 0:0b921803a9ba 98 break ;
leibun 0:0b921803a9ba 99 }
leibun 0:0b921803a9ba 100 }
leibun 0:0b921803a9ba 101 if(retry == IFTTT_MAX_RETRY) {
leibun 0:0b921803a9ba 102 this->socket->close();
leibun 0:0b921803a9ba 103 ERR("Could not connect socket to host\r\n");
leibun 0:0b921803a9ba 104 return false;
leibun 0:0b921803a9ba 105 }
leibun 0:0b921803a9ba 106
leibun 0:0b921803a9ba 107 // Prep data to send
leibun 0:0b921803a9ba 108 // TODO: verify / modify data to be query string compliant (convert spaces to '+', convert non-alpha-numberic characters to the proper encoding... etc)
leibun 0:0b921803a9ba 109 char str[IFTTT_MAX_SIZE_STRING] = {0};
leibun 0:0b921803a9ba 110 sprintf(str, "GET /trigger/%s/with/key/%s/?value1=%s&value2=%s&value3=%s HTTP/1.1\r\nHost: maker.ifttt.com\r\n\r\n",eventName,secretKey,v1,v2,v3);
leibun 0:0b921803a9ba 111 DBG("String to send is:\n\r%s",str);
leibun 0:0b921803a9ba 112
leibun 0:0b921803a9ba 113 // Send Data
leibun 0:0b921803a9ba 114 DBG("Sending GET data...");
leibun 0:0b921803a9ba 115 int check = 0;
leibun 0:0b921803a9ba 116 check = this->socket->send_all(str,sizeof(str));
leibun 0:0b921803a9ba 117 if(check) {
leibun 0:0b921803a9ba 118 DBG("Sent Sucessfully %d bytes",check);
leibun 0:0b921803a9ba 119 } else {
leibun 0:0b921803a9ba 120 ERR("Sending failed");
leibun 0:0b921803a9ba 121 return false;
leibun 0:0b921803a9ba 122 }
leibun 0:0b921803a9ba 123 DBG("Waiting on reply ... \r\n");
leibun 0:0b921803a9ba 124 int ret = this->socket->receive(str,50);
leibun 0:0b921803a9ba 125 str[ret]=0;
leibun 0:0b921803a9ba 126 DBG("Received String : %s",str);
leibun 0:0b921803a9ba 127 this->socket->close();
leibun 0:0b921803a9ba 128
leibun 0:0b921803a9ba 129 return true;
leibun 0:0b921803a9ba 130 }
leibun 0:0b921803a9ba 131
leibun 0:0b921803a9ba 132 //
leibun 0:0b921803a9ba 133 // This function sends JSON encoded data encoded in a POST packet,
leibun 0:0b921803a9ba 134 //
leibun 0:0b921803a9ba 135 bool IFTTT::post()
leibun 0:0b921803a9ba 136 {
leibun 0:0b921803a9ba 137 // Connect to maker.ifttt.org
leibun 0:0b921803a9ba 138 int retry = 0;
leibun 0:0b921803a9ba 139 for(retry=0; retry<IFTTT_MAX_RETRY; retry++) {
leibun 0:0b921803a9ba 140 int ret = this->socket->connect(this->host, this->port);
leibun 0:0b921803a9ba 141 if(ret == 0) {
leibun 0:0b921803a9ba 142 DBG("Successfully Connected socket to host");
leibun 0:0b921803a9ba 143 break ;
leibun 0:0b921803a9ba 144 }
leibun 0:0b921803a9ba 145 }
leibun 0:0b921803a9ba 146 if(retry == IFTTT_MAX_RETRY) {
leibun 0:0b921803a9ba 147 this->socket->close();
leibun 0:0b921803a9ba 148 ERR("Could not connect socket to host\r\n");
leibun 0:0b921803a9ba 149 return false;
leibun 0:0b921803a9ba 150 }
leibun 0:0b921803a9ba 151
leibun 0:0b921803a9ba 152 // Prep data to send, the Assembled POST packet should look like this
leibun 0:0b921803a9ba 153 //
leibun 0:0b921803a9ba 154 //
leibun 0:0b921803a9ba 155 //POST /trigger/<eventName>/with/key/<secretKey> HTTP/1.1
leibun 0:0b921803a9ba 156 //Host: maker.ifttt.com
leibun 0:0b921803a9ba 157 //Content-Length: <length of POST data>
leibun 0:0b921803a9ba 158 //Content-Type: application/json
leibun 0:0b921803a9ba 159 //
leibun 0:0b921803a9ba 160 //{"value1":"<v1>","value2":"<v2>","value3":"<v3>"}
leibun 0:0b921803a9ba 161 //
leibun 0:0b921803a9ba 162 //
leibun 0:0b921803a9ba 163 char str[IFTTT_MAX_SIZE_STRING] = {0};
leibun 0:0b921803a9ba 164 char header[100] = {0};
leibun 0:0b921803a9ba 165 sprintf(header, "POST /trigger/%s/with/key/%s HTTP/1.1\r\n",eventName,secretKey);
leibun 0:0b921803a9ba 166 const char * host = "Host: maker.ifttt.com\r\n";
leibun 0:0b921803a9ba 167 char contentLen[50] = {0};
leibun 0:0b921803a9ba 168 const char * contentType = "Content-Type: application/json\r\n\r\n";
leibun 0:0b921803a9ba 169 char valueData [150] = {0};
leibun 0:0b921803a9ba 170 // char valueData [300] = {0};
leibun 0:0b921803a9ba 171 sprintf(valueData,"{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n",v1,v2,v3);
leibun 0:0b921803a9ba 172 sprintf(contentLen,"Content-Length: %d\r\n",strlen(valueData));
leibun 0:0b921803a9ba 173 sprintf(str,"%s%s%s%s%s",header,host,contentLen,contentType,valueData);
leibun 0:0b921803a9ba 174
leibun 0:0b921803a9ba 175 DBG("String to send is:\n\r%s",str);
leibun 0:0b921803a9ba 176
leibun 0:0b921803a9ba 177 // Send Data
leibun 0:0b921803a9ba 178 DBG("Sending POST data...");
leibun 0:0b921803a9ba 179 int check = 0;
leibun 0:0b921803a9ba 180 check = this->socket->send_all(str,strlen(str));
leibun 0:0b921803a9ba 181 if(check) {
leibun 0:0b921803a9ba 182 DBG("Sent Sucessfully %d bytes",check);
leibun 0:0b921803a9ba 183 } else {
leibun 0:0b921803a9ba 184 ERR("Sending failed");
leibun 0:0b921803a9ba 185 return false;
leibun 0:0b921803a9ba 186 }
leibun 0:0b921803a9ba 187 DBG("Waiting on reply ... \r\n");
leibun 0:0b921803a9ba 188 int ret = this->socket->receive(str,IFTTT_MAX_SIZE_STRING);
leibun 0:0b921803a9ba 189 str[ret]=0;
leibun 0:0b921803a9ba 190 DBG("Received String : %s",str);
leibun 0:0b921803a9ba 191 this->socket->close();
leibun 0:0b921803a9ba 192
leibun 0:0b921803a9ba 193 return true;
leibun 0:0b921803a9ba 194 }
leibun 0:0b921803a9ba 195
leibun 0:0b921803a9ba 196 //
leibun 0:0b921803a9ba 197 // Send trigger and any values associated to maker.ifttt.com
leibun 0:0b921803a9ba 198 // currently unsecured (sends over HTTP, not https)
leibun 0:0b921803a9ba 199 //
leibun 0:0b921803a9ba 200 bool
leibun 0:0b921803a9ba 201 IFTTT::trigger(int triggerType)
leibun 0:0b921803a9ba 202 {
leibun 0:0b921803a9ba 203 int ret = 0;
leibun 0:0b921803a9ba 204 switch(triggerType) {
leibun 0:0b921803a9ba 205 case IFTTT_GET:
leibun 0:0b921803a9ba 206 DBG("Sending Data as GET request");
leibun 0:0b921803a9ba 207 ret = get();
leibun 0:0b921803a9ba 208 break;
leibun 0:0b921803a9ba 209 case IFTTT_POST:
leibun 0:0b921803a9ba 210 DBG("Sending Data as POST request");
leibun 0:0b921803a9ba 211 ret = post();
leibun 0:0b921803a9ba 212 break;
leibun 0:0b921803a9ba 213
leibun 0:0b921803a9ba 214 default:
leibun 0:0b921803a9ba 215 WARN("Invalid type, defaulting to sending data as POST request");
leibun 0:0b921803a9ba 216 ret = post();
leibun 0:0b921803a9ba 217 break;
leibun 0:0b921803a9ba 218 }
leibun 0:0b921803a9ba 219 DBG("Sending Data return code : %d",ret);
leibun 0:0b921803a9ba 220 if(ret){
leibun 0:0b921803a9ba 221 INFO("Successfully triggered event: '%s' with v1='%s', v2='%s', v3='%s' !",eventName,v1,v2,v3);
leibun 0:0b921803a9ba 222 }
leibun 0:0b921803a9ba 223 return ret;
leibun 0:0b921803a9ba 224 }