[Problem] freePBX: Time-Conditions Kette...wie darstellen "haben wir offen oder geschlossen"?

stindl

Neuer User
Mitglied seit
14 Feb 2009
Beiträge
58
Punkte für Reaktionen
0
Punkte
6
Ich habe die aktuelle FreePBX 14 Distro in einer Virtualbox VM installiert mit Asterisk 13.22.0
FreePBX hat leider bisher keine Möglichkeit, das Resultat einer einfachen TimeConditions-Kette darzustellen. Das was zB bei einer Auerswaldanlage zur Standardfunktion gehört, nämlich Tasten am Telefon mit LED-Anzeige (Dienst, Kein-Dienst und Sonderdienst) ist in FreePBX nicht möglich.
freePBX weiß angeblich erst wenn ein Anruf reinkommt, wohin der Anruf laut aktueller Zeitschaltung (TimeConditions-Kette) geht.

Ich bringe hier mein Praxisbeispiel:
Die Apotheke hat jeden 9.Tag einen 24h Sonderdienst. Ich erstelle also eine Incoming Route die zur ersten TimeCondition zeigt...ich erstelle eine entsprechende TimeCondition SONDERDIENST gekoppelt an einen Sonderdienstkalender im Kalendermodul v freePBX, wo ich einen 24h-Event eintrage, der sich jeden 9. Tag wiederholt.
Diese SONDERDIENST-TimeCondition geht beim Match zum IVR der Apotheke, beim Non-Match gehts zur nächsten TimeCondition welche FEIERTAGE heißt. Diese TimeCondition ist an einen Kalender in FreePBX gekoppelt, der wiederum versorgt wird von einem finnischen Feiertagsgenerator ( http://www.webcal.fi/de-AT/feiertage.php ).
Also wenn kein Sonderdienst ist, dann leitet die FEIERTAGS-TimeCondition beim Match zum Anrufbeantworter und beim Non-Match zur dritten und letzen TimeCondition...nämlich DIENST. Da ist dann eine TimeGroup mit den Standarddienstzeiten Mo-Fr von 8:00-18:00h und Sa von 8:00-12:00h enthalten. Die TimeCondition DIENST leitet also bei einem Match mit den Standarddienstzeiten (wenn nicht schon vorher die TimeCondition SONDERDIENST gematcht wurde bzw. die TimeCondition FEIERTAGE zugeschlagen hat) zum IVR der Apotheke weiter bzw. bei einem Non-Match zum Anrufbeantworter.

So weit so gut. Nun die FRAGE: Wie kann ich an einem Digium, Sangoma oder Cisco Telefon visuell darstellen, ob wir nun offen oder geschlossen haben?

Ich habe 3 BLF Buttons an den Telefonen angelegt, mit den Featurecodes für die TimeConditions
*271 Sonderdienst
*272 Feiertage
*273 Dienst
...das Problem ist nur, man muss hier jedesmal nachdenken, um zu wissen in welchem "Zustand" sich die Anlage befindet.
An einem Feiertag an einem Wochentag um 16:00h, leuchtet die LED von Feiertage und die LED von Dienst grün...man muss dann wissen, dass der obere den unteren schlägt.
Wenn alle drei LEDs rot sind, dann bedeutet das dass KEIN-DIENST aktiv ist und alle Anrufe zum Anrufbeantworter geschickt werden.

Ich hatte das mal im freePBX-Forum erwähnt, dass jede Business-Telefonanlage in der Lage sein sollte, dem User visuell zu zeigen, ob der Laden (Haupttelefonnummer der Firma) offen oder geschlossen ist. Das hat dort niemanden interessiert. Die meinten, dass sie tausende von zufriedenen Kunden hätten und nach dem Feature noch nie jemand gefragt hätte...thread closed ;-)

Ich bin kein Programmierer, wäre aber bereit mir ein Skript zu stricken und die notwendigen Dinge zu lernen. Nur weiß ich derzeit gar nicht, wo ich anfangen soll, und wär sehr froh, wenn mir jemand einen Tipp geben könnte...wie die Route ungefähr ausschaut.

Mir ist aufgefallen, dass wenn ich in Asterisk CLI 'core show hints' eingebe, dass mir meine drei TimeConditions angezeigt werden.
*271@timeconditions-: Custom:TC1 State:InUse Presence:not_set Watchers 1
*272@timeconditions-: Custom:TC2 State:InUse Presence:not_set Watchers 1
*273@timeconditions-: Custom:TC3 State:InUse Presence:not_set Watchers 1

Mir ist auch noch aufgefallen, dass wenn sich eine TimeCondition im Match-Modus befindet, dass dort statt 'InUse' 'Idle' steht. Ich müsste jetzt also ein Skript basteln, was den Status meiner drei TimeConditions abfragt, dann die Logik berücksichtig (271 schlägt 272 welche 273 schlägt) und mir dann das Letztziel ausgibt e.g. Sonderdienst-match bzw. Dienst-non-match.
Im Idealfall würde ich das dann auch noch über XML am Telefon darstellen und alle paar Sekunden abfragen.

Wäre für jeden Tipp sehr dankbar ;-)
Reinhard

EDIT: Weiterer Nachtrag
...das wäre ja mal ein Anfang...aber dieses Script kann viel zu viel...
Simple PHP script that checks the extension status at a remote PBX and updates a custom hint on the local pbx for proper BLF operation.
https://gist.github.com/lgaetz/8545099

Weiterer Nachtrag (ich verwende den Thread mal als meinen Notizzettel ;-)
Um die Information für jede TimeCondition zu bekommen, muss ich in Asterisk CLI sowas eingeben
CLI> core show hint *271
dann bekomm ich das
*271@timeconditions-: Custom:TC1 State:InUse Presence:not_set Watchers 1
1 hint matching extension *271

...Match State wäre Idle ...non-Match State: InUse
 
Zuletzt bearbeitet:
Das rein über Timeconditions lösen zu wollen finde ich umständlich, wie du ja auch mit deinen bezüglich der Tastenleuchtkombinationen schon geschildert hast.

Wenn du das über Tasten regeln willst würde ich mal einen näheren Blick auf Call Flow Control werfen. Bedeutet das der Benutzer in der Regel eine Taste drücken muss um einen bestimmten Zustand (Feiertage, Sonderöffnung etc.) auszulösen.
 
Danke dir für den Vorschlag, aber ich suche eine automatische Lösung und die funktioniert ja auch, leider ist das Monitoring am Endpoint nicht so trivial.

1. Nachtrag:
Sehe gerade, dass der Status einer TimeCondition auch in der mySQL-Datenbank (asterisk/timeconditions) in Echtzeit vorhanden ist. Jetzt gerade hätte die TimeCondition DIENST einen Match und in der Column TIME steht da 1.
Sehr interessant, dann könnte ich ja eine mySQL-Query machen...das eröffnet ganz neue Möglichkeiten...

Das hat sich als Reinfall erwiesen ;-)

Hab jetzt die php-Datei für die Statusabfrage von Extensions (siehe obigen Link) etwas an meine Fragestellung angepasst. In der Befehlszeile hab ich jetzt zumindest eine Ausgabe wie zB "24h-non-match holiday-non-match open-non-match"...aber die logische Kette, dass ein aktiver 24h-Dienst immer die beiden anderen TimeConditions overruled, und ein Feiertag immer einen normalen Dienst...bekomm ich übers Monitoring nicht hin, dazu fehlen mir die Programmierkenntnisse ;-)

Eigentlich sollte die Ausgabe sein, 24h-service, holiday, open oder closed...basierend auf dem Match-Status der 3 TimeConditions.

my_remotehintpoll.php
<?php

/**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
* remotehintpoll.php
*
* Created by Lorne Gaetz [email protected]
*
* Latest version: https://gist.github.com/lgaetz/8545099
*
* Licensed under GNU GPL version 2 or any later verison.
*
* Usage:
* This script is intended to be used on a local FreePBX system running version 2.9 or higher. When
* executed, the script polls a remote Asterisk server using remote Asterisk Manager Interface
* (AMI) credentials, checks the status of a specific extension number on the remote server, and
* then updates a local hint to the same value.
*
* Asterisk configuration:
* Define a dynamic hint on the local system of the same format as what is dialled to reach an
* extension on the remote system. If remote extensions are of the format 10XX and you use a dial
* prefix of 55 to dial remote extensions, the local dynamic hint is defined in extensions_custom.conf as:
*
* [from-internal-custom]
* exten => _5510XX,hint,Custom:Remote${EXTEN:2} // program BLF with e.g. 551001
*
* If you don't dial a prefix to reach the remote extensions from the local pbx, the hint looks like:
*
* [from-internal-custom]
* exten => _10XX,hint,Custom:Remote${EXTEN} // program BLF with e.g. 1001
*
* Version history:
* 2014-01-21 Initial commit for single extension
* 2017-06-22 Add support to poll a range of extensions and update a local dynamic hint
* 2019-01-31 verändert und mißbraucht von R. Stindl ;-)
**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****/

// set to true to echo debug
$debug=true;

// Set the local device prefix for the local hint, must match what is defined in extensions_custom.conf for the hint
// the $device_prefix will be used to prefix the remote extension number for the hint
$device_prefix = "Custom:Remote";

// Remote server host/IP, AMI credentials and
$remote_server = "127.0.0.1";
$remote_name = "time-condition";
$remote_secret = "password";
$remote_context = "from-internal";

// define range of time condition feature numbers to poll, the fewer the better
// the range needs to match the dynamic hint noted above
$remote_extension_start='*271';
$remote_extension_end='*273';

// Connect to local machine with FreePBX bootstrap, requires FreePBX 2.9 or higher
if (!@include_once(getenv('FREEPBX_CONF') ? getenv('FREEPBX_CONF') : '/etc/freepbx.conf')) {
include_once('/etc/asterisk/freepbx.conf');
}

// connect to remote Asterisk machine using AMI credentials and get status of Extension 103
$remote = new AGI_AsteriskManager();
if ($remote->connect($remote_server, $remote_name, $remote_secret)) {
for ($remote_extension=$remote_extension_start; $remote_extension<=$remote_extension_end; $remote_extension++) {
$foo[$remote_extension] = $remote->ExtensionState($remote_extension, $remote_context);
}
$remote->disconnect();
}
else {
output("Can not connect to remote AGI");
}

// print_r($foo); //for debug

// Based on value of remote extension status, change local custom device state to match
// edit $device to reflect name of local custom device as defined in extensions_custom.conf
// in the [from-internal-custom] section add a line similar to:
// exten => 103,hint,Custom:Remote103
// Make sure that the number does not conflict with something else

if($astman->connected()) {
for ($remote_extension=$remote_extension_start; $remote_extension<=$remote_extension_end; $remote_extension++) {
switch ($foo[$remote_extension]['Status']) {
case -1:
output("$remote_extension Extension not found");
$cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' UNKNOWN');
break;
case 0:
output("$remote_extension Idle");
$cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' NOT_INUSE');
break;
case 1:
output("$remote_extension In Use");
$cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' INUSE');
}
}
} else {
output("Can not connect to local AGI");
}

// Adjust to the logical chain of your time conditions in FreePBX
// "Idle" means a match, "In Use" equals a non-match


function output($string){
if ($string == "*271 Idle") {
echo "24h-match ";
} elseif ($string == "*271 In Use") {
echo "24h-non-match ";
} elseif ($string == "*272 Idle") {
echo "holiday-match ";
} elseif ($string == "*272 In Use") {
echo "holiday-non-match ";
} elseif ($string == "*273 Idle") {
echo "open-match ";
} elseif ($string == "*273 In Use") {
echo "open-non-match ";
} else {
echo "";
}

}
 
Zuletzt bearbeitet:
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.