FritzBox + Türstation mit Gira TK-Gateway - meine Umsetzungen mit Codes

Begonnen von Dia81, 24 September 2018, 21:02:15

Vorheriges Thema - Nächstes Thema

Dia81

Allgemein

Warum das Ganze? Wollte meine Umsetzung für mich selber mal festhalten und für Fragen natürlich auch teilen. Habe verschiedene Ausbauschritte mal mit Codes hier festgehalten. Für mich ging es darum die Klingel "Trigger"bar zu machen und auch das Gateway über die Fritzbox schaltbar zu machen... Aber der Reihe nach:

Meine Hardware

Fritzbox7490 mit 2 Telefonnummern
Gira TK-Gateway
Raspberry..klar

Vorbereitungen

- Den TK-Gateway flux an den Analogeingang Fon1 der Fritzbox verbunden
- In der Fritzbox dieses "Telefon" als Analogtelefonanschluss hinzugefügt und in meinem Fall mit einer 2. Rufnummer (nicht meine Hauptnummer) als ausgehende Nummer festgelegt (nicht zwingend notwendig macht aber später einiges einfacher. Der Gateway ist damit mit **1 anrufbar

Klingelnutzung in Fhem sichtbar machen

- Natürlich muss das Fritzboxmodul konfiguriert sein
- Nur externe Anrufe sind im Callmonitor sichtbar also muss die Klingel extern anrufen
- im Fritzbox-Telefonbuch eine fiktive externe Nummer ablegen. Bei mir die Nummer "Tuerklingel@127.0.0.1" mit Name "Türklingel" und der Kurzwahl *701
- Im Gira TK-Gateway über die Software oder das Telefon die Anlage im Betrieb als Nebestelle konfigurieren
- In meinem Fall hab ich die Rufnummer 1 als *701 eingestellt und die Rufnummer 2 als <meine Handynr>
- Masterumleitung augestaltet (Altenativ z.b. *9 eingeben und auf verzögert stellen damit die internen Telefone klingeln)
- Wichtig: Für ein Triggern in Fhem muss immer eine externe Nummer angerufen werden, echt oder fiktiv
- Nun kann ich die Klingel im Callmonitor triggern:

define doif_Klingeln DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<meine2. Rufnummer>")) ( set ...)

- da meine Türklingel immer mit der in der Fritzbox eingestellten 2. Rufnummer anruft ist damit jeder externen Anruf erfasst auch der eingestellte auf die Handynummer. Ha man keine 2. RufNummer könnte man statt auf [CallMonitor:internal_number]  natürlich auf den Anrufernamen triggern z.b. auf die eingetragene fiktive Telfonnummer. Nur beim Handyanruf wird es schwierig weil dieser ja auch beim Anruf vom normalen Telefon dann denken würde, es wäre die Klingel..daher meine Lösung mit der 2. Nummer.

Wunderbar man kann nun feststellen wann wer klingelt und daruf reagieren....

Telegram und Klingel

- Ich habe das geniale Telegram eingerichtet und nutze dies für die komplette FHEM Steuerung mit eigenem Menü, aber auch für Infos über die Türklingel. Zusätzlich habe ich eine externe Kamera eingebunden.

Kameraeinbindung:

define Cam1 IPCAM 192.168.178.221
attr Cam1 basicauth xxxx:xxxx
attr Cam1 delay 12
attr Cam1 group Kamera
attr Cam1 icon it_camera
attr Cam1 path Streaming/channels/101/Picture
attr Cam1 snapshots 2
attr Cam1 storage /opt/fhem/www/tablet/images/Kamera/
attr Cam1 timestamp 1


Bei Klingeln ein Foto machen:

define diKlingel_Test DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<2.ext Rufnummer> ")) (get Cam1 image)

Dazu habe ich mit FritzBoxCallList2 eine Calllist angelegt die nur Anrufe von der <2.ext Rufnummer> anzeigt damit also nur meine Klingel. Fotos wie es dann in Telegram aussieht häng ich später an.

Meine TelegramMeldung sieht dann so aus:

define doif_Klingeln_Telegram DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<2.ext Rufnummer> ")) ( set teleBot send @Ich @Frau 🏠 Es klingelt wer \n {(ReadingsVal("FritzBoxCallList2","1-timestamp",0))}, set teleBot sendPhoto @xxx @xxx /opt/fhem/www/tablet/images/Kamera/Cam1_snapshot.jpg )

Variantenumschaltung

In meinem Beispiel wird immer die Variante 1 also die Nummer *701 damit meine fikive Nummer angerufen um sofort die Telegram-Mitteilung auszulösen.  Als 2. Variante hatte ich meine Handynummer eingetragen. Das ganze möchte ich jetzt umschalten wenn ich nicht da bin, damit dann der Klingelruf direkt ans Handy geht. Dafür benötigen wir das SIP-Modul:

define FRITZ_SIP SIP
attr FRITZ_SIP history_file ./log/FRITZ_SIP.sip
attr FRITZ_SIP history_size 0
attr FRITZ_SIP sip_dtmf_loop once
attr FRITZ_SIP sip_dtmf_send audio
attr FRITZ_SIP sip_dtmf_size 2
attr FRITZ_SIP sip_elbc yes
attr FRITZ_SIP sip_from sip:xxxx@fritz.box
attr FRITZ_SIP sip_ip 192.168.178.33
attr FRITZ_SIP sip_listen none
attr FRITZ_SIP sip_port 5070
attr FRITZ_SIP sip_registrar 192.168.178.1
attr FRITZ_SIP sip_ringtime 3
attr FRITZ_SIP sip_user xxxx
attr FRITZ_SIP verbose 5


Ab jetzt können wir über FHEM mit den DTMF-Codes arbeiten, welche in der Anleitung von Gira beschrieben sind.
Ich schalte diese in Abhängigkeit von einem Dummy Rufumleitung welcher AT-gesteuert an geht.

define doif_RufumleitungAn DOIF ([Rufumleitungsdummy] eq "An") (set FRITZ_SIP call  **1 15 -----*-3-*-2-#)
define doif_RufumleitungAus DOIF ([Rufumleitungsdummy] eq "Aus") (set FRITZ_SIP call **1 15 -----*-3-*-1-#)


Bauen wir uns das mal auseinander:

set FRITZ_SIP call  **1 15 -----*-3-*-2-#

**1  anruf meines Analogtelefons =  der Türstation
15   Timeoutzeit
- DTMF Verfahren starten
---- Pausen, da nach Anruf erst ein Moment gewartet werden muss bevor die Eingabe möglich ist
*-3-*-2-#    Der Code *3*3# aktiviert die Variante 2, die "-" dienen als kurze Pause da sonst die Eingabe zu schnell erfolgt und nicht funktioniert

Damit ist die Handynummer aktiviert. Bei einem Anruf erhalte ich die Telegramnachricht UND der Anruf geht ans Handy durch.

Falls jemand Fragen hat gerne melden. Wie das erweitert bei mir in Telegram aussieht kommt per Foto :)






Dia81

Mein Menü in Telegram hab ich nach folgendem Beispiel aufgebaut:

## Klingel ##

define teleBot31 notify teleBot:queryData:.🔔 set teleBot queryInline @[teleBot:queryPeer] (3⃣🔔|3⃣📷|📷) (🔔📲|🔔🚪) (🔝) 🔔<b>Klingel</b>;; set teleBot send @[teleBot:queryPeer] 🔔📲 {(ReadingsVal("Rufumleitungsdummy","state",0))}

define teleBot32 notify teleBot:queryData:.3⃣🔔 set teleBot send @[teleBot:queryPeer] {(ReadingsVal("FritzBoxCallList2","1-timestamp",0))} \n {(ReadingsVal("FritzBoxCallList2","2-timestamp",0))} \n {(ReadingsVal("FritzBoxCallList2","3-timestamp",0))}

define teleBot321 notify teleBot:queryData:.🔔📲 set Rufumleitungsdummy An;;set teleBot send @[teleBot:queryPeer] Handyumleitung <b>eingeschaltet</b>
define teleBot322 notify teleBot:queryData:.🔔🚪 set Rufumleitungsdummy Aus;;set teleBot send @[teleBot:queryPeer] Handyumleitung <b>ausgeschaltet</b>

define teleBot33 notify teleBot:queryData:.3⃣📷 set teleBot set teleBot send @[teleBot:queryPeer] {(ReadingsVal("FritzBoxCallList2","1-timestamp",0))};;set teleBot sendPhoto @[teleBot:queryPeer] {(ReadingsVal("dummyKamerabild","Telegram_1p",0))};;set teleBot send @[teleBot:queryPeer] {(ReadingsVal("FritzBoxCallList2","2-timestamp",0))};;set teleBot sendPhoto @[teleBot:queryPeer] {(ReadingsVal("dummyKamerabild","Telegram_4p",0))};;set teleBot send @[teleBot:queryPeer] {(ReadingsVal("FritzBoxCallList2","3-timestamp",0))};;set teleBot sendPhoto @[teleBot:queryPeer] {(ReadingsVal("dummyKamerabild","Telegram_6p",0))}

define teleBot34 notify teleBot:queryData:.📷 get Cam2 image;;set teleBot send @[teleBot:queryPeer] Bild wird erstellt..;;sleep 3;;set teleBot sendPhoto @[teleBot:queryPeer] /opt/fhem/www/tablet/images/Cam2_snapshot.jpg


Weitere Problemlösungen. Meine Kamera macht immer 2 shots bei "auslösungen" aber immer nur das eine letzte hat den immer gleichen Namen, alle anderen werden unterschiedlich benannt. Das ist in soweit wichtig wenn man sich wie in diesem Beispiel die letzten 3 Klingelnden anzeigen lassen möchte, da wie gesagt nur das letzte Bild einen eindeutigen Namen trägt, also muss eine Subroutine hier eine Sortierung vornehmen.

define diKlingel_Scripte DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<2.ext. Rufnummer>")) ({last_pic(1)}) ({last_pic(2)}) ({last_pic(3)}) ({last_pic(4)}) ({last_pic(5)}) ({last_pic(6)}) ({last_pic(7)}) ({last_pic(8)}) ({last_pic(9)}) ({last_pic(10)}) ({last_pic(11)})

führt die last-pic sub beim Klingeln 11 mal aus... was macht die Sub?:



sub last_pic($)
{
my ($p) = @_;
my $ss = "".$p."p";
my $file = qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/tablet/images/Kamera/*.jpg | sed -n $ss | awk '{print \$8}');
$file =~ s/\s//mg;
my $file2 = ".././$file";
my $file3 = "/opt/fhem/$file";
 
fhem( "setreading dummyKamerabild reading_$ss $file2" );
fhem( "setreading dummyKamerabild Telegram_$ss $file3" );


return $file2;


}


Damit sieht ein List des dummyKemarabild dann so aus:


   2018-09-24 18:02:21   Telegram_10p    /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_144051.jpg
     2018-09-24 18:02:21   Telegram_11p    /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_143140.jpg
     2018-09-24 18:02:21   Telegram_1p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180924_180213.jpg
     2018-09-24 18:02:21   Telegram_2p     /opt/fhem/www/tablet/images/Kamera/Cam1_snapshot.jpg
     2018-09-24 18:02:21   Telegram_3p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180924_180202.jpg
     2018-09-24 18:02:21   Telegram_4p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180924_180151.jpg
     2018-09-24 18:02:21   Telegram_5p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_161228.jpg
     2018-09-24 18:02:21   Telegram_6p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_161216.jpg
     2018-09-24 18:02:21   Telegram_7p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_144733.jpg
     2018-09-24 18:02:21   Telegram_8p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_144721.jpg
     2018-09-24 18:02:21   Telegram_9p     /opt/fhem/www/tablet/images/Kamera/Cam1_20180923_144103.jpg
     2018-09-24 18:02:21   reading_10p     .././www/tablet/images/Kamera/Cam1_20180923_144051.jpg
     2018-09-24 18:02:21   reading_11p     .././www/tablet/images/Kamera/Cam1_20180923_143140.jpg
     2018-09-24 18:02:21   reading_1p      .././www/tablet/images/Kamera/Cam1_20180924_180213.jpg
     2018-09-24 18:02:21   reading_2p      .././www/tablet/images/Kamera/Cam1_snapshot.jpg
     2018-09-24 18:02:21   reading_3p      .././www/tablet/images/Kamera/Cam1_20180924_180202.jpg
     2018-09-24 18:02:21   reading_4p      .././www/tablet/images/Kamera/Cam1_20180924_180151.jpg
     2018-09-24 18:02:21   reading_5p      .././www/tablet/images/Kamera/Cam1_20180923_161228.jpg
     2018-09-24 18:02:21   reading_6p      .././www/tablet/images/Kamera/Cam1_20180923_161216.jpg
     2018-09-24 18:02:21   reading_7p      .././www/tablet/images/Kamera/Cam1_20180923_144733.jpg
     2018-09-24 18:02:21   reading_8p      .././www/tablet/images/Kamera/Cam1_20180923_144721.jpg
     2018-09-24 18:02:21   reading_9p      .././www/tablet/images/Kamera/Cam1_20180923_144103.jpg

Die Readings "reading_xp" sind für das Beispiel hier zu vernachlässigen. Die URL-Angabe in dieser WEise brauchte ich woanders für...

Folglich sind Telegram_1p,2p die Fotos des jüngsten Klingeln 3p,4p die vom 2. jüngsten... etc.. damit habe ich die variablen Screenshotnamen in ein festes Reading überführt und kann dies nutzen z.B. durch

set teleBot sendPhoto @[teleBot:queryPeer] {(ReadingsVal("dummyKamerabild","Telegram_3p",0))};

harway2007

 :o
Irgendwas stimmt hier nicht !

Code: [Auswählen]

define doif_Klingeln DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<meine2. Rufnummer>")) ( set ...

)

Dia81

Zitat von: harway2007 am 17 Oktober 2018, 21:11:19
:o
Irgendwas stimmt hier nicht !

Code: [Auswählen]

define doif_Klingeln DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<meine2. Rufnummer>")) ( set ...

)

in wie fern?

define doif_Klingeln_Telegram DOIF (([CallMonitor:event] eq "call") and ([CallMonitor:internal_number] eq "<nummer>")) (set teleBot send 🏠 Es klingelt wer \n {(ReadingsVal("FritzBoxCallList2","1-timestamp",0))}, set teleBot sendPhoto /opt/fhem/www/tablet/images/Kamera/Cam1_snapshot.jpg ) wär der komplette Code