Sida 3 av 3
Re: Domoticz motorvärmare till bilen
Postat: 22 nov 2020, 20:32
av dapersson
Ojdå, kopierade ekvationen rakt av från excel så då blev . ,
Ska vara lite jobbig men jag har möblerat om lite i koden och lagt dit item.json.result ~= nil då det blev en massa error om man inte har någon aktiv timer.
Ändringarna är inte så stora men lite mer logiska och kanske mindre buggig. T.ex flyttat avstängningen av värmare till timer funktionen istället för under HTTPResponse delen och städat lite.
Re: Domoticz motorvärmare till bilen
Postat: 29 nov 2020, 02:16
av TheeDude
dapersson skrev: 22 nov 2020, 20:32
Ojdå, kopierade ekvationen rakt av från excel så då blev . ,
Ska vara lite jobbig men jag har möblerat om lite i koden och lagt dit item.json.result ~= nil då det blev en massa error om man inte har någon aktiv timer.
Ändringarna är inte så stora men lite mer logiska och kanske mindre buggig. T.ex flyttat avstängningen av värmare till timer funktionen istället för under HTTPResponse delen och städat lite.
Jag har nu infört dessa ändringar, och provkör under dagen..
Har även försökt sätta igång motorvärmarscript #2, och har ändrat variablerna du pratade om att jag skulle ändra.
Men tyvärr så får jag inte scriptet att köra.
Loggen säger inget matnyttigt heller.
Har jag missförstått hur jag ska ändra?
Eller vad har jag missat?
Här kommer scriptet..
Kod: Markera allt
return {
on = {
timer = { 'every minute' },
httpResponses = {
'avresetid-Ida'
}
},
data = {
timeroffmotorv-Ida = { initial = 240 }, -- maximal tid vid manuell start
},
execute = function(domoticz, item)
local motorv = "test_ida_motorv" --Namnet på brytaren
local UteLudvika = domoticz.devices('Utomhustemperatur-Nord') --Namnet på temperaturgivaren indom parantes
local maxtid = 250 --Langsta tiden motorvarmare kan ga till avresea (om man ej har ordnat sina kurvor ordentligt
if (item.isTimer) then
if (domoticz.devices(motorv).state == 'Off') then
domoticz.openURL({
url = 'http://127.0.0.1:8080/json.htm?idx=47&type=timers', -- byt ip och idx=14 mot ditt ip och din dummy switch idx
method = 'GET',
callback = 'avresetid-Ida',
})
end
if(domoticz.devices(motorv).lastUpdate.minutesAgo >= domoticz.data.timeroffmotorv-Ida and domoticz.devices(motorv).state == 'On') then
domoticz.devices(motorv).switchOff()
domoticz.data.initialize('timeroffmotorv-Ida')
end
end
if (item.isHTTPResponse and item.ok and item.json.result ~= nil) then
local Time = require('Time')
local currentTime = Time()
local day = tonumber(os.date("%w"))
local past = Time( os.date("%Y-%m-%d %H:%M:%S", os.time() - 1*24*3600))
local init_tid = Time( os.date("%Y-%m-%d %H:%M:%S", os.time() + 7*24*3600 ))
local nuavresetid = Time( os.date("%Y-%m-%d %H:%M:%S", os.time() + 7*24*3600 ))
local i = 1
while item.json.result[i]
do
if (item.json.result[i]['Active'] == "true") then
if (item.json.result[i]['Days'] == 0) then
nuavresetid = Time(item.json.result[i]['Date'] .. " " .. item.json.result[i]['Time'] .. ":00")
end
if (item.json.result[i]['Days'] == 256 and day >= 1 and day <= 5) then
nuavresetid = Time(domoticz.time.rawDate .. " " .. item.json.result[i]['Time'] .. ":00")
--print(day)
end
if(currentTime.compare(nuavresetid).minutes <= currentTime.compare(init_tid).minutes and past.compare(currentTime).minutes < past.compare(nuavresetid).minutes) then
init_tid = nuavresetid
end
--print(currentTime.compare(init_tid).minutes)
--print(currentTime.compare(nuavresetid).minutes)
end
i=i+1
end
--print(UteLudvika.temperature)
local omtemp = 11 - UteLudvika.temperature
local x_plus = 0.0044*omtemp^3+0.3377*omtemp^2-1.1128*omtemp+21.496
local x_min = 0.0008*omtemp^3-0.1216*omtemp^2+10.483*omtemp-46.652
local onfor = currentTime.compare(init_tid).minutes + 20 -- +25 är tiden som den är igång efter avresetid
print ("Idas motorvärmare om plus: " .. x_plus .. " minus_temp: " .. x_min .. " omtemp: " .. omtemp)
if (UteLudvika.temperature <= 10 and UteLudvika.temperature > 0 and x_plus >= currentTime.compare(init_tid).minutes) then
domoticz.devices(motorv).switchOn()
domoticz.data.timeroffmotorv-Ida = onfor
--print("Temp: " .. UteLudvika.temperature .. " Startar nu igång: " .. onfor)
end
if (UteLudvika.temperature <= 0 and x_min >= currentTime.compare(init_tid).minutes and currentTime.compare(init_tid).minutes < maxtid) then
domoticz.devices(motorv).switchOn()
domoticz.data.timeroffmotorv-Ida = onfor
end
--print(domoticz.data.timeroffmotorv-Ida)
--print(domoticz.devices(motorv).lastUpdate.minutesAgo)
end
end
}
Re: Domoticz motorvärmare till bilen
Postat: 10 dec 2020, 20:21
av dapersson
Hej!
Ser inga uppenbara fel.. är skriptet aktivt?
Kan namnet på brytaren vara fel? det ska inte vara till dummy switch'en som innehåller timern utan till den faktiska brytaren.
local motorv = "test_ida_motorv" --Namnet på brytaren
Re: Domoticz motorvärmare till bilen
Postat: 10 dec 2020, 20:39
av dapersson
Min sambo tyckte för övrigt det var lite omständligt att lägga in dagarna genom domoticz gränsnitt så jag gjorde en lättare variant.
(index.html i en katalog på webserverdelen som lades in som en bookmark i telefonen.)
Minimalt med knappar och information.
Listar alla timers med en knapp för att radera och en för att av- eller aktivera.
Sist ett enkelt sätt att lägga till en ny timer.
(Javascript)
Byt ut idDevice och ip, och förmodligen vill ni ändra title
var idDevice = 14; // idx till dummy switch innehållande timers
var ip_jason = "
http://192.168.1.46:8060"; // Ip till domoticz
Kod: Markera allt
<!DOCTYPE html>
<html lang="sv-se">
<html>
<head>
<meta charset="utf-8">
<title>Susannes motorvärmare</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1> Timers </h1>
<p id="timers"></p>
<p> Lägg till ny timer </p>
<p id="addtime"></p>
</body>
</html>
<script type="text/javascript">
var idDevice = 14; // idx till dummy switch innehållande timers
var ip_jason = "http://192.168.1.46:8060"; // Ip till domoticz
var d = new Date();
var y = d.getFullYear();
var m = lengthdate(d.getMonth() + 1);
var day = lengthdate(d.getDate());
var h = lengthdate(d.getHours());
var min = lengthdate(d.getMinutes());
document.getElementById("addtime").innerHTML = "<input type='datetime-local' id='myLocalDate' value=" + y + "-" + m + "-" + day + "T" + h + ":" + min + ">" + "<button onclick='getDateFunction()'>Lägg till</button>"
function lengthdate(aaa){
var aa = aaa.toString();
if (aa.length < 2)
return "0" + aaa;
else
return aaa;
}
function getDateFunction() {
var x = document.getElementById("myLocalDate").value;
var reformatdate = x.split("T");
var reformattime = reformatdate[1].split(":");
addtimer(reformatdate[0], reformattime[0], reformattime[1]);
}
var getJSON = function(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'json';
xhr.onload = function() {
var status = xhr.status;
if (status === 200) {
callback(null, xhr.response);
} else {
callback(status, xhr.response);
}
};
xhr.send();
};
getJSON(ip_jason + '/json.htm?idx=' + idDevice + '&type=timers',
function(err, data) {
if (err !== null) {
alert('Something went wrong: ' + err);
} else {
var nbtimers = data.result.length;
var txt =" ";
for (i = 0; i<data.result.length; i++) {
if (i > 0){
txt = txt + "-----------------------------------------------<br>";
}
if (data.result[i].Active == "true"){
txt = txt + "Timern är Aktiv!";
}
if (data.result[i].Active == "false"){
txt = txt + "Timern är Avstängd!";
}
if (data.result[i].Days == "256")
txt = txt + "<br> Startar på vardagar"
if (data.result[i].Days == "0")
txt = txt + "<br> Datum: " + data.result[i].Date;
txt = txt + "<br> Tid: " + data.result[i].Time;
txt = txt + "<br>";
txt = txt + "<button onclick=\"document.getElementById('timers').innerHTML = removetimer(" + data.result[i].idx + ")\">Radera Timer?</button>";
if (data.result[i].Active == "true"){
txt = txt + "<button onclick=\"document.getElementById('timers').innerHTML = act_deact(2 ," + data.result[i].idx + ")\">Av-Aktivera?</button>";
}
if (data.result[i].Active == "false"){
txt = txt + "<button onclick=\"document.getElementById('timers').innerHTML = act_deact(1 ," + data.result[i].idx + ")\">Aktivera?</button>";
}
txt = txt + "<br>";
}
document.getElementById("timers").innerHTML = txt;
}
});
act_deact = function(actornot, id_timer){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("timers").innerHTML = this.responseText;
}
};
if (actornot == 2){
xhttp.open("POST", ip_jason + "/json.htm?type=command¶m=disabletimer&idx=" + id_timer, true);
}
if (actornot == 1){
xhttp.open("POST", ip_jason + "/json.htm?type=command¶m=enabletimer&idx=" + id_timer, true);
}
xhttp.send();
setTimeout(function(){ location.reload(); }, 2000);
}
removetimer = function(id_timer){
var r = confirm("Är du säker att du vill radera timern?");
if (r == true) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("timers").innerHTML = this.responseText;
}
};
xhttp.open("POST", ip_jason + "/json.htm?type=command¶m=deletetimer&idx=" + id_timer, true);
xhttp.send();
setTimeout(function(){ location.reload(); }, 2000);
} else {
setTimeout(function(){ location.reload(); }, 200);
}
}
addtimer = function(date, hour, min){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("timers").innerHTML = this.responseText;
}
};
xhttp.open("POST", ip_jason + "/json.htm?type=command¶m=addtimer&idx=" + idDevice + "&active=true&timertype=5&hour=" + hour + "&min=" + min + "&randomness=false&command=0&days=0&date=" + date + "",true);
xhttp.send();
setTimeout(function(){ location.reload(); }, 2000);
}
</script>
Re: Domoticz motorvärmare till bilen
Postat: 14 dec 2020, 08:22
av TheeDude
dapersson skrev: 10 dec 2020, 20:21
Hej!
Ser inga uppenbara fel.. är skriptet aktivt?
Kan namnet på brytaren vara fel? det ska inte vara till dummy switch'en som innehåller timern utan till den faktiska brytaren.
local motorv = "
test_ida_motorv" --Namnet på brytaren
Scriptet är aktivt!
Namnet till själva brytaren är en dummy switch som jag gjorde bara för att se om den aktiveras.
Då jag inte ville sabba hennes nuvarande script som körs, så denna styr bara en brytare som egentligen inte gör något, men det borde väl inte spela någon roll.
Problemet jag ser är väl att den inte ens kommer till det stadiet att slå på brytaren, eftersom den inte ens börjar räkna när den ska starta värmaren, eller hur länge den ska gå..
Tack för tipset med att lägga till timers, ska kolla på det!
Men tror det blir lite knepigt ihop med kalenderstyrningen jag kör med..
Jag lägger in timer i google kalendern som sedan synkas till domoticz varje timme.
Lägger jag till en ny timer i domoticz, så tas den sedan bort timmen efter.
Men det kanske går att ändra att dom finns kvar, dom som är manuellt skapade, det hade varit rätt skönt ändå, ska försöka kolla på det!