class ServiceReseauLocal(InterfaceService): # Constructeur def __init__(self, pa, nom): super().__init__(pa, nom) # Page d'affichage def afficher(self): # On récupère la liste des appareils connectés au réseau local appareils = appareils_connectes('192.168.0.*', 15) message = [] for k in range(len(appareils)): message += ['%s : %s' % (appareils[k]['ip'], appareils[k]['nom'])] # On afficheg la page self.label1 = Label(self.pa.minitel, 0.05, 0.1, message, 0.8, 0.45, True, 'gauche') self.label2 = Label(self.pa.minitel, 0.58, 0.99, ['Rafraîchir :'], 0.0, 0.0, False, 'gauche') self.ligne = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.bouton2 = Bouton(self.pa.minitel, 0.9, 0.99, 0.0, 'ENVOI') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.label2) self.elements.ajouter(self.ligne) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.afficher() self.elements.executer({ 'SOMMAIRE': self.pa.executer, 'ENVOI': self.executer })
class ServiceSonnette(InterfaceService): # Constructeur def __init__( self, pa, nom ): super().__init__(pa, nom) # Page d'affichage def afficher( self ): self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.afficher() self.elements.executer({'SOMMAIRE':self.pa.executer})
class PageAccueil: def __init__(self, titre, version, auteur): self.minitel = Minitel() self.minitel.deviner_vitesse() self.minitel.identifier() self.minitel.definir_vitesse(9600) self.minitel.definir_mode('VIDEOTEX') self.minitel.configurer_clavier(etendu=True, curseur=False, minuscule=True) self.minitel.echo(False) self.minitel.curseur(False) self.services = [] self.titre = titre self.version = version self.auteur = auteur def ajouter_service(self, service): self.services += [service] def executer(self): self.effacer() self.afficher() def effacer(self): self.minitel.effacer('vraimenttout') def afficher(self): message = [] for k in range(len(self.services)): message += ['%d. %s' % (k + 1, self.services[k].nom)] self.label1 = Label(self.minitel, 0.1, 0.0, [ self.titre, '-------------', 'v%s - %s' % (self.version, self.auteur) ], 0.7, 0.22, True, 'centre') self.label2 = Label(self.minitel, 0.1, 0.4, message, 0.7, 0.0, True, 'gauche') self.ligne1 = Ligne(self.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.minitel, 0.9, 0.99, 0.1, 'ENVOI') self.label3 = Label(self.minitel, 0.0, 0.99, ['Choix :']) self.champ1 = ChampTexte(self.minitel, 0.2, 0.99, 2, 2, '') self.elements = Conteneur(self.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.label2) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.label3) self.elements.ajouter(self.champ1) self.elements.afficher() self.elements.executer({'ENVOI': self.valider}) def valider(self): if not is_a_number(self.champ1.valeur): self.minitel.bip() return choix = int(self.champ1.valeur) if choix < 1 or choix > len(self.services): self.minitel.bip() return self.services[choix - 1].executer() def __del__(self): self.minitel.stopper()
class ServiceVolets(InterfaceService): # Constructeur def __init__(self, pa, nom): super().__init__(pa, nom) self.pages = { 'connection': self.afficher_page_connection, 'resultats': self.afficher_page_resultats } self.page_actuelle = 'connection' # Execution du service def executer(self): # On efface d'abord l'écran self.effacer() # On affiche la page courante if self.page_actuelle in self.pages: self.pages[self.page_actuelle]() ################################################################################### # Page de connection def afficher_page_connection(self): self.label1 = Label(self.pa.minitel, 0.05, 0.1, [ 'Veuillez saisir les champs', 'ci-dessous pour piloter', 'ouverture/fermeture des volets' ], 0.8, 0.2, True, 'centre') self.label2 = Label( self.pa.minitel, 0.05, 0.4, ['Adresse réseau :', ' Identifiant :', ' Mot de passe :'], 0.8, 0.2, True, 'gauche') self.champ1 = ChampTexte(self.pa.minitel, 0.53, 0.51, 15, 100, '') self.champ2 = ChampTexte(self.pa.minitel, 0.53, 0.54, 15, 100, '') self.champ3 = ChampTexte(self.pa.minitel, 0.53, 0.57, 15, 100, '', None, True) self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.bouton2 = Bouton(self.pa.minitel, 0.9, 0.99, 0.0, 'ENVOI') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.label2) self.elements.ajouter(self.champ1) self.elements.ajouter(self.champ2) self.elements.ajouter(self.champ3) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.afficher() self.elements.executer({ 'SOMMAIRE': self.pa.executer, 'ENVOI': self.valider_page_connection }) # Validation des informations de connection def valider_page_connection(self): # On récupère la valeur des champs texte self.url_base = self.champ1.valeur self.identifiant = self.champ2.valeur self.mot_passe = self.champ3.valeur # On vérifie si les champs ne sont pas vides if len(self.url_base) == 0 or len(self.identifiant) == 0 or len( self.mot_passe) == 0: self.pa.minitel.erreur(1, 20, "Merci de remplir tous les champs") self.elements.element_actif.gerer_arrivee() return # On encode l'identifiant et le mot de passe en base64 self.identifiant = base64.b64encode( self.identifiant.encode('ascii')).decode('ascii') self.mot_passe = base64.b64encode( self.mot_passe.encode('ascii')).decode('ascii') # On affiche la page résultats self.page_actuelle = 'resultats' self.executer() ################################################################################### # Page d'affichage des résultats def afficher_page_resultats(self): # On récupère les données sur les volets url = '%s/json.htm?type=devices&filter=all&used=true&order=Name&username=%s&password=%s' % ( self.url_base, self.identifiant, self.mot_passe) contenu = requests.get(url) donnees = contenu.json() # On vérifie si la connection est ok if donnees['status'] != 'OK': self.pa.minitel.erreur(1, 20, "Impossible de se connecter") self.page_actuelle = 'connection' self.executer() return # On stocke les données sur les volets au bon format self.volets = [] for volet in donnees['result']: self.volets += [{ 'idx': volet['idx'], 'etat': ('o' if volet['Status'] == 'Open' else 'f'), 'nom': volet['Name'] }] # On affiche la liste des volets options = [] for k in range(len(self.volets)): options += [ '%s (%s)' % (self.volets[k]['nom'], self.volets[k]['etat']) ] self.menu1 = Menu(self.pa.minitel, options, 0.2, 0.3) self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.label1 = Label(self.pa.minitel, 0.5, 0.99, ['Ouvrir/fermer :'], 0.0, 0.0, False, 'gauche') self.bouton2 = Bouton(self.pa.minitel, 0.9, 0.99, 0.0, 'ENVOI') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.menu1) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.label1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.afficher() self.elements.executer({ 'SOMMAIRE': self.pa.executer, 'ENVOI': self.valider_page_resultats }) # Page de validation des résultats def valider_page_resultats(self): # On récupère l'idx du volet sélectionné idx = self.volets[self.menu1.selection]['idx'] # On choisit l'action à mener sur le volet en fonction de son état etat = self.volets[self.menu1.selection]['etat'] action = ('On' if etat == 'o' else 'Off') # On actionne le volet sélectionné url = '%s/json.htm?type=command¶m=switchlight&idx=%s&switchcmd=%s&username=%s&password=%s' % ( self.url_base, idx, action, self.identifiant, self.mot_passe) contenu = requests.get(url) donnees = contenu.json() # On vérifie si tout s'est bien passé if donnees['status'] != 'OK': self.pa.minitel.erreur(1, 20, "Impossible d'actionner le volet") self.elements.element_actif.gerer_arrivee() return else: sleep(1) self.executer()
class ServiceWifi(InterfaceService): # Constructeur def __init__(self, pa, nom): super().__init__(pa, nom) # Page d'accueil du service def afficher(self): self.label1 = Label(self.pa.minitel, 0.05, 0.1, [ 'Veuillez saisir les informations', 'ci-dessous pour changer le', 'mot de passe réseau wifi' ], 0.8, 0.2, True, 'centre') self.label2 = Label(self.pa.minitel, 0.05, 0.4, [ ' SSID réseau wifi :', ' Mot de passe actuel :', 'Nouveau mot de passe :', ' Confirmation :' ], 0.8, 0.24, True, 'gauche') self.champ1 = ChampTexte(self.pa.minitel, 0.67, 0.51, 9, 100, ssid_wifi_actuel()) self.champ2 = ChampTexte(self.pa.minitel, 0.67, 0.54, 9, 100, '', None, True) self.champ3 = ChampTexte(self.pa.minitel, 0.67, 0.57, 9, 100, '', None, True) self.champ4 = ChampTexte(self.pa.minitel, 0.67, 0.61, 9, 100, '', None, True) self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.bouton2 = Bouton(self.pa.minitel, 0.9, 0.99, 0.0, 'ENVOI') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.label2) self.elements.ajouter(self.champ1) self.elements.ajouter(self.champ2) self.elements.ajouter(self.champ3) self.elements.ajouter(self.champ4) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.afficher() self.elements.executer({ 'SOMMAIRE': self.pa.executer, 'ENVOI': self.valider }) # Validation de la page d'accueil du service def valider(self): # On récupère la valeur des champs ssid_reseau = self.champ1.valeur mot_passe_actuel = self.champ2.valeur nouveau_mot_passe = self.champ3.valeur confirmation_mot_passe = self.champ4.valeur # On vérifie que les champs soient non vides if len(ssid_reseau) == 0 or len(mot_passe_actuel) == 0 or len( nouveau_mot_passe) == 0 or len(confirmation_mot_passe) == 0: self.pa.minitel.erreur(1, 20, "Merci de remplir tous les champs") self.elements.element_actif.gerer_arrivee() return # On vérifie que le mot de passe est bien confirmé if nouveau_mot_passe != confirmation_mot_passe: self.pa.minitel.erreur( 1, 20, "Le nouveau mot de passe doit être confirmé") self.elements.element_actif.gerer_arrivee() return
class ServiceMeteo(InterfaceService): # Constructeur def __init__( self, pa, nom ): super().__init__(pa, nom) self.pages = {'saisie':self.afficher_page_saisie,'resultats':self.afficher_page_resultats} self.page_actuelle = 'saisie' self.numero_page_resultats = 0 self.nb_pages_resultats = 4 locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') # Execution du service def executer( self ): # On efface d'abord l'écran self.effacer() # On affiche la page courante if self.page_actuelle in self.pages: self.pages[self.page_actuelle]() ################################################################################### # Affichage de la page de saisie def afficher_page_saisie( self ): self.label1 = Label(self.pa.minitel, 0.05, 0.1, ['Veuillez saisir la commune','et le pays ou les coordonnées','géographiques désirées'], 0.8, 0.2, True, 'centre') self.label2 = Label(self.pa.minitel, 0.05, 0.4, [' Commune :',' Pays :',' Latitude :','Longitude :'], 0.8, 0.27, True, 'gauche') self.champ1 = ChampTexte(self.pa.minitel, 0.4, 0.51, 20, 30, geocoder.ip('me').city) self.champ2 = ChampTexte(self.pa.minitel, 0.4, 0.54, 20, 30, geocoder.ip('me').country) self.champ3 = ChampTexte(self.pa.minitel, 0.4, 0.57, 20, 30, '') self.champ4 = ChampTexte(self.pa.minitel, 0.4, 0.61, 20, 30, '') self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.bouton2 = Bouton(self.pa.minitel, 0.9, 0.99, 0.0, 'ENVOI') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.label2) self.elements.ajouter(self.champ1) self.elements.ajouter(self.champ2) self.elements.ajouter(self.champ3) self.elements.ajouter(self.champ4) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.afficher() self.elements.executer({'SOMMAIRE':self.pa.executer,'ENVOI':self.valider_page_saisie}) # Validation de la saisie def valider_page_saisie( self ): # On stocke la valeur des champs texte dans des variables commune = self.champ1.valeur pays = self.champ2.valeur latitude = self.champ3.valeur longitude = self.champ4.valeur # On vérifie si les données saisies sont au bon format if len(latitude)>0 and not is_a_number(latitude): self.pa.minitel.erreur(1, 20, "La latitude n'est pas au bon format") self.elements.element_actif.gerer_arrivee() return if len(longitude)>0 and not is_a_number(longitude): self.pa.minitel.erreur(1, 20, "La longitude n'est pas n'est pas au bon format") self.elements.element_actif.gerer_arrivee() return if (len(latitude)>0 and len(longitude)==0) or (len(latitude)==0 and len(longitude)>0): self.pa.minitel.erreur(1, 20, "Veuillez saisir latitude et longitude") self.elements.element_actif.gerer_arrivee() return if (len(commune)>0 and len(latitude)>0): self.pa.minitel.erreur(1, 20, "Choisir entre commune et latitude/longitude") self.elements.element_actif.gerer_arrivee() return if len(commune)>0 and len(pays)==0: self.pa.minitel.erreur(1, 20, "Veuillez indiquer le pays avec la commune") self.elements.element_actif.gerer_arrivee() return # On récupère la latitude/longitude de la commune si nécessaire url_base = 'http://api.openweathermap.org/data/2.5/onecall' owm_cle_api = 'c453a548b4d6e77c20f077fa39042c01' if len(commune)>0: g = geocoder.arcgis('%s, %s'%(commune,pays)) if g==None: self.pa.minitel.erreur(1, 20, "Commune et/ou pays inconnu(s)") self.elements.element_actif.gerer_arrivee() return (latitude,longitude) = g.latlng else: latitude = float(latitude) longitude = float(longitude) # On récupère les données météo url = "%s?lat=%f&lon=%f&appid=%s&units=metric&lang=fr"%(url_base,latitude,longitude,owm_cle_api) contenu = requests.get(url) self.meteo = contenu.json() if 'cod' in self.meteo and int(self.meteo['cod'])==401: self.pa.minitel.erreur(1, 20, "Clé API OpenWeatherMap inconnue") self.elements.element_actif.gerer_arrivee() return else: self.page_actuelle = 'resultats' self.numero_page_resultats = 0 self.executer() ################################################################################### # Affichage des résultats def afficher_page_resultats( self ): # On met en forme la page courante sur les données météo message = [] n = int(len(self.meteo['daily'])/self.nb_pages_resultats) indice_debut = n*self.numero_page_resultats indice_fin = indice_debut+n for jour in self.meteo['daily'][indice_debut:indice_fin]: date = datetime.fromtimestamp(jour['dt']).strftime('%A %-d %B') temps = jour['weather'][0]['description'] pluie = float(jour['pop']) min_temp = int(round(jour['temp']['min'])) max_temp = int(round(jour['temp']['max'])) pression = int(round(jour['pressure'])) humidite = int(round(jour['humidity'])) vitesse_vent = int(round(jour['wind_speed'])) direction_vent = jour['wind_deg'] lever_soleil = datetime.fromtimestamp(jour['sunrise']).strftime('%Hh%M') coucher_soleil = datetime.fromtimestamp(jour['sunset']).strftime('%Hh%M') message += ['* %s : %s'%(date,temps)] message += [' * Probabilité pluie : %.2f'%(pluie)] message += [' * Températures : %d°C, %d°C'%(min_temp,max_temp)] message += [' * Pression : %d hPa'%(pression)] message += [' * Humidité : %d%%'%(humidite)] message += [' * Direction du vent : %d°'%(direction_vent)] message += [' * Vitesse du vent : %d m/s'%(vitesse_vent)] message += [' * Lever soleil : %s'%(lever_soleil)] message += [' * Coucher soleil : %s'%(coucher_soleil)] message += [' '] # On affiche les informations self.label1 = Label(self.pa.minitel, 0.1, 0.1, message, 0.8, 0.0, False, 'gauche') self.ligne1 = Ligne(self.pa.minitel, 0.0, 0.95, 1.0, 'h', 'blanc') self.bouton1 = Bouton(self.pa.minitel, 0.0, 0.99, 0.0, 'SOMMAIRE') self.bouton2 = Bouton(self.pa.minitel, 0.33, 0.99, 0.0, 'RETOUR') self.bouton3 = Bouton(self.pa.minitel, 0.57, 0.99, 0.0, 'SUITE') self.bouton4 = Bouton(self.pa.minitel, 0.77, 0.99, 0.0, 'CORRECTION') self.elements = Conteneur(self.pa.minitel, 0.0, 0.0, 1.0, 1.0, 'blanc', 'noir') self.elements.ajouter(self.label1) self.elements.ajouter(self.ligne1) self.elements.ajouter(self.bouton1) self.elements.ajouter(self.bouton2) self.elements.ajouter(self.bouton3) self.elements.ajouter(self.bouton4) self.elements.afficher() self.elements.executer({'SOMMAIRE':self.pa.executer,'RETOUR':self.precedent_page_resultats,'SUITE':self.suivant_page_resultats,'CORRECTION':self.valider_page_resultats}) # Affichage de la page précédente def precedent_page_resultats( self ): if self.numero_page_resultats==0: self.pa.minitel.bip() return self.numero_page_resultats -= 1 self.afficher_page_resultats() # Affichage de la page suivante def suivant_page_resultats( self ): if self.numero_page_resultats==(self.nb_pages_resultats-1): self.pa.minitel.bip() return self.numero_page_resultats += 1 self.afficher_page_resultats() # Validation des résultats def valider_page_resultats( self ): self.page_actuelle = 'saisie' self.executer()