F1ZBV – Blog radioamateur de F8ASB https://blog.f8asb.com Promouvoir est notre devoir ... Wed, 19 Jul 2023 18:39:39 +0000 fr-FR hourly 1 98010425 Interconnexion 3G/4G avec votre relais https://blog.f8asb.com/2023/07/19/interconnexion-3g-4g-avec-votre-relais/ https://blog.f8asb.com/2023/07/19/interconnexion-3g-4g-avec-votre-relais/#comments Wed, 19 Jul 2023 18:39:39 +0000 https://blog.f8asb.com/?p=8430 Continuer la lecture ]]> Le relais des Vosges F1ZBV est desormais connecté à la 3G pour des interventions distantes.
Les fonctionnalités distantes sont directement liés au choix du modem et des options proposés.
Dans cet article, je vous décris que ce j’ai mis en oeuvre et une description du modem Teltonika RUT240.

Dans un premier temps, je tenais à préciser que cet article n’est pas sponsorisé, j’ai contacté le fabricant directement et je n’ai pas réussi à obtenir un produit pour essai.
Souvent les entreprises qui ont des supers produits technologiques ont un service commercial discutable. 🙁

Le relais était déjà raccorder à la 4G avec un simple modem/routeur TPLink.
Nous avons changé d’opérateur et sommes désormais sur une offre NRJ Mobile du réseau Bouygues Telecom.
Ce nouveau réseau apportait un intérêt financier 4,99€ par mois, l’inconvénient c’est que nous avions besoin d’une antenne extérieure ou d’un modem plus sensible en reception.
L’utilisation était simplement la prise en main à distance du relais qui est sur un base linux avec SvxLink.
Le RUT240 amène à developper des nouvelles fonctions.

Pourquoi le modem RUT240?
Vous trouverez toutes les caractéristiques sur le site du fabricant:
Lien direct chez Teltonika

Je vous invite à regarder le manuel d’utilisation (150 pages) pour vous rendre compte de tous les fonctions possibles.

Je vous resume en quelques lignes les fonctionnalités présentes et leurs interêts.

Nous parlons là d’un modem de type industriel, ce qui de part sa conception et son développement est très poussé au niveau des interactions du milieu extérieur afin de couvrir un maximum d’application.

Il y a 2 prises réseaux une LAN et une WLAN, il y a la possibilité de faire 2 LAN (parametrage logiciel).
Il y a 3 connecteurs de type SMA afin de raccorder des antennes extérieures
(2 antennes mobiles + 1 antenne wifi).

Un system linux est intégré, RutOs, sur une base de OpenWrt accessible en ssh ou depuis l’interface web intégrée CLI.
Il y a les fonctions pour mettre en place un VPN (réseau privé pour accès direct), utile quand on n’a pas de réseau 3G avec une IP accessible depuis l’extérieur.
Compatible avec OpenVPN, IPSec, GRE Tunnel, PPTP, L2TP, DDNS

La plage d’alimentation va de 9 à 30V ( ce qui permet d’être alimenter par les batteries en cas de coupure secteur)
Sur le connecteur d’alimentation, on retrouve une entrée et une sortie, pilotable par l’interface utilisateur, par sms, ou en ssh.
L’intérêt est de brancher la sortie sur un relais afin de faire un reset de l’installation et sur l’entrée on peut y raccorder l’information presence secteur.
Dans le cadre d’un changement de statut une notification par sms est réalisable sur un numéro ou sur une liste de numéro.
Il y a une interface complètement personnalisable, SMS Utilities, pour des interactions SMS vers actions programmés.
Du fait d’un système linux, il est possible d’y intégrer des scripts en shell personnalisés.
Il est possible d’activer un reboot automatique si le ping vers google ne répond pas.
Un planificateur permet de programmer des actions.

Les protocoles prise en charge sont les suivants:
TCP, UDP, IPv4, IPv6, ICMP, NTP, DNS, HTTP, HTTPS, FTP, SMTP, SSL v3, TLS, ARP, VRRP, PPP, PPPoE, UPNP, SSH, DHCP, Telnet, SMPP, MQTT
Il y a vraiment de quoi faire…

Le fabricant propose une interface RMS qui vous permet de vous connecter sur l’interface graphique du modem en passant via leur site sans parametrage spécifique.
Pour l’achat d’un modem un accès gratuit de 30 jours est offert.

Mise en place sur le relais des Vosges F1ZBV:

  • Activation du ping avec reboot automatique, il y a juste une case à coché pour activer la fonction
    (page125 de la notice).
    Avant j’utilisais une fonction sur le Raspberry avec un relais voir l’article
  • Un prochaine intervention sera fait pour mettre en place le reset sur le raspberry depuis la sortie et la détection de la présence secteur ce qui était aussi précédemment géré par le raspberry voir article.
  • Les différentes commandes SMS pour les reboot et informations pré paramètre par défaut.

Je voulais vous décrire plus particulièrement la mise en place d’une commande d’information statut qui envoi toutes les informations du relais par sms.

Les pré requis:

  • Il faudra veillez à installer une clef RSA de chaque coté, c’est ce qui va vous permettre de ne plus avoir de mot de passe à écrit lors des connexions ssh ou lors de commande envoyées de l’un vers l’autre est inversement.
    Utiliser la commande ssh-keygen
  • Avoir la dernière version firmware sur le modem


Paramètres au niveau du modem:

Dans la partie mobile utilites, créer une nouvelle action et sélectionner Excetute custom script, dans SMS text vous indiquez le message en sms qui lancera l’action.
Vous indiquerez votre numéro de telephone dans la partie AUTHORISATION.

Dans l’exemple ci-dessous, le script renvoi juste Bonjour de F1ZBV par SMS.
Ce qui vous permettra de tester le bon fonctionnement de la commande.
Vous recevrez un SMS instantanément.
Il faudra ensuite remplacer la ligne echo par votre commande au format suivant:
ssh <LOGIN>@<ADRESSEE IP DU RELAIS> ‘commande shell’

Voici un exemple:
ssh f1zbv@192.168.1.88 ‘./info.sh’
on peut bien sûr indiquer le chemin complet ou remplacer le chemin du script par une commande direct de type: ssh f1zbv@192.168.1.88 ‘reboot’ qui fera rebooter le Raspberry Pi.
Je vous conseille de tester le script directement depuis le modem sur la section CLI ( terminal) de l’interface graphique.

Paramètres au niveau du Raspberry:

Le relais a déjà tous les capteurs et un code DTMF permet déjà d’obtenir les informations en vocale avec comme base, une carte SVXCARD.
Le travail consiste donc à reprendre toutes ses mesures dans un script et générer un texte qui sera en retour de la  commande envoyé par le modem RUT à la reception du DTMF.
Vous pouvez revoir les vidéos de la présentation du relais F1ZBV de 2016 dans un article précédent sur les fonctionnalités du relais.

Pour le raspberry, il suffit de crée un script qui va rechercher les informations et les retourne en texte.

Voici le script utilisé:
Les scripts sont disponibles directement sur Github, il sera nécessaire de mettre les scripts info.sh et tension.tcl dans le même dossier, sinon il faut modifier les chemins.

Conclusion:
Ce modem est selon moi une vraie option sur une installation distante, le fait d’embarquer un système sous linux nous amène une ouverture sur le développement de fonctions personnalisées. C’est un peu le cas du relais de Vosges avec un logique qui date de 2015, c’est uniquement la partie logiciel qui évolue selon les besoins au fur et à mesure des années.

Selon mes expérimentations et/ou les demandes, je publierais peut être d’autres articles de mise en oeuvre.
Le coût du modem est de moins de 200 euros, je vous préconise l’achat chez Reichelt, le produit est complet avec alim + antenne à prix raisonnable et également disponible en stock.

INFO:

J’ai eu cette année beaucoup de mal à rédiger des articles, faute de temps, afin d’avoir plus d’interactions avec les abonnés à la newsletter, j’enverrais de temps en temps, des exclusivités, des opportunités, des infos afin d’éviter la rédaction complète de l’article.
J’envisage peut être aussi des votes sur le prochain article à paraître.

Mi Août, j’enverrai la première newsletter avec ce format.
Si ce n’est pas déjà fait,  je vous invite à vous inscrire, sur la fenêtre de droite en indiquant votre indicatif et en confirmant sur le mail reçu.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2023/07/19/interconnexion-3g-4g-avec-votre-relais/feed/ 3 8430
Reboot routeur automatique si coupure Internet https://blog.f8asb.com/2021/01/09/reboot-routeur-automatique-si-coupure-internet/ https://blog.f8asb.com/2021/01/09/reboot-routeur-automatique-si-coupure-internet/#respond Sat, 09 Jan 2021 17:34:12 +0000 http://blog.f8asb.com/?p=6768 Continuer la lecture ]]>
Dans cette article, je décris la création d’un programme qui redémarre votre routeur en cas de coupure d’Internet.

J’utilise ce programme pour une installation radioamateur connectée mais vous pourrez l’adapter à vos applications.

Le relais des Vosges F1ZBV, (logiciel SvxLink) est connecté à Internet pour pouvoir prendre la main avec Dwservice et également de pouvoir l’interconnecter sur le réseau régional ou le réseau RRF.

Nous avons constaté des coupures Internet régulières, peut être du à la neige ou autre.

Jean-Paul F5FIM, doit dans un premier temps pelleter la neige et dégivrer les différentes serrures, tout cela pour un simple reboot, il était temps de faire quelque chose :).

Nous avons constaté qu’un reboot du routeur nous permettait de retrouver notre connexion Internet. Par contre, il était nécessaire de se rendre sur site pour faire l’opération.

Pour ce faire, il suffit de relier un relais sur un gpio du Raspberry et de créer un programme qui va regarder si Internet est présent, si nous ne sommes pas connecté le relais coupera l’alimentation du routeur pendant 10s ce qui permettra de l’initialiser.

Schéma de montage:

Il s’agit d’un exemple sur le GPIO 2 vous pouvez choisir celui que vous souhaitez.

Programme:

#!/bin/bash
# Reboot Router01/2021 F8ASB.COM

if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet disponible'
else
echo 'Internet non disponible'
echo 1 > /sys/class/gpio/gpio2/value
echo "Reboot web [`date`]" >> /var/log/netcheck
sleep 10
echo 0 > /sys/class/gpio/gpio2/value
fi

Le programme teste la connexion internet, si nous sommes connecté il écrit Internet disponible. Sinon il active le relais pour couper l’alimentation du route, patiente 10s et remet l’alimentation.
Nous écrivons dans le fichier /var/log/netcheck à chaque reboot.
Le lancement du programme sera fait d’une manière cyclique ( tous les 15min) en le lançant grâce au planificateur Crontab.

Installation:

Se connecter en SSH sur votre Raspberry

Se rendre dans le répertoire pi,
cd /home/pi/
Créer un répertoire par exemple routeur
mkdir routeur
se rendre dans se répertoire crée.
cd routeur
copier le programme dans ce repertoire
wget https://raw.githubusercontent.com/F8ASB/F1ZBV/master/internet.sh
rendre le fichier exécutable
chmod +x internet.sh

Changer le port gpio selon votre besoin, pour éditer taper nano internet.sh
echo 1 > /sys/class/gpio/gpio2/value
et
echo
 0 > /sys/class/gpio/gpio2/value

Initialisation des GPIO
Il est nécessaire de déclarer au systeme quel gpio nous allons utiliser, pour cela il faut l’écrire dans le rc.local.

Edition du rc.local
nano rc.local

Insérer les lignes suivantes avant le exit 0:

# GPIO 17 : PTT

echo “2” > /sys/class/gpio/export &
sleep 2
echo out > /sys/class/gpio/gpio2/direction

Changer le port gpio selon votre configuration

La prise en compte de la déclaration des gpio nécessite un reboot général.

Il nous reste plus qu’a insérer une ligne dans le crontab pour que le test s’exécute toutes les 15 min, vous pourrez bien sûr modifier cette valeur à votre convenance.

Edition du fichier crontab
nano /etc/crontab

Ajouter cette ligne en fin de fichier:

*/15 * * * * root /home/pi/routeur/internet.sh

Conclusion:

La mise en oeuvre est simple, il nous a fallu peut de temps pour l’intégrer sur le relais F1ZBV qui utilise la logique SvxCard qui est équipée de 4 relais.
Nous avons utilisé le GPIO20.
Le routeur possède peut être une commande SSH pour effectuer un reboot, n’étant pas sur place, une solution hardware a été retenue.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2021/01/09/reboot-routeur-automatique-si-coupure-internet/feed/ 0 6768
QsyControleur: QSY Salon pour installation sur réseau RRF https://blog.f8asb.com/2020/03/30/qsycontroleur-qsy-salon-pour-installation-sur-reseau-rrf/ https://blog.f8asb.com/2020/03/30/qsycontroleur-qsy-salon-pour-installation-sur-reseau-rrf/#respond Mon, 30 Mar 2020 22:50:58 +0000 http://blog.f8asb.com/?p=5921 Continuer la lecture ]]>

Dans cet article, je vous décris l’installation et le fonctionnement d’un programme de gestion de QSY Salon. Il est réalisé en Python.

J’ai profité de la période de confinement pour occuper intelligemment mon fils.
Je ne sais pas si vous le savez mais la programmation Python est maintenant inclus dans le programme de seconde.
Les calculatrices des élèves ont même la possibilité de lancer et d’éditer des programmes Python.

Tout ça pour vous dire que le plus gros de ce script a été écrit par Thibaut qui à 15 ans.
J’ai juste ensuite adapté le programme pour mon besoin avec la lecture du GPIO à la place d’un fichier texte et mis en page le script en mettant en forme les paramètres en variables .

Venons maintenant à ce Script…

Actuellement, vous êtes plusieurs à programmer des connexions sur un des salons du RRF en automatique.
Par exemple sur l’Ouest les vendredis soirs, il y a une interconnexion sur le salon local.

Comment cela fonctionne?

Dans un fichier CRON (fichier de programmation des actions sous Linux, décrit plus bas)
On va y indiquer l’heure pour lancer le script afin d’aller sur le salon local
/etc/spotnik/restart.loc
Donc par exemple on va lui dire qu’a 17H00 il se connecte sur le salon local et à 20h00, il retourne sur le RRF.
Le système quand il arrivera aux différents horaires lancera le script.

Que constate t-on?

Si vous mettez des heures piles vous avez des chances de faire le QSY en pleine balise horaire ( balise longue dans Svxlink).
Donc vous allez me dire, simple nous allons mettre 16h50 comme ça on est tranquille.
Oui, on est tranquille avec la balise, mais si un QSO est en cours le script se lancera quand même. Il ne tient pas compte de l’activité du relais.
Pour rappel, un script de changement de salon entraine l’arrêt du relais et le redémarrage du système avec un fichier de configuration spécifique propre à chaque salon.

La solution:

QsyControleur permet lorsque qu’il est intégré dans CRON de gérer un QSY programmé.
Avant d’effectuer le QSY, il contrôle que le relais n’est pas en émission afin d’éviter de couper un QSO.
Pour effectuer ce contrôle, il regarde tout simplement si la sortie PTT est à 1 ou à 0.

Fonctionnement:

Le script est lancé via le fichier cron et va lancer le QSY que vous avez défini.
Dans le programme, vous devez renseigner:

Le GPIO de la detection PTT:
gpio=”gpio18″
Le temps entre les test en s:
timetest=60
Le chemin du script à lancer
Script_Path=”/etc/spotnik/restart.bav”

Au démarrage le script va voir quel est l’état du port PTT ( selon le gpio que vous aurez indiquer), si il est égale à 0 (PTT OFF) il lance le qsy directement, si il est à 1 il relance le test selon le temps que vous aurez programmé dans timetest.

Affichage si PTT = 1
Pour le développement 10S ont été défini.
Affichage si PTT = 0



Remarque:
Pour connaitre le port PTT utilisé, allez voir le fichier de configuration:
taper spot puis choix14 et rechercher la ligne: PTT_PIN=gpio18 (dans notre exemple) ou alors éditer directement svxlink.conf.

Installation:

1- Paramêtrage du fichier CRON:

Editer votre fichier CRON:
nano /etc/crontab

/etc/crontab: system-wide crontab
 Unlike any other crontab you don't have to run the `crontab'
 command to install the new version when you edit this file
 and files in /etc/cron.d. These files also have username fields,
 that none of the other crontabs do.
 SHELL=/bin/sh
 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 Example of job definition:
 .---------------- minute (0 - 59)
 |  .------------- hour (0 - 23)
 |  |  .---------- day of month (1 - 31)
 |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr …
 |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
 |  |  |  |  |
 *  *  *  *  * user-name command to be executed
 17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
 25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
 47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
 52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
 #
 55 16 * * * root /opt/QsyControleur/QsyControleur1.py
 10 20 * * * root /opt/QsyControleur/QsyControleur2.py
 45 20 * * * root /home/SVXCARD/python3 corona.py

Les 3 dernières lignes constituent les différents programmes:
à 16:55 lancement de notre QSY vers un salon
à 20:10 lancement de notre QSY vers le retour au RRF par exemple
à 20:45 lancement du script qui va chercher les informations de la balise Corona virus voir article f1zbv-balise-dinformation-coronavirus
La prise en compte du fichier CRON demande un redémarrage ou une commande crond restart (sur Raspberry)

Installation du script

Se rendre dans le répertoire /opt/
cd /opt/
Télécharger le programme
git clone https://github.com/F8ASB/QsyControleur.git

Se rendre dans le répertoire ou le fichier est présent:
cd QsyControleur

faire 2 copies que vous programmerez
cp QsyControleur.py QsyControleur1.py
cp QsyControleur.py QsyControleur2.py


Ensuite éditer les 2 scripts
nano QsyControleur1.py
et
nano QsyControleur2.py

Remplir les paramétres en indiquant:
gpio=(votre gpio)
timetest=(le temps entre les tests)
Script_Path=(le chemin du script à lancer)

Voila c’est maintenant en place est fonctionnel.

Le Programme:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import  os
 
'''
                   > QsyControlleur.py <

Programme de gestion de QSY Salon
Ce script permet lorsque qu'il est integré dans CRON de gerer un QSY programmé. Avant d'effectuer le QSY ce script controle que le relais n'est pas en émission afin d'éviter de couper un QSO

73 & 88 de F8ASB & F8ASB Junior (Thibaut)

Plus d'info: F8ASB.COM
'''

##############
# PARAMETRES #
##############

#Entrer le GPIO de la detection PTT
gpio="gpio18"

#Entrer le temps entre les test en s
timetest=60

#Chemin du script à lancer
Script_Path="/etc/spotnik/restart.bav"

while True:
 
    fichier = open("/sys/class/gpio/"+gpio+"/value", "r")
    etat = fichier.read()
    print ("Etat GPIO: "+etat)
    if etat == "0\n":
        print ('\x1b[1;37;40m'+"+++++++++++" +'\x1b[0m')
        print ('\x1b[1;37;40m'+"+ PTT OFF +" +'\x1b[0m')
        print ('\x1b[1;37;40m'+"+++++++++++" +'\x1b[0m')
        print ('\x1b[3;31;42m'+"lancement QSY " +'\x1b[0m')
        os.system (Script_Path)
        break
    else:
        print ('\x1b[5;37;41m'+"     +++++++++++     " +'\x1b[0m')
        print ('\x1b[5;37;41m'+"     + PTT ON  +     " +'\x1b[0m')
        print ('\x1b[5;37;41m'+"     +++++++++++     " +'\x1b[0m')
        print ('\x1b[6;31;47m'+"Nouveau test dans "+str(timetest)+"s" +'\x1b[0m')
        time.sleep(timetest)

Page GitHub dédiée:
https://github.com/F8ASB/QsyControleur

Conclusion:

Voila un petit programme simple et efficace qui une fois en place fera du bon travail, sans couper les QSO, qui sont plus présents actuellement du fait du confinement.
RESTER CHEZ VOUS ET FAITES DE LA RADIO!

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI

]]>
https://blog.f8asb.com/2020/03/30/qsycontroleur-qsy-salon-pour-installation-sur-reseau-rrf/feed/ 0 5921
Compte rendu du QSO des confinés du 28/03/2020 https://blog.f8asb.com/2020/03/28/compte-rendu-du-qso-des-confines-du-28-03-2020/ https://blog.f8asb.com/2020/03/28/compte-rendu-du-qso-des-confines-du-28-03-2020/#respond Sat, 28 Mar 2020 17:36:05 +0000 http://blog.f8asb.com/?p=5912 Continuer la lecture ]]>
réalisation F5SWB

Pour la 2ème édition du QSO des confinés sur le relais des Vosges F1ZBV et les relais connectés nous avons eu 27 participants présents.
Le capitaine du QSO était Damien F8DSN, initiateur de ce QSO.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI

]]>
https://blog.f8asb.com/2020/03/28/compte-rendu-du-qso-des-confines-du-28-03-2020/feed/ 0 5912
Distribution SVXCARD et Spotnik 3.0 https://blog.f8asb.com/2020/02/03/distribution-svxcard-et-spotnik-3-0/ https://blog.f8asb.com/2020/02/03/distribution-svxcard-et-spotnik-3-0/#respond Mon, 03 Feb 2020 19:25:30 +0000 http://blog.f8asb.com/?p=5594 Continuer la lecture ]]>

Dans cet article, vous trouverez les détails de la distribution réécrite complètement avec la prise en charge d’une version récente de Svxlink et de la gestion du réseau RRF pour une SvxCard.
J’ai profité de la nécessité de faire évoluer le relais des Vosges F1ZBV pour travailler dessus et la rendre disponible pour la communauté radioamateurs et les possesseurs de SvxCard.

Les fonctions prises en comptes dans cette distribution:

– Message personnalisés du relais avec prise en charge du chemin des sons automatiques selon l’indicatif du relais.
– Annonce à l’ouverture du relais si connection au réseau RRF du salon connecté
– Possibilité de changer de salon par code DTMF
– Prise en compte du salon régional
– Préinstallation de la fonction pour station météo extérieure
Mode urgence pour activité ADRASEC
– Préinstallation commutation ampli sur sortie relais par DTMF
Messages d’information programmés
– Nouveau menu (mélange fonction Spotnik + SvxCard)
Message d’arrêt du relais
– Sauvegarde sur le port USB en faisant un image du raspberry pi.
Cette fonction était décrite sur l’article rpi-clone: Clonez la carte SD de votre Raspberry Pi, il suffit d’insérer un lecteur de carte SD USB dans le port usb et de taper : clone
– réinstallation de dwservice (prise en main à distance)

– Gestion des capteurs de la SvxCard:
– 3 capteurs de T° par (défaut Émetteur, coffret, cavités)
– Tension d’alimentation
– S-metre
– Capteur présence tension avec annonce vocale à l’ouverture si coupure secteur
– Préinstallation de la fonction pour station météo extérieur. Il faut que la station météo soit compatible avec Weewx pour une prise en charge de bulletins météo.
– Préinstallation mesure tension 24V

Login: root
pass: spotnik
adresse ip: DHCP

Personnalisation de messages:

  playMsg $mycall "bonjour";
     puts "Ouverture bonjour";

Pour que les messages personnalisés du relais soient pris en compte avec un minimum de modification des lignes de codes, une variable a été insérée. De ce fait il suffira d’ajouter dans un répertoire avec l’indicatif du relais tous vos messages personnalisés.

Pour rappel: Le répertoire doit être situé dans le chemin suivant:
/usr/share/svxlink/sounds/fr_FR/

Vous devez ensuite créer un répertoire en majuscule avec l’indicatif dans mon cas F1ZBV
ce qui donne le chemin complet:
/usr/share/svxlink/sounds/fr_FR/F1ZBV/

Il est impératif d’indiquer l’indicatif du relais dans le fichier svxlink.conf
/etc/spotnik/svxlink.cfg ou via le menu choix 14.

CALLSIGN=F1ZBV

A l’intérieur de celui-ci on retrouvera:
aurevoir.wav  balisecourte.wav baliselongue.wav  bavard.wav  bonjour.wav  bonnenuit.wav  bonsoir.wav

Il est nécessaire de modifier les sons à vos besoins. Enregistrer vos fichiers wav avec logiciel Audacity par exemple. Pour convertir ensuite vos fichiers compatibles avec svxlink en mode console en tapant la commande suivante (ex avec toto.wav):

sox toto.wav -r16000 -esigned-integer -b16 -c1 totook.wav

Le nouveau menu

Envoyer la commande spot ou menu pour y accéder.

Réseau RRF

L’ensemble des salons est pris en compte ainsi que le salon régional à paramétrer.
Un timer salon (timersalon.sh) est en place pour repasser le mode “Stand Alone” (déconnecté) si il n’y pas d’activité sur un des salons connectés.
Une connexion automatique quotidienne sur le salon régional pourra être mise en place dans les prochains mois. Je publierai la méthode quand j’aurais mis en place.

Ci-dessous vous trouverez le fichier image en format 7zip de 590Mo téléchargeable.

Télécharger le fichier, décompresser avec 7zip et graver l’image avec Win32DiskImager sur une carte SD.

Attention: Il sera nécessaire de personnaliser les fichiers de configuration selon vos besoins. Un minimum de rigueur et de connaissance est nécessaire. N’hésiter pas à me contacter si vous avez des questions.
Je ne prendrais pas la main sur votre sytème pour faire le travail.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI

]]>
https://blog.f8asb.com/2020/02/03/distribution-svxcard-et-spotnik-3-0/feed/ 0 5594
SVXLINK: Personnaliser vos messages sur votre relais https://blog.f8asb.com/2017/12/17/svxlink-personnaliser-vos-messages-sur-votre-relais/ https://blog.f8asb.com/2017/12/17/svxlink-personnaliser-vos-messages-sur-votre-relais/#respond Sun, 17 Dec 2017 08:53:45 +0000 http://blog.f8asb.com/?p=3438 Continuer la lecture ]]>

Vous êtes un certain nombre à avoir téléchargé et installé l’image de Madeleine.
Dans cette article je vous montre comment personnaliser vos messages.
Vous devez vous rendre sur le site https://best-of-vox.com/windows pour télécharger le logiciel qui fonctionne sous Windows. J’utilise la voix d’Agnes, vous devez cliquer sur le l’image correspondant à Agnès.

Le logiciel coûte 39,00€, vous l’obtiendrez directement après la commande. Vous pourrez à votre convenance acheter d’autres voix si besoin.

Une fois le logiciel installé, vous n’avez plus qu’a taper votre texte, ajuster les paramètres de la voix ( pour ma part j’utilise les paramètres par défaut)

Cliquer sur le bouton lecture pour avoir un aperçu du message, puis si il vous convient pour pouvez l’exporter en fichier .wav.

Pour le rendre compatible avec SvxLink, il sera nécessaire de passer par une ligne de commande Linux pour convertir voir les explications sur le site support de svxlink.
remplacer les noms de fichiers par les vôtres.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2017/12/17/svxlink-personnaliser-vos-messages-sur-votre-relais/feed/ 0 3438
F1ZBV: Lola fait une pause… https://blog.f8asb.com/2017/03/26/f1zbv-lola-fait-une-pause/ https://blog.f8asb.com/2017/03/26/f1zbv-lola-fait-une-pause/#respond Sun, 26 Mar 2017 05:08:24 +0000 http://blog.f8asb.com/?p=3251 Continuer la lecture ]]>  

Les relais des Vosges F1ZBV/F1ZBU seront inactifs pour une durée indéterminée.

En effet, nous sommes à la recherche d’un nouveau site d’implantation car il nous a été demandé de quitter le Hohneck, le nouveau propriétaire ne souhaitant plus notre présence.

Nous sommes donc à la recherche d’un lieu, si possible au dessus de 1000m de façon à couvrir au mieux le département, ensuite il faudra le réimplanter…..


Si vous avez des relations ou des propositions merci de prendre contact.

 


Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2017/03/26/f1zbv-lola-fait-une-pause/feed/ 0 3251
SvxCard : Checkpoint, contrôlez votre carte après l’assemblage https://blog.f8asb.com/2017/02/12/svxcard-checkpoint-controlez-votre-carte-apres-lassemblage/ https://blog.f8asb.com/2017/02/12/svxcard-checkpoint-controlez-votre-carte-apres-lassemblage/#respond Sun, 12 Feb 2017 11:10:53 +0000 http://blog.f8asb.com/?p=3210 Continuer la lecture ]]>

Voici un document qui vous permet de verifier les tensions sur la carte SvxCard après assemblage.

I) Première partie carte seule sans le Raspberry PI

  • Connecter la carte au 12V avec le connecteur d’alimentation sans aucun circuit comme sur la photo.
  • Vérifier les mesures entre le GND et les points rouges.
  • Sur le connecteur du Raspberry Pi:
    On doit retrouver uniquement 5 volts sur les pin 2 et 4 du Raspberry Pi sur tout les autres pin qu’il faut verifier il ne doit y avoir aucune tension supérieur à 2V.
    Si cela est le cas vous avez un court circuit.
  • Le Raspberry Pi supporte uniquement des tensions inférieures à 3.3v.
  • Une fois tous les points vérifier débrancher l’alimentation

II) Première partie carte seule avec Raspberry PI

  • Mesurer les 2 tensions 3,3V
  • Une fois tous les points vérifier débrancher l’alimentation
  • Vous pouvez ensuite position tous les circuits intégrés sur leur emplacement votre carte est prête

Pour la partie installation logiciel se rendre sur la page dédié:

http://svxcard.f5uii.net/doku.php?id=fr:installation_debian_8_jessy_raspberry_pi_2

Une nouvelle section FAQ vient de voir le jour sur le site support, celle-ci est relativement récente et sera compléter au fur et à mesure des questions que je recevrais.

Utilisez de préférence le support Yahoo:
Inscrivez-vous à la liste de discusion en envoyant un simple mail à : svxcard-subscribe@yahoogroups.com

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2017/02/12/svxcard-checkpoint-controlez-votre-carte-apres-lassemblage/feed/ 0 3210
SVXLINK: Interface I2C vers BCD, pilotez vos radios ! https://blog.f8asb.com/2016/11/13/svxlink-interface-i2c-vers-bcd-pilotez-vos-radio/ https://blog.f8asb.com/2016/11/13/svxlink-interface-i2c-vers-bcd-pilotez-vos-radio/#respond Sun, 13 Nov 2016 08:34:30 +0000 http://blog.f8asb.com/?p=3104 Continuer la lecture ]]> i2ctobcdinterface

 

La carte SvxCard et tous les raspberry Pi possèdent un port I2C celui-ci a été prévu pour des extensions possibles. Et bien voici la première extension en cours de test qui sera utile pour les relais et qui viendra se connecter sur la carte SvxCard.

Fonctionnement:
Il s’agit d’une interface I2C vers BCD, voici un exemple pour les chiffres de 0 à 10. L’interface développée est sur 6 bits ce qui peut permettre de gérer 64 possibilités.(canaux)

Chiffre Bits
    0   0000
    1   0001
    2   0010
    3   0011
    4   0100
    5   0101
    6   0110
    7   0111
    8   1000
    9   1001

Pour resumé avec 4 fils ( +,GND,SDA,SCL) nous allons pouvoir piloter 6 leds qui pourront selon la combinaison gérer le pilotage BCD de votre radio.

Mais pour quoi faire?

Les radios pro sont pour la plupart muni d’une possibilité de pilotage de canaux via une prise externe. Prenons comme exemple Motorola très utilisé chez les radioamateurs pour les relais.
images

Pin # Description Data Dir. Debounce Act. Level
6 Channel Select 1 Input No Low
8 Channel Select 2 Input No Low
9 Channel Select 3 Input No Low
12 Channel Select 4 Input No Low
14 Channel Select 5 Input No Low

Nous sommes là sur un pilotage sur 5 bits.

Channel CS5 CS4 CS3 CS2 CS1
Front Panel H H H H H
1 H H H H L
2 H H H L H
3 H H H L L
4 H H L H H
5 H H L H L
6 H H L L H
7 H H L L L
8 H L H H H
9 H L H H L
10 H L H L H
11 H L H L L
12 H L L H H
13 H L L H L
14 H L L L H
15 H L L L L
16 L H H H H
17 L H H H L
18 L H H L H
19 L H H L L
20 L H L H H
21 L H L H L
22 L H L L H
23 L H L L L
24 L L H H H
25 L L H H L
26 L L H L H
27 L L H L L
28 L L L H H
29 L L L H L
30 L L L L H
31 L L L L L

Vous pourrez donc piloter 32 canaux avec l’interface I2C->BCD.

Pourquoi cette fonction?

Vous pouvez raccorder l’émetteur du relais et le faire changer de canal mémoire et donc de puissance ou de caractéristiques (DCS,CTCSS…..)

Par exemple sur le relais des Vosges, on pourrait imaginer:
Mémoire 1: 145,6625 25W
Mémoire 2: 145,6625 10W
Mémoire 3: 145,6625 5W
Mémoire 4: 145,6625 25W CTCSS 67Hz
Mémoire 5: 145,6625 10W CTCSS 67Hz
Mémoire 6: 145,6625 5W CTCSS 67Hz

Nous voila avec un émetteur dont on peut changer les caractéristiques par DTMF ou alors par des commandes SSH.

Mais l’intérêt est beaucoup plus important pour un partie transpondeur qui peut devenir pilotable, on l’appellera alors intercom.

Intercom, c’est le nom qui a été donné à ce procédé qui permet, à partir d’un relais, de programmer un autre émetteur-récepteur associé sur une fréquence choisie par l’utilisateur. Imaginez par exemple, que vous puissiez déclencher un relais VHF lointain à partir de votre relais UHF habituel, ou que vous puissiez contacter des stations mobiles en VHF alors que vous ne pouvez pas les entendre ! C’est un transpondeur programmable.

Il vous restera alors juste à programmer les mémoires de votre transpondeur et de les associer à un DTMF.

La prochaine étape sera l’écriture d’un module Svxlink qui va gérer l’intercom et le test sur une radio.

Cette interface est compatible avec toutes les radios qui utilisent un port externe de contrôle en BCD ( Motorola, Tait, DR1…).
Elle peut être directement reliée sur le Raspberry Pi pour les relais numériques et faire exactement la meme chose et pourquoi pas un jour un intercom numérique !
Avis aux amateurs 😉

L’interface très compacte (16mmx50mm) pourra être mise dans une gaine thermo avec des connecteurs coudés ou les fils directement soudés dessus, dans le prolongement du câble entre le port I2C et la radio).
Elle est muni de led pour nous indiquer le canal programmé (en binaire) uniquement pour la phase de recherche et développement.

svxcard_fonctions_1.1Je rappelle que la carte Svxcard est muni de 4 relais, elle peux donc d’origine gérer un transpondeur sur 4 bits (16 canaux)

Une petite vidéo d’un enchainement avec:
Allumage complet – arrêt complet – puis envoie de 1 à 9 – arrêt complet

algo-n-1b

i2cdetect -y 1, l’adresse de la carte avec A0 A1 A2 à la masse:capture-decran-2016-11-13-a-09-11-41
Le code de test de la vidéo:

#!/bin/bash
i2cset -y 1 0x20 0xFF
sleep 10
i2cset -y 1 0x20 0x00
sleep 2
i2cset -y 1 0x20 0x01
sleep 2
i2cset -y 1 0x20 0x02
sleep 2
i2cset -y 1 0x20 0x03
sleep 2
i2cset -y 1 0x20 0x04
sleep 2
i2cset -y 1 0x20 0x05
sleep 2
i2cset -y 1 0x20 0x06
sleep 2
i2cset -y 1 0x20 0x07
sleep 2
i2cset -y 1 0x20 0x08
sleep 2
i2cset -y 1 0x20 0x09
sleep 2
i2cset -y 1 0x20 0x00


Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2016/11/13/svxlink-interface-i2c-vers-bcd-pilotez-vos-radio/feed/ 0 3104
SVXLINK: Local.tcl et ses améliorations https://blog.f8asb.com/2016/11/12/svxlink-local-tcl-et-ses-ameliorations/ https://blog.f8asb.com/2016/11/12/svxlink-local-tcl-et-ses-ameliorations/#respond Sat, 12 Nov 2016 07:07:21 +0000 http://blog.f8asb.com/?p=2972 Continuer la lecture ]]> local_tclVoila pourquoi LOLA parle si bien…

Les nouvelles fonctionnalités sur F1ZBV ne pourraient pas fonctionner sans la modification de ce fichier c’est pour cela que j’ai décidé de vous le fournir et de vous le décrire.
Le principe des fonctions et de limiter les lignes de code et de pouvoir les appeler autant de fois que l’on en a besoin.
Le fichier Locale.tcl se place dans le repertoire de la langue pour nous: fr_FR
/usr/share/svxlink/sounds/fr_FR/events.d/Locale.tcl

Je pense que la majorité des nouvelles fonctions peuvent être compatibles avec d’autres langues, ou nécessitent quelques petites modifications.

Voici les fonctions que j’y ai ajoutées:
playTemp                                 dire la température
playFourDigitNumber       dire un chiffre à 4 décimales
playMonth                               dire le mois
playWindDir                          dire la direction d’après la lettre  (ex: N pour Nord)
playVoltage                             dire une tension

le fonctionnement est simple et commun à toute les fonctions. Il est nécessaire d’ajouter les fichiers sons correspondants.

A n’importe quelle moment dans votre programme tcl il vous suffira d’insérer cette fonction pour l’utiliser de la manière suivante:

<fonction> <variable> <;>
ex:
playNumber $resultat1;

playTemp
c'est fonction dira pour une valeur de 16.5: Seize degrés cinq                            playFourDigitNumber
c'est fonction dira pour une valeur de 1250: Mille deux cent cinquante
playMonth
c'est fonction dira pour une valeur de 02: Février 
playWindDir
c'est fonction dira pour une valeur de E: Est     

playVoltage
c'est fonction dira pour une valeur de 13.8Treize volts huit

Les codes complets du Locale.tcl ci-dessous:

###############################################################################
#
# Locale specific functions for playing back time, numbers and spelling words.
# Often, the functions in this file are the only ones that have to be
# reimplemented for a new language pack.
#
###############################################################################

#
#  25/06/2011   F1SMF    modif  for fr_FR
#  04/04/2016  F8ASB Add playTemp read temperature datas for fr_FR
#  01/10/2016  F8ASB Add functions:
#  playFourDigitNumber  Say number with four digits
#  playMonth            Say the month with the number
#  playWindDirAngle     Say winf direction with angle
#  playWindDir          Say wind direction with letter direction 
#  playTemp             Say temperature 
#  playVoltage          Say Voltage

#
# Spell the specified word using a phonetic alphabet
#
proc spellWord {word} {
  set word [string tolower $word];
  for {set i 0} {$i < [string length $word]} {set i [expr $i + 1]} {
    set char [string index $word $i];
    if {$char == "*"} {
      playMsg "Default" "star";
    } elseif {$char == "/"} {
      playMsg "Default" "slash";
    } elseif {$char == "-"} {
      playMsg "Default" "dash";
    } elseif {[regexp {[a-z0-9]} $char]} {
      playMsg "Default" "phonetic_$char";
    }
  }
}


#
# Spell the specified number digit for digit
#
proc spellNumber {number} {
  for {set i 0} {$i < [string length $number]} {set i [expr $i + 1]} {
    set ch [string index $number $i];
    if {$ch == "."} {
      playMsg "Default" "decimal";
    } else {
      playMsg "Default" "$ch";
    }
  }
}


#
# Say the specified two digit number (00 - 99)
#
proc playTwoDigitNumber {number} {
  if {[string length $number] != 2} {
    puts "*** WARNING: Function playTwoDigitNumber received a non two digit number: $number";
    return;
  }

  set first [string index $number 0];
if {($first == "0") || ($first == "O")} {
    playMsg "Default" $first;
    playMsg "Default" [string index $number 1];
   }  elseif {$first == "1"} {
        playMsg "Default" $number;
        }  elseif {$first == "7"} {
             playMsg "Default" "6X";
             if {[string index $number 1] == "1"} {
                 playMsg "Default" "and";
             }
             playMsg "Default" [expr $number - 60];
             } elseif {$first == "9"}  {
                  playMsg "Default" "8X";
                  playMsg "Default" [expr $number - 80];
                  } else {
                    playMsg "Default" "[string index $number 0]X";
                    if {[string index $number 1] == "1"} {
                        playMsg "Default" "and";
                    }
                    if {[string index $number 1] != "0"} {
                         playMsg "Default" "[string index $number 1]";
                    }
                  }
             }
#
# Say the specified three digit number (000 - 999)
#
proc playThreeDigitNumber {number} {
  if {[string length $number] != 3} {
    puts "*** WARNING: Function playThreeDigitNumber received a non three digit number: $number";
    return;
  }
  
  set first [string index $number 0];
    if {($first == "0") || ($first == "O")} {
    spellNumber $number
  } else {
    append first "00";
    playMsg "Default" $first;
    if {[string index $number 1] != "0"} {
      playTwoDigitNumber [string range $number 1 2];
    } elseif {[string index $number 2] != "0"} {
      playMsg "Default" [string index $number 2];
    }
  }
}

#
# Say the specified three digit number (1000 - 9999)
#
proc playFourDigitNumber {number} {
  if {[string length $number] != 6} {
    puts "*** WARNING: Function playFourDigitNumber received a non four digit number: $number";
    return;
  }

  set first [string index $number 0];
    if {($first == "1")} {
    playMsg "Default" "1000";
  } elseif {($first == "2")} {
    playMsg "Default" "2000";
  } elseif {($first == "3")} {
    playMsg "Default" "3000";
  } elseif {($first == "4")} {
    playMsg "Default" "4000";
  } elseif {($first == "5")} {
    playMsg "Default" "5000";
  } elseif {($first == "6")} {
    playMsg "Default" "6000";
  } elseif {($first == "7")} {
    playMsg "Default" "7000";
  } elseif {($first == "8")} {
    playMsg "Default" "8000";
  } elseif {($first == "9")} {
    playMsg "Default" "9000";  
  }
  set first [string index $number 1];
    if {($first == "0") || ($first == "O")} {
    playNumber [string range $number 2 5];
    } else {
    playNumber [string range $number 1 5];
    }
 }
#
#Say Month as intelligent as posible.
#

proc playMonth {Month} {
if { $Month =="01"} {
        playMsg "Months" "january";
    } elseif {$Month =="02"} {
        playMsg "Months" "February";
    } elseif {$Month =="03" } {
        playMsg "Months" "March";
    } elseif {$Month =="04" } {
        playMsg "Months" "April";
    } elseif {$Month =="05" } {
        playMsg "Months" "May";
    } elseif {$Month =="06" } {
        playMsg "Months" "June";
    } elseif {$Month =="07" } {
        playMsg "Months" "July";
    } elseif {$Month =="08" } {
        playMsg "Months" "August";
    } elseif {$Month =="09" } {
        playMsg "Months" "September";
    } elseif {$Month =="10" } {
        playMsg "Months" "October";
    } elseif {$Month =="11" } {
        playMsg "Months" "November";
    } elseif {$Month =="12" } {
        playMsg "Months" "December";  
}
 
}

#
#Say Wind Direction as intelligent as posible.
#

proc playWindDirAngle {windDir} {

if { $windDir =="N"} {
        puts "  Direction N"
        playMsg "WeatherStation" "North";
    } elseif {$windDir =="NNE"} {
        puts "  Direction NNE"
        playMsg "WeatherStation" "North";
        playMsg "WeatherStation" "North-East";
    } elseif {$windDir =="NE" } {
        puts "  Direction NE"
        playMsg "WeatherStation" "North-East";
    } elseif {$windDir =="ENE" } {
        puts "  Direction ENE"
        playMsg "WeatherStation" "East";
        playMsg "WeatherStation" "North-East";
    } elseif {$windDir =="E" } {
        puts "  Direction E"
        playMsg "WeatherStation" "East";
    } elseif {$windDir =="ESE"} {
        puts "  Direction ESE"
        playMsg "WeatherStation" "East";
         playMsg "WeatherStation" "South-East"; 
    } elseif {$windDir =="SE" } {
        puts "  Direction SE"
        playMsg "WeatherStation" "South-East";
    } elseif {$windDir =="SSE" } {
        puts "  Direction SSE"
        playMsg "WeatherStation" "South";
        playMsg "WeatherStation" "South-East";
    } elseif {$windDir =="S"} {
        puts "  Direction S"
        playMsg "WeatherStation" "South";
    } elseif {$windDir =="SSW" } {
        puts "  Direction SSW"
        playMsg "WeatherStation" "South";
        playMsg "WeatherStation" "South-West";
    } elseif {$windDir =="SW"} {
        puts "  Direction SW"
        playMsg "WeatherStation" "South-West";
    } elseif {$windDir =="WSW" } {
        puts "  Direction WSW"
        playMsg "WeatherStation" "West";
        playMsg "WeatherStation" "South-West";
    } elseif {$windDir =="W"} {
        puts "  Direction W"
        playMsg "WeatherStation" "West";
    } elseif {$windDir =="WNW"} {
        puts "  Direction WNW"
        playMsg "WeatherStation" "West";
        playMsg "WeatherStation" "North-West";
    } elseif {$windDir =="NW"} {
        puts "  Direction NW"
       playMsg "WeatherStation" "North-West";
    } elseif {$windDir =="NNW" } {
        puts "  Direction NNW"
       playMsg "WeatherStation" "North";
       playMsg "WeatherStation" "North-West";
    } else {
        puts "  Non disponible"
    }
    }
#
#Say Wind Direction with angle as intelligent as possible.
#

proc playWindDir {windDir} {

if { 0 < $windDir && $windDir < 22.5} { puts " Direction N" playMsg "WeatherStation" "North"; } elseif {$windDir >= 22.5 && $windDir < 45 } { puts " Direction N NE" playMsg "WeatherStation" "North"; playMsg "WeatherStation" "North-East"; } elseif {$windDir >= 45 && $windDir < 67.5 } { puts " Direction NE" playMsg "WeatherStation" "North-East"; } elseif {$windDir >= 67.5 && $windDir < 90 } { puts " Direction NE E" playMsg "WeatherStation" "North-East"; playMsg "WeatherStation" "East"; } elseif {$windDir >= 90 && $windDir < 112.5 } { puts " Direction E" playMsg "WeatherStation" "East"; } elseif {$windDir >= 112.5 && $windDir < 135 } { puts " Direction E SE" playMsg "WeatherStation" "East"; } elseif {$windDir >= 135 && $windDir < 157.5 } { puts " Direction SE" playMsg "WeatherStation" "South-East"; } elseif {$windDir >= 157.5 && $windDir < 180 } { puts " Direction SE S" playMsg "WeatherStation" "South-East"; playMsg "WeatherStation" "South"; } elseif {$windDir >= 180 && $windDir < 202.5} { puts " Direction S" playMsg "WeatherStation" "South"; } elseif {$windDir >= 202.5 && $windDir < 225 } { puts " Direction S SW" playMsg "WeatherStation" "South"; playMsg "WeatherStation" "South-West"; } elseif {$windDir >= 225 && $windDir < 247.5} { puts " Direction SW" playMsg "WeatherStation" "South-West"; } elseif {$windDir >= 247.5 && $windDir < 270 } { puts " Direction SW W" playMsg "WeatherStation" "South-West"; playMsg "WeatherStation" "West"; } elseif {$windDir >= 270 && $windDir < 292.5} { puts " Direction W" playMsg "WeatherStation" "West"; } elseif {$windDir >= 292.5 && $windDir < 315 } { puts " Direction W NW" playMsg "WeatherStation" "West"; playMsg "WeatherStation" "North-West"; } elseif {$windDir >= 315 && $windDir < 337.5} { puts " Direction NW" playMsg "WeatherStation" "North-West"; } elseif {$windDir >= 337.5 && $windDir < 359 } { puts " Direction NW N" playMsg "WeatherStation" "North-West"; playMsg "WeatherStation" "North"; } else { puts " Non disponible" } } # # Say a number as intelligent as possible. Examples: # # 1 - one # 24 - twentyfour # 245 - twohundred and fourtyfive # 1234 - twelve thirtyfour # 12345 - onehundred and twentythree fourtyfive # 136.5 - onehundred and thirtysix point five # proc playNumber {number} { if {[regexp {(\d+)\.(\d+)?} $number -> integer fraction]} {
    playNumber $integer;


# No say 0 if decimal = 0
if {$fraction != 0} {
    playMsg "Default" "decimal";
    spellNumber $fraction;
}

    return;
  }

  while {[string length $number] > 0} {
    set len [string length $number];
    if {$len == 1} {
      playMsg "Default" $number;
      set number "";
    } elseif {$len % 2 == 0} {
      playTwoDigitNumber [string range $number 0 1];
      set number [string range $number 2 end];
    } else {
      playThreeDigitNumber [string range $number 0 2];
      set number [string range $number 3 end];
    }
  }
}

#
# Say temperature as intelligent as possible. Examples:
#

proc playTemp {number} {
  if {[regexp {(\d+)\.(\d+)?} $number -> integer fraction]} {
    playNumber $integer;
    playMsg "WeatherStation" "degree";

# No say 0 if decimal = 0
if {$fraction != 0} {
    spellNumber $fraction;
}
   return;
}

  while {[string length $number] > 0} {
    set len [string length $number];
    if {$len == 1} {
      playMsg "Default" $number;
      set number "";
    } elseif {$len % 2 == 0} {
      playTwoDigitNumber [string range $number 0 1];
      set number [string range $number 2 end];
    } else {
      playThreeDigitNumber [string range $number 0 2];
      set number [string range $number 3 end];
    }
  }
}

#
# Say Voltage as intelligent as possible. Examples:
#

proc playVoltage {number} {
if {[regexp {(\d+)\.(\d+)?} $number -> integer fraction]} {
    playNumber $integer;
    playMsg "Default" "volts";

# No say 0 if decimal = 0
if {$fraction != 0} {
    spellNumber $fraction;
}
   return;
}

  while {[string length $number] > 0} {
    set len [string length $number];
    if {$len == 1} {
      playMsg "Default" $number;
      set number "";
    } elseif {$len % 2 == 0} {
      playTwoDigitNumber [string range $number 0 1];
      set number [string range $number 2 end];
    } else {
      playThreeDigitNumber [string range $number 0 2];
      set number [string range $number 3 end];
    }
  }
}


#
# Say the time specified by function arguments "hour" and "minute".
#

proc playTime {hour minute} {
# Strip white space and leading zeros. Check ranges.
  if {[scan $hour "%d" hour] != 1 || $hour < 0 || $hour > 23} {
    error "playTime: Non digit hour or value out of range: $hour"
  }
  if {[scan $minute "%d" minute] != 1 || $minute < 0 || $minute > 59} {
    error "playTime: Non digit minute or value out of range: $hour"
  }
  if {[string length $hour] == 1} {
     playMsg "Default" [expr $hour];
   } else {
     playTwoDigitNumber $hour;
    }
#  playSilence 250
  playMsg "Core" "time";

   if {$minute == 0} {
     return;
   }
    if {[string length $minute] == 1} {
        playMsg "Default" [expr $minute];
    } else {
        playTwoDigitNumber  $minute;
    }
}

#
# This file has not been truncated
#

Vous pouvez vous aussi créer vos propres fonctions et partager.

Vous pouvez recevoir un email dès la parution d’un article sur le Blog F8ASB.COM, entrez votre mail sur la fenêtre à droite et cliquer sur abonnement. Tous les articles en 1 clic ICI
]]>
https://blog.f8asb.com/2016/11/12/svxlink-local-tcl-et-ses-ameliorations/feed/ 0 2972