From 4ee2501ff864b8e15202ee814e8bafcc0c2adf6c Mon Sep 17 00:00:00 2001 From: Christian Pointner <equinox@realraum.at> Date: Tue, 24 Feb 2015 02:32:10 +0000 Subject: [PATCH] moved raspberry and router gpio to pi_as_powerwitch on github --- raspberrypi_gpio_relay_licht/index.html | 218 -------------- raspberrypi_gpio_relay_licht/indexz.html | 218 -------------- raspberrypi_gpio_relay_licht/move_lights.sh | 2 - raspberrypi_gpio_relay_licht/rc.local | 41 --- raspberrypi_gpio_relay_licht/realraumsimpel.png | Bin 10572 -> 0 bytes raspberrypi_gpio_relay_licht/realraumsimpelz.png | Bin 17426 -> 0 bytes raspberrypi_gpio_relay_licht/stuff.py | 348 ---------------------- raspberrypi_gpio_relay_licht/style.css | 70 ----- raspberrypi_gpio_relay_licht/stylez.css | 70 ----- raspberrypi_gpio_relay_licht/switch.html | 5 - router_gpio_relay_licht/mswitch.cgi | 60 ---- router_gpio_relay_licht/rc.local | 14 - router_gpio_relay_licht/switch.cgi | 248 --------------- 13 files changed, 1294 deletions(-) delete mode 100644 raspberrypi_gpio_relay_licht/index.html delete mode 100755 raspberrypi_gpio_relay_licht/indexz.html delete mode 100644 raspberrypi_gpio_relay_licht/move_lights.sh delete mode 100644 raspberrypi_gpio_relay_licht/rc.local delete mode 100755 raspberrypi_gpio_relay_licht/realraumsimpel.png delete mode 100755 raspberrypi_gpio_relay_licht/realraumsimpelz.png delete mode 100755 raspberrypi_gpio_relay_licht/stuff.py delete mode 100755 raspberrypi_gpio_relay_licht/style.css delete mode 100755 raspberrypi_gpio_relay_licht/stylez.css delete mode 100644 raspberrypi_gpio_relay_licht/switch.html delete mode 100755 router_gpio_relay_licht/mswitch.cgi delete mode 100644 router_gpio_relay_licht/rc.local delete mode 100755 router_gpio_relay_licht/switch.cgi diff --git a/raspberrypi_gpio_relay_licht/index.html b/raspberrypi_gpio_relay_licht/index.html deleted file mode 100644 index 55f7c1b..0000000 --- a/raspberrypi_gpio_relay_licht/index.html +++ /dev/null @@ -1,218 +0,0 @@ -<html> -<head> -<link rel="stylesheet" type="text/css" href="style.css"> -</head> - - - -<script type="text/javascript"> - - var pc1_state=false; - var pc2_state=false; - var pc3_state=false; - var pc4_state=false; - var pc5_state=false; - var pc6_state=false; - -function callBackButtons(req) -{ - if(req.status != 200) - { - return; - } - - - var data = JSON.parse(req.responseText); - - if(data['ceiling1']==true) - { - pc1_state=true; - document.getElementById("pc1").style.background="green"; - } - else - { - pc1_state=false; - document.getElementById("pc1").style.background="red"; - } - - - if(data['ceiling2']==true) - { - pc2_state=true; - document.getElementById("pc2").style.background="green"; - } - else - { - pc2_state=false; - document.getElementById("pc2").style.background="red"; - } - - if(data['ceiling3']==true) - { - pc3_state=true; - document.getElementById("pc3").style.background="green"; - } - else - { - pc3_state=false; - document.getElementById("pc3").style.background="red"; - } - - - if(data['ceiling4']==true) - { - pc4_state=true; - document.getElementById("pc4").style.background="green"; - } - else - { - pc4_state=false; - document.getElementById("pc4").style.background="red"; - } - - - if(data['ceiling5']==true) - { - pc5_state=true; - document.getElementById("pc5").style.background="green"; - } - else - { - pc5_state=false; - document.getElementById("pc5").style.background="red"; - } - - if(data['ceiling6']==true) - { - pc6_state=true; - document.getElementById("pc6").style.background="green"; - } - else - { - pc6_state=false; - document.getElementById("pc6").style.background="red"; - } -} - -function updateButtons(uri) { - var req = new XMLHttpRequest; - req.overrideMimeType("application/json"); - req.open("GET", uri, true); - req.onload = function() {callBackButtons(req)}; - req.setRequestHeader("googlechromefix",""); - req.send(null); -} -function sendMultiButton( str ) { - url = "/cgi-bin/mswitch.cgi?"+str; - updateButtons(url); -} - - -//function pc(n) switches light n - -function pc1() -{ - if(pc1_state===true) - { - pc1_state=false; - sendMultiButton("ceiling1=0") - document.getElementById("pc1").style.background="red"; - } - else - { - pc1_state=true; - sendMultiButton("ceiling1=1") - document.getElementById("pc1").style.background="green"; - } -} -function pc2() -{ - if(pc2_state===true) - { - pc2_state=false; - sendMultiButton("ceiling2=0") - document.getElementById("pc2").style.background="red"; - } - else - { - pc2_state=true; - sendMultiButton("ceiling2=1") - document.getElementById("pc2").style.background="green"; - } -} -function pc3() -{ - if(pc3_state===true) - { - pc3_state=false; - sendMultiButton("ceiling3=0") - document.getElementById("pc3").style.background="red"; - } - else - { - pc3_state=true; - sendMultiButton("ceiling3=1") - document.getElementById("pc3").style.background="green"; - } -} -function pc4() -{ - if(pc4_state===true) - { - pc4_state=false; - sendMultiButton("ceiling4=0") - document.getElementById("pc4").style.background="red"; - } - else - { - pc4_state=true; - sendMultiButton("ceiling4=1") - document.getElementById("pc4").style.background="green"; - } -} -function pc5() -{ - if(pc5_state===true) - { - pc5_state=false; - sendMultiButton("ceiling5=0") - document.getElementById("pc5").style.background="red"; - } - else - { - pc5_state=true; - sendMultiButton("ceiling5=1") - document.getElementById("pc5").style.background="green"; - } -} - -function pc6() -{ - if(pc6_state===true) - { - pc6_state=false; - sendMultiButton("ceiling6=0") - document.getElementById("pc6").style.background="red"; - } - else - { - pc6_state=true; - sendMultiButton("ceiling6=1") - document.getElementById("pc6").style.background="green"; - } -} - -setInterval("updateButtons('/cgi-bin/mswitch.cgi');", 30*100 ); -updateButtons("/cgi-bin/mswitch.cgi"); -</script> - -<body> -<div style="position:absolute; top:640px;"><a href="switch.html">Link to ALL switches</a></div> -<div class="pc1" id="pc1" onclick="pc1()"></div> -<div class="pc2" id="pc2" onclick="pc2()"></div> -<div class="pc3" id="pc3" onclick="pc3()"></div> -<div class="pc4" id="pc4" onclick="pc4()"></div> -<div class="pc5" id="pc5" onclick="pc5()"></div> -<div class="pc6" id="pc6" onclick="pc6()"></div> -</body> -</html> diff --git a/raspberrypi_gpio_relay_licht/indexz.html b/raspberrypi_gpio_relay_licht/indexz.html deleted file mode 100755 index fa03ef3..0000000 --- a/raspberrypi_gpio_relay_licht/indexz.html +++ /dev/null @@ -1,218 +0,0 @@ -<html> -<head> -<link rel="stylesheet" type="text/css" href="stylez.css"> -</head> - - - -<script type="text/javascript"> - - var pc1_state=false; - var pc2_state=false; - var pc3_state=false; - var pc4_state=false; - var pc5_state=false; - var pc6_state=false; - -function callBackButtons(req) -{ - if(req.status != 200) - { - return; - } - - - var data = JSON.parse(req.responseText); - - if(data['ceiling1']==true) - { - pc1_state=true; - document.getElementById("pc1").style.background="green"; - } - else - { - pc1_state=false; - document.getElementById("pc1").style.background="red"; - } - - - if(data['ceiling2']==true) - { - pc2_state=true; - document.getElementById("pc2").style.background="green"; - } - else - { - pc2_state=false; - document.getElementById("pc2").style.background="red"; - } - - if(data['ceiling3']==true) - { - pc3_state=true; - document.getElementById("pc3").style.background="green"; - } - else - { - pc3_state=false; - document.getElementById("pc3").style.background="red"; - } - - - if(data['ceiling4']==true) - { - pc4_state=true; - document.getElementById("pc4").style.background="green"; - } - else - { - pc4_state=false; - document.getElementById("pc4").style.background="red"; - } - - - if(data['ceiling5']==true) - { - pc5_state=true; - document.getElementById("pc5").style.background="green"; - } - else - { - pc5_state=false; - document.getElementById("pc5").style.background="red"; - } - - if(data['ceiling6']==true) - { - pc6_state=true; - document.getElementById("pc6").style.background="green"; - } - else - { - pc6_state=false; - document.getElementById("pc6").style.background="red"; - } -} - -function updateButtons(uri) { - var req = new XMLHttpRequest; - req.overrideMimeType("application/json"); - req.open("GET", uri, true); - req.onload = function() {callBackButtons(req)}; - req.setRequestHeader("googlechromefix",""); - req.send(null); -} -function sendMultiButton( str ) { - url = "/cgi-bin/mswitch.cgi?"+str; - updateButtons(url); -} - - -//function pc(n) switches light n - -function pc1() -{ - if(pc1_state===true) - { - pc1_state=false; - sendMultiButton("ceiling1=0") - document.getElementById("pc1").style.background="red"; - } - else - { - pc1_state=true; - sendMultiButton("ceiling1=1") - document.getElementById("pc1").style.background="green"; - } -} -function pc2() -{ - if(pc2_state===true) - { - pc2_state=false; - sendMultiButton("ceiling2=0") - document.getElementById("pc2").style.background="red"; - } - else - { - pc2_state=true; - sendMultiButton("ceiling2=1") - document.getElementById("pc2").style.background="green"; - } -} -function pc3() -{ - if(pc3_state===true) - { - pc3_state=false; - sendMultiButton("ceiling3=0") - document.getElementById("pc3").style.background="red"; - } - else - { - pc3_state=true; - sendMultiButton("ceiling3=1") - document.getElementById("pc3").style.background="green"; - } -} -function pc4() -{ - if(pc4_state===true) - { - pc4_state=false; - sendMultiButton("ceiling4=0") - document.getElementById("pc4").style.background="red"; - } - else - { - pc4_state=true; - sendMultiButton("ceiling4=1") - document.getElementById("pc4").style.background="green"; - } -} -function pc5() -{ - if(pc5_state===true) - { - pc5_state=false; - sendMultiButton("ceiling5=0") - document.getElementById("pc5").style.background="red"; - } - else - { - pc5_state=true; - sendMultiButton("ceiling5=1") - document.getElementById("pc5").style.background="green"; - } -} - -function pc6() -{ - if(pc6_state===true) - { - pc6_state=false; - sendMultiButton("ceiling6=0") - document.getElementById("pc6").style.background="red"; - } - else - { - pc6_state=true; - sendMultiButton("ceiling6=1") - document.getElementById("pc6").style.background="green"; - } -} - -setInterval("updateButtons('/cgi-bin/mswitch.cgi');", 30*100 ); -updateButtons("/cgi-bin/mswitch.cgi"); -</script> - -<body> -<div class="pc1" id="pc1" onclick="pc1()"></div> -<div class="pc2" id="pc2" onclick="pc2()"></div> -<div class="pc3" id="pc3" onclick="pc3()"></div> -<div class="pc4" id="pc4" onclick="pc4()"></div> -<div class="pc5" id="pc5" onclick="pc5()"></div> -<div class="pc6" id="pc6" onclick="pc6()"></div> - -</body> -</html> diff --git a/raspberrypi_gpio_relay_licht/move_lights.sh b/raspberrypi_gpio_relay_licht/move_lights.sh deleted file mode 100644 index cf7b075..0000000 --- a/raspberrypi_gpio_relay_licht/move_lights.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=1&ceiling2=0&ceiling3=0&ceiling4=0&ceiling5=0&ceiling6=0'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=1&ceiling2=1&ceiling3=0&ceiling4=0&ceiling5=0&ceiling6=0'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=1&ceiling3=0&ceiling4=1&ceiling5=0&ceiling6=0'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=1&ceiling4=1&ceiling5=0&ceiling6=0'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=1&ceiling4=0&ceiling5=1&ceiling6=0'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=0&ceiling4=0&ceiling5=1&ceiling6=1'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=0&ceiling4=0&ceiling5=0&ceiling6=1'; sleep 3; curl 'http://licht.realraum.at/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=0&ceiling4=0&ceiling5=0&ceiling6=0'; diff --git a/raspberrypi_gpio_relay_licht/rc.local b/raspberrypi_gpio_relay_licht/rc.local deleted file mode 100644 index 33672c7..0000000 --- a/raspberrypi_gpio_relay_licht/rc.local +++ /dev/null @@ -1,41 +0,0 @@ -#! /bin/sh -### BEGIN INIT INFO -# Provides: rc.local -# Required-Start: $all -# Required-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: Run /etc/rc.local if it exist -### END INIT INFO - - -PATH=/sbin:/usr/sbin:/bin:/usr/bin - -. /lib/init/vars.sh -. /lib/lsb/init-functions - -do_start() { - if [ -x /etc/rc.local ]; then - [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)" - /etc/rc.local - ES=$? - [ "$VERBOSE" != no ] && log_end_msg $ES - return $ES - fi -} - -case "$1" in - start) - do_start - ;; - restart|reload|force-reload) - echo "Error: argument '$1' not supported" >&2 - exit 3 - ;; - stop) - ;; - *) - echo "Usage: $0 start|stop" >&2 - exit 3 - ;; -esac diff --git a/raspberrypi_gpio_relay_licht/realraumsimpel.png b/raspberrypi_gpio_relay_licht/realraumsimpel.png deleted file mode 100755 index 0b9cbb1507d619a1a7806177fb2994ac3bfa5135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10572 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 V3MXsqK@39_WmRwI{`T;X{{lCj?Z^NC diff --git a/raspberrypi_gpio_relay_licht/realraumsimpelz.png b/raspberrypi_gpio_relay_licht/realraumsimpelz.png deleted file mode 100755 index 38e29040c48ede1d3f3e0f5ce579f332d0d21561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17426 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⪙9)%0LuKNKIXb!ChTlGtlssRTz<+EC7f9{T^6vxXvsmc<1h2mK_P; zg8?^X6tencXlOVxIhhYMb&;Idzf2KAb&azDO%Tx|6rjKt3n1g$OiXy3BN^xj(qh&Q zFaR?uKneE$j7$n?47U~Q;6f4B4SFVO-+vW6gYQ>6-6bXH4ROx@p7=N893Pq?GANxc zXJP+1$cxAsX=O8=u~}@?RKm{e`Sjj(Pfw(~XVv~m_1NlVz5P3+|7tJsqrA#$2tMl~ zj4u+>&=#&apmot#>TN<6{N!M;Mo`aEeS6?N#iwbWH4@@*ZpNT}lmDm>h|Ga%_5a~3 zEGSji3BXr3fNrrwXZhqz88Q0pr<Oz?)L+slpdZi7AIwPslLA4MG!#o-yb1jugY|+Y diff --git a/raspberrypi_gpio_relay_licht/stuff.py b/raspberrypi_gpio_relay_licht/stuff.py deleted file mode 100755 index 689c345..0000000 --- a/raspberrypi_gpio_relay_licht/stuff.py +++ /dev/null @@ -1,348 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import os -import os.path -import sys -#import threading -import logging -import logging.handlers -import time -import signal -import subprocess -import types -import ConfigParser -import traceback -import random -import zmq -import zmq.utils.jsonapi as json -import urllib -import ephem - -logger = logging.getLogger() -logger.setLevel(logging.INFO) -lh_syslog = logging.handlers.SysLogHandler(address="/dev/log",facility=logging.handlers.SysLogHandler.LOG_LOCAL2) -lh_syslog.setFormatter(logging.Formatter('play-sound-status.py: %(levelname)s %(message)s')) -logger.addHandler(lh_syslog) -lh_stderr = logging.StreamHandler() -logger.addHandler(lh_stderr) - -def isTheSunDown(): - ephemobs=ephem.Observer() - ephemobs.lat='47.06' - ephemobs.lon='15.45' - ephemsun=ephem.Sun() - ephemsun.compute() - return ephemobs.date > ephemobs.previous_setting(ephemsun) and ephemobs.date < ephemobs.next_rising(ephemsun) - - -class UWSConfig: - def __init__(self,configfile=None): - self.configfile=configfile - self.config_parser=ConfigParser.ConfigParser() - #make option variable names case sensitive - self.config_parser.optionxform = str - self.config_parser.add_section('debug') - self.config_parser.set('debug','enabled',"False") - self.config_parser.add_section('broker') - self.config_parser.set('broker','uri',"tcp://torwaechter.realraum.at:4244") - self.config_parser.add_section('tracker') - self.config_parser.set('tracker','secs_movement_before_presence_to_launch_event','1') - self.config_parser.set('tracker','secs_presence_before_movement_to_launch_event','120') - self.config_mtime=0 - if not self.configfile is None: - try: - cf_handle = open(self.configfile,"r") - cf_handle.close() - except IOError: - self.writeConfigFile() - else: - self.checkConfigUpdates() - - def checkConfigUpdates(self): - global logger - if self.configfile is None: - return - logging.debug("Checking Configfile mtime: "+self.configfile) - try: - mtime = os.path.getmtime(self.configfile) - except (IOError,OSError): - return - if self.config_mtime < mtime: - logging.debug("Reading Configfile") - try: - self.config_parser.read(self.configfile) - self.config_mtime=os.path.getmtime(self.configfile) - except (ConfigParser.ParsingError, IOError), pe_ex: - logging.error("Error parsing Configfile: "+str(pe_ex)) - if self.config_parser.get('debug','enabled') == "True": - logger.setLevel(logging.DEBUG) - else: - logger.setLevel(logging.INFO) - - def writeConfigFile(self): - if self.configfile is None: - return - logging.debug("Writing Configfile "+self.configfile) - try: - cf_handle = open(self.configfile,"w") - self.config_parser.write(cf_handle) - cf_handle.close() - self.config_mtime=os.path.getmtime(self.configfile) - except IOError, io_ex: - logging.error("Error writing Configfile: "+str(io_ex)) - self.configfile=None - - def getValue(self, name): - underscore_pos=name.find('_') - if underscore_pos < 0: - raise AttributeError - return self.getSectionValue(name[0:underscore_pos], name[underscore_pos+1:]) - - def getSectionValue(self, section, name): - try: - return self.config_parser.get(section,name) - except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): - return None - - def __getattr__(self, name): - underscore_pos=name.find('_') - if underscore_pos < 0: - raise AttributeError - try: - return self.config_parser.get(name[0:underscore_pos], name[underscore_pos+1:]) - except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): - raise AttributeError - - -def runRandomAction(action_list,user,args=[]): - if not type(action_list) == types.ListType: - raise ValueError("runRandomAction: action_list must be a list") - return executeAction(random.choice(action_list),user,args) - -def runRemoteCommand(remote_host,remote_shell,user,args=[]): - global sshp,uwscfg - sshp = None - try: - cmd = "ssh -i /flash/tuer/id_rsa -o PasswordAuthentication=no -o StrictHostKeyChecking=no %RHOST% %RSHELL%" - cmd = cmd.replace("%RHOST%",remote_host).replace("%RSHELL%",remote_shell).replace("%ARG%", " ".join(args)).replace("%USER%", user) - logging.debug("runRemoteCommand: Executing: "+cmd) - sshp = subprocess.Popen(cmd.split(" "), bufsize=1024, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False) - logging.debug("runRemoteCommand: pid %d: running=%d" % (sshp.pid,sshp.poll() is None)) - if not sshp.poll() is None: - logging.error("runRemoteCommand: subprocess %d not started ?, returncode: %d" % (sshp.pid,sshp.returncode)) - return False - return True - except Exception, ex: - logging.error("runRemoteCommand: "+str(ex)) - traceback.print_exc(file=sys.stdout) - if not sshp is None and sshp.poll() is None: - if sys.hexversion >= 0x020600F0: - sshp.terminate() - else: - subprocess.call(["kill",str(sshp.pid)]) - time.sleep(1.5) - if sshp.poll() is None: - logging.error("runRemoteCommand: subprocess still alive, sending SIGKILL to pid %d" % (sshp.pid)) - if sys.hexversion >= 0x020600F0: - sshp.kill() - else: - subprocess.call(["kill","-9",str(sshp.pid)]) - time.sleep(5) - return False - -def runShellCommand(cmd,ptimeout,stdinput,user,args=[]): - global uwscfg - cmd = cmd.replace("%ARG%"," ".join(args)).replace("%USER%", user) - if ptimeout is None or float(ptimeout) > 45: - ptimeout = 45 - else: - ptimeout = int(float(ptimeout)) - popenTimeout2(cmd,stdinput,ptimeout=ptimeout) - -def executeAction(action_name, user, args=[]): - if action_name is None: - logging.error("executeAction: action_name is None") - return False - action_type = uwscfg.getValue(action_name+"_type") - if action_type is None: - logging.error("executeAction: action %s not found or has no type" % action_name) - return False - action_delay=uwscfg.getValue(action_name+"_delay") - logging.info("executeAction %s of type %s for user %s with delay %s" % (action_name,action_type,user,action_delay)) - if not action_delay is None: - time.sleep(float(action_delay)) - - action_arg = uwscfg.getValue(action_name+"_arg") - if not action_arg is None: - args += [action_arg] - - #"registered" actions - if action_type == "remotecmd": - return runRemoteCommand(uwscfg.getSectionValue(action_name,"remote_host"), uwscfg.getSectionValue(action_name,"remote_shell"), user=user, args=args) - elif action_type == "shellcmd": - return runShellCommand(cmd=uwscfg.getSectionValue(action_name,"cmd"), ptimeout=uwscfg.getSectionValue(action_name,"timeout"), stdinput=uwscfg.getSectionValue(action_name,"stdinput"), user=user, args=args) - elif action_type == "nothing": - return True - elif action_type == "random": - return runRandomAction(action_list=uwscfg.getSectionValue(action_name,"one_of").split(" "),user=user,args=args) - else: - return executeAction(action_type,user=user,args=args) - -def playThemeOf(user,fallback_default): - global uwscfg - uwscfg.checkConfigUpdates() - if user is None: - user = "" - config=uwscfg.getValue("mapping_"+str(user)) - if config is None: - config=uwscfg.getValue("mapping_"+str(fallback_default)) - logging.debug("playThemeOf: action for user %s: %s" % (user,config)) - executeAction(config,user,[]) - -def popenTimeout1(cmd, pinput, returncode_ok=[0], ptimeout = 20.0, pcheckint = 0.25): - logging.debug("popenTimeout1: starting: " + cmd) - try: - sppoo = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True) - sppoo.communicate(input=pinput) - timeout_counter=ptimeout - while timeout_counter > 0: - time.sleep(pcheckint) - timeout_counter -= pcheckint - if not sppoo.poll() is None: - logging.debug("popenTimeout1: subprocess %d finished, returncode: %d" % (sppoo.pid,sppoo.returncode)) - return (sppoo.returncode in returncode_ok) - #timeout reached - logging.error("popenTimeout1: subprocess took too long (>%fs), sending SIGTERM to pid %d" % (ptimeout,sppoo.pid)) - if sys.hexversion >= 0x020600F0: - sppoo.terminate() - else: - subprocess.call(["kill",str(sppoo.pid)]) - time.sleep(1.0) - if sppoo.poll() is None: - logging.error("popenTimeout1: subprocess still alive, sending SIGKILL to pid %d" % (sppoo.pid)) - if sys.hexversion >= 0x020600F0: - sppoo.kill() - else: - subprocess.call(["kill","-9",str(sppoo.pid)]) - return False - except Exception, e: - logging.error("popenTimeout1: "+str(e)) - return False - -def popenTimeout2(cmd, pinput, returncode_ok=[0], ptimeout=21): - logging.debug("popenTimeout2: starting: " + cmd) - try: - sppoo = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True) - if sys.hexversion >= 0x020600F0: - old_shandler = signal.signal(signal.SIGALRM,lambda sn,sf: sppoo.kill()) - else: - old_shandler = signal.signal(signal.SIGALRM,lambda sn,sf: os.system("kill -9 %d" % sppoo.pid)) - signal.alarm(ptimeout) #schedule alarm - if not pinput is None: - sppoo.communicate(input=pinput) - sppoo.wait() - signal.alarm(0) #disable pending alarms - signal.signal(signal.SIGALRM, old_shandler) - logging.debug("popenTimeout2: subprocess %d finished, returncode: %d" % (sppoo.pid,sppoo.returncode)) - if sppoo.returncode < 0: - logging.error("popenTimeout2: subprocess took too long (>%ds) and pid %d was killed" % (ptimeout,sppoo.pid)) - return (sppoo.returncode in returncode_ok) - except Exception, e: - logging.error("popenTimeout2: "+str(e)) - try: - signal.signal(signal.SIGALRM, old_shandler) - except: - pass - return False - -def decodeR3Message(multipart_msg): - try: - return (multipart_msg[0], json.loads(multipart_msg[1])) - except Exception, e: - logging.debug("decodeR3Message:"+str(e)) - return ("",{}) - - -def touchURL(url): - try: - f = urllib.urlopen(url) - rq_response = f.read() - logging.debug("touchURL: url: "+url) - #logging.debug("touchURL: Response "+rq_response) - f.close() - return rq_response - except Exception, e: - logging.error("touchURL: "+str(e)) - - -def exitHandler(signum, frame): - logging.info("stopping") - try: - zmqsub.close() - zmqctx.destroy() - except: - pass - sys.exit(0) - -#signals proapbly don't work because of readline -#signal.signal(signal.SIGTERM, exitHandler) -signal.signal(signal.SIGINT, exitHandler) -signal.signal(signal.SIGQUIT, exitHandler) - -logging.info("Door Status Listener 'PlaySound' started") - -if len(sys.argv) > 1: - uwscfg = UWSConfig(sys.argv[1]) -else: - uwscfg = UWSConfig() - -while True: - try: - #Start zmq connection to publish / forward sensor data - zmqctx = zmq.Context() - zmqctx.linger = 0 - zmqsub = zmqctx.socket(zmq.SUB) - zmqsub.setsockopt(zmq.SUBSCRIBE, "DoorCommandEvent") - zmqsub.setsockopt(zmq.SUBSCRIBE, "PresenceUpdate") - zmqsub.setsockopt(zmq.SUBSCRIBE, "BoreDoomButtonPressEvent") -# zmqsub.setsockopt(zmq.SUBSCRIBE, "MovementSensorUpdate") - zmqsub.setsockopt(zmq.SUBSCRIBE, "DoorAjarUpdate") - zmqsub.setsockopt(zmq.SUBSCRIBE, "DoorProblemEvent") - zmqsub.connect(uwscfg.broker_uri) - - last_status=None - last_user=None - unixts_panic_button=None - unixts_last_movement=0 - unixts_last_presence=0 - while True: - data = zmqsub.recv_multipart() - (structname, dictdata) = decodeR3Message(data) - logging.debug("Got data: " + structname + ":"+ str(dictdata)) - - #uwscfg.checkConfigUpdates() - - if structname == "PresenceUpdate" and "Present" in dictdata: - if dictdata["Present"] and last_status != dictdata["Present"]: - #someone just arrived - if isTheSunDown(): - touchURL("http://slug.realraum.at/cgi-bin/switch.cgi?id=mashadecke&power=on") - touchURL("http://localhost/cgi-bin/mswitch.cgi?ceiling3=1&ceiling4=1") - touchURL("http://slug.realraum.at/cgi-bin/switch.cgi?id=couchred&power=on") - touchURL("http://slug.realraum.at/cgi-bin/switch.cgi?id=bluebar&power=on") - last_status=dictdata["Present"] - if not last_status: - #everybody left - touchURL("http://localhost/cgi-bin/mswitch.cgi?ceiling1=0&ceiling2=0&ceiling3=0&ceiling4=0&ceiling5=0&ceiling6=0") - touchURL("http://slug.realraum.at/cgi-bin/switch.cgi?id=all&power=off") - continue - - except Exception, ex: - logging.error("main: "+str(ex)) - traceback.print_exc(file=sys.stdout) - try: - zmqsub.close() - zmqctx.destroy() - except: - pass - time.sleep(5) diff --git a/raspberrypi_gpio_relay_licht/style.css b/raspberrypi_gpio_relay_licht/style.css deleted file mode 100755 index 2560904..0000000 --- a/raspberrypi_gpio_relay_licht/style.css +++ /dev/null @@ -1,70 +0,0 @@ -body -{ - background-image:url("./realraumsimpel.png"); - background-repeat:no-repeat; -} - -#pc1 -{ - background-color:#f00; -} -.pc1 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:697px; - background-color:#f00; - z-index:20; -} -.pc2 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:697px; - background-color:#f00; - z-index:20; -} -.pc3 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:402px; - background-color:#f00; - z-index:20; -} -.pc4 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:402px; - background-color:#f00; - z-index:20; -} -.pc5 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:127px; - background-color:#f00; - z-index:20; -} -.pc6 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:127px; - background-color:#f00; - z-index:20; -} diff --git a/raspberrypi_gpio_relay_licht/stylez.css b/raspberrypi_gpio_relay_licht/stylez.css deleted file mode 100755 index 96a87fb..0000000 --- a/raspberrypi_gpio_relay_licht/stylez.css +++ /dev/null @@ -1,70 +0,0 @@ -body -{ - background-image:url("./realraumsimpelz.png"); - background-repeat:no-repeat; -} - -#pc1 -{ - background-color:#f00; -} -.pc1 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:697px; - background-color:#f00; - z-index:20; -} -.pc2 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:697px; - background-color:#f00; - z-index:20; -} -.pc3 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:402px; - background-color:#f00; - z-index:20; -} -.pc4 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:402px; - background-color:#f00; - z-index:20; -} -.pc5 -{ - position:absolute; - height:122px; - width:122px; - top:370px; - left:127px; - background-color:#f00; - z-index:20; -} -.pc6 -{ - position:absolute; - height:122px; - width:122px; - top:142px; - left:127px; - background-color:#f00; - z-index:20; -} diff --git a/raspberrypi_gpio_relay_licht/switch.html b/raspberrypi_gpio_relay_licht/switch.html deleted file mode 100644 index 5bf1fba..0000000 --- a/raspberrypi_gpio_relay_licht/switch.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<head> -<meta http-equiv="refresh" content="0; URL=http://licht.realraum.at/cgi-bin/switch.cgi?nofloat=1"> -</head> -</html> diff --git a/router_gpio_relay_licht/mswitch.cgi b/router_gpio_relay_licht/mswitch.cgi deleted file mode 100755 index c389c38..0000000 --- a/router_gpio_relay_licht/mswitch.cgi +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh - -VALID_ONOFF_IDS="7 18 20" -GPIOPATH=/sys/class/gpio/gpio - -for QUERY in `echo $QUERY_STRING | tr '&' ' '`; do - for VALIDID in $VALID_ONOFF_IDS; do - if [ "$QUERY" == "$VALIDID=1" ]; then - eval "GPIO_$VALIDID"=1 - elif [ "$QUERY" == "$VALIDID=0" ]; then - eval "GPIO_$VALIDID=0" - elif [ "$QUERY" == "$VALIDID=q" ]; then - eval "GPIO_$VALIDID=q" - fi - done - if [ "$QUERY" == "mobile=1" ]; then - MOBILE='1' - NOFLOAT='1' - elif [ "$QUERY" == "nofloat=1" ]; then - NOFLOAT='1' - fi -done - - -print_gpio_state() { - GPIOVALUE=$(cat "${GPIOPATH}${1}/value") - if [ "$GPIOVALUE" = "1" ]; then - echo -n "true" - else - echo -n "false" - fi -} - -gpio_is_on() { - GPIOVALUE=$(cat "${GPIOPATH}${1}/value") - [ "$GPIOVALUE" = "1" ] -} - -echo "Content-type: text/html" -echo "" - -echo "{" -for CHECKID in $VALID_ONOFF_IDS; do - VAL="" - VAL="$(eval echo \$GPIO_$CHECKID)" - if [ $VAL == 1 -o $VAL == 0 ]; then - echo "$VAL" > "${GPIOPATH}${CHECKID}/value" - fi - echo -n "\"$CHECKID\":" - print_gpio_state $CHECKID - echo "," -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 - diff --git a/router_gpio_relay_licht/rc.local b/router_gpio_relay_licht/rc.local deleted file mode 100644 index 4978362..0000000 --- a/router_gpio_relay_licht/rc.local +++ /dev/null @@ -1,14 +0,0 @@ -# Put your custom commands here that should be executed once -# the system init finished. By default this file does nothing. - -rmmod gpio_button_hotplug -echo 7 > /sys/class/gpio/export -echo 18 > /sys/class/gpio/export -echo 20 > /sys/class/gpio/export -echo 29 > /sys/class/gpio/export -echo out > /sys/class/gpio/gpio7/direction -echo out > /sys/class/gpio/gpio18/direction -echo out > /sys/class/gpio/gpio20/direction -echo out > /sys/class/gpio/gpio29/direction - -exit 0 diff --git a/router_gpio_relay_licht/switch.cgi b/router_gpio_relay_licht/switch.cgi deleted file mode 100755 index 01dce98..0000000 --- a/router_gpio_relay_licht/switch.cgi +++ /dev/null @@ -1,248 +0,0 @@ -#!/bin/sh - -for QUERY in `echo $QUERY_STRING | tr '&' ' '`; do - for VALUE in `echo $QUERY | tr '=' ' '`; do - if [ "$VALUE" == "id" ]; then - ID='?' - elif [ "$ID" == "?" ]; then - ID=$VALUE - elif [ "$VALUE" == "power" ]; then - POWER='?' - elif [ "$POWER" == "?" ]; then - POWER=$VALUE - elif [ "$VALUE" == "mobile" ]; then - MOBILE='1' - NOFLOAT='1' - elif [ "$VALUE" == "nofloat" ]; then - NOFLOAT='1' - fi - i=$i+1 - done -done - - -GPIOPATH=/sys/class/gpio/gpio -#VALID_ONOFF_IDS="7 18 20 29" -VALID_ONOFF_IDS="7 18 20" -VALID_SEND_IDS="" - -print_gpio_state() { - GPIOVALUE=$(cat "${GPIOPATH}${1}/value") - if [ "$GPIOVALUE" = "1" ]; then - echo "ON" - else - echo "Off" - fi -} - -gpio_is_on() { - GPIOVALUE=$(cat "${GPIOPATH}${1}/value") - [ "$GPIOVALUE" = "1" ] -} - -if [ "$POWER" == "1" -o "$POWER" == "0" ]; then - for CHECKID in $VALID_ONOFF_IDS ; do - if [ "$CHECKID" == "$ID" ]; then - echo "$POWER" > "${GPIOPATH}${ID}/value" - echo "Content-type: text/html" - echo "" - 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 - fi - done -fi - -DESC_7="Decke Links Vorne" -DESC_20="Decke Rechts Vorne" -DESC_18="Decke Rechts Mitte" -#DESC_29="GPIO Nicht Belegt" - -echo "Content-type: text/html" -echo "" -echo "<html>" -echo "<head>" -echo "<title>Realraum Relay Power</title>" -echo '<script type="text/javascript">' - -echo 'function callbackUpdateButtons(req) { - if (req.status != 200) { - return; - } - var data = JSON.parse(req.responseText); - for (var keyid in data) { - on_btn = document.getElementById("onbtn_"+keyid); - off_btn = document.getElementById("offbtn_"+keyid); - if (on_btn && off_btn) - { - on_btn.className = "onbutton"; - off_btn.className = "offbutton"; - if (data[keyid]) - { on_btn.className += " enableborder"; } - else - { off_btn.className += " enableborder"; } - } - } -}' - -echo 'function updateButtons(uri) { - var req = new XMLHttpRequest; - req.overrideMimeType("application/json"); - req.open("GET", uri, true); - req.onload = function() {callbackUpdateButtons(req)}; - req.setRequestHeader("googlechromefix",""); - req.send(null); -}' - -echo 'function sendMultiButton( str ) { - url = "/cgi-bin/mswitch.cgi?"+str; - updateButtons(url); -}' - -echo 'setInterval("updateButtons(\"/cgi-bin/mswitch.cgi\");", 30*1000);' - -echo 'function sendButton( onoff, btn )' -echo '{' -echo ' var req = new XMLHttpRequest();' -echo ' url = "/cgi-bin/switch.cgi?power="+onoff+"&id="+btn;' -echo ' req.open("GET", url ,false);' -echo ' //google chrome workaround' -echo ' req.setRequestHeader("googlechromefix","");' -echo ' req.send(null);' -echo '}' -echo '</script>' -echo '<style>' -echo 'div.switchbox {' -echo ' float:left;' -echo ' margin:2px;' -#echo ' max-width:236px;' -echo ' max-width:300px;' -echo ' font-size:10pt;' -echo ' border:1px solid black;' -#echo ' height: 32px;' -echo ' padding:0;' -echo '}' - -echo 'div.switchnameleft {' -echo ' width:12em; display:inline-block; vertical-align:middle; margin-left:3px;' -echo '}' - -echo 'span.alignbuttonsright {' -echo ' top:0px; float:right; display:inline-block; text-align:right; padding:0;' -echo '}' - -echo 'div.switchnameright {' -echo ' width:12em; display:inline-block; vertical-align:middle; float:right; display:inline-block; margin-left:1ex; margin-right:3px; margin-top:3px; margin-bottom:3px;' -echo '}' - -echo 'span.alignbuttonsleft {' -echo ' float:left; text-align:left; padding:0;' -echo '}' - -echo '.onbutton {' -echo ' font-size:11pt;' -echo ' width: 40px;' -echo ' height: 32px;' -echo ' background-color: lime;' -echo ' margin: 0px;' -echo '}' - -echo '.offbutton {' -echo ' font-size:11pt;' -echo ' width: 40px;' -echo ' height: 32px;' -echo ' background-color: red;' -echo ' margin: 0px;' -echo '}' - -echo '.sendbutton {' -echo ' font-size:11pt;' -echo ' width: 40px;' -echo ' height: 32px;' -#echo ' background-color: grey;' -echo ' margin: 0px;' -echo '}' - -echo '.enableborder { - font-weight: bold; - font-variant: small-caps; - border-style: inset;' -echo '}' -echo '</style>' -echo "</head>" -echo "<body>" -#echo "<h1>Realraum rf433ctl</h1>" -#echo "<div style=\"float:left; border:1px solid black;\">" -echo "<div style=\"float:left;\">" -echo "<div style=\"float:left; border:1px solid black; margin-right:2ex; margin-bottom:2ex;\">" -for DISPID in $VALID_ONOFF_IDS; do - NAME="$(eval echo -n \$DESC_$DISPID)" - [ -z "$NAME" ] && NAME=$DISPID - - echo "<div class=\"switchbox\">" - echo "<span class=\"alignbuttonsleft\">" - if gpio_is_on $DISPID; then - echo " <button id=\"onbtn_$DISPID\" class=\"onbutton enableborder\" onClick='sendMultiButton(\"$DISPID=1\");'>On</button>" - echo " <button id=\"offbtn_$DISPID\" class=\"offbutton\" onClick='sendMultiButton(\"$DISPID=0\");'>Off</button>" - else - echo " <button id=\"onbtn_$DISPID\" class=\"onbutton\" onClick='sendMultiButton(\"$DISPID=1\");'>On</button>" - echo " <button id=\"offbtn_$DISPID\" class=\"offbutton enableborder\" onClick='sendMultiButton(\"$DISPID=0\");'>Off</button>" - fi - echo "</span>" - echo -n "<div class=\"switchnameright\">$NAME</div>" -# echo -n "<div class=\"switchnameright\">$NAME (" -# print_gpio_state $DISPID -# echo ")</div>" - echo "</div>" - - if [ "$NOFLOAT" == "1" ]; then - echo "<br/>" - fi -done - -echo "<div class=\"switchbox\">" -echo "<span class=\"alignbuttonsleft\">" -echo -n " <button class=\"onbutton\" onClick='sendMultiButton(\"" -for DISPID in $VALID_ONOFF_IDS; do echo -n "$DISPID=1&"; done -echo "\");'>On</button>" -echo -n " <button class=\"offbutton\" onClick='sendMultiButton(\"" -for DISPID in $VALID_ONOFF_IDS; do echo -n "$DISPID=0&"; done -echo "\");'>Off</button>" -echo "</span>" -echo -n "<div class=\"switchnameright\">Alle</div>" -echo "</div>" -if [ "$NOFLOAT" == "1" ]; then - echo "<br/>" -fi -echo "</div>" - -if [ "$MOBILE" != "1" -a -n "$VALID_SEND_IDS" ]; then - -echo "<div style=\"float:left; border:1px solid black; margin-right:2ex; margin-bottom:2ex;\">" - -ITEMCOUNT=0 - -for DISPID in $VALID_SEND_IDS; do - ITEMCOUNT=$((ITEMCOUNT+1)) - NAME="$(eval echo \$DESC_$DISPID)" - [ -z "$NAME" ] && NAME=$DISPID - - echo "<div class=\"switchbox\">" - echo "<span class=\"alignbuttonsleft\">" - echo " <button class=\"sendbutton\" onClick='sendButton(\"on\",\"$DISPID\");'> </button>" - echo "</span>" - echo "<div class=\"switchnameright\">$NAME</div>" - echo "</div>" - if [ "$NOFLOAT" == "1" -a $((ITEMCOUNT % 2 )) -ne 1 ]; then - echo "<br/>" - fi - -done -echo "</div>" -fi -echo "</div>" -echo "</body>" -echo "</html>" -- 1.7.10.4