Generisch programmieren wie?

ich komme mit der IPS-Programmierung nicht zurecht…

Ich will z.B. folgendes erreichen:
ich bekomme von einem Homematic Device einen Feuchtigkeitswert als INT. Für KNX brauche ich aber einen Wert mit DPT9 (float). Ich habe das was programmiert, das funktioniert auch, aber das muß doch auch irgendwie generischer gehen … Mit den Systemvariablen kann ich trotz Doku leider noch nichts anfangen.

SetValueFloat(40182, GetValueInteger(36547));
KNX_WriteDPT9(14972, GetValueFloat(40182));

wobei 36547 die Variable von Homematic ist, 40182 eine Hilfsvariable (nachdem die Variable, die mit der DPT-Instanz erzeugt wird ‚readonly‘ ist, warum ?), 14972 die Instanz die den Wert in KNX übergibt.

Kann mir da jemand mal auf die Sprünge helfen …

Statusvariablen sind ReadOnly by Design
Natürlich geht es auch ohne Hilfsvariable:

KNX_WriteDPT9(14972,(float)GetValue(36547));

schon mal ein guter Tipp. Danke! Nur der Umgang mit den Systemvariablen ist mir noch nicht klar.

Die sind in der Doku sehr gut erklärt. Wenn Du daran etwas nicht verstehst, dann stell Mal eine konkrete Frage, was Du daran genau nicht verstehst. Oder zeig Deine nicht funktionierenden Skripte, wo Du mit Systemvariablen arbeiten möchtest. Dann kann man Dir gezielter helfen.

Vielleicht sind da sonst auch die neuen Ablaufpläne (6.0) was für dich? Da kannst du genau das unkompliziert zusammenklicken.

Hallo Dr.Niels,
zusammenklicken ist nicht meine Intension. Ich programmiere schon seit einigen Jahren in einer anderen Sprache und habe hier nur Anlaufschwierigkeiten. Speziell was die Ausgabe von Variableninhalten anbelangt. Wie sehe ich z.B. was in der Variable $_IPS[‚TARGET‘] oder in $_IPS[‚VARIABLE‘] steht. Von der Schreibweise in der anderen Programmiersprache her kenne ich, das in eckigen Klammern der Wert optional ist. Das ist aber hier offensichtlich nicht so … So nur z.B.

Schau dir doch mal mit:

print_r($_IPS);

an, was da so drin steht, wenn du das Script manuell ausführst, oder wenn es mit einem Event startet (beim Event dann bei den Meldungen zu finden).

$_IPS ist ja nur ein Array… Die einzelnen Elemente das Arrays erklären sich sehr gut über die Doku.

Grüße
Stefan

https://www.symcon.de/service/dokumentation/konzepte/automationen/php-skripte/systemvariablen/

Wenn Du sehen möchtest, was im Skript konkret in den Variablen enthalten ist, kannst Du diese z.B. mit IPS_LogMessage ausgeben.

https://www.symcon.de/service/dokumentation/befehlsreferenz/programminformationen/ips-logmessage/

Hallo Stefan,

„$_IPS ist ja nur ein Array… Die einzelnen Elemente das Arrays erklären sich sehr gut über die Doku.“

Das erklärt schon eine Menge. Da bin ich nicht draufgekommen … Das hilft schon mal extrem weiter …

ich versuche das Script generisch zu schreiben. Mit den Systemvariablen gelingt mir das nur teilweise. Insbesondere ist mir nicht klar, warum $_IPS[‚TARGET‘] die Id des Scripts zurückgibt. Das übergeordnete Objekt (Doku) ist doch hier die Instance (14972)?

KNX_WriteDPT9(14972,(float)$_IPS['VALUE']);

Wie kann ich die „Target“-Instance (14972) generisch ermitteln?

$Parent = IPS_GetParent($_IPS[‚SELF‘]);

Wobei du dann die Variable bekommen wirst … :-o

Das wäre eigentlich wie bei
$_IPS[‚TARGET‘] ID des übergeordneten Objektes
da sollte die VariablenID und nicht die ScriptID kommen.

geht halt immer nur eine Ebene hoch im Baum, dann musst du das doppelt ausführen ;-).

Weil - gemäß Dokumentation - in $_IPS[‚TARGET‘] die ID des übergeordneten Objektes enthalten ist. Das übergeordnete Objekt des Ereignisses 27448 ist die 36431. Funktioniert also genau so, wie in der Doku beschrieben.

Ausgehend von wo?

Grundsätzlich verstehe ich nicht, warum das Skript unter der Variable „Value“ hängt. Ist es denn auch das Aktionskript von der Variable „Value“? Oder soll hier einfach nur eine Luftfeuchte von HomeMatic auf den KNX Bus gesendet werden und das Skript ist gar kein Aktionskript im eigentlichen Sinne?
https://www.symcon.de/service/dokumentation/konzepte/variablen/variablenaktionen/

Nein, ausgehend vom Ereignis kommt die ID des Skriptes.

Eigentlich sollte nur der Wert von Homematic an KNX übergeben werden. Da ich aber mehrfach diese Situation habe, wollte ich ein Script schreiben was ich überall verwenden kann ohne absolute ID’s einzutragen. Aktionsskript im eigentlichen Sinne? Es soll eben aufgrund eines Ereignissen (Änderung des Wertes von Luftfeuchtigkeit) ausgeführt werden. Wo das Script hängt, war mir jetzt nicht besonders bewußt. Mir gings auch darum mit den Systemvariablen arbeiten zu können und diese zu verstehen.
Wobei mir jetzt immer noch nicht klar ist, wie ich die ID 14972 in den Systemvariablen finde.

Wenn deine Baumstruktur immer so ist, dann
$Parent = IPS_GetParent($_IPS[‚SELF‘]); // führt zu der ParentID
$NextParent = IPS_GetParent($Parent); // führt zu der nächsthöheren ID

So langsam wird mir das klar. Ich habe mich zu sehr an die Systemvariablen des Variablenereignis „ausgelöstes Ereignis“ orientiert.

Ich vermute, bei meiner weiteren Einarbeitung kommen noch mehr Fragen …

Vielen Dank erstmal!!

Nirgends - zumindest bei dem oben gezeigten Screenshot nicht.
$_IPS[‚SELF‘] ist das Skript selber. $_IPS[‚VARIABLE‘] ist die Variable, die das Skript auslöst … und so weiter. Da musst Du mit IPS_GetParent arbeiten.

Ich kann Dir sagen, wie ich solche wiederkehrenden Dinge löse. Ich baue mit ein Skript, welches mir ein Skript erstellt.
Das zu erstellende Skript sieht am Ende beispielsweise so aus:

$TempHM = 12345;
$TempKNX = 54321;

KNX_WriteDPT9($TempKNX, $TempHM);

Völlig unspektakulär. Wir brauchen nur zwei IDs. Diese werden in das Skript eingetragen. Bei der Ausführung wird also ein Skript mit den passenden IDs erstellt. Gleichzeitig wird das auslösende Ereignis mit erstellt. Diese Variante ist nach dem Motto „Fire and Forget“ und niemals etwas ändern. Möchte ich dem Code etwas hinzufügen, könnte man den Teil mit KNX_WriteDPT9 noch mittels require in einem separaten Skript ausgliedern, sodass der eigentliche Code in einem eigenständigen Skript steckt.

Man könnte auch ein Skript für alle Werte machen und dies zyklisch ausführen.

Es gibt soooo viele Möglichkeiten. :loveips:

Bin hier ja erst am Anfang. Habe bisher nur in xBase++ programmiert. Das hier ist was anderes …
Scheint aber sehr interessant zu sein. Werde dranbleiben, es gibt einige Sachen die ich mit IPS realisieren will.
wie gesagt - Danke für die Hilfe!