Launchmenu’s in Retropie

Wanneer je een spel opstart in RetroPie, krijg je het zogenaamde launchmenu te zien. Hier kun je diverse zaken instellen voor het spel dat opgestart wordt. Je kunt door het menu heen lopen met je game-controller.

Helaas is dit erg vervelend wanneer je je kinderen spelletjes laat spelen en ze in al hun ongeduld op de knoppen van een controller beginnen te drukken. Ze verdwalen dan in de menu-structuur en krijgen hun spelletje niet opgestart.

Daarom is het wenselijk om deze optie uit te schakelen. Gelukkig kan dit erg eenvoudig:

  • Ga naar het instellingen-menu van RetroPie.
  • Kies Run Command Editor

  • Ga met de toetsen op je game-controller naar optie 3 en kies deze. Hiermee verzet je de instelling van Enabled naar Disabled.
  • Druk op rechts op je game-controller om naar Cancel te navigeren en kies deze optie.

Vanaf nu krijg je bij het opstarten van een spel nog wel het launch menu te zien, maar je kunt hem niet meer bedienen via de game-controller.

Raspberry Pi als spelcomputer

Een Raspberry Pi is uitermate geschikt voor leuke hobby-projecten. Zo wordt hij in ons huis reeds ingezet als telefooncentrale, mediaspeler en domotica-controller. Een andere leuke toepassing is om hem in te zetten als spelcomputer. In dit artikel lees je hoe je met een Raspberry Pi een relatief goedkope spelcomputer kunt maken en er héél veel (gratis) spelletjes op kunt spelen. Het systeem ondersteunt namelijk bijna alle game-console die we uit onze jeugd kennen, zoals de Super Nintendo en de Sega MegaDrive.

Je hebt de volgende hardware nodig: (Klik op de links om goedkoop te bestellen)

Om te beginnen bouw je de Raspberry Pi in de behuizing. Vervolgens sluit je de game-controllers aan op de USB-poorten van je Raspberry Pi.

Nu gaan we de benodigde software installeren. Hiervoor moeten we een image-bestand downloaden. Dit bestand moet op de micro-SD kaart geplaatst worden. Hiervoor moet je de SD-kaart middels de cardreader op je computer aansluiten. Vervolgens hebben we nog een stukje software nodig om het image-bestand op de SD-kaart te plaatsen:

  • Gebruik je Windows, dan kun je hiervoor Win32DiskImager gebruiken.
  • Gebruik je Linux of een Mac, dan adviseer ik je Etcher te gebruiken.

Als je het image-bestand op de SD-kaart geplaatst hebt, verwijder je deze uit je computer en steek je hem in de Raspberry Pi. Sluit nu de Raspberry Pi via de HDMI-kabel aan op je TV. Verbind de Raspberry Pi met je netwerk met behulp van de netwerkkabel. Tot slot sluit je een game-controller en de voedingsadapter aan en wacht je een minuutje totdat het apparaat is opgestart.

Wanneer de Raspberry Pi volledig is opgestart, krijg je het volgende scherm te zien:

Druk nu op een knop op de game-controller en je krijgt de naam van de controller te zien:

Druk nu weer op een knop om de controller te configureren:

Volg nu de instructies op het scherm.Als je geen knoppen meer hebt om te configureren, houd je gewoon een willekeurige knop ingedrukt om deze over te slaan. Zodra je bij OK komt, druk je op de knop die je als “A” geconfigureerd hebt.

Wifi instellen

De RetroPie is nu aangesloten via een netwerkkabel. Hoewel dit op zich prima werkt, is een draadloze verbinding wellicht wat handiger. De Raspberry Pi 3B(+) beschikt over onboard Wifi, dus een draadloze verbinding is eenvoudig op te zetten. Kies allereerst het volgende menu-item op de RetroPie:

Je komt nu in het instellingen-menu. Daar vindt je de optie Show IP. Kies deze optie en je krijgt een nieuw scherm te zien met het IP-adres van je RetroPie.

We kunnen nu een SSH-sessie opzetten naar de RetroPie. Als je een Windows-PC gebruikt, dan kun je hiervoor Putty gebruiken. Linux- en Mac gebruikers kunnen een SSH-sessie opzetten vanuit de terminal. Om via SSH in te loggen heb je een gebruikersnaam en wachtwoord nodig. De standaard gebruikersnaam voor de RetroPie is pi en het wachtwoord is raspberry.

Wanneer je via SSH ingelogd bent op je RetroPie, maak je eerst een bestand aan met de Wifi-instellingen:

nano /boot/wifikeyfile.txt

Voeg de volgende regels toe:

ssid="<naam_van_je_wifi_netwerk>"
psk="<je_wifi_wachtwoord>"

Vervolgens gebruik je de toetsencombinatie CTRL+X om het bestand op te slaan.

Nu ga je op de RetroPie weer naar het instellingenmenu, waar we eerder de optie Show IP gebruikten. Deze keer kies je de optie Wifi. Je krijgt nu een nieuw scherm te zien, waar je optie 3 kiest: Import wifi credentials from /boot/wifikeyfile.txt.

De instellingen voor de wifi worden nu door de RetroPie gebruikt. Omdat de RetroPie nu gebruikt maakt van zowel de bekabelde verbinding als de draadloze verbinding, kan hij nog steeds benaderd worden via het eerder opgezochte IP-adres. Wanneer je echter de netwerkkabel ontkoppelt, zal hij alleen bereikbaar zijn via het IP-adres van de Wifi-adapter. Deze is wederom op te zoeken via de optie Show IP in het RetroPie instellingen-menu.

Games toevoegen

Nu je RetroPie klaar is voor gebruik, wordt het tijd om spelletjes toe te voegen. Er wordt gebruik gemaakt van zogenaamde ROM’s. Dit zijn digitale versies van de game-cartridges die vroeger gebruikt werden in game-consoles. Deze ROM’s zijn gratis op het internet te downloaden. Om je op weg te helpen kun je alvast de onderstaande games downloaden:

Wanneer je de games hebt gedownload, kun je ze op je RetroPie zetten. Dit kan eenvoudig via je netwerkverbinding. De RetroPie ondersteunt namelijk het SMB-protocol waarmee je bestanden kunt versturen over je netwerk. Hiervoor open je een SMB-share op je RetroPie:

Voor Windows-gebruikers:

Ga naar Start->uitvoeren en typ:

\\retropie

Voor Mac-gebruikers:

Toets CMD+K en toets:

smb://retropie

Je krijgt nu de SMB-shares van je RetroPie te zien in je Verkenner (Windows) of je Finder (Mac). Kies nu de roms share.

roms in finderDeze share bevat een mappen voor de verschillende game-console, zoals bijvoorbeeld Nintendo Super Entertainment Set (snes) of Sega Megadrive (megadrive). De ROM’s dienen nu in de mappen geplaatst te worden van de bijbehorende systemen. Je kunt ze er eenvoudig naartoe slepen en de bestanden worden automatisch gekopieerd.

Zodra de spelletjes gekopieerd zijn, moet de RetroPie nog even opnieuw gestart worden zodat de nieuwe spelletjes herkend worden. Dit doe je door op de game-controller op Start te drukken en dan de optie Quit en vervolgens Restart te kiezen. Zodra het apparaat opnieuw is opgestart, zul je zien dat er in het menu systemen zijn bijgekomen. Wanneer je een systeem kiest met de toetsen op je game-controller, krijg je de geïnstalleerde spelletjes te zien. Selecteer het gewenste spel en start het met de A toets op je controller.

Meer games downloaden

Als je nog meer games wilt downloaden, kijk dan eens bij http://www.completeroms.com. Hier kun je een enorme hoeveelheid games downloaden voor verschillende platformen.

Meer leren over RetroPie?

Als je meer weten leren over de mogelijkheden van een RetroPie, kijk dan ook eens op https://retropie.org.uk.

Domoticz koppelen met Ikea’s Trädfri

ikea domoticz

In het verleden heb ik mijn Trädfri-systeem van Ikea al eens gekoppeld met HomeBridge, zodat ik de Ikea-lampen kon koppelen met HomeKit en dus kon bedienen via mijn iPhone. Sinds enige tijd biedt Ikea ook HomeKit-ondersteuning waardoor deze koppeling niet meer nodig is.

Wanneer je een AppleTV4 of iPad met minimaal iOS10 hebt, kun je ook zaken automatiseren met scenes en dergelijke. Heb je die ApplTV of iPad niet, dan ben je aangewezen op de zeer beperkte functionaliteit van Trädfri, waarbij je bijvoorbeeld lampen kunt schakelen op basis van tijd.

Natuurlijk wil ik lampen ook kunnen schakelen op basis van sensoren, tijd en combinaties hiervan, maar met de mogelijkheden van Trädfri zelf kom je niet heel ver. In Domoticz is het mogelijk om lampen te schakelen op basis van veel verschillende factoren en daarbij ook condities te hanteren. Bijvoorbeeld: schakel een lamp in wanneer een bewegingssensor geactiveerd wordt ná zonsondergang. Dit soort logica hanteer ik al een tijdje met de Zwave-devices in mijn huis, maar helaas nog niet met de Ikea-verlichting. Het wordt dus tijd om Domoticz nu ook eens te koppelen met Trädfri.

Standaard wordt Tradfri niet ondersteund door Domoticz, maar met de installatie van wat (opensource) software wordt het toch mogelijk. Trädfri ondersteunt namelijk het COAP-protocol, waarmee het basisstation een API biedt weer te tegen kunnen praten.

Om te beginnen hebben we het IP-adres van het Trädfri basisstation nodig. Dit basisstation verkrijgt zijn IP-adres via DHCP. Het is niet mogelijk om een vast IP-adres in te stellen. De eenvoudigste manier om achter het IP-adres van het basisstation te komen is door het MAC-adres af te lezen op de achterzijde van het apparaat. Met dit MAC-adres kun je dan in je router het IP-adres van het basisstation opzoeken. Noteer het IP-adres van het basisstation om het later te gebruiken.

Om de koppeling op te bouwen, moeten we een Python plugin installeren. Op het moment dat ik dit artikel schrijf, worden plugins enkel nog in de beta-versie van Domoticz ondersteund. Dat wil zeggen: Domoticz is er in twee versies: stable en beta.

  1. Open Domoticz in je browser door te surfen naar http://<ip_adres_van_domoticz>:8080
  2. Klik vervolgens op Instellingen en daarna weer op Instellingen. De instellingen-pagina wordt nu geopend.
  3. Kies nu onder Software-updates het distributie-kanaal Bèta.
  4. Klik nu rechtsboven weer op Instellingen en vervolgens op Controleer op updates.

Wanneer Domoticz draait op de laatste Beta-versie, kunnen we de plugin voor Ikea’s Trädfri installeren. Voor de plugin is Python versie 3.5 minimaal vereist. Wanneer je Domoticz hebt draaien op een Raspberry Pi (en dus op het RaspBian OS), heb je waarschijnlijk Python versie 2.x nog draaien en zul je dus je Python moeten upgraden.

Als je Python versie 3.5 of hoger hebt draaien, kun je verder gaan met de volgende stappen:

  1. Log in op je Domoticz-machine via SSH.
  2. Installeer pytradfri.
    Dit is een Python library die wordt gebruikt door de Domoticz-plugin die we zometeen gaan installeren. Je installeert deze library met het volgende commando:

    pip3 install pytradfri
  3. Vervolgens installeer je de Twisted library. De Domoticz-plugin maakt ook hier gebruik van:
    pip3 install twisted
  4. Ga nu naar de plugins-directory van je Domoticz installatie (op mijn Raspberry Pi is dat /home/pi/domoticz/plugins) en clone de Ikea Trädfri plugin via Git:
    cd /home/pi/domoticz/plugins
    git clone https://github.com/moroen/IKEA-Tradfri-plugin.git IKEA-Tradfri
  5. Creeer een identiteit en een sleutel. Hiervoor heb je het IP-adres en de beveiligingssleutel van je basisstation nodig. Het IP-adres heb je eerder al opgezocht en de beveiligingssleutel is te vinden op de achterzijde het basisstation. Het volgende commando genereert een sleutel voor de gebruiker DOMOTICZ. Vervang <BEVEILIGINGSSLEUTEL> en <IP_ADRES_VAN_BASISSTATION> door je eigen varianten.
    coap-client -m post -u "Client_identity" -k "<BEVEILIGINGSSLEUTEL>" -e '{"9090":"DOMOTICZ"}' "coaps://<IP_ADRES_VAN_BASISSTATION>:5684/15011/9063"
  6. Wanneer het commando succesvol wordt uitgevoerd, krijg je het onderstaande terug. In dit voorbeeld is de aangemaakte sleutel: 1.2.0042. Jouw sleutel zal natuurlijk een andere waarde bevatten. Noteer deze waarde. Je kunt hem namelijk maar één keer aanmaken en hij is naderhand niet meer op te roepen.
    {"9091":"PSK","9029":"1.2.0042"}
  7. Nu gaan we de COAP-adapter activeren. Hiervoor gebruiken we systemd.
    cd IKEA_tradfri
    sudo cp ikea-tradfri.service /lib/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl start ikea-tradfri.service
  8. Om er voor te zorgen dat de ikea-tradfri service automatisch wordt opgestart wanneer je de Domoticz-machine herstart, voer je het volgende commando uit:
    sudo systemctl enable ikea-tradfri.service
  9. Ga nu weer naar Domoticz in je browser en klik op Instellingen en vervolgens op Hardware.
  10. We gaan nu nieuwe hardware toevoegen. Kies bij type de optie IKEA Tradfri. Vul het IP-adres van je basisstation in. Bij identity vul je in: DOMOTICZ. Bij PSK vul je de gegenereerde sleutel in. Klik tot slot op Toevoegen.

    tradfri-domoticz-settings

  11. De gekoppelde lampen van Ikea verschijnen nu bij Instellingen->Apparaten. Je kunt ze nu gebruiken zoals alle andere devices in Domoticz.

Domotica, kleine kinderen en energie besparen

open door heat loss

Iedereen met kleine kinderen kent het probleem: Kinderen die vergeten de buitendeur dicht te doen, waardoor er onnodig gestookt wordt. Ook hier in huis hebben we dit probleem. Terwijl het buiten koud is laten de kinderen de keukendeur openstaan als ze in de tuin gaan spelen. Niet alleen loopt alle warmte uit het huis, maar de verwarming gaat ook nog eens harder stoken om het toch weer warm te krijgen.

Zo kwam ik op het idee om de verwarming eens wat slimmer te maken, waardoor hij stopt met stoken op het moment dat onze keukendeur te lang open staat. De domotica in ons huis draait op Domoticz en de verwarming wordt aangestuurd door een Nest Thermostaat. Het enige dat ik nog nodig had, was een manier om te detecteren of de keukendeur open stond. Hiervoor heb ik een zWave deursensor aangeschaft. Deze sensor werkt op een batterijtje (dat zo’n anderhalf jaar meegaat) en communiceert draadloos met het Domotica-systeem.

Ik heb gekozen voor de deursensor van Neo Coolcam. Deze is bestaat uit twee delen. Eén breng je aan op de deur en het andere deel breng je aan op het kozijn. Hiervoor kun je de meegeleverde schroefjes of dubbelzijdige tape gebruiken. Neo Coolcam door sensorBinnen 5 minuten zit de sensor op je deur en heb je hem gekoppeld aan Domoticz. Het is echt supereenvoudig!

Bij het schakelen van de verwarming wil ik ook graag rekening houden met de buitentemperatuur. Hiervoor heb ik de API van Weather Underground gebruikt. De handleiding voor hoe je deze in Domoticz integreert vindt je hier. Na de implementatie kreeg ik er in Domoticz een device bij, genaamd Buitentemperatuur.

Nu moest ik de logica gaan programmeren. Deze is als volgt:

  • Wanneer de keukendeur langer dan 2 minuten open staat en de buitentemperatuur lager is dan 20 graden, moet de Nest-thermostaat in ECO-mode gezet worden. Hierdoor stopt de verwarming met stoken.
  • Wanneer de deur weer gesloten wordt, moet de ECO-stand worden opgeheven waardoor de verwarming weer aan gaat.
  • Het opheffen van de ECO-mode moest echter alleen plaats vinden wanneer we niet thuis zijn.

Gelukkig weet onze Nest Thermostaat of we thuis zijn. Dit is door Domoticz uit te lezen; er is gewoon een sensor voor.



In eerste instantie heb ik geprobeerd de logica te programmeren in LUA, maar daarbij liep ik tegen problemen met het uitlezen van sommige sensoren. De oorzaak hiervan heb ik nog niet kunnen achterhalen. Tijdens het uitzoeken kwam ik DzEvents tegen: een nieuwe manier van LUA scripting die ik zelf veel prettiger vond en die ook ondersteund wordt door Domoticz.

Om deze LUA-scripts door Domoticz uit te laten voeren, plaats je deze in de ~/domoticz/scripts/dzVents/scripts directory. De bestandsnaam dient de extensie lua te hebben. Ik heb dus het bestand keukendeur.lua aangemaakt in deze directory. Dit is mijn code:

return {
    active = true,
    on = {
        devices = {
            'Keukendeur'
        }
    },
    execute = function(domoticz, switch)
        if (switch.state == 'Open' and domoticz.devices('Buitentemperatuur').temperature < 20) then
                domoticz.log('Timer set for 5 minutes before entering heating ECO mode')
                domoticz.devices('Thuis Family Room Manual Eco Mode').setState('On').afterMin(2)
        end

        if (switch.state == 'Closed' and domoticz.devices('Thuis Family Room Away').state == 'Off') then
            domoticz.devices('Thuis Family Room Manual Eco Mode').setState('Off')
        end

    end
}

Deze code wordt event-based uitgevoerd. Op het moment dat de status van Keukendeur wijzigt, wordt de bovenstaande code uitgevoerd. Daarbij wordt gekeken naar de status van de sensor (switch.state), de temperatuur van de Buitentemperatuur-sensor en de status van de Away-sensor in de Nest Thermostaat.

Door deze uitbreiding is ons huis weer een beetje slimmer geworden en kan het omgaan met kinderen die vergeten de deur achter zich dicht te doen.

 

Je huis besturen met Siri

Domotica met Siri en HomeBridge

In een eerdere blog heb ik beschreven hoe je met een Raspberry Pi de basis kunt leggen voor Domotica in je huis. Daarnaast heb ik uitgelegd hoe je op afstand je huis kunt besturen.

Aangezien ik een iPhone gebruik, leek het me ook aardig om een koppeling te maken met Apple’s HomeKit. Deze domotica-software zit ingebouwd in iOS, waardoor het op elke iPhone en iPad beschikbaar is. Het leuke van HomeKit is dat je het kunt besturen met Siri, waardoor je met je stem je huis kunt besturen. Helaas werken niet alle domotica-oplossingen met HomeKit en Domoticz, het open-source pakket dat ik voor mijn domotica gebruik, is daar geen uitzondering op. Ook mijn Nest-thermostaat werkt standaard niet met HomeKit.

HomeBridge

Om apparaten toch met HomeKit te laten communiceren, is er HomeBridge. Deze open-source software werkt als schakel tussen je apparaten en HomeKit. Het draait op Node.js, dus dat zul je eerst moeten installeren. In deze blog ga ik er vanuit dat je de basis met een Raspberry Pi en Domoticz reeds draaiend hebt.

Om te beginnen log je via SSH in op je Raspberry Pi. We gaan nu eerst Node.js installeren. Ik vind het zelf het gemakkelijkste om dit als root te doen. Hiervoor geef je het volgende commando:

sudo bash

Toets nu de volgende commando’s om Node.js op te halen:

wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz
tar -xvf node-v4.0.0-linux-armv7l.tar.gz
cd node-v4.0.0-linux-armv7l

Verplaats nu NodeJS naar /usr/local met het volgende commando:

cp -R * /usr/local/

Node.js is nu geïnstalleerd. Je kunt dit controleren door het onderstaande commando uit te voeren. Je krijgt dan krijgt dan als antwoord het versienummer te zien:

node -v

Voordat we HomeBridge gaan installeren, moeten we eerst Avahi installeren, omdat HomeBridge hier gebruik van maakt:

apt-get install libavahi-compat-libdnssd-dev

De voorbereidingen zijn nu gereed en we kunnen nu HomeBridge gaan installeren.Voer het volgende commando uit:

npm install -g homebridge

De installatie kan aardig wat tijd in beslag nemen. Wees niet bang als je wat errors voorbij ziet komen. Als de installatie voltooid is, kunnen we HomeBridge voor het eerst opstarten:

homebridge

Aangezien we nog niet alle onderdelen van HomeBridge geïnstalleerd hebben, zullen er nog wat foutmeldingen verschijnen, zoals “No plugins found. See the README for information on installing plugins.” De plugins waarover gesproken wordt, gaan we nu installeren. Je kunt HomeBridge stoppen door de toetsencombinatie CTRL+c.

Plugins installeren

Domoticz

Om de Domoticz-plugin te installeren, toets je het volgende commando:

npm install -g homebridge-edomoticz

Nadat de plugin geïnstalleerd is, gaan we het configuratiebestand voor HomeBridge aanmaken:

cd ~/.homebridge/
nano config.json

Kopieer de onderstaande tekst in het bestand en sluit met CTRL+x. (Het bestand wordt nu opgeslagen)

{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:21:3E:E4:DE:33",
        "port": 51826,
        "pin": "031-45-154"
    },
    "description": "Configuration file for (e)xtended Domoticz platform.",
    "platforms": [
        {
            "platform": "eDomoticz",
            "name": "eDomoticz",
            "server": "127.0.0.1",
            "port": "8080",
            "ssl": 0,
            "roomid": 2,
            "mqtt": 1
        }
    ],
    "accessories": []
}

De waarde voor “roomid” is hierboven gezet op 2. Dit is het floorplan dat we in Domoticz aanmaken en waarin we alle apparaten zetten die we via HomeKit beschikbaar willen maken. In Domoticz ga je naar:
Instellingen -> Meer opties -> Ruimtes -> Kamerplan

Klik nu rechtsboven op Ruimte toevoegen. Als naam geef je bijvoorbeeld HomeBridge. Vervolgens kun je onderin kiezen welke apparaten je wilt toevoegen. Voeg één voor één al je apparaten toe.

Zodra je dit gedaan hebt, start HomeBridge op:

homebridge

Je ziet nu dat HomeBridge de apparaten via Domoticz vindt. Wanneer HomeBridge is opgestart, krijg je het volgende te zien:

Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
                       
    ┌────────────┐     
    │ 031-45-154 │     
    └────────────┘     

Deze code heb je nodig om je iPhone of iPad te verbinden met HomeBridge. Start nu in iOS de HomeKit-app.

  • Druk rechtsboven op de +-knop en kies Voeg accessoire toe.
  • Je ziet nu HomeBridge verschijnen. Kies deze.
  • Je wordt nu gevraagd om een code te scannen. Dit gaat niet met HomeBridge, maar je kunt ook kiezen om de code handmatig in te voeren. Kies deze optie en voer de code in die je van HomeBridge hebt gekregen.
  • Hierna wordt je gevraagd om één voor één de apparaten in te stellen. Je kunt hun naam, functie en lokatie wijzigen. Eventueel kun je dit ook later doen, maar het is wel belangrijk omdat Siri dan bijvoorbeeld het verschil kent tussen spotjes in de keuken en spotjes in de woonkamer. Als je lampen configureert als lamp in plaats van schakelaar, dan weet Siri dat je deze apparaten wilt schakelen wanneer je het hebt over verlichting.

HomeBridge automatisch starten

We hebben HomeBridge handmatig opgestart. Echter, zodra je de SSH-sessie sluit zullen applicaties, die je gestart hebt, automatisch afsluiten, dus ook HomeBridge. Daarom moeten we de Raspberry Pi HomeBridge automatisch laten starten.

Voer het volgende commando uit:

nano /lib/systemd/system/homebridge.service

Plak de volgende tekst in het bestand en sla het op:

[Unit]
Description=HomeBridge Service
After=multi-user.target

[Service]
User=pi
Type=idle
ExecStart=/usr/local/bin/homebridge

[Install]
WantedBy=multi-user.target

Voer nu de volgende commando’s uit:

systemctl daemon-reload
systemctl enable homebridge
systemctl start homebridge

HomeBridge wordt nu in de achtergrond gestart en je krijgt geen output te zien. Als je de output toch wilt zien, kun je deze terug vinden in /var/log/daemon.log.

In de Woning-app op je iPhone of iPad kun je nu de verschillende apparaten zien:

Behalve via de app kun je je apparaten ook oproepen in Control Center door vanuit je Home Screen van onderuit het scherm naar boven te vegen en dan in Control Center naar links te vegen.

Maar het leukste is natuurlijk om het aan Siri te vragen:

Hé Siri, schakel de spots in de keuken in

 

 

Helaas werkt deze oplossing enkel wanneer je iPhone verbonden is met je thuisnetwerk. Wil je je huis ook buiten de deur kunnen bedienen, dan is hiervoor een heel simpele oplossing beschikbaar.

Tot slot nog even een kleine demonstratie van de werking op een iPhone:

Aanwezigheids-detectie met Domoticz via wifi

Soms is het handig wanneer Domoticz weet of er iemand thuis is, zodat je bijvoorbeeld al je verlichting kunt uitschakelen wanneer er niemand thuis is. Nu kun je natuurlijk je hele huis volhangen met bewegingsdetectoren, maar dat wordt toch een dure grap.

Aangezien zo’n beetje iedereen tegenwoordig een smartphone heeft, die verbonden is met het wifi-netwerk thuis, kunnen we de connectie van deze smartphones met het wifi-netwerk gebruiken om te kijken of iemand thuis is.

Stap 1:Virtuele switches creëren voor je smartphones

  • Open de webinterface van Domoticz.
  • Klik op Instellingen en vervolgens op Hardware.
  • Voer nu als naam Smartphones in.
  • Selecteer het type Dummy en klik vervolgens op Toevoegen.
  • Klik nu op het tabblad Schakelaars.
  • Klik linksboven op de knop Handmatig.
  • Kies nu als Hardware Smartphones.
  • Als naam voer je een naam in die verwijst naar een smartphone van iemand in je huis.
    Bijvoorbeeld: Rutger’s iPhone.
  • Bij schakelaar-type kies je voor On/Off.
  • Als type kies je X10, bij House code kies je A en bij Unit code kies je 1.
  • Bij Als kies je Hoofdapparaat. Klik tot slot op toevoegen.
  • Als je meerdere smartphones in huis hebt, herhaal je de laatste 6 stappen voor elke smartphone.

Stap 2: Software installeren via SSH

  • Log in op je domoticz-server via SSH.
  • Typ het volgende commando om Python en apin te installeren:
    sudo apt-get install python arping
  • We gaan Python gebruiken om via arping de verschillende smartphones te pingen. Veel smartphones reageren niet op een ping wanneer ze stand-by staan. In tegenstelling tot het standaard ping-commando stuurt arping een ‘apr-whois’ uit waar de smartphones ook op reageren wanneer ze stand-by staan.
  • Domoticz-gebruiker Chopper Rob heeft een handig stukje Python-code geschreven dat een smartphone pingt en vervolgens communiceert met Domoticz. Maak een bestand, genaamd check_device_online.py aan in de map /home/pi/domoticz/scripts. Je kunt dit eenvoudig doen door de onderstaande code te kopiëren. (CTRL+c / CMD+C). Vervolgens toets je het volgende command in via je SSH-sessie:
  • nano /home/pi/domoticz/scripts/check_device_online.py
  • De nano teksteditor wordt nu geopend. Plak nu de code in het bestand en toets CTRL+x om het bestand op te slaan en de teksteditor af te sluiten.
#!/usr/bin/python
#   Title: check_device_online.py
#   Author: Chopper_Rob
#   Date: 25-02-2015
#   Info: Checks the presence of the given device on the network and reports back to domoticz
#   URL : https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz
#   Version : 1.6.2
 
import sys
import datetime
import time
import os
import subprocess
import urllib2
import json
import base64
 
# Settings for the domoticz server
domoticzserver="192.168.1.5:8080"
domoticzusername = "admin"
domoticzpassword = "admin"
domoticzpasscode = "protectedswitch"
 
# If enabled. The script will log to the file _.log
# Logging to file only happens after the check for other instances, before that it only prints to screen.
log_to_file = False
 
# The script supports two types to check if another instance of the script is running.
# One will use the ps command, but this does not work on all machine (Synology has problems)
# The other option is to create a pid file named _.pid. The script will update the timestamp
# every interval. If a new instance of the script spawns it will check the age of the pid file.
# If the file doesn't exist or it is older then 3 * Interval it will keep running, otherwise is stops.
# Please chose the option you want to use "ps" or "pid", if this option is kept empty it will not check and just run.
check_for_instances = "pid"
 
 
 
# DO NOT CHANGE BEYOND THIS LINE
if len(sys.argv) != 5 :
  print ("Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.")
  sys.exit(0)
 
device=sys.argv[1]
switchid=sys.argv[2]
interval=sys.argv[3]
cooldownperiod=sys.argv[4]
previousstate=-1
lastsuccess=datetime.datetime.now()
lastreported=-1
base64string = base64.encodestring('%s:%s' % (domoticzusername, domoticzpassword)).replace('\n', '')
domoticzurl = 'http://'+domoticzserver+'/json.htm?type=devices&filter=all&used=true&order=Name'
 
if check_for_instances.lower() == "pid":
  pidfile = sys.argv[0] + '_' + sys.argv[1] + '.pid'
  if os.path.isfile( pidfile ):
    print datetime.datetime.now().strftime("%H:%M:%S") + "- pid file exists"
    if (time.time() - os.path.getmtime(pidfile)) < (float(interval) * 3):
      print datetime.datetime.now().strftime("%H:%M:%S") + "- script seems to be still running, exiting"
      print datetime.datetime.now().strftime("%H:%M:%S") + "- If this is not correct, please delete file " + pidfile
      sys.exit(0)
    else:
      print datetime.datetime.now().strftime("%H:%M:%S") + "- Seems to be an old file, ignoring."
  else:
    open(pidfile, 'w').close() 
 
if check_for_instances.lower() == "ps":
  if int(subprocess.check_output('ps x | grep \'' + sys.argv[0] + ' ' + sys.argv[1] + '\' | grep -cv grep', shell=True)) > 2 :
    print (datetime.datetime.now().strftime("%H:%M:%S") + "- script already running. exiting.")
    sys.exit(0)
 
def log(message):
  print message
  if log_to_file == True:
    logfile = open(sys.argv[0] + '_' + sys.argv[1] + '.log', "a")
    logfile.write(message + "\n")
    logfile.close()
 
def domoticzstatus ():
  json_object = json.loads(domoticzrequest(domoticzurl))
  status = 0
  switchfound = False
  if json_object["status"] == "OK":
    for i, v in enumerate(json_object["result"]):
      if json_object["result"][i]["idx"] == switchid:
        switchfound = True
        if json_object["result"][i]["Status"] == "On": 
          status = 1
        if json_object["result"][i]["Status"] == "Off": 
          status = 0
  if switchfound == False: print (datetime.datetime.now().strftime("%H:%M:%S") + "- Error. Could not find switch idx in Domoticz response. Defaulting to switch off.")
  return status
 
def domoticzrequest (url):
  request = urllib2.Request(url)
  request.add_header("Authorization", "Basic %s" % base64string)
  response = urllib2.urlopen(request)
  return response.read()
 
log (datetime.datetime.now().strftime("%H:%M:%S") + "- script started.")
 
lastreported = domoticzstatus()
if lastreported == 1 :
  log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is online")
if lastreported == 0 :
  log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is offline")
 
while 1==1:
  # currentstate = subprocess.call('ping -q -c1 -W 1 '+ device + ' > /dev/null', shell=True)
  currentstate = subprocess.call('sudo arping -q -c1 -W 1 '+ device + ' > /dev/null', shell=True)
 
  if currentstate == 0 : lastsuccess=datetime.datetime.now()
  if currentstate == 0 and currentstate != previousstate and lastreported == 1 : 
    log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, no need to tell domoticz")
  if currentstate == 0 and currentstate != previousstate and lastreported != 1 :
    if domoticzstatus() == 0 :
      log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, tell domoticz it's back")
      domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=switchlight&idx=" + switchid + "&switchcmd=On&level=0" + "&passcode=" + domoticzpasscode)
    else:
      log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, but domoticz already knew")
    lastreported=1
 
  if currentstate == 1 and currentstate != previousstate :
    log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, waiting for it to come back")
 
  if currentstate == 1 and (datetime.datetime.now()-lastsuccess).total_seconds() > float(cooldownperiod) and lastreported != 0 :
    if domoticzstatus() == 1 :
      log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, tell domoticz it's gone")
      domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=switchlight&idx=" + switchid + "&switchcmd=Off&level=0" + "&passcode=" + domoticzpasscode)
    else:
      log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, but domoticz already knew")
    lastreported=0
 
  time.sleep (float(interval))
 
  previousstate=currentstate
  if check_for_instances.lower() == "pid": open(pidfile, 'w').close()

Stap 3: Het script inplannen met Cron

Het script dat we zojuist gemaakt hebben, kan gaan we om de tien minuten laten controleren of een bepaalde smartphone verbonden is met het netwerk. Dit doen we door eerst onze crontab te openen:

crontab -e

Vervolgens voeren we de volgende regel helemaal onderin toe:

*/10 * * * * /usr/bin/python /home/pi/domoticz/scripts/check_device_online.py 192.168.1.10 23 10 300

Deze regel zorgt er voor dat het apparaat met IP-adres 192.168.1.10 (parameter 1) de dummy-schakelaar met IDX 23 (parameter 2) om de 10 minuten (parameter 3) gepingd wordt.

De IDX kun je achterhalen in Domoticz via Instellingen -> Apparaten. Er wordt een cooldown-periode (parameter 4) gehanteerd van 300 seconden. Binnen die tijd wordt er wel gecontroleerd of het device aanwezig is, maar wordt de status niet doorgegeven aan Domoticz. De cooldown-periode is met name belangrijk wanneer je een iPhone gebruikt, omdat deze zijn Wifi-verbinding regelmatig uitschakelt om de accu te sparen. Ik heb redelijk succes geboekt met 300 seconden, maar wellicht werkt een langere periode beter, dat moet ik nog proberen.

Als je meerdere smartphones wilt controleren, dan voeg je voor elke smartphone een eigen regel toe in de crontab, natuurlijk met elk zijn eigen IP-adres.

Router instellen

Je smartphone krijgt zijn IP-adres van de router via DHCP. Dit is niet altijd hetzelfde IP-adres. Wanneer je smartphone een ander IP-adres krijgt, zal het script niet meer werken omdat het een IP-adres probeert te pingen dat de smartphone niet meer heeft.

In je router heb je de mogelijkheid om static leases in te stellen. Hierdoor krijgt een device op basis van zijn MAC-adres altijd hetzelfde IP-adres uitgedeeld, omdat het IP-adres exclusief voor het device reserveer is. Raadpleeg hiervoor de handleiding van je router.

Als je meerdere smartphones gebruikt, kan het handig zijn om nog een dummy-schakelaar aan te maken. Deze kun je dan via Blockly in Domoticz laten schakelen als één van de smartphone dummy-schakelaars actief is. Deze nieuwe dummy-schakelaar noem je dan bijvoorbeeld “Iemand thuis”. Daarna kun je de status van deze schakelaar gebruiken in andere gebeurtenissen.

Pi MusicBox: The poor man’s Sonos

De speakers van Sonos zijn op dit moment erg populair, maar helaas zijn ze nogal prijzig. Een goede reden om eens te kijken of je zelf een dergelijke speaker kunt bouwen. Aangezien ik nog een RaspBerry Pi 1B had rondslingeren, leek het me leuk om deze als basis voor een dergelijke speaker te gebruiken. Het beestje is niet snel genoeg meer voor de meeste applicaties die ik gebruik, maar voor het afspelen van muziek voldoet ie nog prima.

Na een beetje zoeken op het web kwam ik uit bij Pi MusicBox, een stukje software dat gebaseerd is op Mopidy, een uitbreidbare muziekserver geschreven in Python. Op GitHub is er een image beschikbaar die je met een applicatie als Etcher in een paar minuten op je SD-card kunt flashen.

Een goedkope bluetooth speaker van de Action zal de muziek gaan produceren. Het apparaat heeft een audio-ingang die ik op de analoge audio-uitgang van de RaspBerry Pi heb aangesloten. Deze speaker werkt op een interne accu, die geladen kan worden via een micro-USB aansluiting. Een USB-kabel tussen deze poort en één van de USB-poorten van de RaspBerry Pi zorgt voor een permanente stroomvoorziening.

Door het volgen van de onderstaande stappen bouw je in 15 minuten een standalone speaker, waarmee je je MP3-bestanden en radio-streams kunt afspelen. De bediening van de speaker geschiedt via je smartphone.

  • Download de image.
  • Flash de image op je SD-card met Etcher.
  • Steek de SD-card in je RaspBerry Pi.
  • Sluit de audio-ingang van je speaker aan op de analoge audio-uitgang van je Raspberry Pi.
  • Sluit een USB-kabel aan tussen de power-ingang van de speaker en een USB-poort van je RaspBerry Pi.
  • Sluit de RaspBerry Pi aan op je netwerk.
  • Sluit de voeding van je RaspBerry aan.

Je RaspBerry Pi start nu op en de software wordt nu automatisch geconfigureerd. Na een paar minuten is alles gereed en kun je met de browser van je computer of smartphone surfen naar http://musicbox.local. (let op de punt aan het einde van het adres)

Geluid via de analoge poort in plaats van HDMI

Tijdens het experimenteren kwam ik erachter dat, wanneer je een scherm via HDMI hebt verbonden, al het geluid automatisch via de HDMI-poort uitgestuurd wordt. Om het geluid via de analoge poort te laten lopen, kun je de RaspBerry Pi herstarten zonder dat de HDMI-poort is aangesloten. Het geluid gaat dan automatische via de analoge poort.

Via de web-interface kun je ook de analoge poort als default instellen. Hiervoor ga je naar SettingsAudio. Daar klik je op de grote knop met de tekst Automatic en wijzig je naar Analog. Om deze wijziging actief te maken, dien je de RaspBerry Pi te herstarten.

Koppeling via API

Pi MusicBox is ook voorzien van een API, waarmee je eenvoudig in JSON commando’s kunt sturen via HTTP. Dat biedt leuke mogelijkheden om te koppelen met bijvoorbeeld je Domotica-systeem.