dimanche 7 décembre 2025

PYTHON : Initiation

 


PYTHON : Initiation


Ce mois-ci je propose une petite initiation au langage Python. Le but ici n'est pas de produire un tutoriel exhaustif, déjà très nombreux sur le WEB, mais de donner envie d'utiliser ce langage moderne.

La première version de Python est sortie en 1991. La version 2 date de 2000, la version 3 de 2008. C'est à l'heure actuelle un des langages les plus utilisés, aussi bien sur PC que sur plateforme embarquée. Pour ma part, Python représente une grande part des lignes de code que j'ai écrites aussi bien dans ma vie privée que professionnelle.

Python peut être utilisé pour une grande variété de projets :

  • automatisation
  • projets scientifiques
  • serveurs WEB
  • bases de données
  • communication
  • interface graphique
  • etc.

Sur ce blog il suffit de rechercher le mot "python" pour constater que j'ai déjà publié pas mal de petits scripts.

1. Cibles

Les plateformes sur lesquelles peut tourner Python sont nombreuses :

  • machine Windows, MacOs, Linux
  • cartes SBC comme la Raspberry PI, BeagleBone, Banana PI

Mais il existe aussi des versions de Python légères, comme MicroPython, qui peuvent se contenter de plateformes moins puissantes comme les ESP32, STM32.

Le principal intérêt de Python sur des plateformes aussi variées est la portabilité et on comprend vite l'intérêt d'utiliser un langage unique : limiter la formation.

A l'heure actuelle je développe essentiellement avec :

  • sur PC : Python, HTML, JavaScript
  • sur RASPBERRY PI : Python, HTML, JavaScript
  • sur ESP8266, ESP32, ARDUINO : C, C++, HTML, JavaScript

2. Installation

L'installation de Python est simple.

Sous Linux, en fonction de la distribution, il est souvent pré-installé. Pour le vérifier, lancer la commande suivante :

python -V

S'il est installé il va afficher sa version :

Python 3.12.3

Si ce n'est pas le cas, il faut utiliser la méthode d'installation de la distribution :

Sous Ubuntu : sudo apt-get install python 

Sous Fedora : sudo dnf install python3

Sous Windows il faudra télécharger le logiciel d'installation ici.

Sous Windows n'oubliez pas de cocher la case "Add Python 3.XX to PATH" :

2.1. Installation de packages

Installer le langage Python ne veut pas dire que l'on installe simplement un interpréteur nu avec des instructions basiques. Un nombre très important de librairies sont présentes : The Python Standard Library

Par contre d'autres librairies peuvent vous apporter des fonctionnalités avancées. Par exemple, on peut très bien développer un serveur WEB à l'aide du package http.server, présent dans la librairie standard, mais c'est un peu comme travailler avec un marteau et une enclume. Pour développer des application plus cossues, on a souvent recours à des frameworks comme Jango, ou CherryPy.

2.2. Pip

Certains sites proposent l'installation de leurs packages à l'aide de pip (Package Installer for Python).

C'est en effet un procédé très simple, qui permet d'installer des packages sans avoir à télécharger une archive et se préoccuper de l'endroit où il va falloir la décompresser.

Sous Ubuntu ou Debian : sudo apt install python3-pip

Sous Windows : Comment installer PIP sur Windows

On pourra ainsi installer par exemple le package de communication série PySerial comme ceci :

pip install pyserial

3. La console

Python met à votre disposition une console qui vous permettra d'exécuter du code sans avoir à créer de fichier source :

Il suffit pour cela de taper la commande python dans un terminal :

python

ou (sous Windows)

py

Python 3.12.3 (main, Nov  6 2025, 13:44:16) [GCC 13.3.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>>

Ensuite on entre le code à exécuter : 

print("Hello Python")
Hello Python
>>> 

On quitte la console en tapant CTRL-D.

Cette console est un moyen très pratique de taper quelques lignes de code rapidement pour faire des essais.

4. Un tutoriel ?

Il existe énormément de tutoriels sur le langage Python. Je vous propose le tutoriel officiel pour démarrer.

Celui de W3school, en anglais, aborde des sujets supplémentaires :

  • mathplotlib
  • fichiers
  • base de données MySQL
  • etc.

Attention : il est assez déconseillé d'adopter de vieux tutoriels Python2 pour travailler en Python3, car les différences sont assez importantes.

5. Quel éditeur ?

Pour écrire du code, on utilise un éditeur de texte. Certains éditeurs évolués comme Visual Studio Code vous apporteront un certain confort, en particulier la coloration syntaxique.

L'écriture de code en Python n'utilise pas d'accolades pour définir les blocs de code comme en C ou C++, mais une indentation.

En C, on utilise des accolades :

for (i=0 ; i < 4 ; i++)
{
    printf("blabla\n");
    printf("%d\n", i);
}

L'équivalent en Python :

for i in range(4):
    print("blabla")
    print(i)

Ce code produira le résultat suivant :

blabla
0
blabla
1
blabla
2
blabla
3

Mais si vous écrivez :

for i in range(4):
    print("blabla")
print(i)

Ce code produira le résultat suivant :

blabla
blabla
blabla
blabla
3

Attention donc.

Pour l'indentation il va falloir faire un choix. Soit vous utilisez la tabulation, soit vous utilisez des espaces. La majeure partie des éditeurs modernes permettent d'insérer des espaces lorsque l'on insère une tabulation. En général, la taille d'une tabulation est configurable. Un nombre de 3 ou 4 espaces est en général une bonne valeur.

6. Domaines d'application

Les domaines d'application sont très nombreux. Je n'ai pas l'intention de tous les énumérer, mais en voici quelques exemples :

6.1. Instructions de base

Quand on débute en Python, on constate assez vite que la simplicité est au rendez-vous. De plus, Python emprunte au langage C certaines caractéristiques essentielles, mais aussi à JavaScript :

Commentaire :

# comment

Commentaire sur plusieurs lignes :

'''
comment using string literals
with triple quotes
'''

Déclaration d'un entier :

a = 100

Déclaration d'un entier en notation hexadécimale :

a = 0x44

Déclaration d'un caractère en notation hexadécimale :

a = "\x44"

Déclaration d'une chaîne de caractères :

s = "this is a string"
s = 'this is a string'
a = "\x44\x33"

On peut accéder à un caractère particulier dans la chaîne, comme en C :

t = "string"
print(t[2])

Les tableaux :

t = [0, 1, 2, 3]
print(t[2])

t = (0, 1, 2, 3)
print(t[2])

On remarque deux types de tableaux : le premier, appelé liste, modifiable (entre crochets), le deuxième, appelé tuple, non modifiable (entre parenthèses).

Tous les tableaux sont indexés en partant de ZÉRO, comme en C.

En Python on peut ajouter, modifier ou supprimer un élément de liste :

t = [0, 1, 2, 3]
t.append(5)    # ajoute un élément dont la valeur est 5
t[4] = 12        # modifie l'élément 4
t.pop(2)         # retire l'élément 2

Au final, le contenu sera : [0, 1, 3, 12]

Appel de fonction ou de méthode :

function(arguments)
object.method(arguments)

Un dictionnaire, que l'on peut assimiler à une structure C :

x = {"name" : "John", "age" : 36}

Les habitués du C ou de JavaScript ne seront donc pas complètement perdus.

On remarque que le type des variables n'est pas explicitement déclaré.

On peut parfaitement écrire :

a = 100
a = "abcdef"

La variable a change donc de type à volonté. C'est un point qui m'a fortement perturbé à mes débuts. On m'a répondu "simple question d'ouverture d'esprit". J'ai donc arrêté de me plaindre et me suis accroché.

En fait chaque fonction est libre de contrôler ses arguments :

range("3")

Produit une exception :

TypeError: 'str' object cannot be interpreted as an integer

6.1.1. Boucle for

En C on écrirait :

for (i=0 ; i < 4 ; i++)
{
    printf("i a pour valeur %d\n", i);
}

L'équivalent en Python :

for i in range(4):
    print("i a pour valeur", i)

Dans cet exemple les différences sont flagrantes :

  • pas d'accolades mais une simple indentation (tabulations ou espaces)
  • pas de point-virgule

6.1.2. Séquence

On l'aura compris, la fonction range() retourne une séquence de nombres, 0 à 4 dans l'exemple précédent.

range() peut prendre 3 arguments :

range(3, 10, 2) # retourne une séquence de 3 to 9, par pas de deux : [3, 5, 7, 9]

Si on désire une séquence sans logique précise, on peut l'écrire comme ceci :

for i in [0, 2, 4, 8, 13]:
    print("i a pour valeur", i)

[0, 2, 4, 8, 13] est aussi une séquence. On remarque déjà qu'en C ou C++ il serait plus difficile d'écrire l'équivalent.

c = ["Un", "problème", "sans", "solution", "est", "un", "problème", "mal", "posé"]

for i in range(len(c)):
    print("i vaut", i, "et c[i] vaut", c[i])

6.1.3. Typage

Dans les exemples précédents on a vu que [0, 2, 4, 8, 13] et ["Un", "problème", "sans", "solution", "est", "un", "problème", "mal", "posé"] sont des séquences.

Peut on mélanger les chaînes de caractères et les nombres dans une séquence ?

c = [1, "problème", "sans", "solution", "est", 1, "problème", "mal", "posé"]

Oui. Cette déclaration est tout à fait valide.

Il est même possible de déterminer le type de chaque élément :

c = [1, "problème", "sans", "solution", "est", 1, "problème", "mal", "posé"]
print(c)
for i in range(len(c)):
    print(type(c[i]))

Ce qui produit le résultat suivant :

[1, 'problème', 'sans', 'solution', 'est', 1, 'problème', 'mal', 'posé']
<class 'int'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'int'>
<class 'str'>
<class 'str'>
<class 'str'>

6.1.4. Slicing

La simplicité est encore plus évidente quand on aborde le slicing (découpage) :

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(alpha[4:16])

Ce qui produit le résultat suivant :

EFGHIJKLMNOP

En C on utiliserait une fonction comme strncpy() ou memcpy(), plus complexes et dangereuses pour les débutants, et qui nécessitent une allocation mémoire.

En Python, les lignes suivantes :

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(alpha[20:100])

Produisent le résultat suivant :

UVWXYZ

En clair, on a demandé une tranche de la chaîne s, située entre le 20ème caractère et le 100ème, alors que la chaîne a une longueur de seulement 26 caractères. On l'aura compris, Python est un langage qui apporte de la sécurité.

Comment récupérer le dernier élément d'une séquence ? comme ceci :

a = "abcdef"
print(a[-1])

6.1.5. Introspection

On appelle introspection la capacité à examiner les classes, fonctions et mots-clés pour savoir ce qu'ils sont, ce qu'ils font et ce qu'ils connaissent.

Écrivons une classe et un peu de code :

class student:
    name = ""
    present = False
    # constructeur
    def __init__(self, name):
        self.name = name
    # methods
    def enter(self):
        ''' the student enters the school '''
        self.present = True
    def exit(self):
        ''' the student leaves school '''

        self.present = False

john = student("john")
print("john:")
print(john)
print("id(john):")
print(id(john))
print('dir("john"):')
print(dir(john))
print('john.__class__:')
print(john.__class__)
print('dir(john.present):')
print(dir(john.present))
print('dir(john.enter):')
print(dir(john.enter))
print('callable(getattr(john, "enter")):')
print(callable(getattr(john, "enter")))

Ce qui produit le résultat suivant :

john:
<__main__.student object at 0x7024a0d6ef00>
id(john):
126360425639824
dir("john"):
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'enter', 'exit', 'name', 'present']
john.__class__:
<class '__main__.student'>
dir(john.present):
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'is_integer', 'numerator', 'real', 'to_bytes']
dir(john.enter):
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
callable(getattr(john, "enter")):
True

Examinons de plus près :

print("john:")
print(john)
john:
<__main__.student object at 0x7024a0d6ef00>

print(john) dit que john est un objet de la classe student situé dans le module __main__, et que son identifiant est 0x7024a0d6ef00

print("id(john):")
print(id(john))
id(john):
126360425639824

id(john) nous donne l'identifiant de l'objet john : 126360425639824 (0x7024a0d6ef00 en décimal)

print('dir("john"):')
print(dir(john))
dir("john"):
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'enter', 'exit', 'name', 'present']

dir(john) retourne les membres de l'objet john. Les méthodes que nous avons écrites sont présentes, parmi d'autres membres.

print('john.__class__:')
print(john.__class__)
john.__class__:
<class '__main__.student'>

john.__class__ contient le nom de la classe de l'objet john : __main__.student

print('dir(john.present):')
print(dir(john.present))
dir(john.present):
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'is_integer', 'numerator', 'real', 'to_bytes']

dir(john.present) retourne les attributs de l'attribut present de l'objet john.

print('dir(john.enter):')
print(dir(john.enter))
dir(john.enter):
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

dir(john.enter) retourne les attributs de la méthode enter() de l'objet john.

print('callable(getattr(john, "enter")):')
print(callable(getattr(john, "enter")))
callable(getattr(john, "enter")):
True

callable(getattr(john, "enter")) permet de savoir si le membre enter de l'objet john est appelable.

On peut remarquer sur cette ligne l'utilisation de simples et doubles quotes imbriquées :

print('callable(getattr(john, "enter")):')

Ce qui permet de ne pas fermer la chaîne sur la première double quote de "enter".

On aurait pu écrire aussi :

print("callable(getattr(john, 'enter')):")

Ou, comme en C :

print("callable(getattr(john, \"enter\")):")

En Python on peut indifféremment utiliser la simple ou la double quote pour encadrer une chaîne, comme en JavaScript.

On constate qu'en Python tout est orienté objet, qu'il s'agisse de classe, d'instances, d'attributs et méthodes. Je vous laisse imaginer les possibilités offertes par toutes ces méthodes d'introspection.

6.1.6. Et les pointeurs ?

En Python, la notion de pointeur n'existe tout simplement pas. C'est certainement une bonne nouvelle pour les débutants.

6.2. La ligne série

Quand on travaille avec un ARDUINO ou un ESP, il est assez courant d'avoir recours au moniteur série pour afficher des information sur l'écran du PC.

Mais c'est assez limité. Que faire si l'on a besoin d’interagir avec le logiciel embarqué ? La ligne série, accessible via le connecteur USB de la carte, semble le moyen le plus simple.

J'ai déjà traité ce sujet ici : Commander un ARDUINO par la ligne série ou BLUETOOTH

Pour communiquer en série à partir de Python, il vous faudra installer le package PySerial.

Certains d'entre vous ont peut être déjà développé des logiciel de communication série en C à l'aide de Win32 sous Windows, ou termios sous Linux. Sous Windows, on peut très vite constater que cela peut très vite provoquer des problèmes en fonction de la cible. On logiciel peut très bien fonctionner sur certains PC et mal fonctionner sur d'autres (c'est du vécu). Il faut vraiment être un spécialiste de Win32 pour s'en sortir. Sous Linux c'est beaucoup moins le cas.

Mais dans tous les cas, avec PySerial votre code fonctionnera aussi bien sur Windows que MacOs ou Linux. Seule l'ouverture de la ligne série diffère :

Sous Linux :

ser = serial.Serial('/dev/ttyUSB0')

Sous Windows :

ser = serial.Serial('COM1')

6.3. L'interface graphique

En matière d'interface graphique, on peut en Python se contenter de TkInter, qui produit des résultats honorables mais assez peu esthétiques :

Interface graphique Tkinter python

On peut également utiliser WxPython, PyGTK, ou PyQT, qui sont des interfaces Python à WxWindows, GTK et QT.

On peut citer également PyGame, une librairie de dessin toute simple, sans widgets.

Mais à l'heure actuelle ces librairies sont de moins en moins utilisées, la création d'interfaces graphiques se faisant principalement en HTML, JavaScript et CSS.

6.4. Le serveur WEB

Il existe une grande variété de serveurs WEB écrits en PYTHON :

  • http.server
  • CherryPy
  • Django
  • Flask
  • etc

6.4.1. http.server

http.server fait partie de la librairie standard Python. Examinons cet exemple simple :

from http.server import BaseHTTPRequestHandler, HTTPServer
import time
 
hostName = "127.0.0.1"
serverPort = 8080
 
class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>My Web Server</title></head>", "utf-8"))
        self.wfile.write(bytes("<body>", "utf-8"))
        self.wfile.write(bytes("<p>This is my web server</p>", "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))
 
if __name__ == "__main__":        
    webServer = HTTPServer((hostName, serverPort), MyServer)
    print("Server started at http://%s:%s" % (hostName, serverPort))
 
    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass
 
    webServer.server_close()
    print("Server stopped.")

Si l'on lance ce serveur en local il affichera sur la console :

Server started at http://127.0.0.1:8080

Dans le navigateur on entrera :

http://localhost:8080/index

ou :

http://localhost:8080/

Le navigateur affichera simplement : This is my web server

On peut ajouter une URL supplémentaire nommée alternative :

from http.server import BaseHTTPRequestHandler, HTTPServer
import time

hostName = "127.0.0.1"
serverPort = 8080

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        if(self.path == '/' or self.path == '/index'):
                self.send_response(200)
                self.send_header("Content-type", "text/html")
                self.end_headers()
                self.wfile.write(bytes("<html><head><title>My Web Server</title></head>", "utf-8"))
                self.wfile.write(bytes("<body>", "utf-8"))
                self.wfile.write(bytes("<p>This is my web server</p>", "utf-8"))
                self.wfile.write(bytes("</body></html>", "utf-8"))
        elif(self.path == '/alternative'):
                self.send_response(200)
                self.send_header("Content-type", "text/html")
                self.end_headers()
                self.wfile.write(bytes("<html><head><title>My Web Server</title></head>", "utf-8"))
                self.wfile.write(bytes("<body>", "utf-8"))
                self.wfile.write(bytes("<p>This is another URL</p>", "utf-8"))
                self.wfile.write(bytes("</body></html>", "utf-8"))

if __name__ == "__main__":
    webServer = HTTPServer((hostName, serverPort), MyServer)
    print("Server started at http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")

Dans le navigateur on entrera :

http://localhost:8080/alternative

Le navigateur affichera alors : This is another URL

Comme on le voit, la librairie est assez spartiate. On a franchement l'impression de travailler à très bas niveau. 

6.4.2. CherryPy

Cherrypy propose une approche intéressante :

import cherrypy
 
class HelloWorld(object):
    @cherrypy.expose
    def index(self):
        return "Hello from CherryPy!"
 
if __name__ == '__main__':
    cherrypy.quickstart(HelloWorld())

Chaque méthode de la classe HelloWorld est exposée à l'aide du mot clé (appelé décorateur) @cherrypy.expose. Elle sera donc appelée lorsque l'URL nommée index sera entrée dans la barre d'adresse du navigateur, mais également l'URL nommée /.

Si l'on lance ce serveur en local il affichera sur la console :

[06/Dec/2025:15:54:57] ENGINE Listening for SIGTERM.
[06/Dec/2025:15:54:57] ENGINE Listening for SIGHUP.
[06/Dec/2025:15:54:57] ENGINE Listening for SIGUSR1.
[06/Dec/2025:15:54:57] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.
[06/Dec/2025:15:54:57] ENGINE Started monitor thread 'Autoreloader'.
[06/Dec/2025:15:54:57] ENGINE Serving on http://127.0.0.1:8080
[06/Dec/2025:15:54:57] ENGINE Bus STARTED

A noter que le port par défaut du serveur est le 8080.

Dans le navigateur on entrera :

http://localhost:8080/index

ou :

http://localhost:8080/

Le navigateur affichera simplement : Hello from CherryPy!

On peut ajouter une URL supplémentaire nommée alternative :

import cherrypy
 
class HelloWorld(object):
    @cherrypy.expose
    def index(self):
        return "Hello from CherryPy!"
 
    @cherrypy.expose
    def alternative(self):
        return "Another Hello from CherryPy!"

if __name__ == '__main__':
    cherrypy.quickstart(HelloWorld())

Dans le navigateur on entrera :

http://localhost:8080/alternative

Le navigateur affichera alors : Another Hello from CherryPy!

Simplissime ! Au final, pour ceux qui connaissent, comparer http.server à CherryPy revient à comparer les classes WebServer et AsyncWebServer quand on travaille sur ESP32. Quand on a goûté à CherryPy ou AsyncWebServer, il est difficile de revenir à http.server ou WebServer. On s'habitue vite au luxe.

Comme vous le savez peut être, AsyncWebServer est capable de gérer une page HTML en utilisant une template (un modèle). En Python la gestion des templates peut être confiée à Jinja2.

7. Générer un exécutable sous Windows

Quand on travaille avec Python, il est assez facile de distribuer ses logiciels à des utilisateurs Linux. En effet, Python est très souvent pré-installé sur la majeure partie des distributions.

Sous Windows, ce n'est pratiquement jamais le cas. Mais il existe un moyen : PyInstaller permet de générer un exécutable, un .exe !

Oui, vous avez bien lu. Vous pourrez ainsi distribuer votre logiciel de manière extrêmement simple, et de plus sans divulguer vos fichiers sources. La suite ici.

8. Conclusion

D'après de nombreux spécialistes Python est un langage de haut niveau, simple et facile à apprendre. De plus, de nombreuses librairies sont disponibles, ce qui simplifie encore plus le développement d'applications.

Malgré cela il a un inconvénient majeur : du fait que c'est un langage interprété, certaines erreurs de syntaxe sont détectées lors de l'exécution. Cela veut dire clairement que la phase de tests est un élément crucial dans le processus de développement. Mais cela ne veut pas dire que cela le rend moins fiable pour autant. En matière de développement, la phase de tests est en général aussi coûteuse que la phase de codage, quel que soit le langage. Il ne viendrait pas à l'idée d'un développeur professionnel de négliger ce fait.

Tout langage nécessite un apprentissage, qui requiert en général une semaine de labeur. Pour accéder à Python il n'en sera pas autrement, mais l'investissement sera très vite rentabilisé, bien au delà de ce que peut offrir C ou C++.


Cordialement

Henri

lundi 8 septembre 2025

Fin de Windows 10 : et ensuite ?

 


Fin de Windows 10 : et ensuite ?


A un mois de la fin du support de Windows 10, il est légitime de se poser la question de savoir vers quel OS s'orienter.

D'une part, Windows 11 a besoin d'être installé sur une machine plus puissante que Windows 10. D'autre part elle doit être équipée d'une puce spéciale nommée TPM 2.0 (Trusted Platform Module). Certains pourront se contenter d'augmenter la quantité de mémoire de leur machine, d'autre devront se résoudre à renouveler leur matériel.

Il y a de quoi faire hésiter plus d'un utilisateur.

1. Rester sous Windows 10

A l'heure actuelle il reste environ 2.5% de machines fonctionnant sous Windows 7, et 0.25% sous Windows XP. Actuellement Windows 10 reste largement majoritaire.

Sous Windows 10 aucune mise à jour, y compris de sécurité, ne sera plus possible après le 14 octobre. Conserver Windows 10 peut sembler une solution viable, mais seulement à court terme. En effet, même si le risque est faible, les mises à jour de sécurité sont tout de même le meilleur moyen de garantir le bon fonctionnement d'une machine face aux attaques. 

2. Passer à Windows 11

Seules les machines récentes (5 ans maximum) pourront sans problème passer à Windows 11. Microsoft refuse de mettre à niveau les machines ne possédant pas de puce TPM 2.0 (Trusted Platform Module).

Pour les machines plus anciennes, il existe apparemment des moyens de contournement. On pourra par exemple s'inspirer de cet article : [Màj] Windows 11 : quatre méthodes pour contourner TPM 2.0

Mais comme le dit l'auteur :

Ensuite, il faut garder en mémoire que ces solutions, si elles ont le grand mérite de se débarrasser d’un problème, peuvent ne pas perdurer dans le temps, à la (dé)faveur d’une mise à jour de Windows.

3. Tourner la page

Il existe d'autres alternatives à Windows, notamment MacOS, et différentes distributions Linux.

Tourner le dos à Windows n'est jamais facile. Nous avons tous nos petites habitudes, et comme on le dit souvent : le meilleur OS est celui auquel on est le plus habitué. Mais même en restant sous Windows, dans le passé, certaines migrations (passage à Windows 8 par exemple) ont été assez douloureuses pour les utilisateurs.

Avant de penser à changer d'OS, il faut avant tout se poser la seule bonne question : quelles sont les applications que je vais pouvoir conserver, et quelles alternatives vais-je trouver pour celles qui n'existent que sous Windows ?

Pour la majorité d'entre nous qui n'utilisent leur PC que pour faire de la bureautique, lire et écrire des mails, naviguer sur le WEB ou y faire ses achats, le saut sera facile.

3.1. Le téléphone mobile

Abandonner la solution PC n'est pas forcément une solution à laquelle tout le monde pense, mais actuellement, les besoins courants peuvent être largement satisfaits à l'aide de son téléphone, et beaucoup de particuliers s'en contentent. Si l'on a besoin d'un écran de grande taille une tablette est une bonne option.

Il est facile de lire et écrire ses mails avec l'application E-mail ou Gmail, de naviguer sur le WEB avec Chrome. Pour ce qui est de la bureautique, la solution se trouve dans le Drive. On peut y créer des documents, des feuilles de calcul, des présentations. Après avoir ouvert le Drive, il suffit de cliquer sur l'icône + :

Les possibilités d'édition sont largement à la hauteur pour les besoins courants.

Egalement, il est parfaitement possible de poser des questions ou répondre sur un forum, ou de créer des articles sur un blog (blogger par exemple). J'aurais très bien écrire celui que vous êtes en train de lire à l'aide de mon téléphone.

Le seul point faible réside le plus souvent dans l'impression papier. Seules certaines imprimantes en seront capables : 

  • imprimantes compatibles AirPrint
  • imprimantes WIFI

Certains fabricants d'imprimantes proposent leur propre application d'impression, HP et Epson entre autres, installables depuis Google Play.

3.2. Apple

Depuis quelques années les iMac et MacBook se sont démocratisés. Avant de changer de PC, il serait judicieux d'examiner l'offre Apple, surtout si l'on fait partie de la catégorie des créatifs :

  • infographiste
  • musicien
  • etc.

Un infographiste travaillant sur Photoshop aura du mal à se contenter de Gimp sous Linux, et un musicien ne trouvera peut être pas toute la puissance et les fonctionnalités de Logic Pro en passant à Audacity ou Ardour.

Le seul inconvénient d'Apple est qu'un iMac est un ordinateur avec écran intégré et que lorsque l'on change pour un iMac, on change tout ! Si vous avez un petit écran bas de gamme sur votre PC, cela peut en valoir la peine. S'il s'agit d'un portable, la qualité d'un écran Apple aura de grandes chances d'être supérieure à celle d'un écran de PC.

3.4. Linux

Pour les possesseurs de machines peu puissantes ou anciennes, la solution Linux est à examiner sérieusement, et les parts de marché de cet OS progressent depuis quelques années. En 2025 il a dépassé la barre des 4% sur les machines de bureau en France, contre moins de 2% en 2020.

Pour ma part, dans les années 2000, après avoir essayé diverses distributions Linux sans trop de succès (Mandrake, Interactive Unix), je suis passé à Ubuntu en 2006 avec une version 6.06. Cette distribution m'a estomaqué par sa simplicité d'installation. Ensuite, pour des raisons plutôt philosophiques, j'ai eu une période Debian, mais au final je suis revenu à Ubuntu.

Sous Linux on parle de distribution. Mais qu'est ce qu'une distribution ? C'est un ensemble de paquets logiciels choisis par le distributeur (Ubuntu, Debian, Linux Mint, etc.) permettant d'obtenir au final un OS plus ou moins riche. Le distributeur va choisir certains composants parmi ceux disponibles dans la communauté :

  • noyau
  • interface graphique
  • logiciels divers
  • etc.

Je veux dire par là qu'une distribution n'est pas un développement spécifique, c'est un assemblage, comme un LEGO.

Le noyau est en général toujours le même, à la version près. Ubuntu 24.04 utilise le 6.8, Debian 12 utilise le 6.1, alors que le tout dernier noyau est le 6.16, mais dans tous les cas, le code source est toujours le même, y compris pour les versions embarquées, Raspberry Pi par exemple.

Les applications incluses sont plus ou moins nombreuses, en fonction de la richesse désirée. Par exemple une distribution Linux Mint ne possède pas de serveur WEB, car ses auteurs ont estimé que ce n'était pas sa vocation, mais il est parfaitement possible d'en installer un en cas de besoin.

3.4.1. Performances

On admet généralement que Linux est 20% plus performant que Windows. Cela ne représente pas grand chose pour un particulier, mais en entreprise cela compte.

Les besoins en ressources sont également inférieurs. Là où Windows 11 a besoin de 4Go minimum pour pouvoir fonctionner, certaines distributions Linux se contentent de moins de 1Go, et de processeurs complètement dépassés (1GHz, parfois moins, et même Pentium III pour la distribution LXLE !).

Seules les distributions Ubuntu et KUbuntu rivalisent avec Windows 11 en ce qui concerne les besoins en mémoire. Ce sont des distributions lourdes, qui ont besoin d'un processeur possédant au moins deux cœurs. il faut en tenir compte avant de faire son choix :

  • Ubuntu : 4Go minimum
  • KUbuntu : 4Go minimum
  • Mint : 1Go minimum
  • Ubuntu Mate : 1Go minimum
  • Debian : 1Go minimum
  • LXLE : 512 Mo minimum

Mais on peut difficilement comparer Ubuntu ou KUbuntu avec Windows 11. Ces distributions Linux sont bien plus complètes. Par exemple, un serveur WEB Apache est automatiquement installé, ainsi qu'un serveur SSH, ce qui n'est pas le cas sous Windows. En fait, si vous voulez ajouter tout ce qui manque à Windows par rapport à Ubuntu ou KUbuntu, il vous faudra bien plus de 4Go de mémoire. Mais on peut adopter le raisonnement inverse : si vous enlevez de Ubuntu ou KUbuntu les applications qui vous sont inutiles vous aurez besoin de moins de mémoire que sous Windows 11.

Pour la petite histoire, le développement du système Linux repose dans son ensemble sur la pratique de la refactorisation (re-factoring) qui consiste à améliorer le code en continu, sans ajouter pour autant de fonctionnalités supplémentaires. Cela explique en grande partie que le code soit plus optimisé, plus rapide, et consomme moins de ressources mémoire.

3.4.2. Installation

L'installation de Linux est très simple, contrairement à ce que l'on croit, et cela fait longtemps !

Linux, lors de l'installation détectera automatiquement votre matériel et activera de lui même les pilotes adéquats.

Qu'offre Linux ? En dehors d'être un OS très performant et moderne, Linux, dès l'installation, apporte une grande variété de logiciels, en particulier :

  • le navigateur Firefox (mais on peut en installer d'autres, Chrome en particulier)
  • la messagerie Thunderbird
  • une suite bureautique complète (LibreOffice le plus souvent)
  • le logiciel de retouche d'images Gimp
  • de multiples langages de programmation : C, C++, Java, Python, PHP, etc.
  • serveur WEB Apache, base de données MYSQL, etc.
  • etc.

Il en résulte que, aussitôt l'installation terminée, l'utilisateur se retrouvera avec une machine directement utilisable, avec une panoplie de logiciels très étoffée.

Cette page donne des équivalent Linux pour pas mal d'applications Windows.

3.4.3. Essayer sans risque

Linux a la faculté de pouvoir être exécuté depuis une clé USB, sans toucher au disque dur Windows, donc sans rien détruire.

Pour cela il suffit de télécharger une image ISO. En fonction de la puissance de la machine il sera possible de lancer différentes distributions :

Certaines distributions sont plus légères que d'autres et acceptent d'être installées sur des machines pauvrement équipées, souvent moins de 2Go de RAM.

Après téléchargement de l'image ISO, il faut la graver sur une clé USB à l'aide d'un logiciel de création de support bootable, Rufus par exemple. Il vous faudra une clé USB de 4Go (Mint) ou 8Go (Ubuntu).

Ensuite il faut trouver le moyen de démarrer la machine à partir de la clé USB. Il suffit souvent d'appuyer sur une touche de fonction au démarrage. Cette touche dépend du constructeur de la carte mère (Asus : F8, Gigabyte : F12, etc). Il est facile de trouver cette information sur le WEB. 

Après le démarrage, vous pourrez à loisir explorer le bureau et essayer les applications fournies. Ensuite, libre à vous d'installer la distribution sur le disque dur, ou pas.

3.4.4. Dual BOOT

Linux est tout à fait capable de s'installer à côté de Windows, sur une partition séparée, ou même un disque dur supplémentaire.

Après quelques années d'utilisation de Linux en dual boot, je me suis aperçu que Windows ne me servait plus à rien, et je l'ai abandonné définitivement.

3.4.5. Système de fichiers

Linux dispose d'un système de fichiers très rapide (EXT4), contrairement à Windows, qui utilise encore l'antédiluvien NTFS. Ma première installation d'Ubuntu sur un petit serveur WEB a révélé que les pages WEB s'affichaient 4.5 fois plus rapidement qu'avec Windows.

Avec ce système de fichiers vous risquez fort de croire que vous venez de changer de disque dur !

Une énorme différence par rapport à Windows : lorsque Linux désire remplacer un fichier sur le disque et que celui-ci est occupé, ou en cours d'exécution, le système de fichiers ne refuse pas l'opération mais attendra que le fichier soit libéré pour faire le remplacement physique. Cette particularité explique que les mises à jour des applications puissent se faire aussi facilement, tout en continuant à travailler.

3.4.6. Changement de hardware

Linux, contrairement à Windows, ne vous contraint pas à réinstaller l'OS quand vous changez de machine, et surtout de processeur. Il est parfaitement possible de réutiliser le disque dur de votre PC actuel dans une nouvelle machine. On peut sans problème passer d'une machine à processeur INTEL à une machine à processeur AMD et vice versa, en réutilisant le même disque dur.

Si l'on est contraint de changer de disque, il est très facile de cloner l'ancien disque vers un nouveau. Un simple copier / coller avec Gparted suffit !

Egalement, changer de hardware sans réinstallation des pilotes est parfaitement possible. Mais comment font ils ? Tout simplement, les pilotes Linux sont tellement optimisés qu'ils prennent très peu de place sur le disque dur. Donc on peut se permettre de les installer tous ! Ensuite le système sélectionne au prochain démarrage les pilotes qui conviennent.

3.4.7. Ralentissement dans le temps

Combien de machines Windows ont terminé leur vie dans une déchetterie parce que leur propriétaire estimait qu'elle ramait trop ? Il suffirait pourtant de réinstaller Windows, mais combien d'utilisateurs connaissent cette possibilité ?

On connait tous le phénomène de ralentissement dans le temps de Windows. Ceci est dû principalement à la fragmentation du disque dur et surtout à la fragmentation de la base de registre (registry).

La fragmentation est un phénomène qui tend à morceler les fichiers, afin de gagner de l'espace, combler les trous qui se forment lorsque l'on détruit des fichiers, ou que l'on modifie leur taille. Mais cela ralentit leur écriture et leur lecture. Si l'on considère la taille importante des disques durs actuels, la fragmentation n'est plus nécessaire. C'est une technique hors d'âge, qui date de la bande magnétique !

La différence est de taille : lorsque NTFS désire écrire un fichier, il cherche le premier trou disponible, y case une partie du fichier, il cherche le trou suivant, y case une autre partie du fichier, etc. Lorsque EXT4 désire écrire un fichier, il cherche le premier trou disponible pouvant contenir le fichier complet, et il l'écrit.

La base de registre Windows a été créé à l'époque de Windows NT parce que le système de fichiers NTFS était trop lent. Celle-ci est chargée au démarrage dans la mémoire RAM, qui est beaucoup plus rapide. Mais elle se fragmente avec le temps, ce qui ralentit le système. Il existe bien des outils pour assainir la base de registre, mais ils sont payants.

Pourquoi un système Linux garde t-il toujours des performances constantes dans le temps ?

La première cause est l'absence de base de registre. Sous Linux tous les paramètres sont stockés dans des fichiers. Cette manière de procéder est rendue possible grâce aux performances exceptionnelles du système de fichiers EXT4.

La deuxième cause est la quasi absence de fragmentation du disque dur. Une fragmentation importante peut se produire seulement lorsque le disque dur est presque plein. Dans ce cas les gros fichiers seront fragmentés. Par conséquent, adopter un disque plus grand que nécessaire est une règle à toujours respecter sous Linux.

3.4.8. Arduino

Il serait malvenu de ne pas parler d'Arduino dans un article sur ce blog.

L'environnement de développement Arduino est multi-plateforme, et peut être installé sous Windows, Linux ou MacOS.

L'environnement Visual Studio Code est également disponible.

3.4.9. Logiciels tiers

Sous Windows il n'est pas rare de rechercher des logiciels gratuits (freeware) sur le WEB, et de les installer sur sa machine, avec tous les risques de sécurité que cela comporte. 

Avec Linux, rien de tout cela ! La bibliothèque de logiciels disponible sur les dépôts officiels est absolument énorme. Cette bibliothèque est centralisée, et une application permet de les installer / désinstaller. Tous les logiciels présents sont certifiés conformes. On ne prend donc aucun risque à les essayer.

Mais au final il est assez rare d'avoir besoin d'installer quoi que ce soit, car le système de base est déjà très riche en applications.

3.4.10. Versions

Ici je ne vais parler que de Ubuntu, mais les autres distributions sont à peu près calquées sur le même modèle.

Canonical produit deux versions par an, en avril et en octobre. La dernière version est la Ubuntu 25.04, la prochaine sera Ubuntu 25.10. Vous l'aurez compris, 25 est l'année, et 04 ou 10 est le mois de sortie.

Qu'en est-il du support ? La 25.04 sera maintenue jusqu'en janvier 2026. C'est peu !

Mais il y a une astuce : tous les deux ans, en avril, une version LTS sort. LTS veut dire "Long Term Support". Ce sont des versions dont le support est garanti 5 ans. Ainsi la LTS 20.04 a été suivie de la 22.04, puis de la 24.04, dont le support est assuré jusqu'en avril 2029. Pour les utilisateurs ayant besoin de stabilité, il est recommandé de n'installer que des versions LTS.

A noter :

  • les versions de Linux Debian sont toutes LTS
  • les versions de Linux Mint sont toutes basées sur une version LTS de Ubuntu. Actuellement la version 22 est basée sur Ubuntu 24.04, donc forcément LTS.

Pour ma part je travaillais sous Ubuntu 20.04 depuis fin 2020 et j'ai récemment mis à niveau en 22.04 puis 24.04. Cela pose t'il un problème ? Non, car des mises à jour régulières sont proposées par le système, ce qui fait que même sans changer de version, le système est en à jour en permanence, pour peu que l'on se donne la peine d'accepter les mises à jour :

Lorsqu'une nouvelle version sort, le système propose une mise à niveau :

Pour ma part je ne fais jamais de mise à niveau immédiatement après la date de sortie. J'attends la fin de l'année par précaution, en attendant que les bugs éventuels soient corrigés.

3.4.11. Le compte super-utilisateur

Vous serez peut-être surpris de constater l'absence d'antivirus dans les distributions Linux. Cela n'a rien d'anormal. Linux est un système totalement étanche et un simple utilisateur ne peut en aucun cas remplacer ou altérer un fichier système. C'est une simple question de droits. Sous Linux le super-utilisateur s'appelle root et personne ne se connecte jamais en tant que root, sauf temporairement pour des opérations de maintenance, mise à jour, etc.

Sous Ubuntu, l'utilisateur root n'existe même pas. On ne peut donc se connecter en tant que root, sauf en ligne de commande, à l'aide d'un outil nommé sudo, qui réclame un mot de passe, pour des opérations ponctuelles et courtes.

Un virus ou un malware s'exécutant dans l'espace utilisateur n'aura donc jamais la possibilité de modifier un fichier système.

Quelques règles essentielles :

  • ne jamais se connecter en tant que root
  • ne jamais installer d'applications autres que celles des dépôts officiels
  • effectuez toujours les mise à jour proposées

Comment les mises à jour se passent-elles dans de telles conditions ? Le plus simplement du monde : quand vous décidez de lancer une mise à jour ou une mise à niveau, le système vous demande votre mot de passe. Et l'installation des applications ? idem.

Il arrive parfois que sur le WEB on tombe sur une page annonçant "Votre système est infecté". Sous Linux, la meilleure réaction que vous puissiez avoir est d'éclater de rire. Éventuellement la page peut refuser de se fermer, mais ce n'est qu'une astuce pour faire peur. Au pire, fermez simplement votre navigateur et relancez-le.

Pour finir, un petit proverbe : protégez votre root et votre root vous protégera.

3.4.13. Maintenance

Pour conclure ce chapitre, avec le temps, depuis que je travaille sous Linux, je me suis aperçu que je ne passais plus aucun temps à assurer la maintenance de ma machine, mais bien 100% de mon temps à l'utiliser.

4. Conclusion

2025 risque fort d'être une année charnière, car Linux devient de plus en plus une alternative crédible pour les utilisateurs qui en ont ras le bol de devoir changer de machine à chaque changement de version Windows, et Windows 11 apporte des contraintes encore jamais vues. L'adoption de Linux par les particuliers s'est accélérée depuis quelques années.

Alors pourquoi ne serait ce pas le cas pour vous ? L'essayer à tête reposée à l'aide d'une simple clé USB est un premier pas sans aucun risque.


Cordialement

Henri


mercredi 13 août 2025

Batteries : Durée de vie

 


Batteries : Durée de vie


Dans cet article nous allons parler des effets du vieillissement des batteries, en particulier de la résistance interne.

On sait tous que la capacité d'une batterie diminue avec l'âge, et surtout le nombre de recharges qu'on lui fait subir. Mais une autre caractéristique est modifiée : sa résistance interne.

Toute batterie a une résistance interne. Cette résistance série impacte directement ses performances. Lors de la recharge ou de la décharge elle va empêcher le courant de circuler librement.

Comment mesurer cette résistance ?

1. Expérience

Faisons une expérience : chargeons deux batteries de vapoteuse 21700 4000mAH, la première achetée il y a deux ans, l'autre achetée très récemment.

Le chargeur IMAX B6 est réglé comme suit :

  • courant de charge : 1.5A
  • batterie 1S : tension de fin de charge 4.2V
Comme tout chargeur LITHIUM ou LIPO qui se respecte, l'IMAX B6 commence par recharger la batterie à courant constant, ici 1.5A, jusqu'à ce que la tension atteigne 4.2V. Ensuite il continue la recharge à tension constante jusqu'à ce que le courant descende à 10% du courant nominal, donc 150mA.

Lorsque je recharge la batterie neuve, la tension en fin de charge est bien de 4.2V et reste à cette valeur même plusieurs jours après.

Lorsque je recharge la batterie usagée, la tension en fin de charge est de 4.18V et baisse légèrement pendant les heures suivantes, jusqu'à 4.10V.

On peut en déduire deux choses :

  • la batterie usagée possède une résistance interne plus forte
  • la batterie usagée a tendance à fuir

Quelle est la valeur de cette résistance ? C'est facile à calculer :

R = (4.2V - 4.18V) / 150mA = 0.133Ω

Cette valeur très loin d'être négligeable. Ce sont des batteries capables de délivrer 20A sur des charges de valeurs très basses, de l'ordre de 0.2Ω à 0.5Ω. On voit bien que si l'on cherche à débiter 20A dans une charge de 0.2Ω, le tiers de l'énergie va être gaspillé dans la résistance interne de la batterie.

2. Durée de vie

La durée de vie d'une batterie est donnée en nombre de cycles de recharge. Les plus courantes supportent 300 à 500 recharges. Les plus durables, comme les LiFePO4, supportent jusqu'à 7000 cycles.

Avant de décider quelle batterie utiliser dans un montage il vaut mieux examiner de près les conditions d'utilisation :

  • courant nécessaire
  • fréquence des recharges

Il faut aussi tenir compte de la température. La plage de fonctionnement optimale d'une batterie LITHIUM se situe entre 15°C et 35°C. Une température élevée ou très basse réduit les performances. Il faut également éviter de recharger une batterie LITHIUM si la température est négative.

Bien souvent, lorsque les conditions climatiques sont défavorables, on adopte des batteries au plomb, à électrolyte gélifié de préférence.

3. Surveillance

Afin d'éviter les problèmes une batterie doit être surveillée. Dans un article récent je parlais d'un détecteur de fumée BOSCH capable d'émettre un bip en cas de batterie trop faible.

Avec nos montages DIY on peut faire exactement la même chose. A l'aide de quelques lignes de code on peut faire des mesures automatiques régulières de la tension, afin d'en déduire la capacité restante.

On peut également surveiller le comportement du montage afin de signaler les anomalies (blocage moteur inattendu, contact de fin de course, etc.). L'organe de signalisation doit être adapté au cas envisagé :

  • LED émettant un ou des FLASHs
  • buzzer
  • mail
  • SMS
  • serveur domotique
  • etc.

L'organe de signalisation doit également être accessible. Il ne servirait à rien de faire clignoter une LED si l'on n'est pas présent sur place pour constater qu'elle est allumée !

Tous mes équipements domotique alimentés par batterie sont capables d'envoyer régulièrement la capacité restante de celle-ci à un serveur DOMOTICZ, mais également l'état de fonctionnement de leurs organes principaux (l'état de la porte de mon poulailler par exemple).

Mon dispositif de surveillance est basé sur un ESP8266, un afficheur TFT et un buzzer :

Un afficheur TFT pour DOMOTICZ ou JEEDOM (version ESP8266)

4. Conclusion

L'expérience citée ci dessus est un cas extrême. Peu de montages sont appelés à consommer des courant aussi élevés. Cela donne tout de même une bonne idée de l'état d'une batterie au bout de quelques années de fonctionnement dans des conditions sévères. 

Si l'on avait affaire à un montage destiné à piloter un moteur, la résistance interne pourrait limiter le courant délivré au moteur, et empêcher celui-ci de tourner à la vitesse prévue. En fonction de la charge mécanique, le moteur pourrait aussi ne pas avoir suffisamment d'énergie pour pouvoir manœuvrer celle-ci, et se bloquer.

Il faut donc être vigilent, et ne pas chercher à prolonger l'utilisation de batteries délivrant des courants importants. Il vaut mieux les changer régulièrement, et réutiliser les batteries usagées dans des montages moins gourmands.

La surveillance est également un point important. On ne peut pas laisser indéfiniment un montage alimenté par batterie vivre sa vie sans s'en occuper.


Cordialement

Henri