NEWS
Rechnen mit 2 Objekten
-
Hi zusammen!
Wie kann ich mit 2 Objekten rechnen?
Und zwar möchte ich mir z.B. Beim RPI Adapter bei Sdcard noch den freien Speicher anzeigen lassen und dafür möchte ich rpi.0.sdcard.sdcard_root_total - rpi.0.sdcard.sdcard_root_used rechnen und das Ergebnis in ein neues Objekt setzen!
Aber wie mach ich das?
Kann mir da jemand bei dem Script bitte behilflich sein?
Gruß Johnny
-
Probier mal:
createState("sdcard_root_free",0); var sdcard_root_free = getState(rpi.0.sdcard.sdcard_root_total).val - getState( rpi.0.sdcard.sdcard_root_used ).val; log("sdcard_root_free: " + sdcard_root_free); setState("sdcard_root_free",sdcard_root_free);
Beim ersten Start dürfte noch ein Fehler kommen, da der Datenpunkt noch nicht angelegt ist.
Beim zweiten Start sollte es durchlaufen.
Wenn es funktioniert kannst Du das noch abfangen.
Wobei Du das dann in dem Script nicht mehr merken wirst
-
Hi ruhr70!
Danke für Deine Unterstützung aber leider klappt das nicht!
Im log steht folgendes:
javascript-0 2016-03-08 17:09:38 error script.js.RPI_MemFree compile failed: SyntaxError: Unexpected number
Johnny
-
Halt, jetzt gehts!
Hab die IDs nochmal neu eingefügt!
Jetzt läuft es!
Muss ich da jetzt noch n cron anhängen oder erkennt es automatisch Veränderungen des Speicherplatzes?
Gruß
Johnny
-
Du kannst ein on/subscribe machen
function memBerechnen(){ var sdcard_root_free = getState(rpi.0.sdcard.sdcard_root_total).val - getState( rpi.0.sdcard.sdcard_root_used ).val; log("sdcard_root_free: " + sdcard_root_free); setState("sdcard_root_free",sdcard_root_free); } on({ id: 'rpi.0.sdcard.sdcard_root_used', change: 'any' } memBerechen );
einbauen, wenn sich 'used' ändert, dann loslegen.
Das kann aber nach hinten los gehen, wenn sich der 'used' stänig ändert.
Dann besser ein Schedule.
Statt on() dann
schedule('*/10 * * * *', memBerechnen);
-
Um die CPU-Belastung gering zu halten, wenn sich "used" häufig ändert, würde ich es so machen:
var used = getState("rpi.0.sdcard.sdcard_root_used").val; var total = getState("rpi.0.sdcard.sdcard_root_total").val; setState("sdcard_root_free", total - used); // Script start on('rpi.0.sdcard.sdcard_root_used', function(dp) { setState("sdcard_root_free", total - dp.state.val); });
-
Um die CPU-Belastung gering zu halten, wenn sich "used" häufig ändert, würde ich es so machen:
var used = getState("rpi.0.sdcard.sdcard_root_used").val; var total = getState("rpi.0.sdcard.sdcard_root_total").val; setState("sdcard_root_free", total - used); // Script start on('rpi.0.sdcard.sdcard_root_used', function(dp) { setState("sdcard_root_free", total - dp.state.val); }); ```` `
Ich verstehe es nicht ganz.
Ist da nicht der einzige Effekt, dass total sich nicht ändert und daher nicht immer neu ausgelesen werden muss?
Oder gibt es noch einen anderen Effekt?
Ansonsten wird doch auch bei jeder Änderung geschrieben.
Wenn jede Änderung wieder eine Änderung auf der SD Karte nachzieht, hört das gar nicht mehr auf.
[EDIT]
Ok, rpi.0.sdcard.sdcard_root_used wird bei Änderung auch nur einmal gelesen, statt zweimal.
-
Stimmt, das ist deutlich effektiver.
Trotzdem glaub ich, dass das ein eine irre CPU belastung erzeugt, weil sich used ja ständig ändert.
Meine Präferenz wäre ein schedule. Jede Minute oder sogar all 10 sek, das wäre immer noch seltener als bei jeder Änderung mit Subscribe.
Die Idee ist ja bestimmt so in etwa den Trend zu erkennen, und nicht ein Echtzeit-Monitoring.
-
Tausend Dank euch allen!
Ich hab es jetzt mit Schedule eingebunden
Ist das so in Ordnung?
createState("sdcard_root_free",0); function memBerechnen(){ var sdcard_root_free = getState("rpi.0.sdcard.sdcard_root_total"/*rpi.0.sdcard.sdcard_root_total*/).val - getState("rpi.0.sdcard.sdcard_root_used"/*rpi.0.sdcard.sdcard_root_used*/).val; log("sdcard_root_free: " + sdcard_root_free); setState("sdcard_root_free",sdcard_root_free); } schedule('*/10 * * * *', memBerechnen);
10-Min Rythmus reicht mir vollkommen!
Gruß
Johnny