Tvättmaskin (eller någon annan vitvara för den delen)

Post Reply
riro
Medlem
Posts: 51
Joined: 27 Mar 2017, 11:02
Location: Falun
Contact:

29 Mar 2017, 10:11

Försöker lära mig lite LUA och HC2 så detta fick bli mitt första projekt.

Ris, ros och kommentarer mottages gärna.

Code: Select all

--[[
%% properties
15 power
%% events
%% globals
--]]

-- Name of the appliance and parameter that report watts
local idAppliance = 15
local applianceParameter = "power"
-- You need to change to this id and param in the trigger-section at the top

-- Max/Min values
local wattRunning = 200
local wattStandby = 10
-- Minimum seconds to be in standby-state before sending push
local minSeconds = 300

-- Predefined variable with two values (needs to be created)
local statusVarName = "Tvattmaskin"
local statusVarValRunning = "Startad"
local statusVarValDone = "Klar"

-- Push messages to phone (needs to be created)
local idPush = {4}
local pushMessageID = "TvattmaskinKlar"

-- Extra variable (for other Push-messages), set ExtraVariable to "" to disable
local ExtraVariable = "Pushover"
local ExtraString = "Tvättmaskinen är klar;iPhone;1;echo"

-- Show debug text or not
local doDebug = true

-- =============================================================================
msgDebug = function (color, message)
  if doDebug then
  	fibaro:debug("<span style='color: " .. color .. "'>" .. message .. "</span>")
  end 
end

if (fibaro:countScenes() > 1) then
  msgDebug("Red", "Allready running - Aborting!")
  fibaro:abort()
end

local pwrAppliance = fibaro:getValue(idAppliance, applianceParameter)
local secondsSinceUpdate = os.time() - fibaro:getGlobalModificationTime(statusVarName)
msgDebug("Gray", "Using " .. pwrAppliance .. " watts, status is " .. fibaro:getGlobal(statusVarName) .. " the last " .. tostring(secondsSinceUpdate) .. " seconds")

if (tonumber(pwrAppliance) > wattRunning) then
  msgDebug("Yellow", "Usage is " .. pwrAppliance .. " watts, settings status to " .. statusVarValRunning)
  fibaro:setGlobal(statusVarName, statusVarValRunning);
elseif ( (tonumber(pwrAppliance) < wattStandby) and (fibaro:getGlobal(statusVarName) ~= statusVarValDone) ) then
  if (secondsSinceUpdate > minSeconds) then
    msgDebug("White", "Usage below " .. wattStandby .. " watts for " .. tostring(secondsSinceUpdate) .. " seconds")
    if (fibaro:getGlobal(statusVarName) == statusVarValRunning) then
      msgDebug("Green", "State is " .. statusVarValRunning .. " and usage is below " .. tostring(wattStandby) .. " for more than  " .. tostring(minSeconds) .. " seconds")

      for loop,Push in pairs(idPush) do
        msgDebug("Green", "Sending push message " .. tostring(pushMessageID) .. " to devcie " .. tostring(Push))
        fibaro:call(Push, "sendDefinedPushNotification", pushMessageID)
      end

      if (string.len(ExtraVariable) > 1) then
        msgDebug("Green", "Setting variable '" .. ExtraVariable .. "' = '" .. ExtraString .. "'")
        fibaro:setGlobal(ExtraVariable,ExtraString)
      end

      msgDebug("Yellow", "Setting state to  " .. statusVarValDone)
      fibaro:setGlobal(statusVarName, statusVarValDone);
    end

  else
    msgDebug("Orange", "To few seconds (prevent flapping and spamming)")
  end
end
-- =============================================================================
riro
Medlem
Posts: 51
Joined: 27 Mar 2017, 11:02
Location: Falun
Contact:

29 Mar 2017, 10:13

Kan tillägga att jag har ett schema som triggar scenen en gång var 5'e minut...
RH_Dreambox
Proffsmedlem
Posts: 883
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

29 Mar 2017, 12:03

Kan tillägga att jag har ett schema som triggar scenen en gång var 5'e minut...
Visst är det kul att göra egna scener, men det finns färdiga sådana på forumet också :-)
Här är ett exempel som inte triggas av någon extra scen och som även räknar ut energiförbrukningen.

Code: Select all

--[[
%% properties
66 power
%% events
%% globals
--]]

fibaro:debug(" SCENE START ")
if fibaro:countScenes() > 1 then
fibaro:debug(" SCENE ABORT - too many instances ")
fibaro:abort()
end

local currentDate = os.date("*t");
local power = fibaro:getValue(66, "power") -- monitored unit 
local washOn = "washOn" -- create a variable WashOn 
local washDone = "washDone" -- create a variable WashDone 
local washMail = "washMail" -- create a variable WashMail 
 
fibaro:debug("Tvättmaskinscriptet har aktiverats: " .. os.date()); 
fibaro:debug("Effektförbrukningen just nu = "..power.." Watt") 

if ( tonumber(fibaro:getValue(66, "power")) > 300 ) then -- 200Watt change to wanted value in watt 
fibaro:setGlobal(washOn, "1") -- sets variable to 1 if machine is running 
fibaro:setGlobal(washDone, "0") -- sets variable WashDone to 0 
fibaro:setGlobal(washMail, "0") -- sets variable WashMail to 0 
fibaro:debug("Tvättmaskinen har startats") -- lite debug text :) 
 
elseif ( tonumber(fibaro:getValue(66, "power")) < 2 ) then 
fibaro:debug("Tvätten är klar.") 
fibaro:setGlobal(washOn, "0") 
fibaro:setGlobal(washDone, "1") -- Tvätten är klar! 
 
end 
if ( tonumber(fibaro:getValue(66, "power")) < 2 ) and fibaro:getGlobalValue(washDone) == "1" and fibaro:getGlobalValue(washMail) == "0" then 
  
   fibaro:sleep(150*1000) -- 120 sec delay
  if ( tonumber(fibaro:getValue(66, "power")) < 2 ) then
 fibaro:setGlobal(washMail, "1")
  fibaro:debug("Skicka E-mail")

energi=tonumber(fibaro:getValue(66, "energy"))
--fibaro:getGlobal("WashEnergy", energistart)
    local energistart = tonumber(fibaro:getGlobalValue("washEnergy", energistart))
local energitot = energi - energistart
local energitot = energitot - energitot % 0.01
--wind = wind - wind % 0.1 ger en decimal, wind = wind - wind % 0.01 ger två decimaler osv.    

    local subject = "Tvätten klar.".." Förbunkade "..energitot.." kW"
local message = "Tvätten blev klar kl." .." ".. string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min).." och energiförbrukningen blev "..energitot.." kW"
--local message = "Tvätten var klar klockan" .." ".. tonumber("%02d", currentDate.hour) .. ":" .. tonumber("%02d", currentDate.min.." och förbrukade "..energi.." kW")
fibaro:setGlobal("washEnergy", energi)

    fibaro:call(69, "sendEmail", subject, message) -- YH
	fibaro:call(70, "sendEmail", subject, message) -- RH
   	fibaro:call(49, "sendPush", subject, message) -- RH Mobil

    fibaro:debug("Mail är skickade till RH och YH")
    
  end 
end

2 st HC2 4.520, Recovery-stickorna ligger i skrivbordslådan nu!
riro
Medlem
Posts: 51
Joined: 27 Mar 2017, 11:02
Location: Falun
Contact:

29 Mar 2017, 14:15

RH_Dreambox wrote:
Kan tillägga att jag har ett schema som triggar scenen en gång var 5'e minut...
Visst är det kul att göra egna scener, men det finns färdiga sådana på forumet också :-)
Här är ett exempel som inte triggas av någon extra scen och som även räknar ut energiförbrukningen.
Intressant ide med energiförbrukningen... den ska jag nog stjäla.

Orsaken till extra scenen är följande scenario (ovetande om det egenligen kan hända):
1. Maskinen tvättar - Hög effekt
2. Maskinen stannar till i programmet - Låg effekt
3. Maskinen tävttar igen - Hög effekt
4. Standby - Låg effekt
5. Standby på samma effekt = ingen trigger

"Jag" behöver en trigger en stund (300 sek) efter den har gått ner på standby för att inte råka trigga en notifiering när 2'an händer.
Går väl säkerligen att komma runt genom att finslipa tröskelvärdena... men jag har en annan ide som jag jobbar på, återkommer eventuellt med en snyggare lösning. :P
RH_Dreambox
Proffsmedlem
Posts: 883
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

29 Mar 2017, 16:57

Bara det fungerar som det är tänkt så är det ju OK.
I mitt fall har jag en fördröjning på 150 sek. Om förbrukningen fortfarande ligger under lägsta värdet (2 watt) efter 150 sek så anses tvätten vara klar. Luckan hinner då öppnas i lagom tid till när man kommer ned till tvättstugan.
2 st HC2 4.520, Recovery-stickorna ligger i skrivbordslådan nu!
dadid
Medlem
Posts: 86
Joined: 29 Jan 2013, 16:32

08 Apr 2017, 22:17

Följande scen fungerade bra initialt. Efter en firmwareuppgradering av HC2:an stoppas den pga "to many instances".
Jag är inte bekant med vad det innebär och hur jag bör lösa det. Vore tacksam för guidning:

--[[
%% autostart
%% properties
27 power
%% globals
--]]
local power_socket = 27
local powerlive = tonumber(fibaro:getValue(power_socket, "power")) -- monitored unit
fibaro:debug("Förbrukning = "..powerlive.." Watt")
if (fibaro:countScenes()>1)
then
fibaro:abort();
end
local run = 0
--local power_socket = 27
local currentDate = os.date("*t");
local power = fibaro:getValue(power_socket, "power")
local counter = 0

if ( tonumber(fibaro:getValue(power_socket, "power")) > 60 ) and run == 0 then
local start = (os.time())
fibaro:debug("Tvättmaskin startad")
fibaro:debug("Förbrukning = "..power.." Watt")
run = 1
end


while run == 1 do

if ( tonumber(fibaro:getValue(power_socket, "power")) < 4) then
counter = counter + 1
local power2 = fibaro:getValue(power_socket, "power")
fibaro:debug('counter = ' ..counter.. " : "..power2.."Watt")
end
if ( tonumber(fibaro:getValue(power_socket, "power")) > 4 ) then
counter = 0
end
if ( tonumber(fibaro:getValue(power_socket, "power")) < 4) and counter > 60 then
fibaro:debug("Tvättmaskin klar.")
local power3 = fibaro:getValue(power_socket, "power")
fibaro:debug("Förbrukning 3 = "..power3.." Watt")
fibaro:debug("Skicka meddelande")
fibaro:call(138,"sendPush", " Tvättmaskinen är klar" )
fibaro:call(167,"sendPush", " Tvättmaskinen är klar" )
-- fibaro:call(138, "sendDefinedPushNotification", "9");
run = 0
end

--fibaro:sleep(1000)
end
]
RH_Dreambox
Proffsmedlem
Posts: 883
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

09 Apr 2017, 08:52

Testa med att flytta upp kontrollen av antal instances överst i koden. Då stoppas dubblett-scener innan scen-koden börjar bearbetas.

Code: Select all

--[[
%% autostart
%% properties
27 power
%% globals
--]]

if (fibaro:countScenes() > 1) then
  fibaro:abort();
end
Den här funktionen med kontroll av instances har funnits med ett bra tag nu, så uppdaterade du från en väldigt tidig version eftersom du inte hade problemen tidigare?
2 st HC2 4.520, Recovery-stickorna ligger i skrivbordslådan nu!
dadid
Medlem
Posts: 86
Joined: 29 Jan 2013, 16:32

14 Apr 2017, 13:07

Tack. Det löste problemet med to many instances.
Vid körning av scriptet verkar allt nu helt ok.
Dock kommer inget meddelande till våra telefoner. Har nog bytt ut båda telefonerna sedan scriptet ursprungligen lades in. Minns inte hur man väljer id. Tycker mig ha letat, men inte funnit råd.


Skickat från min iPad med Tapatalk
riro
Medlem
Posts: 51
Joined: 27 Mar 2017, 11:02
Location: Falun
Contact:

14 Apr 2017, 15:44

http://ip:80/api/devices är en bra början (eller så går du via http://ip/docs så får du lite mer lättläst)
dadid
Medlem
Posts: 86
Joined: 29 Jan 2013, 16:32

17 Apr 2017, 08:39

Hej. Erkänner mitt tillkortakommande. Jag vet inte vad jag skall göra med ovanstående tips rörande enhetslista.


Skickat från min iPad med Tapatalk
RH_Dreambox
Proffsmedlem
Posts: 883
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

17 Apr 2017, 11:11

Kolla med hjälp av HC2 Toolkit, där hittar du dem lätt.
http://www.zwaveforum.se/viewtopic.php? ... kit#p19227
Attachments
Mobil.PNG
Mobil.PNG (9.82 KiB) Viewed 2576 times
2 st HC2 4.520, Recovery-stickorna ligger i skrivbordslådan nu!
Post Reply