Victron SmartSolar Laderegler auslesen – LoRaWAN Gateway

In meinem vorhergehenden Beitrag, bin ich ja bereits auf die Grundsätze eingegangen, damit ihr die Daten aus eurem Victron Solarladeregler auslesen könnt. Hier geht es nun darum die Daten, mittel LoRaWAN, zu verschicken und auszuwerten. In diesem Beitrag geht es also um den Node, welcher die Daten des Ladereglers verarbeitet, also unser Victron Gateway.

Die gesamte Projekt basiert auf der Arbeit von Pim Rutgers. Dank seiner Arbeit ist es uns möglich die Daten des Ladereglers einfach auszuwerten. Der Rest besteht nur aus Anpassungen an die Hardware und dem üblichen OTAA Sketch. Somit geht mein Dank an Pim, für seine Arbeit, ohne die es mir nicht möglich gewesen wäre.

Wir verwenden das klassische VE-Direct Protokoll und nicht die HEX Variante. Seit der Firmware 1.53 wird das „normale“ Protokoll nicht mehr stumm geschaltet und quatscht munter in die Nachrichten hinein. Anscheinend hatte ich auch daher Probleme mit dem HEX Protokoll und Auszügen dieses Sketches. Die Auswertung war relativ träge und daher nicht brauchbar. Somit verwende ich das normale VE.Direkt Protokoll, dieses funktionierte bisher absolut zuverlässig. Einziger Nachteil sind die fehlenden erweiterten historischen Daten (bis zu 30 Tage) und die fehlende Möglichkeit die Temperatur auszulesen. Wer die Temperatur brauch, kann ja noch schnell einen Sensor, wie einen BME280, hinzufügen.

Aufbau des Victron Gateway Nodes

Der Node besteht aus einem Adafruit Feather M0 LoRa und einem Pegelwandler. Ich habe mich für den Adafruit entschieden, da dieser eine zusätzliche serielle Schnittstelle hat, mit welcher ich den Laderegler auslesen. Dieses hat aber leider nicht funktioniert, da nach einem os_init(); der LMIC die Schnittstelle keine Daten mehr ausgibt. Somit habe ich mittels SERCOM einen weiteren Port erzeugt, mit dem es auch ohne Probleme ging. Die Port-Deklaration kommt natürlich auf eure Hardware an. In meinem Beispiel ist PIN 11 der neue RX-Port und PIN 10 der neue (ungenutzte) TX Port.

Ebenfalls wichtig beim Feather LoRa ist die zusätzliche Verbindung zwischen DIO1 und PIN 6 (gelb). Diese dürft ihr nicht vergessen, denn ansonsten wird euer Node nicht richtig funktionieren. Solltet ihr diese Brücke vergessen, werdet ihr keine EV_TXCOMPLETE Meldungen erhalten.

Der Pegelwandler ist Pflicht, da der Victron einen 5 Volt Pegel verwendet, aber der Feather einen 3,3 Volt Pegel nutzt. Für die Anbindung an den Victron Laderegler wird nur GND und TX benötigt des Victron benötigt, der Rest ist nicht interessant. Der TX des Victron landet natürlich, mit Umweg über den Pegelwandler, auf dem RX des Feather.

Hier eine Frage an die Profis unter euch: Normalerweise muss ich dem LevelShifter auch über HV die +5V zuführen. Sobald ich dieses jedoch gemacht habe, funktionierte das Auslesen auch wieder nicht. Ohne geht es. Für mich erklärt sich das Nicht, ich habe aber auch nicht versucht das Thema weiter zu debuggen, da es ohne +5V funktioniert. Über einen Hinweis wäre ich jedenfalls dankbar. In einem meiner anderen Projekte habe ich den Wandler mit +3.3V und +5V versorgt, ohne jegliche Probleme.

Ansonsten seht ihr noch einen StepDown Wandler, damit ich den Feather mit 3.3V versorgen kann. Ich greife die Spannung an der Batterie ab, damit ich auch sehe ob der Lastausgang abgeschaltet wurde. Würde ich den Feather über den Lastausgang mit Strom versorgen, würde der Feather nicht mehr mit Strom versorgt, sobald der Victron, z.B. aufgrund einer Unterspannung, den Lastausgang abschaltet.

VictronA_LoRa_Gateway

Software des Gateways

Den verwendeten Sketch findet ihr auf GitHub. Die LoRa Keys müsst ihr natürlich verändernund den Sketch evtl. an eure Hardware anpassen. Ebenfalls müsst ihr die config_victron.h anpassen. Je nach Typ und Firmwarestand werden unterschiedliche Datenfelder übermittelt. Schaut dazu in den vorhergehenden Beitrag und passt die Datei entsprechend an. Wichtig ist hier auch die Reihenfolge der Felder, da ansonsten Werte falsch zugeordnet werden. Im Original waren verschiedene Regler angegeben, jedoch verändert sich dieses mit einer anderen Firmware gerne. Die Einträge sind dort jedenfalls nicht mehr aktuell. Meine Konfig passt jedenfalls für einen Victron SmartSolar 75/15 mit Firmware 1.56 oder 1.59.

Ich werte nicht alle möglichen Felder aus, nur die unten beschriebenen. Ihr könnt aber natürlich alles an eure Bedürfnisse anpassen.

Payload Decoder für das Victron Gateway

Der passende Payload Decoder zum obigen Sketch sieht so aus:

VbattBatterie Spannung in Volt
IbattBatterie Strom in Amper; positiv bei Ladung, negativ bei verbrauch
IloadStrom am Lastausgang in Amper
PpowerLeistung vom Solarmodul in Watt
CSLadezustand (Aus, Bulk, Absorb, Float)
LoadSStatus des Lastausgangs (ein, aus)
yieldtotalGesamtleistung in Wh
yielddayTagesleistung in Wh
function decodeUplink(input) {
    var data = {};

    data.Vbatt = (input.bytes[0]  <<8 | input.bytes[1]) / 100;
    data.Ibatt = ((input.bytes[2] & 0x80 ? 0xFFFF<<16 : 0) | input.bytes[2]<<8 | input.bytes[3]) / 100;
    data.Iload = (input.bytes[4]  <<8 | input.bytes[5]) / 10;
    data.Ppower = input.bytes[6]; 
    data.CS = input.bytes[7]; 
    data.LoadS = input.bytes[8];
    data.yieldtotal = (input.bytes[9]  <<8 | input.bytes[10]) * 10;
    data.yieldday = input.bytes[11] * 10;
  
    if (data.Vbatt > 0){
        return {
            data: data,
            warnings: [],
            errors: []
        };
    }
}

Verarbeitung des Victron Gateway in Node-RED

Mein normaler Workflow sieht so aus: Ich hole die Daten ber MQTT bei TTS ab und schicke sie durch einen json Node, danach verarbeitet ich die Daten in einem function Node und speichere alles in InfluxDB ab. Den Inhalt des function Nodes habe ich hier mal drangehängt.

victron_gateway_node-red
var msg1 = { payload: msg.payload.length };
msg1.payload = msg.payload.uplink_message.decoded_payload.Ibatt;

var msg2 = { payload: msg.payload.length };
msg2.payload = msg.payload.uplink_message.decoded_payload.Vbatt;

var msg3 = { payload: msg.payload.length };
msg3.payload = msg.payload.uplink_message.decoded_payload.Ppower;

var msg4 = { payload: msg.payload.length };
msg4.payload = msg.payload.uplink_message.decoded_payload.Iload;

var msg5 = { payload: msg.payload.length };
msg5.payload = msg.payload.uplink_message.decoded_payload.CS;

var msg6 = { payload: msg.payload.length };
msg6.payload = msg.payload.uplink_message.decoded_payload.LoadS;

var msg7 = { payload: msg.payload.length };
msg7.payload = msg.payload.uplink_message.decoded_payload.yieldtotal;

var msg8 = { payload: msg.payload.length };
msg8.payload = msg.payload.uplink_message.decoded_payload.yieldday;

var msg20 = {};
msg20.payload = [{"Ibatt": msg1.payload, "Vbatt": msg2.payload, "Ppower": msg3.payload, "Iload": msg4.payload, "CS": msg5.payload, "LoadState": msg6.payload, "yieldT": msg7.payload, "yieldD": msg8.payload}];

return [msg20];

Grafana

Mittels Grafana visualisiere ich die gesammelten Daten. Das folgende Dashboard soll euch nur als Anregung dienen.

3 Gedanken zu „Victron SmartSolar Laderegler auslesen – LoRaWAN Gateway“

  1. Wie oft werden die Daten per LoRaWan denn verschickt? Alle paar Sekunden? Gibt es bei TTN nicht diese Fair Use Policy mit irgendwelchen Obergrenzen? Frage nur aus Neugier bzw. weil mich das Thema in Zukunft auch interessieren würde. Danke und Grüße aus Dorsten, Oliver

    Antworten
    • Hallo Oliver,

      aktuell werden die Daten alle 60 Sekunden verschickt.
      Dabei wird eine Airtime von ca. 70ms verbraucht und damit liege ich mit ca. 100 Sekunden pro Tag, über die Fair Use Policy von 30 Sekunden. Somit hast du recht.
      Danaben liegt der Node aber weit unter dem regulatorischen Duty Cycle von 1% (36 Sekunden pro Stunde). Rein rechtlich also sauber.

      Aktuell arbeite ich aber an einer Version, welche bei 0 PV Leistung nur alle fünf Minuten ein Paket verschickt. Das wird aber nicht vor dem Frühjahr.
      Ein gute PV-Anlage würde aber auch dann den Wert im Sommer reißen.

      Grüße,
      Björn

      Antworten
      • Wir haben eine PV Anlage, bei der man die Daten irgendwie per modbus TCP auslesen und verarbeiten kann. Ich habe mich aber noch nicht weiter damit beschäftigt. Würde in meinem Fall wahrscheinlich aber eher Sinn über LAN machen statt über TTN. Jedenfalls eine coole Umsetzung und Lösung bei dir!
        Ich betreibe ein TTN Gateway, komme aber aufgrund Zeitmangel leider eher selten dazu, mir Spielereien damit zu basteln.
        Grüße

        Antworten

Schreibe einen Kommentar