I have to much fun with this contest.
I now can make calls using voice assistant
Oke I do a quick dump of the code needed to make a call except the name lookup.
I’m going to be sick Monday till Wednesday and busy stuff after that.
I have a sync from my android phone to nextcloud to my local asterisk database and ldap server. in my asterisk home assistant project. GitHub - Bram-diederik/asterisk-homeassistant-tools: voicemail system, asterisk number recognition, home assistant integration.
You need a sip account added to your voip device that automatically picks up a call.
So not a account in your asterisk dail plan.
the script to make the to from call
#!/usr/bin/php
<?php
if ($argc != 3) {
die("./start_call.php <from> <to>");
}
$from = $argv[1];
$to = $argv[2];
$name = "Bram Diederik";
$context = "users";
system("/opt/asterisk/phone_hangup.sh $from");
$call_file_contents = "Channel: Local/$from@$context\n";
$call_file_contents .= "Context: $context\n";
$call_file_contents .= "Extension: $to\n";
$call_file_contents .= "Priority: 1\n";
$call_file_contents .= "MaxRetries: 0\n";
$call_file_contents .= "RetryTime: 60\n";
$call_file_contents .= "WaitTime: 30\n";
$call_file_contents .= "CallerID: $name\n";
$call_file_name = "start_call$from$to";
// Write the call file
file_put_contents("/tmp/".$call_file_name, $call_file_contents);
chmod("/tmp/".$call_file_name,0777);
rename("/tmp/".$call_file_name,"/var/spool/asterisk/outgoing/".$call_file_name);
?>
hangup a call
#!/bin/bash
asterisk -x "channel request hangup `asterisk -x "core show channels" | grep PJSIP/$1- | cut -d" " -f1`"
my code to search a name. but this requires my whole sascha setup.
#!/usr/bin/php
<?php
if ($argc < 2) {
echo "Usage: php search_number.php <part_of_name> [phone type]\n";
exit(1);
}
// Database connection settings
$dir = "/opt/sascha/nextcloud/";
include($dir."config.php");
// Get the part of the name from the command line argument
$partOfName = $argv[1];
if (@$argv[2]) {
$type = $argv[2];
} else {
$type = false;
}
try {
// Create a PDO database connection
$pdo = new PDO("mysql:host=$dbservername;dbname=$dbname", $dbusername, $dbpassword);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql1 = "SELECT contacts.full_name
FROM contacts
WHERE contacts.full_name LIKE :name
UNION
SELECT alias.full_name
FROM alias
WHERE alias.full_name LIKE :name";
$stmt1 = $pdo->prepare($sql1);
$stmt1->bindValue(':name', '%' . $partOfName . '%', PDO::PARAM_STR);
$stmt1->execute();
if ($stmt1->rowCount() == 1)
{
// SQL query to search for a phone number by part of a name
if ($type) {
$sql = "SELECT phone_numbers.phone_number,phone_numbers.phone_type, contacts.full_name,phone_numbers.pref
FROM phone_numbers
JOIN contacts ON phone_numbers.contact_id = contacts.id
WHERE contacts.full_name LIKE :name
AND phone_numbers.phone_type LIKE :type
UNION
SELECT phone_numbers.phone_number,phone_numbers.phone_type, contacts.full_name,phone_numbers.pref
FROM phone_numbers
JOIN contacts ON phone_numbers.contact_id = contacts.id
JOIN alias ON alias.contact_id = contacts.id
WHERE alias.full_name LIKE :name
AND phone_numbers.phone_type LIKE :type
ORDER BY pref DESC
LIMIT 1"; // Limiting to one phone number
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', '%' . $partOfName . '%', PDO::PARAM_STR);
$stmt->bindValue(':type', '%' . $type . '%', PDO::PARAM_STR);
$stmt->execute();
} else {
$sql = "SELECT phone_numbers.phone_number,phone_numbers.phone_type, contacts.full_name,phone_numbers.pref
FROM phone_numbers
JOIN contacts ON phone_numbers.contact_id = contacts.id
WHERE contacts.full_name LIKE :name
UNION
SELECT phone_numbers.phone_number,phone_numbers.phone_type, contacts.full_name,phone_numbers.pref
FROM phone_numbers
JOIN contacts ON phone_numbers.contact_id = contacts.id
JOIN alias ON alias.contact_id = contacts.id
WHERE alias.full_name LIKE :name
ORDER BY pref DESC
LIMIT 1"; // Limiting to one phone number
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', '%' . $partOfName . '%', PDO::PARAM_STR);
$stmt->execute();
}
// Check if the phone number was found in the database
if ($stmt->rowCount() > 0) {
$result = $stmt->fetch();
$phoneNumber = $result["phone_number"];
$fullName = $result["full_name"];
$phoneType = $result["phone_type"];
$data = array(
'fullName' => $fullName,
'phoneNumber' => $phoneNumber,
'type' => $phoneType
);
$jsonData = json_encode($data);
echo $jsonData;
} else {
echo "No phone number found for '$partOfName'\n";
}
} else if ($stmt1->rowCount() == 0) {
echo "No phone number found for '$partOfName'\n";
} else {
echo "Multiple results for '$partOfName'\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$pdo = null;
?>