Wiki source code of 2 Script

Version 28.1 by Hunter on 2022/11/21 17:01

Show last authors
1 = **1 General Script Demo** =
2
3 == **1.1 Address Operation:Write/Read data from address A to B** ==
4
5 (((
6 For example:transfer D2 to D0
7 )))
8
9 (% style="text-align:center" %)
10 [[image:1624245865976-320.png||height="182" width="1000" class="img-thumbnail"]]
11
12 Depend on diffferent format of data.V-Box use different script functions.
13 for example. addr_setshort(addr,num) Function: Write 16-bit signed decimal address
14 addr_getshort(addr) Function:Read 16-bit signed decimal address
15 addr_getword(string addr)Function: Read 16-bit unsigned decimal address
16 More script function are in the second section of [[“V-BOX Script Interface Manual”>>doc:V-BOX.V-Net.Manual.04 Lua Script.01 Lua Functions.WebHome]]
17
18 == **1.2 Arithmetic** ==
19
20 (% style="text-align:center" %)
21 [[image:1624249623612-177.png||height="337" width="400" class="img-thumbnail"]]
22
23 == **1.3 Set 100 to D0~-~-D19** ==
24
25 (% style="text-align:center" %)
26 [[image:1624249693457-742.png||height="135" width="400" class="img-thumbnail"]]
27
28 == **1.4 Short message** ==
29
30 When the alarm condition is reached: temp1 > 5 & temp2 >10 & temp3 < 20(lasts more than 5 seconds) , then send an "alarm trigger" sms.
31
32 When the alarm condition is released,then send an "alarm release" sms.
33
34 (% style="text-align:center" %)
35 [[image:1645535936750-316.png||height="385" width="400" class="img-thumbnail"]]
36
37 Script is as below:
38
39 (% class="box infomessage" %)
40 (((
41 function sms.main()
42 ~-~-~-~-~-~-send condition~-~-~-~-~-~-
43 local temp1 = addr_getword("@Temperature1")
44 local temp2 = addr_getword("@Temperature2")
45 local temp3 = addr_getword("@Temperature3")
46 local timer = addr_getword("@Timer")
47 local tag = addr_getbit("@Tag")
48 ~-~-~-~-~-~-lasting time~-~-~-~-~-~-
49 if temp1 > 5 and temp2 > 10 and temp3 < 20 then
50 timer = timer + 1
51 addr_setword("@Timer",timer)
52 else
53 timer = 0
54 addr_setword("@Timer",timer)
55 end
56 ~-~-~-~-~-~-send sms & output Y0~-~-~-~-~-~-
57 if timer > 5 then
58 if tag == 0 then
59 send_sms_ira("19859254700","alarm trigger")
60 addr_setbit("@Tag",1)
61 end
62 elseif tag == 1 then
63 send_sms_ira("19859254700","alarm release")
64 addr_setbit("@Tag",0)
65 end
66 end
67 )))
68
69 == **1.5 Telegram notification** ==
70
71 This example shows how to use the Bot API to send message into Telegram group or channel. When monitoring bit "@HDX" changes, it will trigger and send the message. Please replace with your own Token and chat id.
72
73 As for How to get the botToken and chatID, please check the followig videos:
74
75 [[https:~~/~~/www.youtube.com/watch?v=zh6yYlnjX7k>>https://www.youtube.com/watch?v=zh6yYlnjX7k]]
76
77 [[https:~~/~~/www.youtube.com/watch?v=Pj8mwuMZZvg>>https://www.youtube.com/watch?v=Pj8mwuMZZvg]]
78
79 {{code language="Lua"}}
80 local tempBit = 0
81 local tempWord = 0
82
83 local botToken = "5504549693:AAEy6a5G-sOF3CINONxMNABeYnoS4ABVlfg"
84 local chatID = "-641959124"--The chat id from Channel or Group
85
86 local https = require("https")
87 local json = require("json")
88
89 -- Send http.get request and return response result
90 function getHttpsUrl(url)
91 local body = {}
92 local bodyJson = json.encode(body)
93 local header = {}
94 header["content-type"] = "application/json"
95 local result_table, code, headers, status = https.request(url, bodyJson)
96 print("code:"..code)
97 if code~= 200 then
98 return
99 else
100 return body
101 end
102 end
103
104 function sendAlarm(telegramBotToken, message, telegramChatID)
105 local url = "https://api.telegram.org/bot"..telegramBotToken.."/sendMessage?text="..message.."&chat_id="..telegramChatID
106 --local url = 'http://v-box.net'
107 --local url = 'https://www.google.com/'
108 print("Get the link:"..url)
109 getHttpsUrl(url)
110 end
111
112
113 function AlarmNotificate.main()
114 local bitValue = addr_getbit("@HDX");
115 local message = ''
116 print("b=="..bitValue)
117 if bitValue == 1 and bitValue ~= tempBit then
118 message = 'Alarm triggered, the monitoring point test value is '.. bitValue
119 sendAlarm(botToken, message, chatID)
120 print("Notification pushed of triggering alarm,"..bitValue)
121 elseif bitValue == 0 and bitValue ~= tempBit then
122 message = 'Alarm dismissed, the monitoring point test value is '.. bitValue
123 sendAlarm(botToken, message, chatID)
124 print("Notification pushed of dismissing alarm,"..bitValue)
125 end
126 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
127
128 local wordValue = addr_getword("@HDW10")
129 print("w=="..wordValue)
130 --dosomething
131 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
132 message = 'Word alarm triggered, the word value is '.. wordValue
133 sendAlarm(botToken, message, chatID)
134 print("Notification pushed of triggering alarm,"..wordValue)
135 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
136 message = 'Word alarm dismissed, the word value is '.. wordValue
137 sendAlarm(botToken, message, chatID)
138 print("Notification pushed of dismissing alarm,"..wordValue)
139 end
140 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
141 end
142 {{/code}}
143
144 == **1.6 LINE Notify** ==
145
146 This example shows how to use the LINE Notify to send message into LINE group. When monitoring bit "@test" changes, it will trigger and send the message. Please replace with your own Token.
147
148 {{code}}
149 local tempBit = 0
150 local tempWord = 0
151
152 local LineToken = "08XCpubkOdwGdGgRTXF0x8umiyrALtoM0v6lBFUV6PC"
153
154 local https = require("https")
155 local json = require("json")
156 local ltn12 = require("ltn12")
157
158 -- Send http.get request and return response result
159 function getHttpsUrl(url,header,reqbody)
160 local body = {}
161 local bodyJson = json.encode(body)
162 local result_table, code, headers, status = https.request{
163 method = "POST",
164 url = url,
165 source = ltn12.source.string(reqbody),
166 headers = header,
167 sink = ltn12.sink.table(body)
168 }
169 print("code:"..code)
170 if code~= 200 then
171 return
172 else
173 return body
174 end
175 end
176
177 function getMessageUrl(lineMessage)
178 local url = "https://notify-api.line.me/api/notify"
179 local reqMess = "message="..lineMessage
180 local headers =
181 {
182 ["Authorization"] = "Bearer "..LineToken,
183 ["Content-Type"] = "application/x-www-form-urlencoded",
184 ["Content-Length"] = #reqMess
185 }
186
187 print("Get the link:"..url)
188 getHttpsUrl(url, headers, reqMess)
189 end
190
191
192 function linenotify.main()
193 local bitValue = addr_getbit("@test");
194 local message = ''
195 print("b=="..bitValue)
196 if bitValue == 1 and bitValue ~= tempBit then
197 message = 'Alarm V-Box triggered, the output is '.. bitValue
198 getMessageUrl(message)
199 print("Notification pushed of triggering alarm,"..bitValue)
200 elseif bitValue == 0 and bitValue ~= tempBit then
201 message = 'Alarm V-Box dismissed, the output is '.. bitValue
202 getMessageUrl(message)
203 print("Notification pushed of dismissing alarm,"..bitValue)
204 end
205 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
206
207 local wordValue = addr_getword("@t2")
208 print("w=="..wordValue)
209 --dosomething
210 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
211 message = 'Alarm V-Box triggered, the temperature is '.. wordValue
212 getMessageUrl(message)
213 print("Notification pushed of triggering alarm,"..wordValue)
214 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
215 message = 'Alarm V-Box dismissed, the temperature is '.. wordValue
216 getMessageUrl(message)
217 print("Notification pushed of dismissing alarm,"..wordValue)
218 end
219 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
220 end
221 {{/code}}
222
223 == **1.7 Twilio WhatsApp Messaging** ==
224
225 This example shows how to use the Twilio API to send WhatsApp message to private number. When monitoring bit "@testBit" changes, it will trigger and send the message. Please replace with your own SID, Token, twilioPhoneNumber and receiverPhoneNumber.
226
227 About how to register the Twilio API, please check the following video:
228
229 [[https:~~/~~/www.youtube.com/watch?v=Id4lKichauU>>https://www.youtube.com/watch?v=Id4lKichauU]]
230
231 {{code language="Lua"}}
232 local tempBit = 0
233 local tempWord = 0
234
235 local https = require("https")
236 local json = require("json")
237 local ltn12 = require("ltn12")
238
239 local SID = 'AC1703bd710ffa98006d2bcc0b********'
240 local Token = 'd3c11897623c39e538b20263ec19****'
241
242 local twilioPhoneNumber = '+14155238886'
243 local receiverPhoneNumber = '+8615880018277'
244
245 local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
246 function encodingBase64(data)
247 return ((data:gsub('.', function(x)
248 local r,b='',x:byte()
249 for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
250 return r;
251 end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
252 if (#x < 6) then return '' end
253 local c=0
254 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
255 return b:sub(c+1,c+1)
256 end)..({ '', '==', '=' })[#data%3+1])
257 end
258
259 function encodeUrl(str)
260 str = string.gsub(str, "([^%w%.%- ])", function(c)
261 return string.format("%%%02X", string.byte(c)) end)
262 return string.gsub(str, " ", "+")
263 end
264
265
266
267
268 function requestBodySplice(message, sender, receiver)
269 local reqBody = ''
270 local encodeMess = encodeUrl(message)
271 local encodeSend = encodeUrl(sender)
272 local encodeRece = encodeUrl(receiver)
273 --reqBody = "Body=Hello%20Wecon2&From=whatsapp%3A%2B14155238886&To=whatsapp%3A%2B8615880018277"
274 reqBody = string.format("Body=%s&From=whatsapp:%s&To=whatsapp:%s", encodeMess, encodeSend, encodeRece)
275 print(reqBody)
276 return reqBody
277 end
278
279
280 -- Send http.get request and return response result
281 function getHttpsUrl(url,header,reqbody)
282 local body = {}
283 local bodyJson = json.encode(body)
284 local result_table, code, headers, status = https.request{
285 method = "POST",
286 url = url,
287 source = ltn12.source.string(reqbody),
288 headers = header,
289 sink = ltn12.sink.table(body)
290 }
291 print("code:"..code)
292 if code~= 200 then
293 return
294 else
295 return body
296 end
297 end
298
299 function getMessageUrl(whatsAppMessage)
300 local auth = SID..':'..Token
301 local url = "https://api.twilio.com/2010-04-01/Accounts/"..SID.."/Messages"
302 --local reqMess = "message="..twilioMessage
303 local reqMess = requestBodySplice(whatsAppMessage, twilioPhoneNumber, receiverPhoneNumber)
304 local headers =
305 {
306 ["Authorization"] = "Basic "..encodingBase64(auth),
307 ["Content-Type"] = "application/x-www-form-urlencoded",
308 ["Content-Length"] = #reqMess
309 }
310
311 print("Get the link:"..url)
312 getHttpsUrl(url, headers, reqMess)
313 end
314
315
316
317 function Twilio.main()
318 --dosomething
319 --local auth = SID..':'..Token
320 --print(requestBodySplice("HelloWorld", twilioPhoneNumber, receiverPhoneNumber))
321 --print(encodingBase64(auth))
322 local bitValue = addr_getbit("@testBit");
323 local message = ''
324 print("b=="..bitValue)
325 if bitValue == 1 and bitValue ~= tempBit then
326 message = 'Alarm V-Box triggered, the output is '.. bitValue
327 getMessageUrl(message)
328 print("Notification pushed of triggering alarm,"..bitValue)
329 elseif bitValue == 0 and bitValue ~= tempBit then
330 message = 'Alarm V-Box dismissed, the output is '.. bitValue
331 getMessageUrl(message)
332 print("Notification pushed of dismissing alarm,"..bitValue)
333 end
334 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
335
336 local wordValue = addr_getword("@testWord")
337 print("w=="..wordValue)
338 --dosomething
339 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
340 message = 'Alarm V-Box triggered, the temperature is '.. wordValue
341 getMessageUrl(message)
342 print("Notification pushed of triggering alarm,"..wordValue)
343 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
344 message = 'Alarm V-Box dismissed, the temperature is '.. wordValue
345 getMessageUrl(message)
346 print("Notification pushed of dismissing alarm,"..wordValue)
347 end
348 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
349 end
350 {{/code}}
351
352 = **2 V-Box connect with third part server** =
353
354 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.
355
356 (% class="mark" %)1.Europe server:eu.v-box.net
357
358 (% class="mark" %)2.Asean server:asean.v-box.net
359
360 Second is for OpenCloud mode.It means V-Box data will transfer to third part server and do not want to store data to WECON server.We call OpenCloud paltform
361
362 OpenCloud platform is used in configuring the script.Then V-Box can connect with third part server.
363
364 Both mode can support script  to connect with third part server.the difference:
365
366 (% class="mark" %)1.If you want to store in WECON server ,please use V-NET.
367
368 (% class="mark" %)2.If your server requires SSL certificate to log in,please use OpenCloud.Because only OpenCloud platform can support to upload certificate
369
370 (% class="wikigeneratedid" %)
371 **✎Note: **Before program the script of MQTT, please make sure the server(MQTT broker) can be connected through MQTT Client tool.
372
373 (% class="wikigeneratedid" %)
374 Tool link: **[[MQTT.fx>>http://mqttfx.jensd.de/index.php/download]]**
375
376 == **2.1 V-Box connect with test server(General Example)** ==
377
378 {{code language="lua"}}
379 --MQTT configuration table
380 local MQTT_CFG={}
381 MQTT_CFG.username = "weconsupport"
382 MQTT_CFG.password = "123456"
383 MQTT_CFG.netway = 0
384 MQTT_CFG.keepalive = 60
385 MQTT_CFG.cleansession = 1
386 --TCP URL
387 MQTT_URL = "tcp://mq.tongxinmao.com:1883"
388 --Client ID
389 MQTT_CLIENT_ID = "V-BOXH-AG"
390
391 --Generate UUID
392 function uuid()
393 local seed = {'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
394 local tb = {}
395 for i=1, 32 do
396 table.insert(tb, seed[math.random(1,16)])
397 end
398 local sid=table.concat(tb)
399 return string.format('%s',
400 string.sub(sid,1,32)
401 )
402 end
403
404
405 --Topic name to subscribed
406 local SUBSCRIBE_TOPIC = 'testtopic/test/no1/123456'
407
408 --Topic name to be published
409 local PUBLISH_TOPIC = 'testtopic/test/no1/7890'
410
411
412 --real time
413 local LAST_TIME = 0
414
415
416 --initialize mqtt
417 function mqtt_init()
418 print(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENT_ID))
419 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENT_ID) -- create mqtt object,and declare it as a global variable
420 if g_mq then
421 g_mq:on("message", mqtt_msg_callback) -- Register a callback for receiving messages
422 print("mqtt init success")
423 else
424 print("mqtt init failed:", err)
425 end
426 end
427
428 -- connect to mqtt
429 function mqtt_connect()
430 print("mqtt connecting...")
431 local stat, err = g_mq:connect(MQTT_CFG)
432 if stat == nil then
433 print("mqtt connect failed:", err)
434 return
435 else
436 print("mqtt connected")
437 end
438 g_mq:subscribe(SUBSCRIBE_TOPIC, 0)
439 end
440
441 -- Received message callback function
442 function mqtt_msg_callback(topic, msg)
443 print("topic:", topic)
444 print("msg:", msg)
445 local objMsg = json.decode(msg)
446 local water = objMsg.data.waterlevel
447 local temp = objMsg.data.temperature
448 addr_setword("@HDW20",water)
449 addr_setword("@HDW10",temp)
450 end
451
452 --Send data (data upload to platform and encapsulate it with custom functions)
453 function send_data()
454 local pub_data = {
455 timestamp = os.time(),
456 messageId = 1,
457 event = 'test_data',
458 mfrs = 'V-Box',
459 data = {
460 id = uuid(),
461 waterlevel = addr_getword("@HDW10"),
462 temperature = addr_getword("@HDW20")
463 }
464 }
465 return g_mq:publish(PUBLISH_TOPIC, json.encode(pub_data), 0, 0)
466 end
467
468
469 --main function fixed timed execution
470 function MQTT.main()
471 --dosomething
472 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main start")
473 --determine the mqtt object whether exist
474 if g_mq then
475 --determine the mqtt object whether has been connected or not
476 if g_mq:isconnected() then
477 send_data()
478 else
479 --if exceed 20 sec not connect, reconnect once
480 if os.time() - LAST_TIME > 20 then
481 LAST_TIME = os.time()
482 --connect to mqtt or reconnect
483 mqtt_connect()
484 end
485 end
486 else
487 --mqtt object does not exist so create new one
488 mqtt_init()
489 end
490 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main end")
491 end
492 {{/code}}
493
494 == **2.2 V-Box connect with customer server:grouprobotinfo.com** ==
495
496 This demo does not use SSL certification. Script is as below
497
498 Demo1:
499
500 {{code language="lua"}}
501 -- Meta class
502 --main
503 function mq.main()
504 if not mq.m then
505 local err = ""
506
507 mq.m, err = mqtt.create("tcp://grouprobotinfo.com:1883", "ClienID") -- create connection
508 if mq.m then
509 mq.config = {
510 username = "",-- ID
511 password = "",-- password
512 netway = 1, -- Ethernet connection, WIFI=1
513 -- keepalive = 100, -- Optional, set the connection heartbeat interval for 100 seconds.
514 -- cleansession = 0, -- Optional, keep session
515 }
516 mq.m:on("message", function(topic, msg) -- Register for receiving message callbacks
517 local str = string.format("%s:%s", topic, msg)
518 -- print("mqtt msg:", str) -- Print out the received topics and content
519 end)
520 mq.m:on("offline", function (cause) -- Register for lost connection callbacks
521 -- addr_setstring("@xxx", "cause"..(cause or " got nil"))
522 end)
523 mq.m:on("arrived", function() -- Registration for sending messages to callbacks
524 print("msg arrived")
525 end)
526 else
527 print("mqtt create failed:", err) -- Create object failed
528 end
529 else
530 if mq.m:isconnected() then -- If online, post a message
531 local phaseStatus ="unknow"
532 if addr_getbit("@Standby")== 1 then
533 phaseStatus = "Standby"
534 elseif addr_getbit("@Pre-Freeze")==1 then
535 phaseStatus= "Pre-Freeze"
536 elseif addr_getbit("@Prepare")==1 then
537 phaseStatus ="Prepare"
538 elseif addr_getbit("@Primary Dry")==1 then
539 phaseStatus = "Primary dry"
540 elseif addr_getbit("@Secondary Dry")==1 then
541 phaseStatus = "Secondary Dry"
542 end
543 --print(addr_getbit("@Primary Dry"))
544 -------------------------------------------------------------------------------------------------------------------------
545 local activating ="unknow"
546 if addr_getbit("@Compressor")==1 then
547 activating = ",".."Compressor"
548 end
549 if addr_getbit("@Silicone Pump")==1 then
550 activating = activating..",".."Silicone Pump"
551 end
552 if addr_getbit("@Vacuum Pump")==1 then
553 activating = activating..",".."Vacuum Pump"
554 end
555 if addr_getbit("@Root Pump")==1 then
556 activating = activating..",".."Root Pump"
557 end
558 if addr_getbit("@Heater")==1 then
559 activating = activating..",".."Heater"
560 end
561 if addr_getbit("@Valve Silicone")==1 then
562 activating = activating..",".."Valve Silicone"
563 end
564 if addr_getbit("@Valve Ice Condenser")==1 then
565 activating = activating..",".."Valve Ice Condenser"
566 end
567 if addr_getbit("@Valve Vacuum Pump")==1 then
568 activating = activating..",".."Valve Vacuum Pump"
569 end
570 local pr_activating =string.sub(activating,2)
571 -- print(pr_activating)
572 local status_text ="unknow"
573 if addr_getbit("@Status Run")==1 then
574 status_text = "RUNNING"
575 else
576 status_text = "STOP"
577 end
578 -------------------------------------------------------------------------------------------------------------------------
579 local js = {type="status",
580 mc_name ="FD300",
581 status=status_text,
582 elapsed_time={
583 hour=addr_getword("@Elapsed Time (Hour)"),
584 min=addr_getword("@Elapsed Time (Minute)"),
585 sec=addr_getword("@Elapsed Time (Second)")
586 },
587 phase = phaseStatus,
588 step = addr_getword("@Step"),
589 activating_output = pr_activating,
590 sv=addr_getshort("@SV Silicone")/10,
591 pv=addr_getshort("@PV Silicone")/10,
592 product1=addr_getshort("@Product 1")/10,
593
594 product2=addr_getshort("@Product 2")/10,
595 product3=addr_getshort("@Product 3")/10,
596 product4=addr_getshort("@Product 4")/10,
597 ice1=addr_getshort("@Ice condenser 1")/10,
598 ice2=addr_getshort("@Ice condenser 2")/10,
599 vacuum=addr_getfloat("@Vacuum")
600 }
601 local jsAlarm = { HPC = addr_getbit("@B_25395#W0.00"),
602 ODPC = addr_getbit("@B_25395#W0.01"),
603 MTPC=addr_getbit("@B_25395#W0.02"),
604 HTT = addr_getbit("@B_25395#W1.03"),
605 CPC = addr_getbit("@B_25395#W0.08"),
606 CPSP =addr_getbit("@B_25395#W1.00"),
607 CPVP =addr_getbit("@B_25395#W0.10"),
608 CPRP =addr_getbit("@B_25395#W0.11"),
609 HP =addr_getbit("@B_25395#W1.01"),
610 PP= addr_getbit("@B_25395#W1.02"),
611 PO=addr_getbit("@B_25395#W0.07"),
612 FSE=addr_getbit("@B_25395#W2.04"),
613 AVVSVV=addr_getbit("@B_25395#W1.12"),
614 ICHT=addr_getbit("@B_25395#W3.06")
615 }
616 -- ("@B_25395#CIO1.02")
617 mq.m:publish("mqtt-v-box-epsilon-fd300", json.encode(js) , 0, 0)
618 mq.m:publish("mqtt-v-box-epsilon-alarm-fd300", json.encode(jsAlarm) , 0, 0)
619 else
620 local stat, err = mq.m:connect(mq.config) -- connection
621 if stat == nil then --Determine whether to connect
622 print("mqtt connect failed:", err)
623 return -- Connection failed, return directly
624 end
625 mq.m:subscribe("mqtt-v-box-epsilon", 0)-- Subscribe to topics
626
627 end
628 -- mq.m:unsubscribe("stc/test")
629 -- mq.m:disconnect() -- close matt
630 -- mq.m:close() -- close clase
631 end
632 end
633 {{/code}}
634
635 == **2.3 V-Box connect with Azure platform** ==
636
637 In this demo,V-Box connects with Azure by SSL certification.
638
639 Video link: [[https:~~/~~/youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW>>https://youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW]]
640
641 Tool Download link: [[https:~~/~~/wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Azure/Azure%20tool.zip>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Azure/Azure%20tool.zip]]
642
643 Script is as below
644
645 (% class="box infomessage" %)
646 (((
647 ~-~-https:~/~/support.huaweicloud.com/qs-IoT/iot_05_0005.html mqtt.fx monitor to connect azure iot
648 sprint = print
649
650 ~-~-Get custom configuration parameters (vbox custom information)
651 ~-~-local CUSTOM = bns_get_config("bind")
652 ~-~-local DS_ID = CUSTOM.DSID or "60a71ccbbbe12002c08f3a1a_WECON"
653
654
655 ~-~-Cloud mode interface to obtain the MQTT information configured by the cloud platform: (5 returns, namely the server address, client ID, connection table, last word table, certificate table)
656 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
657
658 ~-~-MQTT_CFG.username = '60a71ccbbbe12002c08f3a1a_WECON'
659 ~-~-MQTT_CFG.password='wecon123'
660 ~-~-MQTT_CLIENTID = '60a71ccbbbe12002c08f3a1a_WECON_0_0_2021052110usernxame:60a71ccbbbe12002c08f3a1a_WECONpassword:a0a951581855aa8e0262129da6cf1b43f2c0ecfac4fa56117fc5a20c90be169a'
661
662 ~-~-publish to topics
663 local pub_RE_TOPIC = string.format('devices/wecon_02/messages/events/')
664 ~-~-Subscribe topics
665 local Subscribe_RE_TOPIC1 = string.format('devices/wecon_02/messages/devicebound/#')
666
667 ~-~-variable
668 local last_time = 0
669
670
671 ~-~-Timing main function
672 function Azure.main()
673
674 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main start")
675 if g_mq then
676 if g_mq:isconnected() then
677 send_Data()
678 else
679 if os.time() - last_time > 20 then
680 last_time = os.time()
681 mymqtt_connect()
682 end
683 end
684 else
685 mymqtt_init()
686 end
687 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main end")
688 end
689
690 ~-~- Initialize MQTT
691 function mymqtt_init()
692 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
693 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
694 if g_mq then
695 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
696 sprint("mqtt init success")
697 else
698 sprint("mqtt init failed:", err)
699 end
700 end
701
702 ~-~- Connect to MQTT server
703 function mymqtt_connect()
704 sprint("mqtt connecting...")
705 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
706 if stat == nil then
707 sprint("mqtt connect failed:", err)
708 return
709 else
710 sprint("mqtt connected")
711 end
712 g_mq:subscribe(Subscribe_RE_TOPIC1, 0) 
713 end
714
715 ~-~- Receive MQTT message callback function
716 function mymqtt_msg_callback(topic, msg)
717 print("topic:",topic)
718 print("revdata:",msg)
719 ~-~- local revData = json.decode(msg)
720 ~-~- if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
721 ~-~- if string.match(topic,Subscribe_RE_TOPIC1) then
722 ~-~- print("topi11:",topic)
723 setValue(revData)
724 ~-~- end
725 end
726
727 ~-~-Process the received data
728 ~-~-function setValue(revData)
729 ~-~- if revData ~~=nil then 
730 ~-~- for i,v in pairs(revData) do
731 ~-~- print("Data received:",i,v)
732 ~-~- end
733 ~-~- end
734 ~-~-end
735
736 ~-~-Get real-time data
737 function getData()
738 local jdata = {}
739 local addr = bns_get_alldata()
740 print(json.encode(addr))
741 for i,v in pairs(addr) do
742 if v[2] == 1 then
743 jdata[v[3]] = v[4]
744 end
745 end
746 return jdata
747 end
748
749
750 ~-~-send data
751 function send_Data()
752 local pub_data = {100
753 ~-~- services=~{~{
754 \\ ~-~-serviceId ='Temperature',
755 ~-~- properties={
756 ~-~- value = 55
757 ~-~- },
758 ~-~- }}
759 }
760 sprint(json.encode(pub_data))
761 print("..........",pub_RE_TOPIC)
762 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
763 end
764 )))
765
766 == **2.4 How to configure the Huawei platform?(✎Note: Huawei IOT DA function is only in China area.If you want this function,you need to use chinese mobile to register)** ==
767
768 1.Register a account: [[https:~~/~~/www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ>>https://www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ]]
769
770 2.log in the Huawei IOTDA
771
772 [[https:~~/~~/console.huaweicloud.com/iotdm/?region=cn-north-4&locale=en-us#/dm-portal/home>>https://console.huaweicloud.com/iotdm/?region=cn-north-4&locale=en-us#/dm-portal/home]]
773
774 3.Create product
775
776 (% style="text-align:center" %)
777 [[image:1624433478954-859.png||height="497" width="1100" class="img-thumbnail"]]
778
779 4.Product name,manufacturer,device type and industry,set according to your own needs.
780
781 Protocol: MQTT
782
783 Data Type: JSON
784
785 After finishing configuration,please click "OK"
786
787 (% style="text-align:center" %)
788 [[image:1624433531968-337.png||height="568" width="700" class="img-thumbnail"]]
789
790 5.Device
791
792 After product register,continue to configure "individual register".Click "Device"~-~->"individual register"
793
794 (% style="text-align:center" %)
795 [[image:1624434757597-117.png||class="img-thumbnail"]]
796
797 **Notes for registering device:**
798
799 Product: Previous product registration.
800
801 Node ID, Device Name: set according to your own needs.
802
803 Secret: need to be configured, will be used when connecting later
804
805 After configuration, click OK to generate a device ID and password, which will be used for device access later.
806
807 (% style="text-align:center" %)
808 [[image:1624436421499-613.png||height="499" width="700" class="img-thumbnail"]]
809
810 (% style="text-align:center" %)
811 [[image:1624437798012-126.png||height="366" width="500" class="img-thumbnail"]]
812
813 6. Connection authentication (use MQTT.fx tool to access the IoT platform)
814
815 (1)Open mqttClientIdGenerator tool Java(TM) Platform SE binary
816
817 **[[Download>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Huawei/mqttClientIdGenerator-19.2.0.zip]]**
818
819 (% style="text-align:center" %)
820 [[image:1624437573798-815.png||height="351" width="700" class="img-thumbnail"]]
821
822 (2)Fill in the device ID and secret (deviceid and secret generated when registering the device) to generate connection message
823
824 Client ID, user name, password
825
826 (% style="text-align:center" %)
827 [[image:1624437756866-251.png||height="405" width="700" class="img-thumbnail"]]
828
829 (3) Download certificate file"North-Beijing4"
830
831 [[https:~~/~~/support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html>>https://support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html]]
832
833 (% style="text-align:center" %)
834 [[image:1624438225398-363.png||height="403" width="800" class="img-thumbnail"]]
835
836 (% style="text-align:center" %)
837 [[image:1624438260025-610.png||height="408" width="700" class="img-thumbnail"]]
838
839 7.Run MQTTfx tool to connect with Huawei
840
841 Download link: [[http:~~/~~/mqttfx.jensd.de/index.php/download>>url:http://mqttfx.jensd.de/index.php/download]]
842
843 (1)Click on the setting ICON
844
845 (% style="text-align:center" %)
846 [[image:1624438821280-974.png||height="198" width="500" class="img-thumbnail"]]
847
848 (2)Fill in IIOT MQTT device access address, and configure authentication parameters.
849 First: It is the server and port connected to Huawei IOT, which can be viewed through the overview of the interface.
850
851 (% style="text-align:center" %)
852 [[image:1624439086268-985.png||class="img-thumbnail"]]
853
854 Domain name:iot-mqtts.cn-north-4.myhuaweicloud.com
855
856 Port: 8883
857
858 Client ID: check step 6
859
860 (% style="text-align:center" %)
861 [[image:1624439672168-492.png||height="458" width="600" class="img-thumbnail"]]
862
863 (3)Upload SSL certificate file,check step 6
864
865 Select folder java~-~->DigiCertGlobalRootCA.crt.pem and click OK or apply button
866
867 (% style="text-align:center" %)
868 [[image:1624439912938-659.png||height="458" width="600" class="img-thumbnail"]]
869
870 (4)Connect and test publish and subscribe
871
872 (% style="text-align:center" %)
873 [[image:1624440014872-688.png||height="232" width="700" class="img-thumbnail"]]
874
875 (% style="text-align:center" %)
876 [[image:1624440026937-386.png||height="215" width="700" class="img-thumbnail"]]
877
878 Huawei publish topic format: $oc/devices/{device_id}/sys/properties/report
879
880 (% style="text-align:center" %)
881 [[image:1624440404119-815.png||class="img-thumbnail"]]
882
883 Huawei subscribe topic format: **$oc/devices/{device_id}/sys/commands/#**
884
885 (% style="text-align:center" %)
886 [[image:1624447157493-672.png||class="img-thumbnail"]]
887
888 (% style="text-align:center" %)
889 [[image:1624447209982-715.png||class="img-thumbnail"]]
890
891 (5).How to configure to view the received data format intuitively, multiple products (Huawei) are required to configure the model. The specific steps are as follows:
892 ①Select the corresponding product from Huawei products to view
893
894 (% style="text-align:center" %)
895 [[image:1624440647663-632.png||class="img-thumbnail"]]
896
897 ②Custom model: used to display the service ID name of the configuration report.
898
899 (% style="text-align:center" %)
900 [[image:1624440793982-974.png||height="410" width="700" class="img-thumbnail"]]
901
902 (% style="text-align:center" %)
903 [[image:1624440883015-105.png||height="370" width="600" class="img-thumbnail"]]
904
905 ③Add property, ID of monitoring point, and data format:
906
907 (% style="text-align:center" %)
908 [[image:1624441052296-108.png||height="477" width="600" class="img-thumbnail"]]
909
910 ④After the configuration is complete, check the received data on the device
911
912 (% style="text-align:center" %)
913 [[image:1624441186851-536.png||height="434" width="700" class="img-thumbnail"]]
914
915 == **2.5 V-Box connect with Huawei platform** ==
916
917 In this demo,V-Box connects with Huawei by SSL certification.
918
919 1.Create a project access for Huawei IOT
920
921 2.configure MQTT configuration
922
923 (% style="text-align:center" %)
924 [[image:1624506363847-661.png||height="507" width="1000" class="img-thumbnail"]]
925
926 3.Create a script with the demo as below.
927
928 Script is as below
929
930 (% class="box infomessage" %)
931 (((
932 (% class="box infomessage" %)
933 (((
934 ~-~- mqtt.fx simulated access to Huawei Cloud IoT platform refer to 2.4
935 sprint = print
936
937 ~-~-Get custom configuration parameters (gateway customization information)
938 local CUSTOM = bns_get_config("bind")
939 local DS_ID = CUSTOM.DSID or "5dfa0700df1ae506179afb9c_wecon"
940
941
942 ~-~-OpenCloud mode interface, obtain MQTT information configured on cloud platform: (5 returned, respectively server address, client ID, connection table, last word table, certificate table)
943 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
944
945 MQTT_CFG.username =DS_ID
946 MQTT_CFG.password='d030d92338fcc18cd10fabb3003a4a0f6620fa6822cd3c23b1d9bc790200c6e7'
947 MQTT_CLIENTID = '5dfa0700df1ae506179afb9c_wecon_0_0_2019121819'
948
949 ~-~-publish topic format:$oc/devices/{device id}/sys/properties/report
950
951 local pub_RE_TOPIC = string.format('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/properties/report')
952
953 ~-~-variate
954 local last_time = 0
955
956
957 ~-~-Timing principal function
958 function hwyiot.main()
959
960 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main start")
961 if g_mq then
962 if g_mq:isconnected() then
963 send_Data()
964 else
965 if os.time() - last_time > 20 then
966 last_time = os.time()
967 mymqtt_connect()
968 end
969 end
970 else
971 mymqtt_init()
972 end
973 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main end")
974 end
975
976 ~-~- initializationMQTT
977 function mymqtt_init()
978 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
979 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
980 if g_mq then
981 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
982 sprint("mqtt init success")
983 else
984 sprint("mqtt init failed:", err)
985 end
986 end
987
988 ~-~- Connect to the MQTT server
989 function mymqtt_connect()
990 sprint("mqtt connecting...")
991 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
992 if stat == nil then
993 sprint("mqtt connect failed:", err)
994 return
995 else
996 sprint("mqtt connected")
997 end
998
999 ~-~-subscribe topic format:$oc/devices/{device_id}/sys/commands/#
1000
1001 g_mq:subscribe('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/commands/#', 0) 
1002 end
1003
1004 ~-~- Receive the message callback function
1005 function mymqtt_msg_callback(topic, msg)
1006 sprint("recv data!")
1007 sprint("topic:msg", topic,msg)
1008 print(msg)
1009 local revData = json.decode(msg)
1010 \\end
1011
1012 ~-~-Send data
1013 function send_Data()
1014 local pub_data = {
1015 msgType = 'deviceReq',
1016 data = ~{~{
1017 serviceId ='Battery',
1018 serviceData={
1019 batteryLevel = 55
1020 }
1021 }}
1022 }
1023 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1024 end
1025 )))
1026 )))
1027
1028 4.Download project access into V-Box to test in debug page
1029
1030 (% style="text-align:center" %)
1031 [[image:1624506710354-406.png||height="658" width="1000" class="img-thumbnail"]]
1032
1033 (% style="text-align:center" %)
1034 [[image:1624506666650-161.png||height="547" width="1000" class="img-thumbnail"]]
1035
1036 == **2.6 V-Box connect with AWS platform** ==
1037
1038 === **Log in AWS** ===
1039
1040 Login aws account and click“Connect an IoT device”
1041
1042 [[image:image-20220709165402-1.png]]
1043
1044 [[image:image-20220709165402-2.png]]
1045
1046
1047 === **Create policy** ===
1048
1049 Click “Secure”~-~-->“Policies”~-~-->“Create policy”~-~-->Click “Create”
1050
1051 [[image:image-20220709165402-3.png]]
1052
1053 Name the policy~-~-->Click “JSON”~-~-->Copy the following content~-~-->Click “Create”
1054
1055 [[image:image-20220709165402-5.png]]
1056
1057 [[image:image-20220709165402-4.png]]
1058
1059 {{code language="java"}}
1060 {
1061
1062   "Version": "2012-10-17",
1063
1064   "Statement": [
1065
1066     {
1067
1068       "Effect": "Allow",
1069
1070       "Action": [
1071
1072         "iot:Connect",
1073
1074         "iot:Publish",
1075
1076         "iot:Subscribe",
1077
1078         "iot:Receive",
1079
1080         "greengrass:Discover"
1081
1082       ],
1083
1084       "Resource": "*"
1085
1086     }
1087
1088   ]
1089
1090 }
1091 {{/code}}
1092
1093 === **Create things** ===
1094
1095 Click “Manage”~-~-->“Things”~-~-->“Create things”~-~-->“Create single thing”
1096
1097 [[image:image-20220709165402-6.png]]
1098
1099 [[image:image-20220709165402-7.png]]
1100
1101 Name the thing~-~-->Click “Next”
1102
1103 [[image:image-20220709165402-8.png]]
1104
1105 Select the way to create certificate
1106
1107 [[image:image-20220709165402-9.png]]
1108
1109 Select policy
1110
1111 [[image:image-20220709165402-10.png]]
1112
1113 [[image:image-20220709165402-11.png]]
1114
1115
1116 === **Test with MQTT.fx tool** ===
1117
1118 Click “View Setting” to get the “Broker Adress”
1119
1120 [[image:image-20220709165402-13.png]]
1121
1122 [[image:image-20220709165402-12.png]]
1123
1124 Create one connection in MQTT.fx tool, set broker port as 8883.
1125
1126 [[image:image-20220709165402-14.png]]
1127
1128 Upload the CA File, Client Certificate File, Client Key File
1129
1130 [[image:image-20220709165402-15.png]]
1131
1132 Publish message to topic “TEST”
1133
1134 [[image:image-20220709165402-17.png]]
1135
1136 Click”Test”~-~-->”MQTT test client”~-~-->”Subscrible to a topic”, to get message publish from MQTT.fx tool.
1137
1138 [[image:image-20220709173500-1.png]]
1139
1140 And we can also send message form AWS platform to MQTT.fx tool.
1141
1142 [[image:image-20220709165402-18.png]]
1143
1144 === **Configurate in CloudTool** ===
1145
1146 Copy the same setting in MQTT.fx to MQTT configuration
1147
1148 [[image:image-20220709165402-19.png]]
1149
1150 Add a lua script and copy the lua demo into it.
1151
1152 [[image:image-20220709165402-20.png]]
1153
1154 sprint = print
1155
1156 ~-~-Cloud mode interface to obtain the MQTT information configured by the cloud platform: (5 returns, namely the server address, client ID, connection table, last word table, certificate table)
1157
1158 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
1159
1160 ~-~-publish to topics
1161
1162 local pub_RE_TOPIC = string.format('TEST')
1163
1164 ~-~-Subscribe topics
1165
1166 local Subscribe_RE_TOPIC1 = string.format('TEST')
1167
1168 ~-~-variable
1169
1170 local last_time = 0
1171
1172 ~-~-Timing main function
1173
1174 function aws.main()
1175
1176 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main start")
1177
1178 if g_mq then
1179
1180 if g_mq:isconnected() then
1181
1182 send_Data()
1183
1184 else
1185
1186 if os.time() - last_time > 5 then
1187
1188 last_time = os.time()
1189
1190 mymqtt_connect()
1191
1192 end
1193
1194 end
1195
1196 else
1197
1198 mymqtt_init()
1199
1200 end
1201
1202 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main end")
1203
1204 end
1205
1206
1207 ~-~- Initialize MQTT
1208
1209 function mymqtt_init()
1210
1211 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
1212
1213 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
1214
1215 if g_mq then
1216
1217 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
1218
1219 sprint("mqtt init success")
1220
1221 else
1222
1223 sprint("mqtt init failed:", err)
1224
1225 end
1226
1227 end
1228
1229 ~-~- Connect to MQTT server
1230
1231 function mymqtt_connect()
1232
1233 sprint("mqtt connecting...")
1234
1235 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
1236
1237 if stat == nil then
1238
1239 sprint("mqtt connect failed:", err)
1240
1241 return
1242
1243 else
1244
1245 sprint("mqtt connected")
1246
1247 end
1248
1249 g_mq:subscribe(TEST, 0)
1250
1251 end
1252
1253 ~-~- Receive MQTT message callback function
1254
1255 function mymqtt_msg_callback(topic, msg)
1256
1257 print("topic:",topic)
1258
1259 print("revdata:",msg)
1260
1261 local revData = json.decode(msg)
1262
1263 print (revData)
1264
1265 if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
1266
1267 if string.match(topic,Subscribe_RE_TOPIC1) then
1268
1269 ~-~-if revData ~~= nil then
1270
1271 for k,v in pairs (revData) do
1272
1273 print("printing revdata after kv here")
1274
1275 print (k,v)
1276
1277 end
1278
1279 print ("current state is",fanstate)
1280
1281 ~-~-end
1282
1283 end
1284
1285 end
1286
1287 end
1288
1289
1290 ~-~-Get real-time data
1291
1292 function getData()
1293
1294 local jdata = {}
1295
1296 local addr = bns_get_alldata()
1297
1298 print(json.encode(addr))
1299
1300 for i,v in pairs(addr) do
1301
1302 if v[2] == 1 then
1303
1304 jdata[v[3]] = v[4]
1305
1306 end
1307
1308 end
1309
1310 return jdata
1311
1312 end
1313
1314 ~-~-send data
1315
1316 function send_Data()
1317
1318 local pub_data =
1319
1320 {
1321
1322 123
1323
1324 }
1325
1326 sprint(json.encode(pub_data))
1327
1328 print("..........",pub_RE_TOPIC)
1329
1330 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1331
1332 end
1333
1334 Get message in AWS
1335
1336 [[image:image-20220709165402-21.png]]