Wert über zyklus behalten????

  • Hallo an alle und schönen Vatertag :D

    Ich hab da ne kleine Idee im Kopf und möchte dies mit dem Raspberry und Python 3 realisieren.

    Es geht um folgendes: Ich möchte eine Pingabfrage auf eine bestimmte IP realisieren, was ich auch schn hinbekommen habe ;)

    Nun möchte ich das ganze etwas erweitern und benötige das nach erkennen der IP etwas "nur einmal" ausgeführt wird, bis diese IP nicht mehr Pingbar ist.

    Ist es möglich in Python sich einen Wert zu speichern?

    Zur Verdeutlichung ein kleines Beispiel:
    Im Haus ist eine Rechner, welcher per Wake on Lan gestartet werden kann,
    sobald der Rechner im Netz ist soll eine "einmalige" Meldung ausgegeben werden.

    Mit Rechnerverlust im Netzwerk, soll die Speicherung zurück gesetzt werden und bei erneutem anmelden im Netzwerk erneut diese Meldung ausgegeben werden.

    Ich würde hierzu das kleine Pythonscript alle 5 - 10 Sekunden ablaufen lassen, möchte aber nicht alle 5 bis 1ß Sekunden eine Meldung bekommen das dieser Rechner im Netzwerk ist.

    Ich hatte den Lösungsansatz über den Umweg eines GPIO zu machen, damit würde ich es glaub ich hin bekommen.
    Rechner meldet sich an - Meldung ausgeben , GPIO EIN schalten
    Solang GPIO EIN - Keine Meldung mehr ausgeben
    Sobald Rechner nicht mehr Pingbar - GPIO Auschalten

    Aber bestimmt gibt es da auch eine andere (Hardwarelose) Lösung

    vielen dank im voraus für die Hilfe

    viele grüße
    Guschdl

  • Hallo Guschdl,

    natürlich funktioniert das.

    Etwas Ähnliches habe ich mal programmiert und in diesem Forum unter dem Namen [font="Courier New"]HostRepair[/font] (programmiert in der Programmiersprache Icon) vorgestellt. Darfst Du gern abkupfern und nach Python übertragen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Der einfachste Weg: du speicherst immer den letzten Wert (erreichbar/nicht erreichbar) in einer Datei ab, liest den dann immer aus und vergleichst mit dem Ergebnis des ping. Dann weißt du, ob es eine Änderung gab. Wenn du die Datei zb in ein tmpfs legst, wird nicht mal die sd Karte belastet.

    Nebenbei: wie wird das Skript alle paar Sekunden aufgerufen? Cron fällt da wohl raus... Falls es eh durchgängig läuft, kannst du das Ergebnis des ping auch einfach im Programm in einer Variable speichern

    Einmal editiert, zuletzt von KrawallKurt (5. Mai 2016 um 22:58)

  • Das kommt darauf an wie dein Script aufgebaut sein wird - hast du schon etwas probiert?
    Wieso ausgerechnet python3 ?

    Normalerweise setzt man einfach ein sog. Flag, also eine Variable die den aktuellen Status enthält und vor Durchlauf einer Schleife auf den zulässigen Wert geprüft wird.

  • Danke für die Antworten,
    Warum fällt Cron aus? Ich dachte wenn ich */5 in der Minutenspalte würde ein Skript alle 5 Sekunden aufrufen?

    Zu der Frage warum Python3:
    Gegenfrage: Warum nicht :D

    Also ich beschäftige mich seit nicht so langer Zeit mit dem Raspberry und tauche gaaanz langsam in die Welt der Möglichkeiten ab.
    Und beim abtauchen bin ich bisher bei Python3 stehen geblieben.
    Die Paar Programme die ich geschrieben habe, habe ich alle in dieser Progsprache geschrieben.
    Na Klar hab ich schon was probiert, und hing dann an dem Punkt das die Textausgabe jeden Aufruf (welchen ich händisch gestartet habe) ausgegeben wurde.

  • *\5 in der Minutenspalte startet ein Skript alle 5 Minuten.

    meigrafd hat wohl gefragt, warum es python3 sein muss, weil das eine relativ stark einschränkende Bedingung ist. Üblicherweise bei der Software Entwicklung macht man das einfach nicht. Zuerst macht man sich mal Gedanken um Funktionen und entscheidet dann, was am sinnvollsten ist. Für pings und so wäre sicher auch bash nicht ungeeignet. Aber wenn du python3 kannst, ist das natürlich auch okay.

    Einmal editiert, zuletzt von KrawallKurt (7. Mai 2016 um 09:00)

  • Crontab kann als kleinstes Intervall nur "jede Minute". */5 würde bedeuten das es alle 5 Minuten ausgeführt wird. Wenn du einen kürzeren Intervall benötigst musst du das Script permanent laufen lassen. Allerdings wäre allgemein die Frage ob ein Intervall von 5 Sekunden nicht ein kleines bisschen übertrieben wäre?!

    Gegenfrage: Weil nicht immer das neuste auch das beste ist. Python3 ist in einigen Dingen langsamer aber auch umständlicher wie zB die andere Handhabung der Types die man mit Python3 selber vornehmen muss. Es gibt auch noch viele Module die aus letztem Grund noch nicht für Python3 portiert wurden.

    Ich würde immer versuchen möglichst alles nativ/direkt mit der jeweiligen Programmiersprache umzusetzen. Bedeutet: Wozu ein Python Script schreiben wenn man dann letztlich bash Befehle ausführt? Also entweder man lässt bash Befehle in Python weg und setzt Ping zB mithilfe von socket's um, oder man schreibt das gleich in bash....

    Es gibt sehr gute Python2 Module wie zB "pyping" oder "ping" die auch ein Timeout unterstützen - das wäre für deinen Fall nämlich auch wichtig denn sonst würde sich das mit deinem Intervall überschneiden und erst nach mehreren Sekunden oder gar Minuten aufhören... Führ mal auf der Konsole einen Ping auf eine 100% nicht existierende IP aus, also zB 192.168.168.168 und dann warte solange bis der Befehl sich selbst beendet - viel Spass beim warten :lol:

    Allerdings hattest du im ersten Beitrag von einem Rechner gesprochen, nicht von einem Smartphone. Es haben schon viele versucht anhand der IP ihres Smartphones Anwesenheit festzustellen... Warum das Rad neu erfinden?


    PS: Einrückungen sind für Python extrem wichtig. Bei deinem Versuch sehe ich diesbezüglich einige Fehler. Auch ruft man Funktionen ohne Leerzeichen auf, also nicht print ("bla") sondern print("bla") ... ebenso nicht os.system (...) sondern os.system(...). Und diese ganzen Leerzeilen stören auch die Lesbarkeit.

  • Das script habe ich geschwind mit notepad geöffnet
    Im script sind die Einrückungen vorhanden ?
    Aber vielen dank für den hinweis

    Bash im raspberry ist bestimmt eine alternative

    Und ich habe von einem rechner gesprocjen wird aber noch auf smartphone erweitert werden

    Bin offen für alle vorschläge und verbesserungen

    Vielen dank für eure hilfe

  • Hallo ihr,
    ich habe mich etwas an euren Tipps orientiert und mich an einer Bash versucht.

    Ich bin am verzweifeln...

    Ich habe folgenden Code aus dem Netz kopiert und eingetragen:

    Jetzt ist es allerdingst so das es für mich so aussieht als würde die If Anweisung nicht abgearbeitet werden.

    Folgendes bekomme ich zurück gemeldet:
    Zeile 14:Syntax Fehler:Unerwartetes Dateiende.

    Kann mir da mal wieder jemand helfen?

  • Wenn du den Code kopiert hast ist die Quelle Fehlerhaft.

    Beim ping Befehl fehlt wieder die Timeout Geschichte. Siehe dazu den letzten Parameter in der manuals-Page man ping
    Zwischen != und 0 muss ein Leerzeichen stehen
    Einrückungen sind für bash zwar nicht wichtig, erhöhen aber ungemein die Lesbarkeit, egal in welcher Programmiersprache.
    Das "then" schreibt man eigentlich in die selbe Zeile wie das "if", dann halt "; then"

    Das Script pingt zwar, macht aber was anderes als Du haben willst - sofern du kein wlan0 Device hast wird dir das sowieso nichts bringen...

    Probiere es mal hiermit:

    [code=php]
    #!/bin/bash

    IP=192.168.0.1

    if [ -z "$(ping -q -W10 -c1 $IP | grep '1 received')" ]; then
    echo "$IP is not pingable"
    else
    echo "$IP is pingable"
    fi
    [/php]

    Was das macht:
    -z prüft ob die Variable gesetzt oder Leer ist
    $( ) führt den Befehl aus und gibt dessen Rückgabe aus.
    "ping -q -W10 -c1 $IP" ist der erste Teil des Befehls, -q steht für Quiet, -W10 ist ein Timeout von 10 Sekunden und -c1 nur ein Pingversuch
    | ist eine Pipe. Die Ausgabe des ersten Befehls wird an den nachfolgenden übergeben
    grep '1 received' greift sich von der Ausgabe des ersten Befehls (pipe) nur die Ausgabe die "1 received" enthält.

    Wenn also "$(ping -q -W10 -c1 $IP | grep '1 received')" keine Rückgabe hat, weil die IP nicht gepingt werden konnte, trifft die if Abfrage zu und gibt "$IP is not pingable" aus ....

    Und guck dir auch mal das an: RaspberryPI Hosting/Housing [Diskusionen/Fragen]

  • Bitte nicht Beiträge vollständig quoten, vor allem wenn diese genau da drüber stehen.


    Wie genau erstellst du das Script? Wenn du es mit notepad erstellst und dann auf den Pi transferierst ist das dein Fehler. Windows verwendet andere Zeilenende-Zeichen (Zeileumbruch), die Linux aber nicht versteht.
    Entweder du nutzt: FAQ => Nützliche Links / Linksammlung => Linux kompatible Editoren
    Oder du machst copy&paste, also nano öffnen und dort rein pasten.

    Code
    root@raspberrypi:~# bash /tmp/ping.sh 
    Ping absetzten
    192.168.0.1 is pingable
    root@raspberrypi:~#
  • Wird erledigt...also das mit dem zitieren

    ich schreib es direkt im pi mit dem "vi" befehl

    dann geht der Editor auf , ich drücke i für Einfügemodus und schreibe den Code

    ESC beendet die eingabe und mit :wq speichern und schließen

    SOOOOO:
    ich habe jetzt das ganze nochmals als neue Datei im nano Editor getippt, war ja nicht so viel.
    Selbe Reaktion.

    was mir dabei aber aufgefallen ist, meine Farben sind anders dargestellt als deine..also im Code
    Hab es mal an Anhang mit eingefügt,
    vielleicht liegt es ja daran

  • Also jetzt mal ne kurze Rückmeldung von meiner Seite:

    Ich hab das ganze jetzt mal in Python realisiert.
    Ich hab zwar immer noch keine Ahnung weshalb es als bash nicht funktioniert hat, aber mein WLAN Reset funktioniert.
    Ich lass das script jede Minute (also */1) ablaufen und nach Verbindungsabriss hat sich die Schnittstelle neu gestartet.

    Nun mach mach ch mich demnächst an den eigentlichen Ablauf:
    schauen das rechner online ist und danach geht es an Smartphoneabfrage ;)

    vielen dank für eure Unterstützung

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!