Retour à Astuces

Relais D-Star: Commandes par Radio

DPP_0001Voici un petit programme en Python qui peut compléter dstarrepeater de G4KLX. (il n’est pas compatible avec repeater)

Via la radio, vous pouvez envoyer des commandes au relais qui apportent quelques fonctionnalités complémentaires.
Elles doivent être placée dans le « Your » à la place du CQCQCQ
Voici la liste:
TIME pour vous afficher l’heure
WX vous informe de la température, la pression et le l’humidité dans votre région.

Les commandes suivantes sont réservées au Sysop du relais:
REBOOT pour redémarrer le Raspberry
HALT pour arrêter le Raspberry
(Attention le HALT arrêtera définitivement le relais, pour le redémarrer il faudra intervenir électriquement sur le raspberry)
IRCDDB pour redémarrer Ircddbgateway
TEMP RPI pour afficher la température du Raspberry

Pour l’installation du programme:

mkdir /home/pi/FxZxx
(Remplacer FxZxx par l'indicatif de votre relais)

ensuite vous devez installer le programme CdeRelais.py dans le répertoire /home/pi/FxZxx/:

cd /home/pi/FxZxx/
wget http://www.f4gen.fr/G4KLX/CdeRelais.py

puis, il faut le rendre exécutable avec la commande:

sudo chmod +x CdeRelais.py

si vous souhaitez qu’il se lance au démarrage du Raspberry:
Editer le fichier rc.local:

sudo nano /etc/rc.local

Ajouter avant la commande Exit 0:

/home/pi/FxZxx/CdeRelais.py &

Pour la configuration du programme:

Dans les lignes suivantes vous devez renseigner:
– votre indicatif dans la variable sysop (attention de respecter les 8 caractères, espaces inclus
– l’indicatif de votre relais dans la variable relais (la lettre B ou C en 8eme position)
– APIwunderground doit contenir votre clef wunderground que vous pouvez obtenir gratuitement à cette adresse: http://www.wunderground.com/weather/api/d/pricing.html
– APIgps pour vos coordonnées (latitude,longitude)

sysop = "Fxxxx   "
relais = "FxZxx  B"
APIwunderground = "votre clef wunderground"
APIgps = "48.65448,6.10721"

Si vous souhaitez vider le fichier log headers à chaque démarrage du raspberry, retirer les # en début des lignes suivantes:

#fichier = open(headers,"w")
#fichier.close()

Si vous souhaitez modifier le nom des commandes, vous pouvez les modifier ici (en respectant les 8 caractères)

                if your=="REBOOT  ":

ou

                 if your=="HALT    ":

pour la fonction HALT, vous devez retirer les # devant les lignes pour rendre cette fonction opérationnelle

Voici le Programme CdeRelais.py:

#!/usr/bin/python3

from time import sleep,strftime
from datetime import date, time, datetime
import time
import os
import subprocess
import urllib.request
import json

# Fichiers de Config
sysop = "Fxxxx   "
relais = "FxZxx  B"
APIwunderground = ""
APIgps = "48.65448,6.10721"

headers="/var/log/opendv/Headers.log"

fmt = "%Y-%m-%d %H:%M:%S"
wxurl = "http://api.wunderground.com/api/"+APIwunderground+"/conditions/lang:FR/q/"+APIgps+".json"

GET_IP_CMD = "hostname --all-ip-addresses"
GET_TEMP_CMD = "/usr/bin/vcgencmd measure_temp"

def run_cmd(cmd):
    return subprocess.check_output(cmd, shell=True).decode('utf-8')

def get_my_ip():
    return run_cmd(GET_IP_CMD)[:-1]

def get_my_temp():
    return run_cmd(GET_TEMP_CMD)[5:9]

#Effacement du contenu de Headers.log
#fichier = open(headers,"w")
#fichier.close()

while True:       

#recherche indicatif du dernier appelant

        indicatif=""
        if os.path.getsize(headers):
           command="(grep -v \"  /TIME\" "+headers+" |sort -r -k7,7|sort -u -k7,8|sort -r|head -1 > /tmp/lastlineheard.log) 2>&1 &"
           run_cmd(command)
           fichier = open("/tmp/lastlineheard.log","r")
           lignes = fichier.readlines()
           fichier.close()
           last_ligne = lignes[-1].rstrip("\n\r")
           #print (last_ligne)
           date = datetime.utcnow()
           last_date = date.isoformat()[:10]+' '+date.isoformat()[11:19]
           dateligne = last_ligne[0:19]

           d1 = datetime.strptime(dateligne, fmt)
           d2 = datetime.strptime(last_date, fmt)

           # convert to unix timestamp
           d1_ts = time.mktime(d1.timetuple())
           d2_ts = time.mktime(d2.timetuple())

           if int(d2_ts-d1_ts)<5:

              index = last_ligne.find("My: ")+4
              indicatif=last_ligne[index:index+8]
              index = last_ligne.find("Your: ")+6
              your=last_ligne[index:index+8]
              if indicatif==sysop:
                 if your=="REBOOT  ":
                    fichier = open(headers,"w")
                    fichier.close()
                    run_cmd("reboot")
                    raise SystemExit
                 #if your=="HALT    ":
                    #os.system("sudo halt")
                    #raise SystemExit
                 if your=="TEMP RPI":
                    sleep(2)
                    temprpi="Temp Rpi: "+get_my_temp()+"C"
                    command="texttransmit -text '"+temprpi+"' '"+relais+"'"
                    run_cmd(command)
                 if your=="IRCDDB  ":
                    sleep(2)
                    command="sudo /etc/init.d/ircddbgateway restart"
                    os.system(command)
              if your=="TIME    ":
                 heure="Il est "+strftime("%H:%M:%S")
                 sleep(2)
                 command="texttransmit -text '"+heure+"' '"+relais+"'"
                 run_cmd(command)
              if your=="WX      " and APIwunderground!="":
                 f = urllib.request.urlopen(wxurl)
                 json_string = f.read()
                 parsed_json = json.loads(json_string.decode('UTF-8'))
                 temp_c = parsed_json['current_observation']['temp_c']
                 pression = parsed_json['current_observation']['pressure_mb']
                 humidite = parsed_json['current_observation']['relative_humidity']
                 #print ("Current temperature is: %s" % ( temp_c) )
                 f.close()
                 wxmessage = str(temp_c)+"C "+pression+"mb "+humidite
                 sleep(1)
                 command="texttransmit -text '"+wxmessage+"' '"+relais+"'"
                 run_cmd(command)

#Pause
        sleep(1)