[Hinweis] Prüfen ob Systemvariable leer ist im Script

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

pke
Beiträge: 22
Registriert: 06.08.2019, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

[Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von pke » 16.08.2019, 09:47

Ist bestimmt schon bekannt, aber mich hat es das eine und andere Mal stolpern lassen.

Ob eine Systemvariable leer ist, prüft man in Scripten am besten mittels einfachem boolschen Ausdruck und nicht einem Leerstring Vergleich. Wenn nämlich die Systemvariable nicht gesetzt ist, dann ist deren Inhalt nicht mit einem leeren String identisch (anders als in allen Programmiersprachen die ich kenne).

Code: Alles auswählen

string sysvar = dom.GetObject("Systemvar").Value();

! FALSCH
if (sysvar != "") {
}

! RICHTIG
if (sysvar) {
}
Zuletzt geändert von pke am 16.08.2019, 12:13, insgesamt 1-mal geändert.

Benutzeravatar
Black
Beiträge: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von Black » 16.08.2019, 10:14

deine Ausführung ist.... falsch

string sysvar = dom.GetObject("Systemvar");

das da weist sysvar ein object zu mit der referenz auf sysvar zu. existiert sysvar nicht, ist das null

sysvar selber enthält KEINEN string, auf den Inhalt von Sysvar kommt du erst mit der methode .State ().

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

pke
Beiträge: 22
Registriert: 06.08.2019, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von pke » 16.08.2019, 12:14

Black hat geschrieben:
16.08.2019, 10:14
deine Ausführung ist.... falsch
string sysvar = dom.GetObject("Systemvar");
das da weist sysvar ein object zu mit der referenz auf sysvar zu. existiert sysvar nicht, ist das null
Ich hatte ".Value()" vergessen. Habe meinen ursprünglichen Code angepasst.
Die Grundproblematik bleibt die selbe. Undefinierte Systemvariablen vom Typ Zeichenkette sind nicht identisch mit einer leeren Zeichenkette.

Benutzeravatar
Black
Beiträge: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von Black » 16.08.2019, 12:31

richtig, uninitialisierte String Systemvariablen haben den Wert ???

siehe hier:
Neue Sysvar.jpg
Wenn man die in einem Script selber anlegt, sollte man da auch die Startwerte mitgeben.

und boolscher vergleich auf eien String angewand ergbit:
Leerstring (Bool = falsch)
irgendwas drin (Bool=true)

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

pke
Beiträge: 22
Registriert: 06.08.2019, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von pke » 16.08.2019, 13:58

Das kuriose ist aber eben, dass uninitalisierte Systemvars über WriteLine zwar einen Leerstring ausgeben (und nicht etwa ???)
Im boolschen Vergleich sind jedoch ein leerer String und ein unitialisierte Systemvariable gleich.
Daher sollte man diese immer nur mit einem boolschen Vergleich überprüfen (da man nie sicher sein kann, ob sie initialisiert wurde).

Benutzeravatar
Black
Beiträge: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von Black » 16.08.2019, 14:13

die sysvar die ich eben gepostet habe, hatte ich grad mal 20 sekunden vorher angelegt...

mach mal spasseshalber, leg ne neue sysvar Typ String an und sag dann mal was du da siehst... solten die "drei Fragezeichen" sein
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

pke
Beiträge: 22
Registriert: 06.08.2019, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von pke » 16.08.2019, 23:55

Ja das ist korrekt. Habe es gerade mal probiert. Warum sollte dieses Verhalten von Systemvariablen eigentlich sinnvoll sein?

Xel66
Beiträge: 14148
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 583 Mal
Danksagung erhalten: 1497 Mal

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von Xel66 » 17.08.2019, 01:54

pke hat geschrieben:
16.08.2019, 23:55
Warum sollte dieses Verhalten von Systemvariablen eigentlich sinnvoll sein?
Wieso stellt sich diese Frage überhaupt? Wird eine Systemvariable erstmalig angelegt, dann hat sie den Status "???". Ist sie erstmalig beschrieben und anschließend geleert, ist sie eben leer und weist "nie" wieder den Status "???" auf. Insofern ist dieses Verhalten in der Praxis absolut irrelevant und braucht eigentlich nicht betrachtet zu werden.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
roe1974
Beiträge: 746
Registriert: 17.10.2017, 16:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wien
Hat sich bedankt: 52 Mal
Danksagung erhalten: 13 Mal

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von roe1974 » 17.08.2019, 20:16

Für die, die es genau wissen wollen hat Badenpower im FHEM Forum einen entsprechenden Post hinterlassen.

Siehe:
https://forum.fhem.de/index.php/topic,1 ... #msg967616

Ich finde es immer noch Schade dass er hier "verbannt" wurde ..... sein Wissen fehlt hier einfach ! :(

Benutzeravatar
Black
Beiträge: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: [Hinweis] Prüfen ob Systemvariable leer ist im Script

Beitrag von Black » 17.08.2019, 20:47

den fhem Artikel mal inhaltlich nicht kommentiert aber:

hier redete man von dem normalen Weg des Anlegens über die WebUI. Ich weiss dann schon dass das die 3 fragezeichen ergibt.

Und wenn ich über dom.CreateObject () eine Sysvar anlege, weiss ich auch ,dass dann jegliche einstellung selber gemacht werden muss. (das macht schliesslich die Restore Funktion des SDV auch).

in soweit ein schönes WE, Black

(eine der Lösungen ,dass nicht initialisiert heist nicht zugewiesen, wurde, ist auch in der Hardcopy vom SDV zu erkennen --> LastTimeStamp, so man mit State () schreibt)

sollte es sich dabei allerdings um eine via CreateObject() via Script angelegte Systembariable handeln, ist dort TimeStamp nach dem iniialen Anlegen und vor der ersten Verwendung von State () "1970-01-01 01:00:00" ... wobei mir die ganze Problematik nicht klar ist: Wenn man die selber via Script anlegt,kann man die ja wohl auch selber initialisieren. Für eine String Sysvar musst du eh mindestens die Zeilen
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
schreiben. da ist die Zeile svObj.State (""); für nen Leerstring ja nicht mehr die grosse Schwierigkeit. Is nur meine Meinung ^^
Zuletzt geändert von Black am 18.08.2019, 00:36, insgesamt 1-mal geändert.
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“