Wiki source code of 2 Script

Version 29.1 by Hunter on 2022/11/21 17:30

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