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");
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
!------------------------------
Bei mir heisst es CallBackExec11_SUSV
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");
Sieher Verweis auf CUXD Handbuch Kapitel 5.8.2 System.Exec (16 Kanäle)
gruss, Black