Victron Energy BMV-702

Hallo Solarfreunde,

um den Akku meiner Solaranlage im Blick zu haben, habe ich mich für den Victron Energy BMV-702 entschieden.
Zusammen mit dem USB-Adapter läßt sich der BMV relativ einfach an den PC anbinden und mit Hilfe der Software auch anzeigen.

Nun soll das ganze aber auch an IPS angebunden werden. Dazu habe ich einen seriellen Port angelegt.
SeriellPort.JPG

Der Serial Port gibt seine Daten an einen Cutter weiter.
Und hier nun beginnt mein Problem, wie geht es jetzt weiter? Woher weiß ich, was das Linke und Rechte Trennzeichen sind?
So sieht das Debug des seriellen Ports aus:

Ich bin echt ein bissel ratlos. Vielleicht kann mir jemand auf die Sprünge helfen.

Hallo Solarfreunde,

ein klein wenig, bin ich schon weiter gekommen. Der BMV sendet folgende Daten:

Checksum	"
PID	0x204
V	50028
T	---
I	-771
P	-39
CE	-2951
SOC	998
TTG	14400
Alarm	OFF
Relay	OFF
AR	0
BMV	702
FW	0308
Checksum	~
H1	-20136
H2	-2951
H3	0
H4	0
H5	0
H6	-76223
H7	6
H8	59787
H9	14520
H10	0
H11	0
H12	0
H15	3
H16	7
H17	383
H18	716

Wie kann ich denn aus dem HEX-Code einen Ascii-Code machen, damit ich den weiter verarbeiten kann :banghead::confused:

ASCII Codes sind Hex Werte :slight_smile:
Hast du den Haken unten links im Debug Fenster gesehen?
Du kannst dir Darstellung (Hex, Klartext) in der Console umschalten.
Michael

Hallo Michael,

doch den Haken unten links kannte ich. Mir war nur nicht klar das ich mit den Daten so weiter arbeiten kann.

Dennoch komme ich nicht weiter.
So sieht der Auszug nun im Debug aus, jetzt eben lesbar.

Wie muss denn der Cutter aussehen?
Linkes Trennzeichen ist „Checksum“, was ist denn dann das rechte Trennzeichen? :confused:

Hättest du anstatt einen Screenshot, den Inhalt hier hochgeladen, wäre es etwas einfacher.
Die Trennzeichen sind ganz normale Steuerzeichen.
Steuerzeichen – Wikipedia

Am einfachsten ist es wohl den Cutter ob im Dropdown auf R: CRLF einzustellen.
Dann bekommst du jede Zeile einzeln in deine RegisterVariable.
In dem dort hinterlegten Script, kommt das hier:


$Data = explode(chr(0x09),$_IPS['VALUE']);

// $Data[0] => Ist der Index, z.B. Alarm oder H1 , H2 etc
// $Data[1] => Ist der Wert

Michael

:eek: Sorry, hier bitte schön.

TXT: 19.12.2017 05:49:05.00 |             RECEIVED | <CR><LF>H16<HT>7<CR><LF>H17<HT>543<CR><LF>H18<HT>978<CR><LF>Che
TXT: 19.12.2017 05:49:05.00 |             RECEIVED | cksum<HT>*
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | <CR><LF>PID<HT>0x204<CR>
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | <LF>V<HT>49243<CR><LF>T<HT>---<CR><LF>I<HT>-2767<CR><LF>P<HT>-
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | 136<CR><LF>CE<HT>-21783<CR><LF>SOC<HT>986<CR><LF>TT
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | G<HT>14400<CR><LF>Alarm<HT>OFF<CR><LF>Relay<HT>OFF<CR><LF>
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | AR<HT>0<CR><LF>BMV<HT>702<CR><LF>FW<HT>0308<CR><LF>Checks
TXT: 19.12.2017 05:49:06.00 |             RECEIVED | um<HT>á
TXT: 19.12.2017 05:49:07.00 |             RECEIVED | <CR><LF>H1<HT>-21784<CR><LF>H2<HT>-21784<CR><LF>H3
TXT: 19.12.2017 05:49:07.00 |             RECEIVED | <HT>0<CR><LF>H4<HT>0<CR><LF>H5<HT>0<CR><LF>H6<HT>-108154<CR><LF>H7
TXT: 19.12.2017 05:49:07.00 |             RECEIVED | <HT>6<CR><LF>H8<HT>59787<CR><LF>H9<HT>50873<CR><LF>H10
TXT: 19.12.2017 05:49:07.00 |             RECEIVED | <HT>0<CR><LF>H11<HT>0<CR><LF>H12<HT>0<CR><LF>H15<HT>3<CR><LF>H16<HT>7<CR>
TXT: 19.12.2017 05:49:07.00 |             RECEIVED | <LF>H17<HT>543<CR><LF>H18<HT>978<CR><LF>Checksum<HT>§

Lösung steht schon über deinem Letzten Post :wink:
Michael

So ich habe es hinbekommen… Danke nochmal Michael. :wink:


<?
   $Data = explode(chr(0x09),$_IPS['VALUE']);
	// $Data[0] => Ist der Index, z.B. Alarm oder H1 , H2 etc
	// $Data[1] => Ist der Wert
	echo $Data[0];
	echo $Data[1];
	
   if(substr($Data[0],0,1) == 'V') {
   	SetValue(44829 /*[Software\PV\BMV 700 Daten\Batterie Spannung]*/,(floatval($Data[1])/1000));
		}
   if(substr($Data[0],0,1) == 'I') {
   	SetValue(10277 /*[Software\PV\BMV 700 Daten\Batterie Strom]*/,(floatval($Data[1])/1000));
		}
   if(substr($Data[0],0,3) == 'SOC') {
   	SetValue(23564 /*[Software\PV\BMV 700 Daten\Batterie Status]*/,(floatval($Data[1])/10));
		}
?>

Eine Frage bleibt aber noch.
Es kommen im Sekundentakt Werte, wenn ich das Script laufen habe, dann braucht IPS all meine Systemleistung. Ich kann dann auf dem Rechner eigentlich nichts mehr machen, selbst das Webfront ist gähnend langsam.
Kann man irgendwie begrenzen, das Werte nur aller 10 Sekunden aufgezeichnet werden? :confused:

Wie?
Kommen die Werte eventuell sogar noch schneller rein?
Das kannst du sonst sehen, wenn du in der RegVar als übergeordnete Instanz Mal keine/None wählst.
Rauschen die Daten im IO dann noch schneller rein?

Alternativ auch einmal die Expertenansicht PHP-Threads öffnen.

Eigentlich ist das jetzt ein nicht so rechenintensives Script, dass es alles lahmlegen sollte.
Worauf läuft IPS ?

Verzögerung kannst du es selbst nicht, nur etwas ‚Tricksen‘.
Z.B. über ein Script den IO öffnen und nach X Sekunden wieder schließen.
Das Script dann über ein ScriptTimer alle Minute starten.
Michael

Ich habs mal ausprobiert.

Also die Werte kommen im Sekundentakt. Und der Cutter ist das Problem.
Sobald ich diesen „Einschalte“ geht die Auslastung hoch. Nur mit dem IO ist alles super. Auch das zuschalten des Scriptes bringt keine steigerung der Auslastung.

Hallo Solarfreunde,

ich habe in der letzten Zeit hier noch etwas rumprobiert.
Ergebnis ist das selbe.

Die Daten kommen im Sekundentakt oder sogar noch schneller rein.
Im IO ist das kein Problem.
Sobald der Cutter arbeiten muss, dann geht IPS auf 35% Systemleistung. Und legt damit meinen Rechner lahm. :mad:

Jetzt wollte ich mal das von Michael angesproche probieren:

Ich finde nur den Befehl nicht, mit dem ich den IO öffnen und schließen kann.
Kann mir da jemand nochmals auf die Sprünge helfen.

Danke!

IPS_SetProperty — IP-Symcon :: Automatisierungssoftware
Michael

Danke!!:rolleyes:
Da hatte ich Tomaten auf den Augen.
Dort hatte ich auch schon X-Mal reingeschaut. :banghead:

Hi Thomas,

kannst Du mir bitte etwas unter die Arme greifen ich hänge fest. Ich bekomme die Daten einfach nicht lesbar dargestellt.
Ich habe allerdings keinen Speicher sondern einen Victron Smart Solar regler der per USB angeschlossen ist.
Ich habe Dir bis zum Cutter folgen können. Aber dann bin ich raus :frowning:

Vielen Dank :slight_smile:

Hi Franky,

dann zeig mal, was aus dem Cutter kommt.
Du musst ja eigentlich nur noch die Daten in Variablen schreiben.

Ho Thomas kann ich leider erst Montag machen. Bin dieses Wochenende unterwegs.
Wünsche Dir ein schönes Wochenende

Hi Thomas,

ich denke nicht da ich die Daten nicht lesen kann. Soweit ich das beurteilen kann kommt da Hex an…
Habe mal in 2 Dateien mit unterschoedlichem Leseformat geschrieben. Siehe Anhang.
Vielen Dank für Deine Hilfe.

dump (2).txt (30.8 KB)

Hier die 2. Datei…

dump1.txt (30.8 KB)