From 1b5b6131759a4e3cf77945e328b4cdc2cd16e24b Mon Sep 17 00:00:00 2001 From: Xavier Date: Sat, 3 Sep 2022 06:36:20 +0200 Subject: [PATCH] first commit --- README.md | 31 +++++ favicon.ico | Bin 0 -> 2238 bytes gohttp.py | 203 ++++++++++++++++++++++++++++++++ img/funduino_keyes_8_prises.jpg | Bin 0 -> 20356 bytes img/relais.jpg | Bin 0 -> 29127 bytes img/schema_funduino_keyes.jpg | Bin 0 -> 23868 bytes index.html | 180 ++++++++++++++++++++++++++++ relay.py | 135 +++++++++++++++++++++ 8 files changed, 549 insertions(+) create mode 100755 README.md create mode 100644 favicon.ico create mode 100755 gohttp.py create mode 100644 img/funduino_keyes_8_prises.jpg create mode 100644 img/relais.jpg create mode 100644 img/schema_funduino_keyes.jpg create mode 100644 index.html create mode 100755 relay.py diff --git a/README.md b/README.md new file mode 100755 index 0000000..73588b2 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ + Telecommande Domotique +=========================== + +## Pre-requis + +sudo apt-get install rpi.gpio + +ou en manuel + +wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz +tar -xvf RPi.GPIO-0.5.11.tar.gz +cd RPi.GPIO-0.5.11 +sudo python setup.py install + +## 1) Installation + +dans /home/pi +des fichiers index.html gohttp.py et relay.py et favicon.ico + +## 2) demarrage auto + +editer dans /etc +le rc.local +ajouter en fin avant exit + +#gestion Relay a 0 +./home/pi/relay.py power 1 +gohttp.sh + +faire un reboot + diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c1b264ef8aa75cbc4a2f31423820c446412ea1fc GIT binary patch literal 2238 zcmeH}KS&!<9LK+R$-PT#s;AALcgf|{OYFs@LMdbvx(LOoxJ$vQP?x$C3Zmf9Nhnr2 zNhgP59UWTi);~+zskmhj+DlbD*C!u0esW@ctEJ3EWH zxjEp`OJMFb@c0ep=jXAoumC)L2Rz%s;^HFk`~y~2R-p;rTzB9m36*AaToet%@%%3ADw^xfU?$i$ATd6lIaxvKqUxBZ4N3hES)|f zrS!=u*AH$|?uykYKp>rr7_=-Yle#=KHIvCRfvvd%tL$2iDY!iZFxZD=tl$i}809a5 zYn}5hLCmYw(Kh$#Cy!FFN|axWR;&HA>--Uq1k~uQvcBl=C-x)mX@8sn@coL+4m!g0 zO;a?wxnaaKpXJDihR&|rk7DePX(6AF1cLT%9#dH;XaN-&O@*D-e)ce`%bv=PLid~9 z^iWjI(pfm7z#3?RQ{na^FTt&|n zy=biHL6tgIN*yjKb$39W!dCl8sAU+Z{M&HMEgqhQ{;Xr4vCQD$9r>q7Q1*fiRlqP) PFR6WlRc)nChn4yZGcv&p literal 0 HcmV?d00001 diff --git a/gohttp.py b/gohttp.py new file mode 100755 index 0000000..6c33d61 --- /dev/null +++ b/gohttp.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +""" +Very simple HTTP server in python for logging requests +Usage:: + ./server.py [] +""" +import RPi.GPIO as GPIO +import http.server +import socketserver +import logging +import sys +import os +import subprocess +import cgi +import time +GPIO.setwarnings(False) +os.system('pkill -9 httpd') +GPIO.setmode(GPIO.BCM) +pinList = [2, 3, 4, 17] +SleepTimeL=10 + +class S(http.server.SimpleHTTPRequestHandler): + + def do_GET(self): + + GPIO.setup(pinList[0], GPIO.OUT) + status0=int(GPIO.input(pinList[0])) + GPIO.setup(pinList[1], GPIO.OUT) + status1=int(GPIO.input(pinList[1])) + GPIO.setup(pinList[2], GPIO.OUT) + status2=int(GPIO.input(pinList[2])) + GPIO.setup(pinList[3], GPIO.OUT) + status3=int(GPIO.input(pinList[3])) + #logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers)) + + self._set_response() + pass + + def do_POST(self): + content_length = int(self.headers['Content-Length']) # <--- Gets the size of data + post_data = self.rfile.read(content_length) # <--- Gets the data itself + logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", + str(self.path), str(self.headers), post_data.decode('utf-8')) + + self._set_response() + self.wfile.write("POST request for {}".format(self.path).encode('utf-8')) + + def _set_response(self): + #time.sleep(5) + GPIO.setup(pinList[0], GPIO.OUT) + status0=int(GPIO.input(pinList[0])) + GPIO.setup(pinList[1], GPIO.OUT) + status1=int(GPIO.input(pinList[1])) + GPIO.setup(pinList[2], GPIO.OUT) + status2=int(GPIO.input(pinList[2])) + GPIO.setup(pinList[3], GPIO.OUT) + status3=int(GPIO.input(pinList[3])) + + objParsedPath = str(format(self.path).encode('utf-8')) + print ('objParsedPath="'+objParsedPath+'"') + + if objParsedPath == "b'/R0'": + print ('R0 run') + if status0 == 1: + os.system('./relay.py open 0') + else: + os.system('./relay.py close 0') + time.sleep(int(SleepTimeL)); + os.system('./relay.py open 0') + + if objParsedPath == "b'/R0O'": + print ('R0 run0') + if status0 == 1: + os.system('./relay.py open 0') + else: + os.system('./relay.py close 0') + + + + if objParsedPath == "b'/R1'": + print ('R1 run') + if status1 == 1: + os.system('./relay.py open 1') + else: + os.system('./relay.py close 1') + time.sleep(int(SleepTimeL)); + os.system('./relay.py open 1') + + if objParsedPath == "b'/R1O'": + print ('R1 run0') + if status1 == 1: + os.system('./relay.py open 1') + else: + os.system('./relay.py close 1') + + + if objParsedPath == "b'/R2'": + print ('R2 run') + if status2 == 1: + os.system('./relay.py open 2') + else: + os.system('./relay.py close 2') + time.sleep(int(SleepTimeL)); + os.system('./relay.py open 2') + + if objParsedPath == "b'/R2O'": + print ('R2 run0') + if status2 == 1: + os.system('./relay.py open 2') + else: + os.system('./relay.py close 2') + + + if objParsedPath == "b'/R3'": + print ('R3 run') + if status3 == 1: + os.system('./relay.py open 3') + else: + os.system('./relay.py close 3') + time.sleep(int(SleepTimeL)); + os.system('./relay.py open 3') + + if objParsedPath == "b'/R3O'": + print ('R3 run0') + if status3 == 1: + os.system('./relay.py open 3') + else: + os.system('./relay.py close 3') + + GPIO.setup(pinList[0], GPIO.OUT) + status0=int(GPIO.input(pinList[0])) + GPIO.setup(pinList[1], GPIO.OUT) + status1=int(GPIO.input(pinList[1])) + GPIO.setup(pinList[2], GPIO.OUT) + status2=int(GPIO.input(pinList[2])) + GPIO.setup(pinList[3], GPIO.OUT) + status3=int(GPIO.input(pinList[3])) + + + + file = read_html_template("index.html") + self.send_response(200, "OK") + self.end_headers() + print ('Relay0 = '+str(status0)) + if status0 == 0: + file = file.replace("CHECKED1", "checked") + else: + file = file.replace("CHECKED1", "") + + print ('Relay1 = '+str(status1)) + if status1 == 0: + file = file.replace("CHECKED2", "checked") + else: + file = file.replace("CHECKED2", "") + + print ('Relay2 = '+str(status2)) + if status2 == 0: + file = file.replace("CHECKED3", "checked") + else: + file = file.replace("CHECKED3", "") + + print ('Relay3 = '+str(status3)) + if status3 == 0: + file = file.replace("CHECKED4", "checked") + else: + file = file.replace("CHECKED4", "") + + self.wfile.write(bytes(file.encode("utf-8"))) + + + + +def read_html_template(path): + """function to read HTML file""" + try: + with open(path) as f: + file = f.read() + except Exception as e: + file = e + return file + +def run(handler_class=S, port=8000): + + logging.basicConfig(level=logging.INFO) + server_address = ('', port) + #httpd = server_class(server_address, handler_class) + logging.info('Starting httpd '+str(port)+' ...\n') + try: + Handler = http.server.SimpleHTTPRequestHandler + with socketserver.TCPServer(server_address, handler_class) as httpd: + httpd.serve_forever() + except KeyboardInterrupt: + pass + httpd.server_close() + logging.info('Stopping httpd...\n') + +if __name__ == '__main__': + from sys import argv + + if len(argv) == 2: + run(port=int(argv[1])) + else: + run() diff --git a/img/funduino_keyes_8_prises.jpg b/img/funduino_keyes_8_prises.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7474a6cc33ff990a27615452eecf69d15d7f5f53 GIT binary patch literal 20356 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 a>HP`oiHJ2rGqMt_djA0C7FlKg0RPz;Pr2j( literal 0 HcmV?d00001 diff --git a/img/relais.jpg b/img/relais.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c1bca8b9d00858602763180c7453eb132ad9105 GIT binary patch literal 29127 zcmaI81C%ArvNpWiwmoh4v~Anwv~3$Rt=+b5PusSqZA{xX|9;Os=dSO&_gjDNy;kj& zl@S@4RrOTFlac##`Ewh9EG;f24gdiG06@MzfX_9+F8~Y-EHo@M92^WBEF2shA~HNI z90D2^1~NJlCMqf-CMps-5)wKpIyM?6I?gv-LL6*bVtg_*d;(??78(w65=IcnFF^!E zICywOM0f;bL;`dKcoK9BEJQ+REO=y0WE3noWHfX*6dV*n7#w(L5^Mr=Bm!gvcqB|@ zICKnBOzh7-017mS9w;mr2nhfb1q2KQKY92BOcU5&VD?(~1pGgQ zKv@W8z3^vCv^Lg=>3_3db(zKA&N{MIF6q8$lo`}J@wYZdz^MNCUy@)71Q~H17qIP3 z86lgG#_fv@G1WDbZuc&`Hq?b|4r`RdHD-0oKQ8wO=8ytpBGT!(rZ4 zpPM4RwN-1>E%NE~p!w<5XKRA&dhTR#c3O;(v^9M(JFm45BbWW!@15!kb>l*H;)iV< zbq=qO5GN^2EW!V`MyTmD-=)I^?T@KxxLtXh4h`VMl0uL8PM7mIqSK^aWJ3K6&Uf3G z{xe_u2BVU+A^VPuLi+{7-U}ib6=`Gn9jujgrP`(+ReE{l-h?%cgWd{6u6Htr0sluY zP%&xVgMzslZdss7#*++k;{Gb;rGFc1Ts_A1l@})2i_K4h8|E+13SGJ`m8C+~WX^|L z`JjN}9r#-{iaB0{hiq+w(?>OY7!VIJLWVM9S)&_E=_H6P?fYogY6f?Iv%(jVu0l zhhT@(-F`~X8~($ZID!V8V_v^1ilS ze*$vsG8)#RJ!slr;~N&-yOzx@78VD)@$6|%T+@@QI-TT6YKYG6?Xt@1L>H_1#u#GQ zeF?Imw$AiQZinTv2K0lMQvTZj3`9q;sv}ke9!x#Vr7U{>_KEw)>e?p!gLOG~E5ERg zWL%RdUjqruN%l`bZL;L!3bf7d*WcN}gGMW%l*ekzZoVvHlu#}hHR`SL`prf);|mqq zw+hcB8dlw=MU9cMs|m$NyJqZ$G~6|*_cu#!csRekVjMS{IlIk|cvX(lrv5$oU{P+` zV*YC5*Du2&=lX3(?Ctl2uJ)A+X1-wk1rKfL{F-)W@1Yf2uH_?#!L-18J9`d$(1nt? z5R5AC0p53QZ})O=+jdsGOx;dp=8o>X;SD}8wc^1f%W_K_;kxTvyA=g{jg+mjB|R7I zr3ieUbgT$IW_u2f)`I(D2?~Tw`*lB;Z1Wsbe}9Whmo8i!%m11oklWM4O#}gZVCmgu zBmd}Nq3Rmtv%C1|6M^q1pw+oFFgqk7tH9e1imr;tg1{`NhQ|(;NN%Q%iE81Im7#b( z(#7S+iSn$&OIw5btT(PxQd64~CIO9Kzqzo0j<}nZ+oj+NDzjC0H|8o0g_p3H9!+n- zsr8 zcZ-drl#3Sc=F;rtgvftD3uK6v?=r|)e=S1888JF&%Wub5U{*lDPRe(AZG5S+jS27m z=}*6K{fuSq_EKrfbVY&}c;#mE{_#s#nWpCIX1;>VlvHNN-T;51PAkX88^>U;9B4eGpa0y^_!*Vk;hxWz zm_E9PZAUA)_ZM8*!|7FUN1uQ!TNmzwp)@4}pM%nt-d1{A4c}eNYR-f^o5WV1Q@6Xe zU?Sa@gH5D*Pk-f%vCV0UCY`Qu$MU9-3VWRWO2>=xWy%TxGQQX5zwKVa3#7igPdD+U zVE>tbF9Sd(j|}nz_!Yelin|s$^`fa@D)rnGL`HlY#`aGi(qQQY46Le#Bz=QJj8$|F z*VLhp5uBRyJLP@nbXKwh=lF?AZ!`E+=TMc@%Jkh!j7q2G{Q~=9?P| z#7Kwx92GVzC$D(lrqp(mGa=iYCi7?chl`4kio=#$^lO#484Q|usq6y&&mI5()n|z# zetNm%SU(PjCHIxeyJyReA(+x>REwQr^4;5?5M@kgaFv5Bc|rC(C+re-=1c@;>(g+h zk8sT%{jS3AKjd~n#RUIvod9UAp;lg`!Tj23@0@T1qNw3%?~3zTnCC2Q zdqM(tCoBRw)Mu(!jAn0tt{7^X0HXh)1^__dC*FKcGH}<-&aQvo7;b1&;0j&voIa!+ z=MUH0(t184oa~y3^w7#F>+mqG{9ob#sOd`Q-N$8ZHjPpR!S~e}|Eg}o∧4FwrQ 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 YZx+Y!S7=dd3w9X~{kf?B0K0$x*#kOG1poj5 literal 0 HcmV?d00001 diff --git a/img/schema_funduino_keyes.jpg b/img/schema_funduino_keyes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13a5e54eb978dbc4ac0c727f309036a72bd02dec GIT binary patch literal 23868 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 + + + + + + + RelayCMD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/relay.py b/relay.py new file mode 100755 index 0000000..434e3b3 --- /dev/null +++ b/relay.py @@ -0,0 +1,135 @@ +#!/usr/bin/python +import RPi.GPIO as GPIO +import time +import sys +import re +GPIO.setwarnings(False) +# loop through pins and set mode and state to 'high' +def reset_relay(pinrelayList): + for i in pinrelayList: + GPIO.setup(i, GPIO.OUT) + GPIO.output(i, GPIO.LOW) + +#Power is 0 OFF or 1 ON +def power(pinListpower,ONOFF): + j=1 + for i in pinListpower: + GPIO.setup(i, GPIO.OUT) + if int(ONOFF) == 0: + print ('Relay='+str(j)+' '+str(ONOFF)) + GPIO.output(i, GPIO.HIGH) + if int(ONOFF) == 1: + print ('Relay='+str(j)+' '+str(ONOFF)) + GPIO.output(i, GPIO.LOW) + j+=1 + +#Status RELAY +def status(pinListcheck,pincheck): + j=1 + if pincheck==10: + for i in pinListcheck: + GPIO.setup(i, GPIO.OUT) + + if int(GPIO.input(i)) == 1: + print ('Relay '+str(j)+' = OFF') + else: + print ('Relay '+str(j)+' = ON') + j+=1 + else: + GPIO.setup(pinListcheck[int(pincheck)], GPIO.OUT) + if int(GPIO.input(pinListcheck[int(pincheck)])) == 1: + print ('Relay '+str(pincheck)+' = OFF') + else: + print ('Relay '+str(pincheck)+' = ON') + +# init funct +def main(argv=sys.argv): + # init var + GPIO.setmode(GPIO.BCM) + pinList = [2, 3, 4, 17] + SleepTimeL = 5 + #GPIO.cleanup() + x = 1 + #Cmd HELP + if (len(argv) > x and argv[x] == 'help') or len(argv) == 1: + print ('usage: ./relay.py ....') + print ('options:') + print (' help', 'This aide') + print ('commands:') + print (' close R', 'Close relay number R of 0 to 3') + print (' open R', 'Open relay R of number 0 to 3') + print (' reset R T', 'Reset device, changes ON OFF ON by tempo T.') + print (' status', 'Print the states of all relays.') + print ('example: ./relay.py reset 0 10') + print (' relay0 is ON but make a reset by OFF STEP 10s and ON') + print ('example: ./relay.py open 0') + print ('example: ./relay.py close 1') + print ('example: ./relay.py status') + print ('(c) F4IYT Xavier 2022 v1.00') + GPIO.cleanup() + sys.exit(1) + + #Cmd STATUS + if len(argv) > x and argv[x] == 'status': + pinstatus=10 + if len(argv) > 2: + x +=1 + pinstatus=argv[x] + + status(pinList,pinstatus) + + #Cmd Close Relay + if len(argv) > x and argv[x] == 'close': + x +=1 + relay=argv[x] + if int(relay) < 4: + relayclose=pinList[int(relay)] + print ("Close Relay:"+relay) + GPIO.setup(int(relayclose), GPIO.OUT) + GPIO.output(int(relayclose), GPIO.HIGH) + else: + print ('Error number of Relay check input only 0 at 3!') + + #Cmd Open Relay + if len(argv) > x and argv[x] == 'open': + x +=1 + relay=argv[x] + if int(relay) < 4: + relayopen=pinList[int(relay)] + print ("Open Relay:"+relay) + GPIO.setup(int(relayopen), GPIO.OUT) + GPIO.output(int(relayopen), GPIO.LOW) + else: + print ('Error number of Relay check input only 0 at 3!') + + #Cmd Reset Relay + if len(argv) > x and argv[x] == 'reset': + x +=1 + relay=argv[x] + if int(relay) < 4: + relayreset=pinList[int(relay)] + if len(argv) > 3: + x +=1 + SleepTimeL=argv[x] + print ("Reset Relay:"+relay+" tempo="+str(SleepTimeL)) + time.sleep(int(SleepTimeL)); + GPIO.setup(int(relayreset), GPIO.OUT) + GPIO.output(int(relayreset), GPIO.HIGH) + time.sleep(int(SleepTimeL)); + GPIO.setup(int(relayreset), GPIO.OUT) + GPIO.output(int(relayreset), GPIO.LOW) + else: + print ('Error number of Relay check input only 0 at 3!') + + + #Cmd Power Relay + if len(argv) > x and argv[x] == 'power': + x +=1 + ponoff=argv[x] + print ("Power = :"+ponoff) + power(pinList,ponoff) + + +# Main part +if __name__ == '__main__': + main()
RELAY COMMAND

Nom RELAY

RESET Tempo10s

ON/OFF

Relay 1 [HamNet] +
+ + +
+
+
+ + +
+
Relay 2 [Srv/RadioSonde/ADSB] +
+ + + +
+
+
+ + + +
+
Relay 3 [HotSpot] +
+ + + +
+
+
+ + + +
+
Relay 4 [Alim] +
+ + + +
+
+
+ + + +
+