Gestion du fil pilote sur la Vera avec SQRemote

Nous avons vu hier comment domotiser un radiateur à l’aide d’un module Zwave, et son intégration sur la box eedomus.

Pour rappel cette solution consiste à utiliser un module Z-Wave FIBARO Double Switch. Celui-ci est connecté au fil pilote via 2 diodes tête bêche. Ainsi avec ces deux interrupteurs ont peut simuler les 4 ordres principaux d’un fil pilote.

Nous allons voir aujourd’hui comment utiliser ce montage sur la Vera.

La difficulté maintenant est de pouvoir piloter ces radiateurs et donc le double interrupteur du FIBARO.

Aucun module n’existe sur la VERA, et aucun sur SQRemote.

Deux solutions:

  • Réaliser chaque commande (Confort/Eco/Hors gel/Off) à l’aide de scénarios. Gros inconvénient, on ne sait pas dans quel mode est le radiateur, en effet le bouton de scénario ne fait qu’activer des commandes… Cette solution n’est pas idéale.
  • Développer un module exprès pour radiateur à fil pilote sur la VERA et sur SQRemote.

C’est donc cette deuxième solution qui sera utilisée.

La création du module sur la VERA est lié à l’élément sur SQRemote qui va le piloter.

Étant donné qu’il n’en n’existe pas, il faut donc en créer un. Pour faciliter les choses il faut trouver dans SQRemote un élément qui pourrait servir à la commande d’un radiateur. Celui le plus approprié est un élément qui commande un ventilateur. Pourquoi? Car il dispose de 4 boutons, qui peuvent correspondre aux 4 ordres de fil pilote, et une esthétique qui peut s’adapter à la commande d’un radiateur. Cet élément commande un module “dimmable” sur la VERA. Les 4 boutons correspondent à un pourcentage du dimmable 0% 33% 66% 100%. Il faudra faire correspondre ces 4 pourcentages avec les 4 ordres.

Ce module sera modifié plus tard pour correspondre à la commande du radiateur.

 

I. Pré requis sur la Vera

 

Maintenant qu’on sait que la commande se fera via un module “dimmable” sur la VERA, il faudra donc créer un module “dimmable” perso, sur la VERA.

Ceci est permis sur la VERA grâce au “Device Virtuel”.

Un “device virtuel”, est un module Z-wave qui n’existe pas physiquement. Pour le créer il faut écrire deux fichiers types au format XML, ici ce sera D_Radiateur1.xml et I_Radiateur1.xml.

Pour chaque radiateur, il faudra créer un “device virtuel”.

 

1. Fichier D_Radiateur1.xml

 

Le premier est le fichier type d’un “device virtuel” dans lequel on utilise le fichier Json d’un module dimmable classique D_DimmableLight1.json ainsi que S_Dimming1.xml. Il y a également le lien avec le deuxième fichier que l’on va créer I_Radiateur1.xml.

Les lignes importantes:

 

<deviceType>urn:schemas-upnp-org:device:DimmableLight:1</deviceType>

<staticJson>D_DimmableLight1.json</staticJson>

<serviceType>urn:schemas-upnp-org:service:Dimming:1</serviceType>

<serviceId>urn:upnp-org:serviceId:Dimming1</serviceId>

<controlURL>/upnp/control/Dimming1</controlURL>

<eventSubURL>/upnp/event/Dimming1</eventSubURL>

<SCPDURL>S_Dimming1.xml</SCPDURL>

<implementationFile>I_Radiateur1.xml</implementationFile>

 

Voici le fichier D_Radiateur1.xml :

 

<?xml version=”1.0″?>

<root xmlns=”urn:schemas-upnp-org:device-1-0″>

<specVersion>

<major>1</major>

<minor>0</minor>

</specVersion>

<device>

<deviceType>urn:schemas-upnp-org:device:DimmableLight:1</deviceType>

<staticJson>D_DimmableLight1.json</staticJson>

<friendlyName>Radiateur</friendlyName>

<manufacturer>Algeroth</manufacturer>

<manufacturerURL>http://ma-maison-domotique.blogspot.com</manufacturerURL>

<modelDescription>Radiateur</modelDescription>

<modelName>Radiateur</modelName>

<modelNumber>1.0</modelNumber>

<protocol>cr</protocol>

<handleChildren>0</handleChildren>

<UDN>uuid:upnp-algeroth-1_0-0000000001020</UDN>

<UPC>000001020</UPC>

<serviceList>

<service>

<serviceType>urn:schemas-upnp-org:service:Dimming:1</serviceType>

<serviceId>urn:upnp-org:serviceId:Dimming1</serviceId>

<controlURL>/upnp/control/Dimming1</controlURL>

<eventSubURL>/upnp/event/Dimming1</eventSubURL>

<SCPDURL>S_Dimming1.xml</SCPDURL>

</service>

</serviceList>

<implementationList>

<implementationFile>I_Radiateur1.xml</implementationFile>

</implementationList>

</device>

</root>

 

2. Fichier I_Radiateur1.xml

 

Le fichier I_Radiateur1.xml va être utilisé pour programmer le device virtuel. La programmation se fait grâce au langage LUUP de la VERA, utilisant le moteur d’interprétation LUA.

La première fonction de ce fichier, est une fonction de base d’un module dimmable, qui permet en fonction du dimmer, de savoir si l’élément est sur ON ou OFF, et inversement d’éteindre et d’allumer l’élément. Ceci sera très utile pour la suite, car une fonction de base du dimmer dans la VERA est de conserver son ancien état lorsqu’on le rallume. Voici son code:

 

luup.variable_set (“urn:upnp-org:serviceId:Dimming1”, “LoadLevelTarget”, lul_settings.newLoadlevelTarget, lul_device)

luup.variable_set (“urn:upnp-org:serviceId:Dimming1”, “LoadLevelStatus”, lul_settings.newLoadlevelTarget, lul_device)

if (tonumber (lul_settings.newLoadlevelTarget, 10) == 0) then

luup.variable_set (“urn:upnp-org:serviceId:SwitchPower1”, “Status”, “0”, lul_device)

else

luup.variable_set (“urn:upnp-org:serviceId:SwitchPower1”, “Status”, “1”, lul_device)

end

 

Explication : luup.variable_set permet de définir une variable, ici un élément type Dimming1, il s’agit d’un niveau qu’on met à jour avec la valeur du dimmer, et cette valeur est pour son propre device lul_device.

Ensuite en fonction de la valeur, si c’est différent de 0, on considère que l’élément est sur ON sinon sur OFF.

La deuxième partie du code permet de piloter les deux interrupteurs des modules FIBARO double switch.

En fonction du pourcentage du dimmer, on ferme ou on ouvre un des deux interrupteurs FIBARO. Voici le code:

 

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 0) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 33) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 66) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 100) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 34)

end

 

Explication : En fonction des 4 pourcentages définis précédemment avec l’élément SQRemote (0% 33% 66% 100%) on agit à l’aide de la fonction luup.call_action sur un device de type SwitchPower1 en le fermant ou l’ouvrant (1/0). Le 33 et 34 correspond à l’ID des interrupteurs FIBARO à commander.

Voici le fichier I_Radiateur1.xml :

 

<?xml version=”1.0″?>

<implementation>

<functions>

function virtual_dimmable_light_startup (lul_device)

luup.log (“Virtual dimmable light running…”)

end

</functions>

<startup>virtual_dimmable_light_startup</startup>

<actionList>

<action>

<serviceId>urn:upnp-org:serviceId:Dimming1</serviceId>

<name>SetLoadLevelTarget</name>

<job>

luup.variable_set (“urn:upnp-org:serviceId:Dimming1”, “LoadLevelTarget”, lul_settings.newLoadlevelTarget, lul_device)

luup.variable_set (“urn:upnp-org:serviceId:Dimming1”, “LoadLevelStatus”, lul_settings.newLoadlevelTarget, lul_device)

if (tonumber (lul_settings.newLoadlevelTarget, 10) == 0) then

luup.variable_set (“urn:upnp-org:serviceId:SwitchPower1”, “Status”, “0”, lul_device)

else

luup.variable_set (“urn:upnp-org:serviceId:SwitchPower1”, “Status”, “1”, lul_device)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 0) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 33) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 66) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “1”}, 34)

end

if (tonumber(lul_settings.newLoadlevelTarget, 10) == 100) then

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 33)

luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, 34)

end

return 4, 5

</job>

</action>

</actionList>

</implementation>

 

Il faudra une paire de fichiers par radiateur, en modifiant juste l’ID des interrupteurs FIBARO associés au radiateur.

 

II. Configuration sur la VERA

 

Une fois ces deux fichiers créés, il faut les ajouter à la base de fichiers LUUP. Pour cela il suffit de se rendre dans : APPS->Développer des applications->Fichiers LUUP. On arrive sur cette page:

 

 

Ensuite dans les champs Envoyer les fichiers, on ajoute les deux fichiers XML. On coche Redémarrer Luup puis sur GO.

Cette étape est à renouveler pour chaque radiateur.

Pour finir il faut créer un device virtuel à partir de ces fichiers en allant sur Créer un module.

 

 

On rentre le nom que l’on veut donner au module dans Description. Dans Nom périphérique UPnP on met le nom du fichier D_Radiateur1.xml puis on sélectionne la pièce.

On clique sur Créer module et on doit obtenir ceci :

 

 

Il suffit de faire varier la luminosité ou d’éteindre et d’allumer (0% 100%) pour voir les deux interrupteurs FIBARO se fermer et s’ouvrir.

C’est fini pour la partie VERA.

 

III. Sur SQRemote/SQDesigner

 

Pour la partie SQRemote, il est nécessaire d’avoir le logiciel SQDesigner car tout se passe dessus.

Comme il est dit précédemment l’élément SQRemote utilisé en exemple pour la création d’un élément pour radiateur est un contrôle de ventilateur, le High/Med/Low Vertical.

 

 

C’est celui-ci qui va être modifié pour créer l’élément radiateur.

Pour cela, il va falloir éditer les fichiers XML de configuration du logiciel SQDesigner.

Trois fichiers vont être modifiés dans SQDesigner/assets/xml, SQControlsList.xml, SQVeraDeviceTypeMapping.xml, et SQGlobalControlPanels.xml.

Pensez à faire une sauvegarde des vos fichiers xml initiaux!

Étant donné qu’ils sont protégés en écriture, il faut les copier dans un autre répertoire avant de les modifier pour les recopier ensuite.

 

1. Dans SQControlsList.xml

 

Il faut aller dans :

 

<type label=”Fan Controls”>

 

Puis ajouter la ligne :

 

<control label=”Radiateur” global_panel=”true” dragItem=”true” icon=”preset_ListIcon” dragIcon=”default65x255_DragProxy” dragIcon_width=”65″ dragIcon_height=”225″/>

2. Dans SQVeraDeviceTypeMapping.xml

 

Dans :

 

 <device_type name=”Fan Controls” left_image=”MiosMCV.png” list_image=”ListMiosFanControls.png” description=”Ceiling fan control”>

 

Ajouter la ligne :

 

<control name=”Radiateur”/>

3. Dans SQGlobalControlPanels.xml

 

Il faut trouver le groupe d’éléments :

 

<!– new presets –>

 

Ensuite il suffit de recopier l’élément correspondant au High/Med/Low Vertical et modifier les intitulés des boutons avec CONF/ECO/H.G/OFF pour le radiateur, il faut également modifier le nom de l’objet en Radiateur.

Voici la partie de code à rajouter entre les autres éléments:

 

<global_view name=”Radiateur” device_category=”5″ imageName=”fanLowMedHighVert.png” description=”Radiateur” fixedXY=”false” fixedX=”3″ fixedY=”3″ width=”65″ height=”225″ drawBorder=”false”>

<label name=”Label” title=”Radiateur” z_position=”1″>

<rectangle x=”-57″ y=”0″ width=”180″ height=”20″/>

<datasource name=”MCVDevice”>

<datasource_parameter name=”deviceNumber” value=””/><datasource_parameter name=”property” value=”name”/>

</datasource><label_model_state state=”default” size=”16″ color=”white” title=”Radiateur” alignment=”center”/>

</label>

<button name=”FanHigh” class_name=”SQUIActionButton” title=”” normal_background_icon=”jpm_btn65x48.png” highlighted_background_icon=”jpm_btn65x48Pressed.png” foreground_icon=”” show_touch=”false” z_position=”0″>

<rectangle x=”0″ y=”26″ width=”65″ height=”48″/>

<command_mapping device_key=”MCV” command_name=”SetLoadLevelTarget”>

<action_parameter name=”deviceNumber” value=””/><action_parameter name=”serviceName” value=”Dimming1″/><action_parameter name=”variableName” value=”LoadLevelStatus”/><action_parameter name=”operation” value=”100″/>

</command_mapping>

</button>

<label name=”HighLabel” title=”CONF” z_position=”2″>

<rectangle x=”0″ y=”41″ width=”65″ height=”16″/>

<datasource name=”MCV”>

<datasource_parameter name=”deviceNumber” value=””/><datasource_parameter name=”serviceName” value=”Dimming1″/><datasource_parameter name=”variableName” value=”LoadLevelStatus”/>

</datasource>

<label_model_state state=”100″ size=”14″ color=”green” title=”CONF” alignment=”center” isTarget=”true” provisionalColor=”yellow”/>

<label_model_state state=”66″ size=”14″ color=”gray” title=”CONF” alignment=”center”/>

<label_model_state state=”33″ size=”14″ color=”gray” title=”CONF” alignment=”center”/>

<label_model_state state=”0″ size=”14″ color=”gray” title=”CONF” alignment=”center”/>

<label_model_state state=”default” size=”14″ color=”gray” title=”CONF” alignment=”center”/>

</label>

<button name=”FanMed” class_name=”SQUIActionButton” title=”” normal_background_icon=”jpm_btn65x48.png” highlighted_background_icon=”jpm_btn65x48Pressed.png” foreground_icon=”” show_touch=”false” z_position=”0″>

<rectangle x=”0″ y=”76″ width=”65″ height=”48″/>

<command_mapping device_key=”MCV” command_name=”SetLoadLevelTarget”>

<action_parameter name=”deviceNumber” value=””/><action_parameter name=”serviceName” value=”Dimming1″/><action_parameter name=”variableName” value=”LoadLevelStatus”/><action_parameter name=”operation” value=”66″/>

</command_mapping>

</button>

<label name=”MedLabel” title=”ECO” z_position=”2″>

<rectangle x=”0″ y=”91″ width=”65″ height=”16″/>

<datasource name=”MCV”>

<datasource_parameter name=”deviceNumber” value=””/><datasource_parameter name=”serviceName” value=”Dimming1″/><datasource_parameter name=”variableName” value=”LoadLevelStatus”/>

</datasource>

<label_model_state state=”100″ size=”14″ color=”gray” title=”ECO” alignment=”center”/>

<label_model_state state=”66″ size=”14″ color=”green” title=”ECO” alignment=”center” isTarget=”true” provisionalColor=”yellow”/>

<label_model_state state=”33″ size=”14″ color=”gray” title=”ECO” alignment=”center”/>

<label_model_state state=”0″ size=”14″ color=”gray” title=”ECO” alignment=”center”/>

<label_model_state state=”default” size=”14″ color=”gray” title=”ECO” alignment=”center”/>

</label>

<button name=”FanLow” class_name=”SQUIActionButton” title=”” normal_background_icon=”jpm_btn65x48.png” highlighted_background_icon=”jpm_btn65x48Pressed.png” foreground_icon=”” show_touch=”false” z_position=”0″>

<rectangle x=”0″ y=”126″ width=”65″ height=”48″/>

<command_mapping device_key=”MCV” command_name=”SetLoadLevelTarget”>

<action_parameter name=”deviceNumber” value=””/><action_parameter name=”serviceName” value=”Dimming1″/><action_parameter name=”variableName” value=”LoadLevelStatus”/><action_parameter name=”operation” value=”33″/>

</command_mapping>

</button>

<label name=”LowLabel” title=”H.G” z_position=”2″>

<rectangle x=”0″ y=”141″ width=”65″ height=”16″/>

<datasource name=”MCV”>

<datasource_parameter name=”deviceNumber” value=””/><datasource_parameter name=”serviceName” value=”Dimming1″/><datasource_parameter name=”variableName” value=”LoadLevelStatus”/>

</datasource>

<label_model_state state=”100″ size=”14″ color=”gray” title=”H.G” alignment=”center”/>

<label_model_state state=”66″ size=”14″ color=”gray” title=”H.G” alignment=”center”/>

<label_model_state state=”33″ size=”14″ color=”green” title=”H.G” alignment=”center” isTarget=”true” provisionalColor=”yellow”/>

<label_model_state state=”0″ size=”14″ color=”gray” title=”H.G” alignment=”center”/>

<label_model_state state=”default” size=”14″ color=”gray” title=”H.G” alignment=”center”/>

</label>

<button name=”FanOFF” class_name=”SQUIActionButton” title=”” normal_background_icon=”jpm_btn65x48.png” highlighted_background_icon=”jpm_btn65x48Pressed.png” foreground_icon=”” show_touch=”false” z_position=”0″>

<rectangle x=”0″ y=”176″ width=”65″ height=”48″/>

<command_mapping device_key=”MCV” command_name=”SetLoadLevelTarget”>

<action_parameter name=”deviceNumber” value=””/><action_parameter name=”serviceName” value=”Dimming1″/><action_parameter name=”variableName” value=”LoadLevelStatus”/><action_parameter name=”operation” value=”0″/>

</command_mapping>

</button>

<label name=”OFFLabel” title=”OFF” z_position=”2″>

<rectangle x=”0″ y=”191″ width=”65″ height=”16″/>

<datasource name=”MCV”>

<datasource_parameter name=”deviceNumber” value=””/><datasource_parameter name=”serviceName” value=”Dimming1″/><datasource_parameter name=”variableName” value=”LoadLevelStatus”/>

</datasource>

<label_model_state state=”100″ size=”14″ color=”gray” title=”OFF” alignment=”center”/>

<label_model_state state=”66″ size=”14″ color=”gray” title=”OFF” alignment=”center”/>

<label_model_state state=”33″ size=”14″ color=”gray” title=”OFF” alignment=”center”/>

<label_model_state state=”0″ size=”14″ color=”green” title=”OFF” alignment=”center” isTarget=”true” provisionalColor=”yellow”/>

<label_model_state state=”default” size=”14″ color=”green” title=”OFF” alignment=”center”/>

</label>

</global_view>

 

Lorsqu’on démarre SQDesigner on obtient un nouvel élément prêt à être utilisé. Il pourra être utilisé pour tous les radiateurs. Il suffira de les assigner chacun à un device virtuel créé précédemment.

 

 

Au final, voici un exemple d’interface SQRemote permettant de piloter ses radiateurs, sans avoir à se soucier de l’état des relais du module Fibaro:

 

 

Et tout cela avec la remontée d’état, bien sûr ! :D


3 Commentaires

      Laisser un commentaire

      Ne ratez plus aucune news !

      Inscrivez vous à notre newsletter, et recevez chaque mois toute l'actualité du blog pour ne plus rien louper: actualité, guides, tutoriaux, concours !

      Merci pour votre inscription !