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

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“

Ich habe verstanden was Du meinst, danke für den Tip!
Ein if (( $_IPS['SENDER'] == "WebFront" ) or ( $_IPS['SENDER'] == "Action" )) hat geholfen.

Hi,

ich würde dann die folgenden Zeilen einfügen:
if ( $_IPS[‚SENDER‘] == „Action“ )

{

set_paramter( $Instanz_Lüfter, $id_luefter, $id_UDP_Socket, $_IPS['VARIABLE'],  $_IPS['VALUE']);

return;

}

// deine Lösung ist natürlich auch gut…

1 „Gefällt mir“