Verlichting inschakelen als je thuis bent

In mijn vorige blogpost heb je kunnen lezen hoe je je smartphone toevoegt aan Domoticz op basis van of je thuis bent of niet. In deze post laat ik je zien hoe je je verlichting inschakelt als je thuis bent in je smarthome.

Aanwezigheidsdetectie in het kort


In je huis heb je je eigen WiFi netwerk waarin je router IP-adressen uitdeelt aan ieder verbonden apparaat. Als je verbonden smartphone altijd hetzelfde ip-adres krijgt, kun je dus zien of dat apparaat op een bepaald moment binnenshuis is. In de vorige blogpost heb je één of meerdere smartphones aangemaakt in Domoticz op basis van een Dummy device. Zodra je smartphone te pingen is binnen het netwerk gaat deze dummy switch aan. Hierop gaan we nu verder werken.

Het maakt niet uit of je van het simpele ping script gebruikt maakt of van de meer geavanceerde presence detection methode.

Verlichting inschakelen als er iemand thuis is

Je lampen kun je aansluiten op een draadloze schakelset van bijvoorbeeld Promax, Flamingo of KlikAanKlikUit in combinatie met een RFXcom. Hoe dat in zijn werk gaat lees in je in ‘in  1 minuut draadloze schakelaars in Domoticz‘. Heb je dat (al) werkend dan gaan we een nieuwe ‘gebeurtenis’ maken in Domoticz. Ik vind script meer het juiste woord, maar dat terzijde.

  1. Maak een nieuwe UserVariable aan met de naam NiemandThuisTeller van het type integer.
  2. Maak een nieuwe dummy switch aan met de naam IemandThuis
  3. Maak een nieuw script aan via Instellingen -> Meer opties -> Gebeurtenissen

Maak een nieuw Lua Time type script en geef het een naam of vul je ping script aan met onderstaande code.

function DevicePing(ip, device)
    ping_success=""
    ping_success=os.execute('ping -c1 -w1 ' .. ip)
    if ping_success then
        print("ping success " ..device)
        DeviceOnOff('On',device)
    else
        print("ping fail " ..device)
        DeviceOnOff('Off',device)
    end
 
end

function DeviceOnOff(Action, device)
    
    for deviceName,deviceValue in pairs(otherdevices) do
        if (deviceName==device) then
            if deviceValue == Action then
                print(tostring(device) .." staat al ".. tostring(Action))
            else
                commandArray[device] = Action
                print(tostring(device) .." " ..tostring(Action).. "  gezet")
            end
       end
    end
end
    


commandArray = {}

 print("*****************   start pingen     *******************")
 DevicePing('IP ADRES','APPARAATNAAM')
 DevicePing('IP ADRES','Chromecast')
 DevicePing('8.8.8.8','Internet')
print("*****************   end pingen     *******************") 

print ("****** Iemand Thuis *******")

 if (otherdevices['SMARTPHONE1'] == 'On' or otherdevices['SMARTPHONE2'] == 'On') then
            print("Er is iemand thuis")
            DeviceOnOff("On","Iemand Thuis")
            commandArray['Variable:NiemandThuisTeller']=tostring(0)

            
    elseif (otherdevices['SMARTPHONE1'] == 'Off' and otherdevices['SMARTPHONE2'] == 'Off') then
            -- hier niet iemandthuis uitzetten, maar alleen de var laten optellen 
            commandArray['Variable:NiemandThuisTeller'] = tostring(tonumber(uservariables['NiemandThuisTeller']) + 1)
            print("Er is al ") 
            print (tostring(tonumber(uservariables['NiemandThuisTeller']) + 1))
            print (" minuten niemand thuis")
    end


-- je moet minimaal 15 minuten uit bereik zijn
    if (tonumber(uservariables['NiemandThuisTeller']) > 15) then 
        
        print ("Er is meer dan een kwartier niemand thuis. Iemand thuis is nu 0")
        DeviceOnOff("Off","Iemand Thuis")
    end
    
print ("****** end Iemand Thuis *******")

Binnen de code staat al de nodige uitleg. Pas alleen de SMARTPHONE 1, 2 en de IP adressen aan.

Dit script pingt steeds de ingevoerde smartphones of andere apparaten. Zolang het apparaat antwoord, blijft de smartphonedummy aan en staat Iemand Thuis ook aan.


Als de apparaten niet te pingen zijn, schakelt het script de smartphonedummy uit. Maar het laat de dummyswitch Iemand Thuis aan totdat een kwartier lang de smartphones niet meer te pingen zijn. Het kwartier word bijgehouden in de NiemandThuisTeller. Het script wordt iedere minuut uitgevoerd waardoor de waarde steeds met 1 wordt opgehoogd. Iemand Thuis zal uit gaan en op basis van die gebeurtenis kun je je verlichting of verwarming lager schakelen.

Je kunt de tijd naar wens verhogen of verlagen. Let wel op dat veel smartphones na een bepaalde tijd in stroombesparingsmodus gaan en je een tijdje niet kunt pingen. Bij mij blijkt een kwartier te kort en 20 minuten tot een half uur prima.

Het werkt!

Als je alles juist ingevuld hebt gaan de lampen automatisch aan en uit op basis van je aanwezigheid. Zodra je het huis verlaat, blijft de verlichting nog even aan totdat je langer dan een kwartier weg bent.

 

Heb je vragen, is het gelukt of kom je er niet uit? Laat een reactie achter!

9 Replies to “Verlichting inschakelen als je thuis bent”

  1. Hallo Wouter,

    Script werkt uitstekend, maar mijn Samsung S7 geeft geen reactie op een ping als het scherm is uitgeschakeld. Ik heb WiFi altijd aan staan, ook in slaapstand.
    Enig idee of suggestie?

    André

    1. Beste André,

      Ik hoor dit probleem vaker. Heb er zelf ook last van. Je kunt er jammer genoeg weinig aan doen. Android probeert gewoon batterij te besparen.

      Er is nog een mogelijkheid met behulp van nmap. Omdat ik domoticz gebruik op een synology nas en die geen nmap ondersteund heb ik er geen ervaring mee. http://blog.quindorian.org/2015/02/domoticz-bash-script-for-presence-detection-using-nmap.html/ . dat zou je nog kunnen proberen.

      Succes

      Wouter

    2. Beste Andre,

      Ik heb de het artikel inmiddels uitgebreid met een deel over een extra ‘iemand thuis’ dummyswitch. Misschien heb je er iets aan.

      Wouter

  2. Beste Wouter,

    Script werkt! Telt uiteraard ook op.. echter bij de eerste minuut nadat de telefoon in ‘slaapmodus’ gaat, gaat ook de dummyswitch al uit… En blijft niet aan tot de 15 minuten ON staan. Vreemde is ook dat de teller doorgaat na de 15…loopt gewoon door… Wat zou ik fout hebben staan?

    1. Beste Erwin,

      Bedankt voor je reactie. Ik zie dat ik nooit gereageerd heb! In de reactie op de vraag van Hendrik vind je je antwoord.

      Succes,

      Wouter

  3. Wouter bedankt. De teller gaat veel.sneller bij mij dus waarde 15 naar 900 gezet. (Erwin wellicht ook.handig voor.jou ) Soms krijg ik een valse positieve ping en gaat de schakelaar om.. terwijl er geen systeem thuis het statisch adres kan hebben gekregen

    1. Beste Hendrik,

      Leuk dat je reageert! Aangezien je teller zo hard op loopt, heb je denk ik het script type op “All” staan. Het script wordt dan bij iedere trigger uitgevoerd. Dus bij iedere update van een apparaat, iedere minuut etc. Dat gebeurd wel vaker dan 1x per minuut.

      Dat van de false positives merk ik soms ook, daarom zou je eens naar de geavanceerde manier kunnen kijken. Daarmee geef je de presence detection uit handen aan je pi of nas. Dat werkt wat betrouwbaarder.

      Succes!

      Wouter

  4. Beste Wouter,

    Het script werkt prima, echter loop ik tegen 2 kleine foutmeldingen. Ik weet niet hoe ik dit op kan lossen. Kun jij me verder helpen?

    De eerste foutmelding ziet er als volgt uit:

    Error: EventSystem: in Ping iemand thuis: [string “function DevicePing(ip, device)…”]:49: attempt to perform arithmetic on a nil value

    Deze fout hoort bij onderstaande regel.

    commandArray[‘Variable:NiemandThuisTeller’] = tostring(tonumber(uservariables[‘NiemandThuisTeller’]) + 1)

    De tweede foutmelding luidt als volgt:

    Error: EventSystem: in Ping iemand thuis: [string “function DevicePing(ip, device)…”]:57: attempt to compare number with nil

    Deze melding hoort bij de onderstaande regel uit het script
    if (tonumber(uservariables[‘NiemandThuisTeller’]) > 30) then…….

    Bij voorbaat dank voor je inspanning.

    Gr. Ron

    1. Het probleem is al opgelost. De aangemaakte variabele NiemandThuisTeller had binnen Domoticz een spatie achter de benaming waardoor deze afweek van de benaming in het script zelf. Nu werkt alles zoals het hoort.

Laat weten wat je van dit artikel vindt!

This site uses Akismet to reduce spam. Learn how your comment data is processed.