Beispielprojekt mit Doku und Source veröffentlicht

siehe http://www.ip-symcon.de/forum/f16/ip-symcon-module-netz-7596/#post62922

Ich hoffe, damit können auch noch mehr Leute in die Modul-Programmierung einsteigen.

Tommi

Tolle Arbeit Tommi!

Habs mal in die Script Library übernommen.

Hallo,
ich bin dabei, das SDK an meine Anforderungen anzupassen und habe es um eine einfache Testfunktion ergänzt. Compiler läuft durch, Modul ist laut Beschreibung eingerichtet, Objekt erscheint ordentlich im Objektbaum, aber die PHP-Funktionen tauchen in der Funktionsauswahl nicht auf, wenn ich ein script erstellen will. Woran könnte das liegen?
Peter

Hast Du die Konsole neu gestartet? Die Funktionsliste wird nur beim ersten Aufruf geladen und dann gecached.
Ansonsten könntest Du evtl. noch vergessen haben, die Funktionen im Interface zu definieren.

Hallo Horst - vielen Dank das war die Ursache. :slight_smile: Hatte zwar den Dienst gestartet, aber die Konsole lädt sicherlich aus Zeitgründen alle Funktionen komplett nur beim Neustart.
Viele Grüße Peter

Hallo,
bei der Erstellung eines Moduls unter V2 habe ich mit „RegisterVariable“ entsprechende Statusvariable definiert, die auch in der Modulkonfiguration auftauchen.

Mit Properties gelingt mir das nicht. Habe folgende Zeile eingetragen:
„RegisterIntProperty(‚LPTportNr‘,GetLPTportNr,SetLPTportNr);“

Die entsprechenden Funktionen sind definiert.

Unter der Modulkonfiguration steht nur, dass dieses Modul keine Eigenschaftsseite hat. Woran kann das liegen?
Peter

Properties sind interne Referenzen und werden (im Gegensatz zu StatusVariablen) grundsätzlich nicht angezeigt. Wenn man was nach aussen=Console oder PHP geben möchte, dann über Statusvariablen (die sind von aussen nicht änderbar) oder „richtige“ Variablen (die aber nicht mit RegisterVariable, sondern mit „CreateVariable“ angelegt werden).
z.Z. ist es mit dem SDK nicht möglich, eigene Konfigurationsseiten zu erstellen. Deshalb werden meine Module alle über PHP konfiguriert.

HTH
Tommi

Die Konsole macht übrigens auch nichts anderes, als die Befehle, die man per PHP-Skript ausführen kann, über SOAP auszuführen. D.h. was man über die Konsole machen kann ist immer auch über PHP möglich. Wer will kann sich so seine eigene SOAP-Konsole programmieren, wie z.B. Toni mit seiner Tonsole.

Hallo Horst und Tommi,
vielen Dank. Wichtig ist es zu wissen, dass man die properties -Seite nicht ohne Weiteres selbst gestalten kann. Eine Lösung findet man dann schon: meine dll läuft jedenfalls. Ohne Tommis sdk hätte es aber nicht geklappt.
Peter

Hallo tommi,

erstmal vielen Dank das Du Deine Arbeit zur Verfügung stellst. Es hat mir schon sehr geholfen, etwas Einblick in die Modulprogrammierung zu bekommen.

Delphi kenn ich nicht bzw. jetzt schon etwas ;-), c’# lerne ich gerade, man sieht also ich stehe am Anfang, aber es wird.

Ich konnte das Modul erfolgreich erstellen und um Variablen etc. erweitern. Ich würde gerne noch eine Funktion einbauen, die etwas über das Parent, also in meinem Fall dem Server Socket raus sendet. Im WinLirc Modul wird ja

IIPSSendString(GetParent()).SendText('SEND_ONCE ‚+Remote+‘ '+Button+#10);

verwendet. Leider funktioniert bei mir dasselbe erstelle WinLirc Modul nicht sauber, beim benutzen der Aktion WinLIRC_SendOnce bricht mir der ganze IPS Dienst weg. Aber damit möchte ich mich nicht aufhalten.

Ich würde gerne in Dein Modul noch diese Funktion einbauen, zum Test erstmal ein Echo der Eingabe. Über die Console bzw. Telnet Client. Leider habe ich ich bis jetzt noch nicht ngeschaft.
Evtl. kannst Du mir hier kurz helfen.

Ich habe:

RequireParent(IIPSSendString,true); auf true gesetzt, damit nur Parent-Module mit Send verwendet werden können.

In der Modulfunktion Handledata habe ich

IIPSSendString(GetParent()).SendText(‚SEND_ONCE‘);

hinzugefügt.

Muss ich für SendString noch eine Funktion implementieren ? Wie würde die aussehen?

Plz Help,

Danke, Auf Bald,

Gruß,

DanB

Hallo Dan,
schön, das Du Dich „traust“, in die Modulprogramierung einzusteigen.

So aus der Ferne kann man wenig diagnostizieren, ich müßte schon das komplette Modul sehen. Das RequireParent ist nur gut, um die Existenz eines Parents sicherzustellen, hat aber keine „inhaltliche“ Funktion. Insofern hat das mit dem Fehler nichts zu tun.

„SendText“ ist eine Methode des Parents, die durch das Interface „IPSSendString“ zugesichert wird. Also braucht man erst eine Instance des Interfaces, dann wird damit die Methode aufgerufen. Ich würde also die Sendefunktion mit einem Cast aus der ParentInstance auf das Interface so schreiben:


(GetParent() as IPSSendString).SendText('Mein String');

HTH
Tommi

Hi,

Danke für Deinen Input. Aber so krieg ich es auch nicht hin. ;-(
Ist wohl ne Anfängersache.

Mit IIPSSendString(GetParent()).SendText(‚SEND_ONCE‘); wirds sauber kompiliert etc. nur beim ausführen bekommen ich kein Echo in der Telnet Console.

Der Source wurde nur um einige Variblen etc. erweitert.
Könntest Du in Deine Version einfach einen Send einbauen, sozusagen
als Echo des Inputs. Also alles was per Interface reinkommt, wieder per Socket raussenden.

Das würde mir sehr helfen.

Evtl. könntest Du ja hier die abgeänderte UDevice.pas anhängen. Ich denke es ist nur eine oder zwei Zeilen Code.

Gruß,

Dan

Hallo Dan,
im Kontext des Demomodules sind es etwas mehr als 2 Zeilen. Ich habe erst eine neue Property „Echo“ erstellt, die ich über eine PHP-funktion setzen kann, dann die entsprechenden Get/Setter dazu und zum Schluss erst die eigentliche Echo-Function DoEcho(Text) definiert und eingebunden.

Anbei die Sourcen.

HTH
Tommi

MyModule.zip (8.72 KB)

Hallo Tommi,

vielen vielen Dank für Deinen Input / Hilfe.

Ich bin ab heute bis Sa unterwegs, werde mich aber gleich am WE dran machen. Überflogen habe ich es aber schon. Genial mit Funktion zum ein und Ausschalten.

Bis dann,

Gruß,

DanB

Hi tommi,

also mit dem Beispiel habe ich mir jetzt ein funktionierendes Sample bauen können. Genial, langsam machts Spaß, Danke nochmals.

Weißt Du zufällig oder hast einen Tipp wie ich folgendes realisieren kann:

Ich würde gerne eine Logik in das Modul einbauen, das auf Veränderungen bestimmter (eigene Konsolen) Status-Variablen reagiert. Die Variablen werden von Extern per SOAP aktualisiert.
Ein Monitoring sozusagen. Welche Class Funktion kann ich hierzu verwenden?

Muss ich jede Notification eines Variablen Updates anhand der ID abgleichen oder gibt es eine Funktion die nur auf Veränderungen eigener Variablen getriggert wird?

Evtl. hast Du hier was.

Gruß,

DanB

Edit:
Noch eine 2te Frage: Ich würde gerne eine IP monitoren, bzw. in bestimmten Abständen pingen. Per PHP Script habe ich das schon. (IP Watch DOG vom Forum). Wie sollte man das in einem Modul realisieren?
Ich meine, die Funktion wird ja nicht durch ein Event getriggert, sondern sollte ständig laufen. (Zyklisch)

Per Timer ?

das Starten eines Scriptes bei Variablenaktualisierung oder Zeitgesteuert ist eine IPS Standardfunktion (Ereignisse - IP-Symcon :: Automatisierungssoftware).
Für das „Anpingen“ kann man die IPS PHP-Funktion „sys_ping“ nutzen. Die Syntax kann man mit CTRL-Leertaste im Editor nachsehen.

Tommi

Hallo tommi,

hmm entweder habe ich mich nicht detailliert genug ausgedrückt oder Du hast meine Frage falsch interpretiert. Ich versuchs nochmals.

Die Standardfunktionen von IPS kenne ich natürlich. Ich möchte (wollte) aber die Funktion(en) im Modul einbauen, um

a) ein Modul mit erweiterter Funktionalität zu erstellen das es per Default
ermöglicht ohne große weitere Ereignis / Script Konfiguration in Betreib
genommen zu werden. Spätere Konfig kommt dann eh noch.

Hintergrund:
b) Ziel/Idee ist es ein Modul zu erstellen das einfach OuttheBox gleich Funktioniert. Ich denke die meistens die sich hier um Forum aktiv beteiligen sind mit PHP etc. vertraut und können das Modul entsprechend erweitern. Ziel dieses Modul ist es jedoch nicht nur ein Modul für die Freaks und Bastler zu schreiben, sondern damit auch eine andere Zielgruppe zu erreichen.

Blödes Beispiel aus der Luft gegriffen:
Ein Rolladenbauer will keine Rollandensteuerung programmieren, sondern das Ding schnell in Betreib nehmen. Der advanced Rolladenbauer kann dann aber trotzdem Hand anlegen wenn er PHP kann.

So ähnlich ist es gedacht. Evtl. liege ich ja hiermit komplett falsch, ich sehe jedoch IPS noch sehr einen bestimmten Kunden Profil zugeordnet, und ich denke man kann bestimmt einen weiteren Weg einschlagen um auch andere Zielgruppen zu erreichen bzw. anzusprechen.

Sorry, :wink: ich musste hierzu ein wenig ausholen. Evtl. ist das vom Design der Module gar nicht vorgesehen und ich liege hier komplett falsch. Vielleicht äußert sich ja Steiner oder Paresy dazu.

Gruß,

DanB

Du kannst selbstverständlich auf Variablenänderungen in einem Modul reagieren. Dazu musst du die MessageSink Funktion überschreiben und auf die richtige Message (VM_UPDATE / VM_CHANGE) reagieren. (Alle Message sind in der UIPSTypes.pas aufgelistet)

Der Normalfall ist jedoch, dass ein Modul PHP Funktionen anbietet, über die etwas gesteuert wird und die Status Variablen nur den Status anzeigen und nicht über diese der Status gesetzt wird.

Mir fällt auch kein Modul von IP-Symcon ein, dass auf eine Variablenveränderung reagiert. Alles läuft nach dem Prinzip:


Variable ändert sich -> Event wird abgefangen -> Skript wird gestartet

Ein Problem, dass du im Forum wahrscheinlich noch nicht rausgelesen hast ist, dass du in die IP-Symcon Konsole keine Eigenschaften-Seiten einbinden kannst. Du musst dafür also ein externes Tool bauen oder es direkt per Skript machen.

paresy

Hallo Paresy,

besten Dank für die Info. Die Info hilft mir schon mal weiter, jetzt muss ich es nur noch umsetzten.

Aktuell habe ich noch eine offene Frage.

Gibt es eine Möglichkeit gleich eine Kategorie innerhalb des Modules zu erzeugen, und darunter Variablen ?

In der UIPSTypes habe ich nur RegisterVariable gefunden.

Danke,

Gruß,

DanB#

UIPSTypes.pas ab Zeile 1440 CategoryManager->CreateCategory, als PHP-Funktion IPS_CreateCategory(siehe Kategorieverwaltung - IP-Symcon :: Automatisierungssoftware ).

Tommi