Beispielprojekt mit Doku und Source veröffentlicht

Ich weiß zwar nicht, was du jetzt vorhast, aber scheint definitiv nicht mit der IP-Symcon normalen Objektstruktur zu harmonieren. StatusVariablen sind immer direkt unterhalb der Instanz und auch nur dafür gibt es die speziellen Funktionen die sich um alles kümmern. (RegisterVariable/MaintainVariable)

Ein weiterer Nachteil wird sein, dass deine Variable nicht im WebFront angezeigt werden.

Aber:
Natürlich ist es möglich Kategorien unterhalb von Instanzen zu erstellen

Siehe: CategoryManager.CreateCategory

Bedenke immer:
Jeder Name sollte immer änderbar sein und dein Modul nicht auf diesen basieren.

Hallo Tommi,

ich versuch mich mal wieder an Delphi, hier habe ich sehr wenig Ahnung. Versuche gerade die V2.2 Version zu compilieren.Dazu habe ich das V2.2 SDK geladen und Deine aktuelle V2.2 Module.

Ich bekommen beim Compilieren einen einzigen Fehler:

[Pascal Fataler Fehler] UIPSTypes.pas(16): F1026 Datei nicht gefunden: ‚gnugettext.dcu‘

In der UIPSTypes wird es per
using gnugettext eingebunden.

Ich nehme an gnugettext muss noch hinzugefügt werden, bzw. ist wohl ein Add On. Wo ladet man das am besten ?

Bitte hilft mir hier mal, ist bestimmt nur ne Kleinikeit.

Danke,

Edit:Habs gefunden:

Im V2.2 SDK fehlt der Ordner IPSRessource, dort ist die gnugettext.pas enthalten.

Gruß,

DanB

und klappts jetzt?

Hi,

Danke der Nachfrage. Ja ich habs am laufen !

Folgender Punkt beschäftigt mich gerade. Bei den PHP Funktion hast Du zum bsp. die EnableEcho Funktion mit der boolean Variable.

In IP Symcon unter Instanzenfunktionen ausführen, bekommt man ja dann ein Option Feld mit true oder false zur Auswahl. Es wäre super wenn man hier auch die Möglichkeit hätte eine Liste oder choice einzubinden.

Unter Delphi gibt wohl TStringList. Kennt IPS diesen Typ und wie würde das angelegt werden ?

Thx,

Gruß DanB

Edit:

Ansonsten müßte man das ganze per Integer Wert machen und dann per Tabelle mappen. Das würde es aber User unfreundlicher machen, da man dann immer die Liste zur Hand haben muss.

Oder ich muß für jeden Wert eine eigene Funktion schreiben und diese entsprechend bennen, was aber nicht sinnvoll ist, da die Funktionsliste dann sehr lang wird und unübersichtlich. Auch vom Code wäre es so besser.

Wir müssen erstmal etwas sortieren.
Delphi ist Delphi. Da gibt es ganz wunderschöne Funktionen und jeden exotischen Datentyp Deiner Wahl. Das kann man(n) alles im Delphicode definieren und benutzen.

PHP hat auch jede Menge Datentypen. Normalerweise benutzt man für so eine Auswahlliste Arrays.
Als Schnittstelle zwischen PHP und Delphi sind jedoch nur 4 Datentypen zur Zeit vorgesehen: Boolean,Integer,Float und String. Es gibt noch die Möglichkeit z.B. Arrays oder ganze Objekte anzugeben, aber dann muss man die ZendAPI direkt nutzen.

Wenn ich also mehr Werte übergeben will, mache ich das entweder mit mehr Parametern wenn die Anzahl fest steht, oder mache z.B. einen String, den ich aus den Werten und einem Trennzeichen in PHP zusammensetze und in Delphi dann wieder auseinander nehmen kann.

Instancefunktionen Ausführen? Habe ich noch nie benutzt und gerade auch nicht gefunden. Das muss Paresy erklären, wie man dort zu einer Liste bekommt

Tommi

Hi,

ich weiß meine Anliegen sind immer sehr exotische Sachen, aber ich möchte das ganze freundlich gestalten. Es geht hier um die Einbindung eines Devices, exotisch in Bezug auf die bisherigen Sachen die in IPS unterstützt werden.

Also die Typen gibts, mir ging es darum wie die dann von IPS dargestellt werden, bzw. welche Typen bisher berücksichtig werden.

Instancefunktionen ausführen kennst Du bestimmt. (Rechtklick auf eine Instance-> Ausführen)

Ich habe mal ein Bsp. erstellt was ich mir vorstelle, die Einträge sind erfunden, also ganz so trival ist es nicht :slight_smile:

Wie könnte man das umsetzen bzw. gibt es das schon für diesen Typ ? Wenn nein könnte es in einer der nächsten Versionen einfließen ?

Evtl. kann das nur Paresy beantworten.

IPS Beispiel.png

Die Möglichkeit gibt es nicht und wird es auch nicht geben (können). Außerdem ist es nicht notwendig, da du die Ansteuerung über einen Integer machen kannst und in IPS der StatusVariable ein Profil einstellst, welches dann genau diese Assoziationen beinhaltet. Man sieht es dann in der Konfiguration nicht direkt, aber im WebFront sieht man genau das was du willst.

paresy

Danke für die Antwort. Leider hilft mir das nicht weiter, da es sich hier nicht um Funktionen handelt die per Visualisierung abgerufen werden sollen.

Ziel dieses evtl. kommerziellen Projektes ist die Einbindung eines sehr umfangreichen Devices. Es soll möglichst viel Logik in das IPS Modul gebracht werden, etwaige Scripts die die Logik für das Device übernehmen, sollte es nicht geben. (weniger Fehlerquellen da der User nicht editieren kann)

Ein Beispiel das eins von vielen Szenarien aufzeigt:

Das in IPS einzubindende Device unterstützt unteranderem die Steuerung von anderen Geräten über RS232. (RS232 Geräte sind also am Device angeschlossen, das Device könnte man in diesem Scenario als Art Bridge sehen)

Hierbei wird eine bestimmte Anzahl von Geräten native Unterstützt. Sagen wir mal als Bsp. Hersteller Toshiba und Samsung. Im ausführenden Dialog des IPS Modul möchte ich nun die Funktion Send_RS232 auswählen (Custom Funktion des Moduls) und dann kommt der springende Punkt. Hier möchte ich Auswählen können Hersteller (also aufklappbare Liste) und in der zweiten Auswahl den zu senden Befehl + Parameter. Und das geht so nicht.

Wenn IPS das aktuell nicht bietet, bleiben mir nur folgende Wege:

a) mit einem Integer Feld zu arbeiten und as ganze per altmodischen
Tabellen zu lösen, also für die Hersteller Werte von 1 - xx zu vergeben ,
und für die Funktionen das selbe Spiel.
b) mit String Felder zu arbeiten und Hersteller und Befehl+Parameter den
User eintragen zu lassen. Wobei wieder Tabellen benötigt werden, jeder
Hersteller hat andere Funktionen.
c) oder nachträglich nach Einfügen des Befehls im Script händisch die
entsprechenden Strings einfügen bzw. nachpflegen.
d) alle RS232 Commands als Modul Befehle einzubauen, das gibt dann eine riesige Liste und
macht keinen Sinn, da das ja nur ein Bsp von vielen Scenarien ist und somit schnell
über hundert weitere Befehle für andere Funktionen drin wären.
e) Lösung D -> ich habe was übersehen.

a,b,c mag für die meisten von hier, kein Problem darstellen, sind wir doch fast alle aus der IT, Bastler und Freaks Ecke.

Ziel das ganzen ist es jedoch ein Modul zu bauen das komplexe Möglichkeiten bietet , aber wesentlich einfacher zu bedienen ist und somit auch ein anderer Personenkreis damit ohne weiteres schnell Arbeiten kann.

Das Thema „Einfacher“ und "das Erfassen/Erreichen von anderen Benutzerkreisen außerhalb der IT,Bastler und Freaks Ecke wurde auch so von Herrn Steiner mal telefonisch erwähnt bzw. bestätigt.
Das ist der Ansatz der hier verfolgt wird. Also bitte nicht gleich die Hände vor dem Kopf zusammen schlagen und denken was will er denn jetzt schon wieder. Es geht hier lediglich um eine andere Sicht und Herangehensweise. Wenn man denn Hintergrund nun kennt , versteht Ihr vielleicht besser warum ich mit so „strangen“ Sachen daher komme.

Letztendlich kann IPS nur davon profitieren wenn manche Dinge einfacher werden und somit mehr User sich angesprochen fühlen.

Also evtl. gibt es doch Möglichkeiten dies umzusetzen. Du schreibst zwar „nicht geben können“ , aber Software seitig sollte das doch gehen. Es gibt ja schon eine aufklappbare Liste bei boolean. Kann man das nicht auch für eine Liste von Stringeinträgen bzw. um diesen Typ erweitern ?

DANKE !

Gruß,

DanB

Ich hab heute mal reingeschaut und Delphi hat RTTI für Enums… also hab ich das mal Fix eingebaut :wink:

Ist dann im nächsten Update dabei.

paresy

Unbenannt.png

Hallo paresy,

das sind ja mal richtig gute Nachrichten, besonders in Folge Deines ersten Eintrags von heute vormittags ,-). Toll das es doch noch geklappt hat.

Prima, echt super, da macht es Freude weiter am Produkt / Modul zu bauen.

Vielen Vielen Dank !!!

Wir werden auf Euch zukommen sobald es ne fast fertige Version des Projekts gibt.

Mit Freude , DanB

Edit:

Mit welcher Version bekommt man das Update ? 2.21 ?

Hallo Paresy,

nun ist es soweit und wir brauchen nun umbedingt RTTI/Enums.

Kannst Du uns evtl. mit einem kleinen Code Schnippsel weiterhelfen ?

(Anlegen und das ausgewählte übergeben)

Vielen Dank,

Grüße,

DanB

Edit : So wie bei der IPS_CreateMedia Funktion bzw. Deinem Screenshot.

Nutz einfach einen Enum in deiner Funktion und en Rest macht IPS… Guck dir doch einfach die Signatur der CreateMedia Funktion an und mach es genau so :slight_smile:

paresy

Paresy,

vielen Dank für den Hinweis, damit bin ich nun weiter gekommen.
Ich kann nun die definierten Enums anzeigen. Leider habe ich noch nicht raus
gefunden wie ich das ausgewählte Enum nach String casten kann, evtl. muss man sich hier eine eigene Funktion schreiben. (Bitte nicht grinsen :wink: , trivial aber ich finde nix)

In der System und SysUtil habe ich nichts für Enums gefunden, evtl. muss man sich hier doch eine eigene Funktion schreiben. ;-(

Als nicht Delphi Mensch bin ich trotzdem froh soweit gekommen zu sein.

Ich habe nur noch einen Punkt, hier komme ich nicht weiter, es geht darum innerhalb des Modules zu reagieren, falls eine Variable sich ändert.

Das habe ich schon mal angesprochen, und Du hast mir damals auch geantwortet:

Hier wäre ich echt froh wenn mir jemand helfen würde/könnte.

Besten DANK,

DanB

Wieder was gelernt. Bisher dachte ich, das die internen Pages nicht extern mit dem SDK steuerbar sind.

Für das Variablen-Event-Problem hätte ich im Moment auch keine andere Lösung, als die Funktion in einem php-Eventscript bei Variablenänderung auszuführen. Es gibt nur eine SDK-Funktion für das eines Koppeln eines Status-Events an ein PHP-Script. Aber das hatte Paresy ja auch schon geschrieben. Besser kommt man natürlich ran, wenn man im Modul die Variable selbst ändert :-))

Die Enums lassen sich mit GetEnumName auswerten. Beispiel ist hier.

Tommi

Guckt euch mal im IPSTypes die MessageSink Funktion an… Dort dann auf VM_UPDATE lauschen.

paresy

Hi Tommi,

danke für den Link. (GetEnumName)
Jetzt habe ich es endlich geschafft ! Hurra…
Ich kann nun „ListBox“ Controls im IPS UI anzeigen und auswerten.

Jetzt noch dem Tip von Paresy nachgehen bzw. „schaffen“ dann bin ich echt weit gekommen. (MessageSink / VM_UPDATE)

Grüße,

DanB

Sorry, dass es etwas länger gedauert hat:

Hier ein Beispiel:


TBla = class(...)
public
...
   // --- TIPSMessageObject override
   procedure MessageSink(var Msg: TIPSMessage); override;
...
end;

implementation

procedure TBla.MessageSink(var Msg: TIPSMessage);

 procedure CheckEvents(VariableID: TVariableID; VarValue: Variant; VarDiff: Boolean; OldValue: Variant);
 begin
  //hier was tolles machen
 end;

begin

 inherited;
 case Msg.Message of
  VM_UPDATE:
   CheckEvents(Msg.SenderID, Msg.Data[0], Msg.Data[1], Msg.Data[2]);
 end;

end;


Reicht das? Oder noch eine Frage dazu?

Die anderen Meldungen kann man immer schön über die SOAPDemo herausfinden mit den IDs und welche Parameter gesendet werden.

Grüße,
paresy

Hallo paresy,

vielen vielen Dank für den Code-Schnipsel. Ich habe es nun am Laufen,
beim ersten Anlauf habe ich mir selber ein Bein gestellt, aber nun läuft es
wie gewünscht. Super !

Interessant ist das ich damit alle Änderungen aller Variablen bekomme, dachte ich bekomme damit nur die lokalen meines Modules. Ich filtere jetzt entsprechend.

Grüße,

DanB