Seite 1 von 5

Mini SV-Datalogger v2.11 (stable)

Verfasst: 04.07.2016, 13:04
von blackhole
Der "Mini SV-Datalogger" ist ein winziges Skript, welches einen Wert aus einer Systemvariablen ausliest und in einer anderen Systemvariablen sammelt. Bei Überschreitung einer konfigurierbaren Maximalanzahl, werden die gesammelten Werte "durchrotiert", so dass der jeweils älteste Wert verworfen wird.


Motivation

Der Code-Schnippsel ist entstanden, weil ich auch in TinyMatic einen schnellen Überblick über die letzten Duty-Cycle-Werte haben wollte.
Da das Skript unversell einsetzbar ist, stelle ich es hier zur freien Verfügung.

Grund für die Veröffentlichung ist der (OSS-)Gedanke, dass andere von meiner Arbeit profitieren können, wie ich von der Arbeit Dritter profitiert habe.


Skript

Code: Alles auswählen

! Mini SV-Datalogger v2.11
!---------------------------------------------------------------------------------
! Urheber: blackhole
!---------------------------------------------------------------------------------

!Voreinstellung Datenquelle, Systemvariable (Default: "Duty-Cycle")
string datasource = "Duty-Cycle";

!Voreinstellung Datenlogger, Systemvariable (Default: "Duty-Cycle-Data")
string datalogger = "Duty-Cycle-Data";

!Voreinstellung maximale Anzahl an gesammelten Werten (Default: 144)
string maxvalues = 144;

!Voreinstellung Werte mit Zeistempel versehen (ja/nein, Default: "nein")
string logtime = "nein";

string svvalue = dom.GetObject(ID_SYSTEM_VARIABLES).Get(datasource).Value();
string svdata = dom.GetObject(ID_SYSTEM_VARIABLES).Get(datalogger).Value();
string cut1 = ","; integer find1; string index; integer counter;
if (( svdata == "???" ) || (svdata == "")) { svdata = "Start"; }
if ( logtime == "ja" ) { logtime = "@" # system.Date("%H:%M"); }
else { logtime = ""; }
foreach(index, svdata.Split(cut1)) {
   counter = counter + 1;
   if (counter >= maxvalues) {
      find1 = svdata.Find(cut1);
      svdata = svdata.Substr(find1 + 2, svdata.Length());
   }
}
svdata = svdata # cut1 # " " # svvalue # logtime;
dom.GetObject(ID_SYSTEM_VARIABLES).Get(datalogger).State(svdata);
Voreinstellungen

Die Voreinstellungen (siehe Skript) sind denkbar einfach und schnell erklärt:
  • Angabe einer Systemvariable, aus welcher ein Wert ausgelesen soll (Datenquelle).
  • Angabe einer Systemvariable, in welche die Werte gesammelt werden (Datenlogger).
  • Angabe der maximalen Anzahl an Werten die gesammelt werden sollen.
  • Angabe ob Werte mit Zeitstempel versehen werden sollen (ja/nein).
Hinweise

Mit dem ersten Befüllen, der noch jungfräulichen/leeren "Sammel"-Systemvariable, wird automatisch das Wort "Start" vorangestellt, welches nach Erreichen der maximalen Anzahl an Werten "wegrotiert" wird (vgl. u.).

Nach Erreichen der maximalen Anzahl werden die gesammelten Werte "durchrotiert". D.h., der erste und somit älteste Wert wird gelöscht, der neue Wert wird hinten angefügt, so dass die voreingestellte maximale Anzahl an Werten nicht überschritten wird.


Changelog
  • v2.01: Erstes öffentliches Release von "Mini SV-Datalogger"
  • v2.02: Werte können optional mit einem Zeitstempel versehen werden
  • v2.10: Voreinstellungen etabliert und Verwendung der Methode Get()
  • v2.11: Kleinere Anpassungen für neue ReGaHss
  • v3.10 Spezialversion "Zwei Quell-Sysvars", siehe hier
  • v3.66 Spezialversion "Energieverbräuche", siehe hier

Re: Mini SV-Datalogger v2.02

Verfasst: 06.07.2016, 18:14
von blackhole
Mini SV-Datalogger v2.02 ist veröffentlicht (Changelog)
  • Auf besonderen Wunsch können Werte jetzt optional mit einem Zeitstempel versehen werden (WERT@HH:MM)

Re: Mini SV-Datalogger v2.02

Verfasst: 19.07.2016, 09:46
von kafisc
Hallo blackhole,

vielen Dank für das Skript. Ich würde die Ausgabe gerne anpassen. Ich nutze den SV-Datalogger um zu dokumentieren, wann ein Gerät (Ping/CUXD) erreichbar ist und wann nicht.

Sobal das Gerät nicht mehr erreichbar ist, setze ich die Systemvariable "Erreichbarkeit_Rassberry" auf offline.
Sobald wieder erreichbar ist, setze ich die Systemvaraible "Erreichbarkeit_Rasspberry" auf online.
Das Skirpt schreibt in die Varaible "Datalogger".

Als Ergebnis erhalte ich z. B. Folgendes:
true - 18.07.2016 15:19 Uhr
false - 18.07.2016 17:19 Uhr

Ich würde mir aber eine Anpasung a la TCL-Skript im Email-Addon wünschen:
if (dom.GetObject("Raspberry").Value() == 'false') {
var v20 = "online";
}else {
var v20 = "offline";
}

--> mit folgendem Ergebnis:
online - 18.07.2016 15:19 Uhr
offline - 18.07.2016 17:19 Uhr

Ich habe bereits versucht, mich etwas am TCL-Skript des Email-Adoons zu orientieren.
Leider bin ich bisher auf keinen grünen Zweig gekommen.

Hier das verwendete Skript:

Code: Alles auswählen

    !----------------------------------------------------------------
    ! Mini SV-Datalogger v2.02 von blackhole
    !----------------------------------------------------------------

    string svvalue = dom.GetObject("Erreichbarkeit_Raspberry").Value();
    string svdata = dom.GetObject("Datalogger").Value();
    integer maxvalues = 10;
    string logtime ="ja";

    string cut1 = ""; integer find1; string index; integer counter;
        if ( logtime == "ja" ) { logtime = "@" # system.Date("%d.%m.%Y %H:%M Uhr"); }
    else { logtime = ""; }
    foreach(index, svdata.Split(cut1)) {
       counter = counter + 1;
       if (counter >= maxvalues) {
          find1 = svdata.Find(cut1);
          svdata = svdata.Substr(find1 + 2, svdata.Length());
       }
    }
    svdata = svdata # cut1 # " " # svvalue # logtime;
    dom.GetObject("Datalogger").State(svdata);
Ich bin für jeden Tipp dankbar.

Viele Grüße
kafisc

Re: Mini SV-Datalogger v2.02

Verfasst: 19.07.2016, 10:17
von Cash
Ich würde die erste Zeile ersetzen:

Also dieses löschen

Code: Alles auswählen

string svvalue = dom.GetObject("Erreichbarkeit_Raspberry").Value();
und dies dort einfügen

Code: Alles auswählen

string svvalue;
if(dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi online";}
if(!dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi offline";}
alternativ geht das genauso

Code: Alles auswählen

    string svvalue;
    if(dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi online";}
    else {svvalue = "Raspi offline";}
Vorrausgesetzt die Systemvariable "Erreichbarkeit_Raspberry" bedeutet bei true online. Ansonsten einfach tauschen

Re: Mini SV-Datalogger v2.02

Verfasst: 19.07.2016, 10:44
von kafisc
Cash hat geschrieben:Ich würde die erste Zeile ersetzen:

Also dieses löschen

Code: Alles auswählen

string svvalue = dom.GetObject("Erreichbarkeit_Raspberry").Value();
und dies dort einfügen

Code: Alles auswählen

string svvalue;
if(dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi online";}
if(!dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi offline";}
alternativ geht das genauso

Code: Alles auswählen

    string svvalue;
    if(dom.GetObject("Erreichbarkeit_Raspberry").Value()) {svvalue = "Raspi online";}
    else {svvalue = "Raspi offline";}
Vorrausgesetzt die Systemvariable "Erreichbarkeit_Raspberry" bedeutet bei true online. Ansonsten einfach tauschen
Vielen Dank für die Rückmeldung. Das funktioniert so 1A.
Da hätte ich auch selbst drauf kommen können... :).

Grüße
kafisc

Re: Mini SV-Datalogger v2.02

Verfasst: 26.12.2016, 00:08
von Fruehwi
Hallo zusammen,

leider versuche ich jetzt schon seit mehreren Stunden das Script zum laufen zu bekommen.
Habe durch dieses Forum schon sehr sehr viel umgesetzt, aber jetzt stehe ich leider auf dem Schlauch.

Habe die Systemvariable Debug angelegt als Zeichenkette.
Egal ob ich jetzt nur eine andere Variable auslese z.B. Brenner letzte Ausschaltzeit oder wie ursprünglich geplant nur Texte Hinzufügen soll (z.B. Status von verschiedene Programme) funktioniert das Script nicht.
string svvalue = "Status xyz";

Beste Grüße,
Fruewhi

Code: Alles auswählen

!----------------------------------------------------------------
! Mini SV-Datalogger v2.02 von blackhole
!----------------------------------------------------------------

string svvalue = dom.GetObject("Brenner letzte Ausschaltzeit").Value();
string svdata = dom.GetObject("Debug").Value();
integer maxvalues = 144; 
string logtime ="nein";

string cut1 = ","; integer find1; string index; integer counter;
if (( svdata == "???" ) || (svdata == "")) { svdata = "Start"; }
if ( logtime == "ja" ) { logtime = "@" # system.Date("%H:%M"); } 
else { logtime = ""; }
foreach(index, svdata.Split(cut1)) {
   counter = counter + 1;
   if (counter >= maxvalues) {
      find1 = svdata.Find(cut1);
      svdata = svdata.Substr(find1 + 2, svdata.Length());
   }
}
svdata = svdata # cut1 # " " # svvalue # logtime;
dom.GetObject("Debug").State(svdata);

Re: Mini SV-Datalogger v2.02

Verfasst: 27.12.2016, 19:43
von blackhole
Deine Änderungen im Skript scheinen in Ordnung zu sein. Poste einen Screenshot von dem zugehörigen Programm.
Überprüfe in diesem Zusammenhang auch unter "Status und Bedienung" -> "Systemvariable" den Zeitpunkt der letzten Änderung der zu loggenden Systemvariable.

Re: Mini SV-Datalogger v2.10

Verfasst: 06.01.2017, 10:26
von blackhole
Mini SV-Datalogger v2.10 ist veröffentlicht (Changelog)
  • Voreinstellungen können jetzt im oberen Bereich des Skriptes vorgenommen werden
  • Verwendung der Methode Get() statt globales Suchen nach Namen (Danke an BadenPower)

Re: Mini SV-Datalogger v2.10

Verfasst: 26.02.2017, 20:53
von Fruehwi
Hallo zusammen,

ein sehr schönes Skript auf das ich schon lange gewartet habe.
Ich verwende es um gewisse Statusmeldungen in meiner Dashui Oberfläche anzeigen zu lassen.
Um die Systemvariable und Zeit zu vertauschen, bekomme ich noch selbst hin.

Nun zu meiner Frage, wie bekomme ich ein CR (Zeilenumbruch) nach jeder Zeile/Eintrag in das Skript?

Vielen Dank und Grüße,
Fruehwi

Re: Mini SV-Datalogger v2.10

Verfasst: 26.02.2017, 21:56
von blackhole
Du kannst einmal versuchen ein <br /> einzubauen.