Startseite » OpenHAB: Photovoltaik mit Solakon, APsystems und vielen anderen Wechselrichtern mit API

OpenHAB: Photovoltaik mit Solakon, APsystems und vielen anderen Wechselrichtern mit API

Du bist auf dieser Seite gelandet, weil du dich für eine der folgenden Fragen interessierst:

  • Wie integriere ich meine Photovoltaikanlage in openHAB?
  • Wie lese ich Daten meines Solaranlage-Wechselrichters in openHAB aus?
  • Welche Wechselrichter sind kompatibel mit openHAB?
  • Wie kann ich Solakon, APsystems oder andere PV-Wechselrichter in openHAB einbinden?
  • Wie nutze ich APIs von Wechselrichtern zur Energieüberwachung in openHAB?
  • Wie verbinde ich meine PV-Anlage mit meinem Smart Home?
  • Wie kann ich Solarertrag, Verbrauch und Einspeisung in openHAB anzeigen?
  • Was brauche ich, um PV-Daten per HTTP in openHAB zu integrieren?

Das macht wenig Aufwand und geht so:

In meinem Fall habe ich ein Balkonkraftwerk von Solakon gekauft. Die App gibt nicht viele Optionen her. Der Wechselrichter ist aber von APsystems. Wie viele andere Wechselrichter auch, stellt dieser eine eigene API zur Verfügung.

1. API des Wechselrichters aktivieren

Bei dieser Marke ist das ganz gut in der API-Dokumentation erklärt.

  • App von APsystems verwenden, statt die von Solakon
  • Mit Bluetooth am Tag (der Wechselrichter ist ohne PV-Strom nicht erreichbar) verbinden
  • Wechselrichter in WLAN aufnehmen und in den Offline-Modus setzen

2. Wechselrichter als Thing in OpenHAB hinzufügen

Dafür habe ich wieder eine textuelle Thing-Definition für dich vorbereitet. Diese erfordert für konkret diese API das HTTP-Binding

Thing http:url:pv "Photovoltaik Wechselrichter" [ baseURL="http://192.168.X.X:8050", refresh=30, bufferSize=16, timeout=5000, ignoreSSLErrors=true ]{
	Channels:
		Type string : deviceId	[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*deviceId.*)∩JSONPATH:$.deviceId", mode="READONLY" ]
		Type number : p1 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*p1.*SUCCESS.*)∩JSONPATH:$.data.p1", unit="W", mode="READONLY" ]			//Power-Channel1. Unit W.
		Type number : e1 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*e1.*SUCCESS.*)∩JSONPATH:$.data.e1", unit="kWh", mode="READONLY" ]		//Energy generation after startup - Channel1. Unit kWh.
		Type number : te1 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*te1.*SUCCESS.*)∩JSONPATH:$.data.te1", unit="kWh", mode="READONLY" ]		//Energy generation lifetime Channel1. Unit kWh.
		Type number : p2 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*p2.*SUCCESS.*)∩JSONPATH:$.data.p2", unit="W", mode="READONLY" ]			//Power-Channel2. Unit W.
		Type number : e2 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*e2.*SUCCESS.*)∩JSONPATH:$.data.e2", unit="kWh", mode="READONLY" ]		//Energy generation after startup - Channel2. Unit kWh.
		Type number : te2 		[ stateExtension="/getOutputData", stateTransformation="REGEX:(.*data.*te2.*SUCCESS.*)∩JSONPATH:$.data.te2", unit="kWh", mode="READONLY" ]		//Energy generation lifetime Channel2. Unit kWh.
		
		Type number : maxPower	[ stateExtension="/getMaxPower", stateTransformation="REGEX:(.*data.*maxPower.*SUCCESS.*)∩JSONPATH:$.data.maxPower", commandExtension="/setMaxPower?p=%2$s", unit="W" ]	//The Max Power of the device .Unit W.
		
		Type contact : offGrid			[ stateExtension="/getAlarm", stateTransformation="REGEX:(.*data.*og.*SUCCESS.*)∩JSONPATH:$.data.og", openValue="1", closedValue="0", mode="READONLY" ]
		Type contact : outputFault		[ stateExtension="/getAlarm", stateTransformation="REGEX:(.*data.*oe.*SUCCESS.*)∩JSONPATH:$.data.oe", openValue="1", closedValue="0", mode="READONLY" ]
		Type contact : DC1shortCircuit	[ stateExtension="/getAlarm", stateTransformation="REGEX:(.*data.*isce1.*SUCCESS.*)∩JSONPATH:$.data.isce1", openValue="1", closedValue="0", mode="READONLY" ]
		Type contact : DC2shortCircuit	[ stateExtension="/getAlarm", stateTransformation="REGEX:(.*data.*isce2.*SUCCESS.*)∩JSONPATH:$.data.isce2", openValue="1", closedValue="0", mode="READONLY" ]
		
		Type switch : status	[ stateExtension="/getOnOff", stateTransformation="REGEX:(.*data.*status.*SUCCESS.*)∩JSONPATH:$.data.status", commandExtension="/setOnOff?status=%2$s", onValue="0", offValue="1" ]
}

Passe die IP für dich an. Das klappt natürlich auch mit dem Namen der PV-Anlage. Du kannst auch darüber nachdenken, eine feste IP in deinem Netzwerk dafür zu vergeben.

3. Items in OpenHAB hinzufügen

Ich verwende nicht alle Kanäle. Folgende Items sind aber ausreichend, wenn du Fehler überwachen willst, die Anlage drosseln willst oder den Energie-Output messen und loggen willst.

Group					igPV				"PV"								(sgEnvironment)
Switch					PV_Status			"Status" 							(igPV)															{ channel="http:url:pv:status" }
Number:Power			PV_Watt_1			"Zelle 1 SW [%.0f W]" 	<energy>	(fgPersist,igPV,fgStopDetection)["Measurement","Power"]			{ channel="http:url:pv:p1" }
Number:Power			PV_Watt_2			"Zelle 2 SE [%.0f W]"	<energy>	(fgPersist,igPV)["Measurement","Power"]							{ channel="http:url:pv:p2" }
Contact					PV_offGrid			"Fehler Inverter"					(igPV)															{ channel="http:url:pv:offGrid" }
Contact					PV_outputFault		"Fehler AC"							(igPV)															{ channel="http:url:pv:outputFault" }
Contact					PV_DC1shortCircuit	"Kurzschluss 1"						(igPV)															{ channel="http:url:pv:DC1shortCircuit" }
Contact					PV_DC2shortCircuit	"Kurzschluss 2"						(igPV)															{ channel="http:url:pv:DC2shortCircuit" }
Number:Power			PV_maxPower			"Maximaler Output [%.0f W]"			(igPV)															{ channel="http:url:pv:maxPower", stateDescription=" "[ min=0, max=800, step=10 ] }

Ich verwende dabei wieder mein strukturiertes Namensschema für semantische Gruppen.

  • sgEnvironment steht dabei für die semantic group, die die Umwelt um das Haus beschreibt. Alle Items, die dazu gehören (Wetter, Sensorik draußen) gehören da rein
  • igPV steht für die item group der PV-Anlage. Also die Gruppe, zu der alle Sensoren der Anlage gehören
  • fgPersist ist die function group, die in Persistence-Richtlinien mit besonders häufigem Logging definiert ist
  • fgStopDetection ist die function group, die regelmäßig auf Änderungen geprüft wird. Mein System schlägt Alarm, wenn ein Gerät zu lange keine Updates mehr gesendet hat
  • [„Measurement“,“Power“] sind die Tags, die von OpenHAB entsprechend dem semantischen System empfohlen sind. Auch mit diesen Tags kann ich in Rules gut arbeiten

Das wars auch schon =)

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

Translate »