Scriptvariablen

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Antworten
HmTec
Beiträge: 25
Registriert: 08.09.2014, 18:06
Danksagung erhalten: 1 Mal

Scriptvariablen

Beitrag von HmTec » 22.08.2018, 13:08

Hallo Jens,

Ich bin vor kurzem auf RaspberryMatic umgestiegen. Vorher habe ich auf der CCU2 mit Homeputer CL gearbeitet.

Unter Homeputer ist es so, dass Variablen in einem Makro lokal deklariert werden. In anderen Makros können diese Variablen durch Voranstellen des Makronamens angesprochen werden. Die Variablen behalten ihre Werte über das Ende eines Makros hinaus..
Es kann so auch nicht zu Typ-Differenzen kommen, wenn Variablen mit gleichem Namen in verschiedenen Makros unterschiedliche Typen haben, da diese ja effektiv unterschiedliche Variablen darstellen.

Im einem Topic gab es mal zwei Hinweise von Dir zu möglichen Weiterentwicklungen:
Feature: HM-Skript – Einführen eines ‚global‘ vs. ‚local‘ specifiers für variablen Definitionen sodass variablen dann nach ende eines Skriptes automatisch freigegeben werden bzw. einem art garbage collector zugewiesen werden.
und
Feature: Überarbeitung gewisser Interna um ein besseres Multithreading zu erreichen sodass z.B. Programme/Skripte mehr unabhängig (komplettes multithreading wird schwierig bis unmöglich) von einander abgearbeitet werden können.
(siehe viewtopic.php?f=34&t=37055 )

Könnest Du hier etwas genaueres zum Status Quo sagen und vielleicht einen Ausblick geben, ob es hier eine Weiterentwicklung geben wird.

Mein Verständnis des Status-Quo ist (und bitte korrigiere mich):

1. Scriptvariablen sind global gültig und können daher in allen Scripten mit dem gleichen Namen angesprochen werden.
2. Der jeweilige Typ einer Scriptvariablen kann sich unabhängig von der Deklaration zur Ausführungszeit ändern.
3. (2) führt dazu, dass es kein Problem eine Variable in einem anderen Makro mit einem anderen Typ zu verwenden.
3. Scripte werden nicht im Multithreading ausgeführt, sondern zu einem Zeitpunkt ist immer nur ein Script aktiv.
4. Diese sequentielle Abarbeitung von Scripten verhindert implizit einen konkurierenden Zugriff auf eine Scriptvariable.
5. Eine Freigabe bzw das Aufräumen von nicht mehr benötigten Scriptvariablen gibt es nicht.

Was passiert bei (3) mit dem alten Wert einer Scriptvariablen, wenn es zu einem Typwechsel kommt? Ist später auf der alte Wert wieder vorhanden, wenn wieder mit dem alten Typ auf die Scriptvariable zugegriffen wird?


Ich habe leider keine zusammenfassende Dokumentation gefunden. Es wäre schön, wenn Deine Antwort hilft, für alle, die wie ich noch nicht so tief in der Materie stecken, ein besseres Verständnis zu schaffen.

Vielen Dank im Voraus

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: Scriptvariablen

Beitrag von NickHM » 22.08.2018, 14:07

HmTec hat geschrieben:
22.08.2018, 13:08

Was passiert bei (3) mit dem alten Wert einer Scriptvariablen, wenn es zu einem Typwechsel kommt? Ist später auf der alte Wert wieder vorhanden, wenn wieder mit dem alten Typ auf die Scriptvariable zugegriffen wird?
Hallo

zumindest das könntest Du mit 2 Testscripten in weniger als 5min selbst ausprobieren.

HmTec
Beiträge: 25
Registriert: 08.09.2014, 18:06
Danksagung erhalten: 1 Mal

Re: Scriptvariablen

Beitrag von HmTec » 22.08.2018, 14:50

Klar habe ich einige Tests ausgeführt!

was ich bisher z.B. ausprobiert habe ist folgendes:

Script1:

Code: Alles auswählen

integer zahl = 1;
Script2:

Code: Alles auswählen

zahl=zahl+11;       
Ergibt: zahl hat den Wert 12

Script1:

Code: Alles auswählen

interger zahl = 1;
Script3:

Code: Alles auswählen

zahl="Zeichen";
Script2:

Code: Alles auswählen

zahl=zahl*1; 

Ergibt: "Zeichen11"

In diesem Fall wird einfach mit dem letzten Wert und Typ weitergearbeitet und "+" für Zeichen ausgeführt.
Aber ist das so allgemeingültig?

Danke
Zuletzt geändert von alchy am 22.08.2018, 16:58, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Benutzeravatar
jmaus
Beiträge: 9846
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 Mal
Kontaktdaten:

Re: Scriptvariablen

Beitrag von jmaus » 23.08.2018, 21:10

HmTec hat geschrieben:
22.08.2018, 13:08
1. Scriptvariablen sind global gültig und können daher in allen Scripten mit dem gleichen Namen angesprochen werden
Genau so ist es. Jedoch rate ich dringend davon ab diesen Fakt (das Scriptvariablen über Programme hinweg ihre Gültigkiet+Wert behalten) dazu zu nutzen in einem Programm z.B. die variable X anzulegen und einen Wert zuzuweisen um diese Variable X dann in einem anderen Script eines anderen Programmes auszulesen. Für das Übergeben von Werten von einem Programm zum anderen sollte immer stattdessen Systemvariablen genommen werden.
HmTec hat geschrieben:
22.08.2018, 13:08
2. Der jeweilige Typ einer Scriptvariablen kann sich unabhängig von der Deklaration zur Ausführungszeit ändern.
Das ist auch korrekt.
HmTec hat geschrieben:
22.08.2018, 13:08
3. (2) führt dazu, dass es kein Problem ist eine Variable in einem anderen Makro mit einem anderen Typ zu verwenden.
Auch das ist korrekt. Du kannst die Variable X in unterschiedlichen Skripten wiederverwenden. Du solltest aber am besten immer vor der Nutzung in einem Skript explizit eine Deklaration mit Defaultwert vornehmen. D.h. z.b. immer "var X = 0" schreiben um sicherzugehen das du nicht ausversehen einen Wert nutzt der nur versehentlich in einem anderen Skript für X gesetzt wurde.
HmTec hat geschrieben:
22.08.2018, 13:08
3. Scripte werden nicht im Multithreading ausgeführt, sondern zu einem Zeitpunkt ist immer nur ein Script aktiv.
Auch korrekt. Dieses Verhalten trifft jedoch nicht nur auf Skripte in Programmen zu sondern auf Programme selbst. D.h. auch von den graphischen Programmen die man über die WebUI (auch ohne Skripte) betreiben kann kann nur ein Programm zu einer bestimmten Zeit aktiv sein. Das führt dann eben z.B. dazu das wenn man komplexe Dinge in einem Programm macht (auch ohne Skripte) dann kann während der Bearbeitungszeit eines Programmes kein zweites parallel abgearbeitet werden.
HmTec hat geschrieben:
22.08.2018, 13:08
4. Diese sequentielle Abarbeitung von Scripten verhindert implizit einen konkurierenden Zugriff auf eine Scriptvariable.
Auch korrekt.
HmTec hat geschrieben:
22.08.2018, 13:08
5. Eine Freigabe bzw das Aufräumen von nicht mehr benötigten Scriptvariablen gibt es nicht.
In der Tat. Es gibt keinerlei Garbage-Kollektor oder ähnliches. D.h. wenn man 1x eine Variable mit einem Namen angelegt hat wird diese für die gesamte Restlaufzeit von ReGaHss im Speicher aktiv/zugreifbar sein. Und ja, folglich richtig verbraucht sie dann auch entsprechend Speicherplatz. Da man aber üblicherweise kein ReGa-Skripting in exzessiver Form betreibt (weil das nicht gerade ratsam ist) sollte sich der Speicherbedarf auch in Grenzen halten. Sollte man jedoch trotzdem z.B. vor allem Variablen mit zugewiesenen langen Zeichenketten aufräumen wollen kann man das gerne via "var X = ''" tun und dann sollte der Speicherplatz für die ursprünglich lange Zeichenkette wieder freigegeben werden.
HmTec hat geschrieben:
22.08.2018, 13:08
Was passiert bei (3) mit dem alten Wert einer Scriptvariablen, wenn es zu einem Typwechsel kommt? Ist später auf der alte Wert wieder vorhanden, wenn wieder mit dem alten Typ auf die Scriptvariable zugegriffen wird?
Da müsste ich tiefer nachschauen im Quellcode. Aber meiner Erinnerung nach sollte nach einem Typwechsel (vor allem z.B. von String <> Integer) der alte wert in der Tat verloren gehen bzw. der Speicherplatz freigegeben werden.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Antworten

Zurück zu „RaspberryMatic“