Wiki source code of 2 Script

Version 25.1 by Hunter on 2022/10/09 15:04

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