Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Huisautomatisering met Raspberry Pi 2 (Windows 10 IoT Core)

Componenten en benodigdheden

Raspberry Pi 2 Model B
× 1
HSRel5 - I²C-Bus-Relaisplatine
Relaiskaart met 5 relais, 3 GPIO's en I2C-aansluiting, ondersteunt montage op stroomverdelers, gebaseerd op PCF8574 .
× 1
HSRel8(+8) - 8fach-Relaisplatine
Relaiskaart met 8 relais, 8 GPIO's en I2C-aansluiting, ondersteunt montage op stroomverdelers, gebaseerd op MAX7311 .
× 1
I2C-Port 16 HS 16Bit-Porterweiterung
Poortuitbreidingskaart met 16 GPIO's en I2C-aansluiting, ondersteunt montage op stroomverdelers, gebaseerd op MAX7311.
× 1
DR-60-12 Hutschienen Netzteil 12V / 54W
12V voeding voor alle apparaten
× 1
Hutschienen Netzteil 15W 5V 3A; MeanWell, DR-30-5
5V voeding voor alle apparaten
× 1
Prototyping Shield voor Raspberry Pi
Wordt gebruikt om een ​​LED toe te voegen voor statusindicatie en een beveiligde interrupt-ingang voor de ingangskaarten. Biedt ook een 3-polige schroefklem voor betrouwbare verbindingen.
× 1
I2C-Buffer HS
I2C level shifter inclusief de benodigde pull-up weerstanden etc, ondersteunt montage bij stroomverdelers, gebaseerd op P82B96 .
× 1
Arduino Nano R3
Gebruikt als brug tussen DHT22-sensoren en de I2C-bus.
× 1
433Mhz zender en ontvanger
Voor ondersteuning van draadloze relais.
× 1

Apps en online services

Microsoft Visual Studio 2015
Arduino-software (IDE)

Over dit project

Update 2: Het project groeit nog steeds en er zijn al veel nieuwe functies geïmplementeerd (zoals een Twitter-client en de integratie van Telegram-Bots). Raadpleeg de GitHub-repository en release-opmerkingen voor meer informatie over de nieuwe functies (of volg mij op Twitter). Ik hoop dat ik deze projectpagina zo snel mogelijk kan updaten.

Update 1: Allereerst wil ik iedereen bedanken die deze projectpagina heeft gelezen en me feedback heeft gegeven (privé of bij de opmerkingen). Het was erg leuk om dit project te presenteren op Maker Faire Rome 2015 en Microsoft Technical Summit 2015 en toekomstige evenementen wachten nog steeds. Ik heb wat foto's van de evenementen toegevoegd.

Ik ontwikkel de afgelopen drie jaar een oplossing voor huisautomatisering. Dit omvat de fysieke installatie van de hardware en het ontwikkelen van de software.

Functies

Op dit moment worden de volgende functies ondersteund.

Ingangen

  • Drukknop (BUSCH-JAEGER 2020US)
  • Bewegingsdetector (Abus 360° BW8085)
  • Kamertemperatuur (Mijn eigen apparaat op basis van DHT22)
  • Vochtigheid in de ruimte (Mijn eigen apparaat op basis van DHT22)
  • Vensterstatus (open of gesloten met Honeywell Slimline-reedcontact)
  • Zonsopgang, zonsondergang, temperatuur en vochtigheid (overgenomen van OpenWeatherMap)

Uitgangen

  • Lamp (plafond) (aangedreven door relais, niet dimmen)
  • Socket (aangedreven door relais, niet dimmen)
  • Rolluik (raam) (aangestuurd door twee relais voor omhoog en omlaag)
  • Ventilator (plafond) (aangedreven door 3 relais voor elke versnelling)
  • Badkamerventilator (aangedreven door 2 relais voor elke versnelling)

Andere functies

  • De oplossing bevat een web-app voor iOS, Android, Windows, Mac OSX die kan worden gebruikt om de virtuele actuatoren aan te sturen. De configuratie voor de web-app wordt geladen vanaf de controller (Windows IoT-instantie).
  • Alle gebeurtenissen die door invoer en uitvoer worden gegenereerd, kunnen worden gepubliceerd naar een Microsoft Azure Event Hub en/of worden vastgelegd in een CSV-bestand.
  • De controller (Windows IoT-exemplaar) biedt op UDP gebaseerde tracering die kan worden weergegeven met een console-app. De tracering is zeer gedetailleerd en kan worden gebruikt om bugs of verkeerd aangesloten actuatoren enz. te vinden.
  • Aangepaste actuatoren kunnen worden toegevoegd om meer hardware te ondersteunen.
  • Fysieke uitgangen kunnen worden gecombineerd tot logische uitgangen.
  • Animaties (de fysieke uitvoer binnen een logische uitvoer kan worden geanimeerd).
  • Het hele systeem is ontworpen om zo goed mogelijk bestand te zijn tegen fouten/hardwarestoringen. Zelfs als meerdere kerncomponenten zijn losgekoppeld/gebroken, werkt het resterende systeem nog steeds zoals bedoeld (sommige borden in de woonkamer zijn bijvoorbeeld niet bereikbaar vanwege een hardwarestoring, maar de badkamer functioneert nog steeds zoals bedoeld)  
  • Ondersteuning voor 433Mhz externe relais.


Het concept

Toen we ons huis 3 jaar geleden renoveerden, besloot ik mijn eigen domotica-oplossing te implementeren. Het belangrijkste idee achter de implementatie is om alles vanaf de stroomverdeler te regelen met behulp van relais. Door deze beslissing dient elke knop, lamp, stopcontact, rolluik etc. met een eigen kabel via de actor met de stroomverdeler te worden verbonden. Een bus zoals KNX of EIB is niet vereist.

Opmerking :Omdat ik in Duitsland woon, is elk onderdeel ontworpen om te werken met de 230V-voeding. Andere soorten voedingen kunnen verdere aanpassingen nodig hebben. Het plaatsen van 230V kabels (NYM), nieuwe stroomverdelers etc. worden gedaan door mijn voorkeur elektricien en niet alleen.


Hardware

De nieuwe stroomverdeler

We hebben een nieuwe stroomverdeler geïnstalleerd die verantwoordelijk is voor de twee verdiepingen van ons huis.

De I2C-bus

Over het algemeen is de I2C-bus niet ontworpen om met langere kabels te werken, maar het is mogelijk om de maximaal mogelijke lengte te vergroten met behulp van enkele trucs (ik weet niet de reden voor elke optimalisatie, maar dit zijn de dingen die ik op het WWW vond).

  • Rijd de bus op 5V. De RaspberryPi stuurt de bus aan op 3,3V, dus een I2C-niveauschakelaar (P82B96) is vereist. Dit is het eerste (en enige) apparaat dat is toegevoegd aan de RaspberryPi 2 (in mijn oplossing Controller genoemd). De kabel voor deze aansluiting moet zo kort mogelijk zijn. De specificatie maakt het mogelijk om de bus tot 15V te laten werken, maar de slaves zoals PCF8574 ondersteunen alleen max 5V.
  • Gebruik een twisted pair-kabel zoals CAT7. Het is belangrijk om één paar te gebruiken voor SDA&GND en een ander paar voor SCL&GND. Gebruik geen enkele twisted pair-kabel voor SDA&SCL. Zorg er ook voor dat de afscherming van de kabel is aangesloten op PE (in Duitsland).
  • Geef de voorkeur aan een strengkabel. Dit maakt het ingewikkelder om alles aan te sluiten, maar vergroot de lengte van de kabel.
  • Voeg pull-up-weerstanden met 10k toe aan het einde van de bus voor SDA en SCL.
  • Beperk de bussnelheid tot 100 kbits (standaardmodus), zelfs als de slaven hogere snelheden ondersteunen.
  • Voeg een I2C-buffer toe (P82B96). Het IC kan worden gebruikt als niveauverschuiver of kan worden gebruikt om de bus in fysieke segmenten te scheiden. Ik heb een van deze buffers gebruikt in de stroomverdeler. De buffer moet in het midden van de bus worden geplaatst.

Deze geoptimaliseerde I2C-bus wordt gebruikt om elk bord in de stroomverdeler aan te sluiten.


De relaiskaarten (uitgangen)

CCTools uit Duitsland verkoopt borden met relais die kunnen worden aangesloten op de I2C-bus. Het is ook mogelijk om de borden als losse onderdelen of alleen de printplaat te kopen. Hierdoor kan de poortuitbreiding worden vervangen door pin-compatibele alternatieven. De eerste is vereist omdat de beschikbare adressen van de apparaten beperkt zijn. Ik heb houders voor het relais en IC's toegevoegd, zodat ik ze gemakkelijker kan vervangen als er een kapot is. Een ander punt is dat ik een PCA9555D . kan gebruiken in plaats van een MAX7311 omdat de PCA9555D is goedkoper en makkelijker te bestellen (in Duitsland).

De HSRel5 relaiskaart heeft 5 relais en 3 GPIO's . Alle vereiste poorten zijn afkomstig van de interne PCF8574 8bit poortuitbreiding met 8 GPIO's . De eerste 5 worden gebruikt voor de relais en de laatste 3 kunnen worden gebruikt voor andere uitgangen. De relais hebben 12V nodig om te werken, wat niet kan worden geleverd door de poortuitbreiding (die alleen een LED kan aansturen). Er is dus een relaisstuurprogramma nodig. De relais zijn verbonden met de relaisdriver en de relaisdriver is op zijn beurt verbonden met een omvormer. Deze omvormer is vereist omdat de status van alle poorten op de poortuitbreiding HOOG is nadat het IC stroom krijgt. Hierdoor worden alle relais gesloten, wat een onbedoeld gedrag is.

Conclusie: Als het eerste relais moet worden gesloten, moet u 00011110 (MSB) . verzenden naar de poortuitbreiding via de I2C-bus. Hiermee wordt de eerste poort ingesteld op LAAG (de andere poorten worden ook bijgewerkt). De eerste poort van de poortexpander wordt aangesloten op de eerste ingang van de omvormer. En de eerste uitgang van de omvormer is aangesloten op de eerste ingang van de relaisdriver (ULN2803). Als laatste deel van de ketting wordt het relais aangesloten op de eerste uitgang van de relaisdriver.

Een ander relaisbord van CCTools is de HSRel8(+8) die een MAX7311 . gebruikt als de poortuitbreiding en bevat 8 relais en 8 GPIO's . Dit bord heeft geen hardware omvormer nodig. Dit betekent dat een HIGH status voor een relais op de HSRel5 betekent UIT en een HIGH staat op de HSRel8(+8) betekent AAN. Dit afwijkende gedrag wordt afgehandeld door het stuurprogramma voor die apparaten en maakt deel uit van de software.

Elke lamp, stopcontact etc. wordt aangesloten op een van deze relais. Thuis gebruik ik momenteel 8 HSRel5 en 4 HSRel8 . Ik gebruik ook borden met solid-state relais en andere soorten relais, maar om het kort te houden zal ik hier niet in detail treden. De HSRel5 is het eenvoudigste relaisbord. Maar de PCF8574 staat slechts 8 verschillende adressen toe. De PCF8574 A is dezelfde poortuitbreiding maar heeft 8 verschillende adressen. Dit betekent dat 16 HSRel5 kan worden aangesloten op de I2C bus.


De poortuitbreidingen (ingangen)

Knoppen, bewegingsdetectoren en reed-schakelaars (voor de ramen) zijn aangesloten op een bord met de naam I2C-Port16 HS van CCTools . Dit bord bevat een poortuitbreiding (MAX7311 ), pull-up weerstanden (5V, 10K) voor elke poort en keramische condensatoren (100NF ). Het bord kan worden gebruikt met 12V of 5V voeding. De keramische condensatoren worden gebruikt om ruis weg te filteren (glitch filter).

Elk invoerapparaat (knop, bewegingsmelder, reed-schakelaar) heeft zijn eigen kabel naar de stroomverdeler. Een CAT7 kabel wordt gebruikt voor elk invoerapparaat omdat het een afscherming moet hebben, die is verbonden met PE (beveiligingsaarde). Spots die meer dan één knop hebben, zoals de knoppen voor de rolluiken, kunnen worden aangesloten met slechts één CAT7 kabel.

Bij de stroomverdeler is elk invoerapparaat aangesloten op één poort van de poortuitbreiding en GND . Door de pull-up weerstanden is de toestand bij de poorten HIGH standaard. Door op de knop te drukken, wordt de poort verbonden met GND wat resulteert in een LAAG toestand van de haven. De bewegingsdetectoren en reed-contacten werken ook op die manier.

Een gedeelde onderbreking kabel is aangesloten op alle invoerkaarten. Deze kabel is standaard opgetrokken. In het geval van een gewijzigde status bij een van de poortuitbreidingen, zal de corresponderende poortuitbreiding de status van de interrupt instellen naar LAAG. Dit gedrag voorkomt continue polling van alle poortuitbreidingen die de I2C-bus gebruiken. De software op de Pi2 peilt alleen de corresponderende GPIO. Als de status bij de interrupt-GPIO is gewijzigd, wordt de huidige status van elk invoerbord dienovereenkomstig opgevraagd en worden gebeurtenissen indien nodig geactiveerd.


Raspberry Pi 2

De Raspberry Pi 2 draait op Windows 10 IoT en wordt met een op maat gemaakte behuizing aan de stroomverdeler gemonteerd. Het heeft ook een prototype-schild met een status-LED, de interrupt poort met een pull-up weerstand (10K ), een beschermingsweerstand (1K ), en een keramische condensator (100NF ) voor glitch-filtering. Alle kabels kunnen worden aangesloten met een schroefklem.

Temperatuur- en vochtigheidssensor

De huidige temperatuur en vochtigheid op elke kamer/plaats (momenteel 10) wordt gemeten met een DHT22 (AOSONG). Deze sensor levert de huidige temperatuur en vochtigheid met behulp van een eigen protocol dat adressering niet ondersteunt. Dit vereist dat elke sensor is aangesloten op een microcontroller. Voor mijn oplossing heb ik besloten om een ​​Arduino Nano V3.0 . toe te voegen als slaaf van de I2C bus. De Arduino Nano leest elke 2,5 seconden de waarden van alle aangesloten sensoren en slaat ze lokaal op. Deze waarden kunnen worden afgelezen van deArduino Nano na het verzenden van de poort-ID (0-10). Het is hetzelfde gedrag bij het lezen van gegevens uit registers met behulp van de I2C-bus.

De temperatuur en luchtvochtigheid worden in de web-app weergegeven met twee verschillende weergaven.

Het pictogram aan de rechterkant van de vochtigheid ("Luftfeuchtigkeit" ) invoer geeft aan of er al dan niet een verhoogd risico op schimmelgroei aan de wanden is. Een waarde minder dan 60% is groen , minder dan 70% is geel en boven 70% is rood.

De webapp geeft ook een overzicht van alle sensoren.


Hardware-installatie

De volgende afbeelding illustreert een hardwareconfiguratie bij de stroomverdeler met behulp van invoer- en uitvoerkaarten. De 12V/5V voeding en de N/PE-aansluitingen worden niet weergegeven.

433Mhz relais op afstand

Tijdens het migreren en documenteren van het project in de loop van deze uitdaging heb ik ook de 433Mhz zendereenheid ontwikkeld die handig is verborgen in een eenvoudige behuizing samen met de temperatuur- en vochtigheidssensoren.

Deze functie maakt relaiskaarten optioneel. De Arduino Nano die verantwoordelijk is voor de DHT22 (Temperatuur en Vochtigheid) sensoren zenden ook de 433Mhz signalen uit. De afzender (FS1000A ) wordt samen met de temperatuur- en vochtigheidssensor in een behuizing in een centrale kamer van het huis gemonteerd. Om het bereik van de zender nog verder te vergroten, wordt deze extra gevoed met 12V (werkt ook met 3.3 maar kort bereik).


Een van de grootste problemen met de externe relais is dat ze geen statusinformatie verzenden. Het is dus absoluut mogelijk voor de gebruiker om statuswijzigingen in het systeem door te voeren met behulp van de originele afstandsbediening. Om synchronisatie te forceren, werkt de softwareoplossing de status automatisch elke 5 seconden bij. Dit houdt de status die wordt weergegeven op de web-app zo betrouwbaar mogelijk (maar maakt het gebruik van de originele afstandsbedieningen nutteloos).

Externe relais kunnen in elke automatisering worden gebruikt en bieden dezelfde functies als relais van een relaiskaart.

De codes van de 433Mhz-afstandsbediening kunnen momenteel alleen handmatig worden geconfigureerd via een circuit dat is gebouwd op een prototypebord. Die codes worden vervolgens gekopieerd naar de configuratie. De fritzing schets voor de vereiste printplaat wordt hieronder verwezen en de Arduino sketch bevindt zich in de repository in de map CK.HomeAutomation.SensorsBridge\RemoteCodeFinder .


De digitale kattenbak

De kattenbak voor onze kat staat in de berging die helaas geen raam heeft om na gebruik wat frisse lucht binnen te laten. Vanwege dit probleem is de box verbonden met een oude ongebruikte rookkanaal. Voor de buis die op het rookkanaal is aangesloten, bevindt zich een ventilator die is aangesloten op een relais bij de stroomverdeler. Een bewegingsdetector in de berging detecteert zelfs de kat en start de ventilator enkele minuten.

De kattenbak heeft een eigen pictogram in de web-app waarmee de ventilator op afstand kan worden bediend.

Door de gegenereerde logs te analyseren en te filteren op de bijbehorende actuatorwijzigingen (Azure SQL DB- of CSV-bestand) is het voor ons mogelijk om het gebruik van de kattenbak van de kat in de loop van de tijd te volgen en daardoor de vereiste reinigingsintervallen te verbeteren.


Software

Vóór de release van Windows 10 IoT draaide de software op een G120 van GHI electronics met behulp van het .NET Micro Framework in versie 4.3. Maar vooral vanwege het gebrek aan prestaties (120 MHz, 16 MB RAM en tolk) werkten niet alle geplande functies zoals gepland.

Een paar weken geleden ben ik begonnen met het migreren van de codebase om deze als een Windows 10 IoT-achtergrondtaak uit te voeren, terwijl ik ook functies toevoeg zoals de Microsoft Azure-integratie.

De repository waarnaar hieronder wordt verwezen, bevat de Visual Studio 2015-oplossing en alle afhankelijke projecten. Het is alles wat nodig is om de Raspberry Pi 2 als Home Automation Controller te gebruiken, terwijl je openstaat voor uitbreiding door aangepaste stuurprogramma's te schrijven voor andere relaisborden of sensoren.


Projecten

De projecten van de softwareoplossing zijn gegroepeerd in:

  • App (bevat de web-app)
  • Controllers (bevat het opstartproject voor de Pi en de thuisconfiguratie)
  • SDK (bevat alle gedeelde projecten)

CK.HomeAutomation.TraceViewer

Dit project bevat een consoletoepassing die traceerberichten weergeeft die door de controller zijn verzonden (Pi2-instantie). Momenteel worden alle notificaties continu via een UDP-socket naar een broadcastadres gestuurd. Daarom is het nodig om een ​​poort (bijv. 19227) bij de firewall te openen. Ik gebruik de TraceViewer voornamelijk om bugs en/of verkeerde configuraties te vinden.

Alle klassen die nodig zijn om meldingen te verzenden, bevinden zich op het project CK.HomeAutomation.Notifications .


CK.HomeAutomation.Netwerken

Dit project omvat de implementatie van een eenvoudige HTTP-server. De HTTP-server is vereist voor de web-app en biedt statusinformatie in JSON-indeling en accepteert verzoeken met statuswijzigingen.

De HTTP-server kan ook de web-app hosten. Vanwege verschillende pakketnamen moet de inhoud van de web-app handmatig worden geüpload naar de doelmap met behulp van de administratieve SMB-share.

Doelmap: \\[IP]\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\app


CK.HomeAutomation.Controller.*

Elk project in de Controllers map is een opstartproject het implementeren van een IoT-achtergrondtaak . Totdat een gedetailleerde documentatie is verstrekt, kunnen deze projecten (momenteel bij mij thuis) als voorbeeld worden gebruikt.

Daarnaast verzorg ik het project CK.HomeAutomation.Controller.Empty als uitgangspunt om met de oplossing te spelen. OPMERKING :De controller genaamd Kelder die verantwoordelijk is voor de tuin- en parkeerplaatsverlichting wordt niet behandeld in deze documentatie.

Voordat u de oplossing test, moet u bekend zijn met de volgende taken:

  • Een Raspberry Pi2 helemaal opnieuw instellen met Windows 10 IoT (https://ms-iot.github.io/content/en-US/win10/SetupRPI.htm)
  • Maak verbinding met de Raspberry Pi2 met behulp van een Microsoft PowerShell-sessie op afstand (https://ms-iot.github.io/content/en-US/win10/samples/PowerShell.htm)
  • Een universele Windows-app implementeren op de Raspberry Pi2.

De oplossingsmap bevat ook een kleine PowerShell script genaamd SetupRaspberryPi.ps1 om een ​​gemeenschappelijke reeks opdrachten uit te voeren om de Raspberry Pi2 in te stellen. Het wordt aanbevolen maar niet vereist dat u het script uitvoert (zorg ervoor dat u alle IP-instellingen aanpast volgens uw eigen infrastructuur ).

CK.HomeAutomation.Actuators

Dit project biedt het hoogste abstractieniveau. Het huis, kamers en elke actuator zoals drukknoppen, lampen, stopcontacten enz. zijn in dit project geïmplementeerd en bieden speciale evenementen en methoden volgens de kenmerken van elke actuator.

Kamers kunnen worden gemaakt met behulp van een vloeiende API, waardoor de configuratie gemakkelijk te lezen en te begrijpen is.

Bewegingsdetector - Actuator

Deze actuator wordt gebruikt om mensen en beweging in de kamers te detecteren. Ik gebruik de bewegingsdetector BW8085 360° van Abus die aan het plafond van elke kamer wordt gemonteerd.

De implementatie van een bewegingsmelder-actuator levert twee gebeurtenissen op. De eerste van de twee is de MotionDetected gebeurtenis die wordt geactiveerd als er beweging wordt gedetecteerd. De fysieke bewegingsdetector houdt de output op een HIGH niveau totdat er geen beweging meer wordt gedetecteerd, waarna de tweede gebeurtenis DetectionCompleted is ontslagen.

De volgende afbeelding toont een vermelding voor een bewegingsdetector in de web-app. Elke bewegingsmelder kan worden gedeactiveerd (alleen in software) met behulp van de web-app. De rode stip geeft aan dat er momenteel beweging wordt gedetecteerd.

Knop - Actuator

Deze actuator vertegenwoordigt een fysieke drukknop. De knop heeft twee gebeurtenissen die aangeven dat er op is gedrukt. De gebeurtenis PressedShort wordt geactiveerd als de knop kort (<1,5 seconde) wordt ingedrukt, terwijl de gebeurtenis PressedLong wordt alleen geactiveerd als de knop langer wordt ingedrukt (> 1,5 seconde). De tweede gebeurtenis wordt ook automatisch geactiveerd als de duur (1,5 seconde) is verstreken en de drukknop niet wordt losgelaten. Deze twee gebeurtenissen maken knoppen met meerdere functies mogelijk.

Voorbeeld:

De oplossing bevat ook een VirtualButton . Deze knop implementeert dezelfde interface (IButton ) en kan alleen worden "ingedrukt" met de web-app.


Socket, Lamp, BinaryStateOutput - Actuator

De basisklasse BinaryStateOutput wordt gebruikt voor elke actuator die een binaire toestand ondersteunt (ON en UIT ) alleen. Voorbeelden voor die actuatoren zijn Socket en Lamp . De basisimplementatie biedt methodes voor het updaten (ON en UIT ) of de status omschakelen. Knoppen kan interageren met objecten die de IBinaryStateOutputActuator implementing implementeren , hierdoor kunnen meerdere aangepaste actuatoren worden toegevoegd.

De volgende afbeelding toont de sjabloon voor elke binaire statusuitvoer. Het pictogram aan de linkerkant is anders voor stopcontacten en lampen. Aangepaste pictogrammen zoals de giffles bij de "Mückenstecker " invoer kan worden gedefinieerd met behulp van het configuratiebestand (Configuration.js ) voor de web-app.

CombinedBinaryStateActuators

Elke fysieke actuator van het type BinaryStateOutput kan worden gebruikt om een ​​logische binaire toestandsactuator te creëren. Eén actuator moet worden ingesteld op "master", wat nodig is om de nieuwe status te bepalen als de status moet worden omgeschakeld. De actuator heeft zijn eigen ID en kan worden gebruikt zoals elke andere uitvoeractuator met binaire toestand (de vereiste interface is geïmplementeerd).

Een belangrijk voordeel van deze implementatie is de manier waarop statusupdates worden afgehandeld. Gewoonlijk wordt de nieuwe status van een binaire statusuitgang rechtstreeks een voor een aan elk apparaat toegewezen via de I2C-bus. Dit gedrag zorgt voor korte maar zichtbare vertragingen tussen elke statusupdate van de actuator. De CombinedBinaryStateActuator voorkomt deze vertraging door het bijhouden van interne wijzigingen.

Voorbeeld:

StateMachine - Actuator

More complex states than ON and OFF are possible to configure using the StateMachine . This actuator allows multiple states for ports (relays) or other binary output actuators.

Example with a fan:

The state machine provides methods to turn it off or moving to the next state. The state is reset to OFF if the last state of the state machine has been reached and the initial state should be applied next.

Another use case for the state machine is creating templates or "moods" for a couple of other actuators.

Example mood:

The method WithTurnOffIfStateIsAppliedTwice ensures that the state of the state machine will change to OFF if a particular trigger has been activated a second time as the configured state is still active (Example :Pressing the push button for "DeskOnly " will activate the "DeskOnly " mood. If the push button is pressed again while the "DeskOnly " mood is still active, the actuator applies the OFF staat. A dedicated push button for the OFF state is not needed.).

The following image shows the template for state machines. The caption and image of each state can be changed using the configuration file of the web app.

TemperatureSensor / HumiditySensor

The values for temperature and humidity are read using the I2C sensors bridge. Both values are read from a single physical device but separated into an actuator for temperature and an actuator for humidity. The values are automatically polled every 10 seconds.


Home Automation !=Home Control

As mentioned before the importing thing is automation. Without automations, the whole solution is only one big remote for the home. This solution provides several automations:


AutomaticTurnOnAndOffAutomation

This automation sets the connected binary state outputs to ON. A push button or motion detector can be used as the trigger. It is required to specify the desired duration of the ON staat. The state is set to OFF if that range exceeds. The state is automatically set to OFF if the specified range is exceeded. An optional time range can be provided in which the automation rule is enabled. Predefined ranges for "day only " or "night only " are available (requires a weather station object).

Example:

AutomaticRollerShutterAutomation

This automation is used to move several roller shutters automatically according to several conditions. One of these conditions is sunrise and sunset which means that the roller shutters are automatically moving up at sunrise and moving down at sunset (requires a weather station object). It is also possible to add a diff to sunrise and sunset. According to the sunrise and sunset feature, it is possible to specify a time for "do not open before" which will ensure that the roller shutter is never opened before that point in time has been reached. Another condition is the outside temperature (also requires a weather station object), which enables the roller shutters to be closed automatically if the outside temperature exceeds a certain value like for example 28°C. This feature is intended for roof windows.

The position of the roller shutter is also tracked via time measuring. The required duration between up and fully closed must be configured.

Example:

The following screenshot shows an entry for roller shutters at the web app. The progress bar over the buttons is showing the current position.

AutomaticConditionalOnAutomation

This automation is used to set the state of several binary state outputs to ON while conditions are matching. This automation is used for lamps in the garden which are only ON at night. It is possible to specify one time range for the ON state and multiple time ranges for the OFF staat. It is also possible to use sunrise and sunset for the ON state (requires a weather station object).

Example:

General automation and complex conditions

The latest feature of the new implementation is a generic automation and condition framework. The generic automations are designed to execute custom actions if the configured conditions are met. This is checked every time a trigger is invoked via a push button, motion detector, interval or any other code.

Weather station

Many of the automations and conditions are depend on environment conditions like the current weather, sunrise and sunset times, outside temperature or humidity. All of these information is currently provided every 60 seconds by a virtual weather station backed by WebApi of OpenWeatherMap. The virtual weather station is implemented using the interface IWeatherStation , this makes it easy to seamlessly integrate physical stations located in garden.


CK.HomeAutomation.Hardware

This project contains the drivers for all currently supported input and output devices. Specifically the relay boards, input boards from CCTools and 433Mhz remote switches. The driver and source code of the Arduino Nano (sensor bridge and 433Mhz sender) is included too. All higher level objects like actuators and automations are implemented against interfaces to add an abstraction layer to the concrete bare to the metal hardware classes. This makes it easy to later add further drivers for other boards and sensors.


CK.HomeAutomation.Telemetry

This project contains two components. The first one is a CSV writer which writes every changed state to the "LocalState" directory of the package. This file can be downloaded from the Pi2 using the administrative SMB share: \\192.168.1.15\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\BinaryStateOutputActuatorChanges.csv .

Example content of the the CSV file:

The second component is the AzureEventHubPublisher . This component sends events for any state has change and the values of any sensor change to an Microsoft Azure EventHub . Events are also generated if push buttons are pressed or motion is detected. The solution contains the SQL scripts for creating the required SQL database tables and the required query for a StreamAnalytics job (in folder #Azure).

Every changed actuator state generates to entries at the Azure SQL database. The first entry contains the START event and the new state. The second entry contains the END event with the total duration of that state in seconds.

I already created some reports using a free Microsoft PowerBI account.

WebApp

The software solution contains the project CK.HomeAutomation.App . This project is a web app building on top of AngularJS , jQuery and Bootstrap . The room configuration is read from the controller (Pi2) and the UI is generated according to the existing rooms.

The web app can be opened directly from the file system using the index.html  file or uploaded to a web server. The file Configuration.js  is used to configure and translate the web app. The IP address of the Controller (Pi2 instance) must be set in the configuration file.

The web app can be added to the home screen of iOS only if it is hosted at a web server (I am personally using a BananaPi with nginx). Adding a web app to the home screen is described here: http://www.tech-recipes.com/rx/44908/ios-add-website-shortcut-to-home-screen/

Hosting the web app at the Raspberry Pi2 is already in progress but currently not supported completely.

Terminal

The web app also runs at the living room. An old iPad 3 is used as the terminal.

Future

The solution described above is still under development and will get more features in the future. Some of the planned are: 

  • Support for actuators based on infra red signals (like an RGB-LED-Strip).
  • Support for XML based configuration files in addition to code based configuration.
  • Implementation of a dedicated tablet web app with a different layout.
  • Support for reed switches for windows which are showing the state at the web app.
  • Libraries with drivers for devices from other manufacturers (like 433Mhz remote switches).
  • Controlling of the valves of the heating system (outputs and temperature reading already implemented).
  • Alarm system which sends notifications if motion is detected or windows are opened (requires implementation of point 4).
  • A hardware weather station.
  • Automatically closing roller shutters if the window is open and rain is detected (the currently used weather API already provides the required information).
  • More Unit Tests.
  • Detailed documentation at the GitHub wiki.
  • Animations (this feature was already implemented using NETMF but I was not able to migrate it completely within the time range of the IoT contest)

If you are interested to contribute to this project (hardware, software, documentation or anything else), feel free to contact me.

Code

CK.HomeAutomation
This repository contains the complete solution including the SDK, WebApp and my personal configuration.https://github.com/chkr1011/CK.HomeAutomation.git

Schema's

This is the circuit which us required to read the 433Mhz codes from the remote control. The sketch contains the circuit board of the DHT22 sensor which is mounted at every room. The shield contains a status LED and screw terminals for the I2C bus and the interrupt. This is a regular temperature and humidity sensor which conains a 433Mhz sender. Only one is required for the entire home.

Productieproces

  1. Raspberry Pi Temperature Logger
  2. Bewaking op afstand van het weer met Raspberry Pi
  3. SensorTag naar Blynk met Node-RED
  4. Bewegingssensor met Raspberry Pi
  5. Bewaak je huistemperatuur met je Raspberry Pi
  6. Windows 10 IoT Core – Hartslagpulsen lezen
  7. RASPBERRY PI HOME AUTOMATION
  8. Windows 10 IoT Core op Raspberry Pi 2 – Adafruit-sensorgegevens
  9. Windows 10 IoT Core en SHT15
  10. Windows 10 IoT Core voor Raspberry Pi 3 Model B+
  11. Robot die Raspberry Pi &Bridge Shield gebruikt