diff --git a/viscaoveriplib/__init__.py b/viscaoveriplib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/viscaoveriplib/advanced_controls.py b/viscaoveriplib/advanced_controls.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/viscaoveriplib/camera.py b/viscaoveriplib/camera.py
new file mode 100644
index 0000000000000000000000000000000000000000..194a476e094d60807a1f8a5197dcc47f59f7bc0c
--- /dev/null
+++ b/viscaoveriplib/camera.py
@@ -0,0 +1,57 @@
+import socket
+
+"192.168.0.100"
+UDP_PORT = 52381
+
+class Camera:
+    def __init__(self, UDP_IP,UDP_PORT, VV= "09", WW= "09", seq_num: hex ="0",debug=False,virtualcam=False):
+        """
+        Création d'une caméra avec
+        :param UDP_IP: IP de la caméra (192.168.0.100 par défaut)
+        :param UDP_PORT: Port de la caméra (52381 par défaut)
+        :param VV: Vitesse de déplacement horizontale (entre 01 et 18) en hex
+        :param WW: Vitesse de déplacement veritcale (entre 01 et 17) en hex
+        :param seq_num: sequence number de départ
+        """
+        self.seq_num = seq_num  # erreur du capteur UWB (p pour précision...) WTF ce commentaire ???
+        self.VV = VV
+        self.WW = WW
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
+        self.UDP_IP = UDP_IP
+        self.debug=debug
+        self.virtualcam=virtualcam
+
+    def send(self, message):
+        """
+        Envoie un message à la cam (supporte les ' ')
+        :param message: message str['hex']
+        """
+        if(not(self.virtualcam)): #Si la cam n'est pas virtuel, on envoie le paquet
+            self.sock.sendto(bytes.fromhex(message.replace(' ', '')), (self.UDP_IP, self.UDP_PORT))
+        self.seq_num += 1  # ballec de l'hexa pour l'instant
+        if(self.debug or self.virtualcam): #Si la cam est virtuelle ou on debug, on envoie
+            print("Commande n°{} envoyée : {} \n".format(self.seq_num,message))
+
+    def send_payload(self, payloadtype,payload):
+        message=payloadtype +' ' + self.payload2header(payload) + payload
+        if(not(self.virtualcam)): #Si la cam n'est pas virtuel, on envoie le paquet
+            self.sock.sendto(bytes.fromhex(message.replace(' ', '')), (self.UDP_IP, self.UDP_PORT))
+        self.seq_num += 1  # ballec de l'hexa pour l'instant
+        if(self.debug or self.virtualcam): #Si la cam est virtuelle ou on debug, on envoie
+            print("Commande n°{} envoyée : {} \n".format(self.seq_num,message))
+
+    def payload2header(self, payload):
+        """
+        take the payload, calculate the payload lenght and add the sequence number
+        :param payload:
+        :return: header = payloadlenght + seq_num
+        """
+
+        lenght = hex(len(payload.replace(' ', '')))
+        payloadlenght = lenght[2:]
+        if len(lenght) == 1:
+            payloadlenght = '0' + payloadlenght
+
+        header = payloadlenght
+        header = header + ('0' * (8 - len(str(self.seq_num))) + str(self.seq_num))
+        return header
diff --git a/cam_poo.py b/viscaoveriplib/commands_library.py
similarity index 50%
rename from cam_poo.py
rename to viscaoveriplib/commands_library.py
index 3578be97857218a5daf3c65f3cb6706b0ddd001f..88d3e9b61133c36b1995c7b875532a2d2c30b073 100644
--- a/cam_poo.py
+++ b/viscaoveriplib/commands_library.py
@@ -1,68 +1,89 @@
-import socket
-
-"192.168.0.100"
-UDP_PORT = 52381
+from camera import *
 
 class Camera:
-    def __init__(self, UDP_IP,UDP_PORT, seq_num: hex ="0", VV= "09", WW= "09"):
-        """
-        Création d'une caméra
-        :param UDP_IP: IP de la caméra (192.168.0.100 par défaut)
-        :param UDP_PORT: Port de la caméra (52381 par défaut)
-        :param seq_num: sequence number de départ
-        :param VV: Vitesse
-        :param WW: Vitesse
-        """
-        self.seq_num = seq_num  # erreur du capteur UWB (p pour précision...)
-        self.VV = VV
-        self.WW = WW
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
-        self.UDP_IP = UDP_IP
 
-    def move_to_absolute_position(self, YCoordinates, ZCoordinates):
+    ####
+    ####### FONCTIONS COMMANDES D'EXECUTIONS
+    ####
+
+    #CAM_POWER : Power ON/OFF
+    def power_on(self):
+        payloadtype='01 00'
+        payload='81 01 04 00 02 FF'
+        self.send_payload(payloadtype,payload)
+    def power_off(self):
+        payloadtype='01 00'
+        payload='81 01 04 00 02 FF'
+        self.send_payload(payloadtype,payload)
+
+    #CAM_ZOOM : Zoom Control
+
+    #TODO
+
+    #CAM_DZOOM
+    def digital_zoom_off(self):
+        payloadtype='01 00'
+        payload='81 01 04 06 02 FF'
+        self.send_payload(payloadtype,payload)
+    def digital_zoom_on(self):
+        payloadtype='01 00'
+        payload='81 01 04 06 03 FF'
+        self.send_payload(payloadtype,payload)
+
+    #CAM_Focus : Focus Control
+
+    #TODO
+
+    #AF Sensitivity : Auto Focus sensitivity high/low
+    def autofocus_sensivity_normal(self):
+        payloadtype='01 00'
+        payload='81 01 04 58 02 FF'
+        self.send_payload(payloadtype,payload)
+    def autofocus_sensivity_low(self):
+        payloadtype='01 00'
+        payload='81 01 04 58 03 FF'
+        self.send_payload(payloadtype,payload)
+
+    #CAM_AFMode : AutoFocus Movement Mode
+
+    #TODO
+
+    #CAM_IRCOrrection : Focus IR Correction setting
+    def focus_ir_correction_off(self):
+        payloadtype='01 00'
+        payload='81 01 04 11 00 FF'
+        self.send_payload(payloadtype,payload)
+    def focus_ir_correction_on(self):
+        payloadtype='01 00'
+        payload='81 01 04 11 00 FF'
+        self.send_payload(payloadtype,payload)
+
+    #CAM_ZoomFocus
+
+    #TODO
+
+    #PAS FINI A PARTIR D'ICI :
+    def move_to_absolute_position(self, YCoordinates, ZCoordinates, VV=None, WW=None):
         """
         command of absolute position mouvement
         :param YCoordinates: YYYY from to
         :param ZCoordinates: ZZZZ from to
+        :param VV:
+        :param WW:
         :return:
         """
+        if(VV==None):
+            VV=self.VV
+        if(WW==None):
+            WW=self.WW
+        payloadtype = '01 00'
         payload = "81 01 06 02"  # Absolute position moove
-        payload = payload + self.VV + self.WW  # add move speed
+        payload = payload + VV + WW  # add move speed
         for i in [YCoordinates, ZCoordinates]:  # add position
             for j in i:
-                payload = payload + "0" + j
-            payload = payload + "FF"  # end byte
-        header = self.payload2header(self, payload)
-        payloadtype = '01 00'
-        message = payloadtype + header + payload
-        return message
-
-    def payload2header(self, payload: str) -> str:
-        """
-        take the payload, calculate the payload lenght and add the sequence number
-        :param payload:
-        :return: header = payloadlenght + seq_num
-        """
-
-        lenght = hex(len(payload.replace(' ', '')))
-        payloadlenght = lenght[2:]
-        if len(lenght) == 1:
-            payloadlenght = '0' + payloadlenght
-
-        header = payloadlenght
-        header = header + ('0' * (8 - len(str(self.seq_num))) + str(self.seq_num))
-        return header
-
-    def send(self, message: str) -> bool:
-        """
-        Envoie le message à la cam
-        :param message: message str['hex']
-        :return: True si c'est bien passé
-        """
-        self.sock.sendto(bytes.fromhex(message.replace(' ', '')), (self.UDP_IP, self.UDP_PORT))
-        self.seq_num += 1  # ballec de l'hexa pour l'instant
-        print("fait " + self.seq_num)
-        return True
+                payload = payload + " 0" + j
+        payload = payload + "FF"  # end byte #ce code était dans le première boucle, ça me semblait faux.
+        self.send_payload(payloadtype,payload)
 
     def zqsd(self, x: str) -> str:  # hex
         payload = "FF"  # message d'erreur à refaire