Crumbforest Seed Kit â PflanzâBauplan v1
Ziel: Ein kleinster, stabiler Startpunkt, damit Kinder (âKrĂźmelâ) sofort etwas pflanzen kĂśnnen â offlineâfreundlich, mit TerminalâMissionen, Logging (KrĂźmelLog) und optionaler Anbindung an eure bestehende crumbapi/QdrantâWelt.
Quickstart (Ăbersicht)
- Config anlegen:
/etc/crumb/seed.conf - Missionen installieren:
/usr/local/bin/crumbmissions/⌠- Menß:
/usr/local/bin/mission_selector.sh - Start:
sudo /usr/local/bin/mission_selector.sh(oder Ăźberttydals WebâTerminal)
Alle Pfade sind bewusst schlicht gehalten und funktionieren ohne Docker. Passt Variablen bei Bedarf an.
1) Konfiguration
Datei: /etc/crumb/seed.conf
# Crumbforest Seed Kit â Grundkonfiguration
CRUMBAPI_URL="https://194-164-194-191.sslip.io/crumbapi" # oder leer lassen, wenn nicht vorhanden
QDRANT_URL="http://localhost:6333" # oder RemoteâURL
LOG_DIR="/opt/crumb/log" # KrĂźmelLogâAblage
ROBOT_USER="robot" # TerminalâNutzer
TTYD_PORT=7780 # WebâTerminal Port (optional)
2) MissionsâMenĂź
Datei: /usr/local/bin/mission_selector.sh
#!/usr/bin/env bash
set -euo pipefail
MISSION_DIR="/usr/local/bin/crumbmissions"
mkdir -p "$MISSION_DIR"
while true; do
clear || true
echo "đą Crumbforest â Missionen"
echo "----------------------------------"
i=0
mapfile -t missions < <(find "$MISSION_DIR" -maxdepth 1 -type f -name 'mission_*.sh' | sort)
if ((${#missions[@]}==0)); then
echo "(Noch keine Missionen gefunden in $MISSION_DIR)"
else
for m in "${missions[@]}"; do
((i++))
b=$(basename "$m")
title=$(head -n1 "$m" | sed 's/^# *//; s/^$/'"$b"'/')
printf "%2d) %s\n" "$i" "$title"
done
fi
echo " q) Quit"
echo
read -rp "Wähle: " choice || true
[[ "${choice:-}" == "q" ]] && exit 0
if [[ "${choice:-}" =~ ^[0-9]+$ ]] && (( choice>=1 && choice<=${#missions[@]} )); then
echo
"${missions[choice-1]}" || true
echo
read -rp "âŠď¸ Enter fĂźr MenĂź âŚ" _ || true
fi
done
Rechte setzen:
sudo chmod +x /usr/local/bin/mission_selector.sh
3) Mission 00 â SystemâCheck & KrĂźmelLog
Datei: /usr/local/bin/crumbmissions/mission_00_check.sh
#!/usr/bin/env bash
# Mission 00 â SystemâCheck & KrĂźmelLog
set -euo pipefail
CONF="/etc/crumb/seed.conf"
[[ -f "$CONF" ]] && source "$CONF" || { echo "Fehlende $CONF"; exit 1; }
LOG_FILE="${LOG_DIR:-/opt/crumb/log}/kruemellog.jsonl"
mkdir -p "$(dirname "$LOG_FILE")"
log(){
local emoji="$1" msg="$2" src="mission_00_check"
printf '{"ts":"%s","emoji":"%s","msg":"%s","src":"%s"}\n' "$(date -Is)" "$emoji" "$msg" "$src" | tee -a "$LOG_FILE"
}
# 1) Router / DefaultâGateway
GW=$(ip route | awk '/default/ {print $3; exit}')
if [[ -n "${GW:-}" ]]; then
if ping -c1 -W1 "$GW" >/dev/null 2>&1; then
log "đ°ď¸" "Gateway erreichbar: $GW"
else
log "â ď¸" "Gateway NICHT erreichbar: $GW"
fi
else
log "â ď¸" "Kein DefaultâGateway gefunden"
fi
# 2) crumbapiâHealth (optional)
if [[ -n "${CRUMBAPI_URL:-}" ]]; then
if curl -sk "${CRUMBAPI_URL}/health" | grep -q '"ok":\s*true'; then
log "đ§" "crumbapi OK: ${CRUMBAPI_URL}"
else
log "â" "crumbapi NICHT OK: ${CRUMBAPI_URL}"
fi
else
log "âšď¸" "CRUMBAPI_URL nicht gesetzt â Ăźbersprungen"
fi
# 3) QdrantâPing (optional)
if [[ -n "${QDRANT_URL:-}" ]]; then
if curl -s "${QDRANT_URL}/collections" | grep -qi 'status'; then
log "đŚ" "Qdrant erreichbar: ${QDRANT_URL}"
else
log "â" "Qdrant NICHT erreichbar: ${QDRANT_URL}"
fi
else
log "âšď¸" "QDRANT_URL nicht gesetzt â Ăźbersprungen"
fi
# 4) Serielle / I²C Geräte â sanfter Check
if ls /dev/ttyACM* /dev/ttyUSB* /dev/i2c-* >/dev/null 2>&1; then
DEVICES=$(ls /dev/ttyACM* /dev/ttyUSB* /dev/i2c-* 2>/dev/null | xargs -r echo)
log "đ" "Sensorâ/Busgeräte sichtbar: ${DEVICES:-none}"
else
log "đž" "Keine seriellen/I²C Geräte entdeckt â ok fĂźr reines Terminal"
fi
echo
echo "â
SystemâCheck abgeschlossen. Log: $LOG_FILE"
Rechte setzen:
sudo mkdir -p /usr/local/bin/crumbmissions
sudo chmod +x /usr/local/bin/crumbmissions/mission_00_check.sh
4) Mission 01 â Samen setzen (PflanzâProtokoll)
Datei: /usr/local/bin/crumbmissions/mission_01_seed.sh
#!/usr/bin/env bash
# Mission 01 â Samen setzen
set -euo pipefail
CONF="/etc/crumb/seed.conf"
[[ -f "$CONF" ]] && source "$CONF" || { echo "Fehlende $CONF"; exit 1; }
GARDEN_DIR="/opt/crumb/garden/seeds"
LOG_FILE="${LOG_DIR:-/opt/crumb/log}/kruemellog.jsonl"
mkdir -p "$GARDEN_DIR" "$(dirname "$LOG_FILE")"
read -rp "đą Wie soll dein Samen heiĂen? " NAME
[[ -z "${NAME// }" ]] && { echo "Bitte einen Namen eingeben."; exit 1; }
ID=$(date +%s)
FILE="$GARDEN_DIR/${ID}_$(echo "$NAME" | tr ' ' '_' | tr -cd '[:alnum:]_').json"
cat >"$FILE" <<JSON
{
"id": $ID,
"name": "${NAME}",
"author": "${USER}",
"ts": "$(date -Is)",
"note": "Erster Samen im KrĂźmelâGarten",
"tags": ["seed","kid"]
}
JSON
printf '{"ts":"%s","emoji":"%s","msg":"%s","src":"%s"}\n' "$(date -Is)" "đą" "Samen \"${NAME}\" gesetzt â $(basename "$FILE")" "mission_01_seed" | tee -a "$LOG_FILE"
cat <<'ASCII'
.
.'.
|o| đą Dein Samen wurde gesetzt.
.'o'. Er wächst, wenn du Fragen stellst.
|.-.|
' '
ASCII
Rechte setzen:
sudo chmod +x /usr/local/bin/crumbmissions/mission_01_seed.sh
5) TerminalâStart (lokal oder per WebâTerminal)
A) Direkt starten
sudo /usr/local/bin/mission_selector.sh
B) WebâTerminal mit ttyd (optional)
Service: /etc/systemd/system/ttyd.service
[Unit]
Description=Crumbterm (ttyd)
After=network.target
[Service]
EnvironmentFile=/etc/crumb/seed.conf
ExecStart=/usr/bin/ttyd -p ${TTYD_PORT:-7780} -i 0.0.0.0 -t title:Crumbterm bash -lc /usr/local/bin/mission_selector.sh
Restart=always
User=${ROBOT_USER:-robot}
[Install]
WantedBy=multi-user.target
Aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable --now ttyd
6) KrĂźmelLog â Format
Wir loggen einfach lesbar als JSONâZeilen (JSONL), z.âŻB. in "$LOG_DIR/kruemellog.jsonl":
{"ts":"2025-09-23T19:12:34+02:00","emoji":"đą","msg":"Samen \"Birke\" gesetzt â 1695492754_Birke.json","src":"mission_01_seed"}
{"ts":"2025-09-23T19:13:02+02:00","emoji":"đ§","msg":"crumbapi OK: https://âŚ/crumbapi","src":"mission_00_check"}
Dieses Log ist bewusst pädagogisch â es erleichtert Kindern (und Erwachsenen) das Verstehen. Es kann später in CakePHP/CrumbAPI eingelesen werden.
7) Offlineâfreundlich & sicher
- Keine Cloud notwendig: Missionen laufen auch ohne Internet.
CRUMBAPI_URL/QDRANT_URLsind optional. - Sanfte Checks: Nichts bricht hart; alles meldet verständlich.
- Erweiterbar: Neue Missionen = neue Dateien
mission_*.sh.
8) Nächste MiniâSchritte (optional)
- Mission 02 â FotoâSamen: Kamera/USB prĂźfen, Foto knipsen, als
seed_photoablegen. - Mission 03 â SensorâEcho: Z.âŻB. Temperatur/Feuchte lesen (I²C) â in SamenâJSON anhängen.
- Mission 04 â Echo zur Crew: Wenn
crumbapiverfĂźgbar, Samen als Event posten.
9) Troubleshooting (Kurz)
Fehlende /etc/crumb/seed.confâ Datei anlegen (siehe oben).curl: not found/ip: not foundâsudo apt install curl iproute2 -y.ttyd: not foundâ Paket bereitstellen/kompilieren oder bestehendes TTYD nutzen (ihr habt das meist schon).
Fertig. Das ist ein kompakter Startpunkt ohne neue Abhängigkeiten. Wenn ihr soweit seid, ergänzen wir Missionen fĂźr Blockly, MQTT/LoRa und eure bestehende CakePHPâAPI â Schritt fĂźr Schritt, ohne Drift.