Ga naar hoofdinhoud

Live MQTT-besturing

tip

De Live MQTT-controle is bedoeld voor live bediening. Voor het verzenden van schema's vooruit, zie in plaats daarvan Geplande MQTT-controle.

Deze gids helpt je bij het configureren van MQTT op je SmartgridOne Controller om batterij- en zonnepaneelinstallaties op afstand te bedienen en te monitoren.

Wat je nodig hebt

  1. SmartgridOne Controller met internetverbinding.
  2. MQTT-inloggegevens: Deze kunnen worden aangevraagd door een e-mail te sturen naar support@eniris.be.
  3. Python-ontwikkelomgeving (of een andere MQTT-client). Deze gids gebruikt een eenvoudig voorbeeld geschreven in Python om je op weg te helpen met MQTT en het verzenden van opdrachten. We raden aan Python te gebruiken vanwege het gebruiksgemak, maar elke andere MQTT-client wordt ondersteund.

Extra informatie

MQTT is een snel communicatieprotocol over het internet. Het is een publiceer/abonneerberichtensysteem dat een directe verbinding tussen je machine en de SmartgridOne Controller mogelijk maakt. Je activa worden ingedeeld in groepen voor zonnepanelen, batterijen, EV en HVAC.

Eerste configuratie (Startpunt voor nieuwe gebruikers)

Ik heb een SmartgridOne Controller die ik wil instellen voor MQTT Remote Control.

1. Controleer je netwerk

Zorg ervoor dat je netwerk mqtt-netwerkverkeer via poort 1883 toestaat. Dit kun je doen met het commando:

nc -zv mqtt.eniris.be 1883

Als dit commando niet beschikbaar is, kun je als alternatief deze python-code downloaden en uitvoeren.

Bij twijfel kun je je netwerkingenieur raadplegen of tijdelijk de 4G/5G-hotspot van je telefoon gebruiken wanneer er verbindingsproblemen optreden.

notitie

Wanneer poort 1883 niet toegankelijk is vanuit je netwerk, bieden we een backup op poort 80. Dit kan in een latere stap van deze handleiding in je MQTT-client worden geconfigureerd.

2. Voeg je apparaten toe

Login naar de inbedrijfstellingsinterface en zorg ervoor dat de apparaten zijn toegevoegd aan de SmartgridOne Controller.

3. Voeg het MQTT-externe signaal toe

Afbeelding 1
Afbeelding 1
Afbeelding 1
Afbeelding 1

4. Schakel het MQTT-externe signaal in

Het veld 'VPP ID' moet leeg blijven.

De timeout van het fallbackmechanisme vertelt de SmartgridOne Controller hoe lang deze moet wachten op nieuwe opdrachten. Wanneer de SmartgridOne Controller stopt met het ontvangen van opdrachten, schakelt deze automatisch over naar de standaardstrategie na deze timeout.

Selecteer daarna alle apparaten die je wilt opnemen in MQTT Remote Control.

Afbeelding 1
Afbeelding 1

5. Externe signaal is toegevoegd

De MQTT Remote Control-interface is nu geactiveerd op de SmartgridOne Controller.

We zijn nu klaar om enkele basisopdrachten te verzenden met een eenvoudig voorbeeld. De kolom Status vertelt je of een opdracht actief is.

Afbeelding 1

Python demo script

Een goed startpunt zou zijn om je nieuw opgezette integratie te testen met een eenvoudig voorbeeld.

Deze testcode doet eenvoudig werk door continu de volgende opdrachten te verzenden:

  • Batterij: Opladen met 5 kW
  • Zonne-energie: Stel het vermogen in op 0 kW

De SmartgridOne Controller reageert continu met een 'feedback'-bericht met de waargenomen net- en activa-vermogenwaarden. Deze functie is ook opgenomen in dit voorbeeld.

Download het onderstaande bestand in je favoriete Python-IDE. Vul je serienummer en MQTT-inloggegevens in en voer het script uit:

Als het bovenstaande succesvol is, kun je doorgaan met het verzenden van andere soorten opdrachten. Alle opdrachten zijn beschreven in onze MQTT Remote Control-documentatie.

MQTT Documentatie voor het Verzenden van Opdrachten

Dit gedeelte beschrijft het MQTT-berichtformaat en de payloadvereisten voor het op afstand besturen van energiebeleid op apparaten binnen het netwerk van de SmartgridOne Controller.

MQTT Onderwerp

Het MQTT-onderwerp dat wordt gebruikt voor het verzenden van opdrachten is als volgt gestructureerd:

standard1/rp_one_s/remoteControlMetrics/'controller SN'

Waarbij 'controller SN' moet worden vervangen door het werkelijke serienummer van de SmartgridOne Controller die je wilt bedienen.

MQTT Payloadstructuur

Opdrachten worden verzonden als JSON-payloads. De payloadstructuur is ontworpen om verschillende energiebeheersbeleid en instelpuntwaarden voor verschillende componenten van het slimme netsysteem te specificeren. Hier is de schets van de payload met gedetailleerde veldbeschrijvingen:

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": "<Unix Timestamp>",
"fields": {
"<Component Policy>": "<Policy Type>",
"<Component Power Setpoint>": <Setpoint in watts>
}
}

Veldbeschrijving

tip

Meerdere apparaattypen (bijvoorbeeld batterijen + zonnepanelen) kunnen tegelijkertijd worden bediend.

  • extraTags (Object):
    • nodeId (String): Een unieke identificatie voor de node binnen het netwerk van de SmartgridOne Controller. Dit is gelijk aan je serienummer, gevolgd door '_site_0' voor de meeste SmartgridOne Controller-apparaten.
  • time (Integer): Unix-timestamp in seconden die het tijdstip aangeeft waarop het bericht wordt verzonden.
  • fields (Object):
    • <Component>_policy (String): Beleidstype voor de component. Dit is optioneel en als het niet is gespecificeerd, valt het systeem terug op de standaardinstelling van de SmartgridOne Controller.
    • <Component>_power_setpoint_w (Float): Gewenst vermogensinstelpunt in watts voor de component. Dit is optioneel en alleen relevant als een overeenkomstig beleid is gespecificeerd.

Componenten en Beleid

info

Activa van hetzelfde type (bijvoorbeeld twee batterijen) worden samengevoegd als één component. Wanneer bijvoorbeeld twee 5 kWh-batterijen zijn geïnstalleerd, wordt dit behandeld als één 10 kWh-batterij.

Elke component in het fields-object kan een beleid en een vermogensinstelpunt bevatten. De volgende componenten kunnen worden bediend:

  • solar_policy en solar_power_setpoint_w:

    • Beheert het beleid en de instelpunt van de zonne-energieproductie. Ondersteunde beleidslijnen:
      • Beleid instelpunt: Stel het maximale vermogen in dat door alle aangesloten zonne-installaties samen wordt geproduceerd. Het veld solar_power_setpoint_w moet worden ingesteld op de productiecapaciteit in watts.
      • Beleid invoerbeperking: Produceer met vol vermogen, volgens de huidige netlimieten.
      • Beleid kosten: Maakt kostenminimalisatie op basis van dagprijzen (EPEX-spotmarkt) mogelijk voor de zonneproductie. Wanneer negatieve injectieprijzen voorkomen, beperken we de productie tot het eigen verbruik. Wanneer zowel de afname- als injectieprijs negatief zijn, schakelen we alle zonne-installaties uit. Het veld solar_power_setpoint_w wordt genegeerd.
      • Beleid uit: Deactiveert alle interactie voor alle zonnepanelen. Waarschuwing: limieten worden niet bewaakt in deze modus. Het veld solar_power_setpoint_w wordt genegeerd.
  • storage_policy en storage_power_setpoint_w:

  • Beheert het beleid van het energieopslagsysteem en het vermogen om te ontladen of laden.

    • Beleidsinstelling: Stel het totale laadvermogen (positieve instelling) of ontlaadvermogen (negatieve instelling) in voor de groep batterijen. Wanneer meerdere batterijen zijn aangesloten, wordt de instelling verdeeld op basis van het beschikbare laad/ontlaadvermogen om de batterijen gelijkmatig te belasten. Het veld storage_power_setpoint_w is ingesteld op het gewenste batterijvermogen.
    • Beleidskosten: Schakelt kostenoptimalisatie in op basis van de dagprijzen (EPEX Spot-markt) voor de batterijen, door deze te laden tijdens de goedkope uren en de energie te gebruiken tijdens de dure uren. Het veld storage_power_setpoint_w wordt genegeerd.
    • Beleid zelfverbruik: Schakelt een eenvoudig zelfverbruiksalgoritme in voor de batterijen. Overtollige zonneproductie wordt opgeslagen in de batterij terwijl de zon schijnt, en wanneer de zon niet meer schijnt, wordt energie uit de batterij gehaald. Het veld storage_power_setpoint_w wordt genegeerd.
    • Beleid uit: Schakelt alle interactie voor alle batterijactiva uit. Waarschuwing: limieten worden in deze modus niet bewaakt. Het veld storage_power_setpoint_w wordt genegeerd.
  • heat_pump_policy:

    • Zet warmtepompsystemen aan/uit. De minimale en maximale in- schakeltijden worden altijd gerespecteerd.
      • Beleidskosten: Schakelt kostenoptimalisatie in op basis van de dagprijzen (EPEX Spot-markt) voor de warmtepompen. Het lokale dynamische prijsalgoritme beslist de beste in-tijdperioden.
      • Beleid zelfverbruik: Zet de warmtepompen aan als er een overschot aan zonne-energie wordt geproduceerd.
      • Beleid uitschakelen: Zet de warmtepompen uit.
      • Beleid inschakelen: Zet de warmtepompen aan.
  • switched_load_policy:

    • Zet relaisgestuurde systemen aan/uit. Dit kan het ingebouwde relais of net verbonden relais zijn.
      • Beleidskosten: Schakelt kostenoptimalisatie in op basis van de dagprijzen (EPEX Spot-markt) voor het relais.
      • Beleid zelfverbruik: Zet het relais aan als er een overschot aan zonne-energie wordt geproduceerd.
      • Beleid uitschakelen
      • Beleid inschakelen
  • variable_power_load_policy en variable_power_load_power_setpoint_w:

    • Beheert het vermogen verbruikbeleid en de instelling voor elektrische voertuigen.
      • Beleidsinstelling: Stel het totale laadvermogen voor de groep EV's in. Het veld variable_power_load_power_setpoint_w is ingesteld op het gewenste laadvermogen.
      • Beleidskosten: Schakelt kostenoptimalisatie in op basis van de dagprijzen (EPEX Spot-markt) voor de batterijen, door deze te laden tijdens de goedkope uren. Het veld variable_power_load_power_setpoint_w wordt genegeerd.
      • Beleid zelfverbruik: Schakelt laden in als er een overschot aan zonne-energie wordt geproduceerd. Het veld variable_power_load_power_setpoint_w wordt genegeerd.
      • Beleid uit: Schakelt alle interactie voor alle EV-activa uit. Het veld variable_power_load_power_setpoint_w wordt genegeerd.
  • site_policy en site_power_setpoint_w:

    • Beheert de exportlimieten van de locatie.
      • Beleidsexport: Stel de exportlimiet voor de locatie in. Het veld site_power_setpoint_w is ingesteld op de exportlimiet.
      • Beleid standaard: Zet de locatie-limiet terug naar het standaard exportvermogen, ingesteld in de controllerconfiguratie.

Apparaatbediening

Specifieke apparaten kunnen ook worden bediend, in plaats van groepen apparaten op basis van hun types. Het bericht is identiek gestructureerd:

  • nodeId_policy en nodeId_power_setpoint_w
info

Wanneer twee commando's naar hetzelfde activum worden verzonden (bijvoorbeeld één apparaat-specifiek commando naar een zonne-omvormer en een commando naar alle zonne-apparaten), zal de apparaat-specifieke bediening voorkeur krijgen boven de bediening op basis van het apparaattype.

Fallback-gedrag

Voor elk component, als de _policy en _power_setpoint_w niet zijn gespecificeerd, zal het systeem automatisch het fallback-beleid gebruiken dat is geconfigureerd in de SmartgridOne Controller. Dit zorgt ervoor dat elk apparaat of apparaatgroep veilig werkt en blijft functioneren, zelfs als specifieke instructies niet worden gegeven.

Als er helemaal geen commando wordt verzonden, worden na 60 seconden (of de geconfigureerde time-outperiode) de standaardbeleidsinstellingen voor activa opnieuw geactiveerd.

Annuleer bestaande commando's en terugvallen naar lokale bedieningsmodi

Een actief commando kan worden geannuleerd door een fallback-commando bericht te sturen.

Fallback Commando

Een fallback-commando zal het bestaande commando onmiddellijk annuleren en de SmartgridOne Controller zal de controle over de installatie overnemen. Het uitgevoerde beleid hangt af van wat is ingesteld in de SmartgridOne Controller Instellingen.

Dit kan ook worden gebruikt in gevallen waarin een secundair besturingssignaal, zoals een schema, wordt gebruikt als fallback.

Berichtvoorbeelden:

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": "<Unix Timestamp>",
"fields": {
"<Component Policy>": "fallback",
}
}

Leeg Commando

Een leeg commando kan te allen tijde worden verzonden om informatie over de locatie te verzamelen. Dit annuleert het huidige commando niet en overschrijft geen commando's van secundaire besturingssignalen met lagere prioriteiten.

Het lege commando is als volgt gestructureerd:

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": "<Unix Timestamp>",
"fields": {}
}

Voorbeeld payload

Hieronder is een voorbeeld van een payload om verschillende beleidsinstellingen en instelingen te zetten:

{
"extraTags": {
"nodeId": "OM12404080000000000_site_0"
},
"time": 1714652046,
"fields": {
"solar_policy": "setpoint",
"solar_power_setpoint_w": 5000,
"storage_policy": "setpoint",
"storage_power_setpoint_w": -5000
}
}

In dit voorbeeld is het zonne-vermogen ingesteld om maximaal 5000 watt te genereren, en het energieopslagsysteem is ingesteld om met een snelheid van 5000 watt te laden of te ontladen, afhankelijk van het teken van de instellingwaarde. Als ofwel de solar_policy of storage_policy zou worden weggelaten, zou het respectieve apparaat terugvallen naar de standaardinstellingen die zijn bepaald door de SmartgridOne Controller.

MQTT-documentatie voor het ontvangen van feedback

Deze sectie beschrijft de structuur en inhoud van de feedbackberichten die door de SmartgridOne Controller via MQTT worden verzonden. Deze berichten worden gepubliceerd naar het onderwerp standard1/outbound/remoteControlMetrics/feedback/<Controller SN> nadat een commando is verwerkt.

MQTT Feedback Onderwerp

Het feedback MQTT-onderwerp is als volgt gestructureerd:

standard1/outbound/remoteControlMetrics/feedback/<Controller SN>

Waarbij <Controller SN> moet worden vervangen door het serienummer van de SmartgridOne Controller die de feedback verzendt.

MQTT Feedback Payload Structuur

notitie

Alle activa zijn gegroepeerd op basis van hun type. Dit betekent dat twee afzonderlijke zonne-installaties van 3 kW als één actief van 6 kW worden behandeld.

Feedbackberichten zijn opgemaakt als JSON-payloads. Deze payloads bieden gedetailleerde feedback over de status van het systeem na toepassing van de instellingcommando's, rekening houdend met net/apparaatlimieten. Hieronder volgt de structuur van de feedbackpayload met beschrijvingen van de velden:

{
"time": "<Unix Timestamp>",
"data": {
"state": {
"grid": {
"active_power_W": <Grid Active Power in Watts>,
"today_imported_energy_Wh": <Grid Imported Energy in Watt-hours>,
"today_exported_energy_Wh": <Grid Exported Energy in Watt-hours>,
"import_limit_W": <Grid Import Limit in Watts>,
"export_limit_W": <Grid Export Limit in Watts>,
},
"vpp_id": "<Virtual Power Plant Identifier>",
"storage": {
{
"energy_stored_Wh": <Energie Opgeslagen in Watt-uur>,
"energy_capacity_Wh": <Totale Energiecapaciteit in Watt-uur>,
"mean_soc_perc": <Gemiddelde Staat van Lading Percentage>,
"active_power_W": <Actieve Vermogen in Watt>,
"executed_power_W": <Vermogen Setpoint Verzonden naar Apparaten in Watt>,
"executed_policy": <Beleid Uitgevoerd door de Controller>,
"max_charge_power_W": <Maximaal Oplaadvermogen in Watt>,
"max_discharge_power_W": <Maximaal Ontlaadvermogen in Watt>,
"today_charged_Wh": <Energie Opgeladen op de Huidige Vandaag in Watt-uur>,
"today_discharged_Wh": <Energie Ontladen op de Huidige Vandaag in Watt-uur>,
"nr_devices": <Aantal Gecontroleerde Opslagapparaten Geïnstalleerd>
},
"solar": {
"active_power_W": <Zonne-Actieve Vermogen in Watt>,
"executed_power_W": <Vermogen Setpoint Verzonden naar Apparaten in Watt>,
"executed_policy": <Beleid Uitgevoerd door de Controller>,
"capacity_W": <Zonnecapaciteit in Watt>,
"today_energy_Wh": <Energie Geproduceerd Vandaag in Watt-uur>,
"nr_devices": <Aantal Gecontroleerde Zonneapparaten Geïnstalleerd>
},
"heat_pump": {
"executed_policy": <Beleid Uitgevoerd door de Controller>,
"operation_modes": <Werking modi van de Warmtepomp>,
"executed_power_W": <Vermogen Setpoint Verzonden naar Apparaten in Watt>,
"nr_devices": <Aantal Gecontroleerde Warmtepompapparaten Geïnstalleerd>
},
"switched_load": {
"executed_policy": <Beleid Uitgevoerd door de Controller>,
"devices_on": <Aantal Apparaten Aangeschakeld>,
"devices_off": <Aantal Apparaten Uitgeschakeld>,
"executed_power_W": <Vermogen Setpoint Verzonden naar Apparaten in Watt>,
"nr_devices": <Aantal Gecontroleerde Geschakelde Lastapparaten Geïnstalleerd>
},
"variable_load": {
"executed_policy": <Beleid Uitgevoerd door de Controller>,
"executed_power_W": <Vermogen Setpoint Verzonden naar Apparaten in Watt>,
"active_power_W": <Vermogen van het apparaat in Watt>,
"ev_requiring_charge": <Heeft de EV Oplading Nodig>,
"currentL1_A": <Stroom van het apparaat op fase 1 in Ampère>,
"currentL2_A": <Stroom van het apparaat op fase 2 in Ampère>,
"currentL3_A": <Stroom van het apparaat op fase 3 in Ampère>,
"executed_current_A": <Stroom Setpoint Verzonden naar Apparaten in Ampère>,
"today_charged_Wh": <Energie Vandaag opgeladen in Watt-uur>,
"today_discharged_Wh": <Energie Vandaag ontladen in Watt-uur>,
"total_charged_Wh": <Totaal Energie Opgeladen in Watt-uur>,
"total_discharged_Wh": <Totaal Energie Ontladen in Watt-uur>,
"min_charge_current_A": <Minimale Oplading in Ampère>,
"max_charge_current_A": <Maximale Oplading in Ampère>,
"allow_zero_current": <Ondersteunt de Oplader Pauzeren>,
}
},
"response_code": <Reactiecode>
},
"fields": {},
"requestTime": "<Unix Tijdstempel>",
"time": "<Unix Tijdstempel>",
"siteNodeId": "<Controller SN>_site_0"
}
- executed_policy (Str): De beleidsmaatregelen die zijn toegepast op de stuurmiddelen,
- executed_power_W (Float): De som van het totaal gevraagde vermogen van de activa, verzonden door ons controle-algoritme.
- active_power_W (Float): Vertegenwoordigt het huidige actieve vermogen op het net in watt.
- ev_requiring_charge (Bool): Heeft de EV lading nodig? (Is er een auto aangesloten).
- currentL1_A (Float): Stroom van het apparaat op fase 1 in Ampère.
- currentL2_A (Float): Stroom van het apparaat op fase 2 in Ampère.
- currentL3_A (Float): Stroom van het apparaat op fase 3 in Ampère.
- executed_current_A (Float): De som van de totale stroom die is gevraagd van de activa, verzonden door ons controle-algoritme.
- today_charged_Wh (Float): De energie die vandaag in de EV-laadpunt(en) is geladen. Opmerking: Vandaag is gegeven in UTC-tijd.
- today_discharged_Wh (Float): De energie die vandaag in de EV-laadpunt(en) is ontladen. Opmerking: Vandaag is gegeven in UTC-tijd.
- total_charged_Wh (Float): De totale energie die in de EV-laadpunt(en) is geladen.
- total_discharged_Wh (Float): De totale energie die in de EV-laadpunt(en) is ontladen.
- min_charge_current_A (Float): Minimale stroom waarmee de EV kan worden opgeladen.
- max_charge_current_A (Float): Maximale stroom waarmee de EV kan worden opgeladen.
- allow_zero_current (Bool): Staat de EV-lader het pauzeren toe.
- nodeId (Object):
- Als er een nodeId is opgenomen in het commando, zal de feedback de overeenkomstige status van het apparaat bevatten.
- response_code (Int):
- Geeft de status van de operatie aan. Een response_code van 0 betekent doorgaans succes, terwijl andere waarden verschillende soorten fouten of statusinformatie kunnen aangeven (deze moeten in een aparte referentie worden gedetailleerd).

### Voorbeeld Feedbackpayload
Hier is een voorbeeld van een feedbackbericht na een commando om verschillende vermogensinstellingen in te stellen:

<ClickableImage src="/img/generic/mqtt-example-feedback.png" alt="Afbeelding 1" maxWidth="450px" />

Deze feedback toont de huidige operationele toestand van het systeem na de uitvoering van de instellingen, met een indicatie van de effecten op zonne-energieopwekking, opslag en algemene interactie met het net.

## Ondersteunde MQTT-versies en gedrag bij ongeautoriseerde onderwerpen
Bij het gebruik van MQTT is het belangrijk om de verschillen in specificaties tussen versie 3.1, 3.1.1 en 5.0 te overwegen, vooral met betrekking tot het gedrag van de broker wanneer clients publiceren naar ongeautoriseerde onderwerpen.

Volgens de MQTT 3.1.1-specificatie (zie OASIS MQTT 3.1.1 Specificatie, sectie MQTT-3.3.5-2) moet een broker de verbinding beëindigen zodra een client een PUBLISH naar een onderwerp verzendt waarvoor deze geen toestemming heeft. Dit gedrag kan leiden tot onverwachte verbroken verbindingen voor clients die proberen te publiceren naar verkeerd geconfigureerde of ongeautoriseerde onderwerpen.

In MQTT 3.1 is deze vereiste niet van toepassing. Wanneer een client publiceert naar een ongeautoriseerd onderwerp onder deze versie, negeert de broker doorgaans het bericht (stille afwijzing) zonder de verbinding te beëindigen. Dit maakt MQTT 3.1 in sommige gevallen geschikter wanneer robuustheid tegen configuratiefouten of tijdelijk ontbrekende machtigingen belangrijker is dan strikte beveiliging.

Hoewel MQTT 5.0 de mogelijkheid introduceert om met redencodes te werken (zoals PUBACK met een afwijsreden), vereist dit ondersteuning aan zowel de client- als serverzijde. Migreren naar MQTT 5.0 vereist daarom extra implementatie-inspanningen.

__Gevolgen van het negeren van compatibiliteit:__
Als een client verbinding maakt met MQTT 3.1.1 en probeert berichten te publiceren naar ongeautoriseerde onderwerpen, zal de broker de sessie abrupt beëindigen. Dit kan leiden tot instabiliteit, verlies van connectiviteit of verhoogde belasting door herhaalde verbindingspogingen.

__Aanbevolen aanpak:__
Voor systemen waarbij clients (tijdelijk) proberen te publiceren naar ongeautoriseerde onderwerpen, of waar foutafhandeling niet strikt is geïmplementeerd, raden we aan om MQTT 3.1 te gebruiken. Dit zorgt voor meer stabiele verbindingen en voorkomt ongewenste verbroken verbindingen tijdens de runtime.