I have a Lue script for de Wemos.
But i want it to use for Domoticz.
is it possible to convert it to a lua script. I am a moob in prograaming lua.
Thanks to Erwin Lokhorst for the sketch
/* Regeling tbv pomp vloerverwarming.
Bij een watertemperatuur van 40C en hoger EN een verschil in temperatuur tussen aanvoer en retour van 4C of meer,
gaat de pomp van de vloerverwarming draaien.
Komt de temperatuur hier onder, dan zal de pomp nog 10 minuten blijven doordraaien en daarna uitschakelen.
Voor de periode buiten het stookseisoen: Als er langere tijd geen warmte aanvoer van de CV is,
zal de pomp na ca elke 8 uur toch voor ca 10 minuten gaan draaien om te voorkomen dat deze vast kan komen te zitten.
Welke sensor op de aanvoer en welke op de retour van de cv zit wordt automatisch bepaald.
/*
/* De data van beide sensoren zit op PIN 2. Het relais wordt aangestuurd via PIN 8.
En voor de lcd geldt:
DEVICE PINOUT (SPI Interface):
PIN 1: GND
PIN 2: +5V
PIN 3: SDA - Connect to Arduino analogue PIN 4
PIN 4: SCL - Connect to Arduino analogue PIN 5
*/
int relais = 8;
int temp_status = 0;
int teller; // teller voor nalooptijd
int nalooptijd;
word pauzeteller; // teller voor pomp uit tijd
int pomppauze; // tijd in min dat de pomp uit is
int pomp_status;
void loop()
{
lcd.backlight(); // backlight lcd aan
delay(2000);
lcd.clear();
sensors.requestTemperatures(); // lezen van de sensoren.
float temp1 = sensors.getTempC(sensor1);
float temp2 = sensors.getTempC(sensor2);
if (temp1 == -127.00) { // bij een defect of losraken van een van de sensoren volgt en error.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Error: sensor 1)");
}
if (temp2 == -127.00) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Error: sensor 2)");
}
if (temp1 >= temp2) { // kijkt welke van de twee sensoren de hoogste temperatuur meet,
aanvoer = temp1; // dit is dan de "aanvoer" en de lagere de "retour".
retour = temp2;
} else {
aanvoer = temp2;
retour = temp1;
}
lcd.clear();
lcd.setCursor(0,0); // geeft de temperatuur van beide sensoren aan op de lcd.
lcd.print("Aanvoer: ");
lcd.print(aanvoer);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("Retour : ");
lcd.print(retour);
lcd.print(" C");
delay(2000); // er is twee keer een delay van 2 sec = totaal 4 sec per cyclus.
if (temp1 > 39.00 || temp2 > 39.00) { // indien meer dan 39C gemeten (ketel brandt)
temp_status = 1; // voldoende warmte aanvoer om pomp te laten draaien
pomp_status = 1;
} else {
if (aanvoer - retour > 4) { // indien meer dan 4C verschil
temp_status = 1; // voldoende warmte aanvoer om pomp te laten draaien
pomp_status = 1;
} else {
temp_status = 0; // te weinig warmte aanvoer om pomp te laten draaien
pomp_status = 0;
}
}
if (temp_status == 1) { // zo lang er voldoende warmte aanvoer is
teller = 150; // de teller hog zetten voor nalooptijd pomp. ( 150 * 4 = 600 sec = 10 min)
} else {
if (teller > 0) { // tot zo lang de teller nog niet op 0 staat
--teller; // dan loopt de teller af met 1 (4 seconden per keer ivm 2 x delay2000)
nalooptijd = teller / 15; // nalooptijd wordt berekend door de counter te delen door 15 = xxx minuten
pomp_status = 1; // Pompstatus wordt hoog omdat de pomp nog wel zo lang moet blijven draaien
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pomp gaat uit.");
lcd.setCursor(0,1);
lcd.print("Nalooptijd: ");
lcd.print(nalooptijd);
lcd.print("min"); // weergave op lcd hoelang de pomp nog naloopt.
} else { // geen warmteaanvoer en de teller(nalooptijd) is terug op 0 dan
pomp_status = 0; //hoeft de pomp niet meer te draaien
}
if (temp_status == 0 && teller == 0) { // als er geen warmte aanvoer is EN counter is terug gelopen naar 0
++pauzeteller; // dan loopt deze teller met 4sec per keer op (2x delay 2000ms)
pomppauze = pauzeteller / 15; // de 4 sec vertraging weer corrigeren voor weergave op lcd AANPASSEN (= omrekenen naar minuten)
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pomp is uit");
lcd.setCursor(0,1);
lcd.print("voor: ");
lcd.print(pomppauze);
lcd.print(" min"); //weergave op lcd hoelang de pomp uit is.
pomp_status = 0; //pomp hoeft niet te draaien
}
if (pauzeteller >= 7200 && pauzeteller <= 7350) { // Pomp moet nu voor 10 minuten draaien *per ca 8 uur) om te voorkomen dat deze vast kan gaan zitten
pomp_status = 1; // Pompstatus wordt hoog omdat deze moet gaan draaien.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pomp draait voor");
lcd.setCursor(0,1);
lcd.print(" 10 min");
}
if (pauzeteller == 7350) {
pomp_status = 0; // de pomp hoeft niet meer te draaien
pauzeteller = 0; // teller resetten op 0
}
}
if (pomp_status == 1) { // pomp aan of uitzetten
digitalWrite(relais,HIGH);
} else {
digitalWrite(relais,LOW);
}
}
This looks a whole lot like arduino code used to build a basic weather station and not at all LUA. Also there is nothing in this code that would send it to an external system. Basically it jsut reads the temp sensor and display it on the LCD.
What is your goal?
What are you working with? (arduino i assume?)
I'd like to get a Lua script for reading out two temperature sensors applied to my floor heating. These got to have a few values to turn off and on a virtual switch.(klik aan, klik uit)
Below is a code which I'd like to add to Domoticz:
delay(2000); // er is twee keer een delay van 2 sec = totaal 4 sec per cyclus.
if (temp1 > 39.00 || temp2 > 39.00) { // indien meer dan 39C gemeten (ketel brandt)
temp_status = 1; // voldoende warmte aanvoer om pomp te laten draaien
pomp_status = 1;
} else {
if (aanvoer - retour > 4) { // indien meer dan 4C verschil
temp_status = 1; // voldoende warmte aanvoer om pomp te laten draaien
pomp_status = 1;
} else {
temp_status = 0; // te weinig warmte aanvoer om pomp te laten draaien
pomp_status = 0;
}
}
if (temp_status == 1) { // zo lang er voldoende warmte aanvoer is
teller = 150; // de teller hog zetten voor nalooptijd pomp. ( 150 * 4 = 600 sec = 10 min)
} else {
if (teller > 0) { // tot zo lang de teller nog niet op 0 staat
--teller; // dan loopt de teller af met 1 (4 seconden per keer ivm 2 x delay2000)
nalooptijd = teller / 15; // nalooptijd wordt berekend door de counter te delen door 15 = xxx minuten
pomp_status = 1; // Pompstatus wordt hoog omdat de pomp nog wel zo lang moet blijven draaien
} else { // geen warmteaanvoer en de teller(nalooptijd) is terug op 0 dan
pomp_status = 0; //hoeft de pomp niet meer te draaien
}
if (temp_status == 0 && teller == 0) { // als er geen warmte aanvoer is EN counter is terug gelopen naar 0
++pauzeteller; // dan loopt deze teller met 4sec per keer op (2x delay 2000ms)
pomppauze = pauzeteller / 15; // de 4 sec vertraging weer corrigeren voor weergave op lcd AANPASSEN (= omrekenen naar minuten)
pomp_status = 0; //pomp hoeft niet te draaien
}
if (pauzeteller >= 7200 && pauzeteller <= 7350) { // Pomp moet nu voor 10 minuten draaien *per ca 8 uur) om te voorkomen dat deze vast kan gaan zitten
pomp_status = 1; // Pompstatus wordt hoog omdat deze moet gaan draaien.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pomp draait voor");
lcd.setCursor(0,1);
lcd.print(" 10 min");
}
if (pauzeteller == 7350) {
pomp_status = 0; // de pomp hoeft niet meer te draaien
pauzeteller = 0; // teller resetten op 0
}
}
if (pomp_status == 1) { // pomp aan of uitzetten
digitalWrite(relais,HIGH);
} else {
digitalWrite(relais,LOW);
}
}
logging = true
function log (level, message)
file = io.open("/ram/domoticz.log", "a")
file:write(string.format("%s %-5s: LUA : %s\n", os.date("%m/%d/%Y %I:%M:%S %p"),level, message))
io.close(file)
end
AfterOff = 900
CV_TEMP_OUT = 'CV_Temp_out'
CV_TEMP_IN = 'CV_Temp_in'
CV_POMP = 'Dummy Pomp'
commandArray = {}
PumpOn = tonumber(uservariables['PumpOn'])
-- if one of the sensor temps changed, do our thing
if ( devicechanged[CV_TEMP_OUT] or devicechanged[CV_TEMP_IN] ) then
time = os.time() -- Current time (integer sec)
dt_in = otherdevices[CV_TEMP_IN] -- Get in temp
dt_out = otherdevices[CV_TEMP_OUT] -- Get out temp
dt = dt_out - dt_in -- calculate diff
if (logging) then log("INFO",string.format("t_out %.2f t_in %.2f dt %.2f pump: %s OnTime: %d", dt_out, dt_in, dt, otherdevices[CV_POMP], time-PumpOn)) end
-- if temp difference > 1 degree celcius, immediatly tunr on Pump
if (dt > 1) then
-- update time we last turned "On" the pump
PumpOn = os.time()
if (otherdevices[CV_POMP] == "Off") then
commandArray[CV_POMP] = "On"
end
else
-- must me lower/equal 1 degree, see if minimum pump "On" time exeeded
if ( (os.time() - PumpOn) >= AfterOff ) then
if (otherdevices[CV_POMP] == "On") then
commandArray[CV_POMP] = "Off"
end
end
end
end
commandArray['Variable:PumpOn'] = tostring(PumpOn)
return commandArray
SweetPants has the right idea, thats actually LUA.
Fireman112 - thats Arudino code, in order to get the Arudino to report to Domoticz you'll need to do one of a few things
1) MySensors.org - I played with this a bit and i had a lot of problems with the radio and its power source, im starting to think its because i had cheap chinese arudio's
2) Serial - you can plug the arudino in to a PC and send data via the serial port and then on the PC forward it on to Domoticz, this is probably the easiest method and i've done this before
3) Get a Pi - I've found it WAY easier to program the Pi's, there is a library out there to make it easier and Node is pretty simple
However, I will say if you are struggling to find the difference between LUA and Arudino's C, then you might be a bit over your head and I think the language barrier might make it even harder.