Oft Werte in DB schreiben

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich nutze motion in Verbindung mit einer Kamera. Nun möchte ich mit einem zweiten RPI im Netzwerk abfragen, ob die Kamera gerade eine Bewegung erkannt hat. Zu diesem Zweck möchte ich, wenn eine Bewegung erkannt wird einen Eintrag in eine SQlite DB erstellen. Das ist soweit kein Problem und würde funktionieren. Ich habe nur Sorge, dass meine MicroSD-Karte recht schnell defekt ist, wenn da zB alle paar Sekunden auf die DB zugegriffen wird. Liese sich das irgendwie in den RAM verlagern oder hat jemand eine andere Idee? Es muss irgendwo zwischengespeiert werden, da das abfragende Gerät nicht immer online ist.

  • SQLite ist nicht Netzwerkfähig da es nur eine Datei ist.

    Ich verstehe allerdings nicht so recht wieso du überhaupt eine Datenbank verwenden willst? Was genau soll denn das "abfragende Gerät" dadurch feststellen? Nur ob zuletzt ein Bild geschossen wurde, oder wann, oder wie viele Heute ...? Etwas mehr Details wären hilfreich

  • Hallo, ja also ich möchte quasi, dass mir ein zweiter RPI der über VPN im Netzwerk hängt mir anzeigt, ob gerade eine Bewegung erkannt wird oder nicht. An SQlite dachte ich, da ich dies gerade verwende, um Temperaturdaten abzuspeichern und diese auch von diesesm "abfragenden" dann ausgelesen und auf einem Display angezeigt werden. Es muss aber nicht unbedingt für diese neue Aufgabe auch SQlite sein

  • Solte es auch nicht - ein simpler HTTP-Server zB auf dem zweiten PI kann vom Kamera-PI angesprochen werden. Das signalisiert dann "da hat sich was bewegt", oder kann sogar gleich Daten wie ein Bild uebertragen.

  • Wie gesagt basiert SQLite nur auf Dateien und ist alleine nicht Netzwerkfähig. Du könntest höchstens das Verzeichnis in der die SQlite Datei liegt über Netzwerk mounten (nfs , sshfs usw) und so dann darauf zugreifen...

    Wenn du die Datei in den RAM ablegst ist sie flüchtig, dh wenn der Pi dann rebootet oder crasht ist die Datei samt Inhalt weg. Wenn dir das egal ist wäre das Zauberwort für dich: tmpfs

    Wenn es dir aber nur darum geht festzustellen ob bzw wann zuletzt eine Bewegung erkannt wurde, könntest du in das Python Script auch einen Socket-Server einbauen, wohin sich dann das "abfragende Gerät" verbindet und eine Abfrage absetzt. Das würde ich als Sinnvoller betrachten sofern du denn wirklich nur die letzte Bewegungserkennung ermitteln möchtest.

    Ich gehe mal davon aus du verwendest einen PIR Sensor und ein Python Script auf Basis von Interrupt oder Polling?

    Spoiler anzeigen

    Ein sehr einfach gehaltener Socket-Server sähe wie folgt aus:
    [code=php]#!/usr/bin/python2
    import socket

    TCP_IP = '0.0.0.0'
    TCP_PORT = 5000
    BUFFER_SIZE = 4096

    def getTemp():
    with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
    CPUtemp = int(float(f.readline().split()[0]))
    CPUtemp = round((CPUtemp/1000.0), 2)
    return CPUtemp

    def getUptime():
    with open('/proc/uptime', 'r') as f:
    uptime_seconds = float(f.readline().split()[0])
    uptime = str(timedelta(seconds = uptime_seconds))
    return uptime

    def getPiRAM():
    with open('/proc/meminfo', 'r') as mem:
    tmp = 0
    for i in mem:
    sline = i.split()
    if str(sline[0]) == 'MemTotal:':
    total = int(sline[1])
    elif str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'):
    tmp += int(sline[1])
    free = tmp
    used = int(total) - int(free)
    usedPerc = (used * 100) / total
    return usedPerc

    try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP, TCP_PORT))
    s.listen(1)
    conn, addr = s.accept()
    print 'Connection address:', addr
    while 1:
    if conn:
    data = conn.recv(BUFFER_SIZE).strip()
    if data:
    reqdata = ""
    print "received data:", data
    if data == "pitemp":
    reqdata = str(getTemp())
    elif data == "piram":
    reqdata = str(getPiRAM())
    else:
    reqdata = "UNKNOWN!"
    conn.send(reqdata + "\n")
    except (KeyboardInterrupt, SystemExit):
    print "Schliesse Server.."
    s.close()
    conn.close()
    [/php]

    Und der dazugehörige Client allerdings als TKinter Version:
    [code=php]
    import socket
    from Tkinter import *
    import threading

    Ziel = "127.0.0.1"
    Port = 5000

    HF = Tk()
    HF.title("RPi_Info")
    HF.geometry("400x500")

    def TimedRequest(when, what):
    global timed
    when = float(when)
    what = str(what)
    if not conn:
    Verbinden()
    conn.sendall( what + "\n" )
    received = conn.recv(4096)
    Text1.configure(state=NORMAL)
    Text1.insert(END, (received))
    Text1.configure(state=DISABLED)
    timed = threading.Timer( when, TimedRequest, [when, what] )
    timed.start()

    def Verbinden():
    global conn, timed
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
    conn.connect((Ziel, Port))
    Status.configure(text="Verbunden", fg="green")
    timed = threading.Timer( 2.0, TimedRequest, ["2.0", "pitemp"] )
    timed.start()
    except:
    Status.configure(text="Failed", fg="red")
    timed.cancel()

    def Trennen():
    conn.close()
    timed.cancel()
    Status.configure(text="Getrennt", fg="red")
    Text1.configure(state=NORMAL)
    Text1.delete("1.0", END)
    Text1.configure(state=DISABLED)

    def Senden():
    conn.sendall( e1.get() + "\n" )
    received = conn.recv(4096)
    Text1.configure(state=NORMAL)
    Text1.insert(END, (received))
    Text1.configure(state=DISABLED)

    Status = Label(HF)
    Status.configure(text="Getrennt", fg="red")
    Status.grid(row=0, column=2)
    e1 = Entry(HF, width=20)
    e1.grid(row=1, column=4)
    but1 = Button(HF, text="Verbinden", width=10, command=Verbinden)
    but1.grid(row=1, column=1)
    but2 = Button(HF, text="Trennen", width=10, command=Trennen)
    but2.grid(row=1, column=2)
    but3 = Button(HF, text="Senden", width=10, command=Senden)
    but3.grid(row=1, column=3)

    Text1=Text(HF, height=22, width=25)
    Text1.configure(state=DISABLED)
    Text1.grid(row=2, column=1, columnspan=3)

    try:
    mainloop()
    except (KeyboardInterrupt, SystemExit):
    print "Schliesse Programme.."
    timed.cancel()
    finally:
    timed.cancel()
    [/php]

    Du könntest aber auch eine temporäre Datei anlegen und mit dem "abfragende Gerät" via SSH / SCP auf Existenz oder Inhalt dieser Datei prüfen.
    Oder du nutzt einen Webserver um eine Datei auszulesen...

    Also es gibt da mehrere Möglichkeiten - abhängig davon was Du erreichen möchtest.

  • Hallo, ich verwende node-RED und MQTT (server) auf dem Pi mit Motion.
    Andere Pis können das dann gut abfragen.

    Frank

    Nach 35 Jahren im IT business hab ich mit Raspi mal selbst zum Programmieren begonnen...
    Habe auch einen 3D-Drucker, eine CNC-Fräse und etwas Elektronik-Bastelei als Hobby

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!