Afdrukken
Categorie: Arduino and ESP
Hits: 1860

Gebruikerswaardering: 5 / 5

Ster actiefSter actiefSter actiefSter actiefSter actief
 


Universeel te gebruiken ESP32 - P1 Dutch Smart Meter Reader
inclusief een S0-puls KWh meter lezer

Een extreem simpele en zeer goedkope oplossing om je energiegebruik
per dag te monitoren en het wordt bewaard op een micro SD-card.
Alles lokaal dus geen externe service of cloud nodig.

Wat extra info helemaal onderaan: WAT MEER P1-poort INFORMATIE en TIPS van Ewald

Dit ESP32 sEnergy project is onderdeel van mijn, wat van de norm afwijkende, zonnepanelen project (zie ook mijn PV-DHZ en PV-BOILER artikelen). Voor minder dan € 5,= plus een oude telefoonkabel, een overjarig 2GB-SD-kaartje en wat klein spul uit mijn 'rommel'-laatjes heb dit in elkaar geknutseld. Naast de hard- en software beschrijving ook wat uitgebreidere P1 informatie want het internet staat bol van de vraagtekens over dit simpele, maar blijkbaar toch nogal moeilijke, onderwerp. Het ontwerp en de code is alleen op een DSMR 5.0 meter getest (ik heb maar één meter) Maar is, naar mijn inschatting, voor alle (D)SRM-meters geschikt. Mijn ESP32 Arduino C/C++ sEnergy software is volledig vrij te gebruiken en te wijzigen. Het is zeer compact en heeft ondanks dat toch veel mogelijkheden:

De hardware (zoek eerst in je rommelbak):
(totaal onder de € 10,= met wachttijd bij tante Ali & Co, of wat meer Euro's bij snelle levering)

Wil je ook de productie van je panelen ook in de grafieken zichtbaar maken dan heb je ook nog een S0-pulsgever en een 10KΩ weerstandje nodig.
(onder € 20,= in NL te koop).
Op deze wijze heb je in principe alle belangrijke gegeven zonder externe bemoeienissen beschikbaar.
Bijna vergeten maar niet bepaald onbelangrijk:
De P1-meterpoort voeding, pinnen 1 en 6, levert slechts 100mA, dus NIET gebruiken! (sowieso niet aanwezig bij de wat oudere "minder" slimme meters). Hang de ESP32-P1-reader aan een (oude) USB-voeding. Minimaal een 600mA voeding in de ESP32-USB aansluiting prikken anders beperk je het WiFi bereik misschien.
LET OP!
Nooit tegelijk een voeding aan de 5V/IN-pin hangen en USB-aansluiten gebruiken want dan zul je een nieuwe ESP32 moeten aanschaffen.
Zie afbeeldingen , en (boven) hoe het samen te stellen.
Als je Dupont Jumpers (draden met connectors) gebruikt dan vouw je de draden ook tussen de ESP32 pootjes en omwikkel je het geheel met stevige tape. Dit omdat je anders, letterlijk en figuurlijk, contactproblemen kunt krijgen.
Wel het eigenlijke ESP32 vrij houden anders krijgt ze koorts.
Hoe het met die wel/geen jumper moet lees je iets verderop.
Gebruik een voor elektronica geschikt soldeerboutje 30W met dun spits puntje (vanaf € 8,= tot duur). Soldeertin 0,7mmø, 60/40 met harskern. Soldeer met een temperatuur van zo'n 300-320oC.
LET OP! Niet alle ESP32 modules hebben de aansluitingen op dezelfde plaats zitten, dus zo nodig aanpassen aan de situatie. De SD-adapter moet je zeer snel solderen anders smelt de kunststof onder je handen weg, dus soldeerbout-temp. goed afstemmen op het te gebruiken soldeertin.

Mijn sEnergy project: 's' staat voor simple
In de folder "info" vindt je ook een DSMR v5.0 PDF en TXT-bestand met wat OBIS-uitleg in het Nederlands.
Simple? Jawel, het decoderen van de P1-telegrammen gebeurt met slecht een handje vol aan code-regels. Zo eenvoudig en compact ben ik het nergens anders tegen gekomen. Daarbij is er geen externe service of cloud nodig en blijft alles dus "binnenkamers". Wat ook simple, dus "eenvoudig" is, dat is de Arduino IDE. Door velen geminacht maar beslist een goede keuze om dit soort projecten, zonder een flinke lading aan overhead, mee te programmeren. Hoe een Arduino IDE en ESP32 lib te installeren zoek je maar even uit via Internet, daar staan ze te dringen om je te helpen. Voor ESP32 kies je de eenvoudigste manier, zoek even op Arduino ESP32 "Installing using Boards Manager".
Je kunt mijn project vanaf mijn website downloaden maar zonder mijn library verzameling simpleLib kom je niet ver dus die moet je ook downloaden en in de map ...../arduino/libraries dumpen. zie https://docs.arduino.cc/software/ide-v1/tutorials/installing-libraries onder "Manual Installation", anders wordt het voor een enkeling wat lastig. Ook moet je een library van Links2004-WebSockets in de map ...../arduino/libraries dumpen, ander kun je niet met de webbrowsers communiseren.
Als alles technisch gezien aan elkaar hangt kun je het programma in de IDE laden en wat gegevens in de code aanpassen zodat het met jouw Router WiFi overweg kan. Daarna kun je het via USB oploaden/flashen. Soms zie je dat het niet lukt, druk dan tijdens het uploaden even op het ESP32-knopje "EN". Zodra je ziet dat er voortgang is kun je het knopje loslaten. Alles OK? dan kun je het in de P1-poort prikken en de voeding natuurlijk niet vergeten. Vanaf nu is er in de Arduino IDE, onder "Tools->Port:" een "Network Port" aanwezig (soms moet je de IDE opnieuw opstarten, of de WiFi-netwerk-adapter even UIT/AAN zetten) en daar mee je eigen wijzigingen in de software, via OTA, uploaden (klik 6e en 7e miniatuurtje en kijk onderaan). Op zich ben je nu net zo ver als voorheen want als je de door mij bijgesloten HTML bestanden in een browser opent dan komt er waarschijnlijk helemaal niets zinnigs te voorschijn! Waarom? Dat is nogal logisch, ook die bestanden moet je eerst even aanpassen aan je Router WiFi.
TIP! Kies een vrij IP-adres en zet het VAST (STATIC) in je Router. Voor de Websockets gebruiken we Port 82 en voor de Server Port 80, die kun je zo laten staan. DNS kun je waarschijnlijk zo laten (nodig bij NTP-time servers).
Minimaal in de programmacode aan te brengen wijzigingen in het rood:
   ESP32 sEnergy.ino: (vanaf regel 21)
const char *staSsid = "je Router SSID",
         *staPassword = "je Router wachtwoord";
const IPAddress staIP(192, 168,178, 121),
             staGatewayIP(192, 168, 178, 1),
                staSubnetIP(255, 255, 255, 0);
const IPAddress staPrimDNS(8, 8, 8, 8),
                            staSecDNS(8, 8, 4, 4);
(regel 34/35)
const double latSun = 52.1234, // your location ...
                     lonSun = 5.5678;  // ... used by sunrise/set
(regel 83)
const uint16_t pulseRate = 1000; // number of S0-pulses/KWh, 1000: one pulse is 1.0W  2000: one pulse is 0.5W

En niet vergeten:
  Bij de eventueel te gebruiken ESP32 Websocket Client(s) het Websocket-IP op het bovenstaande afstemmen (als bij HTML hier onder)
  Zo nodig ook de seriële instellingen (zie verderop).
    HTML bestanden:
LET OP! Om wijzigingen aan te brengen open je de HTML bestanden in kladblok of een soortgelijk programma zoals notepad++ en beslist NIET in een tekstverwerker.
(sEnergyActueel.html regel 65)
  var socketIP ='192.168.178.121';
(sEnergyHistorie.html regel 146)
   location.href = "http://192.168.178.121/download?log=" + arg0 + "&bac=" + arg1;
(sEnergyTotalen.html regel 275)

   location.href = "http://192.168.178.121/download?log=" + arg0 + "&bac=" + arg1;
(sEnergyDownload.html regel 80)
   location.href = "http://192.168.178.121/download?log=" + arg0 + "&bac=" + arg1;
En zo ook bij de HTML-bestanden in de folder "helpers".

Hoe kom je aan de benodigde informatie van je slimme meter:
Indien sEnergy.ino niet goed werkt dan heb je een paar gegevens nodig van de P1-meter versie welke bij jou in de meterkast hangt. Zoek eerst je DSRM-versie op, het staat op je meter als b.v. SRM-5.0 (de D moet je er voor denken). sEnergy.ino werkt waarschijnlijk zonder P1-port wijzigingen vanaf v4.0. Voor eerdere versies zul je baudRate en bitsParStop moeten aanpassen (zie hierna). DSMR-versies documentatie downloaden van Netbeheer Nederland is nogal eenvoudig kijk even helemaal onderaan bij domoticx.com. In die DSRM-downloads staat ook vermeld of het een opencollector type is (TX-pin 5 wel/geen jumper nodig) is geconfigureerd.

Wat kan er mis gaan:
Mijn programma-code is ongewijzigd te gebruiken met de DSMR versie Dutch Smart Meter Requirements v5.0 Final P1. Er zijn ook nog oude, niet zo slimme slimme meters, in omloop. Heb je nog zo'n oudje zie dan verderop bij Een gratis nieuwe Slimme Meter oplossing? voor, wie weet, een verrassing?
De P1-poort communiceert eenzijdig met een inverted seriële TX signaal. '0' = HOOG >4V en '1' = LAAG <1V. De P1-poort is dus wat gehandicapt, het heeft wel een "mond" maar geen "oren" (zenden:TX, ontvangen:RX). Je hoeft dus niet bang te zijn, of te hopen(!), dat je iets in de meter kunt beïnvloeden.
Die 5V van de P1-TXpin... dat is zeer pijnlijk voor een ESP32 Dat passen we dus aan naar 3.3V via de Bi-directional Logic Level Converter.
TX = transmit/zenden, RX = receive/ontvangen: P1-meter zend dus via een TX-pin en dat ontvang je dus met een RX-pin. Bij de ESP32 maken we gebruik van de standaard SERIAL2 RX-pin (RX2=GPIO16). Zo blijft de standaard seriële poort vrij voor normaal gebruik.
(regel 15 en 16 zo nodig aanpassen)
const uint32_t baudRate = 115200,              // 9600                - before DSRM v4.0
                    bitsParStop = SERIAL_8N1;  // SERIAL_7E1  -      "         "         "
const bool inverted = true;                            // standard inverted
Met het in de folder "sEnergyHTML->helpers bijgesloten WebSocketMonitor.html kun je eenvoudig testen of er wat ontvangen wordt.

Als bovenstaande regels elke seconde verschijnen (hier 16:35:16e, 17e, 18e sec) dan heb je een moderne meter. Blijft het leeg dan zul je moeten zoeken wat er gewijzigd moet worden. Oude meter kunnen een interval van tot wel 10 seconden hebben dan duurt het dus wat langer voor er wat te zien valt.
Wat kan er nog meer mis gaan: Met een Windows of Android systeem kun je HTML-bestanden gewoon op een normale manier openen. Maar.... als je een bepaald, nogal vreselijk bemoeizuchtig, merk apparaat gebruikt dan kan het zijn dat je niet zomaar de HTML-bestanden vanuit een folder kunt openen. Er zijn diverse oplossingen voor, moet je maar even naar zoeken. (ik gebruik dat merk principieel niet, ik bepaal zelf wel wat ik er allemaal "wel" en "niet" mee wil doen. Ik heb nooit problemen gehad met Bill, die leverde gewoon wat ik vroeg, maar Steve was nogal bemoeizuchtig - zo vanaf 1976).

Mijn "op eigen wijze" Request pin oplossing - P1 om gegevens vragen:
Ik ben niet eigenwijs maar doe dingen graag op eigen wijze, dus ook in dit geval!
Gegeven worden aangeboden indien er een spanning van minstens 4V op P1-pin 2 staat (pin 2: Request pin genaamd). In mijn hardware wordt een Request gedaan via de ESP32 pin GPIO-27 en dat is dus "slecht 3.3V" dus onder de verwachte minimaal 4V. De Bi-directionele Logic Level Converter lost dit probleem op: 3.3V5V.Met spanning op de Request-pin geef je dus aan dat je een telegram wenst te ontvangen. Ik ben nog nergens anders tegen gekomen dat er een Reques bewust wordt aangevraagd, men zet er domweg continue 5V op. Mijn ervaring is dat er dan telegrammen buiten de buffers kunnen vallen en dan dus onbruikbaar zijn of, in het slechtste geval, er verkeerde informatie wordt opgeslagen. En dat zie je dan dus ook, door de vele hulp zoekende, in diverse forums terug.

Websocket, Webserver, Server, Client?
Een Websocket Server kan met één of meerdere Websocket Clients tegelijk in handshake mode communiceren, dit in tegenstelling tot een Webserver welke alleen op een aanvraag kan reageren. Webserver Clients zijn: sEnergyHistory.html en sEnergyDownload.html. Websocket Clients zijn: sEnergyActueel.html, WebSocketMonitor.html en het ESP32 Websocket Client voorbeeld.

WAT MEER P1-poort INFORMATIE

Wat kan een slimme meter wel:
De diverse merken en versies van de "slimme" energie meters geven een zogenaamd "Telegram" uit over een wat vreemde seriële uitgang (een halve en beetje mismaakte RS232). De belangrijkste codes, OBIS (OBject Identification System) genaamd, zijn voor alle versies gelijk zijn. Daarnaast zijn er meer of minder gegevens uit te lezen naar gelang de DSMR (Dutch Smart Meter Requirements) versie en de fabrikant (laatste tot 2022: DSRM 5.2). Als je alle foutcodes en, naar mijn mening, on-interessante gegevens wil uitlezen, dan zul je mijn programma moeten aanpassen aan je eigen wensen (niet zo moeilijk hoor).
Het kan zijn dat de OBIS-code voor gas wat afwijkt, als dat zo is dan moet je dat even in de software aanpassen (zie afb. 7)

Wat kan een slimme meter niet:
Een slimme meter kan niet de opbrengst van je zonnepanelen zien, alleen registreren als ze meer produceren dan wat je op dat moment gebruikt. Dat is dan "terug leveren". Voor de opbrengst van je panelen moet je dus de registratie van de omvormer benutten of in de meterkast, tussen de omvormer en de zekering, een extra registratie module monteren. Er zijn ook omvormers, zoals van APsystems, welke standaard elk paneel apart monitoren. In zo'n geval heb je een losse ontvanger nodig zoals een APS ECU. Een nadeel is dat de gegevens van jouw panelen meestal eerst de hele wereld rond gaan voor je ze zelf kunt bekijken. Ook van deze gegevens worden elders gebruikt. Dus zoek of maak een oplossing als je, net als ik, daar op tegen ben.

Wat niet elke slimme meter versie kan:
De wat oudere meters geven een telegram met een lagere tijd interval uit, mogelijk zelfs maar eens per 10 seconden. Ook als dat zo is dan leest mijn programma het uit zodra er een telegram langs komt. De tijden-informatie in de grafieken ziet er dan natuurlijk wel iets ander uit. Meters van voor versie SRM-4 zijn (te)oud te noemen.
Een gratis nieuwe Slimme Meter oplossing?
Als je een zogenaamde 25A (verwisselbare stop hoofdzekering) aansluiting heb (kan ook met 32A automaat afgezekerd zijn) dan kun je de Netbeheerder vragen om er een 35A (verwisselbare stop) of 40A (automaat) aansluiting van te maken. Maar let op! Vraag alleen een 35A opwaardering aan, ook als je een 32A automaat als hoofd zekering heb (in het systeem zit een fout en dan krijg je misschien toch een vette rekening)
Van 25/32A naar 35/40A was in 2021 gratis, maar dat kan natuurlijk veranderen.
Surprise! Tot mijn verrassing werd de "oude" slimme meter en de gas meter gelijk door de nieuwste versies vervangen. Vervangen van meter dus niet aanvragen want dan moet je eerst een wel zeer vet spaarvarken kapot slaan.

TIPS van Ewald

Overschot van de zon zelf benutten met behulp van een ESP32 Websocket Client:
Ook weer zo'n simpele ESP32 oplossing. Hang er een (solid state)relais aan en je kan je gebruikers AAN/UIT schakelen. Bijvoorbeeld water in een extra boiler(tje) voorverwarmen (boiler in koudwateraansluiting voor het hoofd verwarmingsapparaat CV/Boiler/...).
Of een signaal geven/tonen om de vaatwasser, droger, wasmachine ofzo aan te zetten. Een ESP32 Websocket Client is als voorbeeld bijgesloten in de download. Wat je er aanhangt (relais/signaal/...) moet je zelf uitvogelen.
Hoe gaat dat dan? Vergat ik te vertellen: Een ESP32_WebsocketClient ontvangt vol automatisch elke 5 minuten, tussen zon op/onder, of er wel of geen energie wordt terug geleverd (klik laatste twee miniaturen). Verder zit er ook de locale datum en tijd in en kan je er nog veel meer mogelijkheden instoppen (kijk ook in de example folder van mijn simpleLIB).
In het boiler voorbeeld kun je zo ook instellen of je bij "dal tarief" wil naverwarmen of als je uit je werk komt genoeg warm water hebt om lekker te douchen.

(split-)Airco tips:
Overschot aan energie van zonnepanelen?
TIP 1: Een airco heb je hier ter lande alleen nodig als er heel veel zon is, dus die kan dan AAN zonder je energierekening te belasten.
TIP 2: Koude lucht zakt en warme lucht stijgt toch?! Dus één enkele airco, met voldoende vermogen, kan verdieping en begane grond koelen als je de deuren allemaal open laat staan. Bij mij thuis hangt er een split airco in een logeerkamertje op de 1e etage. Dat scheelt ook nog eens in het geruis en het tochtgevoel. Bij mij thuis werkt dat perfect en wordt het met eigen software weersafhankelijk aangestuurd (in mijn geval dus niet met de nieuwsgierige App van Midea via Amazon).
TIP 3: Als je technisch onderlegd ben, dus niet zo'n beetje een DoeHetZelf doehetzelver, dan kun je overwegen om zelf een split-airco, met voorgevulde leidingen en snelkoppelingen, te installeren. Is niet veel werk, wel eerst goed plannen: benodigde capaciteit, waar binnen en buiten unit komen en waar je de 230V aansluiting vandaan haalt. En het "vermogen" dat je zo bespaart kun je dan weer in zonnepanelen investeren.