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.