Seite 3 von 5
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 09:54
von Sirius3
@Nr8: *-Importe sind schlecht und »import« schreibt man klein. Eingerückt wird immer mit 4 Leerzeichen pro Ebene und nicht mal mit 3 und mal mit 6. Wörterbücher sind ungeordnet. Dass der erste Schlüssel »exp« heißt, ist rein zufällig. Korrekt wäre »if 'exp' in report«. »exp« kommt da aber nie vor, höchstens »epx«, aber warum prüfst Du nicht gleich auf das Vorhandensein von »lat« oder »lon«?
Du willst ja zwei Dinge parallel machen, die Geschwindigkeit einer Verbindung testen und den Ort bestimmen. Ich weiß jetzt nicht, ob die next Methode instantan Werte liefert, ob Du den letzten gültigen Wert benutzen willst, oder warten willst, bis die nächste gültige Postion geliefert wird.
Für den Fall, dass man mit dem letzten gültigen Wert arbeiten will:
Code: Alles auswählen
def get_latest_position(gps_session, last_position):
position = last_position
while gps_session.waiting():
data = next(gps_session)
if 'lat' in data:
position = (data['lat'], data['lon'])
return position
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 12:11
von Nr8
Danke für die Hilfe!
Wenn ich mir jetzt die position mit print in der main ausgeben lassen möchte, kommt ein NameErrror: global Name 'position' is not defined
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 12:17
von Sirius3
@Nr8: das ist ja auch nur eine lokale Variable der Funktion »get_latest_position«.
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 12:38
von Nr8
Muss ich die also mit global position angeben?
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 12:48
von Sirius3
@Nr8: müßte man position global machen, hätte ich das ja gemacht. Nein, Du mußt etwas mit dem Rückgabewert der Funktion machen.
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 12:49
von BlackJack
@Nr8: Nein, das ist ja auch der Rückgabewert. Den musst Du ausgeben. Gegebenenfalls vorher in der `main()` an einen lokalen Namen binden. Vergiss das es ``global`` gibt.
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 13:24
von Nr8
Also in der main()
latlon = get_latest_position(???????)
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 13:40
von BlackJack
@Nr8: An Stelle der Fragezeichen musst Du natürlich noch die GPS-Sitzung und einen passenden Wert für die letzte Position übergeben. Zum Beispiel `None`, oder ein Tupel mit jeweils `None` für Länge und Breite, oder… — das kommt darauf an wie Du beim Aufrufer mit diesem Fall umgehen möchtest das die Funktion keine neue Position ermitteln kann.
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 14:04
von Nr8
Ok hab jetzt latlon = get_latest_position(session, None)
Der erste Test hat geklappt.
Vielen Dank!
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 14:51
von Nr8
Habt ihr vielleicht noch eine Idee warum er die Werte immer in Klammern ausgibt?
Re: Internet Speedtest
Verfasst: Mittwoch 4. Januar 2017, 14:56
von BlackJack
@Nr8: Ja. Weil Du *einen* Wert ausgibst, nämlich das Tupel. Und Tupel werden in der Zeichenkettendarstellung mit runden Klammern repräsentiert. Wenn Du die Werte *in* dem Tupel anders darstellen möchtest, dann musst Du das explizit selber tun. Also selbst eine Zeichenkette erstellen die die beiden Werte so enthält wie Du sie gerne hättest. Das geht beispielsweise mit der `format()`-Methode auf Zeichenketten.
Re: Internet Speedtest
Verfasst: Donnerstag 5. Januar 2017, 10:41
von Nr8
habe die Daten jetzt ganz einfach getrennt indem ich " lat, lon = latlon geschrieben habe.
Bekomme leider manchmal eine Fehlermeldung.
Traceback (most recent call last):
File "./vartest.py", line 67, in <module>
main()
File "./vartest.py", line 52, in main
lat, lon = latlon
ValueError: too many values to unpack
habe mir latlon mal ausgeben lassen und da kommt manchmal als Ausgabe
Time: (nan)
Lat/Lon: 0.000000 0.000000
Altitude: ?
Speed: ?
Track: ?
Status: STATUS_NO_FIX
Mode: MODE_NO_FIX
Quality: 0 p=0.00 h=0.00 v=0.00 t=0.00 g=0.00
Y: 0 satellites in view:
Habt ihr nen Plan wie ich den Fehler umgehen kann und warum der Fehler kommt?
Re: Internet Speedtest
Verfasst: Donnerstag 5. Januar 2017, 10:47
von Sirius3
@Nr8: wie sieht denn nun Dein Programm aus?
Re: Internet Speedtest
Verfasst: Donnerstag 5. Januar 2017, 11:07
von Nr8
Code: Alles auswählen
#!/usr/bin/python
import urllib
import time
from datetime import datetime as DateTime
import subprocess
import sys
import os
from gps import*
session =gps()
session.stream(WATCH_ENABLE|WATCH_NEWSTYLE)
def get_latest_position(gps_session, last_position):
position = last_position
while gps_session.waiting():
data = next(gps_session)
if 'lat' in data:
position = (data['lat'], data['lon'], data['speed'])
return position
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=2, size=10):
response = urllib.urlopen(url)
for _ in range(1):
time_start = time_end = time.time()
amount = 0
while time_end - time_start < intervall:
bytes_read = len(response.read(size))
if not bytes_read:
return
time_end = time.time()
amount += bytes_read
yield amount, time_end - time_start
def main():
try:
for amount, time_delta in measure(size=1000, intervall=2):
latlonspeed = get_latest_position(session, session)
lat, lon, speed = latlonspeed
print "{0:%H:%M:%S}; {1:.3f};".format(DateTime.now(), amount/time_delta / 1024), ";", lat, ";" , lon, ";", speed
lon = 0
lat = 0
speed = 0
time.sleep(2)
except IndexError:
return
except IOError:
return
if __name__ == '__main__':
main()
Re: Internet Speedtest
Verfasst: Donnerstag 5. Januar 2017, 11:19
von BlackJack
@Nr8: Bei `get_latest_position()` wird als zweites Argument ja auch nicht die letzte bekannte Position übergeben, sondern völlig unsinnigerweise nochmal das `session`-Objekt. Das übrigens auch nicht auf Modulebene definiert werden sollte, sondern in die Hauptfunktion gehört.
Re: Internet Speedtest
Verfasst: Donnerstag 5. Januar 2017, 11:34
von BlackJack
@Nr8: `subprocess`, `sys`, und `os` werden importiert, aber überhaupt nicht verwendet. Sowie der fast alles was mit dem *-Import aus `gps` importiert wird. Sternchen-Importe sind Böse™. Im besten Fall machen sie Programme schlechter nachvollziebar, im schlechteren Fall hat man Namenskollisionen.
`lat`, `lon`, und `speed` am Ende der Schleife an 0 zu binden hat keinen Effekt, weil diese Werte nie benutzt werden.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import time
import urllib
from datetime import datetime as DateTime
from gps import gps, WATCH_ENABLE, WATCH_NEWSTYLE
SPEED_TEST_URL = 'http://www.speedtestx.de/testfiles/data_500mb.test'
def get_latest_position(gps_session, previous_position):
position = previous_position
while gps_session.waiting():
data = next(gps_session)
if 'lat' in data:
position = (data['lat'], data['lon'], data['speed'])
return position
def measure(url=SPEED_TEST_URL, intervall=2, size=10):
response = urllib.urlopen(url)
for _ in range(1):
time_start = time_end = time.time()
amount = 0
while time_end - time_start < intervall:
bytes_read = len(response.read(size))
if not bytes_read:
return
time_end = time.time()
amount += bytes_read
yield amount, time_end - time_start
def main():
session = gps()
session.stream(WATCH_ENABLE | WATCH_NEWSTYLE)
try:
for amount, time_delta in measure(size=1000, intervall=2):
#
# FIXME Sehr wahrscheinlich soll hier nicht immer (0, 0, 0)
# übergeben werden.
#
lat_lon_speed = get_latest_position(session, (0, 0, 0))
lat, lon, speed = lat_lon_speed
print(
';'.join(
[
format(DateTime.now(), '%H:%M:%S'),
format(amount / time_delta / 1024, '.3f'),
str(lat),
str(lon),
str(speed),
]
)
)
time.sleep(2)
except (IndexError, IOError):
return
if __name__ == '__main__':
main()
Re: Internet Speedtest
Verfasst: Dienstag 10. Januar 2017, 07:28
von Nr8
Vielen Dank!!!
Re: Internet Speedtest
Verfasst: Dienstag 10. Januar 2017, 14:39
von Nr8
Wenn ich das jetzt aus einem bash starte und in einer Dauerschleife laufen lasse bekomme ich nach einiger Zeit keine GPS-Daten mehr und sie GPS-Maus ist über lsusb nicht mehr sichtbar und der gesamte USB-Port ist bis zum reboot abgeschaltet.
Das Skript wird in der Dauerschleife ständig neu gestartet. Ist das der Fehler?
Re: Internet Speedtest
Verfasst: Dienstag 10. Januar 2017, 15:44
von noisefloor
Hallo,
Das Skript wird in der Dauerschleife ständig neu gestartet. Ist das der Fehler?
Wahrscheinlich / vermutlich: ja. Programmiertechnisch ist das aber so wie so nicht weiter sinnvoll - warum legst du die Schleife nicht in den Skript?
Gruß, noisefloor
Re: Internet Speedtest
Verfasst: Mittwoch 11. Januar 2017, 07:23
von Nr8
Natürlich, danke für die Hilfe.