Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von alchy » 19.09.2016, 13:28

>> H I E R << wurde die Frage gestellt, worauf ich die folgende Anleitung geschrieben habe.
Viel einfacher ist natürlich >>dieses alte Script<<

Die Anleitung setzt voraus, das cuxd installiert ist und das entsprechende exec Gerät funktioniert.
Natürlich würde es auch mit system.exec zum Aufruf des Scriptes funktionieren.
Der Zugriff auf das Filesstem der CCU ist >> H I E R << unter anderem beschrieben, bzw. verlinkt. Ich würde dir zu sftp wie verlinkt raten. Zum Editieren von Dateien >> Notepad++ << aber keinen Windoof Schrott Editor wie Wordpad usw.

Anleitung:

Du legst ein neues File mit Namen log2file.tcl
auf der CCU an im folgenden Beipiel im Ordner:

Code: Alles auswählen

/usr/local/addons/log2file/
und machst es ausführbar.

Der Inhalt des Files ist:

Code: Alles auswählen

#!/bin/tclsh
file mkdir "/mnt/log2file"
set filename "/mnt/log2file/log2file.csv"
set args [join $argv " "]
set fileId [open $filename "a+"]
puts $fileId $args
 close $fileId
ACHTUNG: die beiden Zeilen im Script
file mkdir "/mnt/log2file"
set filename "/mnt/log2file/log2file.csv"


verweisen auf den Ordner und den Namen der Datei, wo das Log gespeichert werden soll.
Du musst einen Ort wählen welcher beschreibbar ist.
Der Unterordner log2file wird durch das script angelegt, die Datei log2file.csv auch.
In meinem Fall ist es der USB Stick, der unter /mnt erreichbar ist.

[EDIT]
Sollte jemand lieber in eine Monatsdatei loggen wollen, dann wäre diese TCL sinnvoll:

Code: Alles auswählen

#!/bin/tclsh
file mkdir "/usr/local/addons/log2file"
set datum [clock format [clock seconds] -format  {%Y-%m}]
set filename "/usr/local/addons/log2file/log2file_$datum.csv"
set args [join $argv " "]
set fileId [open $filename "a+"]
puts $fileId $args
close $fileId
Das würde dann jeweils Dateien anlegen mit den Namen des Jahres und des Monates anhängend
log2file_2021-01.csv
log2file_2021-02.csv
....

[/EDIT]


Es ist zwar nicht empfehlenswert direkt auf den USB zu loggen, aber alles andere zu erklären
würde den Rahmen hier sprengen. Die SD Karte solltest du unter

Code: Alles auswählen

/media/sd-mmcblk0
finden, soweit ich mich erinnere. Schau einfach mal nach per sftp und versuche damit eine neue Datei anzulegen....
Speichern im RAM der CCU ist z.B. auch möglich, bei einem Reboot ist jedoch die Datei weg.
Also dreckig auf den USB oder SD direkt. :mrgreen:

Nachdem du das erledigt hast, legst du in der Klickibunti ein neues Programm an.
Wenn Gerät modifiziertem Fensteraktor.....
Grundsätzlich ist es egal, ob eine Systemvariable, ein Temperatursensor, oder ein Schaltaktor, das Zeitmodul usw. in dem Programm als Auslöser dient. Was das Programm auslöst, wird geloggt.
Man muss natürlich nicht auf Aktualisierung auslösen, wenn man z.B. nur bestimmte Sachen loggen will.
Dazu meine Signatur durcharbeiten zur Logik von Programmen.
Bitte aber dabei bedenken, es nicht zu übertreiben.
Es folgt ein kleines Beispiel, um zu verdeutlichen, was alles so machbar ist.
log2file.jpg
dann Script:

Code: Alles auswählen

! Programmauslösende Systemvariable (jedes Types) oder Kanalnamen (soweit ich es überblicken kann) und auch das Zeitmodul ermitteln und...
! by Alchy 0.2a gekürzt
! +++++++++++++++++
string slist = "Fehler";
object src = dom.GetObject("$src$");
if (src){
if (src.TypeName() == "HSSDP") {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(((dom.GetObject(src)).Channel())).Name()#","#src.Value(); 
} else {
slist = system.Date("%d.%m.%y,%H:%M")#","#src.Name()#","#src.Value().ToString(3)#","#src.ValueUnit() ;
} 
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("tclsh /usr/local/addons/log2file/log2file.tcl " # slist);
}
Du erhältst an der Stelle dann ein komma separiertes file mit
Datum,Uhrzeit,Name des Programmauslösers,Status wie das hier:

Code: Alles auswählen

16.09.16,12:56,Arbeitszimmer Deckenlicht,true
16.09.16,13:06,Anwesenheit,false
16.09.16,13:11,Arbeitszimmer Deckenlicht,true
16.09.16,13:11,Arbeitszimmer Deckenlicht,false
16.09.16,13:13,Tor Garage,true
16.09.16,13:13,Tor Garage,false
16.09.16,13:13,Tor Garage,true
16.09.16,13:20,Tor Garage,false
16.09.16,13:23,Innensensor,21.800000
16.09.16,13:26,Innensensor,21.800000
16.09.16,13:29,Innensensor,21.800000
16.09.16,13:31,Innensensor,21.800000
16.09.16,13:33,Innensensor,21.800000
16.09.16,13:35,Zeitmodul,true
16.09.16,13:36,Innensensor,21.800000
Jetzt könnte man noch die true und false anpassen und vieles mehr.
Aber ich will den Rahmen hier nicht sprengen. Wer Änderungen wünscht kann sich ja melden.
viewtopic.php?f=31&t=35686#p342882
^^ hier gibt es dann das endgültige Script um den Auslöser eines Programmes zu loggen.


Würde mich freuen, wenn du (oder wer auch immer es probiert) eine Rückmeldung gibt.

Alchy


Und wer mehr als 1-2 Daten loggen will sollte sich folgende Zusammenfassung durchlesen:

>> CUxD << hat die filebasierte Loggingfunktion schon perfekt integriert und vor allem hast du auch gleich noch die Möglichkeit mit den Daten etwas anzufangen, wenn du >>CUxD Highcharts<< benutzt.

Bild

Wenn du den Thread, das Handbuch von CUxD durch hast oder >> H I E R << oder auch den >> H I E R << und einfach die Suche benutzt, solltest du das problemlos in den Griff kriegen.
Wenn nicht, musst du dich noch mal melden. :mrgreen:

Das ist natürlich nur eine Möglichkeit. Da wäre z.B. noch >> CCU-Historian <<
Da CUxD aber auch noch andere gute Möglichkeiten mitbringt, würde ich das mal als besten Tipp mitgeben wollen.

Aber natürlich kann man auch ein eigenes "Logging" bewerkstelligen, so wie oben aufgeführt.
Langfristig würde ich empfehlen zumindest auf das Logging direkt in CUXD umzuschwenken, oder eine anderere Lösung zu verwenden.
Zuletzt geändert von alchy am 15.02.2021, 21:43, insgesamt 3-mal geändert.
Grund: [EDIT]

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Rolf A
Beiträge: 95
Registriert: 06.04.2016, 20:01
System: Alternative CCU (auf Basis OCCU)
Wohnort: Oberlichtenau
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von Rolf A » 25.01.2018, 17:03

Hallo Alchy,

entschuldige, wenn ich das Thema noch mal aufwärme. Ich muß vorausschicken, daß ich mir das "Skripten" hier im Forum versuche anzulernen. Dabei greife ich auch auf die angegebenen Quellen zurück, inklusive der Fortsetzung im ELV-Journal. Da meine Lehrzeit zum Elektroniker schon ein Weilchen zurück liegt, der Schaltkreis D100 als NAND-Gatter wurde gerade in unserem Theorieunterricht als das Neuste vom Neusten behandelt, fällt es mir doch recht schwer mit Methoden und Funktionen umzugehen.

Trotzdem lasse ich mich nicht abschrecken, immer wieder was Neues auszuknobeln. Meiner besseren Hälfte sage ich immer, es ist wie Modelleisenbahn nur nützlicher, aber genauso teuer. :-)

Nun aber zum Problem:

Ich habe das Energiezähler Skript von JMaus zum Laufen bekommen. Nun wollte ich die Daten nicht nur in ioBroker aktuell anzeigen, und in Highcharts grafisch darstellen, sondern auch in einer Liste erfassen. Deshalb habe ich Dein Skript hier versucht für meine Zwecke anzupassen.

Ich will zwei Systemvariablen (vielleicht auch mal mehr) am Ende des Tages in die Liste schreiben. Also lasse ich mit einem Timer (CuxD) um 23:55 Uhr täglich Dein Skript laufen. Da sich die Systemvariablen über den ganzen Tag ändern, kann ich diese nicht wie Du vorgeschlagen hast auf Aktualisierung oder Änderung Triggern. $src$ führte also bei mir nicht zum Ergebnis, wenn ich als Auslöser einen Timer genommen habe. Also bin ich davon ausgegangen, daß ich die Systemvariable im Skript benennen muß. Weil ich zwei Systemvariablen loggen wollte, führe ich Deinen Programmcode modifiziert zweimal aus. Wie man unten sieht funktioniert es.

Die Fragen sind nun, mache ich da was falsch, geht das effektiver, und kann man die Einheit m3 (Kubikmeter) in der Liste auch noch unterbringen?

Und kann es sein, daß die Datei "log2file.csv" im vorgesehenen Ordner vorhanden sein muß? Das tcl-Skript erzeugte sie nicht. Nur wenn ich es per ssh auf der Kommandozeile ausführe, dann erzeugt es eine leer csv-Datei. Danach wird die Datei beschrieben, wie es sein soll.

Code: Alles auswählen

! Programmauslösende Systemvariable (jedes Types) oder Kanalnamen (soweit ich es überblicken kann) und auch das Zeitmodul ermitteln und...
! by Alchy 0.2a gekürzt
! +++++++++++++++++
! SV = Gas Zaehlerstand
! SV = Gas Verbrauch heute
string slist = "Fehler";
! object src = dom.GetObject("$src$");
object src = dom.GetObject("Gas Zaehlerstand");
if (src){
if (src.TypeName() == "HSSDP") {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(((dom.GetObject(src)).Channel())).Name()#","#src.Value(); 
} else {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(src).Name()#","#src.Value().ToString(3) ; 
} 
dom.GetObject("CUxD.CUX2801003:8.CMD_EXEC").State("tclsh /usr/local/addons/log2file/log2file.tcl " # slist);
}
string slist = "Fehler";
object src2 = dom.GetObject("Gas Verbrauch heute");
if (src2){
if (src2.TypeName() == "HSSDP") {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(((dom.GetObject(src2)).Channel())).Name()#","#src2.Value(); 
} else {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(src2).Name()#","#src2.Value().ToString(3) ; 
} 
dom.GetObject("CUxD.CUX2801003:8.CMD_EXEC").State("tclsh /usr/local/addons/log2file/log2file.tcl " # slist);
}
Bild 2018-01-25 um 16.49.50.jpg
Bild 2018-01-25 um 16.49.50.jpg (26.1 KiB) 10833 mal betrachtet
Ich würde schon ganz gern verstehen, wie Dein Skript funktioniert. Teile sind mir schon klar, aber was es mit der Zeile auf sich hat, bleibt mir unklar.

Code: Alles auswählen

string slist = "Fehler";
Schon mal vielen Dank.

Gruß
Rolf

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von alchy » 25.01.2018, 18:54

Rolf A hat geschrieben: Wie man unten sieht funktioniert es.
Ein Möglichkeit.
Rolf A hat geschrieben: Die Fragen sind nun, mache ich da was falsch, geht das effektiver,
Es geht doch immer alles auf verschiedenen Wegen. Ob es nun besser oder effektiver ist...
Du könntest die Variablen in einer Liste im Script speichern und mittels Schleife abarbeiten.
Besser noch:
Du könntest zu loggende Systemvariablen oder Kanäle usw. in einen Favoriten ( logging ) legen und dann mittels einem kurzen Script daraus alle zu loggenden Variablen automatisch auslesen lassen.
Brauchst du dich nicht mehr mit dem Script beschäftigen. Wenn du was loggen willst, schiebst du es in den Favoriten logging und fertig.
Wäre ein schönes Projekt für mich.
Rolf A hat geschrieben:
und kann man die Einheit m3 (Kubikmeter) in der Liste auch noch unterbringen?
Das ist sehr einfach möglich, in dem du z.B. die Maßeinheit mit .ValueUnit() aus der CCU ausliest und anhängst:

Code: Alles auswählen

slist = system.Date("%d.%m.%y,%H:%M")#","#src.Name()#","#src.Value().ToString(3)#","#src.ValueUnit() ; 
Rolf A hat geschrieben:
Und kann es sein, daß die Datei "log2file.csv" im vorgesehenen Ordner vorhanden sein muß? Das tcl-Skript erzeugte sie nicht. Nur wenn ich es per ssh auf der Kommandozeile ausführe, dann erzeugt es eine leer csv-Datei. Danach wird die Datei beschrieben, wie es sein soll.
Wie hab ich es beschrieben? Wenn ich mich nicht irre "wird automatisch beim ersten Aufruf angelegt" dann war es damals auch so.
Da müsste ich noch mal nachschauen, vielleicht gibt es da Änderungen. Das Script ist ja mittlerweile auch in die Jahre gekommen und enthält längst nicht alles, was nötig und möglich ist.
Rolf A hat geschrieben:
aber was es mit der Zeile auf sich hat, bleibt mir unklar.

Code: Alles auswählen

string slist = "Fehler";
Wieso unklar?
Das ist nur die Deklaration der Variable slist, die ich sehr oft in meinen Scripten verwende als Zeichenkette. Such mal globale Variable oder so.
Oder stört die das Fehler? ich hätte auch nur

Code: Alles auswählen

string slist;
schreiben können.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Rolf A
Beiträge: 95
Registriert: 06.04.2016, 20:01
System: Alternative CCU (auf Basis OCCU)
Wohnort: Oberlichtenau
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von Rolf A » 25.01.2018, 19:01

Hallo Alchy,

vielen Dank für Deine schnelle Antwort. Das muß ich aber noch ein paar mal lesen. :-)

Werde in Ruhe versuchen das nachzuvollziehen.

Vielen Dank!

Rolf

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von alchy » 25.01.2018, 19:08

Wo hast du ein Problem?

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Rolf A
Beiträge: 95
Registriert: 06.04.2016, 20:01
System: Alternative CCU (auf Basis OCCU)
Wohnort: Oberlichtenau
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von Rolf A » 25.01.2018, 19:27

Hallo Alchy,

nein kein Problem direkt, sondern es dauert wirklich immer ein wenig, manches muß ich dann noch nach schauen. So ist mir zum Bespiel nicht klar, warum hinter "#src.ValueUnit() ; kein Kaptälchen kommt.

Code: Alles auswählen

slist = system.Date("%d.%m.%y,%H:%M")#","#src.Name()#","#src.Value().ToString(3)#","#src.ValueUnit() ; 
Und ob sich ValueUnit auf die Einheit in der Systemvariablen bezieht.

Aber ich wühl mich da schon durch.

Danke, Gruß

Rolf

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von alchy » 25.01.2018, 19:54

Rolf A hat geschrieben:warum hinter "#src.ValueUnit() ; kein Kaptälchen kommt.
Weil es da nicht hingehört? :mrgreen:
ich weiß, ist blöd, aber ich kann ja nicht alles mögliche beschreiben und erklären. Ich schreibe schon viel zu viel.
Rolf A hat geschrieben: Und ob sich ValueUnit auf die Einheit in der Systemvariablen bezieht.
Aber du hast doch gefragt nach der Einheit der Systemvariablen zum loggen. :cry:
Der Code macht genau das. Er liest die Einheit der Systemvariable aus und speichert sie mit in der .csv

Ich habe dein angepasstes Script mal erweitert, das es funktionieren müsste mit der Einheit bei Systemvariablen:

Code: Alles auswählen

! Programmauslösende Systemvariable (jedes Types) oder Kanalnamen (soweit ich es überblicken kann) und auch das Zeitmodul ermitteln und...
! by Alchy 0.2a gekürzt geändert von Rolf A
! +++++++++++++++++
! SV = Gas Zaehlerstand
! SV = Gas Verbrauch heute
string slist = "Fehler";
! object src = dom.GetObject("$src$");
object src = dom.GetObject("Gas Zaehlerstand");
if (src){
if (src.TypeName() == "HSSDP") {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(((dom.GetObject(src)).Channel())).Name()#","#src.Value(); 
} else {
slist = system.Date("%d.%m.%y,%H:%M")#","#src.Name()#","#src.Value().ToString(3)#","#src.ValueUnit(); 
} 
dom.GetObject("CUxD.CUX2801003:8.CMD_EXEC").State("tclsh /usr/local/addons/log2file/log2file.tcl " # slist);
}
string slist = "Fehler";
object src2 = dom.GetObject("Gas Verbrauch heute");
if (src2){
if (src2.TypeName() == "HSSDP") {
slist = system.Date("%d.%m.%y,%H:%M")#","#dom.GetObject(((dom.GetObject(src2)).Channel())).Name()#","#src2.Value(); 
} else {
slist = system.Date("%d.%m.%y,%H:%M")#","#src2.Name()#","#src2.Value().ToString(3)#","#src2.ValueUnit(); 
} 
dom.GetObject("CUxD.CUX2801003:8.CMD_EXEC").State("tclsh /usr/local/addons/log2file/log2file.tcl " # slist);
}
Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Rolf A
Beiträge: 95
Registriert: 06.04.2016, 20:01
System: Alternative CCU (auf Basis OCCU)
Wohnort: Oberlichtenau
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von Rolf A » 25.01.2018, 20:39

Hallo Alchy,

danke, das mit der Einheit funktioniert.
Weil es da nicht hingehört?
Ja, jetzt habe ich es "gesehen" - das "," gehört zusammen. Das meinte ich mit mehrmals hinschauen. Ich sehe nämlich wirklich schlecht.

Danke.

Rolf

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von alchy » 25.01.2018, 20:48

Rolf A hat geschrieben: Ich sehe nämlich wirklich schlecht.
Nicht schlimm, geht mir auch so. "Strg + " ist die meist genutzte Tastenkombi :mrgreen:

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Rolf A
Beiträge: 95
Registriert: 06.04.2016, 20:01
System: Alternative CCU (auf Basis OCCU)
Wohnort: Oberlichtenau
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Daten filebasierend auf CCU2 SD-Karte / USBStick loggen

Beitrag von Rolf A » 26.01.2018, 08:14

Nicht schlimm, geht mir auch so. "Strg + " ist die meist genutzte Tastenkombi
Bei mir Strg & Maus hoch und runter streichen. Und die Tastatur hat eine extra große Beschriftung. http://logickeyboard.com/shop/largeprin ... 3621p.html :)

Gruß

Rolf

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“