Enviroment-Variable in Asterisk nutzen

Manne44

Neuer User
Mitglied seit
30 Mai 2014
Beiträge
59
Punkte für Reaktionen
1
Punkte
8
Hallo,
ich habe mal wieder ein Problem, das ich nach langem Probieren aufgrund fehlender Kenntnisse und Beispiele allein nicht lösen kann:
Und zwar habe ich mir ein VideoDoorPhone mit einer Grandstream-Kamera aufgebaut, die sowohl Mikrofon und Lautsprecher enthält und in einer entfernten Torsäule eingebaut ist. Wird nun dort geklingelt, dann läuten alle Telefone, es wird die Ansage "Guten Tag, einen Augenblick bitte ..." ausgegeben und 1 Minute ein Musikstück abgespielt. Wenn ich mich innerhalb dieser Zeit nicht gemeldet habe, dann bin ich wahrscheinlich nicht zu Hause und es wird die Ansage ausgegeben: "Entschuldigen Sie die Wartezeit, aber ich bin leider nicht zu Hause. Wenn Sie ein Paket oder Päckchen haben ... usw.". Das funktioniert auch sehr zuverlässig.
Nun habe ich aber auch eine SmartHome-SW (FHEM) auf dem Banana Pi neben Asterisk laufen, mit der u.a. auch die Anwesenheit meines Autos genau feststellt wird. Meine Idee war die, daß ich aus FHEM dann eine Umgebungsvariable z.B. CAR_AT_HOME mit absent oder present setze und je nach Zustand in Asterisk für die Ansagetexte abfrage. Aber das funktioniert überhaupt nicht. Sehr viele Notationsversuche mit verschiedenen Schreibweisen habe ich ausprobiert, die entweder alle fehlerhaft waren oder immer zum gleichen Text führten.

Folgende Testversion habe ich:
Code:
exten => 602,1,NoOp(Das hier ist ein Testfall: Call 602)
exten => 602,n,GotoIf($[${ENV(CAR_AT_HOME)} = present]?ok:away)
exten => 602,n(ok),Wait(1)
exten => 602,n,Playback(say_present)
exten => 602,n,Hangup()
exten => 602,n(away),Wait(1)
exten => 602,n,Playback(say_absent)
exten => 602,n,Hangup()

Wer kann ohne große Mühe sofort sehen was da falsch ist? CAR_AT_HOME=present und ausgegeben wird immer der Text say_absent, eigentlich egal wie die Umgebungsvariable steht, immer der gleiche Text.
Vielen Dank schon mal allein für das Lesen.
 
Die Variable wird dann vor dem Start von Asterisk für durch FHEM gesetzt und bleibt so? Ich bin etwas verblüfft, wobei das (wenn man es mit einem "export" vor dem Asterisk-Aufruf verbindet, solange es nicht nur für diese eine Instanz gelten soll) ja tatsächlich möglich wäre - aber eben nur dann, wenn solche Asterisk-Instanzen "on demand" starten.

Ich würde erst mal als Test die Bedingung umdrehen (also auf "absent" testen und die Sprungziele tauschen) ... wenn dann immer "say_present" kommt, liegt es wohl eher an der fehlenden/falschen Environment-Variablen.

Dann würde ich doch eher mit einer globalen Variablen im Asterisk arbeiten (wenn das als Instanz durchläuft) und diese ggf. vom FHEM per Call-File entsprechend setzen lassen oder sogar über AMI (mit einem kleinen Skript und "nc", das Setzen kann z.B. "ManagerAction_SetVar" übernehmen) direkt setzen.
 
Zuletzt bearbeitet:
Die Enviroment-Variable muß immer aktuell gelesen werden, weil Asterisk immer läuft. Ich hatte schon alles hin- und hergedreht, aber kein richtiges Ergebnis bekommen.
Die anderen Vorschläge würde ich gern probieren, ich weiß nur nicht wie, denn eigentlich habe ich vom Asterisk wenig Kenntnisse. Benutze ich ausschließlich für das VideoDoorPhone.

- - - Aktualisiert - - -

Die Enviroment-Variable müßig immer aktuell gelesen werden, weil Asterisk immer läuft. Ich hatte schon alles hin- und hergedreht, aber kein richtiges Ergebnis bekommen.
Die anderen Vorschläge würde ich gern probieren, ich weiß nur nicht wie, denn eigentlich habe ich vom Asterisk wenig Kenntnisse. Benutze ich ausschließlich für das VideoDoorPhone.
Offenbar ist in der Notation irgend ein Fehler. Ich finde aber kein Beispiel.
 
So funktionieren aber Environment-Variablen nicht. Die können mehr oder weniger nur "vererbt" werden ... es muß also irgendein "Vater"-Prozess diese Variable setzen und dann erben alle "Kinder" diesen Namen und den Wert und die eigene Instanz kann diesen ebenfalls verwenden. Setzt jetzt irgendeines dieser "Kinder" seinerseits einen anderen Wert, hat das auf die Variable im "Vater" (oder auch in irgendwelchen "Geschwistern") keinerlei Einfluß.

Für Deinen Zweck taugen also Environment-Variablen, die vom PHP-Prozess als Basis-Instanz von FHEM geändert werden, absolut nicht ... nur irgendwelche nach diesem Setzen neu gestarteten "Kind"-Prozesse würden eine solche Änderung überhaupt "sehen".

Wenn Du ansonsten von Asterisk keine Ahnung hast, kannst Du Dich ja trotzdem "schlaumachen" ... das Stichwort "AMI" für "Asterisk Management Interface" (eine textbasierte Netzwerkschnittstelle zur ... der Name sagt es schon ... Verwaltung einer Asterisk-Instanz) hast Du bereits und die Abfrage einer globalen Variablen im Dialplan ist im Netz genauso oft dokumentiert wie die Syntax für ein "ManagerAction_SetVar". Bliebe also eventuell noch das Problem, wie man mit einer Netzwerkschnittstelle von der Kommandozeile aus kommuniziert und auch da hast Du mit "nc" eigentlich bereits das richtige Stichwort (bzw. zumindest eines, denn es gibt auch andere Möglichkeiten) erhalten.

An Deinem Dialplan brauchst Du jedenfalls nicht weiter herumzudoktern ... das ist einfach der falsche Ansatz für eine Variable, die sich ändern kann, während die Asterisk-Instanz läuft. Es gäbe neben globalen Variablen auch noch andere Lösungen (bis hin zur Datenbank), aber so eine globale Variable ist dann (inkl. der Möglichkeit, sie mit einem anderen Wert zu versehen) immer noch die einfachste Lösung.
 
Das mit den Environment-Variablen scheine ich verstanden zu haben, geht so also nicht, war aber zuerst mein erster Ansatz. Was ist "nc"? Kann ich auch nirgends finden. Nach weiteren Suchsitzungen und weiterem "schlaumachen" - wobei ich kein Sip- oder Asterisk-Experte bin und auch sein will, meine Kenntnisse sind rudimentär - habe ich eine sehr einfache Möglichkeit gefunden, mit der man zwei verschiedene Zustände in Asterisk abprüfen kann.
Im Dialplan wird beim Klingeln - hier nur testweise - geprüft, ob eine Datei vorhanden ist oder nicht. Wenn das Auto in der Garage steht wird die Datei /opt/fhem/car_at_home erzeugt bzw. mit mv dummy car_at_home umbenannt, was in FHEM easy ist. In Asterisk wird nur das Vorhandensein der Datei geprüft:

Code:
exten => 602,1,NoOp(Das hier ist ein Testfall: Call 602)
exten => 602,n,Set(result=${SHELL(test -f /opt/fhem/car_at_home && echo -n 1 || echo -n 0)})
exten => 602,n,NoOp(result is ${result})

exten => 602,n,GotoIf(${result} = 1]?home:away)

exten => 602,n(home),NoOp(result is home});
exten => 602,n,Playback(start)
exten => 602,n,Hangup()

exten => 602,n(away),NoOp(result is away})
exten => 602,n,Playback(ende)
exten => 602,n,Hangup()

Nach ersten Tests scheint das auch zuverlässig zu funktionieren. Einfach, aber für mich ausreichend, mehr will ich nicht.
Vielen Dank für die Unterstützung.
 

Neueste Beiträge

Statistik des Forums

Themen
244,872
Beiträge
2,219,916
Mitglieder
371,594
Neuestes Mitglied
AA-Idealbau
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.