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