{
  "$type": "site.standard.document",
  "content": {
    "$type": "app.scribe.content.html",
    "html": "<p style=\"text-align: justify;\"><span style=\"white-space: pre-wrap;\">What do we want to do?</span></p><p style=\"text-align: justify;\"><span style=\"white-space: pre-wrap;\">The goal of this application is to display system information of a number of raspberry pi computers. To achevie this we'll need 2 seperate repos:</span></p><ol><li value=\"1\"><span style=\"white-space: pre-wrap;\">A node script that runs on each computer we wish to report on, it grabs the system information and exposes it via an express driven api</span></li><li value=\"2\"><span style=\"white-space: pre-wrap;\">A React driven web application that queries each of the raspberry pi APIs and displays the information they provide</span></li></ol><p style=\"text-align: justify;\"><span style=\"white-space: pre-wrap;\">Starting with the API that is going to query all of the system info we need and expose it via an API, here is the node.js code that is going to provide that:</span></p><pre spellcheck=\"false\" data-language=\"javascript\" data-highlight-language=\"javascript\"><span class=\"token keyword\" style=\"white-space: pre-wrap;\">import</span><span style=\"white-space: pre-wrap;\"> express </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">from</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"express\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">import</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><span style=\"white-space: pre-wrap;\"> RaspberryPiInfo </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">from</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"@alexkratky/rpi-info\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">import</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><span style=\"white-space: pre-wrap;\"> getCpuTemperature</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><span style=\"white-space: pre-wrap;\"> getGpuTemperature </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">from</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"raspberrypi-sys-info\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">import</span><span style=\"white-space: pre-wrap;\"> checkDiskSpace </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">from</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"check-disk-space\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">import</span><span style=\"white-space: pre-wrap;\"> memory </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">from</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"node-free\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> app </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">express</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> port </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token number\" style=\"white-space: pre-wrap;\">7777</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> raspberryPiInfo </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">new</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token class-name\" style=\"white-space: pre-wrap;\">RaspberryPiInfo</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> raspiModelInfo </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> raspberryPiInfo</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">detect</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span class=\"token keyword\" style=\"white-space: pre-wrap;\">async</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">function</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">displaySystemInfo</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">try</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> cpuTemp </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">await</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">getCpuTemperature</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> gpuTemp </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">await</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">getGpuTemperature</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">return</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; cpuTemp</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> cpuTemp</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; gpuTemp</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> gpuTemp</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">catch</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">error</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; console</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">error</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">error</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span style=\"white-space: pre-wrap;\">message</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">return</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; cpuTemp</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">null</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; gpuTemp</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">null</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><br><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><br><br><br><span style=\"white-space: pre-wrap;\">app</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">use</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">express</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">json</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">app</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">get</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"/\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">async</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">req</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><span style=\"white-space: pre-wrap;\"> res</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=&gt;</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> systemStats </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">await</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">displaySystemInfo</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">let</span><span style=\"white-space: pre-wrap;\"> diskSpace</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">await</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token function\" style=\"white-space: pre-wrap;\">checkDiskSpace</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"/\"</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">then</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">space</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=&gt;</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; diskSpace </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; diskPath</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> space</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span style=\"white-space: pre-wrap;\">diskPath</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; diskSize</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> space</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span style=\"white-space: pre-wrap;\">size</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; &nbsp; diskFree</span><span class=\"token operator\" style=\"white-space: pre-wrap;\">:</span><span style=\"white-space: pre-wrap;\"> space</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span style=\"white-space: pre-wrap;\">free</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> memTotal </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> memory</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">total</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> memUsed </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> memory</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">used</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> memFree </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> memory</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">free</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> memoryStats </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; memTotal</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; memUsed</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; memFree</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token keyword\" style=\"white-space: pre-wrap;\">const</span><span style=\"white-space: pre-wrap;\"> result </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">{</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">...</span><span style=\"white-space: pre-wrap;\">raspiModelInfo</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">...</span><span style=\"white-space: pre-wrap;\">systemStats</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">...</span><span style=\"white-space: pre-wrap;\">diskSpace</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; &nbsp; </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">...</span><span style=\"white-space: pre-wrap;\">memoryStats</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><br><span style=\"white-space: pre-wrap;\">&nbsp; </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; res</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">status</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token number\" style=\"white-space: pre-wrap;\">200</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">json</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">result</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">}</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span><br><br><br><span style=\"white-space: pre-wrap;\">app</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">listen</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span style=\"white-space: pre-wrap;\">port</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">,</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">=&gt;</span><br><span style=\"white-space: pre-wrap;\">&nbsp; console</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">.</span><span class=\"token function\" style=\"white-space: pre-wrap;\">log</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">(</span><span class=\"token string\" style=\"white-space: pre-wrap;\">\"`Example app listening on port port\"</span><span style=\"white-space: pre-wrap;\"> </span><span class=\"token operator\" style=\"white-space: pre-wrap;\">+</span><span style=\"white-space: pre-wrap;\"> port</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><br><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">)</span><span class=\"token punctuation\" style=\"white-space: pre-wrap;\">;</span></pre><p><br></p>"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreidbipvnuio55al2omegrsznyki3iin3shd6isko3lawcr5bckco44"
    },
    "mimeType": "image/webp",
    "size": 23288
  },
  "description": "With an ever-expanding roster of raspberry pi's getting added to my local cluster it became practical to monitor them in a single place. What better way to do that with another raspberry pi wired up to a 7' touchscreen with a visual status app.",
  "path": "/raspberry-pi-cluster-monitor",
  "scribe": {
    "coverImageUrl": "https://scribe-cms.app/image-storage/did:plc:e2lcgwxhymx3q6u7blziecdr/6d5313b1-2a11-4d27-b889-e8492aac4c19/max.webp",
    "createdAt": "2026-06-15T18:10:28.264Z"
  },
  "site": "https://reader.scribe-atp.app/did:plc:e2lcgwxhymx3q6u7blziecdr/site.standard.document/3mp47vw2jpu2n",
  "textContent": "What do we want to do? The goal of this application is to display system information of a number of raspberry pi computers. To achevie this we'll need 2 seperate repos: A node script that runs on each computer we wish to report on, it grabs the system information and exposes it via an express driven api A React driven web application that queries each of the raspberry pi APIs and displays the information they provide Starting with the API that is going to query all of the system info we need and expose it via an API, here is the node.js code that is going to provide that: import express from \"express\" ; import { RaspberryPiInfo } from \"@alexkratky/rpi-info\" ; import { getCpuTemperature , getGpuTemperature } from \"raspberrypi-sys-info\" ; import checkDiskSpace from \"check-disk-space\" ; import memory from \"node-free\" ; const app = express ( ) ; const port = 7777 ; const raspberryPiInfo = new RaspberryPiInfo ( ) ; const raspiModelInfo = raspberryPiInfo . detect ( ) ; async function displaySystemInfo ( ) { &nbsp; try { &nbsp; &nbsp; const cpuTemp = await getCpuTemperature ( ) ; &nbsp; &nbsp; const gpuTemp = await getGpuTemperature ( ) ; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; cpuTemp : cpuTemp , &nbsp; &nbsp; &nbsp; gpuTemp : gpuTemp , &nbsp; &nbsp; } ; &nbsp; } catch ( error ) { &nbsp; &nbsp; console . error ( error . message ) ; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; cpuTemp : null , &nbsp; &nbsp; &nbsp; gpuTemp : null , &nbsp; &nbsp; } ; &nbsp; } } app . use ( express . json ( ) ) ; app . get ( \"/\" , async ( req , res ) =&gt; { &nbsp; const systemStats = await displaySystemInfo ( ) ; &nbsp; let diskSpace ; &nbsp; await checkDiskSpace ( \"/\" ) . then ( ( space ) =&gt; { &nbsp; &nbsp; diskSpace = { &nbsp; &nbsp; &nbsp; diskPath : space . diskPath , &nbsp; &nbsp; &nbsp; diskSize : space . size , &nbsp; &nbsp; &nbsp; diskFree : space . free , &nbsp; &nbsp; } ; &nbsp; } ) ; &nbsp; const memTotal = memory . total ( ) ; &nbsp; const memUsed = memory . used ( ) ; &nbsp; const memFree = memory . free ( ) ; &nbsp; const memoryStats = { &nbsp; &nbsp; memTotal , &nbsp; &nbsp; memUsed , &nbsp; &nbsp; memFree , &nbsp; } ; &nbsp; const result = { &nbsp; &nbsp; ... raspiModelInfo , &nbsp; &nbsp; ... systemStats , &nbsp; &nbsp; ... diskSpace , &nbsp; &nbsp; ... memoryStats , &nbsp; } ; &nbsp; res . status ( 200 ) . json ( result ) ; } ) ; app . listen ( port , ( ) =&gt; &nbsp; console . log ( \"`Example app listening on port port\" + port ) ) ;",
  "title": "Raspberry Pi Cluster Monitor Project",
  "updatedAt": "2026-07-13T07:49:39.137Z"
}