Ankündigung
Einklappen
Keine Ankündigung bisher.
"SMA Binding " für OpenHAB
Einklappen
X
-
Hallo,
super Beitrag, ich habe noch openhab 1.7 auf Raspberry mit KNX-Binding am laufen, besteht die Möglichkeit das die SMA-Modbus-Anbindung mit dem Modbus-Bindung von openhab 1.7 funktioniert ? Mein Wechselrichter ist ein SMA STP5.0-3AV-40 .
Falls nicht würde openhab 2 auf einem raspberry pi 1b laufen ?
Mfg
Kommentar
-
Zitat von Juergen151 Beitrag anzeigenHallo,
super Beitrag, ich habe noch openhab 1.7 auf Raspberry mit KNX-Binding am laufen, besteht die Möglichkeit das die SMA-Modbus-Anbindung mit dem Modbus-Bindung von openhab 1.7 funktioniert ? Mein Wechselrichter ist ein SMA STP5.0-3AV-40 .
Falls nicht würde openhab 2 auf einem raspberry pi 1b laufen ?
Mfg
Das ist ja basierend auf dem 1.x er openHAB...
Gruß André
eibalinchen
Kommentar
-
Hi Andre, Udo,
Danke für die Hinweise, ich habe nach deiner Anleitung installiert, momentan klappt die Installation des Bindings nicht :
sudo apt-get install openhab-addon-binding-org.openhab.binding.modbus-1.7.0.jar
kommt die Meldung, Mittels regulärem Ausdruck konnte kein Paket gefunden werden, das Bindung ist im Verzeichnis Addon abgelegt, in welchem Verzeichnis sollte die stehen ? (Also ich arbeite mittels Putty und WinSCP)
Gruß Jürgen
Kommentar
-
So werden unter OH1 keine Bindings installiert
Ich habe OH1 nie über die Paketverwaltung eingerichtet, weshalb ich nicht weiß, wie die einzelnen Bindings stattdessen zur Verfügung gestellt werden. Im Zweifel ist es am einfachsten, Du richtest das Binding manuell ein. (vielleicht ist das Repository auch gar nicht mehr vorhanden)
Dazu lädst Du die aktuelle Fassung von
hier: https://ci.openhab.org/job/openHAB1-...modbus/target/
und packst die Datei in den addons-Ordner (suche nach anderen Dateien, die dem Namensmuster org.openhab.binding*.jar entsprechen, der Name des Ordners sollte eigentlich addons lauten). Du musst openHAB nicht neu starten, das addon steht sofort zur Verfügung. konfigurieren musst Du über die openhab.cfg, die Parameterliste kannst Du über die openhab-default.cfg und den passenden Abschnitt in Erfahrung bringen (ich hab immer den Abschnitt aus der einen in die andere Datei kopiert und dann angepasst)
Kommentar
-
Hallo zusammen,
bin nun durch Zufall über dies Thema gestolpert, da hätte ich meinen Post zu SMA schon besser hier gestellt
Ich habe nun das Modbus Binding 2.4 installiert und wollte die Items manuell konfigurieren, damit ich diese auch sichern kann.
Leider funzt dies noch nicht, da ich falsche Werte angegeben bekomme. Der generelle Zugriffstest funktioniert und ich kann einzelne Register mit dem von SMA empfohlenen Test Tool auslesen und diese aktualisieren sich auch entsprechend des Intervalls.
Meine Things
Code:/* SMA Inverter */ Bridge modbus:tcp:localhostTCP [ host="192.168.50.25", port=502, id=3, connectMaxTries=3, connectTimeoutMillis=2000] { Bridge poller inputRegisters [ start=529, length=4, type="holding", refresh=1000] { Thing data total_yield [ readStart="530", readValueType="uint32"] } }
Code:Number Total_yield1 "Yield: [%.1f kWh]" <pie> (Inverter) { channel="modbus:data:localhostTCP:inputRegisters:total_yield:number" }
Frage: Hat evtl. jemand das 2.x Modbus mit einem SMA Wechselrichter schon am laufen?
Viele Grüße,
Jörg
Kommentar
-
Nach suchen und probieren, kann ich die ersten Werte auslesen
Code:Bridge modbus:tcp:smaTCP [ host="192.168.50.25", port=502, id=3, connectMaxTries=3 ] { Bridge poller smaHolding1 [ start=30529, length=4, refresh=30000, type="holding" ] { //30529 Gesamtertrag (Wh) [E-Total] Thing data sma_totalprod_wh [ readStart="30529", readValueType="uint32", readTransform="default" ] //30531 Gesamtertrag (kWh) [E-Total] Thing data sma_totalprod_kwh [ readStart="30531", readValueType="uint32", readTransform="default" ] //30537 Tagesertrag (kWh) [E-Total] Thing data sma_dailyprod_kwh [ readStart="30537", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding2 [ start=30775, length=20, refresh=5000, type="holding" ] { //30775AC Wirkleistung über alle Phasen (W) [Pac] Thing data sma_power [ readStart="30775", readValueType="uint32", readTransform="default" ] } }
Leider gehen die Werte für Firmware, Status etc nicht
Code:Bridge poller smaHolding3 [ start=30051, length=4, refresh=30000, type="holding" ] { Thing data sma_device_class [ readStart="30051", readValueType="uint32", readTransform="default" ] Thing data sma_device_type [ readStart="30053", readValueType="uint32", readTransform="default" ] Thing data sma_serialnumber [ readStart="30057", readValueType="uint32", readTransform="default" ] Thing data sma_firmware [ readStart="30059", readValueType="uint32", readTransform="default" ] Thing data sma_condition [ readStart="30201", readValueType="uint32", readTransform="default" ] }
Kommentar
-
Hi Jörg,
meine modbus.things sieht so aus:
Code:Bridge modbus:tcp:Sunnyboy1 [ host="192.168.2.173", port=502, id=3 ] { Bridge poller sma_dc1_poll [ start=30773, length=2, refresh=60000, type="holding" ] { Thing data sma_dc1_data [ readStart="30773", readValueType="uint32" ] } Bridge poller sma_dc2_poll [ start=30961, length=2, refresh=60000, type="holding" ] { Thing data sma_dc2_data [ readStart="30961", readValueType="uint32" ] } Bridge poller sma_wir_poll [ start=30775, length=2, refresh=60000, type="holding" ] { Thing data sma_wir_data [ readStart="30775", readValueType="uint32" ] } Bridge poller sma_ges_poll [ start=30531, length=2, refresh=60000, type="holding" ] { Thing data sma_ges_data [ readStart="30531", readValueType="uint32" ] } Bridge poller sma_tag_poll [ start=30537, length=2, refresh=60000, type="holding" ] { Thing data sma_tag_data [ readStart="30537", readValueType="uint32" ] } Bridge poller sma_err_poll [ start=30213, length=2, refresh=60000, type="holding" ] { Thing data sma_err_data [ readStart="30213", readValueType="uint32" ] } Bridge poller sma_mod_poll [ start=30053, length=2, refresh=43200000, type="holding" ] { Thing data sma_mod_data [ readStart="30053", readValueType="uint32" ] } Bridge poller sma_iso_poll [ start=30225, length=2, refresh=43200000, type="holding" ] { Thing data sma_iso_data [ readStart="30225", readValueType="uint32" ] } Bridge poller sma_fir_poll [ start=30061, length=2, refresh=43200000, type="holding" ] { Thing data sma_fir_data [ readStart="30061", readValueType="uint32" ] } Bridge poller sma_ser_poll [ start=30057, length=2, refresh=43200000, type="holding" ] { Thing data sma_ser_data [ readStart="30057", readValueType="uint32" ] } }
Code:Group Solar_Chart Group Solar_ACDC_Chart Number CHART_PERIOD_SMA (Solar_Chart) Number SMA_DC1_ "DC-Leistung String 1: [%d W]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_dc1_poll:sma_dc1_data:number" } Number SMA_DC2_ "DC-Leistung String 2: [%d W]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_dc2_poll:sma_dc2_data:number" } Number SMA_Wirkleistung "Wirkleistung aktuell: [%d W]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_wir_poll:sma_wir_data:number" } Number SMA_Gesamtertrag "Gesamtertrag: [%d kWh]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_ges_poll:sma_ges_data:number" } Number SMA_Tagesertrag "Tagesertrag: [%d kWh]" <sunnyboy> (Solar_Chart) { channel="modbus:data:Sunnyboy1:sma_tag_poll:sma_tag_data:number" } Number SMA_Error "Status Sunny Boy: [MAP(SMA.map):%s]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_err_poll:sma_err_data:number"} Number SMA_Modell "Modell Sunny Boy: [%d]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_mod_poll:sma_mod_data:number" } Number SMA_IsoWiderstand "Isolationswiderstand: [%d Ohm]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_iso_poll:sma_iso_data:number" } Number SMA_Seriennummer "Seriennummer Sunny Boy: [%d]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_ser_poll:sma_ser_data:number" } Number SMA_Firmware "Firmware Sunny Boy: [%d]" <sunnyboy> { channel="modbus:data:Sunnyboy1:sma_fir_poll:sma_fir_data:number" } Number SMA_DC1_korr "DC-Leistung String 1: [%d W]" <solarplant> (Solar_Chart,Solar_ACDC_Chart) Number SMA_DC2_korr "DC-Leistung String 2: [%d W]" <solarplant> (Solar_Chart,Solar_ACDC_Chart) Number SMA_Wirkleistung_korr "Wirkleistung aktuell: [%d W]" <energy> (Solar_Chart,Solar_ACDC_Chart)
Gruß André
eibalinchen
Kommentar
-
Hallo André,
Wie oben geschrieben, geht es bei mir mittlerweile ebenfalls
Auch die Werte, mit denen ich gestern noch Probleme hatte, liefern nun Werte zurück.
Der Unterschied ist, dass ich Gruppen polle und übergebe, da musste ich die Länge noch etwas anpassen.
Meine Things
Code:Bridge modbus:tcp:smaTCP [ host="192.168.50.25", port=502, id=3, connectMaxTries=3 ] { Bridge poller smaHolding1 [ start=30051, length=10, refresh=30000, type="holding" ] { Thing data sma_device_class [ readStart="30051", readValueType="uint32", readTransform="default" ] Thing data sma_device_type [ readStart="30053", readValueType="uint32", readTransform="default" ] Thing data sma_serialnumber [ readStart="30057", readValueType="uint32", readTransform="default" ] Thing data sma_software [ readStart="30059", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding2 [ start=40063, length=10, refresh=30000, type="holding" ] { Thing data sma_firmware_main_processor [ readStart="40063", readValueType="uint32", readTransform="default" ] Thing data sma_firmware_logical_component [ readStart="40065", readValueType="uint32", readTransform="default" ] Thing data sma_serialnumber_2 [ readStart="40067", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding3 [ start=30201, length=4, refresh=30000, type="holding" ] { Thing data sma_condition [ readStart="30201", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding4 [ start=30529, length=4, refresh=15000, type="holding" ] { //30529 Gesamtertrag (Wh) [E-Total] //30531 Gesamtertrag (kWh) [E-Total] Thing data sma_totalprod_kwh [ readStart="30531", readValueType="uint32", readTransform="default" ] //30533 Gesamtertrag (MWh) [E-Total] } Bridge poller smaHolding5 [ start=30535, length=4, refresh=5000, type="holding" ] { //30535 Tagesertrag (Wh) [E-Total] Thing data sma_dailyprod_wh [ readStart="30535", readValueType="uint32", readTransform="default" ] //30537 Tagesertrag (kWh) [E-Total] //30539 Tagesertrag (MWh) [E-Total] } Bridge poller smaHolding6 [ start=30775, length=20, refresh=5000, type="holding" ] { //30775AC Wirkleistung über alle Phasen (W) [Pac] Thing data sma_power [ readStart="30775", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding7 [ start=30769, length=20, refresh=5000, type="holding" ] { //30769 DC current input [1] A Thing data sma_input_ampere_1 [ readStart="30769", readValueType="uint32", readTransform="default" ] //30771 DC voltage input [1] V Thing data sma_input_voltage_1 [ readStart="30771", readValueType="uint32", readTransform="default" ] //30773 DC power input [1] W Thing data sma_input_watt_1 [ readStart="30773", readValueType="uint32", readTransform="default" ] } Bridge poller smaHolding8 [ start=30957, length=20, refresh=5000, type="holding" ] { //30957 DC current input [2] A Thing data sma_input_ampere_2 [ readStart="30957", readValueType="uint32", readTransform="default" ] //30959 DC voltage input [2] V Thing data sma_input_voltage_2 [ readStart="30959", readValueType="uint32", readTransform="default" ] //30961 DC power input [2] W Thing data sma_input_watt_2 [ readStart="30961", readValueType="uint32", readTransform="default" ] } }
Code:/* SMA Photovoltaik SunnyBoy 4000-TL21 */ Number SMA_Device_Class "[MAP(SMA.map):%s]" (Inverter) {channel="modbus:data:smaTCP:smaHolding1:sma_device_class:number"} Number SMA_Device_Type "[MAP(SMA.map):%s]" <sunnyboy> (Inverter) {channel="modbus:data:smaTCP:smaHolding1:sma_device_type:number"} Number SMA_Serialnumber "Seriennummer:[%d]" (Inverter) {channel="modbus:data:smaTCP:smaHolding1:sma_serialnumber:number"} String SMA_Software "Software package:" (Inverter) {channel="modbus:data:smaTCP:smaHolding1:sma_software:string"} String SMA_Firmware_Main_Processor "Firmware Main Proc.:" (Inverter) {channel="modbus:data:smaTCP:smaHolding2:sma_firmware_main_processor:string"} String SMA_Firmware_Logical_Component "Firmware Logical Comp.:" (Inverter) {channel="modbus:data:smaTCP:smaHolding3:sma_firmware_logical_component:string"} Number SMA_Serialnumber_2 "Serialnumber 2:[%d V]" (Inverter) {channel="modbus:data:smaTCP:smaHolding3:sma_serialnumber_2:number"} Number SMA_Condition "Status: [MAP(SMA.map):%s]" (Inverter) {channel="modbus:data:smaTCP:smaHolding3:sma_condition:number"} Number SMA_power_total_kwh "Gesamtertrag [%d kWh]" (Inverter) {channel="modbus:data:smaTCP:smaHolding4:sma_totalprod_kwh:number"} Number SMA_power_daily_wh "Tagesertrag [%d Wh]" (Inverter) {channel="modbus:data:smaTCP:smaHolding5:sma_dailyprod_wh:number"} Number SMA_power "Wirkleistung [%d w]" (Inverter) {channel="modbus:data:smaTCP:smaHolding6:sma_power:number"} Number SMA_input_ampere_1 "Ampere: [%d A]" (Inverter) {channel="modbus:data:smaTCP:smaHolding7:sma_input_ampere_1:number"} Number SMA_input_voltage_1 "Volt: [%d V]" (Inverter) {channel="modbus:data:smaTCP:smaHolding7:sma_input_voltage_1:number"} Number SMA_input_watt_1 "Watt [%d W]" (Inverter) {channel="modbus:data:smaTCP:smaHolding7:sma_input_watt_1:number"} Number SMA_input_ampere_2 "Ampere [%d A]" (Inverter) {channel="modbus:data:smaTCP:smaHolding8:sma_input_ampere_2:number"} Number SMA_input_voltage_2 "Volt [%d V]" (Inverter) {channel="modbus:data:smaTCP:smaHolding8:sma_input_voltage_2:number"} Number SMA_input_watt_2 "Watt [%d W]" (Inverter) {channel="modbus:data:smaTCP:smaHolding8:sma_input_watt_2:number"}
Als nächstes geht es ans persistieren und die Fehlerbereinigung, wenn der WR abgeschaltet ist.
Die Werte sind aktueller als im Sunny Portal, da dort nur alle 30 Min ein Update erfolgt und so kann man noch das eine oder andere Event steuern.
Viele Grüße,
Jörg
Kommentar
-
Hi,
habe die Modbusabfrage für meinen Wechselrichter SMA Sunny Tripower STP5.0-3AV-40 übernommen, Danke für die sehr gute Beschreibung hier, jedoch bekomme ich beim Tagesertrag keinen sinnvollen Wert, es wird konstant 4294967295 kWh angezeigt.
Kann es sein das die Modbusadresse 30537 für den Tagesertrag nicht stimmt ?
Grüße Jürgen
Kommentar
-
Zitat von Juergen151 Beitrag anzeigenHi,
habe die Modbusabfrage für meinen Wechselrichter SMA Sunny Tripower STP5.0-3AV-40 übernommen, Danke für die sehr gute Beschreibung hier, jedoch bekomme ich beim Tagesertrag keinen sinnvollen Wert, es wird konstant 4294967295 kWh angezeigt.
Kann es sein das die Modbusadresse 30537 für den Tagesertrag nicht stimmt ?
Grüße Jürgen
Unter Download findest Du die Specs der Schnittstelle. Die Werte unterscheiden sich in einigen Bereichen. Ich habe dies für einen SB-4000TL-21 implementiert.
Kommentar
-
Zitat von udo1toni Beitrag anzeigenrule:
Code:rule "Fehlerbehebung Nacht Wechselrichter" when Item SMA_Wirkleistung changed or Item SMA_DC1_ changed then if(triggeringItem.name == "SMA_Wirkleistung") SMA_Wirkleistung_korr.postUpdate(if((SMA_Wirkleistung.state as Number) > 4500) 0 else (SMA_Wirkleistung.state as Number)) else SMA_DC1_korr.postUpdate(if((SMA_DC1_.state as Number) > 4500) 0 else (SMA_DC1_.state as Number)) end
Dazu habe ich mir 6 zusätzliche Items erstellt
Code:Number SMA_input_ampere_1_In (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding7:sma_input_ampere_1 :number"} Number SMA_input_voltage_1_IN (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding7:sma_input_voltage_ 1:number"} Number SMA_input_watt_1_In (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding7:sma_input_watt_1:n umber"} Number SMA_input_ampere_1 "Ampere: [%s A]" <smaampere> (Inverter) Number SMA_input_voltage_1 "Volt: [%s V]" <smavolt> (Inverter) Number SMA_input_watt_1 "Watt [%d W]" <smawatt> (Inverter) Number SMA_input_ampere_2_In (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding8:sma_input_ampere_2 :number"} Number SMA_input_voltage_2_In (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding8:sma_input_voltage_ 2:number"} Number SMA_input_watt_2_In (gSMA_Input) {channel="modbus:data:smaTCP:smaHolding8:sma_input_watt_2:n umber"} Number SMA_input_ampere_2 "Ampere [%s A]" <smaampere> (Inverter) Number SMA_input_voltage_2 "Volt [%s V]" <smavolt> (Inverter) Number SMA_input_watt_2 "Watt [%d W]" <smawatt> (Inverter)
Code:rule "Fehlerbehebung Nacht Wechselrichter" when Member of gSMA_Input changed then if(triggeringItem.name.split("_").get(2) == "ampere") { logInfo("Sunny", "Note: {}", triggeringItem.name.split("_").get(0)) logInfo("Sunny", "Note: {}", triggeringItem.name.split("_").get(1)) logInfo("Sunny", "Note: {}", triggeringItem.name.split("_").get(2)) logInfo("Sunny", "Note: {}", triggeringItem.name.split("_").get(3)) } SMA_input_ampere_ + triggeringItem.name.split("_").get(3).postUpdate(if((SMA_Wirkleistung.state as Number) > 4500) 0 else (SMA_Wirkleistung.state as Number)) end
Geht natürlich nicht und das Item wird nicht zusammengebautEine andere Idee wäre Filtern mit 2 Parametern, aber dazu habe ich auch nichts gefunden
Würde dies grundsätzlich funktionieren, oder bin ich auf dem Holzweg
Kommentar
-
Knapp daneben
Du kannst nicht einfach ein Wort hinschreiben und dann etwas dazu addieren. Wenn schon, müsstest Du einen String verwenden, nur ist ein String kein Objekt, Du müsstest dann die Action statt der Methode verwenden.
Sauber geht es so:
Code:rule "eine rule für alle" when Member of gSMA_Input changed then val output = Inverter.members.filter[i|triggeringItem.name.startsWith(i.name)].head var Number nWert = 0 if(triggeringItem.state instanceof Number) { var Number nGrenze = 0 switch(triggeringItem.name.split("_").get(2)) { case "voltage" : nGrenze = 240 case "ampere" : nGrenze = 20 case "watt" : nGrenze = 4500 } if(triggeringItem.state as Number < nGrenze) nWert = triggeringItem.state as Number } output.sendCommand(nWert) end
Im zweiten Schritt wird der neue Wert auf 0 gesetzt (dies ist der default Wert)
Im dritten Schritt wird der Grenzwert abhängig vom triggernden Item definiert.
Im vierten Schritt wird der aktuelle Wert gesetzt, falls er den Grenzwert nicht überschreitet.
Im letzten Schritt wird das Ergebnis zum im 1. Schritt bestimmte Item gesendet.
Kommentar
-
Es gab eine Fehlerwarnung => Type mismatch: cannot convert from Number<nGrenze> to boolean(org.eclipse.xtext.xbase.validation.IssueCo des.incompatible_types)
Diese konnte ich beheben/umgeben indem ich folgendes geändert habe
Code:if(triggeringItem.state < nGrenze) nWert = triggeringItem.state as Number
Kommentar
Kommentar