Warum gibt es eigentlich kein SetValue() für Statusvariablen?

Wenn ich versuche, Laien IPS näher zu bringen, bzw. wenn Einsteiger hier Fragen stellen, stolpern diese (meines erachtens) besonders häufig über die Tatsache, dass sie bestimmte Variablen mit SetValue() setzen können, andere jedoch nicht. Insbesondere Statusvariablen von Instanzen sind bekanntlich nicht einfach so zu beschreiben, sondern man muss ja einen speziellen, je nach Typ der Instanz unterschiedlichen Befehl verwenden, und man gibt dabei auch nicht wie sonst die Variablen-ID an, sondern die ID der Instanz und bspw. einen String.

Mir als erfahrenem Anwender ist das alles mittlerweile klar, auch warum es technisch Sinn ergibt, also bitte keine Erklärungen dazu :smiley: . Aber für Einsteiger ist das doch ziemlich oft ziemlich verwirrend.

Ich frage mich nun manchmal, warum es nicht (zusätzlich) einen simplen, „einheitlichen“ Befehl geben kann, der quasi sowohl das normale SetValue, sowie die sonstigen „Setz-“ Befehle der Instanzen intern gekapselt hat und je nachdem ob es eine Statusvariable ist, wenn ja, wozu sie gehört, den passenden internen Befehl auswählt und aufruft.

Mit einer Syntax, die dem SetValue() entspricht, wo ich also einfach die ID der Variablen angebe, den gewünschten Wert, und gut ist.

Dass das technisch möglich wäre weiß ich, dass ich es mir selbst schreiben könnte auch - aber darum geht es mir ja nicht. Mir geht es um die Frage, ob man so nicht eine große „Verständnishürde“ für Anfänger abbauen könnte?

Ja das Thema hatte ich auch, das ist Anfängern zunächst nicht einfach zu vermitteln.
Ein Grund warum ich das Kapseln der Funktion für schwierig halte ist, eine normale Variable kann ich immer verändern. Bei der Statusvariable die zu einer Instanz gehört sollte das nur gehen wenn ich wirklich etwas geschaltet habe. Ich hätte dan quasi Sondervariablen die einen Fehler zurückgeben weshalb sie meinen neuen Wert nicht angenommen haben. Diesen „Spezialfall“ muss ich dem Anfänger dann auch klar machen, es gibt normale Variablen und „zickige“ die ggf. meckern und sich verweigern.:smiley:

Einen anderen Wetterbericht zu senden fördert vielleicht die Vorfreude aufs Wochenende, ändert aber nichts an den Fakten. :wink:

Sicher könnte man einfache Dinge mit einem Allroundbefehl abfrühstücken. Aber wie sähe denn dein internes „overwrite“ für DMX_FadeChannel (Parameter Channel, Value, FadingSeconds) oder FS20_SetIntensity (Parameter Intensity und Duartion) aus?

Es mag zwar für Anfänger nicht immer logisch erscheinen aber es hat ja einen Grund warum es so gemacht wird. So wird auch jeder Modulentwickler „gezwungen“ sich an diesen einheitlichen Standard zu halten.

Gruß,

Toni

Das finde ich ehrlich gesagt relativ leicht zu vermitteln, weil intuitiv verständlich - wenn ich was ändern will, aber es geräteseitig nicht möglich ist, bekomme ich halt einen Fehler. Das ist ja jetzt im Grunde auch schon so.

(Ich verkneif mir jetzt mal den Witz mit den „alternativen Fakten“… :wink: )

Das finde ich eine durchaus gelungene Beschreibung, wobei es einen Unterschied gibt - auf das Wetter habe ich sicher keinen Einfluss, aber den Zustand eines Gerätes kann ich wahrscheinlich ändern.

Diese Tatsache, dass eine Statusvariable streng genommen nur ein „Bericht“ ist, den das Gerät zurück meldet und ich in Wahrheit also das Gerät nur lieb bitten kann, etwas zu tun und nicht irgendetwas „erzwingen“ - das ist zwar wahr und dem Eingeweihten nach einer Weile auch geläufig, aber ich glaube für den Neuling ist diese Unterscheidung weder leicht verständlich, noch sonderlich relevant.

Es besteht so oder so die Möglichkeit, dass das gewünschte nicht funktioniert. Nur dass man aktuell für jeden Gerätetyp neu eine Befehls-Syntax erlernen muss.

Da die jeweilige Status-Variable üblicherweise unterhalb der Instanz liegt kann man die Instanz doch einfach finden, den Typ dann aufgrund der UID herausfinden und den möglichen Schaltbefehl müsste man je Typ im Script „wissen“.

Also für „einfach nur schalten“ sollte das per Script lösbar sein.

Wie gesagt, ich weiß dass ich mir das selbst schreiben kann - aber das nützt ja Anfängern nichts. :wink:

Das musste ich als Anfänger 2009 auch lernen. Da muss jeder Anfänger einmal durch.

Ja, leider.

Ich denke auch, daß IPS von einem konsequent objektorientierten Modell und entsprechenden Basisklassen profitiert hätte, um Basisfunktionalität von der konkreten Hardware zu abstrahieren.

Das war u.a. ein Grund für mein eigenes Virtualisierungs-Modul. Das kapselt die vielen verschiedenen Umsetzungen für Geräte und stellt ein (Dummy)-Gerät zur Verfügung das einheitliche Funktionen bietet und bei dem man auch die Variable verändern kann. Die Transformation passiert dann bei der Übertragung zur original-Hardware-Instanz. Nur noch mit denen arbeite ich in Scripten… mir war es einfach auch immer zu blöd zu wissen ob der Aktor jetzt von HM, Zwave oder sonstwas ist und ich immer die verschiedenen Befehle nehmen musste. Und wenn ich mal HM gegen Zwave tausche darf ich alle Scripte anpassen (wegen IDs UND wegen den Befehlen)… das ist jetzt alles weg, dafür bin ich ggf. im Funktionsumfang etwas eingeschränkt aber auch „Standardisiert“ :wink:

Ich denke diese Trennung von virt. Instanzen und HW-Instanzen hat mir VIEL Arbeit in letzter Zeit erspart und für viel Verständnis beim Nachvollziehen für 3. gesorgt… natürlich ist der Initial-Aufwand erstmal vorhanden…

Du meinst, es wäre unfair wenn die Einsteiger von heute es leichter hätten als du damals? :wink:

Ich möchte nochmal ein Argument jenseits der Einstiegshürde nachlegen: Wenn ich aktuell ein Skript schreiben will, das universell Lampen schalten kann, dann muss ich immer eine Fallunterscheidung machen, mit was für einem Gerätetyp ich es zu tun habe.

Also beispielsweise gibt es bei mir Dimmer sowohl im Bus-System LCN, als auch von HomeMatic (feste Lampenanschlüsse sowie Steh- und Tischlampen an der Steckdose). Wenn ich eine Lichtszene speichern will ist es unproblematisch - ich kann einfach die aktuellen Werte der Statusvariablen irgendwo abspeichern. Das System dahinter ist in dem Fall egal. Aber will ich die gespeicherte Szene abrufen, muss ich mich zwingend damit befassen, mit welchem System ich es zu tun habe. Obwohl es in beiden Fällen ähnliche Geräte sind, denen ich jeweils einen numerischen Wert mitteilen will…

:wink: genau mein reden…

Diese Fallunterscheidung sind vielleicht 3 Zeilen mehr Code …

In meinem Fall und wenn ich das Skript nie teilen will - ja.

Es gibt tatsächlich eine Funktion, welche die Standardaktion einer Statusvariable ausführt.
Aber, wie man am verlinkten Code sieht, gibt es viele Varianten.
Da die Aktion ja auch deaktiviert oder eine CustomAction vorhanden sein kann.
IQL4Symcon/module.php at e740a602a47e238d4e55392467ade23c73bfc85e · IQLiving/IQL4Symcon · GitHub

Michael

Ich verstehe schon was du da meinst und klar das würde das Leben schon vereinfachen. Wir haben in der Firma ein Schneider System und der Objektbaum ist unabhängig von der Hardware.
Also eine Zahl ist eine Zahl und wenn ich die schreiben will kann ich das, die Umsetzung auf LON, BACNet oder Modbus bekomme ich nicht mit, das machen die Treiber. Allerdings ist das ganze wie auch schon erwähnt sehr eingeschränkt. Da gibt es halt einen Satz von Typen und das war’s. Wenn ich mehrere Parameter übertragen wollte brauche ich für jeden eine extra Variable oder halt den Typ, wie z.B. ein Kalenderelement. Die sind dann aber auch nie so wie man sie grad braucht.

Sent from my SM-G935F using Tapatalk