Wurkkos Taschenlampen

Skilhunt Taschenlampen

Lux logging/saving Android app

G

Gelöschtes Mitglied 4431

Guest
Smartphone als Luxmeter, die Idee ist nicht neu!

Leute, die seltenst Lux messen oder loggen, sprich aufzeichnen/aufnehmen/recording, oder mal schnell einen direkten Laufzeitdiagramm-Vergleich machen wollen, z.B. Tala1 w/ Treiber1 versus Tala1 w/ Treiber2 versus Tala1 w/ Treiber3, können das nun ganz einfach über die kostenlose funktionstüchtige App "Lux Meter" von Angstrom Metrology in Verbindung mit meinem Code machen.

Die kostenlose Variante hat Werbeeinblendungen, kann man aber wegklicken:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeter&hl=en

Die Bezahlvariante kostet 1€, dann hat man keine Werbung na super:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeterp

Die Logging-Abtastfrequenz beträgt etwa 9.6Hz auf meinem Handy, was sehr hoch ist ("zittrige Kurve"); für unsere Zwecke habe ich einen gleitenden Durchschnitt von ca. 3.0s gewählt. Die Bedienung der App ist selbsterklärend, ganz kurz das Wesentliche:

  1. Wenn links/unten der Button mit <LUX> beschriftet ist, heisst das, dass die Aufzeichnung in der Maßeinheit Lux erfolgt. Tippt man darauf, ändert sich die Beschriftung auf <FC> (und sein unterer Rand färbt sich blau); die Aufzeichnung geschieht dann in Foot-Candle.
  2. Um zu starten, tippt man auf den <OFF> Button. Seine Beschriftung ändert sich daraufhin auf <ON> (und sein unterer Rand färbt sich blau).
  3. Die Zeit fängt an zu laufen. Die Anzeige Run Time: ??:?? wechselt nach einer Stunde auf Run Time: ?:??:??. Es gibt also keine zeitliche Beschränkung auf 59min59s.
  4. Mein Handy-Display möchte sich nach 2min User-Inaktivität (Berühren des Displays) immer ausschalten. Beim Loggen muss ich also neben dem Handy sitzen und spätestens alle 2min das Display kurz antippen, damit die Messreihe ununterbrochen bleibt.
  5. Da die Laufzeit leider nicht automatisch im Log mitgespeichert wird, muss man zur Beendigung der Messung auf <HOLD> tippen. (Die Beschriftung des Buttons ändert sich dann auf <RESUME> und sein unterer Rand färbt sich blau.) Die Laufzeit ist dann noch ablesbar, z.B. als Run Time: 37:58 für einen knapp 38-minütigen Lauf.
  6. Jetzt tippt man auf <SAVE>, und eine Eingabemaske erscheint. Im Feld "Notes:" trägt man das Schlüsselwort "time" gefolgt von der memorierten Laufzeit ein, also etwa "time37.58", "time 37.58", "time37:58", oder "time 37:58" o.ä. Als Trennzeichen kann man also Punkt xor Doppelpunkt verwenden, und Leerzeichen nach dem Schlüsselwort sind auch egal (enter w/o quotes!). Wer will kann/sollte in dem Feld noch mehr Notizen zum Lauf hinzufügen, z.B. Tala-Modell, Helligkeitsstufe High-Mode, Akkukapazität, usw.
  7. Im Feld "File name" gibt man einen Dateinamen ein, ohne Dateiendung, z.B. "test1a" (enter w/o quotes!).
  8. Die Datei ist nun als "test1a.txt" auf dem internen Speicher des Smartphones abgespeichert, und auf meinem Handy manuell auffindbar am Ort:
    Code:
    /storage/emulated/0/Android/data/com.angstrommetrology.luxmeter/files/LuxMeterFiles/test1a.txt
  9. Dann überträgt man die Datei kabellos auf den PC, z.B. per Filedrop app. Filedrop speichert die Datei automatisch im systemeigenen Download-Folder, also auf meinem Win7 System in:
    Code:
    C:\Users\placebo\Downloads\test1a.txt
Das war's. Jetzt kann man die Text-Datei auf dem PC in Ruhe begutachten und z.B. in Excel 2010 versuchen zu öffnen oder zu importieren. Aber der Grund dieses Threads ist, dass ich ein kleinen Code getippt habe, der beliebig viele solcher Dateien gleichzeitig verarbeiten kann und dann alle Laufzeitkurven zusammen anzeigt, mit einer einfachen bunten Legende.

Code:
Clear[myfun];

myfun[files : {__}, labels_List] :=
  Manipulate[
   Module[
    (* not all listed variables are needed *)
    {colors, txt, data, calf, amb, pkval, num, time, fc2lux,
     ToLuxFactors, TofcFactors, stl, tml},
 
    (* quick'n dirty way of generating colors lol *)
    colors = RandomColor[Length[files]];
 
    (* import all given files to one list of strings *)
    txt = Import[#, "Text"] & /@ files;
 
    (* extract numerical values from the imported strings *)
    data =
     StringCases[#,
        StartOfLine ~~ x : NumberString ~~ (" FootCandles" | " Lux") ~~
           EndOfLine :> ToExpression[x]] & /@ txt;
    calf =
     First@StringCases[#,
         StartOfLine ~~ "Cal Factor =" ~~ WhitespaceCharacter ... ~~
           x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@
      txt; (* {1,1} *)
    amb =
     First@StringCases[#,
         StartOfLine ~~ "Ambient =" ~~ WhitespaceCharacter ... ~~
           x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@
      txt; (* {0,0} *)
    pkval =
     First@StringCases[#,
         StartOfLine ~~ "Peak Value =" ~~ WhitespaceCharacter ... ~~
           x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@ txt;
    num =
     First@StringCases[#,
         StartOfLine ~~ "Total Number of Data Points =" ~~
           WhitespaceCharacter ... ~~ x : NumberString ~~ EndOfLine :>
           ToExpression[x]] & /@ txt;  (* {3472,2985} *)
 
    (* check if number of extracted values equals given number *)
    Print[Length /@ data == num];   (* True *)
 
    (* extract user-written run time from annotation field *)
    time =
     StringCases[#,
        "time" ~~ WhitespaceCharacter ... ~~
          x : (DatePattern[{"Hour", "Minute", "Second"}] |
             DatePattern[{"Minute", "Second"}] |
             DatePattern[{"Second"}]) ~~ WhitespaceCharacter ... :>
         x] & /@ txt; (* {{"6:0"},{"12.30"}} *)
 
    (* convert the extracted time string into time numbers *)
    If[AllTrue[time, # != {} &]
     , time = First /@ time
     ; stl = tml =
       Which[
          StringLength@# <= 2, DateList[{#, {"Second"}}],
          StringLength@# <= 5, DateList[{#, {"Minute", "Second"}}],
          True, DateList[{#, {"Hour", "Minute", "Second"}}]
          ] & /@ time
     ];

    (* set the run time start to 00:00:00 *)
    Do[stl[[i, -3 ;; -1]] = 0, {i, 1, Length[stl]}];

    (* 1fc = 10.76391.......lx *)
    fc2lux =
     QuantityMagnitude[UnitConvert[Quantity[1, "FootCandles"], "Lux"]];
 
    (* prepare conversion factors for future multiplication *)
    ToLuxFactors =
     StringContainsQ[txt, "Lux"] /. {True -> 1, False -> fc2lux};
    TofcFactors =
     StringContainsQ[txt, "FootCandles"] /. {True -> 1,
       False -> 1/fc2lux};

    (* convert the data to all lux or to all foot-candle *)
    If[ToLux
     , data = MovingAverage[#, 29] & /@ (data*ToLuxFactors)
     , data = MovingAverage[#, 29] & /@ (data*TofcFactors)
     ];

    (* show a rudimentary visualization of all given files *)
    Show[
     MapThread[
      Legended[
        DateListPlot[#1, {#2, #3}, PlotStyle -> #4]
        , Placed[Column[{
           LineLegend[{#4}, {#5}]
           , Row[{"Max=", N@Max[#1]}]
           }], Bottom]
        ] &
      , {data, stl, tml, colors, labels}
      ]
     , PlotRange -> All
     , ImageSize -> Full
     , FrameLabel -> {"Time [hh:mm]", "Illuminance"}
 
     (* you can modify the title here *)
     , PlotLabel -> "runtime test on High mode (Eneloop AAA)"
 
     ]
    ]
   , {{ToLux, True, "all values in Lux"}, {True, False}}
   ];
Der Code macht nichts anderes als die Daten aus den Textdateien (Plural!) säuberlich zu extrahieren und dann mit den built-in Funktionen visuell darzustellen. Die visuelle Darstellung kann Excel 2010 auch und tbh viel bequemer/schöner/leichter in der Nachbearbeitung, aber es ist doch ganz nett, dass man mit so wenig Programmieraufwand das ganze auch automatisieren kann. Per 1x Knopfdruck, sozusagen. Ausserdem stellt der Code sicher, dass die x-Achse automatisch und korrekt die Laufzeit darstellt, egal welche Abtastfrequenz das Handy-Modell (Samsung, Xiaomi, iPhone, Huawei, usf.) an Tag legt. Bei unterschiedlich langen Tests stimmt die Länge der x-Achse mit der längsten Run Time überein und zeigt die Zeit im schönen Zeitformat an. Mit Excel 2010 ist es bestimmt mühsam, die Achseneinteilung vorzunehmen, wenn man ~60000 y-Werte hat und man nur weiss, dass sie über einen Zeitraum von ~1h37min49s gleichmäßig verteilt sind. Da müsste man entweder umständlich umrechnen, oder man verlöre die Lust bei dem ganzen Hantier. Wer nur Excel hat, würde schnell das Testen dieser netten Smartphone-App aufgeben. :vorsichtig: Außerdem ist es für den Code egal, ob die eine Datei in Foot-Candle und die andere Datei in Lux aufgezeichnet wurden. Mit einem Mausklick werden die Kurven automatisch alle in Lux oder eben alle in Foot-Candle angezeigt.

Ach so, der Programmaufruf erfolgt z.B. so auf meine Win7 System:
Code:
file1 = "C:\\Users\\placebo\\Downloads\\test1a.txt";
file2 = "C:\\Users\\placebo\\Downloads\\test2a.txt";
myfun[{file1, file2}, {"Tala A mit Treiber 1", "Tala A mit Treiber 2"}]

Auf einem Raspberry Pi (z.B. per Win7 RealVNC Viewer Verbindung) erfolgt der Programmaufruf dann so:
Code:
file1="/home/pi/Downloads/test1a.txt";
file2="/home/pi/Downloads/test2a.txt";
myfun[{file1, file2}, {"Tala A mit Treiber 1", "Tala A mit Treiber 2"}]

Die Idee, die TXT-Datei nicht mit Excel zu verarbeiten, kam mir sofort, als ich den Inhalt/Aufbau der Textdatei sah. Sie hat ein stures Format. Das bietet sich förmlich an, per Code automatisch eingelesen u. verarbeitet zu werden:
textfileformat.png
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 4431

Guest
Darf man eigentlich Screenshots von meinem Programm/Software posten? :(
 

oOFOXOo

Flashaholic**
9 März 2015
4.023
6.287
113
37
Tamsweg (A)
www.instagram.com
Darf man eigentlich Screenshots von meinem Programm/Software posten? :(
Ich denke wenn es deine eigenen Screenshots von deinem Smartphone sind schon! Ich hatte bei der Vorstellung der Luxmeter App vorher ziemlich viel Kontakt zu dem Programmierer (da er noch einige Änderungen für mich vornahm) und hatte ihn zusätzlich um Erlaubnis gefragt...

Gruß Andi
 
G

Gelöschtes Mitglied 4431

Guest
Selbst erstellte Graphen davon Screenshots (aus Excel oder anderen Programmen) sind ja in Tala-Reviews normal, dürfte also erlaubt sein. Hier das direkte Ergebnis nach Drücken der <Enter>-Taste meiner Tastatur bei der Software-Zoomeinstellung 100%:



Dass man einen so schönen/glatten Graphen mit dem Smartphone als Luxmeter hinkriegen kann, wer hätte das vor Jahren in der Tala-Szene gedacht. Die Messung sieht so präzise aus, dass man die Überschneidungen der Kurven genau erkennen kann und dass die beiden Treiber die exakt gleiche Laufzeit haben.

Dass die rote Kurve höher liegt, sich dann aber gegen Ende der Laufzeit mit der anderen deckt, lässt Spielraum für Interpretationen zu.
 
G

Gelöschtes Mitglied 4431

Guest
Danke für den Hinweis auf die App!
Ich verwende die Lux Meter App von waldau-webdesign.de die ich hier in dem Thread genauer vorgestellt habe.
Ebenso danke für den Hinweis auf deine favorite Lichtmesser app, ich habe sie mir mal flott angeguckt :ninja:
Der Automatisierungscode dafür ist sogar noch kürzer/einfacher, die Umrechnung von Foot-Candle nach Lux habe ich mal weggelassen:


Code:
myfun[files : {__}, labels_List] :=
 Module[
  (* all listed variables are needed *)
  {data, tranges, runtimes, tseries, tseriesr},
 
  (* import all data from the given CSV files *)
  data = Rest[Import[#, "CSV"]] & /@ files;
 
  (* {{"14:49:39","14:53:45"},{"15:32:33","16:20:25"}} *)
  tranges = Map[Last, {First[#], Last[#]} & /@ data, {2}];
 
  (* {4.1`,47.86666666666667`} in minutes *)
  runtimes = QuantityMagnitude@DateDifference[#1, #2, "Minutes"] & @@@ tranges;
 
  (* transform data into list of time series *)
  tseries = TimeSeries@#[[All, {-1, 2}]] & /@ data;
 
  (* rescale time series to run time in minutes *)
  tseriesr = MapThread[TimeSeriesRescale[#1, {0, #2}] &, {tseries, runtimes}];
 
  (* show a rudimentary visualization of all given files *)
  ListLinePlot[
    MapThread[Legended[#1, Placed[#2, Bottom]] &, {tseriesr, labels}]
    , Frame -> True
    , FrameLabel -> {"run time [min]", "illuminance [lx]"}
    , GridLines -> Automatic
    , ImageSize -> Large
    , PlotLabel -> "gespeist by oOFOXOo's favorite Lichtmesser app"
    ] // CreateDialog
  ]

Der Programmaufruf erfolgt identisch wie im OP; man kann beliebig viele *.CSV-Dateien gleichzeitig einlesen. Und das ist, was das Programm dann ausspuckt bei 2 Rohdateien:

output.png

Ein paar kritische Bemerkungen zur deiner favorite App im FREE-Modus:
  • Die maximal mögliche nominale Abtastfrequenz in der exportierten Datei liegt bei (1/15)Hz, also 0.06667Hz. Das finde ich unbefriedigend niedrig. Alle 15 Sekunden wird ein Lux-Wert aufgezeichnet. Was für eine Auflösung! :sprachlos:
  • Die Zeitabstände zwischen den exportierten Datenpunkten beträgt manchmal genau 15sec, oft aber mehr oder gar viel mehr. Die Zeitabstände sind also sehr unregelmässig, nicht konstant. Manch ein FREE-User könnte das nervend finden. Ob die Zeitabstände in der Bezahlversion dann wirklich immer exakt/konstant 1sec betragen würden (in der 1sec-Einstellung), darf ich aufgrund von published screenshots bezweifeln.
  • Im Bezahlmodus soll die max. mög. nom. Abt. i. d. exp. Dat. 1Hz betragen. Ich fände nominelle 1Hz ziemlich niedrig, wenn man dafür schon zahlt.
  • Die Funktion "Keep Screen on?" ist deaktiviert in der FREE-Version. Man muss also zahlen, damit das Display sich nicht nach 2min ausschaltet.
  • Man kann nur 2 Dateien abspeichern in der FREE-Version. Wer mehr aufzeichnen will, muss zahlen.
  • Es gibt noch weitere Limitationen in der FREE-Version, ganz abgesehen von der eingeblendeten Werbung.
  • Die Bedienung der App ist objektiv gesehen nicht ganz so einfach wie bei meiner vorgestellten App.
Ich bleibe also bei meiner favorisierten App v1.0 und hoffe, dass auch so eine "Keep Screen on?"-Funktion im nächsten Update kommen wird. Es ist doof, wenn man eine Messung am laufen hat und das Meßgerät sich mitten in der Messung ausschaltet. :pinch:
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: angerdan

kirschm

Flashaholic***
13 April 2017
5.393
2.608
113
Die Funktion "Keep Screen on?" ist deaktiviert in der FREE-Version. Man muss also zahlen, damit das Display sich nicht nach 2min ausschaltet

Falls Du Dich mit 'Tasker' auskennst... dann kannste eine Task machen, die z.B. jede Minute auf eine bestimmte Stelle touched... Ich mache das z.B., damit ich bei meinem TomTom Go nach der Trennung von Bluetooth automatisch auf 'Schliessen' klicken kann.

Der Tasker Befehl heisst: Run Shell, Command Input Tap 500 340 (500 340 wären z.B. die Koordination des gewünschten Touch Punktes).
 

kirschm

Flashaholic***
13 April 2017
5.393
2.608
113
Ja, die Tasker App kostet was... ich könnte aber ohne diese ein Android Handy nicht sinnvoll benutzen...

Mein Vorschlag bezog sich auf den Fall, dass Du die App kennst/benutzt...

P.S.: Tasker ist eine allgemeine App, um so ziemlich alles zu automatisieren... z.B. wenn mit Bluetooth Gerät ABC verbunden und es ist zwischen 10h und 14h, dann mache dies und das... oder: wenn nicht mehr im eigenen WLAN verbunden, dann Handy muten... und Displayhelligkeit auf max... etc. etc. etc...
 
Zuletzt bearbeitet:

joechina

Flashaholic*
20 Mai 2017
719
457
63
Es gibt noch ein Programm, auf BLF wird gern ceiling bounce benutzt.
Und ist Freeware


Aus meinen Notizbuch:

Tools / Werkzeuge:

Android App: Ceilingbounce
from Zak
https://github.com/zakwilson/ceilingbounce
( there is a table row klick there on "releases" to finde the apk. )
https://github.com/zakwilson/ceilingbounce/releases/
Read the readme file!
An Android-App which give a runtime graph. Output is measured in percent. Usefull to test runtime and how the lamp steps down.
Q: http://budgetlightforum.com/node/53741
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 4431

Guest
Die kostenlose Variante hat Werbeeinblendungen, kann man aber wegklicken:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeter&hl=en
1 Jahr 722 ist's her, habe seitdem keine Tala Luxwerte mehr geloggt und auch nicht mehr programmiert. Meinen Code durchblicke ich auch nicht mehr. Habe alles vergessen wie geht, das Alter zehrt ("Schlimm-schlimm") lol.
Die FREE App ist noch auf meinem Handy und funktioniert weiterhin, schön-schön.

Allerdings sehe ich dass der App Hersteller sein FREE Angebot zurückgenommen hat und derzeit nur noch die Bezahlversion anbietet. Damit macht er sich bei mir nicht gerade beliebt. Aber was soll's, wer genau diese App schätzt und auf dem neuen Handy installieren will, wird bestimmt gerne den Euro ausgeben. Laut Playstore ist die App mittlerweile sehr populär und wurde schon über 100-mal weltweit gekauft. :thumbup: