Changes for page 2 Script
Last modified by Devin Chen on 2026/03/10 10:53
To version 12.4
edited by Devin Chen
on 2026/03/05 14:29
on 2026/03/05 14:29
Change comment:
There is no comment for this version
Summary
-
Page properties (3 modified, 0 added, 0 removed)
-
Attachments (0 modified, 12 added, 0 removed)
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,90 @@ 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]] 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]] 1940 + 1941 +1.3 Enable the Apps Script extension feature for the sheet. 1942 + 1943 +(% style="text-align:center" %) 1944 +[[image:u8QbgKcOgA.png]] 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="none"}} 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 + 2004 +/** 2005 + * Handles GET requests (optional, for testing) 2006 + */ 2007 +function doGet(e) { 2008 + return ContentService.createTextOutput('This endpoint accepts POST requests only. Please use POST with JSON data.'); 2009 +} 2010 +{{/code}}
- 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
- 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
- WeCom Screenshot_20260305114836.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.DevinChen - Size
-
... ... @@ -1,0 +1,1 @@ 1 +53.5 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