Changes for page 2 Script

Last modified by Devin Chen on 2026/03/10 10:53

From version 2.1
edited by Devin Chen
on 2025/09/05 11:50
Change comment: There is no comment for this version
To version 12.4
edited by Devin Chen
on 2026/03/05 14:29
Change comment: There is no comment for this version

Summary

Details

Page properties
Parent
... ... @@ -1,1 +1,1 @@
1 -V-BOX.V-Net.Training.WebHome
1 +V-Net 2\.0.Demo.WebHome
Content
... ... @@ -1,6 +4,3 @@
1 -= =
2 -
3 -
4 4  = **1 General Script Demo** =
5 5  
6 6  == **1.1 Address Operation** ==
... ... @@ -30,37 +30,63 @@
30 30  
31 31  == **1.4 Short message** ==
32 32  
33 -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.
34 34  
35 -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.
36 36  
34 +Real-time tags setting
35 +[[image:1757401730077-284.png]]
36 +
37 +Script is as below:
38 +
37 37  {{code language="lua"}}
38 38  function sms.main()
39 39  ------send condition------
40 -local temp1 = addr_getword("@Temperature1")
41 -local temp2 = addr_getword("@Temperature2")
42 -local temp3 = addr_getword("@Temperature3")
43 -local timer = addr_getword("@Timer")
44 -local tag = addr_getbit("@Tag")
45 -------lasting time------
46 -if temp1 > 5 and temp2 > 10 and temp3 < 20 then
47 - timer = timer + 1
48 - addr_setword("@Timer",timer)
49 -else
50 - timer = 0
51 - addr_setword("@Timer",timer)
52 -end
53 -------send sms & output Y0------
54 -if timer > 5 then
55 - if tag == 0 then
56 - send_sms_ira("19859254700","alarm trigger")
57 - 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)
58 58   end
59 -elseif tag == 1 then
60 -send_sms_ira("19859254700","alarm release")
61 -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
62 62  end
63 -end
64 64  {{/code}}
65 65  
66 66  == **1.5 Telegram notification** ==
... ... @@ -563,11 +563,11 @@
563 563  end
564 564  {{/code}}
565 565  
566 -= **1.12 Get UTC timestamp and local timezone timestamp** =
589 +== **1.12 Get UTC timestamp and local timezone timestamp** ==
567 567  
568 568  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.
569 569  
570 -**Register configuration**
593 +**Real-time tags configuration**
571 571  
572 572  [[image:1757043722849-910.png]]
573 573  
... ... @@ -576,11 +576,8 @@
576 576  (% style="text-align:center" %)
577 577  [[image:1757043900216-610.png||height="412" width="439"]]
578 578  
579 -
580 580  **Script**
581 581  
582 -
583 -
584 584  {{code language="lua"}}
585 585  function time.main()
586 586  
... ... @@ -615,6 +615,77 @@
615 615  (% style="text-align:center" %)
616 616  [[image:1757044137457-543.png||height="468" width="708"]]
617 617  
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 +
618 618  = **2 Third part server** =
619 619  
620 620  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.
... ... @@ -1830,3 +1830,90 @@
1830 1830  {{info}}
1831 1831  ✎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.
1832 1832  {{/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}}
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