Skip to Content
User guideInstall

Install seedypod on a Gardyn

seedypod runs on the Raspberry Pi already inside the unit: early Gardyns use a Pi Zero W, later ones a Pi Zero 2 W. The default setup runs both hald and core on that Pi. You can also run core on any other machine on your LAN and point it at the daemon (deployment topologies).

Back up the stock card

  1. Power off the unit, open the base, and remove the Pi’s microSD card.
  2. On a computer, image it and keep the image somewhere safe:
sudo dd if=/dev/YOUR_CARD of=gardyn-stock.img bs=4M status=progress

This image is your way back to the stock Gardyn software. Do not skip it.

Flash Raspberry Pi OS

Use a high-endurance microSD card, the kind rated for continuous video recording (SanDisk High Endurance, Samsung PRO Endurance or similar). It costs a few dollars more than a standard card and is the cheapest reliability gain there is.

In Raspberry Pi Imager, choose Raspberry Pi OS Lite: 64-bit for a Zero 2 W, Pi 4 or Pi 5, 32-bit for the original Zero W. In the advanced options set the hostname to seedypod, enable SSH and add your Wi-Fi. Reseat the card, boot, then connect:

ssh pi@seedypod.local

Enable I²C and install the hardware daemon

sudo raspi-config nonint do_i2c 0 curl -fsSL https://raw.githubusercontent.com/seedypod/core/main/scripts/install-hal | bash hald --check

The installer detects the CPU, downloads the matching hald binary from the latest GitHub release, writes a commented /etc/seedypod/hal.toml, creates a seedypod system user in the gpio, i2c and video groups, enables the PWM overlay for the grow light (one reboot needed), installs fswebcam, installs the Mosquitto MQTT broker on 127.0.0.1:1883 (reachable only from the Pi itself), and enables hald.service. hald --check validates the config and prints the devices it plans to use. See the hald reference for options.

It also cuts how much the Pi writes to its card (ADR 0021): the system journal stays in RAM, swap moves to compressed RAM (zram), and / is mounted with noatime. Each change is checked once it’s applied and undone if the check fails, and --no-wear skips all three. Logs then last until reboot; Debugging shows how to keep them longer. Settings → Storage shows how much the unit writes a day.

How these three settings behave on a real Raspberry Pi OS install is on the hardware checklist. So far they are tested only against stubbed system commands.

Install core

On the same Pi, or on any machine on your LAN:

curl -fsSL https://raw.githubusercontent.com/seedypod/core/main/scripts/install | bash

Core listens on port 3000. If hald runs on another machine, set HAL_MQTT_URL in /etc/systemd/system/seedypod-core.service. Then open http://seedypod.local:3000/.

A new install opens on Welcome. Choose Set up a new garden, or Restore from a backup if this card replaces one that died (Replace a dead SD card).

The installer accepts --branch dev to install the rolling development build, --prefix to change the install location (default /opt/seedypod), and --restore <file|url> to restore a backup straight after installing. It also installs the restore helper at /usr/local/sbin/seedypod-restore and lets core’s user run it with sudo, for that one path.

Connect Home Assistant (optional)

Home Assistant needs to reach the broker hald publishes to. Pick one:

  • Home Assistant on another machine, using the unit’s broker. Run the installer with --mqtt-lan: curl -fsSL https://raw.githubusercontent.com/seedypod/core/main/scripts/install-hal | bash -s -- --mqtt-lan. The broker then also listens on port 1884, password-protected, and the installer prints the homeassistant password once. In Home Assistant, add the MQTT integration with host seedypod.local, port 1884, user homeassistant and that password.
  • Home Assistant’s own broker (the Mosquitto add-on). Install with --no-broker instead, then set mqtt_url, mqtt_username and mqtt_password in /etc/seedypod/hal.toml, and HAL_MQTT_URL=mqtt://USER:PASS@homeassistant.local:1883 in /etc/systemd/system/seedypod-core.service. Restart both with sudo systemctl daemon-reload && sudo systemctl restart hald seedypod-core.

Either way, the Gardyn appears through MQTT discovery. See Home Assistant.

First things to set

Open Settings in the web UI and set:

  • Timezone, so schedules fire at the right local time.
  • Tank calibration: the ultrasonic distance in centimetres when the tank is just filled, and when the pump would run dry. These turn the distance reading into a tank percentage.
  • Grow reminders, if the defaults (thinning at day 14, root check at 21, harvest at 35, nutrients every 7 days) do not suit your plants.

Then add a light curve and a watering schedule.

Back up off the card

Settings → Backup → Download backup saves a seedypod-backup-<unit>-<date>.tar.gz with the database, hal.toml, the Home Assistant broker password and hald’s state. Switch on Include photos to add the stills as well. The file holds your bucket secret and MQTT password, so keep it somewhere private.

With the off-device mirror set up, a backup also goes to backups/ in your bucket every night after 03:00, keeping the newest 14. If no backup succeeds for 7 days, a Backup overdue alert appears on Home, in Alerts and in Home Assistant. There is no backup on the card itself, since it would die with the card. See Maintenance → Backups.

Replace a dead SD card

With a recent backup in the bucket or a downloaded file, this takes about fifteen minutes and no shell:

Flash a new card

Flash Raspberry Pi OS Lite as above, with the same hostname and Wi-Fi. A high-endurance card is worth it.

Run both installers

Run install-hal, then install, as above.

Restore

Open http://seedypod.local:3000, choose Restore from a backup, and either upload the file or enter the mirror’s bucket settings from the old card and pick the newest backup. The unit restarts on it, with its schedules, grow cycle, pods, Autopilot rules, probes, calibration and history. It keeps the same unit id, so Home Assistant keeps the same device.

From the shell, scripts/install --restore <file|url> does the same. The restore checks the backup first. It refuses a damaged file, and a backup from newer software than the unit runs, naming the version to install first. If you restored the wrong backup, Settings → Backup → Undo restore puts back what it replaced.

The full backup → wipe → restore round trip runs in the simulated bring-up. Restoring on a real card is on the hardware checklist.

Change Wi-Fi

No keyboard needed. Hold the unit’s button for 10 seconds. At 1 second it acknowledges any latched fault; keep holding. The unit then opens an open hotspot named seedypod-setup-xxxx for 15 minutes:

  1. Join seedypod-setup-xxxx from a phone.
  2. Open http://10.42.0.1:3000/wifi, pick your network, enter its password, and press Join.
  3. The unit leaves the hotspot and joins your network. Rejoin your network on the phone and open http://seedypod.local:3000/.

If the password was wrong, the hotspot comes back and the Wi-Fi screen says why. On your network, Settings → Wi-Fi does the same without the button. The hotspot is open because pressing the button already proves someone is at the unit, and it closes itself after 15 minutes.

Uninstall

sudo systemctl disable --now seedypod-core hald sudo rm -rf /opt/seedypod /etc/systemd/system/seedypod-core.service /etc/systemd/system/hald.service \ /usr/local/sbin/seedypod-restore /etc/sudoers.d/seedypod-restore /var/lib/seedypod-restore

Or reflash the stock image from the first step.


Source: docs/INSTALLATION.md · docs/MAINTENANCE.md · scripts/install · scripts/install-hal · scripts/seedypod-restore.cjs

Last updated on