ein (Klassen-)Funktion alle x Sekunden/Minuten ausführen
Verfasst: Samstag 29. März 2014, 01:16
Nabend,
ich bastle an einem kleinen Script mit welchem ich diverse Sensoren übers Tablet auslesen kann.
Dafür nutze ich einen Socket-Server.
Jetzt würde ich gerne zusätzlich eine Art "Zeitschaltuhr" einbauen.
Im Detail soll eine Klassen-Funktion (zum auslesen der CPU-Temperatur) alle 30 Sekunden ausgeführt werden.
Bisher verlaufen aber alle Versuche erfolglos. Das Problem scheint hier der gleichzeitig Betrieb des Socket-Servers zu sein.
Ich habe deshalb verschiedene Möglichkeiten versucht, bisher alle ohne Erfolg.
Hier mein Code
Und zwar geht es um die Klassen-Funktion Raspi_temperatures.read() .... ich bekomme das einfach nicht hin.
Das Script läuft ohne Fehler, ruft die entsprechende Funktion aber leider nicht auf.
Ich habe es auch mit und dann mit versucht.
Auch das klappt nicht.
Weiß bitte jemand Rat?
Wie kann ich eine Klassenfunktion alle x Sekunden ausführen während gleichzeitig der Socket-Server voll funktionsfähig bleibt?
ich bastle an einem kleinen Script mit welchem ich diverse Sensoren übers Tablet auslesen kann.
Dafür nutze ich einen Socket-Server.
Jetzt würde ich gerne zusätzlich eine Art "Zeitschaltuhr" einbauen.
Im Detail soll eine Klassen-Funktion (zum auslesen der CPU-Temperatur) alle 30 Sekunden ausgeführt werden.
Bisher verlaufen aber alle Versuche erfolglos. Das Problem scheint hier der gleichzeitig Betrieb des Socket-Servers zu sein.
Ich habe deshalb verschiedene Möglichkeiten versucht, bisher alle ohne Erfolg.
Hier mein Code
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
logPath = "/var/log/raspi_server.log"
serverPort = 54321
import datetime
import asyncore
import socket
import select
import commands
import schedule
import time
from datetime import timedelta
class cls_Raspi_Temp:
temp_cpu = 0
temp_gpu = 0
def __init__(self):
self.read()
def read(self):
tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
cpu_temp = tempFile.read()
tempFile.close()
self.temp_cpu = float(cpu_temp)/1000
gpu_temp = commands.getoutput( '/opt/vc/bin/vcgencmd measure_temp' ).replace( 'temp=', '' ).replace( '\'C', '' )
self.temp_gpu = float(gpu_temp)
print(str(get_systemzeit()) + " : CPU Temperatur " + str(self.temp_cpu) + " °C")
print(str(get_systemzeit()) + " : GPU Temperatur " + str(self.temp_gpu) + " °C")
writeLog("__SYSTEM - CPU Temperatur " + str(self.temp_cpu) + " °C")
writeLog("__SYSTEM - GPU Temperatur " + str(self.temp_gpu) + " °C")
class Client(asyncore.dispatcher_with_send):
def __init__(self, socket=None, pollster=None):
asyncore.dispatcher_with_send.__init__(self, socket)
self.data = ''
if pollster:
self.pollster = pollster
pollster.register(self, select.EPOLLIN)
def handle_close(self):
if self.pollster:
self.pollster.unregister(self)
def handle_read(self):
receivedData = self.recv(8192)
if not receivedData:
self.close()
return
receivedData = self.data + receivedData
while '\n' in receivedData:
line, receivedData = receivedData.split('\n',1)
self.handle_command(line)
self.data = receivedData
def handle_command(self, line):
if line == 'get cpu':
ausgabe=(str(Raspi_Temperatures.temp_cpu)+" °C\n")
self.send(ausgabe)
elif line == 'get gpu':
ausgabe=(str(Raspi_Temperatures.temp_gpu)+" °C\n")
self.send(ausgabe)
else:
self.send('unknown command')
class Server(asyncore.dispatcher):
def __init__(self, listen_to, pollster):
asyncore.dispatcher.__init__(self)
self.pollster = pollster
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind(listen_to)
self.listen(5)
def handle_accept(self):
newSocket, address = self.accept()
print(str(get_systemzeit()) + " : Connected from" + str(address))
writeLog("Connected from" + str(address))
Client(newSocket,self.pollster)
class EPoll(object):
def __init__(self):
self.epoll = select.epoll()
self.fdmap = {}
def register(self, obj, flags):
fd = obj.fileno()
self.epoll.register(fd, flags)
self.fdmap[fd] = obj
def unregister(self, obj):
fd = obj.fileno()
del self.fdmap[fd]
self.epoll.unregister(fd)
def poll(self):
evt = self.epoll.poll()
for fd, flags in evt:
yield self.fdmap[fd], flags
def readwrite(obj, flags):
try:
if flags & select.EPOLLIN:
obj.handle_read_event()
if flags & select.EPOLLOUT:
obj.handle_write_event()
if flags & select.EPOLLPRI:
obj.handle_expt_event()
if flags & (select.EPOLLHUP | select.EPOLLERR | select.POLLNVAL):
obj.handle_close()
except socket.error, e:
if e.args[0] not in asyncore._DISCONNECTED:
obj.handle_error()
else:
obj.handle_close()
except asyncore._reraised_exceptions:
raise
except:
obj.handle_error()
def get_systemzeit():
now = datetime.datetime.utcnow()+timedelta(hours=1)
return(now.strftime("%d.%m.%Y %H:%M:%S"))
def writeLog(textzeile):
logfile=open(logPath, "a")
logfile.write(str(get_systemzeit()) + " : " + str(textzeile) + "\n")
logfile.close()
def periodic():
Raspi_temperatures.read()
if __name__ == "__main__":
# CPU und GPU Temperaturen
Raspi_temperatures = cls_Raspi_Temp()
# Repeating Event
schedule.every(30).seconds.do(periodic)
# Event Handling starten
pollster = EPoll()
pollster.register(Server(("",serverPort),pollster), select.EPOLLIN)
while True:
schedule.run_pending()
evt = pollster.poll()
for obj, flags in evt:
readwrite(obj, flags)
Das Script läuft ohne Fehler, ruft die entsprechende Funktion aber leider nicht auf.
Ich habe es auch mit
Code: Alles auswählen
import sched, time
Code: Alles auswählen
...
class cls_Raspi_Temp:
temp_cpu = 0
temp_gpu = 0
def __init__(self):
self.read()
def read(self):
tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
cpu_temp = tempFile.read()
tempFile.close()
self.temp_cpu = float(cpu_temp)/1000
gpu_temp = commands.getoutput( '/opt/vc/bin/vcgencmd measure_temp' ).replace( 'temp=', '' ).replace( '\'C', '' )
self.temp_gpu = float(gpu_temp)
print(str(get_systemzeit()) + " : CPU Temperatur " + str(self.temp_cpu) + " °C")
print(str(get_systemzeit()) + " : GPU Temperatur " + str(self.temp_gpu) + " °C")
writeLog("__SYSTEM - CPU Temperatur " + str(self.temp_cpu) + " °C")
writeLog("__SYSTEM - GPU Temperatur " + str(self.temp_gpu) + " °C")
s.enter(30, 1, Raspi_temperatures.read, ())
...
s = sched.scheduler(time.time, time.sleep)
Raspi_temperatures = cls_Raspi_Temp()
Auch das klappt nicht.
Weiß bitte jemand Rat?
Wie kann ich eine Klassenfunktion alle x Sekunden ausführen während gleichzeitig der Socket-Server voll funktionsfähig bleibt?