Wemos D1 met ESP Easy uitlezen smartmeter lukt niet


Een scoop blijft toch een onmisbaar instrument he...

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ik zou de link van Skysoft nog even goed doorlezen, ik zag iets van 115200 baud...

Op 28 november 2019 21:25:36 schreef K7Jz:
5 direct naar D5 en pullup R2 van 10k.

Een simpel programmaatje dat D5 leest en print op de console is toch zo gemaakt? D5 met Weerstand naar + of - en kijken of het werkt.

Mijn programmeer kennis is helaas minimaal ;) maar je tip met de pull up zal ik zeker proberen.

Ik heb inmiddels de wemos geflasht naar de nieuwste versie van Espeasy en die heeft nu ook de mogelijkheid om een GPIO pin te selecteren. Vanavond weer even verder prutsen.

@marcob: aan de hand van die handleiding heb ik dit ook opgezet. Mooie site is dat met veel info!

Waar rook is, is stroom

Update: ik heb de verbinding nu rechtstreeks met een pullup van 10K. Nu knippert er ook elke 10 seconden een led dus dat is positief. Vervolgens een scope aangesloten en die laat een keurige databurst zien die niet geinverteerd is. Dus je kunt zeggen dat de wemos wel signaal krijgt uit de meter maar er kennelijk (door mijn fouten?) niets mee doet. Putty reageert niet en ook domoticz zegt dat hij geen signaal ontvangt. En omdat dat gebeurt verbreekt hij ook de verbinding om die vervolgens weer te herstellen.

Ik heb D5 aan GPIO 14. Als ik een andere GPIO pin gebruik knippert de led niet meer. Ook als ik in espeasy een andere GPIO kies reageert de led niet. Ik ga er dus van uit dat GPIO 14 standaard wordt aangestuurd door deze sketch.

Waar rook is, is stroom

Post je sketch eens.

Welke led knippert? Zit je gewoon de led te voeden vanuit de P1? ;)

Software is ESP_Easy_mega-20191123_normal_ESP8266_4M1M.bin met daarin de sketch Communication - P1 Wifi Gateway

De led die knippert is de SCK. Die knippert als P1 Wifi Gateway enabled is maar niet als ik bijvoorbeeld serial server inschakel dus ik denk niet dat het door de voedingsspanning komt (alhoewel dat goed mogelijk was natuurlijk)

Ik heb al verscheidene espeasy projectjes gemaakt en bijna allemaal zonder gedoe maar deze weet me wel te boeien :-)

Hier de sketch die standaard in de espeasy flash file zit:

#ifdef USES_P044
//#################################### Plugin 044: P1WifiGateway ########################################
//
// based on P020 Ser2Net, extended by Ronald Leenes romix/-at-/macuser.nl
//
// designed for combo
// Wemos D1 mini (see http://wemos.cc) and
// P1 wifi gateway shield (see https://circuits.io/circuits/2460082)
// see http://romix.macuser.nl for kits
//#######################################################################################################

#define PLUGIN_044
#define PLUGIN_ID_044 44
#define PLUGIN_NAME_044 "Communication - P1 Wifi Gateway"
#define PLUGIN_VALUENAME1_044 "P1WifiGateway"

#define P044_STATUS_LED 12
#define P044_BUFFER_SIZE 1024
#define P044_NETBUF_SIZE 128
#define P044_DISABLED 0
#define P044_WAITING 1
#define P044_READING 2
#define P044_CHECKSUM 3
#define P044_DONE 4

boolean Plugin_044_init = false;
boolean serialdebug = false;
char* Plugin_044_serial_buf = nullptr;
unsigned int bytes_read = 0;
boolean CRCcheck = false;
unsigned int currCRC = 0;
int checkI = 0;

WiFiServer *P1GatewayServer = nullptr;
WiFiClient P1GatewayClient;

// Fixme TD-er: Reverted to old implementation for now.
// This one has been reverted in https://github.com/letscontrolit/ESPEasy/pull/2352
// Since both plugins (P020 and P044) are almost identical in handling serial data.
// However that version of P044 had a number of other fixes which may be very useful anyway.

boolean Plugin_044(byte function, struct EventStruct *event, String& string)
{
boolean success = false;
static byte connectionState = 0;
static int state = P044_DISABLED;

switch (function)
{

case PLUGIN_DEVICE_ADD:
{
Device[++deviceCount].Number = PLUGIN_ID_044;
Device[deviceCount].Type = DEVICE_TYPE_SINGLE;
Device[deviceCount].Custom = true;
Device[deviceCount].TimerOption = false;
break;
}

case PLUGIN_GET_DEVICENAME:
{
string = F(PLUGIN_NAME_044);
break;
}

case PLUGIN_GET_DEVICEVALUENAMES:
{
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_044));
break;
}

case PLUGIN_WEBFORM_LOAD:
{
addFormNumericBox(F("TCP Port"), F("p044_port"), ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
addFormNumericBox(F("Baud Rate"), F("p044_baud"), ExtraTaskSettings.TaskDevicePluginConfigLong[1]);
addFormNumericBox(F("Data bits"), F("p044_data"), ExtraTaskSettings.TaskDevicePluginConfigLong[2]);

byte choice = ExtraTaskSettings.TaskDevicePluginConfigLong[3];
String options[3];
options[0] = F("No parity");
options[1] = F("Even");
options[2] = F("Odd");
int optionValues[3] = { 0, 2, 3 };
addFormSelector(F("Parity"), F("p044_parity"), 3, options, optionValues, choice);

addFormNumericBox(F("Stop bits"), F("p044_stop"), ExtraTaskSettings.TaskDevicePluginConfigLong[4]);

// FIXME TD-er: Why isn't this using the normal pin selection functions?
addFormPinSelect(F("Reset target after boot"), F("taskdevicepin1"), Settings.TaskDevicePin1[event->TaskIndex]);

addFormNumericBox(F("RX Receive Timeout (mSec)"), F("p044_rxwait"), Settings.TaskDevicePluginConfig[event->TaskIndex][0]);

success = true;
break;
}

case PLUGIN_WEBFORM_SAVE:
{
ExtraTaskSettings.TaskDevicePluginConfigLong[0] = getFormItemInt(F("p044_port"));
ExtraTaskSettings.TaskDevicePluginConfigLong[1] = getFormItemInt(F("p044_baud"));
ExtraTaskSettings.TaskDevicePluginConfigLong[2] = getFormItemInt(F("p044_data"));
ExtraTaskSettings.TaskDevicePluginConfigLong[3] = getFormItemInt(F("p044_parity"));
ExtraTaskSettings.TaskDevicePluginConfigLong[4] = getFormItemInt(F("p044_stop"));
Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("p044_rxwait"));

success = true;
break;
}

case PLUGIN_INIT:
{
pinMode(P044_STATUS_LED, OUTPUT);
digitalWrite(P044_STATUS_LED, 0);

LoadTaskSettings(event->TaskIndex);
if ((ExtraTaskSettings.TaskDevicePluginConfigLong[0] != 0) && (ExtraTaskSettings.TaskDevicePluginConfigLong[1] != 0))
{
#if defined(ESP8266)
byte serialconfig = 0x10;
#endif
#if defined(ESP32)
uint32_t serialconfig = 0x8000010;
#endif
serialconfig += ExtraTaskSettings.TaskDevicePluginConfigLong[3];
serialconfig += (ExtraTaskSettings.TaskDevicePluginConfigLong[2] - 5) << 2;
if (ExtraTaskSettings.TaskDevicePluginConfigLong[4] == 2)
serialconfig += 0x20;
#if defined(ESP8266)
Serial.begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1], (SerialConfig)serialconfig);
#endif
#if defined(ESP32)
Serial.begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1], serialconfig);
#endif
if (P1GatewayServer)
{
P1GatewayServer->close();
delete P1GatewayServer;
}
P1GatewayServer = new WiFiServer(ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
P1GatewayServer->begin();

if (!Plugin_044_serial_buf)
Plugin_044_serial_buf = new char[P044_BUFFER_SIZE];

if (Settings.TaskDevicePin1[event->TaskIndex] != -1)
{
pinMode(Settings.TaskDevicePin1[event->TaskIndex], OUTPUT);
digitalWrite(Settings.TaskDevicePin1[event->TaskIndex], LOW);
delay(500);
digitalWrite(Settings.TaskDevicePin1[event->TaskIndex], HIGH);
pinMode(Settings.TaskDevicePin1[event->TaskIndex], INPUT_PULLUP);
}

Plugin_044_init = true;
}

blinkLED();

if (ExtraTaskSettings.TaskDevicePluginConfigLong[1] == 115200) {
addLog(LOG_LEVEL_DEBUG, F("P1 : DSMR version 4 meter, CRC on"));
CRCcheck = true;
} else {
addLog(LOG_LEVEL_DEBUG, F("P1 : DSMR version 4 meter, CRC off"));
CRCcheck = false;
}

state = P044_WAITING;
success = true;
break;
}

case PLUGIN_EXIT:
{
if (P1GatewayServer) {
P1GatewayServer->close();
delete P1GatewayServer;
P1GatewayServer = NULL;
}
if (Plugin_044_serial_buf) {
delete[] Plugin_044_serial_buf;
}
success = true;
break;
}

case PLUGIN_TEN_PER_SECOND:
{
if (Plugin_044_init)
{
if (P1GatewayServer->hasClient())
{
if (P1GatewayClient) P1GatewayClient.stop();
P1GatewayClient = P1GatewayServer->available();
P1GatewayClient.setTimeout(CONTROLLER_CLIENTTIMEOUT_DFLT);
addLog(LOG_LEVEL_ERROR, F("P1 : Client connected!"));
}

if (P1GatewayClient.connected())
{
connectionState = 1;
uint8_t net_buf[P044_NETBUF_SIZE];
int count = P1GatewayClient.available();
if (count > 0)
{
size_t net_bytes_read;
if (count > P044_NETBUF_SIZE)
count = P044_NETBUF_SIZE;
net_bytes_read = P1GatewayClient.read(net_buf, count);
Serial.write(net_buf, net_bytes_read);
Serial.flush(); // Waits for the transmission of outgoing serial data to complete

if (count == P044_NETBUF_SIZE) // if we have a full buffer, drop the last position to stuff with string end marker
{
count--;
// and log buffer full situation
addLog(LOG_LEVEL_ERROR, F("P1 : Error: network buffer full!"));
}
net_buf[count] = 0; // before logging as a char array, zero terminate the last position to be safe.
char log[P044_NETBUF_SIZE + 40] = {0};
sprintf_P(log, PSTR("P1 : Error: N>: %s"), (char*)net_buf);
ZERO_TERMINATE(log);
addLog(LOG_LEVEL_DEBUG, log);
}
}
else
{
if (connectionState == 1) // there was a client connected before...
{
connectionState = 0;
addLog(LOG_LEVEL_ERROR, F("P1 : Client disconnected!"));
}

while (Serial.available())
Serial.read();
}

success = true;
}
break;
}

case PLUGIN_SERIAL_IN:
{
if (Plugin_044_init)
{
if (P1GatewayClient.connected())
{
int RXWait = Settings.TaskDevicePluginConfig[event->TaskIndex][0];
if (RXWait == 0)
RXWait = 1;
int timeOut = RXWait;
while (timeOut > 0)
{
while (Serial.available() && state != P044_DONE) {
if (bytes_read < P044_BUFFER_SIZE - 5) {
char ch = Serial.read();
digitalWrite(P044_STATUS_LED, 1);
switch (state) {
case P044_DISABLED: //ignore incoming data
break;
case P044_WAITING:
if (ch == '/') {
Plugin_044_serial_buf[0] = ch;
bytes_read=1;
state = P044_READING;
} // else ignore data
break;
case P044_READING:
if (ch == '!') {
if (CRCcheck) {
state = P044_CHECKSUM;
} else {
state = P044_DONE;
}
}
if (validP1char(ch)) {
Plugin_044_serial_buf[bytes_read] = ch;
bytes_read++;
} else if (ch=='/') {
addLog(LOG_LEVEL_DEBUG, F("P1 : Error: Start detected, discarded input."));
Plugin_044_serial_buf[0] = ch;
bytes_read = 1;
} else { // input is non-ascii
addLog(LOG_LEVEL_DEBUG, F("P1 : Error: DATA corrupt, discarded input."));
Serial.flush();
bytes_read = 0;
state = P044_WAITING;
}
break;
case P044_CHECKSUM:
checkI ++;
if (checkI == 4) {
checkI = 0;
state = P044_DONE;
}
Plugin_044_serial_buf[bytes_read] = ch;
bytes_read++;
break;
case P044_DONE:
// Plugin_044_serial_buf[bytes_read]= '\n';
// bytes_read++;
// Plugin_044_serial_buf[bytes_read] = 0;
break;
}
}
else
{
Serial.read(); // when the buffer is full, just read remaining input, but do not store...
bytes_read = 0;
state = P044_WAITING; // reset
}
digitalWrite(P044_STATUS_LED, 0);
timeOut = RXWait; // if serial received, reset timeout counter
}
delay(1);
timeOut--;
}

if (state == P044_DONE) {
if (checkDatagram(bytes_read)) {
Plugin_044_serial_buf[bytes_read] = '\r';
bytes_read++;
Plugin_044_serial_buf[bytes_read] = '\n';
bytes_read++;
Plugin_044_serial_buf[bytes_read] = 0;
P1GatewayClient.write((const uint8_t*)Plugin_044_serial_buf, bytes_read);
P1GatewayClient.flush();
addLog(LOG_LEVEL_DEBUG, F("P1 : data send!"));
blinkLED();

if (Settings.UseRules)
{
LoadTaskSettings(event->TaskIndex);
String eventString = getTaskDeviceName(event->TaskIndex);
eventString += F("#Data");
rulesProcessing(eventString);
}

} else {
addLog(LOG_LEVEL_DEBUG, F("P1 : Error: Invalid CRC, dropped data"));
}

bytes_read = 0;
state = P044_WAITING;
} // state == P044_DONE
}
success = true;
}
break;
}

}
return success;
}
void blinkLED() {
digitalWrite(P044_STATUS_LED, 1);
delay(500);
digitalWrite(P044_STATUS_LED, 0);
}
/*
validP1char
checks whether the incoming character is a valid one for a P1 datagram. Returns false if not, which signals corrupt datagram
*/
bool validP1char(char ch) {
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '.') || (ch == '!') || (ch == ' ') || (ch == 92) || (ch == 13) || (ch == '\n') || (ch == '(') || (ch == ')') || (ch == '-') || (ch == '*') || (ch == ':') )
{
return true;
} else {
addLog(LOG_LEVEL_DEBUG, F("P1 : Error: invalid char read from P1"));
if (serialdebug) {
serialPrint(F("faulty char>"));
serialPrint(String(ch));
serialPrintln("<");
}
return false;
}
}

int FindCharInArrayRev(char array[], char c, int len) {
for (int i = len - 1; i >= 0; i--) {
if (array == c) {
return i;
}
}
return -1;
}

/*
CRC16
based on code written by Jan ten Hove
https://github.com/jantenhove/P1-Meter-ESP8266
*/
unsigned int CRC16(unsigned int crc, unsigned char *buf, int len)
{
for (int pos = 0; pos < len; pos++)
{
crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc

for (int i = 8; i != 0; i--) { // Loop over each bit
if ((crc & 0x0001) != 0) { // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
}
else // Else LSB is not set
crc >>= 1; // Just shift right
}
}

return crc;
}

/* checkDatagram
checks whether the P044_CHECKSUM of the data received from P1 matches the P044_CHECKSUM attached to the
telegram
based on code written by Jan ten Hove
https://github.com/jantenhove/P1-Meter-ESP8266
*/
bool checkDatagram(int len) {
int startChar = FindCharInArrayRev(Plugin_044_serial_buf, '/', len);
int endChar = FindCharInArrayRev(Plugin_044_serial_buf, '!', len);
bool validCRCFound = false;

if (!CRCcheck) return true;

if (serialdebug) {
serialPrint(F("input length: "));
serialPrintln(String(len));
serialPrint("Start char \\ : ");
serialPrintln(String(startChar));
serialPrint(F("End char ! : "));
serialPrintln(String(endChar));
}

if (endChar >= 0)
{
currCRC = CRC16(0x0000, (unsigned char *) Plugin_044_serial_buf, endChar - startChar + 1);

char messageCRC[5];
strncpy(messageCRC, Plugin_044_serial_buf + endChar + 1, 4);
messageCRC[4] = 0;
if (serialdebug) {
for (int cnt = 0; cnt < len; cnt++)
serialPrint(String(Plugin_044_serial_buf[cnt]));
}

validCRCFound = (strtoul(messageCRC, NULL, 16) == currCRC);
if (!validCRCFound) {
addLog(LOG_LEVEL_DEBUG, F("P1 : Error: invalid CRC found"));
}
currCRC = 0;
}
return validCRCFound;
}
#endif // USES_P044

Waar rook is, is stroom

Waar zie je het signaal niet geïnverteerd staan, na de tor, dus wat de ESP in gaat? Die tor is een inverter he, weet je dat?
Een uart signaal moet in rust '1' zijn, en pas '0' worden bij het 1e startbit van het P1 bericht uit de meter.

[Bericht gewijzigd door flipflop op 30 november 2019 12:47:41 (31%)]

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Dubbel

[Bericht gewijzigd door K7Jz op 30 november 2019 14:13:43 (97%)]

c code:


//maak deze true, dan zou je wat via de USB seriële poort binnem moeten krijgen 
boolean serialdebug = true;


if (bytes_read < P044_BUFFER_SIZE - 5) {
char ch = Serial.read();
serialPrint("have read char:"); // deze 3 regels toevoegen 
serialPrint(String(ch));
serialPrintln(".");

[Bericht gewijzigd door K7Jz op 30 november 2019 14:12:28 (13%)]

Op 30 november 2019 12:46:27 schreef flipflop:
Waar zie je het signaal niet geïnverteerd staan, na de tor, dus wat de ESP in gaat? Die tor is een inverter he, weet je dat?
Een uart signaal moet in rust '1' zijn, en pas '0' worden bij het 1e startbit van het P1 bericht uit de meter.

De tor zit er niet meer tussen op advies van soldeersmurf en K7Jz. Ik heb 5 nu rechtstreeks aan D5 met een pullup van 10K. Volgens het scope beeld is de databurst niet geinverteerd.

Waar rook is, is stroom

Bedankt voor de link ! Mqtt lukt met domoticz.

Heb je een tip om een signaal aan te bieden aan (bijvoorbeeld) GPIO 14 van de wemos om te kijken of hij zowiezo wel data wil versturen? Ik zag iets van een seriele kabel vanaf een pc maar ik weet niet hoe ik dat moet aansluiten of misschien een ander methode? Ik krijg steeds meer het idee dat die meter wel data verstuurt maar dat de wemos er niets mee doet. Ik heb wel meerdere projectjes met een esp8266 gemaakt en die werkten bijna altijd gelijk goed.

Nogmaals bedankt voor de hulp en ik ga die skectch uit de link erop zetten.

Waar rook is, is stroom

Als je een treintje ziet met scope én flitsende led elke 10s dan moet de ESP ook iets zien natuurlijk.

Heb je de code ook met ingesprongen regels. Tussen

code:

 [code] en [ backslash code] 

zetten en even opnieuw posten.

[Bericht gewijzigd door K7Jz op 1 december 2019 13:06:17 (39%)]

Op 1 december 2019 12:50:57 schreef K7Jz:
Als je een treintje ziet met scope én flitsende led elke 10s dan moet de ESP ook iets zien natuurlijk.

Heb je de code ook met ingesprongen regels. Tussen

code:

 [code] en [ backslash code] 

zetten en even opnieuw posten.

Is dat debuggen gelukt? Zie je meldingen in je log server óf seriele console?

Op 1 december 2019 12:50:57 schreef K7Jz:
Heb je de code ook met ingesprongen regels. Tussen

code:

 [code] en [ backslash code] 

zetten en even opnieuw posten.

Als ik het post zijn de ingesprongen regels weg maar hier staat een goede versie.

Het debuggen ben ik nog niet aan toegekomen.

Overigens heb ik geprobeerd de MQTT ino te compilen maar hij geeft een foutmelding doordat een update van de ESP8266 board manager ver. 2.6.0 de boel in de war schopt. Zie deze link

Waar rook is, is stroom

Ik heb de wemos nu rechtstreeks aan de pc hangen met putty als serial monitor en de slimme meter aangesloten en nu krijg ik dit:

1622726 : Info : WD : Uptime 27 ConnectFailures 0 FreeMem 19888 WiFiStatus 3
1652726 : Info : WD : Uptime 28 ConnectFailures 0 FreeMem 20080 WiFiStatus 3
1682726 : Info : WD : Uptime 28 ConnectFailures 0 FreeMem 20080 WiFiStatus 3
1696983 : Info : SaveToFile: free stack: 3296
1697041 : Info : FILE : Saved config.dat
1697042 : Info : SaveToFile: free stack after: 3296
1712726 : Info : WD : Uptime 29 ConnectFailures 0 FreeMem 20080 WiFiStatus 3
1742726 : Info : WD : Uptime 29 ConnectFailures 0 FreeMem 20080 WiFiStatus 3
enz.

Haal ik GPIO 14 (D5) los dan geeft putty ook geen data meer. Als ik de baudrate verander in espeasy bij Communication - P1 Wifi Gateway dan verandert de data output in putty ook, die staat nu op 9600, N, 8, 1. Hij leest de meter dus niet maar geeft zijn eigen status info.

Ik ben er eigenlijk wel klaar mee, dit wordt een gebed zonder eind :-)

Waar rook is, is stroom

Heb je wel de juiste P1 meter ingesteld? Niet alle meters zijn hetzelfde.
Baudrate van de meter kun je exact achterhalen door met je scoop de bittijden te meten. Hoef je niet te gissen.
Verder kan er eigenlijk niet zoveel mis zijn :-)

ps, ik heb zelf een python scriptje op een RPi lopen die de meter uitleest en de data via MQTT naar Domoticz stuurt. Zoiets kun je ook met een ESPxx doen. Misschien toch maar zelf firmware schrijven? Dat debugt alvast wat handiger.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ik ben niet zo handig in programmeren ;-) dus ik moet het van bestaande projecten hebben. En omdat die ESP dingetjes erg handig zijn leek mij dat wel een mooi plan, ook omdat ik 2 van die dingen in een domoticz setup heb en die werken verder perfect.

Om nog even op de wemos terug te komen: het lijkt erop dat als je GPIO 14 hoog maakt hij zijn eigen log verstuurt, want als je de draad eraf trekt is dat gelijk voorbij. Alleen doet hij dat niet OTA maar over usb. En het gekke is dat als je de serial settings in de config van de P1 sketch (of plugin) verander dat dat invloed heeft op de data die de wemos verstuurt.

Ik bestel een wemos mini erbij en kijken wat daar mee kan want zo moeilijk kan het niet zijn. In ieder geval bedankt voor de hulp van iedereen in deze thread want ik heb weer veel opgestoken !

Waar rook is, is stroom

Misschien kun je beter je vraag stellen op het ESPEasy forum. Daar zitten o.a. de mensen die de software hebben geschreven. Ik verwacht namelijk niet dat er iets fout zit in ESPeasy firmware, je bent zeker niet de eerste die dit gebruikt.

Een WOK is ook maar een vergiet zonder gaatjes

Zet zeker die serialdebug op 1 als je p1 en pc aansluit. Dat de led knippert betekent dat hij iets ontvangt, maar door verkeerde parity/speed instellingen is het waarschijnlijk niet leesbaar. Ook inverteer je nu niet zoals met de transistor.

Op 1 december 2019 20:21:13 schreef marcob:
Misschien kun je beter je vraag stellen op het ESPEasy forum. Daar zitten o.a. de mensen die de software hebben geschreven. Ik verwacht namelijk niet dat er iets fout zit in ESPeasy firmware, je bent zeker niet de eerste die dit gebruikt.

Dat is een goede tip inderdaad!

@K7Jz: ik kan geen aanpassingen doen in die sketch omdat ik de complete .bin file flash met esp tool. Het zou wel kunnen maar dan moet ik de files compilen en daar gaat het steeds fout met Arduino.

Ik ga mijn licht eens opsteken op het espeasy forum en ik bestel een wemos d1 mini erbij. In ieder geval bedankt voor jullie hulp!

Waar rook is, is stroom

Ik heb al een tijdje een ESP8266 in de meterkast hangen. Het leek mij leuk hier een keer een PCBtje voor te tekenen. Zoiets wordt het:
https://i.imgur.com/n7Mr5GM.png

Een simpel 1op1 6p6c kabeltje in de P1 en het zou moeten werken.

http://domoticx.com/wp-content/uploads/2018/01/ESMRv5.0-P1-schematic.png

Het idee is dat die direct vanuit de DSMR word gevoed. Volgens de "P1 Companion Standard Dutch Smart Meter Requirements" zou dit moeten kunnen:

code:

The P1 interface must provide stable +5V DC power supply via “+5V” (pin 1) and “Power
GND” (pin 6) lines.
“+5V” voltage and its tolerances are defined as follows:
- Nominal voltage UL = 5,0 V
- Maximum voltage allowed UL_MAX <= 5,5 V at IL = 0 mA
- Minimum voltage allowed UL_MIN >= 4,9 V at IL = IL_CONT = 250 mA

Ik heb er voor gekozen een kleine buck converter er bij op te zetten om vanuit de 5V van de meter naar 3.3v van de AIThinker ESP-12s te gaan. Als backup kan die altijd gevoed worden vanuit een externe 5V voeding, kwestie van jumpertje omzetten.

Op de ESP-12s kan ESP-Easy draaien. Ik stuur de seriele data door naar Domotics. En als het goed is past di in dit doosje.

Heb ik ook geprobeerd, maar werkte niet. Is een ESP32, ook met Wifi.

Probleem was dat die af en toe een piek trekt van meer dan 200mA, en de voeding in de meter gaat dan in fold-back. Met als gevolg dat de ESP32 regelmatig ging resetten.

Dikke condensator erbij helpt niet.
Aparte voeding wel. Daarmee loopt het al maanden zonder problemen.

Volgende project wordt een nieuwe voeding met voldoende reserve voor de ESP32 en stroom begrenzing vanuit P1. Misschien zelfs een lithium batterij als buffer.

Op 10 januari 2020 17:30:19 schreef deKees:
Heb ik ook geprobeerd, maar werkte niet. Is een ESP32, ook met Wifi.

Probleem was dat die af en toe een piek trekt van meer dan 200mA, en de voeding in de meter gaat dan in fold-back. Met als gevolg dat de ESP32 regelmatig ging resetten.

Dikke condensator erbij helpt niet.
Aparte voeding wel. Daarmee loopt het al maanden zonder problemen.

Volgende project wordt een nieuwe voeding met voldoende reserve voor de ESP32 en stroom begrenzing vanuit P1. Misschien zelfs een lithium batterij als buffer.

Ik gebruik een buck, had jij dat ook? 250mA/3.3v pieken van 5V naar 3v3 met 95% eff. kom ik op ongeveer 175mA pieken. dat is al een stuk netter.

Verder zet ik de maximale TX wat lager, want dat heb ik helemaal niet nodig. Standaard doet die die pieken van 170mA op +17dB, maar op +13dB is die al een stuk rustiger met 120mA. Aldus de datasheet.

[Bericht gewijzigd door Mrtn1988 op 10 januari 2020 18:21:30 (13%)]

PCB is vandaag binnengekomen. Morgen komt de buck binnen die er op moet, dan hopen dat die het doet.

Ik heb helaas nergens meer kunnen vinden waar je de TX power in ESP-EASY Kan aanpassen. Wel het e.e.a. via AT commando's. Iemand een idee?

[Bericht gewijzigd door Mrtn1988 op 22 januari 2020 18:37:44 (17%)]