mswitch abstract
[svn42.git] / raspberrypi_gpio_relay_licht / mswitch.cgi
index dbfc79a..08d1bcd 100755 (executable)
@@ -1,16 +1,28 @@
-#!/bin/sh
+#!/bin/zsh
 
-VALID_ONOFF_IDS="4 17 18 21 22 23"
+VALID_ONOFF_IDS=(ceiling1 ceiling2 ceiling3 ceiling4 ceiling5 ceiling6)
+VALID_GPIO_IDS=(4 23 18 17 22 21)
+local -A IDGPIOMAP
+local -A GPIOIDMAP
+IDGPIOMAP[ceiling1]=4
+IDGPIOMAP[ceiling2]=23
+IDGPIOMAP[ceiling3]=18
+IDGPIOMAP[ceiling4]=17
+IDGPIOMAP[ceiling5]=22
+IDGPIOMAP[ceiling6]=21
 GPIOPATH=/sys/class/gpio/gpio
 
+for k v in ${(kv)IDGPIOMAP}; do
+  GPIOIDMAP[$v]=$k
+done
+
+local -A GPIOS
 for QUERY in `echo $QUERY_STRING | tr '&' ' '`; do
   for VALIDID in $VALID_ONOFF_IDS; do
     if [ "$QUERY" = "$VALIDID=1" ]; then
-      eval "GPIO_$VALIDID"=1
+      GPIOS[$IDGPIOMAP[$VALIDID]]=1
     elif [ "$QUERY" = "$VALIDID=0" ]; then
-      eval "GPIO_$VALIDID=0"
-    elif [ "$QUERY" = "$VALIDID=q" ]; then
-      eval "GPIO_$VALIDID=q"
+      GPIOS[$IDGPIOMAP[$VALIDID]]=0
     fi
   done
   if [ "$QUERY" = "mobile=1" ]; then
@@ -23,8 +35,9 @@ done
 
 
 print_gpio_state() {
-  GPIOVALUE=$(cat "${GPIOPATH}${1}/value")
-  if [ "$GPIOVALUE" = "0" ]; then
+  GPIO=${IDGPIOMAP[$1]}
+  GPIOVALUE=$(cat "${GPIOPATH}${GPIO}/value")
+  if [[ $GPIOVALUE == "0" ]]; then
     echo -n "true"
   else
     echo -n "false"
@@ -32,31 +45,25 @@ print_gpio_state() {
 }
 
 gpio_is_on() {
-  GPIOVALUE=$(cat "${GPIOPATH}${1}/value")
+  GPIO=${IDGPIOMAP[$1]}
+  GPIOVALUE=$(cat "${GPIOPATH}${GPIO}/value")
   [ "$GPIOVALUE" = "0" ]
 }
 
 echo "Content-type: text/html"
 echo ""
 
-echo "{"
+local -a GPIOSTATES
 for CHECKID in $VALID_ONOFF_IDS; do
-  VAL=""
-  VAL="$(eval echo \$GPIO_$CHECKID)"
-  [ -z $VAL ] && continue
-  if [ $VAL = 1 -o $VAL = 0 ]; then
-    [ $VAL = 1 ] && VAL=0 || VAL=1
-    echo "$VAL" > "${GPIOPATH}${CHECKID}/value"
+  VAL=$GPIOS[$IDGPIOMAP[$CHECKID]]
+  if [[ $VAL == 1 || $VAL == 0 ]]; then
+    [[ $VAL == 1 ]] && VAL=0 || VAL=1
+    echo "$VAL" > "${GPIOPATH}${IDGPIOMAP[$CHECKID]}/value"
   fi
-  echo -n "\"$CHECKID\":"
-  print_gpio_state $CHECKID
-  echo ","
+  GPIOSTATES+=(\"${CHECKID}\":"$(print_gpio_state $CHECKID)")
 done
-echo "\"-1\":false}"
-#      echo "<html>"
-#      echo "<head>"
-#      echo "<title>Realraum Relay Switch</title>"
-#      echo '<script type="text/javascript">window.location="/cgi-bin/switch.cgi";</script>'
-#      echo "</head></html>"
-#      exit 0
-
+JSON_STATE="{${(j:,:)GPIOSTATES}}"
+print ${(q)JSON_STATE}
+if ((#GPIOS > 0)); then
+  print "[$(date +%s),\"$REMOTE_ADDR\",${(q)JSON_STATE}]," >> /var/log/licht/mswitch.log
+fi