FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: grobby am 15 November 2015, 10:42:27

Titel: notify mit Variable
Beitrag von: grobby am 15 November 2015, 10:42:27
Hallo,

als Anfänger habe ich mich nun auch mal mit Variablen beschäftigt und versuche mich grad an dieser Zeile.

Bewegungsmelder:.* { my $var = Value("Deckenlicht") ;; if (Value("Bewegungsmelder") eq "An") {fhem("set Deckenlicht dim50%")} else {fhem ("set Deckenlicht $var")} }

Es soll durch den PIR ausgelöst werden und ein Deckenlicht auf 50% gedimmt werden, egal ob das Licht vorher an, aus oder bei 80% gedimmt war, soll der ürsprüngliche Wert des Deckenlichts wiederhergestellt werden wenn der PIR wieder auf Aus geht.
Was es bisher macht sind die 50%, jedoch bleibt das Licht bei 50% wenn der PIR abschaltet. Was mache ich Variablenmäßig falsch? Wenn ich statt $var ein off setze geht auch das Licht aus.

Grüße Grobby
Titel: Antw:notify mit Variable
Beitrag von: frank am 15 November 2015, 11:02:38
Zitatsoll der ürsprüngliche Wert des Deckenlichts wiederhergestellt werden wenn der PIR wieder auf Aus geht.
kann dein pir das überhaupt? viele (alle?) senden nur ein event bei bewegung, aber nicht bei keine bewegung.

schau mal im eventmonitor und poste alle events vom pir.
Titel: Antw:notify mit Variable
Beitrag von: grobby am 15 November 2015, 11:46:43
Also der PIR sendet ein An und bei Nichtbewegung ein Aus.

{Value("Bewegungsmelder")} sagt wenn der PIR keine Bewegung registriert "Aus" und bei Bewegung "An"
Titel: Antw:notify mit Variable
Beitrag von: Hans Franz am 15 November 2015, 11:54:13
Hallo,
Du könntest es einmal so versuchen:
{fhem("set Deckenlicht ".$var)}
Gruß
Hans
Titel: Antw:notify mit Variable
Beitrag von: grobby am 15 November 2015, 12:02:53
ZitatDu könntest es einmal so versuchen:

{fhem("set Deckenlicht ".$var)}

Leider funktioniert das auch nicht. Wie gesagt wenn ich {fhem("set Deckenlicht off)} dann klappt das notify auch. Ich will ja aber den zwischengespeicherten Wert aus $var im else zurückhaben.
Titel: Antw:notify mit Variable
Beitrag von: justme1968 am 15 November 2015, 12:13:59
du kannst so nicht den wert von einem notify zum nächsten retten. $var ist nur temporär und nur innerhalb eines notify aufrufs gültig.

wenn du denn wert zwischen notify aufrufen sichern willst kannst du z.b. setreading verwenden und den alten wert in einem reading zwischenspeichern.

gruss
  andre
Titel: Antw:notify mit Variable
Beitrag von: grobby am 15 November 2015, 12:20:41
Hallo Andre,

ich will ja $var auch nicht zu einem anderen Notify retten, sondern nur innerhalb, siehe erster Post. Warum geht das nicht? Sieht ja nun wirklich nicht kompliziert aus.
Titel: Antw:notify mit Variable
Beitrag von: justme1968 am 15 November 2015, 12:49:30
ich meine auch nicht ein anderes notify sonder den nächsten aufruf des gleichen notify. die variable gilt immer nur für einen einzigen aufruf.

gruss
  andre
Titel: Antw:notify mit Variable
Beitrag von: grobby am 15 November 2015, 13:11:10
Also bleibt nur setreading, nur leider hab ich keinen Plan wie ich das umsetzen kann. Hast du nen Bsp?

Grobby
Titel: Antw:notify mit Variable
Beitrag von: grobby am 15 November 2015, 19:47:08
Hab nochmal bissl gelesen und zum Zwischenspeichern wäre ein Dummy gut in dem ich den aktuellen Dimmerwert in die Readings schiebe.
Aber wie geht das?

ein setreading speicherDummy Deckenlicht state schreibt zwar state ins Readings Deckenlicht, aber damit kann man nix anfangen. Wie schreibe ich da den aktuellen Wert von Deckenlicht hin? komme so nicht weiter.

Warum zB ist my $var = () nur lokal? Wie kann man es zu einer globalen Variable machen ?
Titel: Antw:notify mit Variable
Beitrag von: justme1968 am 15 November 2015, 20:03:08
du brauchst keinen dummy. du kannst mit setreading auch in dein lampen device schreiben.
globale variablen sind fast immer unnötig und nicht sinnvoll.

das ganze könnte etwa so aussehen:
Bewegungsmelder:.* { my $current = Value("Deckenlicht");
  my $saved = ReadingsVal("Deckenlicht", "saved", undef );

  if( $EVENT eq "An" ) {
    fhem("setreading Deckenlicht saved $current") if( !$saved );
    fhem("set Deckenlicht dim50%")
  } else {
    fhem ("set Deckenlicht $saved; deletereading Deckenlicht saved") if( $saved );
  }
}


im DEF bereich eingeben.

gruss
  andre
Titel: Antw:notify mit Variable
Beitrag von: grobby am 16 November 2015, 16:17:50
Hallo Andre,

danke für deine Hilfe einem Anfänger auf die Sprünge zu helfen, der Code funktioniert out of the Box. Das macht eben einen guten Programmierer aus.
Nun werd ich den Code erstmal verstehn lernen. zb.

my $saved = ReadingsVal("Deckenlicht", "saved", undef );

Wie  kommst du auf "saved"? Das steht doch nirgendwo in den Readings von Deckenlicht.
Und was macht
if( !$saved );
if( $saved )

Wenn ich das weglasse funktioniert der Code ebenfalls.

Grüße Grobby
Titel: Antw:notify mit Variable
Beitrag von: Icinger am 16 November 2015, 16:29:38
$saved ist einfach nur der Name der temporären Variable. Genausogut könntest du
my $irgendwaswasmirgradeeingefallenist = ReadingsVal("Deckenlicht", "saved", undef );
schreiben.

Durch das "if( !$saved );" wird der setreading Deckenlicht nur dann ausgeführt, wenn in $saved nichts drinnensteht.
Auf gut Deutsch: "Setze Reading 'saved' im Device 'Deckenlicht' auf den Wert 'current', aber nur, wenn die Variable $saved NICHTS beinhaltet"

Selbiges gilt gegenteilig für "if ($saved)". Das wird dann nur ausgeführt, wenn in $saved auch was drinnen ist.

Das sind einfach zusätzliche Sicherheitsvorkehrungen, damit ja nix schiefgehn kann.

lg, Stefan
Titel: Antw:notify mit Variable
Beitrag von: grobby am 16 November 2015, 16:57:19
Okay das war verständlich erklärt. Viele Dank. Man möchte ja auch verstehn was man tut um es später mal selbst umzusetzen auch wenn einem die Hardware lieber ist.
Aber ohne Software nützt einem die Hardware eben nix.

Grüße Grobby
Titel: Antw:notify mit Variable
Beitrag von: justme1968 am 16 November 2015, 17:15:14
noch eine anmerkung: das if( !$saved ) ist wichtig weil du dir sonst bei zwei aufeinanderfolgenden motion nachrichten den gesicherten wert überschreibst. ob das auftreten kann hängt vom bewegungsmelder ab.

gruss
  andre