Nützliche Programmierpattern, Strukturierungen etc.

Hi,

ich würde gerne dazu anregen das jeder mal etwas von seinem Wissen Preis gibt was die Struktur und den Aufbau von IPS und der Programmierung so angeht um auch Anfängern ein paar Best-Practise, oder Pattern an die Hand zu geben. Wahrscheinlich haben viele von euch die eine umfangreichere IPS-Installation haben schon die ein oder andere Erfahrung gemacht, nochmal neu strukturiert oder gelernt was gut oder nicht so gut ist. Dies würde ich gerne hier mal sammeln und dann ggf. auch ins Wiki übernehmen, da man keinem Neuling später zumuten kann zig Seiten Thread zu lesen.

Ich mache mal einen Anfang um zu zeigen was ich meine, vielleicht steigen andere ja dann auch ein?

Kapselung Hardware -> Funktion -> Verwendung

Ich habe mit wachsender Installation die Erfahrung gemacht das es sich absolut nicht eignet in Scripten, Links und Ereignissen die Original-Hardware anzusprechen (also die Original-Instzanz. Warum? Wenn man das Gerät mal tauschen muss, so muss man alle Beziehungen zu dem Objekt erstmal finden, ersetzen, ggf. ist auch der Befehlssatz ein andere (HM gegen ZWave getauscht oder so) oder ähnliches. Außerdem will man manche Sachen auch zentral konfigurieren von denen Scripte etc. nicht unbedingt etwas wissen sollen (z.B. haben alle meine Geräte einen „abschalter“ der verhindert das das Gerät angesprochen wird, sowas wie ein „fast“ Hardware-Schalter).

Wie sieht also meine Lösung aus?

b Geräte: [/b]
Ich habe eine Kategorie in der sich alle Hardware befindet. Bei mir nach physikalischem Standort unterteilt (Raumname, Unterverteiler, Netzwerschrank 1 etc. etc.). Dort ist die Hardware-Adaption gespeichert, sprich die in IPS angelegte Instanz. Auf diese hat aber ausschliesslich die nächste Kategorie Zugriff

b Geräte: [/b]

Hier verstecke ich alle logischen Geräte. Diese sind etwas anders sortiert, z.B. das Licht in dem Raum wo es wirklich leuchtet, nicht wo der Aktor angebracht ist. Hier drin befinden sich Dummy-Instanzen, wo ich mir je Aktor-Typ immer die selbe Struktur aufbaue, z.B. hat ein Licht immer An, Aus, Umschalten, Helligkeit setzen als Funktionen (Scripte) und als Variable Status und Helligkeit. Das hat nun jedes Licht, egal ob es ein dimmbare Licht ist oder nicht. Ich kann mich also immer darauf verlassen das bei einem Licht mir diese Funktionen zur Verfügung stehen. Nur DIESE Scripte verwende ich um das Licht einzuschalten oder auszuschalten, sowohl in Links, als auch in Scripten, Timern oder Events. Hier könnte man jetzt Links auf die Original-Instanz ablegen, das war mir allerdings etwas zu umständlich und wenn das Original mal entfällt hat man das gleiche Problem wieder, nur eine ebene höher. Also sind dort „echte“ Variablen, die per Event den Status der Original-Instanz abbilden. Weiterhin enthalten die Scripte ein „IPS_Runscript“ auf das Original-Script zum anschalten an der Hardware-Instanz. Das vergaß ich vielleicht zu erwähnen, die Original-Instanzen haben bei mir auch Scripte für An, Aus etc. in denen sich die Hardware-Spezifischen Befehle verstecken. Diese Scripte rufe ich jetzt mit ScriptByName auf, wo der Start für die Funktion ist habe ich im Dummy einfach in die Beschreibung geschrieben, so kann ich die Scripte immer kopieren. Einzig die Ereignss-Ziele muss man von Hand anpassen.

Nutzen

Wenn jetzt ein Aktor ausgetausch werden muss (oder einfach bei Z-Wave mal neu angelernt ist und damit wie ein neues Gerät sich verhält) muss ich nur in der logischen Instanz die neue Instanz-ID eintragen und die Ereigniss-Ziele zum Variablen aktualisieren anpassen. In der Hardware-Instanz lege ich dann für An, Aus etc. wieder die Scripte an und diese findet die logische Instanz dann ganz automatisch. In diesen Scripten steht z.B. auch der von mir oben angesprochen „Hardware-Switch“ drin, der sobald eine bestimmte Variable in der Hardware-Instanze „true“ ist einfach absolut verhindert das der Aktor auch nur einen Befehl bekommt. Wie praktisch so etwas ist merkt man erst wenn man z.B. wie bei mir mal eine kaputte Jalousie hat, die auf keinem Fall bewegt werden darf… tja, da muss man erstmal alle Scripte, Timer und Events finden die die ansteuern wollen… so ist es kein Problem, „Sperre“ auf true gesetzt und das wars.

Nachteil meiner Lösung: Einige fertige Scripte z.B. aus der IPSLibrary die direkt auf die Hardware gehen funktionieren dann nicht mehr, aber meistens kann man sie anpassen auf die logischen Instanzen.

So etwas als Tipp meine ich z.B., da kann auch ruhig jeder seine Meinung zu haben und äußern, Programmierung ist nunmal eine Kunst und da gibt es (fast) kein richtig oder falsch, deswegen sind hier auch Anregungen oder alternative Vorschläge erlaubt.