Integration Hitachi airCloud

Bonsoir tout le monde,

Ayant réussi à intégrer Hitachi AirCloud dans Home Assistant, je souhaite partager avec le plus grand nombre comment j’ai fait.

L’intégration standard Overkiz dans Home Assistant est prévue pour Hitachi Hi Kumo et ne fonctionne qu’avec l’ancienne passerelle SPX-WFG01.
Rien n’est prévu en standard pour intégrer Hitachi AirCloud et la nouvelle passerelle SPX-WFG02.

J’ai donc utilisé le script de Ib544, ha-aircloud/scripts/aircloud.sh at develop · lb544/ha-aircloud · GitHub ainsi que le script de Chqrles84, Problem with script · Issue #1 · lb544/ha-aircloud · GitHub, dans lequel j’ai puisé des éléments, pour en faire un nouveau adapté à mon cas.
Il fonctionne très bien.
Voici comment je l’ai intégré dans HA.
(Pour l’instant j’ai fait du fonctionnel, on verra l’esthétique plus tard…)

Je n’utilise pas le mode thermostat.
j’ai utilisé une automatisation derrière la carte ci-dessous :
aircloudHA1

Les différents inputs permettent de mémoriser les paramètres que je veux passer au script.
L’input boolean « PAC_1er_lancer_script » permet de lancer l’automatisation dont voici le fichier yaml ci-dessous :

alias: PAC activation ON
description: Modification des paramètres de la PAC
trigger:

  • platform: state
    entity_id:
    • input_boolean.pac_1er_lancer_script
      from: « off »
      to: « on »
      condition:
      action:
  • service: shell_command.my_script
    data: {}
  • service: notify.pierre_andre
    data:
    title: Activation Modifications des paramètres de la PAC
    data:
    html: >-

    Lancement PAC avec les
    paramètres suivants :

    Etat de la PAC : {{
    states.input_boolean.pac_1er_activation.state }}
    Mode : {{
    states.input_select.pac_1er_mode.state }}
    Température : : {{
    states.input_number.pac_1er_temp_sejour.state }}
    Vitesse ventilo :
    {{ states.input_select.pac_1er_vitesse_ventilateur.state }}

  • service: input_boolean.turn_off
    target:
    entity_id: input_boolean.pac_1er_lancer_script
    data: {}
    mode: single

Dans les actions :

  • Le service: « shell_command.my_script » permet d’exécuter la ligne de commande paramétrée sous le nom de « my_script » dans mon fichier configuration.yaml,
    ou j’ai ajouté :
    shell_command:
    my_script: bash /config/scripts/aircloud.sh {{
    states.input_boolean.pac_1er_activation.state }} Séjour {{
    states.input_select.pac_1er_mode.state }} {{
    states.input_number.pac_1er_temp_sejour.state }}
    {{ states.input_select.pac_1er_vitesse_ventilateur.state }} OFF

  • Le service: « notify.pierre_andre » permet de m’envoyer un mail récapitulatif avec le détail des paramètres passés au script.

  • Le service: input_boolean.turn_off permet de passer l’input boolean PAC_1er_lancer_script sur off à la fin de l’automatisation.

Et voici le mail reçu :
aircloudHA4

Et le fichier de log créé par le script :

De la même manière je vais me faire des automatisations pour modifier les paramètres de la PAC en fonction des jours rouge Tempo, de la température extérieure, de l’ensoleillement…

Voilà, encore merci à Ib544 pour le script fourni et pour l’assistance au démarrage.
Merci à Chqrles84K pour l’amélioration du script initial.

Bravo pour ton travail !
Tu crois que tu pourrais mettre ton script à dispo ?

Merci

Le script est surtout le travail d’ Ib544 et de Chqrles84K que j’ai adapté comme j’ai pu. D’ailleurs je ne suis pas arrivé à passer correctement les variables « hitachiuser » et « hitachi password » soit en clair soir en base 64 dans la commande « curl » de la fonction « get_info ». Je les passe en dur car j’ai essayé plusieurs solutions, certaines laissées en commentaires, sans succès et j’en ai eu marre de traquer les quotes imbriquées avec ou sans anti-slash, …
Donc voila ci-dessous le script qui fonctionne avec 6 arguments : on/off/action, PAC, mode, temperature, fanspeed, fanSwing"
si 1er paramètre = on ou off, préciser les autres paramètres exemple « bash aircloud.sh ON Séjour HEATING 20 LV3 OFF »
si 1er paramètre = action, exemple « bash aircloud websocatdebug » permet d’obtenir l’état de la PAC
Je génère aussi un lichier de log " home-assistant.log" dans le même répertoire que le script qui récapitule les principales étapes du script.

LE SCRIPT :

#sortie sur erreur
#set -e
#mode trace et debug
#set -xv

# Rend les tests indifférents aux MAJ min
shopt -s nocasematch

#############INITIALISATION VARIABLES####################

#!/bin/bash
now=$(date ‹ +%d-%m-%Y-%H:%M:%S ›)
logfile=« /config/scripts/home-assistant.log »
printf « \n0. execute script aircloud.sh ${now}\n » >> $logfile

#login and password in base64
#hitachiuser=« LWQgamF6enlwYW41MUBnbWFpbC5jb20K » #| base64 -d)
#hitachipassword=« LWQgSkB6enlwYW41MQo= » #| base64 -d)
#or in plain text
hitachiuser="xxxxxxxxxxx@gmail.com"
hitachipassword=« xxxxxxxxxxxx »
api_url=« https://api-global-prod.aircloudhome.com »
wssairCloud=« wss://notification-global-prod.aircloudhome.com/rac-notifications/websocket »
websocatbinary=« /config/scripts/websocat.aarch64-unknown-linux-musl »
pingtimeout=« 5 »
websocatoption="-b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud "

########################FONCTIONS########################

function get_info {
token=$(curl -H « Accept: application/json » -H « Content-Type: application/json; charset=UTF-8 » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --data-binary ‹ {« email":"xxxxxxxxx@gmail.com »,« password »:« xxxxxxxxx »} › --compressed « $api_url/iam/auth/sign-in » | jq -r .token)
# token=$(curl -H « Accept: application/json » -H « Content-Type: application/json; charset=UTF-8 » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --data-binary ‹ {« email »:« $hitachiuser »,« password »:« $hitachipassword »} › --compressed « $api_url/iam/auth/sign-in » | jq -r .token)
# token=$(curl -s -H « Accept: application/json » -H « Content-Type: application/json; charset=UTF-8 » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --data-binary « {"email":"$hitachiuser","password":"$hitachipassword"} » --compressed « $api_url/iam/auth/sign-in » | jq -r .token)
familyId=$(curl -s -H « Authorization: Bearer $token » -H « Content-Type: application/json » -H « Accept: application/json » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --compressed « $api_url/iam/user/v2/who-am-i » | jq -r .familyId)
cloudlds=$(curl -s -H « Authorization: Bearer $token » -H « Content-Type: application/json » -H « Accept: application/json » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --compressed « $api_url/rac/ownership/groups/cloudIds/$familyId »)
}

function websocat_request {
roomName=$1
json_data=«  »
i=1
while [ -z « $json_data » ]
do
json_data=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d « \n » )
sleep 5
i=$((i+1))
if [ $i == 5 ];then
echo « 5 itérations json_data et demande non satisfaite : sortie prog. » >> $logfile
exit 0
fi
done
}

function get_roomid {
roomId=$(echo $json_data|jq -r ‹ .data | select(.name=« $roomName ») | .id ›)
roomId=${roomId:0:5}
}

function get_powerstatus {
powerstatus=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .power ›)
}

function get_temperature {
temperature=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .roomTemperature ›)
}

function get_idutemperature {
idutemperature=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .iduTemperature ›)
}
function get_mode {
mode=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .mode ›)
}

function get_fanSpeed {
fanSpeed=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .fanSpeed ›)
}

function get_fanSwing {
fanSwing=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .fanSwing ›)
}

function get_humidity {
roomhumidity=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») | .humidity ›)
}

function get_powerstatusbymode {
powerstatusbymode=$(echo $json_data|jq -r ‹ .data | select(.id=« $roomId ») and (.mode==« $mode ») | .power ›)
}

########################DEROULEMENT########################

i=$(($#-1))
if [ $i == -1 ];then
echo « paramètres nobligatoires, utilisez 6 paramètres : on/off/action PAC mode temperature fanspeed fanSwing »
echo « si 1er paramètre = on ou off, exemple aircloud.sh ON Séjour HEATING 20 LV3 OFF »
echo « si 1er paramètre = action, exemple aircloud websocatdebug permet d’obtenir l’état de la PAC »
echo « Pas de paramètres, sortie du programme » >> $logfile
exit 0
fi
while [ $i -ge 0 ];do
echo ${BASH_ARGV[$i]} >> $logfile
i=$((i-1))
done
# Obtention d’un identifiant unique universel
uuid=$(curl -s https://www.uuidtools.com/api/generate/v1 | jq -r .[0])
echo « 1. uuid=$uuid » >> $logfile

if ! [[ -z « $1 » ]];then
get_info
echo « 2. Authentification avec token=$token, familyId=$familyId, cloudlds=$cloudlds » >> $logfile
connectandsub=$(printf « CONNECT\naccept-version:1.1,1.2\nheart-beat:10000,10000\nAuthorization:Bearer $token\n\n\0\nSUBSCRIBE\nid:$uuid\ndestination:/notification/$familyId/$familyId\nack:auto\n\n\0 » | base64 -w0 )
fi
if ! [[ -z « $2 » ]];then
websocat_request $2
echo « 3. Websocket request sur $2 » >> $logfile
get_roomid
echo « 4. Roomid = $roomId » >> $logfile
mode=$3
idutemperature=$4
fanSpeed=$5
fanSwing=$6
else
echo « Nom de la pac non renseigné en paramètre 2 » >> $logfile
fi

case « $1 » in
« on »)
get_powerstatus
echo « 5. Demande PAC allumée, powerstatus avant requete = $powerstatus » >> $logfile
powerstatus=«  »
i=1
while ! [ « $powerstatus » == « ON » ];do
curl -s -H « Authorization: Bearer $token » -H « Content-Type: application/json » -H « Accept: application/json » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --compressed --data-binary « {"fanSpeed":"$fanSpeed","fanSwing":"$fanSwing","humidity":"50","id":$roomId,"iduTemperature":$idutemperature,"mode":"$mode","power":"ON"} » -X PUT --compressed « $api_url/rac/basic-idu-control/general-control-command/$roomId?familyId=$familyId »
sleep 5
websocat_request $2
get_powerstatus
i=$((i+1))
if [ $i == 5 ];then
echo « 5 itérations et demande ON non satisfaite : sortie prog. » >> $logfile
exit 0
fi
done
# get_temperature
echo « PAC allumée, powerstatus apres requete = $powerstatus, idutemperature = $idutemperature, temperature = $temperature, fanspeed = $fanSpeed, mode = $mode » >> $logfile
;;

« off »)
get_powerstatus
echo « 6. Demande PAC eteinte, powerstatus avant requete = $powerstatus » >> $logfile
if [ « $powerstatus » == « OFF » ];then
echo « PAC déjà éteinte, powerstatus apres requete = $powerstatus » >> $logfile
exit 0
fi
get_idutemperature
get_fanSpeed
# get_temperature
get_mode
i=1
while ! [ « $powerstatus » == « OFF » ];do
curl -s -H « Authorization: Bearer $token » -H « Accept: application/json » -H « Content-Type: application/json; charset=UTF-8 » -H « Host: api-global-prod.aircloudhome.com » -H « User-Agent: okhttp/4.2.2 » --data-binary « {"fanSpeed":"$fanSpeed","fanSwing":"$fanSwing","humidity":"50","id":$roomId,"iduTemperature":$idutemperature.0,"mode":"$mode","power":"OFF"} » -X PUT --compressed « $api_url/rac/basic-idu-control/general-control-command/$roomId?familyId=$familyId »
sleep 5
websocat_request $2
get_powerstatus
i=$((i+1))
if [ $i == 5 ];then
echo « 5 itérations et demande OFF non satisfaite : sortie prog. » >> $logfile
exit 0
fi
done
echo « PAC éteinte, powerstatus apres requete = $powerstatus, idutemperature = $idutemperature, temperature = $temperature, fanspeed = $fanSpeed, mode = $mode » >> $logfile
;;

« powerstatus »)
get_powerstatus
echo « 7.case powerstatus=$powerstatus » >> $logfile
;;
« modestatus »)
get_mode
echo « 8.case mode=$mode » >> $logfile
;;
« powerstatusbymode »)
get_powerstatusbymode
echo « 9.case powerstatusbymode=$powerstatusbymode » >> $logfile
;;
« roomtemperature »)
get_temperature
echo « 10.case roomtemperature=$temperature » >> $logfile
;;
« roomhumidity »)
get_humidity
echo « 11.case humidity=$humidity » >> $logfile
;;
« idutemperature »)
get_idutemperature
echo « 12.case idutemperature=$idutemperature » >> $logfile
;;
« websocatdebug »)
echo $connectandsub | $websocatbinary $websocatoption | grep -a HITACHI | tr -d « \n » | jq
echo « case Websocatdebug » >> $logfile
;;
« websocatdebug2 »)
echo $connectandsub | $websocatbinary $websocatoption
echo « case Websocatdebug2 » >> $logfile
;;
*)
printf « paramètres non reconnus, utilisez 6 paramètres : on/off/action PAC mode temperature fanspeed fanSwing)\n »
printf « si 1er paramètre = on ou off, exemple aircloud.sh ON Séjour HEATING 20 LV3 OFF\n »
printf « si 1er paramètre = action, exemple aircloud websocatdebug permet d’obtenir l’état de la PAC »
;;
esac

FIN DU SCRIPT

Attention, la messagerie du site a supprimé l’indentation et a transformé certaines quotes " en « et » et j’ai du mettre un anti slash devant certains caractères # qui désignent les commentaires pour éviter des transformations …
Il vaut mieux partir d’un script téléchargé à partir du site Github de Ib544, (ha-aircloud/scripts/aircloud.sh at develop · lb544/ha-aircloud · GitHub)
ou de Chqrles84, (Problem with script · Issue #1 · lb544/ha-aircloud · GitHub),
Pour avoir un script propre.

Merci beaucoup Pierre André !!!

Bonjour, j’ai aussi des airhome 600 et le voudrai les intégrer a home assistant aussi. Mais je suis bloquer des les debut a GitHub - vi/websocat: Command-line client for WebSockets, like netcat (or curl) for ws:// with advanced socat-like functions qui ne veux pas s’ajouter a HACS.

Hello!
J’ai simplement passé cette étape en mettant « apk add websocat » dans le terminal de HA et ca a l air d’avoir fonctionné (mais j’avoue que c’était pas évident pour moi non plus…)

Hello!
Si j’ai bien compris on fait un copié collé du script que tu mets à la place aircloud.sh originel, c’est bien cela?
Et ensuite on continue de suivre les instructions données par lb544 sur son github?

Désolé pour les questions, je suis encore en Noob level sur HA :sweat_smile:

bonsoir merci pour ton aide, je suis noob aussi je ne fait que suivre les tuto et essayer de déchiffer ce que cela veux dire lol.

Bonjour,

Pour vous partager un peu ce que j’ai mis en place sur Home Assistant grâce à l’intégration AirCloud sur Git.

L’application fournit par le constructeur sur le téléphone n’est à mon gout pas assez permissive. Par exemple si l’on souhaite faire du maintient de température, ce qui est mon cas.

J’ai alors préparer plusieurs modes :

Confort, Normal, Eco, et Absent (Eco et Absent sont plus ou moins similaires mais le mode absent par la suite va se déclencher Automatiquement dès que je quitte la zone de la maison) puis un mode automatique.

Voici mon Dashboard principale :

Ne pas faire attention au graphique pour le moment il n’est pas beau car j’ai effectuer plusieurs tests.

Au début j’avais configuré en dur les températures dans les différentes automatisations puis, n’étant pas spécialement fan du YAML et d’aller éditer à les lignes de code si besoin d’un changement j’ai fais ce second dashboard :

Attention, il n’est pas terminé. Il me permet simplement d’ajuster chacune des températures de chaque modes ainsi que la puissance de ventilation.
Le seul paramètre qui est en dur est le mode de ventilation (Vertical, horizontal) car la mienne ne gère que le mode Vertical.

Pour le moment je me base sur le Thermostat intégré à celle-ci, son seul défaut est qu’il s’actualise pour moi pas assez (3 ou 4 fois par heure) j’ai donc acheter un Thermomètre SNZB-02D de Sonoff couplé à mon modèle ZigBee USB directement sur mon Pi4. Mais lorsqu’il est connecté, la température n’est absolument pas fiable. Donc le déclenchement et l’arrêt est complètement aléatoire. Pour moi ils sont adaptés à des pièces de type chambre ou bureau, mais pas pour une grande pièce à vivre (comme dans mon cas) donc si vous connaissez des modules assez performants je suis preneur :slight_smile: (de préférence compatible ZigBee)

Voilà, n’hésitez pas si vous voulez plus de détail sur le fonctionnement des différentes entrées, automatisations, script, etc :slight_smile:

Au plaisir

Bonjour, est-ce que cela a été déchiffré ? :sweat_smile: Merci par avance !

Même difficulté. Vous avez résolu ce problème ?

Merci bien.

Fred

Attention par contre j’ai abandonné le contrôle des températures par HA en laissant le contrôle par la clim/PAC

Des marches / arrêts trop fréquents peuvent flinguer le compresseur

Alors que si la température est gérée par la clim/PAC, le compresseur tourne à vitesse réduite pour maintenir la température de consigne

Pour ma part je n’ai plus le temps de maintenir le script, il fait sa life sur mon HA mais de plus en plus en mode dégradé par les API moisies d’Hitachi (par exemple je ne demande plus l’état de fonctionnement du Split, ça surcharge l’API et les serveurs Hitachi ne répondent plus)

Salut

Depuis le temps je ne sais plus, mais je suppose que c’etait les serveurs hitachi qui etaient en vrac.

Depuis j’utilise directement l’intégration AirCloud pour piloter mes clim et ca fonctionne très bien avec un thermostat classique dans HA.

Bonsoir

Nouveau sur HA est qu’il y a eu des avancées pour l’intégration des split Hitachi sur HA ?

J’aimerais bien pouvoir créer deux trois automatisations pour l’été ^^

Merci par avance