FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Spartacus am 06 Mai 2014, 17:51:36

Titel: Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 06 Mai 2014, 17:51:36
Hallo,
ich habe folgendes Problem:

Mein Sonos Device meldet mit "Sonos_.*:.appeared" seine Präsenz im fhem System. Wenn dieses Event kommt, dann starte ich ein Initialisierungs Routine für das jeweilige Sonos Device und betanke es mit Defaultwerten. Soweit ist alles gut!

Das gleiche "Sonos_.*:.appeared" kommt aber auch, wenn fhem gestartet wird. Hier soll aber verhindert werden, das bereits initialisierte Devices mit Default-Werten überschrieben werden.

Die Idee war, dies über global:INITIALIZED zu lösen und sich in einem Dummy zu merken, dass fhem initialisiert ist. Das dumme daran ist aber, dass  der State des Devices in der fhem.save gespeichert wird und somit unbrauchbar ist, da beim Start von fhem dieser Zustand zurückgespeichert wird.

Gibt  es eine Art Systemvariable die man abfragen kann, wenn fhem initialisiert ist, oder wie könnte man das lösen?

Danke und Gruß,
Sparatcus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: betateilchen am 06 Mai 2014, 18:27:50
Zitat von: Spartacus am 06 Mai 2014, 17:51:36
Gibt  es eine Art Systemvariable die man abfragen kann, wenn fhem initialisiert ist, oder wie könnte man das lösen?

$init_done

Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 06 Mai 2014, 18:33:56
Hallo betateilchen,
super! vielen Dank, das probier ich mal aus...
Sparatcus.
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: betateilchen am 06 Mai 2014, 18:47:49
Dein eigentliches Problem habe ich aber nicht verstanden. global:INITIALIZED tritt doch erst auf, nachdem Dein device initialisiert ist?

Das Speichern des Gerätezustandes in der fhem.save kann man übrigens verhindern, wenn man $defs{<deviceName>}{TEMPORARY} auf 1 setzt, z.B. nach dem INITIALIZED:

define maketemp notify global:INITIALIZED {$defs{<deviceName>}{TEMPORARY}= 1}

Damit wird beim nächsten Schreiben des Statefile der Zustand des Gerätes <deviceName> nicht mehr mitgesichert.
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 06 Mai 2014, 19:08:50
Hallo,
irgendwie klappt das auch nicht! Ich hatte gedacht, dass global:INITIALIZED bzw. $init_done  erst dann gesetzt wird, wenn auch die Sonos Devices initialisiert sind und Ihre Präsenz im System bekannt gemacht haben. Das passiert aber später und die Systemvaraiable ist bereits gesetzt....

Im Moment weiß ich nicht, wie ich das Event "Sonos_.*:.appeared"nach einem fhem-start verhindern kann...

Sparatcus.

Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: betateilchen am 06 Mai 2014, 19:35:14
Zitat von: Spartacus am 06 Mai 2014, 19:08:50
Im Moment weiß ich nicht, wie ich das Event "Sonos_.*:.appeared"nach einem fhem-start verhindern kann...

Indem Du das Speichern wie oben beschrieben verhinderst.
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 06 Mai 2014, 20:50:35
Hallo,
anscheinend funktioniert das tatsächlich, habe aber keine Ahnung warum! ist das jetzt Zufall?

was habe ich gemacht:

Schritt 1: fhemInit auf 1 setzten, wenn global:INITIALIZED
define fhemInitNotify notify global:INITIALIZED set fhemInit 1
Schritt 2: sichern von state in fhem.save verhindern.
define maketemp notify global:INITIALIZED {$defs{fhemInit}{TEMPORARY}= 1}
Schritt3: Makro für Device Initialisierung gebaut
define InitTest notify InitTest \
{ \
if (ReadingsVal ("Sonos_Terrasse","currentTrackURI","") eq "")\
  {\
   {fhem "set Sonos_Terrasse LoadRadio WDR2%%20Ruhrgebiet"};;;;\
   {fhem "set Sonos_Terrasse Volume 3"};;;;\
   {fhem "set Sonos_Terrasse Treble 10"};;;;\
   {fhem "set Sonos_Terrasse Bass 3"};;;;\
   {fhem "set Sonos_Terrasse Balance 0"};;;;\
   {fhem "set Sonos_Terrasse Loudness 1"};;;;\
   {fhem "set Sonos_Terrasse LEDState 0"}\
  }\
}

Schritt 4: Initialisierung zeitverzögert aufrufen
define Init_Terrasse notify Sonos_Terrasse:presence:.appeared \
{\
if (Value("fhemInit") == 1)\
{\
  fhem ("define InitTestLater at +00:02:00 trigger InitTest")\
}\
}


Wenn ich jetzt den Sonos mit Strom versorge, taucht im logfile "Sonos_Terrasse:.appeared" auf, fhemInit ist auf "1" und das Init_Terrasse wird angetriggert... das ist auch gewünscht!
Wenn ich fhem starte und ich mir direkt die Variable fhemInit anschaue, steht diese bereits auf "1". Aber erst später im Eventlog taucht dann "Sonos_Terrasse:.appeared" auf. Warum wird jetzt Sonos_Init nicht angetriggert? Die Variable fhemInit ist doch schon auf "1" gesetzt? Das ist zwar genau der gewünschte Effekt, aber ich verstehe das nicht! oder  ist nur reiner Zufall, dass das funktioniert wie es soll!

Für eine Erklärung wäre ich dankbar!
Sparatcus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 08 Mai 2014, 18:27:57
Hallo,
kann ggf. jemand erklären, warum fhem so reagiert (siehe meinen letzten Post)?

Danke,
Sparatcus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Puschel74 am 08 Mai 2014, 18:48:46
Hallo,

Zitatkann ggf. jemand erklären, warum fhem so reagiert (siehe meinen letzten Post)?
Vermutlich Zufall oder du schaust nicht ins FHEM-Logfile  ;)
Dort sollte eigentlich eine Fehlermeldung auftauchen - damit ist es auch kein Zufall mehr.

Hier
fhem ("define InitTestLater at +00:02:00 trigger InitTest")\
müsste es doch eigentlich so
fhem ("define InitTestLater at +00:02:00 trigger InitTest");
aussehen.
Sprich - dir fehlt ein Semikolon am Ende der Zeile.

\ gelöscht da ich die fhem.cfg nicht anfasse  ;D

Grüße

Edith: Es kann aber dennoch sein das der/dein Code funktioniert.
Da ich aber nicht so tief in FHEM stecke kann ich dir nicht sagen warum er funktionieren würde.
Mir ist nur aufgefallen das am Ende der Zeile ein ; fehlt.
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 08 Mai 2014, 20:23:29
Hallo,
ich verstehe die Welt nicht mehr!

@ puschel:
wenn ich an dieser Stelle das Semikolon einbaue, dann kommt der Fehler im Log
wenn ich das Semikolon weglasse, wird InitTest mit 2min Verzögerung ausgeführt.

also irgendwas ist doch komisch!
hier mal der post aus de DEF Bereich:

funzt:
Sonos_Terrasse:presence:.appeared
{
if (Value("fhemInit") == 1)
{
  fhem ("define InitTestLater at +00:02:00 trigger InitTest")
}
}


funzt nicht:
Sonos_Terrasse:presence:.appeared
{
if (Value("fhemInit") == 1)
{
  fhem ("define InitTestLater at +00:02:00 trigger InitTest");
}
}


Spartacus.
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: P.A.Trick am 08 Mai 2014, 20:29:23
Spartakus du sollst nicht in der fhem.cfg herumfummeln ;-) nimm den Editor dann klappt das auch!
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 08 Mai 2014, 20:40:05
Hi,
das habe ich auch nicht! Ich habe von Anfang an alles brav im DEF Bereich gemacht. Lediglich für den ersten Post habe ich das darauskopiert, daman dort auch das define... mitnehmen kann.

Spartacus

NACHTRAG:
in allen meinen Anweisungen steht nirgends ein Semikolon am Ende der If Anweisung. Und das läuft alles und das habe ich alles im DEF Bereich gemacht.

Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Puschel74 am 08 Mai 2014, 20:56:48
Hallo,

dein Code
Sonos_Terrasse:presence:.appeared
{
if (Value("fhemInit") == 1)
{
  fhem ("define InitTestLater at +00:02:00 trigger InitTest")
}
}

würde bei mir so
Sonos_Terrasse:presence:.appeared {
if (Value("fhemInit") == 1) {
  fhem ("define InitTestLater at +00:02:00 trigger InitTest");
}
}

aussehen.

Ich hab keine Ahnung ob das einen Unterschied macht.

Grüße
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 08 Mai 2014, 21:16:16
Hallo zusammen,
habe puschels Code 1:1 kopiert und das läuft.
habe dann die Klammern in die nächste Zeiile gerückt (so wie bei mir)
Fehler!
2014.05.08 21:05:52 4: Init_Terrasse exec
{
if (Value("fhemInit") == 1)
{
  fhem ("define InitTestLater at +00:02:00 trigger InitTest");
}
}
2014.05.08 21:05:52 5: Cmd: >{
if (Value("fhemInit") == 1)
{
  fhem ("define InitTestLater at +00:02:00 trigger InitTest")<
2014.05.08 21:05:52 5: Cmd: >}
}<
2014.05.08 21:05:52 3: Init_Terrasse return value: Unknown command {
, try help.
Unknown command }
}, try help.

Semikolon wieder gelöscht, Sache läuft...

Schon witzig! 
hätte schon gerne gewusst, warum das so ist, bzw. was hier die richtige Variante ist...
allerdings beantwortet das alles noch nicht meine ursprüngliche Frage weiter oben in Post vom 06 Mai 2014, 20:50:35.

Danke und Gruß,
Spartacus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Puschel74 am 08 Mai 2014, 21:21:15
Hallo,

Zitathabe dann die Klammern in die nächste Zeiile gerückt (so wie bei mir)
Äh blöde Frage aber wozu soll das gut sein?

Wobei ich auf eine Antwort auf deine Frage auch gespannt bin.

Grüße
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 08 Mai 2014, 21:28:19
.....ich finde die geklammerten Blöcke einfach besser lesbar, als die Klammer hinter die Anweisung zu schreiben. Alte Schule! So habe ich das mal gelernt, als ich zur Schule ging...lang, lang ist es her und da gab es noch kein fhem, nur Pascal, Basic und C

if n=0
{
  a=a+b;
  x=x+y;
}
else
{
print "";
}


Spartacus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Puschel74 am 09 Mai 2014, 05:51:32
Moin,

Zitatich finde die geklammerten Blöcke einfach besser lesbar, als die Klammer hinter die Anweisung zu schreiben
Und jetzt kommt die 500.000 Euro Frage.
Sollst du den Code lesen oder FHEM?

Zitatlang, lang ist es her und da gab es noch kein fhem, nur Pascal, Basic und C
Wenn ich heute mal Zeit finde werd ich mal schauen wielange es Perl schon gibt.
FHEM ist in Perl geschrieben  ;)

Aber du hast ja die Auswahlmöglichkeit - so wie immer.
Soll der Code funktionieren oder soll der Code für dich lesbar und "hübsch" ausschauen.
Also mir persönlich ist das komplett egal wo die Klammern hinkommen solange der Code das macht was ich möchte.
Und ja, ich bin auch mit Basic und C aufgewachsen  8)

Man möchte meinen das es User gibt die täglich in der Konfig lesen wie in einer Tageszeitung  8)

Grüße
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 09 Mai 2014, 16:21:12
Zitat von: Puschel74 am 09 Mai 2014, 05:51:32

Man möchte meinen das es User gibt die täglich in der Konfig lesen wie in einer Tageszeitung  8)

Grüße

Hi Puschel,
hast mich falsch verstanden!
Ich finde dies einfach übersichtlicher! (siehe Bild) Unfd ja! Wenn man nach ein paar Monaten mal was ändern muss, dann findet man sich schneller rein.. aber über Geschmack lässt sich bekanntlich streiten...

Bin mal gespannt, ob noch jemand die Kernfrage benantworten kann. Das würde ich schon gerne wissen wollen!

Spartacus
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Puschel74 am 09 Mai 2014, 17:04:25
Hallo,

Zitataber über Geschmack lässt sich bekanntlich streiten...
Wohl wahr, wohl wahr  ;D

Grüße
Titel: Antw:Systemvariable für global:INITIALIZED
Beitrag von: Spartacus am 09 Mai 2014, 17:12:48
...ich glaube ich poste meine ursprüngliche Frage noch mal neu... Auf diesen Thread wird wohl niemand mehr etwas sinnvolles Posten :-)

Gruß,
Spartacus.