Já encontraste o que querias no meu GitHub?
ainda não encontrei só a parte do grafico mas nao a parte do mqtt
config/config_files/packages/package_electrical_consumption.yam
ja encontreo obrigado . Já agora eu tenho bi diario a nive de luz sabes como poderia fazer isso?
adicionei OTA para flasharem e a sugestao do Jorge, em teste
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoOTA.h>
#include <SDM.h> //import SDM template library
//SDM<2400, 12, 13> sdm; //SDM120T baud, rx pin, tx pin
//SDM<4800, 12, 13> sdm; //SDM120C baud, rx pin, tx pin
//SDM<9600, 12, 13> sdm; //SDM630 baud, rx pin, tx pin
//or without parameters (default from SDM.h will be used):
SDM<2400, 12, 13, 4> sdm;
float m = 0;
char charBuf[50];
String s;
const char* ssid = "SSID"; // Wifi SSID
const char* password = "PASSWORD"; // Wifi password
const char* mqttClientName = "sdm120"; //will also be used hostname and OTA name
IPAddress ip(192,168,1,25); // IP address
IPAddress dns(8,8,8,8); // DNS server
IPAddress gateway(192,168,1,254); // Gateway
IPAddress subnet(255,255,255,0); // Subnet mask
const char* mqtt_server = "192.168.1.132";
#define mqtt_user "user"
#define mqtt_password "password"
int MQTT_WILL_QOS = 1; // MQTT last will QoS (0,1 or 2)
int MQTT_WILL_RETAIN = 1; // MQTT last will retain (0 or 1)
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Serial.begin(115200); //initialize serial
sdm.begin(); //initalize SDM220 communication baudrate
//----------- OTA
ArduinoOTA.setHostname(mqttClientName);
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_SPIFFS
type = "filesystem";
}
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
delay(1000);
ESP.restart();
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
}
void setup_wifi() {
delay(10);
// config static IP
Serial.print(F("Setting static ip to : "));
Serial.println(ip);
WiFi.config(ip, gateway, subnet, dns);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is acive low on the ESP-01)
} else {
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("SDM120",mqtt_user,mqtt_password,"sdm120/status", 2, 0, "0")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("sdm120/status", "1");
// ... and resubscribe
client.subscribe("inTopic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
//handle OTA
ArduinoOTA.handle();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
delay(5000);
s = String(sdm.readVal(SDM220T_VOLTAGE));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/volt", charBuf);
Serial.print("Voltage: ");
Serial.print(s);
Serial.println(" V");
}
delay(50);
s = String(sdm.readVal(SDM220T_CURRENT));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/curr", charBuf);
Serial.print("Current: ");
Serial.print(s);
Serial.println(" A");
}
delay(50);
s = String(sdm.readVal(SDM220T_POWER));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/pow", charBuf);
Serial.print("Power: ");
Serial.print(s);
Serial.println(" W");
}
delay(50);
s = String(sdm.readVal(SDM220T_ACTIVE_APPARENT_POWER));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/act_app_pow", charBuf);
Serial.print("Active apparent power: ");
Serial.print(s);
Serial.println(" VA");
}
delay(50);
s = String(sdm.readVal(SDM220T_REACTIVE_APPARENT_POWER));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/react_app_pow", charBuf);
Serial.print("Active apparent power: ");
Serial.print(s);
Serial.println(" VAR");
}
delay(50);
s = String(sdm.readVal(SDM220T_POWER_FACTOR));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/pow_factor", charBuf);
Serial.print("Power factor: ");
Serial.print(s);
Serial.println(" ");
}
delay(50);
s = String(sdm.readVal(SDM220T_PHASE_ANGLE));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/phase_angle", charBuf);
Serial.print("Phase angle: ");
Serial.print(s);
Serial.println(" Degree");
}
delay(50);
s = String(sdm.readVal(SDM220T_FREQUENCY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/freq", charBuf);
Serial.print("Frequency: ");
Serial.print(s);
Serial.println(" Hz");
}
delay(50);
s = String(sdm.readVal(SDM220T_TOTAL_ACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/tot_act_en", charBuf);
Serial.print("Total active energy: ");
Serial.print(s);
Serial.println(" Wh");
}
delay(50);
s = String(sdm.readVal(SDM220T_TOTAL_REACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/tot_react_en", charBuf);
Serial.print("Total reactive energy: ");
Serial.print(s);
Serial.println(" Wh");
}
delay(50);
s = String(sdm.readVal(SDM220T_IMPORT_ACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/import_act_en", charBuf);
Serial.print("Import active energy: ");
Serial.print(s);
Serial.println(" Wh");
}
delay(50);
s = String(sdm.readVal(SDM220T_EXPORT_ACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/export_act_en", charBuf);
Serial.print("Export active energy: ");
Serial.print(s);
Serial.println(" Wh");
}
delay(50);
s = String(sdm.readVal(SDM220T_IMPORT_REACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/import_react_en", charBuf);
Serial.print("Import reactive energy: ");
Serial.print(s);
Serial.println(" VARh");
}
delay(50);
s = String(sdm.readVal(SDM220T_EXPORT_REACTIVE_ENERGY));
if (s != "nan") {
s.toCharArray(charBuf, 50);
client.publish("sdm120/export_react_en", charBuf);
Serial.print("Export reactive energy: ");
Serial.print(s);
Serial.println(" VARh");
}
yield();
Serial.println("----------------------------------------");
}
//wait a while before next loop
}
yield(); nao funcionou, ja perdi ligação wifi, ja me ultrapassa este problema
IP dinamico ou fixo? O router tem alguma regra para esse IP?
esta fixo, e o router nao tem nada, não me acontece so a mim, ou é do codigo ou é de usar o max485 por algum motivo.
A mim nunca fiquei sem wifi experimenta mudar o ip já agora o ip do teu router é 192.168.1.254 ? O meu para é de publicar mqtt
O meu para de dar mas n perco o wifi ele para é de publicar o mqtt!
Retirei o “yield();” e meti o “delay(30000);” a ver se isso resolve o meu problema de parar de publicar mqtt pois o meu medemcu nunca ficou sem wifi
Minto o meu aguentou 14 horas e falhou as 13:00 em ponto o que é no mínimo estranho. Cá para mim temos de criar um reboot a cada x horas para pelo menos remediar.
Ao início pensei que tivesse ficado bom mas agora também estou a ter problemas de não publicar no mqtt. Com o Fx aparecem todos os mqtt á excepção do sdm.
o problema do mqtt é o que me acontece se tentar compilar com uma versao do arduino ide sem ser a que o Rodolfo colocou no inicio do topico, aparentemente a versao da libraria que ele publicou esta de acordo com o codigo que ele tb colocou.
acabou de chegar o rs 485 “normal” mas nem sei se desisto ja deste codigo ou se ainda insisto mais um bocado e tento de alguma forma chegar a bom porto.
outra coisa, ainda nao me safei nos totalizadores do jorge, por algum motivo nao consigo fazer reset diariamente aos consumos diarios :S
A que o Roberto artilhou tem o mesmo stress
E dizeres que não consegues por o ficheiro do HA com OS totalizadores a funcionar é normal. O nome dos sensores mqtt é diferente. Eu estou a alterar os namings e entretanto partilho o código corrigido bem como o calculador de amperes usa o valor fixo de voltagem mas no meu caso nem preciso do cálculo visto que tenho leitura de amperes, watts, voltagem frequência e mais uma cenas que ainda não sei para que é
Just figured out, it´s a bug in the new ESP8266 Arduino core libraries v2.4.0…
I recently updated from 2.4.0-rc2 to 2.4.0 and only had these issues after that. Now downgraded again, recompiled and everything seems to work now.
More info here:
esp8266/Arduino#4166
esp8266/Arduino#4161
Bem carreguei o ficheiro do @Nuno_Figueiredo no weemos, notei que as actualizações de valores são um pouco mais lentas e outra coisa, como o meu sdm tem um icone que assinala comunicação notei que com o ficheiro ide que vem no inicio do post o respectivo simbolo ficava sempre ligada, agora ele de 4 em 4 segundo connecta e desconecta do weemos. Apenas reparei e achei engraçado a diferença do codigo nisso.
Desliguei o broker no HA.
Mal liguei o mosquitto novamente ele reconnectou…
Estranho… vou deixar mais umas horas a ver se vai ter mais algum bug
ja tens ai algum automatismo a fazer leituras diarias e mensais?