Script reboot box SFR THD 4k

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Répondre
Mat67
Messages : 2
Enregistré le : 28 août 2018, 22:13

Script reboot box SFR THD 4k

Message par Mat67 »

Bonjour à tous,

si comme moi vous possédez cette box, que celle-ci perd régulièrement la synchro et que les appels au 1023 ne servent à rien (sauf à vous énerver :twisted: ), vous trouverez ci-dessous un petit script python qui permet de rebooter la box comme vous le feriez en cliquant sur le bouton reboot de sa page d'administration. Ce script ne reboot que le modem (wifi compris) et non pas la box complète (partie TV) mais suffit à retrouver la synchro.

Ce script peut s'appeler depuis domoticz à partir d'un switch, d'un autre script, etc etc bref je vous laisse déterminer le bon moment de l'appeler en fonction des autres scripts que vous trouverez sur ce forum.

Enfin je remercie ce site https://jp.palik.fr/redemarrer-une-box- ... -via-curl/ à partir duquel je me suis inspiré pour mon script mais que je n'ai pas pu utiliser en l'état car il ne gère malheureusement pas les ids de session.

Explication du script :
- on se connecte la page de login.html
- on récupère un id de session
- on envoie son login, son mot de passe et son id de session (comme vous le feriez depuis la page officielle)
- la box renvoie un nouvel id de session qu'on récupère
- on envoie la demande de reboot avec le nouvel id de session
Le tour est joué il n'y a plus qu'à attendre que la box redémarre et se resynchronise

Les pros du python trouveront certainement des améliorations à apporter à mon script car je précise que je ne suis pas du tout un développeur python mais j'accepte avec plaisir les remarques constructives.

Enjoy et que les pertes de synchro ne soient plus qu'un mauvais souvenir ! :D
Mat

Code : Tout sélectionner

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

# importing the requests, regular expressions and time libraries
import requests
import re
import time

ip_addr = "192.168.1.253"    # IP address of the SFR box
login   = "admin"
pswd    = "yourpassword"


timeout = 3


try:
    #########################################################################################################
    # Connect to login page and get auth token
    URL = "http://" + ip_addr + "/login.html"

    print("Opening " + URL) 
    r = requests.get(url = URL, headers={'Connection':'keep-alive'}, timeout = timeout)
    r.raise_for_status()

    # The login page contains the Session Key declared as follows :   var SessionKey = '273582092';
    # --> get it with regular expression
    SessionKey = "0"
    items=re.findall("SessionKey =.*$",r.text,re.MULTILINE)
    for x in items:
        print(x)
        m = re.match(r'SessionKey = \'(.*)\';', x)
        SessionKey = m.group(1)
        print(SessionKey)
    
    if(SessionKey == "0"):
        raise ValueError('SessionKey not found in ' + URL)

    time.sleep(1)

    #########################################################################################################
    # Submit login, password and session key to the login page with a post like the user would do it
    URL = "http://" + ip_addr + "/goform/login?sessionKey=" + SessionKey

    # Data to be sent to api
    data = {'loginUsername':login,
            'loginPassword':pswd}
    
    # Send post request and save response as response object
    print("Opening " + URL)
    r = requests.post(url = URL, data = data, headers={'Connection':'keep-alive'}, timeout = timeout)
    r.raise_for_status()

    # Extract the new Session Key provided by the admin page
    SessionKey = "0"
    items=re.findall("SessionKey =.*$",r.text,re.MULTILINE)
    for x in items:
        print(x)
        m = re.match(r'SessionKey = \'(.*)\';', x)
        SessionKey = m.group(1)
        print(SessionKey)

    if(SessionKey == "0"):
        raise ValueError('SessionKey not found in ' + URL)


    time.sleep(1)

    #########################################################################################################
    # Call reboot service
    URL = "http://" + ip_addr + "/goform/WebUiOnlyReboot?sessionKey=" + SessionKey

    data = {'sessionKey':SessionKey}

    # sending post request and saving response as response object
    print("Opening " + URL)
    r = requests.post(url = URL, headers={'Connection':'keep-alive','Content-Type':'application/x-www-form-urlencoded','Referer':'http://' + ip_addr + '/config.html'}, timeout = timeout)
    r.raise_for_status()

    # DONE, waiting for the modem to reboot!


except requests.exceptions.Timeout as e:
    print("TimeoutError! :" + str(e))
except requests.exceptions.TooManyRedirects as e:
    print("Bad URL with too many redirection! :" + str(e))
except requests.exceptions.RequestException as e:
    print("Request exception! :" + str(e))
except requests.exceptions.HTTPError as e:
    print("HTTP error! :" + str(e))
except ValueError as e:
    print(str(e))



Estebus
Messages : 1
Enregistré le : 25 sept. 2018, 23:37

Re: Script reboot box SFR THD 4k

Message par Estebus »

Bonjour,

Je viens de m'inscrire sur le forum pour te remercier :-)

Ton script fonctionne parfaitement et il me solutionne se problème de perte de performance que cette box a après quelques jours de fonctionnement.
Je viens de le mettre dans mon crontab pour exécution 2 fois par semaine.

Perfect 8-)

Mat67
Messages : 2
Enregistré le : 28 août 2018, 22:13

Re: Script reboot box SFR THD 4k

Message par Mat67 »

Salut Estebus,

merci d'avoir pris la peine de t'inscrire pour me remercier et heureux d'avoir pu t'aider.

De mon côté je lance le script dès que le ping vers google lancé à intervalles espacés échoue plus de 10 min de suite.
Ca me permet de toujours garder une connexion active malgré les nombreux plantages de cette box.

Mat

Répondre