Tuto pour la synchro eedomus=> H. Ass

EDIT : J’ai fait le tuto - voir le message 9…

Mise à jour du 02/10/24 : plusieurs sensors peuvent maintenant être synchronisés.
- Sont maintenant compatibles (le numéro indiqué et le type sont ceux de l’eedomus) : 1 : lampe, 2 : appareil électrique 109 : volet, 7: Température, 22: Humidité, 119 : Brouillage, 37: Mouvement, 27: Fumée, 26: Consomètre, 24: luminosité, 0: pour consommation
- Il est possible de synchroniser plusieurs boxs eedomus (à tester car je n’en ai qu’une) : voir à la fin du message comment faire.
- Pour la mise à jour, il faut remplacer les fichiers php : eedomus.php, sav.php, et writeyaml.php

Bonjour,
Je ne sais pas s’il y a encore des personnes qui utilisent à la fois leur eedomus et Home Assistant mais si ça intéresse quelqu’un, je peux expliquer comment j’ai mis en place une synchro de ma eedomus pour mes lumières, commutateurs et volets vers Home Assistant assez facilement.
C’est encore en phase de test (si quelqu’un veut contribuer à son développement, il est bien venu) mais le principe est de ne pas ajouter de modules complémentaires sur Home Assistant (type Node Red Red, Python ou autre), de ne pas avoir à taper du code yaml, et de ne pas devoir aller chercher à la main tous les identifiants des appareils, juste d’ajouter quelques scripts PHP sur l’eedomus et un ficher Yaml généré automatiquement sur Home Assistant.

Depuis Home Assistant : la synchro se fait en REST toutes le 3 secondes pour mise à jour des états et des commandes REST sont utilisées pour contrôler les appareils .
La contrainte est d’avoir Home Assistant et l’eedomus sur le même réseau local.

Pour la phase de configuration, il faut aussi avoir un serveur PHP en local (j’utilise mon NAS) : En effet, j’ai fait une page PHP qui ressemble, dans le principe, à la page de configuration de HomeKit ou Alexa de l’eedomus. L’objectif est d’utiliser cette page pour sélectionner les appareils de l’eedomus à synchroniser et pour les renommer éventuellement. La page créé un fichier yaml à mettre sur Home Assistant.
La synchro se fait ensuite toute seule sans configuration supplémentaire et surtout comme il est possible de sauver cette configuration, elle peut ensuite être modifiée depuis la page PHP sans avoir tout à refaire ou rentrer dans le code.

Je me suis inspiré de ce qui a été fait par ThePrincelle mais avec quelques modifications/ajouts (et sans Python) :
Lien Github

A voir si vous êtes intéressés…

Bonjour,
cela pourrait m intéresser.
J’ai des valeurs qui vont vers node red par des pushs.
Depuis peu je me suis mis a HA mais ouf.
Moi ce qu il me faudrait se sont des tutos pour tout transférer sous HA.
J’ai commencé mais souvent je renonce par la difficulté de la tache.
A vous relire MI.

Bonjour,
Ma solution ne doit pas vous convenir:
Pour l’instant, je n’en suis pas à mettre tous les appareils sur Home Assistant.
Je garde mon zwave sous eedomus mais je voulais pouvoir tout gérer depuis Home Assistant et je ne voulais pas devoir apprendre NodeRed et ça m’a semblé trop long à configurer.

Avec NodeRed, la solution est d’utiliser MQTT d’après ce que j’ai compris.

Bonjour sbdomo,
Alors bien sûr que ton sujet m’intéresse, bon malheureusement faudrait déjà que je sache comment monter un serveur PHP, si tu as un lien pour « noobie » je suis preneur, après j’avais commencé à comprendre ce que The Princelle avait fait, mais il me manque probablement des explications un peu plus simplistes que ce qui ait fait.
En ce qui me concerne :
Ajouter & modifier du PHP sur eedomus pas de soucis,
Les commandes REST sous HA, faudra un peu développer, j’ai pas pigé,
Le NAS j’en n’ai pas mais j’ai peut être de quoi en monter un,
Et mon eedomus comme mon HAOS qui tourne sur un PC portable sont bien sur le même réseau en ethernet via une freebox.

Donc merci à toi :wink:

Merci pour ce tuto !
J’avais aussi fait une synchro bidirectionnelle avec eedomus (j’utilisais moi Node-red, qui est simple à mettre en oeuvre), mais j’ai assez rapidement abandonné. C’est difficilement maintenable, et HA est tellement plus puissant…

Salut,
Bon, si je ne suis pas le seul intéressé, je vais faire un tuto.
La méthode de The Princelle marche bien mais il configure tout à la main ce qui est long et peut poser des problèmes de maintenance.
C’est justement pour éviter cette lourdeur que j’ai prévu une page php de configuration. Le serveur php ne sert qu’au moment de la configuration (pour choisir les modules à synchroniser et écrire le code nécessaire) ou pour modifier cette configuration.
Le serveur php n’a donc pas besoin d’être toujours accessible et comme c’est en local, un serveur non sécurisé peut suffire.
Une installation du type wamp sur un pc windows devrait pouvoir convenir.

1 « J'aime »

Bonjour sbdomo,
Pour ce qui est du NAS, un HDD raccordé sur ma Freebox Pop peut suffire non ?

En fait, ce n’est pas un n Nas qui est nécessaire mais un serveur php.
Mon NAS synology permet d’y installer un serveur php mais je ne sais pas si c’est le cas pour la Freebox.
Si tu as un pc sous windows, l’installation de wamp devrait suffire

1 « J'aime »

Bonjour,
Voici donc un tuto que je pourrai compléter si ce n’est pas clair…

EDIT:
Mise à jour du 02/10/24 : plusieurs sensors peuvent maintenant être synchronisés.
- Sont maintenant compatibles (le numéro indiqué et le type sont ceux de l’eedomus) : 1 : lampe, 2 : appareil électrique, 109 : volet, 7: Température, 22: Humidité, 119 : Brouillage (c’est pour le RFplayer), 37: Mouvement, 27: Fumée, 26: Consomètre, 24: luminosité, 0: pour consommation
- Il est possible de synchroniser plusieurs boxs eedomus (à tester car je n’en ai qu’une) : voir à la fin du message comment faire.
- Pour la mise à jour, il faut remplacer les fichiers php : eedomus.php, sav.php, et writeyaml.php

Pour l’instant, le dispositif permet de synchroniser des lumières ON/OFF, prises et des volets Somfy RTS. Je n’ai pas encore mis de capteurs et d’autres choses comme des lumières avec RGB. ça peut se faire si j’ai l’exemple de template à mettre sous Home Assistant.

Dans le principe de fonctionnement :

  • Nous allons créer un sensor sous Home Assistant qui va récupérer toutes le 3 secondes l’état des entités sous l’eedomus que l’on veut suivre.
  • Créer des templates dans Home Assistant pour chaque entité à suivre pour afficher leur état et envoyer une commande de changement d’état vers l’eedomus quand nécessaire (commandes on ou off par exemple)

1. Pour commencer, il faut mettre 2 scripts php sur l’eedomus.
Fichier get_values.php

<?php
//////////////////////////
// get_values.php       //
// by Maxime Princelle  //
//////////////////////////
//Lance depuis Ha, avec une liste d ids pour recuperer les valeurs
/////////////////////////
//Recuperation des ids

$ids = explode(",", $_GET["ids"]);

/////////////////////////
//Recuperation des valeurs

$values = array();

foreach ($ids as $id) {
    // echo($id + "<br/>");
	$value = getValue($id, false);
	
	$temp_array = array(array($id, $value["value"]));
	$values = array_merge($values, $temp_array);
}

/////////////////////////
//Reponse

$xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><response>";
foreach($values as $val)
{
    $xml .= '<id_' . $val[0] . '>' . $val[1] . '</id_' . $val[0] . '>';
}
$xml .= "</response>";

header('Content-type: text/xml');
echo $xml

?>

Fichier set_value.php

<?
//////////////////////////
// set_value.php        //
// by Maxime Princelle  //
//////////////////////////
//Lance depuis HA pour effectuer un changement d etat d un appareil dans l eedomus
$id = getArg('id', $mandatory = true);
$val = getArg('val', $mandatory = true);

setValue($periph_id=$id, $value=$val, $verify_value_list = false);

echo "Setting periph: ".$id." to value: ".$val;

?>

Le premier « get_values.php » sert à interroger l’eedomus, le deuxième, « set_value.php » sert à recevoir les commandes d’Home Assistant.
Il faut d’abord s’identifier sur l’eedomus depuis « secure.eddomus » puis se connecter à l’eedomus en local avec l’adresse « http://IPeedomus/script/ » où IPeedomus est l’adresse IP locale de l’eedomus pour y uploader les deux fichiers.
Une doc pour les scripts : Scripts - Documentation eedomus
Eedomus_sdk

2. Il faut maintenant un serveur PHP en local (j’ai Php en version 7.0.33, il peux y avoir des bugs avec une autre version) et y mettre des fichiers php qui vont nous servir à créer un yaml pour Home Assistant:
Il faut mettre dans un répertoire de votre site web :

  • eedomus.php qui sera la page à lancer pour faire la configuration
  • sav.php qui sert à sauver la config
  • writeyaml.php qui sert à écrire le fichier yaml
  • et le fichier config.php : il faut adapter $ip, $api_user et $api_secret en mettant, entre les «  », l’IP de l’eedomus locale et mettre le login et mot de passe de connexion à l’API eedomus « api_user » et « api_secret ».
  • créé un répertoire « configHass » à l’endroit où vous avez mis ces fichiers (le fichier, pour Home Assistant, eedomus.yaml y sera créé).

Fichier eedomus.php

<?php
/******************************************************************
* By sbdomo
*
*****************************************************************/ 
//Si besoin de plusieurs eedomus
//Syntaxe eedomus.php?eed=2 pour indiquer eedomus n°2
if(isset($_GET['eed'])) $eed=$_GET['eed'];
else      $eed="";

require_once('config'.$eed.'.php');


//Type appareil compatible 1 : lampe, 2 : appareil électrique 109 : volet, 7: Température, 22: Humidité, 119 : Brouillage, 37: Mouvement, 27: Fumée, 26: Consomètre, 24: luminosité, 0: pour consommation
//autres non gérés :0: conssommation et autre Autre: 14, Aujourd'hui: 18, Etat chauffages: 19, Etat lampes: 20
$usage_id=array(1,2,109,7,22,37,119,27,26,24);
$usage_name=array('Consommation');

//appel de l'API eedomus en PHP pour récupérer la liste d'appareils
$devices = get_eedomus_value();
//Classement par type de device usage_id
// Fonction de comparaison pour trier par usage_id
function comparerusage($a, $b) {
    return $a["usage_id"] - $b["usage_id"];
}
usort($devices, "comparerusage");

//index pour compter le nombre de devices compatibles dans la liste de l'eedomus
$index = 0;

//Lit la sauvegarde
if (file_exists("sav".$eed.".json")) {
	$sav = file_get_contents("sav".$eed.".json");
	$sav = json_decode($sav, true);
	$devicesav= $sav['devices'];
} else $devicesav="";

//function pour faire un periph.list  par l'API de l'eedomus
function get_eedomus_value() {	
	global $ip ;
	global $api_user ;
	global $api_secret ;
	
	// construction de l'URL de l'API
	$url = "http://".$ip."/api/get?action=periph.list";
	$url .= "&api_user=" . $api_user;
	$url .= "&api_secret=" . $api_secret;

	// appel de l'API
	$result = file_get_contents($url);
	// on controle le résultat
	if (strpos($result, '"success": 1') == false)
	{
	  echo "Une erreur est survenue : [".$result."]";
	}
	else
	{
	  $result = json_decode(utf8_encode($result), true ) ; // true transforme $result en un array et il faut de l'UTF8!
	 return $result['body'];
	}	
	
}
//Cherche sur le device est dans la sauvegarde par periph_id
function IsSave($periph_id){
    global $devicesav;
    if($devicesav!="" and sizeof($devicesav) >0) {
    foreach($devicesav as $key => $val){
        if($val['periph_id']== $periph_id){
         return $key;
        }
     }}
  return null;
}
?>
<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8">
	<title>eedomus synchro - Configuration</title> 
</head>
<body>
<?php
//Boucle pour faire afficher dans la page la liste des appareils compatibles (en fonction de leur usage_id)
foreach ($devices as $device) {
	if(in_array($device["usage_id"],$usage_id) || in_array($device["usage_name"],$usage_name)) {
		$index = $index + 1;
		$keySav= IsSave($device["periph_id"]);
		echo '<input type="hidden" id="periph_id'.$index.'" value="'.$device["periph_id"].'" />';
		echo '<input type="hidden" id="usage_id'.$index.'" value="'.$device["usage_id"].'" />';
		echo '<input type="hidden" id="usage_name'.$index.'" value="'.htmlentities($device["usage_name"]).'" />';
		echo '<input type="hidden" id="name'.$index.'" value="'.htmlentities($device["name"]).'" />';		
		echo '<label for="name">&nbsp;</label>';
    	echo '<input type="checkbox" id="synchro'.$index.'"';
    	if (isset($keySav)) echo ' checked';
    	echo '/>';
    	echo '<input type="text" id="namenew'.$index.'" placeholder="'.htmlentities($device["name"]).'"';
    	if (isset($keySav)) echo ' value = "'.htmlentities($devicesav[$keySav]["namenew"]).'"';
    	echo '/>';
    	if ($device["usage_id"]==1) {
    		echo '<select id="type'.$index.'">';
    		echo '<option value="onoff">Lampe On/Off</option>';
    		echo '<option value="dim"';
    		if (isset($keySav)&&$devicesav[$keySav]["type"]=="dim") echo " selected";
    		echo '>Lampe dimmable</option>';
    		echo "</select>";
    	}
    	if ($device["usage_id"]==109) {
    		echo '<select id="type'.$index.'">';
    		echo '<option value="cover1">volet ouverture variable</option>';
    		echo '<option value="somfy"';
    		if (isset($keySav)&&$devicesav[$keySav]["type"]=="somfy") echo " selected";
    		echo '>vole SOMFY</option>';
    		echo "</select>";
    	}    	
    	
    	echo '&nbsp;'.htmlentities($device["name"].' - '.$device["usage_name"].' - '.$device["usage_id"]);
    	echo '</br>';
	}
}
?>
<input type="button" onclick="SauverValeurs()" value="Sauver" />
<input type="button" onclick="EcireHass()" value="Ecrire fichier Home Assistant" />

<p id="print"></p>

<script>
    //Pour enregister la liste des appareils sélectionnés et les noms modifiés qui doivent être synchroniser avec Home Assistant
    function SauverValeurs() {
    	let result = recupererValeurs();
    	//Pour tester
    	//console.log(result);
    	
    	//Lancement de la sauvegarde
    	let fetchData = {
    		method: 'POST',
    		body: result,
    		headers: new Headers()
    		}
    	fetch("sav.php", fetchData)
    		.then((resp) => resp.json()) //Converti le retour de la page PHP au format Json 
    		.then(function (data) {
    		// Affiche le résultat
    		document.getElementById('print').innerHTML = "Sauvegarde OK:"+JSON.stringify(data);
    		console.log(JSON.stringify(data, null, 4));
    		});
    
    }	
    
    //Pour écrire les fichiers pour HomeAssistant
    function EcireHass() {
    	let result = recupererValeurs();

    	//Lance writreyaml.php
    	let fetchData = {
    		method: 'POST',
    		body: result,
    		headers: new Headers()
    		}
    	fetch("writeyaml.php", fetchData)
    		.then(function (data) {
    		// Affiche le résultat
    		document.getElementById('print').innerHTML = "Fini";
    		//console.log(JSON.stringify(data, null, 4));
    		});
    }
    	
    //Lecture de la page pour récupérer la liste des appareils sélectionnés et les noms en format json
    function recupererValeurs () {
    	var nbdev =<?php echo $index;?>;
    	var ind=0;
    	let result = [];
    	for (let num = 1; num < nbdev+1; num++) {
    		if(document.getElementById("synchro"+num).checked) {
    			if (document.getElementById("type"+num)) var type=document.getElementById("type"+num).value
    			else type="";
    			result[ind] = {
    				'periph_id' : document.getElementById("periph_id"+num).value,
    				'name' : document.getElementById("name"+num).value,
    				'namenew' : document.getElementById("namenew"+num).value,
    				'usage_id' : document.getElementById("usage_id"+num).value,
    				'usage_name' : document.getElementById("usage_name"+num).value,
    				'type' : type
    				};
    			ind=ind+1;
    		}
    		//'synchro' : document.getElementById("synchro"+num).checked,
    	}
    	
		let formData = new FormData();
		formData.append('eed', '<?php echo $eed; ?>');
		formData.append('devices', JSON.stringify(result));
		return formData;
    }
      
</script>

</body></html>

Fichier sav.php

<?php
	//$request_body = file_get_contents('php://input');	
	if(isset($_POST['eed'])) $eed=$_POST['eed'];
	else      $eed="";
	if(isset($_POST['devices'])) $devices=$_POST['devices'];
	else      $devices="";
	
	file_put_contents('sav'.$eed.'.json', '{"devices":'.$devices.'}');
	echo $devices;
?>

Fichier writeyaml.php

<?php


	if(isset($_POST['eed'])) $eed=$_POST['eed'];
	else      $eed="";
	if(isset($_POST['devices'])) $devices=$_POST['devices'];
	else      $devices="";
	$devices = json_decode($devices, true);
	
	require_once('config'.$eed.'.php');

	
	$yaml = YmlSensor();
	$yaml .= YmlSensors();
	$yaml .= Ymlbinarysensors();
	$yaml .= Ymllights();
	$yaml .= Ymlswitches();
	$yaml .= Ymlcovers();
	file_put_contents('configHass/eedomus'.$eed.'.yaml', $yaml);
	echo $yaml;
	//echo "OK";
	
//Fonctions	
//Ecrit yaml pour le sensor et restful eedomus_command
function YmlSensor(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
//Ecriture du restful 
$yml="#  commande eedomus\n";
$yml.="rest_command:"."\n";
$yml.="  eedomus".$eed."_command:"."\n";
$yml.='    url: "http://'.$ip.'/script/?exec=set_value.php&id={{periph_id}}&val={{value}}"'."\n";
$yml.="    method: GET"."\n";
	$yml.="\n"; 
    
//Ecriture du sensor pour la synchro
$yml.="# sensor eedomus\n";
$yml.="sensor:\n";
$yml.="  - platform: rest\n";
$yml.="    name: eedomus".$eed."_states\n";
$yml.="    unique_id: eedomus".$eed."_states_synchro\n";
$yml.="    resource: http://".$ip."/script/?exec=get_values.php&ids=";

foreach($devices as $key => $val){
	if($num>0) $yml.=",";
	$yml.=$val['periph_id'];
	$num=$num+1;
}
$yml.="\n";

$yml.='    json_attributes_path: "$.response"'."\n";
$yml.="    scan_interval: 3\n";
$yml.='    value_template: "OK"'."\n";
$yml.='    json_attributes:'."\n";

foreach($devices as $key => $val){
$yml.='      - "id_';
$yml.=$val['periph_id'];
$yml.='" #';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.="\n";
}
	$yml.="\n";
  return $yml;
}


//Ecrit yaml pour les sensors
function Ymlsensors(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
    $yml="";
    
    $typesensor = [
    	"7" => [
        	"type" => "temperature",
        	"unite" => utf8_encode(chr(176))."C"
    	],
    	"22" => [
        	"type" => "humidity",
        	"unite" => "%"
    	],
    	"24" => [
        	"type" => "illuminance",
        	"unite" => "lx"
    	],
    	"26" => [
        	"type" => "power",
        	"unite" => "W"
    	],
    	"0Consommation" => [
        	"type" => "energy",
        	"unite" => "Wh"
    	]
	];
    
foreach($devices as $key => $val){
	if( $val['usage_id']==7 || $val['usage_id']==22 || $val['usage_id']==24 || $val['usage_id']==26 || ($val['usage_id']==0&&$val['usage_name']=="Consommation") ) {
//Initiation du yaml
	if($num==0) {
		$yml.="# Sensors eedomus"."\n";
		$yml.="  - platform: template"."\n";
		$yml.="    sensors:"."\n";	
}
$yml.="      eedomus".$eed."_".$val['periph_id'].":"."\n";
$yml.="        unique_id: eedomus".$eed."_".$val['periph_id']."\n";
$yml.='        friendly_name: "';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.='"'."\n";
$yml.="        value_template: '{{ states.sensor.eedomus".$eed.'_states.attributes["id_'.$val['periph_id'].'"] }}'."'"."\n";

//Le type 0 n'est pas toujours pour le mme capteur
if($val['usage_id']==0&&$val['usage_name']=="Consommation") {
	$yml.="        unit_of_measurement: '".$typesensor["0Consommation"]["unite"]."'"."\n";
	$yml.="        device_class: ".$typesensor["0Consommation"]["type"]."\n";	
} else {
	$yml.="        unit_of_measurement: '".$typesensor[$val['usage_id']]["unite"]."'"."\n";
	$yml.="        device_class: ".$typesensor[$val['usage_id']]["type"]."\n";
}
		$num = $num +1;
}//fin if usage_id
}//fin foreach
$yml.="\n";
  return $yml;
}

//Ecrit yaml pour les binary_sensors
function Ymlbinarysensors(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
    $yml="";
    
    $typesensor = [
    	"37" => [
        	"type" => "motion"
    	],
    	"119" => [
        	"type" => "problem"
    	],
    	"27" => [
        	"type" => "smoke"
    	]
	];
    
foreach($devices as $key => $val){
	if($val['usage_id']==37 || $val['usage_id']==119 || $val['usage_id']==27) {
//Initiation du yaml
	if($num==0) {
		$yml.="# binary_sensor"."\n";
		$yml.="binary_sensor:"."\n";
		$yml.="  - platform: template"."\n";
		$yml.="    sensors:"."\n";
	}
$yml.="      eedomus".$eed."_".$val['periph_id'].":"."\n";
$yml.="        unique_id: eedomus".$eed."_".$val['periph_id']."\n";
$yml.='        friendly_name: "';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.='"'."\n";
$yml.="        value_template: '{{ states.sensor.eedomus".$eed.'_states.attributes["id_'.$val['periph_id'].'"] }}'."'"."\n";
$yml.="        device_class: ".$typesensor[$val['usage_id']]["type"]."\n";
		$num = $num +1;
}//fin if usage_id
}//fin foreach
$yml.="\n";
  return $yml;
}

//Ecrit yaml pour les lumieres
function Ymllights(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
    $yml="";
foreach($devices as $key => $val){
	if($val['usage_id']==1) {
//Initiation du yaml
	if($num==0) {
$yml.="# Lampes eedomus"."\n";
$yml.="light:"."\n";
$yml.="  - platform: template"."\n";
$yml.="    lights:"."\n";	
}
	//if($num>0) $yml.="\n";

$yml.="      eedomus".$eed."_".$val['periph_id'].":"."\n";
$yml.="        unique_id: eedomus".$eed."_".$val['periph_id']."\n";
$yml.='        friendly_name: "';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.='"'."\n";

//En fonction du type
if($val['type']=="dim") { //Si dimmable
$yml.='        value_template: "{{ (states.sensor.eedomus'.$eed.'_states.attributes.id_'.$val['periph_id'].' | int) > 0 }}"'."\n";
$yml.='        level_template: "{{ (states.sensor.eedomus'.$eed.'_states.attributes.id_'.$val['periph_id'].' | float * 2.55) | round(0)}}"'."\n";
} else $yml.='        value_template: "{{ states.sensor.eedomus'.$eed.'_states.attributes.id_'.$val['periph_id'].' == \'100\' }}"'."\n";

//$yml.='        supports_transition_template: "{{ false }}"'."\n";
$yml.="        turn_on:"."\n";
$yml.="          action: rest_command.eedomus".$eed."_command"."\n";
$yml.="          data:"."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "100"'."\n";
$yml.="        turn_off:"."\n";
$yml.="          action: rest_command.eedomus".$eed."_command"."\n";
$yml.="          data:"."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "0"'."\n";


//En fonction du type
if($val['type']=="dim") { //Si dimmable
$yml.='        set_level:'."\n";
$yml.='          action: rest_command.eedomus".$eed."_command'."\n";
$yml.='          data:'."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "{{ ((brightness | float / 255 ) * 100) }}"'."\n";
}



		$num = $num +1;
	
}//fin if usage_id
}//fin foreach
$yml.="\n";
  return $yml;
}


//Ecrit yaml pour les prises
function Ymlswitches(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
    $yml="";
foreach($devices as $key => $val){
	if($val['usage_id']==2) {
//Initiation du yaml
	if($num==0) {
$yml.="# Prises eedomus"."\n";
$yml.="switch:"."\n";
$yml.="  - platform: template"."\n";
$yml.="    switches:"."\n";	
}

$yml.="      eedomus".$eed."_".$val['periph_id'].":"."\n";
$yml.="        unique_id: eedomus".$eed."_".$val['periph_id']."\n";
$yml.='        friendly_name: "';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.='"'."\n";
$yml.='        value_template: "{{ states.sensor.eedomus'.$eed.'_states.attributes.id_'.$val['periph_id'].' == \'100\' }}"'."\n";
$yml.="        turn_on:"."\n";
$yml.="          action: rest_command.eedomus".$eed."_command"."\n";
$yml.="          data:"."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "100"'."\n";
$yml.="        turn_off:"."\n";
$yml.="          action: rest_command.eedomus".$eed."_command"."\n";
$yml.="          data:"."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "0"'."\n";

		$num = $num +1;
	
}//fin if usage_id
}//fin foreach
$yml.="\n";
  return $yml;
}

//Ecrit yaml pour les volets
function Ymlcovers(){
    global $devices;
    global $ip;
	global $eed;
    $num = 0;
    $yml="";
foreach($devices as $key => $val){
	if($val['usage_id']==109) {
//Initiation du yaml
	if($num==0) {
$yml.="# Volets eedomus"."\n";
$yml.="cover:"."\n";
$yml.="  - platform: template"."\n";
$yml.="    covers:"."\n";	
}

$yml.="      eedomus".$eed."_".$val['periph_id'].":"."\n";
$yml.="        unique_id: eedomus".$eed."_".$val['periph_id']."\n";
$yml.="        device_class: shutter"."\n";
$yml.='        friendly_name: "';
if($val['namenew']!="") $yml.=$val['namenew'];
else $yml.=$val['name'];
$yml.='"'."\n";

//En fonction du type
if($val['type']=="somfy") { //Si volet somfy
$yml.='        value_template: >'."\n";
$yml.="          {% set volet = state_attr('sensor.eedomus".$eed."_states', 'id_".$val['periph_id']."') | default('MY') %}"."\n";
$yml.="          {% if (volet=='0') %}"."\n";
$yml.="              closed"."\n";
$yml.="          {% elif (volet=='MY') %}"."\n";
$yml.="              none"."\n";
$yml.="          {% else %}"."\n";
$yml.="              open"."\n";
$yml.="          {% endif %}"."\n";
$yml.='        icon_template: >-'."\n";
$yml.="          {% set volet = state_attr('sensor.eedomus".$eed."_states', 'id_".$val['periph_id']."') | default('MY') %}"."\n";
$yml.="          {% if (volet=='0') %}"."\n";
$yml.="            mdi:window-shutter"."\n";
$yml.="          {% elif (volet=='MY') %}"."\n";
$yml.="            mdi:window-shutter-cog"."\n";
$yml.="          {% else %}"."\n";
$yml.="            mdi:window-shutter-open"."\n";
$yml.="          {% endif %}"."\n";
} else $yml.='        position_template: "{{ states.sensor.eedomus'.$eed.'_states.attributes.id_'.$val['periph_id'].' | int }}"'."\n";

$yml.='        open_cover:'."\n";
$yml.='          action: rest_command.eedomus'.$eed.'_command'."\n";
$yml.='          data:'."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "100"'."\n";
$yml.='        close_cover:'."\n";
$yml.='          action: rest_command.eedomus'.$eed.'_command'."\n";
$yml.='          data:'."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "0"'."\n";
$yml.='        stop_cover:'."\n";
$yml.='          action: rest_command.eedomus'.$eed.'_command'."\n";
$yml.='          data:'."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";

//En fonction du type
if($val['type']=="somfy") { //Si volet somfy
$yml.='            value: "MY"'."\n";
} else $yml.='            value: "240"'."\n";

//En fonction du type
if($val['type']=="cover1") { //Si volet ouverture variable
$yml.='        set_cover_position:'."\n";
$yml.='          action: rest_command.eedomus'.$eed.'_command'."\n";
$yml.='          data:'."\n";
$yml.='            periph_id: "'.$val['periph_id'].'"'."\n";
$yml.='            value: "{{position}}"'."\n";
}

		$num = $num +1;
	
}//fin if usage_id
}//fin foreach
$yml.="\n";
  return $yml;
}



?>

Fichier config.php

<?php
/******************************************************************
* By sbdomo
* Fichier config.php
* A adapter
* définition des variables
*****************************************************************/ 
$ip="";  // IP locale de l'eedomus
$api_user=""; // a récupérer sur votre compte eedomus
$api_secret=""; // a récupérer sur votre compte eedomus
//*****************************************************************/
?>

A noter: il faut que php puisse écrire dans ces répertoires pour y sauver le fichier eedomus.yaml et sav.json (où est sauvé la configuration pour pouvoir y revenir).

3. Configurer la synchronisation

  • Lancer la page eedomus.php à partir de votre serveur web.
  • Sélectionner les entités que vous voulez ajouter, indiquer le nom que vous voulez voir apparaitre dans Home Assistant, dans le menu déroulant, sélectionner le type d’appareil
  • Sauvegarder en cliquant sur le bouton « Sauver » (ceci permettra de retrouver ce que vous venez de faire si vous rouvrez la page pour faire une modification sans tout recommencer),
  • Cliquer sur « Ecrire fichier Home Assistant »

Remarque: le serveur Php ne sert que pour configurer le fichier yaml. Il n’a pas besoin d’être disponible pour la synchronisation…

Avant le point 4, faites une sauvegarde d’Home Assistant (c’est toujours mieux en cas de problème)
4. Mettre le fichier eedomus.yaml dans l’eedomus :

  • EDIT (j’avais oublié) : pour le les fichiers « packages » soient lus, il faut ajouter dans « configuration.yaml »
homeassistant:
  packages: !include_dir_named packages
  • Dans le répertoire CONFIG, s’il n’existe pas, créer le répertoire « packages » et y mettre le fichier eedomus.yaml.
    (pour créer des répertoires et mettre un fichier, je passe par un partage samba grâce au module complémentaire « Samba Share »…)
    packages

  • Faire un test avec « outils de développement/vérifier la configuration » et relancer Home Assistant

Voila, c’est fini !

Un sensor eedomus_states a été créé avec en attributs les id des entités eedomus et leur statut.


Chaque entité a été créé par un template.

lum2
Dans l’idée de l’entité, on retrouve l’identifiant sous l’eedomus.

Pour ajouter par la suite d’autres entités, il faut relancer la page eedomus.php et mettre le nouveau fichier yaml créer…

Commentaires sur le yaml créé :
Comme je débute sur Home Assistant j’ai pris des modèles de templates existants mais je crois que j’ai utilisé l’ancienne syntaxe. Une mise à jour de writeyaml.php pour utiliser la nouvelle syntaxe serait à prévoir.

Exemple de template utilisé pour les lumières :

    lights:
      eedomus_2265617:
        unique_id: eedomus_2265617
        friendly_name: "Chambre"
        value_template: "{{ states.sensor.eedomus_states.attributes.id_2265617 == '100' }}"
        turn_on:
          service: rest_command.eedomus_command
          data:
            periph_id: "2265617"
            value: "100"
        turn_off:
          service: rest_command.eedomus_command
          data:
            periph_id: "2265617"
            value: "0"

Template pour les prises:

switch:
  - platform: template
    switches:
      eedomus_1153961:
        unique_id: eedomus_1153961
        friendly_name: "Veilleuse"
        value_template: "{{ states.sensor.eedomus_states.attributes.id_1153961 == '100' }}"
        turn_on:
          service: rest_command.eedomus_command
          data:
            periph_id: "1153961"
            value: "100"
        turn_off:
          service: rest_command.eedomus_command
          data:
            periph_id: "1153961"
            value: "0"

Le template pour les volets me pose plus de problèmes : je n’ai que des volets SOMFY RTS, je ne peux pas tester autre chose. Il y a une position « MY » qui est un stop mais Home Assistant ne semble pas avoir de position stop ce qui pose problème pour l’accès aux boutons de commande.
J’ai donc ajouté dans le fichier configuration.yaml

homeassistant:
  packages: !include_dir_named packages
  customize_glob:
    "cover.*":
      assumed_state: true

Ce qui permet de garder tous les boutons actifs et j’ai fait un template un peu compliqué:

    covers:
      eedomus_1080844:
        unique_id: eedomus_1080844
        device_class: shutter
        friendly_name: "Volet Salon"
        value_template: >
          {% set volet = state_attr('sensor.eedomus_states', 'id_1080844') | default('MY') %}
          {% if (volet=='0') %}
              closed
          {% elif (volet=='MY') %}
              none
          {% else %}
              open
          {% endif %}
        icon_template: >-
          {% set volet = state_attr('sensor.eedomus_states', 'id_1080844') | default('MY') %}
          {% if (volet=='0') %}
            mdi:window-shutter
          {% elif (volet=='MY') %}
            mdi:window-shutter-cog
          {% else %}
            mdi:window-shutter-open
          {% endif %}
        open_cover:
          service: rest_command.eedomus_command
          data:
            periph_id: "1080844"
            value: "100"
        close_cover:
          service: rest_command.eedomus_command
          data:
            periph_id: "1080844"
            value: "0"
        stop_cover:
          service: rest_command.eedomus_command
          data:
            periph_id: "1080844"
            value: "MY"

Synchroniser plusieurs eedomus vers Home Assistant :
Un sensor par eedomus va être créer, chacun se synchronisera avec Home Assistant.
Exemple pour mettre une deuxième box, la box « 2 » :

  • Il faut ajouter dans le site php un fichier config2.php en y mettant, comme pour le fichier config.php les informations sur l’eedomus (ip, api_user, api_secret) mais cette fois pour la deuxième box.
  • il faut lancer la page eedomus.php mais en y ajoutant un paramètre avec le numéro 2 dans l’adresse url dans le navigateur du type: http://adresseserveurweb/eedomus.php?eed=2
  • il faut ensuite faire pareil que pour la première box, un fichier de sauvegarde est créer ce sera sav2.json et le fichier yaml sera eedomus2.yaml.
  • il faut copier ce deuxième fichiers dans packages sur Home Assistant puis faire « vérifier la configuration » dans l’outils de développement par sécurité et relancer Home Assistant…
1 « J'aime »

Voilà, le tuto est fini, me dire si ce n’est pas clair.
J’ai prévu de rajouter les sensors. Pour le reste, il me faut l’exemple de template à intégrer pour le faire.
S’il y a des idées pour améliorer le code, elles sont bienvenues…

1 « J'aime »

Merci à toi :+1:
Je testerai probablement ceci ce week-end

Bonjour les « eedomutiens »
Je suis également sous eedomus est entrain de basculer sur HA

  • effectivement , " ouf " on repart de 0 , mais c’est tellement puissant ; l’hiver va être lond à devoir tout ré-intégrer car j’ai décidé de partir de 0 et de refaire les règles , de les revoir également …
    • pour l’instant c’est mon eedomus qui gère et j’avance petit à petit en // …

Je pense que comme moi, vous ne tiendrez pas forcément longtemps à maintenir 2 boxes. Surtout après avoir goûté à HA.
J’avais moi tenu 2 gros mois après avoir installé une interface bidirectionnelle entre eedomus et HA qui marchait pourtant parfaitement. J’avais pourtant une grosse config à migrer…
Vous nous direz….

Bonjour,
Oui, je finirai probablement pas passer tout sur Home Assistant. Mais je veux être certain de la stabilité et j’ai des choses que je ne veux surtout pas casser :

  • Je gère mes volets SOMFY grâce à un RFplayer et j’ai cru comprendre que le RFplayer n’est pas au top sur Home Assitant et qu’il faudrait un ESP : si mes volets ne marchent plus je vais en entendre parler chez moi !
  • J’ai deux chauffes-eau qui ne sont pas raccordés directement au signal jour/nuit. Je gère la bascule en zwave et je ne veux pas prendre de risque de problème également.

L’eedomus n’a jamais eu aucun problème donc même si elle tourne dans son coin sans évoluer, elle convient. A voir dans le temps…

Merci ! c’est ce que je pense également ; on va garder notre chère eedomus dans sont coin et on va évoluer avec HA ; et je pense que la bascule va se faire toute seule sur HA , il faudra être patient !

Bonjour,
Perso j’ai dédié une eedomus à la gestion de la piscine (pour ses entréess analogiques & sorties TOR), donc celle-ci risque de rester jusqu’à sa mort :stuck_out_tongue:
Pour la principale, ça basculera peut être entièrement sur H.A un jour, mais uniquement si mon zwave est 100% sans soucis dessus.

Bien le bonsoir,
Alors après quelques mises au point (downgrade WAMP en PHP 7.0.33 et PhpMyAdmin en 4.9.11), cela fonctionne très bien et encore un GRAND MERCI à sbdomo.
Ma question sera maintenant :
Comment fait on avec deux box eedomus à synchroniser ? :grin:
Je compte virer les liens Homekit qui sont lents et qui à mon avis consomment beaucoup de ressources sur le proc de mon eedomus principale.

Tu as deux eedomus ! :flushed:
Bon, je n’avais pas pensé à ça !
Le solution pourrait être d’avoir deux sensors un qui se connecte à la première eedomus toutes les 3s et le second qui fait pareil pour la deuxième. Je suppose que ça ne va pas trop surcharger home assistant.
Je peux faire une page php qui fait une deuxième configuration pour faire ça si tu veux tester…

1 « J'aime »

Bonjour,
Autre argument concernant le fait de conserver une eedomus, c’est qu’elle permet, pour le moment, de conserver une passerelle vers les assistants vocaux.

Hello,
Pourquoi dis tu cela ? HA permet une intégration avec les assistants Amazon et Google, sans compter les possibilités de HA Assist et enfin l’intégration avec les plateformes d’IA.