Converting a script to lua for Domoticz

Moderator: leecollings

Post Reply
Firemen112
Posts: 8
Joined: Wednesday 13 April 2016 10:06
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Converting a script to lua for Domoticz

Post by Firemen112 »

Hello,

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. :shock:

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
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

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;

float aanvoer = 0;
float retour = 0;
float temp1 = 0;
float temp2 = 0;

LiquidCrystal_I2C lcd(0x27,16,2);
/* Library te downloaden via: http://forum.hobbycomponents.com/viewto ... =39&t=1125 (wel registreren)*/

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

DeviceAddress sensor1 = { 0x10, 0x1E, 0x4F, 0xB5, 0x02, 0x08, 0x00, 0x1C };
DeviceAddress sensor2 = { 0x10, 0x21, 0x82, 0xB5, 0x02, 0x08, 0x00, 0x1B };
/* invoeren unieke adressen van de sensoren. zie onderstaande link voor tutorial en sketch.
http://www.hacktronics.com/Tutorials/ar ... inder.html */



void setup()
{
pinMode(relais,OUTPUT);
lcd.init();
sensors.begin();
sensors.setResolution(sensor1, 10);
sensors.setResolution(sensor2, 10);
lcd.begin(16,2);
lcd.clear();
}


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);
}
}
jrich523
Posts: 63
Joined: Monday 18 January 2016 21:43
Target OS: Windows
Domoticz version: 3.5196
Location: Seattle, WA
Contact:

Re: Converting a script to lua for Domoticz

Post by jrich523 »

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?)
[ Domoticz 3.5196 | Win10 | AeoTec Z-Stick Gen5 ]
Firemen112
Posts: 8
Joined: Wednesday 13 April 2016 10:06
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Converting a script to lua for Domoticz

Post by Firemen112 »

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);
}
}



Thanks in advance!
SweetPants

Re: Converting a script to lua for Domoticz

Post by SweetPants »

I'm 'playing' with some code to control my CV pump. Nothing in production at the moment, just switching a dummy sensor to see how the system reacts

Code: Select all

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
jrich523
Posts: 63
Joined: Monday 18 January 2016 21:43
Target OS: Windows
Domoticz version: 3.5196
Location: Seattle, WA
Contact:

Re: Converting a script to lua for Domoticz

Post by jrich523 »

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.
[ Domoticz 3.5196 | Win10 | AeoTec Z-Stick Gen5 ]
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest