Hauptmenü

Modul 96_SIP

Begonnen von Wzut, 19 Februar 2017, 19:10:09

Vorheriges Thema - Nächstes Thema

plin

Zitat von: Elektrolurch am 09 Dezember 2017, 11:15:29
set sip call **611 30 /hdd/sda4/Sonos/speak/sounds/Gong.alaw !Das ist eine Mitteilung, die Dir vom Speicherknecht vorgelesen wird.
Aktuell wird nur eine Nachricht eines Typs unterstützt (also audiofile, DTMF oder Text). Siehe auch https://wiki.fhem.de/wiki/SIP-Client#Set

Zitat von: Elektrolurch am 09 Dezember 2017, 11:15:29
socx  $file  -t raw -r 8000 -c 1 -e a-law  $outfile
Welche Extension hat denn das erzeugte File? .alaw? Da nur der Wissende alaw und ulaw unterscheiden kann, muss das über die Extension des Files mitgeteilt werden (Das Audioformat hat keinen Header). Siehe auch https://wiki.fhem.de/wiki/SIP-Client#Attribute
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Wzut

@Elektrolurch ,
mit deine Pause zu Beginn entweder die im Modul vorgesehene Delay Funktion nutzen (siehe Rewe2000 Posting)
oder von Hand die mp3 Datei bearbeiten das sie eine Zeit X Stille am Anfang hat.

Zu deinem Problem der Konvertierung :
sox <mp3 File> -t raw -r 8000 -c 1 -e a-law <alaw File>
so wird Modul intern eine T2S mp3 Datei gewandelt.

Aufruf Parameter:
Ich versuche mich bei meinen Modulen eigentlich an die FHEM Richtlinien für Entwickler zu halten. Bei meinem MPD Modul war das relativ einfach, da es bestimmte Vorgaben bereits gab, hier schaut das etwas anders aus. Und wenn ich ehrlich bin habe ich mir am Anfang nicht die Mühe gemacht zu erforschen ob andere Module ähnliche Funktionen haben und wie deren Syntax ist. Ich habe kein Problem damit das alles auf den Kopf zu stellen, allerdings mögen das die anderen Autoren mit ihren Modulen dann bitteschön auch tun. Stellt sich nun die Frage welche Syntax wäre die "Richtige" ? say :  , sayText: ,  ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Hallo Wzut,

Konvertierung: Genauso habe ich es auch gemacht, aber manche mp3 scheinen sich da zu verweigern....

Ja, das mit den Aufrufparametern ist ein leidiges Problem. Hintergrund ist, dass ich mir so ein "Message-System" fürs Haus gebaut habe und je nach dem, wo oder was eingeschaltet ist, gebe ich da Audiomeldungen aus. Umfasst derzeit SONOS, ENIGMA2, SBPLAYER und fritzbox habe ich jetzt durch SIP ersetzt. DA musste ich überall eine TYPE-Abfrage einbauen, um die Geräte richtig anzusprechen. Eigentlich sollte fhem ja gerade das geräteunabhängig leisten....
Die "richtigen" Parameter gibt es ja nicht und das Problem ist, wenn man es ändert, müssten alle user auch Anpassungen durchführen.
Daher wäre ein denkbarer Weg, und das wäre auch einfach zu implementieren, mehrere Möglichkeiten einzubauen. So könntest Du zusätzlich zum "!" für den Beginn der Sprachausgabe auch "say:" und "speak" zu lassen.
Na ja, egal - jetzt habe ich die TYPE - Abfragen eh schon implementiert.
Das SIP-Modul ist schon cool und als nächstes werde ich mal sehen, ob es auch mit der Annahme von Anrufen klapt. Könnte man z.B. den "Hausstatus" über die Eingabe einer Nummer abrufen....
Dazu eine Frage: Wenn die SIP-Instanz auf "Rufe annehmen" steht (wartet), kann sie trotzdem auch Calls absetzen? Oder muss ich hierfür einen zweiten SIP-Klienten definieren?

Elektrolurch
   
configDB und Windows befreite Zone!

Wzut

Zitat von: Elektrolurch am 10 Dezember 2017, 10:41:11
Könnte man z.B. den "Hausstatus" über die Eingabe einer Nummer abrufen....
Dazu eine Frage: Wenn die SIP-Instanz auf "Rufe annehmen" steht (wartet), kann sie trotzdem auch Calls absetzen? Oder muss ich hierfür einen zweiten SIP-Klienten definieren?
a. Ja natürlich das war u.a. für mich der Grund überhaupt mit dem Modul anzufangen, FHEM steuern via Telefon und DTMF Tasten
b. Nein, eine SIP Instanz reicht. Das Modul kann beides zur gleichen Zeit. Aleerdings wenn die Platform damit Probleme hat kann mit dem Attribut elbc
automatisch ein Listen Prozess zuvor gestoppt werden und nach dem Call wieder automatisch neu gestartet
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Hallo,
jetzt habe ich noch ein Problem, Anrufe anzunehmen. Es kommt immer ein Besetztzeichen, so als wäre der sip-client nicht für das Annehmen von Calls konfiguriert. Die anderen angemeldeten VoIP - Telefone funktionieren.

ich habe mit
set sip listen
auf den listen-Betrieb umgeschaltet.
Die Attribute sind
T2S_Device tts
audio_converter sox
sip_audiofile_call !Zur Zeit können keine Anrufe angenommen werden
sip_audiofile_wfp !°Dieser Anschluß kann derzeit keine Anrufe entgegennehmen.
sip_call_audio_delay 1.75
sip_dtmf_loop once
sip_dtmf_send audio
sip_dtmf_size 2
sip_elbc yes
sip_force_interval 300
sip_from sip:fhemfhem@fritz.box
sip_ip Speicherknecht
sip_listen wfp
sip_registrar fritz.box
sip_ringtime 2
sip_user fhemfhem
verbose 1
Internals:
   AC         /usr/bin/sox
   LPID       21776
   NAME       sip
   NOTIFYDEV  tts
   NR         947
   NTFY_ORDER 50-sip
   STATE      listen_wfp
   TYPE       SIP
   VERSION    V1.61 / 30.10.17

   helper:
     LISTEN_PID:
       abortArg   
       abortFn   
       arg        sip
       bc_pid     188
       finishFn   SIP_ListenDone
       fn         SIP_ListenStart
       pid        21776
       timeout   

Wenn ich mit nmap einen Portscan durchführe, wird der Port 5900 nicht angezeigt.
Calls vom sip - Klienten funktionieren, nur nicht das Annehmen von calls.
Habe ich da noch was übersehen?

Im ersten Schritt will ich nur eine Textnachricht ausgeben.
Es wird auch kein event generiert, was einen eingehenden Call signalisieren würde. Na ja, wenn der Port nicht offen ist....
P.S.: Firewall ist nicht aktiv.
Elektrolurch
configDB und Windows befreite Zone!

Wzut

was mir sofort auffällt :
LPID       21776
STATE      listen_wfp

d.h. das schaut auf den ersten Blick so aus als ob der Listen Prozess erfolgreich gestartet wurde.
Ein zweiter Blick ist leider unmöglich da du verbose auf 1 hast !
Also :
1. verbose auf 5
2. set <name> reset
3. Client von einem Telefon aus anrufen
4. dem entsprechenden Log Abschnitt hier mit Code Tags posten
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Hallo,

eigentlich kann ich nichts auffälliges im log erkennen, jedenfalls keine Signalisierung eines Anrufes:
<code>
2017.12.12 16:14:22 5: sip, listen process 31439 found
2017.12.12 16:15:22 5: sip, listen process 31439 found
2017.12.12 16:15:22 4: sip[31439], register new expire : 2017-12-12 16:20:22
2017.12.12 16:15:22 5: sip[31439], telnet : set sip state listen_wfp set sip listen_alive PID_31439 set sip expire 300 exit
2017.12.12 16:15:22 3: sip_not: sip rd listen_wfp val
2017.12.12 16:15:22 3: sip_not: sip rd listen_alive val PID_31439
2017.12.12 16:15:22 3: sip_not: sip rd expire val 300

</code>

Elektrolurch
configDB und Windows befreite Zone!

Wzut

#517
Na das mit den Code Tags üben wir aber noch ein bissel ... ( Code Tags haben eckige Klammern nicht spitz)
Leider hast nicht das gemacht (oder gepostet)  was ich sehen wollte
In deinem log Abschnitt ist lediglich das refresh des expire zu sehen, mich hätte aber interessiert wie der Ablauf nach dem Reset eines Listen Prozesses ist. U.A. ist dort der Listen Port zu sehen, denn ich weiss nicht wie du auf 5900 kommst. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Hallo, da ich einen Screenreader nutzen muss, kann ich den Button für den code leider nicht verwenden. ok, erde mal die eckigen Klammern versuchen...
Also, verbose auf 5, set sip reset und dann den Anruf auf **623.
Erhalte zwar wieder das Besetztzeichen, aber in der letzen Zeile des logs steht, dass er das File für die Ausgabe der Sprachnachricht verwenden will....
Habe ein notify auf sip:.* laufen, (Ausgae mit sip_not:), da steht aber kein event mit "ring" oder so.
Habe ich da ev. doch noch ein notwendiges Attribut vergessen?

2017.12.13 11:25:25 4: sip, Listen Kill PID : 6898
2017.12.13 11:25:25 1: Timeout for SIP_ListenStart reached, terminated process 6898
2017.12.13 11:25:25 3: sip_not: sip rd listen_alive val no
2017.12.13 11:25:25 4: sip, Reset Listen done
2017.12.13 11:25:25 4: sip, hole °Dieser Anschluß kann derzeit keine Anrufe entgegennehmen.
2017.12.13 11:25:26 4: sip, wait_for_t2s file : /hdd/sda4/Sonos/speak/3a7913361466135975617ed979aec1fa.mp3
2017.12.13 11:25:26 4: sip, new T2S file /hdd/sda4/Sonos/speak/3a7913361466135975617ed979aec1fa.mp3
2017.12.13 11:25:26 5: sip, not converted using /hdd/sda4/Sonos/speak/3a7913361466135975617ed979aec1fa.alaw from cache
2017.12.13 11:25:26 4: sip, Listen new PID : 7896
2017.12.13 11:25:26 4: sip[7896], my parent is 10524
2017.12.13 11:25:26 4: sip[7896], using random port 44512
2017.12.13 11:25:27 4: sip[7896], register new expire : 2017-12-13 11:30:27
2017.12.13 11:25:27 5: sip[7896], telnet : set sip state listen_wfp set sip listen_alive PID_7896 set sip expire 300 exit
2017.12.13 11:25:27 3: sip_not: sip rd listen_wfp val
2017.12.13 11:25:27 3: sip_not: sip rd listen_alive val PID_7896
2017.12.13 11:25:27 3: sip_not: sip rd expire val 300
2017.12.13 11:25:27 4: sip[7896], using /hdd/sda4/Sonos/speak/3a7913361466135975617ed979aec1fa.alaw for audio_wfp



Elektrolurch
configDB und Windows befreite Zone!

Wzut

Zitat von: Elektrolurch am 13 Dezember 2017, 11:35:17
da ich einen Screenreader nutzen muss
Sorry , dann war meine lässige Bemerkung unangebracht und werde es mir für die Zukunft merken !

Also zu deinem Log :
Das schaut erst einmal gut aus. Da du das Attribut sip_port nicht verwendest wird vom Modul ein Eigener verwendet,
in deinem Fall laut Log : 44512
Wenn du also mit netstat auf die Suche nach offenen Ports gehst,  dann ist dieser der Richtige.
Ggf. kannst du natürlich auch einen festen Port nutzen, ich würde dann mit 5060 im Attribut sip_port beginnen.

Noch ein Wort zu deinem Screenreader : Erkennt er das Grad Zeichen (°) vor dem Satz "Dieser Anschluß kann derzeit keine Anrufe entgegennehmen" ? (Ich habe mich schon gefragt für was das gut sein soll, vermutlich ist es durch ein Versehen dahin gewandert)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

speedAmaster

Hallo,
ich versuche eben meine Türsprechstelle (a/b) an der Fritzbox in TabletUI einzubinden.
(1) Dafür würde ich gerne im Falle, dass des Event "caller_state" ringing kommt ein popup öffnen.
(2) in diesem popup soll es einen Taster geben, der den call annimmt und dann eine DTMF Tastenkombination "#9 - pause - #9 - pause - #9" sendet (zum mehrmaligen Öffnen der Türe)
(3) danach oder nach einem Timer soll das popup automatisch schliessen

was schonmal geht ist:
(1) popup öffnet beim Klingeln (durch event "ringing_2")
(2) der Taster im popup mit "fetch" holt das Gespräch (OK, auch zu hören an Türsprechstelle), aber leider kommen keine DTMF Töne an (und der Türöffner reagiert nicht), da "sip_audiofile_wfp -#9#9#9#9" wohl nicht funktioniert. Geht wohl nur mit "sip_audiofile_wfp !Hallo da draußen", was aber immer noch nicht den Türöffner aktiviert (geht mit "#9").
HAT JEMAND eine Idee, wie ich beim fetch auf wfp auch DTMF senden kann? Evtl sogar mit einer Pause zwischen "#9" und "#9"?
(3) popup schließt nach dem klick auf den Taster, leider noch nicht nach einem time-out
HAT JEMAND eine Idee, wie ich den "klick" und einen timeout zum Schließen verwenden kann?


mein FHEMsip habe ich wie folgt konfiguriert
define mySIP SIP
attr mySIP sip_user FHEMphone
attr mySIP sip_registrar 192.168.178.1
attr mySIP sip_from sip:FHEMphone@192.168.178.1
attr mySIP sip_ip 192.168.178.99
attr mySIP sip_listen wfp
attr mySIP sip_waittime 40
attr mySIP T2S_Device myT2S
attr mySIP audio_converter sox
attr mySIP sip_dtmf_send audio
attr mySIP sip_audiofile_wfp -#9#9#9#9


Mein Tablet-UI code sieht so aus:
<div data-type="popup" data-device="mySIP" data-get="caller_state" data-get-on="ringing_2" data-get-off="off" data-height="500px" data-width="500px">
<div class="dialog">
<header>Anruf von Türsprechstelle</header>
<div data-type="push" data-device="mySIP" data-icon="fa-folder-open-o" data-set-on="fetch" onclick="$('.dialog-close').trigger('click');"></div>
<div data-type="label" class="darker">Türe öffnen - fetch</div>
</div>

Wzut

wfp kann als Quittung bei Rufannahme DTMF Signale absetzen oder ein Audiofile abspielen, aber es erwartet vom User keine DTMF Eingabe.
Aber IMHO hatten wir hier im Thread schon mal so einen (oder ähnlichen Fall) , ich würde das etwa so lösen.
Lass deinen Listen Prozess wie bisher auf wfp laufen , setze sip_waitime einen sehr großen Wert damit der Ruf gar nicht angenommen wird.
Setze sip_elbc auf yes
Ändere dein Popup so das der Taster zuerst ein set <name> reject macht um das Gebimmel zu stoppen und den Call zu beenden
kleine Pause ( 1 Sekunde ?)
setze dann ein "set <name> call <Rufnummer Tür> 30 -#9--#9--#9"  ab (Pause im DTMF String mit Minus - siehe Wiki )
Wenn dein SIP Phone als Türsprechstelle in der FB angelegt ist sollte das klappen. 

ZUm Thema TabletUI kann ich nichts sagen , keine Ahnung und nicht bei mir im Einsatz
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

plin

Zitat von: speedAmaster am 13 Dezember 2017, 18:32:36
HAT JEMAND eine Idee, wie ich beim fetch auf wfp auch DTMF senden kann? Evtl sogar mit einer Pause zwischen "#9" und "#9"?
Wie wär's mit einem generierten Soundfile (z.B. via http://dialabc.com/sound/generate/) das als wfp audiofile hinterlegt wird. Mit einem Sound-Editor kann man auch Pausen einbauen.

FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Wzut

klingt auch gut , die Arbeit muss man ja nur einmal machen.
Als Audioformat gleich u-law mono 8000 Hz auswählen ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

speedAmaster

Hallo, super Ideen zum Thema (2). Werde ich morgen ausprobieren! Ich melde mich!

Zum Thema (3) automatisches Schließen des popup nach bestimmter Zeit, habe ich das attribut "data-return-time" des popup-Widget gefunden => gelöst