Einbinden von Skripte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
python_rawe
User
Beiträge: 5
Registriert: Mittwoch 3. Dezember 2014, 08:22

Moin,

Ich habe folgendes Problem , ich habe ein Bewegungsmelder Skript und will es mit einem Sms Gateway verbinden . Aber finde einfach nicht den passenden befehl gefunden um die beiden Skripte zu verbinden. Hab es mit subprocess.call versucht aber bekomme immer wieder Fehlermeldungen...

MFG
Zuletzt geändert von python_rawe am Mittwoch 3. Dezember 2014, 10:25, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Definiere "verbinden" und liefere etwas mehr Hintergrund.

Handelt es sich bei beiden Programmen um Python-Skripte?
Könnte man die Skripte vielleicht auch als Module verwenden?
Welche Parameter erwarten die Skripte?
Wie sieht dein Codeversuch mit subprocess.call aus, der nicht funktioniert hat?
python_rawe
User
Beiträge: 5
Registriert: Mittwoch 3. Dezember 2014, 08:22

Es sind beides Python Skripte, es soll so laufen, wenn ich das Bewegungsmelder Skript starte, und dort dann der Bewegungsmelder eine Bewegung erkennt, das dann eine SMS verschickt wird, also muss ich das SMS Script ja in das Bewegungsmelder Skript einbinden, aber genau da fehlt mir das wissen.
Hab es mal so versucht :

subprocess.call(['/pi/sms'])
und oben halt dann import subprocess
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@python_rawe: und das hat zu welchem nicht-gewünschten Ergebnis geführt?
python_rawe
User
Beiträge: 5
Registriert: Mittwoch 3. Dezember 2014, 08:22

Diese Fehlermeldung kam dort :

Bild
BlackJack

@python_rawe: Dann ist in dem Skript irgenwo davor syntaktisch etwas falsch was dem Compiler dann an der Stelle auffällt. Beseitige den Syntaxfehler, und versuch's noch mal. :-)

Text aus einem Terminal kann man übrigens als Text kopieren und hier als Text (in Code-Tags) einfügen. Das ist deutlich einfacher als ein Bild zu erstellen und das hier einzubinden. Und zukunftssicherer auch, das bleibt dann nämlich so lange im Forum wie das Forum selber existiert, und verschwindet nicht wenn das extern gehostete Bild eventuell nicht mehr existiert.
python_rawe
User
Beiträge: 5
Registriert: Mittwoch 3. Dezember 2014, 08:22

Code: Alles auswählen

# Quelle : http://www.raspberrypi-spy.co.uk/


# Erforderliche Python Bibliotheken und Module werden eingelesen
import RPi.GPIO as GPIO
import time
import subprocess
import urllib
import urllib2


# Da wir nur einen Pin zur Datenverarbeitung nutzen, ist die Funktion (GPIO.BMC) nuetzlicher als (GPIO.BOARD).
GPIO.setmode(GPIO.BCM)

# Hier wird der Output GPIO-Pin festgelegt fuer den Bewegungsmelder
GPIO_PIR = 7

print "Bewegungsmelder ist an! (STEUERUNG & C zum beenden)"

# Pin als Input gleich gesetzt
GPIO.setup(GPIO_PIR,GPIO.IN)

# Variablen zum abfragen des Bewegungsmelder Status
Current_State  = 0
Previous_State = 0


# Start des Programms(Try-Schleife)
try:

# Textausgabe
  print "Warte bis der Bewegungsmelder bereit ist!"

  # Loop bis der Output null ist -> anschalten/ausschalten input=1
  while GPIO.input(GPIO_PIR)==1:
    Current_State  = 0

# Textausgabe
  print "Bereit!"

  # While Schleife Abfrage, fals True = Ausfuehren
 while True :

    # Bewegungsmelder Pin auslesen
    Current_State = GPIO.input(GPIO_PIR)

    # Abfrage des Bewegungsmelder Status , fals Current State = 1 -> Bewegung erkannt
    if Current_State==1 and Previous_State==0:

      # Textausgabe : Fals Bewegung erkannt wurde
      print "Bewegung erkannt, der Alarm wird ausgeloest !"


subprocess.call(['/pi/sms'])

      # der jetzige Status wird wieder auf 0 gesetzt
      Previous_State=1

    # Neue Bedingung fals Previous_State = 1 ist
    elif Current_State==0 and Previous_State==1:

      # Textausgabe
      print "Der Bewegungsmelder ist wieder bereit!"

 # der bewegungsmelder wird wieder auf 0 gesetzt
      Previous_State=0

    # Einstelllung des Zeitraffers des bewegungsmelders
    time.sleep(0.20)


# Fals STEUERUNG & C gedrueckt wurde , wird die Textausgabe ausgegeben

except KeyboardInterrupt:

 print "        Das Programm wurde beendet !"

 # GPIO Pins werden auf Standart zurueckgestellt
GPIO.cleanup()

BlackJack

@python_rawe: Bei dem Quelltext kommt der Syntayfehler an einer anderen Stelle, nämlich bei der ``while``-Schleife in Zeile 42:

Code: Alles auswählen

  File "/home/bj/forum.py", line 42
    while True :
               ^
IndentationError: unindent does not match any outer indentation level
Das selbe Problem hätte auch Dein `subprocess`-Aufruf. Die Einrückung ist ein wichtiger Bestandteil von Python's Syntax. Daran erkennt der Compiler die Code-Struktur.

Es macht ein wenig den Eindruck Du versuchst da zwei Skripte die nicht von Dir sind zu verbinden, ohne selber die Grundlagen von Python zu kennen. Dann bleibt ja nur raten und probieren, das führt aber bei komplexeren Sachen wie Programmieren selten zum gewünschten Ergebnis und noch seltener zu einer guten Lösung, selbst wenn es ”funktioniert”.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Und anstelle von flags à la 'Current_State' und Co. könntest du die 'event_detected()' Funktion nutzen.
python_rawe
User
Beiträge: 5
Registriert: Mittwoch 3. Dezember 2014, 08:22

Ja , bin ziemlicher neuling in Python dies ist für ein Projekt , wisst ihr nun wie ich die beiden Skripte verbinden kann ?
Und wie meinst du das mit 'event_detected()?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@python_rawe
Im Prinzip so wie es in der Doku steht :wink:

Code: Alles auswählen

def motion_detected(channel):
    print('Motion detected on channel %s' % channel)
    subprocess.call(['/pi/sms'])

GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=motion_detected)
Antworten