Simple IoT boardと電力計測モジュールINA226PRCを使ったサンプルプログラムです。計測したデータをIFTTTのMakerチャネルに送っています。 サンプリングは0.1秒刻みで、10秒間(100回計測)したら電圧、電流、電力それぞれについて平均、最大値、最小値を計算してIFTTTに送る仕様になっています。
Dependencies: INA226PRC SimpleIoTBoardLib mbed
IFTTT/ifttt.cpp@0:0b921803a9ba, 2015-12-09 (annotated)
- Committer:
- leibun
- Date:
- Wed Dec 09 16:02:42 2015 +0000
- Revision:
- 0:0b921803a9ba
first commit.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |