UDP Steuerungsprotokoll / Control protocol

andy
Administrator
Beiträge: 487
Registriert: Dienstag 15. Januar 2008, 11:51
Wohnort: Düsseldorf
Kontaktdaten:

UDP Steuerungsprotokoll / Control protocol

Beitrag von andy » Montag 5. Oktober 2009, 16:43

UDP Steuerungsprotokoll:

Es sind zwei UDP Kanäle nötig / Two UDP channels are required:

Port 75 zum Senden. Port 77 zum Empfangen (listen) / Port 75 for sending. Port 77 for receiving (listen).
Die Portnummern sind konfigurierbar. UDP Kommunikation muss erlaubt sein (Einstellung/LAN) / The port numbers are configurable. UDP communication must be allowed (Settings / LAN).

Abfragen aller Leisten im Netzwerk / Queries of all devices in the network:
Senden: Broadcast (IP = 255.255.255.255) - „wer da?“ - String.

Antwort /Answer: Port 77 UDP
NET-PwrCtrl:(Name):(I.P):(M.A.S.K):(G.a.t.e.w.a.y):(M.A.C):
(Name der Steckdose Nr. 1 , Schaltzustand {1=on;0=off}):(Name der Steckdose Nr. 2 , Schaltzustand {1=on;0=off}):
(Name der Steckdose Nr. 3 , Schaltzustand {1=on;0=off}):(Name der Steckdose Nr. 4 , Schaltzustand {1=on;0=off}):
(Name der Steckdose Nr. 5 , Schaltzustand {1=on;0=off}):(Name der Steckdose Nr. 6 , Schaltzustand {1=on;0=off}):
(Name der Steckdose Nr. 7 , Schaltzustand {1=on;0=off}):(Name der Steckdose Nr. 8 , Schaltzustand {1=on;0=off}):
Gesperrte_Steckdosen / Locked_sockets :
HTTP-Port:
(Name des IO Nr. 1, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 2, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 3, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 4, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 5, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 6, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 7, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
(Name des IO Nr. 8, Richtung {1=Eingang;0=Ausgang}, Schaltzustand {1=on;0=off}):
Temperatur:
Firmware_Version:
ab FW 6.0
{
Typ {H = HOME; P = PRO,Power; a = ADV; i = IO; h(3) = HUT(3)}:
Power Messung {p = mit Power-Messung / n = ohne}:
}
ab FW 6.1
{

Sensor {s:Temperature:Humidity:Brightness}
:xor (signalisiert XOR verschlüsseltes User+Passwort)
}
(0x0D)(0x0A)

Beispiel / example:
NET-PwrCtrl:NET-CONTROL :192.168.178.148:255.255.255.0:192.168.178.1:0.4.163.10.9.107:Nr. 1,1:Nr. 2,1:Nr. 3,1:Nr. 4,0:Nr. 5,0:Nr. 6,0:Nr. 7,1:Nr. 8,1:0:80:IO-1,0,0:IO-2,0,0:IO-3,0,0:IO-4,0,0:IO-5,0,0:IO-6,0,0:IO-7,0,0:IO-8,0,0:27.7°C:NET-PWRCTRL_06.1:h:p:225.9:0.0004:50.056:0.04:0.00:0.0:1.0000:s:20.61:40.7:7.0:xor

bei Geräten mit Power Messung:
Senden: „pow“ - String.
Antwort:
NET-PwrCtrl:(Name):(I.P):VoltageRMS:CurrentRMS:LineFrequency:ActivePower:ApparentPower:ReactivePower:PowerFactor(0x0D)(0x0A)

Beispiel / example:
NET-PwrCtrl:NET-CONTROL-ONE:192.168.188.75:226.2:0.0004:50.044:0.03:0.00:0.05:1.0000

--------------------------------------------------------------------------------------------------------------------------------

ab FW 6.0 kann User+Passwort (als ganzes) in BASE64 kodiert werden.

ab FW 6.1 kann User+Passwort (als ganzes) in XOR+BASE64 verschlüsselt werden.

c# Beispiel / example:

Code: Alles auswählen

	string user_password = user + password;
	string encr_user_password = EncryptOrDecrypt(user_password, password) + '\0';
	.
	.
        string EncryptOrDecrypt(string text, string key)
        {
            var result = new StringBuilder();

            //XOR
            for (int c = 0; c < text.Length; c++)
                result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length]));

            //Base64
            byte[] buffer = Encoding.ASCII.GetBytes(result.ToString());
            return Convert.ToBase64String(buffer);
        }


--------------------------------------------------------------------------------------------------------------------------------

Segment = Steckdosennummer As String;
Passwort = Passwort As String;
User = User As String

Schalten / Switch
“Sw_on" + Segment + User + Passwort //einschalten
“Sw_off” + Segment + User + Passwort //ausschalten

Beispiel / example: Sw_on1adminanel

alle Steckdosen schalten / Switch all sockets
“Sw” + Steckdosen + User + Passwort
Steckdosen = Zustand aller Steckdosen binär als char (unsigned 8 bit) Variable
LSB = Steckdose 1, MSB (Bit 8)= Steckdose 8 (PRO, POWER), Bit 2 = Steckdose 3 (HOME).
Soll nur 1 & 5 eingeschaltet werden=00010001 = 17 = 0x11 (HEX)

Beispiel / example: Swdadminanel
Ascii d=100 decimal = 1100100 binär = Dosen 8,7,3 eingeschaltet 6,5,2,1 ausgeschaltet.

Steckdose zeit-verzögert abschalten / Disconnect the socket with a time delay
“St_off” + Segment + Zeit/Time[Sek] + User + Passwort
Zeit/Time als 16 Bit (unsigned integer) in Sekunden = max. 65535 Sek.

ab FW 6.3
{

Steckdose Intervallschaltung (Blinken) / Socket interval switching (flashing)
“Sw_bl” + Segment + Einschaltzeit/On time[Millisekunden] + Ausschaltzeit/Off time[Millisekunden] + User + Passwort
Zeit/Time als 16 Bit (unsigned integer) in Millisekunden = max. 65.5 Sek.
Blinken ausschalten/Switch off flashing: “Sw_off” + (gleiches/same)Segment + User + Passwort
}


ab FW 6.1
{

IO Richung / IO direction (0=Ausgang; 1=Eingang)
“IO_dir” + IO-dir + User + Passwort
IO-dir = Richtung aller IO‘s binär als char (unsigned 8 bit) Variable
LSB = IO 1, MSB = IO 8, analog zu den Steckdosen
0=Ausgang; 1 = Eingang
Beim eingeschalteten 'IO Pullup Widerstand' und Umschaltung vom Eingang zum Ausgang werden die Eingänge auf '1' "gezogen".
When the 'IO pull-up resistor' is switched on and the input is switched from the input to the output, the inputs are pulled to '1' ".
}

IO schalten / Switch IO
“IO_on" + Segment + User + Passwort //einschalten
“IO_off” + Segment + User + Passwort //ausschalten

alle IO schalten / Switch all IO's
“IO” + IO + User + Passwort
IO = Zustand aller IO‘s binär als char (unsigned 8 bit) Variable
LSB = IO 1, MSB = IO 8, analog zu den Steckdosen

ab FW 6.3
{

IO Intervallschaltung (Blinken) / IO interval switching (flashing)
“IO_bl” + Segment + Einschaltzeit/On time[Millisekunden] + Ausschaltzeit/Off time[Millisekunden] + User + Passwort
Zeit/Time als 16 Bit (unsigned integer) in Millisekunden = max. 65.5 Sek.
Blinken ausschalten/Switch off flashing: “IO_off” + (gleiches/same)Segment + User + Passwort
}

Eingänge können nicht geschaltet werden. „wer da?“ - Frage auf die Adresse der Leiste liefert die Antwort um die Eingänge auswerten zu können.

Inputs can not be switched. wer da?" question on the address of the bar provides the answer to evaluate the inputs.

Reset
"Reset:"+ User + Passwort
Beispiel / example: Reset:adminanel

ab FW 7.0
{

Set NTP Time
"Time" + Timestamp in seconds (10 digits) + User + Passwort
Beispiel / example: Time1603900619adminanel
https://www.timestampconvert.com/
}

LG Andy

flashlighter
Beiträge: 4
Registriert: Samstag 13. November 2010, 16:31

Re: UDP Steuerungsprotokoll

Beitrag von flashlighter » Samstag 13. November 2010, 16:34

Hi andy,

im Changelog der version 3.2 steht, dass die UDP Kommunikation erweitert wurde.

wäre es möglich, mal eine komplette Referenz zu bekommen, was denn jetzt über UDP alles möglich ist mit der aktuellen Version?

Vielen Dank schonmal im vorraus

grüße,
Michi

andy
Administrator
Beiträge: 487
Registriert: Dienstag 15. Januar 2008, 11:51
Wohnort: Düsseldorf
Kontaktdaten:

Re: UDP Steuerungsprotokoll

Beitrag von andy » Freitag 19. November 2010, 13:09

Hi Michi,

Alles oben.

LG Andy

flashlighter
Beiträge: 4
Registriert: Samstag 13. November 2010, 16:31

Re: UDP Steuerungsprotokoll

Beitrag von flashlighter » Samstag 20. November 2010, 18:32

Hi Andy,

Okay, dann habe ich ein paar fragen bzw verbesserungswünsche:

Features, die ich mir wünschen würde für das UDP Protokoll:

- Zeitverzögertes Anschalten der Steckdosen
- Zeitverzögertes An/Ausschalten ALLER Steckdosen
- Ändern der Namen der Steckdosen
- Abfragen des Timers der Steckdose (und ob der timer gesetzt ist)


Probleme, die unserem Team während der Investigation aufgefallen sind:

- Die Response von der Steckdose beinhaltet ja eine "Datenstruktur", in der die einzelnen Elemente mit ":" getrennt sind. wenn man die Inhalte extrahieren möchte, muss man nach ":" splitten. Wenn jetzt im namen der Steckdose ein ":" vorkommt, wird das Protokoll ausgehebelt. könnte das Zeichen ":" nicht auf eine art blacklist gesetzt werden?

- In die einzelnen Queries "nicht-string" Elemente einzubauen, hat sich als etwas Tricky erwiesen, das erschwert die generierung der queries in Java... könntet ihr das Protokoll nicht auf string-only umstellen und vielleicht auch mit ":" als trennzeichen arbeiten?

Die Beschreibung des Prookolls ist auch etwas knapp... eine Spezifikation, die mit der Steckdose mitgeliefert wird, wäre echt klasse :)

Ansonsten ist die Steckdosenleiste echt super und tut ihren Dienst!

Viele Grüße,
Michi

Ted1405
Beiträge: 3
Registriert: Montag 4. Juli 2011, 08:51

Re: UDP Steuerungsprotokoll

Beitrag von Ted1405 » Montag 4. Juli 2011, 09:00

[quote7ac]alle Steckdosen schalten
-------------------------
“Sw” + Steckdosen + User + Passwort
-------------------------
Steckdosen = Zustand aller Steckdosen binär
LSB = Steckdose 1
MSB = Steckdose 8 (PRO, POWER)
Bit 2 = Steckdose 3 (HOME)[/quote7ac]

Die Aussage "Zustand aller Steckdosen binär" ist etwas irreführend.
Hier sind nicht etwa "0"en und "1"en entsprechend der Anzahl an Steckdosen aneinander zu fügen, sondern es ist kurzerhand der dezimale (oder hexadezimale Wert!? - ich habe "nur" eine Home-Version) zu übertragen.

Sprich:
[color=#4000FF7ac]Sw0BenutzerPasswort[/color7ac] => alle Steckdosen aus
[color=#4000FF7ac]Sw1BenutzerPasswort[/color7ac] => erste Steckdose an, zweite und dritte aus
[color=#4000FF7ac]Sw2BenutzerPasswort[/color7ac] => erste Steckdose aus, zweite an, dritte aus
[color=#4000FF7ac]Sw3BenutzerPasswort[/color7ac] => erste Steckdose an, zweite an, dritte aus
[color=#4000FF7ac]Sw4BenutzerPasswort[/color7ac] => erste Steckdose aus, zweite aus, dritte an
... u.s.w. ...

andy
Administrator
Beiträge: 487
Registriert: Dienstag 15. Januar 2008, 11:51
Wohnort: Düsseldorf
Kontaktdaten:

Re: UDP Steuerungsprotokoll

Beitrag von andy » Montag 4. Juli 2011, 11:00

Nein.

LSB = Steckdose 1
MSB = Steckdose 8 (PRO, POWER)
Bit 2 = Steckdose 3 (HOME)

00000111-Bit 0 - Steckdose 1
-------|| - Bit 1 - Steckdose 2
-------| - Bit 2 - Steckdose 3


LG Andy

Ted1405
Beiträge: 3
Registriert: Montag 4. Juli 2011, 08:51

Re: UDP Steuerungsprotokoll

Beitrag von Ted1405 » Montag 4. Juli 2011, 11:26

Hallo Andy.
andy hat geschrieben:Nein.[/quotehs0]
Nein was?

Gerade nochmals getestet:

Gewünschter Status aus 8 Bits (also BINÄR) aneinander gefügt:
[ihs0]==> Sw[color=#00FF00hs0]00000111[/colorhs0]UserPass
<== NET-PwrCtrl:NETPWRCTRL-GLP1:NoPass:Err

==> Sw[color=#00FF00hs0]00000000[/colorhs0]UserPass
<== NET-PwrCtrl:NETPWRCTRL-GLP1:NoPass:Err[/ihs0]

Gewünschter Status aus 4 Bits aneinander gefügt:
[ihs0]==> Sw[color=#00FF00hs0]0000[/colorhs0]UserPass
<== NET-PwrCtrl:NETPWRCTRL-GLP1:NoPass:Err[/ihs0]

Gewünschter Status aus 3 Bits (weil Home hat ja nur 3 Steckdosen) aneinander gefügt:
[ihs0]==> Sw[color=#00FF00hs0]000[/colorhs0]UserPass
<== NET-PwrCtrl:NETPWRCTRL-GLP1:NoPass:Err[/ihs0]


ABER ... als Dezimalwert (welcher dann vom NetPwr in seine Bits zerlegt wird):

==> Sw[color=#00FF00hs0]7[/colorhs0]UserPass
<== NET-PwrCtrl:[...]:Nr. 1,1:Nr. 2,1:Nr. 3,1:Nr. 4,0:Nr. 5,1:Nr. 6,1:Nr. 7,0:Nr. 8,0:248:80
(wie erwartet, alle drei Steckdosen an!)

==> Sw[color=#00FF00hs0]0[/colorhs0]UserPass
<== NET-PwrCtrl:[...]:Nr. 1,0:Nr. 2,0:Nr. 3,0:Nr. 4,0:Nr. 5,1:Nr. 6,1:Nr. 7,0:Nr. 8,0:248:80
(wie erwartet, alle drei Steckdosen aus)

und last, but not least:
==> Sw[color=#00FF00hs0]1[/colorhs0]UserPass
NET-PwrCtrl:NETPWRCTRL-<== NET-PwrCtrl:[...]:Nr. 1,1:Nr. 2,0:Nr. 3,0:Nr. 4,0:Nr. 5,1:Nr. 6,1:Nr. 7,0:Nr. 8,0:248:80
(ebenfalls wie erwartet - erste Steckdose an, rest aus.)


Somit ist die Aussage "Zustand aller Steckdosen binär" definitiv irreführend, denn der Zustand wird nicht als Binärzahl übergeben (also [uhs0]nicht[/uhs0] 00000000), sondern muss als [color=#008000hs0]Dezimalzahl[/colorhs0] übergeben werden, in welcher die gewünschten Bits gesetzt sind.

andy
Administrator
Beiträge: 487
Registriert: Dienstag 15. Januar 2008, 11:51
Wohnort: Düsseldorf
Kontaktdaten:

Re: UDP Steuerungsprotokoll

Beitrag von andy » Donnerstag 7. Juli 2011, 04:21

Ted1405,

Bitte erstmal nachschlagen was eine binäre Zahl ist.

[color=#FF0000fod]Bei der Home Version (da nur 3 letzen Bits) kann man dezimal benutzen.
[bfod]Bei den großen Leisten unbedingt binär.[/bfod][/colorfod]

Ted1405, bitte keine Verwirrung stiften.

LG Andy

Ted1405
Beiträge: 3
Registriert: Montag 4. Juli 2011, 08:51

Re: UDP Steuerungsprotokoll

Beitrag von Ted1405 » Donnerstag 7. Juli 2011, 06:04

Wikipedia - Dualsystem (Weiterleitung von „Binärzahl“)
[url1nm]http://de.wikipedia.org/wiki/Dualsystem[/url1nm]

Siehe Abschnitt "Verschiedene Darstellungsformen der (binär-)Zahl dreiundzwanzig im Dualsystem".

Ich möchte sicherlich keine Verwirrung stiften, sondern eigentlich genau selbige vermeiden.
Ohne das nun böse zu meinen: Die Aussage "Bitte erstmal nachschlagen was eine binäre Zahl ist." ist nun wenig hilfreich, "Bei der Home Version (da nur 3 letzen Bits) kann man dezimal benutzen" schon eher. Aber ums vollends und für alle verständlich auszudrücken, wäre vielleicht ein einfaches Beispieltelegramm im Klartext (so wie meine Beispiele oben) hilfreich und könnte auch mir verständlich machen, an welcher Stelle wir uns gerade missverstehen.

Lieben Gruß,
Ted

jessehouwing
Beiträge: 1
Registriert: Montag 2. Januar 2012, 22:54

Re: UDP Steuerungsprotokoll

Beitrag von jessehouwing » Montag 2. Januar 2012, 22:58

I'm having problems with the St_off command to switch the socket on or off after a timeout.

I've tried the following command:

Steckdose zeitverzögert abschalten
-------------------------
“St_off” + Segment + Zeit[Sek] + User + Passwort
-------------------------
Zeit als 16 Bit Integer in Sek = max. 65535 Sek.

with

St_off12adminanel\r\n

but nothing is happening.

It would be great if the documentation would show actual sample strings, instead of multiple-interpretable format strings.

Antworten