Wiki source code of 2 Script

Version 41.1 by Hunter on 2023/03/17 18:05

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