Integracja z pompą ciepła Kołton

Przed zakupem pompy ciepła skontaktowałem się z producentem jak wygląda mołżiwość integracji jego produktu z systemami automatyki domowej. Nie ma gotowej integracji ale producent sterownika pompy wystawia api w postaci json do swoich sterowników.  Opis api pod adresem https://emodul.eu/docs/api-v1.txt

Po rozpracowaniu api napisałem skrypt w bash-u w celu synchronizacji danych z pc do domoticz

 

 

pc

 

Wymagane jest doinstalowane w linuxie aplikacji bc i jq, np poleceniem apt install jq bc

Osoby posiadające dostęp do platormy emoduł.eu muszą w skrypcie podać dane logowania do platformy oraz udid urządzenia z którego chcą pobierać dane (szczególy w kodzie skryptu). Obecnie skrypt działa dobrzez pompą AirKompakt, acz po przeróbkach będzie też działał z innymi sterownikami firmy TECH.

Najtrudniejszym było ustalić które ID urządzenia odpowiada za którą daną wyświetlaną na stronie, niestety nie znalazłem opisu tych id wiec ręcznie wyszukiwałem po wartościach co jest co :D 

zapisz poniższy skrypt gdzies na dysku linuxa z domoticz np jako pc.sh, wpisz login i haslo, adres ip domoticza oraz id urzadzeń ktore chcesz pobierać i ustaw skrypt w cronie by sie wykonywal co 5 minut koniecznie jako bash,  bash pc.sh

moje ID urządzeń w domoticz, 6 temperatur i 2 energy usage:
devices

widoczne ID sa potem użyte w wywoływaniu funkcji zapisjącej dane do domoticz.

 

 

#!/bin/bash

#skrypt wymaga do dzialania zainstalowanych pakietow bc i jq  czyli basic calculator i json query.

# wpisz ponizej dane uzytkownika i haslo do emodułu linia autoryzacji i pobrania tokena pola user i pass
auth=`curl -s -i -X POST -H "Content-Type: application/json" -d '{"username": "user", "password": "pass"}' "https://emodul.eu/api/v1/authentication"`

auth=`echo "${auth//'"'}"`
user=`echo $auth|awk -F "user_id:" '{print $2}'`
user=`echo $user|awk -F "," '{print $1}'`

token=`echo $auth|awk -F "token:" '{print $2}'`
token=`echo $token|awk -F "}" '{print $1}'`

#listuj urzadzenia per dany user odremuj wszystko co poniżej do #lub

device=`curl -s -i -H "Content-Type: application/json" -H "Authorization: Bearer $token" "https://emodul.eu/api/v1/users/{$user}/modules"`
echo $device
device=`echo "${device//'"'}"`
udid=`echo $device|awk -F "udid:" '{print $2}'`
udid=`echo $udid|awk -F "}" '{print $1}'`
echo $udid

#lub podaj nr udid z strony www wycinając jak niżej
# https://emodul.eu/web/56d385598119c046e9589e691337fe34/home

#udid=56d385598119c046e9589e691337fe34

#wyciagnij dane dla urzadzenia
mu=`curl -s -H "Content-Type: application/json" -H "Authorization: Bearer $token" "https://emodul.eu/api/v1/users/{$user}/modules/{$udid}"`

#zamiana zwroconego jsona na linie z konkretnym urzadzeniem i jego parametrami
js=$(echo "$mu" | jq '.tiles[] | "\(.id),\(.params.txtId),\(.params.description),\(.params.value),\(.params.workingStatus),\(.params.widget1.value),\(.params.widget2.txtId),\(.params.widget2.value)"')

#funkcja do aktualizacji id w domoticz zmien ip serwera domoticz podmieniając 10.10.0.42 na swoje, pierwszy parametr do ID urzadzenia w domoticz drugi to wartość z danymi
updatedomo () { 
  url="http://10.10.0.42:8080/json.htm?type=command&param=udevice&idx="
  url+=$(echo $1)
  url+="&nvalue=0&svalue="
  url+=$(echo $2)
  curl -s -H "Accept: application/json" $url
}

#usuniecie znaku "
js=$(echo "${js//'"'}")


#echo "$js"  #jesli interesuja Cie wszystkie dane z pompy to odermuj ta linie i obejrzyj wynik. Nie udalo mi sie rozkodować wszystkich danych ktore id urzadzenia to ktory klocek na stronce zwłaszcza dla urządzeń universal i relay.

#wyciecie z wyniku danych dla ID 1020 czyli temperatury CWU oraz podzielenie wyniku przez 10 i wysłanie go funcją do domoticz na urzadzenie z ID 519 niżej kolejne urządzenia z domoticz
dwh=$(echo "$js"| grep 1020| awk -F "," '{print $4}')
dwh=$(echo "scale=2; $dwh/10" | bc)
#if [$dwh1 < $dwh]; then
if [[ "$dwh" == *"."* ]]; then 
updatedomo 519 $dwh
fi

out=$(echo "$js"| grep 1021| awk -F "," '{print $4}')
out=$(echo "scale=2; $out/10" | bc)
if [[ "$out" == *"."* ]]; then
updatedomo 520 $out
fi

aout=$(echo "$js"|grep 2225| awk -F "," '{print $4}')
aout=$(echo "scale=2; $aout/10" | bc)

bufup=$(echo "$js"|grep 1023| awk -F "," '{print $4}')
bufup=$(echo "scale=2; $bufup/10" | bc)
if [[ "$bufup" == *"."* ]]; then
updatedomo 521 $bufup
fi

bufdown=$(echo "$js"|grep 1024| awk -F "," '{print $4}')
bufdown=$(echo "scale=2; $bufdown/10" | bc)
if [[ "$bufdown" == *"."* ]]; then
updatedomo 522 $bufdown
fi

gas=$(echo "$js"|grep 1022| awk -F "," '{print $4}')
gas=$(echo "scale=2; $gas/10" | bc)

upsup=$(echo "$js"|grep 1028| awk -F "," '{print $4}')
upsup=$(echo "scale=2; $upsup/10" | bc)
if [[ "$upsup" == *"."* ]]; then
updatedomo 524 $upsup
fi

condensat=$(echo "$js"|grep 1551| awk -F "," '{print $4}')
condensat=$(echo "scale=2; $condensat/10" | bc)
upsupret=$(echo "$js"|grep 1027| awk -F "," '{print $4}')
upsupret=$(echo "scale=2; $upsupret/10" | bc)
oil=$(echo "$js"|grep 1029| awk -F "," '{print $4}')
oil=$(echo "scale=2; $oil/10" | bc)
epower=$(echo "$js"|grep 1562| awk -F "," '{print $8}')
epower=$(echo "scale=2; $epower*100" | bc)
updatedomo 525 $epower

hpower=$(echo "$js"|grep 1575| awk -F "," '{print $8}')
hpower=$(echo "scale=2; $hpower*100" | bc)
updatedomo 526 $hpower

cop=$(echo "$js"|grep 1590| awk -F "," '{print $8}')
cop=$(echo "scale=2; $cop/10" | bc)
if [[ "$cop" == *"."* ]]; then
updatedomo 527 $cop
fi


flow=$(echo "$js"|grep 1096| awk -F "," '{print $8}')
compoperate=$(echo "$js"|grep 1666 | awk -F "," '{print $8}')
compoperate=$(printf '%02d:%02d:%02d\n' $((compoperate/3600)) $((compoperate%3600/60)) $((compoperate%60)))
compstoptime=$(echo "$js"|grep 1668 | awk -F "," '{print $8}')
compstoptime=$(printf '%02d:%02d:%02d\n' $((compstoptime/3600)) $((compstoptime%3600/60)) $((compstoptime%60)))
lastdefrost=$(echo "$js"|grep 1664 | awk -F "," '{print $8}')
lastdefrost=$(printf '%02d:%02d:%02d\n' $((lastdefrost/3600)) $((lastdefrost%3600/60)) $((lastdefrost%60)))


bufset=$(echo "$js"|grep 1521| awk -F "," '{print $4}')
bufset=$(echo "scale=2; $bufset/10" | bc)
if [[ "$bufset" == *"."* ]]; then
updatedomo 523 $bufset
fi

uppersourcedelta=$(echo "$js"|grep 1538| awk -F "," '{print $4}')
uppersourcedelta=$(echo "scale=2; $uppersourcedelta/10" | bc)


comp=$(echo "$js"|grep 1007| awk -F "," '{print $5}')
traydef=$(echo "$js"|grep 1009| awk -F "," '{print $5}')


#evaporation temp id? = 3839

#wyswietlenie wszystkich urzadzen jako wynik skryptu
echo DWH $dwh
echo OUT $out
echo AOUT $aout
echo BUFFER UP $bufup
echo BUFFER DO $bufdown
echo GAS $gas
echo OIL $oil
echo UPPER SUPPLY $upsup
echo UPPER SUPPLY RET $upsupret
echo condensat $condensat
echo EPOWER $epower
echo HPOWER $hpower
echo COP $cop
echo bufset $bufset
echo flow $flow
echo uppersourcedelta $uppersourcedelta
#echo VALVE $valve
echo COMP $comp
echo traydefrost $traydef

echo compoperate $compoperate
echo compstoptime $compstoptime
echo lastdefrost $lastdefrost

 

 Na samym końcu skryptu jest listowanie wszystkich danych jakie udało mi się znaleść, chcesz jakies jeszcze wrzucac do domoticz to dorób konkretne urządzenia i skorzystaj z funkcji wysyłającej podając ich id i zmienną samej wartości.

Jak ktoś znajdzie które ID w urządzeniach TECH to zawór 3 drożny DWH/Bufor to dajcie znać, ja sie poddałem :D 


res