Delphi/IPS Kommunikation

Hallo,
wie kann man sich in das web interface einloggen -
username, pw aller Kombinationen greifen bei mir nicht zu.

Ferner, gibt es eine Delphi Integrationsschnittstelle in die Designer-Umgebung, so dass ein delphi-Programm die IPS-Skripte starten kann? bzw. Variable auslesen kann?

Grüsse,
Kraft

Wenn du die aktuelleste Version installiert hat, lad dir mal die TypeLibrary von IP-Symcon rein… (IP-Symcon COMServer Library). (Unter D2005 unter Component->Import Component) Es sind zwar nicht alle Funktionen vorhanden, die du hast, wenn du ein Modul direkt schreiben würdest; Für externes Triggern sollte es aber reichen. (Wenn du etwas Konkretes bauen willst, würde ich empfehlen das direkt als IPS Modul zu programmieren)

Der COMServer sollte sich in allen gängigen Sprachen nutzen lassen. Eine C# Demo hätte ich bei Interesse da. VBS Script steht im Update Thread. VB6/C/Java… ect. sollte aber nach dem selben Prinzip funktionieren.

Wenn du eine Netzwerklösung ala Designer suchst, kann ich dir die Backend Klasse die der Designer nutzt als Delphi Klasse zur Verfügung stellen.

paresy

Hallo Kraft,

hast Du zur Installation auch die install.php aufgerufen? Ansonsten schau mal bitte in der Wiki, dort ist eigentlich alles beschrieben.

Gruss Torro

Hallo Paresy,
gerne greife ich auf das Angebot …

zurück.
Gruss,
Kraft

Mail ist raus.

paresy

Hallo Paresy,

das Interesse für die C# Demo ist da :slight_smile:
Danke und Grüsse,
Kraft

Hallo,
habe versucht mit Hilfe der ISP COPServer-TLB eine Methode aufzurufen -
leider Erfolglos.
Das Objekt ipsInterface wird angelegt aber die Methode ‚ReadVarBoolean‘
erzeugt den Fehler:

Zugriffsverletzung bei Adresse 00ED62FC in Modul ‚Core.COMServer.dll‘.
Lesen von Adresse 00000000 aufgetreten.

Wo ist der bug?
Danke für jede Unterstützung,
Kraft

procedure TForm1.Button1Click(Sender: TObject);
var
V : Variant;
ipsInterface : Environment;
xKontakt: wordbool;
begin
try
OleCheck(CoCreateInstance(Class_Environment, nil, CLSCTX_ALL, IEnvironment, ipsInterface));

V := ipsInterface.ReadVarBoolean(pchar('Kontakt.Status'),xKontakt) ;
if xKontakt then showmessage('ON');

except
ShowMessage(‚IPS-COMSrver-Fehler‘);
end;
end;

Sorry, dass es solange Gedauert hat… War für ein paar Tage weg…

Hier ein Beispiel:


procedure TfrmMain.btnRunScriptClick(Sender: TObject);
var ips: IEnvironment;
begin

 ips := GetActiveOleObject('IPS.Environment') as IEnvironment;
 ips.RunScript('test');

end;

paresy

Hallo,
Danke sehr für den Hinweis.

Es funktioniert problemlos als Windows- oder als Console-Programm - scheitert aber aus einer Apache2 CGI-BIN Umgebung (wamp v5) die Zeile mit „GetActiveOleObject“ auszuführen.

Wo könnte das Problem sein? :mad:
Danke,
Kraft

Benutz doch lieber mod_rewrite (hieß du so, oder?). Damit kannst du unter deinem Apache die IPS Scripte über das IPS interne WebInterface schicken und alles andere macht dann der Apache.

Ansonsten weiß ich nicht, wieso es im Apache Modul nicht gehen sollte…

paresy

Kannst Du bitte den Vorschlag:

Damit kannst du unter deinem Apache die IPS Scripte über das IPS interne WebInterface schicken und alles andere macht dann der Apache.

mit mehr Details versehen. Wie wird das IPS WebInterface angesprochen?
Danke,
Kraft

Hier die Doku in der Wiki:

http://www.ipsymcon.de/wiki/index.php/Simple_Web_Interface

paresy

leider ist …\web\index.php im Simple WebInterface für mich eine Idee
kryptisch. Mein Ziel ist es eine Aktion z.B.:
RunScript(const ScriptName: WideString) oder
ReadVarBoolean(VarName: PChar; out Value: WordBool)

über das WebInterface (oder wie auch immer ) auszuführen. Wie bekomme ich das gebacken?
Danke,
Kraft

Ich verstehe das Problem einfach nicht?

Hast du mal das WIIPS aufgesetzt? Dann siehst du was man mit dem SimpleWebInterface alles machen kann!?

Es wird überhaupt kein Apache ect benötigt.

paresy

Sorry, dass ich mich nich klar ausgedrückt habe.
Die „QuickSwitch“ - Fähigkeiten vom WIIPS reichen mir leider nicht aus.
Ich möchte, per WEB-Visualisierung von mir, auf die IPS-Skripte und Variablen zugreifen.
Danke,
Kraft

Hallo,
gibt es eine Beschreibung der Funktionen und Argumente für IPS_TLB.pas? (IPS.IEnvironment)
z.B.:
function GetVariables(out Value: OleVariant): HResult; stdcall;
Ich hoffe, dass mit dieser Funktion sämtliche Variablen erfasst werden können.
Danke,
Kraft

wenn du unter apache alle funktionen von ips nutzen möchtest (ohne url-rewrite) und du der web-programmierung (inkl. php) mächtig bist, kannst du dir eine generische wrapper-routiene schreiben, welche das ips-webinterface via apache mit php (oder perl, oder, oder… seitens des apache webservers) ansteuert um beliebige ips-skripte und ips-funktionen auszuführen und deren rückgaben unter apache (mit php, perl, oder wie auch immer) zu verarbeiten. da ich das interface noch nicht geschrieben habe kann ich derzeit leider kein code-sample liefern.

„Ein Pferd! Ein Pferd! Mein Königreich für ein Pferd“
Wie sieht so eine Wrapper:confused: -Routine aus?
Danke,
Kraft

  1. ips seite:
    für das ips-webinterface schreibst du ein skript welches parameter via http entgegennimmt - nennen wir dieses skript einfach mal ips.php.

das skript muss als via http den namen einer aufzurufenden ips-funktion und dessen parameter empfangen können.
1funktionsnamen: f=xyz
n
parameter: p1=foo&p2=bar&…

das skript ips.php wertet also nun die übergebenen parameter aus und ruft die entsprechende ips-funktion auf. da die ips-funktion meist irgendeinen rückgabewert liefert wieder dieser als ergebnis (z.b. plain-text) ausgegeben.

beispiele (das ips-webinterface ist auf port 84 konfiguriert):

http://localhost:84/ips.php?f=IPS_RunScript&p1=Wohnung_Licht_abschalten
führt aus: IPS_RunScript(„Wohnung_Licht_abschalten“);

http://localhost:84/ips.php?f=GetValueBoolean&p1=ist_daemmerung
führt aus: GetValueBoolean(„ist_daemmerung“);
Rückgabe: true oder false

http://localhost:84/ips.php?f=FS20_SetIntensity&p1=45611&p2=12&p3=6
führt aus: FS20_SetIntensity(45611,12,6);

  1. apache seite:
    du baust dir ein php-skript welches obige http-requests ausführt und die rückgaben passend verarbeitet - nennen wir diese funktion ipscmd. erweitern kann man das ganze durch eine ganze bibliothek von php-funktionen die den gleichen namen haben wie die ips-funktionen und ipscmd mit den passenden parametern versorgen.

danach wäre es möglich via apache-php (und dem includen der dafür eigens geschriebenen funktionen) ips-funktionen aufzurufen.

also würde auf dem apache-php folgendes funktionieren:

aufruf von: GetValueBoolean(„ist_daemmerung“);
-> aufruf ipscmd mit entsprechenden parametern
-> http-request an localhost:84/ips.php?f=GetValueBoolean&p1=ist_daemmerung
-> ips.php ruft entsprechende ips-funktion auf und sendet die rückgabe zurück
-> ipscmd nimmt die rückgabe entgegen und wandelt sie passend um
-> GetValueBoolean() (auf der apache seite) gibt den rückgabewert zurück

damit hast du einen wrapper - eine funktion/funktionsbibliothek, die befehle möglichst transparent umhüllt um, wie beispielsweise in diesem fall, durch eine neue kommunikationsschicht (hier via http) den befehl auszuführen.

bei dieser hier gegebenen anwendung muss man noch klären wie die http-request-parameter gequotet werden und wie/wo die typen der ips-parameter (bool,int,float,string,array) hinterlegt werden.

gruss,
olli

Hallo,

und falls Du das ganze an einem erreichbaren Server machst, solltest Du das ganze auch noch entsprechend verschluesseln bzw. tunneln. Nicht dass Du Dich eines Tages wunderst, warum Deine Heizung ausgeschaltet wurde…:stuck_out_tongue:

Also achte auch auf Fragen der Sicherheit bei der Kommunikation.

Gruss Torro