Ansteuerung Blauberg-Lüfter mittels UDP-HEX Paketen (Probleme mit Prüfsumme usw)

Hallo Zusammen,

im Rahmen eine Wärmedämmung habe ich 6 (2x3) dezentrale Lüfter mit Wärmerückgewinnung installiert. Diese sind von der Firma Blauberg und vom Typ Vento Expert A50-1 W V.2.
In einem anderen Beitrag habe ich gesehen, dass jemand ebenfalls Hex zu seinem Lüfter schickt, aber es scheint mir eher ein V.1 Lüfter gewesen zu sein, der hat ein völlig anderes Protokoll, ohne Prüfsumme usw.

Hier ist die Protokollbeschreibung: https://blaubergventilatoren.de/uploads/download/smart_home_vento_expert_w_v2cw201910172.pdf

Ich finde grundsätzlich, dass das Protokoll ziemlich durcheinander ist und ziemlich Umfangreich - also gemessen an der Funktion der Lüfter. Wie auch immer…

Ich habe mehrere Probleme:

1. Prüfsumme:

Die Prüfsumme wir aus der Addition aller Hex-Bytes (mit Ausnahme der ersten beiden) gebildet.
Daraus ergibt sich eine 2-Byte Prüfsumme, die das vorletzte und letzte Byte darstellen.

Ich weiß leider nicht, wie ich das in IPS anständig berechnen kann.
a) Ist die Schreibweise für HEX-Code in den String richtig?
Zum Beispiel
$IDWZ = "\x00\x27\x00\x43\x58\x42\x57\x0A"; (Das ist die ID eines Lüfters)
Wenn ich das mit USCK_SendText abschicke wird das als HEX verschickt.

b) Ich weiß nicht wie ich das überhaupt mit einem Hex-String wie zum Beispiel
"$IDWZ = \x00\x27\x00\x43\x58\x42\x57\x0A";
irgendwas berechnen könnte. Also wenn ich z.B. aus dem Ding eine Prüfsumme durch Addition der Bytes errechnen will. (Es kommt mehr dazu an Bytes und die Byte-Läge ist je nach Befehl auch variabel)

2. Senden & Empfangen:
Wenn ich mich an generelle Kommunikation mit Sockets richtig erinnere, dann kann ich die HEX-Antwort die im Debug ankommt erst einmal nicht weiter verwursten, aber es sollte - wenn das Gerät antwortet was drinstehen, oder? (Ich nehme an mein HEX-String ist immer noch Müll, daher kommt nix zurück)
Zum verarbeiten brauche ich eine Regvar, oder?

3. Ausgabe, zur Kontrolle:
Ich habe jetzt einmal das hier gebastelt:

<?php
$IDWZ = "\x00\x27\x00\x43\x58\x42\x57\x0A";
$a = "\xFD\xFD\x02\x10";
$b= $a .$IDWZ;
echo ($b);
USCK_SendText(11739, $b);

Bei echo kommen nur unleserliche Zeichen raus, d.h. die Ausgabe erfolgt nicht in HEX, wahrscheinlich eher dekodiert. Ist zwar nicht essentiell, aber wie könnte ich das ändern?
Das ist aber die am wenigsten wichtige Frage :wink:

Gruß,
Maeffjus

Es ist kein Hex String.
Sonder nur ein String welcher halt nicht lesbare Zeichen enthält.
Bei PHP ist ein Zeichen bei einen String immer genau ein Byte.
Und wenn das in hexadezimaler Schreibweise halt x00 ist, dann ist das Byte im String vom Wert 0.
Die Ausgabe der Rohdaten des String bekommst du deswegen auch nicht mit Echo o.ä. angezeigt. Da ist die Debug Ansicht der RegVar besser geeignet.
Ein String kann auch wie ein Array behandelt werden. Also $a[3] wäre das Byte mit wert x10.
Mit ord($[3]) kannst du das Byte direkt in eine Zahl (hier 16) wandeln.
Hilft dir das erstmal?
Das Protokoll habe ich mir noch nicht angeschaut.
Michael

Hi Michael,

nicht so richtig :wink:

Die Prüfsumme muss aus HEX bestehen - also Ich muss alles an Hex-bytes addieren und dann an den gesamten String anhängen.

zb.: 00 27 00 43 58 42 57 0A muss dann mit fiktiver Prüfsumme 1A 2B zu:
00 27 00 43 58 42 57 0A 1A 2B werden.

Die Prüfsumme würde korrekt berechnet als 00 + 27 + 00 + 43 + 58 + 42 + 57 + 0A = was auch immer.

Also im Endeffekt muss ich einen Gesamtbefehl „aufbauen“ der besteht aus einem Header der immer gleich ist (Header, ID, Password) und dann einem Datenblock mit Funktionsbefehl und Wert (meist je ein Byte) und dann noch die Prüfsumme.

D.h. ich muss das irgendwie aus einzelnen Teilen stricken, was ja geht indem ich wie oben die Teile aneinander stecke. Aber kann man auch aus dem $a[3] was dann \x10 lautet auch direkt die Prüfsumme berechnen (also mit allen zusammen) oder muss ich dann das „\x“ irgendwie wegfrickeln?

Gruß,
Matthias

\x10 ist nur eine Information, dass nun die folgenden Zeichen tatsächlich einen Hex Codierter Byte darstellen. Sprich du definierst mit der Eingabe von vier Zeichen [verbraucht vier Byte bei der Eingabe] nach der Berechnung, sprich im Programmzustand nur noch ein byte.

\x10 = HEX 10 = Dezimal 16 = Binär 00010000

Wenn du jetzt also sagst, gib mir den Inhalt des Strings an Position y wieder $string[$y] und gib mir die „Ordnungszahl“ (ord) zurück, erhälst du Dezimal 16 (das zeigt der Bildschirm → echo dann auch an).

Es ist sogar ein relativ nettes Beispiel in der Dokumentation, wie die Prüfsumme berechnet wird.

//********* Anfang der Prüfsumme und Beginn des Pakets ***********//
uint8_t check_protocol(uint8_t *data, uint16_t size){    
	uint16_t i, chksum1 = 0, chksum2 = 0;
	if((data[0] == 0xFD) && (data[1] == 0xFD))    {
	        for(i = 2; i <= size–3; i++)            
			chksum1 += data[i];        
			chksum2 = (uint16_t)(data[size–1] << 8) | (uint16_t)(data[size–2]);        

		if(chksum1 == chksum2)            
			return 1;        
		else            
			return 0;     
	}    
	else        
		return 0;
}

@tobiasr: Habe ich auch gesehen.
Ich probiere gerade seit 2h rum, wie ich das irgendwie zu einer Prüfsumme verwursten kann.
Ehrlich gesagt bin ich - was Programmieren angeht zu schlecht dazu :frowning:

Dazu die Frage (also zum Problem meiner miesen Programmierkunst) dazu: Gibt es auf irgendwie eine Möglichkeit die Hex-Daten einfach mit Leerzeichen zu trennen? Also „FD FD 01 02 03…etc“?
Gruß,
Matthias

Ich verstehe nicht, was du dir aus dem simplen Trennen mit Leerzeichen erhoffst? Damit kann der Computer garnicht umgehen. Der arbeitet intern nicht mit Buchstaben wie FD, sondern mit dem Gegenstück 253 bzw. Binär 11111101.

Naja - es ist halt einfach schneller eingetippt und vor allem übersichtlicher als \xFD\x01 usw.
Aber daran sehe ich nicht das Problem, ich bekomme die Daten garnicht gut genug aufbereitet um die zur Prüfsumme zusammenzurechnen UND dann auch an den Lüfter zu senden.

Hast du es mal geschafft, z.B. den Beispielcode aus der Doku über IP-Symcon an das Gerät zu senden und es passiert das Gewünschte?

1 „Gefällt mir“

Das Problem ist, der Code umfasst die Id - daher ist der Beispielcode wirklich nur ein Beispiel.
Dazu kommt - Passwort = 1111, ich frage mich, soll das dann 01 01 01 01 sein oder 11 11? Meine Vermutung wäre tatsächlich 1111 zu Hex, geteilt auf zwei Bytes - aber ich weiß es auch nicht.
Alles was ich an die Lüfter sende bewirkt genau nix.

Und hier ist dann das „Problem“ mit \xFD" vs FD FD usw. - es ist halt unglaublich aufwändig das zu lesen, kontrollieren und zu ändern mit der \x"-Schreibweise.

hi,

ich denke deine Lüfter sind kompatible mit Lüfter SIKU RV 30 DW Pro Duo WiFi V2.

Gruß Jan Peter

@janpeterdietz vielen Dank!!!
Ich sage mal - auch stellvertretend für @tobiasr Whaaaaaaahaaaaa - Tobias hat sich gestern ~2h Zeit genommen mit mir meine Lüfter anzusprechen.
Ich konnte dann gestern Abend gerade mal die Geschwindigkeit einstellen.
Aber naja - wenigstens habe ich was von Tobis lernen können!
Gruß,
Matthias

Es freut mich, dass es hier zu einer zufriedenstellenden Lösung gekommen ist.

1 „Gefällt mir“

na dann viel Spass, das klingt super

1 „Gefällt mir“

@janpeterdietz
Ist das Skript zum Lesen oder Schreiben?
Ich bekomme alles ausgelesen, aber irgendwie nichts gelesen bzw. gesendet. (Also z.B. Lüfterstufe ändern)
Gruß,
Matthias

hi,
das Skript ist zum Lesen und Schreiben.
Ein paar Fragen:
Hast du die Register Variable angelegt und verbunden?-
(Sollte stimmen da du Lesen kannst)
Kannst du im Debug des UDPs Ports die Sende und Empfangsprotokolle sehen?

EDIT: Es geht - übers Webinterface!
Wie mache ich das denn über die Variable selbst? (Also falls die von einem Script geändert wird)

So gar nicht, so funktioniert es auch bei allen anderen Variablen in IPS nicht.
Du musst die Aktion der Variable auslösen mit RequestAction($varid,$wert);
Michael

Das kriege ich hin! :wink:
Danke!

Hi Michael,
das war irgendwie nix.
Webfront geht, aber das nicht:

<?php
$co2 = GetValueFloat(25555);
var_dump ($co2);
$stufe= GetValueInteger(28950);
If (($co2 <=600)&&($stufe !=0)) {
    RequestAction(28950,0);
    echo 0;
} 

If (($co2 >600) && ($co2 <=1200) && ($stufe !=1)){
    RequestAction(28950,1);
    echo 1;
} 

If (($co2 >=1200) && ($co2 <=1500) &&($stufe !=2)){
    RequestAction(28950,2);
    echo 2;
} 

If (($co2 >1500)&&($stufe !=3)){
    RequestAction(28950,3);
    echo 3;
} 

Es passiert garnichts, egal welchen Wert die Variable hat. (Allerdings kommt das Echo natürlich)

Habe ich etwas nicht verstanden?
Als ID muss ja die der Variablen rein, oder?

Gruß,
Matthias

Es liegt an dem Script zu Ansteuerung von @janpeterdietz .
Dort wird nur SENDER auf Webfront unterstütz und RequestAction benutzt aber Action als SENDER.
Ebenso werden Kommandos der Sprachassistenten nicht funktionieren, die haben VoiceControl als SENDER.
https://www.symcon.de/service/dokumentation/konzepte/automationen/php-skripte/systemvariablen/#Action
Michael

1 „Gefällt mir“