Fragen zur Modulerstellung

Hallo,

ich bin gerade mit der Erstellung meines ersten Moduls beschäftigt.

Hätte dazu mal 2 Fragen.

1. Automatische Erstellung einer Dummy Instanz innerhalb des Modules:
Mein Modul benötigt eine Dummy Instanz, es ist mir jedoch zu Ohren gekommen das dies nicht erwünscht ist.
Unterhalb der Dummy Instanz werden automatisiert Boolean-Variablen erstellt, die nicht direkt unterhalb des Modules erwünscht sind.
Darf man oder darf man nicht, wenn ja wie am besten ?

Mein Code dazu sieht so aus:

        protected function SearchDummyInstanz() {
            foreach(IPS_GetChildrenIDs($this->InstanceID) as $VarSearchID) { //Suche Dummy-Instanz
                $Type = IPS_GetObject($VarSearchID)['ObjectType'];
                $Ident = IPS_GetObject($VarSearchID)['ObjectIdent'];
                if ($Type === 1 && $Ident == "DumHostsVariables") { 
                    $DummyInstanz = $VarSearchID; //Dummy Instanz gefunden
                    return $DummyInstanz;
                }
            }
        }

        public function CreateDummyInstanz() {
            $DummyOK = false;
            foreach(IPS_GetChildrenIDs($this->InstanceID) as $VarSearchID) {
                $Type = IPS_GetObject($VarSearchID)['ObjectType'];
                $Ident = IPS_GetObject($VarSearchID)['ObjectIdent'];
                if ($Type === 1 && $Ident == "DumHostsVariables") { 
                    $DummyOK = true; //Dummy Instanz gefunden
                    if ( $this->ReadPropertyBoolean("HostsVariables") == true ) {
                        IPS_SetHidden($this->GetIDForIdent("DumHostsVariables"), false); //Variable ein/ausblenden
                    } else {
                        IPS_SetHidden($this->GetIDForIdent("DumHostsVariables"), true);
                    }
                }
            }
            if ($DummyOK != true) {
                $dummy=IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
                IPS_ApplyChanges($dummy);
                IPS_SetName($dummy,$this->Translate('Hosts state'));
                IPS_SetParent($dummy,$this->InstanceID);
                IPS_SetPosition($dummy, 22);
                IPS_SetIdent($dummy, "DumHostsVariables");
            }
        }

2. Ich würde es gerne dem Benutzer ermöglichen einen STRING selbst zusammen zu setzen im Konfigurationsformular.
Dazu gebe ich dem Benutzer die benutzbaren Variablen bekannt, so das er Sie über das Formular beliebig zusammen setzen kann.
Beispiel.

$VAR1 beliebig $VAR2 usw..

Dies im Formular abzubilden ist kein Problem, jedoch das im Modul dann die $VARIABLEN im String als solche erkannt werden schon.
Jemand eine Idee ?

3. Ich benutze 2 Stringvariablen um 2 Arrays darin zu speichern, gibt es hier noch eine bessere Möglichkeit die Arrayinhalte dauerhaft zu speichern ?

            $HostsArray = array();
            $HostsArray = unserialize(GetValue($this->GetIDForIdent("VarXMLAct")));

Zuerst Mal bist du hier falsch.
Es gibt extra ein Forum für solche Fragen.
Ich verschiebe das Mal.

Zu 1.
Ja das ist nicht erlaubt.
Gibt auch keinen Grund das so umzusetzen.
Entweder legt man mehrere Instanzen an, oder wenn z.B. Daten für mehrere Instanzen benötigt werden, arbeitet man mit einem IO oder Splitter.

Zu 2.
Nimm doch einfach die Platzhalter welche sprintf direkt unterstützt.
Michael

Zu 3:
Da könntest du doch Attribute nehmen: RegisterAttributeString — IP-Symcon :: Automatisierungssoftware

Grüße,
Kai

Ergänzend zu 3:

IPS-Variablen sind nicht dafür gedacht als Zwischenspeicher zu dienen.
Für ‚flüchtige‘ Daten. Also welche nach einem Neustart verloren gehen sind Buffer zu benutzen.
Für nicht flüchtige Daten, wie Kai schon schrieb, die Attribute.

Einige deiner Punkte werden hier auch erklärt:
Best Practice zur PHP-Modul Erstellung · GitHub

Michael

Sorry und Danke fürs verschieben des Themas.

sprintf und Attribute klingen vielversprechend, werde ich mir ansehn, vielen Dank.

Falls ich dich richtig verstanden haben bzgl. „Variablen“ in Texten ersetzen - du kennst doch meinen HostMonitor - da „übersetze“ ich in einem Text vom User „Variablen“ mit dem „richtigen“ Inhalt.
Schau da im Code einfach mal nach „§HOST“ - ist in der Funktion „Notification“ zu finden :wink:

Bis morgen :slight_smile:
-Chris-

Das ist es!, vielen Dank :smiley:

Ich stelle gerade fest das ich mit einer String Variable dasselbe erreiche wie mit einer Dummy-Instanz. :slight_smile:
Es ging mir nur um die Unterordnung neuer Variablen in ein bestehendes Objekt.

Hätte ich mir die Zeit sparen können mit der automatisierten Instanz-Erstellung :rolleyes:
:smiley:

Aber auch unterhalb von Variablen hast du nichts anzulegen.
Nur direkt unter deiner Instanz.
Sonst funktioniert weder RegisterVariable noch SetValue korrekt.
Alternativ ist mit mehreren Instanzen und Splitter zu arbeiten.
Michael

Natürlich erstelle ich diese nur unterhalb der Modulinstanz

Dann brauchst Du aber auch keine Dummy Instanz, dnna ist es ja eine eigene Instanz und im Konfigurationsformular kannst Du auswählen lassen welche Variablen genutzt werden sollen.

Es ging mir nur um die Verschachtelung des ganzen, ein Bild sagt wahrscheinlich mehr als…

Ein vielleicht doofe Frage hätte ich noch :o
Wenn ich eine Variable im Konfigurationsformular und in der Webconsole beiderseits ändern können möchte, gibt es hier einen optimalen Weg ?
Arbeite im Formular mit „RegisterPropertyInteger“, ist das dann der falsche Weg ?

Das Bild sagt nix, weil du das WebFront und nicht den Objektbaum zeigst.
Zu deiner Frage:
Eigenschaft sind einstellbar Parameter der Instanz und werden über die Konsole vom User eingestellt.
Variablen sind das nicht, und somit auch nicht aus dem WebFront zu ändern.

Variablenwerte ändert man über die Konfiguration der Instanz hat nicht.

Vermische nicht die Frontends mit dem Backend (Konsolen).
Michael

Sorry, hier ein Bild vom Backend:

Im Moment ist die Variable „Lösche Offline Hosts nach x Tagen“ (im Bild sichtbar) über das Backend(Formular) einstellbar, wird jedoch auch im Frontend (zur Information) angezeigt.
Ok, dann stell ich mir die Frage ob es möglich ist eine Variable (im Modulcode) als „ReadOnly“ zu deklarieren ?
(Ansonsten meint der Benutzer eventuell er könne den Wert auch im Frontend ändern)

Das mit den Variablen unterhalb einer Variable ist genauso wenig korrekt wie vorher mit der Dummy-Instanz.
Erstelle sie einfach alle direkt unter der Instanz. Der User kann sich das Frontend ja mit Links zusammenbauen wie er will.

Die Variable ist doch aktuell gar nicht vom WebFront bedienbar. Wer soll da auf die Idee kommen da etwas (wie denn) einzustellen.
Michael

Das Instanzproblem in Modul ist verschwunden, da dies mit HtmlBox Ausgabe gelöst wurde.

Neue Frage zur Modulerstellung:
Gibt es eine Möglichkeit mobiles Devices oder besser die Display Auflösung im Modulcode zu erkennen ?
Es geht darum ev. die Schriftgrössen bei Anzeige auf einem mobilen Device im Modul separat einstellen zu lassen.

Danke für Ideen

Nein, das geht nicht.
Allerdings sollte sich das in der HTMLBox mit CSS lösen lassen.
Michael

Danke, hat funktioniert mit CSS:
@media only screen and (max-device-width: 480px)

Neue Frage zu CSS in der HTMLbox :slight_smile:
Ist es möglich von Modul aus auf die CSS des Skins zuzugreifen ?

Wäre der Inhalt von:

.ipsWebFront {
background-color...
}

den ich gerne „wenn Transparent gewählt wurde“ per inherit vom WebFront-Skin übernehmen würde.

EDIT:
Ich habe es nun so gelöst:

        //Transparent?
        if ($this->ReadPropertyInteger('HTMLBG') < 0) {
            $HTMLBG = 'fade(#FFFFFF, 50%)';
        }

Nächste Frage in die Runde

Ich möchte „bei Änderung im Konfigurationsformular“ in einer ValidationTextBox(Property) eine Function ausführen, wenn auf Übernehmen geklickt wird. Also quasi ein vorher nachher Vergleich in ApplyChanges().

Dazu habe ich bis jetzt nicht wirklich was gefunden, tja wahrscheinlich blind gel :rolleyes: :smiley: