Symcon Modul Helfer - eine VS Code Extension für Modul-Entwickler (ehem. Forminator)

Mega, kann leider erst am Montag testen. :partying_face:

Sehr cool!
(… ich muss auf 20 Zeichen kommen :wink: )

Hallo zusammen,

eigentlich ist heute wieder ein großer Tag für Modulentwickler, aber nach dem Feedback meiner letzten großen Ankündigung und umfangreichen Beschreibung halte ich es diesmal etwas kleiner.

Die Extension hat nochmal eine erheblichen Ausbau bekommen und deckt jetzt die gesamte Entwicklung von Bibilotheken bzw. Modulen ab.
Wie habe ich es so schön in der README geschrieben …

Der Symcon Modul Helfer ist eine umfassende Visual Studio Code Extension zur komfortablen Entwicklung von Symcon-Modulen und Bibliotheken.
Er beschleunigt das Erstellen, Testen und Pflegen von form.json-Konfigurationen und vereint Code-Generator, Formular-Editor, Projekt-Wizard und Live-Preview in einer einzigen Oberfläche. Mit nur wenigen Klicks können komplette Symcon-Bibliotheken oder Module generiert, bestehende Projekte gepflegt und automatisch mit GUIDs, Build-Informationen und Dokumentation versehen werden.

:sparkles: Hauptfunktionen

Wizards & Generatoren

  • Library Generator Wizard → Erstellt neue Symcon-Bibliotheksprojekte
  • Module Generator Wizard → Fügt neue Module zu bestehenden Bibliotheken hinzu
  • Benutzerdefinierte Templates: eigener Vorlagen-Ordner konfigurierbar
  • Readme-Patching → erweitert Dokumentationslisten beim Hinzufügen neuer Module
  • Intelligentes Feld-Mapping, Modul-Validierung und automatische GUID-Vergabe

Formular- und Editor-Funktionen

  • Schnelles Einfügen von Symcon Formular-Elementen per Klick
  • Automatisch erzeugte, korrekt formatierte JSON-Snippets
  • Sidebar-Editor zur Anzeige und Bearbeitung aller Eigenschaften
  • Unterstützung aller Standard-Elementtypen des Symcon PHP-SDK

Live Preview

  • Echtzeit-Vorschau (HTML, JSON, Theme, Größe) im eingebetteten Webview
  • Persistente Einstellungen (Theme, Breite, Höhe) pro Workspace
  • Preview-JSON speichern, laden und direkt an das iFrame senden

Hilfs- und Analysefunktionen

  • Build Info Command → Aktualisiert library.json (Buildnummer + Datum)
  • Splitter GUID Command → Weist gültige GUIDs in module.json zu
  • Übersetzen von form.jsonlocale.json
  • Extraktion und Registrierung von Property-Variablen in Create()

Speziell im neuen Punkt „Wizards & Generatoren“ ist sehr viel Zeit und Aufwand geflossen. Viele Dinge, die ich bisher nur für mich und meine eigene Entwicklung genutzt habe, sind dabei eingeflossen. Dabei habe ich darauf geachtet, dass die Lösungen einerseits konfigurierbar und andererseits allgemein gültig sind. So sollten beispielsweise die Unit-Tests vollautomatisch laufen, ohne jegliche Konfiguration von außen.

In der README habe ich versucht die Dinge einzeln zu dokumentieren. Damit sollte der Einstieg eigentlich generell funktionieren. Es gibt aber noch den einen oder anderen Trick bzw. Konfigurationsoption die das ganze System aufbohrt. Das würde ich dann hier nach und nach erklären. Will aber auch keinen riesen Aufwand treiben wenn es nicht genutzt oder gebraucht wird.

Viel Spaß
Heiko

Ahh, hier noch das …

Changelog

[3.0.0] - Release (2025-10-13)

  • NEW: Create a new Symcon library project using an interactive wizard (Library generator wizard).
  • NEW: Add new modules to an existing Symcon library project with guided input (Modul generator wizard).
  • NEW: Added command and context menu to update library.json build metadata.
  • NEW: Added command and context menu to assign splitter GUIDs to module.json.
  • NEW: Reworked and extended settings structure (General, Project, Form, and Preview sections).
  • FIX: Update extension icon for better visual consistency.
  • FIX: Optimized translations and cleaned up wording across all supported languages.
5 „Gefällt mir“

Cool was ein einzelner aus der Community hier alles rausreißt.

Jetzt müsste symcon noch noch schön einen kompletten Dev Container erstellen mit ohne Lizenzensierung out of the Box dev-symcon. So könnte man dann ohne viel Aufwand jedes Modul in einem eigenen Container entwickeln und auch in einem kleinen symcon auch gleich testen. Aber ich schweife ab.

Vielen Dank für deine Hilfstools!

Gruß Dennis

3 „Gefällt mir“

Hört sich großartig an.

Brauch ich nur mal Zeit das in Ruhe zu testen :clap:

1 „Gefällt mir“

Hi Dennis,

das kannst und du darfst du sogar jetzt schon. Die Docker Container laufen ohne Lizenz mit allen Features für 1 Stunde. Danach machst du ein „docker restart xxxxx“ und weiter geht die Fahrt. Für’s Entwicklen und ggf. automatische Tests sollte dies gut passen.

@pitti Mega! Vielen Dank!

paresy

1 „Gefällt mir“

Mega, dieser Einsatz! Besten Dank … auch wenn ich erst ganz am Anfang meiner Modulentwicklungsübungen bin … irgendwann werd ich die Vorzüge genießen können.

Gruß Michael

1 „Gefällt mir“

Kleines Fehler-Update v3.0.1, gemerkt hat es aber Keiner …

… das die Extension gar nicht funktionierte :smiley:

Gruß Heiko

Moin,

erstmal danke für die Extension, da ich die Form immer über GetConfigurationForm zusammen baue, hilft mir der Bereich zwar leider nicht so viel, aber der Assistent zum Modul hinzufügen ist Gold Wert für mich :slight_smile:

Was mir aufgefallen ist: Er legt eine leere funktion an, ohne namen und ohne alles. Und die ReceiveData function ist nicht geschlossen:

/**
     * This function sends the text message to all of his children.
     *
     * @param string $text Text message
     */
    {
    }

    /**
     * This function is called by IP-Symcon and processes sent data and, if necessary, forwards it to
     * all child instances. Data can be sent using the SendDataToChildren function.
     *
     * @param string $json Data package in JSON format
     */
    public function ReceiveData($json)
    {
        $data = json_decode($json);


    /**
     * Is called when, for example, a button is clicked in the visualization.
     *
     * @param string $ident Ident of the variable
     * @param mixed $value The value to be set
     */
    public function RequestAction($ident, $value)
    {
        // Debug output
        $this->SendDebug(__FUNCTION__, $ident . ' => ' . $value, 0);
        // TODO: Replace identifier
        switch ($ident) {
            case 'OnXxxxxYyyyy':
                break;
            default:
                $this->SendDebug(__FUNCTION__, 'There was no reaction to the action.', 0);
        }
        return;
    }

Danke für den Fund - da muss ich wohl nochmal ran :smiley:

Aber schön das die ersten Erfahrungen jetzt einrollen …

Ich habe letztens ein neues Modul erstellt und per Helfer hier erstellen lassen. Richtig klasse! Da können wir ja glatt unseren Modulgenerator von der Homepage in den Ruhestand schicken.

Einen kleinen Typo habe ich aber gefunden: Im Helfer kann man die Funktion „NessageSink“ erstellen lassen, es heißt natürlich „MessageSink“ (wahrscheinlich nur UI, ich habe den Haken aber nicht gesetzt, da ich die Funktion gerade nicht brauche)

Ich glaube für die initiale Erstellung einer Bibliothek wäre es nett auch direkt ein Modul mit zu erstellen. Den könnte man ja abbrechbar machen falls jemand wirklich eine Bibliothek ohne Module haben möchte. Aber der Anwendungsfall ist sicherlich eher selten.

Dankeschön!

Auf jeden Fall sollten wir bei Änderungen uns gegenseitig informieren :smiley:

Ja, aber danke für den Fund!

Grundsätzlich war mein initiales Vorgehen so angedacht. Leider unterstützt VSC keine interaktive Wizards. Ich nutzt da auch nur ein Addon das leider nicht mehr weiterentwickelt wird. Mal sehen ob es da in Zukunft was besseres gibt. Aber ja, ich verstehe was Du meinst. Aus diesem Grund habe ich auch die Option für die Readme’s so „speziell“ gemacht, um beide Versionstypen zu unterstützen, wenn auch in 2 Schritten.

Gruß HEiko

Weißt Du noch welchen Datenfluß Du ausgewählt hattest für Dein Device-Modul?

Das fehlende „}“ habe ich schon gefunden :slight_smile:

Danke!

Ja, den eigenen auf mein selbstgebautes gateway.

Hab in meinem UnufiNet Modul ein device hinzugefügt, liegt auf GitHub falls du es zum testen brauchst.

Ahh, Danke - das erklärt es! Dann weiß ich Bescheid …

Fix kommt zeitnah!

Gerade ein Update hochgeladen …

Changelog

[3.0.2] - Patch (2025-12-01)

  • FIX: Code generation for devices with custom I/O or splitters now works correctly.

Danke @bgersmann und @Dr.Niels für Euer Feedback!

@all Wer möchte, darf auch gern mal eine Sternenbewertung hier abgeben => Symcon Module Helper - Visual Studio Marketplace

DANKE!

2 „Gefällt mir“

Moin,

wäre eigentlich noch eine Prüfung für die Einträge der Darstellung möglich.

Hier hab ich z.B. recht lang gebraucht um zu verstehen das “intervals” ein leeres Array sein muss:

$this->MaintainVariable(
			'NetworkType',
			$this->Translate('Type'),
			3,
			[
				'ICON' => 'network-wired',
				'DECIMAL_SEPARATOR' => 'Client',
				'COLOR' => -1,
				'CONTENT_COLOR' => -1,
				'DIGITS' => 2,
				'MIN' => 0,				
				'MAX' => 100,
				'PRESENTATION' => '{3319437D-7CDE-699D-750A-3C6A3841FA75}',
				'INTERVALS' => '[]',
				'INTERVALS_ACTIVE' => true,
                'OPTIONS' => '[{"Value":"UNMANAGED","Caption":"Unmanaged","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1},{"Value":"GATEWAY","Caption":"Gateway","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1},{"Value":"SWITCH","Caption":"Switch","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1}]',
				'MULTILINE' => false,
				'PERCENTAGE' => false,
				'PREFIX' => '',
				'SUFFIX' => '',
				'THOUSANDS_SEPARATOR' => '',
				'USAGE_TYPE' => 0
			],
			$vpos++,
			1
		);

Und jetzt fällt mir z.B. gerade auf, das “Intervals_active” eigentlich false sein sollte :smiley:

Oder gibt’s das sogar schon und ich bin nur mal wieder blind? :smiley:

Nicht ganz ein Fix, aber denk daran, dass auf oberster Ebene alle Einträge optional sind und im Zweifelsfall auf Standardwerte zurückfallen. Das ist bei INTERVALS beispielsweise das leere Array. Das kannst du also bei dir somit einfach weglassen.

Würde dann also so reichen? Wäre trotzdem froh um einen Check im Modul :slight_smile:

$this->MaintainVariable(
			'NetworkType',
			$this->Translate('Type'),
			3,
			[
				'ICON' => 'network-wired',
				'PRESENTATION' => '{3319437D-7CDE-699D-750A-3C6A3841FA75}',
                'OPTIONS' => '[{"Value":"UNMANAGED","Caption":"Unmanaged","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1},{"Value":"GATEWAY","Caption":"Gateway","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1},{"Value":"SWITCH","Caption":"Switch","IconActive":false,"IconValue":"","ColorActive":false,"ColorValue":-1,"Color":-1,"ColorDisplay":-1}]'
			],
			$vpos++,
			1
		);

Genau, so sollte das passen :+1:

1 „Gefällt mir“