<?php
namespace App\Controller;
use App\Entity\Device;
use App\Form\DeviceType;
use App\Entity\DataUplinks;
use App\Repository\BoutonRepository;
use App\Repository\DataUplinksRepository;
use App\Repository\DeviceRepository;
use App\Repository\ModeleRepository;
use App\Repository\ScenarioRepository;
use DateTime;
use DateTimeZone;
use Doctrine\DBAL\Schema\View;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\VarDumper\VarDumper;
class DevicesController extends AbstractController
{
/**
* @Route("/affecter_devices", name="affecter_devices")
*/
public function affecterDevices(ScenarioRepository $scenarioRepository, ModeleRepository $modeleRepository, Request $request, DeviceRepository $deviceRepository)
{
$this->denyAccessUnlessGranted('ROLE_EDIT'); // restreindre l'accès à l'action affecterDevices si l'utilisateur n'a pas le role Edit.
$manager = $this->getDoctrine()->getManager();
$form = $this->createForm(DeviceType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$idClient = $_POST['device']['idClient'];
//Appel API GHOST
$httpClient = new HttpClient();
$httpClient = $httpClient->create();
$response = $httpClient->request('POST', 'https://ghost.camileia.com/api/societe', [
'query' => [
'pass1' => 'CBrEPEdovEmhrmyJTY5twbRB',
'pass2' => 'wnuhGwNru3Q4VLilAi1OXW0G',
'id' => $idClient
]
]);
$client = $response->toArray();
$libelleClient = $client['societe']['libelle'];
$allCreatedDevicesTab = []; // contiendra tous les devices créés, servira pour mettre a jour le PAc des devices via API de Sigfox
//Pour chaque modèle créé
foreach ($_POST['modeles'] as $modele) {
$tabSigFox = [];
$tabSigFox['deviceTypeId'] = $modeleRepository->find($modele['idModele'])->getTypeDevice()->getIdTypeSigfox(); //ID du type de device enregistré par Sigfox
$tabSigFox['productCertificate']['key'] = $modeleRepository->find($modele['idModele'])->getTypeDevice()->getProductKey(); //Clé produit du type de device enregistré par Sigfox
//Pour chaque device d'un modèle
foreach ($modele['devices'] as $devices) {
//hydratation d'un nouveau device
$device = new Device();
$device->setIdClient($idClient)
->setLibelleClient($libelleClient)
->setModele($modeleRepository->find($modele['idModele']))
->setNumeroSerie($devices['idDevice'])
->setPac($devices['pac'])
->setVille($client['societe']['ville'])
->setScenario($scenarioRepository->find($devices['idScenario']))
->setLibelle($devices['libelle'])
->setDateActivation(new \DateTime());
$manager->persist($device);
$tabData = [];
$tabData['id'] = $devices['idDevice'];
$tabData['pac'] = $devices['pac'];
$tabData['name'] = $devices['libelle'];
$tabSigFox['data'][] = $tabData;
$allCreatedDevicesTab[] = $tabSigFox;
}
//Enregistrement des devices via l'API de Sigfox
$this->ajouterDeviceAPISigfox($tabSigFox);
}
$manager->flush();
//MAJ du PAC des devices enregistrées
$devicesSigfox = $this->getInfosDeviceAPISigfox(); //Appel de l'api Sigfox afin de recevoir les informations pour tous les devices enregistrés
//pour chaque device créé
foreach ($allCreatedDevicesTab as $createdDevice) {
//Pour chaque device enregistré chez Sigfox
foreach ($devicesSigfox as $key => $value) {
//Si les id correspondent, on met à jour le PAC du device correspondant
if ($createdDevice['data'][0]['id'] == $key) {
$deviceAModifier = $deviceRepository->find($key);
$deviceAModifier->setPac($value);
$manager->persist($deviceAModifier);
}
}
}
$manager->flush();
//redirection à la liste des clients
return $this->redirectToRoute('clients');
}
return $this->render('devices/affecter_device.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/devices/details_device/{idDevice}", name="details_device")
*/
public function detailsDevice(int $idDevice, DeviceRepository $deviceRepository, DataUplinksRepository $dataUplinksRepository, BoutonRepository $boutonRepository)
{
$device = $deviceRepository->find($idDevice);
$dataUplinksDevice = $dataUplinksRepository->findDataUplinksByDevice($device->getId());
$boutonsDevice = $boutonRepository->findBoutonByScenario($device->getScenario()->getId());
return $this->render('devices/details_device.html.twig', [
'device' => $device,
'dataUplinksDevice' => $dataUplinksDevice,
'boutonsDevice' => $boutonsDevice,
]);
}
/**
* Intercepte les données émises par les devices SimpleLeak
* @Route("/devices/sigfox/simpleleak", name="sigfox_callback_simpleleak")
*/
public function getCallbackSigfoxSimpleLeak(Request $request, DeviceRepository $deviceRepository)
{
$manager = $this->getDoctrine()->getManager();
//Si un message est envoyé depuis un device SimpleLeak
if ($content = $request->getContent()) {
$dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
$data = json_decode($content, true);
$device = $deviceRepository->findDeviceByNumSerie($data['device']);
$horodating = new \DateTime();
//Si le code d'alerte émis n'est pas compris dans le tableau, on retourne une erreur
if (!in_array($data['alert'], ["00", "64", "65", "66", "67"])) {
return $this->json(['status' => 'Unknown alert'], 500);
//Si le mode émis n'est pas compris dans le tableau, on retourne une erreur
} else if ($data['mode'] != "10") {
return $this->json(['status' => 'Mode non pris en compte'], 501);
}
//Pour chaque code d'alerte, une action différente
switch ($data['alert']) {
case '64':
$dataUplinks->setMessageAlerte('Une fuite d\'eau a été détectée')
->setDevice($device)
->setMode($data['mode'])
->setCodeAlerte($data['alert'])
->setHorodating($horodating);
$device->setIsBonEtat(1); //Le device communique
break;
case '65':
$dataUplinks->setMessageAlerte('Fin de la fuite d\'eau')
->setDevice($device)
->setMode($data['mode'])
->setCodeAlerte($data['alert'])
->setHorodating($horodating);
$device->setIsBonEtat(1); //Le device communique
break;
case '66':
$dataUplinks->setMessageAlerte('Mauvaise orientation du boitier')
->setDevice($device)
->setMode($data['mode'])
->setCodeAlerte($data['alert'])
->setHorodating($horodating);
$device->setIsBonEtat(1); //Le device communique
break;
case '67':
$dataUplinks->setMessageAlerte('Le boitier est remis d\'aplomb')
->setDevice($device)
->setMode($data['mode'])
->setCodeAlerte($data['alert'])
->setHorodating($horodating);
$device->setIsBonEtat(1); //Le device communique
break;
//Message "keep-alive" afin de savoir si le device émet toujours
case "00":
$dataUplinks->setDevice($device)
->setMessageAlerte('Je suis en vie')
->setHorodating($horodating);
$device->setIsBonEtat(2); //Le device est en veille
break;
default:
break;
}
$manager->persist($dataUplinks);
$device->setDateDerniereCommunication($horodating);
$manager->persist($device);
$manager->flush();
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Si le code d'alerte correspond à une alerte
if (in_array($dataUplinks->getCodeAlerte(), ['64', '66'])) {
//On créé une Demande d'Intervention via l'API de SEJI
foreach ($sousDomaines as $sousDomaine) {
$this->sendDISeji($sousDomaine, $device, $dataUplinks->getMessageAlerte());
}
}
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
/**
* Intercepte les données émises par les devices clicMe
* @Route("/devices/sigfox/clicme", name="sigfox_callback_clicme")
*/
public function getCallbackSigfoxClicme(Request $request, BoutonRepository $boutonRepository, DeviceRepository $deviceRepository)
{
$manager = $this->getDoctrine()->getManager();
//Si un message est envoyé depuis un device ClicMe
if ($content = $request->getContent()) {
$dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
$data = json_decode($content, true);
$horodating = new \DateTime();
$device = $deviceRepository->findDeviceByNumSerie($data['device']);
$dataUplinks->setDevice($deviceRepository->findDeviceByNumSerie($data['device']))
->setSourceButton($data['boutonSource'])
->setTypeTrigger($data['typeTrigger'])
->setMessageAlerte($boutonRepository->findBoutonByScenarioAndPosition($device->getScenario()->getId(), $data['boutonSource'])[0]->getActionBouton()) //Correspond au libelle du bouton appuyé
->setHorodating($horodating);
$manager->persist($dataUplinks);
$device->setPourcentageBatterie($data['battery'])
->setDateDerniereCommunication($horodating)
->setIsBonEtat(1); //Le device communique
$manager->persist($device);
$manager->flush();
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Créé une Demande d'Intervention via l'API SEJI
foreach ($sousDomaines as $sousDomaine) {
$this->sendDISeji($sousDomaine, $device, $dataUplinks->getMessageAlerte());
}
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
/**
* Intercepte les données émises par les devices Enless Temperature
* @Route("/devices/sigfox/enlessTemperature", name="sigfox_callback_enless_temperature")
*/
public function getCallbackSigfoxEnlessTemperature(Request $request, DeviceRepository $deviceRepository)
{
$manager = $this->getDoctrine()->getManager();
//Si un device EnlessTemperature a émis une donnée
if ($content = $request->getContent()) {
$dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
$data = json_decode($content, true);
$device = $deviceRepository->findDeviceByNumSerie($data['device']);
$horodating = new \DateTime();
$dataUplinks->setDevice($device)
->setTemperature($data['temp'] / 10) //Divise la température par 10 pour l'avoir au bon format (en °C)
->setHorodating($horodating);
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1); //Le device communique
$manager->persist($device);
$manager->persist($dataUplinks);
$manager->flush();
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Envoi de la température à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendTempHumiSeji($sousDomaine, $device, $dataUplinks->getTemperature());
}
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
/**
* Intercepte les données émises par les devices Enless Ambiance
* @Route("/devices/sigfox/enlessAmbiance", name="sigfox_callback_enless_ambiance")
*/
public function getCallbackSigfoxEnlessAmbiance(Request $request, DeviceRepository $deviceRepository)
{
$manager = $this->getDoctrine()->getManager();
//Si un device Enless Ambiance a émis une donnée
if ($content = $request->getContent()) {
$dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
$data = json_decode($content, true);
$device = $deviceRepository->findDeviceByNumSerie($data['device']);
$horodating = new DateTime();
$dataUplinks->setDevice($device)
->setTemperature($data['temp'] / 10) //Divise la température par 10 pour l'avoir au bon format (en °C)
->setHumidity($data['humidity'] / 10) //Divise l'humidité par 10 pour l'avoir au bon format (en pourcentage)
->setHorodating($horodating);
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1); //Le device communique
$manager->persist($device);
$manager->persist($dataUplinks);
$manager->flush();
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Envoie la température et l'humidité à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendTempHumiSeji($sousDomaine, $device, $dataUplinks->getTemperature(), $dataUplinks->getHumidity());
}
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
/**
* Intercepte les messages de statut "keep-alive" envoyés par Sigfox
* @Route("/devices/sigfox/status")
*/
public function status(Request $request, DeviceRepository $deviceRepository)
{
$manager = $this->getDoctrine()->getManager();
//Si Sigfox a émis une donnée
if ($content = $request->getContent()) {
$data = json_decode($content, true);
$dataUplinks = new DataUplinks(); //Nouvelle donnée pour l'historique
$dataUplinks->setDevice($deviceRepository->findDeviceByNumSerie($data['device']));
$device = $deviceRepository->findDeviceByNumSerie($data['device']);
//Si la qualité du réseau est envoyée
if (isset($data['LinkQuality']))
$device->setLinkQuality($data['LinkQuality']);
//Si la batterie est envoyée
if (isset($data['battery']))
$device->setPourcentageBatterie($data['battery']);
//Si la gravité de l'erreur (pas de réponse du device au keep-alive de sigfox) est envoyée
if (isset($data['Severity'])) {
$dataUplinks->setSeverity($data['Severity'])
->setErrorMessage($data['info'])
->setHorodating(new \DateTime());
$device->setIsBonEtat(2); //Le device est en veille
$manager->persist($dataUplinks);
} else {
$device->setIsBonEtat(1); //Le device communique
}
$manager->persist($device);
$manager->flush();
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
/**
* Retourne le sous-domaine d'un client via son ID passé en paramètre
*/
public function getSousDomaineClientById($idClients)
{
$sousdomaines = [];
foreach ($idClients as $idclient) {
//Appel API GHOST
$httpClient = new HttpClient();
$httpClient = $httpClient->create();
$response = $httpClient->request('POST', 'https://ghost.camileia.com/api/societe', [
'query' => [
'pass1' => 'CBrEPEdovEmhrmyJTY5twbRB',
'pass2' => 'wnuhGwNru3Q4VLilAi1OXW0G',
'id' => $idclient
]
]);
$client = $response->toArray();
$sousdomaines[] = $client['societe']['sousdomaine'];
}
return $sousdomaines;
}
/**
* Envoie une Demande d'Intervention à SEJI via son API
*/
public function sendDISeji($sousDomaine, Device $device, ?String $messageAlerte)
{
//Appel de l'API SEJI
$httpClient = new HttpClient();
$httpClient = $httpClient->create();
$response = $httpClient->request('POST', 'https://' . $sousDomaine . '.camileia.com/lara/data/add', [
'json' => [
"device_id" => $device->getNumeroSerie(),
"pass" => "41cb4c447902b0bc922257d08018c736",
"message_alerte" => $messageAlerte
]
]);
return $response->toArray()['etat'];
}
/**
* Envoie la température et l'humidité à SEJI via son API
*/
public function sendTempHumiSeji($sousDomaine, Device $device, $temperature, $humidity = null) {
//Appel de l'API SEJI
$tab = ['json' => [
'device_id' => $device->getNumeroSerie(),
'pass' => '41cb4c447902b0bc922257d08018c736',
'temperature' => strval($temperature)
]];
if (isset($humidity)) {
$tab['json']['humidity'] = strval($humidity);
}
$httpClient = new HttpClient();
$httpClient = $httpClient->create();
$response = $httpClient->request('POST', 'https://' . $sousDomaine . '.camileia.com/lara/data/add', $tab);
return $response->toArray()['etat'];
}
/* Envoie les datas des iots à la solution Camileia via son API */
public function sendDatasToCamileia(
$sousDomaine, Device $device, $temperature = null, $humidity = null, $activityLevel = null,
$co2ppm = null, $devEUI = null, $illumination = null, $infrared = null,
$infraredAndVisible = null, $pressure = null, $tvoc = null, $horodating = null, $dba = null, $dbaeq = null, $dbamax= null
)
{
//Appel de l'API SEJI
$tab = ['json' => [
'device_id' => $device->getNumeroSerie(),
'pass' => '41cb4c447902b0bc922257d08018c736',
]];
$optionalFields = [
'temperature', 'humidity', 'activityLevel', 'co2ppm', 'devEUI',
'illumination', 'infrared', 'infraredAndVisible', 'pressure', 'tvoc', 'horodating',
'dba' , 'dbaeq' , 'dbamax'
];
foreach ($optionalFields as $field) {
if (isset($$field)) {
$tab['json'][$field] = $$field;
}
}
$httpClient = new HttpClient();
$httpClient = $httpClient->create();
$response = $httpClient->request('POST', 'https://' . $sousDomaine . '.camileia.com/lara/data/add', $tab);
return $response->toArray()['etat'];
}
/**
* Retourne les informations de toutes les devices enregistrées chez Sigfox via leur API
* @Route("/devices/sigfox/infos/", name="infos_devices_api_sigfox")
*/
public function getInfosDeviceAPISigfox()
{
$httpClient = new HttpClient();
$httpClient = $httpClient->create([
'auth_basic' => ['5f02da07e833d97984534175', 'd5d72bed6a690735ee5aa22770b7dbde'] //authentification basicAuth obligatoire pour communiquer avec l'API
]);
$response = $httpClient->request('GET', 'https://api.sigfox.com/v2/devices/');
if ($response->getStatusCode() == 200) {
$arrayResponse = array_column($response->toArray()['data'], "pac", "id");
return $arrayResponse;
} else {
return new JsonResponse($response->toArray(), $response->getStatusCode());
}
}
/**
* Permet d'enregistrer des devices chez sigfox. Les devices sont contenues dans un tableau passé en paramètres
*/
public function ajouterDeviceAPISigfox($tabSigFox)
{
$httpClient = new HttpClient();
$httpClient = $httpClient->create([
'auth_basic' => ['5f02da07e833d97984534175', 'd5d72bed6a690735ee5aa22770b7dbde'] //authentification basicAuth obligatoire pour communiquer avec l'API
]);
$response = $httpClient->request('POST', 'https://api.sigfox.com/v2/devices/bulk', [
"json" => $tabSigFox
]);
if ($response->getStatusCode() == 200) {
return new JsonResponse(['status' => 'OK'], 200);
} else {
return new JsonResponse(['status' => 'A problem occured'], $response->getStatusCode());
}
}
/**
* Intercepte les données émises par les devices Milesight Temperature
* @Route("/devices/lora/milesight", name="lora_milesight_device")
*/
public function getMilesightDevice(Request $request, DeviceRepository $deviceRepository,BoutonRepository $boutonRepository, EntityManagerInterface $em)
{
if($request->headers->get('MilesightPassword') === "25EA4DF565368B8BC7C3F5D164D08A1B")
{
// $em = $this->getDoctrine()->getManager();
if($request->headers->get('DeviceModel') === "AM107" || $request->headers->get('DeviceModel') === "AM103"){
if ($content = $request->getContent()) {
$data = json_decode($content, true);
if (isset($data['devEUI'])) {
$device = $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
$horodating = date_create_from_format("Y-m-d\TH:i:s.u\Z", $data['time'], new DateTimeZone('UTC')); // on horodate la data
$horodating->setTimezone(new DateTimeZone('Europe/Paris'));
$dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
$dataUplinks->setDevice($device); // on lie la trame au device concerné
$dataUplinks->setHorodating($horodating);
if (isset($data['temperature'])) { // si la trame contient la temperature
$dataUplinks
->setTemperature($data['temperature']);
}
if (isset($data['humidity'])) { // si la trame contient la temperature
$dataUplinks->setHumidity($data['humidity']);
}
if (isset($data['activity'])) { // si la trame contient le niveau d'activité
$dataUplinks->setActivityLevel($data['activity']);
}
if (isset($data['co2'])) { // si la trame contient le le taux de pollution dans l'air (partie par million)
$dataUplinks->setCo2ppm($data['co2']);
}
if (isset($data['devEUI'])) { // si la trame contient le DevEUI
$dataUplinks->setDevEUI($data['devEUI']);
}
if (isset($data['illumination'])) { // si la trame contient la luminosity
$dataUplinks->setIllumination($data['illumination']);
}
if (isset($data['infrared'])) { // si la trame contient l'infrarouge
$dataUplinks->setInfrared($data['infrared']);
}
if (isset($data['infrared_and_visible'])) {
$dataUplinks->setInfraredAndVisible($data['infrared_and_visible']);
}
if (isset($data['pressure'])) {
$dataUplinks->setPressure($data['pressure']);
}
if (isset($data['tvoc'])) {
$dataUplinks->setTvoc($data['tvoc']);
}
$em->persist($dataUplinks);
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
// //Envoi de la température à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendDatasToCamileia($sousDomaine, $device, $dataUplinks->getTemperature(), $dataUplinks->getHumidity(),
$dataUplinks->getActivityLevel(), $dataUplinks->getCo2ppm(), $dataUplinks->getDevEUI(),
$dataUplinks->getIllumination(), $dataUplinks->getInfrared(), $dataUplinks->getInfraredAndVisible(),
$dataUplinks->getPressure(), $dataUplinks->getTvoc(), $dataUplinks->getHorodating(),
$dataUplinks->getDba(), $dataUplinks->getDbaeq(), $dataUplinks->getDbamax()
);
}
// }
if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
$device->setPourcentageBatterie($data['battery']);
}
$linkQuality = 0;
if(isset($data['rxInfo'][0]['loRaSNR'])) {
if($data['rxInfo'][0]['loRaSNR'] > 0 )
{
$linkQuality = 1;
}
if($data['rxInfo'][0]['loRaSNR'] > 5 )
{
$linkQuality = 2;
}
if($data['rxInfo'][0]['loRaSNR'] > 10)
{
$linkQuality = 3;
}
}
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1)
->setLinkQuality($linkQuality);
$em->persist($device);
$em->flush();
return $this->json([
// 'json' => $data,
'status' => 'ok',
'typeDevice' => 'AM107',
'path' => 'src/Controller/DevicesController.php',
200
]);
} else {
return $this->json(['status' => 'Error' , 'message' => 'No DevEUI provided'], 500);
}
} else {
return $this->json(['status' => 'Error', 'message' => 'Impossible to get the content of the body request'], 500);
}
}
if($request->headers->get('DeviceModel') === "WS302"){
if ($content = $request->getContent()) {
$data = json_decode($content, true);
if (isset($data['devEUI'])) {
$device = $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
$horodating = date_create_from_format("Y-m-d\TH:i:s.u\Z", $data['time'], new DateTimeZone('UTC')); // on horodate la data
$horodating->setTimezone(new DateTimeZone('Europe/Paris'));
$dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
$dataUplinks->setDevice($device); // on lie la trame au device concerné
$dataUplinks->setHorodating($horodating);
if (isset($data['la'])) {
$dataUplinks->setDba($data['la']);
}
if (isset($data['laeq'])) {
$dataUplinks->setDbaeq($data['laeq']);
}
if (isset($data['devEUI'])) {
$dataUplinks->setDevEUI($data['devEUI']);
}
if (isset($data['lafmax'])) {
$dataUplinks->setDbamax($data['lafmax']);
}
$em->persist($dataUplinks);
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
// //Envoi de la température à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendDatasToCamileia($sousDomaine, $device, $dataUplinks->getTemperature(), $dataUplinks->getHumidity(),
$dataUplinks->getActivityLevel(), $dataUplinks->getCo2ppm(), $dataUplinks->getDevEUI(),
$dataUplinks->getIllumination(), $dataUplinks->getInfrared(), $dataUplinks->getInfraredAndVisible(),
$dataUplinks->getPressure(), $dataUplinks->getTvoc(), $dataUplinks->getHorodating(),
$dataUplinks->getDba(), $dataUplinks->getDbaeq(), $dataUplinks->getDbamax()
);
}
// }
if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
$device->setPourcentageBatterie($data['battery']);
}
$linkQuality = 0;
if(isset($data['rxInfo'][0]['loRaSNR'])) {
if($data['rxInfo'][0]['loRaSNR'] > 0 )
{
$linkQuality = 1;
}
if($data['rxInfo'][0]['loRaSNR'] > 5 )
{
$linkQuality = 2;
}
if($data['rxInfo'][0]['loRaSNR'] > 10)
{
$linkQuality = 3;
}
}
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1)
->setLinkQuality($linkQuality);
$em->persist($device);
$em->flush();
return $this->json([
// 'json' => $data,
'status' => 'ok',
'typeDevice' => 'AM107',
'path' => 'src/Controller/DevicesController.php',
200
]);
} else {
return $this->json(['status' => 'Error' , 'message' => 'No DevEUI provided'], 500);
}
} else {
return $this->json(['status' => 'Error', 'message' => 'Impossible to get the content of the body request'], 500);
}
}
if($request->headers->get('DeviceModel') === "DS3604"){
if ($content = $request->getContent()) {
$data = json_decode($content, true);
if (isset($data['devEUI'])) {
$device = $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
$horodating = date_create_from_format("Y-m-d\TH:i:s.u\Z", $data['time'], new DateTimeZone('UTC')); // on horodate la data
$horodating->setTimezone(new DateTimeZone('Europe/Paris'));
if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
$device->setPourcentageBatterie($data['battery']);
}
$linkQuality = 0;
if(isset($data['rxInfo'][0]['loRaSNR'])) {
if($data['rxInfo'][0]['loRaSNR'] > 0 )
{
$linkQuality = 1;
}
if($data['rxInfo'][0]['loRaSNR'] > 5 )
{
$linkQuality = 2;
}
if($data['rxInfo'][0]['loRaSNR'] > 10)
{
$linkQuality = 3;
}
}
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1)
->setLinkQuality($linkQuality);
$em->persist($device);
$em->flush();
return $this->json([
// 'json' => $data,
'status' => 'ok',
'typeDevice' => 'AM107',
'path' => 'src/Controller/DevicesController.php',
200
]);
} else {
return $this->json(['status' => 'Error' , 'message' => 'No DevEUI provided'], 500);
}
} else {
return $this->json(['status' => 'Error', 'message' => 'Impossible to get the content of the body request'], 500);
}
}
if($request->headers->get('DeviceModel') === "WS101"){
if ($content = $request->getContent()) {
$data = json_decode($content, true);
if (isset($data['devEUI'])) {
$device = $deviceRepository->findDeviceByDevEUI($data['devEUI']); // on recup le device par son devEUI
$horodating = date_create_from_format("Y-m-d\TH:i:s.u\Z", $data['time'], new DateTimeZone('UTC')); // on horodate la data
$horodating->setTimezone(new DateTimeZone('Europe/Paris'));
if(isset($data['button'])) {
$dataUplinks = new DataUplinks(); // Nouvelle data pour l'historique
$dataUplinks->setDevice($device); // on lie la trame au device concerné
$dataUplinks->setHorodating($horodating);
$dataUplinks->setSourceButton(1);
$dataUplinks->setMessageAlerte($boutonRepository->findBoutonByScenarioAndPosition($device->getScenario()->getId(), 1)[0]->getActionBouton());
$em->persist($dataUplinks);
$em->flush();
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Envoi de la température à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendDISeji($sousDomaine, $device, $dataUplinks->getMessageAlerte());
}
}
// }
if(isset($data['battery'])) { // si la batterie est présente dans la trame (en pourcentage géré par le decoder)
$device->setPourcentageBatterie($data['battery']);
}
$linkQuality = 0;
if(isset($data['rxInfo'][0]['loRaSNR'])) {
if($data['rxInfo'][0]['loRaSNR'] > 0 )
{
$linkQuality = 1;
}
if($data['rxInfo'][0]['loRaSNR'] > 5 )
{
$linkQuality = 2;
}
if($data['rxInfo'][0]['loRaSNR'] > 10)
{
$linkQuality = 3;
}
}
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1)
->setLinkQuality($linkQuality);
$em->persist($device);
$em->flush();
return $this->json([
'status' => 'ok',
'typeDevice' => 'WS101',
'path' => 'src/Controller/DevicesController.php',
200
]);
} else {
return $this->json(['status' => 'Error' , 'message' => 'No DevEUI provided'], 500);
}
} else {
return $this->json(['status' => 'Error', 'message' => 'Impossible to get the content of the body request'], 500);
}
}
} else {
return $this->json(['status' => 'Error', 'message' => 'Incorrect password'], 500);
}
}
/**
* Intercepte les données émises par les devices Watteco Temperature
* @Route("/devices/lora/wattecoTemperature", name="lora_callback_watteco_temperature")
*/
public function getCallbackLoraWattecoTemperature(Request $request, DeviceRepository $deviceRepository)
{
if($request->headers->get('WattecoPassword') === "3zkKqe8w7S37vsRBb35nrdZJJSVr")
{
$manager = $this->getDoctrine()->getManager();
//Si un device WattecoTemperature a émis une donnée
if ($content = $request->getContent()) {
$data = json_decode($content, true);
if(isset($data['data']['temperature']) || isset($data['data']['disposable_battery_voltage'])) {
$device = $deviceRepository->findDeviceByNumSerie($data['object']['devEUI']);
$horodating = date_create_from_format("Y-m-d\TH:i:s.v\Z",$data['lora']['date'],new DateTimeZone('UTC'));
$horodating->setTimezone(new DateTimeZone('Europe/Paris'));
if(isset($data['data']['temperature'])) {
$dataUplinks = new DataUplinks(); //Nouvelle data pour l'historique
$dataUplinks->setDevice($device)
->setTemperature($data['data']['temperature'])
->setHorodating($horodating);
$manager->persist($dataUplinks);
$idClients = explode(',',$device->getIdClient());
$sousDomaines = $this->getSousDomaineClientById($idClients);
//Envoi de la température à SEJI via l'API
foreach ($sousDomaines as $sousDomaine) {
$this->sendTempHumiSeji($sousDomaine, $device, $dataUplinks->getTemperature());
}
}
if(isset($data['data']['disposable_battery_voltage'])) {
if($data['data']['disposable_battery_voltage'] > 3.6) {
$pourcentage = 100;
} else {
$pourcentage = (($data['data']['disposable_battery_voltage'] - 3)/0.6) * 100;
}
$device->setPourcentageBatterie($pourcentage);
}
$linkQuality = 0;
if(isset($data['object']['rxInfo'][0]['loRaSNR'])) {
if($data['object']['rxInfo'][0]['loRaSNR'] > 0 )
{
$linkQuality = 1;
}
if($data['object']['rxInfo'][0]['loRaSNR'] > 5 )
{
$linkQuality = 2;
}
if($data['object']['rxInfo'][0]['loRaSNR'] > 10)
{
$linkQuality = 3;
}
}
$device->setDateDerniereCommunication($horodating)
->setIsBonEtat(1)
->setLinkQuality($linkQuality);
$manager->persist($device);
$manager->flush();
}
return $this->json(['status' => 'OK'], 200);
} else {
return $this->json(['status' => 'A problem occured'], 500);
}
}
else
{
return $this->json(['status' => 'A problem occured'], 500);
}
}
}