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 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

Rolfg

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

herrmannj

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

Rolfg

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




herrmannj


herrmannj

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.

Rolfg

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

Dedi75

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

Rolfg

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

Dedi75

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

herrmannj

Was genau hindert Dich jetzt daran den code einzusetzen den ich Dir gegeben habe ?

Rolfg

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

Dedi75

Ä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

Dedi75

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

herrmannj

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.