Forum: PC-Programmierung Variable im Arbeitsspeicher schreiben und lesen


von Dennis (Gast)


Lesenswert?

Hallo Freunde der Bastelleidenschaft,

Ein C-Programm auf einem Raspberry Pi misst den Aktuellen stromverbrauch 
meiner Wohnung und mittelt 10 min Werte und schreibt diese in eine 
Datenbank auf dem Raspberry Pi.

Mit einem PHP Programm lese ich diese Datenbank aus und mache Bunte 
Diagramme auf meinem Webserver... auch auf dem Raspberry Pi.

Jetzt würde ich gern den Momentanverbrauch auch auf der Webseite 
anzeigen lassen aber nicht alle Paar Sekunden in eine Datei als 
zwischenspeicher schreiben auf der SD-Karte.

Gibt es eine Möglichkeit eine im C-Programm definierte Variable auch aus 
PHP auszulesen?

z.B. Über eine Feste Adresse im Arbeitsspeicher oder das das C-programm 
direkt die Webseite manipuliert?

Ich möchte das ich damit schnell und direkt am Laptop Stromfresser sehen 
kann wenn ich die ein und ausstecke und nicht erst im 10 Minuten Mittel.

Gruß

Dennis

von Alain S. (alain_s)


Lesenswert?


von Sven B. (scummos)


Lesenswert?

Warum nicht in eine Datei schreiben? Das Betriebssystem chached das 
sowieso, effektiv wird das also im Arbeitsspeicher hin- und 
hergetauscht. Für die fünf Byte ist das außerdem sowieso alles komplett 
irrelevant.
Shared Memory ist wenn du fünf Gigabyte die Sekunde hin- und herreichen 
willst. Für sowas ist das total overkill.
Ansonsten gibt es noch diverse weitere Möglichkeiten, zum Beispiel eine 
named pipe, oder dbus. Aber Datei ist für diesen Zweck das 
angemessenste.

von DirkB (Gast)


Lesenswert?

Hast du dir mal rrdtool als Datenbank angesehen?

Oder mach eine zweite Datenbank, die nur die einzelnen Messwerte der 
letzten 10 Minuten enthält

von Rolf M. (rmagnus)


Lesenswert?

Sven B. schrieb:
> Ansonsten gibt es noch diverse weitere Möglichkeiten, zum Beispiel eine
> named pipe, oder dbus. Aber Datei ist für diesen Zweck das
> angemessenste.

Eine named pipe ist dafür sinnvoller als eine Datei und von jeder 
Programmiersprache aus sehr einfach zu nutzen.

von PittyJ (Gast)


Lesenswert?

Ich würde ein tempfs empfehlen, also ein kleines Filesystem, was im Ram 
liegt. Das belastet nicht die SD-Karte, ist schnell und man kann normal 
auf die Dateien zugreifen.
Wie das geht steht z.B. in
http://www.zdnet.com/article/raspberry-pi-extending-the-life-of-the-sd-card/

von Dennis (Gast)


Lesenswert?

Guten morgen, vielen dank für die zahlreichen Vorschläge.

Ich werde mich mal einlesen

von Dirk D. (dicky_d)


Lesenswert?

Rolf M. schrieb:
> Sven B. schrieb:
>> Ansonsten gibt es noch diverse weitere Möglichkeiten, zum Beispiel eine
>> named pipe, oder dbus. Aber Datei ist für diesen Zweck das
>> angemessenste.
>
> Eine named pipe ist dafür sinnvoller als eine Datei und von jeder
> Programmiersprache aus sehr einfach zu nutzen.

... dann schreibt er jeden Messwert in die pipe.
Wenn er Abends ins Bett geht und Morgens das erste mal die Seite aufruft 
ist die Pipe voll weil die Ganze nacht reingeschrieben wurde.

Wenn er schnell nacheinander die Daten haben will gibts noch keine weil 
sie Leergelaufen ist.
Klingt jetzt nicht sehr plausibel.


Ich würde ne extra Tabelle mit der InMemory-Engine vorschlagen.

von tictactoe (Gast)


Lesenswert?

Ich verwende für einen ähnlichen Zweck das Verzeichnis /run/shm. Das ist 
eine "Ramdisk". Dass die Dateien nach dem Reboot fort sind, dürfte dich 
zumindest beim aktuellen Messwert wenig stören.

von icke (Gast)


Lesenswert?

Dennis schrieb:
> Jetzt würde ich gern den Momentanverbrauch auch auf der Webseite
> anzeigen lassen aber nicht alle Paar Sekunden in eine Datei als
> zwischenspeicher schreiben auf der SD-Karte.

Wenn der Momentanverbrauch der Verbrauchswert ist, der zum Zeitpunkt des 
Seitenaufrufs vorliegt, oder? Wenn dem so ist, muss du damit den Wert 
auch zu diesem Zeitpunkt ermitteln, also den entsprechenden Sensor genau 
zu diesem Zeitpunkt auslesen etc..

von Guest (Gast)


Lesenswert?

Ich mache exakt das gleiche mit einem Raspberry Pi. Allerdings schreibe 
ich einfach alle zehn Sekunden die Messwerte in die Datenbank. Damit 
habe ich über PHP auf der Webseite auch immer einen aktuellen Wert (im 
worst case 10 Sekunden alt, aber so schnell ändert sich der 
Stromverbrauch nicht).
Das läuft seit etwa zwei Monaten problemlos und die SD Karte wird erst 
nach Jahren voll.
Wäre vielleicht auch eine einfache Lösung für dich.

von Karl H. (kbuchegg)


Lesenswert?

Guest schrieb:

> Das läuft seit etwa zwei Monaten problemlos und die SD Karte wird erst
> nach Jahren voll.

Allerdings sollte man aufpassen. SD-Karten sind für einen derartigen 
Dauerbetrieb nicht gedacht und gehen dann schnell defekt. Einem Pi, der 
24/7 am laufen ist, würde ich (bzw habe ich) das System auf USB-Stick 
bzw. externe Festplatte kopiert. Die SD Karte wird nur noch zum Booten 
benötigt um von dort das Bootdevice zu holen.

von Sven B. (scummos)


Lesenswert?

Ist in einem USB-Stick nicht genau dieselbe Art Speicher verbaut wie in 
einer SD-Karte?

von Karl H. (kbuchegg)


Lesenswert?

Sven B. schrieb:
> Ist in einem USB-Stick nicht genau dieselbe Art Speicher verbaut wie in
> einer SD-Karte?

Gute Frage. Hab ich noch nie recherchiert.

....

sieht wohl so aus.
Nur gut, dass ich eine externe Platte angeschlossen habe :-) Glück 
gehabt.

von Dennis (Gast)


Lesenswert?

Ich habe eine Wetterstation auf einem Pi am laufen und schreibe die 
Winddaten mit, dort wird aber immer nur ein Mittelwert alle 10Min in die 
Datenbank geschrieben sowie ein 3Sek maximal und minimalwert in einem 
10Min fenster.

Warum speicherst du für eine Langzeiterfassung in so kurzen intervallen?

von Dennis (Gast)


Lesenswert?

Das Programm soll die daten für eine Langzeiterfassung sammeln.
Dazu misst es die Zeit zwischen zwei impulsen vom S0 Ausgang meines 
Stromzählers.
Nach jedem Impulse kann ich den Momentanverbrauch ausgeben. Daher ist 
die Zeit variabel. Die Messwerte werden über 10 min gemittelt und dann 
in eine Datenbank geschrieben. Nur für den Momentanverbrauch will ich 
den aktuellen Wert auf der Webseite Anzeigen lassen der dann halt nur 
ein paar sekunden alt ist und bei einem Stromfresser verkürzt sich die 
Zeit zwischen zwei impulsen erheblich so das ich 2-3 Werte pro Sekunde 
erreichen Kann.

Der Zähler hat 1000Imp / KWh am S0 Ausgang.

von Uhu U. (uhu)


Lesenswert?

Sven B. schrieb:
> Ist in einem USB-Stick nicht genau dieselbe Art Speicher verbaut
> wie in einer SD-Karte?

Ausschlaggebend ist der Controller auf der Karte. Der sorgt dafür, dass 
die Flash-Blocks in etwa gleichmäßig abgenutzt werden. Auf diese Weise 
erzielt man eine hohe Lebensdauer des Flash-Speichers.

von Karl H. (kbuchegg)


Lesenswert?

Uhu U. schrieb:
> Sven B. schrieb:
>> Ist in einem USB-Stick nicht genau dieselbe Art Speicher verbaut
>> wie in einer SD-Karte?
>
> Ausschlaggebend ist der Controller auf der Karte. Der sorgt dafür, dass
> die Flash-Blocks in etwa gleichmäßig abgenutzt werden. Auf diese Weise
> erzielt man eine hohe Lebensdauer des Flash-Speichers.

Ja.
Aber wenn das Linux in /var/log jeden Tag ein paar Zig-megabyte Log 
Files erstellt, dann ist in ein paar Wochen/Monaten recht schnell Ende.
So man einigen Berichte im Web trauen kann.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dennis schrieb:
> Ein C-Programm auf einem Raspberry Pi misst den Aktuellen stromverbrauch
> meiner Wohnung und mittelt 10 min Werte und schreibt diese in eine
> Datenbank auf dem Raspberry Pi.
>
> Mit einem PHP Programm lese ich diese Datenbank aus und mache Bunte
> Diagramme auf meinem Webserver... auch auf dem Raspberry Pi.

Warum mach Dein C-Programm nicht einfach einen LISTEN auf einem 
bestimmten Port und das PHP-Programm holt sich per CONNECT den aktuellen 
Wert, dann, wenn dieser gebraucht wird?

von Operator S. (smkr)


Lesenswert?

Ich würde jetzt nicht eine extra Schnittstelle suchen, für die du erst 
noch die Handler schreiben musst. Wenn dein C und dein PHP Programm 
bereits die Datenbank brauchen, würde ich diese auch für die 
Momentanzeiten brauchen. Dazu einfach eine neue Tabelle erstellen mit 
der engine "Memory" und um die SD Karte musst du dir keine Gedanken 
machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.