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
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.
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"
Hallo,
Du könntest es einmal so versuchen:
{fhem("set Deckenlicht ".$var)}
Gruß
Hans
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.
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
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.
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
Also bleibt nur setreading, nur leider hab ich keinen Plan wie ich das umsetzen kann. Hast du nen Bsp?
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 ?
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
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
$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
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
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