summaryrefslogtreecommitdiff
path: root/script/uactivity/activity/#20-switch_tv_light
blob: 8f1c13c9266ce49dcbc247b81649a950ca44b405 (plain)
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
137
#!/bin/sh

set -u
set -e

# Your Settings
#
SWITCH_ON_CMD="touch /tmp/tv_light"
SWITCH_OFF_CMD="rm -f /tmp/tv_light"
USE_DAYLIGHT="yes"
LATITUDE="52.000000"
LONGITUDE="11.000000"
# http://search.cpan.org/~rkhill/DateTime-Event-Sunrise-0.0501/lib/DateTime/Event/Sunrise.pm#METHODS
ALTITUDE="-0.833"
#
# End of user config
# apt-get install libdatetime-event-sunrise-perl



JOB_ID_DIR="${4}/activity/$(basename ${0}).data"
JOB_ID_FILE="${JOB_ID_DIR}/jobid"



daylight(){
  export LATITUDE
  export LONGITUDE
  export ALTITUDE

sunsetsunrise="$(perl <<'EOF' 2> /dev/null
  use DateTime;
  use DateTime::Event::Sunrise;
  use DateTime::Format::Strptime;

  my $latitude = $ENV{'LATITUDE'};
  my $longitude = $ENV{'LONGITUDE'};
  my $altitude = $ENV{'ALTITUDE'};

  my $sunrise = DateTime::Event::Sunrise ->sunrise (longitude => $longitude, latitude => $latitude, altitude => $altitude, iteration => '1');
  my $sunset = DateTime::Event::Sunrise ->sunset (longitude => $longitude, latitude => $latitude, altitude => $altitude, iteration => '1');

  my $strp = DateTime::Format::Strptime->new(pattern => '%H:%M %Y-%m-%d');
  my $day_set = DateTime::SpanSet->from_sets(start_set => $sunrise, end_set => $sunset);
  if ($day_set->contains(DateTime->now())) {
    print $strp->format_datetime($sunset->next(DateTime->now(time_zone=>'local')));
    exit 1;
  } else {
    print $strp->format_datetime($sunrise->next(DateTime->now(time_zone=>'local')));
    exit 0;
  }
EOF
)"

  err=$?

  [ -z "${sunsetsunrise}" ] && return 2

  if [ ${err} = 0 ]; then
    echo "${sunsetsunrise}"
    return 0
  elif [ ${err} = 1 ]; then
    echo "${sunsetsunrise}"
    return 1
  else
    return 2
  fi
}



delete_job(){
  if [ -f "${JOB_ID_FILE}" ]; then
    JOB_ID="$(cat ${JOB_ID_FILE})"
    atrm ${JOB_ID} 2> /dev/null
    rm -f "${JOB_ID_FILE}"
  fi
}



create_job(){
  JOB_ID_TMP="$(echo "rm -f "${JOB_ID_FILE}"; ${1}" | at ${2} 2>&1)"
  JOB_ID="$(echo "${JOB_ID_TMP}" | tr -d '\n' | sed 's/^.*job \([0-9]*\).*$/\1/')"
  mkdir -p "${JOB_ID_DIR}"
  echo "${JOB_ID}" > ${JOB_ID_FILE}
}



switch_tv_light(){
  if [ "${1}" = "on" ]; then
    if [ "${USE_DAYLIGHT}" = "yes" ]; then
      delete_job
      sunsetsunrise="$(daylight)" && light=0 || light=$?
      if [ "${light}" = "1" ]; then
        # daylight now, shedule "light on" for later
        create_job "${SWITCH_ON_CMD}" "${sunsetsunrise}"
      elif [ "${light}" = "0" ]; then
        eval ${SWITCH_ON_CMD}
        # no daylight now, shedule "light off" for later
        create_job "${SWITCH_OFF_CMD}" "${sunsetsunrise}"
      else
        # Some error
        eval ${SWITCH_OFF_CMD}
      fi
    else
      eval ${SWITCH_ON_CMD}
    fi
  else
    [ "${USE_DAYLIGHT}" = "yes" ] && delete_job
    eval ${SWITCH_OFF_CMD}
  fi
}



case "${1}" in
  startup)
    delete_job
  ;;
  started)
    [ "${2}" = "true" ] && switch_tv_light on
  ;;
  shutdown)
    switch_tv_light off
  ;;
  running)
    if [ "${2}" = "true" ]; then
      switch_tv_light on
    else
      switch_tv_light off
    fi
  ;;
esac

exit 0