Schnittstelle Server – Client - GollmerSt/SolvisSmartHomeServer GitHub Wiki
Die Kommunikation zwischen Server und Client basiert auf JSON.
Stand: 26.05.2021, Format-Version: 03.00
Strukturname | Bedeutung | Richtung |
---|---|---|
CONNECT | Verbindungsaufbau | Client -> Server |
RECONNECT | Wiederaufbau der Verbindung | Client -> Server |
CONNECTED | Quittierung des Wiederaufbaus der Verbindung | Server -> Client |
DISCONNECT | Verbindungsabbau (aktuell nicht verwendet) | Client -> Server |
CONNECTION_STATE | Status der Verbindung (ALIVE etc.) | Server -> Client |
SOLVIS_STATE | Status der Solvis-Anlage (PowerOff etc. | Server -> Client |
CHANNEL_DESCRIPTIONS | Meta-Daten der Kanäle/Server Commands | Server -> Client |
MEASUREMENTS | Paket mit den Messwerten | Server -> Client |
SET | Ändert einen Anlagenparameter | Client -> Server |
GET | Stößt das Auslesen eines Anlagenparameters an | Client -> Server |
SERVER_COMMAND | Befehl für den Server (z.B. Backup der Messdaten) | Client -> Server |
SELECT_SCREEN | Befehl zur Definition eines Default-Screens | Client -> Server |
- Client -> Server: CONNECT mit Namen der Solvis-Anlage
- Server -> Client: CONNECTED mit Client-ID
- Server -> Client: CHANNEL_DESCRIPTIONS
- Server -> Client: MEASUREMENTS
- Server -> Client: SOLVIS_STATE
Anschließend treffen beim Client dann neue Datenpakete ein, wenn sich die entsprechenden Messwerte geändert haben (MEASUREMENTS ) oder der Status der Solvis-Anlage geändert hat (SOLVIS_STATE).
Der Client kann SET- und GET-Befehle senden. Ist der Name der Solvis-Anlage unbekannt, liefert der Server ein CONNECTION_STATE-Paket mit dem ConnectionStatus „CONNECTION_NOT_POSSIBLE“.
Nach einer Unterbrechung der Verbindung kann der Client die Verbindung wiederaufbauen oder einen ganz neue Verbindung initiieren. Letzteres entspricht dem obigen Ablauf, bei dem Client-spezifische Server-Einstellungen verloren gehen. Es empfiehlt sich daher die Verbindung wie folgt wieder herzustellen:
- Client -> Server: RECONNECT mit Client-ID
- Server -> Client: MEASUREMENTS
- Server -> Client: SOLVIS_STATE
Ist der Wiederaufbau nicht erfolgreich (z.B. Client-ID unbekannt), wird ein CONNECTION_STATE-Paket vom Server zum Client gesendet mit den ConnectionStatus „CLIENT_UNKNOWN“.
War der Wieraufbau der Verbindung erfolgreich, werden wieder GET/SET/MEASUREMENTS/SOLVIS_STATE-Pakete ausgetauscht.
Die Schnittstelle zwischen Server und Client basiert auf JSON.
Da das JSON-Format hierarchisch aufgebaut ist und nicht jedes SmartHome-System den JSON-Parser mittels eines Streams versorgen kann, so dass der Parser selber das Ende der JSON-Daten erkennt, werden die JSON-Daten in einem Frame versendet.
Dieser Frame sie wie folgt aus:
- 3 Byte mit der Länge des JSON-Files liegt wie in Netzwerken üblich im Big-Endian-Reihenfolge vor (MSB zuerst, LSB zuletzt).
- JSON-Datensatz UTF-8 kodiert.
Folgende JSON-Datensätze sind definiert:
Der Connect-Datensatz wird vom Client versendet und initiiert den Verbindungsaufbau. Er ist wie folgt aufgebaut:
{"CONNECT":
{"Id":"Name der Anlage"}
}
Der Name der Anlage ist die Id der Unit, welche im base.xml-File definiert ist.
Mit dem CONNECTED-Datensatz teilt der Server dem Client den Erfolg der Verbindung mit (Server existiert und Unit-Id ist im base.xml eingetragen). Er ist wie folgt aufgebaut:
{"CONNECTED":{"ClientId":427735588,"ServerVersion":"01.02.01","FormatVersion":"01.02" }}
Die Client-Id dient der künftigen Identifikation des Clients, falls die Übertragung zwischen Server und Client unterbrochen und wieder neu aufgebaut wird. Neben der Client-Id werden die aktuelle ServerVersion sowie die FormatVersion der JSON-Übertragung mitgeliefert. Wenn das JSON-Übertragungsformat in künftigen Versionen nicht mehr kompatibel ist, wird letztere angepasst. Damit erkennt der Client dass er zu den empfangenen JSON-Paketen nicht mehr kompatibel ist.
Nach dem der Client CONNECTED empfangen hat, ist der Server für Befehle (GET, SET, SERVER-Commands) des Clients empfangsbereit. Im Falle einer Verbindungs-Unterbrechung versucht der Client mittels RECONNECT diese wieder aufzubauen:
Ist die Verbindung unterbrochen worden, kann der Client die Verbindung zum Server durch senden des RECONNECT-Datensatzes wieder aufbauen. Er ist wie folgt aufgebaut:
{"RECONNECT":{"Id":Client-Id}}
Die Client-Id ist eine 32-Bit-Integer-Zahl (vorzeichenbehaftet), welche der Server im Datenpaket CONNECTED geliefert hatte. Eine Unterscheidung zwischen CONNECT und RECONNECT ist notwendig, da der Client bestimmte Einstellungen im Server durchführen kann (z.B. SCREEN_RESTORE_INHIBIT). Diese Einstellungen sind Client-bezogen, bei einem CONNECT würden diese verloren gehen. Ist die Verbindung zu lange unterbrochen, werden diese Client-abhängige Einstellungen zurück gesetzt und der Client erhält bei einem Verbindungsversuch über RECONNECT eine Abweisung. Er muss sich dann mittels CONNECT erneut verbinden, die vorherigen Einstellungen sind dann zurück gesetzt. Der Timeout ist im control.xml-File definiert und ist aktuell auf 5 Minuten gesetzt (connectionHoldTime_ms).
Der Client kann die Verbindung durch senden des DISCONNECT-Pakets abbrechen. Es ist wie folgt aufgebaut:
{"DISCONNECT": null }
Mit dieser Anweisung wird die Verbindung zwischen Server und Client endgültig getrennt. Die Client-spezifischen Einstellungen sowie die Client-Id auf der Server-Seite werden gelöscht.
Dieses Paket sendet der Server an den Client. Es ist wie folgt aufgebaut:
{"CONNECTION_STATE": {"State": "<state>", "Message": "<message>" }
<state> kann folgende Werte annehmen:
Wert | Bedeutung |
---|---|
CLIENT_UNKNOW | Reconnect mit unbekannterClient-Id wurde versucht. |
CONNECTION_NOT_POSSIBLE | Verbindung zur Solvis-Anlage nicht möglich. |
COMMAND_ERROR | Vom Client wurde ein unbekannter Befehl gesendet. |
ALIVE | Zur Alive-Überwachung, sendet der Server, wenn er 2 min lang keine Daten gesendet hat. |
USER_ACCESS_DETECTED | Eine Anwender-Bedienung der Solvis-Anlage erkannt, nur bis Version 01.02.10, Format 1.xx. |
SERVICE_ACCESS_DETECTED | Eine Wartungs-Bedienung der Solvis-Anlage erkannt, nur bis Version 01.02.10, Format 1.xx. |
CONTROL_WRITE_ONGOING | Es befindet sich noch mindestens ein Schreib-Kommando (Veränderung eines Anlagenparameters) in der Gui-Ausführungs-Queue. |
CONTROL_READ_ONGOING | Es befindet sich noch mindestens ein Lese-Kommando (Auslesen eines Anlagenparameters) in der Gui-Ausführungs-Queue. |
CONTROL_FINISHED | Die Gui-Ausführungs-Queue ist leer, sämliche Commandos wurden ausgeführt. |
HUMAN_ACCESS_FINISHED | Manuelle Bedienung der Solvis-Anlage beendet, nur bis Version 01.02.10, Format 1.xx. |
Die Status USER_ACCESS_DETECTED, SERVICE_ACCESS_DETECTED und HUMAN_ACCESS_FINISHED sind ab Version 01.02.11 (ab Format-Version 2.00) im SOLVIS_STATE zu finden. CONNECTION_STATE soll nur etwas über die Verbindung zwischen Server und Client etwas aussagen. Daher war einen Bereinigung notwendig.
<message> ist optional und liefert zusätzliche Information für den Log.
Nach dem Aufbau der Verbindung über CONNECT liefert der Server das Descriptions-Paket. Es enthält die Meta-Daten der Kanäle und der möglichen Server-Commands. Dieses Paket besitzt folgenden Aufbau:
{"DESCRIPTIONS": {
"Name 1": {
"Writeable": boolean,
"Type": "type",
"Unit": "unit",
"Accuracy": float,
"IsBoolean": boolean,
"Upper": float,
"Lower": float,
"Step": float,
"IncrementChange": float,
"ChangedIncrement": float,
"Modes": [
{"Name":"mode1", "Handling": "handling"},
{"Name":"mode2", "Handling": "handling"},
…
]
},
"Name 2":…………………………
}
}
DESCRIPTIONS enthält für jeden Kanal/Server-Command eine Eigenschaft, wobei der Schlüssel der Name des Kanals bzw. der Server-Befehl ist. Der Wert ist dann ein weiteres JSON-Objekt in dem die Eigenschaften des Kanals bzw. Server-Befehls beschrieben sind.
Es existieren folgende Schlüssel:
Schlüssel | Bedeutung |
---|---|
Writeable | true/false, gibt an, ob der Kanal beschreibbar ist |
Type | Typ |
Unit | Einheit des Messwertes |
Accuracy | Genauigkeit des Messwertes, als float |
IsBoolean | Wenn Kanal einen boolscher Wert darstellt |
Zur Beschreibung einer Wertemenge von Zahlen dienen folgende Schlüssel:
Schlüssel | Bedeutung |
---|---|
Upper | Höchster Wert |
Lower | Niedrigster Wert |
Step | Differenz zwischen den Einzelwerten |
IncrementChange | Wert, von dem an sich die Differenz der Einzelwerte ändert |
ChangedIncrement | Differenz zwischen den Einzelwerten ab dem Wert IncrementChange |
Bei einer Beschreibung eines Modes (z.B. WW-Pumpe, Anlagenmodus) gibt es dann noch folgenden Schlüssel:
Schlüssel | Bedeutung |
---|---|
Modes | Array mit den verschieden Mode-Objecten |
Ein Mode-Object besitz folgende Schlüssel:
Schlüssel | Bedeutung |
---|---|
Name | Name des Modes |
Handling | Kann die Werte RO, WO und RW annehmen und bestimmt, ob der Mode nur gelesen, nur geschrieben oder sowohl geschrieben als auch gelesen werden kann. |
Die meisten Schlüssel sind optional, nur die Schlüssel Writeable und Type müssen immer vorhanden sein. Nur wenn der Wert beschreibbar ist, existiert die Beschreibung der Wertemenge.
Folgende Typen sind aktuell definiert:
Typ | Bedeutung |
---|---|
MEASUREMENT | Messwerte werden über die XML-Schnittstelle ausgelesen |
CALCULATION | Werte sind berechnet (z.B. Brennerlaufzeit) |
CONTROL | Werte werden über das GUI bestimmt, meist veränderbar |
ServerCommand | Name ist ein Server-Befehl |
SelectScreen | Name ist ein Screen-Name der SolvisControl, der fest angewählt wird |
Dieses Paket sendet der Server an den Client und wird bei jeder Status-Änderung der Anlage versendet. Das Paket hat folgenden Aufbau:
{"SOLVIS_STATE": {"SolvisState": "<state>", "Message": "<message>" }
<state> kann folgende Werte annehmen:
Wert | Bedeutung |
---|---|
POWER_OFF | Die Anlage ist ausgeschaltet (länger als 5 Minuten keine Verbindung möglich) |
REMOTE_CONNECTED | Nur Verbindung zur Solvis-Remote aufgebaut |
SOLVIS_CONNECTED | Verbindung zur Anlage über die Solvis-Remote aufgebaut |
SOLVIS_DISCONNECTED | Keine Verbindung zur Solvis-Remote und Anlage |
USER_ACCESS_DETECTED | Eine Anwender-Bedienung der Solvis-Anlage erkannt, erst ab Version 01.02.11 |
SERVICE_ACCESS_DETECTED | Eine Wartungs-Bedienung der Solvis-Anlage erkannt, erst ab Version 01.02.11 |
HUMAN_ACCESS_FINISHED | Manuelle Bedienung der Solvis-Anlage beendet, erst ab Version 01.02.11 |
ERROR | Anlage befindet sich im Fehlerzustand (Fehlermeldung auf dem Bildschirm oder „A14.Entstoerung“ true) |
<message> liefert zusätzliche Information im Fehlerfall.
Die gemessenen Werte sendet der Server bei Veränderungen an den Client in Form des MEASUREMENTS-Pakets. Es besitzt folgenden Aufbau:
{"MEASUREMENTS": {
"Kanalname 1": boolean/float/"String",
"Kanalname 2": boolean/float/"String",
……………
"Kanalname n": boolean/float/"String",
}
}
Zum Verändern der Anlagenwerte (Type CONTROL) sendet der Client an den Server das SET-Package. Es hat folgenden Aufbau:
{"SET":{"Kanalname": boolean/float/"String"}}
CONTROL-Werte werden nicht periodisch abgefragt, da immer ein Eingriff auf das GUI der Solvis-Anlage notwendig ist. Um die neuen Werte ermitteln zu können, kann der GUI-Auslesevorgang mit dem GET-Paket veranlasst werden. Dazu sendet der Client an den Server dieses Paket. Es hat folgenden Aufbau:
{"GET":{"Kanalname":null}}
Der GET-Befehl aktualisiert sämtliche Kanäle, welche sich auf dem gleichen Bildschirm befinden, wie der Kanalname. So wird beim Leseen des Kanales C01.StartsBrenner auch die Werte der Kanäle C02.LaufzeitBrenner und C03.LaufzeitAnforderung2 aktualisiert.
Die Alternative zu GET ist der ServerCommand UPDATE_CHANNELS. Er aktualisiert mit einem Befehl genau die Kanäle, welche nur über das GUI zugänglich sind und welche sich ohne Anwenderzugriff geändert haben können.
Der GET-Befehl ist daher nur selten sinnvoll, z.B. dann wenn man im Zusammenhang mit dem ServerCommand SCREEN_RESTORE_INHIBIT genau einen Kanal in kurzen Abständen beobachten will. Denn in diesem Fall wechselt der Bildschirm nicht mehr und der GET-Command liefert schnell das Ergebnis, falls sich der Wert geändert hat (über das MEASUREMENTS-Paket). Im Anschluss darf man nicht vergessen SCREEN_RESTORE_ENABLE zu senden.
(Stand 25.02.2021)
Channel-Name | Read / Write | Bemerkungen |
---|---|---|
I1.Anlagentyp | r | |
I2.Systemnummer | r | |
S01.Warmwasserpuffer | r | |
S02.Warmwassertemperatur | r | |
S03.Speicherreferenztemperatur | r | |
S04.Heizungspuffertemperatur_oben | r | |
S05.Solarvorlauftemperatur | r | |
S06.Solarruecklauftemperatur | r | |
S07.Solardruck | r | |
S08.Solarkollektortemperatur | r | |
S09.Heizungspuffertemperatur_unten | r | |
S10.Aussentemperatur | r | |
S11.ZirkulationRuecklauftemperatur | r | |
S12.Vorlauftemperatur_HK1 | r | |
S13.Vorlauftemperatur_HK2 | r | |
S14 | r | |
S14.ErdwaermequelleVL | r | |
S14.Kesselfuehler | r | |
S15 | r | |
S15.ErdwaermequelleRL | r | |
S16 | r | |
S17.Durchfluss_Solarpanel | r | |
S18.Durchfluss_Warmwasserzirkulation | r | |
SE.Solarertrag_kWh | r | |
SL.Solarleistung_kW | r | |
AIn1 | r | |
AIn2 | r | |
AIn3 | r | |
AOut0 | r | |
AOut1 | r | |
AOut2 | r | |
AOut3 | r | |
AOut5 | r | |
RF1.Raumfuehler_HK1 | r | |
RF2.Raumfuehler_HK2 | r | |
RF3.Raumfuehler_HK3 | r | |
A01.Pumpe_Solar | r | |
A02.Pumpe_Warmwasser | r | |
A03.Pumpe_HK1 | r | |
A04.Pumpe_HK2 | r | |
A05.Pumpe_Warmwasserzirkulation | r | |
A06.Pumpe_HK3 | r | |
A07 | r | |
A07.Pumpe_Solar2 | r | |
A08.Mischer_HK1_auf | r | |
A09.Mischer.HK1_zu | r | |
A10.Mischer_HK2_auf | r | |
A11.Mischer.HK2_zu | r | |
A12.Brenner | r | |
A13.Brenner_S2 | r | |
A14.Entstoerung | r | |
X01.BrennerStarts | r | Wird mittels A12.Brenner und C01.StartsBrenner ermittelt |
X02.BrennerLaufzeit_s | r | Wird mittels A12.Brenner und C02.LaufzeitBrenner ermittelt |
X03.BrennerStufe2Starts | r | Wird mittels A13.Brenner_S2 ermittelt (zählt nach Erstinstallation von 0 an) |
X04.BrennerStufe2Laufzeit_s | r | Wird mittels A13.Brenner_S2 und C03.LaufzeitAnforderung2 ermittelt |
X05.BrennerStatus | r | off, Stufe1, Stufe2 |
X06.UhrzeitSolvis | r | |
X07.MischerPosition0_HK1 | r | true. Wenn Mischer auf 0-Stellung |
X08.MischerPosition0_HK2 | r | true. Wenn Mischer auf 0-Stellung |
X09.LaufzeitSolarpumpe_s | r | Wird mittels A01.Pumpe_Solar und C24.LaufzeitSolarpumpe ermittelt |
X10.LaufzeitSolarpumpe2_s | r | Wird mittels A07.Pumpe_Solar2 und C25.LaufzeitSolarpumpe2 ermittelt |
C01.StartsBrenner | r | |
C02.LaufzeitBrenner | r | |
C03.LaufzeitAnforderung2 | r | |
C04.WarmwasserPumpe | rw | |
C05.WassertemperaturSoll | rw | |
C06.Anlagenmodus_HK1 | rw | |
C07.Tagestemperatur_HK1 | rw | |
C08.Nachttemperatur_HK1 | rw | |
C09.TemperaturFeineinstellung_HK1 | rw | |
C10.Raumeinfluss_HK1 | rw | |
C11.Vorlauf_Soll_HK1 | r | |
C12.Anlagenmodus_HK2 | rw | |
C13.Tagestemperatur_HK2 | rw | |
C14.Nachttemperatur_HK2 | rw | |
C15.TemperaturFeineinstellung_HK2 | rw | |
C16.Raumeinfluss_HK2 | rw | |
C17.Vorlauf_Soll_HK2 | r | |
C18.Anlagenmodus_HK3 | rw | |
C19.Tagestemperatur_HK3 | rw | |
C20.Nachttemperatur_HK3 | rw | |
C21.TemperaturFeineinstellung_HK3 | rw | |
C22.Raumeinfluss_HK3 | rw | |
C23.Vorlauf_Soll_HK3 | rw | |
C24.LaufzeitSolarpumpe | r | |
C25.LaufzeitSolarpumpe2 | r | |
C26.Warmwasserzirkulation_Puls | rw | |
C27.Warmwasserzirkulation_Zeit | rw | |
C28.WW_Pumpe_Min_Laufzeit | rw | |
C29.BetriebsartVT_HK1 | rw | |
C30.Steilheit_HK1 | rw | |
C31.Fix_Vorlauf_Tag_HK1 | rw | |
C32.Fix_Vorlauf_Absenk_HK1 | rw | |
C33.Min_Vorlauf_Temp_HK1 | rw | |
C34.BetriebsartVT_HK2 | rw | |
C35.Steilheit_HK2 | rw | |
C36.Fix_Vorlauf_Tag_HK2 | rw | |
C37.Fix_Vorlauf_Absenk_HK2 | rw | |
C38.Min_Vorlauf_Temp_HK2 | rw |
Die Kanäle C*.* werden aus dem GUI der SolvisControl2 ermittelt.
Das Smarthome-System kann noch verschiedne Befehle an den Server senden. Sie haben Einfluss auf den weiteren Ablauf. Das vom Client zu sendende JSON-Paket besitzt folgenden Aufbau:
{"SERVER_COMMAND":{"Command": "String"}}
String ist der eigentliche Server-Befehl. Folgende sind aktuell definiert (Stand 17.05.2021):
Name | Bedeutung |
---|---|
BACKUP | Speichert die aktuell berechneten Werte in die Backup-Datei measurements.xml. |
RESTART | Startet den SolvisSmartHomeServer neu. |
TERMINATE | Beendet den SolvisSmartHomeServer (sollte normalerweise nicht verwendet werden). |
COMMAND_OPTIMIZATION_INHIBIT | Normalerweise wird die Reihenfolge der ausgeführten GUI-Befehle so optimiert, dass kein Bildschirm mehrfach angefahren wird. Diese Optimierung schaltet man mit diesem Befehl ab. |
COMMAND_OPTIMIZATION_ENABLE | Die obige Optimierung wird wieder aktiviert. |
GUI_COMMANDS_DISABLE | Mit diesem Befehl wird zeitweilig die GUI-Steuerung deaktiviert. Das ist z.B. dann notwendig, wenn der Service an der Anlage arbeitet. Andernfalls kann er durch die GUI-Betätigungen des Servers irritiert werden. |
GUI_COMMANDS_ENABLE | Der Server kann wieder auf das GUI der SolvisControl zugreifen. |
SCREEN_RESTORE_INHIBIT | Nach jedem GUI-Zugriff des Servers wird normalerweise auf den ursprünglich vom User selektierte Bildschirm zurück gegangen. Dieses Verhalten kann mit diesem Befehl verhindert werden. |
SCREEN_RESTORE_ENABLE | Gegenstück zu SCREEN_RESTORE_INHIBIT |
SERVICE_RESET | Wurde ein Service-Zugriff erkannt (z.B. Schornsteinfeger), führt der Server 2h keinen GUI-Befehle mehr aus. Mit diesem Befehl kann dieses Verhalten vorzeitig aufgehoben werden. |
SERVICE_TRIGGER | Ein Service-Zugriff wird getriggert (simuliert), ohne dass die Service-Seiten manuell aufgesucht werden müssen. |
UPDATE_CHANNELS | Sämtliche Channels können mit diesem Befehl aktualisiert werden, welche nur über das GUI gelesen werden können wie z.B. Laufzeiten Brenner, Solarpumpe, Vorlauftemperatur Soll. |
Normalerweise wird vor Ausführung eines Gui-Befehls der aktuell auf der SolvisControl 2 dargestellte Bildschirm bestimmt und gemerkt. Nach Ausführung des Gui-Befehls wird zu diesem dann wieder zurückgegangen. Will man dieses Verhalten nicht haben, kann man es entweder mit dem Server-Command SCREEN_RESTORE_INHIBIT deaktivieren oder man bestimmt einen bestimmten Bildschirm, welcher entweder nach einem Gui-Befehl oder nach einem Anwenderzugriff angefahren werden soll. Letztres erfolgt durch den Befehl SELECT_SCREEN. Das vom Client zu sendende JSON-Paket besitzt folgenden Aufbau:
{"SELECT_SCREEN":{"Screen": "String"}}
String ist der dann Bildschirm im Ruhezustand immer angefahren wird.
Wird als String der Wert NONE gesendet, wird dieses Verhalten wieder deaktiviert.