Le bug de désinscription IMS / VoLTE frappe en traître : votre smartphone affiche 4 barres de réseau, mais les appels basculent directement sur répondeur sans sonner. TelePing orchestre des pings silencieux programmés entre deux téléphones, corrèle chaque test par Trace ID et alerte immédiatement votre domotique en cas de coupure.
Un seul et même APK Android teleping.apk configurable en un clic selon l'appareil.
Ce mode est destiné à un second smartphone Android (un vieux smartphone recyclé branché sur son chargeur avec un forfait à 2€ ou illimité). Il a pour mission unique de se réveiller toutes les 30 minutes, d'émettre un ping GSM vers votre smartphone principal et de prévenir votre serveur domotique.
Réveille le processeur du téléphone même en veille prolongée (Doze Mode Android), garantissant une régularité horlogère.
Fait retentir 2 sonneries sur le récepteur et raccroche avant que le répondeur de l'opérateur ne prenne la ligne (0€ facturé).
Chaque test génère un jeton unique (ex: trk_...) envoyé dans call_initiated pour corréler la réponse sur Home Assistant.
Invoque directement l'API système TelecomManager.endCall(). Aucun bouton physique à presser.
Saisissez le numéro de votre smartphone principal (ex: +33612345678) et l'URL Webhook Home Assistant.
Accordez la permission CALL_PHONE pour permettre à l'application d'émettre l'appel en tâche de fond.
Cliquez sur "Désactiver Optimisation Batterie" pour que le système Android ne coupe pas le processus en veille.
Ce mode s'installe sur votre smartphone principal (celui où vous attendez les appels critiques, par exemple de l'hôpital ou d'un client). Grâce à son architecture de filtrage, il valide la disponibilité de la ligne sans jamais vous importuner.
Seul le numéro de votre Sonde est capté. Si l'hôpital ou un proche appelle, TelePing n'interfère jamais : votre téléphone sonne normalement et l'appel reste intact.
Grâce à NotificationListenerService, la notification d'appel en absence du test est instantanément effacée de l'écran de verrouillage et de la barre d'état.
Si vous êtes déjà en communication (ex: avec un médecin) quand le ping survient, TelePing valide la ligne avec le statut already_in_call_line_active sans émettre de double-bip gênant.
L'application n'accède à aucun contenu de message, n'enregistre aucune voix et communique directement avec votre propre serveur via votre réseau local ou HTTPS.
Indiquez le numéro de téléphone de la Sonde (Tél 2) pour que le récepteur ignore automatiquement les appels d'autres contacts.
Cliquez sur "Masquer les notifications d'appel manqué" pour activer le droit d'accès aux notifications Android.
Cliquez sur "Démarrer l'écoute". Le service d'arrière-plan veille silencieusement sur votre ligne.
Une répartition optimale des tâches pour une surveillance 100% robuste et zéro nuisance.
| Caractéristique | Mode Émetteur (Sender / Sonde) | Mode Récepteur (Receiver / Sentinelle) |
|---|---|---|
| Appareil cible | Second smartphone (branché sur secteur chez vous) | Votre smartphone principal (usage quotidien) |
| Type de carte SIM | SIM secondaire (forfait voix basique ou 2€) | Votre SIM principale (Orange, SFR, Bouygues, Free) |
| Rôle dans le cycle | Initie le test, émet l'appel GSM, raccroche à 10s | Détecte la sonnerie entrante, confirme la disponibilité |
| Événements Webhooks | call_initiated, call_completed |
call_detected, already_in_call_line_active |
| Gestion du sommeil Android | AlarmManager.setExactAndAllowWhileIdle() |
ReceiverService (Foreground Service persistant) |
| Nettoyage automatique | Non nécessaire (appels sortants) | Effacement de la notification + Purge du journal d'appels |
| Comportement appel de tiers | Ne reçoit aucun appel | Totalement transparent : l'appel tiers sonne normalement |
| Permissions requises | CALL_PHONE, ANSWER_PHONE_CALLS |
READ_PHONE_STATE, NOTIFICATION_LISTENER |
Comment les deux téléphones collaborent avec Home Assistant sans décrocher l'appel pour certifier que votre ligne est joignable.
call_initiated avec le Trace ID
Voir JSON ➔
CallStateReceiver (Vérifie numéro de la Sonde)
Détails ➔
call_detected : sonnerie confirmée en temps réel !
Voir JSON ➔
TelecomManager.endCall() (0€ facturé)
Détails ➔
call_completed (statut hung_up: true)
Voir JSON ➔
// Cliquez sur une étape pour inspecter le payload
Spécification technique détaillée des requêtes HTTP POST émises par TelePing vers Home Assistant ou vos propres serveurs.
Chaque événement déclenché par l'émetteur ou le récepteur est transmis via une requête HTTP POST asynchrone.
| Champ | Type | Événements concernés | Description & Exemple |
|---|---|---|---|
event |
string |
Tous | Type d'événement : call_initiated, call_detected, call_completed, test_webhook |
trace_id |
string |
call_initiated, call_completed |
Identifiant unique de corrélation du test (ex: "trk_1728112500_8fa2") |
device_role |
string |
Tous | Rôle de l'appareil émettant le webhook : "caller" (émetteur) ou "receiver" (récepteur) |
target_phone |
string |
call_initiated, call_completed |
Numéro de téléphone cible appelé au format international ou local (ex: "+33612345678") |
caller_phone |
string |
call_detected |
Numéro de l'appelant ayant déclenché la sonnerie sur le récepteur (ex: "+33789012345") |
status |
string |
call_detected |
Statut d'interception : "ringing_confirmed" (sonnerie normale) ou "already_in_call_line_active" (en ligne avec un tiers) |
duration_seconds |
integer |
call_completed |
Durée programmée de sonnerie avant raccrochage en secondes (ex: 10) |
hung_up |
boolean |
call_completed |
Indique si la commande système TelecomManager.endCall() a été exécutée avec succès (true) |
timestamp |
string |
Tous | Horodatage ISO-8601 UTC à la seconde près (ex: "2026-10-05T14:30:00Z") |
{
"event": "call_initiated",
"trace_id": "trk_1728112500_8fa2",
"device_role": "caller",
"target_phone": "+33612345678",
"ring_duration_seconds": 10,
"timestamp": "2026-10-05T14:30:00Z"
}
{
"event": "call_detected",
"device_role": "receiver",
"caller_phone": "+33789012345",
"status": "ringing_confirmed",
"timestamp": "2026-10-05T14:30:05Z"
}
// Note : Si l'utilisateur est déjà en communication (ex: en ligne avec l'hôpital) :
// "status": "already_in_call_line_active"
{
"event": "call_completed",
"trace_id": "trk_1728112500_8fa2",
"device_role": "caller",
"target_phone": "+33612345678",
"duration_seconds": 10,
"hung_up": true,
"timestamp": "2026-10-05T14:30:10Z"
}
{
"event": "test_webhook",
"device_role": "caller", // ou "receiver"
"message": "Connexion TelePing vers le Webhook fonctionnelle !",
"timestamp": "2026-10-05T14:28:40Z"
}
# automations.yaml
# 1. Réception et Corrélation du Webhook GSM TelePing
- alias: "AutoCaller - Réception Webhook GSM"
id: autocaller_reception_webhook_gsm
mode: queued
trigger:
- platform: webhook
webhook_id: "autocaller_gsm_webhook"
allowed_methods:
- POST
local_only: false # true si Wi-Fi LAN uniquement
action:
- choose:
# A. L'émetteur initie le test
- conditions:
- condition: template
value_template: "{{ trigger.json.event == 'call_initiated' }}"
sequence:
- service: input_text.set_value
target:
entity_id: input_text.dernier_trace_id_gsm
data:
value: "{{ trigger.json.trace_id }}"
- service: logbook.log
data:
name: "TelePing"
message: "Test GSM initié (Trace: {{ trigger.json.trace_id }}) vers {{ trigger.json.target_phone }}"
# B. Le récepteur confirme la sonnerie reçue !
- conditions:
- condition: template
value_template: "{{ trigger.json.event == 'call_detected' }}"
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.ligne_orange_operationnelle
- service: timer.start
target:
entity_id: timer.watchdog_ligne_orange
- service: logbook.log
data:
name: "TelePing"
message: "✅ Ping validé sur Tél Principal ! Watchdog réarmé."
# 2. Chien de garde (Watchdog) : Alerte critique si timer de 35 min expire
- alias: "AutoCaller - Alerte Ligne Orange Hors Service"
id: autocaller_alerte_ligne_orange_ko
trigger:
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.watchdog_ligne_orange
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.ligne_orange_operationnelle
- service: notify.notify
data:
title: "🚨 ALERTE CRITIQUE - LIGNE GSM COUPÉE"
message: "Aucun appel de test n'a abouti depuis plus de 35 min ! REDÉMARREZ LE SMARTPHONE IMMÉDIATEMENT pour ne pas rater l'appel de l'hôpital !"
data:
channel: "Urgent"
priority: high
ttl: 0
# configuration.yaml
input_boolean:
ligne_orange_operationnelle:
name: "Ligne Orange Principale"
icon: mdi:phone-check
input_text:
dernier_trace_id_gsm:
name: "Dernier Trace ID GSM"
icon: mdi:identifier
timer:
watchdog_ligne_orange:
name: "Watchdog Ligne Orange"
duration: "00:35:00"
const express = require('express');
const app = express();
app.use(express.json());
let lastReceivedPing = Date.now();
const WATCHDOG_LIMIT_MS = 35 * 60 * 1000; // 35 minutes
app.post('/api/webhook', (req, res) => {
const { event, trace_id, caller_phone, status } = req.body;
console.log(`[TelePing Webhook] ${event} | Trace: ${trace_id || 'N/A'}`);
if (event === 'call_detected') {
lastReceivedPing = Date.now();
console.log(`✅ Ligne fonctionnelle confirmée (${caller_phone}, status: ${status})`);
}
res.status(200).json({ status: 'ok' });
});
// Chien de garde (Watchdog)
setInterval(() => {
const diff = Date.now() - lastReceivedPing;
if (diff > WATCHDOG_LIMIT_MS) {
console.error("🚨 ALERTE CRITIQUE : Aucun ping GSM depuis > 35 min !");
// Déclenchez votre alerte (Telegram, SMS, alarme sonore)
}
}, 60 * 1000);
app.listen(3000, () => console.log('Serveur Webhook prêt sur port 3000'));
from flask import Flask, request, jsonify
import time
app = Flask(__name__)
last_ping = time.time()
WATCHDOG_LIMIT = 35 * 60 # 35 minutes
@app.route('/api/webhook', methods=['POST'])
def handle_webhook():
global last_ping
payload = request.get_json(force=True)
event = payload.get('event')
print(f"[TelePing] {event} (Trace: {payload.get('trace_id')})")
if event == 'call_detected':
last_ping = time.time()
print("✅ Ping validé : la ligne GSM fonctionne !")
return jsonify({"status": "received"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Installez le fichier teleping.apk directement sur vos deux téléphones. Mises à jour intégrées avec détection automatique de nouvelle version via version.json.
0,00 €. Un appel non décroché (qui émet 1 ou 2 sonneries puis raccroche automatiquement au bout de 10 secondes) n'est jamais facturé par les opérateurs télécoms et ne décompte aucune minute sur votre forfait.
Absolument pas. Sur votre téléphone principal (mode Récepteur), l'application filtre strictement sur le numéro autorisé de votre Sonde (Tél 2). Tout autre appel entrant (hôpital, proche, médecin, client) sonne normalement, fait vibrer votre smartphone et n'est jamais raccroché par l'application.
TelePing détecte automatiquement l'état CALL_STATE_OFFHOOK. Il ne coupe pas votre communication et émet le webhook avec le statut "already_in_call_line_active". Votre ligne étant active, le test est validé et votre conversation n'est pas perturbée !
Oui. TelePing utilise un Foreground Service certifié Android avec notification permanente et réveille le processeur via AlarmManager.setExactAndAllowWhileIdle(). N'oubliez pas de cliquer sur "Désactiver Optimisation Batterie" au premier lancement.
Sur Android 13 et 14, pour les applications installées hors Play Store (via APK), Android active par défaut la sécurité "Paramètres restreints". Pour autoriser l'accès aux notifications : allez dans Paramètres du téléphone > Applications > TelePing > appuyez sur les 3 petits points verticaux en haut à droite > "Autoriser les paramètres restreints". Vous pourrez ensuite activer le commutateur dans TelePing en un clic.
Redémarrez simplement votre smartphone Orange pour forcer une ré-authentification sur l'antenne relais et le serveur IMS. En préventif, vous pouvez aussi désactiver l'option "Appels Wi-Fi (VoWiFi)" dans les paramètres réseau de votre carte SIM.