Posts by nobody2311

    Hallo zusammen,


    ich plane derzeit für einen Bekannten eine Möglichkeit, das Gewicht eines Bienenkastens (kenn den korrekten Begriff nicht ;) ) zu wiegen und einem Webserver oder über Telegram mitzuteilen. Das letzte Kapitel, dass noch offen steht, ist die Stromversorgung.


    Der geplante Aufbau:

    • Pi Zero + 4x Wägezellen (5V) + UMTS-Stick (Huawei K4505-Z)
    • Stepdown mit max. 5A
    • Zeitschaltuhr
    • 12V 7,2Ah Bleiakku
    • Laderegler 12V 10A
    • Solarzelle 12V max. 20W


    Der Pi soll dann, einmal am Vormittag und einmal am Nachmittag, das Gewicht übertragen. Die max. Laufzeit wäre dann etwa 30min. inkl. Verbindungsaufbau usw. Jetzt die spannende Frage an die (Hobby)Elektriker/Techniker: Hab ich etwas vergessen oder ist der Aufbau etwas oversized?


    Danke im voraus für eure Antworten ;)

    Ich kann dir jetzt keine explizite Lösung anbieten, aber ich hab mit pyload schon etliche Probleme erlebt - angefangen bei der Installation, bis zum entpacken. Obwohl ich pyload wirklich sehr sehr mochte, hab ich letztendlich zum jDownloader gewechselt und bereue es kein bisschen. Die ganze für pyload aufgebrachte Zeit hätte ich auch anders nutzen können, aber sei's drum, dafür nennt es man schließlich "Hobby" :lol:


    Damit ich jDownloader vernünftig nutzen kann, hab ich eine kleine Debian8-VM mit XCFE am laufen und die Verzeichnisse per NFS eingebunden. Wobei aber natürlich Raspian für den Pi besser geeignet ist ;)


    So was habe ich mit einem Trockner gemacht:
    http://www.forum-raspberrypi.d…agen?pid=191079#pid191079


    Den Thread hab ich auch schon gelesen, aber anscheinend überlesen, dass die Steckdosen via WLAN verbunden sind. Mit meinem Smartphone hab ich im Keller zwar WLAN, aber max. 1 Balken (~10%?). Könnte also ausreichen.. In deinem Thread stand auch etwas mit der "Ende-LED", was auch eine Möglichkeit wäre dort das Signal abzufangen. Ich denke ich versuch es mit dem ESP8266, falls der nicht ausreichend sein sollte, meld ich mich nochmal ;)



    Wenn man sich die Zeit nicht merken an, wann die Waschmaschine fertig ist, dann stellt man sich die Eieruhr! :D
    Schnellste und günstigste Variante. ;)


    Wo bleibt da der Spaß am tüffteln? ^^


    Danke schon mal für die guten Tipps :danke_ATDE:
    Ich lass den Thread erstmal offen...


    Es gibt noch wesentlich mehr Funklösungen als Du aufgezählt hast. Schau zum Beispiel mal unter LoRa. Die einfachste Möglichkeit wäre aber wohl Power-LAN. Für diese Anwendung würde ich aber keinen RasPi nehmen, sondern eine ESP8266 auf einem kleinen Breadboard.


    Die Sache mit dem ESP8266 klingt interessant. Dazu werde ich mal schauen, ob das WLAN Signal vielleicht doch reicht. Danke für den Tipp :thumbs1:


    golmic: Die Seite habe ich schon gefunden. Leider wird das DECT Signal nicht ausreichen, um eine Verbindung herzustellen. Aber die Steckdose nutz ich für was anderes und find sie genial ;)

    Hallo zusammen,
    ich beschäftige mich seit einiger Zeit mit einer Lösung, um eine Benachrichtigung zu erhalten, sobald die Waschmaschine fertig ist. Dazu gibt es zwar schon unzählige Threads und Tutorials, aber bisher kam ich auf keine gute Idee und möchte euch um Rat fragen.


    Das größte Problem ist die Entfernung zwischen der Wohnung/Router im 2. Stock und der Waschmaschine im Keller. Das Haus steht seit ca. 25 Jahren und wird von 9 Parteien bewohnt, daher scheiden verschiedene Lösungen aus:


    • LAN Kabel außen/innen
    • Verbindung über 433 MHz (wegen der Entfernung?)
    • WLAN Empfang ist im Keller sehr schwach und evtl. zu schwach


    Es bleibt daher nur noch eine Power-LAN Verbindung oder irgendwas über das "normale" Handynetz, oder habe ich etwas vergessen?

    Auch wenn das Projekt schon älter ist, möchte ich gerne etwas ähnliches mit einem (überflüssigen) Rauchmelder nachbauen.


    Ich hab nur eine Frage zum Schaltplan auf Seite 1 vom Rauchmelder & Raspberry Pi:
    Welchen NPN-Transistor hast du verwendet bzw. welchen könnte man verwenden?
    (hab leider kein Datenblatt zum IC aus meinem Rauchmelder gefunden)

    Danke, das war der entscheidende Hinweis :lol: :lol: :lol:


    Hab gar nicht daran gedacht, dass das an HTML liegt. :danke_ATDE:


    gelöst mit:[code=php]<script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#zeile1').load('../ZEILE1.txt'); }, 5000); });</script><span id="zeile1" style="white-space: pre;"> </span> [/php]

    Danke für deine Antwort. Ich hab mich vielleicht etwas falsch ausgedrückt (hab den ersten Beitrag editiert). Die Textdatei liegt auch im Webverzeichnis. Insgesamt spielt sich alles auf dem gleichen Raspberry Pi ab: Webserver, Browser und die Textdatei.


    Einzig das Bash-Skript läuft wo anders:

    • verschiedene Werte von unterschiedlichen Geräten werden auf einer NFS-Freigabe "gesammelt"
    • mit einem Bash-Skript wird dann alles ins Webverzeichnis kopiert


    Die lokale Webseite wird durch den Raspberry Pi am Monitor im Vollbildmodus angezeigt und nicht über andere Clients aufgerufen (außer mal was zum testen, o.ä.)

    Hallo zusammen,


    ich habe mir ein Modul geschrieben, für einen SmartMirror (auf Basis von Glancr bzw. MirrOS) und ein kleines Problem, bei dem auslesen einer Textdatei bzw. mit den beinhaltenden Leerzeichen.


    Vorab: Die Textdatei wird inkl. den Leerzeichen über ein Bash-Skript erstellt, was von AVM DECT200 den aktuellen Stromverbrauch abfragt - was auch einwandfrei funktioniert. Es werden zwar insgesamt 4 Zeilen dargestellt, aber nur die erste beinhaltet die Leerzeichen, damit man sofort sieht, wann die letzte Aktualisierung war.


    Die relevante Zeile in dem Bash-Skript mit den Leerzeichen zwischen "W" und "($UHRZEIT)"

    Code
    echo "$switchpower W        ($UHRZEIT)" > /var/www/html/ZEILE1.txt


    -> das gesamte Skript ist hier im Forum unter "abgeschlossene Projekte" (Danke fürs verschieben ;) )


    Der Javascript-Code in einer PHP-Datei:
    [code=php]<script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#zeile1').load('../ZEILE1.txt'); }, 5000); });</script><span id="zeile1"> </span>[/php]


    Leider werden mir dann im SmartMirror der Abstand zwischen "W" und "($UHRZEIT)" nicht vollständig angezeigt, sondern immer auf 1 Leerzeichen gekürzt. Ich hab leider so gut wie keine Ahnung von Javascript (nur etwas PHP, Java, Python und HTML) und finde mangels Erfahrung&Kenntnisse keine Erklärung für das Verhalten. Das einzige, was ich rausgefunden habe ist, das load() eigentlich veraltet ist und nicht mehr verwendet werden soll. Da aber alles lokal im Netzwerk abläuft, mach ich mir sicherheitstechnisch keine Sorgen..


    Freu mich über jeden Hinweis/Tipp :D


    EDIT: Hab ich vielleicht vergessen zu erwähnen, die Textdatei liegt ebenfalls im Webverzeichnis. Der Browser ruft demnach die Textdatei auf dem Webserver ab.

    Achso, ja das hätte ich noch erwähnen sollen.. Grundsätzlich funktioniert der Zähler und macht seine Arbeit - zumindest wurden die Impulse korrekt in eine Textdatei geschrieben. Ich hab dann verschiedene Tutorials probiert und auch mit verschiedenen Lösungen experimentiert, um das ganze grafisch darzustellen, aber so richtig funktioniert hat es irgendwie nie. :s


    Da ich zusätzlich kurz vor einem Hardwarewechsel stand, wollte gerne den vorher/nachher Effekt sehen. ;)

    Kurzes Update für die, die ein ähnliches Projekt umsetzen möchten.


    Inzwischen ist etwas zeit vergangen und ich habe mich inzwischen vom S0-Zähler abgewendet. Derzeit nutze ich die DECT200 von AVM, die noch vor meiner USV hängt und protokolliert den Energieverbrauch sehr gut mit. Ich habe mich allerdings gefragt, ob man die aufgezeichneten Daten nicht an andere Geräte "weiterreichen" kann und siehe da, sowas funktioniert. Das Skript selbst habe ich von hier und nur etwas angepasst, damit die Werte in eine Textdatei geschrieben werden. Letztendlich werden mir die Werte im 5 Minuten Takt durch meinen SmartMirror (von Glancr) gelesen und dargestellt. Das Skript läuft in einer VM, die noch andere lokale Aufgaben erfüllt, startet dort als Cronjob alle 5 Minuten und schreibt die Werte in eine Textdatei, die auf einer NFS-Freigabe liegt. Der Spiegel holt sich dann die Werte von der NFS-Freigabe, kopiert es in das Webverzeichnis und aktualisiert sich selbstständig über Javascript.


    Es kann sehr gut möglich sein, dass das nicht der beste Weg ist sowas umzusetzen, aber es funktioniert. Gerade mit Javascript habe ich so gut wie keine Erfahrung und denke, dass man das vielleicht auch mit einer Schleife o.ä. hätte umsetzen können. Auch das kopieren per Cronjob in das Stamm(web)verzeichnis vom SmartMirror keine schöne Lösung, aber so wie ich es verstanden hab, kann man mit Javascript keine Dateien außerhalb des Webservers lesen/öffnen. :s


    Letztendlich möchte ich aber damit dem Forum auch etwas zurückgeben ;)


    1. Daten auslesen


    2. Daten kopieren

    Bash
    #!/bin/bash
    cat /media/PFAD-ZUR-FREIGABE/dect_line1.txt > /var/www/html/dect_line1.txt
    cat /media/PFAD-ZUR-FREIGABE/dect_line2.txt > /var/www/html/dect_line2.txt
    cat /media/PFAD-ZUR-FREIGABE/dect_line3.txt > /var/www/html/dect_line3.txt
    cat /media/PFAD-ZUR-FREIGABE/temp_glancr.txt > /var/www/html/dect_line4.txt
    sed -i 's/$/ °C/g' /var/www/html/dect_line4.txt
    cat /media/PFAD-ZUR-FREIGABE/temp_omv.txt > /var/www/html/dect_line5.txt
    sed -i 's/$/ °C/g' /var/www/html/dect_line5.txt
    exit


    3. Daten darstellen
    [code=php]<link rel="stylesheet" href="../modules/dect200/frontend/styles.css"/>
    <h2 class="module__title">Serverraum</h2>


    <script type="text/javascript" src="./jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
    setInterval( function(){
    $('#line1').load('../dect_line1.txt');
    }, 5000);
    });
    </script>
    <table border="0" cellspacing="0" cellpadding="0">
    <tr>
    <td>Aktuell: </td>
    <td><script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#line1').load('../dect_line1.txt'); }, 5000); });</script><span id="line1"> </span></td>
    </tr>
    <tr>
    <td>Gesamt: </td>
    <td><script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#line2').load('../dect_line2.txt'); }, 5000); });</script><span id="line2"> </span></td>
    </tr>
    <tr>
    <td>Raumtemperatur: </td>
    <td><script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#line3').load('../dect_line3.txt'); }, 5000); });</script><span id="line3"> </span></td>
    </tr>
    <tr>
    <td>SmartMirror: </td>
    <td><script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#line4').load('../dect_line4.txt'); }, 5000); });</script><span id="line4"> </span></td>
    </tr>
    <tr>
    <td>Server-Temperatur: </td>
    <td><script type="text/javascript">$(document).ready(function() { setInterval( function(){ $('#line5').load('../dect_line5.txt'); }, 5000); });</script><span id="line5"> </span></td>
    </tr>
    </table>
    </div>
    [/php]


    P.S.: Unter den Punkten 2 und 3 werden noch die CPU Temperaturen vom Raspberry Pi und meinem Homeserver eingefügt/angezeigt.


    Wenn ich mich nun in Javascript besser auskennen würde, könnte man z.B. ein fertiges Modul entwerfen und die notwendigen Daten dann über das WebGUI von mirros eintragen. Mir bleibt leider nix anderes übrig, als mich mit dieser Lösung "abzufinden" :D

    Kurze Nachfrage zum Auswerten der Impulse..


    Ich konnte soweit alles einrichten und es wird nun über eine NFS-Freigabe eine Datei erstellt. (NFS wegen den vielen Schreibzugriffen)
    In dieser Datei wird die Zahl (beginnt mit 0 oder 1) bei jedem Impuls um eins erhöht. Jetzt müsste ich über ein Programm/Skript (?) die Zeit zwischen den Impulsen messen und auf ein Diagramm übertragen, aber genau da hapert es bei mir.


    Welche Möglichkeiten gibt es denn dafür eigentlich alles und was wäre "am einfachsten"?
    Im Grunde wäre eine PHP Datei gut, die ich dann anderswo über z.B. php include im Netzwerk einbinden könnte.

    Der Stromzähler ist gestern angekommen und wurde direkt "eingebaut".. Vorerst noch ohne hübsches Gehäuse, aber das kommt definitiv noch ;)


    Ich bin im Moment dran, mir einen Überblick über das Software-Angebot zu verschaffen. Bis jetzt hab ich folgendes gefunden:


    So wie ich das verstanden habe, wäre openHAB und FHEM etwas übertrieben. Im Grunde möcht ich sowas wie den Eigenbau von "blog.webernetz.net", wobei es mich aber trotzdem interessiert, ob ihr noch weitere Möglichkeiten/Software kennt.


    Danke im voraus ;)

    Wow, da bin ich echt baff.. Funktioniert einwandfrei. Hatte am Anfang nur ein paar Probleme, weil ich den Bot-Token nicht eingefügt hatte :blush: :lol:


    Nur damit ich es auch verstehe, du hast jetzt 'Popen' genommen, statt 'subprocess.check_output'. Kannst du mir kurz erklären, was daran anders ist? Ich hab zwar das hier gefunden http://www.python-kurs.eu/os_modul_shell.php, kann aber damit nur vermuten, dass die Ausgabe "so wie sie ist" mithilfe von 'stdout=PIPE' übernommen wird(?). Ist dann diese Variante weniger anfällig für Fehler oder einfach "neuer"? Und wenn man die Wahl hat, sollte man Popen bevorzugen?


    Nochmals Danke für deine Hilfe, ich bin immer noch fasziniert, dass das Skript funktioniert :danke_ATDE: :danke_ATDE: :danke_ATDE:


    /EDIT:
    Diejenigen, die das Skript auch einsetzen möchten: Die Anwesenheitserkennung durch WLAN ist für Android & iPhone ein echtes Problem, weil das WLAN der Geräte im Standby vollständig oder sporadisch deaktiviert wird - auch wenn in den Einstellungen was anderes gewählt wird. Betrifft jedes iPhone mit dem Update, welches vor ca. 3-4 Wochen verteilt wurde. Bei Android ist es schwieriger und extrem Geräteabhängig - bei dem einen Funktioniert es, beim anderen nicht. Einzig die WindowsPhones (mit Windows 10 Mobile) sind davon nicht betroffen und halten die WLAN Verbindung permanent aufrecht. Man könnte natürlich auch mehrere Geräte hinzufügen, um Fehlalarme auszuschließen. z.B. Mediaplayer, Laptops, etc.


    ...als Denkanstoß: Vielleicht wäre eine Anwesenheitserkennung mit Bluetooth eine Option oder per NFC/Hardwareschalter a.d. Haustüre manuell ein-/auschecken...


    Zunächst solltest du dir einheitliche Einrückungen angewöhnen, nicht mal 2, mal 4, mal 8 sondern durchweg 4.
    In einer Schleife keine Funktion definieren, sondern ausserhalb.
    In /usr/bin/ keine Texdateien ablegen.


    Ah okay, dann werd ich das so machen. Ich ging davon aus, dass es bei dem "try: ...." explizit 2 sein müssen, aber wie gesagt, die vorherigen und nachfolgenden Zeilen waren nicht von mir.


    Den nmap Befehl habe ich abgeändert da es eigentlich nur wichtig ist ob "host up)" in der Ausgabe vor kommt - wir müssen nicht explizit die 1 heraus fischen.


    Achso, ja True und False geht ja auch.. Daran hab ich gar nicht gedacht :blush:




    Insofern solltest du noch mal prüfen ob das wirklich fehlerfrei bei dir funktioniert.


    Hmm komisch, bei mir funktioniert das einwandfrei. Kommt manchmal vor, dass es beim ersten Versuch nicht auf anhieb gelingt.Für die IP 192.168.178.99 (existiert nicht), bekomm ich keine Ausgabe, was ja auch so gewollt ist, oder?
    [code=php]pi@glancr:~ $ sudo nmap -F -Pn -sF 192.168.178.99 | grep "host up)"
    pi@glancr:~ $ sudo nmap -F -Pn -sF 192.168.178.20 | grep "host up)"
    Nmap done: 1 IP address (1 host up) scanned in 2.38 seconds
    pi@glancr:~ $
    [/php]



    Hab mir auch erlaubt für deine prints eine Funktion zu setzen, falls du später mal das Design ändern willst brauchst du das nur ein mal anpassen ;)


    Ach cool.. Das kann ich mir gleich mal aufschreiben. Sowas kann man immer mal brauchen :danke_ATDE:



    Danke für deine Bemühungen :thumbs1: Ich hab das Skript mal im Terminal gestartet und der erste Durchgang (ohne die Geräte im LAN) funktioniert fehlerfrei, aber wenn eines der Geräte im Netzwerk ist, dann erhalte ich diesen Fehler:
    [code=php]2017-04-20 13:11:54.020502: Bewegung erkannt!
    2017-04-20 13:11:56.022632: Suche Gerät1 ...
    2017-04-20 13:11:56.022994: <5> Suche Gerät: 192.168.178.31
    2017-04-20 13:12:03.929411: Gerät 1: GEFUNDEN
    2017-04-20 13:12:03.929939: Suche Gerät2 ...
    2017-04-20 13:12:03.930208: <5> Suche Gerät: 192.168.178.20
    2017-04-20 13:12:08.295498: Gerät 2: GEFUNDEN
    2017-04-20 13:12:08.296476: Kein Alarm! Mindestens ein Gerät wurde im Netzwerk gefunden
    2017-04-20 13:12:08.296969: Warte 5 Minuten
    [...]
    2017-04-20 13:34:20.351873: Bewegung erkannt!
    2017-04-20 13:34:22.354736: Suche Gerät1 ...
    2017-04-20 13:34:22.355234: <5> Suche Gerät: 192.168.178.20
    Traceback (most recent call last):
    File "/usr/bin/bewegungsmelder3.py", line 61, in <module>
    device1 = finde_geraet(geraet_1)
    File "/usr/bin/bewegungsmelder3.py", line 28, in finde_geraet
    response = subprocess.check_output('/usr/bin/nmap -F -Pn -sF %s | grep "host up)"' % IP, shell=True)
    File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
    subprocess.CalledProcessError: Command '/usr/bin/nmap -F -Pn -sF 192.168.178.20 | grep "host up)"' returned non-zero exit status 1
    [/php]


    Kannst du bitte die Fehlermeldung unverändert posten? Mit deinen LAN IP-Adressen können wir sowieso nichts anstellen, deshalb sind es ja LAN Adresse. 192.168.178.31 hast du zB vergessen durch **IP-ADRESSE2** zu ersetzen.


    Verdammt, erwischt :lol: Okay, dann unverändert ;) Hier einmal das gesamte Skript mit nmap als Modul (hab nur den Bot-Token entfernt ;) )
    [code=php]
    #!/usr/bin/python
    # -*- coding: utf-8 -*-


    import RPi.GPIO as GPIO
    import time
    import datetime
    import subprocess
    import telepot
    import nmap


    #Board Mode anstelle GPIO BCM Nummer
    GPIO.setmode(GPIO.BOARD)


    # GPIO 7 = Bewegungsmelder
    # GPIO 11 = Relais
    GPIO_PIR = 7
    GPIO_MON = 11


    print "Bewegungsmelder Test (CTRL-C zum Beenden)"
    print "========================================="


    # GPIO als "Input" festlegen
    GPIO.setup(GPIO_PIR,GPIO.IN)
    GPIO.setup(GPIO_MON,GPIO.OUT)


    try:


    while True :


    # Status von Sensor auslesen
    Current_State = GPIO.input(GPIO_PIR)
    time.sleep(0.2)


    # Wenn Bewegung, dann ...
    if Current_State==1 and Previous_State==0:


    print "%s: Bewegung erkannt!" % datetime.datetime.now()
    Previous_State=1
    GPIO.output(GPIO_MON, GPIO.LOW)
    time.sleep(1)
    GPIO.output(GPIO_MON, GPIO.HIGH)
    time.sleep(1)


    #if not response1 and not response2:
    def finde_geraet(IP='127.0.0.1', args='-F -Pn -sF', count=5):
    while count > 0:
    print "%s: Suche Gerät %s ..." % (datetime.datetime.now(), IP)
    res = None
    try: res = nm.scan(IP, arguments=args)
    except nmap.nmap.PortScannerError: pass
    if res:
    if nm[IP].state() == "open":
    return True
    count -= 1
    return False


    nm = nmap.PortScanner()


    success_1 = finde_geraet('192.168.178.20')
    success_2 = finde_geraet('192.168.178.31')
    if not success_1 and not success_2:
    print "%s: KEIN GERÄT GEFUNDEN! Starte jetzt den TelegramBot" % datetime.datetime.now()
    def handle(msg):
    if 'text' in msg and msg['text'] == '/start':
    with open('/usr/bin/bewegungsmelder_id.txt', 'w') as f:
    f.write(str(msg['chat']['id']))
    bot = telepot.Bot('*******')
    bot.message_loop(handle)
    print "%s: TelegramBot: Suche Empfänger-ID aus Liste ..." % datetime.datetime.now()
    with open('/usr/bin/bewegungsmelder_id.txt', 'r') as idfile:
    chat_id=int(idfile.read())
    bot.sendMessage(chat_id, "\n========================\nACHTUNG!\nJemand ist zuhause!")
    print "%s: TelegramBot: Nachricht erfolgreich abgeschickt!" % datetime.datetime.now()
    time.sleep(1)
    print "%s: Warte 6 Minuten" % datetime.datetime.now()
    time.sleep(360)


    else:
    print "%s: Kein Alarm! Mindestens ein Gerät wurde im Netzwerk gefunden" % datetime.datetime.now()
    print "%s: Warte 6 Minuten" % datetime.datetime.now()
    time.sleep(360)
        
    # Wenn keine Bewegung, dann ...
    elif Current_State==0 and Previous_State==1:


    print " %s: Fertig! Warte auf Bewegung..." % datetime.datetime.now()
    Previous_State=0
    GPIO.output(GPIO_MON, GPIO.LOW)
    time.sleep(1)
    GPIO.output(GPIO_MON, GPIO.HIGH)
    time.sleep(1)
      
    except KeyboardInterrupt:
    print " Exit"
    GPIO.cleanup()
    [/php]


    und die dazugehörige Fehlermeldung:
    [code=php]2017-04-20 07:41:00.641399: Bewegung erkannt!
    2017-04-20 07:41:02.693227: Suche Gerät 192.168.178.20 ...
    2017-04-20 07:41:15.792825: Suche Gerät 192.168.178.31 ...
    Traceback (most recent call last):
    File "/usr/bin/bewegungsmelder.py", line 93, in <module>
    success_2 = finde_geraet('192.168.178.31')
    File "/usr/bin/bewegungsmelder.py", line 85, in finde_geraet
    if nm[IP].state() == "up":
    File "/usr/lib/python2.7/dist-packages/nmap/nmap.py", line 567, in __getitem__
    return self._scan_result['scan'][host]
    KeyError: '192.168.178.31' [/php]


    Vielleicht beschreibst du noch mal das Problem aus Beitrag#1 genauer?
    Weil da schreibst du nur: while-Teil "falsch" macht
    Das ist aber ein bisschen mager ;)


    Stimmt, sorry, war schlecht formuliert. Also bei dem Skript aus Beitrag#1 wird der while-Teil übersprungen, d.h. egal ob eins der beiden Geräte im Netzwerk ist, wird die Nachricht direkt (über Telepot/Telegram) verschickt. Funktioniert aber "richtig", wenn sich keines der beiden Geräte im Netzwerk befindet.
    ..und hier das gesamte Skript ohne nmap Modul, aber mit dem ursprünglichen cut/grep und überspringen der while-Schleife:
    [code=php]
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    PATH=/usr/bin:/bin:/sbin


    import RPi.GPIO as GPIO
    import time
    import datetime
    import subprocess
    import telepot


    #Board Mode anstelle GPIO BCM Nummer
    GPIO.setmode(GPIO.BOARD)


    # GPIO 7 = Bewegungsmelder
    # GPIO 11 = Relais
    GPIO_PIR = 7
    GPIO_MON = 11


    print "Bewegungsmelder Test (CTRL-C zum Beenden)"
    print "========================================="


    # GPIO als "Input" festlegen
    GPIO.setup(GPIO_PIR,GPIO.IN)
    GPIO.setup(GPIO_MON,GPIO.OUT)


    k = int(1)
    response1 = 0
    response2 = 0
    device1 = 0
    device2 = 0
    Current_State = 0
    Previous_State = 0


    try:


    #print "%s: Sensor initialisieren ..." % datetime.datetime.now()


    # Warten bis Sensor sich meldet
    #while GPIO.input(GPIO_PIR)==1:
    #Current_State = 0
    #time.sleep(0.2)


    #print "%s: Fertig! Warte auf Bewegung..." % datetime.datetime.now()


    # Schleife bis CTRL+C
    while True :


    # Status von Sensor auslesen
    Current_State = GPIO.input(GPIO_PIR)
    time.sleep(0.2)


    # Wenn Bewegung, dann ...
    if Current_State==1 and Previous_State==0:


    print "%s: Bewegung erkannt!" % datetime.datetime.now()
    Previous_State=1
    GPIO.output(GPIO_MON, GPIO.LOW)
    time.sleep(1)
    GPIO.output(GPIO_MON, GPIO.HIGH)
    time.sleep(1)
    while (k <= 5) and (device1 == 0) and (device2 == 0):
    print "%s: Suche Gerät1 ..." % datetime.datetime.now()
    response1 = subprocess.check_output('/usr/bin/nmap -F 192.168.178.20 -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    device1 = int(response1)
    if device1==1:
    print "%s: Gerät 1: GEFUNDEN (%s. Versuch)" % (datetime.datetime.now(), k)
    else:
    print "%s: Gerät 1: keine Antwort (%s. Versuch)" % (datetime.datetime.now(), k)
    print "%s: Suche Gerät 2 ..." % datetime.datetime.now()
    response2 = subprocess.check_output('/usr/bin/nmap -F 192.168.178.31 -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    device2 = int(response2)
    if device2==1:
    print "%s: Gerät 2: GEFUNDEN (%s. Versuch)" % (datetime.datetime.now(), k)
    else:
    print "%s: Gerät 2: keine Antwort (%s. Versuch)" % (datetime.datetime.now(), k)
    #zähler
    k = k + 1


    if device1==0 and device2==0:
    print "%s: KEIN GERÄT GEFUNDEN! Starte jetzt den TelegramBot" % datetime.datetime.now()
    def handle(msg):
    if 'text' in msg and msg['text'] == '/start':
    with open('/usr/bin/bewegungsmelder_id.txt', 'w') as f:
    f.write(str(msg['chat']['id']))
    bot = telepot.Bot('******')
    bot.message_loop(handle)
    print "%s: TelegramBot: Suche Empfänger-ID aus Liste ..." % datetime.datetime.now()
    with open('/usr/bin/bewegungsmelder_id.txt', 'r') as idfile:
    chat_id=int(idfile.read())
    bot.sendMessage(chat_id, "\n========================\nACHTUNG!\nJemand ist zuhause!")
    print "%s: TelegramBot: Nachricht erfolgreich abgeschickt!" % datetime.datetime.now()
    time.sleep(1)
    print "%s: Warte 5 Minuten" % datetime.datetime.now()
    time.sleep(300)


    else:
    print "%s: Kein Alarm! Mindestens ein Gerät wurde im Netzwerk gefunden" % datetime.datetime.now()
    print "%s: Warte 5 Minuten" % datetime.datetime.now()
    time.sleep(300)
        
    # Wenn keine Bewegung, dann ...
    elif Current_State==0 and Previous_State==1:


    print " %s: Fertig! Warte auf Bewegung..." % datetime.datetime.now()
    Previous_State=0
    GPIO.output(GPIO_MON, GPIO.LOW)
    time.sleep(1)
    GPIO.output(GPIO_MON, GPIO.HIGH)
    time.sleep(1)
      
    except KeyboardInterrupt:
    print " Exit"
    GPIO.cleanup()
    [/php]

    Ah okay, ja das lässt sich schnell beantworten. ;)


    Der Raspberry Pi dient zusammen mit einem Monitor und einem Spionspiegel als "SmartMirror". Das gesamte Skript steuern ein Relais, welches dann einen Monitor ein/ausschaltet, sobald jemand vor dem Bewegungsmelder ist. Der Rest vom Skript arbeitet fehlerfrei, deswegen hab ich nur den "relevanten" Teil kopiert, zumal die restlichen Zeilen auch nicht von mir sind.


    ..daher also dann mit "&"

    Danke für eure schnelle Antwort :thumbs1:


    Soweit ich das sehe erhöht sich "k" nur an einer Stelle und das auch nur bei der Suche nach Gerät#2


    Huch, das hat sich wohl beim copy&paste verschoben. "k" sollte sich erst am Ende der while-Schleife um 1 erhöhen :blush: Habs im Beitrag ausgebessert



    Du scheinst auch "nmap" nur dazu zu verwenden eine IP im Netzwerk zu finden
    [..]
    Aber was spricht gegen einen einfachen Ping?


    Einen einfachen Ping, hatte ich am Anfang bereits versucht, aber kurioserweise wurde dann das Android-Gerät nicht gefunden. Im Netz fand ich dann diverse Berichte, wo anscheinend Android ab 6.x auf einen Ping nicht reagiert. Mit nmap kam das zwar auch mal vor, aber spätestens nach dem 2./3. Versuch, gab es dann eine positive Rückmeldung, daher die 5 Versuche.


    Danke für dein Beispiel-Code. Ich habs etwas angepasst und das Modul installiert und am Anfang hinzugefügt. Soweit kann ich alles nachvollziehen und (fast) jede Zeile verstehen. Die Funktion (nennt man den "def"-Teil so?!) liefert ein True oder ein False nachdem man es mit "success_x = finde_geraet('xxx.xxx.xxx.xxx')" aufgerufen hat. Startet bei 5 und zählt am Ende bis 0 runter.
    [code=php]
    def finde_geraet(IP='127.0.0.1', args='-F -Pn -sF', count=5):
    while count > 0:
    print "%s: Suche Gerät %s ..." % (datetime.datetime.now(), IP)
    res = None
    try: res = nm.scan(IP, arguments=args)
    except nmap.nmap.PortScannerError: pass
    if res:
    if nm[IP].state() == "up":
    return True
    count -= 1
    return False


    nm = nmap.PortScanner()


    success_1 = finde_geraet('**IP-ADRESSE1**')
    success_2 = finde_geraet('**IP-ADRESSE2**')
    if not success_1 and not success_2:
    [..]
    [/php]


    Leider bekomme ich beim ausführen im Terminal dann eine Fehlermeldung und kann damit aber irgendwie nichts anfangen. Scheint so, als wenn es ein Problem mit dem Ergebnis "up" gibt :s Habs auch mal mit "open" versucht, aber da neigt sich mein "halbwissen" dem Ende zu ;)
    (Das Gerät mit der **IP-ADRESSE2** war in dem Moment im gleichen Netzwerk)


    [code=php]2017-04-20 07:41:00.641399: Bewegung erkannt!
    2017-04-20 07:41:02.693227: Suche Gerät **IP-ADRESSE1** ...
    2017-04-20 07:41:15.792825: Suche Gerät **IP-ADRESSE2** ...
    Traceback (most recent call last):
    File "/usr/bin/bewegungsmelder.py", line 93, in <module>
    success_2 = finde_geraet('192.168.178.31')
    File "/usr/bin/bewegungsmelder.py", line 85, in finde_geraet
    if nm[IP].state() == "up":
    File "/usr/lib/python2.7/dist-packages/nmap/nmap.py", line 567, in __getitem__
    return self._scan_result['scan'][host]
    KeyError: '**IP-ADRESSE2**'
    [/php]



    Wenn das Skript permanent läuft m.E. ebenfalls.


    Habs entfernt ;)

    Hallo zusammen,


    ich hab seit Tagen ein kleines Problem mit meinem Python Skript. Nachdem ich nun so ziemlich jedes Forum fast jeden Beitrag abgeklappert habe, wende ich mich an euch :D


    Ich hab ein Skript welches in der root crontab bei jedem reboot startet.

    Code
    @reboot /bin/sleep 30 && /usr/bin/python /usr/bin/bewegungsmelder.py &


    Ich habe aber in meinem Skript mehrere Schleifen und kann den Fehler auf ziemlich genau eine Zeile eingrenzen. Als nicht gelernter Programmierer, kenn ich natürlich nicht die verscheidenen Module von Python, aber ich vermute, dass das Problem hier liegt. Ich komm darauf, weil wenn das Skript im Hintergrund (mit-)startet, genau den while-Teil "falsch" macht..
    [code=php]
    #nach 2 Geräten suchen mit insgesamt maximal 5 Durchgängen
    while (k <= 5) and (device1 == 0) and (device2 == 0):
    print "%s: Suche Gerät1 ..." % datetime.datetime.now()
    response1 = subprocess.check_output('/usr/bin/nmap -F **IP-ADRESSE** -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    device1 = int(response1)
    if device1==1:
    print "%s: Gerät 1: GEFUNDEN (%s. Versuch)" % (datetime.datetime.now(), k)
    else:
    print "%s: Gerät 1: keine Antwort (%s. Versuch)" % (datetime.datetime.now(), k)
    print "%s: Suche Gerät 2 ..." % datetime.datetime.now()
    response2 = subprocess.check_output('/usr/bin/nmap -F **IP-ADRESSE** -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    device2 = int(response2)
    if device2==1:
    print "%s: Gerät 2: GEFUNDEN (%s. Versuch)" % (datetime.datetime.now(), k)
    else:
    print "%s: Gerät 2: keine Antwort (%s. Versuch)" % (datetime.datetime.now(), k)
    #zähler
    k = k + 1


    #ausführen, wenn keines der beiden Geräte erreichbar ist
    if device1==0 and device2==0:
    print "%s: KEIN GERÄT GEFUNDEN! Starte jetzt den TelegramBot" % datetime.datetime.now()
    def handle(msg):
    if 'text' in msg and msg['text'] == '/start':
    with open('/usr/bin/id.txt', 'w') as f:
    f.write(str(msg['chat']['id']))
    bot = telepot.Bot('******')
    bot.message_loop(handle)
    print "%s: TelegramBot: Suche Empfänger-ID aus Liste ..." % datetime.datetime.now()
    with open('/usr/bin/id.txt', 'r') as idfile:
    chat_id=int(idfile.read())
    bot.sendMessage(chat_id, "\n========================\nACHTUNG!\nJemand ist zuhause!")
    print "%s: TelegramBot: Nachricht erfolgreich abgeschickt!" % datetime.datetime.now()
    time.sleep(1)
    print "%s: Warte 5 Minuten" % datetime.datetime.now()
    time.sleep(300)


    #wenn ein Gerät erreichbar ist
    else:
    print "%s: Kein Alarm! Mindestens ein Gerät wurde im Netzwerk gefunden" % datetime.datetime.now()
    print "%s: Warte 5 Minuten" % datetime.datetime.now()
    time.sleep(300)
    [/php]
    Was soll das Skript machen?
    Es soll max. 5x nach 2 Geräten im gleichen Netzwerk sind suchen. Sobald eines erreichbar ist, zum nächsten Abschnitt springen. Der wäre dann (wenn kein Gerät erreichbar ist) das Verschicken einer Nachricht über Telegram bzw. Telepot (fehlerfrei).


    Wie gesagt, ich bin kein Programmierer, aber ich schätze, dass es an diesen Zeilen liegt:
    [code=php]response1 = subprocess.check_output('/usr/bin/nmap -F **IP-ADRESSE** -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    [...]
    response2 = subprocess.check_output('/usr/bin/nmap -F **IP-ADRESSE** -Pn -sF | grep "host" | cut -d"(" -f2 | cut -d")" -f1 | cut -d" " -f1', shell=True)
    [/php]
    "Von Hand" im Terminal eingegeben, ergibt das genau immer den Wert 0 oder 1 (je nach Erreichbarkeit).. :denker:


    Vielleicht könnt ihr mir dabei helfen und vielleicht den entscheidenden Tipp geben :helpnew:
    Entschuldigt auch die evtl. vorhandenen kleinen Fehler. Hatte nur mal etwas Java und alles andere ausm Netz und probieren, probieren, probieren