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;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({25:"fb04c5f8",158:"15b8db1d",238:"4d20d142",239:"56a042a3",244:"3b444901",248:"48387199",335:"d87bb81f",365:"9506522a",399:"302997c3",447:"ff44a3dd",490:"bc9cc23f",512:"77ef4bf8",574:"77c72e86",630:"9ef30e72",674:"33cda08e",685:"2fc3947b",849:"0058b4c6",871:"7b10631b",879:"694b2bb3",886:"b103dc15",957:"c141421f",1112:"0c394251",1232:"e7b70caf",1235:"a7456010",1261:"50caf296",1446:"98b73f40",1467:"0fea8c8c",1535:"78cb671d",1565:"c78e3c18",1582:"9a2b66e8",1741:"07bb81ca",1903:"acecf23e",1949:"6a3e2bcd",1983:"49a9e3d3",2037:"f65b1080",2113:"2bc90abe",2136:"d6221d4b",2138:"1a4e3797",2275:"92c6dd73",2331:"49e63881",2351:"32395893",2372:"3ce58a02",2388:"14ada109",2473:"f971ad82",2599:"e007d0d8",2616:"a2266736",2634:"c4f5d8e4",2711:"9e4087bc",2739:"ad6f2ffe",2750:"356a0ac6",2797:"00cb80af",2864:"c22ba043",2873:"afe8e388",2896:"8bbeff0f",2911:"2ed4807b",2949:"30f10d3a",2966:"8f126303",2969:"253e4fa8",3002:"5a4cdc6e",3060:"5c7fd325",3226:"29507a56",3229:"c5f475dd",3249:"ccc49370",3261:"e90c7cb3",3304:"de5b098f",3358:"bc7d65d2",3491:"fc8a030c",3533:"863dbe6d",3555:"16263e70",3647:"e8ca30a9",3745:"e02322d8",3800:"e11fbcf3",3806:"04b7d215",3885:"a2e03ed8",3898:"a409cb53",3977:"f1675f6c",4008:"7a61e263",4072:"0a86fa65",4146:"1aaa1f8d",4212:"621db11d",4258:"569e2945",4299:"7dd88c9a",4403:"00611c18",4408:"99683b3e",4457:"c5dab4e6",4476:"e60bd62d",4512:"a5ce6f4a",4568:"f53283f6",4598:"ab882b2b",4687:"41755e58",4727:"4cbc9fed",4728:"0ed86790",4808:"9acdd949",4813:"6875c492",4876:"7d0dfabc",4878:"25166c59",5016:"9dae1980",5074:"3222d899",5114:"f8579c65",5123:"ed7470a0",5137:"2b55bd02",5177:"1c69de2b",5209:"a004523e",5320:"11c28767",5344:"45b23340",5350:"92284fa3",5456:"6a5408b1",5509:"f0fee398",5538:"1371063b",5564:"8d98164e",5566:"351e4335",5570:"868371a7",5648:"8e9e695d",5668:"eb26b66d",5671:"20cfc2e9",5707:"c531e4b5",5725:"54032f9e",5742:"aba21aa0",5744:"df077461",5747:"8b11a1f4",5881:"986ad158",5892:"6fed1847",6018:"6f441bd0",6022:"2536ec16",6061:"1f391b9e",6170:"72fe76db",6181:"b2dbac66",6205:"4fec5050",6284:"9f6aeda5",6393:"168e44ea",6438:"c895377a",6440:"366460c9",6567:"73747a1d",6620:"9eff10b4",6715:"0b590444",6831:"37c1090c",6833:"266d3809",6855:"4908e7cd",6889:"89bf0775",6969:"14eb3368",6982:"01e7ac17",7098:"a7bd4aaa",7123:"ffd75945",7169:"7c0fb017",7206:"9a3a9509",7291:"12704d84",7309:"08f08699",7325:"1f1ca1a6",7415:"234d405f",7424:"e625af6f",7448:"d4ef1874",7459:"243318f9",7472:"814f3328",7531:"e0383bde",7566:"6b0e8c2a",7576:"4d11ad11",7583:"c0ca9709",7594:"83b70cff",7630:"c2179a88",7643:"a6aa9e1f",7717:"ccc8c81c",7778:"6f3afeb4",7874:"668f3370",7932:"e4746366",7996:"433a143f",8209:"01a85c17",8263:"5082620e",8352:"03c3795e",8401:"17896441",8469:"3641ab0a",8610:"9d9933db",8618:"0bed28db",8663:"e340f87c",8713:"0ac5bc6d",8761:"163d40f8",8800:"39c7ee4c",8816:"9346c581",8866:"f0ecaaaf",8870:"511f635d",8945:"d410bd6e",9048:"a94703ab",9055:"43934b96",9202:"9616cc7b",9241:"5179f778",9255:"bede496a",9288:"81af8ad2",9329:"309c6dc0",9408:"99ec1860",9436:"22d60706",9494:"b0960fff",9583:"76e8c21d",9647:"5e95c892",9650:"15274cd5",9695:"b6db9be8",9719:"289afbf6",9746:"633019cf",9751:"18b54ca4",9770:"2d278ceb",9780:"b636172f",9858:"36994c47",9962:"5b252531",9987:"cd743373",9996:"9a4c6ce8"}[e]||e)+"."+{25:"45dd3a8c",158:"1ea8dab6",238:"90f8a71a",239:"81e5758b",244:"faf28f4d",248:"71a663dd",335:"89b709b7",365:"b36f26f9",399:"d3dfb599",416:"e7341c55",447:"669d0ffa",490:"79322593",512:"95e85eab",574:"1f3b14ee",630:"698438cb",674:"087b3133",685:"343b3df7",849:"9787fd68",871:"b6aecc4d",879:"a30e05f7",886:"857c76a2",957:"20aed668",1112:"446e3cf7",1232:"14b83720",1235:"f7c5b0ac",1261:"9b91db0b",1446:"13cfe6c4",1467:"7e0a1563",1535:"6fd556a8",1565:"2a7c7959",1582:"79b9ca47",1741:"e0deef62",1903:"80ff0304",1949:"cc474570",1983:"7ff54bbd",2037:"583014e9",2113:"a263e5ae",2136:"413b5565",2138:"71d8fd44",2237:"92123452",2275:"aab7ee5f",2331:"d55ceee1",2351:"bdd157fc",2372:"4057b9d0",2388:"afb0dc87",2473:"e0dbddea",2599:"e6014b30",2614:"a440f58e",2616:"0d026bd6",2634:"c8eae864",2711:"15cb620a",2739:"28c4e6c9",2750:"784a4d3b",2797:"3138bb63",2864:"6735d60a",2873:"af7b794e",2896:"547bd35b",2911:"d6da3e16",2949:"1f9e73a1",2966:"06a63900",2969:"96ccd4da",3002:"cacd0aa5",3060:"d6950690",3226:"aea04644",3229:"add69568",3249:"cd45f27a",3261:"f9274b70",3304:"cf910ead",3358:"9905b66a",3491:"dcccc34d",3533:"ec7310a9",3555:"0b3a6aea",3647:"2f4411f4",3745:"3b7b2e71",3800:"9eaeddbc",3806:"8f993650",3885:"10196c27",3898:"296cce7c",3977:"e401e584",4008:"f656256e",4072:"b8562c8c",4090:"a5d746c9",4146:"f06c3760",4212:"a921fdfe",4258:"594dde3a",4299:"9ef4c4d8",4403:"b47e5c90",4408:"d7d492d8",4457:"7443d831",4476:"1956c501",4512:"7d81beea",4568:"2b766b1e",4598:"40d45338",4687:"e5117944",4727:"06867142",4728:"b7ba47c7",4808:"a57db9e9",4813:"7198c086",4876:"a288c0d5",4878:"a1544626",5016:"633e8234",5074:"71f6058d",5114:"82467468",5123:"7de09517",5137:"44bc2f9f",5177:"edc35978",5209:"34c5f1e7",5320:"d10c8601",5344:"bd8b7861",5350:"fa5106b8",5456:"94bfe8f8",5509:"184cd2a0",5538:"02c74440",5564:"b2d5f2b1",5566:"c84c3e23",5570:"713a99ef",5648:"7b748a35",5668:"b14c85b1",5671:"2f332654",5707:"98b5fcdb",5725:"06bbb516",5742:"6faccddd",5744:"b7e1e0a8",5747:"c78bc542",5881:"bffe210e",5892:"eacd9089",6018:"2eb03f71",6022:"3df3a780",6061:"bf51ebf3",6170:"305127fc",6181:"bdcf2c93",6205:"eb60757a",6284:"bd84cecf",6393:"ef58db60",6438:"57460c3a",6440:"15a4ffdd",6567:"4e8a9a26",6620:"dbe826dd",6715:"901219f7",6831:"3b20d6c1",6833:"5111ce40",6855:"1718649d",6889:"f284ccde",6969:"89441016",6982:"fb20f9c5",7098:"edf50fa9",7123:"f1a74b01",7169:"b0f3d8a2",7206:"f4a1c7d9",7291:"468cd77a",7309:"d13739aa",7325:"44526709",7415:"e3182838",7424:"a2163d9a",7448:"a93dc92a",7459:"2532db2a",7472:"6f79cd0d",7531:"e5227b84",7566:"645cf8b5",7576:"18680cf7",7583:"cefa632d",7594:"285aaf95",7630:"e6721159",7643:"ef34dfc7",7717:"27ca72b7",7778:"482f9705",7874:"1cffaab8",7932:"58df20a1",7996:"c950be55",8209:"23029042",8263:"5b364667",8352:"9f11952f",8401:"de450099",8469:"69de8e89",8498:"29cd9a85",8610:"715ba79f",8618:"9a535e28",8663:"06aa20ef",8713:"44489f01",8761:"c75eaf74",8800:"566069b3",8816:"8b5a3024",8866:"6b17be56",8870:"72090d99",8913:"c5f3c170",8945:"e1dd2823",9048:"47b4b973",9055:"90360b64",9202:"0d10207a",9241:"658e7f8b",9255:"6e2d97aa",9288:"8f852b2a",9329:"5f120f5c",9408:"2c274db6",9436:"6852bd0a",9462:"1ff6d9b5",9494:"b94da526",9583:"5e862e18",9647:"5b9df456",9650:"a14f69c2",9695:"0da9633f",9719:"7a66de4e",9746:"dcb0a42d",9751:"e5ed7cdf",9770:"a671742e",9780:"9f3676ad",9858:"c0ef6108",9962:"a96fdd66",9987:"814376fb",9996:"e6d2b203"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="my-website:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"8401",32395893:"2351",48387199:"248",fb04c5f8:"25","15b8db1d":"158","4d20d142":"238","56a042a3":"239","3b444901":"244",d87bb81f:"335","9506522a":"365","302997c3":"399",ff44a3dd:"447",bc9cc23f:"490","77ef4bf8":"512","77c72e86":"574","9ef30e72":"630","33cda08e":"674","2fc3947b":"685","0058b4c6":"849","7b10631b":"871","694b2bb3":"879",b103dc15:"886",c141421f:"957","0c394251":"1112",e7b70caf:"1232",a7456010:"1235","50caf296":"1261","98b73f40":"1446","0fea8c8c":"1467","78cb671d":"1535",c78e3c18:"1565","9a2b66e8":"1582","07bb81ca":"1741",acecf23e:"1903","6a3e2bcd":"1949","49a9e3d3":"1983",f65b1080:"2037","2bc90abe":"2113",d6221d4b:"2136","1a4e3797":"2138","92c6dd73":"2275","49e63881":"2331","3ce58a02":"2372","14ada109":"2388",f971ad82:"2473",e007d0d8:"2599",a2266736:"2616",c4f5d8e4:"2634","9e4087bc":"2711",ad6f2ffe:"2739","356a0ac6":"2750","00cb80af":"2797",c22ba043:"2864",afe8e388:"2873","8bbeff0f":"2896","2ed4807b":"2911","30f10d3a":"2949","8f126303":"2966","253e4fa8":"2969","5a4cdc6e":"3002","5c7fd325":"3060","29507a56":"3226",c5f475dd:"3229",ccc49370:"3249",e90c7cb3:"3261",de5b098f:"3304",bc7d65d2:"3358",fc8a030c:"3491","863dbe6d":"3533","16263e70":"3555",e8ca30a9:"3647",e02322d8:"3745",e11fbcf3:"3800","04b7d215":"3806",a2e03ed8:"3885",a409cb53:"3898",f1675f6c:"3977","7a61e263":"4008","0a86fa65":"4072","1aaa1f8d":"4146","621db11d":"4212","569e2945":"4258","7dd88c9a":"4299","00611c18":"4403","99683b3e":"4408",c5dab4e6:"4457",e60bd62d:"4476",a5ce6f4a:"4512",f53283f6:"4568",ab882b2b:"4598","41755e58":"4687","4cbc9fed":"4727","0ed86790":"4728","9acdd949":"4808","6875c492":"4813","7d0dfabc":"4876","25166c59":"4878","9dae1980":"5016","3222d899":"5074",f8579c65:"5114",ed7470a0:"5123","2b55bd02":"5137","1c69de2b":"5177",a004523e:"5209","11c28767":"5320","45b23340":"5344","92284fa3":"5350","6a5408b1":"5456",f0fee398:"5509","1371063b":"5538","8d98164e":"5564","351e4335":"5566","868371a7":"5570","8e9e695d":"5648",eb26b66d:"5668","20cfc2e9":"5671",c531e4b5:"5707","54032f9e":"5725",aba21aa0:"5742",df077461:"5744","8b11a1f4":"5747","986ad158":"5881","6fed1847":"5892","6f441bd0":"6018","2536ec16":"6022","1f391b9e":"6061","72fe76db":"6170",b2dbac66:"6181","4fec5050":"6205","9f6aeda5":"6284","168e44ea":"6393",c895377a:"6438","366460c9":"6440","73747a1d":"6567","9eff10b4":"6620","0b590444":"6715","37c1090c":"6831","266d3809":"6833","4908e7cd":"6855","89bf0775":"6889","14eb3368":"6969","01e7ac17":"6982",a7bd4aaa:"7098",ffd75945:"7123","7c0fb017":"7169","9a3a9509":"7206","12704d84":"7291","08f08699":"7309","1f1ca1a6":"7325","234d405f":"7415",e625af6f:"7424",d4ef1874:"7448","243318f9":"7459","814f3328":"7472",e0383bde:"7531","6b0e8c2a":"7566","4d11ad11":"7576",c0ca9709:"7583","83b70cff":"7594",c2179a88:"7630",a6aa9e1f:"7643",ccc8c81c:"7717","6f3afeb4":"7778","668f3370":"7874",e4746366:"7932","433a143f":"7996","01a85c17":"8209","5082620e":"8263","03c3795e":"8352","3641ab0a":"8469","9d9933db":"8610","0bed28db":"8618",e340f87c:"8663","0ac5bc6d":"8713","163d40f8":"8761","39c7ee4c":"8800","9346c581":"8816",f0ecaaaf:"8866","511f635d":"8870",d410bd6e:"8945",a94703ab:"9048","43934b96":"9055","9616cc7b":"9202","5179f778":"9241",bede496a:"9255","81af8ad2":"9288","309c6dc0":"9329","99ec1860":"9408","22d60706":"9436",b0960fff:"9494","76e8c21d":"9583","5e95c892":"9647","15274cd5":"9650",b6db9be8:"9695","289afbf6":"9719","633019cf":"9746","18b54ca4":"9751","2d278ceb":"9770",b636172f:"9780","36994c47":"9858","5b252531":"9962",cd743373:"9987","9a4c6ce8":"9996"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"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;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({25:"fb04c5f8",158:"15b8db1d",238:"4d20d142",239:"56a042a3",244:"3b444901",248:"48387199",335:"d87bb81f",365:"9506522a",399:"302997c3",447:"ff44a3dd",490:"bc9cc23f",512:"77ef4bf8",574:"77c72e86",630:"9ef30e72",674:"33cda08e",685:"2fc3947b",849:"0058b4c6",871:"7b10631b",879:"694b2bb3",886:"b103dc15",957:"c141421f",1112:"0c394251",1232:"e7b70caf",1235:"a7456010",1261:"50caf296",1446:"98b73f40",1467:"0fea8c8c",1535:"78cb671d",1565:"c78e3c18",1582:"9a2b66e8",1741:"07bb81ca",1903:"acecf23e",1949:"6a3e2bcd",1983:"49a9e3d3",2037:"f65b1080",2113:"2bc90abe",2136:"d6221d4b",2138:"1a4e3797",2275:"92c6dd73",2331:"49e63881",2351:"32395893",2372:"3ce58a02",2388:"14ada109",2473:"f971ad82",2599:"e007d0d8",2616:"a2266736",2634:"c4f5d8e4",2711:"9e4087bc",2739:"ad6f2ffe",2750:"356a0ac6",2797:"00cb80af",2864:"c22ba043",2873:"afe8e388",2896:"8bbeff0f",2911:"2ed4807b",2949:"30f10d3a",2966:"8f126303",2969:"253e4fa8",3002:"5a4cdc6e",3060:"5c7fd325",3226:"29507a56",3229:"c5f475dd",3249:"ccc49370",3261:"e90c7cb3",3304:"de5b098f",3358:"bc7d65d2",3491:"fc8a030c",3533:"863dbe6d",3555:"16263e70",3647:"e8ca30a9",3745:"e02322d8",3800:"e11fbcf3",3806:"04b7d215",3885:"a2e03ed8",3898:"a409cb53",3977:"f1675f6c",4008:"7a61e263",4072:"0a86fa65",4146:"1aaa1f8d",4212:"621db11d",4258:"569e2945",4299:"7dd88c9a",4403:"00611c18",4408:"99683b3e",4457:"c5dab4e6",4476:"e60bd62d",4512:"a5ce6f4a",4568:"f53283f6",4598:"ab882b2b",4687:"41755e58",4727:"4cbc9fed",4728:"0ed86790",4808:"9acdd949",4813:"6875c492",4876:"7d0dfabc",4878:"25166c59",5016:"9dae1980",5074:"3222d899",5114:"f8579c65",5123:"ed7470a0",5137:"2b55bd02",5177:"1c69de2b",5209:"a004523e",5320:"11c28767",5344:"45b23340",5350:"92284fa3",5456:"6a5408b1",5509:"f0fee398",5538:"1371063b",5564:"8d98164e",5566:"351e4335",5570:"868371a7",5648:"8e9e695d",5668:"eb26b66d",5671:"20cfc2e9",5707:"c531e4b5",5725:"54032f9e",5742:"aba21aa0",5744:"df077461",5747:"8b11a1f4",5881:"986ad158",5892:"6fed1847",6018:"6f441bd0",6022:"2536ec16",6061:"1f391b9e",6170:"72fe76db",6181:"b2dbac66",6205:"4fec5050",6284:"9f6aeda5",6393:"168e44ea",6438:"c895377a",6440:"366460c9",6567:"73747a1d",6620:"9eff10b4",6715:"0b590444",6831:"37c1090c",6833:"266d3809",6855:"4908e7cd",6889:"89bf0775",6969:"14eb3368",6982:"01e7ac17",7098:"a7bd4aaa",7123:"ffd75945",7169:"7c0fb017",7206:"9a3a9509",7291:"12704d84",7309:"08f08699",7325:"1f1ca1a6",7415:"234d405f",7424:"e625af6f",7448:"d4ef1874",7459:"243318f9",7472:"814f3328",7531:"e0383bde",7566:"6b0e8c2a",7576:"4d11ad11",7583:"c0ca9709",7594:"83b70cff",7630:"c2179a88",7643:"a6aa9e1f",7717:"ccc8c81c",7778:"6f3afeb4",7874:"668f3370",7932:"e4746366",7996:"433a143f",8209:"01a85c17",8263:"5082620e",8352:"03c3795e",8401:"17896441",8469:"3641ab0a",8610:"9d9933db",8618:"0bed28db",8663:"e340f87c",8713:"0ac5bc6d",8761:"163d40f8",8800:"39c7ee4c",8816:"9346c581",8866:"f0ecaaaf",8870:"511f635d",8945:"d410bd6e",9048:"a94703ab",9055:"43934b96",9202:"9616cc7b",9241:"5179f778",9255:"bede496a",9288:"81af8ad2",9329:"309c6dc0",9408:"99ec1860",9436:"22d60706",9494:"b0960fff",9583:"76e8c21d",9647:"5e95c892",9650:"15274cd5",9695:"b6db9be8",9719:"289afbf6",9746:"633019cf",9751:"18b54ca4",9770:"2d278ceb",9780:"b636172f",9858:"36994c47",9962:"5b252531",9987:"cd743373",9996:"9a4c6ce8"}[e]||e)+"."+{25:"45dd3a8c",158:"1ea8dab6",238:"90f8a71a",239:"81e5758b",244:"faf28f4d",248:"71a663dd",335:"89b709b7",365:"b36f26f9",399:"d3dfb599",416:"e7341c55",447:"669d0ffa",490:"79322593",512:"95e85eab",574:"1f3b14ee",630:"698438cb",674:"087b3133",685:"343b3df7",849:"9787fd68",871:"b6aecc4d",879:"a30e05f7",886:"857c76a2",957:"20aed668",1112:"446e3cf7",1232:"14b83720",1235:"f7c5b0ac",1261:"9b91db0b",1446:"13cfe6c4",1467:"7e0a1563",1535:"6fd556a8",1565:"2a7c7959",1582:"79b9ca47",1741:"e0deef62",1903:"80ff0304",1949:"cc474570",1983:"7ff54bbd",2037:"583014e9",2113:"a263e5ae",2136:"413b5565",2138:"71d8fd44",2237:"92123452",2275:"aab7ee5f",2331:"d55ceee1",2351:"bdd157fc",2372:"4057b9d0",2388:"afb0dc87",2473:"e0dbddea",2599:"e6014b30",2614:"a440f58e",2616:"0d026bd6",2634:"c8eae864",2711:"15cb620a",2739:"28c4e6c9",2750:"784a4d3b",2797:"3138bb63",2864:"6735d60a",2873:"af7b794e",2896:"547bd35b",2911:"d6da3e16",2949:"1f9e73a1",2966:"06a63900",2969:"96ccd4da",3002:"cacd0aa5",3060:"d6950690",3226:"aea04644",3229:"add69568",3249:"cd45f27a",3261:"f9274b70",3304:"cf910ead",3358:"9905b66a",3491:"dcccc34d",3533:"ec7310a9",3555:"0b3a6aea",3647:"2f4411f4",3745:"3b7b2e71",3800:"9eaeddbc",3806:"8f993650",3885:"10196c27",3898:"296cce7c",3977:"e401e584",4008:"f656256e",4072:"b8562c8c",4090:"a5d746c9",4146:"f06c3760",4212:"a921fdfe",4258:"594dde3a",4299:"9ef4c4d8",4403:"b47e5c90",4408:"d7d492d8",4457:"7443d831",4476:"1956c501",4512:"7d81beea",4568:"2b766b1e",4598:"40d45338",4687:"e5117944",4727:"06867142",4728:"b7ba47c7",4808:"a57db9e9",4813:"7198c086",4876:"a288c0d5",4878:"a1544626",5016:"633e8234",5074:"71f6058d",5114:"82467468",5123:"7de09517",5137:"44bc2f9f",5177:"edc35978",5209:"34c5f1e7",5320:"d10c8601",5344:"bd8b7861",5350:"fa5106b8",5456:"94bfe8f8",5509:"184cd2a0",5538:"02c74440",5564:"b2d5f2b1",5566:"c84c3e23",5570:"713a99ef",5648:"7b748a35",5668:"b14c85b1",5671:"2f332654",5707:"98b5fcdb",5725:"06bbb516",5742:"6faccddd",5744:"b7e1e0a8",5747:"c78bc542",5881:"bffe210e",5892:"eacd9089",6018:"2eb03f71",6022:"3df3a780",6061:"bf51ebf3",6170:"305127fc",6181:"bdcf2c93",6205:"eb60757a",6284:"bd84cecf",6393:"ef58db60",6438:"57460c3a",6440:"15a4ffdd",6567:"4e8a9a26",6620:"dbe826dd",6715:"901219f7",6831:"3b20d6c1",6833:"5111ce40",6855:"1718649d",6889:"f284ccde",6969:"89441016",6982:"fb20f9c5",7098:"edf50fa9",7123:"f1a74b01",7169:"b0f3d8a2",7206:"f4a1c7d9",7291:"468cd77a",7309:"d13739aa",7325:"b057c692",7415:"e3182838",7424:"a2163d9a",7448:"a93dc92a",7459:"2532db2a",7472:"6f79cd0d",7531:"e5227b84",7566:"645cf8b5",7576:"18680cf7",7583:"cefa632d",7594:"285aaf95",7630:"e6721159",7643:"ef34dfc7",7717:"27ca72b7",7778:"482f9705",7874:"1cffaab8",7932:"58df20a1",7996:"c950be55",8209:"23029042",8263:"5b364667",8352:"9f11952f",8401:"de450099",8469:"69de8e89",8498:"29cd9a85",8610:"715ba79f",8618:"9a535e28",8663:"06aa20ef",8713:"44489f01",8761:"c75eaf74",8800:"566069b3",8816:"8b5a3024",8866:"6b17be56",8870:"72090d99",8913:"c5f3c170",8945:"e1dd2823",9048:"47b4b973",9055:"90360b64",9202:"0d10207a",9241:"658e7f8b",9255:"6e2d97aa",9288:"8f852b2a",9329:"5f120f5c",9408:"2c274db6",9436:"6852bd0a",9462:"1ff6d9b5",9494:"b94da526",9583:"5e862e18",9647:"5b9df456",9650:"a14f69c2",9695:"0da9633f",9719:"7a66de4e",9746:"dcb0a42d",9751:"e5ed7cdf",9770:"a671742e",9780:"9f3676ad",9858:"c0ef6108",9962:"a96fdd66",9987:"814376fb",9996:"e6d2b203"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="my-website:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"8401",32395893:"2351",48387199:"248",fb04c5f8:"25","15b8db1d":"158","4d20d142":"238","56a042a3":"239","3b444901":"244",d87bb81f:"335","9506522a":"365","302997c3":"399",ff44a3dd:"447",bc9cc23f:"490","77ef4bf8":"512","77c72e86":"574","9ef30e72":"630","33cda08e":"674","2fc3947b":"685","0058b4c6":"849","7b10631b":"871","694b2bb3":"879",b103dc15:"886",c141421f:"957","0c394251":"1112",e7b70caf:"1232",a7456010:"1235","50caf296":"1261","98b73f40":"1446","0fea8c8c":"1467","78cb671d":"1535",c78e3c18:"1565","9a2b66e8":"1582","07bb81ca":"1741",acecf23e:"1903","6a3e2bcd":"1949","49a9e3d3":"1983",f65b1080:"2037","2bc90abe":"2113",d6221d4b:"2136","1a4e3797":"2138","92c6dd73":"2275","49e63881":"2331","3ce58a02":"2372","14ada109":"2388",f971ad82:"2473",e007d0d8:"2599",a2266736:"2616",c4f5d8e4:"2634","9e4087bc":"2711",ad6f2ffe:"2739","356a0ac6":"2750","00cb80af":"2797",c22ba043:"2864",afe8e388:"2873","8bbeff0f":"2896","2ed4807b":"2911","30f10d3a":"2949","8f126303":"2966","253e4fa8":"2969","5a4cdc6e":"3002","5c7fd325":"3060","29507a56":"3226",c5f475dd:"3229",ccc49370:"3249",e90c7cb3:"3261",de5b098f:"3304",bc7d65d2:"3358",fc8a030c:"3491","863dbe6d":"3533","16263e70":"3555",e8ca30a9:"3647",e02322d8:"3745",e11fbcf3:"3800","04b7d215":"3806",a2e03ed8:"3885",a409cb53:"3898",f1675f6c:"3977","7a61e263":"4008","0a86fa65":"4072","1aaa1f8d":"4146","621db11d":"4212","569e2945":"4258","7dd88c9a":"4299","00611c18":"4403","99683b3e":"4408",c5dab4e6:"4457",e60bd62d:"4476",a5ce6f4a:"4512",f53283f6:"4568",ab882b2b:"4598","41755e58":"4687","4cbc9fed":"4727","0ed86790":"4728","9acdd949":"4808","6875c492":"4813","7d0dfabc":"4876","25166c59":"4878","9dae1980":"5016","3222d899":"5074",f8579c65:"5114",ed7470a0:"5123","2b55bd02":"5137","1c69de2b":"5177",a004523e:"5209","11c28767":"5320","45b23340":"5344","92284fa3":"5350","6a5408b1":"5456",f0fee398:"5509","1371063b":"5538","8d98164e":"5564","351e4335":"5566","868371a7":"5570","8e9e695d":"5648",eb26b66d:"5668","20cfc2e9":"5671",c531e4b5:"5707","54032f9e":"5725",aba21aa0:"5742",df077461:"5744","8b11a1f4":"5747","986ad158":"5881","6fed1847":"5892","6f441bd0":"6018","2536ec16":"6022","1f391b9e":"6061","72fe76db":"6170",b2dbac66:"6181","4fec5050":"6205","9f6aeda5":"6284","168e44ea":"6393",c895377a:"6438","366460c9":"6440","73747a1d":"6567","9eff10b4":"6620","0b590444":"6715","37c1090c":"6831","266d3809":"6833","4908e7cd":"6855","89bf0775":"6889","14eb3368":"6969","01e7ac17":"6982",a7bd4aaa:"7098",ffd75945:"7123","7c0fb017":"7169","9a3a9509":"7206","12704d84":"7291","08f08699":"7309","1f1ca1a6":"7325","234d405f":"7415",e625af6f:"7424",d4ef1874:"7448","243318f9":"7459","814f3328":"7472",e0383bde:"7531","6b0e8c2a":"7566","4d11ad11":"7576",c0ca9709:"7583","83b70cff":"7594",c2179a88:"7630",a6aa9e1f:"7643",ccc8c81c:"7717","6f3afeb4":"7778","668f3370":"7874",e4746366:"7932","433a143f":"7996","01a85c17":"8209","5082620e":"8263","03c3795e":"8352","3641ab0a":"8469","9d9933db":"8610","0bed28db":"8618",e340f87c:"8663","0ac5bc6d":"8713","163d40f8":"8761","39c7ee4c":"8800","9346c581":"8816",f0ecaaaf:"8866","511f635d":"8870",d410bd6e:"8945",a94703ab:"9048","43934b96":"9055","9616cc7b":"9202","5179f778":"9241",bede496a:"9255","81af8ad2":"9288","309c6dc0":"9329","99ec1860":"9408","22d60706":"9436",b0960fff:"9494","76e8c21d":"9583","5e95c892":"9647","15274cd5":"9650",b6db9be8:"9695","289afbf6":"9719","633019cf":"9746","18b54ca4":"9751","2d278ceb":"9770",b636172f:"9780","36994c47":"9858","5b252531":"9962",cd743373:"9987","9a4c6ce8":"9996"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n - + @@ -191,6 +191,16 @@

TrackerNodes. This service uses the information received from the MQTT broker to call 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 Beehive. For more information, view the documentation here.

Lorawan Listener Plugin​

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 here.

+

Lorawan Device Profile Templates​

+

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

+

Lorawan Device Compatibility​

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:

-
This material is based upon work supported by the National Science Foundation under Grant No. OAC-1935984.
Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.

Contact

Copyright © 2024 Sage
+
This material is based upon work supported by the National Science Foundation under Grant No. OAC-1935984.
Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.

Contact

Copyright © 2024 Sage
\ No newline at end of file diff --git a/docs/about/overview.html b/docs/about/overview.html index cad10f13..65fb8fef 100644 --- a/docs/about/overview.html +++ b/docs/about/overview.html @@ -19,7 +19,7 @@ - + diff --git a/docs/category/about.html b/docs/category/about.html index 811fdedb..fbd20d72 100644 --- a/docs/category/about.html +++ b/docs/category/about.html @@ -19,7 +19,7 @@ - + diff --git a/docs/category/edge-apps.html b/docs/category/edge-apps.html index 9226e4d0..b24e08cb 100644 --- a/docs/category/edge-apps.html +++ b/docs/category/edge-apps.html @@ -19,7 +19,7 @@ - + diff --git a/docs/category/installation-manuals.html b/docs/category/installation-manuals.html index fc378e89..7e0185bd 100644 --- a/docs/category/installation-manuals.html +++ b/docs/category/installation-manuals.html @@ -19,7 +19,7 @@ - + diff --git a/docs/category/reference-guides.html b/docs/category/reference-guides.html index 0555116c..f8c24490 100644 --- a/docs/category/reference-guides.html +++ b/docs/category/reference-guides.html @@ -19,7 +19,7 @@ - + diff --git a/docs/category/tutorials.html b/docs/category/tutorials.html index cee6029d..ae8da576 100644 --- a/docs/category/tutorials.html +++ b/docs/category/tutorials.html @@ -19,7 +19,7 @@ - + diff --git a/docs/contact-us.html b/docs/contact-us.html index 444ca500..cac4edf8 100644 --- a/docs/contact-us.html +++ b/docs/contact-us.html @@ -19,7 +19,7 @@ - + diff --git a/docs/events/past/hackathon-2023.html b/docs/events/past/hackathon-2023.html index 3f98e14b..d87bc1ca 100644 --- a/docs/events/past/hackathon-2023.html +++ b/docs/events/past/hackathon-2023.html @@ -19,7 +19,7 @@ - + diff --git a/docs/installation-manuals/wsn-manual.html b/docs/installation-manuals/wsn-manual.html index 000d7b56..36693472 100644 --- a/docs/installation-manuals/wsn-manual.html +++ b/docs/installation-manuals/wsn-manual.html @@ -19,7 +19,7 @@ - + diff --git a/docs/reference-guides/dev-quick-reference.html b/docs/reference-guides/dev-quick-reference.html index 2d426810..40080c5d 100644 --- a/docs/reference-guides/dev-quick-reference.html +++ b/docs/reference-guides/dev-quick-reference.html @@ -19,7 +19,7 @@ - + diff --git a/docs/reference-guides/pluginctl.html b/docs/reference-guides/pluginctl.html index a0e657ae..789b32ae 100644 --- a/docs/reference-guides/pluginctl.html +++ b/docs/reference-guides/pluginctl.html @@ -19,7 +19,7 @@ - + diff --git a/docs/reference-guides/sesctl.html b/docs/reference-guides/sesctl.html index a9393bb9..512f9445 100644 --- a/docs/reference-guides/sesctl.html +++ b/docs/reference-guides/sesctl.html @@ -19,7 +19,7 @@ - + diff --git a/docs/reference-guides/triggers.html b/docs/reference-guides/triggers.html index 9930ee02..f5f2b061 100644 --- a/docs/reference-guides/triggers.html +++ b/docs/reference-guides/triggers.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/access-waggle-sensors.html b/docs/tutorials/access-waggle-sensors.html index 91bfbd3d..25a9016b 100644 --- a/docs/tutorials/access-waggle-sensors.html +++ b/docs/tutorials/access-waggle-sensors.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/accessing-data.html b/docs/tutorials/accessing-data.html index e99c97cc..c139be93 100644 --- a/docs/tutorials/accessing-data.html +++ b/docs/tutorials/accessing-data.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/cloud-compute.html b/docs/tutorials/cloud-compute.html index 43e40d93..b294943f 100644 --- a/docs/tutorials/cloud-compute.html +++ b/docs/tutorials/cloud-compute.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/create-an-account.html b/docs/tutorials/create-an-account.html index 489f739a..40906aa9 100644 --- a/docs/tutorials/create-an-account.html +++ b/docs/tutorials/create-an-account.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/create-waggle.html b/docs/tutorials/create-waggle.html index 12cd299e..44c998eb 100644 --- a/docs/tutorials/create-waggle.html +++ b/docs/tutorials/create-waggle.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/edge-apps/creating-an-edge-app.html b/docs/tutorials/edge-apps/creating-an-edge-app.html index 0acd7ab5..1bb092a7 100644 --- a/docs/tutorials/edge-apps/creating-an-edge-app.html +++ b/docs/tutorials/edge-apps/creating-an-edge-app.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/edge-apps/intro-to-edge-apps.html b/docs/tutorials/edge-apps/intro-to-edge-apps.html index 31bb119b..0b3881b7 100644 --- a/docs/tutorials/edge-apps/intro-to-edge-apps.html +++ b/docs/tutorials/edge-apps/intro-to-edge-apps.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/edge-apps/publishing-to-ecr.html b/docs/tutorials/edge-apps/publishing-to-ecr.html index e4a33627..3c2a7432 100644 --- a/docs/tutorials/edge-apps/publishing-to-ecr.html +++ b/docs/tutorials/edge-apps/publishing-to-ecr.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/edge-apps/testing-an-edge-app.html b/docs/tutorials/edge-apps/testing-an-edge-app.html index 0fcf8a75..b2ed64c1 100644 --- a/docs/tutorials/edge-apps/testing-an-edge-app.html +++ b/docs/tutorials/edge-apps/testing-an-edge-app.html @@ -19,7 +19,7 @@ - + diff --git a/docs/tutorials/schedule-jobs.html b/docs/tutorials/schedule-jobs.html index db720065..69b68f7e 100644 --- a/docs/tutorials/schedule-jobs.html +++ b/docs/tutorials/schedule-jobs.html @@ -19,7 +19,7 @@ - + diff --git a/index.html b/index.html index 7631071c..770ee5e6 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@ - + diff --git a/news.html b/news.html index ccfe56b9..3bfcdea4 100644 --- a/news.html +++ b/news.html @@ -19,7 +19,7 @@ - + diff --git a/news/2020/07/27/sage-ai-at-edge-workshop.html b/news/2020/07/27/sage-ai-at-edge-workshop.html index e7425625..a714936c 100644 --- a/news/2020/07/27/sage-ai-at-edge-workshop.html +++ b/news/2020/07/27/sage-ai-at-edge-workshop.html @@ -19,7 +19,7 @@ - + diff --git a/news/2020/07/28/world-watchers.html b/news/2020/07/28/world-watchers.html index a684e3e8..da35a734 100644 --- a/news/2020/07/28/world-watchers.html +++ b/news/2020/07/28/world-watchers.html @@ -19,7 +19,7 @@ - + diff --git a/news/2020/07/29/sage-community-workshop.html b/news/2020/07/29/sage-community-workshop.html index fb2079e9..42b2ca37 100644 --- a/news/2020/07/29/sage-community-workshop.html +++ b/news/2020/07/29/sage-community-workshop.html @@ -19,7 +19,7 @@ - + diff --git a/news/2020/08/07/lightning-the-way-with-software-defined-radios.html b/news/2020/08/07/lightning-the-way-with-software-defined-radios.html index b7f5a2cc..8df2e0b5 100644 --- a/news/2020/08/07/lightning-the-way-with-software-defined-radios.html +++ b/news/2020/08/07/lightning-the-way-with-software-defined-radios.html @@ -19,7 +19,7 @@ - + diff --git a/news/2020/08/12/derecho-talk-with-scott-collis.html b/news/2020/08/12/derecho-talk-with-scott-collis.html index 563a4eff..4778486f 100644 --- a/news/2020/08/12/derecho-talk-with-scott-collis.html +++ b/news/2020/08/12/derecho-talk-with-scott-collis.html @@ -19,7 +19,7 @@ - + diff --git a/news/2021/02/12/ped-count-for-cross.html b/news/2021/02/12/ped-count-for-cross.html index fd4183fb..f93b37d8 100644 --- a/news/2021/02/12/ped-count-for-cross.html +++ b/news/2021/02/12/ped-count-for-cross.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/05/05/neiu-crocus-deploy.html b/news/2023/05/05/neiu-crocus-deploy.html index 865fd2a3..223ddfde 100644 --- a/news/2023/05/05/neiu-crocus-deploy.html +++ b/news/2023/05/05/neiu-crocus-deploy.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/05/31/scalable-ci-in-aps.html b/news/2023/05/31/scalable-ci-in-aps.html index 73ad26df..77db17a0 100644 --- a/news/2023/05/31/scalable-ci-in-aps.html +++ b/news/2023/05/31/scalable-ci-in-aps.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/10/04/emiquon-preserve.html b/news/2023/10/04/emiquon-preserve.html index 3956042d..6ac126da 100644 --- a/news/2023/10/04/emiquon-preserve.html +++ b/news/2023/10/04/emiquon-preserve.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/10/30/alex-blog-hawaii.html b/news/2023/10/30/alex-blog-hawaii.html index 55254e7b..12a0d893 100644 --- a/news/2023/10/30/alex-blog-hawaii.html +++ b/news/2023/10/30/alex-blog-hawaii.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/10/30/joann-blog-hawaii.html b/news/2023/10/30/joann-blog-hawaii.html index fd25600d..8726f27c 100644 --- a/news/2023/10/30/joann-blog-hawaii.html +++ b/news/2023/10/30/joann-blog-hawaii.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/10/31/Hawaiian-Community.html b/news/2023/10/31/Hawaiian-Community.html index b9595d94..5189bca3 100644 --- a/news/2023/10/31/Hawaiian-Community.html +++ b/news/2023/10/31/Hawaiian-Community.html @@ -19,7 +19,7 @@ - + diff --git a/news/2023/11/17/hawaii-anagha.html b/news/2023/11/17/hawaii-anagha.html index b219ed2e..1c5080b5 100644 --- a/news/2023/11/17/hawaii-anagha.html +++ b/news/2023/11/17/hawaii-anagha.html @@ -19,7 +19,7 @@ - + diff --git a/news/2024/01/10/sage-testbed.html b/news/2024/01/10/sage-testbed.html index e0ff2a29..1e46d53c 100644 --- a/news/2024/01/10/sage-testbed.html +++ b/news/2024/01/10/sage-testbed.html @@ -19,7 +19,7 @@ - + diff --git a/news/archive.html b/news/archive.html index 0f77c5f8..857d73f9 100644 --- a/news/archive.html +++ b/news/archive.html @@ -19,7 +19,7 @@ - + diff --git a/news/authors.html b/news/authors.html index 619cc756..22c582c9 100644 --- a/news/authors.html +++ b/news/authors.html @@ -19,7 +19,7 @@ - + diff --git a/news/big-data.html b/news/big-data.html index 62fe3498..e3702a3a 100644 --- a/news/big-data.html +++ b/news/big-data.html @@ -19,7 +19,7 @@ - + diff --git a/news/hawaii-intro.html b/news/hawaii-intro.html index 44de5bba..7ed4f209 100644 --- a/news/hawaii-intro.html +++ b/news/hawaii-intro.html @@ -19,7 +19,7 @@ - + diff --git a/news/page/2.html b/news/page/2.html index 11443a59..37dcbbaf 100644 --- a/news/page/2.html +++ b/news/page/2.html @@ -19,7 +19,7 @@ - + diff --git a/news/sage-hawaii.html b/news/sage-hawaii.html index 5c0cb64d..0f5bad69 100644 --- a/news/sage-hawaii.html +++ b/news/sage-hawaii.html @@ -19,7 +19,7 @@ - + diff --git a/news/sage-neon-deploy-konza.html b/news/sage-neon-deploy-konza.html index c5aaabcf..a0cf65ed 100644 --- a/news/sage-neon-deploy-konza.html +++ b/news/sage-neon-deploy-konza.html @@ -19,7 +19,7 @@ - + diff --git a/news/summer-interns.html b/news/summer-interns.html index 24aec672..0bad106f 100644 --- a/news/summer-interns.html +++ b/news/summer-interns.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags.html b/news/tags.html index 9a42433b..b256ad86 100644 --- a/news/tags.html +++ b/news/tags.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/ai-applications.html b/news/tags/ai-applications.html index fe7c0b0b..912dfd22 100644 --- a/news/tags/ai-applications.html +++ b/news/tags/ai-applications.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/alcf.html b/news/tags/alcf.html index 2b3acfa0..a7fce5cb 100644 --- a/news/tags/alcf.html +++ b/news/tags/alcf.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/argonne-aps.html b/news/tags/argonne-aps.html index 866c88b9..613130b0 100644 --- a/news/tags/argonne-aps.html +++ b/news/tags/argonne-aps.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/big-data.html b/news/tags/big-data.html index accc9b0b..2bb0256c 100644 --- a/news/tags/big-data.html +++ b/news/tags/big-data.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/blog-post.html b/news/tags/blog-post.html index 017e6337..08557ec4 100644 --- a/news/tags/blog-post.html +++ b/news/tags/blog-post.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/climate-science.html b/news/tags/climate-science.html index 801af396..81d6fa86 100644 --- a/news/tags/climate-science.html +++ b/news/tags/climate-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/collaborations.html b/news/tags/collaborations.html index 953dd444..bdd5c999 100644 --- a/news/tags/collaborations.html +++ b/news/tags/collaborations.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/community.html b/news/tags/community.html index d317f092..e8c28eea 100644 --- a/news/tags/community.html +++ b/news/tags/community.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/computational-science.html b/news/tags/computational-science.html index 13dab528..da5e4dd5 100644 --- a/news/tags/computational-science.html +++ b/news/tags/computational-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/computer-science.html b/news/tags/computer-science.html index 33493b21..15bad354 100644 --- a/news/tags/computer-science.html +++ b/news/tags/computer-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/deployment.html b/news/tags/deployment.html index 0f58fd6f..c5293e4d 100644 --- a/news/tags/deployment.html +++ b/news/tags/deployment.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/development.html b/news/tags/development.html index e556f713..3a46fa4e 100644 --- a/news/tags/development.html +++ b/news/tags/development.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/edge-applications.html b/news/tags/edge-applications.html index 60bd3b26..38919822 100644 --- a/news/tags/edge-applications.html +++ b/news/tags/edge-applications.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/edge-computing.html b/news/tags/edge-computing.html index c71856bf..f081217b 100644 --- a/news/tags/edge-computing.html +++ b/news/tags/edge-computing.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/education.html b/news/tags/education.html index 53ce2672..cc8aa2a3 100644 --- a/news/tags/education.html +++ b/news/tags/education.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/environment.html b/news/tags/environment.html index afe883e1..cdc03a54 100644 --- a/news/tags/environment.html +++ b/news/tags/environment.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/environmental-science.html b/news/tags/environmental-science.html index 1586caf6..59d4d04a 100644 --- a/news/tags/environmental-science.html +++ b/news/tags/environmental-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/fish-ponds.html b/news/tags/fish-ponds.html index 772b76e7..563d9ea1 100644 --- a/news/tags/fish-ponds.html +++ b/news/tags/fish-ponds.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/hawaii.html b/news/tags/hawaii.html index 0709c931..03e6e38e 100644 --- a/news/tags/hawaii.html +++ b/news/tags/hawaii.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/in-the-news.html b/news/tags/in-the-news.html index 67cb6109..60b04875 100644 --- a/news/tags/in-the-news.html +++ b/news/tags/in-the-news.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/instruments.html b/news/tags/instruments.html index 6f589b57..bd2e3606 100644 --- a/news/tags/instruments.html +++ b/news/tags/instruments.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/interns.html b/news/tags/interns.html index befac477..014e153f 100644 --- a/news/tags/interns.html +++ b/news/tags/interns.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/lightning-detection.html b/news/tags/lightning-detection.html index b3060d73..4310be1b 100644 --- a/news/tags/lightning-detection.html +++ b/news/tags/lightning-detection.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/naise.html b/news/tags/naise.html index 0eddcc78..b681f5a0 100644 --- a/news/tags/naise.html +++ b/news/tags/naise.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/niu.html b/news/tags/niu.html index 866036eb..226034b7 100644 --- a/news/tags/niu.html +++ b/news/tags/niu.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/node-deployment.html b/news/tags/node-deployment.html index 2105222f..89f72881 100644 --- a/news/tags/node-deployment.html +++ b/news/tags/node-deployment.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/node.html b/news/tags/node.html index 1b709967..c49dc67d 100644 --- a/news/tags/node.html +++ b/news/tags/node.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/nodes.html b/news/tags/nodes.html index 4190843c..367102fb 100644 --- a/news/tags/nodes.html +++ b/news/tags/nodes.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/sage-science.html b/news/tags/sage-science.html index dffd2126..03abb86d 100644 --- a/news/tags/sage-science.html +++ b/news/tags/sage-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/sage.html b/news/tags/sage.html index 6c98aa60..c5c1e9d1 100644 --- a/news/tags/sage.html +++ b/news/tags/sage.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/science.html b/news/tags/science.html index 830b8641..d4752de5 100644 --- a/news/tags/science.html +++ b/news/tags/science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/sensors.html b/news/tags/sensors.html index 9237b894..a476576a 100644 --- a/news/tags/sensors.html +++ b/news/tags/sensors.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/social-science.html b/news/tags/social-science.html index 3e102159..8f0f6e3c 100644 --- a/news/tags/social-science.html +++ b/news/tags/social-science.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/solar-powered.html b/news/tags/solar-powered.html index fc907ad2..251fcbd4 100644 --- a/news/tags/solar-powered.html +++ b/news/tags/solar-powered.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/students.html b/news/tags/students.html index 1c74d7e4..3720ae2c 100644 --- a/news/tags/students.html +++ b/news/tags/students.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/talks-presentations.html b/news/tags/talks-presentations.html index 7362143a..a4776b97 100644 --- a/news/tags/talks-presentations.html +++ b/news/tags/talks-presentations.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/testbed.html b/news/tags/testbed.html index edefe8b1..d4a77955 100644 --- a/news/tags/testbed.html +++ b/news/tags/testbed.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/waggle.html b/news/tags/waggle.html index 18e14a73..631cf686 100644 --- a/news/tags/waggle.html +++ b/news/tags/waggle.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/wildlife.html b/news/tags/wildlife.html index 19f6a2ca..2c6cb69e 100644 --- a/news/tags/wildlife.html +++ b/news/tags/wildlife.html @@ -19,7 +19,7 @@ - + diff --git a/news/tags/workshop.html b/news/tags/workshop.html index ba69a856..a51241f7 100644 --- a/news/tags/workshop.html +++ b/news/tags/workshop.html @@ -19,7 +19,7 @@ - + diff --git a/partners.html b/partners.html index eece4949..162ee342 100644 --- a/partners.html +++ b/partners.html @@ -19,7 +19,7 @@ - + diff --git a/partners/archive.html b/partners/archive.html index 62b44c08..a5fa151e 100644 --- a/partners/archive.html +++ b/partners/archive.html @@ -19,7 +19,7 @@ - + diff --git a/partners/bad-river.html b/partners/bad-river.html index 5777b8e4..eecfed1c 100644 --- a/partners/bad-river.html +++ b/partners/bad-river.html @@ -19,7 +19,7 @@ - + diff --git a/partners/city-of-chicago.html b/partners/city-of-chicago.html index 98f0e1a1..3bc91c1c 100644 --- a/partners/city-of-chicago.html +++ b/partners/city-of-chicago.html @@ -19,7 +19,7 @@ - + diff --git a/partners/crocus.html b/partners/crocus.html index e65e2c6d..2c0a476d 100644 --- a/partners/crocus.html +++ b/partners/crocus.html @@ -19,7 +19,7 @@ - + diff --git a/partners/neon.html b/partners/neon.html index 585466c8..f7d7470e 100644 --- a/partners/neon.html +++ b/partners/neon.html @@ -19,7 +19,7 @@ - + diff --git a/partners/ohaz.html b/partners/ohaz.html index 9368c086..ee5caa0f 100644 --- a/partners/ohaz.html +++ b/partners/ohaz.html @@ -19,7 +19,7 @@ - + diff --git a/partners/scripps.html b/partners/scripps.html index 5fb7fd25..1530945f 100644 --- a/partners/scripps.html +++ b/partners/scripps.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags.html b/partners/tags.html index 80435649..091ee362 100644 --- a/partners/tags.html +++ b/partners/tags.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/agriculture-science.html b/partners/tags/agriculture-science.html index 503daae2..d60e695a 100644 --- a/partners/tags/agriculture-science.html +++ b/partners/tags/agriculture-science.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/climate-science.html b/partners/tags/climate-science.html index 07e14316..8b8976ba 100644 --- a/partners/tags/climate-science.html +++ b/partners/tags/climate-science.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/ecology.html b/partners/tags/ecology.html index 6ca8db5d..f6a212ec 100644 --- a/partners/tags/ecology.html +++ b/partners/tags/ecology.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/education.html b/partners/tags/education.html index 58c2f409..6b0a3ea8 100644 --- a/partners/tags/education.html +++ b/partners/tags/education.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/environmental-science.html b/partners/tags/environmental-science.html index 35de13c9..4aa3b354 100644 --- a/partners/tags/environmental-science.html +++ b/partners/tags/environmental-science.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/oceanography.html b/partners/tags/oceanography.html index eb8cfb85..bad38031 100644 --- a/partners/tags/oceanography.html +++ b/partners/tags/oceanography.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/public-health.html b/partners/tags/public-health.html index f64106e5..a4cf4f19 100644 --- a/partners/tags/public-health.html +++ b/partners/tags/public-health.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/seismology.html b/partners/tags/seismology.html index 221e26c4..c50ba221 100644 --- a/partners/tags/seismology.html +++ b/partners/tags/seismology.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/urban-science.html b/partners/tags/urban-science.html index fe2c77ff..a57769c4 100644 --- a/partners/tags/urban-science.html +++ b/partners/tags/urban-science.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/wildfire-science.html b/partners/tags/wildfire-science.html index 1c062f0b..f41fc6cf 100644 --- a/partners/tags/wildfire-science.html +++ b/partners/tags/wildfire-science.html @@ -19,7 +19,7 @@ - + diff --git a/partners/tags/wildlife-monitoring.html b/partners/tags/wildlife-monitoring.html index 89e9cfb6..11c40f79 100644 --- a/partners/tags/wildlife-monitoring.html +++ b/partners/tags/wildlife-monitoring.html @@ -19,7 +19,7 @@ - + diff --git a/partners/the-nature-conservancy.html b/partners/the-nature-conservancy.html index f0454816..40c58609 100644 --- a/partners/the-nature-conservancy.html +++ b/partners/the-nature-conservancy.html @@ -19,7 +19,7 @@ - + diff --git a/partners/uic.html b/partners/uic.html index e06bdfab..ad81e530 100644 --- a/partners/uic.html +++ b/partners/uic.html @@ -19,7 +19,7 @@ - + diff --git a/partners/university-of-hawaii.html b/partners/university-of-hawaii.html index 1c1e2d02..9a2f3361 100644 --- a/partners/university-of-hawaii.html +++ b/partners/university-of-hawaii.html @@ -19,7 +19,7 @@ - + diff --git a/partners/us-uk-smartwater.html b/partners/us-uk-smartwater.html index 0dee8a7c..b5ce435a 100644 --- a/partners/us-uk-smartwater.html +++ b/partners/us-uk-smartwater.html @@ -19,7 +19,7 @@ - + diff --git a/photos.html b/photos.html index 9ea59898..f1aae446 100644 --- a/photos.html +++ b/photos.html @@ -19,7 +19,7 @@ - + diff --git a/publications.html b/publications.html index 6756cd53..b6434ab9 100644 --- a/publications.html +++ b/publications.html @@ -19,7 +19,7 @@ - + diff --git a/science/category/past-projects.html b/science/category/past-projects.html index 91720f2b..25503bab 100644 --- a/science/category/past-projects.html +++ b/science/category/past-projects.html @@ -19,7 +19,7 @@ - + diff --git a/science/category/recent-projects.html b/science/category/recent-projects.html index af790825..f53dad89 100644 --- a/science/category/recent-projects.html +++ b/science/category/recent-projects.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/bandwidth-aware-learning.html b/science/past/bandwidth-aware-learning.html index 283985b0..38151d68 100644 --- a/science/past/bandwidth-aware-learning.html +++ b/science/past/bandwidth-aware-learning.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/characterizing-clouds.html b/science/past/characterizing-clouds.html index 013e91e8..e20f2d0d 100644 --- a/science/past/characterizing-clouds.html +++ b/science/past/characterizing-clouds.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/integrating-chameleon.html b/science/past/integrating-chameleon.html index bcdb8acf..086a5bdc 100644 --- a/science/past/integrating-chameleon.html +++ b/science/past/integrating-chameleon.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/lightning-science.html b/science/past/lightning-science.html index afcd3365..d08fbf64 100644 --- a/science/past/lightning-science.html +++ b/science/past/lightning-science.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/monitoring-biodiversity.html b/science/past/monitoring-biodiversity.html index b43098a7..e87d4a86 100644 --- a/science/past/monitoring-biodiversity.html +++ b/science/past/monitoring-biodiversity.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/nowcasting-weather.html b/science/past/nowcasting-weather.html index dd1f77e8..f853a2da 100644 --- a/science/past/nowcasting-weather.html +++ b/science/past/nowcasting-weather.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/snowflake.html b/science/past/snowflake.html index fca48fd2..0c9754ad 100644 --- a/science/past/snowflake.html +++ b/science/past/snowflake.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/social-distancing.html b/science/past/social-distancing.html index dbefa4f3..48ce0019 100644 --- a/science/past/social-distancing.html +++ b/science/past/social-distancing.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/vehicle-tracking.html b/science/past/vehicle-tracking.html index 89a9e1c6..71fc8ea9 100644 --- a/science/past/vehicle-tracking.html +++ b/science/past/vehicle-tracking.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/water-level-detection.html b/science/past/water-level-detection.html index 65fa1682..382e2757 100644 --- a/science/past/water-level-detection.html +++ b/science/past/water-level-detection.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/water-segmentation.html b/science/past/water-segmentation.html index b10ad56e..36d3ed4f 100644 --- a/science/past/water-segmentation.html +++ b/science/past/water-segmentation.html @@ -19,7 +19,7 @@ - + diff --git a/science/past/wildfire-science.html b/science/past/wildfire-science.html index eeddeee5..4611ee71 100644 --- a/science/past/wildfire-science.html +++ b/science/past/wildfire-science.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/autonomous-camera-control.html b/science/recent/autonomous-camera-control.html index 3e722909..ec4ed3c2 100644 --- a/science/recent/autonomous-camera-control.html +++ b/science/recent/autonomous-camera-control.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/collaboration.html b/science/recent/collaboration.html index e5085284..e60f187a 100644 --- a/science/recent/collaboration.html +++ b/science/recent/collaboration.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/finding-events.html b/science/recent/finding-events.html index d3bfa128..11dd7d00 100644 --- a/science/recent/finding-events.html +++ b/science/recent/finding-events.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/lidar-sky-solar.html b/science/recent/lidar-sky-solar.html index 16211408..ceb77c37 100644 --- a/science/recent/lidar-sky-solar.html +++ b/science/recent/lidar-sky-solar.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/lightning-detector.html b/science/recent/lightning-detector.html index 422ff3be..a0171760 100644 --- a/science/recent/lightning-detector.html +++ b/science/recent/lightning-detector.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/resource-management.html b/science/recent/resource-management.html index 769d725a..87dd22d9 100644 --- a/science/recent/resource-management.html +++ b/science/recent/resource-management.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/rideshare-detection.html b/science/recent/rideshare-detection.html index 3fb9b251..80efc534 100644 --- a/science/recent/rideshare-detection.html +++ b/science/recent/rideshare-detection.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/scalable-ci-in-aps.html b/science/recent/scalable-ci-in-aps.html index 39d74373..ca516532 100644 --- a/science/recent/scalable-ci-in-aps.html +++ b/science/recent/scalable-ci-in-aps.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/smoke-detection.html b/science/recent/smoke-detection.html index 931de53a..0c43fd75 100644 --- a/science/recent/smoke-detection.html +++ b/science/recent/smoke-detection.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/snow-detection.html b/science/recent/snow-detection.html index ff803106..89cb7ff4 100644 --- a/science/recent/snow-detection.html +++ b/science/recent/snow-detection.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/solar-irradiance-estimation.html b/science/recent/solar-irradiance-estimation.html index 943decab..1a46e9fe 100644 --- a/science/recent/solar-irradiance-estimation.html +++ b/science/recent/solar-irradiance-estimation.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/sound-separation.html b/science/recent/sound-separation.html index 30ac509a..b9702177 100644 --- a/science/recent/sound-separation.html +++ b/science/recent/sound-separation.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/super-resolution.html b/science/recent/super-resolution.html index b777f8d4..3f273210 100644 --- a/science/recent/super-resolution.html +++ b/science/recent/super-resolution.html @@ -19,7 +19,7 @@ - + diff --git a/science/recent/traffic-state-estimation.html b/science/recent/traffic-state-estimation.html index 3246cd2a..997826bb 100644 --- a/science/recent/traffic-state-estimation.html +++ b/science/recent/traffic-state-estimation.html @@ -19,7 +19,7 @@ - + diff --git a/search.html b/search.html index 368ce42d..a331f49a 100644 --- a/search.html +++ b/search.html @@ -19,7 +19,7 @@ - + diff --git a/team.html b/team.html index 8190d12f..3fa7df12 100644 --- a/team.html +++ b/team.html @@ -19,7 +19,7 @@ - +