1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
| #!/bin/bash
# ------------------------------------------------------------------------------------------
# This script mimics the usage of the Home Wizard Lite app
# ------------------------------------------------------------------------------------------
# It needs three parameters:
# - the SmartSwitch you want to control, between quotes (exactly as named in the Home Wizard Lite app)
# - the device you want to control, between quotes (exactly as named in the Home Wizard Lite app)
# - the action you want to perform, between quotes
# Depending on the device you control, one of the following actions may apply:
# On, Off, Up, Down, Left, Right, Stop, Favorite, Pair, ManualMode, AutomaticMode, DayMode, NightMode, GetState, Range, Open, Close
# The fourth parameter is optional and indicates the time (in seconds) that the script will keep trying to perform the action.
# Example call: ./send_homewizard.sh "SmartSwitch1" "Controller1" "On" 60
# For learning purposes you can also use the script without parameters.
# ------------------------------------------------------------------------------------------
# You have to fill in your HomeWizard Lite username and the sha1-hash of your password between the quotes:
username="EMAIL"
password_sha1="WACHTWOORD" #can be generated on https://hash.online-convert.com/sha1-generator
# ------------------------------------------------------------------------------------------
# Checking the parameters
# -----------------------------------
searchswitch=$1 # e.g. SmartSwitch1
searchdevice=$2 # e.g. Controller1
doaction=$3 # On, Off, or one of the other applicable actions
timeout=$4 # in seconds (default 10)
if ! [[ "$timeout" =~ ^[0-9]+$ ]]; then timeout=10; fi
# Login to HomeWizard cloud
# -----------------------------------
login=$(curl -sS -u $username:$password_sha1 "https://cloud.homewizard.com/account/login")
#echo $login
if [[ ! "$(echo $login | jq -r '.status')" = "ok" ]]; then
echo -e "Login failed ... Did you enter correctly your username and password_sha1 in the script?\nExiting ..."
exit
fi
sessionid=$(echo $login | jq -r '.session')
#echo $sessionid
# Determining the plugid and deviceid
# -----------------------------------
alljson=$(curl -sS -H "X-Session-Token: $sessionid" "https://plug.homewizard.com/plugs")
#echo $alljson
plugid=$(echo $alljson | jq --arg ss $searchswitch -r '.[] | select(.name==$ss) | .id')
#echo $plugid
if [ "$plugid" = "" ]; then #plug not found -> choose from list
chosen="1"
plugnames=($(echo $alljson | jq -r '.[].name'))
#echo $plugnames
echo "SmartSwitch \"$searchswitch\" not found"
PS3="Please select a SmartSwitch or quit: "
select opt in "${plugnames[@]}" "quit"; do
if (( $REPLY <= ${#plugnames[@]} )); then
searchswitch=$opt
plugid=$(echo $alljson | jq --arg ss $searchswitch -r '.[] | select(.name==$ss) | .id')
break
fi
case $REPLY in
$(( ${#plugnames[@]}+1 )) ) echo "Goodbye!"; break;;
*) echo "Invalid option. Try another one.";continue;;
esac
done
#echo -e "$searchswitch not found ... Is the name exactly as in the app?\nExiting ..."
if [ "$plugid" = "" ]; then exit; fi
echo ""
fi
devices=$(echo $alljson | jq --arg ss $searchswitch '.[] | select(.name==$ss) | .devices')
#echo $devices
deviceid=$(echo $devices | jq --arg sd $searchdevice -r '.[] | select(.name==$sd) | .id')
#echo $deviceid
if [ "$deviceid" = "" ]; then #device not found -> choose from list
chosen="1"
devicenames=($(echo $devices | jq -r '.[].name'))
#echo $devicenames
echo "Device \"$searchdevice\" not found"
PS3="Please select a device or quit: "
select opt in "${devicenames[@]}" "quit"; do
if (( $REPLY <= ${#devicenames[@]} )); then
searchdevice=$opt
deviceid=$(echo $devices | jq --arg sd $searchdevice -r '.[] | select(.name==$sd) | .id')
break
fi
case $REPLY in
$(( ${#devicenames[@]}+1 )) ) echo "Goodbye!"; break;;
*) echo "Invalid option. Try another one.";continue;;
esac
done
#echo -e "$searchdevice not found ... Is the name exactly as in the app?\nExiting ..."
if [ "$deviceid" = "" ]; then exit; fi
echo ""
fi
actions="On, Off, Up, Down, Left, Right, Stop, Favorite, Pair, ManualMode, AutomaticMode, DayMode, NightMode, GetState, Range, Open, Close"
if [[ ! ", $actions, " = *", $doaction, "* ]]; then #action not found -> choose from list
chosen="1"
echo "Action not in list (not all may apply)"
PS3="Please select an action or quit: "
actionlist=($( echo $actions | tr ", " " " ))
select opt in "${actionlist[@]}" "quit"; do
if (( $REPLY <= ${#actionlist[@]} )); then
doaction=$opt
break
fi
case $REPLY in
$(( ${#actionlist[@]}+1 )) ) echo "Goodbye!"; break;;
*) echo "Invalid option. Try another one.";continue;;
esac
done
if [[ ! ", $actions, " = *", $doaction, "* ]]; then exit; fi
echo ""
fi
if [[ "$chosen" = "1" ]]; then
echo "Next time you may use the following command line with parameters:"
echo "${0} \"$searchswitch\" \"$searchdevice\" \"$doaction\" $4"
echo ""
fi
# Sending the action
# -----------------------------------
echo "Sending {"$searchswitch", "$searchdevice", "$doaction"} during max. "$timeout" seconds ..."
startsec=$SECONDS
#echo $startsec
endsec=$(($startsec+$timeout))
#echo $endsec
while [ $SECONDS -lt $endsec ] ; do
status=$(curl -sS -H "X-Session-Token: $sessionid" -H "Content-Type: application/json; charset=utf-8" -X POST -d '{"action": "'$doaction'"}' 'https://plug.homewizard.com/plugs/'$plugid'/devices/'$deviceid'/action')
echo $status
if [[ "$status" =~ "{\"status\":\"Success\"" ]]; then
success="1"
break
fi
done
# if [[ ! "$success" = "1" ]]; then
# printf "To:root\nFrom:pi\nSubject:HomeWizard-actie niet succesvol\n\nDe HomeWizard-actie {$searchswitch, $searchdevice, $doaction} kon niet verzonden worden met de volgende foutmelding:\n $status" | sendmail -t
# fi |