[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105318":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":16,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":9,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},105318,"prmgr-observatory-starter","prmgr-org\u002Fprmgr-observatory-starter","prmgr-org","Free local-first home dashboard starter with synthetc demo data, history graphs, and a customizable inteface.",null,"JavaScript",75,21,52,0,10,30,65.9,"MIT License",false,"main",true,[],"2026-11-01 00:14:09","# PRMGR Observatory Starter\n\nA free, local-first foundation for a dashboard that helps you understand your home. Inspired by the PRMGR Home Observatory build: muted green panels, warm highlights, an illustrated home, and readings with context.\n\n[Download the starter](https:\u002F\u002Fgithub.com\u002Fprmgr-org\u002Fprmgr-observatory-starter\u002Freleases\u002Flatest) · [Connection guide](docs\u002FCONNECTIONS.md)\n\n**Version 1.0.0 · No account, subscription, external scripts, analytics, npm dependencies, or build step.**\n\n## Start here — no coding needed for the demo\n\n1. Download and unzip the starter package.\n2. Open the `public` folder.\n3. Double-click **`index.html`**. It opens in your browser.\n4. Try **Home overview**, **Heat pump**, **Explore readings**, and **Make it yours**.\n\nEvery initial reading is **synthetic demo data**, not measurements from Peter’s home or yours. The illustration is a generic original SVG. Nothing connects to Homey or your equipment automatically.\n\nIf your browser restricts local files, use the optional local server below. Chrome and Edge are good starting points. The packaged demo has also been tested in Chrome; other browsers have not been formally verified.\n\n## What is included?\n\n- Home overview: solar generation, site consumption, grid import\u002Fexport, battery charge.\n- A house\u002Fgarage split, only when the supplied sample supports it.\n- Hot-water temperature and compressor-frequency history.\n- Measurement explorer, latest-sample table, explicit missing data.\n- JSON import\u002Fexport with validation; imports remain in the current tab’s memory.\n- A read-only HomeyScript export example you configure for your own devices.\n- An optional local Node server and recorder for an adapter-produced JSON file.\n- Editable labels and generic house artwork; source code under MIT.\n\nThis is a starter, not the complete personal system shown in the video. It does **not** include automatic device discovery, a Homey login flow, ready-made NIBE\u002FGoodWe\u002FShelly integrations, electricity billing, device controls, camera feeds, an Android TV APK, or TV Home-button replacement. It is usable in a browser on a large display; installing a native TV app is separate work.\n\n## Try importing a dataset\n\nClick **Import readings**, then choose `examples\u002Freadings.json`. This is another **synthetic** example, saved with its own timestamps. Switch to **Explore readings** to see the sample table. Click **Export JSON** to keep a copy.\n\nReloading the page returns to demo. Your imports are not sent to a server or saved to browser storage. If you serve the app on a public website, imported readings still stay in the browser; the optional recorder endpoint belongs on a local server.\n\nSee [the data format](docs\u002FDATA-FORMAT.md) to make a file with your own readings.\n\n## Optional local server\n\nInstall [Node.js LTS](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdownload) (Node 22 or later). Open a terminal **inside the extracted starter folder**, the one containing `package.json`:\n\n```sh\nnode server.mjs\n```\n\nOr use `npm start`. You do **not** need `npm install`.\n\nOpen **http:\u002F\u002F127.0.0.1:8780**. This address works only on the computer running the server. It is not a public download link, and another device such as a TV cannot reach it. Stop with Ctrl+C.\n\nMac users can also run `start.command`; Windows users can run `start-windows.cmd` after installing Node. If macOS blocks the script, run `node server.mjs` in Terminal instead of disabling operating-system protections.\n\n## Keep a history — optional learning workflow\n\nUse three terminal windows, all inside the starter folder:\n\n```sh\n# Window 1: generate SYNTHETIC input every 30 seconds\nnode tools\u002Fsimulate.mjs\n```\n\n```sh\n# Window 2: save new readings to data\u002Fhistory.json\nnode collector.mjs --input examples\u002Fcurrent-reading.json\n```\n\n```sh\n# Window 3: show the dashboard\nnode server.mjs\n```\n\nClick **Load local recorder** on the dashboard. Click again to refresh; it loads a snapshot, not a continuous stream. The badge identifies synthetic recorder data. Stop each process with Ctrl+C.\n\nThe recorder runs independently of the page. Closing the page does not stop it; closing the recorder terminal does. It keeps at most 5,000 samples and preserves their original timestamps. It does not manufacture a new measurement time when an input file hasn’t changed. When recording every 30 seconds, 5,000 samples cover about 42 hours; export\u002Farchive history for longer retention.\n\nTo move from synthetic data to your own adapter:\n\n1. Stop the synthetic generator and recorder.\n2. Archive or rename `data\u002Fhistory.json` so demo and real readings stay separate.\n3. Have your adapter write a JSON file in the documented format. Use an atomic rename so the recorder never reads a partly written file.\n4. Start `node collector.mjs --input \u002Fpath\u002Fto\u002Fyour\u002Freadings.json`.\n5. Open the dashboard and load the local recorder.\n\nThe recorder only reads that local file. Building the connection between your equipment and that file is a separate step. See [connections and Homey](docs\u002FCONNECTIONS.md).\n\n## Make it look like your home\n\nEdit `public\u002Fconfig.js` in a text editor. Change the title and building labels. Keep passwords and tokens out of this file.\n\nReplace the illustration with your own SVG, PNG, JPG, or WebP in `public\u002Fassets`, then change `illustration` to its relative path. Use a simple filename such as `my-house.webp`. The local server serves image files only from that assets folder. Use artwork you own or have permission to distribute. The included SVG is generic and may be modified under MIT.\n\n## An always-on machine \u002F Synology\n\nThe collector can run on a computer that stays on. Its `data` folder must remain persistent across app updates. Keep your private adapter and credentials separate from anything served to browsers.\n\nThe included Dockerfile is an **optional recorder-only recipe**, not a one-click Synology installer. For an experienced Container Manager user:\n\n```sh\ndocker build -t observatory-starter:1.0.0 .\ndocker run --rm --name observatory-recorder \\\n  --mount type=bind,src=\u002Fabsolute\u002Fpath\u002Fto\u002Fprivate-input,dst=\u002Finput,readonly \\\n  --mount type=bind,src=\u002Fabsolute\u002Fpath\u002Fto\u002Fpersistent-data,dst=\u002Fapp\u002Fdata \\\n  observatory-starter:1.0.0\n```\n\nSupply `\u002Finput\u002Freadings.json`, and grant the container’s `node` user write access to the mounted data folder. Adapt host paths and permissions to your NAS. This container does not expose a web port. Container Manager configuration varies by model\u002Fversion, and this recipe has not been run on a NAS as part of starter verification.\n\n## Useful rules from the build\n\n- Pick one question before adding more devices.\n- Verify units against the device or another measurement you trust.\n- Keep missing or stale readings unknown; never silently replace them with zero.\n- Site consumption is not the same as grid import when solar or batteries are involved.\n- A charger already measured by the site meter must not be added twice.\n- A compressor’s frequency is not a verified electrical-power reading.\n- Align source meter timestamps before calculating a building split.\n\n## Troubleshooting\n\n**No readings after importing:** The file may contain nulls for that metric. Try another measurement or inspect the latest-sample table.\n\n**Recorder says “No newer samples”:** Update the input file with a genuinely new measurement timestamp. The recorder intentionally preserves the old time.\n\n**Source changed:** Archive `data\u002Fhistory.json` before changing the source. This prevents mixing demo and real datasets.\n\n**Port already in use:** Stop another starter instance, or use another port. macOS\u002FLinux: `PORT=8781 node server.mjs`; Windows PowerShell: `$env:PORT=8781; node server.mjs`.\n\n**A local-file import doesn’t work in your browser:** Use the optional local server and try again.\n\n**Nothing updates while looking at the recorder:** Click **Load local recorder** again. Automatic polling is not included in v1.0.0.\n\n## Development and reuse\n\nRun `npm test` with Node 22+ to exercise data validation, history persistence, chart-gap handling, and server boundaries. No package installation is needed. Packaging: `npm run package`.\n\nSee [LICENSE](LICENSE) and [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md). The code and generic illustration are MIT-licensed. The PRMGR name identifies the original project; use your own name for redistributed products rather than implying they are official PRMGR releases. This is a community starter with no support service or device-compatibility promise.\n",2,"2026-10-31 04:26:25","CREATED_QUERY"]