Domoticz motorvärmare till bilen

Diskussioner runt hur den tänkta funktionaliteten nås

Moderator: elf98

dapersson
Wannabe
Inlägg: 12
Blev medlem: 17 dec 2014, 21:57
Ort: Ludvika

Re: Domoticz motorvärmare till bilen

Inlägg av dapersson » 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.
TheeDude
Wannabe
Inlägg: 16
Blev medlem: 04 okt 2015, 23:14
Ort: Boden

Re: Domoticz motorvärmare till bilen

Inlägg av TheeDude » 29 nov 2020, 02:16

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
}
dapersson
Wannabe
Inlägg: 12
Blev medlem: 17 dec 2014, 21:57
Ort: Ludvika

Re: Domoticz motorvärmare till bilen

Inlägg av dapersson » 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
dapersson
Wannabe
Inlägg: 12
Blev medlem: 17 dec 2014, 21:57
Ort: Ludvika

Re: Domoticz motorvärmare till bilen

Inlägg av dapersson » 10 dec 2020, 20:39

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&param=disabletimer&idx=" + id_timer, true);
		}
	if (actornot == 1){
		xhttp.open("POST", ip_jason + "/json.htm?type=command&param=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&param=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&param=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>
TheeDude
Wannabe
Inlägg: 16
Blev medlem: 04 okt 2015, 23:14
Ort: Boden

Re: Domoticz motorvärmare till bilen

Inlägg av TheeDude » 14 dec 2020, 08:22

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!
Skriv svar