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?