Per UDP Daten empfangen und an Thingspeak senden

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
hendrikator
User
Beiträge: 1
Registriert: Freitag 7. April 2017, 12:00

Hallo, ich habe ein kleines Problem und zwar nach einiger Zeit schmiert das Programm ab mit der Meldung. Dann noch die frage was könnte man an dem Programm verbessern?

Traceback (most recent call last):
File "empfang.py", line 39, in <module>
gereat, sensor, temp = data.split(":")
ValueError: need more than 1 value to unpack

Code: Alles auswählen

import socket
import sys
import os
import datetime 
import urllib2
import threading
import time

UDP_IP = "127.0.0.1"
UDP_PORT = 5005
Sensoren = ['10-000802d3ab2f','10-000802bd095b']#Sensoren hier eintragen -----> ['10-000802d3ab2f','Neachstersensor'] zufinden in /sys/devices/w1_bus_master1/
sensortemp = ["",""]

baseURL = "https://api.thingspeak.com/update?api_key=**********************&"

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))



def Temperatursenden():
 while not stop:
  if not sensortemp[1] == "":
   g = urllib2.urlopen(baseURL + "&field1=%s&field2=%s" % (sensortemp[0],sensortemp[1]))
   sensortemp[0] = ""
   sensortemp[1] = ""
   print "Sende Daten!\n"

try:
 stop = False
 t1 = threading.Thread(target=Temperatursenden)
 t1.start()
 while True:
 
  data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes

  print data
  gereat, sensor, temp = data.split(":")
  if not temp == "85.00":
      if gereat == "t":
       print "\n" + str(datetime.datetime.now().strftime("%H:%M:%S %d-%m-%Y"))
       print "Sensor:", sensor
       print "Temperatur", temp + "\n"
       if sensor == Sensoren[0]:
	    sensortemp[0] = temp
    
       if sensor == Sensoren[1]:
	    sensortemp[1] = temp
      if gereat == "h":
       print "\n" + str(datetime.datetime.now().strftime("%H:%M:%S %d-%m-%Y"))
       print "Sensor:", sensor
       #feucht = int(temp)#<--------------- geht nicht 
       print "Luftfeucht", (round(feucht,2)) + "\n"	
       if sensor == 3:
	    sensortemp[2] = round(temp,2)
      
   
 
 
 
except (KeyboardInterrupt, SystemExit):
 stop = True
 sock.close

	
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@hendrikator: die Daten, die Du empfängst entsprechen nicht dem Format das Du erwartest.

Eingerückt wird generell mit 4 Leerzeichen pro Ebene. Daten überträgt man nicht per Liste an einen Thread sondern mit einer Queue. Dann fällt auch das Busy-Waiting und die seltsame Behandlung von Nicht-Werten durch leere Strings weg. not a == b schreibt man als a != b. Statt zwei parallelen Listen Sensoren und sensortemp würde man wahrscheinlich ein Wörterbuch oder eine Liste mit Tupeln nehmen. In Zeile 54 gibt es einen NameError weil feucht nicht existiert und in Zeile 56 gibt es einen TypeError weil temp ein String ist. Statt round nimmt man String-Formatierung. Zeile 64: Funktionen sollte man aufrufen.
Antworten