lb544 / ha-aircloud

13 stars 3 forks source link

Problem with script #1

Open kneefabio opened 1 year ago

kneefabio commented 1 year ago

Hi, congratulations for the work done. I have a problem with the script. After following the instructions for installing the package, even if I execute the command "sh aircloud.sh websocatdebug" from the terminal, I do not receive any response from the server and instead in the home assistant log I receive this error "Command failed (with return code 2 ): sh /opt/scripts/aircloud.sh roomTemperature garage". On aircloud my device is called "garage". Do you have any solution to the problem? Thank you very much.

lb544 commented 1 year ago

Hi, Thanks for your support Can you tell me the result of websocat command lunched in the same host that HA ? You'll see a json like this :

bash-5.1# sh /opt/scripts/aircloud.sh websocatdebug
{
  "notificationType": "ON_CONNECT",
  "data": [
    {
      "serialNumber": "XXXX-XXXX-XXXX",
      "iduFrostWashStatus": {
        "active": false,
        "priority": 8,
        "lastUpdatedAt": 0,
        "subCategory": null,
        "errorCode": null
      },
      "model": "HITACHI",
      "id": 1438,
      "vendorThingId": "JCH-xxxxx",
      "name": "Chambre",
      "roomTemperature": 18,
      "mode": "HEATING",
      "iduTemperature": 22,
      "humidity": 126,
      "power": "OFF",
      "relativeTemperature": -3,
      "fanSpeed": "LV4",
      "fanSwing": "BOTH",
      "updatedAt": 1670831540665,
      "specialOperationStatus": {
        "active": false,
        "priority": 7,
        "lastUpdatedAt": 0,
        "subCategory": null,
        "errorCode": null
      },

And also the result of your roomTemperature command launched on the same host (Like this :

bash-5.1# sh /opt/scripts/aircloud.sh roomTemperature Chambre
18
bash-5.1#

I also saw that airCloud API had some problems since few weeks, you need to try a lot of time before get the right result :(

Thanks

kneefabio commented 1 year ago

Screenshot_20221212-125818_Chrome Hello and thank you so much for your immediate support. If I send the websocat command to the HA terminal I get no response. After a few seconds of waiting it gives me the command line again. Do I need to send it another way? I'm new to HA and many things I don't know how to do. Thanks so much for your help.

lb544 commented 1 year ago

Hi, Yes, it's seems to be an airCloud API issue, I have sometimes to try up to 10 websocatdebug to get the json result :

bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug bash-5.1# /opt/scripts/aircloud.sh websocatdebug { "notificationType": "ON_CONNECT", "data": [ { "serialNumber": "XXXX-XXXX-XXXX",

API answer is some random, example :

bash-5.1# /opt/scripts/aircloud.sh websocatdebug | jq -r ".data[] | select(.id==1437) | .power" parse error: Expected string key before ':' at line 1, column 2613 OFF jq: error (at :156): Cannot index string with string "data" bash-5.1# /opt/scripts/aircloud.sh websocatdebug | jq -r ".data[] | select(.id==1437) | .power" OFF bash-5.1# /opt/scripts/aircloud.sh websocatdebug | jq -r ".data[] | select(.id==1437) | .power" OFF bash-5.1# /opt/scripts/aircloud.sh websocatdebug | jq -r ".data[] | select(.id==1437) | .power" parse error: Expected string key before ':' at line 1, column 2613 OFF jq: error (at :156): Cannot index string with string "data"

I don't know why :(

So, try & try & try, more and more But if you can't have any result at all, check hitachiuser and hitachipassword variable

Check also the uuid, you can replace the uuid variable : uuid=$(curl -s https://www.uuidgenerator.net/api/version1) by uuid=$(curl -s https://www.uuidtools.com/api/generate/v1 | jq -r .[0])

I also know that airCloud api could ban some uuid range generated by uuidgenerator.net

acla6525 commented 1 year ago

I appear to be getting a similar issue, when I try to run a debug, I also get a permission denied error every single time.

This is the terminal log when I run the aircloud.sh

image

lb544 commented 1 year ago

Hi, Sorry for the delay You could try a new version in develop branch

https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh

Warning : there's a new argument for fan speed sh /opt/scripts/aircloud.sh on {{room}} {{mode}} {{temp}} {{fanspeed}} Example : sh aircloud.sh on LivingRoom HEATING 19 AUTO or sh aircloud.sh off LivingRoom HEATING 19 LV1

(LV1 to LV4 + AUTO)

Be careful to adapt hitachiuser, hitachipassword and websocatbinary path ;)

Chqrles84k commented 1 year ago

Hello, I had same problem on ha installed on raspberry.

Issue is ha uses docker and so, you have to put bash script into /config/scripts/, then, edit yaml to change the path.

I had issue with time to execute commands too (timeout), solved with command_timeout: 60.

I had to change the swing_mode from both to off.

And finally, i was unable to turn on/off my device. After few hours to debug, i modified script to parse roomid , sometimes, the roomid is present twice in response: ${roomId#* } ) and last issue was about jq.

I got error with '(' in select, i resolved i by changing the jq command: ...| jq '.data[] | select (.id="$roomId")|.power'

Chqrles84k commented 1 year ago

Salut,

je me suis permis, je n'ai plus les erreurs avec ce script, merci pour ton taf,

#!/bin/bash

#sortie sur erreur
#set -e

#mode trace et debug
#set -xv

now=$(date '+%d-%m-%Y-%H:%M:%S')
logfile="/config/home-assistant.log"

echo "0. execute script aircloud.sh ${now}" >> $logfile

#######################VARIABLES########################

hitachiuser=$(echo "xxx=" | base64 -d)
hitachipassword=$(echo "xxxx==" | base64 -d)

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 "

uuid=$(curl -s https://www.uuidtools.com/api/generate/v1 | jq -r .[0])

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

function get_info {

    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=""
    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
    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########################

if ! [[ -z "$2" ]];then
        get_info
        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 )
        websocat_request $2
        get_roomid
else
        echo "Nom pac non renseigné"
        exit 0
fi

case "$1" in
"on")
    if [ $# -lt 6 ];then
        echo "usage: script.sh on nom_pac mode temperature fanspeed swingmode"
        exit 0
    fi
    mode=$3
    idutemperature=$4
    fanSpeed=$5
    fanSwing=$6
    echo "get powerstatus" >> $logfile
    get_powerstatus

    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
    done
;;
"off")
    get_powerstatus
    if [ "$powerstatus" == "OFF" ];then
            echo "pac eteinte"
            exit 0
    fi
    get_idutemperature
    get_fanSpeed
    get_fanSwing
    get_mode
    while ! [ "$powerstatus" == "OFF" ];do
            curl -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" --data-binary "{\"fanSpeed\":\"$fanSpeed\",\"fanSwing\":\"$fanSwing\",\"humidity\":\"50\",\"id\":\"$roomId\",\"iduTemperature\":$idutemperature,\"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
    done
;;
"powerstatus")
echo "4.case powerstatus" >> $logfile

    get_powerstatus
    echo $powerstatus
;;
"modestatus")
    get_mode
    echo $mode
;;
"powerstatusbymode")
    get_powerstatusbymode
    echo $powerstatusbymode
;;
"roomtemperature")
    get_temperature
    echo $temperature
;;
"roomhumidity")
    get_humidity
    echo $humidity
;;
"idutemperature")
    get_idutemperature
    echo $idutemperature
;;
"websocatdebug")
    echo $connectandsub | $websocatbinary $websocatoption | grep -a HITACHI | tr -d "\n" | jq
;;
"websocatdebug2")
    echo $connectandsub | $websocatbinary $websocatoption
;;
*)
    echo "script.sh "action" "nom_pi..ce" (si action on:  "mode" "temperature" "fanspeed" "fanSwing")\n"
;;
esac
TheWK91 commented 1 year ago

Hi, I am too having a bit of an issue with the script. I tried the new development and the release version, in both I do not get a token and familyid, cloudlds reports unauthorized.

I tried user and password in plain and base64 and ran the .sh from bash directly.

Any pointers?

o0larrylurex0o commented 1 year ago

Hello, Same here I have jq error on the original script. Websocatdebug works fine.

@Chqrles84k I tested your script, but I have a strange error

  scripts sh /config/scripts/aircloud.sh
: not foundipts/aircloud.sh: line 2:
: not foundipts/aircloud.sh: line 3:
: not foundipts/aircloud.sh: line 6:
: not foundipts/aircloud.sh: line 9:
: not foundipts/aircloud.sh: line 10:
: not foundipts/aircloud.sh: line 13:
: not foundipts/aircloud.sh: line 15:
: not foundipts/aircloud.sh: line 16:
: not foundipts/aircloud.sh: line 18:
: not foundipts/aircloud.sh: line 21:
: not foundipts/aircloud.sh: line 24:
: not foundipts/aircloud.sh: line 27:
: not foundipts/aircloud.sh: line 29:
: not foundipts/aircloud.sh: line 32:
: not foundipts/aircloud.sh: line 34:
: not foundipts/aircloud.sh: line 35:
: not foundipts/aircloud.sh: line 36:
: not foundipts/aircloud.sh: line 37:
: not foundipts/aircloud.sh: line 39:
: not foundipts/aircloud.sh: line 40:
/config/scripts/aircloud.sh: line 41: syntax error: unexpected word

I'm running it on HA I have no idea why I have this error

thx a lot for your help

richard13127 commented 1 year ago

Bonsoir, Cela fait 2 fois que je refais l'installation et rien ne fonctionne. Pas de connexion à l'API je pense (c'est ce que je constate dans les log de homeassistant. Est ce que quelqu'un a continué d'investiguer sur l'intégration ?

lb544 commented 1 year ago

@richard13127 Bonjour, Avez-vous testé la version en cours de développement comme indiqué plus haut ? https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh

Vous loguez vous avec une adresse mail ou un numéro de téléphone ? Il a été remonté ces dernières semaines un problème d'accès avec un compte identifié par numéro de téléphone.

lb544 commented 1 year ago

@o0larrylurex0o Try develop script here https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh

richard13127 commented 1 year ago

Bonjour,

Voici les Logs de Homeassisatnt avec le nouveau script image

richard13127 commented 1 year ago

Voici ce que j'ai rajouté dans mon config.yaml

Air Cloud

climate:

switch:

sensor:

et voici l'erreur aussi que je n'avais pas avant image

richard13127 commented 1 year ago

Je pense que je vais partir sur "Air zone" qui est apparemment complètement intégrer

lb544 commented 1 year ago

Comme précisé dans l'autre issue, le nouveau script en cours de développement n'est pas pris en charge par les thermostats de type climate sur HA https://github.com/lb544/ha-aircloud/issues/3#issuecomment-1439809054

"J'ai un peu mis de côté les thermostats internes à HA pour laisser gérer la température par les climatiseurs, on évite ainsi un redémarrage complets des climatiseurs / PAC et donc éviter une usure prématurée du compresseur extérieur (je découvre le monde des clims / PAC, sorry)"

Concernant les timeout c'est NOR-MAL (encore!) l'API d'Hitachi est ralentie, sans doute une protection de leur côté ...

"L'API est devenue très lente, je ne sais pas si justement la mise à dispo de mon script a ralenti les serveurs Hitachi ou s'ils ont des protections de leurs côtés également (Les UUID de uuidgenerator.net par exemple étaient bannis, un motif commun à chaque UUID a permis à Hitachi de les bannir)"

breizhdude commented 1 year ago

Bonjour, super travail mais j’ai du mal me demerder, j’ai suivi la procedure d’installation mais j’ai plein d’erreurs lorsque j’essaie d’executer le script depuis le terminal: sh aircloud.sh powerstatus salon : not found: line 2: : not found: line 3: : not found: line 6: : not found: line 9: etc… En gros il me renvoie une erreur pour toutes les lignes vides, du coup j’imagine que j’ai du rater quelque chose Merci d’avance

Bonne soiree

aubierr commented 1 year ago

Je fais suite, j'ai le même problème,. La solution est elle toujours fonctionnelle? Merci à vous.

lb544 commented 1 year ago

@aubierr Oui le script dans la branche develop fonctionne toujours, moyennant une API Hitachi capricieuse suite aux sollicitations de Home Assistant car même l'appli officielle ne fonctionne plus quand Home Assistant fait trop de requêtes En désactivant le module dans HA, l'appli officielle airCloud refonctionne (avec sa lenteur legendaire)

Il peut y avoir des erreurs de ce type, qui n'apparaissent pas quand l'API ne se met pas en "protection"

Exemple : bash-5.1# sh /opt/scripts/aircloud.sh powerstatus Séjour parse error: Invalid numeric literal at line 1, column 2653 ON parse error: Expected value before ',' at line 1, column 2641

Je renomme le script que pour HA ne l'utilise plus

Et hop magie ! Un résultat clean

bash-5.1# mv /opt/scripts/aircloud.sh /opt/scripts/aircloud.bak bash-5.1# sh /opt/scripts/aircloud.bak powerstatus Séjour ON

@breizhdude Il doit manquer quelque chose dans votre installation

aubierr commented 1 year ago

Je suis exactement dans le même cas que @breizhdude.

sh aircloudnew.sh powerstatus Séjour

: not found.sh: line 2: : not found.sh: line 7: : not found.sh: line 13: : not found.sh: line 16: : not found.sh: line 25: aircloudnew.sh: line 45: syntax error: unexpected word (expecting "in")

Cela peut venir de websocat?

lb544 commented 1 year ago

@aubierr Vous êtes sur quel OS ? Oui ça peut-être lié à websocat, avez-vous également mis un login mail et pas numéro de téléphone ?

aubierr commented 1 year ago

je suis sous HA OS via une VM, oui bien avec un login mail.

lb544 commented 1 year ago

@aubierr Quel est le retour de ces commandes sh aircloud.sh websocatdebug sh aircloud.sh websocatdebug2 ?

aubierr commented 1 year ago

Bonjour, voici les retours que j'ai avec le script suivant : https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh

bash# sh aircloudnew.sh websocatdebug 
: not found.sh: line 2: 
: not found.sh: line 12: 
: not found.sh: line 15: 
: not found.sh: line 24: 
aircloudnew.sh: line 44: syntax error: unexpected word (expecting "in")
bash# sh aircloudnew.sh websocatdebug2
: not found.sh: line 2: 
: not found.sh: line 12: 
: not found.sh: line 15: 
: not found.sh: line 24: 
aircloudnew.sh: line 44: syntax error: unexpected word (expecting "in")

Si j'enlève tous les sauts de ligne, voici le résultat. Une erreur toujours au début du case :

bash# sh aircloudnew_.sh websocatdebug 
aircloudnew_.sh: line 38: syntax error: unexpected word (expecting "in")
bash# sh aircloudnew_.sh websocatdebug2
aircloudnew_.sh: line 38: syntax error: unexpected word (expecting "in")
lb544 commented 1 year ago

@aubierr Pourquoi il y a script au début de votre ligne de commande ?

aubierr commented 1 year ago

c'est une erreur de copie de ma part j'enlève la caractère spéciaux qui se colle et je n'ai pas enlevé le nom du dossier dans lequel je suis qui est script

lb544 commented 1 year ago

Ok je pense avoir compris Essayez avec bash aircloud.sh websocatdebug

aubierr commented 1 year ago

Je met l'intégralité du fichier qui se situe dans /opt/script/aircloud.sh

#!/bin/bash
#login and password in base64
#hitachiuser=$(echo "<replace with your Hitachi's account email in base64>" | base64 -d)
#hitachipassword=$(echo "<replace with your Hitachi's account password in base64>" | base64 -d)
#or in plain text
hitachipassword="*****@****.com"
hitachiuser="**********"
websocatbinary="/usr/local/bin/websocat"
wssairCloud="wss://notification-global-prod.aircloudhome.com/rac-notifications/websocket"
pingtimeout="5"
uuid=$(curl -s https://www.uuidtools.com/api/generate/v1 | jq -r .[0])
#uuid=$(uuidgen)
#echo $uuid
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 "https://api-global-prod.aircloudhome.com/iam/auth/sign-in" | jq -r .token)
#echo $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 "https://api-global-prod.aircloudhome.com/iam/user/v2/who-am-i" | jq -r .familyId)
#echo $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 "https://api-global-prod.aircloudhome.com/rac/ownership/groups/cloudIds/$familyId")
#echo $cloudlds
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 )
if [ "$2" = "" ]
    then
        :
    else
        roomName=$2
        roomId=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.name==\"$roomName\") | .id")
        #echo "roomID : " $roomId
          while [ -z "$roomId" ]
          do
            roomId=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.name==\"$roomName\") | .id")
            #echo "roomID : " $roomId
            sleep 10
          done
fi
mode=$3
temperature=$4
fanSpeed=$5
case "$1" in
"on")
  now=$(date)
  #echo "ON at $now"  >> /opt/scripts/logs.txt
  if [ -z "$roomId" ]
  then
    :
  else
    websocatresult=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n")
    #until [[ $(echo $websocatresult | jq -r ".data[] | select(.id==$roomId) | .power") = "ON" ]]
    until [ $(echo $websocatresult | jq -r ".data[] | select(.id==$roomId) | .power") = "ON" ] && [ $(echo $websocatresult | jq -r ".data[] | select(.id==$roomId) | .iduTemperature") -eq $(echo $temperature) ] && [ $(echo $websocatresult | jq -r ".data[] | select(.id==$roomId) | .fanSpeed") = $(echo $fanSpeed) ]
    do
        #echo "ON $mode $temperature at $now"  >> /opt/scripts/logs.txt
        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\":\"BOTH\",\"humidity\":\"50\",\"id\":$roomId,\"iduTemperature\":$temperature.0,\"mode\":\"$mode\",\"power\":\"ON\"}" -X PUT --compressed "https://api-global-prod.aircloudhome.com/rac/basic-idu-control/general-control-command/$roomId?familyId=$familyId"
        sleep 20
        websocatresult=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n")
    done
  fi
;;
"off")
  now=$(date)
  #echo "OFF at $now" >> /opt/scripts/logs.txt
  if [ -z "$roomId" ]
  then
    :
  else
    until [ $(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .power") = "OFF" ]
    do
        #echo "OFF $mode $temperature at $now"  >> /opt/scripts/logs.txt
        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\":\"BOTH\",\"humidity\":\"50\",\"id\":$roomId,\"iduTemperature\":$temperature.0,\"mode\":\"$mode\",\"power\":\"OFF\"}" -X PUT --compressed "https://api-global-prod.aircloudhome.com/rac/basic-idu-control/general-control-command/$roomId?familyId=$familyId"
        sleep 20
    done
  fi
;;
"powerstatus")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .power"
;;
"modestatus")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .mode"
;;
"powerstatusbymode")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select((.id==$roomId) and (.mode==\"$mode\")) | .power"
;;
"roomtemperature")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .roomTemperature"
;;
"roomhumidity")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .humidity"
;;
"idutemperature")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.id==$roomId) | .iduTemperature"
;;
"websocatdebug")
    echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq
;;
"websocatdebug2")
        echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -n $wssairCloud
;;
*)
esac

j'utilise websocat 1.12.0 dans /usr/local/bin/websocat il semble fonctionnel selon cet exemple :

[Connect to public echo server] (https://github.com/vi/websocat#connect-to-public-echo-server)
$ websocat ws://ws.vi-server.org/mirror
123
123
ABC
ABC

Voici le résultat obtenu en lançant le script aircloud.sh dans /opt/script/

#sh aircloud.sh websocatdebug
aircloud.sh: line 38: syntax error: unexpected word (expecting "in")                  
#sh aircloud.sh websocatdebug2
aircloud.sh: line 38: syntax error: unexpected word (expecting "in")
lb544 commented 1 year ago

@aubierr La variable websocatbinary n'est pas bonne

aubierr commented 1 year ago

j'utilise : websocatbinary="/usr/local/bin/websocat"

lb544 commented 1 year ago

@aubierr Et, avec bash aircloud.sh websocatdebug ? (Avec bash au lieu de sh comme déjà précisé il y a 2 posts)

aubierr commented 1 year ago
#bash aircloud.sh websocatdebug
aircloud.sh: line 38: syntax error near unexpected token `$'in\r''
'ircloud.sh: line 38: `case "$1" in
lb544 commented 1 year ago

@aubierr dos2unix aircloud.sh Puis relancer le script ?

aubierr commented 1 year ago

Le commande s'exécute sans erreur mais ne renvoie rien. bash aircloud.sh websocatdebug2 renvoie qqch.

#bash aircloud.sh websocatdebug
#bash aircloud.sh websocatdebug2
websocat: --ping-timeout specified without --ping-interval. This will probably lead to unconditional disconnection after that interval.websocat: --ping-interval is currently not very effective without -E or -U
CONNECTED
version:1.2
heart-beat:10000,10000

[WARN  websocat::ws_peer] Closing WebSocket connection due to ping timeout
lb544 commented 1 year ago

Et bien on y arrive :) idéalement c'est quand même mieux de télécharger le script plutôt que de le copier coller Essayez le reste des commandes Si ça ne fonctionne pas c'est l'API Hitachi

aubierr commented 1 year ago

Merci! Je n'ai aucune réponse mais je pense que c'est leur serveur. C'est bien dommage mais c'est comme cela.

lb544 commented 1 year ago

@aubierr Normalement la commande websocatdebug2 doit renvoyer quelque chose quand même en insistant un peu

Chqrles84k commented 1 year ago

Salut, bon, jvais reprendre les scripts de ce repo, car, après avoir testé la version HACS, elle ne marche pas bien. J'ai l'impression que l'api ne répond pas. J'ai pas encore analysé le pourquoi du comment. Mais je me demande si elle n'envoie pas trop de requêtes à l'api. Je préfère les scripts utilisés ici car, si l'action n'est pas passé, il temporise et renvoies la requête.

Par contre, je galère côté intégration dans le dashboard (page aperçu).

j'aime bcp la carte créée : ici

Pourriez-vous transmettre le contenu du yaml, merci par avance.

J'avais bidouillé le script l'année dernière, il fonctionnait de mon côté mais il manque des contrôles (présence binaire, fichiers etc...)

A savoir que mon HA est installé sur un raspberry (HA version officielle).

Edit: c'est quand même la plaie ce aircloud (appli et api).

J'ai deux pac air/air gree pour les chambres, Après avoir installé les modules wifi à 50e, je peux les contrôler à distance avec HA (sans utilisation d'api il me semble, car le temps de passage des ordres est quasi instantané). ou via l'appli GREE.

Savez-vous si la version plus moderne proposée par hitachi est plus pratique? Car j'envisage d'installer une pac multi split, Encore merci.

lb544 commented 12 months ago

@Chqrles84k Salut, Ayant changé de job entre temps j'ai beaucoup moins de temps pour maintenir le script et faire évoluer la solution dans HA Je t'avouerai que j'ai survolé rapidement la réécriture du script que tu as fait quelques mois plus tôt, ça m'a l'air beaucoup plus "propre" en tout cas :)

Par contre, l'API / websocket d'airCloud est complétement dans les choux depuis quelques jours, même l'appli officielle ne parvient pas à répondre convenablement, sur le Play Store beaucoup de monde s'en plaint Alors soit nos travaux (ici, + https://github.com/svmironov/aircloud_ha ) floodent trop l'API qui ne répond plus du tout, soit l'architecture d'airCloud est complétement pétée ... et comme c'est un système complètement fermé comme souvent dans les IoT de ce type ... c'est galère

J'obtiens souvent des {"timestamp":"2023-11-07T21:13:17.082+00:00","status":500,"error":"Internal Server Error","message":"SHORTCIRCUIT"} ou {"timestamp":"2023-11-07T21:10:49.367+00:00","status":401,"error":"Unauthorized","message":"Error -> Unauthorized","path":"/basic-idu-control/general-control-command/xxxx"}

Pour tester, j'ai complètement désactivé l'intégration dans HA pendant 24h et l'appli officielle est down malgré tout donc ça n'a pas l'air d'être lié à une potentielle protection sur mon compte

Ce matin ça a l'air d'aller mieux, mais ça ne va pas durer

Pour la carte, j'essaierai de publier les YAML prochainement, par manque de temps j'ai un peu triché et j'ai fait 100% en GUI ;)

En tout cas, si ça continue comme ça avec l'instabilité d'airCloud, pour ma part je compte remplacer le module Wifi par un module Aidoo, Wifi ou Z-Wave, c'est en réflexion depuis un moment https://myzone.airzonefrance.fr/produits/gamme-actuelle/aidoo//z-wave/aidoo-control-z-wave-plus-hitachi-rad-by-airzone-eu-868-869-mhz-1432.html

Chqrles84k commented 10 months ago

Salut,

Merci pour ta réponse. Idem de mon côté, je bosses dessus par intermittence :)

J'ai réussi à créer les entités, etc... En suivant la doc et quelques threads, ca m'a permis d'apprendre un peu plus sur HA :)

Tout allait pendant une semaine, puis, rebelotte xD, leur api est encore down :/

Du coup, je regardes la méthode airzone. Tu n'est pas le seul à en parler.

Tiens-nous au courant si t'as un feedback .

pierreandre51 commented 9 months ago

Bonjour,

J’ai une PAC air/air Hitachi avec une passerelle SPX-WFGO2. J’ai l’application "AirCloud Go" installée sur mon smartphone qui fonctionne et contrôle cette PAC.

Je souhaite piloter ma PAC avec HA mais l’intégration standard GUI « Hitachi Hi Kumo » proposée par Overkiz ne fonctionne pas avec un problème d'identification (adresse_mail et pwd passés en clair :

overkiz-4

J’aimerais utiliser votre script mais je ne suis pas informaticien :expressionless: et je vois que vous avez beaucoup "galéré" pour que ça fonctionne.

Hitachi utilise une nouvelle application "AirCloud Go" en remplacement de "AirCloud Home". Peut-être que cela améliore les performances de leur API ? Avez-vous des informations la-dessus ?

Je suis sur un PI4 avec un SSD connecté via USB, directement sous HA. Core 2024.1.6 Supervisor 2024.01.1 Operating System 11.5 Interface utilisateur 20240104.0

Je me demande si ça vaut le coup d'essayer et de passer du temps ??? Merci pour votre retour

lb544 commented 9 months ago

Bonjour, Je ne connais pas l'integration d'Overkiz je ne peux donc pas aider Pour mon intégration pour commencer il faut utiliser la branche develop ici : https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh Pour le reste il faut maîtriser suffisamment HA et Linux en ligne de commande et fichiers de configuration La "nouvelle" appli aircloud est la même que l'ancienne, c'est juste un renommage cosmétique Par contre l'API répond mieux depuis ma menace au support de faire une plainte collective

pierreandre51 commented 9 months ago

Merci d'avoir répondu si vite, ça me conforte dans l'idée d'essayer. Je connais bien linux en mode ligne (J'ai démarré sur Multics, puis Unix !!! ça remonte à loin)

Je vous tiendrai informé de mes essais

Chqrles84k commented 9 months ago

t'as réussi à avoir une réponse du support? xD, bien joué.

Le seul truc qui m'a "forcé" à utiliser HA pour piloter ma pac est que, la programmation hebdomadaire via l'appli aircloud go, ne permet pas de régler la vitesse lors de l'allumage: La valeur est par 2 par défaut, alors que j'utilise la vitesse 3.

J'utilise HA pour l'allumer et l'éteindre quotidiennement selon la température extérieure.

Par contre, @lb544, si tu as deux secondes, tu peux nous donner ta méthode pour changer la température lorsque la pac est déjà allumée. J'ai cru comprendre qu'il faut envoyer un OFF? Tu envoies le OFF suivi d'un ON ? (sans attente de réponse?)

Je n'ai pas eu le temps d'essayer, gros travaux en cours...

image

Merci.

lb544 commented 9 months ago

@Chqrles84k Oui, fin décembre :) "We sincerely apologize for the inconvenience using airCloud Go application!

Based on our research we have identified some abnormal operation with respect to one of the air conditioner families and made some optimizations."

Bizarrement depuis, tout est stable chez moi :)

Pour changer la température pendant le fonctionnement, je refais tout simplement un ON avec la température désirée sh /opt/scripts/aircloud.sh on Séjour HEATING xx AUTO

Avec donnée par le slider

lb544 commented 9 months ago

Précision : je passe par une automatisation pour lui passer le ON avec la nouvelle température, sinon le slider ne fait rien de lui même

Screenshot_20240206_212244_Home Assistant

Chqrles84k commented 9 months ago

Merci mon seigneur ;)

oui, l'api marche nickel, ca commençait très mal, deux pannes de plus d'une semaine dès novembre.

Merci encore,

aubierr commented 9 months ago

Bonjour,

je me relance a essayé d'utilisé votre projet, j'ai un retour du serveur sur le powerstatus, modestatus... mais impossible d'envoyer une commande. La climatisation ne bouge pas et j'ai un retour que je vous joint.

➜  ~ sh /root/config/script/aircloud.sh modestatus Séjour        
HEATING

➜  ~ sh /root/config/script/aircloud.sh on Séjour HEATING 19 AUTO
{"type":"Wed Feb 07 04:40:39 GMT 2024","desc":"uri=/basic-idu-control/general-control-command/28306","stackTrace":"INVALID_HUMIDITY","code":null}{"type":"Wed Feb 07 04:41:06 GMT 2024","desc":"uri=/basic-idu-control/general-control-command/28306","stackTrace":"INVALID_HUMIDITY","code":null}{"type":"Wed Feb 07 04:41:33 GMT 2024","desc":"uri=/basic-idu-control/general-control-command/28306","stackTrace":"INVALID_HUMIDITY","code":null}^C

la réponse a la commande de chauffe a 19 revient toute les 30sec et temps que je n'arrête pas la commande manuellement.

Je vous joins les commandes debug

➜  ~ sh /root/config/script/aircloud.sh websocatdebug 
{
  "notificationType": "ON_CONNECT",
  "data": [
    {
      "serialNumber": "XXXX-XXXX-XXXX",
      "iduFrostWashStatus": {
        "active": false,
        "priority": 8,
        "lastUpdatedAt": 0,
        "subCategory": null,
        "errorCode": null
      },
      "model": "HITACHI",
      "id": 28306,
      "vendorThingId": "JCH-********",
      "name": "Séjour",
      "roomTemperature": 19.0,
      "mode": "HEATING",
      "iduTemperature": 19.0,
      "humidity": 2147483647,
      "power": "OFF",
      "relativeTemperature": 0.0,
      "fanSpeed": "LV2",
      "fanSwing": "OFF",
      "updatedAt": 1707279977168,
      "specialOperationStatus": {
        "active": false,
        "priority": 7,
        "lastUpdatedAt": 0,
        "subCategory": null,
        "errorCode": null
      },
      "errorStatus": {
        "active": false,
        "priority": 4,
        "lastUpdatedAt": 0,
        "subCategory": "NO_ERROR",
        "errorCode": null
      },
      "lastOnlineUpdatedAt": 1706824123642,
      "scheduletype": "WEEKLY_TIMER_ENABLED",
      "modelTypeId": 174,
      "cloudId": "174_RAK-DJ50PHAE",
      "opt4": 0,
      "holidayModeStatus": {
        "active": false,
        "priority": 0,
        "lastUpdatedAt": 0,
        "subCategory": null,
        "errorCode": null
      },
      "online": true,
      "SysType": 1
    }
  ]
}

➜  ~ sh /root/config/script/aircloud.sh websocatdebug2
websocat: --ping-timeout specified without --ping-interval. This will probably lead to unconditional disconnection after that interval.
websocat: --ping-interval is currently not very effective without -E or -U
CONNECTED
version:1.2
heart-beat:10000,10000
user-name:User(id=******, email=*********@****.com, phoneNumber=null, password=null, softLockCount=0, lockUntil=null, detailsUserInfo=null, status=null, socialAccounts=[])

MESSAGE
destination:/notification/34996/34996
content-type:application/json;charset=UTF-8
subscription:4f8d3178-c573-11ee-9ce1-325096b39f47
message-id:0256c34d-a0aa-26e1-6897-aa1a1c503fbc-5219607
content-length:915

{"notificationType":"ON_CONNECT","data":[{"serialNumber":"XXXX-XXXX-XXXX","iduFrostWashStatus":{"active":false,"priority":8,"lastUpdatedAt":0,"subCategory":null,"errorCode":null},"model":"HITACHI","id":28306,"vendorThingId":"JCH-********","name":"Séjour","roomTemperature":19.0,"mode":"HEATING","iduTemperature":19.0,"humidity":2147483647,"power":"OFF","relativeTemperature":0.0,"fanSpeed":"LV2","fanSwing":"OFF","updatedAt":1707279409222,"specialOperationStatus":{"active":false,"priority":7,"lastUpdatedAt":0,"subCategory":null,"errorCode":null},"errorStatus":{"active":false,"priority":4,"lastUpdatedAt":0,"subCategory":"NO_ERROR","errorCode":null},"lastOnlineUpdatedAt":1706824123642,"scheduletype":"WEEKLY_TIMER_ENABLED","modelTypeId":174,"cloudId":"174_RAK-DJ50PHAE","opt4":0,"holidayModeStatus":{"active":false,"priority":0,"lastUpdatedAt":0,"subCategory":null,"errorCode":null},"online":true,"SysType":1}]}[WARN  websocat::ws_peer] Closing WebSocket connection due to ping timeout
➜  ~ 
pierreandre51 commented 9 months ago

Bonjour,

J'ai installé et je démarre les tests avec le script pris dans https://github.com/lb544/ha-aircloud/blob/develop/scripts/aircloud.sh J'ai rempli les variables de connexion et ajouté quelques traces avec echo.

Je lance le script : [core-ssh scripts]$ bash aircloud.sh on websocatdebug2 Traces : uuid= xxx-xxx-xxx-xxx token= null familyId= null cloudlds= {"timestamp":"2024-02-07T19:44:34.460+00:00","status":401,"error":"Unauthorized","message":"Error -> Unauthorized","path":"/ownership/groups/cloudIds/null"} Apres connectandsub on J'affiche les paramètres qui ont été passés (ici 2) websocatdebug2 roomID avant la boucle : j'affiche la variable avant la boucle roomID dans la boucle : j'affiche la variable dans la boucle roomID dans la boucle : roomID dans la boucle :

Cette variable est vide avant et dans la boucle d'où je sors par un CTRL C

J'ai l'impression que ce sont mes données de connexion (passées en clair) qui foirent
Ton avis ? merci

pierreandre51 commented 9 months ago

Je t'envoie le début du script avec mes variables et traces

!/bin/bash

login and password in base64

hitachiuser=$(echo "<replace with your Hitachi's account email in base64>" | base64 -d)

hitachipassword=$(echo "<replace with your Hitachi's account password in base64>" | base64 -d)

or in plain text

hitachiuser="xxxxx@gmail.com" hitachipassword="Jxxxxxx1" websocatbinary="/config/scripts/websocat.aarch64-unknown-linux-musl" wssairCloud="wss://notification-global-prod.aircloudhome.com/rac-notifications/websocket" pingtimeout="5"

logfile="/homeassistant/scripts/home-assistant.log"

uuid=$(curl -s https://www.uuidtools.com/api/generate/v1 | jq -r .[0]) echo "uuid= $uuid" 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 "https://api-global-prod.aircloudhome.com/iam/auth/sign-in" | jq -r .token) echo "token= $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 "https://api-global-prod.aircloudhome.com/iam/user/v2/who-am-i" | jq -r .familyId) echo "familyId= $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 "https://api-global-prod.aircloudhome.com/rac/ownership/groups/cloudIds/$familyId") echo "cloudlds= $cloudlds" 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 ) echo "Apres connectandsub" i=$(($#-1)) while [ $i -ge 0 ];do echo ${BASH_ARGV[$i]} i=$((i-1)) done if [ "$2" = "" ];then echo "Nom pac non renseigné" exit 0 else roomName=$2 roomId=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.name==\"$roomName\") | .id") echo "roomID avant la boucle : " $roomId while [ -z "$roomId" ] do

L indicateur -z renvoie vrai si la variable transmise est NULL ou non initialisée.

        roomId=$(echo $connectandsub | $websocatbinary -b --base64 --ping-timeout=$pingtimeout -q -n $wssairCloud | grep -a HITACHI | tr -d "\n" | jq -r ".data[] | select(.name==\"$roomName\") | .id")
        echo "roomID dans la boucle : " $roomId
        sleep 10
      done

fi