Hauptmenü

Modul 96_SIP

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

Vorheriges Thema - Nächstes Thema

Wzut

Zitat von: Elektrolurch am 28 Dezember 2017, 11:00:43
sip_elbc
stand auf yes, habe das auf 0 gesetzt.
Du meinst auf no , denn 0 gibt es nicht
Sodele dann nochmal elbc bedeutet End Listen Befor Call oder auf deutsch "Beende einen laufenden Listen Prozess vor einem ausgehenden Anruf"
Auf einem Raspberry 3 kann man das meiner Meinung nach ruhig auf no setzen.
Wegen deiner anderen Warnungen im Log : Da meckert nicht nur das SIP Modul sondern auch Text2Speach !
Poste doch bitte nochmal ein vollständiges List deines SIP Device, denn ich habe die Warnungen bei mir nicht und
mich machen auch die angegeben Zeilennummern etwas stutzig, die passen sogar nicht mit meiner aktuellen Version zusammen.
Aktuell wird die V1.71 via Update verteilt.   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Das steht im Modul - Kopf:
# $Id:17-10-30 13:41:59Z Wzut $
Mehr gibts nicht per update bei mir.

Internals:
   AC         /usr/bin/sox
   LPID       27924
   NAME       sip
   NOTIFYDEV  tts
   NR         946
   NTFY_ORDER 50-sip
   STATE      listen_wfp
   TYPE       SIP
   VERSION    V1.71 / 16.12.17
   READINGS:
     2017-12-28 10:50:50   call            done
     2017-12-28 10:50:50   call_attempt    0
     2017-12-28 10:50:50   call_state      peer hangup
     2017-12-28 10:50:50   call_success    0
     2017-12-28 10:50:50   call_time       7
     2017-12-28 10:51:38   caller          none
     2017-12-28 10:51:38   caller_state    waiting
     2017-12-27 20:53:48   caller_time     0
     2017-12-28 12:00:54   expire          300
     2017-12-07 11:13:50   last_error      sox error signal_Fenster_Offen.on.png
     2017-12-28 12:00:54   listen_alive    27924
     2017-12-28 12:00:54   state           listen_wfp
   helper:
     LISTEN_PID:
       abortArg   
       abortFn   
       arg        sip
       bc_pid     1007
       finishFn   SIP_ListenDone
       fn         SIP_ListenStart
       pid        27924
       timeout   
Attributes:
   T2S_Device tts
   audio_converter sox
   sip_audiofile_call !Zur Zeit können keine Anrufe angenommen werden
   sip_audiofile_wfp /media/Sonos/speak/report.alaw
   sip_call_audio_delay 1.75
   sip_dtmf_loop once
   sip_dtmf_send audio
   sip_dtmf_size 2
   sip_elbc   0
   sip_force_interval 300
   sip_from   sip:fhemfhem@fritz.box
   sip_ip     192.168.1.16
   sip_listen wfp
   sip_port   5060
   sip_registrar fritz.box
   sip_ringtime 2
   sip_user   fhemfhem
   verbose    1


sip_elbc    setze ich mal auf no.

Gruß
Elektrolurch


configDB und Windows befreite Zone!

Wzut

OK , du hast wohl die aktuelle V1.71 auch wenn ich nicht weiss warum die Zeilenummern nicht so recht passen.
Konnte auf jeden Fall deinen Fehler jetzt nachstellen, Ursache ist dein hinterlegter Text im Attribut sip_audiofile_call.
Ursprünglich war da eigentlich nur ein echtes Audiofile erlaubt und kein Text und genau da klemmt es wohl bei dir z.Z.
Abhilfe bis zur nächsten Version :
Schau dir bitte mal meine Antwort Nummer 500 hier im Thread an -> https://forum.fhem.de/index.php/topic,67443.msg727413.html#msg727413
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

Update : Ich habe eben die version 1.75 hochgeladen
Die großen Änderungen :
alle Attribute die mit sip_audiofile_ beginnen dürfen ab sofort einen Inhalt der folgenden Form haben :
a. ein .alw oder .ulaw Filename inklusive Pfad
b. ein .mp3 File + Pfad -> wird dann automatisch zu .ulaw gewandelt , Audio Konverter & Schreibrechte im Pfad sind Pflicht
c. ein Text beginnend mit ! der von Text2Speach in eine .mp3 Datei gewandelt wird, diese wird danach behandelt wie unter Punkt b.

wurde Punkt b. oder c. einmal erfolgreich durchlaufen wird beim nächsten Mal direkt die erzeugte .ulaw Datei verwendet.

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Rewe2000

Hallo Wzut,

zunächst mal dir und allen Mitlesern alles Gute in 2018.

Bedeutet das jetzt, dass dein Hinweis https://forum.fhem.de/index.php/topic,67443.msg727413.html#msg727413 der Vergangenheit angehört und SIP jetzt selbst erkennt ob ein Text schon mal übersetzt wurde?

Oder hab ich da etwas falsch verstanden.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Wzut

ja und nein :)
wenn du direkt eine mp3 Datei angibst schaut das SIP Modul zuerst nach ob es die unter dem gleichen Namen auch als .alaw gibt, wenn ja spart man sich die erneute Konvertierung mit sox oder ffmeg. Gibt man allerdings einen Text an, so muss immer T2S zuerst gefragt werden wie denn z.B. !Das ist ein test in dieses lange Zahlenformat
übersetzt werden soll , die Antwort ist dann ja eine mp3 Datei und dann gilt wieder das oben geschriebene.
Ich muss mal schauen wie Tobias im T2S Modul aus dem Text diese eindeutige lange Nummer bastelt , wenn ich das "klauen" könnte, dann wäre es möglich direkt ersteimal selbst im cache nachzuschauen ohne zuerst T2S aufzurufen ... hmmm wieder so ne Idee und ich dachte wirklich schon da gibt es nichts mehr am Modul zu schrauben.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Rewe2000

Hallo Wzut,

danke für die ausführliche Erklärung.

Da denke ich solltest du dir die Mühe sparen, es besteht ja nach wie vor die Möglichkeit (bei Leistungsschwachen Systemen) die bereits übersetzte .ulaw Datei beim set.. Aufruf zu verwenden.

Ich verwende SIP derzeit auf einem RASPI3 nur mit direkten Textangaben (!Text..), der Raspi übersetzt diesen Text ohne dass ich bisher die Notwendigkeit gesehen habe, auf .ulaw Datei umzustellen.

Aber ich kenne das ja auch, irgendwann sucht man sich immer wieder neue Herausforderungen ;)

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

wmeiners

Hallo Wzut,

nach langer Zeit habe ich in meinen alten Thread zum FB_SIP.pm Modul geschaut und war erstaunt, welche Dynamik sich daraus entwickelt hat. Ich benötigte es damals nur für einen Alarmanruf, die nähere Information zum Ereignis hatte ich per Telegram bekommen. Daher der Stillstand.

Ich wünsche dir alles Beste für die Weiterentwicklung.

Liebe Grüße
Werner
FHEM auf Raspberry Pi 3
2x cul (FS20, Homematic)
USV Selbstbau

Wzut

Hallo Werner, ja das Thema Dynamik ist wirklich immer wieder erstaunlich bei FHEM.
IMHO bedarf es dafür aber zwei Seiten, auf der einen Seite die User die ständig mit irgendwelchen abgefahrenen Ideen oder Problemen um die Ecke kommen und auf der anderen Seite natürlich Entwickler die verrückt genug sind das auch alles zeitnah umzusetzen. An der Stelle möchte ich nochmal ganz klar betonen das ohne deine Pionierarbeit es das heutige SIP Modul gar nicht geben würde und ohne die aktive Mitarbeit der User schon gar nicht mit diesem Funktionsumfang.     
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Auch von mir besten Dank. Die letzte "abgefahrene" Idee war, dass ich mein fhem anrufe und der mir einen ausführlichen Report über Fenster, Heizung, Solaranlage, Wetter usw. liefert. Auf Grund der Nummer, die anruft, Uhrzeit und ev. Feiertag, erfolgt die Ansage auch noch personalisiert, zum Staunen aller Computer-Unkundiger!

Gruß

Elektrolurch
configDB und Windows befreite Zone!

Wzut

@Elektrolurch, da packt mich (und vermutlich noch andere) die Neugier.
Wärst du bitte so nett das mit dem ausführlichen Report etwas mehr im Detail hier zu veröffentlichen ?   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

ok.
1. Meine sip-Instanz heisst sip, dafür ein notify definieren.

define notify sip_not sip:.* {sip_not($NAME,$EVENT)}

Die sip-Instanz habe ich wie folgt eingestellt:

T2S_Device tts
audio_converter sox
sip_audiofile_call !Zur Zeit können keine Anrufe angenommen werden
sip_audiofile_wfp /media/Sonos/speak/report.alaw
sip_call_audio_delay 1.75
sip_dtmf_loop once
sip_dtmf_send audio
sip_dtmf_size 2
sip_elbc no
sip_force_interval 300
sip_from sip:fhemfhem@fritz.box
sip_ip 192.168.1.16
sip_listen wfp
sip_port 5060
sip_registrar fritz.box
sip_ringtime 2
sip_user fhemfhem
verbose 1

Wichtig: ringtime steht auf 2 und es ist für den eingehenden Anruf eine feste Audio-Datei eingestellt, die aber zwischen klingeln und Gespräch annehmen neu generiert wird (sub sip_report)
Das notify führt folgendes aus:

sub sip_not($$)
{
my ($name,$event) = @_;
my ($rd,$val) = split(' ',$event);
($rd) = split(':',$rd);
$val = '' if(!$val);
Log3($name,3,"sip_not: $name rd $rd val $val");
if($rd eq 'caller')
{
return undef if($val eq 'none');
fhem("set tts1 tts " .
   sip_report($val));
} # if caller
return undef;
} # end sub sip_not

Die sip_report nimmt nur Anrufe von bekannten Telefonen an:

sub sip_report($)
{
my ($caller) = @_;
my $res = "Guten Tag ";
return "" if($caller eq 'none');
my (undef,$min,$hour) = localtime(time());
# Namen der Anrufer sind bekannt
if($caller =~m/(Tochter|Sohn|Mama|Papa)/)
{
$res = "Guten morgen " if($hour < 11);
$res = "Hallo " if($hour >= 11 && $hour <= 17);
$res = "Guten Abend " if($hour > 17);

$res .= "$caller, hier ist Dein Speicherknecht mit dem Bericht von $hour Uhr$min. ";
my $alarmstatus = Value('Alarm_innen');
$res .= "Die Alarmanlage ist $alarmstatus. ";
if($alarmstatus eq 'scharf')
{
my $sender = ReadingsVal('Alarm_innen','Sender',undef);
$res .= "Es wurde Alarm um " . ReadingsTime('Alarm_innen','Sender',1) . " von " .
"$sender ausgelöst. " if($sender);
} # Alarm ausgelöst

$res .= "Im Garten war jemand um " . ReadingsTime('Ga_Bewegungsmelder','state',1) .
" und an der Haustür um " . ReadingsTime('VG_Bewegungsmelder','state',1) . ". ";

my $anwesend = 0;
# Fenster
my @rooms =map({(ReadingsVal($_,'Window','') eq 'Open') ? (GetRoom($_)):()} devspec2array("TYPE=CUL_FHTTK"));
if(@rooms)
{
$res .= "Im " . HumanList(@rooms) . " sind Fenster offen. ";
}

# Beleuchtung
my %rooms = map({(ReadingsVal($_,'state','') =~m/on/) ? (GetRoom($_),$_):()} devspec2array("group=Beleuchtung"));
@rooms = sort keys %rooms;
if(@rooms)
{
$res .= "Im " . HumanList(@rooms) . " ist das Licht an. ";
$anwesend = 1;
}

# Audio und Video
@rooms = map({(ReadingsVal($_,'state','') eq 'on') ? ($_):()} devspec2array(".._Media"));
if(@rooms)
{
$anwesend = 1;
# Log(1,join(' ',@rooms));
foreach my $r (@rooms)
{
if($r eq 'Ku_Media')
{
$res .= "In der Küche wird " .
ReadingsVal('Ku_Player','favorites','Musik') .
" gehört. ";
}
elsif($r =~m/(Wz|Hb)_Media/)
{
my $receiver = $1 . '_Receiver';
$res .= "Im " . GetRoom($r) . " wird im " .
ReadingsVal($receiver,'channel','nicht gefunden') . " die Sendung " .
ReadingsVal($receiver,'eventname','unbekanntes Programm') . " angeschaut. ";
} # TV
else
{
$res .= "Im " . GetRoom($r) . " wird Musik gehört. ";
} # else


} # foreach

} # Audo und Video

if(!$anwesend)
{
my %bews = map({(ReadingsAge($_,'state',0),GetRoom($_))}
devspec2array("[EO]G.*_Bewegungsmelder.*"));

my $mintime = minNum(999999,(keys %bews));
# Log(1,"mintime $mintime " . join(' ',%bews));

if($mintime > 10000)
{
$res .= "Es scheint niemand zu Hause zu sein. ";
} # niemand da
else
{
$res .= "Den letzten habe ich vor " .
sprintf("%d",$mintime / 60) .
" Minuten im " .
$bews{$mintime} .
" gesehen. ";
}
} # Bewegungsmelder innen

my @persons = split(' ',ReadingsVal('Abwesend','Anwesend',''));
if(@persons)
{
$res .= HumanList(@persons) . " sind seit " .
ReadingsTime('Abwesend','Anwesend',1) . " zu Hause. ";
} # personen mit Handy eingebucht im WLan

@persons = split(' ',ReadingsVal('Abwesend','Abwesend',''));
if(@persons)
{
my $ahash = $defs{Abwesend};
foreach my $p (@persons)
{
$res .= $p . " ist seit " .
HumanTime($ahash->{Abwesend}{$p},1) . ", ";
} # foreach p
$res .= " nicht zu Hause. ";
} # personen mit Handy nicht eingebucht im WLan


# Heizung
my $laufzeit = sprintf("%d",ReadingsVal('HzAnlage','Brennerlaufzeit-heute',0));
my $verbrauch = sprintf("%d", ReadingsVal('HzAnlage','Gas-Verbrauch',0) + 0.5);


my $fehler = ReadingsVal('HzAnlage','Fehler','');
if($fehler ne 'fehlerfrei')
{
$res .= "Die Heizungsanlage meldet $fehler. ";
} # if fehler
my $betriebsart = ReadingsVal('HzAnlage','Hk2-Betriebsart','nicht gefunden');
$res .= "Die Heizung steht auf $betriebsart Betrieb. ";
$res .= "Die Vorlaftemperatur beträgt " . ReadingsVal('HzAnlage','Hk2-Normal-VL-Soll','nicht gefunden') . " Grad. " if($betriebsart eq 'Normal');
$res .= "Der Gasverbrauch beträgt $verbrauch Kubik bei einer Laufzeit von $laufzeit Minuten. " if($verbrauch);

# Solaranlage
my $solarstatus = ReadingsVal('HzAnlage','Status-DTR','nicht gefunden');
if($solarstatus eq 'Ertrag')
{
my $ertrag = sprintf("%d",ReadingsVal('HzAnlage','Tagesertrag',0) + 0.5);
my $kollektor = sprintf("%d",ReadingsVal('HzAnlage','Temp-Kollektor',0) + 0.5);
$res .= "Der Ertrag der Solaranlage beträgt $ertrag Kilowatt bei einer Kollektortemperatur von $kollektor Grad Celsius. ";
} # Solarstatus

# Wetter

$res .= "Das Wetter ist " . ReadingsVal('Wetter','condition','nicht gefunden') . ". ";
$res .= "Die Temperatur Aussen beträgt  " .
sprintf("%d",ReadingsVal('Wetter','Temperatur',0) + 0.5) . " Grad Celsius. ";
$res .= "Dabei war das Minimum  " .
sprintf("%d",ReadingsVal('Wetter','Min-Temperatur',0) - 0.5) . " und das Maximum " .
sprintf("%d",ReadingsVal('Wetter','Max-Temperatur',-100) + 0.5) . " und ";
$res .= "im Haus ist es " .
sprintf("%d",ReadingsVal('PID','Innentemperatur',0) + 0.5) . " Grad warm. ";


# Tschuess
$res .= "$caller, ";
if($hour < 18)
{
my $t = Value('bayern');
my $tag = 'einen schönen Tag';
if($t ne 'none')
{
if($t =~m/tag/i)
{
$tag = "einen schönen $t";
}
else
{
$tag = "ein schönes $t";
} # else
} # not none

$res .= "ich wünsche Dir noch $tag! ";
} # tag

$res .= "ich wünsche Dir noch einen  geruhsamen Abend! " if($hour >= 18 && $hour < 22);
$res .= "ich wünsche Dir eine gute Nacht! " if($hour >= 22 );

} # bekannter Anrufer
else
{
$res = "Zur Zeit kann kein Anruf entgegengenommen werden. ";
} # unknown
# Log(1,"caller $caller\n$res");

return $res;
} # end sub sip_report
#################################


ReadingsTime und Humantime geben Zeit/Datum aus, z.B. jetzt, vor kurzem vor 2 Minuten, vor 3 Stunden, gestern um 13:05 Uhr usw.
HumanList gibt eine Liste aus, wobei die letzten zwei Elemente sprachlich mit einem "und" verbunden werden.

Okay. Soweit zur "Anregung". er Vorführeffekt ist jedenfalls schon mal da....

Hier mal ein Beispiel:
Guten Abend Papa, hier ist Dein Speicherknecht mit dem Bericht von 18 Uhr37. Die Alarmanlage ist aus. Im Garten war jemand um 17 Uhr 45 und an der Haustür um 18 Uhr 16. Im Küche und OG1 ist das Licht an. Mama und Papa sind seit 18 Uhr 29 zu Hause. Die Heizung steht auf Normal Betrieb. Die Vorlaftemperatur beträgt 51 Grad. Der Gasverbrauch beträgt 8 Kubik bei einer Laufzeit von 182 Minuten. Das Wetter ist Schauer. Die Temperatur Aussen beträgt 8 Grad Celsius. Dabei war das Minimum 3 und das Maximum 8 und im Haus ist es 19 Grad warm. Papa, ich wünsche Dir noch einen geruhsamen Abend!

Elektrolurch
configDB und Windows befreite Zone!

Wzut

WOW , ich bin beeindruckt !
Ich kann mir gut vorstellen das so eine Lösung für dich/euch um ein Vielfaches  effektiver ist als eine FHEM Statusseite mit dem Screenreader aufzurufen.
Einen Vorschlag hätte ich für dich allerdings noch, lies dir mal im Wiki den Abschnitt über sip_blocking und sip_filter durch.
Du könntest  Anrufer die nicht zu deiner Familie gehören auch gleich im Modul ignorieren.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Elektrolurch

Hallo Wzut,

Zitat:
sip_blocking und sip_filter durch.

Hatte ich gelesen. Aber ein unerwünschter Anrufer erhält ja bei jmir auch eine Mitteilung, dass der Anruf derzeit nicht angenommen werden kann.
Ich hatte mir die sip-Events angesehen und dabei ja festgestellt, dass die anrufenden Telefonnumern  wohl durch die FB mit Hilfe des dort gespeicherten Adressbuches um die Namen ergänzt werden. Da bei uns die NSt, Geschäfts-, Handy und sonstigen Privatnummern in der FB abgelegt sind, war das mit den Namen zu filtern ja auch nur eine Zeile Code.

Elektrolurch
configDB und Windows befreite Zone!

JoWiemann

Hallo,

angeregt durch Elektrolurch habe ich das notify etwas anders gestaltet. Lag einfach daran, dass ich nicht erkennen konnte, wie er die mp3 nach alaw konvertiert.

Mein SIP Device heißt: FritzSip


FritzSip:*.* {
   my ($rd,$val) = split(' ',$EVENT);

   ($rd) = split(':',$rd);
   $val = '' if(!$val);

   Log3 $NAME, 4, "$SELF: $NAME rd $rd val $val";
   
   if($rd eq 'caller' && $val ne 'none') {
      my $t2s_name = AttrVal($NAME, "T2S_Device", undef);

#   Hier wieder Funktionsaufruf aktivieren
#      fhem("set $t2s_name tts " . sip_report($val));

#   Das ist nur zum Testen
      fhem("set $t2s_name tts " . "Das ist ein super super Test");
 
  # wait a little for being ready
  sleep(0.5);
   
      my $file      = ReadingsVal($t2s_name, "lastFilename", "");
      my $out       = AttrVal($NAME, "sip_audiofile_wfp", undef);
      my $converter = AttrVal($NAME, "audio_converter", "");
      my $res       = qx(which $converter);
 
      $res =~ s/\n//;
      $res = ($res) ? $res : undef;
   
      my $cmd = $res . " " . $file . " -t raw -r 8000 -c 1 -e a-law " . $out;
      Log3 $NAME, 3, "$SELF: calling converter with: $cmd";
      my $ret = qx($cmd);
   
      if ($ret) {
         Log3 $NAME, 3, "$SELF: error with $converter: $ret";

      } else {
 
         $cmd = "rm " . $file;
         $ret = qx($cmd);
   
         if ($ret) {
            Log3 $NAME, 3, "$SELF: error while deleting: $file";
         } else {
            Log3 $NAME, 3, "$SELF: deleted: $file";  
     }
  }
   } # if caller

}
[Code]

Hoffe es gefällt.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM