src/Controller/DevicesController.php line 854

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Device;
  4. use App\Form\DeviceType;
  5. use App\Entity\DataUplinks;
  6. use App\Repository\BoutonRepository;
  7. use App\Repository\DataUplinksRepository;
  8. use App\Repository\DeviceRepository;
  9. use App\Repository\ModeleRepository;
  10. use App\Repository\ScenarioRepository;
  11. use DateTime;
  12. use DateTimeZone;
  13. use Doctrine\DBAL\Schema\View;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\HttpClient\HttpClient;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\VarDumper\VarDumper;
  21. class DevicesController extends AbstractController
  22. {
  23.     /**
  24.      * @Route("/affecter_devices", name="affecter_devices")
  25.      */
  26.     public function affecterDevices(ScenarioRepository $scenarioRepositoryModeleRepository $modeleRepositoryRequest $requestDeviceRepository $deviceRepository)
  27.     {
  28.         $this->denyAccessUnlessGranted('ROLE_EDIT'); // restreindre l'accès à l'action affecterDevices si l'utilisateur n'a pas le role Edit.
  29.         $manager $this->getDoctrine()->getManager();
  30.         $form $this->createForm(DeviceType::class);
  31.         $form->handleRequest($request);
  32.         if ($form->isSubmitted() && $form->isValid()) {
  33.             $idClient $_POST['device']['idClient'];
  34.             //Appel API GHOST
  35.             $httpClient = new HttpClient();
  36.             $httpClient $httpClient->create();
  37.             $response $httpClient->request('POST''https://ghost.camileia.com/api/societe', [
  38.                 'query' => [
  39.                     'pass1' => 'CBrEPEdovEmhrmyJTY5twbRB',
  40.                     'pass2' => 'wnuhGwNru3Q4VLilAi1OXW0G',
  41.                     'id' => $idClient
  42.                 ]
  43.             ]);
  44.             $client $response->toArray();
  45.             $libelleClient $client['societe']['libelle'];
  46.             $allCreatedDevicesTab = []; // contiendra tous les devices créés, servira pour mettre a jour le PAc des devices via API de Sigfox
  47.             //Pour chaque modèle créé
  48.             foreach ($_POST['modeles'] as $modele) {
  49.                 $tabSigFox = [];
  50.                 $tabSigFox['deviceTypeId'] = $modeleRepository->find($modele['idModele'])->getTypeDevice()->getIdTypeSigfox(); //ID du type de device enregistré par Sigfox
  51.                 $tabSigFox['productCertificate']['key'] = $modeleRepository->find($modele['idModele'])->getTypeDevice()->getProductKey(); //Clé produit du type de device enregistré par Sigfox
  52.                 //Pour chaque device d'un modèle
  53.                 foreach ($modele['devices'] as $devices) {
  54.                     //hydratation d'un nouveau device
  55.                     $device = new Device();
  56.                     $device->setIdClient($idClient)
  57.                         ->setLibelleClient($libelleClient)
  58.                         ->setModele($modeleRepository->find($modele['idModele']))
  59.                         ->setNumeroSerie($devices['idDevice'])
  60.                         ->setPac($devices['pac'])
  61.                         ->setVille($client['societe']['ville'])
  62.                         ->setScenario($scenarioRepository->find($devices['idScenario']))
  63.                         ->setLibelle($devices['libelle'])
  64.                         ->setDateActivation(new \DateTime());
  65.                     $manager->persist($device);
  66.                     $tabData = [];
  67.                     $tabData['id'] = $devices['idDevice'];
  68.                     $tabData['pac'] = $devices['pac'];
  69.                     $tabData['name'] = $devices['libelle'];
  70.                     $tabSigFox['data'][] = $tabData;
  71.                     $allCreatedDevicesTab[] = $tabSigFox
  72.                 }
  73.                 //Enregistrement des devices via l'API de Sigfox
  74.                 $this->ajouterDeviceAPISigfox($tabSigFox);
  75.             }
  76.             $manager->flush();
  77.             //MAJ du PAC des devices enregistrées
  78.             $devicesSigfox $this->getInfosDeviceAPISigfox(); //Appel de l'api Sigfox afin de recevoir les informations pour tous les devices enregistrés
  79.             //pour chaque device créé
  80.             foreach ($allCreatedDevicesTab as $createdDevice) {
  81.                 //Pour chaque device enregistré chez Sigfox
  82.                 foreach ($devicesSigfox as $key => $value) {
  83.                     //Si les id correspondent, on met à jour le PAC du device correspondant
  84.                     if ($createdDevice['data'][0]['id'] == $key) {
  85.                         $deviceAModifier $deviceRepository->find($key);
  86.                         $deviceAModifier->setPac($value);
  87.                         $manager->persist($deviceAModifier);
  88.                     }
  89.                 }
  90.             }
  91.             $manager->flush();
  92.             //redirection à la liste des clients
  93.             return $this->redirectToRoute('clients');
  94.         }
  95.         return $this->render('devices/affecter_device.html.twig', [
  96.             'form' => $form->createView(),
  97.         ]);
  98.     }
  99.     /**
  100.      * @Route("/devices/details_device/{idDevice}", name="details_device")
  101.      */
  102.     public function detailsDevice(int $idDeviceDeviceRepository $deviceRepositoryDataUplinksRepository $dataUplinksRepositoryBoutonRepository $boutonRepository)
  103.     {
  104.         $device $deviceRepository->find($idDevice);
  105.         $dataUplinksDevice $dataUplinksRepository->findDataUplinksByDevice($device->getId());
  106.         $boutonsDevice $boutonRepository->findBoutonByScenario($device->getScenario()->getId());
  107.         return $this->render('devices/details_device.html.twig', [
  108.             'device' => $device,
  109.             'dataUplinksDevice' => $dataUplinksDevice,
  110.             'boutonsDevice' => $boutonsDevice,
  111.         ]);
  112.     }
  113.     /**
  114.      * Intercepte les données émises par les devices SimpleLeak
  115.      * @Route("/devices/sigfox/simpleleak", name="sigfox_callback_simpleleak")
  116.      */
  117.     public function getCallbackSigfoxSimpleLeak(Request $requestDeviceRepository $deviceRepository)
  118.     {
  119.         $manager $this->getDoctrine()->getManager();
  120.         //Si un message est envoyé depuis un device SimpleLeak
  121.         if ($content $request->getContent()) {
  122.             $dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
  123.             $data json_decode($contenttrue);
  124.             $device $deviceRepository->findDeviceByNumSerie($data['device']);
  125.             $horodating = new \DateTime();
  126.             //Si le code d'alerte émis n'est pas compris dans le tableau, on retourne une erreur
  127.             if (!in_array($data['alert'], ["00""64""65""66""67"])) {
  128.                 return $this->json(['status' => 'Unknown alert'], 500);
  129.             //Si le mode émis n'est pas compris dans le tableau, on retourne une erreur
  130.             } else if ($data['mode'] != "10") {
  131.                 return $this->json(['status' => 'Mode non pris en compte'], 501);
  132.             }
  133.             //Pour chaque code d'alerte, une action différente
  134.             switch ($data['alert']) {
  135.                 case '64':
  136.                     $dataUplinks->setMessageAlerte('Une fuite d\'eau a été détectée')
  137.                         ->setDevice($device)
  138.                         ->setMode($data['mode'])
  139.                         ->setCodeAlerte($data['alert'])
  140.                         ->setHorodating($horodating);
  141.                         $device->setIsBonEtat(1); //Le device communique
  142.                     break;
  143.                 case '65':
  144.                     $dataUplinks->setMessageAlerte('Fin de la fuite d\'eau')
  145.                         ->setDevice($device)
  146.                         ->setMode($data['mode'])
  147.                         ->setCodeAlerte($data['alert'])
  148.                         ->setHorodating($horodating);
  149.                         $device->setIsBonEtat(1); //Le device communique
  150.                     break;
  151.                 case '66':
  152.                     $dataUplinks->setMessageAlerte('Mauvaise orientation du boitier')
  153.                         ->setDevice($device)
  154.                         ->setMode($data['mode'])
  155.                         ->setCodeAlerte($data['alert'])
  156.                         ->setHorodating($horodating);
  157.                         $device->setIsBonEtat(1); //Le device communique
  158.                     break;
  159.                 case '67':
  160.                     $dataUplinks->setMessageAlerte('Le boitier est remis d\'aplomb')
  161.                         ->setDevice($device)
  162.                         ->setMode($data['mode'])
  163.                         ->setCodeAlerte($data['alert'])
  164.                         ->setHorodating($horodating);
  165.                         $device->setIsBonEtat(1); //Le device communique
  166.                     break;
  167.                 //Message "keep-alive" afin de savoir si le device émet toujours
  168.                 case "00":
  169.                     $dataUplinks->setDevice($device)
  170.                         ->setMessageAlerte('Je suis en vie')
  171.                         ->setHorodating($horodating);
  172.                     $device->setIsBonEtat(2); //Le device est en veille
  173.                     break;
  174.                 default:
  175.                     break;
  176.             }
  177.             $manager->persist($dataUplinks);
  178.             $device->setDateDerniereCommunication($horodating);
  179.             $manager->persist($device);
  180.             $manager->flush();
  181.             $idClients explode(',',$device->getIdClient());
  182.             $sousDomaines $this->getSousDomaineClientById($idClients);
  183.             //Si le code d'alerte correspond à une alerte
  184.             if (in_array($dataUplinks->getCodeAlerte(), ['64''66'])) {
  185.             //On créé une Demande d'Intervention via l'API de SEJI
  186.                 foreach ($sousDomaines as $sousDomaine) {
  187.                     $this->sendDISeji($sousDomaine$device$dataUplinks->getMessageAlerte());
  188.                 }
  189.             }
  190.             return $this->json(['status' => 'OK'], 200);
  191.         } else {
  192.             return $this->json(['status' => 'A problem occured'], 500);
  193.         }
  194.     }
  195.     /**
  196.      * Intercepte les données émises par les devices clicMe
  197.      * @Route("/devices/sigfox/clicme", name="sigfox_callback_clicme")
  198.      */
  199.     public function getCallbackSigfoxClicme(Request $requestBoutonRepository $boutonRepositoryDeviceRepository $deviceRepository)
  200.     {
  201.         $manager $this->getDoctrine()->getManager();
  202.         //Si un message est envoyé depuis un device ClicMe
  203.         if ($content $request->getContent()) {
  204.             $dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
  205.             $data json_decode($contenttrue);
  206.             $horodating = new \DateTime();
  207.             $device $deviceRepository->findDeviceByNumSerie($data['device']);
  208.             $dataUplinks->setDevice($deviceRepository->findDeviceByNumSerie($data['device']))
  209.                 ->setSourceButton($data['boutonSource'])
  210.                 ->setTypeTrigger($data['typeTrigger'])
  211.                 ->setMessageAlerte($boutonRepository->findBoutonByScenarioAndPosition($device->getScenario()->getId(), $data['boutonSource'])[0]->getActionBouton()) //Correspond au libelle du bouton appuyé
  212.                 ->setHorodating($horodating);
  213.             $manager->persist($dataUplinks);
  214.             $device->setPourcentageBatterie($data['battery'])
  215.                 ->setDateDerniereCommunication($horodating)
  216.                 ->setIsBonEtat(1); //Le device communique
  217.             $manager->persist($device);
  218.             $manager->flush();
  219.             $idClients explode(',',$device->getIdClient());
  220.             $sousDomaines $this->getSousDomaineClientById($idClients);
  221.             //Créé une Demande d'Intervention via l'API SEJI
  222.             foreach ($sousDomaines as $sousDomaine) {
  223.                 $this->sendDISeji($sousDomaine$device$dataUplinks->getMessageAlerte());
  224.             }
  225.             return $this->json(['status' => 'OK'], 200);
  226.         } else {
  227.             return $this->json(['status' => 'A problem occured'], 500);
  228.         }
  229.     }
  230.     /**
  231.      * Intercepte les données émises par les devices Enless Temperature
  232.      * @Route("/devices/sigfox/enlessTemperature", name="sigfox_callback_enless_temperature")
  233.      */
  234.     public function getCallbackSigfoxEnlessTemperature(Request $requestDeviceRepository $deviceRepository)
  235.     {
  236.         $manager $this->getDoctrine()->getManager();
  237.         //Si un device EnlessTemperature a émis une donnée
  238.         if ($content $request->getContent()) {
  239.             $dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
  240.             $data json_decode($contenttrue);
  241.             $device $deviceRepository->findDeviceByNumSerie($data['device']);
  242.             $horodating = new \DateTime();
  243.             $dataUplinks->setDevice($device)
  244.                 ->setTemperature($data['temp'] / 10//Divise la température par 10 pour l'avoir au bon format (en °C)
  245.                 ->setHorodating($horodating);
  246.             $device->setDateDerniereCommunication($horodating)
  247.                 ->setIsBonEtat(1); //Le device communique
  248.             $manager->persist($device);
  249.             $manager->persist($dataUplinks);
  250.             $manager->flush();
  251.             $idClients explode(',',$device->getIdClient());
  252.             $sousDomaines $this->getSousDomaineClientById($idClients);
  253.             //Envoi de la température à SEJI via l'API
  254.             foreach ($sousDomaines as $sousDomaine) {
  255.                 $this->sendTempHumiSeji($sousDomaine$device$dataUplinks->getTemperature());
  256.             }
  257.             return $this->json(['status' => 'OK'], 200);
  258.         } else {
  259.             return $this->json(['status' => 'A problem occured'], 500);
  260.         }
  261.     }
  262.     /**
  263.      * Intercepte les données émises par les devices Enless Ambiance
  264.      * @Route("/devices/sigfox/enlessAmbiance", name="sigfox_callback_enless_ambiance")
  265.      */
  266.     public function getCallbackSigfoxEnlessAmbiance(Request $requestDeviceRepository $deviceRepository)
  267.     {
  268.         $manager $this->getDoctrine()->getManager();
  269.         //Si un device Enless Ambiance a émis une donnée
  270.         if ($content $request->getContent()) {
  271.             $dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
  272.             $data json_decode($contenttrue);
  273.             $device $deviceRepository->findDeviceByNumSerie($data['device']);
  274.             $horodating = new DateTime();
  275.             $dataUplinks->setDevice($device)
  276.                 ->setTemperature($data['temp'] / 10//Divise la température par 10 pour l'avoir au bon format (en °C)
  277.                 ->setHumidity($data['humidity'] / 10//Divise l'humidité par 10 pour l'avoir au bon format (en pourcentage)
  278.                 ->setHorodating($horodating);
  279.             $device->setDateDerniereCommunication($horodating)
  280.                 ->setIsBonEtat(1); //Le device communique
  281.             $manager->persist($device);
  282.             $manager->persist($dataUplinks);
  283.             $manager->flush();
  284.             $idClients explode(',',$device->getIdClient());
  285.             $sousDomaines $this->getSousDomaineClientById($idClients);
  286.             //Envoie la température et l'humidité à SEJI via l'API
  287.             foreach ($sousDomaines as $sousDomaine) {
  288.                 $this->sendTempHumiSeji($sousDomaine$device$dataUplinks->getTemperature(), $dataUplinks->getHumidity());
  289.             }
  290.             return $this->json(['status' => 'OK'], 200);
  291.         } else {
  292.             return $this->json(['status' => 'A problem occured'], 500);
  293.         }
  294.     }
  295.     /**
  296.      * Intercepte les messages de statut "keep-alive" envoyés par Sigfox
  297.      * @Route("/devices/sigfox/status")
  298.      */
  299.     public function status(Request $requestDeviceRepository $deviceRepository)
  300.     {
  301.         $manager $this->getDoctrine()->getManager();
  302.         //Si Sigfox a émis une donnée
  303.         if ($content $request->getContent()) {
  304.             $data json_decode($contenttrue);
  305.             $dataUplinks = new DataUplinks(); //Nouvelle donnée pour l'historique
  306.             $dataUplinks->setDevice($deviceRepository->findDeviceByNumSerie($data['device']));
  307.             $device $deviceRepository->findDeviceByNumSerie($data['device']);
  308.             //Si la qualité du réseau est envoyée
  309.             if (isset($data['LinkQuality']))
  310.                 $device->setLinkQuality($data['LinkQuality']);
  311.             //Si la batterie est envoyée
  312.             if (isset($data['battery']))
  313.                 $device->setPourcentageBatterie($data['battery']);
  314.             //Si la gravité de l'erreur (pas de réponse du device au keep-alive de sigfox) est envoyée
  315.             if (isset($data['Severity'])) {
  316.                 $dataUplinks->setSeverity($data['Severity'])
  317.                     ->setErrorMessage($data['info'])
  318.                     ->setHorodating(new \DateTime());
  319.                 $device->setIsBonEtat(2); //Le device est en veille
  320.                 $manager->persist($dataUplinks);
  321.             } else {
  322.                 $device->setIsBonEtat(1); //Le device communique
  323.             }
  324.             $manager->persist($device);
  325.             $manager->flush();
  326.             return $this->json(['status' => 'OK'], 200);
  327.         } else {
  328.             return $this->json(['status' => 'A problem occured'], 500);
  329.         }
  330.     }
  331.     /**
  332.      * Retourne le sous-domaine d'un client via son ID passé en paramètre
  333.      */
  334.     public function getSousDomaineClientById($idClients)
  335.     {
  336.         $sousdomaines = [];
  337.         foreach ($idClients as $idclient) {
  338.             //Appel API GHOST
  339.             $httpClient = new HttpClient();
  340.             $httpClient $httpClient->create();
  341.             $response $httpClient->request('POST''https://ghost.camileia.com/api/societe', [
  342.                 'query' => [
  343.                     'pass1' => 'CBrEPEdovEmhrmyJTY5twbRB',
  344.                     'pass2' => 'wnuhGwNru3Q4VLilAi1OXW0G',
  345.                     'id' => $idclient
  346.                 ]
  347.             ]);
  348.             $client $response->toArray();
  349.             $sousdomaines[] = $client['societe']['sousdomaine'];
  350.         }
  351.         return $sousdomaines;
  352.     }
  353.     /**
  354.      * Envoie une Demande d'Intervention à SEJI via son API
  355.      */
  356.     public function sendDISeji($sousDomaineDevice $device, ?String $messageAlerte)
  357.     {
  358.         //Appel de l'API SEJI
  359.         $httpClient = new HttpClient();
  360.         $httpClient $httpClient->create();
  361.         $response $httpClient->request('POST''https://' $sousDomaine '.camileia.com/lara/data/add', [
  362.             'json' => [
  363.                 "device_id" => $device->getNumeroSerie(),
  364.                 "pass" => "41cb4c447902b0bc922257d08018c736",
  365.                 "message_alerte" => $messageAlerte
  366.             ]
  367.         ]);
  368.         return $response->toArray()['etat'];
  369.     }
  370.     /**
  371.      * Envoie la température et l'humidité à SEJI via son API
  372.      */
  373.     public function sendTempHumiSeji($sousDomaineDevice $device$temperature$humidity null) {
  374.         //Appel de l'API SEJI
  375.         $tab = ['json' => [
  376.             'device_id' => $device->getNumeroSerie(),
  377.             'pass' => '41cb4c447902b0bc922257d08018c736',
  378.             'temperature' => strval($temperature)
  379.         ]];
  380.         if (isset($humidity)) {
  381.             $tab['json']['humidity'] = strval($humidity);
  382.         }
  383.         $httpClient = new HttpClient();
  384.         $httpClient $httpClient->create();
  385.         $response $httpClient->request('POST''https://' $sousDomaine '.camileia.com/lara/data/add'$tab);
  386.         return $response->toArray()['etat'];
  387.     }
  388.     /* Envoie les datas des iots à la solution Camileia via son API */
  389.     public function sendDatasToCamileia(
  390.         $sousDomaineDevice $device$temperature null$humidity null$activityLevel null,
  391.         $co2ppm null$devEUI null$illumination null$infrared null
  392.         $infraredAndVisible null$pressure null$tvoc null$horodating null$dba null$dbaeq null$dbamaxnull
  393.     )
  394.     {
  395.         //Appel de l'API SEJI
  396.         $tab = ['json' => [
  397.             'device_id' => $device->getNumeroSerie(),
  398.             'pass' => '41cb4c447902b0bc922257d08018c736',
  399.         ]];
  400.         $optionalFields = [
  401.             'temperature''humidity''activityLevel''co2ppm''devEUI'
  402.             'illumination''infrared''infraredAndVisible''pressure''tvoc''horodating',
  403.             'dba'  'dbaeq'  'dbamax'
  404.         ];
  405.         foreach ($optionalFields as $field) {
  406.             if (isset($$field)) {
  407.                 $tab['json'][$field] = $$field;
  408.             }
  409.         }
  410.         $httpClient = new HttpClient();
  411.         $httpClient $httpClient->create();
  412.         $response $httpClient->request('POST''https://' $sousDomaine '.camileia.com/lara/data/add'$tab);
  413.         return $response->toArray()['etat'];
  414.     }
  415.     /**
  416.      * Retourne les informations de toutes les devices enregistrées chez Sigfox via leur API
  417.      * @Route("/devices/sigfox/infos/", name="infos_devices_api_sigfox")
  418.      */
  419.     public function getInfosDeviceAPISigfox()
  420.     {
  421.         $httpClient = new HttpClient();
  422.         $httpClient $httpClient->create([
  423.             'auth_basic' => ['5f02da07e833d97984534175''d5d72bed6a690735ee5aa22770b7dbde'//authentification basicAuth obligatoire pour communiquer avec l'API
  424.         ]);
  425.         $response $httpClient->request('GET''https://api.sigfox.com/v2/devices/');
  426.         if ($response->getStatusCode() == 200) {
  427.             $arrayResponse array_column($response->toArray()['data'], "pac""id");
  428.             return $arrayResponse;
  429.         } else {
  430.             return new JsonResponse($response->toArray(), $response->getStatusCode());
  431.         }
  432.     }
  433.     /**
  434.      * Permet d'enregistrer des devices chez sigfox. Les devices sont contenues dans un tableau passé en paramètres
  435.      */
  436.     public function ajouterDeviceAPISigfox($tabSigFox)
  437.     {
  438.         $httpClient = new HttpClient();
  439.         $httpClient $httpClient->create([
  440.             'auth_basic' => ['5f02da07e833d97984534175''d5d72bed6a690735ee5aa22770b7dbde'//authentification basicAuth obligatoire pour communiquer avec l'API
  441.         ]);
  442.         $response $httpClient->request('POST''https://api.sigfox.com/v2/devices/bulk', [
  443.             "json" => $tabSigFox
  444.         ]);
  445.         if ($response->getStatusCode() == 200) {
  446.             return new JsonResponse(['status' => 'OK'], 200);
  447.         } else {
  448.             return new JsonResponse(['status' => 'A problem occured'], $response->getStatusCode());
  449.         }
  450.     }
  451.     /**
  452.      * Intercepte les données émises par les devices Milesight Temperature
  453.      * @Route("/devices/lora/milesight", name="lora_milesight_device")
  454.      */
  455.     public function getMilesightDevice(Request $requestDeviceRepository $deviceRepository,BoutonRepository $boutonRepositoryEntityManagerInterface $em)
  456.     {
  457.         if($request->headers->get('MilesightPassword') === "25EA4DF565368B8BC7C3F5D164D08A1B")
  458.         {
  459.             // $em = $this->getDoctrine()->getManager();
  460.             if($request->headers->get('DeviceModel') === "AM107" || $request->headers->get('DeviceModel') === "AM103"){
  461.                 
  462.                 if ($content $request->getContent()) {
  463.                     $data json_decode($contenttrue);
  464.                     if (isset($data['devEUI'])) {
  465.                         $device $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
  466.                         $horodating date_create_from_format("Y-m-d\TH:i:s.u\Z"$data['time'], new DateTimeZone('UTC')); // on horodate la data
  467.                         $horodating->setTimezone(new DateTimeZone('Europe/Paris'));
  468.                         
  469.                         $dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
  470.                         $dataUplinks->setDevice($device); // on lie la trame au device concerné
  471.                         $dataUplinks->setHorodating($horodating);
  472.                         
  473.                         if (isset($data['temperature'])) { // si la trame contient la temperature 
  474.                             $dataUplinks
  475.                             ->setTemperature($data['temperature']);
  476.                         }
  477.                         
  478.                         if (isset($data['humidity'])) { // si la trame contient la temperature 
  479.                             $dataUplinks->setHumidity($data['humidity']);
  480.                         }
  481.                         if (isset($data['activity'])) { // si la trame contient le niveau d'activité 
  482.                             $dataUplinks->setActivityLevel($data['activity']);
  483.                         }
  484.                         if (isset($data['co2'])) { // si la trame contient le le taux de pollution dans l'air (partie par million)
  485.                             $dataUplinks->setCo2ppm($data['co2']);
  486.                         }
  487.                         if (isset($data['devEUI'])) { // si la trame contient le DevEUI
  488.                             $dataUplinks->setDevEUI($data['devEUI']);
  489.                         }
  490.                         if (isset($data['illumination'])) { // si la trame contient la luminosity
  491.                             $dataUplinks->setIllumination($data['illumination']);
  492.                         }
  493.                         if (isset($data['infrared'])) { // si la trame contient l'infrarouge
  494.                             $dataUplinks->setInfrared($data['infrared']);
  495.                         }
  496.                         if (isset($data['infrared_and_visible'])) {
  497.                             $dataUplinks->setInfraredAndVisible($data['infrared_and_visible']);
  498.                         }
  499.                         if (isset($data['pressure'])) {
  500.                             $dataUplinks->setPressure($data['pressure']);
  501.                         }
  502.                         if (isset($data['tvoc'])) {
  503.                             $dataUplinks->setTvoc($data['tvoc']);
  504.                         }
  505.                         
  506.                         $em->persist($dataUplinks);
  507.                         $idClients explode(',',$device->getIdClient());
  508.                         $sousDomaines $this->getSousDomaineClientById($idClients);
  509.                         
  510.                         // //Envoi de la température à SEJI via l'API
  511.                         foreach ($sousDomaines as $sousDomaine) {
  512.                             $this->sendDatasToCamileia($sousDomaine$device$dataUplinks->getTemperature(), $dataUplinks->getHumidity(),
  513.                                 $dataUplinks->getActivityLevel(), $dataUplinks->getCo2ppm(), $dataUplinks->getDevEUI(),
  514.                                 $dataUplinks->getIllumination(), $dataUplinks->getInfrared(), $dataUplinks->getInfraredAndVisible(),
  515.                                 $dataUplinks->getPressure(), $dataUplinks->getTvoc(), $dataUplinks->getHorodating(),
  516.                                 $dataUplinks->getDba(), $dataUplinks->getDbaeq(), $dataUplinks->getDbamax()
  517.                             );
  518.                         }
  519.                         // }
  520.                         if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
  521.                             
  522.                             $device->setPourcentageBatterie($data['battery']);
  523.                         }
  524.                         $linkQuality 0;
  525.                         if(isset($data['rxInfo'][0]['loRaSNR'])) {
  526.                             if($data['rxInfo'][0]['loRaSNR'] > )
  527.                             {
  528.                                 $linkQuality 1;
  529.                             }
  530.                             if($data['rxInfo'][0]['loRaSNR'] > )
  531.                             {
  532.                                 $linkQuality 2;
  533.                             }
  534.                             if($data['rxInfo'][0]['loRaSNR'] > 10)
  535.                             {
  536.                                 $linkQuality 3;
  537.                             }
  538.                         }
  539.             
  540.                         $device->setDateDerniereCommunication($horodating)
  541.                             ->setIsBonEtat(1)
  542.                             ->setLinkQuality($linkQuality);
  543.             
  544.                         $em->persist($device);
  545.                         $em->flush();
  546.                         return $this->json([
  547.                             // 'json' => $data,
  548.                             'status' => 'ok',
  549.                             'typeDevice' => 'AM107',
  550.                             'path' => 'src/Controller/DevicesController.php',
  551.                             200
  552.                         ]);
  553.                     } else {
  554.                         return $this->json(['status' => 'Error' 'message' => 'No DevEUI provided'], 500);
  555.                     }
  556.                 } else {
  557.                     return $this->json(['status' => 'Error''message' => 'Impossible to get the content of the body request'], 500);
  558.                 }
  559.             }
  560.             if($request->headers->get('DeviceModel') === "WS302"){
  561.                 if ($content $request->getContent()) {
  562.                     $data json_decode($contenttrue);
  563.                     if (isset($data['devEUI'])) {
  564.                         $device $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
  565.                         $horodating date_create_from_format("Y-m-d\TH:i:s.u\Z"$data['time'], new DateTimeZone('UTC')); // on horodate la data
  566.                         $horodating->setTimezone(new DateTimeZone('Europe/Paris'));
  567.                         $dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
  568.                         $dataUplinks->setDevice($device); // on lie la trame au device concerné
  569.                         $dataUplinks->setHorodating($horodating);
  570.                         if (isset($data['la'])) {
  571.                             $dataUplinks->setDba($data['la']);
  572.                         }
  573.                         if (isset($data['laeq'])) {
  574.                             $dataUplinks->setDbaeq($data['laeq']);
  575.                         }
  576.                         if (isset($data['devEUI'])) {
  577.                             $dataUplinks->setDevEUI($data['devEUI']);
  578.                         }
  579.                         if (isset($data['lafmax'])) {
  580.                             $dataUplinks->setDbamax($data['lafmax']);
  581.                         }
  582.                         $em->persist($dataUplinks);
  583.                         $idClients explode(',',$device->getIdClient());
  584.                         $sousDomaines $this->getSousDomaineClientById($idClients);
  585.                         // //Envoi de la température à SEJI via l'API
  586.                         foreach ($sousDomaines as $sousDomaine) {
  587.                             $this->sendDatasToCamileia($sousDomaine$device$dataUplinks->getTemperature(), $dataUplinks->getHumidity(),
  588.                                 $dataUplinks->getActivityLevel(), $dataUplinks->getCo2ppm(), $dataUplinks->getDevEUI(),
  589.                                 $dataUplinks->getIllumination(), $dataUplinks->getInfrared(), $dataUplinks->getInfraredAndVisible(),
  590.                                 $dataUplinks->getPressure(), $dataUplinks->getTvoc(), $dataUplinks->getHorodating(),
  591.                                 $dataUplinks->getDba(), $dataUplinks->getDbaeq(), $dataUplinks->getDbamax()
  592.                             );
  593.                         }
  594.                         // }
  595.                         if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
  596.                             $device->setPourcentageBatterie($data['battery']);
  597.                         }
  598.                         $linkQuality 0;
  599.                         if(isset($data['rxInfo'][0]['loRaSNR'])) {
  600.                             if($data['rxInfo'][0]['loRaSNR'] > )
  601.                             {
  602.                                 $linkQuality 1;
  603.                             }
  604.                             if($data['rxInfo'][0]['loRaSNR'] > )
  605.                             {
  606.                                 $linkQuality 2;
  607.                             }
  608.                             if($data['rxInfo'][0]['loRaSNR'] > 10)
  609.                             {
  610.                                 $linkQuality 3;
  611.                             }
  612.                         }
  613.                         $device->setDateDerniereCommunication($horodating)
  614.                             ->setIsBonEtat(1)
  615.                             ->setLinkQuality($linkQuality);
  616.                         $em->persist($device);
  617.                         $em->flush();
  618.                         return $this->json([
  619.                             // 'json' => $data,
  620.                             'status' => 'ok',
  621.                             'typeDevice' => 'AM107',
  622.                             'path' => 'src/Controller/DevicesController.php',
  623.                             200
  624.                         ]);
  625.                     } else {
  626.                         return $this->json(['status' => 'Error' 'message' => 'No DevEUI provided'], 500);
  627.                     }
  628.                 } else {
  629.                     return $this->json(['status' => 'Error''message' => 'Impossible to get the content of the body request'], 500);
  630.                 }
  631.             }
  632.             if($request->headers->get('DeviceModel') === "DS3604"){
  633.                 if ($content $request->getContent()) {
  634.                     $data json_decode($contenttrue);
  635.                     if (isset($data['devEUI'])) {
  636.                         $device $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
  637.                         $horodating date_create_from_format("Y-m-d\TH:i:s.u\Z"$data['time'], new DateTimeZone('UTC')); // on horodate la data
  638.                         $horodating->setTimezone(new DateTimeZone('Europe/Paris'));
  639.                         if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
  640.                             $device->setPourcentageBatterie($data['battery']);
  641.                         }
  642.                         $linkQuality 0;
  643.                         if(isset($data['rxInfo'][0]['loRaSNR'])) {
  644.                             if($data['rxInfo'][0]['loRaSNR'] > )
  645.                             {
  646.                                 $linkQuality 1;
  647.                             }
  648.                             if($data['rxInfo'][0]['loRaSNR'] > )
  649.                             {
  650.                                 $linkQuality 2;
  651.                             }
  652.                             if($data['rxInfo'][0]['loRaSNR'] > 10)
  653.                             {
  654.                                 $linkQuality 3;
  655.                             }
  656.                         }
  657.                         $device->setDateDerniereCommunication($horodating)
  658.                             ->setIsBonEtat(1)
  659.                             ->setLinkQuality($linkQuality);
  660.                         $em->persist($device);
  661.                         $em->flush();
  662.                         return $this->json([
  663.                             // 'json' => $data,
  664.                             'status' => 'ok',
  665.                             'typeDevice' => 'AM107',
  666.                             'path' => 'src/Controller/DevicesController.php',
  667.                             200
  668.                         ]);
  669.                     } else {
  670.                         return $this->json(['status' => 'Error' 'message' => 'No DevEUI provided'], 500);
  671.                     }
  672.                 } else {
  673.                     return $this->json(['status' => 'Error''message' => 'Impossible to get the content of the body request'], 500);
  674.                 }
  675.             }
  676.             if($request->headers->get('DeviceModel') === "WS101"){
  677.                 if ($content $request->getContent()) {
  678.                     $data json_decode($contenttrue);
  679.                     if (isset($data['devEUI'])) {
  680.                         $device $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
  681.                         $horodating date_create_from_format("Y-m-d\TH:i:s.u\Z"$data['time'], new DateTimeZone('UTC')); // on horodate la data
  682.                         $horodating->setTimezone(new DateTimeZone('Europe/Paris'));
  683.                         if(isset($data['button'])) {
  684.                             $dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
  685.                             $dataUplinks->setDevice($device); // on lie la trame au device concerné
  686.                             $dataUplinks->setHorodating($horodating);
  687.                             $dataUplinks->setSourceButton(1);
  688.                             $dataUplinks->setMessageAlerte($boutonRepository->findBoutonByScenarioAndPosition($device->getScenario()->getId(), 1)[0]->getActionBouton());
  689.                             $em->persist($dataUplinks);
  690.                             $em->flush();
  691.                             $idClients explode(',',$device->getIdClient());
  692.                             $sousDomaines $this->getSousDomaineClientById($idClients);
  693.                             //Envoi de la température à SEJI via l'API
  694.                             foreach ($sousDomaines as $sousDomaine) {
  695.                                 $this->sendDISeji($sousDomaine$device$dataUplinks->getMessageAlerte());
  696.                             }
  697.                         }
  698.                         // }
  699.                         if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
  700.                             $device->setPourcentageBatterie($data['battery']);
  701.                         }
  702.                         $linkQuality 0;
  703.                         if(isset($data['rxInfo'][0]['loRaSNR'])) {
  704.                             if($data['rxInfo'][0]['loRaSNR'] > )
  705.                             {
  706.                                 $linkQuality 1;
  707.                             }
  708.                             if($data['rxInfo'][0]['loRaSNR'] > )
  709.                             {
  710.                                 $linkQuality 2;
  711.                             }
  712.                             if($data['rxInfo'][0]['loRaSNR'] > 10)
  713.                             {
  714.                                 $linkQuality 3;
  715.                             }
  716.                         }
  717.                         $device->setDateDerniereCommunication($horodating)
  718.                             ->setIsBonEtat(1)
  719.                             ->setLinkQuality($linkQuality);
  720.                         $em->persist($device);
  721.                         $em->flush();
  722.                         return $this->json([
  723.                             'status' => 'ok',
  724.                             'typeDevice' => 'WS101',
  725.                             'path' => 'src/Controller/DevicesController.php',
  726.                             200
  727.                         ]);
  728.                     } else {
  729.                         return $this->json(['status' => 'Error' 'message' => 'No DevEUI provided'], 500);
  730.                     }
  731.                 } else {
  732.                     return $this->json(['status' => 'Error''message' => 'Impossible to get the content of the body request'], 500);
  733.                 }
  734.             }
  735.         } else {
  736.             return $this->json(['status' => 'Error''message' => 'Incorrect password'], 500);
  737.         }
  738.     }
  739.     /**
  740.      * Intercepte les données émises par les devices Watteco Temperature
  741.      * @Route("/devices/lora/wattecoTemperature", name="lora_callback_watteco_temperature")
  742.      */
  743.     public function getCallbackLoraWattecoTemperature(Request $requestDeviceRepository $deviceRepository)
  744.     {
  745.         if($request->headers->get('WattecoPassword') === "3zkKqe8w7S37vsRBb35nrdZJJSVr")
  746.         {
  747.             $manager $this->getDoctrine()->getManager();
  748.             //Si un device WattecoTemperature a émis une donnée
  749.             if ($content $request->getContent()) {
  750.     
  751.                 $data json_decode($contenttrue);
  752.     
  753.                 if(isset($data['data']['temperature']) || isset($data['data']['disposable_battery_voltage'])) {
  754.     
  755.                     $device $deviceRepository->findDeviceByNumSerie($data['object']['devEUI']);
  756.                 
  757.                     $horodating date_create_from_format("Y-m-d\TH:i:s.v\Z",$data['lora']['date'],new DateTimeZone('UTC'));
  758.                     $horodating->setTimezone(new DateTimeZone('Europe/Paris'));
  759.     
  760.                     if(isset($data['data']['temperature'])) {
  761.                         $dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
  762.                         $dataUplinks->setDevice($device)
  763.                         ->setTemperature($data['data']['temperature'])
  764.                         ->setHorodating($horodating);
  765.     
  766.                         $manager->persist($dataUplinks);
  767.                         $idClients explode(',',$device->getIdClient());
  768.                         $sousDomaines $this->getSousDomaineClientById($idClients);
  769.                         //Envoi de la température à SEJI via l'API
  770.                         foreach ($sousDomaines as $sousDomaine) {
  771.                             $this->sendTempHumiSeji($sousDomaine$device$dataUplinks->getTemperature());
  772.                         }
  773.                     }
  774.                     
  775.                     if(isset($data['data']['disposable_battery_voltage'])) {
  776.     
  777.                         if($data['data']['disposable_battery_voltage'] > 3.6) {
  778.                             $pourcentage 100;
  779.     
  780.                         } else {
  781.                             $pourcentage = (($data['data']['disposable_battery_voltage'] - 3)/0.6) * 100;
  782.                         }
  783.     
  784.                         $device->setPourcentageBatterie($pourcentage);
  785.                     }
  786.     
  787.                     $linkQuality 0;
  788.     
  789.                     if(isset($data['object']['rxInfo'][0]['loRaSNR'])) {
  790.                         if($data['object']['rxInfo'][0]['loRaSNR'] > )
  791.                         {
  792.                             $linkQuality 1;
  793.                         }
  794.                         if($data['object']['rxInfo'][0]['loRaSNR'] > )
  795.                         {
  796.                             $linkQuality 2;
  797.                         }
  798.                         if($data['object']['rxInfo'][0]['loRaSNR'] > 10)
  799.                         {
  800.                             $linkQuality 3;
  801.                         }
  802.                     }
  803.         
  804.                     $device->setDateDerniereCommunication($horodating)
  805.                         ->setIsBonEtat(1)
  806.                         ->setLinkQuality($linkQuality);
  807.         
  808.                     $manager->persist($device);
  809.                     $manager->flush();
  810.                 }
  811.                 
  812.                 return $this->json(['status' => 'OK'], 200);
  813.             } else {
  814.                 return $this->json(['status' => 'A problem occured'], 500);
  815.             }
  816.         }
  817.         else
  818.         {
  819.             return $this->json(['status' => 'A problem occured'], 500);
  820.         }
  821.     }
  822. }