Draadloze vermogensmeter

verwarming, isolatie, huiselijk energieverbruik

Moderator: Moderators

hanskraayeveld
Berichten: 567
Lid geworden op: 04 okt 2015, 13:49
Contacteer:

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld » 13 dec 2017, 22:25

Code: Selecteer alles

#include <ESP8266WiFi.h>

// int status = WL_IDLE_STATUS;     // the Wifi radio's status
WiFiClient client;

// domoticz
 const char * domoticz_server = "192.168.178.152"; //Domoticz ip-adres
 int port = 8080; //Domoticz port
 int idx = 51; //IDX for this virtual sensor, found in Setup -> Devices

 float temp = 5;
  
 void setup()
 {
 }

 void loop()
 {  
    printInfo();
  
    temp += 0.1;
      
    delay(60000);
 }
   
 void printInfo()
 {
    // Domoticz format /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=VALUE

    if (client.connect(domoticz_server,port)) {

        client.print("GET /json.htm?type=command&param=udevice&idx=");
        client.print(idx);
        client.print("&nvalue=0&svalue=");
        client.print(temp);
        client.println(" HTTP/1.1");
        client.print("Host: ");
        client.print(domoticz_server);
        client.print(":");
        client.println(port);
        client.println("User-Agent: Arduino-ethernet");
        client.println("Connection: close");
        client.println();
        client.stop();
     }
  }
Hier de code om met een wemos (mini), allerlei variabelen naar domoticz te zenden.
Eenvoudiger kan het niet!
Maak in domoticz een virtuele sensor aan (custom sensor).
Kijk wat het idx nummer ervan is, en verander dit in de tekst hierboven.
Verander ook het domoticz IP-adres en eventueel poort.

Maak zelf een sketch met wat je maar wilt verzenden naar domoticz.
Werkt subliem, en is rete eenvoudig.

In de sketch hierboven verzend hij elke minuut de temp vanaf 5 graden en verhoogt elke minuut met 0.1 graden.
Je vakgebied geeft geen garantie voor een heldere kijk op de zaken.

hanskraayeveld
Berichten: 567
Lid geworden op: 04 okt 2015, 13:49
Contacteer:

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld » 17 dec 2017, 13:32

Op aanraden van kockie een paar wemossen mini gekocht en geprogrammeerd.

Ik kan niet anders zeggen dan dat ik zeer tevreden over het resultaat ben. Alles is een stuk eenvoudiger geworden.
Ik heb alleen soms nog wel wat problemen met naar het board uploaden. Lijkt mij wat gevoeliger dan arduino, ik denk omdat de uploadspeed ook best hoog is 921600.

Maar goed, het werkt allemaal subliem, en het is veel eenvoudiger instellen in domoticz omdat je informatie direct naar de virtual device kan sturen!

Hier de programmacode voor de vermogensmeter met de wemos, dus via wifi:

Code: Selecteer alles

//Wemos
//Pulsin per 1 liter!!!

#include <ESP8266WiFi.h>
#include <OneWire.h> 
#include <DallasTemperature.h>

WiFiClient client;

//HIERONDER ALLES AANPASSEN NAAR UW EIGEN INSTELLINGEN!!!
const char * domoticz_server = "192.168.178.59"; //Domoticz ip address
int port = 8080; //Domoticz port
int idx = 78; //IDX for this virtual sensor, found in Setup -> Devices
int debounce = 500; // debounce in milliseconds, to avoid double count pulses (500 ms * 2 = max 60 liter per minuut!)

#define ONE_WIRE_BUS D4  //pin van de 2 data ds18b20 tempsensoren (de gele kabel)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

byte interruptPin = D3; // pin van de watermeter
byte klaar = 0;

unsigned long pulsintime1, pulsintime2, pulsintimehit, looptimepulses = 0;
unsigned long tempdif;
unsigned long kw = 0;
unsigned long whloop, whtotal, liter = 0;
float temp1, temp2 = 0;


void setup(void) 
{
  Serial.begin(115200);
  millis();
  
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, CHANGE);

  DS18B20.begin();
  DS18B20.setResolution(12);
}

void handleInterrupt() {
  if (digitalRead (interruptPin) == HIGH && klaar == 0)
     {pulsintimehit = millis(); klaar = 1;}
  
  if (digitalRead (interruptPin) == LOW && klaar == 2)
     {pulsintimehit = millis(); klaar = 3;}
}

void waterpulsemenu()
{ 
  pulsintime2 = pulsintime1;
  pulsintime1 = pulsintimehit;
  looptimepulses = (pulsintime1 - pulsintime2);;
  
  DS18B20.requestTemperatures();
  temp1 = DS18B20.getTempCByIndex(0);
  temp2 = DS18B20.getTempCByIndex(1);
  
  if (temp1 < 0){temp1 = 0.0;}
  if (temp2 < 0){temp2 = 0.0;}

  tempdif = (temp2*10 - temp1*10);
  whloop = tempdif * 1164;
  kw = (((float)whloop*36)/looptimepulses);
  whloop = whloop / 1000;
  whtotal += whloop;
  liter += 1;
  klaar = 2;

  energievermogenzenden();
  
  Serial.print("PulsInTime:   ");
  Serial.print(pulsintime1);
  Serial.print("   PulsInLapTime:   ");
  Serial.print(looptimepulses);
  Serial.print("   TempKoud:   ");
  Serial.print(temp1);
  Serial.print("   TempWarm:   ");
  Serial.print(temp2);
  Serial.print("   Liter:   ");
  Serial.print(liter);
  Serial.print("   Watt:   ");
  Serial.println(kw*10);
}
void energievermogenzenden()
{
  // Domoticz format /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=VALUE

    if (client.connect(domoticz_server,port)) {

        client.print("GET /json.htm?type=command&param=udevice&idx=");
        client.print(idx);
        client.print("&nvalue=0&svalue=");
        client.print(kw*10);
        client.print(";");
        client.print(whtotal/10);
        client.println(" HTTP/1.1");
        client.print("Host: ");
        client.print(domoticz_server);
        client.print(":");
        client.println(port);
        client.println("User-Agent: Wemos test");
        client.println("Connection: close");
        client.println();
        client.stop();
}
}


void loop(void){
   if (klaar == 1 && millis() - pulsintimehit > 500){waterpulsemenu();}
   if (klaar == 3 && millis() - pulsintimehit > 500){klaar = 0;}
  
   if (kw > 0 && millis() - pulsintime1 > (looptimepulses * 1.1)){looptimepulses = looptimepulses * 1.1; kw = kw / 1.1; energievermogenzenden();} 
   if (millis() - pulsintime1 > 600000){kw = 0; energievermogenzenden();}
}
Vergeet niet om eerst een virtual sensor aan te maken, en wel een ELEKTRA ACTUEEL + TELLER.
Dan kan je namelijk het vermogen en energie monitoren!

Kijk welk IDX nummer de aangemaakte virtual sensor heeft.
Verander dat in de programmacode hierboven, samen met het ipadres van domoticz en eventueel ook de poort.

LET OP: Het werkt NIET als je met een code in domoticz moet inloggen! Ik weet nog niet hoe ik dat voor elkaar moet krijgen, dus suggesties/oplossingen zijn welkom!

Nog een keer voor de duidelijkheid:

Benodigdheden:

Wemos mini met wifi.
2 ds18b20 tempsensoren
(eventueel met 4,7 kOhm weerstand voor zeer betrouwbare metingen)
watermeter met pulsuitgang

Voor vragen, tips, opmerkingen of suggesties: Zeg het maar, hier of via PB.

PS: de verzonden informatie via de wemos kan veel verder uitgebreidt worden!
de temperatuur van beide dallassen kunnen verzonden worden naar domoticz, en zo gemonitord worden, en eventueel dat je een email of notificatie krijg als de warm water temp boven de 80 graden komt (wat ik zelf ook heb)
De liters kunnen verstuurd worden.
En zelfs de flow!
Je vakgebied geeft geen garantie voor een heldere kijk op de zaken.

hanskraayeveld
Berichten: 567
Lid geworden op: 04 okt 2015, 13:49
Contacteer:

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld » 28 dec 2017, 13:25

Dit is het resultaat... (op mm telefoon)
Ben er best wel tevreden over...
Screenshot_20171228-131545.png
Screenshot_20171225-160141.png
Je vakgebied geeft geen garantie voor een heldere kijk op de zaken.

arjan drost
Berichten: 65
Lid geworden op: 17 jan 2010, 17:01
Locatie: Zuid Scharwoude
Contacteer:

Re: Draadloze vermogensmeter

Bericht door arjan drost » 03 jan 2018, 16:44

Dat ziet er wel heeel erg mooi uit Hans
Groet Arjan

Plaats reactie