Bei Anruf LED Lichtband auf bestimmte Farbe einstellen und anschließend zurück

Begonnen von Dedi75, 13 Oktober 2017, 16:29:36

Vorheriges Thema - Nächstes Thema

herrmannj

Danke.

Der TE möchte jedoch das sich eine Lampe je nach Anrufer farblich verändert und danach wieder zurück. Der Teil den Du mit dem DOIF löst (Anruf Signal) funktioniert bereits.

eisman

ist ja fast das selbe,
z.B.

([Anrufmonitor:event] ne "disconnect" and [Anrufmonitor:external_number] eq "012345678")
      (set $SELF farbe [lampe:farbe],set lampe farbe)
  oder
([Anrufmonitor:event] ne "disconnect" and [Anrufmonitor:external_name] eq "abc def") 
      (set $SELF farbe [lampe:farbe],set lampe farbe)

([Anrufmonitor:event] eq"disconnect") (set lampe [$SELF:farbe])

also hab es bei mir getestet und es geht "auch in farbe"

FG


1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Dedi75

Hallo Jörg,

Print gibt die Nummer aus:


0175xxxxxx2017.10.16 18:06:26 1: TEST:
2017.10.16 18:06:26 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 18:06:27 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 18:06:27 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q

herrmannj

Dann setz doch anstelle des Print mal $call= ein. Das im log hast du auf call geändert?

Dedi75

Super - Dankeschön

Jetzt habe ich das auf $call geändert und es funktioniert.

2017.10.16 19:21:52 1: TEST:0175xxxxxx


Die Farbe wird jetzt auch entsprechend angezeigt.
Jetzt mal mehrere hinterlegen und ausprobieren.

Warum ging es denn nicht mit $caller??? Das verstehe ich iwie nicht.

Dedi75

Zusätzlich stellt sich mir immer noch die Frage bezgl. der Anführungszeichen.

Folgendes dazu habe ich mal gefunden:
Zitatmy $var = 5;
my $text = "Variable enthält: $var";
my $text2 = 'Variable enthält: $var';
print $text;
print "\n";
print $text2;
print "\n";
erzeugt folgende Ausgabe:
Variable enthält: 5
Variable enthält: $var
Was ist passiert? Bei der Zuweisung an $text, bei der wir doppelte Anführungszeichen benutzt haben, sucht der Interpreter in der zugewiesenen Zeichenketten nach Vorkommen von $Variablenname, und ersetzt diese durch den Inhalt der jeweiligen Variable – in unserem Fall also durch den Inhalt von $var. Dies nennt man Interpolation. Eine solche Interpolation wird jedoch bei einfachen Anführungszeichen nicht vorgenommen.

Warum hattest du nun alle mit einem 1fachen Anführungszeichen gemacht?
Ich hab nun mal überall doppelte Anführungszeichen hinterlegt - das funktioniert auch  :o

Gruß Dedi

herrmannj

Ja korrekt. Gut das du dich damit beschäftigt.

Doppelte Anführungszeichen sorgen dafür das der Compiler "interpoliert". Das bedeutet dass variablen durch ihren Inhalt ersetzen werden. Das ist der Grund warum ich einfache Anführungszeichen verwende, wo möglich. Das ist weniger Arbeit für Perl. ;)

Dedi75

Ok - Klasse - Danke für die Info.
Ja natürlich, versuche das ganze ja auch ein wenig zu verstehen. Wobei mit $call und $caller steh ich noch auf dem Schlauch - wieso ist das so?
Dann werde ich mal immer versuchen nur mit 1fachen Anführungszeichen zu arbeiten - wenn es denn geht.

Habe nun noch das Reading auf den Namen geändert, denn es ist ja egal ob derjenige vom Handy, Festnetz oder Arbeit usw. anruft. Dann brauch ich weniger reinschreiben.
Das funktioniert schon mal echt genial - Vielen lieben Dank für deine Hilfe ;-)

Nun habe ich nur noch das Problem, dass die Farbe evtl. bestehen bleibt wenn innerhalb der 20 Sek. jemand anruft. Dann würde die LED ja wieder auf die Farbe vom vorherigen Anrufer bleiben und nicht ausgehen oder auf die zuvor gewählte Farbe.

Gruß Dedi

herrmannj

es gibt einen perl Befehl "caller", der sollte sich jedoch nicht mit einer variable in die Quere kommen. Vmtl war es ein unsichtbarer Syntaxfehler. Bei den Klammern kann einiges schief gehen, wenn man doppelt und einfach mischt. Eventuell.

Das mit dem zweiten call würde ich ignorieren, kommt doch sicher nur alle Jubeljahre mal vor. Das einzubauen sind noch mal zwei Tage Arbeit :)

Wenn Du aber selber weiter machen möchtest: ich würde dann auf external_number triggern. Das dürfte zu Begin und zu Ende des calls auslösen und Du kommst mit einem notify aus.

Am Anfang des codes würde ich dann den status des calls per ReadingsVal abfragen. "ring" bedeutet er kommt rein, "disconnect" er ist zu Ende. Das Problem ist dann das Du die alte Farbe über die Grenzen des notify retten musst. Mit "my" deklarierte Variablen verfallen sobald das notify durch ist.

Es gibt in fhem aber einen hash %data. In den kannst Du das bei "ring" reinschreiben ( zb $data{'rette_farbe_von_led1'}{'hue'} = $hue ) und bei "disconnect" rausholen. Allerdings muss die Logik noch erweitert werden. Im "unter 20 Sekunden" Fall soll ja nichts gespeichert werden. Das könnte man zb machen indem man im hash auch den Zeitpunkt des letzten auslösens speichert. Oder einen Status ( zb $data{'rette_farbe_von_led1'}{'inSignal'} = 'true' # oder 'false' )

vg
joerg

Dedi75

Ok - vielen Dank für deine Hilfe.

Ich werde es dann erst einmal auf nur 10 sek. stellen, dann sollte da erstmal hoffentlich nichts passieren.
Wäre es sonst noch ne Möglichkeit, dass man einfach iwie nen Timer einbaut, dass das Notify für die 10 Sek. nichts weiter macht? Dann würde der nächste Anruf zwar nicht farblich dargestellt werden, aber vermutlich hat man bis dahin sowieso das Telefon in der Hand ;-)
Das würde zumindest vermeiden, dass wenn man nicht zuhause ist und jemand 2 mal innerhalb der Zeit anruft, dass dann nicht das LED-Band die ganze Zeit leuchtet.
Und ich hätte erst einmal eine vernünftige Lösung und könnte das mit dem hash %data in Ruhe angehen.

Gruß Dedi


herrmannj

geht, ist aber eher umständlich und später schwer zu warten.

Könnte ein "Trick/Hack" helfen ? Wenn Du zb im Fall eines Anrufs die Helligkeit nicht auf 100% sondern zb auf 99% setzt. Im Normalbetrieb hast Du das ja vmtl nicht. Dann kannst Du am Anfang eine Abfrage einbauen und wenn die Helligkeit gerade 99 ist das notify sofort verlassen.
return undef if (ReadingsVal($d, 'brightness', 0) == 99);

herrmannj

wobei mir gerade einfällt das es schon mit disabledForIntervals geht. Das ist ein attr des notify. Dann musst Dur die Zeiten berechnen und wenn Du die Farbe setzt, gleichzeitig / direkt davor / danach ein fhem("attr _motifyname_ disabledForIntervals 10:44:12-10:44:22"); absetzten. Die Zeiten wirst Du durch Variable ersetzen, aber Du musst Start und Stop berechnen.

Zeiten zb so {strftime "%H:%M:%S", localtime  time+10;}

Das könnte so
my $start = strftime ("%H:%M:%S", localtime);
my $stop = strftime ("%H:%M:%S", localtime + 10);

* ungetestet. Kannst aber direkt in der fhem cmd line damit "spielen" und das dann in den code nehmen. Wenn es tut was es soll.

Aber ehrlich gesagt würde ich das, wenn gleich richtig machen und den %data hash sowie "external_number" benutzen. Hash hatten wir ja schon.

Dir ist bekannt das Du in der Detailansicht des notidy auf "def" drücken kannst und dort ein editor Fenster bekommst ?

Dedi75

Ok - das wäre doch perfekt.
Oh je - ich versuche dann mal mein Glück in einer ruhigen Minute das umzusetzen.
Mal so grob -
ich versuche die Zeiten wie z.B. das mit der external_number zu ermitteln
ZitatZeiten zb so {strftime "%H:%M:%S", localtime  time+10;}

Dieses würde ich z.B. so einbauen:

my $aktZeit = (strftime("%H:%M:%S",localtime))
my $WarteZeit = (strftime("%H:%M:%S",localtime time +10;))


und erweitere dann den FHEM Befehl (aktuell: fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q"
mit diesem:
"attr Notifyname disabledForIntervals $aktZeit-$WarteZeit"

Besten Dank

herrmannj

ich habe den post darüber nochmal ergänzt / hat sich jetzt mit Deinem überschnitten

Dedi75

ZitatDir ist bekannt das Du in der Detailansicht des notidy auf "def" drücken kannst und dort ein editor Fenster bekommst ?
Ja darüber habe ich bislang alle Änderungen gemacht.
Ich kopier mir das immer in Notepad, mache da dann die Änderungen und kopiere das dann da rein und klick auf Modiy ;-)

Den Befehl für die Zeit konnte ich schon mal erfolgreich absetzen.
Folgendes funktioniert über die FHEM CMD Line:
{strftime "%H:%M:%S", localtime(time+10)}
{strftime "%H:%M:%S", localtime(time)}

Dann hinterlege ich das erstmal so und schaue mir das mit den %data hash sowie "external_number" benutzen. Hash hatten wir ja schon. mal genauer an.