|
|
- /*
-
- THINGSPEAK MODULE
-
- Copyright (C) 2018 by Xose Pérez <xose dot perez at gmail dot com>
-
- */
-
- #if THINGSPEAK_SUPPORT
-
- #include <ESP8266WiFi.h>
-
- bool _tspk_enabled = false;
- WiFiClientSecure _tspk_client;
- char * _tspk_queue[0];
-
- // -----------------------------------------------------------------------------
-
- void _tspkWebSocketOnSend(JsonObject& root) {
-
- root["tspkVisible"] = 1;
- root["tspkEnabled"] = getSetting("idbEnabled", THINGSPEAK_ENABLED).toInt() == 1;
-
- JsonArray& relays = root.createNestedArray("tspkRelays");
- for (byte i=0; i<relayCount(); i++) {
- relays.add(getSetting("tspkRelay", i, 0).toInt());
- }
-
- #if SENSOR_SUPPORT
- JsonArray& list = root.createNestedArray("tspkMagnitudes");
- for (byte i=0; i<magnitudeCount(); i++) {
- JsonObject& element = list.createNestedObject();
- element["name"] = magnitudeName(i);
- element["type"] = magnitudeType(i);
- element["index"] = magnitudeIndex(i);
- element["idx"] = getSetting("tspkMagnitude", i, 0).toInt();
- }
- #endif
-
- }
-
- void _tspkConfigure() {
- _tspk_enabled = getSetting("tspkEnabled", THINGSPEAK_ENABLED).toInt() == 1;
- if (_tspk_enabled && (getSetting("tspkKey").length() == 0)) {
- _tspk_enabled = false;
- setSetting("tspkEnabled", 0);
- }
- }
-
- bool _tspkPost(String data) {
- if (_tspk_client.connect(THINGSPEAK_HOST, 443)) {
- _tspk_client.println("POST " + String(THINGSPEAK_URL) + " HTTP/1.1");
- _tspk_client.println("Host: " + String(THINGSPEAK_HOST));
- //_tspk_client.println("User-Agent: ESPurna");
- _tspk_client.println("Connection: close");
- _tspk_client.println("Content-Type: application/x-www-form-urlencoded;");
- _tspk_client.print("Content-Length: ");
- _tspk_client.println(data.length());
- _tspk_client.println();
- _tspk_client.println(data);
- delay(10);
- String response = _tspk_client.readString();
- int bodypos = response.indexOf("\r\n\r\n") + 4;
- Serial.println(response.substring(bodypos));
- return true;
- }
- return false;
- }
-
- // -----------------------------------------------------------------------------
-
- bool tspkSendRelay(unsigned char index, unsigned char status, bool enqueue) {
- if (!_tspk_enabled) return true;
- unsigned char id = getSetting("tspkRelay", index, 0).toInt();
- if (id > 0) {
- --id;
- char payload[3];
- itoa(status ? 1 : 0, payload, 10);
- if (_tspk_queue[id]) free(_tspk_queue[id]);
- _tspk_queue[id] = strdup(payload);
- if (!enqueue) tspkFlush();
- }
- }
-
- bool tspkSendMeasurement(unsigned char index, char * payload, bool enqueue) {
- if (!_tspk_enabled) return true;
- unsigned char id = getSetting("tspkMagnitude", index, 0).toInt();
- if (id > 0) {
- --id;
- if (_tspk_queue[id]) free(_tspk_queue[id]);
- _tspk_queue[id] = strdup(payload);
- if (!enqueue) tspkFlush();
- }
- }
-
- bool tspkFlush() {
-
- if (!_tspk_enabled) return true;
- if (!wifiConnected() || (WiFi.getMode() != WIFI_STA)) return true;
-
- String data;
-
- // Walk the fields
- for (unsigned char id=0; id<8; id++) {
- if (_tspk_queue[id]) {
- if (data.length() > 0) data = data + String("&");
- data = data + String("field") + String(id+1) + String("=") + String(_tspk_queue[id]);
- free(_tspk_queue[id]);
- }
- }
-
- // POST data if any
- if (data.length() > 0) {
- data = data + String("&api_key=") + getSetting("tspkKey");
- _tspkPost(data);
- }
-
- }
-
- bool tspkEnabled() {
- return _tspk_enabled;
- }
-
- void tspkSetup() {
- _tspkConfigure();
- #if WEB_SUPPORT
- wsOnSendRegister(_tspkWebSocketOnSend);
- wsOnAfterParseRegister(_tspkConfigure);
- #endif
- }
-
- #endif
|