Batteries EcoFlow

On parle ici de l’utilisation de vos objets connectés avec eedomus

Batteries EcoFlow

Messagepar SoicnarfB » 22 Sep 2022 09:03

Bonjour,
une petite contribution pour afficher dans Eedomus l'état de la batterie EcoFlow (inspiré de ce qui a été fait sur Home Assistant).

Après avoir demandé/obtenu votre "API Key" et "Secret" en envoyant un email à support@ecoflow.com en leur fournissant votre numéro de série et l'adresse email avec laquelle vous avez ouvert votre compte chez eux, voici un script à implémenter:

Code : Tout sélectionner
<?php
// appel de eedomus http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]

$Serial = getArg('Serial');
$APIKEY = getArg('APIKEY');
$Secret = getArg('Secret');

$header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
    );
$url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
$http_result = httpQuery($url, 'GET', '','', $header);
$sortie = jsonToXML($http_result);
//Car sort un tableau Ou une string

$code = xpath($sortie,"//code");
$message = xpath($sortie,"//message");

if ($code == "0")
  {
  $datasoc = xpath($sortie,"//data/soc");
  $dataremaintime = xpath($sortie,"//data/remainTime");
  $dataOut = xpath($sortie,"//data/wattsOutSum");
  $dataIn = xpath($sortie,"//data/wattsInSum");
  $finalsortie = "<sortie>Batterie: ".$datasoc."% ".$dataremaintime."min. "."IN: ".$dataIn."W OUT: ".$dataOut."W </sortie>";
  }
 else {
 $finalsortie = "<sortie>".$message."</sortie>";
 }
echo $finalsortie
?>


Les explications du code:
on appelle le script en créant un capteur http avec comme VAR1: le numéro de série de la batterie, VAR2: l'API Key (fournie par le support), VAR3: le secret (aussi fourni par le support)
On construit le header de la requête http avec les paramètres.
On récupère la réponse de la requête et on transforme la sortie JSON en XML.
Pour la réponse, il y a deux possibilité:
- la batterie est connecté (code = 0 (Success)) et dans ce cas là la réponse à la requête est un array qu'on divise dans différentes variables textes et on reconstruit une sortie texte complète pour la sortie du script
- la batterie est deconnectée (code différent de 0 (Success)) et dans ce cas, le retour de la requête est une string qu'on formate en xml et qu'on renvoie à la sortie du script
- le capteur http doit avoir le XPATH suivant: //sortie et ne pas avoir le convert JSONTOXML de coché (puisqu'on le fait dans le script)

Autour du script, quelques suggestions:
- mettre le capteur http en update toutes les 60 min. en fonction de votre usage
- créer un device Ping qui ping si la batterie est connectée
- créer une règle qui demande une mise à jour du capteur http en redeclenchement toutes les 5min quand le device Ping batterie est connectée.

C'est quick, c'est dirty mais ça semble fonctionner ;)

++
F.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar caramella » 25 Jan 2023 09:03

Bonjour
J’envisage de compléter mon système photovoltaïque par une batterie Ecoflow delta pro. Ma maison est domotisée avec Eedomus, je compte donc piloter l’utilisation de la delta pro avec ce système via un inverseur de source et des switch Z-Wave. Pour cela, j’aurais besoin de monitorer le % de charge de la batterie.
Votre script (que je n’ai pas pu essayer car je n’ai pas encore la batterie) est la seule référence que j’ai trouvée en matchant Ecoflow & Eedomus. Vous n’indiquez pas quelles données on peut extraire de « l’array » obtenu. Le % de charge en fait-il partie ?
Merci d’avance
JP Caramella
caramella
 
Messages : 15
Inscription : 22 Oct 2021

Re: Batteries EcoFlow

Messagepar SoicnarfB » 27 Jan 2023 12:10

Bonjour,

oui, le script sort ce type de données:
Batterie: 100% 5999min. IN: 0W OUT: 0W

Le pourcentage de batterie restante, une estimation du temps restant, et je suppose basé sur les courants IN (charge) et OUT (décharge, éléments branchés dessus).
En revanche, j'ai une Ecoflow River Pro (la petite) et pas une delta Pro donc je ne sais pas quelle sera la sortie sur la delta pro.
N'hésitez pas si je peux vous aider à configurer mon script pour votre delta pro.

A noter, que je sors une string (texte) et que si vous voulez faire des tests de comparaison, il va falloir transformer la string (texte) en valeur numérique pour la charge de la batterie.
(ex: si < 75% alors "mettre la batterie en charge" ...)
Donc dans ce cas, il faudrait définir un capteur http appelant le script modifié ci-dessous, définir un type de donnée (nombre décimal), et un chemin xpath du type: //sortie et cela sortira uniquement le pourcentage de batterie restant.
Code : Tout sélectionner
<?php
// appel de eedomus http://localhost/script/?exec=Ecoflow_batt.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]

$Serial = getArg('Serial');
$APIKEY = getArg('APIKEY');
$Secret = getArg('Secret');

$header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
    );
$url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
$http_result = httpQuery($url, 'GET', '','', $header);
$sortie = jsonToXML($http_result);
//Car sort un tableau Ou une string

$code = xpath($sortie,"//code");
$message = xpath($sortie,"//message");

if ($code == "0")
  {
  $datasoc = xpath($sortie,"//data/soc");
  //$dataremaintime = xpath($sortie,"//data/remainTime");
  //$dataOut = xpath($sortie,"//data/wattsOutSum");
  //$dataIn = xpath($sortie,"//data/wattsInSum");
  //$finalsortie = "<sortie>Batterie: ".$datasoc."% ".$dataremaintime."min. "."IN: ".$dataIn."W OUT: ".$dataOut."W </sortie>";
  $finalsortie = "<sortie>".$datasoc."</sortie>";
  }
 else {
 $finalsortie = "<sortie>".$message."</sortie>";
 }
echo $finalsortie
?>

++
F.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar caramella » 27 Jan 2023 14:01

Merci beaucoup pour la réponse.
j'aurais en effet besoin d'une sortie numérique, mon but étant de piloter via Eedomus un inverseur de source pour activer/désactiver la batterie (type "si prod photovoltaïque = 0 et % batterie > 0.3 alors bascule sur batterie" ou bien "si % batterie < 0.1 alors basculer sur secteur").
Je n'hésiterai pas à solliciter vos conseils quand j'aurais les mains dans le cambouis.
Merci encore
JP Caramella
caramella
 
Messages : 15
Inscription : 22 Oct 2021

Re: Batteries EcoFlow

Messagepar opa95 » 31 Jan 2023 11:11

Bonjour SoicnarfB et caramella
caramella a écrit:Merci beaucoup pour la réponse.
j'aurais en effet besoin d'une sortie numérique, mon but étant de piloter via Eedomus un inverseur de source pour activer/désactiver la batterie (type "si prod photovoltaïque = 0 et % batterie > 0.3 alors bascule sur batterie" ou bien "si % batterie < 0.1 alors basculer sur secteur").
Je n'hésiterai pas à solliciter vos conseils quand j'aurais les mains dans le cambouis.
Merci encore
JP Caramella

merci SoicnarfB pour le travail.
J'ai modifié le script pour avoir les informations numériques en direct.
on obtient
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <batterie>100</batterie>
  <remain>5999</remain>
  <powerin>0</powerin>
  <powerout>0</powerout>
  <message>Success</message>
  <sortie>Batterie: 100% 5999min. IN: 0W OUT: 0W </sortie>
</root>

et le résultat se fait donc par
//batterie
//remain
//powerin
//powerout
//message
//sortie
voici le code :)
Code : Tout sélectionner
<?php
// appel de eedomus http://localhost/script/?exec=ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]

$Serial = getArg('Serial');
$APIKEY = getArg('APIKEY');
$Secret = getArg('Secret');

$header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
    );
$url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
$http_result = httpQuery($url, 'GET', '','', $header);
$sortie = jsonToXML($http_result);
//string(100) "{"code":"0","message":"Success","data":{"soc":100,"remainTime":5999,"wattsOutSum":0,"wattsInSum":0}}"
//var_dump($http_result);
//Car sort un tableau Ou une string

$code = xpath($sortie,"//code");
$message = xpath($sortie,"//message");
if ($message == '') $message = 'pas de connexion';

if ($code == "0")  {
    $datasoc = xpath($sortie,"//data/soc");
    $dataremaintime = xpath($sortie,"//data/remainTime");
    $dataOut = xpath($sortie,"//data/wattsOutSum");
    $dataIn = xpath($sortie,"//data/wattsInSum");
    $finalsortie = "  <sortie>Batterie: ".$datasoc."% ".$dataremaintime."min. "."IN: ".$dataIn."W OUT: ".$dataOut."W </sortie>";
  }

else {
  $finalsortie = "  <sortie>".$message."</sortie>";
}
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xml .= '  <batterie>'.$datasoc.'</batterie>'.PHP_EOL;
$xml .= '  <remain>'.$dataremaintime.'</remain>'.PHP_EOL;
$xml .= '  <powerin>'.$dataIn.'</powerin>'.PHP_EOL;
$xml .= '  <powerout>'.$dataOut.'</powerout>'.PHP_EOL;
$xml .= '  <message>'.$message.'</message>'.PHP_EOL;
$xml .= $finalsortie.PHP_EOL;

$xml .= '</root>'.PHP_EOL;
echo $xml;
?>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Batteries EcoFlow

Messagepar opa95 » 31 Jan 2023 17:56

Bonjour
Voici une version d'Ecoflow un peu plus aboutie.
Elle fonctionne bien sur "Ecoflow River PRO"
Elle utilise une mémorisation pour éviter de saturer le serveur avec trop de demandes s'il y a plusieurs devices.
Par défaut, les données ne sont rafraîchies que toutes les heures, mais on peut forcer la lecture en ajoutant &timer=900 dans la chaîne de commande, pour une lecture toutes les 15 minutes (900 secondes ou n'importe quelle valeur).
Voir les informations dans l'entête du script.
Il n'est pas nécessaire de faire un ping sur la batterie pour savoir si elle est en ligne, il suffit de vérifier l'état de la connexion //connexion. Si on est hors connexion, ce sont les infos en mémoire qui sont renvoyées et qui ne sont donc pas nécessairement exactes.
Les données accessibles sont
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <batterie>100</batterie> pourcentage de charge
  <remain>5999</remain>  temps restant en minutes
  <powerin>0</powerin>  Puissance de charge
  <powerout>0</powerout> Puissance délivrée
  <change>2023-01-31 17:11:13</change> date de la dernière sauvegarde en mémoire
  <timestamp>1675181473</timestamp> date de la dernière sauvegarde en mémoire (secondes)
  <age>1432</age> age des informations en secondes
  <origine>memory</origine> données directes (Live) ou stockées
  <message>Success</message>
  <connexion>1</connexion> état de la connexion lors de la dernière tentative de connexion
  <sortie>Batterie: 100% 5999min. IN: 0W OUT: 0W </sortie>
</root>

Les demandes sont donc de la forme //champ : //batterie ou //age ou ...
Le code final est :)
Code : Tout sélectionner
<?php
//Gestion de la batterie ecoflow
//V1.0 renvoi de l'information globale "sortie" Script de SoicnarfB (2022-09-22)
//V1.1 sauvegarde en mémoire et renvois numériques divers Modification opa95 (2023-01-31)
// appel de eedomus
//V1.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//V2.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//ou pour modifier le timer
//http://localhost/script/?exec=Ecoflow.php&timer=900&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
// Il y a appel au serveur si les données sauvées sont anciennes (age>timer)
// timer = 0 -> lecture immédiate, le Timer doit être inférieur au polling du device
// un timer élevé évite les appels multiples au serveur
// Timer par défaut 3600 secondes
//VAR 1 contient le numéro de série (NS) de la batterie
//VAR 2 contient la clé API obtenue auprès du SAV Ecoflow (délai de quelques jours)
//VAR3 contient la code secret API obtenu auprès du SAV Ecoflow
// Résultats
/*
  //batterie   ->100 pourcentage de charge
  //remain    ->5999 temps restant en minutes
  //powerin   ->0 puissance de charge
  //powerout  ->0 puissance de sortie
  //change    ->2023-01-31 16:04:56 date de mise en mémoire
  //timestamp ->1675177496 date de mise en mémoire
  //age       ->0 age des données en secondes
  //origine   ->live [memory, live] source des données
  //message   ->Success
  //connexion ->1 [0,1] batterie connectée (1) ou non (0)
  //sortie    ->Batterie: 100% 5999min. IN: 0W OUT: 0W </sortie>
*/

define('TIMER','3540');// temps minimum
$Serial = getArg('Serial');
$timer = getArg('timer',false,TIMER);
$module_id = getArg('eedomus_controller_module_id');
$data = loadVariable($module_id);
$age = time() - $data['time'];

if ($age > $timer) {
  $APIKEY = getArg('APIKEY');
  $Secret = getArg('Secret');
  $header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
  );
  $url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
  $http_result = httpQuery($url, 'GET', '','', $header);
  $sortie = jsonToXML($http_result);
//string(100) "{"code":"0","message":"Success","data":{"soc":100,"remainTime":5999,"wattsOutSum":0,"wattsInSum":0}}"
//Car sort un tableau Ou une string

  $code = xpath($sortie,"//code");
  $message = xpath($sortie,"//message");
  if ( ($message == '') || (strpos($message,'offline') >0) ) {
    $message = 'pas de connexion';
    $connexion = 0;
  }
  else $connexion = 1;

  if ($code == "0")  {
    $data['soc'] = xpath($sortie,"//data/soc");
    $data['remaintime'] = xpath($sortie,"//data/remainTime");
    $data['out'] = xpath($sortie,"//data/wattsOutSum");
    $data['in'] = xpath($sortie,"//data/wattsInSum");
    $data['finalsortie'] = "  <sortie>Batterie: ".$data['soc']."% ".$data['remaintime']."min. "."IN: ".$data['in']."W OUT: ".$data['out']."W </sortie>";
    $data['time'] = time();
    $data['change'] = date('Y-m-d H:i:s');
    $data['message'] = $message;
    $data['connexion'] = $connexion;
    saveVariable($module_id,$data);
    $data['origine'] = 'live';
    $age = time() - $data['time'];
  }

  else {
    $data['finalsortie'] = "  <sortie>".$message."</sortie>";
    $data['connexion'] = $connexion;
    saveVariable($module_id,$data);
    $data['origine'] = 'memory';
  }
}
else $data['origine'] = 'memory';

@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xml .= '  <batterie>'.$data['soc'].'</batterie>'.PHP_EOL;
$xml .= '  <remain>'.$data['remaintime'].'</remain>'.PHP_EOL;
$xml .= '  <powerin>'.$data['in'].'</powerin>'.PHP_EOL;
$xml .= '  <powerout>'.$data['out'].'</powerout>'.PHP_EOL;
$xml .= '  <change>'.$data['change'].'</change>'.PHP_EOL;
$xml .= '  <timestamp>'.$data['time'].'</timestamp>'.PHP_EOL;
$xml .= '  <age>'.$age.'</age>'.PHP_EOL;
$xml .= '  <origine>'.$data['origine'].'</origine>'.PHP_EOL;
$xml .= '  <message>'.$data['message'].'</message>'.PHP_EOL;
$xml .= '  <connexion>'.$data['connexion'].'</connexion>'.PHP_EOL;
$xml .= $data['finalsortie'].PHP_EOL;
$xml .= '</root>'.PHP_EOL;
echo $xml;
?>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Batteries EcoFlow

Messagepar SoicnarfB » 01 Fév 2023 10:52

Merci opa95 !
ça marche super, on est passé au next level :)
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar opa95 » 01 Fév 2023 10:54

:(
désolé; mais il restait une erreur dans le nom de la mémoire de sauvegarde, voici une version à jour
:)
Code : Tout sélectionner
<?php
//V1.0 renvoi de l'information globale "sortie" Script de SoicnarfB (2022-09-22)
//V1.1 sauvegarde en mémoire et renvois numériques divers Modification opa95 (2023-01-31)
//V1.2 Correction nom de mémoire Modification opa95 (2023-02-01)
// appel de eedomus
//V1.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//V2.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//ou pour modifier le timer
//http://localhost/script/?exec=Ecoflow.php&timer=900&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
// Il y a appel au serveur si les données sauvées sont anciennes (age>timer)
// timer = 0 -> lecture immédiate, le Timer doit être inférieur au polling du device
// un timer élevé évite les appels multiples au serveur
// Timer par défaut 3600 secondes
//VAR 1 contient le numéro de série (NS) de la batterie
//VAR 2 contient la clé API obtenue auprès du SAV Ecoflow (délai de quelques jours)
//VAR3 contient la code secret API obtenu auprès du SAV Ecoflow
// Résultats
/*
  //batterie   ->100 pourcentage de charge
  //remain    ->5999 temps restant en minutes
  //powerin   ->0 puissance de charge
  //powerout  ->0 puissance de sortie
  //change    ->2023-01-31 16:04:56 date de mise en mémoire
  //timestamp ->1675177496 date de mise en mémoire
  //age       ->0 age des données en secondes
  //origine   ->live [memory, live] source des données
  //message   ->Success
  //connexion ->1 [0,1] batterie connectée (1) ou non (0)
  //sortie    ->Batterie: 100% 5999min. IN: 0W OUT: 0W </sortie>
*/

define('TIMER','3540');// temps minimum
$Serial = getArg('Serial');
$timer = getArg('timer',false,TIMER);
$data = loadVariable($Serial);
$age = time() - $data['time'];

if ($age > $timer) {
  $APIKEY = getArg('APIKEY');
  $Secret = getArg('Secret');
  $header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
  );
  $url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
  $http_result = httpQuery($url, 'GET', '','', $header);
  $sortie = jsonToXML($http_result);
//string(100) "{"code":"0","message":"Success","data":{"soc":100,"remainTime":5999,"wattsOutSum":0,"wattsInSum":0}}"
//Car sort un tableau Ou une string

  $code = xpath($sortie,"//code");
  $message = xpath($sortie,"//message");
  if ( ($message == '') || (strpos($message,'offline') >0) ) {
    $message = 'pas de connexion';
    $connexion = 0;
  }
  else $connexion = 1;

  if ($code == "0")  {
    $data['soc'] = xpath($sortie,"//data/soc");
    $data['remaintime'] = xpath($sortie,"//data/remainTime");
    $data['out'] = xpath($sortie,"//data/wattsOutSum");
    $data['in'] = xpath($sortie,"//data/wattsInSum");
    $data['finalsortie'] = "  <sortie>Batterie: ".$data['soc']."% ".$data['remaintime']."min. "."IN: ".$data['in']."W OUT: ".$data['out']."W </sortie>";
    $data['time'] = time();
    $data['change'] = date('Y-m-d H:i:s');
    $data['message'] = $message;
    $data['connexion'] = $connexion;
    saveVariable($module_id,$data);
    $data['origine'] = 'live';
    $age = time() - $data['time'];
  }

  else {
    $data['finalsortie'] = "  <sortie>".$message."</sortie>";
    $data['connexion'] = $connexion;
    saveVariable($module_id,$data);
    $data['origine'] = 'memory';
  }
}
else $data['origine'] = 'memory';

@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xml .= '  <batterie>'.$data['soc'].'</batterie>'.PHP_EOL;
$xml .= '  <remain>'.$data['remaintime'].'</remain>'.PHP_EOL;
$xml .= '  <powerin>'.$data['in'].'</powerin>'.PHP_EOL;
$xml .= '  <powerout>'.$data['out'].'</powerout>'.PHP_EOL;
$xml .= '  <change>'.$data['change'].'</change>'.PHP_EOL;
$xml .= '  <timestamp>'.$data['time'].'</timestamp>'.PHP_EOL;
$xml .= '  <age>'.$age.'</age>'.PHP_EOL;
$xml .= '  <origine>'.$data['origine'].'</origine>'.PHP_EOL;
$xml .= '  <message>'.$data['message'].'</message>'.PHP_EOL;
$xml .= '  <connexion>'.$data['connexion'].'</connexion>'.PHP_EOL;
$xml .= $data['finalsortie'].PHP_EOL;
$xml .= '</root>'.PHP_EOL;
echo $xml;
?>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Batteries EcoFlow

Messagepar SoicnarfB » 01 Fév 2023 11:07

Hello,
alors je n'avais pas d'erreur sur le script précédent mais le dernier me renvoit:
## ERROR : Variable name [] must be a string with characters from [a-zA-Z0-9_]

quand l'ecoflow est hors ligne.... :/
edit: (et quand branchée aussi)
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar opa95 » 01 Fév 2023 11:34

Bonjour SoicnarfB
SoicnarfB a écrit:Hello,
alors je n'avais pas d'erreur sur le script précédent mais le dernier me renvoit:
## ERROR : Variable name [] must be a string with characters from [a-zA-Z0-9_]

quand l'ecoflow est hors ligne.... :/
edit: (et quand branchée aussi)

Désolé, je n'avais modifié qu'à un endroit au lieu de 3.
Normalement, c'est bon maintenant.
Dans l'ancien, la mémoire avait le nom de device appelant, ce qui ne sert à rien s'il y a plusieurs devices.
Maintenant, c'est le code SN de la batterie, il n'y a plus de problème avec les devices ni avec les batteries s'il y en a plusieurs (à condition que le SN de la batterie ne comporte pas de symboles bizarres) :)
Code : Tout sélectionner
<?php
//V1.0 renvoi de l'information globale "sortie" Script de SoicnarfB (2022-09-22)
//V1.1 sauvegarde en mémoire et renvois numériques divers Modification opa95 (2023-01-31)
//V1.2 Correction nom de mémoire Modification opa95 (2023-02-01)
// appel de eedomus
//V1.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//V2.0 http://localhost/script/?exec=Ecoflow.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
//ou pour modifier le timer
//http://localhost/script/?exec=Ecoflow.php&timer=900&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
// Il y a appel au serveur si les données sauvées sont anciennes (age>timer)
// timer = 0 -> lecture immédiate, le Timer doit être inférieur au polling du device
// un timer élevé évite les appels multiples au serveur
// Timer par défaut 3600 secondes
//VAR 1 contient le numéro de série (NS) de la batterie
//VAR 2 contient la clé API obtenue auprès du SAV Ecoflow (délai de quelques jours)
//VAR3 contient la code secret API obtenu auprès du SAV Ecoflow
// Résultats
/*
  //batterie   ->100 pourcentage de charge
  //remain    ->5999 temps restant en minutes
  //powerin   ->0 puissance de charge
  //powerout  ->0 puissance de sortie
  //change    ->2023-01-31 16:04:56 date de mise en mémoire
  //timestamp ->1675177496 date de mise en mémoire (secondes)
  //age       ->0 age des données en secondes
  //origine   ->live [memory, live] source des données
  //message   ->Success
  //connexion ->1 [0,1] batterie connectée (1) ou non (0)
  //sortie    ->Batterie: 100% 5999min. IN: 0W OUT: 0W </sortie>
*/

define('TIMER','3540');// temps minimum
$Serial = getArg('Serial');
$timer = getArg('timer',false,TIMER);
$data = loadVariable($Serial);
$age = time() - $data['time'];

if ($age > $timer) {
  $APIKEY = getArg('APIKEY');
  $Secret = getArg('Secret');
  $header = array(
    "Content-Type: application/json",
   "appKey: ".$APIKEY,
   "secretKey: ".$Secret
  );
  $url ="https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=".$Serial;
  $http_result = httpQuery($url, 'GET', '','', $header);
  $sortie = jsonToXML($http_result);
//string(100) "{"code":"0","message":"Success","data":{"soc":100,"remainTime":5999,"wattsOutSum":0,"wattsInSum":0}}"
//Car sort un tableau Ou une string

  $code = xpath($sortie,"//code");
  $message = xpath($sortie,"//message");
  if ( ($message == '') || (strpos($message,'offline') >0) ) {
    $message = 'pas de connexion';
    $connexion = 0;
  }
  else $connexion = 1;

  if ($code == "0")  {
    $data['soc'] = xpath($sortie,"//data/soc");
    $data['remaintime'] = xpath($sortie,"//data/remainTime");
    $data['out'] = xpath($sortie,"//data/wattsOutSum");
    $data['in'] = xpath($sortie,"//data/wattsInSum");
    $data['finalsortie'] = "  <sortie>Batterie: ".$data['soc']."% ".$data['remaintime']."min. "."IN: ".$data['in']."W OUT: ".$data['out']."W </sortie>";
    $data['time'] = time();
    $data['change'] = date('Y-m-d H:i:s');
    $data['message'] = $message;
    $data['connexion'] = $connexion;
    saveVariable($Serial,$data);
    $data['origine'] = 'live';
    $age = time() - $data['time'];
  }

  else {
    $data['finalsortie'] = "  <sortie>".$message."</sortie>";
    $data['connexion'] = $connexion;
    saveVariable($Serial,$data);
    $data['origine'] = 'memory';
  }
}
else $data['origine'] = 'memory';

@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xml .= '  <batterie>'.$data['soc'].'</batterie>'.PHP_EOL;
$xml .= '  <remain>'.$data['remaintime'].'</remain>'.PHP_EOL;
$xml .= '  <powerin>'.$data['in'].'</powerin>'.PHP_EOL;
$xml .= '  <powerout>'.$data['out'].'</powerout>'.PHP_EOL;
$xml .= '  <change>'.$data['change'].'</change>'.PHP_EOL;
$xml .= '  <timestamp>'.$data['time'].'</timestamp>'.PHP_EOL;
$xml .= '  <age>'.$age.'</age>'.PHP_EOL;
$xml .= '  <origine>'.$data['origine'].'</origine>'.PHP_EOL;
$xml .= '  <message>'.$data['message'].'</message>'.PHP_EOL;
$xml .= '  <connexion>'.$data['connexion'].'</connexion>'.PHP_EOL;
$xml .= $data['finalsortie'].PHP_EOL;
$xml .= '</root>'.PHP_EOL;
echo $xml;
?>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Batteries EcoFlow

Messagepar SoicnarfB » 01 Fév 2023 17:23

Je confirme, nickel !
Merci !
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar misterden » 22 Fév 2023 21:53

je prends le sujet en cours car intéressé d'utiliser une EcoFlow sur mon routeur ethernet POE ( ou sont câblés l'ensemble des caméras POE de la maison).
L'idée étant de l'utiliser en tant qu'onduleur et batterie de secours.

Mais étant en photovoltaïque à la maison, j'aimerai pouvoir charger l'appareil en journée, puis la nuit ( ou une partie de la nuit ) le basculer sur la batterie et utiliser la charge disponible puis revenir sur le secteur.

Je ne connais pas le produit j'ai vu plusieurs test dont celui-ci (dont l'utilisation en alimentation de secours domestique essentielle avec une auto-commutation < 30 ms) :

test de la ecoflow river 2 https://www.youtube.com/watch?v=VReo9z--o5o

Mon idée initiale étant de brancher l'ecoflow derrière une prise connectée zwave ( pilotée par l'eedomus ) et de brancher le routeur ethernet sur l'ecoflow pour l'utiliser comme onduleur.

De piloter la bascule ( réseau / batterie) via la pise connectée pour couper l'alimentation et forcer l'ecoflow a passer sur la batterie, puis revenir sur secteur.

Mais vu la possibilité présenté dans le sujet de piloter via l'API l'appareil peut on faire ce type de bascule via cette API sans passer par l'utilisation d'une prise connectée ?
misterden
 
Messages : 723
Inscription : 02 Nov 2014

Re: Batteries EcoFlow

Messagepar SoicnarfB » 24 Fév 2023 18:24

Bonjour Misterden,

l'API présentée ne permet que d'interroger l'Ecoflow et pas de la programmer ou d'acrtiver une de ces prises.
Je ne crois pas que le constructeur ait mis à disposition une API de commande.
Tu peux en revanche gérer la bascule par une prise zwave comme tu le présentes en prenant en compte l'état de l'Ecoflow, imaginons que la journée a été très nuageuse et cela n'a pas permis de recharger assez l'Ecoflow, dans ce cas ta règle/ton déclencheur, en fonction de l'état de charge de l'Ecoflow décide ou pas de basculer sur le mode batterie ou de rester sur le mode secteur.

++
F.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar misterden » 24 Fév 2023 22:25

SoicnarfB a écrit:Bonjour Misterden,

l'API présentée ne permet que d'interroger l'Ecoflow et pas de la programmer ou d'acrtiver une de ces prises.
Je ne crois pas que le constructeur ait mis à disposition une API de commande.
Tu peux en revanche gérer la bascule par une prise zwave comme tu le présentes en prenant en compte l'état de l'Ecoflow, imaginons que la journée a été très nuageuse et cela n'a pas permis de recharger assez l'Ecoflow, dans ce cas ta règle/ton déclencheur, en fonction de l'état de charge de l'Ecoflow décide ou pas de basculer sur le mode batterie ou de rester sur le mode secteur.

++
F.


merci c'est bien ce qui me semblait après avoir bien regardé les échanges.
Mais si effectivement je peux récupérer les infos et gérer la prise avec l'eedomus ça collera à ce que je souhaite faire .
misterden
 
Messages : 723
Inscription : 02 Nov 2014

Re: Batteries EcoFlow

Messagepar caramella » 25 Mars 2023 20:15

Bonsoir à tous
J’ai enfin reçu mon Ecoflow delta Pro que j’ai mise en service. J’ai obtenu d’Ecoflow les codes « Api key» et « secret ».
Donc, je vais créer un capteur http et y intégrer le script de SoicnarfB modifié par opa95 (version du 1er février) ainsi que VAR 1, 2 et 3 (serial, api key & secret).
Cependant, je bute sur le chemin Xpath. La page de la doc eedomus en lien n’est pas vraiment informative. Elle apporte sûrement des infos utiles à quelqu’un qui maîtrise déjà le sujet mais pas à un newbie comme moi dans ce domaine.
Pouvez vous m’éclairer sur ce que je dois mettre dans le champ « chemin Xpath » ?
Merci d’avance pour votre aide précieuse.
caramella
 
Messages : 15
Inscription : 22 Oct 2021

Re: Batteries EcoFlow

Messagepar SoicnarfB » 26 Mars 2023 11:40

Hello,
c'est assez simple.
Dans le script, tu as toute cette partie là:
Code : Tout sélectionner
$xml .= '<root>'.PHP_EOL;
$xml .= '  <batterie>'.$data['soc'].'</batterie>'.PHP_EOL;
$xml .= '  <remain>'.$data['remaintime'].'</remain>'.PHP_EOL;
$xml .= '  <powerin>'.$data['in'].'</powerin>'.PHP_EOL;
$xml .= '  <powerout>'.$data['out'].'</powerout>'.PHP_EOL;
$xml .= '  <change>'.$data['change'].'</change>'.PHP_EOL;
$xml .= '  <timestamp>'.$data['time'].'</timestamp>'.PHP_EOL;
$xml .= '  <age>'.$age.'</age>'.PHP_EOL;
$xml .= '  <origine>'.$data['origine'].'</origine>'.PHP_EOL;
$xml .= '  <message>'.$data['message'].'</message>'.PHP_EOL;
$xml .= '  <connexion>'.$data['connexion'].'</connexion>'.PHP_EOL;


Donc si tu veux le pourcentage de batterie, le xpath est:
//batterie
si tu veux le temps restant (remaining time), le xpath est:
//remain
etc...

Ok pour toi ?
++
F.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: Batteries EcoFlow

Messagepar caramella » 26 Mars 2023 16:30

Merci pour la réponse
Donc je dois faire 1 capteur http par paramètre à extraire ?
caramella
 
Messages : 15
Inscription : 22 Oct 2021

Re: Batteries EcoFlow

Messagepar opa95 » 27 Mars 2023 15:09

Bonjour Caramella
caramella a écrit:Merci pour la réponse
Donc je dois faire 1 capteur http par paramètre à extraire ?

Oui, tu fais le premier, tu vérifie qu'il marche, puis tu fais une copie en changeant le XPATH, et tu recommences pour tous :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

caramella

Messagepar caramella » 27 Mars 2023 20:02

Bonsoir
Bon cela aurait été trop beau que tout marche du premier coup.

• J’ai créé un capteur http
• J’y ait copié-collé le dernier script publié sur le forum (directement depuis le forum mais j’ai aussi essayé en passant par le bloc note de Windows).
• J’ai saisi les VAR 1, 2 et 3 correspondantes au serial, apikey et secret.
• J’ai entré le Xpath //batterie, comme tu me l’as indiqué (j’ai aussi essayé avec d’autres paramètres, c’est pareil)
• Concernant le type de données, le plus logique me semblait « valeur décimale » mais j’ai aussi essayé « liste de valeurs » et « texte ».
• Je n’ai pas coché « convertir le JSON en XML », comme indiqué au début du topic.
• J’ajoute que mon Ecoflow fonctionne et est bien connectée sur l’app Ecoflow.

Résultat des courses, quand je teste le chemin Xpath, j’ai systématiquement « Erreur : valeur lue vide ». Si je clique sur l’URL LAN qui m’est proposée (http://192.168.1.141/script/?exec=pourc ... id=2997834
et qui pointe vers le site de secours de mon Eedomus, j’obtiens un message d’erreur (en Espagnol ?!?): Error: Por favor, especifique el valor del argumento Serial para llamar aeste script
Dans les notifications, je reçois régulièrement le message « Pourcentage batterie photovoltaïque en erreur (impossible de parser le xml) ».
Je joins des copies d’écran de mon capteur http et de la page de test du chemin Xpath.
Les questions : aurais-je du modifier quelque chose dans le script avant de le copier-coller pour l’adapter à ma situation ? Le site api.ecoflow.com fonctionne-t-il correctement en ce moment ? Le fait que j’utilise une delta pro joue-t-il un rôle ?
Désolé de t’embêter encore pour mes problèmes mais j’ai essayé pas mal de choses et je n’arrive pas à avancer seul. Merci d’avance.
JPC
Pièces jointes
test Xpath.jpg
test Xpath.jpg (32.8 Kio) Consulté 5633 fois
capteur http.jpg
capteur http.jpg (47.36 Kio) Consulté 5633 fois
caramella
 
Messages : 15
Inscription : 22 Oct 2021

Re: Batteries EcoFlow

Messagepar opa95 » 27 Mars 2023 20:35

Bonsoir caramella

Le requête http est incomplète.
Il faut rajouter le texte qui fait référence à [VAR1], [VAR2] et [VAR3.]
http://localhost/script/?exec=pourcvatterie.php&Serial=[VAR1]&APIKEY=[VAR2]&Secret=[VAR3]
:)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 721
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Suivant

Retour vers Objets connectés

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 8 invité(s)

cron