Wiki source code of 2 Script

Version 39.1 by Hunter on 2023/03/17 15:50

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