SUSV Auswertung über Callback Funktion

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

SUSV Auswertung über Callback Funktion

Beitrag von Black » 13.09.2018, 20:21

irgendie schein es ein Update des Daemons gegeben haben. wobei dieser mit einer erhöhten Laufzeit daherkommt.
Unabhängig davon konnte ich das auf dem Pi3 mit der Raspberrymatik und dem Tinkerboard mit IOBroker beobachten, beide ausgestattet mit je einer SUSV.

Bei IObroker in Javascript ist nicht sooo kritisch, weil da eh in callbacks programmiert wird.
Auf der raspimatik würde die Ausfürung in der alten Version so lange das Script und damit die weitere Ausführung blockieren.

Die alte Version führe ein System Exec aus und wertete das StdOut aus.. Tats lange sauber, aber mittlerweie die Response Time des Daemon...

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018
!- ALTE VERSION SYSTEM EXEC

string sout;
string serr;
!- Bash Kommandozeile zusammensetzen
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
!-WriteLine (q);
system.Exec(q, &sout, &serr);
WriteLine (sout);
string s= sout.StrValueByIndex (";",0);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.Source").State (s);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltIn").State (sout.StrValueByIndex (";",1).ToFloat () );
real r= sout.StrValueByIndex (";",2).ToFloat ();
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CapBatterie").State (r);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltBatterie").State (sout.StrValueByIndex (";",3).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CurrBatterie").State (sout.StrValueByIndex (";",4).ToFloat () );
real usv=100.0; !- Einstellen Netzbetrieb
if (s=="Battery") {usv=r;}
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.System").State (usv);
WriteLine ("DONE");
ein & würde es in der neuen Rega auch nicht bringen, ich brauche ja den Rückgabewert.

Also:

es wird benötigt:
CUxd Exec Gerät.
Ich habe bei mir Kanal 11 für die SUSV reserviert. (drum heissen auch alle Kanäle :11)

Das Zyklisch aufzurufende Programm schaut nun so aus:

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

!- Kapazität der USV auslesen (CallBack version benötigt noch programm CallBackExec11_SUSV)
!- Michael Thelen September 2018
!- Bash Kommandozeile zusammensetzen
!-
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
!-WriteLine (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_SETS").State (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_QUERY_RET").State (1);
dom.GetObject("CUxD.CUX2801001:11.CMD_RUNS").State(1);
!- Die Auswertung des Rückgabewertes erfolgt dann im Programm
!- CallBack_SUSV
!------------------------------
Dann muss ein neues programm in der Klickibunti geschrieben werden.
Bei mir heisst es CallBackExec11_SUSV
CallBackExec11_SUSV.jpg
Das Script dazu sieht dann so aus:

Code: Alles auswählen

!- Auswertung des CallBack Rückgabewertes der SUSV
!- und schreiben der Werte in Systemvariablen

string sout=dom.GetObject ("CUxD.CUX2801001:11.CMD_RETS").State();
!-WriteLine (sout);
string s= sout.StrValueByIndex (";",0);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.Source").State (s);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltIn").State (sout.StrValueByIndex (";",1).ToFloat () );
real r= sout.StrValueByIndex (";",2).ToFloat ();
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CapBatterie").State (r);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltBatterie").State (sout.StrValueByIndex (";",3).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CurrBatterie").State (sout.StrValueByIndex (";",4).ToFloat () );
real usv=100.0; !- Einstellen Netzbetrieb
if (s=="Battery") {usv=r;}
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.System").State (usv);
WriteLine ("DONE");
Und damit ist ein grossteil der blokadezeit weg.

Sieher Verweis auf CUXD Handbuch Kapitel 5.8.2 System.Exec (16 Kanäle)

gruss, Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

Re: SUSV Auswertung über Callback Funktion

Beitrag von Black » 09.10.2018, 10:22

Da ich bezüglich der S.USV auch in Kontakt mit dem Support und Softwareteam von Olmatic stehe, wird es wohl in den nächsten Updates 2 von mir gewünschte Erweiterungen geben, die dann auch hier in das Programm als auch in die Javascript Version von IOBroker einfliessen werden.

Der Daemon soll dann:
1. über einen Parameter verfühen, um einen JSCON String auszugeben und nicht mehr die Seite mit den zig #
2. über einen Parameter verfügen, um die zuletzt beim letzten I²C Zuklus eingelesenen Werte als JSON auszugeben und nicht nichmal einen neunen I²C Lesezyklus anzustossen (Laufzeit)


Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Depechem
Beiträge: 56
Registriert: 21.10.2018, 07:33

Re: SUSV Auswertung über Callback Funktion

Beitrag von Depechem » 09.11.2018, 20:55

Black hat geschrieben:
13.09.2018, 20:21
Das Zyklisch aufzurufende Programm schaut nun so aus:

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

!- Kapazität der USV auslesen (CallBack version benötigt noch programm CallBackExec11_SUSV)
!- Michael Thelen September 2018
!- Bash Kommandozeile zusammensetzen
!-
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
!-WriteLine (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_SETS").State (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_QUERY_RET").State (1);
dom.GetObject("CUxD.CUX2801001:11.CMD_RUNS").State(1);
!- Die Auswertung des Rückgabewertes erfolgt dann im Programm
!- CallBack_SUSV
!------------------------------
Hallo Black, ich versuche die S_USV Auswertung gerade nachzubauen.
Ich habe alles so erstellt wie in deim Post.
Nur da ich CCU3 Anfänger bin weis ich jetzt nur nicht wie ich das "Zyklisch aufzurufende Programm" erstelle bzw. wo ich den Code einstellen muss.

CUxd Exec Gerät habe ich angelegt und das Programm CallBackExec11_SUSV mit Skript auch.

Und wo finde ich dann die Ausgewerteten Daten der USV?

Danke für deine Hilfe Gruß Thomas

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

Re: SUSV Auswertung über Callback Funktion

Beitrag von Black » 09.11.2018, 21:16

du brauchst 2 programme

das zyklische programmscript musst du noch in ein separates Programm packen, was beispielsweise alle 5 minuten getriggert wird. (zeitmodul oder cuxd trigger je nach belieben).

Das Zyklissche Programm stösst dann den das auslesen als bashprog an.

wenn dieses fertig ist, twird über cuxd exec das zweite programm getriggert, was die werte dann ausliest und in die systemvariablen schreibt,

die systemvariablen musst du natürlich vorher noch anlegen, das hab ich damals hier: viewtopic.php?f=65&t=39482&start=160#p414077 beschrieben
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Depechem
Beiträge: 56
Registriert: 21.10.2018, 07:33

Re: SUSV Auswertung über Callback Funktion

Beitrag von Depechem » 09.11.2018, 21:23

Ohje, ok Danke,

Wäre es möglich bitte noch ein Screenshot aus der CCU von dem zyklischen Programm zu machen? Wie ich das erstelle und alle 5min trigger ist mir noch klar, aber wo dort deine Programmdaten reinkopiert werden müssen ist mir ein Rätsel :(


Die Systemvariablen habe ich angelegt, nur wo wird folgender Code bei den Systemvariablen hinterlegt? :oops:
Oder ist das in deinem Link ein alter Code und ich habe insgesamt nur 2 Codes zu hinterlegen?

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

string sout;
string serr;
!- Bash Kommandozeile zusammensetzen
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
!-WriteLine (q);
system.Exec(q, &sout, &serr);
!-WriteLine (sout);
string s= sout.StrValueByIndex (";",0);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.Source").State (s);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.System").State (s!="Battery");
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltIn").State (sout.StrValueByIndex (";",1).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CapBatterie").State (sout.StrValueByIndex (";",2).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltBatterie").State (sout.StrValueByIndex (";",3).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CurrBatterie").State (sout.StrValueByIndex (";",4).ToFloat () );

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

Re: SUSV Auswertung über Callback Funktion

Beitrag von Black » 09.11.2018, 22:11

das von dir programm zitierte programm ist die alte version, die system exec benutzte und auf das ergebnis wartete.


ich hab das programm hier, das bei mir minütlich läuft:
P1.jpg
das dort aufgerufene Script !- Kapazität der USV auslesen ist dann das hier:

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

string sout;
string serr;
!- Bash Kommandozeile zusammensetzen
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
!-WriteLine (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_SETS").State (q);
dom.GetObject ("CUxD.CUX2801001:11.CMD_QUERY_RET").State (1);
dom.GetObject("CUxD.CUX2801001:11.CMD_RUNS").State(1);
!- Die Auswertung des Rückgabewertes erfolgt dann im Programm
!- CallBack_SUSV
!------------------------------
black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Depechem
Beiträge: 56
Registriert: 21.10.2018, 07:33

Re: SUSV Auswertung über Callback Funktion

Beitrag von Depechem » 10.11.2018, 05:26

Hallo Black, Danke für die ausführlichen Antworten.
Eigentlich denke ich alles so gemacht zu haben.
Leider wird in den Systemvariablen aber nix ausgegeben.

Im Anhang findes du nochmal alle meine Screeshots. Vieleicht hast du noch eine Idee an was es liegen kann.
Im Systemprotokoll (Bild 8) bringt er auch Fehler.

Auf einem Bild sieht man auch FW und SW Version der S.USV
Folgende Bauteile
- Raspberry Pi3b+
- RPI-RF-MOD
- S.USV mit vollem 3000mA Akku
- aktuelles Raspberrymatic
- Netzteil vom Bausatz Charly 2.5A (direkt am RPI-RF-MOD verbunden

Vielen Dank im voraus
Gruß Thomas
Dateianhänge
8.JPG
7.JPG
6.JPG
5.JPG
4.JPG
3.JPG
2.JPG
1.JPG

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

Re: SUSV Auswertung über Callback Funktion

Beitrag von Black » 11.11.2018, 20:07

Führe mal das Script unter Script testen aus:

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

string sout;
string serr;
!- Bash Kommandozeile zusammensetzen
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
WriteLine (q);
!dom.GetObject ("CUxD.CUX2801001:11.CMD_SETS").State (q);
!dom.GetObject ("CUxD.CUX2801001:11.CMD_QUERY_RET").State (1);
!dom.GetObject("CUxD.CUX2801001:11.CMD_RUNS").State(1);
!- Die Auswertung des Rückgabewertes erfolgt dann im Programm
!- CallBack_SUSV
!------------------------------
das sollte die einen string ausgeben. diesen string mit ctrl-c in zwischenablage

dann gehste mal unter putty auf die ccu und machst rechte maustaste, sollte dir den string in die konsole kopieren und enter.

und das ergebnis schreibste mal hier.

(das soll das auslesescript ausführen und den rückgabewer tin die konsole schreiben, dann wissen wir, kommen von der S.USV keine daten oder werden die irgendwie nicht ausgewertet)

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Depechem
Beiträge: 56
Registriert: 21.10.2018, 07:33

Re: SUSV Auswertung über Callback Funktion

Beitrag von Depechem » 11.11.2018, 20:20

Black hat geschrieben:
11.11.2018, 20:07
Führe mal das Script unter Script testen aus:

Code: Alles auswählen

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

!- Kapazität der USV auslesen
!- Michael Thelen Januar 2018

string sout;
string serr;
!- Bash Kommandozeile zusammensetzen
  string q= 's=$(/opt/susvd/susv -status|tr -s "*" " ");';
  q= q# 'b=${s#*Source: };list=${b%% *};';
  q= q# 'b=${b#*age in: };list=$list";"${b%% *};';
  q= q# 'b=${b#*capacity: };list=$list";"${b%%%*};';
  q= q# 'b=${b#*voltage: };list=$list";"${b%%V*};';
  q= q# 'b=${b#*Battery: };list=$list";"${b%% *};';
  q= q# 'echo $list';
WriteLine (q);
!dom.GetObject ("CUxD.CUX2801001:11.CMD_SETS").State (q);
!dom.GetObject ("CUxD.CUX2801001:11.CMD_QUERY_RET").State (1);
!dom.GetObject("CUxD.CUX2801001:11.CMD_RUNS").State(1);
!- Die Auswertung des Rückgabewertes erfolgt dann im Programm
!- CallBack_SUSV
!------------------------------
das sollte die einen string ausgeben. diesen string mit ctrl-c in zwischenablage

dann gehste mal unter putty auf die ccu und machst rechte maustaste, sollte dir den string in die konsole kopieren und enter.

und das ergebnis schreibste mal hier.

(das soll das auslesescript ausführen und den rückgabewer tin die konsole schreiben, dann wissen wir, kommen von der S.USV keine daten oder werden die irgendwie nicht ausgewertet)

Black

root@192.168.2.199's
# s=$(/opt/susvd/susv -status|tr -s "*" " ");b=${s#*Source: };list=${b%% *};b=${
b#*age in: };list=$list";"${b%% *};b=${b#*capacity: };list=$list";"${b%%%*};b=${
b#*voltage: };list=$list";"${b%%V*};b=${b#*Battery: };list=$list";"${b%% *};echo
$list

Primary;5.10;100.00;4.20;000.00


Das meinst

Benutzeravatar
Black
Beiträge: 925
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Kontaktdaten:

Re: SUSV Auswertung über Callback Funktion

Beitrag von Black » 11.11.2018, 21:22

genau das meinte ich.

das sagst uns schon mal aus,

du bist im netzbetrieb (primary)
akku ist voll (100.00)
eingangsspannung ist 5.1 V

also bis dahin gut

so,nun nächster Test, ausführen unter Script Testen

Code: Alles auswählen

!- Auswertung des CallBack Rückgabewertes der SUSV
!- und schreiben der Werte in Systemvariablen

!string sout=dom.GetObject ("CUxD.CUX2801001:11.CMD_RETS").State();
string sout= 'Primary;5.10;100.00;4.20;000.00';
WriteLine (sout);
string s= sout.StrValueByIndex (";",0);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.Source").State (s);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltIn").State (sout.StrValueByIndex (";",1).ToFloat () );
real r= sout.StrValueByIndex (";",2).ToFloat ();
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CapBatterie").State (r);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.VoltBatterie").State (sout.StrValueByIndex (";",3).ToFloat () );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.CurrBatterie").State (sout.StrValueByIndex (";",4).ToFloat () );
real usv=100.0; !- Einstellen Netzbetrieb
if (s=="Battery") {usv=r;}
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("USV.System").State (usv);
WriteLine ("DONE");
kriegst du eine Fehlermeldung oder stehen nun die werte in den Systemvariablen ?

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 2.35.16.20180826 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.2
SDV 3.05 Scripteditor und Objektinspektor

Antworten

Zurück zu „RaspberryMatic“