├── esp32Google.ino.ino └── google.js /esp32Google.ino.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | 5 | 6 | //Things to change 7 | const char * ssid = ""; 8 | const char * password = ""; 9 | 10 | String GOOGLE_SCRIPT_ID = ""; // Replace by your GAS service id 11 | 12 | const int sendInterval = 996 *5; // in millis, 996 instead of 1000 is adjustment, with 1000 it jumps ahead a minute every 3-4 hours 13 | 14 | //------------- 15 | 16 | 17 | 18 | //updated 19.04.2023 19 | const char *root_ca = 20 | "-----BEGIN CERTIFICATE-----\n" \ 21 | "MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw\n" \ 22 | "CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU\n" \ 23 | "MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw\n" \ 24 | "MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp\n" \ 25 | "Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA\n" \ 26 | "A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo\n" \ 27 | "27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w\n" \ 28 | "Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw\n" \ 29 | "TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl\n" \ 30 | "qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH\n" \ 31 | "szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8\n" \ 32 | "Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk\n" \ 33 | "MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92\n" \ 34 | "wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p\n" \ 35 | "aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN\n" \ 36 | "VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID\n" \ 37 | "AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\n" \ 38 | "FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb\n" \ 39 | "C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe\n" \ 40 | "QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy\n" \ 41 | "h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4\n" \ 42 | "7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J\n" \ 43 | "ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef\n" \ 44 | "MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/\n" \ 45 | "Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT\n" \ 46 | "6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ\n" \ 47 | "0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm\n" \ 48 | "2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb\n" \ 49 | "bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c\n" \ 50 | "-----END CERTIFICATE-----\n" \ 51 | ; 52 | 53 | 54 | WiFiClientSecure client; 55 | 56 | void setup() { 57 | Serial.begin(115200); 58 | delay(10); 59 | 60 | WiFi.mode(WIFI_STA); 61 | WiFi.begin(ssid, password); 62 | 63 | Serial.println("Started"); 64 | Serial.print("Connecting"); 65 | while (WiFi.status() != WL_CONNECTED) { 66 | delay(500); 67 | Serial.print("."); 68 | } 69 | 70 | Serial.println("Ready to go"); 71 | } 72 | float getFakeTemperature() { 73 | return micros()%20; 74 | } 75 | 76 | String fakeFunc1() 77 | { 78 | return "somedata"; 79 | } 80 | float fakeFunc2() 81 | { 82 | return millis()%100; 83 | } 84 | 85 | 86 | 87 | void loop() { 88 | 89 | 90 | 91 | sendData("info1=" + fakeFunc1()+"&info2="+String(fakeFunc2())+"&temp="+String(getFakeTemperature())); 92 | 93 | 94 | delay(sendInterval); 95 | 96 | } 97 | 98 | void SendAlarm()//use this function to notify if something wrong (example sensor says -128C) 99 | // don't forget to set true for enableSendingEmails in google script 100 | { 101 | sendData("alarm=fixme"); 102 | } 103 | 104 | void sendData(String params) { 105 | HTTPClient http; 106 | String url="https://script.google.com/macros/s/"+GOOGLE_SCRIPT_ID+"/exec?"+params; 107 | Serial.print(url); 108 | Serial.print("Making a request"); 109 | http.begin(url, root_ca); //Specify the URL and certificate 110 | int httpCode = http.GET(); 111 | http.end(); 112 | Serial.println(": done "+httpCode); 113 | } 114 | -------------------------------------------------------------------------------- /google.js: -------------------------------------------------------------------------------- 1 | var timeZone = "CST"; //get yours at https://www.timeanddate.com/time/zones/ 2 | var dateTimeFormat = "dd/MM/yyyy HH:mm"; 3 | 4 | var enableSendingEmails = true; 5 | var emailAddress = ""; // comma separate for several emails 6 | // 'bob@example.com'; 7 | // 'bob@example.com,admin@example.com'; 8 | 9 | 10 | 11 | function doGet(e) { 12 | var result = 'Ok'; // default result 13 | if (e.parameter == 'undefined') { 14 | result = 'No Parameters'; 15 | } else { 16 | 17 | var alarm= e.parameter.alarm; 18 | if (typeof alarm != 'undefined') { 19 | 20 | sendEmail("alarm text:" + stripQuotes(alarm)); 21 | return ContentService.createTextOutput(result); 22 | } 23 | 24 | var sheet = getSpreadSheet(); 25 | var lastRow = sheet.getLastRow(); 26 | var newRow = 1; 27 | if (lastRow > 0) { 28 | var lastVal = sheet.getRange(lastRow, 1).getValue(); 29 | //if there was no info for (sentEmailIfUnitIsOutForMinutes) checkIfDead() function will append row with 'dead' text 30 | // so checking do we need to override it 31 | if (lastVal == 'dead') 32 | newRow = lastRow; //to overwrite "dead" value 33 | else 34 | newRow = lastRow + 1; 35 | 36 | } 37 | 38 | var rowData = []; 39 | var namesOfParams=[]; 40 | for (var param in parseQuery(e.queryString)) 41 | namesOfParams.push(param); 42 | // namesOfParams=namesOfParams.reverse(); 43 | 44 | //creatating headers if first row 45 | if (newRow == 1) { 46 | rowData[0] = "Date"; 47 | var i = 1; 48 | for (var i=0; i