Schnittstelle Server – Client - GollmerSt/SolvisSmartHomeServer GitHub Wiki

Die Kommunikation zwischen Server und Client basiert auf JSON.

Stand: 26.05.2021, Format-Version: 03.00

Strukturen und Abläufe der Server-Client-Schnittstelle

Die Schnittstelle basiert aktuell auf folgende Strukturen, welche im JSON-Format übertragen werden:

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

Ablauf Verbindungsaufbau

  1. Client -> Server: CONNECT mit Namen der Solvis-Anlage
  2. Server -> Client: CONNECTED mit Client-ID
  3. Server -> Client: CHANNEL_DESCRIPTIONS
  4. Server -> Client: MEASUREMENTS
  5. 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:

Ablauf des Wiederaufbaus einer unterbrochenen Verbindung

  1. Client -> Server: RECONNECT mit Client-ID
  2. Server -> Client: MEASUREMENTS
  3. 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.

JSON-Elemente

Die Schnittstelle zwischen Server und Client basiert auf JSON.

Frame

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:

CONNECT

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.

CONNECTED

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:

RECONNECT

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).

DISCONNECT

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.

CONNECTION_STATE

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.

DESCRIPTIONS

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

SOLVIS_STATE

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": "&lt;state&gt;", "Message": "&lt;message&gt;" }

<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.

MEASUREMENTS

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",
	}
}

SET

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"}}

GET

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.

Aktuell definierte Kanalnamen

(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

Anmerkung:

Die Kanäle C*.* werden aus dem GUI der SolvisControl2 ermittelt.

SERVER_COMMAND

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.

SELECT_SCREEN

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.

⚠️ **GitHub.com Fallback** ⚠️