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

Advertenties

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.

Advertenties

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!

Advertenties

Doe mee met de conversatie

11 reacties

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

  5. Hallo Wouter,

    ik ben een beetje aan het experimenteren met Domoticz en stel jouw artikelen erg op prijs.
    Het is me gelukt verschillende knoppen te maken die reageren op mijn telefoon ping.
    So far so good.

    Nu is het zo dat ik meerdere lichtschakelaars op een bepaalde tijd laat inschakelen en om een bepaalde tijd wordt alle verlichting middels een groep uitgeschakeld.

    Nu wil ik de beide situaties eigenlijk combineren…
    Ik wil dat 1 schakelaar altijd aan/uit gaat op de geplande momenten.
    De rest van de schakelaars moeten aan gaan als ik thuis ben, maar alleen tussen de geplande momenten.
    Uiteraard moeten deze lampen als ze aan staan ook weer uit gaan als ik weg ben.

    Hoe zou ik dit kunnen realiseren?

    1. Beste Martijn,

      Leuk dat je aan de slag gaat aan de hand van mijn werk! Ik help je graag verder.
      Toevallig heb ik bij mij thuis het een jaar of 2 ongeveer zo geregeld. Ik zal het script hierbij delen. Nu gebruik ik het niet meer, omdat ik nu een bewegingssensor in de woonkamer heb waarmee je veel flexibeler bent. Je kunt namelijk niet alle scenarios van te voren uitdenken waardoor je (of je vrouw) weleens in het donker zit. Maar het is een leuk begin en het werkt redelijk goed!

      Wat ik heb gedaan is een Tijdschema dummy maken waarin je de momenten instelt wanneer de lamp(en) aan zou willen hebben. Dat kun je doen met de timer functies.
      Daarbij heb ik een KAKU schemerschakelaar die detecteert of het donker is ja of nee. Heb je die niet, dan kun je de zonsopgang en zonsondergang functies hiervoor gebruiken, maar denk aan een regenachtige dag, dan zal je verlichting niet automatisch inschakelen. Het script kijkt ook of de TV aanstaat, dan laat ie zo lang dat zo is de verlichting aan. Ook heb ik voor de zekerheid een overrule dummy, als die aanstaat doet hij niets meer automatisch. Er staat genoeg uitleg in de code dus ik denk dat je een eind moet komen.

      Succes!

      Wouter

      [cc lang=”lua”]–

      function DeviceOnOff(device,action)

      if otherdevices[device] == action then
      print(tostring(device) ..” staat al “.. tostring(action))
      else

      if device == “Touwlamp” and action == “On” then
      commandArray[‘Touwlamp’]=’Set Level 65′
      print(‘Touwlamp gedimd naar 60%’)
      else
      commandArray[device] = action
      print(tostring(device)..” ” ..tostring(action).. ” gezet”)
      end

      end
      end

      commandArray = {}

      — Tijd MA DI WOE DO VRIJ ZAT ZON
      — aan 5.30 5.30 5.30 5.30 5.30
      — uit 6.10 6.10 6.10 6.10 6.10

      — aan 7.30 7.30 7.30 6.30
      — uit 8.15 8.15 8.15 7.15

      — aan ZONON -1
      — uit 22.30 23.30

      — Verder alleen op schemerschakelaar reageren als we thuis zijn
      — alle schemerschakelingen na 23.30 negeren

      print (“************ Verlichtingsschema ***************”)

      — Het Verlichtingsschema is leidend en volgt bovenstaand schema.
      — ‘s avond zal het schema een uur voor zonsondergang gaan checkken of het al aan moet
      — Als er iemand thuis is schakelt de groep, anders alleen de ledstrip
      — Als je de verlichting handmatig wilt schakelen moet je de tijdschema schakelaar gebruiken

      if (otherdevices[‘Handschakelaar verlichting’] == ‘Off’) then

      if (otherdevices[‘Tijdschema Verlichting’] == ‘On’) then

      — Volgens het schema zou de verlichting aan moeten

      print (“Schema = On”)

      if (otherdevices[‘State – IsDonker’] == ‘On’) then

      — het is donker genoeg om de verlichting aan te zetten

      print (“Donker = On”)

      if (otherdevices[‘Iemand Thuis’] == ‘On’) then

      — er is iemand thuis dus alle verlichting aan

      print (“Iemand thuis = On”)
      print (“Verlichting = aan”)

      DeviceOnOff(“Ledstrip kast”, “On”)
      DeviceOnOff(“Touwlamp”, “On”)
      DeviceOnOff(“Statieflamp”, “On”)

      else

      — er is niemand thuis dus alleen de ledstrip en de buitenlamp aan

      print (“Iemand thuis = Off”)
      print (“Ledstrip = aan”)

      if (uservariables[‘StaatDeKerstboom’] == “True”) then
      — in de kerstperiode staat de kerstboom aangesloten op de statieflamp schakelaar

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “On”)

      else
      DeviceOnOff(“Ledstrip kast”, “On”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “Off”)

      end

      — als er niemand thuis is voor de zekerheid ook de Handschakelaar uitzetten
      DeviceOnOff(“Off”,”Handschakelaar verlichting”)

      end

      elseif (otherdevices[‘State – IsDonker’] == ‘Off’) then

      — volgens het schema moet de verlichting aan
      — maar het is nog niet donker genoeg

      print (“Donker = Off”)
      print (“Verlichting = uit”)

      if (uservariables[‘Time-Variable’] == “Ochtend” or uservariables[‘Time-Variable’] == “Middag” or uservariables[‘Time-Variable’] == “Vooravond”) then
      if (uservariables[‘StaatDeKerstboom’] == “True” and otherdevices[‘Iemand Thuis’] == ‘On’ ) then
      print (“Het donker maar hoeft niet aan volgens het schema. Het is kerstperiode en dan mag de kerstboom overdag aan als er iemand thuis is.”)
      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “On”)

      end
      else

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “Off”)

      end
      end

      else

      — geen verlichting aan volgens schema.
      print (“Schema = Off”)

      — staat de TV aan? Dan zijn we misschien nog laat op. Dan alles aanlaten.
      — dit gaan we overdag negeren, als het overdag is

      if (otherdevices[‘State – IsDonker’] == ‘On’ and otherdevices[‘Philips TV (2.19)’] == ‘On’) then
      if (uservariables[‘Time-Variable’] == “Avond” or uservariables[‘Time-Variable’] == “Nacht”) then

      print (“Donker en TV = On, Het is avond of nacht”)

      DeviceOnOff(“Ledstrip kast”, “On”)
      DeviceOnOff(“Touwlamp”, “On”)
      DeviceOnOff(“Statieflamp”, “On”)

      else

      if (uservariables[‘StaatDeKerstboom’] == “True”) then

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “On”)

      print(“Donker en TV = On, maar het is overdag, ochtend of vooravond tijdens kerst dus kerstboom aan”)
      else
      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “Off”)

      print (“Donker en TV = On, maar het is overdag, ochtend of vooravond dus verlichting uit”)
      end
      end

      else
      — in de periode de kerstboom aanzetten als er iemand thuis is. maakt niet uit of het donker of licht is. daarom buiten schema. binnen schema reageert hij zoals het moet
      if (uservariables[‘Time-Variable’] == “Ochtend” or uservariables[‘Time-Variable’] == “Middag” or uservariables[‘Time-Variable’] == “Vooravond”) then
      if (uservariables[‘StaatDeKerstboom’] == “True” and otherdevices[‘Iemand Thuis’] == ‘On’ ) then
      print (“Het is kerstperiode en dan mag de kerstboom overdag aan als er iemand thuis is.”)

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “On”)
      else
      print(“Donker en/of TV = off, verlichting uit.”)

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “Off”)
      end
      else
      print (“Donker en/of TV = Off”)

      DeviceOnOff(“Ledstrip kast”, “Off”)
      DeviceOnOff(“Touwlamp”, “Off”)
      DeviceOnOff(“Statieflamp”, “Off”)

      end

      end

      end

      else

      print (“Handschakelaar staat aan. Niks doen aan verlichting”)

      end

      print (“************ eind Verlichtingsschema ***************”)

      return commandArray
      [/cc]

Laat een reactie achter

Laat weten wat je van dit artikel vindt!

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

%d bloggers liken dit: