Variable im Arbeitsspeicher schreiben und lesen

Gast #4361964
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
#4362026
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.
#4362583
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.
Gast #4363112
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.
Gast #4365374
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..
Gast #4365389
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.
#4365631
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.
Gast #4366269
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?
Gast #4366289
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.
#4370094
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.
Moderator Persönliche Seite #4371268
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?
#4373274
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren