From bbe7f704882fac0f757bfe4bbdd30964414f0b6e Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Tue, 3 Sep 2024 22:17:44 +0000 Subject: [PATCH] Deploy website - based on 5ed6ac1d07a02e7fd74a63d6c9ee59c41c0f4c7d --- 404.html | 2 +- about.html | 2 +- assets/js/1f1ca1a6.44526709.js | 1 - assets/js/1f1ca1a6.b057c692.js | 1 + ...e~main.fdc5a1d2.js => runtime~main.8e68a1c2.js} | 2 +- docs/about/architecture.html | 14 ++++++++++++-- docs/about/overview.html | 2 +- docs/category/about.html | 2 +- docs/category/edge-apps.html | 2 +- docs/category/installation-manuals.html | 2 +- docs/category/reference-guides.html | 2 +- docs/category/tutorials.html | 2 +- docs/contact-us.html | 2 +- docs/events/past/hackathon-2023.html | 2 +- docs/installation-manuals/wsn-manual.html | 2 +- docs/reference-guides/dev-quick-reference.html | 2 +- docs/reference-guides/pluginctl.html | 2 +- docs/reference-guides/sesctl.html | 2 +- docs/reference-guides/triggers.html | 2 +- docs/tutorials/access-waggle-sensors.html | 2 +- docs/tutorials/accessing-data.html | 2 +- docs/tutorials/cloud-compute.html | 2 +- docs/tutorials/create-an-account.html | 2 +- docs/tutorials/create-waggle.html | 2 +- docs/tutorials/edge-apps/creating-an-edge-app.html | 2 +- docs/tutorials/edge-apps/intro-to-edge-apps.html | 2 +- docs/tutorials/edge-apps/publishing-to-ecr.html | 2 +- docs/tutorials/edge-apps/testing-an-edge-app.html | 2 +- docs/tutorials/schedule-jobs.html | 2 +- index.html | 2 +- news.html | 2 +- news/2020/07/27/sage-ai-at-edge-workshop.html | 2 +- news/2020/07/28/world-watchers.html | 2 +- news/2020/07/29/sage-community-workshop.html | 2 +- ...tning-the-way-with-software-defined-radios.html | 2 +- .../2020/08/12/derecho-talk-with-scott-collis.html | 2 +- news/2021/02/12/ped-count-for-cross.html | 2 +- news/2023/05/05/neiu-crocus-deploy.html | 2 +- news/2023/05/31/scalable-ci-in-aps.html | 2 +- news/2023/10/04/emiquon-preserve.html | 2 +- news/2023/10/30/alex-blog-hawaii.html | 2 +- news/2023/10/30/joann-blog-hawaii.html | 2 +- news/2023/10/31/Hawaiian-Community.html | 2 +- news/2023/11/17/hawaii-anagha.html | 2 +- news/2024/01/10/sage-testbed.html | 2 +- news/archive.html | 2 +- news/authors.html | 2 +- news/big-data.html | 2 +- news/hawaii-intro.html | 2 +- news/page/2.html | 2 +- news/sage-hawaii.html | 2 +- news/sage-neon-deploy-konza.html | 2 +- news/summer-interns.html | 2 +- news/tags.html | 2 +- news/tags/ai-applications.html | 2 +- news/tags/alcf.html | 2 +- news/tags/argonne-aps.html | 2 +- news/tags/big-data.html | 2 +- news/tags/blog-post.html | 2 +- news/tags/climate-science.html | 2 +- news/tags/collaborations.html | 2 +- news/tags/community.html | 2 +- news/tags/computational-science.html | 2 +- news/tags/computer-science.html | 2 +- news/tags/deployment.html | 2 +- news/tags/development.html | 2 +- news/tags/edge-applications.html | 2 +- news/tags/edge-computing.html | 2 +- news/tags/education.html | 2 +- news/tags/environment.html | 2 +- news/tags/environmental-science.html | 2 +- news/tags/fish-ponds.html | 2 +- news/tags/hawaii.html | 2 +- news/tags/in-the-news.html | 2 +- news/tags/instruments.html | 2 +- news/tags/interns.html | 2 +- news/tags/lightning-detection.html | 2 +- news/tags/naise.html | 2 +- news/tags/niu.html | 2 +- news/tags/node-deployment.html | 2 +- news/tags/node.html | 2 +- news/tags/nodes.html | 2 +- news/tags/sage-science.html | 2 +- news/tags/sage.html | 2 +- news/tags/science.html | 2 +- news/tags/sensors.html | 2 +- news/tags/social-science.html | 2 +- news/tags/solar-powered.html | 2 +- news/tags/students.html | 2 +- news/tags/talks-presentations.html | 2 +- news/tags/testbed.html | 2 +- news/tags/waggle.html | 2 +- news/tags/wildlife.html | 2 +- news/tags/workshop.html | 2 +- partners.html | 2 +- partners/archive.html | 2 +- partners/bad-river.html | 2 +- partners/city-of-chicago.html | 2 +- partners/crocus.html | 2 +- partners/neon.html | 2 +- partners/ohaz.html | 2 +- partners/scripps.html | 2 +- partners/tags.html | 2 +- partners/tags/agriculture-science.html | 2 +- partners/tags/climate-science.html | 2 +- partners/tags/ecology.html | 2 +- partners/tags/education.html | 2 +- partners/tags/environmental-science.html | 2 +- partners/tags/oceanography.html | 2 +- partners/tags/public-health.html | 2 +- partners/tags/seismology.html | 2 +- partners/tags/urban-science.html | 2 +- partners/tags/wildfire-science.html | 2 +- partners/tags/wildlife-monitoring.html | 2 +- partners/the-nature-conservancy.html | 2 +- partners/uic.html | 2 +- partners/university-of-hawaii.html | 2 +- partners/us-uk-smartwater.html | 2 +- photos.html | 2 +- publications.html | 2 +- science/category/past-projects.html | 2 +- science/category/recent-projects.html | 2 +- science/past/bandwidth-aware-learning.html | 2 +- science/past/characterizing-clouds.html | 2 +- science/past/integrating-chameleon.html | 2 +- science/past/lightning-science.html | 2 +- science/past/monitoring-biodiversity.html | 2 +- science/past/nowcasting-weather.html | 2 +- science/past/snowflake.html | 2 +- science/past/social-distancing.html | 2 +- science/past/vehicle-tracking.html | 2 +- science/past/water-level-detection.html | 2 +- science/past/water-segmentation.html | 2 +- science/past/wildfire-science.html | 2 +- science/recent/autonomous-camera-control.html | 2 +- science/recent/collaboration.html | 2 +- science/recent/finding-events.html | 2 +- science/recent/lidar-sky-solar.html | 2 +- science/recent/lightning-detector.html | 2 +- science/recent/resource-management.html | 2 +- science/recent/rideshare-detection.html | 2 +- science/recent/scalable-ci-in-aps.html | 2 +- science/recent/smoke-detection.html | 2 +- science/recent/snow-detection.html | 2 +- science/recent/solar-irradiance-estimation.html | 2 +- science/recent/sound-separation.html | 2 +- science/recent/super-resolution.html | 2 +- science/recent/traffic-state-estimation.html | 2 +- search.html | 2 +- team.html | 2 +- 150 files changed, 160 insertions(+), 150 deletions(-) delete mode 100644 assets/js/1f1ca1a6.44526709.js create mode 100644 assets/js/1f1ca1a6.b057c692.js rename assets/js/{runtime~main.fdc5a1d2.js => runtime~main.8e68a1c2.js} (99%) diff --git a/404.html b/404.html index c5235512..2d68854b 100644 --- a/404.html +++ b/404.html @@ -19,7 +19,7 @@ - +
diff --git a/about.html b/about.html index e5a248eb..0302f6f7 100644 --- a/about.html +++ b/about.html @@ -19,7 +19,7 @@ - + diff --git a/assets/js/1f1ca1a6.44526709.js b/assets/js/1f1ca1a6.44526709.js deleted file mode 100644 index ef0c4d30..00000000 --- a/assets/js/1f1ca1a6.44526709.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7325],{32720:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>h,contentTitle:()=>t,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=i(74848),a=i(28453);const r={sidebar_label:"Architecture",sidebar_position:2},t="Architecture",o={id:"about/architecture",title:"Architecture",description:"The cyberinfrastructure consists of coordinating hardware and software services enabling AI at the edge. Below is a quick summary of the different infrastructure pieces, starting at the highest-level and zooming into each component to understand the relationships and role each plays.",source:"@site/docs/about/architecture.md",sourceDirName:"about",slug:"/about/architecture",permalink:"/docs/about/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/waggle-sensor/sage-website/edit/main/docs/about/architecture.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_label:"Architecture",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/about/overview"},next:{title:"Tutorials",permalink:"/docs/category/tutorials"}},h={},d=[{value:"High-Level Infrastructure",id:"high-level-infrastructure",level:2},{value:"Beekeeper",id:"beekeeper",level:3},{value:"Beehive",id:"beehive",level:3},{value:"Beehive Infrastructure",id:"beehive-infrastructure",level:2},{value:"Data Repository (DR)",id:"data-repository-dr",level:3},{value:"Edge Scheduler (ES)",id:"edge-scheduler-es",level:3},{value:"Edge Code Repository (ECR)",id:"edge-code-repository-ecr",level:3},{value:"Lambda Triggers (LT)",id:"lambda-triggers-lt",level:3},{value:"Nodes",id:"nodes",level:2},{value:"Wild Sage Node (Wild Waggle Node)",id:"wild-sage-node-wild-waggle-node",level:3},{value:"Blade Nodes",id:"blade-nodes",level:3},{value:"Running plugins @ the Edge",id:"running-plugins--the-edge",level:2},{value:"Waggle Edge Stack (WES)",id:"waggle-edge-stack-wes",level:3},{value:"What is a plugin?",id:"what-is-a-plugin",level:3},{value:"Science Goals",id:"science-goals",level:3},{value:"LoRaWAN",id:"lorawan",level:2},{value:"What is LoRaWAN?",id:"what-is-lorawan",level:3},{value:"Chirpstack",id:"chirpstack",level:3},{value:"UDP Packet Forwarder",id:"udp-packet-forwarder",level:4},{value:"ChirpStack Gateway Bridge",id:"chirpstack-gateway-bridge",level:4},{value:"MQTT Broker",id:"mqtt-broker",level:4},{value:"ChirpStack Server",id:"chirpstack-server",level:4},{value:"Tracker",id:"tracker",level:3},{value:"Lorawan Listener Plugin",id:"lorawan-listener-plugin",level:3},{value:"Lorawan Device Compatibility",id:"lorawan-device-compatibility",level:3},{value:"Device Examples",id:"device-examples",level:4}];function l(e){const s={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,n.jsx)(s.p,{children:"The cyberinfrastructure consists of coordinating hardware and software services enabling AI at the edge. Below is a quick summary of the different infrastructure pieces, starting at the highest-level and zooming into each component to understand the relationships and role each plays."}),"\n",(0,n.jsx)(s.h2,{id:"high-level-infrastructure",children:"High-Level Infrastructure"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 1: High-level Node & Beehive Relationship",src:i(62463).A+"",width:"529",height:"423"})}),"\n",(0,n.jsx)(s.p,{children:"There are 2 main components of the cyberinfrastructure:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," that exist at the edge"]}),"\n",(0,n.jsxs)(s.li,{children:["The cloud that hosts services and storage systems to facilitate running ",(0,n.jsx)(s.a,{href:"#science-goals",children:"\u201cscience goals\u201d"})," @ the edge"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Every edge node maintains connections to 2 core cloud components: one to a ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"})," and one to a ",(0,n.jsx)(s.a,{href:"#beekeeper",children:"Beekeeper"})]}),"\n",(0,n.jsx)(s.h3,{id:"beekeeper",children:"Beekeeper"}),"\n",(0,n.jsx)(s.p,{children:'The Beekeeper is an administrative server that allows system administrators to perform actions on the nodes such as gather health metrics and perform software updates. All nodes "phone home" to their Beekeeper and maintain this "life-line" connection.'}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/beekeeper",children:"https://github.com/waggle-sensor/beekeeper"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"beehive",children:"Beehive"}),"\n",(0,n.jsxs)(s.p,{children:["The Node-to-Beehive connection is the pipeline for the science. It is over this connection that instructions for the node will be sent, in addition to how data is published into the Beehive storage systems from applications (",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),") running on the nodes."]}),"\n",(0,n.jsx)(s.p,{children:'The overall infrastructure supports multiple Beehives, where each node is associated with a single Beehive. The set of nodes associated with a Beehive creates a "project" where each "project" is separate, having its own data store, web services, etc.'}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 2: Multiple Beehives",src:i(46236).A+"",width:"598",height:"432"})}),"\n",(0,n.jsxs)(s.p,{children:["In the example above, there are 2 nodes associated with Beehive 1, while a single node is associated with Beehive 2. With all nodes, in this example, being administered by a single ",(0,n.jsx)(s.a,{href:"#beekeeper",children:"Beekeeper"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": the example above shows a single Beekeeper, but a second Beekeeper could have been used for administrative isolation."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-beehive-v2",children:"https://github.com/waggle-sensor/waggle-beehive-v2"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"beehive-infrastructure",children:"Beehive Infrastructure"}),"\n",(0,n.jsx)(s.p,{children:"Looking deeper into the Beehive infrastructure, it contains 2 main components:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["software services such as the ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler (ES)"}),", ",(0,n.jsx)(s.a,{href:"#lambda-triggers-lt",children:"Lambda Triggers (LT)"}),", data APIs, and websites/portals"]}),"\n",(0,n.jsxs)(s.li,{children:["data storage systems such as the ",(0,n.jsx)(s.a,{href:"#data-repository-dr",children:"Data Repository (DR)"})," and the ",(0,n.jsx)(s.a,{href:"#edge-code-repository-ecr",children:"Edge Code Repository (ECR)"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 3: Beehive High-level Architecture",src:i(36769).A+"",width:"521",height:"462"})}),"\n",(0,n.jsxs)(s.p,{children:["The Beehive is the \u201ccommand center\u201d for interacting with the Waggle nodes at the edge. Hosting websites and interfaces allowing scientists to create ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to run ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," at the edge & browse the data produced by those ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 4: Beehive Infrastructure Details",src:i(39429).A+"",width:"898",height:"482"})}),"\n",(0,n.jsxs)(s.p,{children:["The software services and data storage systems are deployed within a ",(0,n.jsx)(s.a,{href:"https://kubernetes.io/",children:"kubernetes"})," environment to allow for easy administration and to support running in a multiple server architecture, supporting redundancy and service replication."]}),"\n",(0,n.jsxs)(s.p,{children:["While the services running within Beehive are many (both graphical and ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Representational_state_transfer",children:"REST"})," style API interfaces), the following is an outline of the most vital."]}),"\n",(0,n.jsx)(s.h3,{id:"data-repository-dr",children:"Data Repository (DR)"}),"\n",(0,n.jsxs)(s.p,{children:["The Data Repository is the data store for housing all the edge produced ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," data. It consists of different storage technologies (i.e. ",(0,n.jsx)(s.a,{href:"https://www.influxdata.com/",children:"influxdb"}),") and techniques to store simple textual data (i.e. key-value pairs) in addition to large blobular data (i.e. audio, images, video). The Data Repository additionally has an API interface for easy access to this data."]}),"\n",(0,n.jsxs)(s.p,{children:["The data store is a time-series database of key-value pairs with each entry containing metadata about how and when the data originated @ the edge. Included in this metadata is the data collection timestamp, ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," version used to collect the data, the ",(0,n.jsx)(s.a,{href:"#nodes",children:"node"})," the ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," was run on, and the specific compute unit within the node that the ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," was running on."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-json",children:'{\n "timestamp":"2022-06-10T22:37:47.369013647Z",\n "name":"iio.in_temp_input",\n "value":25050,\n "meta":{\n "host":"0000dca632ed6d06.ws-rpi",\n "job":"sage",\n "node":"000048b02d35a97c",\n "plugin":"plugin-iio:0.6.0",\n "sensor":"bme680",\n "task":"iio-rpi",\n "vsn":"W08C"\n }\n}\n'})}),"\n",(0,n.jsxs)(s.p,{children:["In the above example, the value of ",(0,n.jsx)(s.code,{children:"25050"})," was collected @ ",(0,n.jsx)(s.code,{children:"2022-06-10T22:37:47.369013647Z"})," from the ",(0,n.jsx)(s.code,{children:"bme680"})," sensor on node ",(0,n.jsx)(s.code,{children:"000048b02d35a97c"})," via the ",(0,n.jsx)(s.code,{children:"plugin-iio:0.6.0"})," ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": see the ",(0,n.jsx)(s.a,{href:"/docs/tutorials/accessing-data",children:"Access and use data"})," site for more details and data access examples."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/data-repository",children:"https://github.com/waggle-sensor/data-repository"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"edge-scheduler-es",children:"Edge Scheduler (ES)"}),"\n",(0,n.jsxs)(s.p,{children:["The Edge Scheduler is defined as the suite of services running in Beehive that facilitate running ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," @ the edge. Included here are user interfaces and APIs for scientists to create and manage their ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),". The Edge Scheduler continuously analyzes node workloads against all the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to determine how the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," are deployed to the Beehive nodes. When it is determined that a node's ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," are to be updated, the Edge Scheduler interfaces with ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," running on those nodes to update the node's local copy of the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),". Essentially, the Edge Scheduler is the overseer of all the Beehive's nodes, deploying ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to them to meet the scientists ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," execution objectives."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edge-scheduler",children:"https://github.com/waggle-sensor/edge-scheduler"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"edge-code-repository-ecr",children:"Edge Code Repository (ECR)"}),"\n",(0,n.jsxs)(s.p,{children:['The Edge Code Repository is the "app store" that hosts all the tested and benchmarked edge ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," that can be deployed to the nodes. This is the interface allowing users to discover existing ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," (for potential inclusion in their ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),") in addition to submitting their own. At it's core, the ECR provides a verified and versioned repository of ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," ",(0,n.jsx)(s.a,{href:"https://www.docker.com",children:"Docker"})," images that are pulled by the nodes when a ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," is to be downloaded as run-time component of a ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goal"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edge-code-repository",children:"https://github.com/waggle-sensor/edge-code-repository"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"lambda-triggers-lt",children:"Lambda Triggers (LT)"}),"\n",(0,n.jsx)(s.p,{children:"The Lambda Triggers service provides a framework for running reactive code within the Beehive. There are two kinds of reaction triggers considered here: From-Edge and To-Edge."}),"\n",(0,n.jsx)(s.p,{children:"From-Edge triggers, or messages that originate from an edge node, can be used to trigger lambda functions -- for example, if high wind velocity is detected, a function could be triggered to determine how to reconfigure sensors or launch a computation or send an alert."}),"\n",(0,n.jsxs)(s.p,{children:["To-Edge triggers are messages that are to change a node's behavior. For example an HPC calculation or cloud-based data analysis could trigger an ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler"})," API call to request a ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goal"})," to be run on a particular set of edge nodes."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/lambda-triggers",children:"https://github.com/waggle-sensor/lambda-triggers"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"nodes",children:"Nodes"}),"\n",(0,n.jsx)(s.p,{children:"Nodes are the edge computing component of the cyberinfrastructure. All nodes consist of 3 items:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Persisent storage"})," for housing downloaded ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," and caching published data before it is transferred to the node's Beehive"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"CPU and GPU compute modules"})," where ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," are executed and perform the accelerated inferences"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Sensors"})," such as environment sensors, cameras and ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Lidar",children:"LiDAR systems"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 5: Node Overview",src:i(41068).A+"",width:"528",height:"335"})}),"\n",(0,n.jsx)(s.p,{children:'Edge nodes enable fast computation @ the edge, leveraging the large non-volatile storage to handle caching of high frequency data (including images, audio and video) in the event the node is "offline" from its Beehive. Through expansion ports the nodes support the adding and removing of sensors to fully customize the node deployments for the particular deployment environment.'}),"\n",(0,n.jsxs)(s.p,{children:["Overall, even though the nodes may use different CPU architectures and different sensor configurations, they all leverage the same ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"Waggle Edge Stack (WES)"})," to run ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"wild-sage-node-wild-waggle-node",children:"Wild Sage Node (Wild Waggle Node)"}),"\n",(0,n.jsxs)(s.p,{children:["The Wild Sage Node (or Wild Waggle Node) is a custom built weather-proof enclosure intended for remote outdoor installation. The node features software and hardware resilience via a ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wildnode-image",children:"custom operating system"})," and ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wagman",children:"custom circuit board"}),". Internal to the node is a power supply and PoE network switch supporting the addition of sensors through standard Ethernet (PoE), USB and other embedded protocols via the node expansion ports."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 6: Wild Sage/Waggle Node Overview",src:i(28291).A+"",width:"515",height:"401"})}),"\n",(0,n.jsx)(s.p,{children:"The technical capabilities of these nodes consists of:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["NVidia Xavier NX ARM64 ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/nodecontroller",children:"Node Controller"})," w/ 8GB of shared CPU/GPU RAM"]}),"\n",(0,n.jsx)(s.li,{children:"1 TB of NVMe storage"}),"\n",(0,n.jsx)(s.li,{children:"4x PoE expansion ports"}),"\n",(0,n.jsx)(s.li,{children:"1x USB2 expansion port"}),"\n",(0,n.jsxs)(s.li,{children:["optional ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Stevenson_screen",children:"Stevenson Shield"})," housing a RPi 4 w/ environmental sensors & microphone"]}),"\n",(0,n.jsxs)(s.li,{children:["optional 2nd NVidia Xavier NX ARM64 ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edgeprocessor",children:"Edge Processor"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Node installation manual: ",(0,n.jsx)(s.a,{href:"/docs/installation-manuals/wsn-manual",children:"https://sagecontinuum.org/docs/installation-manuals/wsn-manual"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wild-waggle-node",children:"https://github.com/waggle-sensor/wild-waggle-node"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"blade-nodes",children:"Blade Nodes"}),"\n",(0,n.jsxs)(s.p,{children:["A Blade Node is a standard commercially available server intended for use in a climate controlled machine room, or extended temperature range telecom-grade blades for harsher environments. The ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/blade-image",children:"AMD64 based operating system"})," supports these types of nodes, enabling the services needed to support ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 7: Blade Node Overview",src:i(7471).A+"",width:"517",height:"390"})}),"\n",(0,n.jsx)(s.p,{children:"The above diagram shows the basic technical configuration of a Blade Node:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Multi-core ARM64"}),"\n",(0,n.jsx)(s.li,{children:"32GB of RAM"}),"\n",(0,n.jsx)(s.li,{children:"Dedicated NVida T4 GPU"}),"\n",(0,n.jsx)(s.li,{children:"1 TB of SSD storage"}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": it is possible to add the same optional ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Stevenson_screen",children:"Stevenson Shield"})," housing that is available to the ",(0,n.jsx)(s.a,{href:"#wild-sage-node-wild-waggle-node",children:"Wild Sage Nodes"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-blade",children:"https://github.com/waggle-sensor/waggle-blade"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"running-plugins--the-edge",children:"Running plugins @ the Edge"}),"\n",(0,n.jsxs)(s.p,{children:["Included in the Waggle operating systems are the core components necessary to enable running ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," @ the edge. At the heart of this is ",(0,n.jsx)(s.a,{href:"https://k3s.io/",children:"k3s"}),", which creates a protected & isolated run-time environment. This environment combined with the tools and services provided by ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," enable ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," access to the node's CPU, GPU, sensors and cameras."]}),"\n",(0,n.jsx)(s.h3,{id:"waggle-edge-stack-wes",children:"Waggle Edge Stack (WES)"}),"\n",(0,n.jsxs)(s.p,{children:["The Waggle Edge Stack is the set of core services running within the ",(0,n.jsx)(s.a,{href:"#nodes",children:"edge node's"})," ",(0,n.jsx)(s.a,{href:"https://k3s.io/",children:"k3s"})," run-time environment that supports all the features that ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," need to run on the Waggle nodes. The WES services coordinate with the core ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"})," services to download & run scheduled ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," (including load balancing) and facilitate uploading ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," published data to the Beehive ",(0,n.jsx)(s.a,{href:"#data-repository-dr",children:"data repository"}),". Through abstraction technologies and WES provided tools, ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," have access to sensor and camera data."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 8: Waggle Edge Stack Overview",src:i(53059).A+"",width:"636",height:"539"})}),"\n",(0,n.jsxs)(s.p,{children:["The above diagram demonstrates 2 ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),' running on a Waggle node. Plugin 1 ("neon-kafka") is an example ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),' that is running alongside Plugin 2 ("data-smooth"). In this example, "neon-kafka" (via the WES tools) is reading metrics from the node\'s sensors and then publishing that data within the WES run-time environment (internal to the node).\nAt the same time, the "data-smooth" ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," is subscribing to this data stream, performing some sort of inference and then publishing the inference results (via WES tools) to Beehive."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": see the ",(0,n.jsx)(s.a,{href:"/docs/category/edge-apps",children:"Edge apps"})," guide on how to create a Waggle ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack",children:"https://github.com/waggle-sensor/waggle-edge-stack"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"what-is-a-plugin",children:"What is a plugin?"}),"\n",(0,n.jsxs)(s.p,{children:["Plugins are the user-developed modules that the cyberinfrastructure is designed around. At it's simplest definition a \"plugin\" is code that runs @ the edge to perform some task. That task may be simply collecting sample camera images or a complex inference combining sensor data and results published from other plugins. A plugin's code will interface with the edge node's sensor(s) and then publish resulting data via the tools provided by ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"}),". All developed plugins are hosted by the Beehive ",(0,n.jsx)(s.a,{href:"#edge-code-repository-ecr",children:"Edge Code Repository"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["See ",(0,n.jsx)(s.a,{href:"/docs/category/edge-apps",children:"how to create plugins"})," for details."]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"science-goals",children:"Science Goals"}),"\n",(0,n.jsxs)(s.p,{children:['A "science goal" is a rule-set for how and when ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," are run on edge nodes. These science goals are created by scientist to accomplish a science objective through the execution of ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," in a specific manner. Goals are created, in a human language, and managed within the Beehive ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler"}),". It is then the cyberinfrastucture responsibility to deploy the science goals to the edge nodes and execute the goal's ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),". The ",(0,n.jsx)(s.a,{href:"/docs/tutorials/schedule-jobs",children:"tutorial"})," walks through running a science goal."]}),"\n",(0,n.jsx)(s.h2,{id:"lorawan",children:"LoRaWAN"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"The Waggle Edge Stack"})," includes the ",(0,n.jsx)(s.a,{href:"#chirpstack",children:"ChirpStack software stack"})," and other services to facilitate communication between ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," and LoRaWAN devices. This empowers ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," to effortlessly establish connections with wireless sensors, enabling your ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," to seamlessly access and harness valuable data from these sensors."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["To get started using LoRaWAN, head over to the ",(0,n.jsx)(s.a,{href:"/docs/contact-us",children:"Contact Us"})," page. A tutorial will be available soon showing you how to get started with LoRaWAN."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 9: WES Lorawan Architecture",src:i(201).A+"",width:"1084",height:"957"})}),"\n",(0,n.jsxs)(s.p,{children:["The above diagram demonstrates the hardware in ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," and services in ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," that enable ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," to use LoRaWAN and publish the measurements to a ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"}),". The following sections will explain each componenent and service."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"source code:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack/tree/main/kubernetes/wes-chirpstack",children:"wes-chirpstack"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-server",children:"wes-chirpstack-server"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack/blob/main/kubernetes/wes-rabbitmq.yaml",children:"wes-rabbitmq"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-device-tracker",children:"Tracker"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/FranciscoLozCoding/plugin-lorawan-listener",children:"Lorawan Listener Plugin"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"what-is-lorawan",children:"What is LoRaWAN?"}),"\n",(0,n.jsxs)(s.p,{children:['LoRaWAN, short for "Long Range Wide Area Network," is a wireless communication protocol designed for low-power, long-range communication between IoT (Internet of Things) devices. It employs a low-power wide-area network (LPWAN) technology, making it ideal for connecting remote sensors and devices. For more information view the documentation ',(0,n.jsx)(s.a,{href:"https://www.thethingsnetwork.org/docs/lorawan/",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"chirpstack",children:"Chirpstack"}),"\n",(0,n.jsx)(s.p,{children:"ChirpStack is a robust and open-source LoRaWAN Network Server that enables efficient management of LoRaWAN devices, gateways, and data. Its architecture consists of several crucial components, each serving a distinct role in LoRaWAN network operations. Below, we provide a brief overview of these components along with links to ChirpStack documentation for further insights."}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/index.html",children:"Chirpstack documentation"})}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"udp-packet-forwarder",children:"UDP Packet Forwarder"}),"\n",(0,n.jsxs)(s.p,{children:["The UDP Packet Forwarder is an essential component that acts as a bridge between LoRa gateways and the ",(0,n.jsx)(s.a,{href:"#chirpstack-server",children:"ChirpStack Network Server"}),". It receives incoming packets from LoRa gateways and forwards them to the ",(0,n.jsx)(s.a,{href:"#chirpstack-gateway-bridge",children:"ChirpStack Gateway Bridge"})," for further processing. To learn more about the UDP Packet Forwarder, refer to the documentation ",(0,n.jsx)(s.a,{href:"https://github.com/RAKWireless/udp-packet-forwarder",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"chirpstack-gateway-bridge",children:"ChirpStack Gateway Bridge"}),"\n",(0,n.jsxs)(s.p,{children:["The ChirpStack Gateway Bridge is responsible for translating gateway-specific protocols into a standard format for the ",(0,n.jsx)(s.a,{href:"#chirpstack-server",children:"ChirpStack Network Server"}),". It connects to a ",(0,n.jsx)(s.a,{href:"#udp-packet-forwarder",children:"UDP Packet Forwader"}),", ensuring that data is properly formatted and can be seamlessly processed by the network server. For in-depth information on the ChirpStack Gateway Bridge, explore the documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack-gateway-bridge/index.html",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"mqtt-broker",children:"MQTT Broker"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," includes a MQTT (Message Queuing Telemetry Transport) broker to handle communication between various services. MQTT provides a lightweight and efficient messaging system. This service ensures that data flows smoothly between the network server, gateways, and applications. You can find detailed information about the MQTT broker integration in the ChirpStack documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/integrations/mqtt.html",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"chirpstack-server",children:"ChirpStack Server"}),"\n",(0,n.jsxs)(s.p,{children:["The ChirpStack Server serves as the core component, managing device sessions, data, and application integrations. It utilizes ",(0,n.jsx)(s.a,{href:"https://redis.io/",children:"Redis"})," for device sessions, metrics, and caching, ensuring efficient data handling and retrieval. For persistent data storage, ChirpStack uses ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"}),", accommodating records for tenants, applications, devices, and more. For a comprehensive understanding of the ChirpStack Server and its associated database technologies, consult the ChirpStack documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/requirements.html",children:"here"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"NOTE: Chirpstack v4 combined the application and network server into one component."}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"tracker",children:"Tracker"}),"\n",(0,n.jsxs)(s.p,{children:["The Tracker is a service designed to record the connectivity of LoRaWAN devices to the ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"}),". This service uses the information received from the ",(0,n.jsx)(s.a,{href:"#mqtt-broker",children:"MQTT broker"})," to call ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/api/grpc.html",children:"ChirpStack's gRPC API"}),". The information received from the API is then used to keep the Node's manifest up-to-date. Subsequently, it forwards this updated manifest to the ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"}),". For more information, view the documentation ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-device-tracker",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"lorawan-listener-plugin",children:"Lorawan Listener Plugin"}),"\n",(0,n.jsxs)(s.p,{children:["The LoRaWAN Listener is a plugin designed to publish measurements collected from LoRaWAN devices. It simplifies the process of extracting and publishing valuable data from these devices. For more information about the plugin view the plugin page ",(0,n.jsx)(s.a,{href:"https://portal.sagecontinuum.org/apps/app/flozano/lorawan-listener",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"lorawan-device-compatibility",children:"Lorawan Device Compatibility"}),"\n",(0,n.jsx)(s.p,{children:"The Wild Sage Node is designed to support a wide range of Lorawan devices, ensuring flexibility and adaptability for various applications. If you are wondering which Lorawan devices can be connected to a Wild Sage Node, the device must have the following tech specs:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"designed for US915 (902\u2013928 MHz) frequency region."}),"\n",(0,n.jsx)(s.li,{children:"compatible with Lorawan Mac versions 1.0.0 - 1.1.0"}),"\n",(0,n.jsx)(s.li,{children:"compatible with Chirpstack's Lorawan Network Server"}),"\n",(0,n.jsx)(s.li,{children:"The device supports Over-The-Air Activation (OTAA) or Activation By Personalization (ABP)"}),"\n",(0,n.jsx)(s.li,{children:"The device has a Lorawan device class of A, B, or C"}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["It is important to note that all channels within the US915 frequency band are enabled in a Wild Sage Node. If you wish to learn more about our Lorawan Gateway, please visit our ",(0,n.jsx)(s.a,{href:"https://portal.sagecontinuum.org/sensors/",children:"portal"}),". For inquiries about supporting Lorawan regions other than US915, please ",(0,n.jsx)(s.a,{href:"/docs/contact-us",children:"Contact Us"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"device-examples",children:"Device Examples"}),"\n",(0,n.jsx)(s.p,{children:"Whether you are designing your own Lorawan sensor, looking for a Lorawan data logger, or seeking an off-the-shelf Lorawan device the Wild Sage Node will support it, we have examples for you:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Designing your own Lorawan sensor?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://docs.arduino.cc/hardware/mkr-wan-1310/",children:"Arduino MKR WAN 1310"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Looking for a Lorawan data logger?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/product/mfr-node/",children:"ICT International MFR Node"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Looking for an off-the-shelf Lorawan device?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/product/sfm1x-sap-flow-meter/",children:"ICT International SFM1X Sap Flow Meter"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Seeking Lorawan device manufacturers?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/",children:"ICT International"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.rakwireless.com/en-us",children:"RAKwireless"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.thethingsnetwork.org/marketplace/products/devices",children:"The Things Network Device Marketplace"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.decentlab.com",children:"DecentLab"})}),"\n"]}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},46236:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_beehives_01-b8018d2fcb011afe51840fc080dac4dc.svg"},62463:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_high_01-770507cc9c88a2a5ec6125510fb8e527.svg"},201:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_wes_lorawan-9d39a09465f42b074eb5ca016837543d.svg"},39429:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/beehive_details_01-17afa73f2d666b43d21ba820c0423888.svg"},36769:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/beehive_high_01-22e4d3a5822b0072fe6573674d3c109e.svg"},7471:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_blade_01-60cda8bc9c4d201ab4ee6876b4f4c67c.svg"},41068:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_overview_01-98f28b1ff8c7610992042d1d2c719127.svg"},28291:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_wild_01-addd18fb19d07c36aaec6ffe2187a064.svg"},53059:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/wes_overview_01-9559b1c3f53314fa18388e193870a589.svg"},28453:(e,s,i)=>{i.d(s,{R:()=>t,x:()=>o});var n=i(96540);const a={},r=n.createContext(a);function t(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f1ca1a6.b057c692.js b/assets/js/1f1ca1a6.b057c692.js new file mode 100644 index 00000000..77cb487a --- /dev/null +++ b/assets/js/1f1ca1a6.b057c692.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7325],{32720:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>h,contentTitle:()=>t,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var n=i(74848),a=i(28453);const r={sidebar_label:"Architecture",sidebar_position:2},t="Architecture",o={id:"about/architecture",title:"Architecture",description:"The cyberinfrastructure consists of coordinating hardware and software services enabling AI at the edge. Below is a quick summary of the different infrastructure pieces, starting at the highest-level and zooming into each component to understand the relationships and role each plays.",source:"@site/docs/about/architecture.md",sourceDirName:"about",slug:"/about/architecture",permalink:"/docs/about/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/waggle-sensor/sage-website/edit/main/docs/about/architecture.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_label:"Architecture",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/about/overview"},next:{title:"Tutorials",permalink:"/docs/category/tutorials"}},h={},l=[{value:"High-Level Infrastructure",id:"high-level-infrastructure",level:2},{value:"Beekeeper",id:"beekeeper",level:3},{value:"Beehive",id:"beehive",level:3},{value:"Beehive Infrastructure",id:"beehive-infrastructure",level:2},{value:"Data Repository (DR)",id:"data-repository-dr",level:3},{value:"Edge Scheduler (ES)",id:"edge-scheduler-es",level:3},{value:"Edge Code Repository (ECR)",id:"edge-code-repository-ecr",level:3},{value:"Lambda Triggers (LT)",id:"lambda-triggers-lt",level:3},{value:"Nodes",id:"nodes",level:2},{value:"Wild Sage Node (Wild Waggle Node)",id:"wild-sage-node-wild-waggle-node",level:3},{value:"Blade Nodes",id:"blade-nodes",level:3},{value:"Running plugins @ the Edge",id:"running-plugins--the-edge",level:2},{value:"Waggle Edge Stack (WES)",id:"waggle-edge-stack-wes",level:3},{value:"What is a plugin?",id:"what-is-a-plugin",level:3},{value:"Science Goals",id:"science-goals",level:3},{value:"LoRaWAN",id:"lorawan",level:2},{value:"What is LoRaWAN?",id:"what-is-lorawan",level:3},{value:"Chirpstack",id:"chirpstack",level:3},{value:"UDP Packet Forwarder",id:"udp-packet-forwarder",level:4},{value:"ChirpStack Gateway Bridge",id:"chirpstack-gateway-bridge",level:4},{value:"MQTT Broker",id:"mqtt-broker",level:4},{value:"ChirpStack Server",id:"chirpstack-server",level:4},{value:"Tracker",id:"tracker",level:3},{value:"Lorawan Listener Plugin",id:"lorawan-listener-plugin",level:3},{value:"Lorawan Device Profile Templates",id:"lorawan-device-profile-templates",level:3},{value:"Lorawan Device Compatibility",id:"lorawan-device-compatibility",level:3},{value:"Device Examples",id:"device-examples",level:4}];function d(e){const s={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,n.jsx)(s.p,{children:"The cyberinfrastructure consists of coordinating hardware and software services enabling AI at the edge. Below is a quick summary of the different infrastructure pieces, starting at the highest-level and zooming into each component to understand the relationships and role each plays."}),"\n",(0,n.jsx)(s.h2,{id:"high-level-infrastructure",children:"High-Level Infrastructure"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 1: High-level Node & Beehive Relationship",src:i(62463).A+"",width:"529",height:"423"})}),"\n",(0,n.jsx)(s.p,{children:"There are 2 main components of the cyberinfrastructure:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," that exist at the edge"]}),"\n",(0,n.jsxs)(s.li,{children:["The cloud that hosts services and storage systems to facilitate running ",(0,n.jsx)(s.a,{href:"#science-goals",children:"\u201cscience goals\u201d"})," @ the edge"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Every edge node maintains connections to 2 core cloud components: one to a ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"})," and one to a ",(0,n.jsx)(s.a,{href:"#beekeeper",children:"Beekeeper"})]}),"\n",(0,n.jsx)(s.h3,{id:"beekeeper",children:"Beekeeper"}),"\n",(0,n.jsx)(s.p,{children:'The Beekeeper is an administrative server that allows system administrators to perform actions on the nodes such as gather health metrics and perform software updates. All nodes "phone home" to their Beekeeper and maintain this "life-line" connection.'}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/beekeeper",children:"https://github.com/waggle-sensor/beekeeper"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"beehive",children:"Beehive"}),"\n",(0,n.jsxs)(s.p,{children:["The Node-to-Beehive connection is the pipeline for the science. It is over this connection that instructions for the node will be sent, in addition to how data is published into the Beehive storage systems from applications (",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),") running on the nodes."]}),"\n",(0,n.jsx)(s.p,{children:'The overall infrastructure supports multiple Beehives, where each node is associated with a single Beehive. The set of nodes associated with a Beehive creates a "project" where each "project" is separate, having its own data store, web services, etc.'}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 2: Multiple Beehives",src:i(46236).A+"",width:"598",height:"432"})}),"\n",(0,n.jsxs)(s.p,{children:["In the example above, there are 2 nodes associated with Beehive 1, while a single node is associated with Beehive 2. With all nodes, in this example, being administered by a single ",(0,n.jsx)(s.a,{href:"#beekeeper",children:"Beekeeper"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": the example above shows a single Beekeeper, but a second Beekeeper could have been used for administrative isolation."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-beehive-v2",children:"https://github.com/waggle-sensor/waggle-beehive-v2"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"beehive-infrastructure",children:"Beehive Infrastructure"}),"\n",(0,n.jsx)(s.p,{children:"Looking deeper into the Beehive infrastructure, it contains 2 main components:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["software services such as the ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler (ES)"}),", ",(0,n.jsx)(s.a,{href:"#lambda-triggers-lt",children:"Lambda Triggers (LT)"}),", data APIs, and websites/portals"]}),"\n",(0,n.jsxs)(s.li,{children:["data storage systems such as the ",(0,n.jsx)(s.a,{href:"#data-repository-dr",children:"Data Repository (DR)"})," and the ",(0,n.jsx)(s.a,{href:"#edge-code-repository-ecr",children:"Edge Code Repository (ECR)"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 3: Beehive High-level Architecture",src:i(36769).A+"",width:"521",height:"462"})}),"\n",(0,n.jsxs)(s.p,{children:["The Beehive is the \u201ccommand center\u201d for interacting with the Waggle nodes at the edge. Hosting websites and interfaces allowing scientists to create ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to run ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," at the edge & browse the data produced by those ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 4: Beehive Infrastructure Details",src:i(39429).A+"",width:"898",height:"482"})}),"\n",(0,n.jsxs)(s.p,{children:["The software services and data storage systems are deployed within a ",(0,n.jsx)(s.a,{href:"https://kubernetes.io/",children:"kubernetes"})," environment to allow for easy administration and to support running in a multiple server architecture, supporting redundancy and service replication."]}),"\n",(0,n.jsxs)(s.p,{children:["While the services running within Beehive are many (both graphical and ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Representational_state_transfer",children:"REST"})," style API interfaces), the following is an outline of the most vital."]}),"\n",(0,n.jsx)(s.h3,{id:"data-repository-dr",children:"Data Repository (DR)"}),"\n",(0,n.jsxs)(s.p,{children:["The Data Repository is the data store for housing all the edge produced ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," data. It consists of different storage technologies (i.e. ",(0,n.jsx)(s.a,{href:"https://www.influxdata.com/",children:"influxdb"}),") and techniques to store simple textual data (i.e. key-value pairs) in addition to large blobular data (i.e. audio, images, video). The Data Repository additionally has an API interface for easy access to this data."]}),"\n",(0,n.jsxs)(s.p,{children:["The data store is a time-series database of key-value pairs with each entry containing metadata about how and when the data originated @ the edge. Included in this metadata is the data collection timestamp, ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," version used to collect the data, the ",(0,n.jsx)(s.a,{href:"#nodes",children:"node"})," the ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," was run on, and the specific compute unit within the node that the ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," was running on."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-json",children:'{\n "timestamp":"2022-06-10T22:37:47.369013647Z",\n "name":"iio.in_temp_input",\n "value":25050,\n "meta":{\n "host":"0000dca632ed6d06.ws-rpi",\n "job":"sage",\n "node":"000048b02d35a97c",\n "plugin":"plugin-iio:0.6.0",\n "sensor":"bme680",\n "task":"iio-rpi",\n "vsn":"W08C"\n }\n}\n'})}),"\n",(0,n.jsxs)(s.p,{children:["In the above example, the value of ",(0,n.jsx)(s.code,{children:"25050"})," was collected @ ",(0,n.jsx)(s.code,{children:"2022-06-10T22:37:47.369013647Z"})," from the ",(0,n.jsx)(s.code,{children:"bme680"})," sensor on node ",(0,n.jsx)(s.code,{children:"000048b02d35a97c"})," via the ",(0,n.jsx)(s.code,{children:"plugin-iio:0.6.0"})," ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": see the ",(0,n.jsx)(s.a,{href:"/docs/tutorials/accessing-data",children:"Access and use data"})," site for more details and data access examples."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/data-repository",children:"https://github.com/waggle-sensor/data-repository"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"edge-scheduler-es",children:"Edge Scheduler (ES)"}),"\n",(0,n.jsxs)(s.p,{children:["The Edge Scheduler is defined as the suite of services running in Beehive that facilitate running ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," @ the edge. Included here are user interfaces and APIs for scientists to create and manage their ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),". The Edge Scheduler continuously analyzes node workloads against all the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to determine how the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," are deployed to the Beehive nodes. When it is determined that a node's ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," are to be updated, the Edge Scheduler interfaces with ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," running on those nodes to update the node's local copy of the ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),". Essentially, the Edge Scheduler is the overseer of all the Beehive's nodes, deploying ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"})," to them to meet the scientists ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," execution objectives."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edge-scheduler",children:"https://github.com/waggle-sensor/edge-scheduler"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"edge-code-repository-ecr",children:"Edge Code Repository (ECR)"}),"\n",(0,n.jsxs)(s.p,{children:['The Edge Code Repository is the "app store" that hosts all the tested and benchmarked edge ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," that can be deployed to the nodes. This is the interface allowing users to discover existing ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," (for potential inclusion in their ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goals"}),") in addition to submitting their own. At it's core, the ECR provides a verified and versioned repository of ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," ",(0,n.jsx)(s.a,{href:"https://www.docker.com",children:"Docker"})," images that are pulled by the nodes when a ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," is to be downloaded as run-time component of a ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goal"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edge-code-repository",children:"https://github.com/waggle-sensor/edge-code-repository"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"lambda-triggers-lt",children:"Lambda Triggers (LT)"}),"\n",(0,n.jsx)(s.p,{children:"The Lambda Triggers service provides a framework for running reactive code within the Beehive. There are two kinds of reaction triggers considered here: From-Edge and To-Edge."}),"\n",(0,n.jsx)(s.p,{children:"From-Edge triggers, or messages that originate from an edge node, can be used to trigger lambda functions -- for example, if high wind velocity is detected, a function could be triggered to determine how to reconfigure sensors or launch a computation or send an alert."}),"\n",(0,n.jsxs)(s.p,{children:["To-Edge triggers are messages that are to change a node's behavior. For example an HPC calculation or cloud-based data analysis could trigger an ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler"})," API call to request a ",(0,n.jsx)(s.a,{href:"#science-goals",children:"science goal"})," to be run on a particular set of edge nodes."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/lambda-triggers",children:"https://github.com/waggle-sensor/lambda-triggers"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"nodes",children:"Nodes"}),"\n",(0,n.jsx)(s.p,{children:"Nodes are the edge computing component of the cyberinfrastructure. All nodes consist of 3 items:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Persisent storage"})," for housing downloaded ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," and caching published data before it is transferred to the node's Beehive"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"CPU and GPU compute modules"})," where ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," are executed and perform the accelerated inferences"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Sensors"})," such as environment sensors, cameras and ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Lidar",children:"LiDAR systems"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 5: Node Overview",src:i(41068).A+"",width:"528",height:"335"})}),"\n",(0,n.jsx)(s.p,{children:'Edge nodes enable fast computation @ the edge, leveraging the large non-volatile storage to handle caching of high frequency data (including images, audio and video) in the event the node is "offline" from its Beehive. Through expansion ports the nodes support the adding and removing of sensors to fully customize the node deployments for the particular deployment environment.'}),"\n",(0,n.jsxs)(s.p,{children:["Overall, even though the nodes may use different CPU architectures and different sensor configurations, they all leverage the same ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"Waggle Edge Stack (WES)"})," to run ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"wild-sage-node-wild-waggle-node",children:"Wild Sage Node (Wild Waggle Node)"}),"\n",(0,n.jsxs)(s.p,{children:["The Wild Sage Node (or Wild Waggle Node) is a custom built weather-proof enclosure intended for remote outdoor installation. The node features software and hardware resilience via a ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wildnode-image",children:"custom operating system"})," and ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wagman",children:"custom circuit board"}),". Internal to the node is a power supply and PoE network switch supporting the addition of sensors through standard Ethernet (PoE), USB and other embedded protocols via the node expansion ports."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 6: Wild Sage/Waggle Node Overview",src:i(28291).A+"",width:"515",height:"401"})}),"\n",(0,n.jsx)(s.p,{children:"The technical capabilities of these nodes consists of:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["NVidia Xavier NX ARM64 ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/nodecontroller",children:"Node Controller"})," w/ 8GB of shared CPU/GPU RAM"]}),"\n",(0,n.jsx)(s.li,{children:"1 TB of NVMe storage"}),"\n",(0,n.jsx)(s.li,{children:"4x PoE expansion ports"}),"\n",(0,n.jsx)(s.li,{children:"1x USB2 expansion port"}),"\n",(0,n.jsxs)(s.li,{children:["optional ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Stevenson_screen",children:"Stevenson Shield"})," housing a RPi 4 w/ environmental sensors & microphone"]}),"\n",(0,n.jsxs)(s.li,{children:["optional 2nd NVidia Xavier NX ARM64 ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/edgeprocessor",children:"Edge Processor"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Node installation manual: ",(0,n.jsx)(s.a,{href:"/docs/installation-manuals/wsn-manual",children:"https://sagecontinuum.org/docs/installation-manuals/wsn-manual"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wild-waggle-node",children:"https://github.com/waggle-sensor/wild-waggle-node"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"blade-nodes",children:"Blade Nodes"}),"\n",(0,n.jsxs)(s.p,{children:["A Blade Node is a standard commercially available server intended for use in a climate controlled machine room, or extended temperature range telecom-grade blades for harsher environments. The ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/blade-image",children:"AMD64 based operating system"})," supports these types of nodes, enabling the services needed to support ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 7: Blade Node Overview",src:i(7471).A+"",width:"517",height:"390"})}),"\n",(0,n.jsx)(s.p,{children:"The above diagram shows the basic technical configuration of a Blade Node:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Multi-core ARM64"}),"\n",(0,n.jsx)(s.li,{children:"32GB of RAM"}),"\n",(0,n.jsx)(s.li,{children:"Dedicated NVida T4 GPU"}),"\n",(0,n.jsx)(s.li,{children:"1 TB of SSD storage"}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": it is possible to add the same optional ",(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Stevenson_screen",children:"Stevenson Shield"})," housing that is available to the ",(0,n.jsx)(s.a,{href:"#wild-sage-node-wild-waggle-node",children:"Wild Sage Nodes"})]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-blade",children:"https://github.com/waggle-sensor/waggle-blade"})]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"running-plugins--the-edge",children:"Running plugins @ the Edge"}),"\n",(0,n.jsxs)(s.p,{children:["Included in the Waggle operating systems are the core components necessary to enable running ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," @ the edge. At the heart of this is ",(0,n.jsx)(s.a,{href:"https://k3s.io/",children:"k3s"}),", which creates a protected & isolated run-time environment. This environment combined with the tools and services provided by ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," enable ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," access to the node's CPU, GPU, sensors and cameras."]}),"\n",(0,n.jsx)(s.h3,{id:"waggle-edge-stack-wes",children:"Waggle Edge Stack (WES)"}),"\n",(0,n.jsxs)(s.p,{children:["The Waggle Edge Stack is the set of core services running within the ",(0,n.jsx)(s.a,{href:"#nodes",children:"edge node's"})," ",(0,n.jsx)(s.a,{href:"https://k3s.io/",children:"k3s"})," run-time environment that supports all the features that ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," need to run on the Waggle nodes. The WES services coordinate with the core ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"})," services to download & run scheduled ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," (including load balancing) and facilitate uploading ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," published data to the Beehive ",(0,n.jsx)(s.a,{href:"#data-repository-dr",children:"data repository"}),". Through abstraction technologies and WES provided tools, ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," have access to sensor and camera data."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 8: Waggle Edge Stack Overview",src:i(53059).A+"",width:"636",height:"539"})}),"\n",(0,n.jsxs)(s.p,{children:["The above diagram demonstrates 2 ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),' running on a Waggle node. Plugin 1 ("neon-kafka") is an example ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),' that is running alongside Plugin 2 ("data-smooth"). In this example, "neon-kafka" (via the WES tools) is reading metrics from the node\'s sensors and then publishing that data within the WES run-time environment (internal to the node).\nAt the same time, the "data-smooth" ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"})," is subscribing to this data stream, performing some sort of inference and then publishing the inference results (via WES tools) to Beehive."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.em,{children:"Note"}),": see the ",(0,n.jsx)(s.a,{href:"/docs/category/edge-apps",children:"Edge apps"})," guide on how to create a Waggle ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugin"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Details & source code: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack",children:"https://github.com/waggle-sensor/waggle-edge-stack"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"what-is-a-plugin",children:"What is a plugin?"}),"\n",(0,n.jsxs)(s.p,{children:["Plugins are the user-developed modules that the cyberinfrastructure is designed around. At it's simplest definition a \"plugin\" is code that runs @ the edge to perform some task. That task may be simply collecting sample camera images or a complex inference combining sensor data and results published from other plugins. A plugin's code will interface with the edge node's sensor(s) and then publish resulting data via the tools provided by ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"}),". All developed plugins are hosted by the Beehive ",(0,n.jsx)(s.a,{href:"#edge-code-repository-ecr",children:"Edge Code Repository"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["See ",(0,n.jsx)(s.a,{href:"/docs/category/edge-apps",children:"how to create plugins"})," for details."]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"science-goals",children:"Science Goals"}),"\n",(0,n.jsxs)(s.p,{children:['A "science goal" is a rule-set for how and when ',(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," are run on edge nodes. These science goals are created by scientist to accomplish a science objective through the execution of ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," in a specific manner. Goals are created, in a human language, and managed within the Beehive ",(0,n.jsx)(s.a,{href:"#edge-scheduler-es",children:"Edge Scheduler"}),". It is then the cyberinfrastucture responsibility to deploy the science goals to the edge nodes and execute the goal's ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"}),". The ",(0,n.jsx)(s.a,{href:"/docs/tutorials/schedule-jobs",children:"tutorial"})," walks through running a science goal."]}),"\n",(0,n.jsx)(s.h2,{id:"lorawan",children:"LoRaWAN"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"The Waggle Edge Stack"})," includes the ",(0,n.jsx)(s.a,{href:"#chirpstack",children:"ChirpStack software stack"})," and other services to facilitate communication between ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," and LoRaWAN devices. This empowers ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," to effortlessly establish connections with wireless sensors, enabling your ",(0,n.jsx)(s.a,{href:"#what-is-a-plugin",children:"plugins"})," to seamlessly access and harness valuable data from these sensors."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["To get started using LoRaWAN, head over to the ",(0,n.jsx)(s.a,{href:"/docs/contact-us",children:"Contact Us"})," page. A tutorial will be available soon showing you how to get started with LoRaWAN."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Figure 9: WES Lorawan Architecture",src:i(201).A+"",width:"1084",height:"957"})}),"\n",(0,n.jsxs)(s.p,{children:["The above diagram demonstrates the hardware in ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," and services in ",(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," that enable ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"})," to use LoRaWAN and publish the measurements to a ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"}),". The following sections will explain each componenent and service."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"source code:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack/tree/main/kubernetes/wes-chirpstack",children:"wes-chirpstack"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-server",children:"wes-chirpstack-server"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/waggle-edge-stack/blob/main/kubernetes/wes-rabbitmq.yaml",children:"wes-rabbitmq"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-device-tracker",children:"Tracker"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://github.com/FranciscoLozCoding/plugin-lorawan-listener",children:"Lorawan Listener Plugin"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"what-is-lorawan",children:"What is LoRaWAN?"}),"\n",(0,n.jsxs)(s.p,{children:['LoRaWAN, short for "Long Range Wide Area Network," is a wireless communication protocol designed for low-power, long-range communication between IoT (Internet of Things) devices. It employs a low-power wide-area network (LPWAN) technology, making it ideal for connecting remote sensors and devices. For more information view the documentation ',(0,n.jsx)(s.a,{href:"https://www.thethingsnetwork.org/docs/lorawan/",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"chirpstack",children:"Chirpstack"}),"\n",(0,n.jsx)(s.p,{children:"ChirpStack is a robust and open-source LoRaWAN Network Server that enables efficient management of LoRaWAN devices, gateways, and data. Its architecture consists of several crucial components, each serving a distinct role in LoRaWAN network operations. Below, we provide a brief overview of these components along with links to ChirpStack documentation for further insights."}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/index.html",children:"Chirpstack documentation"})}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"udp-packet-forwarder",children:"UDP Packet Forwarder"}),"\n",(0,n.jsxs)(s.p,{children:["The UDP Packet Forwarder is an essential component that acts as a bridge between LoRa gateways and the ",(0,n.jsx)(s.a,{href:"#chirpstack-server",children:"ChirpStack Network Server"}),". It receives incoming packets from LoRa gateways and forwards them to the ",(0,n.jsx)(s.a,{href:"#chirpstack-gateway-bridge",children:"ChirpStack Gateway Bridge"})," for further processing. To learn more about the UDP Packet Forwarder, refer to the documentation ",(0,n.jsx)(s.a,{href:"https://github.com/RAKWireless/udp-packet-forwarder",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"chirpstack-gateway-bridge",children:"ChirpStack Gateway Bridge"}),"\n",(0,n.jsxs)(s.p,{children:["The ChirpStack Gateway Bridge is responsible for translating gateway-specific protocols into a standard format for the ",(0,n.jsx)(s.a,{href:"#chirpstack-server",children:"ChirpStack Network Server"}),". It connects to a ",(0,n.jsx)(s.a,{href:"#udp-packet-forwarder",children:"UDP Packet Forwader"}),", ensuring that data is properly formatted and can be seamlessly processed by the network server. For in-depth information on the ChirpStack Gateway Bridge, explore the documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack-gateway-bridge/index.html",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"mqtt-broker",children:"MQTT Broker"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"#waggle-edge-stack-wes",children:"WES"})," includes a MQTT (Message Queuing Telemetry Transport) broker to handle communication between various services. MQTT provides a lightweight and efficient messaging system. This service ensures that data flows smoothly between the network server, gateways, and applications. You can find detailed information about the MQTT broker integration in the ChirpStack documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/integrations/mqtt.html",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"chirpstack-server",children:"ChirpStack Server"}),"\n",(0,n.jsxs)(s.p,{children:["The ChirpStack Server serves as the core component, managing device sessions, data, and application integrations. It utilizes ",(0,n.jsx)(s.a,{href:"https://redis.io/",children:"Redis"})," for device sessions, metrics, and caching, ensuring efficient data handling and retrieval. For persistent data storage, ChirpStack uses ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"}),", accommodating records for tenants, applications, devices, and more. For a comprehensive understanding of the ChirpStack Server and its associated database technologies, consult the ChirpStack documentation ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/requirements.html",children:"here"}),"."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"NOTE: Chirpstack v4 combined the application and network server into one component."}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"tracker",children:"Tracker"}),"\n",(0,n.jsxs)(s.p,{children:["The Tracker is a service designed to record the connectivity of LoRaWAN devices to the ",(0,n.jsx)(s.a,{href:"#nodes",children:"Nodes"}),". This service uses the information received from the ",(0,n.jsx)(s.a,{href:"#mqtt-broker",children:"MQTT broker"})," to call ",(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/api/grpc.html",children:"ChirpStack's gRPC API"}),". The information received from the API is then used to keep the Node's manifest up-to-date. Subsequently, it forwards this updated manifest to the ",(0,n.jsx)(s.a,{href:"#beehive",children:"Beehive"}),". For more information, view the documentation ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-chirpstack-device-tracker",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"lorawan-listener-plugin",children:"Lorawan Listener Plugin"}),"\n",(0,n.jsxs)(s.p,{children:["The LoRaWAN Listener is a plugin designed to publish measurements collected from LoRaWAN devices. It simplifies the process of extracting and publishing valuable data from these devices. For more information about the plugin view the plugin page ",(0,n.jsx)(s.a,{href:"https://portal.sagecontinuum.org/apps/app/flozano/lorawan-listener",children:"here"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"lorawan-device-profile-templates",children:"Lorawan Device Profile Templates"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://www.chirpstack.io/docs/chirpstack/use/device-profile-templates.html#device-profile-templates",children:"Device Profile Templates"})," simplify the process of onboarding devices to a Node's ChirpStack server. You can create a device template directly through the Node's ChirpStack server UI or by contributing to our ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-lorawan-device-templates?tab=readme-ov-file#waggle-device-repository-for-lorawan",children:"Device Repository"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"The Device Repository is a key resource that contains information about various LoRaWAN end devices, making it easier to catalog and onboard these devices to our Nodes' ChirpStack servers. We encourage you to contribute details about your devices to help other Sage users efficiently connect their devices. Once your device is added to our repository, it becomes available across all Nodes, streamlining the workflow for anyone who wants to connect a similar Lorawan device to a Node."}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"NOTE: Node's sync with our Device Repository every hour."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"If you prefer to keep your device configuration private, you can still add it directly to a Node's ChirpStack server using the UI. In this case, the configuration will remain exclusive to that particular Node."}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["For more information and tutorials on how to add a device, visit: ",(0,n.jsx)(s.a,{href:"https://github.com/waggle-sensor/wes-lorawan-device-templates?tab=readme-ov-file#waggle-device-repository-for-lorawan",children:"wes-lorawan-device-templates"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"lorawan-device-compatibility",children:"Lorawan Device Compatibility"}),"\n",(0,n.jsx)(s.p,{children:"The Wild Sage Node is designed to support a wide range of Lorawan devices, ensuring flexibility and adaptability for various applications. If you are wondering which Lorawan devices can be connected to a Wild Sage Node, the device must have the following tech specs:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"designed for US915 (902\u2013928 MHz) frequency region."}),"\n",(0,n.jsx)(s.li,{children:"compatible with Lorawan Mac versions 1.0.0 - 1.1.0"}),"\n",(0,n.jsx)(s.li,{children:"compatible with Chirpstack's Lorawan Network Server"}),"\n",(0,n.jsx)(s.li,{children:"The device supports Over-The-Air Activation (OTAA) or Activation By Personalization (ABP)"}),"\n",(0,n.jsx)(s.li,{children:"The device has a Lorawan device class of A, B, or C"}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["It is important to note that all channels within the US915 frequency band are enabled in a Wild Sage Node. If you wish to learn more about our Lorawan Gateway, please visit our ",(0,n.jsx)(s.a,{href:"https://portal.sagecontinuum.org/sensors/",children:"portal"}),". For inquiries about supporting Lorawan regions other than US915, please ",(0,n.jsx)(s.a,{href:"/docs/contact-us",children:"Contact Us"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"device-examples",children:"Device Examples"}),"\n",(0,n.jsx)(s.p,{children:"Whether you are designing your own Lorawan sensor, looking for a Lorawan data logger, or seeking an off-the-shelf Lorawan device the Wild Sage Node will support it, we have examples for you:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Designing your own Lorawan sensor?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://docs.arduino.cc/hardware/mkr-wan-1310/",children:"Arduino MKR WAN 1310"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Looking for a Lorawan data logger?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/product/mfr-node/",children:"ICT International MFR Node"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Looking for an off-the-shelf Lorawan device?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/product/sfm1x-sap-flow-meter/",children:"ICT International SFM1X Sap Flow Meter"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Seeking Lorawan device manufacturers?"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ictinternational.com/",children:"ICT International"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.rakwireless.com/en-us",children:"RAKwireless"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.thethingsnetwork.org/marketplace/products/devices",children:"The Things Network Device Marketplace"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.decentlab.com",children:"DecentLab"})}),"\n"]}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46236:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_beehives_01-b8018d2fcb011afe51840fc080dac4dc.svg"},62463:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_high_01-770507cc9c88a2a5ec6125510fb8e527.svg"},201:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/arch_wes_lorawan-9d39a09465f42b074eb5ca016837543d.svg"},39429:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/beehive_details_01-17afa73f2d666b43d21ba820c0423888.svg"},36769:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/beehive_high_01-22e4d3a5822b0072fe6573674d3c109e.svg"},7471:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_blade_01-60cda8bc9c4d201ab4ee6876b4f4c67c.svg"},41068:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_overview_01-98f28b1ff8c7610992042d1d2c719127.svg"},28291:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/node_wild_01-addd18fb19d07c36aaec6ffe2187a064.svg"},53059:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/wes_overview_01-9559b1c3f53314fa18388e193870a589.svg"},28453:(e,s,i)=>{i.d(s,{R:()=>t,x:()=>o});var n=i(96540);const a={},r=n.createContext(a);function t(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.fdc5a1d2.js b/assets/js/runtime~main.8e68a1c2.js similarity index 99% rename from assets/js/runtime~main.fdc5a1d2.js rename to assets/js/runtime~main.8e68a1c2.js index 3b1b1ccd..55a9d5fd 100644 --- a/assets/js/runtime~main.fdc5a1d2.js +++ b/assets/js/runtime~main.8e68a1c2.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;iThe LoRaWAN Listener is a plugin designed to publish measurements collected from LoRaWAN devices. It simplifies the process of extracting and publishing valuable data from these devices. For more information about the plugin view the plugin page here.
+Device Profile Templates simplify the process of onboarding devices to a Node's ChirpStack server. You can create a device template directly through the Node's ChirpStack server UI or by contributing to our Device Repository.
+The Device Repository is a key resource that contains information about various LoRaWAN end devices, making it easier to catalog and onboard these devices to our Nodes' ChirpStack servers. We encourage you to contribute details about your devices to help other Sage users efficiently connect their devices. Once your device is added to our repository, it becomes available across all Nodes, streamlining the workflow for anyone who wants to connect a similar Lorawan device to a Node.
+++NOTE: Node's sync with our Device Repository every hour.
+
If you prefer to keep your device configuration private, you can still add it directly to a Node's ChirpStack server using the UI. In this case, the configuration will remain exclusive to that particular Node.
++For more information and tutorials on how to add a device, visit: wes-lorawan-device-templates
+
The Wild Sage Node is designed to support a wide range of Lorawan devices, ensuring flexibility and adaptability for various applications. If you are wondering which Lorawan devices can be connected to a Wild Sage Node, the device must have the following tech specs: