NEWS
Anrufer Ansage FritzBox / SayIt
-
Hallo zusammen,
ich hätte da mal zwei Probleme….
Ich versuche gerade von CCU.IO auf ioBroker zu migrieren. Nun hab ich mich mal ran gesetzt und versucht die bestehenden Scripte neu zu schreiben. Leider kenne ich mich mit JS nun so überhaupt nicht aus. Bei CCU.IO war das doch etwas einfacher mit dem Scripteditor. :roll:
Das folgende Script soll mir beim Eingang eines Anrufes den Anrufer ansagen:
var AnrufErkannt ="fritzbox.0.calls.ring"; on (AnrufErkannt, function data() { var varAnrufer = getState("fritzbox.0.calls.ringActualNumbers").val; var varAnrufText = ("Anruf von " + varAnrufer +"!"); setState("sayit.0.tts.text", varAnrufText ); });
Klappt nach langem rumprobieren auch. Nur…..
1. Sagt es beim Eingang des Anrufes nur "Anruf von " an
2. Sagt es beim Beenden dann nocheinmal "Anruf von <jetztmitrichtigernummer>" an
Warum nur? Wo liegt mein Denkfehler?
Ein zweites Problem ist wahrscheinlich weniger ein Problem, sondern eher eine Funktion die wohl noch nicht implementiert ist.
So hat unter CCU.IO der Fritz-Adapter die Möglichkeit gehabt Nummer zu Namen zuzuordnen. Das scheint im Moment wohl noch nicht zu gehen, richtig?
Danke für eure Hilfe!
Dragonius</jetztmitrichtigernummer>
6305_azimut.jpg -
Hi,
versuch mal:
var Anrufer = "fritzbox.0.calls.ringActualNumber"; // actual last ringing number on ({id: Anrufer, valGe: 1}, AusgabeAnrufer); function AusgabeAnrufer(){ setState("sayit.0.tts.text", "Anruf von. " + getState(Anrufer).val); }
Gruß
Phantomio
-
Danke!
Das klappt schon mal prima!!
Und ich hab mir da so einen bei abgebrochen…...
Wäre schön wenn die Namenszuordnung im Fritz-Adapter dann auch irgendwann möglich wäre.
Gruß
Dragonius
-
Danke!
Das klappt schon mal prima!!
Und ich hab mir da so einen bei abgebrochen…...
Wäre schön wenn die Namenszuordnung im Fritz-Adapter dann auch irgendwann möglich wäre.
Gruß
Dragonius `
Anbei mit Telefonbuch im Script und Ansage des Namens (ungetestet).
var telefonbuchRufnummerNichtBekannt = "Rufnummer nicht im Telefonbuch"; var telefonbuchRufnummer = { "021147114711": { "name": "Michael Handy", // name zur Rufnummer "bemerkung": "Reserve" // optional }, "051147110815": {"name":"Hänschen Klein"}, "07114711471": {"name":"Gustav Gans Handy"}, "089123456789": {"name":"Vanessa Müller"}, "030200020001": {"name":"Gabi Kösters"}, "### ? ###": {"name":"Rufnummer unterdrückt"} }; function rufnummer2name (rufnummer) { var name = ""; //rufnummer = rufnummer.replace("#",""); //rufnummer = rufnummer.replace("*",""); if (!telefonbuchRufnummer[rufnummer]) { // undefinierte Rufnummern name = telefonbuchRufnummerNichtBekannt; // undefinierte Rufnummern } else { name = telefonbuchRufnummer[rufnummer].name; } return name; } var Anrufer = "fritzbox.0.calls.ringActualNumber"; // actual last ringing number on ({id: Anrufer, valGe: 1}, AusgabeAnrufer); function AusgabeAnrufer(){ //setState("sayit.0.tts.text", "Anruf von. " + getState(Anrufer).val); setState("sayit.0.tts.text", "Anruf von. " + rufnummer2name(getState(Anrufer).val)); }
Ich nutze den oberen Part (JSON und die Funktion rufnummer2name()) als globales Script und nutze es in verschiedenen weiteren Scripts (Ereignisliste, Ansage des Anrufernamen, usw.).
6305_sonnenstand.jpg -
Es gibt doch einen Adapter vCard, der meinem Verständnis nach Telefonbuch Einträge zuordnen soll. Habe ich nicht im Einsatz, findest Du aber hier im Forum.
-
Danke, Danke!
Hat Super geklappt. Und so schnell. Wow…..
Ich hätte da noch ne Frage (Vielleicht schaffe ich dann auch was alleine...):
Ich krieg das mit den Variablen nicht hin. :evil:
Ich weiß das man Datenpunkte nicht direkt auslesen kann. Wenn ich mir andere Scripte anschaue, wird das über einen Zwischenschritt gelöst:
zB.
var varWatt ='hm-rpc.0.LEQ0529875.2.POWER'
Gut. Damit steht jetzt hm-rpc.0.LEQ0529875.2.POWER in der Variablen varWatt. Aber wie kann ich das weiterverarbeiten? Wie bekomme ich letztlich den Wert ausgelesen? Und was hat es mit .val auf sich?
Ich bräuchte da mal etwas "Starthilfe"…..
Oder gibt es irgendwo ein gutes, deutsches Wiki?
Gruß
Dragonius
-
Hallo Dragonius,
// Objekt in Variable packen var varWatt ='hm-rpc.0.LEQ0529875.2.POWER'; // Wert des Objektes auslesen und in neuer Variable speichern var leistung = getState(varWatt).val; // weiterverwerten ... log(leistung);
weitere Werte, die du aus dem Objekt auslesen kannst, findest du https://github.com/iobroker/ioBroker.javascript/blob/master/README.md#on–-subscribe-on-changes-or-updates-of-some-state
Gruß
Pix
-
ich bin begeistert! Das ging ja wieder schnell!
Vielen Dank für die Hilfe. Ich hoffe jetzt komme ich mal ein wenig alleine weiter!
-
Hast Du die Namenauflösung über den vCard Adapter oder über die Funktion rufnummer2name() in dem Script oben?
Den vCard Adapter hab ich mir noch nicht angeschaut.
-
Moinsen,
ich hab das über die Funktion gelöst. Läuft prima. Danke nochmal!
Gesendet von meinem iPhone mit Tapatalk
-
Hallo Zusammen,
ich hätte zu dem Thema Ansage FritzBox / SayIt noch eine kleine Frage:
Ich habe das oben eingestellte Skript von ruhr70 (vielen Dank auch mal von meiner Seite aus)
an meine eigene Wünsche angepasst und bin somit zufrieden.
Nun zu meiner Frage:
Besteht eine Möglichkeit das Skript so anzupassen, das es auf die Eigene Nummer reagiert ?
Sprich: Ein Anruf am Gerät mit der Eigenen Nummer XY geht ein dann Skript ausführen.
Ich habe mir schon die Objekte vom Fritzbox Adapter angeschaut konnte aber jetzt nicht
feststellen ob eine direkte Abfrage der Eigenen Nummer möglich ist.
Vielleicht hat ja einer von Euch eine Idee.
Im voraus schon mal vielen Dank für Eure Bemühungen und einen angenehmen Nachmittag / Abend.
Viele Grüße
nobob
-
Hallo nobob
schau mal unterhttp://forum.iobroker.net/viewtopic.php … t=fritzbox
da hat hometm sowas geschrieben
Gruß Stephan
-
Nun zu meiner Frage:
Besteht eine Möglichkeit das Skript so anzupassen, das es auf die Eigene Nummer reagiert ?
Sprich: Ein Anruf am Gerät mit der Eigenen Nummer XY geht ein dann Skript ausführen.
Ich habe mir schon die Objekte vom Fritzbox Adapter angeschaut konnte aber jetzt nicht
feststellen ob eine direkte Abfrage der Eigenen Nummer möglich ist. `
Ich weiß nicht, ob ich es richtig verstanden habe…
Du willst etwas machen, sobald Du einen Anruf von einer eigenen Nummer (intern?, extern?) erhälst?
var Anrufer = "fritzbox.0.calls.ringActualNumber"; // actual last ringing number on ({id: Anrufer, valGe: 1}, function(obj) { // ... }
Ansonsten kannst Du bei einem ankommenden Ruf mit if(…) prüfen, ob der Anruf von einer Rufnummer kommt, auf der Du besonders reagieren willst.
-
@stehphan61:
Vielen Dank für Deine Antwort, aber der Link bringt mich bei meiner Angelegenheit nicht wirklich weiter.
Dir ebenfalls vielen Dank für Deine Antwort. Ich glaube Du hast mich nicht ganz richtig verstanden,
oder ich habe es einfach etwas zu kurz erklärt.
Anbei nochmals ein Versuch bei dem ich hoffe dass es jetzt etwas klarer wird.
Ich habe intern 2 Telefonnummern. Einmal eine Telefonnummer: privat1 und die andere privat2.
<u>Folgendes Szenario:</u>
Eingehender Anruf an privat1 -> Ansage des Anrufers über das Skript
Eingehender Anruf an privat2 -> z.B. Keine Ansage.
Über die tabellarische Ansicht (siehe Bild) werden die Rufnummern unter Eig.Nr schon richtig angezeigt.
Allerdings finde ich bei den Objekten im Moment keine Variable wo ich die Eig. Nr. abfragen könnte.
Ich hoffe ich konnte es jetzt etwas klarer Darstellen, aber ich vermute mal,dass hierfür der Fritzbox Adapter erweitert werden müsste.
Ich bin für jede Hilfe dankbar und verbleibe mal mit
Freundlichen Grüßen
nobob
-
Dir ebenfalls vielen Dank für Deine Antwort. Ich glaube Du hast mich nicht ganz richtig verstanden,
oder ich habe es einfach etwas zu kurz erklärt.
Anbei nochmals ein Versuch bei dem ich hoffe dass es jetzt etwas klarer wird.
Ich habe intern 2 Telefonnummern. Einmal eine Telefonnummer: privat1 und die andere privat2.
<u>Folgendes Szenario:</u>
Eingehender Anruf an privat1 -> Ansage des Anrufers über das Skript
Eingehender Anruf an privat2 -> z.B. Keine Ansage.
Über die tabellarische Ansicht (siehe Bild) werden die Rufnummern unter Eig.Nr schon richtig angezeigt.
Allerdings finde ich bei den Objekten im Moment keine Variable wo ich die Eig. Nr. abfragen könnte.
filename="2016-03-04__Tabellarische_Darstellung.jpg" index="0">~~
Ich hoffe ich konnte es jetzt etwas klarer Darstellen, aber ich vermute mal,dass hierfür der Fritzbox Adapter erweitert werden müsste. `
Vielleicht ist mir Deine Anforderung immer noch nicht ganz klar.
Die interne Nummer gibt die Fritzbox erst raus, wenn das Gespräch angenommen wurde.
D.h., wenn mehre Telefone klingeln hast Du keine Chance diese Info aus der Fritzbox herauszubekommen.
Wenn das Gespräch angenommen wurde, gibt die Fritzbox die interne Nummer an, wo das Gespräch angenommen worden ist.
Wenn Du die Ansage in Abhängigkeit der angerufenen Amtsrufnummer abspielen willst, dann geht das auch ohne Erweiterung des Adapters.
Datenpunkt: fritzbox.0.message
Beispiel bei Anruf: "04.03.16 20:08:33;RING;0;017347114711;47124713;SIP1;"
47124713, bzw. SIP1 ist die angerufene Rufnummer.
Hier steht in der Meldung mit RING die angerufene Amtsrufnummer in der Form der Rufnummer und in der Form SIP1, SIP2, usw. drin.
Auf diese Meldung kannst Du beim Anruf reagieren und den String per Javascript auswerten. D.h. Nur weiterverarbeiten, wenn RING in der Meldung drinsteht. Und dann den String nach der angerufenen Nummer durchsuchen.
-
Vielen Dank für Deine Antwort. Ich glaube mit dem Datenpunkt ´fritzbox.0.message´
und Deinem Hinweis mit dem String auslesen per Javascript könnte ich mal mein Glück
versuchen
.
Diesen Datenpunkt habe ich mir gar nicht so genau angesehen. Vielen Dank für den Hinweis.
Bei weiteren Frage melde ich mich dementsprechend hier im Forum.
Ich verbleibe dann mal mit vielen Grüßen und wünsche noch einen angenehmen Samstag Nachmittag
nobob
-
Hallo Miteinander,
dank dem Vorschlag von ruhr70 habe ich das Skript nach meinen Wünschen angepasst und es erfüllt seinen Zweck.
Da ich Euch das Script nicht vorenthalten möchte hier mein angepasstes Skript (allerdings ohne offizelle Daten)
! ````
/*
..........Anrufer Ansage Fritzbox / SayIT rev00
..........Datum: Im Forum Verfasst 2016-02-23, 00:39
..........Autor: ruhr70
..........Forum ioBroker
..........http://forum.iobroker.net/viewtopic.php?f=21&t=2328
..........
..........Änderungshistorie
..........-----------------
..........Anrufer Ansage Fritzbox / SayIT rev01
..........Datum: 2016-03-08
..........Bearbeiter : nobob
..........Änderung: Bei Verwendung von unterschiedlichen Telefonnummern (z.B. Privat_1, Privat_2,
....................Fax etc.) abfragen auf welcher Rufnummer der externe Anruf eingeht und über
....................unterschiedliche SayIT Adapter den Anruf ansagen.
*/
! // #################################################################################################
// # Einstellungsbereich ANFANG
// #
! // Telefonbuch (Dummy Daten)
var telefonbuchRufnummer =
{ "051147110815": {"name":"Hänschen Klein"},
"07114711471": {"name":"Gustav Gans Handy"},"### ? ###": {"name":"Rufnummer unterdrückt"} };
! // Variable für den Einleitungstext
var TextBeginn = "Anruf von. ";// Variable wenn die Rufnummer nicht im Telefonbuch vorhanden ist var telefonbuchRufnummerNichtBekannt = "Unbekannt. Nummer nicht vorhanden";
! // Variable für die aktuell anrufende Rufnummer (Fritzbox Adapter X (hier: Adapter 0))
var Anrufer = "fritzbox.0.calls.ringActualNumber"; // actual last ringing number
! // Variable für den FritzBox Message String / Datenpunkt
var FritzMessage = 'fritzbox.0.message';
! // Variablen für die Information zum Auslesen aus dem Datenpunkt ´fritzbox.0.message´
var AktiverAnruf = new RegExp("RING"); // String /RING/ in Variable für *.match Auswertung
var TelefonNr_1 = new RegExp("xxxxx"); // 1. Telefonnummer (String /xxxxx/ in Variable)
var TelefonNr_2 = new RegExp("yyyyy"); // 2. Telefonnummer (String /yyyyy/ in Variable)// Variablen für die benötigte If Abfrage (feste Vergleichs-Werte) var Standard_1 = "RING"; // String für einen aktuellen Anruf var Standard_2 = "xxxxx"; // Standard für den 1\. Vergleich var Standard_3 = "yyyyy"; // Standard für den 2\. Vergleich (wenn gewünscht)
! // Variable für die Sprachausgabe (SayIT Adapter X)
// beide eingestellt auf unterschiedliche Sonos Lautsprecher
var SayIT_1_config = "sayit.0.tts."; // ohne weiteren Zusatz, Zusatz wird später im
// Skript angefügt
var SayIT_2_config = "sayit.1.tts.";
! // Lautstaerke fuer die jeweilige Sprachausgabe
var Volume_1 = "10";
var Volume_2 = "20";
! // Texte für Logeinträge
var Log_Vergleich_1 = "Externer Anruf auf der ersten Telefonnummer";
var Log_Vergleich_2 = "Externer Anruf auf der zweiten Telefonnummer";
var Log_Else = "Keine, falsche oder Fax Rufnummer erkannt";
! // #
// # Einstellungsbereich ENDE
// #################################################################################################
! // Text Zuweisung zum jeweiligen SayIT Adapter; Variable wird für die
// Sprachausgabe benötigt
var idSayIT_1 = SayIT_1_config + "text"; // hier der 1. SayIt Adapter
var idSayIT_2 = SayIT_2_config + "text"; // hier der 2.
! // FUNKTION : Auswerten der Rufnummer und vergleichen mit Eintrag im Telefonbuch
! function rufnummer2name (rufnummer) {
var name = ""; // Variable name ablöschen
! if (!telefonbuchRufnummer[rufnummer]) { // Wenn Rufnummer nicht im Telefonbuch
name = telefonbuchRufnummerNichtBekannt; // Oben festgelegter Text in Ausgabevariable
// schreiben
} else {
name = telefonbuchRufnummer[rufnummer].name; // Wenn Rufnummer im Telefonbuch vorhanden
// den oben festgelegten Text unter name
// in Ausgabevariable schreiben
}
return name; // Rückgabewert entweder Telefonbucheintrag
// oder nicht bekannt.
}
! // FUNKTION : Sprachausgabe über SayIT Adapter
! function AusgabeAnrufer() {
// Auswertungen müssen hier erfolgen, da sonst der alte Wert vom Daten-
// punkt ´fritzbox.0.message´ ausgelesen wird.
! // Volumen für die 1. Sprachausgabe setzen
var idVolume_1 = SayIT_1_config + "volume";
setState (idVolume_1, Volume_1); // Volumen auf Wert X setzen
! // Volumen für die weitere Sprachausgabe setzen
var idVolume_2 = SayIT_2_config + "volume";
setState (idVolume_2, Volume_2); // Volumen auf Wert X setzen
! // Aktuellen ´fritzbox.0.message´ Datenpunkt in Variable speichern
// var strInfo = getState('fritzbox.0.message').val;
var strInfo = getState(FritzMessage).val;// Datenpunkt strInfo auf die Zeichenkette RING und Telefonnummer durchsuchen var Vergleich_1 = strInfo.match(AktiverAnruf); var Vergleich_2 = strInfo.match(TelefonNr_1); var Vergleich_3 = strInfo.match(TelefonNr_2);
! // Auswertung auf welcher Nummer angerufen wird mit Sprachausgabe
// auf den jeweiligen Sonos Lautsprechern// Hier Vergleich 1 if (Vergleich_1 == Standard_1 && Vergleich_2 == Standard_2){ setState(idSayIT_1, TextBeginn + rufnummer2name(getState(Anrufer).val)); log(Log_Vergleich_1); } // Hier Vergleich 2 if (Vergleich_1 == Standard_1 && Vergleich_3 == Standard_3){ setState(idSayIT_2, TextBeginn + rufnummer2name(getState(Anrufer).val)); log(Log_Vergleich_2); } else { log(Log_Else); }
}
! // Wenn ein Anruf erkannt wird, die Funktion AusgabeAnrufer abarbeiten
on ({id: Anrufer, valGe: 1}, AusgabeAnrufer);
! ````Da ich mich mit JavaSkript nicht so gut auskenne, vermute ich mal dass man das besser programmieren
könnte, aber für meine Zwecke ist es ausreichend.
Was ich allerdings noch nicht verstehe ist, dass der Logeintrag von else mit eingetragen wird,
wenn der Vergleich 1 zutrifft. Bei Vergleich 2 ist alles in Ordnung.
Vielleicht weiß ja da einer eine Antwort.
In diesem Sinne noch einen angenehmen restlichen Sonntag.
Viele Grüße nobob
-
` > if (Vergleich_1 == Standard_1 && Vergleich_3 == Standard_3){
setState(idSayIT_2, TextBeginn + rufnummer2name(getState(Anrufer).val));
log(Log_Vergleich_2);
}
else {
log(Log_Else);
} `
versuch mal (ohne Gewähr)
if ((Vergleich_1 == Standard_1) && (Vergleich_3 == Standard_3)){ setState(idSayIT_2, TextBeginn + rufnummer2name(getState(Anrufer).val)); log(Log_Vergleich_2); } else { log(Log_Else); }
Gruss Hermann
-
Hallo Hermann,
vielen Dank für Deine Antwort.
Ich werde das mal im laufe der Woche versuchen und
mich dann wieder melden.
Viele Grüße
nobob
-
Hallo Hermann,
wie schon geschrieben habe ich Deinen Vorschlag mal umgesetzt.
Allerdings ist das Verhalten noch genau so wie zuvor.
Bei der ersten If Bedingung wird zusätzlich die Else Bedingung mit
ausgeführt und bei der zweiten ist alles in Ordnung.
Ich kann damit leben, ich Frage mich nur was ich da Falsch mache.
Aber trotzdem vielen Dank für Deinen Vorschlag.
Gruß und einen angenehmen Tag
nobob