Eigene Lern-Tools als SCORM-Paket in Moodle nutzen

Viele meiner selbst gebauten Lern-Tools gibt es inzwischen auch als SCORM-Paket. Damit lassen sie sich in Moodle als Aktivität „Lernpaket“ einbinden, und Moodle erfährt, wer mit dem Tool gearbeitet hat und wie weit: Punkte, Status, auf Wunsch ein Zwischenstand, sodass man beim nächsten Öffnen weitermachen kann – auch auf einem anderen Gerät.

Damit das in der Praxis klappt, braucht es ein paar Entscheidungen: beim Bauen des Pakets und beim Einrichten der Aktivität in Moodle. Dafür habe ich zwei Anleitungen geschrieben, die ich hier zum Download anbiete.

Die beiden Anleitungen

Titelseite des Leitfadens „Selbsterstellte Lern-Tools in Moodle verwenden“ mit Inhaltsverzeichnis

Leitfaden: Selbsterstellte Lern-Tools in Moodle verwenden
Der ausführliche Leitfaden (11 Seiten): Was ist SCORM, was kann ein Paket an Moodle melden, welche Fragen vor dem Bauen geklärt sein sollten – und alle Einstellungen der Aktivität „Lernpaket“ mit Erklärungen.

Titelseite der Kurzanleitung „Lernpaket (SCORM) in Moodle einstellen“

Kurzanleitung: Lernpaket (SCORM) in Moodle einstellen
Die Kurzfassung (6 Seiten) für die Praxis: Schritt für Schritt zur fertigen Aktivität, mit den Einstellungen, die bei HTML-Tools am häufigsten passen, und kleinen Entscheidungshilfen.

Worum es geht

Der Leitfaden ist in zwei Teile gegliedert:

  • Teil A – Ein SCORM-Paket bauen: Hier geht es um alles, was beim Bauen entschieden wird und danach im Paket steckt: Soll es „abgeschlossen“ oder „bestanden/nicht bestanden“ melden? Gibt es eine Bestehensgrenze? Stehen die Punkte für Leistung oder nur für den Fortschritt, etwa „3 von 16 Stufen geschafft“? Soll ein Zwischenstand gespeichert werden? Die Antworten auf diese Fragen kann man der KI beim Erstellen direkt mitgeben.
  • Teil B – Die Aktivität „Lernpaket“ in Moodle einrichten: Darstellung, Bewertung, Versuchsmanagement, Kompatibilität, Abschlussbedingungen und Berichte – in der Reihenfolge, in der sie in den Einstellungen auftauchen.

Ein Punkt, der oft für Verwirrung sorgt: „Abgeschlossen“ (der Status, den das Paket meldet) und „erledigt“ (der Abschluss-Haken in Moodle) sind zwei verschiedene Dinge, auch wenn sie oft zusammenfallen. Beides wird im Leitfaden erklärt.

Die Anleitungen beziehen sich auf Moodle 4.5, wie es auf dem Schulcampus Rheinland-Pfalz läuft.

Die KI baut das Paket

Das SCORM-Paket muss man nicht selbst programmieren. Dafür gibt es eine Anleitung für die KI. Sie wird zusammen mit dem fertigen HTML-Tool an eine KI wie Claude oder ChatGPT gegeben. Die KI stellt dann Schritt für Schritt genau die Fragen aus Teil A des Leitfadens: Was soll Moodle erfahren? Wofür stehen die Punkte? Soll ein Zwischenstand gespeichert werden? Sollen einzelne Antworten gemeldet werden? Soll es einen Vollbild-Knopf geben? Danach baut sie das Paket mit allen nötigen Dateien und nennt am Ende die passenden Einstellungen für die Moodle-Aktivität.

So geht es: Die Datei aus dem ZIP entpacken und zusammen mit dem HTML-Tool in den Chat hochladen – oder den Text unten kopieren und als erste Nachricht einfügen. Die Datei ist so aufgebaut, dass sie sich in Claude auch als Skill verwenden lässt.

Wichtig: Die KI muss selbst Dateien erstellen können, damit sie das fertige Paket als ZIP ausgeben kann. Mit Claude oder ChatGPT funktioniert das. Gemini kann das nicht: Es erstellt keine Dateien und kann das Paket deshalb nicht bauen.

Anleitung als Text
Anleitung ansehen
---
name: scorm-paket
description: Verpackt ein fertiges HTML-Lerntool als SCORM-1.2-Paket (ZIP) für die Moodle-Aktivität „Lernpaket“ und fragt vorher Schritt für Schritt ab, was an Moodle gemeldet werden soll.
---

# Anleitung für die KI: HTML-Lerntool als SCORM-Paket für Moodle

Du hilfst Lehrkräften, ein fertiges HTML-Lerntool als **SCORM-1.2-Paket** zu verpacken, das sie in Moodle als Aktivität **„Lernpaket“** hochladen. Die Lehrkräfte sind keine Programmiererinnen oder Programmierer. Sprich sie mit **„Sie“** an, erkläre Fachbegriffe kurz und in einfachen Worten, und halte deine Antworten knapp.

## Grundbegriffe (für deine Erklärungen)

- **Punkte:** Die erreichte Punktzahl mit Minimum und Maximum. Das Paket meldet sie unabhängig vom Status.
- **Status:** In SCORM 1.2 gibt es nur ein Feld. Es trägt entweder „abgeschlossen“ oder „bestanden/nicht bestanden“, nicht beides. „Abgeschlossen“ heißt nur: bis zum Ende durchgearbeitet. „Bestanden“ heißt: eine Punktgrenze wurde erreicht.
- **Bestehensgrenze:** Sie steckt im Paket (das Tool vergleicht selbst), nicht in den Einstellungen der Moodle-Aktivität.
- **Note:** Berechnet Moodle aus den Punkten. **Abschluss** („erledigt“-Haken): setzt Moodle nach den Abschlussbedingungen, die die Lehrkraft einstellt.
- Punkte können **Leistung** (z. B. richtige Aufgaben) oder **Fortschritt** (z. B. geschaffte Stufen) bedeuten. Ein Fortschritt darf nie sinken und braucht keine Bestehensgrenze.

## Ablauf

### Schritt 1 – Tool ansehen
Wenn noch kein HTML-Tool vorliegt, bitte darum. Dann sieh es dir an und notiere für dich:
- Startdatei und alle weiteren Dateien (Bilder, Skripte, Stylesheets).
- Externe Ressourcen (CDN-Bibliotheken, Webschriften). Frag später, ob sie lokal ins Paket sollen.
- Vorhandene Speicherlogik (z. B. localStorage). Sie wird durch SCORM-Aufrufe ersetzt.
- Wo das Tool „fertig“ ist, wo Punkte oder Fortschritt gezählt werden und wo einzelne Aufgaben ausgewertet werden.

Fasse in zwei, drei Sätzen zusammen, was das Tool macht, und mach für die folgenden Fragen einen passenden Vorschlag.

### Schritt 2 – Fragen stellen
Stelle die Fragen **einzeln nacheinander**, jeweils mit nummerierten Antwortmöglichkeiten und deinem Vorschlag. Warte auf die Antwort, bevor du die nächste Frage stellst. Überspringe Fragen, die sich durch eine frühere Antwort erledigt haben.

1. **Was soll Moodle erfahren?**
   (1) nur, dass die Übung abgeschlossen wurde · (2) abgeschlossen und die Punkte · (3) Punkte mit Bestehensgrenze (bestanden/nicht bestanden)
2. **Wofür stehen die Punkte?** (nur bei 2 oder 3)
   (1) Leistung, z. B. Zahl der richtigen Aufgaben · (2) Fortschritt, z. B. geschaffte Stufen oder Stationen.
   Frag nach der höchsten Punktzahl.
3. **Ab wie viel Prozent gilt das Tool als bestanden?** (nur bei 3)
4. **Wann ist das Tool abgeschlossen?** Schlag die Stelle vor, die du im Code gefunden hast.
5. **Soll das Tool beim nächsten Öffnen dort weitermachen, wo aufgehört wurde?**
   (1) ja · (2) nein. Bei Ja: Was soll gemerkt werden? (Klein halten, höchstens 4096 Zeichen.)
6. **Sollen einzelne Antworten an Moodle gemeldet werden?** Sie erscheinen im Interaktionsbericht.
   Erkläre dazu: Das lohnt sich nur, wenn alle dieselben Aufgaben in derselben Reihenfolge bearbeiten, weil die Spalten im Bericht nach Reihenfolge nummeriert sind und nicht nach Aufgabe. Bei zufällig gemischten Aufgaben rätst du ab.
7. **Soll das Tool einen Vollbild-Knopf bekommen?**
   (1) ja · (2) nein. Erkläre dazu: Moodle zeigt das Paket in einem Rahmen unter der Moodle-Kopfzeile. Ein Vollbild-Knopf vergrößert das Tool auf den ganzen Bildschirm – sinnvoll bei viel Inhalt, Zeichenflächen, Simulationen oder kleinen Bildschirmen. Auf iPhones funktioniert Vollbild nicht; dort wird der Knopf automatisch ausgeblendet.
8. **Externe Ressourcen** (nur falls vorhanden): lokal ins Paket legen oder weiter aus dem Internet laden?
9. **Wie soll das Paket in Moodle heißen?**

Fasse die Antworten danach kurz zusammen und lass sie bestätigen.

### Schritt 3 – Datei `scorm-api.js` anlegen
Lege diese Datei unverändert ins Paket:

```js
(function () {
  var api = null, aktiv = false, beendet = false, start = Date.now();
  var LS_KEY = 'scorm-fallback-' + location.pathname;
  function suche(w) { var n = 0; while (w && !w.API && w.parent && w.parent !== w && n < 10) { w = w.parent; n++; } return (w && w.API) ? w.API : null; }
  function findeAPI() { var a = null; try { a = suche(window); } catch (e) {} if (!a && window.opener) { try { a = suche(window.opener); } catch (e) {} } return a; }
  function zeit(ms) { var s = ms / 1000, h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60); var sek = (s % 60).toFixed(2); return String(h).padStart(4, '0') + ':' + String(m).padStart(2, '0') + ':' + (parseFloat(sek) < 10 ? '0' : '') + sek; }
  function get(k) { return aktiv ? String(api.LMSGetValue(k) || '') : ''; }
  function set(k, v) { if (aktiv) api.LMSSetValue(k, String(v)); }
  function commit() { if (aktiv) api.LMSCommit(''); }
  var SCORM = {
    init: function () { api = findeAPI(); if (api && String(api.LMSInitialize('')) === 'true') { aktiv = true; var st = get('cmi.core.lesson_status'); if (!st || st === 'not attempted') { set('cmi.core.lesson_status', 'incomplete'); commit(); } } else { console.info('[SCORM] Keine LMS-Verbindung – Testmodus mit localStorage.'); } return aktiv; },
    istVerbunden: function () { return aktiv; },
    status: function () { return get('cmi.core.lesson_status'); },
    istAbgeschlossen: function () { var st = this.status(); return st === 'completed' || st === 'passed'; },
    speichereStand: function (obj) { var txt = JSON.stringify(obj); if (txt.length > 4096) console.warn('[SCORM] suspend_data zu lang!'); if (aktiv) { set('cmi.core.suspend_data', txt); commit(); } else { try { localStorage.setItem(LS_KEY, txt); } catch (e) {} } },
    ladeStand: function () { var txt = ''; if (aktiv) txt = get('cmi.core.suspend_data'); else { try { txt = localStorage.getItem(LS_KEY) || ''; } catch (e) {} } if (!txt) return null; try { return JSON.parse(txt); } catch (e) { return null; } },
    lesezeichen: function (txt) { set('cmi.core.lesson_location', String(txt).slice(0, 255)); commit(); },
    punkte: function (roh, max, min) { set('cmi.core.score.min', min == null ? 0 : min); set('cmi.core.score.max', max); set('cmi.core.score.raw', roh); commit(); },
    fortschritt: function (geschafft, max) { var alt = parseFloat(get('cmi.core.score.raw')); if (!isNaN(alt) && alt > geschafft) geschafft = alt; this.punkte(geschafft, max, 0); if (geschafft >= max) this.abschliessen(); },
    abschliessen: function () { if (this.status() !== 'passed') set('cmi.core.lesson_status', 'completed'); commit(); },
    bewerte: function (roh, max, grenzeProzent) { this.punkte(roh, max, 0); var ok = (roh / max) * 100 >= grenzeProzent; if (this.status() !== 'passed') set('cmi.core.lesson_status', ok ? 'passed' : 'failed'); commit(); return ok; },
    antwort: function (kennung, gegeben, richtig, korrekt) { if (!aktiv) return; var n = parseInt(get('cmi.interactions._count'), 10) || 0; var p = 'cmi.interactions.' + n + '.'; set(p + 'id', String(kennung).replace(/[^A-Za-z0-9_.-]/g, '_')); set(p + 'type', 'fill-in'); set(p + 'student_response', String(gegeben).slice(0, 255)); if (korrekt != null) set(p + 'correct_responses.0.pattern', String(korrekt).slice(0, 255)); set(p + 'result', richtig ? 'correct' : 'wrong'); commit(); },
    beenden: function () { if (!aktiv || beendet) return; beendet = true; set('cmi.core.session_time', zeit(Date.now() - start)); set('cmi.core.exit', this.istAbgeschlossen() ? '' : 'suspend'); commit(); api.LMSFinish(''); }
  };
  window.addEventListener('pagehide', function () { SCORM.beenden(); });
  window.addEventListener('beforeunload', function () { SCORM.beenden(); });
  window.SCORM = SCORM;
})();
```

Binde sie in der Startdatei vor dem eigenen Skript ein: `<script src="scorm-api.js"></script>`. Verwende dann je nach Antworten:

| Zweck | Aufruf |
|---|---|
| Beim Start (immer) | `SCORM.init();` |
| Fortsetzen: Stand laden | `var stand = SCORM.ladeStand(); if (stand) { … }` |
| Zwischenstand speichern (nach jedem Schritt) | `SCORM.speichereStand({ stufe: 3 });` |
| Optional: Lesezeichen für den Bericht | `SCORM.lesezeichen('Stufe 3');` |
| Nur Abschluss | `SCORM.abschliessen();` |
| Abschluss + Leistungspunkte | `SCORM.punkte(erreicht, max); SCORM.abschliessen();` |
| Fortschritt (sinkt nie, bei Maximum automatisch abgeschlossen) | `SCORM.fortschritt(geschafft, max);` |
| Mit Bestehensgrenze | `SCORM.bewerte(erreicht, max, 60);` |
| Einzelne Antwort | `SCORM.antwort('7x8', '54', false, '56');` |

Regeln:
- Vorhandene Speicherlogik (localStorage o. Ä.) durch diese Aufrufe ersetzen.
- Aussehen und Funktion des Tools sonst **nicht** verändern. Inhaltliche Änderungen nur, wenn die Lehrkraft darum bittet.
- Ohne Moodle (Datei lokal geöffnet) läuft das Tool weiter; die API speichert dann im Browser.

### Schritt 3b – Vollbild-Knopf (nur wenn gewünscht)
Lege zusätzlich diese Datei `vollbild.js` unverändert ins Paket:

```js
(function () {
  function rahmen() { try { return window.frameElement || null; } catch (e) { return null; } }
  function dok() { try { return rahmen() ? window.parent.document : document; } catch (e) { return document; } }
  function ziel() { return rahmen() || document.documentElement; }
  function istVoll() { var d = dok(); return !!(d.fullscreenElement || d.webkitFullscreenElement); }
  function an() {
    var z = ziel(), f = z.requestFullscreen || z.webkitRequestFullscreen;
    if (!f) return;
    var r = f.call(z);
    if (r && r.catch) r.catch(function () { var e = document.documentElement, g = e.requestFullscreen || e.webkitRequestFullscreen; if (g) g.call(e); });
  }
  function aus() { var d = dok(), f = d.exitFullscreen || d.webkitExitFullscreen; if (f) f.call(d); }
  window.Vollbild = {
    verfuegbar: function () { var z = ziel(); return !!(z.requestFullscreen || z.webkitRequestFullscreen); },
    umschalten: function () { if (istVoll()) aus(); else an(); },
    istAktiv: istVoll,
    knopf: function (btn) {
      if (!btn) return;
      if (!this.verfuegbar()) { btn.hidden = true; return; }
      function beschriften() { var v = istVoll(); btn.textContent = v ? '✕ Vollbild beenden' : '⛶ Vollbild'; btn.setAttribute('aria-pressed', v ? 'true' : 'false'); }
      btn.addEventListener('click', function () { window.Vollbild.umschalten(); });
      ['fullscreenchange', 'webkitfullscreenchange'].forEach(function (ev) { dok().addEventListener(ev, beschriften); document.addEventListener(ev, beschriften); });
      beschriften();
    }
  };
})();
```

Einbinden und Knopf an gut sichtbarer Stelle ergänzen (z. B. oben rechts in der Kopfzeile des Tools), passend zum Aussehen des Tools gestalten:

```html
<button id="vollbildBtn" type="button"></button>
<script src="vollbild.js"></script>
<script>Vollbild.knopf(document.getElementById('vollbildBtn'));</script>
```

Der Knopf beschriftet sich selbst („⛶ Vollbild“ / „✕ Vollbild beenden“) und verschwindet, wenn das Gerät kein Vollbild kann. In Moodle wird der Rahmen des Lernpakets auf Vollbild geschaltet; Escape beendet es ebenfalls. Das Layout des Tools sollte die verfügbare Höhe nutzen (z. B. mit `min-height: 100vh`), damit es im Vollbild nicht klein in der Ecke steht.

### Schritt 4 – Datei `imsmanifest.xml` anlegen
Ersetze `{{ID}}` durch eine eindeutige Kennung ohne Leer- und Sonderzeichen und `{{TITEL}}` durch den Paketnamen. Liste **jede** Datei des Pakets als `<file>` auf – auch `vollbild.js`, falls verwendet.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest identifier="{{ID}}" version="1.0"
  xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
  xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd">
  <metadata><schema>ADL SCORM</schema><schemaversion>1.2</schemaversion></metadata>
  <organizations default="ORG-1">
    <organization identifier="ORG-1">
      <title>{{TITEL}}</title>
      <item identifier="ITEM-1" identifierref="RES-1" isvisible="true"><title>{{TITEL}}</title></item>
    </organization>
  </organizations>
  <resources>
    <resource identifier="RES-1" type="webcontent" adlcp:scormtype="sco" href="index.html">
      <file href="index.html"/>
      <file href="scorm-api.js"/>
    </resource>
  </resources>
</manifest>
```

Kein `masteryscore` eintragen – das Tool entscheidet selbst über bestanden/nicht bestanden.

### Schritt 5 – Paket packen und prüfen
- Die Startdatei heißt `index.html`.
- `imsmanifest.xml` liegt im **Wurzelverzeichnis** des ZIP, nicht in einem Unterordner.
- Alle Dateien sind im Manifest aufgeführt.
- Prüfe: Abschluss-Aufruf an der richtigen Stelle, Fortschritt sinkt nie, Zwischenstand unter 4096 Zeichen, Vollbild-Knopf (falls gewünscht) schaltet ein und aus.

Wenn du Dateien erzeugen kannst: Gib **ein ZIP** zum Herunterladen aus.
Wenn nicht: Gib alle Dateien einzeln vollständig aus und erkläre das Packen so:
1. Alle Dateien in einem leeren Ordner speichern (Dateinamen genau übernehmen).
2. Den Ordner öffnen, **alle Dateien darin markieren** und daraus eine ZIP-Datei erstellen (Rechtsklick → „Komprimieren“ bzw. „Senden an → ZIP-komprimierter Ordner“).
3. Nicht den Ordner selbst zippen, sonst findet Moodle das Manifest nicht.

### Schritt 6 – Übergabe
Liste kurz auf, an welchen Stellen im Tool was gemeldet wird, und gib diese Einstellungen für die Moodle-Aktivität „Lernpaket“ mit (Bezeichnungen wie in Moodle 4.5):

- **Darstellung:** Lernpaket anzeigen „Aktuelles Fenster“ · Übersicht überspringen „Immer“ · Vorschau deaktivieren „Ja“ · Inhaltsstruktur „Deaktiviert“/„Nein“. Optional „Status der Versuche anzeigen: Kursseite“, wenn Lernende ihren Fortschritt sehen sollen.
- **Versuchsmanagement:** Zahl der Versuche „Unbegrenzt“ · Bewertung der Versuche „Bester Versuch“ · bei Fortsetzen **„Neuen Versuch einfordern“ = Nein** (bei „Immer“ geht der Zwischenstand verloren).
- **Kompatibilität:** Voreinstellungen lassen, vor allem **„Bestehen einfordern“ = Nein** (bei „Ja“ gilt jeder Versuch sofort als abgeschlossen).
- **Bewertung und Abschlussbedingungen** je nach Antwort:
  - Nur Abschluss: Bewertungsmethode „Lernobjekte“ · Abschlussbedingung „Vollständig bearbeitet“.
  - Leistungspunkte: „Höchstnote“ · „Vollständig bearbeitet“.
  - Fortschritt: „Höchstnote“ · „Vollständig bearbeitet“ oder „Mindestpunkte notwendig“ = Maximum. Nicht „Bewertung erhalten“ (wäre schon nach der ersten Stufe erledigt).
  - Bestehensgrenze: „Höchstnote“ · „Erfolgreich bestanden“. Nicht zusätzlich „Vollständig bearbeitet“ anhaken.
- **Ergebnisse ansehen:** Aktivität → Berichte → Basisbericht (unten „Trackingdetails“ auf „Ja“), einzelne Antworten im Interaktionsbericht.

Gib zum Schluss eine kurze Testanleitung: Paket in einem Testkurs hochladen, mit einem Schülertestkonto durchspielen, Bericht ansehen.

Falls gefragt: SCORM erschwert Manipulation, verhindert sie aber nicht.

Fertige SCORM-Pakete zum Ausprobieren

Bei einigen meiner Tools liegen die SCORM-Pakete schon fertig auf Codeberg bereit. Die ZIP-Datei herunterladen und in Moodle als Lernpaket hochladen – nicht entpacken.

Weitere Pakete kommen nach und nach dazu. Alle Tools findet man auf meiner Codeberg-Seite, eine Übersicht gibt es im Artikel zu den neuen Lernwerkzeugen.

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*


Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.