Dat ging niet vlekkeloos, vind het behoorlijk ingewikkeld.
Toch heb ik wel een paar goede stappen in de richting gemaakt vind ik zelf.
Zoals velen wellicht weten heb ik een arduino met touchscreen die de opbrengst van mijn houtkachel meet.
Nu wilde ik in domoticz "zien"
Het is uiteindelijk gelukt en het resultaat mag er wezen! (schouderklop)
Mijn arduino heeft draadloos verbinding met mijn raspberry pi.
Kan ook gebruikt worden om de opbrengst van je zonneboiler te meten en monitoren.
Wat zijn de benodigdheden?
Een raspberry pi met domoticz en een 433.92 ontvanger.
Een arduino, 2 ds18b20 temperatuursensoren, een 4,7Kohm weerstand, een watermeter met pulsuitgang (per liter), en een 433 mhz transmitter
En deze schets:
Code: Selecteer alles
//Arduino vermogensmeter
//Arduino Uno
//2x ds18b20
//4,7 kOhm weerstand
//433 mHz transmitter
//Puls per 1 liter!
//libraries kunnen via google gedownload worden, onewire, dallas en x10rf
#include <OneWire.h>
#include <DallasTemperature.h>
#include <x10rf.h>
#define tx 2 //pin 2 op de data van de transmitter
#define reps 5
#define ONE_WIRE_BUS 12 //pin 12 verbinden met de 2 data kabels van ds18b20 tempsensoren (de gele kabel)
x10rf myx10 = x10rf(tx,0,reps);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
byte inPin = 10; // pin van de watermeter
byte waterpulsesensor;
byte klaar = 0;
unsigned long pulsintime1, pulsintime2, looptimepulses = 0;
unsigned long tempdif;
unsigned long kw, wattage = 0;
unsigned long whloop, whtotal = 0;
float temp1, temp2 = 0;
ISR (PCINT0_vect)
{
if (digitalRead (inPin) == HIGH && klaar == 0)
{pulsintime1 = millis(); klaar = 1;}
if (digitalRead (inPin) == LOW && klaar == 2)
{pulsintime1 = millis(); klaar = 3;}
}
void setup(void)
{
pinMode(inPin, INPUT_PULLUP);
digitalWrite(inPin, HIGH);
PCMSK0 |= bit (PCINT2); // pin 10 arduino mega
PCIFR |= bit (PCIF0); // clear any outstanding interrupts
PCICR |= bit (PCIE0); // enable pin change interrupts for D8 to D13
millis();
DS18B20.begin();
DS18B20.setResolution(12);
myx10.begin();
Serial.begin(9600);
}
void waterpulsemenu()
{
looptimepulses = (pulsintime1 - pulsintime2);
pulsintime2 = pulsintime1;
DS18B20.requestTemperatures();
temp1 = DS18B20.getTempCByIndex(0);
temp2 = DS18B20.getTempCByIndex(1);
if (temp1 < -100){temp1 = 0.0;}
if (temp2 < -100){temp2 = 0.0;}
tempdif = (temp2*10 - temp1*10);
whloop = tempdif * 1164;
kw = (((float)whloop*36)/looptimepulses);
whloop = whloop / 1000;
whtotal += whloop;
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(" TempDiff ");
Serial.print(tempdif);
Serial.print(" Kw ");
Serial.println(kw);
}
void energievermogenzenden()
{
myx10.RFXmeter(100,0,whtotal/10);
myx10.RFXmeter(101,0,kw*10);
}
void loop(void)
{
if (klaar == 1 && millis() - pulsintime1 > 500){waterpulsemenu();}
if (klaar == 3 && millis() - pulsintime1 > 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();}
}
Noem degene die het vermogen zend 'Power' en degene die de energie zend 'Energy'.
Dan maak je in domoticz een virtual sensor aan van electriciteit. Noem de virtuele sensor 'PowerEnergy'.
Kijk welk idx nummer je VIRTUELE sensor heb, en verander die in de onderstaande tekst.
Dan ga je naar de lua map in domoticz en upload je deze tekst en sla die op als "script_device_vermogensmeter.lua"
Code: Selecteer alles
--Domoticz Script to get medium actual power and energy between energy counter readings and puts it on a dummy device
--First create a dummy energy meter.
--Then enter the details below
--Name of the real energy and power counter
energyCounter = 'Energy'
powerCounter = 'Power'
--Name of the created dummy energy meter with the new actual value
dummyPowerEnergyMeter = 'PowerEnergy'
--ID of the created dummy energy meter with the new actual value
dummyEnergyMeterid = 12
commandArray = {}
if devicechanged[powerCounter] then
--update dummy energy meter
commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. otherdevices_svalues[powerCounter] .. ";" .. otherdevices_svalues[energyCounter]}
print(dummyEnergyMeter .. ": " .. otherdevices_svalues[powerCounter] .. " W, " .. otherdevices_svalues[energyCounter] .. " Wh")
end
return commandArray