Sidik.My CircuitPython,Grafana,InfluxDB,LORAWAN,Node-Red,Raspberry Pi Gabungan Node-LoRaWAN gateway-Bridge-Network Server-Application Server-MQTT-Node-RED-InfluxDB-Grafana

Gabungan Node-LoRaWAN gateway-Bridge-Network Server-Application Server-MQTT-Node-RED-InfluxDB-Grafana

Sebelum ini saya telah menunjukkan bagaimana

  • Cara memasang MQTT, Node-RED, influxDB dan Grafana di sini
  • Aplikasi MQTT, Node_RED, InfluxDB dan Grafana di sini
  • Memasang LoRaWAN Gateway, Bridge, Network Server dan Application Server dalam satu Raspberry Pi yang Sama di sini

Sekarang Masanya untuk kita menggabungkan semuanya.

Dalam aplikasi MQTT, Node-RED ,InfluxDB dan Grafana sebelum ini, nilai bacaan sensor dihantar oleh mikropengawal (kita boleh panggil Node) ke MQTT broker melalui wifi Grove ESP8266. aplikasi ini memerlukan wifi yang merupakan satu protokol komunikasi jarak dekat.

Wifi Node -> MQTT Broker -> Node-Red -> InfluxDB-> Grafana

Bagi LoRaWan pula , data dari Node dihantar melalui radio LoRa (radio jarak jauh ) yang berfrekuensi 923khz (untuk Malaysia). Data ini kemudian diproses oleh gateway, bridge, network server dan aplication server dan akhirnya akan diterbitkan oleh MQTT broker. jadi destinasi adalah sama cuma sumber dan jalannya berbeza, wifi sesuai untuk komunikasi radio jarak dekat LoRa sesuai untuk jarak jauh.

LoRa Node -> LoRaWAN Gateway -> Bridge ->LoRaWan Network Server ->LoRaWAN Application Server -> MQTT Broker -> Node-Red -> InfluxDB-> Grafana

Namun begitu, data yang diterbitkan oleh MQTT broker daripada LoRaWan gateway adalah dalam bentuk JSON, yang mengandungi banyak maklumat yang tak diperlukan. maklumat yang dikehendaki adalah bacaan sensor dari objectJSON sahaja . walaupun begitu objectJSON masih lagi dalam berbentuk string yang memerlukan kita memprosesnya kepada bentuk JSON Object

Membaca data dari MQTT broker ke InfluxDB

Salin Topik dalam MQTT sub, setup sebagai topik MQTT in.

mosquitto_sub -v -t '#'Code language: Bash (bash)

JSON dalam debug Node-RED, objectJSON masih dalam bentuk string, maklumat lain kita tak perlukan.

Tukar objectJSON dari string kepada javascript object.

Seterusnya menggunakan Change Node untuk menukar payload daripada msg.payload kepada msg.payload.objectJSON sahaja

Begini keseluruhan aliran dan ringkasan apa yang setiap Node lakukan:

  • MQTT In – Topik adalah di salin daripada bacaan dari mosquitto_sub (output a parsed JSON object)
  • JSON – untuk mengubah dari String ke dalam bentuk objek JSON (Action : always convert to javascript object , property: msg.payload.objectJSON)
  • Change – set msg.payload kepada msg.payload.objectJSON, menapis objectJSON sahaja
  • InfluxDB Out – menyimpan data di dalam pengkalan data influxDB
  • debug – untuk memaparkan apa sebenarnya data yang telah diproses untuk palette tersebut.

Membaca data dari influxDB dan memaparkannya pada Grafana

Langkahnya sama sahaja dengan cara di Aplikasi MQTT, Node_RED, InfluxDB dan Grafana, saya tak akan terangkan di sini.

dan beginilah paparan pada Grafana.

Jadi selesailah sudah ekosistem kita, semua ini dalam rangkaian tempatan, tidak perlu sambungan internet untuk operasi!

LoRa Node -> LoRaWAN Gateway -> Bridge ->LoRaWan Network Server ->LoRaWAN Application Server -> MQTT Broker -> Node-Red -> InfluxDB-> Grafana

Sebagai perhatian, contoh ini hanyalah komunikasi satu hala sahaja dari sensor ke paparan grafana (uplink) . LoRaWAN juga boleh digunakan untuk menghantar arahan ke Node (downlink), sekiranya ada kesempatan, kita akan kongsikan nanti insyaAllah.

kod circuitpython untuk konfigurasi kali ini:-

# Write your code here :-)
import board
import busio
import digitalio
import time
import supervisor
import json
import binascii
import math
import adafruit_scd30
import adafruit_ssd1306
from seeed_hm3301 import HM3301_I2C

#Set UART Pin
LCD_SDA = board.GP26
LCD_SCL = board.GP27
i2c = busio.I2C(scl=LCD_SCL, sda=LCD_SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
# i2c = board.I2C() # untuk seeeduino, tidak perlu definisi I2C
uart = busio.UART(board.GP0, board.GP1, baudrate=9600)
get_input = True
message_started = False
message_print = []
allstring = ""
printshow = False

def at_send_check_response(p_ack, timeout, p_cmd):
    b = bytes(p_cmd, 'utf-8')
    print(p_ack)
    # print(b)
    uart.write(b)
    # delay(200)
    DELAY_DURATION = timeout
    LAST_TIME = 0
    now = time.monotonic()
    condition = True
    allstring=""
    while condition:
        byte_read = uart.readline()# read one line
        if byte_read != None:
            allstring += byte_read.decode()
            printshow = True
        else:
            if printshow == True:
                if allstring != "":
                    print(allstring)    
                allstring=""
                printshow ==False
        condition = time.monotonic() - now < timeout
    return 0

at_send_check_response("AT",2,"AT")
at_send_check_response("AT",3,"AT+ID")
at_send_check_response("AT",3,"AT+ADR=?")
at_send_check_response("Set AT+MODE=LWOTAA",2,"AT+MODE=LWOTAA")
at_send_check_response("Set AT+DR=AS923",2,"AT+DR=AS923")
at_send_check_response("Set AT+APPKEY",2,"AT+KEY=APPKEY \"masukkan Appkey anda yang disalin dari chirpstack application keys OTAA di sini\"")
at_send_check_response("Set AT+CLASS=A",2,"AT+CLASS=A")
at_send_check_response("Set AT+PORT=8",2,"AT+PORT=8")
at_send_check_response("Set AT+JOIN",10,"AT+JOIN")

while True:
    # read sensor value
    scd = adafruit_scd30.SCD30(i2c)
    hm3301 = HM3301_I2C(i2c, address=0x40)
    
    if scd.temperature != None and hm3301.PM_2_5_conctrt_std != None: # Formatkan sekiranya ada bacaan sensor sahaja
            #Format to 1 decimal point or integer.
            PM25 = int(hm3301.PM_2_5_conctrt_std)
            temperature = float("{:.1f}".format(scd.temperature))
            relative_humidity = float("{:.1f}".format(scd.relative_humidity))
            co2_ppm_level = float("{:.1f}".format(scd.CO2))
            # Show value on OLED
            oled.fill(0)
            oled.rect(10, 10, oled.width-10, oled.height-10, True) 
            oled.text("CO2      :"+str(co2_ppm_level), 20, 20,1)
            oled.text("PM2.5    :"+str(PM25), 20, 30,1)
            oled.text("Temp     :"+str(temperature), 20, 40, 1)
            oled.text("Humidity :"+str(relative_humidity), 20, 50, 1)
            oled.show()
            brokers_out={'C':co2_ppm_level,'T':temperature,'H':relative_humidity,'A':PM25}
    print(brokers_out)
    data_out=json.dumps(brokers_out)
    send_string= "AT+CMSGHEX="+bytes(binascii.hexlify(data_out.encode('utf-8'))).decode()+""
    at_send_check_response("Sending : "+send_string, 15, send_string)

    time.sleep(15)
Code language: Python (python)

Komponen yang digunakan

Untuk Node

Untuk Gateway

  • RAK2245
  • Raspberry Pi 3b+

Leave a Reply

Alamat e-mel anda tidak akan disiarkan. Medan diperlukan ditanda dengan *

Related Post