nein, ich arbeite beides mal als user. -Dachte ich zumindest bis ich hier diese Zeilen verfasst habe...-
Aber stimmt, eine Kleinigkeit ist wirklich anders.
Ich werde deshalb ein wenig ausholen...
das ganze ist wie gesagt eine Django Applikation.
Auf meinem System habe ich ein Skript am laufen, das die Daten vom Microcontroller über den UART in die Datenbank schreibt.
Da der Raspberry keinen richtigen UART besitzt sondern nur eine OTG Schnittstelle (Raspberry teilt sich die Schnittstelle mit Bluetooth und der seriellen Schnittstelle) musste ein paar Dinge angepasst werden. Dabei bin ich nach folgendem Buch vorgegangen:
https://www.rheinwerk-verlag.de/raspber ... gJDSfD_BwE
z.B musste ich in der /boot//config.txt den Wert force_turbo=1 gesetzt werden.
in der Datei cmdline.txt musste folgende Zeile ergänzt werden:
dtoverlay=pi-miniuart-bt
Nachdem ich diese Einstellungen gemacht haben, funktioniert es auch ohne größere Probleme.
"Diese Variante funktioniert leider nur, solange die CPU-Temperatur weniger als 85°C beträgt. Ab diesem Wert fährt der interne Überhitzungsschutz des SoC nämlich die Taktfrequenz auf ein Minimum zurück." Wenn die Taktfrequenz heruntergefahren wird, dann ändert sich die Baudrate, folglich können die beide Geräte nicht mehr miteinander kommunizieren.
Nachdem ich die CPU Temperatur asugelesen hatte und diese um die 50°C bei mir war, sah ich da kein Problem. Allerdings zeigen langzeit test, damit der UART irgendwann wenn auch nur kurzzeitig ausgestiegen ist. Das folgende Skript wurde abgebrochen und musste händisch wieder gestartet werden.
Code: Alles auswählen
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import serial
import sqlite3
import sys
import time
id = None
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
name = "Sensor1"
value1 = ""
def insert_into_database(id, timestamp, name ,value1):
con = sqlite3.connect("/home/pi/sensor/db.sqlite3")
cur = con.cursor()
value = (id, timestamp, name ,value1)
sql = "INSERT INTO sensor VALUES (?, ?, ?, ?)"
cur.execute (sql, value)
con.commit()
con.rollback()
con.close()
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600
daten = ser.readline()
ser.close
values = daten.decode('utf8')
if (values.count(";")) == 4:
print(daten.decode('utf8'))
value1 = values.split(";")[0]
value2 = values.split(";")[1]
value3 = values.split(";")[2]
value4 = values.split(";")[3]
insert_into_database(id, timestamp, name ,value1)
Aussteigen ist OK. händisch starten geht leider nicht, deshalb habe ich mich für folgendende zwar unschöne aber doch funktioierende Variante entscheiden:
#!/bin/bash
while true
do
sudo python3 listener.py
sleep 1
done
zwar starte ich dieses Skript mit keiner besonderen Berechtigung.
Wie in dem Skript zu erkennen ist, wird das folgende Python Skript listener.py mit Sudo ausgeführt.
Ok, jetzt habe ich die Erklärung, warum es im "normalen" Modus funktioniert, nicht aber im venv Modus.
Das Skript muss ich mithilfe des Datenbank wrappers von Django machen. ansosnten blockiert mir das Skript ständig die Datenbank und die Webapplikation läuft dadurch sehr schleppend.
hat jemand eine Idee, wie ich das Problem lösen könnte?
vielen Dank im voraus