Wiki source code of 2 Script

Version 26.1 by Hunter on 2022/10/25 09:36

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