Hauptmenü

notify mit Variable

Begonnen von grobby, 15 November 2015, 10:42:27

Vorheriges Thema - Nächstes Thema

grobby

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

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

grobby

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"

Hans Franz

Hallo,
Du könntest es einmal so versuchen:
{fhem("set Deckenlicht ".$var)}
Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

grobby

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.

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

grobby

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.

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

grobby

Also bleibt nur setreading, nur leider hab ich keinen Plan wie ich das umsetzen kann. Hast du nen Bsp?

Grobby

grobby

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 ?

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

grobby

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

Icinger

$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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

grobby

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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968