-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPOWER+.json
1 lines (1 loc) · 17.7 KB
/
POWER+.json
1
{"files":[{"id":"8396a06f-52c6-4d47-b17b-00d2b2894e1a","name":"appsscript","type":"json","source":"{\n \"timeZone\": \"Asia/Jakarta\",\n \"dependencies\": {},\n \"exceptionLogging\": \"STACKDRIVER\",\n \"runtimeVersion\": \"V8\",\n \"webapp\": {\n \"executeAs\": \"USER_ACCESSING\",\n \"access\": \"ANYONE\"\n }\n}"},{"id":"30d5dc85-7725-45b6-9e45-552565cc215c","name":"Kode","type":"server_js","source":"var SS \u003d SpreadsheetApp.openById(\"1cWsXPZZqC82z3gcMnCMF2AqKgrjNOKDZ1hmkilwniL8\");\n\nfunction doPost(e) {\n var parsedData;\n var result \u003d {};\n\n try { \n parsedData \u003d JSON.parse(e.postData.contents);\n } catch(f){\n return ContentService.createTextOutput(\"Error in parsing request body: \" + f.message);\n }\n\n if (parsedData !\u003d\u003d undefined){\n var sheet \u003d SS.getSheetByName(parsedData.sheet_name); // sheet name to publish data to is specified in Arduino code\n var dataArr \u003d JSON.parse(parsedData.values); // creates an array of the values to publish\n\n // Default time zone is America/Chicago.\n var date_now \u003d Utilities.formatDate(new Date(), \"Asia/Jakarta\", \"yyyy/MM/dd\"); // gets the current date\n var time_now \u003d Utilities.formatDate(new Date(), \"Asia/Jakarta\", \"HH:mm:ss\"); // gets the current time\n\n var id_data \u003d dataArr[0]; // value0 from Arduino code\n var voltage \u003d dataArr[1]; // value1 from Arduino code\n var current \u003d dataArr[2]; // value2 from Arduino code\n var power \u003d dataArr[3]; // value3 from Arduino code\n var energy \u003d dataArr[4]; // value4 from Arduino code\n var frequency \u003d dataArr[5]; // value1 from Arduino code\n var pf \u003d dataArr[6]; // value2 from Arduino code\n var va \u003d dataArr[7]; // value3 from Arduino code\n var var1 \u003d dataArr[8]; // value4 from Arduino code\n\n // Read and execute command from the \"payload_base\" string specified in Arduino code\n switch (parsedData.command) {\n case \"append_row\":\n var publish_array \u003d [date_now, time_now, id_data, voltage, current, power, energy, frequency, pf, va, var1];\n sheet.appendRow(publish_array); // publish data in publish_array after the last row of data in the sheet\n\n str \u003d \"Success\"; // string to return back to Arduino serial console\n SpreadsheetApp.flush();\n break; \n }\n\n return ContentService.createTextOutput(str);\n } else {\n return ContentService.createTextOutput(\"Error! Request body empty or in incorrect format.\");\n }\n}\n\nfunction doGet(e) {\n var htmlOutput \u003d HtmlService.createTemplateFromFile(\u0027website\u0027);\n return htmlOutput.evaluate();\n}\n\nfunction getLatestData() {\n var sheet \u003d SS.getSheetByName(\u0027monitoring\u0027);\n var dataKamar1 \u003d sheet.getRange(\u0027A2:O2\u0027).getValues()[0];\n \n var latestData \u003d {\n kamar1: {\n voltage: dataKamar1[3],\n current: dataKamar1[4],\n power: dataKamar1[5],\n energy: dataKamar1[6],\n frequency: dataKamar1[7],\n pf: dataKamar1[8],\n va:dataKamar1[9],\n var1:dataKamar1[10],\n harga: dataKamar1[12],\n pajak: dataKamar1[13],\n nominal: dataKamar1[14]\n }\n };\n return latestData;\n}\n\nfunction resetEnergy() {\n var sheet \u003d SS.getSheetByName(\u0027kamar_1\u0027);\n\n // Menemukan baris terakhir yang berisi data dalam kolom G untuk setiap kamar\n var lastRowKamar1 \u003d sheet.getRange(\u0027G:G\u0027).getValues().filter(String).length;\n\n // Menyimpan nilai energi total saat ini sebelum direset\n var currentEnergy \u003d sheet.getRange(\u0027S3\u0027).getValue();\n\n // Menambahkan harga listrik sebelum pajak\n var electricityCost \u003d currentEnergy * 1444;\n\n // Menghitung pajak\n var tax \u003d electricityCost * 0.12;\n\n // Menghitung total harga (harga listrik ditambah pajak)\n var totalCost \u003d electricityCost + tax;\n\n // Menambahkan simbol mata uang (\"Rp\") ke harga listrik, pajak, dan total harga\n var electricityCostFormatted \u003d \"Rp \" + electricityCost.toLocaleString(\u0027id-ID\u0027);\n var taxFormatted \u003d \"Rp \" + tax.toLocaleString(\u0027id-ID\u0027);\n var totalCostFormatted \u003d \"Rp \" + totalCost.toLocaleString(\u0027id-ID\u0027);\n\n // Menetapkan rumus baru ke sel G2 untuk menghitung total energi dari baris setelah reset terakhir hingga baris terakhir untuk kamar\n var newStartRowKamar1 \u003d lastRowKamar1 + 1;\n sheet.getRange(\u0027S3\u0027).setFormula(\u0027\u003dSUM(G\u0027 + newStartRowKamar1 + \u0027:G)\u0027);\n\n // Menambahkan entri baru ke sheet histori\n var historySheet \u003d SS.getSheetByName(\u0027histori\u0027);\n if (!historySheet) {\n historySheet \u003d SS.insertSheet(\u0027histori\u0027);\n historySheet.appendRow([\"No\", \"Waktu\", \"Energi Total\", \"Harga Listrik\", \"Pajak\", \"Total Harga\"]);\n }\n var timestamp \u003d new Date();\n historySheet.appendRow([historySheet.getLastRow(), timestamp, currentEnergy, electricityCostFormatted, taxFormatted, totalCostFormatted]);\n\n // Mengembalikan pesan berhasil\n return \"Reset energi kamar 1 berhasil\";\n}\n\nfunction getSheetData() {\n var ss \u003d SpreadsheetApp.getActiveSpreadsheet();\n var dataSheet \u003d ss.getSheetByName(\u0027histori\u0027);\n var dataRange \u003d dataSheet.getDataRange();\n var dataValues \u003d dataRange.getValues();\n\n // Convert the timestamp to desired format and numbers to fixed decimal places\n for (var i \u003d 1; i \u003c dataValues.length; i++) {\n // Convert timestamp to desired format\n var timestamp \u003d new Date(dataValues[i][1]);\n dataValues[i][1] \u003d Utilities.formatDate(timestamp, \"Asia/Jakarta\", \"dd/MM/yyyy HH:mm:ss\");\n\n // Convert numbers to fixed decimal places\n for (var j \u003d 2; j \u003c dataValues[i].length; j++) {\n dataValues[i][j] \u003d dataValues[i][j].toLocaleString(\u0027id-ID\u0027, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n }\n return dataValues;\n}\n\n\nfunction include(filename) {\n return HtmlService.createHtmlOutputFromFile(filename).getContent();\n}\n"},{"id":"b30534a0-6864-486e-b8c6-07d002268763","name":"website","type":"html","source":"\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n \u003chead\u003e\n \u003clink\n rel\u003d\"stylesheet\"\n type\u003d\"text/css\"\n href\u003d\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.2.0/css/bootstrap.min.css\"\n /\u003e\n \u003clink\n rel\u003d\"stylesheet\"\n type\u003d\"text/css\"\n href\u003d\"https://cdn.datatables.net/1.13.4/css/dataTables.bootstrap5.min.css\"\n /\u003e\n \u003ctitle\u003eESP8266 Web Server\u003c/title\u003e\n \u003cstyle\u003e\n * {\n font-family: Arial, Helvetica, sans-serif;\n }\n header {\n background-color: #146797;\n color: white;\n text-align: center;\n padding: 10px;\n margin-bottom: 15px;\n }\n .voltage,\n .current,\n .power,\n .energy,\n .frequency,\n .pf,\n .va,\n .var1 {\n background-color: #f5dd61;\n padding: 10px;\n width: 145px;\n margin: 10px;\n border-radius: 15px;\n }\n .biaya {\n margin-bottom: 30px;\n border: 2px solid #f5dd61;\n margin-top: 30px;\n border-radius: 10px;\n }\n table {\n border-collapse: collapse;\n width: 100%;\n }\n th {\n border: 1px solid #f5dd61;\n text-align: left;\n padding: 8px;\n }\n .reset-button {\n background-color: #f5dd61;\n border: none;\n color: white;\n padding: 15px 32px;\n text-align: center;\n text-decoration: none;\n display: inline-block;\n font-size: 16px;\n margin: 4px 2px;\n cursor: pointer;\n border-radius: 12px;\n }\n .reset-button:hover {\n background-color: #e74c3c;\n color: black;\n }\n .reset-button:active {\n background-color: #ff0000;\n }\n .monitor h4 {\n font-size: 15px;\n font-weight: bold;\n }\n .monitor h5 {\n font-size: 20px;\n font-weight: 500;\n }\n footer {\n margin-top: 20px;\n text-align: center;\n padding: 10px;\n background-color: #146797;\n color: #ffffff;\n }\n \u003c/style\u003e\n \u003cscript\u003e\n function updateClock() {\n var now \u003d new Date();\n var days \u003d [\n \"Minggu\",\n \"Senin\",\n \"Selasa\",\n \"Rabu\",\n \"Kamis\",\n \"Jumat\",\n \"Sabtu\",\n ];\n var dayOfWeek \u003d days[now.getDay()];\n var date \u003d now.getDate();\n var months \u003d [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n var month \u003d months[now.getMonth()];\n var year \u003d now.getFullYear();\n var hours \u003d now.getHours();\n var minutes \u003d now.getMinutes();\n var seconds \u003d now.getSeconds();\n document.getElementById(\"clock\").textContent \u003d\n dayOfWeek +\n \", \" +\n date +\n \" \" +\n month +\n \" \" +\n year +\n \" - \" +\n hours +\n \":\" +\n (minutes \u003c 10 ? \"0\" : \"\") +\n minutes +\n \":\" +\n (seconds \u003c 10 ? \"0\" : \"\") +\n seconds;\n setTimeout(updateClock, 1000);\n }\n\n function updateData() {\n google.script.run\n .withSuccessHandler(function (data) {\n document.getElementById(\"voltage1\").textContent \u003d\n parseFloat(data.kamar1.voltage).toFixed(2) + \"V\";\n document.getElementById(\"current1\").textContent \u003d\n parseFloat(data.kamar1.current).toFixed(2) + \"A\";\n document.getElementById(\"power1\").textContent \u003d\n parseFloat(data.kamar1.power).toFixed(2) + \"W\";\n document.getElementById(\"energy1\").textContent \u003d\n parseFloat(data.kamar1.energy).toFixed(2) + \"kWh\";\n document.getElementById(\"frequency1\").textContent \u003d\n parseFloat(data.kamar1.frequency).toFixed(2) + \"Hz\";\n document.getElementById(\"pf1\").textContent \u003d\n parseFloat(data.kamar1.pf).toFixed(2) + \"pf\";\n document.getElementById(\"va1\").textContent \u003d\n parseFloat(data.kamar1.va).toFixed(2) + \"VA\";\n document.getElementById(\"var\").textContent \u003d\n parseFloat(data.kamar1.var1).toFixed(2) + \"VAR\";\n document.getElementById(\"harga1\").textContent \u003d\n \"Rp.\" + parseFloat(data.kamar1.harga).toFixed(2);\n document.getElementById(\"pajak1\").textContent \u003d\n \"Rp.\" + parseFloat(data.kamar1.pajak).toFixed(2);\n document.getElementById(\"nominal1\").textContent \u003d\n \"Rp.\" + parseFloat(data.kamar1.nominal).toFixed(2);\n })\n .getLatestData();\n }\n\n function resetEnergy() {\n if (confirm(\"Apakah Anda yakin ingin mereset energi?\")) {\n google.script.run\n .withSuccessHandler(function (response) {\n alert(response); // Optional: Display a message on successful reset\n updateData(); // Refresh the data after reset\n })\n .resetEnergy();\n }\n }\n\n window.onload \u003d function () {\n updateClock();\n updateData();\n setInterval(updateData, 60000); // Update data every 60 seconds\n };\n \u003c/script\u003e\n \u003c/head\u003e\n \u003cbody\u003e\n \u003cheader\u003e\n \u003ch1 class\u003d\"header1\"\u003e\n Smart Sistem Monitoring Listrik Pada Bangunan Menggunakan PZEM004T\n \u003c/h1\u003e\n \u003c/header\u003e\n \u003cdiv class\u003d\"container\" style\u003d\"padding: 0 10px 0 10px\"\u003e\n \u003cdiv style\u003d\"display: flex; justify-content: space-between\"\u003e\n \u003ch2 id\u003d\"power-monitoring\" style\u003d\"text-align: center\"\u003e\n Power Monitoring\n \u003c/h2\u003e\n \u003ch2 id\u003d\"clock\"\u003e\u003c/h2\u003e\n \u003c/div\u003e\n \u003chr style\u003d\"height: 3px; background-color: #f5dd61; border: none\" /\u003e\n\n \u003c!-- kamar 1 --\u003e\n \u003cdiv\u003e\n \u003ch2\u003eKAMAR 1\u003c/h2\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"monitor\" style\u003d\"display: flex; justify-content: center\"\u003e\n \u003cdiv style\u003d\"display: flex; text-align: center\"\u003e\n \u003cdiv class\u003d\"voltage\"\u003e\n \u003ch4\u003eVoltage\u003c/h4\u003e\n \u003ch5 id\u003d\"voltage1\"\u003e0.00V\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"current\"\u003e\n \u003ch4\u003eCurrent\u003c/h4\u003e\n \u003ch5 id\u003d\"current1\"\u003e0.00A\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"power\"\u003e\n \u003ch4\u003ePower\u003c/h4\u003e\n \u003ch5 id\u003d\"power1\"\u003e0.00W\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"energy\"\u003e\n \u003ch4\u003eEnergy\u003c/h4\u003e\n \u003ch5 id\u003d\"energy1\"\u003e0.00kWh\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"frequency\"\u003e\n \u003ch4\u003efrequency\u003c/h4\u003e\n \u003ch5 id\u003d\"frequency1\"\u003e0.00Hz\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"pf\"\u003e\n \u003ch4\u003ePower Factor\u003c/h4\u003e\n \u003ch5 id\u003d\"pf1\"\u003e0.00pf\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"va\"\u003e\n \u003ch4\u003eApparent Power\u003c/h4\u003e\n \u003ch5 id\u003d\"va1\"\u003e0.00VA\u003c/h5\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"var1\"\u003e\n \u003ch4\u003eReactive Power\u003c/h4\u003e\n \u003ch5 id\u003d\"var\"\u003e0.00VAR\u003c/h5\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003cdiv class\u003d\"biaya\"\u003e\n \u003ch4 style\u003d\"text-align: center; padding-top: 10px;\"\u003eBIAYA\u003c/h4\u003e\n \u003ctable\u003e\n \u003ctr\u003e\n \u003cth\u003eHarga Listrik\u003c/th\u003e\n \u003cth\u003ePajak (%)\u003c/th\u003e\n \u003cth\u003eNominal Akhir\u003c/th\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth id\u003d\"harga1\"\u003eRp.0.00\u003c/th\u003e\n \u003cth id\u003d\"pajak1\"\u003eRp.0.00\u003c/th\u003e\n \u003cth id\u003d\"nominal1\"\u003eRp.0.00\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003cdiv style\u003d\"text-align: center; margin-top: 20px\"\u003e\n \u003cbutton\n class\u003d\"reset-button\"\n onclick\u003d\"resetEnergy()\"\n style\u003d\"margin-bottom: 40px\"\n \u003e\n Reset Energi\n \u003c/button\u003e\n \u003c/div\u003e\n \u003chr style\u003d\"height: 3px; background-color: #f5dd61; border: none\" /\u003e\n \u003c!-- Akhir kamar 1 --\u003e\n\n \u003c!-- data histori --\u003e\n \u003cdiv\u003e\n \u003ch2 style\u003d\"padding-bottom: 10px;\"\u003eHistori Pembayaran\u003c/h2\u003e\n \u003c/div\u003e\n \u003cdiv id\u003d\"demo_info\" class\u003d\"box\"\u003e\u003c/div\u003e\n \u003ctable id\u003d\"example\" class\u003d\"display\" style\u003d\"width: 100%\"\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003eNo\u003c/th\u003e\n \u003cth\u003eWaktu\u003c/th\u003e\n \u003cth\u003eEnergi Total (kWh)\u003c/th\u003e\n \u003cth\u003eHarga Listrik (Rp)\u003c/th\u003e\n \u003cth\u003ePajak (Rp)\u003c/th\u003e\n \u003cth\u003eTotal Harga (Rp)\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003c? var tableData \u003d getSheetData(); ?\u003e\n \u003c? for (var i \u003d 1; i \u003c tableData.length; i++) { ?\u003e\n \u003ctr\u003e\n \u003c? for (var j \u003d 0; j \u003c tableData[i].length; j++) { ?\u003e\n \u003ctd\u003e\u003c?\u003d tableData[i][j] ?\u003e\u003c/td\u003e\n \u003c? } ?\u003e\n \u003c/tr\u003e\n \u003c? } ?\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c!-- Akhir data histori --\u003e\n \u003c/div\u003e\n\n \u003cfooter\u003e\n \u003csmall\u003e\n Copyright © LDR D\n \u003c/small\u003e\n \u003c/footer\u003e\n\n \u003cscript\n type\u003d\"text/javascript\"\n src\u003d\"https://code.jquery.com/jquery-3.5.1.js\"\n \u003e\u003c/script\u003e\n \u003cscript\n type\u003d\"text/javascript\"\n src\u003d\"https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js\"\n \u003e\u003c/script\u003e\n \u003cscript\n type\u003d\"text/javascript\"\n src\u003d\"https://cdn.datatables.net/1.13.4/js/dataTables.bootstrap5.min.js\"\n \u003e\u003c/script\u003e\n \u003cscript type\u003d\"text/javascript\"\u003e\n $(document).ready(function () {\n $(\"#example\").DataTable();\n });\n \u003c/script\u003e\n \u003c/body\u003e\n\u003c/html\u003e\n"}]}