IPSInstaller - einige hilfreiche Scripts zur autom. Installation

Habe einmal meine Installations Scripts zusammengefasset und alle allgemein verwendbaren Funktionen in ein eigenes Script ausgelagert, das ich Euch zur Verfügung stellen möchte.

Zur Zeit sind folgende Funktionen vorhanden:


function CreateCategoryPath($Path, $LastPosition=0, $LastIcon="")
function CreateCategory ($Name, $Parent, $Position) 
function CreateDummyInstance ($Name, $ParentId, $Position=0)
function CreateInstance ($Name, $ParentId, $ModulId, $Position=0) 
function CreateScript ($Name, $File, $Parent, $Position=0) 
function CreateVariable ($Name, $Type, $Parent, $Position, $Profile, $Action=null) 
function CreateLink ($Name, $Link, $Parent, $Position) 
function CreateTimer_OnceADay ($Name, $Parent, $Hour) {
function CreateTimer_CyclicBySeconds ($Name, $Parent, $Seconds, $Active=true) {
function CreateTimer_CyclicByMinutes ($Name, $Parent, $Minutes, $Active=true) 
function CreateMediaPlayer($Name, $ParentId, $Position=0) 
function SetVariableConstant ($Name, $ID, $FileName)
function CreateProfile_Switch ($Name, $DisplayFalse, $DisplayTrue, $Icon="") {
function CreateProfile_Associations ($Name, $Associations, $Icon="") {
function CreateProfile_Count ($Name, $Start=0, $Step=0, $Stop=0, $Prefix="", $Suffix="", $Icon="") 
function get_ObjectIDByPath($Path) 
function CreateLinkByDestination ($Name, $LinkChildId, $Parent, $Position) 
function CreateEvent ($Name, $VariableId, $ScriptId, $TriggerType=1/*ByChange*/)
function exists_WFCItem($WFCId, $ItemId) {
function PrepareWFCItemData ($ItemId, $ParentId, $Title) {
function CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, $ClassName, $Configuration) {
function CreateWFCItemTabPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon) {
function CreateWFCItemSplitPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $Alignment=0 /*0=horizontal, 1=vertical*/, $Ratio=50, $RatioTarget=0 /*0 or 1*/, $RatioType /*0=Percentage, 1=Pixel*/, $ShowBorder='true' /*'true' or 'false'*/) {
function CreateWFCItemCategory ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $BaseId /*ID of Category*/, $BarBottomVisible='true' /*'true' or 'false'*/, $BarColums=9, $BarSteps=5, $PercentageSlider='true' /*'true' or 'false'*/ ) {
function CreateWFCItemExternalPage ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $PageUri, $BarBottomVisible='true' /*'true' or 'false'*/) {
function DeleteWFCItems($WFCId, $ItemId) {
function DeleteWFCItem($WFCId, $ItemId) {


Im Prinzip arbeiten alle nach dem gleichen Prinzip, man übergibt die Daten eines Objektes (Name, ParentId, Order, …), die Funktions ermittelt, ob das Object bereits existiert und legt es gegebenenfalls an. In jedem Fall wird aber die ObjectId zur weiteren Verarbeitung zurückgebegen.

Durch die Funktion SetVariableConstant ist es dann noch möglich Konstanten in Scripts nach dem anlegen von Objecten mit dem richtigen Wert zu setzen.

Werde die Funktionalität auch in Zukunft immer wieder erweitern.

lg
Andreas

[Update 2011-03-27] einige Erweiterungen, diverse neue Routinen
[Update 2011-06-16] Anpassung an v2.4
[Update 2011-06-19] Neue Funktion „CreateMedia“
[Update 2011-11-02] Anpassung 2.5
[Update 2011-12-10] Unterstützung Ident, Parameter Doku
[Update 2012-02-10] Integration in die IPSLibrary

Habe das Ganze mittlerweile auch im Wiki etwas zusammengefasst: /wiki/IPSInstaller
.

IPSInstaller.zip (1.31 KB)

IPSInstaller_2011-03-27.zip (2.41 KB)

IPSInstaller_2011-06-16.zip (3.27 KB)

IPSInstaller_2011-06-19.zip (3.37 KB)

IPSInstaller_2011-11-02.zip (3.57 KB)

IPSInstaller_2011-12-10.zip (7.87 KB)

Hallo Brownson,

ich habe mein kleine script mit diesen Funktionen erweitert das klappt auch soweit super, nur ich steh auf dem schlauch was das anlegen eines Comports und einer RegVar angeht das bekomme ich irgendwie nicht hin.

also so: Modul anlegen

RegVar -> Übergeordnete Instanz = z.B. Com2
RegVar -> ZielScript zuordnen

ggf.: noch die ComSchnittstelle anlegen

Gruß
Michael

Hallo Michael,

das funktioniert so wie ich das mit dem MediaPlayer gemacht habe, nur mit der entsprechenden GUID (die muss ich mir selber erst raussuchen):


$Id = CreateInstance($Name, $ParentId, "{2999EBBB-5D36-407E-A52B-E9142A45F19C}",$Position);

Für die diversen Settings (Script, übergeordnete Instanz) gibts diverse Methoden - die kann man sich mit „Befehl hinzufügen“ + „Zeige all Funktionen“ anzeigen lassen.

Falls nötig kann ich Dir das am Abend mal zusammensuchen …

lg
Andreas

Hi Andreas,

wie ruft man denn das InstalationsSkript auf?

ist nur ein include du kannst dann in deinen eigenen die vereinfachten funktionen vom Andreas nutzen

<?
include IPS_GetKernelDir().‚scripts/IPSInstaller.ips.php‘;
include IPS_GetKernelDir().‚scripts/IPSLogger.ips.php‘;


>?

Hi Andreas,

ich bin da nun ein Stück weiter die beide GUID hab ich mir rausgesucht…

// set categorie for managment and control
	  
		IPSLogger_dbg(c_LogId,$CategoryIdControl	= CreateCategory('Control', $CategoryIdHeater, 20));
		IPSLogger_dbg(c_LogId,CreateInstance(c_LogId, $CategoryIdControl, "{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}",25)); // Seriell Port anlegen
		IPSLogger_dbg(c_LogId,CreateInstance(c_RegID, $CategoryIdControl, "{F3855B3C-7CD6-47CA-97AB-E66D346C037F}",26)); // Register Variable anlegen

		//IPSLogger_dbg(c_LogId,CreateScript(c_LogId,IPS_GetKernelDir().'scripts\Heizung\Status.ips.php', $CategoryIdControl, 30)); // Auslesescript
		CreateScript(c_RegID,                  'status.ips.php', $CategoryIdControl, 10);
		

Na ja, sehr erfolgreich bin ich heute Abend auch nicht.

Serielles Port habe ich bei meinen Laptop leider nicht zur Auswahl und die Zuordnung der Schnittstelle zur Register Variable habe ich auch nicht geschafft. Vielleicht kann ja da noch wer helfen…


   $ScriptId = CreateScript('Status', 'Status.ips.php', 0);
   $PortId   = CreateSerialPort('TestPort', 0, 10);
   $RegVarId = CreateRegisterVariable('TestVar', 0, $ScriptId, $PortId);

   // ------------------------------------------------------------------------------------------------
	function CreateSerialPort($Name, $ParentId, $Position=0) {
		$InstanceId = CreateInstance($Name, $ParentId, "{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}",$Position);
		COMPort_SetBaudRate($InstanceId, 9600);
		COMPort_SetStopBits($InstanceId, 1);
		COMPort_SetDataBits($InstanceId, 8);
		COMPort_SetParity($InstanceId, 'None');
		//COMPort_SetPort($InstanceId , "");
		$DeviceList = COMPort_GetDevices($InstanceId);
		foreach ($DeviceList as $Device) {
		   echo $Device;
		}
		return $InstanceId;
	}

   // ------------------------------------------------------------------------------------------------
	function CreateRegisterVariable($Name, $ParentId, $ScriptId, $PortId, $Position=0) {
		$InstanceId = CreateInstance($Name, $ParentId, "{F3855B3C-7CD6-47CA-97AB-E66D346C037F}",$Position);
        RegVar_SetRXObjectID($InstanceId,$ScriptId);
		IPS_ApplyChanges($InstanceId);

		return $InstanceId;
	}


lg
Andreas

[SNIP]

    $comPortID = @IPS_GetInstanceIDByName("HS485 PC-Interface", 0);
            if(!IPS_InstanceExists($comPortID))
            {
               $comPortID = IPS_CreateInstance("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}"); // Comport anlegen
               IPS_SetName($comPortID, "HS485 PC-Interface");
            }
            COMPort_SetPort($comPortID, 'COM5'); // ComNummer welche dem PC-Interface zugewiesen ist!
           COMPort_SetBaudRate($comPortID, '19200');
            COMPort_SetDataBits($comPortID, '8');
            COMPort_SetStopBits($comPortID, '1');
           COMPort_SetParity($comPortID, 'Even');
           COMPort_SetOpen($comPortID, true);
           IPS_ApplyChanges($comPortID);
       
            $regVarID = @IPS_GetInstanceIDByName("HS485 RegisterVariable", $parentID);
            if(!IPS_InstanceExists($regVarID))
            {
                $regVarID = IPS_CreateInstance("{F3855B3C-7CD6-47CA-97AB-E66D346C037F}"); // Registervariable anlegen
            IPS_SetName($regVarID, "HS485 RegisterVariable");
            IPS_SetParent($regVarID, $CatID);
            }
            RegVar_SetRXObjectID($regVarID, $IPS_SELF);
            IPS_ConnectInstance($regVarID, $comPortID);
           IPS_ApplyChanges($regVarID);

[SNAP]

Danke euch zwei,

es funktioniert soweit alles. habe die Install Lib entsprechend angepasst.

// ------------------------------------------------------------------------------------------------
    function CreateSerialPort($Name, $ParentId, $Position=0) {
        $InstanceId = CreateInstance($Name, $ParentId, "{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}",$Position);
        COMPort_SetBaudRate($InstanceId, 9600);
        COMPort_SetStopBits($InstanceId, 1);
        COMPort_SetDataBits($InstanceId, 8);
        COMPort_SetParity($InstanceId, 'None');
        //COMPort_SetPort($InstanceId , "");
		//COMPort_SetOpen($InstanceId, true);
        $DeviceList = COMPort_GetDevices($InstanceId);
        foreach ($DeviceList as $Device) {
           echo $Device;
        }
		IPS_ApplyChanges($InstanceId);
        return $InstanceId;
    }

   // ------------------------------------------------------------------------------------------------
    function CreateRegisterVariable($Name, $ParentId, $ScriptId, $PortId, $Position=0) {
        $InstanceId = CreateInstance($Name, $ParentId, "{F3855B3C-7CD6-47CA-97AB-E66D346C037F}",$Position);
        RegVar_SetRXObjectID($InstanceId, $ScriptId);
		IPS_ConnectInstance($InstanceId, $PortId);
        IPS_ApplyChanges($InstanceId);

        return $InstanceId;
    }  
	

somit kann ich mich nun mit dem auswerten der RegVar information beschäftigen.

Michael

Hallo Leute,

habe meine Installation Routinen wieder etwas verfeinert:

Zusätzlich modifizieren die meisten Funktionen jetzt die Parameter des Objectes, falls diese noch nicht den übgebenen Parametern entsprechen (so ist es zum Beispiel möglich auch nach dem Anlegen von Variablen,Kategorien die Position oder das Icon noch mit dem Installationsscript zu ändern).

Ausserdem werden jetzt nur mehr Veränderungen gelogged (einfaches ECHO), dadurch hat man leichter Kontrolle, ob das Installationsscript das macht, was man erwartet.

Mit CreateCategoryPath ist es möglich einen kompletten Baum von Kategorien anzulegen. Übergibt man zum Beispiel „iPhone.Wecker“ wird im Root die Kategorie iPhone und darin Wecker angelegt, die ID der Kategorie Wecker wird zur Weiterverarbeitung zurückgeben. Position und Icon beziehen sich auch immer auf das letzte Object.

Mit der Funktion get_ObjectIDByPath kann man sich die ID eines Objectes aus einem definierten Baum zurückgeben lassen, z.B. „Program.Wecker.Name“.

Praktische Anwendungs-Beispiele folgen …

lg
Andreas

Habe meine Installer Scripts an die Version 2.4 angepasst und auch einige Erweiterungen implementiert:

neue Funktionen:

[ul]
[li]function CreateLinkByDestination ($Name, $LinkChildId, $Parent, $Position)
[/li]
[li]function CreateEvent ($Name, $VariableId, $ScriptId, $TriggerType=1/ByChange/)
[/li]
[li]function exists_WFCItem($WFCId, $ItemId) {
[/li][li]function PrepareWFCItemData ($ItemId, $ParentId, $Title) {
[/li][li]function CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, $ClassName, $Configuration) {
[/li][li]function CreateWFCItemTabPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon) {
[/li][li]function CreateWFCItemSplitPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $Alignment=0 /0=horizontal, 1=vertical/, $Ratio=50, $RatioTarget=0 /0 or 1/, $RatioType /0=Percentage, 1=Pixel/, $ShowBorder=‚true‘ /‚true‘ or ‚false‘/) {
[/li][li]function CreateWFCItemCategory ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $BaseId /ID of Category/, $BarBottomVisible=‚true‘ /‚true‘ or ‚false‘/, $BarColums=9, $BarSteps=5, $PercentageSlider=‚true‘ /‚true‘ or ‚false‘/ ) {
[/li][li]function CreateWFCItemExternalPage ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $PageUri, $BarBottomVisible=‚true‘ /‚true‘ or ‚false‘/) {
[/li][li]function DeleteWFCItems($WFCId, $ItemId) {
[/li][li]function DeleteWFCItem($WFCId, $ItemId) {
[/li][/ul]

Mit der Funktion CreateLinkByDestination ist es möglich in einer Kategorie mehrere Links mit gleichem Namen anzulegen.

CreateEvent ermöglicht das anlegen von Trigger/Events.

und mit den WFC Funktionen ist es möglich ein komplettes WebFront per Script anzulegen (Achtung: es handelt sich hier um undokumentierte Funktionen von IPS, die Benützung erfolgt auf eigene Gefahr …).

Praktische Anwendungsbeispiele folgen wie immer …
Habe das Ganze mittlerweile auch im Wiki etwas zusammengefasst IPSInstaller

lg
Andreas

Das ist ja Oberklasse. Ich habe jedesmal Blutdruck, wenn ich mit dem Originaleditor arbeiten und ständig scrollen und aufklappen muss. :o

Vielen Dank :wink:

Ja, wem sagst Du das :smiley:

Hallo Brownson,

was mir so ein bisschen fehlt, ist eine Anleitung zu jedem Parameter im Befehl, was man damit einstellen kann. Das wäre noch der i Punkt.

Ich habe in meinen Skripten noch folgendes ergänzt bei der Variable,Ereignis,Timer Erstellung.
Ich kann noch einen Wert mit übergeben, der die Variable nach der Erstellung haben soll.
Vielleicht kannst du das ja noch bei dir mit einbauen.

Gruß Uwe

Hallo Uwe,

bin zufällig gerade dabei mich mit Dokumentation in PHP zu beschäftigen - wird aber wohl noch einige Wochen dauern bis es da einen vernünftigen Output gibt …

Hallo Andreas,
bei der Installation des IPSLogger hatte ich Probleme mit dem IPSInstaller vom 10.12.2011. Die Version vom 02.11.2011 funktionierte dann wieder.
Was mache ich falsch?
Gruß Jens

Hallo Andreas,

ersteinmal danke für die tollen Funktionen, dann brauch man das Rad nicht zweimal erfinden.

Ein kleiner Fehler ist mir aufgefallen:

  • @param string $Position Positionswert im Objekt Baum

z.B. bei function CreateWFCItemSplitPane

muß integer sein.

Gibt es eine Möglichkeit bei CreateWFCItemCategory das Icon leer zu lassen ohne den Haken zu setzen, denn hier gibt es einen IPS Bug?

@param string $Position Positionswert im Objekt Baum

Danke, werd ich in der nächsten Version ausbessern.

Gibt es eine Möglichkeit bei CreateWFCItemCategory das Icon leer zu lassen ohne den Haken zu setzen, denn hier gibt es einen IPS Bug?

Das hab ich noch nicht ganz kappiert…

Ich hab Dir mal ein Bild angefügt.


$Icon       = '';
CreateWFCItemCategory($id_wfc, $ItemId, $ParentId, $Position, $Title, $Icon, $ID_CAT01, false, 0, 0, false);

Ich hatte das Icon auch schon Transparent gesetzt, er macht allerdings im WF mit Haken ganz seltsame Dinge, dazu aber später etwas. Ich würde erstmal gern das Icon disabled setzen…

wecker.PNG