Guten Morgen hyle,
gestartet habe ich mit wie auf Seite 1 vorgegeben sudo python garageoPIner.py &
Die Ausgabe von python -V prüfe ich als nächstes.
Das wird die installierte Python Version ausgeben vermute ich?
Guten Morgen hyle,
gestartet habe ich mit wie auf Seite 1 vorgegeben sudo python garageoPIner.py &
Die Ausgabe von python -V prüfe ich als nächstes.
Das wird die installierte Python Version ausgeben vermute ich?
danke für Eure Antworten, ich bin die Steps von Seite 1 gerade nochmal durchgegangen. ich habe übersehen dass bei
ein Fehler bzw. eine Meldung kommt das python-dev nun pyhton-dev-is-pyton2 ist
und python-pip nun python3-pip
das läuft soweit auch alles durch nur ändert sich mein fehler beim Starten des Servers in:
pi@pi-garage:~/garageoPIner-server-twoGarageDoors $ Traceback (most recent call last):
File "garageoPIner.py", line 2, in <module>
from flask import session,request, Response, Flask
ImportError: No module named flask
wenn ich statt dem akutellen Raspberry Pi OS das Raspbian Stretch von 27.06.2018 verwende funktionieren alle Updates und Packages und der Server startet ohne Mucken. ich würde gerne den Unterschied verstehen...
Servus zusammen,
hat jemand den piOpener auf einem neueren Image als dem 2017er Stretch laufen?
Ich versuche das ganze auf einem Pi3 B+ mit akutellem Pi OS 02/2022 bullseye mal zum Test einzurichten.
komme bis zu:
ab diesem Schritt sollte der Webserver über die <Raspberry IP>:80 erreichbar sein, tut sich aber nix.
Bearbeitet man, so wie in einem vorigen Beitrag beschrieben die garageoPIner.py und ändert ganz unten die 0.0.0.0 auf die IP des Pi bekomme ich eine Fehlermeldung:
OSError [Errno 98] Adress already in use
stehe gerade etwas auf dem schlauch...
EDIT:
mit
in der garageOPiner.py erhalte ich den Fehler
Errno 2 name or service not known
mit 0.0.0.0 läuft der Webserver augenscheinlch, man kommt mit dem Browser aber nicht auf die weboberfläche...
hat nicht geklappt, nicht mal die LED ging mit dem Image an
Hallo Zusammen,
hat jemand Erfahrungen zum Thema Valetudo in Verbindung mit einem Xiaomi Staubsauger Roboter?
Würde das gerne noch aufm meinem Pi2 B+ neben dem PiHole laufen lassen.
Bin für alles dankbar!
Grüße sly
Hab den Spaß gerade noch auf einem Pi Zero W installiert, ich kommt nich auf die Weboberfläche... Server läuft laut Console
pi@raspberrypi:~/garageoPIner-server-twoGarageDoors $ * Serving Flask app "garageoPIner" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 666-404-799
jemand eine Idee dazu?
EDIT: lag am Image, hab das 17.08.2017er Stretch genommen, da läufts wunderbar
Hallo zusammen,
ich habe eine kurze Frage welche ich mir gerade selbst nicht beantworten kann und zu der ich auch keine Ergebnisse finde.
Ist es möglich das Raspbian meines Pi2 in einfach in den Zero zu stecken und dort zu betreiben? Habe hier ein 2 Programme mit ein paar GPIOs am laufen und möchte nicht alles neu aufsetzen müssen.
Vielen Dank und viele Grüße
Hi wirthualr,
"Vorher" war das ein fertiges System welches leider die Grätsche gemacht hat. Deswegen habe ich das jetzt so selber umgesetzt.
Mit deiner Vermutung für die langame Eingabe liegst du wahrscheinlich richtig, glaube dass hier das "time.sleep(0.4)" in Zeile 33 verantwortlich ist.
Das muss ich mal testen.
Viele Grüße
lieber spät wie nie, hier der Code für die Steuerung.
Läuft soweit ganz gut, leider muss man bei der Code Eingabe am Keypad relativ langsam drücken, früher konnte man den Code relativ zackig eingeben und er wurde angenommen, jetzt muss man recht langsam drücken. Der Code wir dann meist nicht beim ersten mal angenommen wenn man zu schnell drückt, da man dann aber auch nicht weiß an welcher steller der 5 Digits man gerade hängt muss man mit * die Eingabe Resetten.
hier der ganz normale GarageoPIner Code für die Steuerung per Handy App bzw. Weboberfläche:
from functools import wraps
from flask import session,request, Response, Flask
from threading import Timer
import RPi.GPIO as GPIO
import time
from datetime import timedelta
import configparser
app = Flask(__name__)
app.secret_key = 'm4bG3YJwarQQXU3F' #Needed for keep session open
GO_USERNAME = 'admin'
GO_PASSWORD = 'garageopiner'
GO_PORT = 80
GO_PIN1 = 4
GO_PIN2 = 17
GPIO.setmode(GPIO.BCM)
timer1 = None #Timer for Door1
timer2 = None # Timer for Door2
def check_auth(username, password):
"""This function is called to check if a username /
password combination is valid.
"""
return username == GO_USERNAME and password == GO_PASSWORD
def authenticate():
"""Sends a 401 response that enables basic auth"""
return Response(
'Could not verify your access level for that URL.\n'
'You have to login with proper credentials', 401,
{'WWW-Authenticate': 'Basic realm="Login Required"'})
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = request.authorization
if not auth or not check_auth(auth.username, auth.password):
return authenticate()
return f(*args, **kwargs)
return decorated
@app.route('/toggleIN1')
@requires_auth
def toggleIN1():
try:
stopTimeControlIN1()
togglePin(GO_PIN1)
response = "Relay switched successfull."
except Exception as e:
response = "Error occured: " + str(e)
return response
@app.route('/toggleIN2')
@requires_auth
def toggleIN2():
try:
stopTimeControlIN1()
togglePin(GO_PIN2)
response = "Relay switched successfull."
except Exception as e:
response = "Error occured: " + str(e)
return response ;
@app.route('/timeControlIN1')
@requires_auth
def timeControlIN1():
global timer1
seconds = request.args.get('seconds')
#Keep session open to allow timer to switch relay again
session.permanent = True
app.permanent_session_lifetime = timedelta(seconds=int(seconds)+5)
stopTimeControlIN1()
togglePin(GO_PIN1)
timer1 = Timer(int(seconds),togglePin, [GO_PIN1])
timer1.start()
return "Timer started"
@app.route('/stopTimeControlIN1')
def stopTimeControlIN1():
global timer1
if timer1!=None:
timer1.cancel()
timer1=None
return "Timer canceled"
@app.route('/timeControlIN2')
@requires_auth
def timeControlIN2():
global timer2
seconds = request.args.get('seconds')
#Keep session open to allow timer to switch relay again
session.permanent = True
app.permanent_session_lifetime = timedelta(seconds=int(seconds)+5)
stopTimeControlIN2()
togglePin(GO_PIN2)
timer2 = Timer(int(seconds),togglePin, [GO_PIN2])
timer2.start()
return "Timer started"
@app.route('/stopTimeControlIN2')
@requires_auth
def stopTimeControlIN2():
global timer2
if timer2!=None:
timer2.cancel()
timer2=None
return "Timer canceled"
@app.route('/')
@requires_auth
def deliverWebPage():
return app.send_static_file('index.html')
def togglePin(pin):
GPIO.setup(int(pin), GPIO.OUT)
GPIO.output(int(pin),GPIO.LOW)
time.sleep(0.2);
GPIO.output(int(pin),GPIO.HIGH)
if __name__ == '__main__':
files = ['garageoPIner.config']
config = configparser.RawConfigParser()
dataset = config.read('garageoPIner.config')
if len(dataset) == len(files):
GO_PORT = int(config.get("Settings","port"))
GO_PIN1 = int(config.get("Settings","pin1"))
GO_PIN2 = int(config.get("Settings","pin2"))
GO_USERNAME = config.get("Credentials","username")
GO_PASSWORD = config.get("Credentials","password")
else:
raise ValueError("Failed to open/find configuration file")
GPIO.setup(GO_PIN1,GPIO.IN)
GPIO.setup(GO_PIN2,GPIO.IN)
app.run(host='0.0.0.0',port=GO_PORT,debug=True)
Alles anzeigen
und hier der Code für das Keypad, 2 Codes da ein 2 Kanal Relais dran hängt und man somit etwas flexibler wäre für mögliche Erweiterungen:
import time
import RPi.GPIO as GPIO
from keypad import keypad
GPIO.setwarnings(False)
if __name__ == '__main__':
# Initialize
kp = keypad(columnCount = 3)
var = 1
while var == 1:
# waiting for a keypress
#digit = None
#while digit == None:
# digit = kp.getKey()
# Print result
# print digit
#time.sleep(0.5)
###### 4 Digit wait ######
seq = []
for i in range(5):
digit = None
counter=0
while digit == None:
digit = kp.getKey()
time.sleep(0.1)
if counter>=40:
break
if digit == '*':
break
seq.append(digit)
time.sleep(0.4)
# Check digit code
print(seq)
if seq == [1, 2, 3, 4, '#']:
print "Code accepted"
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, GPIO.HIGH)
GPIO.output(7, GPIO.LOW)
time.sleep(0.5)
GPIO.output(7, GPIO.HIGH)
if seq == [1, 1, 1, 1, '#']:
print "Code accepted"
GPIO.setup(11, GPIO.OUT)
GPIO.output(11, GPIO.HIGH)
GPIO.output(11, GPIO.LOW)
time.sleep(0.5)
GPIO.output(11, GPIO.HIGH)
Alles anzeigen
So Leute läuft alles einwandfrei über App und Keypad funktion gegeben das 2-Kanal relais zu steuern!
Das einzige was meinem Code nun noch fehlt wäre bei Falscheingabe des Codes von einer gewissen Anzahl X eine Eingabesperre von Zeit Y
jemand eine Idee hierzu?
so kurze Rückmeldung, die PIN Ansteuerung via Code funktioniert so:
if seq == [1, 2, 3, 4, '#']:
print "Code accepted"
GPIO.setup(11, GPIO.OUT)
GPIO.output(11, GPIO.HIGH)
GPIO.output(11, GPIO.LOW)
time.sleep(0.5)
GPIO.output(11, GPIO.HIGH)
die 11 steht hierbei für die Nummer des GPIO Pins. Habe noch eine kleine Hürde, sobald das erledigt ist erstelle ich ein Tutorial für die Steuerung.
OK, was ist dann der verantwortlicher Auslöser im Code wenn mein Relais klickt?
Hey ihr Python Profis
habe mir das Projekt hier nachgebaut und versuche gerade die Python Skripte zu verstehen, da ich das System gerne um ein Keypad für eine Steuerung mit Zahlencode erweitern würde und beides gerne parallel nutzen würde.
Die garageoPIner.config ist noch selbsterklärend, hier werden einige grundlegende Parameter wie Port, GPIo Pins und Zugangsdaten definiert.
Die garagoPIner.py sehe ich als ausführendes Python Programm an, dieses liest die verwendeten GPIo Pins und Zugangsdaten aus der Konfig-Datei aus (dataset = config.read('garageoPIner.config') soweit so gut.
Der Befehl zum Schalten der beiden GPIo Pins lautet scheinbar toggleIN1 und toggleIN2,
z.B:
def toggleIN1():
try:
stopTimeControlIN1()
togglePin(GO_PIN1)
response = "Relay switched successfull."
except Exception as e:
response = "Error occured: " + str(e)
return response
Was mir nun leider nicht einleuchtet, wird dieses toggleIN ausgelöst?
Grund für mein Nachfragen ist, da ich dieses Schaltverhalten bei korrekter Code-Eingabe enbenso auslösen muss.
So wie hier:
https://tutorials-raspberrypi.de/raspberry-pi-keypad-tastatur/
(Quelle von Quellcode unten)
import time
import RPi.GPIO as GPIO
from keypad import keypad
GPIO.setwarnings(False)
if __name__ == '__main__':
# Initialize
kp = keypad(columnCount = 3)
# waiting for a keypress
digit = None
while digit == None:
digit = kp.getKey()
# Print result
print digit
time.sleep(0.5)
###### 4 Digit wait ######
seq = []
for i in range(4):
digit = None
while digit == None:
digit = kp.getKey()
seq.append(digit)
time.sleep(0.4)
# Check digit code
print(seq)
if seq == [1, 2, 3, '#']:
print "Code accepted"
Alles anzeigen
nur ohne den ganzen print Ausgaben und unten bei #check digit code sollte dann der toggleIN1 oder toggleIN2 ausgesführt werden.
Ich hoffe ich konnte mein Vorhaben einigermaßen verständlich beschreiben, bin noch nicht so der Python Profi
Grüße sly
Hallo Hofei,
die Pins sollten nicht das Problem sein, da sind alle bis auf 2,6,4,17 alle frei.
Habe den ersten Teil erfolgreich fertig gemäß diesem Projekt:
Garagentor-Oeffner fürs Smartphone: garage oPIner
Läuft einwandfrei.
Dein Tipp hilft mir schon mal viel weiter! Besten Dank!
Die Matrix des Keypads wird in ROW und COLUMN angegeben und dann die GPI PINS zugeordnet.
Optimal
Hallo zusammen,
ich möchte ein neues Projekt umsetzen mit einem Raspberry Pi 1 B+ den ich übrig habe.
Ausgangssituation ist folgende, dass die Steuerung meines Garagentors kaputt gegangen ist und sich dieses nun nur noch über den Handsender oder von innen über einen Taster öffnen lässt.
Die separate Steuerung vom 4x3 Matrix Tastenfeld (1,2,3,4,5,6,7,8,9,0,*,#) mit Relais-Ausgang ist leider defekt.
Sollzustand wäre das Ansteuern des Garagentors über einen Zahlencode über das Tastenfeld sowie "Garage oPIner App" sollte an sich umzusetzen sein.
Das zu schaltende Relais würde ich einfach direkt an die Schaltleitungen des Antriebs hängen, dort ist ebenso der Schalter um das Tor von innen öffnen zu können und ebenso die aktuelle Steuerung die defekt ist angeschlossen.
An Hardware ist bis jetzt alles vorhanden auch ein 5V Relais Modul, warte nur noch auf die Jumperkabel damit ich mal alles stecken kann.
Die Umsetzung mit dem "Garage oPIner" stell ich mir noch am einfachsten vor, was mir jedoch etwas Kopfzerbrechen bereitet ist eben die zusätzliche Ansteuerung über das Keypad / Tastenfeld.
Ist das über die Anzahl der GPIo so überhaupt möglich umzusetzen?
Viele Grüße
Bei allen anderen funktionierts doch damit auch?
EDIT: hier haben wird doch was schönes:
Es hängt dran ein USB Verlängerungskabel mit passiven Verstärker, daran 2x SNES USB Gamepads.
Verbaut im NESPi Gehäuse inkl. Kühlkörper. Kein LAN aber WLAN.
Über HDMI am TV angeschlossen, keine GPIO Sachen außer der ein und Ausschalt Stecker für den Schalter am NESPi Gehäuse.
EDIT: habe gerade herausgefunden, dass es bei anderen Probleme gab seitdem das NESPi Case verbaut wurde, scheinbar bricht hier die Spannung ein.
Muss das mal mit der nackten Platine testen.
Hallo Zusammen,
ich habe einen Raspberry Pi 3 B mit Retropie v4.3 auf 32GB SD Karte und originalem 5,1V 2500mA Netzeil.
Nun habe ich seit kurzen beim Spielen den gelben Blitz rechts oben, welcher ja eine Unterspannung anzeigt.
Zeitgleich zum Blitz rucklen die Bildsequenzen leicht.
Ein neues Netzeil brachte leider keine Abhilfe ich kann mir nicht erklären woran das noch liegen soll?
Das einzige was sich am Setup geändert hat ist die 32GB Karte, vorher hatte ich eine 8GB Karte in Verwendung aber dort passen weniger Spiele drauf.
Den Blitz durch die SD Karte ausgelöst zu bekommen halte ich aber für unwahrscheinlich?
Viele Grüße
Hallo Zusammen,
habe herausgefunden warum das System nicht mehr korrekt lief - die SD Karte war mehr als randvoll.
Habe das System neu aufgesetzt, werde künftig öfter Sicherungen machen...
Motion läuft wieder (erstmals Versuch auf Jessie - dort lassen sich aber die Pakete nicht einlesen) sauber auf frischen Wheezy.
Der Zeitstempel funktioniert wieder
Grüße Flo
Hallo Zusammen,
ich danke euch für eure zahlreiche unterstützung, habe mich nochmal dran gesetzt und das System nochmals sauber aufgesetzt, SD Karte ist eigentlich eine 8GB - diese wird nun auch vollständig genutzt.
Man lernt nie aus.
Grüße sly