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

Dedi75

Hallo Jörg,

wie meinst du das mit
ZitatOben habe ich eine mögliche Strategie skizziert.

Habe ich das was überlesen???

Zitat
Der Code oben jedoch auch nicht perfekt:

wenn ein call kürzer als 60 Sekunden ist und in dieser Zeit bereits der nächste Call kommt, dann steht die LED ja noch auf der 'Callerfarbe'. Die würde jetzt, vom zweiten Call, als Ursprung angenommen werden und anschließend so weiter bestehen bleiben.

Gruß Dedi

herrmannj

Hi,

ja, hier: https://forum.fhem.de/index.php/topic,77960.msg699053.html#msg699053

Das mit dem zweiten notify. Die gesamte Logik verkompliziert sich jedoch massiv. Du musst dann außerhalb der perl routine die alte Farbe sichern. Kannst ja eine perl -Lernprojekt daraus machen.

vg
joerg

Dedi75

Ok alles klar, versuche das mal zu verstehen.

Wenn ich das mit der Telefonnumer versuche zu hinterlegen, bekommt er das mit der Farbe und Rufnummernermittlung nicht hin, er nimmt immer die Standardfarbe.
Folgendes habe ich hinterlegt:

Fritz_Monitor:event:.ring {my $d = 'Wohnzimmer_LED_01'; my %color; $color{'0175xxxxxx'}{'hue'} = 120; $color{'0175xxxxxx'}{'sat'} = 100; $color{'0175xxxxxxx'}{'val'} = 100; my $caller = ReadingsVal('Fritz_Monitor', 'external_number', ""); my $hue = 0; my $sat = 100; my $val = 100; if (exists($color{$caller})) { $hue = $color{$caller}{'hue'}; $hue = $color{$caller}{'val'}; $sat = $color{$caller}{'sat'};} my $t = 20; my $h = ReadingsVal($d, 'hue' ,0); my $s = ReadingsVal($d, 'saturation' ,0); my $v = ReadingsVal($d, 'brightness' ,0); fhem "set $d HSV $hue,$sat,$val $t; set $d HSV $h,$s,$v 0 q";}


Ich vermute, dass das ReadingsVal('Fritz_Monitor', 'external_number', ''); falsch ist. Aber wie muss ich das hinterlegen?

Hier noch das Log vom Fritz_Monitor

2017-10-15_22:42:27 Fritz_Monitor external_number: 0175xxxxx

herrmannj

Scheinbar ok..

Das hier $hue = $color{$caller}{'val'} muss so $val = $color{$caller}{'val'}

Du kannst sonst nach dem ReadingsVal ein Log3(undef, 1, "TEST: $caller"); einbauen. Dann schreibt er den ausgelesenen caller ins log und man sieht ob es klemmt.

Die queue ist jetzt so das sich die Farbe sanft auf den caller ändert, also über 20 Sekunden. Das soll vmtl nicht so (?)

Dedi75

Hi,
Zitat
Das hier
Code: [Auswählen]
$hue = $color{$caller}{'val'}
muss so
Code: [Auswählen]
$val = $color{$caller}{'val'}
Ok das ändere ich dann gleich noch und probiere das dann morgen mal aus.

Zitat
Die queue ist jetzt so das sich die Farbe sanft auf den caller ändert, also über 20 Sekunden. Das soll vmtl nicht so (?)
Ne eigentlich soll die Farbe ja direkt an und dann 20 Sekunden so bleiben. Das hatte aber mit dem anderen Code nicht geklappt, da schau ich dann morgen mal ins Log was er da genau schaltet. Die Led ging dann gar nicht an, da er die Queue direkt wieder überschrieben hat.


Dedi75

Hab mir das gerade noch einmal angeschaut:
Zitatfhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q";

Kann es sein, dass das zweite Set nicht als Queue gestartet werden muss?

  fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t; set $d HSV $h,$s,$v 0 q";

Oder habe ich das jetzt falsch verstanden mit der Queue?
Kann es leider erst wieder heute Abend testen.

Gruß Dedi

Dedi75

Ok - habe das nun mal so hinterlegt funktioniert nicht:
2017.10.16 09:32:57 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 09:32:58 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags:
2017.10.16 09:32:58 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q


Anschließend noch einmal auf deinen Code geändert und nun geht das Licht aus. War gestern nicht so - ich teste das heute Abend noch mal genau.
2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q

herrmannj

yepp, so soll es. Das 'q' bedeutet 'mach wenn Du mit dem anderen fertig bist'.

2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
schalte auf 'rot'. Weil kein 'q': vergiss alles was ich Dir gesagt hab, mach gleich.
2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
danach (in 20 Sekunden), schalte auf 'rot'. defacto: bleib 20 Sekunden auf 'rot' (nop)
2017.10.16 09:36:56 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q
danach (in 0 Sekunden) auf 'das alte', also 'harter' Übergang.

Dedi75

Ok - ich glaube so langsam komme ich ein wenig dahinter.

2 Sachen verstehe ich aber noch nicht so ganz:

1. my %color; - Warum wird hier ein % Zeichen verwendet. Ist das als übergeordnete Gruppe zu sehen? Verstehe nicht ganz, warum dann nachher beim if (exists($color{$caller})) { sich nicht auf %color beziehen muss!.

2. Das mit dem
Zitatnach dem ReadingsVal ein Log3(undef, 1, "TEST: $caller"); einbauen
verstehe ich irgendwie auch noch nicht so ganz, wo und wie genau ich das platzieren soll!
Bekomme dann immer nur Perl Warnungen.

Aktuell ist mein DEF nun so:

FritzBox_Monitor:event:.ring {my $d = 'Wohnzimmer_LED_01'; my %color; $color{'0175xxxxxx'}{'hue'} = 120; $color{'0175xxxxxxx'}{'sat'} = 100; $color{'0175xxxxxx'}{'val'} = 100; my $caller = ReadingsVal('Fritzbox_Monitor', 'external_number', ''); my $hue = 0; my $sat = 100; my $val = 100; if (exists($color{$caller})) { $hue = $color{$caller}{'hue'}; $val = $color{$caller}{'val'}; $sat = $color{$caller}{'sat'};} my $t = 20; my $h = ReadingsVal($d, 'hue' ,0); my $s = ReadingsVal($d, 'saturation' ,0); my $v = ReadingsVal($d, 'brightness' ,0); fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q";}


Zu dem "undef" konnte ich im WEB leider auch nicht irgendwie die richtigen Infos finden.

herrmannj

Zitat von: Dedi75 am 16 Oktober 2017, 10:16:15
Ok - ich glaube so langsam komme ich ein wenig dahinter.

2 Sachen verstehe ich aber noch nicht so ganz:

1. my %color; - Warum wird hier ein % Zeichen verwendet. Ist das als übergeordnete Gruppe zu sehen? Verstehe nicht ganz, warum dann nachher beim if (exists($color{$caller})) { sich nicht auf %color beziehen muss!.

Das ist ein hash. Eine (perl) Datenstruktur die zu einem Key (caller) einen Wert (Farbe) speichert:
https://perlmaven.com/perl-hashes

Zitat
2. Das mit dem   verstehe ich irgendwie auch noch nicht so ganz, wo und wie genau ich das platzieren soll!
Bekomme dann immer nur Perl Warnungen.

Aktuell ist mein DEF nun so:

FritzBox_Monitor:event:.ring {my $d = 'Wohnzimmer_LED_01'; my %color; $color{'0175xxxxxx'}{'hue'} = 120; $color{'0175xxxxxxx'}{'sat'} = 100; $color{'0175xxxxxx'}{'val'} = 100; my $caller = ReadingsVal('Fritzbox_Monitor', 'external_number', ''); my $hue = 0; my $sat = 100; my $val = 100; if (exists($color{$caller})) { $hue = $color{$caller}{'hue'}; $val = $color{$caller}{'val'}; $sat = $color{$caller}{'sat'};} my $t = 20; my $h = ReadingsVal($d, 'hue' ,0); my $s = ReadingsVal($d, 'saturation' ,0); my $v = ReadingsVal($d, 'brightness' ,0); fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q";}


Zu dem "undef" konnte ich im WEB leider auch nicht irgendwie die richtigen Infos finden.
Einfach in das notify so einfügen wie die anderen Befehle auch. Nach dem ReadingsVal, wollen ja sehen was das gab. 'undef' bedeutet undefiniert - hier ein Teil den der Befehl zum Loggen so (*) einfach braucht.

* da könnte auch der Name eines device stehen. Hier nicht notwendig.

Dedi75

Ja das mit dem Hash habe ich nun glaube ich verstanden - hier werden also Key/Wert Paare gespeichert:

my %color; #HASH
$color{'0175xxxxxx'}{'hue'} = 120; #KEY/Wert-Paar-1 $color{'0175xxxxxx'} KEY/Wert-Paar-2 {'hue'} = 120


Mit dem Log3 habe ich noch nicht wirklich verstanden, scheint aber zu funktionieren.
Allerdings wird mir die Rufnummer nicht angezeigt. Also scheint irgendetwas nicht zu funktionieren:
global Logfile:

2017.10.16 13:59:05 1: TEST:
2017.10.16 13:59:05 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 13:59:06 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 13:59:06 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q


DEF Notify:

FritzBox_Monitor:event:.ring {my $d = 'Wohnzimmer_LED_01'; my %color; $color{'0175xxxxxx'}{'hue'} = 120; $color{'0175xxxxxx'}{'sat'} = 100; $color{'0175xxxxxx'}{'val'} = 100; my $caller = ReadingsVal('Fritzbox_Monitor', 'external_number', ''); Log3(undef, 1, "TEST: $caller"); my $hue = 0; my $sat = 100; my $val = 100; if (exists($color{$caller})) { $hue = $color{$caller}{'hue'}; $val = $color{$caller}{'val'}; $sat = $color{$caller}{'sat'};} my $t = 20; my $h = ReadingsVal($d, 'hue' ,0); my $s = ReadingsVal($d, 'saturation' ,0); my $v = ReadingsVal($d, 'brightness' ,0); fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q";}


Reading "FritzBox_Monitor":

external_number - 0175xxxxxx - 2017-10-16 13:59:08


Gruß Dedi

Dedi75

Ich sehe gerade, dass das Reading von der FritzBox erst gesetzt wird, wenn der Test schon durchgelaufen ist. Spielt für den Test keine Rolle aber nimmt er dann in Zukunft vielleicht noch das vorherige Reading?

2017.10.16 13:59:05 1: TEST:

2017-10-16 13:59:08 - external_number - 0175xxxxxx

herrmannj

Ok. Das galt es rauszufinden. Poste mal das eventlog während eines Anruf. Was steht in dem Reading wenn der Anruf vorbei ist ?

Dedi75


2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 hue: 0
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 saturation: 100
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 brightness: 100
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 RGB: FF0000
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 on
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 HSV 0,100,100 20 q
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 HSV 217,100,0 0 q
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor event: ring
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor external_number: 0175xxxxxx
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor external_connection: SIP0
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor external_name: xxxxxx
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor direction: incoming
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor call_id: 0
2017-10-16 14:24:53 FB_CALLMONITOR FritzBox_Monitor internal_number: xxxxxx
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 hue: 0
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 saturation: 100
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 brightness: 100
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 RGB: FF0000
2017-10-16 14:24:53 WifiLight Wohnzimmer_LED_01 on
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor event: disconnect
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor missed_call: 0175xxxxxxx (xxxxxx)
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor call_id: 0
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor internal_number: xxxxxx
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor external_name: xxxxxx
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor direction: incoming
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor external_number: 0175xxxxxx
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor external_connection: SIP0
2017-10-16 14:24:55 FB_CALLMONITOR FritzBox_Monitor call_duration: 0

herrmannj