Hallo zusammen,
ich habe meine Fritzbox in FHEM eingebunden und nutze bereits den FB_Callmonitor um mir eine Übersicht der Anrufe anzeigen zu lassen (Name FritzBox_Monitor).
Nun möchte ich gerne, dass wenn mich jemand bestimmtes anruft, das LED Lichtband (Name: Wohn_LED01 - Gerät: LD382A - WifiLight) auf eine bestimmte Farbe (je nach Anrufer) wechselt und anschließend (z.B. nach gewisser Zeit oder auflegen) auf den Standardwert zurückgeht.
Habe schon mal ein Notify erstellt, welches das LED Lichtband generell anschaltet. Das funktioniert soweit, allerdings hab ich keine Farbe pro Name und es bleibt ja dann grundsätzlich an.
Wie kann ich das am elegantesten lösen, habe mal gelesen, dass man so etwas evtl. auch mit Scenen steuern kann um sich so den aktuellen Wert zu speichern.? Mit Perl Code fällt es mir doch noch recht schwer :o
Vielleicht hat ja jemand Lust mir unter die Arme zu greifen und mir den Code zu erstellen.
Folgendes habe ich in einem Artikel gefunden, bin mir allerdings nicht ganz sicher, wie ich das auf meinem Fall umwandeln soll und ob es nicht noch andere Wege gibt:
Dummy erstellen:
define RGBbackup dummy
Telefon an:
CallMonitor:event:.ring {
my $name=(ReadingsVal("CallMonitor","external_name",0));;
my $status=(ReadingsVal("WZ_Papierlampe","state",0));;
my $HL_helligkeit=(ReadingsVal("WZ_Haengelampe","brightness",0));;
my $HL_farbe=(ReadingsVal("WZ_Haengelampe","rgb",0));;
my $LL_helligkeit=(ReadingsVal("LEDLeiste","brightness",0));;
my $LL_farbe=(ReadingsVal("LEDLeiste","RGB",0));;
fhem("setreading RGBbackup HL_farbe $HL_farbe");;
fhem("setreading RGBbackup HL_helligkeit $HL_helligkeit");;
fhem("setreading RGBbackup LL_farbe $LL_farbe");;
fhem("setreading RGBbackup LL_helligkeit $LL_helligkeit");;
if($status eq "on"){
if($name eq "XXXXXX") {fhem ("set WZ_Haengelampe rgb FF0000;set LEDLeiste RGB FF0000")};;
if($name eq "K... S...") {fhem ("set WZ_Haengelampe rgb 0000FF;set LEDLeiste RGB 0000FF")};;
if($name eq "B... F...") {fhem ("set WZ_Haengelampe rgb 00FF00;set LEDLeiste RGB 00FF00")};;
fhem("set WZ_Haengelampe brightness 100")}}
Telefon aus:
CallMonitor:event:.disconnect {
my $HL_farbe=(ReadingsVal("RGBbackup","HL_farbe",0));;
my $HL_helligkeit=(ReadingsVal("RGBbackup","HL_helligkeit",0));;
my $LL_farbe=(ReadingsVal("RGBbackup","LL_farbe",0));;
my $LL_helligkeit=(ReadingsVal("RGBbackup","LL_helligkeit",0));;
if($HL_helligkeit > 0){fhem ("set WZ_Haengelampe rgb $HL_farbe;set WZ_Haengelampe brightness $HL_helligkeit")} else {fhem ("set WZ_Haengelampe off")};;
if($LL_helligkeit > 0){fhem ("set LEDLeiste RGB $LL_farbe;set LEDLeiste brightness $LL_helligkeit")} else {fhem ("set LEDLeiste off")}}
Gruß Dedi
Hallo Dedi,
hier mal ein Link für LightScene:
https://waschto.eu/lightscene-erstellen-von-lichtszenen/
diese dann mit der Wunschnummer z.b. deine Handy Nummer zum testen abspeichen. Dann kannst du in der Fritzbox Callist unten readings erkennen mit den Telefonnumern. Darauf denke ich, kannst du ein DOIF Triggern was die LightScene schaltet. Mit dem zurüchschalten müßte ich selber mal schauen wie man das macht. Den fertigen Code wird dir wohl keiner Schreiben. Man lernt nur wenn man selber Probiert Wenn es dann klemmt wird auf jedenfall geholfen.
Schau mal in der Commandref unter DOIF da sind viele Beispiele die man für sich umbauen kann. Starte mal mit der Lichtscene, und als Namen deine Handynummer. Starte mal den Eventmonitor und rufe mal mit deinem Handy Zuhause an, und schaue ob im Eventmonitor etwas passiert. Mit der LightScene passiert noch nix. das kommt anschließend.
Also einfach mal machen.
Gruß Rolf
der code oben ist unnötig kompliziert.
ein notify welches auf das ring reagier hast Du bereits. Du kannst am einfachsten die Queue von WifiLight nutzen um nach 60 Sekunden auf die Ursprungsfarbe zurück zu springen.
Ungetestet, in etwa so
{
# devicename
my $d = 'WZ_Haengelampe';
# Farbe während des Klingeln
my $hue = 0;
my $sat = 100;
my $val = 100;
# Zeit in sec für das Signal
my $t = 60;
# alte Werte
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";
}
Wie Du die Farbe pro Anrufer bekommst kann ich Dir nicht aufzeigen weil ich das Fritzbox modul nicht verwende.
Die Vorgehensweise besteht darin an den Namen oder die Nummer zu kommen. WennDa es ein Reading dazu gibt kannst Du es auslesen (ReadingsVal) und zu Beginn des scriptes einen Hash hinterlegen um bekannten Nummern Farben zu zuordnen.
{
# devicename
my $d = 'WZ_Haengelampe';
# Anrufer Farbcodes
my %color;
$color{'0177123456'}{'hue'} = 120;
$color{'0177123456'}{'sat'} = 100;
$color{'0177123456'}{'val'} = 100;
# weitere Nummern nach dem gleichen Schema anfügen ...
# die Nummer des Anrufers auslesen (Fritzbox)
my $caller = ReadingsVal('Fritzbox', '1-number', '');
# default falls es keinen Eintrag gibt
my $hue = 0;
my $sat = 100;
my $val = 100;
# test ob es für den einen Anrufer einen Eintrag gibt
if (exists($color{$caller})) {
$hue = $color{$caller}{'hue'};
$hue = $color{$caller}{'val'};
$sat = $color{$caller}{'sat'};
}
# Zeit in sec für das Signal
my $t = 60;
# alte Werte
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";
}
hint:
- Code den Du über das Webif eingibst brauchst Du nicht zu escapen.
- perl beißt nicht! Taste Dich ran. Es ist eine einfache Sprache und es existieren unzählige Tutorials. Viel mehr als zu dummy und co ;)
vg
joerg
Hallo,
das reading für ein Notify würde so aussehen:
FritzBox_Monitor:1-number:.0177123456 set Wz.Stehlampe on
Das habe ich mal eben mit Notify probiert und ging. Interessante Spielerei.
In der Calllist ist aber keine Änderung zu erkennen wenn aufgelegt wird. Habe zumindest nix gesehen.
Gruß Rolf
Danke! code oben angepasst.
ZitatIn der Calllist ist aber keine Änderung zu erkennen wenn aufgelegt wird. Habe zumindest nix gesehen.
Daher würde ich eine feste Zeit für das Signal im Script hinterlegen.
Wollte man auf den disconnect reagieren (wenn es ein event dazu gäbe), dann müsste man 2 notify verwenden. Eines zum speichern der Farbe und setzen der 'Callerfarbe', eines zum Herstellen des Ursprungs. Die alte Farbe würde ich in diesem Fall jedoch direkt im fhem eigenen %data hash speichern. Einen dummy dafür zu erstellen ist schlicht weg Unsinn.
Allerdings wird die Logik dann komplizierter und anfälliger. Wenn die Lampe zum Beispiel während eines Calls von anderer Stelle verändert wird, zum Beispiel weil jemand das Licht ganz normal am Schalter ausschaltet, dann würde das zweite notify trotzdem wieder auf die alte Farbe springen.
Im der Variante mit der fest hinterlegten Zeit passiert genau dies nicht da die Queue durch einen "normalen" Schaltbefehl gelöscht wird.
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.
Ich glaube ich habe da was falsches geschrieben. Ich habe zusätlich noch eine Calllist. Der Themenstarter aber wohl nur den Callmonitor. Hier mal die Readings vom Callmonitor:
call_duration 246
call_id 0
direction outgoing
event disconnect
external_connection SIP3
external_name Handy Rolf
external_number 0177123456
internal_connection FON1
internal_number 123456
missed_call 0177123456
state opened
Da gibt es auch ein Event disconnect. Jetzt müsste sich der Themenstarter aber vielleicht noch mal äußern. Ich würde dafür eine extra Lampe nehmen. Für Schwiegermutter rot und blinkend.
Gruß Rolf
Halllo,
danke euch beiden schon mal für eure Hilfe.
Sorry genau nen FB_Callist habe ich natürlich auch und es wäre nicht schlecht wenn z.b. die Farbe bei bekannten Anrufern halt z.b. rot, grün oder blau usw. Ist und bei allen nicht angegebenen einfach z.b. lila.
Das mit der zeitlichen Dauer wäre auch super, weil die Led soll ja nicht ne Stunde in der Farbe leuchten wenn meine Frau mal wieder Dauer Telefonate führt ;-). 10 - 20 Sekunden würden völlig ausreichen.
Nur das man eben erkennt wer denn gerade anruft und ob man unbedingt rangehen muss oder nicht. Haben z.b. ne Zeit abends wo wir nur mit den Kindern beschäftigt sind. Wenn man dann gleich sieht dass nen Kumpel oder die Schwiegermutter anruft, kann man auch mal nicht dran gehen und später zurück rufen.
Ja klar will ich auch lernen und habe auch schon einiges angebunden und merke, dass man immer mehr dazu lernt. Das muss man aber bei Fhem auch wirklich und einiges ist echt noch schwer durchsichtig. Wobei ich stets Versuche mich auf einen einigermaßen guten Weg zu halten. Wobei das immer schwer zu erkennen ist. Bei der Programmierung hört es dann aber auf da brauch ich einfach noch Hilfe, da kommt man sonst nicht weiter da man die meisten Beispiele einfach nicht so für sich umsetzen kann. Da braucht man halt mal Codes die man dann einbauen und evtl. Auch versuchen zu verstehen können um sie für nächste Projekte zu gebrauchen.
Gruß Dedi
Das Programmieren kann ich leider auch nicht. ich würde nur auf unbekannte Nummern bzw ohne Namen triggern. Ist von der Programmierung und Pflege deutlich einfacher. Muss man nur mal das richtige reading schauen und dann z.b. die Led rot fūr 20sec. Das klingeln hört ihr ja. Und wenn die Led nicht rot wird ist es ein Bekannter. Das wäre mein Ansatz.
Gruß Rolf
Würde schon gerne bei 3-4 Telefonnummern bzw. Namen (bekomme ich ja auch über fb_callist und Einbindung des telefonbuches der FB) jeweils eine eigene Farbe einbinden und für die unbekannten dann auch.
Das mit der Queue hört sich auch interessant an, ich glaube das muss ich mir auch mal genauer anschauen. Eine Scene genauso wie ein Dummy wäre also gar nicht nötig.
Man könnte das dann evtl. auch später mal erweitern, indem man zusätzlich noch den Anrufer Namen z.B. über eine Sonos Box (da ich mein Raspberry vor ca. 2 Wochen erst neu aufgesetzt habe noch nicht wieder integriert) ausgeben. Da sollte dann ja auch nur eben der Name ausgegeben werden und dann soll sie weiterlaufen. Ich weiß ja aktuell noch nicht in welchem Raum ich gerade telefoniere und dann müsste man sie halt notfalls manuell leiser bzw. ausschalten.
Gruß Dedi
Was genau hindert Dich jetzt daran den code einzusetzen den ich Dir gegeben habe ?
Dann must du versuchen den Code von herrmannj versuchen zu verstehen und für dich erweitern. Für jeden Anrufer eine eigene Farbe definieren mit der entsprechenden Nummer. Hier mal die Events für einen Anrufer ohne Namen vom Callmonitor. Als Hilfe:
2017-10-13 22:02:10 FB_CALLMONITOR CallMonitor event: ring
2017-10-13 22:02:10 FB_CALLMONITOR CallMonitor external_number: 0175123456
2017-10-13 22:02:10 FB_CALLMONITOR CallMonitor direction: incoming
2017-10-13 22:02:10 FB_CALLMONITOR CallMonitor external_name: unknown
Und das die evenst für Calllist bei einem unbekannten Anrufer:
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-row: 1
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-state: => ((o))
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-timestamp: 13.10. 22:02
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-name: -
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-number: 0175123456
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-internal: 123456
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-external: SIP3
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-connection: -
2017-10-13 22:02:10 FB_CALLLIST FritzBoxCallList 1-duration: läuft
Mehr kann ich dir leider nicht helfen.
Gruß Rolf
Ähm bin gerade nur mit Handy online und wollte zumindest schon mal Antworten.
Das muss ich mir in Ruhe am Laptop anschauen und versuchen umzusetzen.
Werde das dann mal versuchen zu verstehen und umzusetzen wenn ich wieder in der Nähe meines Laptops bin ;-).
Danke für die Infos euch beiden, melde mich dann wenn ich hoffentlich etwas weiter damit bin. Bin halt nur gerade noch unterwegs.
Gruß Dedi
So, habe nun mal den obigen Code von Jörg bei mir eingefügt.
Allerdings habe ich das Set ein wenig geändert, da sonst die Led anschließend nicht ausging.
So funktioniert es nun und die Led geht nach ca. 20 Sekunden wieder aus oder zurück auf die vorher gewählte Farbe.
FritzBox_Monitor:event:.ring {my $d = 'Wohn_LED_01'; my $hue = 0; my $sat =100; my $val = 100; 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";
}
Wenn nun jemand innerhalb der 20 Sekunden erneut anruft, würde er ja momentan die Anruf Farbe übernehmen. Kann man das auch noch irgendwie umgehen. Könnte man z.B. die Queue prüfen und das letzte aus der Queue (falls ein Eintrag vorhanden) als "alter Farbwert" übernehmen?
Heute Abend schaue ich mir das dann mal mit den verschiedenen Farben pro Rufnummer an. Sind nur 5-6 Nummern die ich fest hinterlegen möchte ansonsten vielleicht noch eine Unterscheidung ob bekannt oder unbekannt.
Vielen Dank auf jeden Fall schon mal für Eure Hilfe.
Das hat mich schon enorm weiter gebracht.
Gruß
Dedi
Das mit dem zweiten Anruf innerhalb 20 Sekunden könnte man ändern. Es würde jedoch deutlich komplizierter. Oben habe ich eine mögliche Strategie skizziert.
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
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
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
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 (?)
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.
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
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
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.
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.
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.
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
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
Ok. Das galt es rauszufinden. Poste mal das eventlog während eines Anruf. Was steht in dem Reading wenn der Anruf vorbei ist ?
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
Die external number bleibt stehen ?
Hier mal das List des FritzBox_Monitor:
Internals:
DEF 192.xxx.xxx.xxx
DeviceName 192.xxx.xxx.xxx:1012
FD 17
NAME FritzBox_Monitor
NOTIFYDEV global
NR 40
NTFY_ORDER 50-FritzBox_Monitor
PARTIAL
STATE opened
TYPE FB_CALLMONITOR
READINGS:
2017-10-16 14:24:54 call_duration 0
2017-10-16 14:24:54 call_id 0
2017-10-16 14:24:54 direction incoming
2017-10-16 14:24:54 event disconnect
2017-10-16 14:24:54 external_connection SIP0
2017-10-16 14:24:54 external_name xxxxxx
2017-10-16 14:24:54 external_number 0175xxxxxx
2017-10-16 13:18:46 internal_connection DECT_1
2017-10-16 14:24:54 internal_number xxxxxx
2017-10-16 14:24:54 missed_call 0175xxxxxx (xxxxxx)
2017-10-16 09:16:43 state opened
Ich würde also mal sagen, dass die Nummer stehen bleibt.
Komisch. Wird beim einem zweiten (dritten) Anruf der caller ins log geschrieben ?
Nein leider auch nicht:
2017.10.16 13:16:08 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 13:16:08 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 13:16:08 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q
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
2017.10.16 14:24:53 1: TEST:
2017.10.16 14:24:53 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 14:24:53 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 14:24:53 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q
2017.10.16 14:46:48 1: TEST:
2017.10.16 14:46:48 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 14:46:49 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 14:46:49 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q
Raw definition vom FritzBox_Monitor (FB_Callist):
setstate FritzBox_Monitor 2017-10-16 14:48:45 external_number 0175xxxxxx
Nicht wundern wegen der Uhrzeit, das setstate kommt vom auflegen, daher 2 Minuten später ;-)
Wie meinst du raw Definition ? Es geht um die readings und Events.
Bitte ruf mal mehrfach an und schau ob im log der Eintrag mit Nummer erscheint
ZitatWie meinst du raw Definition ? Es geht um die readings und Events.
Fhem Web - wenn man das Device "FritzBox_Monitor" aufruft, kann man unten auf Raw definition klicken. Da wird halt auch dieser Eintrag angezeigt. Dachte das wäre evtl. wichtig ob er das auch fest übernimmt.
ZitatBitte ruf mal mehrfach an und schau ob im log der Eintrag mit Nummer erscheint
Das hatte ich ja schon gemacht. Mindestens 3 mal aber ohne Erfolg. Der Test bleibt immer leer - siehe Eintrag oben
Mysteriös
Wenn Du das {ReadingsVal('Fritzbox_Monitor', 'external_number', '');}
in die Eingabezeile von fhem gibst sollte was passieren- das Reading der Fritzbox soll (muss) ausgegeben werden. Bitte probiere das mal. Evtl auch mit anderen Readings (ob nur die Nummer nicht geht, Name des Device falsch, etc)
Dann bekomme ich:
Unknown command {ReadingsVal('Fritzbox_Monitor',, try help.
Unknown command }, try help.
Ich glaub ich habe es:
{ReadingsVal('FritzBox_Monitor','external_number','')}
So eingegeben gibt er mir die Nummer aus ;-)
Das Leerzeichen nach dem Komma scheint ihn zu stören - grrrrr
Ist es eigentlich egal ob ich ' das oder " das nehme. Kommt beides auf das selbe raus, gibt es da noch etwas, was ich beachten muss?
Habe das mal in der DEF von dem Notify geändert, aber unter dem Test wird mir noch keine Rufnummer angezeigt.
Hab noch rausgefunden dass dieses funktioniert:
{ReadingsVal("FritzBox_Monitor","external_number","")}
und dieses NICHT:
{ReadingsVal('Fritzbox_Monitor','external_number','')}
Hier nochmal nun das aktuelle DEF vom 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";}
auch wenn ich es wie folgt ändere steht unter Test im Log kein Eintrag:
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";}
global Log:
2017.10.16 15:52:56 1: TEST:
2017.10.16 15:52:56 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 0, flags:
2017.10.16 15:52:57 3: Wohnzimmer_LED_01 set HSV 0, 100, 100 with ramp: 20, flags: q
2017.10.16 15:52:57 3: Wohnzimmer_LED_01 set HSV 217, 100, 0 with ramp: 0, flags: q
ändere mal bitte die Variable $caller in $call (jeweils an allen Stellen)
Dazu über(!) der logausgabe einmal
print {ReadingsVal('FritzBox_Monitor','external_number','')};
Ok - ändere das später mal auf "call" ab.
Das mit der Logausgabe und (!) verstehe ich irgendwie nicht. Weiß nicht wo ich das ausführen soll?
Zitat von: Dedi75 am 16 Oktober 2017, 16:15:13
Ok - ändere das später mal auf "call" ab.
Das mit der Logausgabe und (!) verstehe ich irgendwie nicht. Weiß nicht wo ich das ausführen soll?
Direkt vor (über) der Logausgabe im code (Log3 ...) diese Zeile einfügen. Im Code
so ist sie richtig
print ReadingsVal('FritzBox_Monitor','external_number','');
Nach dem Komma sind zwei einzelne Hochkomma. Kein doppeltes (") .
hi,
defmod TelefonStumm DOIF ([Anrufmonitor:event] ne "disconnect" and [TV01STG:Stumm] eq "off") (set Taster.05 on)\
DOELSEIF\
([Anrufmonitor:event] eq "disconnect" and [TV01STG:Stumm] eq "on") (set Taster.05 on)\
DOELSE ()
attr TelefonStumm alias TV mute:
attr TelefonStumm cmdState abgenommen|aufgelegt|frei
attr TelefonStumm devStateStyle style=color:red;;font-weight:bold;;text-align:right
attr TelefonStumm do always
attr TelefonStumm group Steuerung
attr TelefonStumm icon audio_volume_mute@brown
attr TelefonStumm room Telefon
setstate TelefonStumm aufgelegt
setstate TelefonStumm 2017-10-15 17:47:30 Device Anrufmonitor
setstate TelefonStumm 2017-10-15 17:47:30 cmd 2
setstate TelefonStumm 2017-10-15 17:47:30 cmd_event Anrufmonitor
setstate TelefonStumm 2017-10-15 17:47:30 cmd_nr 2
setstate TelefonStumm 2017-10-15 17:47:30 e_Anrufmonitor_event disconnect
setstate TelefonStumm 2017-10-15 12:38:26 e_TV01STG_Stumm off
setstate TelefonStumm 2017-10-15 17:47:30 state aufgelegt
setstate TelefonStumm 2017-10-15 12:43:32 wait_timer no timer
vieleicht kan das helfen, bei mir geht die stummschaltung vom tv ohne Probleme.
und man könnte es noch auf nummern erweitern.
FG
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.
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
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
Dann setz doch anstelle des Print mal $call= ein. Das im log hast du auf call geändert?
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.
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
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. ;)
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
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
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
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);
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 ?
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
ich habe den post darüber nochmal ergänzt / hat sich jetzt mit Deinem überschnitten
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.
ja, mach gleich richtig. Der Aufwand ist nur marginal.
In %data benötigst Du einen Key exklusiv für Dich, zB:
%data{'phonesignal'}
Dort hinterlegst Du dann die alten Werte
%data{'phonesignal'}{'hue'} = ReadingsVal ... 'hue' usw
Bei Ring sichern, bei disconnect rückschreiben.
Was mir dabei noch einfällt. Ich müsste ja hier auch noch die Zeit triggern, so dass die alten Werte nur zurückgeschrieben werden, wenn der disconnect innerhalb der 20 Sek. erfolgt.
Ich würde also den Wert nicht mehr im Notify speichern, sondern im %Data und dann jeweils auf diesen Wert zurückgreifen.
So würde ich mir dann den groben Ablauf vorstellen:
- Also erst einmal auf .ring reagieren
Fritz_Monitor:event:.ring {my $d="Wohn_LED_01";
- Dann die Color pro Rufnummer hinterlegen.
my %color; $color{"Anrufername1"}{"hue"}=140; $color{"Anrufername1"}{"sat"}=100; $color{"Anrufername1"}{"val"}=100;
my %color; $color{"Anrufername2"}{"hue"}=140; $color{"Anrufername2"}{"sat"}=100; $color{"Anrufername2"}{"val"}=100;
usw.
- prüfen ob es einen Wert in %Data{ring} gibt und dieser älter als 20 Sek. ist
if (%Data{ring} größer als 20 Sek.) ?!?
wenn Wert in %Data{ring} älter als 20 Sek.
- alte Daten Speichern in %Data{phonesignal} - also versuchen diese Daten nun in Data zu speichern: my $h=ReadingsVal($d,"hue",0); my $s=ReadingsVal($d,"saturation",0); my
$v=ReadingsVal($d,"brightness",0)
?!?
- ring in %Data{ring} Datum, Uhrzeit setzen
?!?
- set ausführen und Daten aus Data{phonebook} abholen
fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q - muss noch angepasst werden
wenn wert in %Data{ring}nicht älter als 20 Sek.
- alte Werte NICHT in %Data speichern
Nichts zu tun
- ring in %Data{ring} Datum, Uhrzeit setzen
?!?
- set ausführen und Daten aus Data{phonebook} abholen
fhem "set $d HSV $hue,$sat,$val; set $d HSV $hue,$sat,$val $t q; set $d HSV $h,$s,$v 0 q - muss noch angepasst werden
Oh Gott - mal schauen ob ich das zusammen basteln kann :o
Das mit der Wartezeit habe ich schon mal versucht einzubauen. Hab auch noch das Datum mit eingebaut, damit er dann nicht jeden Tag um die Uhrzeit auf Disabled steht.
@Jörg: Keine Sorge, dass andere mit dem Hash %Data verfolge ich weiterhin, aber ich muss das ganze erstmal iwie verstehen.
Es scheint aber irgendetwas noch nicht ganz korrekt, da ich folgenden Fehler erhalte:
2017.10.18 09:16:32 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 2519) line 1.
2017.10.18 09:16:32 3: eval: my $EVENT='event: ring';my $EVTPART0='event:';my $EVTPART1='ring';my $TYPE='FB_CALLMONITOR';my $NAME='FritzBox_Monitor';my $SELF='TelefonLED';{my $d="Wohn_LED_01"; my %color; $color{"Anrufername1"}{"hue"}=140; $color{"Anrufername1"}{"sat"}=100; $color{"Anrufername1"}{"val"}=100; $color{"Anrufername2"}{"hue"}=287; $color{"Anrufername2"}{"sat"}=100; $color{"Anrufername2"}{"val"}=100; $color{"Anrufername3"}{"hue"}=239; $color{"Anrufername3"}{"sat"}=100; $color{"Anrufername3"}{"val"}=100; my $call=ReadingsVal("FritzBox_Monitor","external_name",""); my $hue=0; my $sat=100; my $val=100; my $aktZeit={strftime("%Y-%m-%d %H:%M:%S",localtime)}; my $WarteZeit={strftime("%Y-%m-%d %H:%M:%S",localtime time+10)}; if (exists($color{$call})) {$hue=$color{$call}{"hue"}; $val=$color{$call}{"val"}; $sat=$color{$call}{"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; attr TelefonLED disabledForIntervals $aktZeit-$WarteZeit";}
Dieses hat er mit nun bei disabledForIntervals reingeschrieben.
disabledForIntervals - HASH(0x1f80468)-HASH(0x339b220)
Hier noch das aktuelle DIF:
FritzBox_Monitor:event:.ring {my $d="Wohn_LED_01"; my %color; $color{"Anrufername1"}{"hue"}=140; $color{"Anrufername1"}{"sat"}=100; $color{"Anrufername1"}{"val"}=100; $color{"Anrufername2"}{"hue"}=287; $color{"Anrufername2"}{"sat"}=100; $color{"Anrufername2"}{"val"}=100; $color{"Anrufername3"}{"hue"}=239; $color{"Anrufername3"}{"sat"}=100; $color{"Anrufername3"}{"val"}=100; my $call=ReadingsVal("FritzBox_Monitor","external_name",""); my $hue=0; my $sat=100; my $val=100; my $aktZeit={strftime("%Y-%m-%d %H:%M:%S",localtime)}; my $WarteZeit={strftime("%Y-%m-%d %H:%M:%S",localtime time+10)}; if (exists($color{$call})) {$hue=$color{$call}{"hue"}; $val=$color{$call}{"val"}; $sat=$color{$call}{"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; attr TelefonLED disabledForIntervals $aktZeit-$WarteZeit";}
Oh man - ich glaub ich raff das nie wie das ordentlich geschrieben wird :o
Mir ist noch aufgefallen, dass wenn er das attr disabledForIntervals schreibt, FHEM ja auch ein Save haben möchte. Muss das unbedingt. Ist ja eigentlich egal, da ich den Wert nicht länger brauche oder sollte man das noch iwie berücksichtigen?
Ok ich hab es nun:
disabledForIntervals - 2017-10-18 11:49:23-2017-10-18 11:49:33
Nun mal schauen, ob er das auch so in dem Format wirklich korrekt macht - teste ich heute Abend.
die {} waren zuviel in dem:
my $aktZeit={strftime("%Y-%m-%d %H:%M:%S",localtime)}; my $WarteZeit={strftime("%Y-%m-%d %H:%M:%S",localtime time+10)};
Richtig nun so:
my $aktZeit=strftime("%Y-%m-%d %H:%M:%S",localtime); my $WarteZeit=strftime("%Y-%m-%d %H:%M:%S",localtime time+10);
Das mit den Klammern versteh ich nie >:(
Ok das "disabledForIntervals" arbeitet wohl nicht mit einem Datum - SCHADE
ZitatdisabledForIntervals HH:MM-HH:MM HH:MM-HH-MM...
Optionales Attribut zur Deaktivierung der Anrufliste innerhalb von bestimmten Zeitintervallen. Das Argument ist eine Leerzeichen-getrennte Liste von Minuszeichen-getrennten HH:MM Paaren (Stunde : Minute). Falls die aktuelle Uhrzeit zwischen diese Werte fällt, dann wird die Ausführung, wie bei disable, ausgesetzt. Statt HH:MM kann man auch HH oder HH:MM:SS angeben.
Um einen Intervall um Mitternacht zu spezifizieren, muss man zwei einzelne Intervalle angeben, z.Bsp.:
23:00-24:00 00:00-01:00
Standardwert ist nicht gesetzt (dauerhaft aktiv)