Changes for page 2 Script
Last modified by Devin Chen on 2026/03/10 10:53
To version 18.1
edited by Devin Chen
on 2026/03/05 15:57
on 2026/03/05 15:57
Change comment:
There is no comment for this version
Summary
-
Page properties (3 modified, 0 added, 0 removed)
-
Attachments (0 modified, 19 added, 0 removed)
- 1757043722849-910.png
- 1757043900216-610.png
- 1757044137457-543.png
- 1757387490907-390.png
- 1757401730077-284.png
- 1762306008662-362.png
- 3W00uSwkVQ1.png
- 8a8vG9Z7IT.png
- Doa6Qhp4bS.png
- HoLYu2nzvq.png
- PixPin_2025-11-05_09-21-33.png
- PixPin_2025-11-05_09-23-03.png
- PixPin_2026-03-05_14-40-27.png
- RW7OUCVVp1.png
- WeCom Screenshot_20260305114836.png
- WeCom Screenshot_20260305153954.png
- u8QbgKcOgA.png
- z6rgXmeOMz.png
- z6rgXmeOMz1.png
Details
- Page properties
-
- Parent
-
... ... @@ -1,1 +1,1 @@ 1 -V- BOX.V-Net.Training.WebHome1 +V-Net 2\.0.Demo.WebHome - Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. Wecon1 +XWiki.DevinChen - Content
-
... ... @@ -27,37 +27,63 @@ 27 27 28 28 == **1.4 Short message** == 29 29 30 -The following demo shows that when the alarm condition is reached: temp1 > 5 & temp2 >10& temp3 < 20(lasts more than 5 seconds) , then send an "alarm trigger" sms.30 +The following demo shows that when the alarm condition is reached: temp1 > 50 (lasts more than 5 seconds) , then send an "alarm trigger" sms. 31 31 32 -When the alarm condition is released,then send an "alarm release" sms. Script is as below:32 +When the alarm condition is released,then send an "alarm release" sms. 33 33 34 +Real-time tags setting 35 +[[image:1757401730077-284.png]] 36 + 37 +Script is as below: 38 + 34 34 {{code language="lua"}} 35 35 function sms.main() 36 36 ------send condition------ 37 -local temp1 = addr_getword("@Temperature1") 38 -local temp2 = addr_getword("@Temperature2") 39 -local temp3 = addr_getword("@Temperature3") 40 -local timer = addr_getword("@Timer") 41 -local tag = addr_getbit("@Tag") 42 -------lasting time------ 43 -if temp1 > 5 and temp2 > 10 and temp3 < 20 then 44 - timer = timer + 1 45 - addr_setword("@Timer",timer) 46 -else 47 - timer = 0 48 - addr_setword("@Timer",timer) 49 -end 50 -------send sms & output Y0------ 51 -if timer > 5 then 52 - if tag == 0 then 53 - send_sms_ira("19859254700","alarm trigger") 54 - addr_setbit("@Tag",1) 42 + local temp1 = addr_getword("@Temperature1") 43 + local timer = addr_getword("@Timer") 44 + local tag = addr_getbit("@Tag") 45 + local tag2 = addr_getbit("@Y0") 46 + local sms_timer = addr_getword("@SMSTimer") 47 + local sms_id = addr_getword("@id") -- SMS ID 48 + 49 + ------lasting time------ 50 + if temp1 > 50 then 51 + timer = timer + 1 52 + addr_setword("@Timer", timer) 53 + else 54 + timer = 0 55 + addr_setword("@Timer", timer) 55 55 end 56 -elseif tag == 1 then 57 -send_sms_ira("19859254700","alarm release") 58 -addr_setbit("@Tag",0) 57 + 58 + ------send sms & output Y0------ 59 + if timer > 5 then 60 + if tag == 0 then 61 + --send SMS to 2 number 62 + local id = send_sms_ira("198****4800", "alarm trigger") 63 + local id = send_sms_ira("187****3130", "alarm trigger") 64 + addr_setword("@id", id) -- Store SMS ID to dedicated variable 65 + addr_setbit("@Tag", 1) 66 + addr_setword("@SMSTimer", 0) -- Reset SMS status check timer 67 + else 68 + -- If SMS already sent, increment timer 69 + sms_timer = sms_timer + 1 70 + addr_setword("@SMSTimer", sms_timer) 71 + 72 + -- Check SMS status after 20 seconds 73 + if sms_timer >= 20 then 74 + local state = sms_get_state(sms_id) 75 + addr_setword("@state", state) 76 + addr_setword("@SMSTimer", 0) -- Reset timer 77 + end 78 + end 79 + elseif tag == 1 then 80 + -- Send alarm release SMS 81 + send_sms_ira("198****4800","alarm release") 82 + send_sms_ira("187****3130", "alarm release") 83 + addr_setbit("@Tag", 0) 84 + addr_setword("@SMSTimer", 0) -- Reset timer 85 + end 59 59 end 60 -end 61 61 {{/code}} 62 62 63 63 == **1.5 Telegram notification** == ... ... @@ -560,6 +560,126 @@ 560 560 end 561 561 {{/code}} 562 562 589 +== **1.12 Get UTC timestamp and local timezone timestamp** == 590 + 591 +This demo shows how to obtain UTC standard time from the V-Box and get the local time based on the device's time zone. 592 + 593 +**Real-time tags configuration** 594 + 595 +[[image:1757043722849-910.png]] 596 + 597 +**Script configuration** 598 + 599 +(% style="text-align:center" %) 600 +[[image:1757043900216-610.png||height="412" width="439"]] 601 + 602 +**Script** 603 + 604 +{{code language="lua"}} 605 +function time.main() 606 + 607 + --Get Coordinated Universal Time 608 + local timestamp = os.time() 609 + local utcTimeTable = os.date("!*t", timestamp) 610 + local utcTimestamp = os.time(utcTimeTable) 611 + local formattedTime = os.date("%Y-%m-%d %H:%M:%S", utcTimestamp) 612 + 613 + print("UTC: " ..formattedTime) 614 + 615 + --Calculate the local time at the device's location 616 + local utc_7Timestamp = os.time(utcTimeTable) + 25200 -- Enter the corresponding number of seconds based on the time difference,used UTC+7 as an example.. 617 + local formattedTime1 = os.date("%Y-%m-%d %H:%M:%S", utc_7Timestamp) 618 + print("UTC+7: " .. formattedTime1) 619 + 620 + 621 + --Assign the decomposed timestamp to the specified register 622 + addr_setword("@UTC+7_Second",os.date("%S", utc_7Timestamp)) 623 + addr_setword("@UTC+7_Minute",os.date("%M", utc_7Timestamp)) 624 + addr_setword("@UTC+7_Hour",os.date("%H", utc_7Timestamp)) 625 + addr_setword("@UTC+7_Day",os.date("%d", utc_7Timestamp)) 626 + addr_setword("@UTC+7_Month",os.date("%m", utc_7Timestamp)) 627 + addr_setword("@UTC+7_Year",os.date("%Y", utc_7Timestamp)) 628 + print("--------------------------------------") 629 + 630 +end 631 +{{/code}} 632 + 633 +**Result** 634 + 635 +(% style="text-align:center" %) 636 +[[image:1757044137457-543.png||height="468" width="708"]] 637 + 638 +== **1.13 JSON encoding and decoding** == 639 + 640 +This demo shows how to encode tag values into JSON format and decode the JSON to assign data to new tags. 641 + 642 +**Real-time tags configuration** 643 + 644 +(% style="text-align:center" %) 645 +[[image:PixPin_2025-11-05_09-21-33.png]] 646 + 647 +(% class="wikigeneratedid" %) 648 +**Script configuration** 649 + 650 +(% style="text-align:center" %) 651 +[[image:PixPin_2025-11-05_09-23-03.png||height="376" width="400"]] 652 + 653 +(% class="wikigeneratedid" %) 654 +**Script** 655 + 656 +{{code language="lua"}} 657 +function json_test.main() 658 + 659 +-- Load JSON module for encoding and decoding JSON data 660 +local json = require("json") 661 + 662 +-- Read values from different types of address tags 663 +local a = addr_getbit("@bit") -- Read a bit (boolean) value 664 +local b = addr_getword("@word") -- Read a word (integer) value 665 +local c = addr_getfloat("@floating number") -- Read a floating point value 666 +local d = addr_getstring("@string",10) -- Read a string value with max length 10 667 +local e = json.null -- JSON null value constant 668 + 669 +-- Encode the data into JSON format 670 +local jsondata = json.encode({ 671 + bit = a or 0, -- Bit value with default 0 672 + word = b or 0, -- Word value with default 0 673 + float = c or 0, -- Float value with default 0 674 + str = d or 0, -- String value with default 0 675 + {none= e} -- Nested table with null value 676 + }) 677 +print("json encode:", jsondata) -- Print the encoded JSON data 678 +print(".......................") 679 + 680 +-- Decode the JSON string back to Lua table 681 +local data = json.decode(jsondata) 682 + 683 +-- Check if decoding was successful and print the results 684 +if type(data) == 'table' then 685 + print("json decode:") 686 + -- Iterate through all key-value pairs in the decoded table 687 + for k, v in pairs(data) do 688 + print(k, v) 689 + end 690 +end 691 +-- Write the decoded values back to corresponding address tags 692 +addr_setbit("@bit_copy", data["bit"] or 0) -- Write bit value 693 +addr_setword("@word_copy", data["word"] or 0) -- Write word value 694 +addr_setfloat("@floating number_copy", data["float"] or 0) -- Write float value 695 +addr_setstring("@string_copy", data["str"], 10) -- Write string value 696 + 697 +print("-----------------------") 698 + 699 +end 700 +{{/code}} 701 + 702 +(% class="wikigeneratedid" %) 703 +**Result** 704 + 705 +(% style="text-align:center" %) 706 +[[image:1762306008662-362.png||height="485" width="1228"]] 707 + 708 + 563 563 = **2 Third part server** = 564 564 565 565 V-Box have two mode.One is for V-Net,User need to use WECON server to store data.We call this V-NET platform. ... ... @@ -1775,3 +1775,135 @@ 1775 1775 {{info}} 1776 1776 ✎Note: If you want to use CMD to access Mysql, you need to add the bin file to the environment variable, please check online for details of the operation. 1777 1777 {{/info}} 1924 + 1925 +== **2.8 Google sheet** == 1926 + 1927 + In this demo you can upload the real-time tags data to google sheet 1928 + 1929 +**1.Google sheets setting** 1930 + 1931 +1.1 Create a table file based on actual needs and fill in the headers. 1932 + 1933 +(% style="text-align:center" %) 1934 +[[image:WeCom Screenshot_20260305114836.png||height="618" width="977"]] 1935 + 1936 +1.2 Modify the access permissions of the table to 'Anyone on the internet with the link can edit'. 1937 + 1938 +(% style="text-align:center" %) 1939 +[[image:z6rgXmeOMz1.png||height="621" width="982"]] 1940 + 1941 +1.3 Enable the Apps Script extension feature for the sheet. 1942 + 1943 +(% style="text-align:center" %) 1944 +[[image:u8QbgKcOgA.png||height="621" width="982"]] 1945 + 1946 +1.4 On the Apps Script editing page, program according to actual needs. 1947 + 1948 +Google Apps Script Demo 1949 + 1950 +{{code language="JavaScript"}} 1951 +/** 1952 + * Handles POST requests: parses JSON data, writes it to the sheet with timestamp 1953 + * Expected JSON format: { 1954 + * sheetName: "Sheet1" (optional, defaults to "Sheet1"), 1955 + * integerNumber: 123, 1956 + * floatingNumber: 45.67, 1957 + * stringData: "example text" 1958 + * } 1959 + */ 1960 +function doPost(e) { 1961 + // 1. Parse the JSON data from the request body 1962 + var data; 1963 + try { 1964 + data = JSON.parse(e.postData.contents); 1965 + } catch (error) { 1966 + return ContentService.createTextOutput('Error: Invalid JSON data'); 1967 + } 1968 + 1969 + // 2. Get the target sheet (defaults to "Sheet1") 1970 + var sheetName = data.sheetName || 'Sheet1'; 1971 + var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); 1972 + if (!sheet) { 1973 + return ContentService.createTextOutput('Error: Specified sheet not found'); 1974 + } 1975 + 1976 + // 3. Verify required fields are present 1977 + if (data.integerNumber === undefined || 1978 + data.floatingNumber === undefined || 1979 + data.stringData === undefined) { 1980 + return ContentService.createTextOutput('Error: Missing required fields (integerNumber, floatingNumber, stringData)'); 1981 + } 1982 + 1983 + // 4. Generate formatted current timestamp (first column) 1984 + var now = new Date(); 1985 + var timeZone = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(); 1986 + var formattedTimestamp = Utilities.formatDate(now, timeZone, "yyyy-MM-dd HH:mm:ss"); 1987 + 1988 + // 5. Extract data from JSON 1989 + var integerNumber = data.integerNumber; 1990 + var floatingNumber = data.floatingNumber; 1991 + var stringData = data.stringData; 1992 + 1993 + // 6. Append the data to the sheet with proper column mapping: 1994 + // Column A: Time (timestamp) 1995 + // Column B: Integer number 1996 + // Column C: Floating number 1997 + // Column D: String data 1998 + sheet.appendRow([formattedTimestamp, integerNumber, floatingNumber, stringData]); 1999 + 2000 + // 7. Return success response 2001 + return ContentService.createTextOutput('Success: Data written to Google Sheets'); 2002 +} 2003 +{{/code}} 2004 + 2005 +(% style="text-align:center" %) 2006 +[[image:PixPin_2026-03-05_14-40-27.png||height="623" width="985"]] 2007 + 2008 +1.5 Click "Deploy" to make a new deployment. Select the 'Web APP' type, set the user permissions, and complete the deployment of the script. 2009 + 2010 +(% style="text-align:center" %) 2011 +[[image:3W00uSwkVQ1.png||height="641" width="981"]] 2012 + 2013 +1.6 In the 'Manage deployments' interface, obtain the URL of the web app. 2014 + 2015 +(% style="text-align:center" %) 2016 +[[image:HoLYu2nzvq.png||height="631" width="966"]] 2017 + 2018 +2. Test the Web APP URL 2019 + 2020 +With the Web APP URL, we can test it via API testing tool (Postman, Hoppscotch) 2021 + 2022 +Web APP Handles POST requests: parses JSON data, writes it to the sheet with timestamp 2023 + 2024 +Header: [Content-Type: application/json] 2025 + 2026 +Expected JSON format: { 2027 + 2028 + sheetName: "Sheet1" (optional, defaults to "Sheet1"), 2029 + 2030 + integerNumber: 123, 2031 + 2032 + floatingNumber: 45.67, 2033 + 2034 + stringData: "example text" 2035 + 2036 + } 2037 + 2038 +(% style="text-align:center" %) 2039 +[[image:8a8vG9Z7IT.png||height="597" width="913"]] 2040 + 2041 +POST request execution effect 2042 + 2043 +(% style="text-align:center" %) 2044 +[[image:WeCom Screenshot_20260305153954.png||height="602" width="921"]] 2045 + 2046 +{{info}} 2047 +After successfully testing with the API tool, it is recommended to change the General access of the Google Sheet to 'Restricted.' This will help improve data security without affecting the use of the Web App. 2048 + 2049 +(% style="text-align:center" %) 2050 +[[image:RW7OUCVVp1.png||height="617" width="943"]] 2051 + 2052 + 2053 +{{/info}} 2054 + 2055 +
- 1757043722849-910.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +74.4 KB - Content
- 1757043900216-610.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +62.9 KB - Content
- 1757044137457-543.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +99.4 KB - Content
- 1757387490907-390.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +47.9 KB - Content
- 1757401730077-284.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +92.2 KB - Content
- 1762306008662-362.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +66.9 KB - Content
- 3W00uSwkVQ1.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +140.1 KB - Content
- 8a8vG9Z7IT.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +132.2 KB - Content
- Doa6Qhp4bS.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +139.2 KB - Content
- HoLYu2nzvq.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +136.6 KB - Content
- PixPin_2025-11-05_09-21-33.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +65.8 KB - Content
- PixPin_2025-11-05_09-23-03.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +60.9 KB - Content
- PixPin_2026-03-05_14-40-27.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +154.8 KB - Content
- RW7OUCVVp1.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +100.0 KB - Content
- WeCom Screenshot_20260305114836.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +53.5 KB - Content
- WeCom Screenshot_20260305153954.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +71.7 KB - Content
- u8QbgKcOgA.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +61.3 KB - Content
- z6rgXmeOMz.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +80.7 KB - Content
- z6rgXmeOMz1.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +80.7 KB - Content