Bonjour,
Voici donc un tuto que je pourrai compléter si ce n’est pas clair…
EDIT:
Mise à jour du 07/11/2024: modification du mode de gestion (tous les modules peuvent être ajoutés après avoir choisi dans la liste déroulante quel type choisir), ajout des différents type de sensor (merci au gros travail de Fab_Rice pour faire cette modification).
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
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: energy (consommation) et sound_pressure (niveau de bruit), 48 : pour volets
//autres non gérés :0: conssommation et autre Autre: 14, Aujourd'hui: 18, Etat chauffages: 19, Etat lampes: 20
//$usage_id=array(0,1,2,109,7,22,37,119,27,26,24,48);
//$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)) {
$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"> </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="light">Lampe On/Off</option>';
echo '<option value="light_dim"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="light_dim") echo " selected";
echo '>Lampe dimmable</option>';
echo "</select>";
}
else if ($device["usage_id"]==2) {
echo '<select id="type'.$index.'">';
echo '<option value="switch">Prise ON/OFF</option>';
echo "</select>";
}
else if ($device["usage_id"]==7) {
echo '<select id="type'.$index.'">';
echo '<option value="temperature">Température</option>';
echo '<option value="ph"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="ph") echo " selected";
echo '>Potentiel Hydrogène en pH</option>';
echo "</select>";
}
else if ($device["usage_id"]==22) {
echo '<select id="type'.$index.'">';
echo '<option value="humidity">Humidité</option>';
echo "</select>";
}
else if ($device["usage_id"]==24) {
echo '<select id="type'.$index.'">';
echo '<option value="illuminance">Luminosité</option>';
echo "</select>";
}
else if ($device["usage_id"]==26) {
echo '<select id="type'.$index.'">';
echo '<option value="power">Consomètre</option>';
echo '>Consomètre en W</option>';
echo '<option value="energy"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="energy") echo " selected";
echo '>Consommation en Wh</option>';
echo '<option value="apparent_power"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="apparent_power") echo " selected";
echo '>Puissance Apparente en VA</option>';
echo '<option value="current"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="current") echo " selected";
echo '>Courant en A</option>';
echo '<option value="reactive_power"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="reactive_power") echo " selected";
echo '>Energie réactive en VAR</option>';
echo '<option value="water"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="water") echo " selected";
echo '>Eau en L</option>';
echo '<option value="voltage"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="voltage") echo " selected";
echo '>Voltage en V</option>';
echo '<option value="voltage2"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="voltage2") echo " selected";
echo '>Voltage en mV</option>';
echo "</select>";
}
else if ($device["usage_id"]==27) {
echo '<select id="type'.$index.'">';
echo '<option value="smoke">Détecteur de fumée</option>';
echo "</select>";
}
else if ($device["usage_id"]==37) {
echo '<select id="type'.$index.'">';
echo '<option value="motion">Détecteur de mouvement</option>';
echo "</select>";
}
else if ($device["usage_id"]==48) {
echo '<select id="type'.$index.'">';
echo '<option value="cover">Volet ouverture variable</option>';
echo '<option value="somfy"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="somfy") echo " selected";
echo '>Volet SOMFY</option>';
echo "</select>";
}
else if ($device["usage_id"]==109) {
echo '<select id="type'.$index.'">';
echo '<option value="cover">Volet ouverture variable</option>';
echo '<option value="somfy"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="somfy") echo " selected";
echo '>Volet SOMFY</option>';
echo "</select>";
}
else if ($device["usage_id"]==119) {
echo '<select id="type'.$index.'">';
echo '<option value="problem">Brouillage</option>';
echo "</select>";
}
else {
echo '<select id="type'.$index.'">';
echo '<option value="unknown"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="unknown") echo " selected";
echo '>Inconnu</option>';
//Sensors
echo '<option value="battery"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="battery") echo " selected";
echo '>Niveau de Batterie en %</option>';
echo '<option value="current"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="current") echo " selected";
echo '>Courant en A</option>';
echo '<option value="energy"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="energy") echo " selected";
echo '>Consommation en Wh</option>';
echo '<option value="power"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="power") echo " selected";
echo '>Consomètre en W</option>';
echo '<option value="apparent_power"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="apparent_power") echo " selected";
echo '>Puissance Apparente en VA</option>';
echo '<option value="ph"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="ph") echo " selected";
echo '>Potentiel Hydrogène en pH</option>';
echo '<option value="speed"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="speed") echo " selected";
echo '>Vitesse en kmh</option>';
echo '<option value="reactive_power"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="reactive_power") echo " selected";
echo '>Energie réactive en VAR</option>';
echo '<option value="voltage"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="voltage") echo " selected";
echo '>Voltage en mV</option>';
echo '<option value="voltage"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="voltage") echo " selected";
echo '>Voltage en V</option>';
echo '<option value="water"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="water") echo " selected";
echo '>Eau en L</option>';
echo '<option value="timestamp"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="timestamp") echo " selected";
echo '>Horodatage</option>';
echo '<option value="sound_pressure"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="sound_pressure") echo " selected";
echo '>Niveau de bruit en db</option>';
echo '<option value="temperature"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="temperature") echo " selected";
echo '>Température en °C</option>';
echo '<option value="humidity"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="humidity ") echo " selected";
echo '>Humidité en %</option>';
echo '<option value="illuminance"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="illuminance") echo " selected";
echo '>Luminosité en Lx</option>';
echo '<option value="data_size"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="data_size") echo " selected";
echo '>Taille des données en Bits ou Octets</option>';
//Binary_Sensor
echo '<option value="battery"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="battery") echo " selected";
echo '>Batterie Faible</option>';
echo '<option value="battery_charging"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="battery_charging") echo " selected";
echo '>Batterie en Charge</option>';
echo '<option value="connectivity"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="connectivity") echo " selected";
echo '>Connecté</option>';
echo '<option value="door"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="door") echo " selected";
echo '>Porte Ouverte</option>';
echo '<option value="garage_door"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="garage_door") echo " selected";
echo '>Portail Garage Ouvert</option>';
echo '<option value="opening"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="opening") echo " selected";
echo '>Ouvert/Fermé</option>';
echo '<option value="smoke"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="smoke") echo " selected";
echo '>Détecteur de fumée</option>';
echo '<option value="motion"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="motion") echo " selected";
echo '>Détecteur de mouvement</option>';
echo '<option value="presence"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="presence") echo " selected";
echo '>Présence</option>';
echo '<option value="problem"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="problem") echo " selected";
echo '>Problème</option>';
echo '<option value="power2"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="power2") echo " selected";
echo '>Puissance</option>';
//Light
echo '<option value="light"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="light") echo " selected";
echo '>Lampe On/Off</option>';
echo '<option value="light_dim"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="light_dim") echo " selected";
echo '>Lampe dimmable</option>';
//Switch
echo '<option value="switch"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="switch") echo " selected";
echo '>Marche/Arret</option>';
//Cover
echo '<option value="cover"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="cover") echo " selected";
echo '>Volet ouverture variable</option>';
echo '<option value="somfy"';
if (isset($keySav)&&$devicesav[$keySav]["type"]=="somfy") echo " selected";
echo '>Volet SOMFY</option>';
echo "</select>";
}
echo ' '.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');
$typeEntite = [
"unknown" => [
"type" => "ignore",
"class" => ""
],
"current" => [
"type" => "sensor",
"class" => "current",
"unite" => "A"
],
"battery" => [
"type" => "sensor",
"class" => "battery",
"unite" => "%"
],
"apparent_power" => [
"type" => "sensor",
"class" => "apparent_power",
"unite" => "VA"
],
"ph" => [
"type" => "sensor",
"class" => "ph",
"unite" => "pH"
],
"speed" => [
"type" => "sensor",
"class" => "speed",
"unite" => "kmh"
],
"reactive_power" => [
"type" => "sensor",
"class" => "reactive_power",
"unite" => "VAR"
],
"voltage2" => [
"type" => "sensor",
"class" => "voltage",
"unite" => "mV"
],
"voltage" => [
"type" => "sensor",
"class" => "voltage",
"unite" => "V"
],
"water" => [
"type" => "sensor",
"class" => "water",
"unite" => "L"
],
"temperature" => [
"type" => "sensor",
"class" => "temperature",
"unite" => utf8_encode(chr(176))."C"
],
"humidity" => [
"type" => "sensor",
"class" => "humidity",
"unite" => "%"
],
"illuminance" => [
"type" => "sensor",
"class" => "illuminance",
"unite" => "lx"
],
"power" => [
"type" => "sensor",
"class" => "power",
"unite" => "W"
],
"energy" => [
"type" => "sensor",
"class" => "energy",
"unite" => "Wh"
],
"sound_pressure" => [
"type" => "sensor",
"class" => "sound_pressure",
"unite" => "dB"
],
"motion" => [
"type" => "binary_sensor",
"class" => "motion"
],
"problem" => [
"type" => "binary_sensor",
"class" => "problem"
],
"smoke" => [
"type" => "binary_sensor",
"class" => "smoke"
],
"power2" => [
"type" => "binary_sensor",
"class" => "power"
],
"light" => [
"type" => "light",
"class" => ""
],
"light_dim" => [
"type" => "light",
"class" => ""
],
"switch" => [
"type" => "switch",
"class" => ""
],
"cover" => [
"type" => "shutter",
"class" => ""
],
"somfy" => [
"type" => "shutter",
"class" => ""
]
];
$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;
global $typeEntite;
$num = 0;
$yml="";
foreach($devices as $key => $val){
if($typeEntite[$val['type']][type]=="sensor") {
//if( $val['type']== "temperature" || $val['type']== "humidity" || $val['type']== "illuminance" || $val['type']== "power" || $val['type']== "energy" || $val['type']== "sound_pressure") {
//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";
$yml.=" unit_of_measurement: '".$typeEntite[$val['type']]["unite"]."'"."\n";
$yml.=" device_class: ".$typeEntite[$val['type']]["class"]."\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;
global $typeEntite;
$num = 0;
$yml="";
foreach($devices as $key => $val){
if($typeEntite[$val['type']][type]=="binary_sensor") {
//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: ".$typeEntite[$val['type']]["class"]."\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;
global $typeEntite;
$num = 0;
$yml="";
foreach($devices as $key => $val){
if($typeEntite[$val['type']][type]=="light") {
//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']=="light_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']=="light_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;
global $typeEntite;
$num = 0;
$yml="";
foreach($devices as $key => $val){
if($typeEntite[$val['type']][type]=="switch") {
//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;
global $typeEntite;
$num = 0;
$yml="";
foreach($devices as $key => $val){
if($typeEntite[$val['type']][type]=="shutter") {
//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']=="cover") { //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 Home Assistant :
- 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 »…)
-
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.
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…