commit ec2a3ced70df1e42d5b9d9667d38bbaecd3ca485 Author: Filip Date: Mon Jan 13 21:08:01 2020 +0100 first commit diff --git a/powermeter.ino b/powermeter.ino new file mode 100644 index 0000000..dc2dd47 --- /dev/null +++ b/powermeter.ino @@ -0,0 +1,205 @@ +#include "ESP8266WiFi.h" +#include +#include "RemoteDebug.h" +#include +#include +#include "myconfig.h" +WiFiClient espClient; +PubSubClient client(espClient); +#define HOST_NAME "remotedebug" +RemoteDebug Debug; + + +long lastMsg = 0; +char msg[50]; +int value = 0; + +const int sensor=A0; +const int referenceval=190; +int maxValue; +int minValue=255; +unsigned long count; +unsigned long resetcount; +const int diff=50; +int high=0; + +void setup_wifi() { + // Connect to WiFi + WiFi.setSleepMode(WIFI_NONE_SLEEP); + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) + { + delay(500); + Serial.print("*"); + } + + Serial.println(""); + Serial.println("WiFi connection Successful"); + Serial.print("The IP Address of ESP8266 Module is: "); + Serial.print(WiFi.localIP());// Print the IP address +} + +void setup(void) +{ + pinMode(BUILTIN_LED, OUTPUT); + Serial.begin(115200); + setup_wifi(); + client.setServer(mqttbroker,mqttport); + client.setCallback(callback); + + // Port defaults to 8266 + // ArduinoOTA.setPort(8266); + + // Hostname defaults to esp8266-[ChipID] + // ArduinoOTA.setHostname("myesp8266"); + + // No authentication by default + // ArduinoOTA.setPassword("admin"); + + // Password can be set with it's md5 value as well + // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 + // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); + + + 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"); + }); + 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(); + Serial.println("Ready"); + Serial.print("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 active 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..."); + // Create a random client ID + String clientId = "ESP8266Client-power"; + //clientId += String(random(0xffff), HEX); + // Attempt to connect + if (client.connect(clientId.c_str(), "mqtt", "3dgRMrAXzj2AWVH2")) { + Serial.println("connected"); + // Once connected, publish an announcement... + //client.publish("outTopic", "hello world"); + // ... 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(1000); + } + } +} + +void getsensorvalue(int sensorvalue) { + //int sensorvalue=analogRead(sensor); + + //Serial.println(analogRead(sensor)); + if ( sensorvalue > maxValue ) { + maxValue=sensorvalue; + } + if ( sensorvalue < minValue ) { + minValue=sensorvalue; + } + + if ( sensorvalue >= referenceval && high == 0) { + count++; + resetcount++; + Serial.println("HIGH - Min: "+ String(minValue) +", current: "+ String(sensorvalue) + ",Max: "+ String(maxValue) + ", Counter: " + count ); + high=1; + } + else if (sensorvalue <= referenceval - diff && high == 1) { + Serial.println("LOW - Min: "+ String(minValue) +", current: "+ String(sensorvalue) + ",Max: "+ String(maxValue) + ", Counter: " + count ); + high=0; + } +} + + +void loop() +{ + ArduinoOTA.handle(); + + + + //long now = millis(); + //if (now - lastMsg > 4000) { + // lastMsg = now; + // ++value; + // snprintf (msg, 50, "hello world #%ld", value); + // Serial.print("Publish message: "); + // Serial.println(msg); + + //} + + getsensorvalue(analogRead(sensor)); + //Serial.println("LOW - Min: "+ String(minValue) +", current: "+ String(sensorvalue) + ",Max: "+ String(maxValue) + ", Counter: " + count ); + long now = millis(); + if (now - lastMsg > 60000 ) { + if (WiFi.status() != WL_CONNECTED){ + WiFi.reconnect(); + } + if (!client.connected()) { + reconnect(); + } + //float kwh=0; + //kwh=count/100; + lastMsg = now; + snprintf (msg, 50, "{\"pulse\": %ld, \"kwh\": %.2f }", count,float(resetcount)/float(100)); + resetcount=0; + client.publish("hass/sensor/sensor_powermeter/state", msg); + + //delay(20); //wait for data to be published. + } + + client.loop(); + // EMPTY +}