Fuite de mémoire dans mon plugin SMA_SunnyBoy - Help

Salut,

En fait, il n’y a qu’une seule fonction ‹ principale › dans ce plugin, je ne vois pas trop ou mettre ce log car il n’y a que des appels curl …
Crois-tu qu’autre chose puisse generer cett consommation de memoire ?
Je lis du JSON, y’a-t-il peut-etre quelque chose de mal fait a ce niveau ?

	public function getSmaData() {
		//REFERENCES
		//Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
		//https://community.home-assistant.io/t/presenting-sma-converter-values/5033/3
		//http://pydoc.net/pysma/0.1.3/pysma/
		//https://community.openhab.org/t/example-on-how-to-access-data-of-a-sunny-boy-sma-solar-inverter/50963/18
		
		$SMA_IP = $this->getConfiguration("IP");
		$SMA_Port = $this->getConfiguration("Port");
      	$SMA_Protocol = $this->getConfiguration("Protocol");
		$SMA_PASSWORD = $this->getConfiguration("Password");
		$SMA_HTTP = '';
		
     	$DeviceType = $this->getConfiguration("DeviceType");
      	//Type 10 = Onduleur Monophasé
      	//Type 20 = Onduleur Triphasé
      	//Type 30 = Energy Meter Monophasé
      	//Type 40 = Energy Meter Triphasé
      
		if (strlen($SMA_IP) == 0) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> No IP defined for equipment!');
			return;
		}
		
		if (strlen($SMA_PASSWORD) == 0) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> No password defined for equipment!');
			return;
		}
		
		if (strlen($SMA_Port) == 0) {
			$SMA_Port = 443;
		}
		
		if ($SMA_Protocol == 20) {
			$SMA_HTTP = 'http';
		} else {
			$SMA_HTTP = 'https';
		}
		
		$SMA_RIGHT = 'usr';
		$ch = curl_init();
		$headers = array();
		$headers[] = "Accept: application/json";
		$headers[] = "Accept-Charset: UTF-8";
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

		// READ STORED SESSION ID
		try {
			$cmd = $this->getCmd(null, 'sessionID'); // On recherche la commande refresh de l’équipement
			if (is_object($cmd)) { //elle existe et on lance la commande
				$SMA_SID = $cmd->execCmd();
			}
		} catch (Exception $e) {
			$SMA_SID = '';
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot get Session ID: '.$e);
		}
		
		// COLLECTING VALUES
		$InverterKey = '';
		$collection = ('{"destDev":[],"keys":[]}');
		curl_setopt($ch, CURLOPT_POSTFIELDS, $collection);
		curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/getAllOnlValues.json?sid='.$SMA_SID);
		$data = curl_exec($ch);
		
		if (curl_errno($ch)) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot get equipment values: '.curl_error($ch));
			$this->checkAndUpdateCmd('status', 'Erreur Données');
          	curl_close($ch);
          	unset($ch);
          	return;
		} else {
          	$InverterKey = $this->get_string_between($data,'result":{"','"');
		}
      	//curl_close ($ch);
		
		if ($InverterKey == '') {
			// LOGIN
			$credentials = ('{"pass" : "'.$SMA_PASSWORD.'", "right" : "'.$SMA_RIGHT.'"}');
			curl_setopt($ch, CURLOPT_POSTFIELDS, $credentials);
			curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/login.json');
			$data = curl_exec($ch);
			if (curl_errno($ch)) {
				log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot login to equipment: '.curl_error($ch));
				curl_close($ch);
              	unset($ch);
				$this->checkAndUpdateCmd('status', 'Erreur Identification');
				return;
			} else {
				curl_close($ch);
              	unset($ch);
				$json = json_decode($data, true);
				$SMA_SID = $json['result']['sid'];
				$this->checkAndUpdateCmd('sessionID', $SMA_SID);
				$this->checkAndUpdateCmd('status', 'Hors Ligne ...');
				log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Getting session ID ...');
				return;
			}
			
		} else {
          
			$typeID = 0;
          	if ($DeviceType==10 || $DeviceType==20) {$typeID=1;}
          	if ($DeviceType==30 || $DeviceType==40) {$typeID=65;}
          
       		//Get DC Data
          	if ($DeviceType==10 || $DeviceType==20) {
  				$collection = ('{"destDev":[],"keys":["6380_40251E00","6380_40451F00","6380_40452100"]}');
				curl_setopt($ch, CURLOPT_POSTFIELDS, $collection);
				curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/getValues.json?sid='.$SMA_SID);
				$dataDC = curl_exec($ch);
  				$jsonDC = json_decode($dataDC, true);
				$currentDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40452100'][$typeID]['0']['val'])/1000),2);
				$currentDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40452100'][$typeID]['1']['val'])/1000),2);
				$voltageDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40451F00'][$typeID]['0']['val'])/100),1);
				$voltageDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40451F00'][$typeID]['1']['val'])/100),1);
				$powerDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40251E00'][$typeID]['0']['val'])/1),0);
				$powerDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40251E00'][$typeID]['1']['val'])/1),0);
            }
			
			curl_close($ch);
          	unset($ch);

			$json = json_decode($data, true);
		
          	$balance = round(($json['result'][$InverterKey]['6100_40263F00'][$typeID]['0']['val']) * -1,0);
			$pv_power = round($json['result'][$InverterKey]['6100_0046C200'][$typeID]['0']['val'],0);
			$pv_total = round(($json['result'][$InverterKey]['6400_00260100'][$typeID]['0']['val'])/1,0);
			$frequency = round(($json['result'][$InverterKey]['6100_00465700'][$typeID]['0']['val'])/100,1);
			$voltage_l1 = round(($json['result'][$InverterKey]['6100_00464800'][$typeID]['0']['val'])/100,1);
			$voltage_l2 = round(($json['result'][$InverterKey]['6100_00464900'][$typeID]['0']['val'])/100,1);
			$voltage_l3 = round(($json['result'][$InverterKey]['6100_00464A00'][$typeID]['0']['val'])/100,1);
			$current_l1 = round(($json['result'][$InverterKey]['6100_40465300'][$typeID]['0']['val'])/1000,2);
			$current_l2 = round(($json['result'][$InverterKey]['6100_40465400'][$typeID]['0']['val'])/1000,2);
			$current_l3 = round(($json['result'][$InverterKey]['6100_40465500'][$typeID]['0']['val'])/1000,2);
			$wifi_signal = round($json['result'][$InverterKey]['6100_004AB600'][$typeID]['0']['val'],0);
           	$power_l1 = round(floatval(($json['result'][$InverterKey]['6100_40464000'][$typeID]['0']['val'])/1),0);
  			$power_l2 = round(floatval(($json['result'][$InverterKey]['6100_40464100'][$typeID]['0']['val'])/1),0);
  			$power_l3 = round(floatval(($json['result'][$InverterKey]['6100_40464200'][$typeID]['0']['val'])/1),0);
			
          	if ($DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('balance', $balance);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('pv_power', $pv_power);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('pv_total', $pv_total);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('frequency', $frequency);}
			if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l1', $voltage_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l2', $voltage_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l3', $voltage_l3);}
			if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l1', $current_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l2', $current_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l3', $current_l3);}
        	if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l1', $power_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l2', $power_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l3', $power_l3);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('voltageDC_A', $voltageDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('voltageDC_B', $voltageDC_B);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('currentDC_A', $currentDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('currentDC_B', $currentDC_B);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('powerDC_A', $powerDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('powerDC_B', $powerDC_B);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('wifi_signal', $wifi_signal);}
			
			$this->checkAndUpdateCmd('status', 'OK');
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> All good: Session ID='.$SMA_SID.', Equipment Key ='.$InverterKey.' , Data='.$data);
              
			return;
		}
		
	}

Sebastien

Tu le mets déjà au début et à la fin de la fonction pour repérer les différences.
Ou avant et après l’appel de la fonction.

Bonjour,
C’est un graphique de quoi avec quelle unité?

Vous avez quelle quantité de fuite mémoire avec votre plugin?

Salut @jpty,

J’ai applique ton log ‹ memoire › quand le deamon appelle la fonction … juste avant et juste apres, voici le resultat apres quelques bouclent:

[2024-04-02 20:14:10]DEBUG : Memory_usage: 1239608
[2024-04-02 20:14:11]DEBUG : [Energie][SMA-Meter] -> All good: Session ID=PUItzrmduQ0dTomR, Equipment Key =015D-7155AF05 , Data={"result":{"015D-7155AF05":{"6100_40263F00":{"65":[{"val":12}]},"6100_40464000":{"65":[{"val":265}]},"6100_40464100":{"65":[{"val":228}]},"6100_40464200":{"65":[{"val":-480}]},"6100_00464800":{"65":[{"val":22846}]},"6100_00464900":{"65":[{"val":22733}]},"6100_00464A00":{"65":[{"val":22704}]},"6100_40465300":{"65":[{"val":2103}]},"6100_40465400":{"65":[{"val":1669}]},"6100_40465500":{"65":[{"val":2501}]},"6100_00465700":{"65":[{"val":4997}]},"6100_00665800":{"65":[{"val":2}]},"6100_40665F00":{"65":[{"val":589}]},"6100_40666000":{"65":[{"val":371}]},"6100_40666100":{"65":[{"val":267}]},"6100_40666200":{"65":[{"val":-48}]},"6100_40666700":{"65":[{"val":589}]},"6100_40666800":{"65":[{"val":456}]},"6100_40666900":{"65":[{"val":351}]},"6100_40666A00":{"65":[{"val":-483}]},"6180_08214800":{"65":[{"val":[{"tag":307}]}]},"6180_08412900":{"65":[{"val":[{"tag":302}]}]},"6180_08414900":{"65":[{"val":[{"tag":302}]}]},"6180_104A9A00":{"65":[{"val":"192.168.1.80"}]},"6180_104A9B00":{"65":[{"val":"255.255.255.0"}]},"6180_104A9C00":{"65":[{"val":"192.168.1.1"}]},"6180_104A9D00":{"65":[{"val":"192.168.1.208"}]},"6400_00618C00":{"65":[{"val":0}]}}}}
[2024-04-02 20:14:11]DEBUG : Memory_usage: 1668184
[2024-04-02 20:14:11]DEBUG : Memory_usage: 1671064
[2024-04-02 20:14:12]DEBUG : [Energie][SMA-ToitSud] -> All good: Session ID=gNnQ7Yg_Sgz_QawO, Equipment Key =017A-xxxxx940 , Data={"result":{"017A-xxxxx940":{"6100_40263F00":{"1":[{"val":null}]},"6100_00411E00":{"1":[{"val":5000}]},"6100_00411F00":{"1":[{"val":0}]},"6100_00412000":{"1":[{"val":0}]},"6100_00416600":{"1":[{"val":null}]},"6100_00418000":{"1":[{"val":null}]},"6100_40463600":{"1":[{"val":10}]},"6100_40463700":{"1":[{"val":0}]},"6100_40464000":{"1":[{"val":null}]},"6100_40464100":{"1":[{"val":null}]},"6100_40464200":{"1":[{"val":null}]},"6100_00464800":{"1":[{"val":null}]},"6100_00464900":{"1":[{"val":null}]},"6100_00464A00":{"1":[{"val":null}]},"6100_00464B00":{"1":[{"val":null}]},"6100_00464C00":{"1":[{"val":null}]},"6100_00464D00":{"1":[{"val":null}]},"6100_00464E00":{"1":[{"val":1}]},"6100_40465300":{"1":[{"val":null}]},"6100_40465400":{"1":[{"val":null}]},"6100_40465500":{"1":[{"val":null}]},"6100_00465700":{"1":[{"val":null}]},"6100_40466500":{"1":[{"val":2104}]},"6100_40466600":{"1":[{"val":1667}]},"6100_40466B00":{"1":[{"val":2524}]},"6100_40466C00":{"1":[{"val":457}]},"6100_40466D00":{"1":[{"val":349}]},"6100_40466E00":{"1":[{"val":488}]},"6100_00467700":{"1":[{"val":null}]},"6100_00467800":{"1":[{"val":null}]},"6100_00467900":{"1":[{"val":null}]},"6100_00468100":{"1":[{"val":null}]},"6100_40468F00":{"1":[{"val":588}]},"6100_40469900":{"1":[{"val":null}]},"6100_0046C200":{"1":[{"val":null}]},"6100_0046E500":{"1":[{"val":22853}]},"6100_0046E600":{"1":[{"val":22723}]},"6100_0046E700":{"1":[{"val":22744}]},"6100_0046E800":{"1":[{"val":268}]},"6100_0046E900":{"1":[{"val":227}]},"6100_0046EA00":{"1":[{"val":0}]},"6100_0046EB00":{"1":[{"val":0}]},"6100_0046EC00":{"1":[{"val":0}]},"6100_0046ED00":{"1":[{"val":485}]},"6100_4046EE00":{"1":[{"val":370}]},"6100_4046EF00":{"1":[{"val":264}]},"6100_4046F000":{"1":[{"val":46}]},"6100_4046F100":{"1":[{"val":588}]},"6100_004AB600":{"1":[{"val":0}]},"6100_40571F00":{"1":[{"val":null}]},"6100_40652800":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652900":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652A00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652B00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_00652C00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_00653100":{"1":[{"val":null}]},"6100_00653200":{"1":[{"val":null}]},"6100_00664F00":{"1":[{"val":null}]},"6100_00665900":{"1":[{"val":null}]},"6100_40665B00":{"1":[{"val":null}]},"6100_40665F00":{"1":[{"val":null}]},"6100_40666000":{"1":[{"val":null}]},"6100_40666100":{"1":[{"val":null}]},"6100_40666200":{"1":[{"val":null}]},"6100_40666700":{"1":[{"val":null}]},"6100_40666800":{"1":[{"val":null}]},"6100_40666900":{"1":[{"val":null}]},"6100_40666A00":{"1":[{"val":null}]},"6180_08214800":{"1":[{"val":[{"tag":307}]}]},"6180_08412800":{"1":[{"val":[{"tag":16777213}]}]},"6180_08412900":{"1":[{"val":[{"tag":302}]}]},"6180_08413200":{"1":[{"val":[{"tag":16777213}]}]},"6180_08413300":{"1":[{"val":[{"tag":16777213}]}]},"6180_08414900":{"1":[{"val":[{"tag":886}]}]},"6180_08414A00":{"1":[{"val":[{"tag":887}]}]},"6180_08414B00":{"1":[{"val":[{"tag":885}]}]},"6180_08414C00":{"1":[{"val":[{"tag":307}]}]},"6180_08416400":{"1":[{"val":[{"tag":16777213}]}]},"6180_08416500":{"1":[{"val":[{"tag":16777213}]}]},"6180_0846A600":{"1":[{"val":[{"tag":16777213}]}]},"6180_084A2C00":{"1":[{"val":[{"tag":9327}]}]},"6180_084A2E00":{"1":[{"val":[{"tag":302}]}]},"6180_084A6400":{"1":[{"val":[{"tag":307}]}]},"6180_084A9600":{"1":[{"val":[{"tag":307}]}]},"6180_084A9700":{"1":[{"val":[{"tag":1721}]}]},"6180_104A9A00":{"1":[{"val":"192.168.1.81"}]},"6180_104A9B00":{"1":[{"val":"255.255.255.0"}]},"6180_104A9C00":{"1":[{"val":"192.168.1.1"}]},"6180_104A9D00":{"1":[{"val":"192.168.1.1"}]},"6180_084AAA00":{"1":[{"val":[{"tag":307}]}]},"6180_104AB700":{"1":[{"val":""}]},"6180_104AB800":{"1":[{"val":""}]},"6180_104AB900":{"1":[{"val":""}]},"6180_104ABA00":{"1":[{"val":""}]},"6180_084ABB00":{"1":[{"val":[{"tag":3366}]}]},"6180_084ABC00":{"1":[{"val":[{"tag":303}]}]},"6180_084B1E00":{"1":[{"val":[{"tag":307}]}]},"6180_00522700":{"1":[{"low":0,"high":0,"val":null}]},"6180_40522800":{"1":[{"low":0,"high":0,"val":null}]},"6180_00522900":{"1":[{"low":0,"high":0,"val":null}]},"6180_08522A00":{"1":[{"val":[{"tag":16777213}]}]},"6180_08522F00":{"1":[{"val":[{"tag":16777213}]}]},"6180_08652400":{"1":[{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]}]},"6180_08652500":{"1":[{"val":[{"tag":303}]}]},"6180_08652600":{"1":[{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]}]},"6180_08653A00":{"1":[{"val":[{"tag":302}]}]},"6180_08671E00":{"1":[{"val":[{"tag":16777213}]}]},"6380_40251E00":{"1":[{"val":null},{"val":null}]},"6380_40451F00":{"1":[{"val":null},{"val":null}]},"6380_40452100":{"1":[{"val":null},{"val":null}]},"6400_00260100":{"1":[{"val":27943217}]},"6400_00262200":{"1":[{"val":16795}]},"6400_00462400":{"1":[{"val":9281179}]},"6400_00462500":{"1":[{"val":16653451}]},"6400_00462E00":{"1":[{"val":76254425}]},"6400_00462F00":{"1":[{"val":71919881}]},"6400_00469100":{"1":[{"val":9281179}]},"6400_00469200":{"1":[{"val":16653451}]},"6400_0046C300":{"1":[{"val":27964634}]},"6400_00618C00":{"1":[{"val":91770}]}}}}
[2024-04-02 20:14:12]DEBUG : Memory_usage: 1709656
[2024-04-02 20:14:12]DEBUG : Memory_usage: 1712536
[2024-04-02 20:14:12]DEBUG : [Energie][SMA-ToitSudEst] -> All good: Session ID=uFKkaiAdHkZdPggm, Equipment Key =017A-xxxxxE1E , Data={"result":{"017A-xxxxxE1E":{"6100_40263F00":{"1":[{"val":null}]},"6100_00411E00":{"1":[{"val":5000}]},"6100_00411F00":{"1":[{"val":0}]},"6100_00412000":{"1":[{"val":0}]},"6100_00416600":{"1":[{"val":null}]},"6100_00418000":{"1":[{"val":null}]},"6100_40463600":{"1":[{"val":10}]},"6100_40463700":{"1":[{"val":0}]},"6100_40464000":{"1":[{"val":null}]},"6100_40464100":{"1":[{"val":null}]},"6100_40464200":{"1":[{"val":null}]},"6100_00464800":{"1":[{"val":null}]},"6100_00464900":{"1":[{"val":null}]},"6100_00464A00":{"1":[{"val":null}]},"6100_00464B00":{"1":[{"val":null}]},"6100_00464C00":{"1":[{"val":null}]},"6100_00464D00":{"1":[{"val":null}]},"6100_00464E00":{"1":[{"val":1}]},"6100_40465300":{"1":[{"val":null}]},"6100_40465400":{"1":[{"val":null}]},"6100_40465500":{"1":[{"val":null}]},"6100_00465700":{"1":[{"val":null}]},"6100_40466500":{"1":[{"val":2104}]},"6100_40466600":{"1":[{"val":1667}]},"6100_40466B00":{"1":[{"val":2524}]},"6100_40466C00":{"1":[{"val":457}]},"6100_40466D00":{"1":[{"val":349}]},"6100_40466E00":{"1":[{"val":488}]},"6100_00467700":{"1":[{"val":null}]},"6100_00467800":{"1":[{"val":null}]},"6100_00467900":{"1":[{"val":null}]},"6100_00468100":{"1":[{"val":null}]},"6100_40468F00":{"1":[{"val":588}]},"6100_40469900":{"1":[{"val":null}]},"6100_0046C200":{"1":[{"val":null}]},"6100_0046E500":{"1":[{"val":22853}]},"6100_0046E600":{"1":[{"val":22723}]},"6100_0046E700":{"1":[{"val":22744}]},"6100_0046E800":{"1":[{"val":268}]},"6100_0046E900":{"1":[{"val":227}]},"6100_0046EA00":{"1":[{"val":0}]},"6100_0046EB00":{"1":[{"val":0}]},"6100_0046EC00":{"1":[{"val":0}]},"6100_0046ED00":{"1":[{"val":485}]},"6100_4046EE00":{"1":[{"val":370}]},"6100_4046EF00":{"1":[{"val":264}]},"6100_4046F000":{"1":[{"val":46}]},"6100_4046F100":{"1":[{"val":588}]},"6100_004AB600":{"1":[{"val":0}]},"6100_40571F00":{"1":[{"val":null}]},"6100_40652800":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652900":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652A00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_40652B00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_00652C00":{"1":[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]},"6100_00653100":{"1":[{"val":null}]},"6100_00653200":{"1":[{"val":null}]},"6100_00664F00":{"1":[{"val":null}]},"6100_00665900":{"1":[{"val":null}]},"6100_40665B00":{"1":[{"val":null}]},"6100_40665F00":{"1":[{"val":null}]},"6100_40666000":{"1":[{"val":null}]},"6100_40666100":{"1":[{"val":null}]},"6100_40666200":{"1":[{"val":null}]},"6100_40666700":{"1":[{"val":null}]},"6100_40666800":{"1":[{"val":null}]},"6100_40666900":{"1":[{"val":null}]},"6100_40666A00":{"1":[{"val":null}]},"6180_08214800":{"1":[{"val":[{"tag":307}]}]},"6180_08412800":{"1":[{"val":[{"tag":16777213}]}]},"6180_08412900":{"1":[{"val":[{"tag":302}]}]},"6180_08413200":{"1":[{"val":[{"tag":16777213}]}]},"6180_08413300":{"1":[{"val":[{"tag":16777213}]}]},"6180_08414900":{"1":[{"val":[{"tag":886}]}]},"6180_08414A00":{"1":[{"val":[{"tag":887}]}]},"6180_08414B00":{"1":[{"val":[{"tag":885}]}]},"6180_08414C00":{"1":[{"val":[{"tag":307}]}]},"6180_08416400":{"1":[{"val":[{"tag":16777213}]}]},"6180_08416500":{"1":[{"val":[{"tag":16777213}]}]},"6180_0846A600":{"1":[{"val":[{"tag":16777213}]}]},"6180_084A2C00":{"1":[{"val":[{"tag":9327}]}]},"6180_084A2E00":{"1":[{"val":[{"tag":302}]}]},"6180_084A6400":{"1":[{"val":[{"tag":307}]}]},"6180_084A9600":{"1":[{"val":[{"tag":307}]}]},"6180_084A9700":{"1":[{"val":[{"tag":1721}]}]},"6180_104A9A00":{"1":[{"val":"192.168.1.83"}]},"6180_104A9B00":{"1":[{"val":"255.255.255.0"}]},"6180_104A9C00":{"1":[{"val":"192.168.1.1"}]},"6180_104A9D00":{"1":[{"val":"192.168.1.1"}]},"6180_084AAA00":{"1":[{"val":[{"tag":307}]}]},"6180_104AB700":{"1":[{"val":""}]},"6180_104AB800":{"1":[{"val":""}]},"6180_104AB900":{"1":[{"val":""}]},"6180_104ABA00":{"1":[{"val":""}]},"6180_084ABB00":{"1":[{"val":[{"tag":3366}]}]},"6180_084ABC00":{"1":[{"val":[{"tag":303}]}]},"6180_084B1E00":{"1":[{"val":[{"tag":307}]}]},"6180_00522700":{"1":[{"low":0,"high":0,"val":null}]},"6180_40522800":{"1":[{"low":0,"high":0,"val":null}]},"6180_00522900":{"1":[{"low":0,"high":0,"val":null}]},"6180_08522A00":{"1":[{"val":[{"tag":16777213}]}]},"6180_08522F00":{"1":[{"val":[{"tag":16777213}]}]},"6180_08652400":{"1":[{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]}]},"6180_08652500":{"1":[{"val":[{"tag":303}]}]},"6180_08652600":{"1":[{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]},{"val":[{"tag":303}]}]},"6180_08653A00":{"1":[{"val":[{"tag":302}]}]},"6180_08671E00":{"1":[{"val":[{"tag":16777213}]}]},"6380_40251E00":{"1":[{"val":null},{"val":null}]},"6380_40451F00":{"1":[{"val":null},{"val":null}]},"6380_40452100":{"1":[{"val":null},{"val":null}]},"6400_00260100":{"1":[{"val":12679169}]},"6400_00262200":{"1":[{"val":16053}]},"6400_00462400":{"1":[{"val":9281179}]},"6400_00462500":{"1":[{"val":16653451}]},"6400_00462E00":{"1":[{"val":35840475}]},"6400_00462F00":{"1":[{"val":33878495}]},"6400_00469100":{"1":[{"val":9281179}]},"6400_00469200":{"1":[{"val":16653451}]},"6400_0046C300":{"1":[{"val":12679169}]},"6400_00618C00":{"1":[{"val":90518}]}}}}
[2024-04-02 20:14:12]DEBUG : Memory_usage: 1751128
[2024-04-02 20:14:22]DEBUG : Memory_usage: 1758624

On voit que ca ne fait qu’augmenter !

Mon graphique est en % … donc une baisse de memoire constante jusqu’au crash de Jeedom … ce qui est arrive ce week-end. Mais bon on connait la cause maintenant.

Comment est-ce que je peux isoler le truc qui ne va pas?
Car tu vois aussi qu’entre 2 executions du deamon, la memoire augmente aussi !

Sebastien

Ajoute maintenant la ligne log dans la fonction pour voir ce qui consomme la mémoire.

Dans les fuites mémoire, il devrait y avoir le résultat de curl_exec et de json_decode à unset() quand ils ne sont plus utilisés.

OK, alors deja une bonne chose, si je laisse la fonction deamon vide (donc je n’appelle pas ma fonction) alors la consommation de memoire n’augmente pas entre 2 cycles :

[2024-04-02 20:31:08][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:31:18][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:31:28][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:31:58][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:32:08][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:32:18][DEBUG] : Memory_usage: 1181840
[2024-04-02 20:32:38][DEBUG] : Memory_usage: 1181840

La tu viens d’ecrire qu’il faut aussi faire un unset lorsqu’on fait un curl_exec ou json_decode, je n’avais pas cette info …
Du coup si je fais un :

$data = curl_exec($ch);

Alors je dois faire un:

unset($data);

C’est juste?

Oui aussitôt après que $data n’est plus utilisé dans la suite du code.
Mais avant d’ajouter les unset, insère les logs pour voir ce qui consomme.

Si j’execute ceci, cela consomme !

	public static function daemon() {
		//$starttime = microtime(true);
      	log::add(__CLASS__, 'debug', "Memory_usage: ".memory_get_usage());
		foreach (self::byType(__CLASS__, true) as $eqLogic) {
          	$cmd = $eqLogic->getCmd(null, 'update');//retourne la commande 'update' si elle existe
			if (is_object($cmd)) {//si la comande existe
				//$cmd->execCmd();//alors on l'execute
			}
		}
	}

Du coup je dois aussi faire un unset($cmd) ?
EDIT : J’ai essaye … ca augmente toutjours …

EDIT2 : avec ca aussi ca augmente encore …

	public static function daemon() {
		//$starttime = microtime(true);
      	log::add(__CLASS__, 'debug', "Memory_usage: ".memory_get_usage());
		foreach (self::byType(__CLASS__, true) as $eqLogic) {
          	$cmd = $eqLogic->getCmd(null, 'update');//retourne la commande 'update' si elle existe
			if (is_object($cmd)) {//si la comande existe
				//$cmd->execCmd();//alors on l'execute
              	unset($cmd);
              	unset($eqLogic);
			}
		}
	}

Oui, mais de combien ?
Elle est exécutée dans le daemon ?

Un peu de lecture sur le fonctionnement du ramasse-miettes qui devrait faire le job automatiquement:
https://www.php.net/manual/fr/features.gc.collecting-cycles.php
L’expérience montre qu’il faut parfois l’aider avec des unset avant qu’il se déclenche.

Si tu peux te concentrer sur la fonction getSmaData qui consommait le plus, ca me simplifierait la compréhension.
Et fournir des chiffres, je ne vois pas ce que tu fais.

Ca augmente pareil qu’avant les unset que j’ai mis un peu partout.
J’ai lu l’article, je ne vois pas trop comment decouper le code …
Oulala pas simple cette histoire.

Oula, c’est au pif ça.
Montre le code.

Ici dans la fonction deamon:

	public static function daemon() {
		//$starttime = microtime(true);
      	log::add(__CLASS__, 'debug', "Memory_usage: ".memory_get_usage());
		foreach (self::byType(__CLASS__, true) as $eqLogic) {
          	$cmd = $eqLogic->getCmd(null, 'update');//retourne la commande 'update' si elle existe
			if (is_object($cmd)) {//si la comande existe
				$cmd->execCmd();//alors on l'execute
			}
          	unset($cmd);
          	unset($eqLogic);
		}
	}

Puis dans ma fonction GetSmaData :

	public function getSmaData() {
		//REFERENCES
		//Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
		//https://community.home-assistant.io/t/presenting-sma-converter-values/5033/3
		//http://pydoc.net/pysma/0.1.3/pysma/
		//https://community.openhab.org/t/example-on-how-to-access-data-of-a-sunny-boy-sma-solar-inverter/50963/18
		
		$SMA_IP = $this->getConfiguration("IP");
		$SMA_Port = $this->getConfiguration("Port");
      	$SMA_Protocol = $this->getConfiguration("Protocol");
		$SMA_PASSWORD = $this->getConfiguration("Password");
		$SMA_HTTP = '';
		
     	$DeviceType = $this->getConfiguration("DeviceType");
      	//Type 10 = Onduleur Monophasé
      	//Type 20 = Onduleur Triphasé
      	//Type 30 = Energy Meter Monophasé
      	//Type 40 = Energy Meter Triphasé
      
		if (strlen($SMA_IP) == 0) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> No IP defined for equipment!');
			return;
		}
		
		if (strlen($SMA_PASSWORD) == 0) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> No password defined for equipment!');
			return;
		}
		
		if (strlen($SMA_Port) == 0) {
			$SMA_Port = 443;
		}
		
		if ($SMA_Protocol == 20) {
			$SMA_HTTP = 'http';
		} else {
			$SMA_HTTP = 'https';
		}
		
		$SMA_RIGHT = 'usr';
		$ch = curl_init();
		$headers = array();
		$headers[] = "Accept: application/json";
		$headers[] = "Accept-Charset: UTF-8";
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

		// READ STORED SESSION ID
		try {
			$cmd = $this->getCmd(null, 'sessionID'); // On recherche la commande refresh de l’équipement
			if (is_object($cmd)) { //elle existe et on lance la commande
				$SMA_SID = $cmd->execCmd();
			}
		} catch (Exception $e) {
			$SMA_SID = '';
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot get Session ID: '.$e);
		}
		
		// COLLECTING VALUES
		$InverterKey = '';
		$collection = ('{"destDev":[],"keys":[]}');
		curl_setopt($ch, CURLOPT_POSTFIELDS, $collection);
		curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/getAllOnlValues.json?sid='.$SMA_SID);
		$data = curl_exec($ch);
		
		if (curl_errno($ch)) {
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot get equipment values: '.curl_error($ch));
			$this->checkAndUpdateCmd('status', 'Erreur Données');
          	curl_close($ch);
          	unset($ch);
          	return;
		} else {
          	$InverterKey = $this->get_string_between($data,'result":{"','"');
		}
      	//curl_close ($ch);
		
		if ($InverterKey == '') {
			// LOGIN
			$credentials = ('{"pass" : "'.$SMA_PASSWORD.'", "right" : "'.$SMA_RIGHT.'"}');
			curl_setopt($ch, CURLOPT_POSTFIELDS, $credentials);
			curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/login.json');
			$data = curl_exec($ch);
			if (curl_errno($ch)) {
				log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Cannot login to equipment: '.curl_error($ch));
				curl_close($ch);
              	unset($ch);
				$this->checkAndUpdateCmd('status', 'Erreur Identification');
				return;
			} else {
				curl_close($ch);
              	unset($ch);
				$json = json_decode($data, true);
              	unset($data);
				$SMA_SID = $json['result']['sid'];
              	unset($json);
				$this->checkAndUpdateCmd('sessionID', $SMA_SID);
				$this->checkAndUpdateCmd('status', 'Hors Ligne ...');
				log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> Getting session ID ...');
				return;
			}
			
		} else {
          
			$typeID = 0;
          	if ($DeviceType==10 || $DeviceType==20) {$typeID=1;}
          	if ($DeviceType==30 || $DeviceType==40) {$typeID=65;}
          
       		//Get DC Data
          	if ($DeviceType==10 || $DeviceType==20) {
  				$collection = ('{"destDev":[],"keys":["6380_40251E00","6380_40451F00","6380_40452100"]}');
				curl_setopt($ch, CURLOPT_POSTFIELDS, $collection);
				curl_setopt($ch, CURLOPT_URL, $SMA_HTTP.'://'.$SMA_IP.':'.$SMA_Port.'/dyn/getValues.json?sid='.$SMA_SID);
				$dataDC = curl_exec($ch);
  				$jsonDC = json_decode($dataDC, true);
              	unset($dataDC);
				$currentDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40452100'][$typeID]['0']['val'])/1000),2);
				$currentDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40452100'][$typeID]['1']['val'])/1000),2);
				$voltageDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40451F00'][$typeID]['0']['val'])/100),1);
				$voltageDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40451F00'][$typeID]['1']['val'])/100),1);
				$powerDC_A = round(floatval(($jsonDC['result'][$InverterKey]['6380_40251E00'][$typeID]['0']['val'])/1),0);
				$powerDC_B = round(floatval(($jsonDC['result'][$InverterKey]['6380_40251E00'][$typeID]['1']['val'])/1),0);
              	unset($jsonDC);
            }
			
			curl_close($ch);
          	unset($ch);

			$json = json_decode($data, true);
		
          	$balance = round(($json['result'][$InverterKey]['6100_40263F00'][$typeID]['0']['val']) * -1,0);
			$pv_power = round($json['result'][$InverterKey]['6100_0046C200'][$typeID]['0']['val'],0);
			$pv_total = round(($json['result'][$InverterKey]['6400_00260100'][$typeID]['0']['val'])/1,0);
			$frequency = round(($json['result'][$InverterKey]['6100_00465700'][$typeID]['0']['val'])/100,1);
			$voltage_l1 = round(($json['result'][$InverterKey]['6100_00464800'][$typeID]['0']['val'])/100,1);
			$voltage_l2 = round(($json['result'][$InverterKey]['6100_00464900'][$typeID]['0']['val'])/100,1);
			$voltage_l3 = round(($json['result'][$InverterKey]['6100_00464A00'][$typeID]['0']['val'])/100,1);
			$current_l1 = round(($json['result'][$InverterKey]['6100_40465300'][$typeID]['0']['val'])/1000,2);
			$current_l2 = round(($json['result'][$InverterKey]['6100_40465400'][$typeID]['0']['val'])/1000,2);
			$current_l3 = round(($json['result'][$InverterKey]['6100_40465500'][$typeID]['0']['val'])/1000,2);
			$wifi_signal = round($json['result'][$InverterKey]['6100_004AB600'][$typeID]['0']['val'],0);
           	$power_l1 = round(floatval(($json['result'][$InverterKey]['6100_40464000'][$typeID]['0']['val'])/1),0);
  			$power_l2 = round(floatval(($json['result'][$InverterKey]['6100_40464100'][$typeID]['0']['val'])/1),0);
  			$power_l3 = round(floatval(($json['result'][$InverterKey]['6100_40464200'][$typeID]['0']['val'])/1),0);
          
          	unset($json);
			
          	if ($DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('balance', $balance);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('pv_power', $pv_power);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('pv_total', $pv_total);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('frequency', $frequency);}
			if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l1', $voltage_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l2', $voltage_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('voltage_l3', $voltage_l3);}
			if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l1', $current_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l2', $current_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('current_l3', $current_l3);}
        	if ($DeviceType==10 || $DeviceType==20 || $DeviceType==30 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l1', $power_l1);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l2', $power_l2);}
			if ($DeviceType==20 || $DeviceType==40) {$this->checkAndUpdateCmd('power_l3', $power_l3);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('voltageDC_A', $voltageDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('voltageDC_B', $voltageDC_B);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('currentDC_A', $currentDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('currentDC_B', $currentDC_B);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('powerDC_A', $powerDC_A);}
          	if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('powerDC_B', $powerDC_B);}
			if ($DeviceType==10 || $DeviceType==20) {$this->checkAndUpdateCmd('wifi_signal', $wifi_signal);}
			
			$this->checkAndUpdateCmd('status', 'OK');
			log::add('SMA_SunnyBoy', 'debug', $this->getHumanName().' -> All good: Session ID='.$SMA_SID.', Equipment Key ='.$InverterKey.' , Data='.$data);
              
          	unset($data);
          
			return;
		}
		
	}

Sinon je peux aussi arreter et redemarrer le deamon par CRON tous les jours 1x non?

Pour la function daemon, ya que des fonctions Jeedom on ne peut rien y faire.

Pour l’autre, quelle est la valeur de la fuite avec et sans les appels à checkAndUpdateCmd ?

Mais checkAndUpdateCmd est necessaire … aumoins pour recuperer une ID de session (cookie).
Je vais desactiver le tout sauf celle la.

Avec ca donne ceci :
176000 b environ entre chaque boucle.

Et maintenant sans :
37448 b exactement entre chaque boucle.

EDIT :
J’ai rajoute ceci afin de redemarrer le deamon chaque jour a 2h du matin

  	public static function cronHourly() {
    	$h = date('G');
    	if($h == 2) { // Redemarrage du deamon a 2h du matin chaque jour cause fuite memoire
			self::deamon_start();
    	}
  	}

Je sais. Pour le moment on cherche où sont les fuites.
L’utilisation d’ event() est possible. A voir si moins consommateur de mémoire.
Le seul daemon php que je connais n’utilise pas checkAndUpdateCmd mais un extrait.


avec une conso mémoire d’environ 2Mo pour tenir à jour 80 cmds chez moi.

La mémoire utilisée peut aussi baisser si le ramasse-miettes a le temps de s’exécuter.

Ah oui, ça fait beaucoup. Ça tient quand même une journée ?

Sinon il va falloir prendre le principe des daemons fait avec d’autres langages. Un process indépendant lancé dans deamon_start qui fait le curl à l’intervalle défini et qui lance Jeedom via jeeApi ou autres.

Autre piste, la fonction gc_collect_cycles() qui déclenche le ramasse-miettes.

Salut,

Merci pour tes explications mais je ne comprends pas quand tu dis que le seul deamon que tu connais utilise un ‹ extrait › … c’est quoi ça?
Aussi c’est quoi un ‹ ramasse-miettes › ? :slight_smile:
Que dois-je faire avec gc_collect_cycles() ? La faire executer dans une partie du code?

J’ai aussi pris le temps de voir d’autres plugins et aucun n’utilisent ‹ unset › … pourtant ils n’ont pas ces fuites de memoires.
Peut-être que le fait d’executer des boucles trop fréquement fait que la memoire n’a pas le temps d’être libérée?

Dernier point, si je regarde la liste des deamons dans mon Jeedom, celui de mon plugin a un ‹ 10 › dans la case deamon … c’est quoi ? :

Pour l’instant l’ajout de ‹ deamon_start › tous les jours à 2h du matin semble etre efficace même si c’est pas jolie jolie …

Ce serait bien de trouver la vrai raison du problème … mais bon …

Sébastien

Le ramasse-miettes, c’est un programme chargé de nettoyer la mémoire, supprimer les objets inutilisés. Aussi appelé « garbage collector » d’où le GC au début du nom de fonction
gc_collect_cycles fonction non documentée sur php.net

Bonjour,

Quand on clique sur le lien que je vous ai fourni au dessus et que selon votre réponse vous avez lu , en haut de la page à droite, il y a :
image
Avec ce document, vous devriez savoir ce qu’est un ramasse-miettes.
Dans ce même document, gc_collect_cycles est aussi expliqué …

Merci pour vos explications @pifou et @jpty
J’avais pas vu ce coin a droite, j’ai essaye de comprendre le truc mais d’apres l’article la fonction gc_collect_cycle ne fait que compter le ‹ nombre de cycles collectés ›
En quoi est-ce que ceci va liberer de la memoire? J’ai encore rate un truc surement …

Je ne veux pas plus vous embeter avec mes soucis, j’ai appris comment identifier le probleme et je vais continuer de chercher a le resoudre.

Merci,

Sebastien

Oui, le lien fournit par pifou sur la commande gc_collect_cycles donne:
image
Mais dans le cas de votre daemon, il n’y a pas d’amélioration.

Il y a quand même de la lecture sur son utilisation au paragraphe « Voir aussi »

1 « J'aime »