Ipx800 + X-4VR intégration Home Assistant

J’avais pas fait attention :wink: Merci pour l’info et l’email dev. Il vrai que l’open source n’est pas une garantie automatique de pérennité. Comme dans tout projet, l’analyse fondamental et technique est important pour la pérennité d’un projet ou d’une entreprise. D’ailleurs, je précise que l’Open Source est un facteur parmi d’autres. Personnellement, je favorise le « modèle économique Open Source » (par forcément gratuit selon de fausses légendes). Il permet souvent d’internationalisé un projet et/ou une entreprise.

Pour le code, il est bien « fermé » mais pas vraiment « protégé » car il peut être décompilé :wink: rien d’insurmontable pour les spécialistes du reverse engineering. Je ne les nommerai pas mais il existe des entreprises et des pays qui sont les champions de la copie industrielle.

on ne va ni jouer sur les mots, ni polémiquer, ni tourner en boucle.
Le code est protégé au sens légal. Le « Reverse Engeneering » est illégal.
On sort du sujet.

D’une part, ce n’est pas de polémiquer que de préciser le sens des mots afin de lever des incertitudes ou des confusions. C’est une discussion responsable, respectueuse et saine que de le faire pour les personnes qui nous lisent.

D’autre part, le « Reverse Engeneering », la légalité est fonction de de la finalité (à ne pas confondre avec la copie). Cette dernière est d’ailleurs enseignée afin de savoir s’il y a eu violation de brevets ( propriétaire ou open source qui est protégé aussi :)), d’interopérabilité, de sécurité (back door : Fortinet, Huawei, etc., failles), atteinte à la vie privée (Apple, etc.), etc.

Nous sommes probablement entrain de glisser vers le hors sujet quand bien même nous parlons toujours d’interopérabilité avec HA (et autres) ce qui peut avoir du sens afin de comprendre le fonctionnement d’un IPX800.

Pour finir, je vous rappelle que ma 1ère intervention était sur l’interopérabilité avec des standards comme MQTT (M2M) et Nodered pour éviter des développements spécifiques aux utilisateurs de ce forum et donc une meilleure pérennité. Dans cette démarche, j’avais souligné un bug gênant avec le Push HTTP et la méthode Post qui est resté sans réponse du support. J’ai sollicité l’équipe dev hier. Je relatais également un contournement par le Push UDP non satisfaisant.

Ceci étant dans l’IPX800 nous n’avons aucune information sur l’implémentation HTTP (en terme de standard) comme (version 1.0, 1.1, Head, SSL/TLS, cipher, etc.) ce qui plutôt gênant quand le sujet est l’interopérabilité autour d’une norme comme le HTTP.

Cordialement,

Bonjour,

Je ne prends pas position sur ce que devrait ou pas faire GCE pour améliorer l’inter-opérabilité de ses produits. Néanmoins je note quelques points intéressants dans votre discussion :

  • GCE peut choisir de limiter l’interopérabilité pour garder l’étiquette « automate / fiabilité » qu’ils donnent depuis le début. En effet être complètement ouvert c’est prendre le risque de voir ses produits vus comme du « bidouillage » plutôt que des solutions « semi-clés en main fiables ».

  • Je trouve important que GCE puisse répondre et /ou trouver une solution sur le POST TCP puisque c’est une fonctionnalité proposée à l’utilisateur. C’est peut être un autre sujet mais perso j’avais aussi rencontré des problèmes avec l’API de ma TV Sony que j’ai contourné par un script PHP sur le NAS mais ça rajoute une étape inutile. Pour mémoire, le push POST sur l’API me faisait redémarrer l’IPX.

  • Sans aucun jugement sur ce que sait faire ou pas faire l’IPX, je trouve intéressant de savoir l’étendue et limitations des possibilités d’inter-opérabilité. J’avais un peu regardé du côté de HA un moment et ça m’avait l’air bien compliqué (plusieurs retours avec des méthodes différentes). Je partage l’avis de j254y et trouve l’approche MQTT la plus fiable et d’autant plus intéressante si c’est implémentable « nativement » au sens d’utilisation de protocole déjà intégrés et reconnus.
    D’ailleurs je t’invite à partager un peu plus de détail sur ce que tu as mis en place car je pense que ça peut intéresser pas mal de forumeur

A+
Jon

Bonjour Jon,

Effectivement, dans ce sens MQTT permettrait de mieux contrôler ce qui est fait par l’automate en se reposant sur un standard. Il permettrai également d’éviter l’ouverture de certain accès directs de l’IPX800 en mode serveur. Je ferme la parenthèse. Voici une capture de mon flow Node Red qui :

Il permet de créer un serveur UDP sur le port 1881 pour intercepter les push de l’IPX800. Cela se déroule d’abord par une authentification (cf. la doc M2M de l’IPX800). Je parse le résultat de la requête pour récupérer le « Success » puis lors de la seconde requête, je récupère le résultat de « Get=D » que je parse pour extraire l’état des entrées le stocker en tant que topic dans le Broker MQTT (Mosquitto pour moi).

Chaque client s’abonne via le message vers le broker : le « topic » (information
de routage pour le broker) qui permettra au broker de réémettre les messages reçus des producteurs
de données vers les clients. Les clients et les producteurs n’ont ainsi pas à se connaître, ne communiquant qu’au travers des topics.

Cette architecture permet à des solutions hétérogènes de communiquer simplement, de façon sécurisée tout en permettant le mode asynchrone pour ne pas perdre un message par exemple (coupure réseau, redémarrage, etc.) => fiabilisation de l’automate.

Il serait possible de supprimer l’étape du Flow Node-RED en intégrant un client MQTT directement dans l’IPX800.

Node-RED (projet Open Source issu d’IBM) est un éditeur de flux fullweb qui facilite la connexion d’équipement tout comme Kura, Flogo, Apache Nifi, StreamSets.

Home Assistant n’est pas obligatoire. HA fonctionne plutôt très bien mais son approche innovante est déroutante car il utilise Docker et Yaml mais très efficace.

Je souligne que cette solution est applicable à toutes les box domotiques pour le peu d’avoir un client MQTT ou une API. Dans ce dernier cas, il faudra passer par Node-RED (ou équivalent). Et pour un terminer un IPX800 pourrait être client et/ou producteur au sens MQTT. Mon flow ne gère pas pour le moment les exceptions et il est aisément perfectible. J’y travaille.

Cordialement,

3 « J'aime »

Bonjour @moicphil,
Je viens aux nouvelles pour savoir si vous avez réussi à faire fonctionner le plugin sur HomeAssistant chez vous ?

Bonjour @slashx57,
Je voulais savoir ce que votre plugin permet de gérer les extensions type X-8R, X-Dimmer ou encore X-24D.

Est-il possible d’avoir une vue du résultat ?

Ci-joint ma config globale.

Bonsoir

J’ai essayé pas mal de choses sans résultats et malgré l’aide de slashx57 (que je remercie au passage). J’ai ensuite baissé les bras pour me concentrer sur autre chose. Je me remettrai dessus dans quelques temps.

Pour info j’ai fait un custom component également pour Home Assistant : Intégration IPX800 Home Assistant
Je peux facilement ajouter d’autres extensions si ça intéressent des gens

1 « J'aime »

Bonsoir,
je n’avais besoin que de piloter les fonctions de l’IPX800v4 et je n’ai pas d’autres équipement à part un X400 Analog et un X200pH qui apparaissent comme des entrées virtuelles donc je n’ai pas codé le support de ces autres équipements mais ça ne doit pas être bien difficile à ajouter quand on peut tester sur l’équipement.

Point 1

  • platform: command_line
    switches:
    ipx800_1_relay_1:
    command_on: C:\Data\Batch\lib\GnuWin32\bin\wget --read-timeout=60 --auth-no-challenge --http-user=user --http-passwd=password -d http://our_ipx800_v3-1:8001/preset.htm?set1=1 -a R:\logs_dani_be\Applications\IPX-1\ipx800-1.log -O R:\logs_dani_be\Applications\IPX-1\ipx800-1.response.log
    command_off: C:\Data\Batch\lib\GnuWin32\bin\wget --read-timeout=60 --auth-no-challenge --http-user=user --http-passwd=password -d http://our_ipx800_v3-1:8001/preset.htm?set1=0 -a R:\logs_dani_be\Applications\IPX-1\ipx800-1.log -O R:\logs_dani_be\Applications\IPX-1\ipx800-1.response.log
    friendly_name: ‹ Chauffage ›

Point 2 dans l’IPX pour chauque switch

<?php $url = "http://localhost:8160/api/states/switch.ipx800_1_relay_" . $_GET['relay_num']; $data = array( 'state' => $_GET['relay_state'], 'attributes' => array('friendly_name' => $_GET['relay_name'], 'assumed_state' => 'true') ); // use key 'http' even if you send the request to https://... $options = array( 'http' => array( 'header' => array( "Content-type: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI2YzU2MDVlYzY1MDk0ZGQxYmY0M2FmMjc2ZTM1MzA0ZCIsImlhdCI6MTU3NTgwNzQ3MSwiZXhwIjoxODkxMTY3NDcxfQ.28KKEXKLf5wDqOgXf1ldV1L0HiIW2Gc0QzTB-ti7Rug" ), 'method' => 'POST', 'content' => json_encode( $data ) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); if ($result === FALSE) { /* Handle error */ } var_dump($result);

Point 3 Initialisation au démarrage

<#
.Synopsis
Initilize HASS at starting phase
.Notes
Name: Hass_Initialisation.ps1
Author: Thierry Lenoir
Created: 14/10/2019
Last Edit:
.Description
Based on the Autmation « alias: ‹ IPX initialisation › » a script is launched via the shell_command
Initialisation:
1 - IPX switch statuses

#>

#----------------------------------------------------------------------------------------------------

Initialisation

#----------------------------------------------------------------------------------------------------
#param($msg, $timeCreated, $accountName, $ipAddress)

loading Push Bullet lib & configs

. $Env:ScriptsLib\PushBullet\SendMsgPushBullet.ps1;
. $Env:ScriptsEtc\PushBullet_idens.ps1;

Loading & setting properties

$currentScriptName = $MyInvocation.MyCommand.Name.substring(-3);
[xml]$xmlProperties = Get-Content « $Env:ScriptsEtc\Scripts_properties.xml »;
#[xml]$xmlHackerCache = Get-Content $xmlProperties.$MyInvocation.MyCommand.Name.cacheFilename;

#----------------------------------------------------------------------------------------------------

Functions

#----------------------------------------------------------------------------------------------------

Function HassChangeSwitchStatus
{
Param([string]$relayNum, [string]$relayName, [string]$relayState, [string]$IPXNum )
Write-Output « $($MyInvocation.MyCommand.Name) => $(Get-Date -format « dd-MM-yyyy HH:mm:ss ») → Params: $relayNum - $relayName - $relayState - $IPXNum »

#remove "led" key word
$relayNum = $relayNum.substring(3) 

# add "ipx800_1_relay_" string at the relay number
$relayNum = "ipx800_" + $IPXNum + "_relay_" + $([int]$relayNum + 1)

# translate status code to hass codename 0=off 1=on
if($relayState -eq 1)     {$relayState = "on"} else {$relayState = "off"}

# build url to call hass
$hassURL = $xmlProperties.scriptsConfig.hass.ha_url + "/api/states/switch.$relayNum"

# buld body to send in the JSON request
$body = @{
   state = "$relayState"
   attributes = @{ friendly_name = "$relayName"
                     assumed_state = 'true' }
} | ConvertTo-Json

# setting headers
$headers = @{
    Authorization="Bearer $($xmlProperties.scriptsConfig.hass.ha_api_long_term_key)"
    ContentType = "application/json"
} 

# calling hass with Encoding to accept special char in the body
$resp = Invoke-WebRequest -Uri $hassURL -Method 'Post' -Headers $headers -body ([System.Text.Encoding]::UTF8.GetBytes($body))

Write-Output "$($MyInvocation.MyCommand.Name) <= $(Get-Date -format "dd-MM-yyyy HH:mm:ss")"

}

#----------------------------------------------------------------------------------------------------

MAIN

#----------------------------------------------------------------------------------------------------
try{
Write-Output « $($MyInvocation.MyCommand.Name) <=: $(Get-Date -format « dd-MM-yyyy HH:mm:ss ») »;

foreach ($ipx in $xmlProperties.scriptsConfig.SelectNodes("//ipx")){

    # retrieving IPX's creds
    $ipxUsrPass = $ipx.user + ":" + $ipx.pass

    # converting IPX's creds in BASE64
    $ipxCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ipxUsrPass))
 
    # setting headers based on request seen in the Chrome console data
    $headers = @{
        "Authorization" = "Basic " + $ipxCreds
        "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"
        "Accept-Encoding" = "gzip, deflate"
        "Accept-Language" = "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7"
    }

    # retrieving relay statuses  
    [xml]$relayStatuses = Invoke-WebRequest -Method Get -Uri "$($ipx.url)/globalstatus.xml" -Headers $headers

    # retrieving relay names with Encoding to accept special char in the response
    [xml]$relayNames = [system.Text.Encoding]::UTF8.GetString((Invoke-WebRequest -Method Get -Uri "$($ipx.url)/ioname.xml" -Headers $headers).RawContentStream.ToArray())

    # initializing arrays
    $data = @()

    # Initiate relay status for each ones till max relay number param from script xml file
    for ($count = 0; $count -lt $ipx.maxRelay; $count++){
             HassChangeSwitchStatus $relayStatuses.response.SelectNodes("/response/led$($count)").LocalName $relayNames.SelectNodes("/response/output$($count+1)").InnerText $relayStatuses.response.SelectNodes("/response/led$($count)").InnerText $ipx.number
    }
    # temporary situation while the IPX 2 will migrate to version 3.47.0 or higher
    break;
}

}

catch{
Write-Output « $($MyInvocation.MyCommand.Name) => Error: $_ - $(Get-Date -format « dd-MM-yyyy HH:mm:ss ») »;
}

finally{
#logging elapstime …
Write-Output « $($MyInvocation.MyCommand.Name) =>: $(Get-Date -format « dd-MM-yyyy HH:mm:ss ») »;
}

Désolé pour le retard

1 « J'aime »

Bonjour, je lis avec attention tous les posts consacrés à HA mais n’ayant absolument aucune compétence en programmation mais néanmoins bien équipé en Domotique ( IPX800V4, module fil pilote, Yeelight, Aqara, Foscam, Robot Xiaomi) et très intéressé par Home assistant afin de regrouper dans une seule interface tout mon univers Domotique, ma question est simple : est-ce que ce sera possible de faire cohabiter tout ce monde avec HA et si oui faut-il un master en programmation pour paramétrer tout ça ? Et du coup, existe-il des tutos ?
D’avance merci pour vos avis éclairés.

Bonjour,
C’est en effet le but de HomeAssistant. Tout regrouper sous une même interface via des Intégrations (connecteur).

Tu peux déjà consulter les intégrations de HA avec ton écosystème sur le site web afin de voir si ces passerelles existent.

Ensuite pas besoin de connaissance en dev, l’application a bien progressé et tu peux faire pas ma de choses via l’interface web (scénario, actions…).

Je suis en train de creuser le sujet et je constate qu’en passant un peut de temps dessus je pourrais depuis une action sur l’ipx, commander, en plus de l’ipx, ma freebox ( couper le wifi avant d’aller me coucher), gérer l’éclairage via HA ou ipx, commander la sortie audio de ma barre de son, descendre mon vidéo projecteur et l’écran…(tout ça reste à faire :wink: pour ma part) avoir un historique des données de mes xthl

Mon installation est basé sur un raspberry pi sous docker avec un container HA.

Rien d’impossible et accessible.

Merci d’avoir pris le temps de répondre. Je vais me plonger dans les différents tutos dispos sur Youtube ou FB afin de voir si mes compétences me permettront de déployer la solution HA qui fait rêver :wink::smiley:

Moi j’utilise, ipx 3 et 4, des shellys, esp, 433 et zwave et tout cela est centralisé sur une box Eedomus. Ca fonctionne et c’est bien; j’aurais aimé plus de possibilité de scrips, et autre…
Du coup je teste Jeedom et now HA.
Pas facile, tres programmateur…j’ai vu beaucoup de tutos, ouf, quelle tete il faut…

MI

Bonjour j254y,

Je mets en place l’intégration Home Assistant avec l’ipx800 et je pars sur la solution Node-RED/MQTT.
Pourrais-tu m’exporter ton flow Node-RED avec ton serveur UPD stp car je bloque sur le paramétrage de certains nœuds. ? Merci d’avance.

Je ne sais pas si cela à deja été cité mais tu peux t’inscrire sur le forum HACF pour fouiner et poser tes questions si tu ne trouve pas déjà tes réponses.
La communauté est plutôt très sympa.
@+

Bonjour @j254y

Désolé de déterrer le post :cold_face:
Il est possible de partager ce flow avec la communauté ? C’est toujours bien de voir que l’on peut ajouter des fonctionnalités à l’existant ! :wink: