“Betraktare, betraktare framför spegeln här. Säg mig vilken spegel som vackrast i landet är.”

Varje smart hem och arbetsplats med självaktning behöver naturligtvis en smart spegel. Så även m. Projektet kan varieras i det oändliga. En del väljer att ha lika stor skärm som spegel och en del bygger en egen ram. Så här gjorde vi.

Introduktion

Vi hittade en liten 7-tumsskärm i en hylla här som vi bestämde oss för att använda. Spegelfilm beställde vi på nätet. Ramen köpte vi i ett möbelvaruhus. Här följer en fullständig materiallista med länkar till de produkter vi hittade i vår egen shop.

Material

Raspberry Pi 3
Raspberry Pi Kylfläns
Spänningsmatning
Minneskort
HDMI-kabel
PIR-sensor
Jumperkablar
Skärm
Ram
Spegelfilm för envägsspegel
Svart kartong
(Tangentbord och mus för programmering)

Programmering

Vi utgick från projektet MagicMirror2 och beskriver hur vi använde det nedan.

Börja, som vanligt, med att prototypkoppla det hela.

Se till att alltid spänningssätta skärmen före Pi:en.

Installera en full version av Raspbian på minneskortet. Installera sedan MagicMirror2 genom att exekvera raden:

bash -c "$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)"

Det finns ett par inställningar som inte direkt har med MagicMirror att göra, men som underlättar för projektet:

Minska processoranvändning för att undvika överhettning:

https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi#enable-the-open-gl-driver-to-decrease-electrons-cpu-usage

Stäng av muspekaren:

För att slippa se pilen på på spegeln när musen inte längre är inkopplad. Instruktionen nedan släcker muspekaren efter några sekunder.

https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi#autohiding-the-mouse-pointer

Om man vill kan man även stänga av skärmsläckaren, men det hoppade vi över eftersom vi tyckte det fungerade tillräckligt bra med rörelsesensorn.

Autostarting MagicMirror: 

Se till att MagicMirror alltid startas direkt när Pi:en startas.

https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror

Moduler

Systemet bygger på att man installerar moduler i mappen ~/MagicMirror/modules och därefter konfigurerar dem i filen config.js som ligger i mappen ~/MagicMirror/config . Använd valfri texteditor. Vi använde nano:

nano /home/pi/MagicMirror/config/config.js

Vi valde att använda följande moduler som medföljer från början:

  • Alert– en platshållare för varningar från andra moduler
  • Compliments– växlande text
  • Updatenotification – här visas om MM2 behöverupp dateras
  • Clock– klocka och datum
  • Currentweather– nuvarande väderrapport
  • Weatherforecast– väderprognos
  • NewsFeed – RSS-nyhetsflöde som i vårt fall visar nyheter omväxlande från SVT och Corren

För att få tillgång till väderinformationen behövs en API-nyckel som hämtas från openweathermap.org .

  1. Skapa ett konto
  2. Gå till fliken ”API keys” och hämta nyckeln.

Vi installerade även följande tredjepartsmoduler:

  • MMM-PIR-Sensor –släcker skärmen när ingen är i närheten.
  • MMM-ResRobot – visar bussavgångar från våra närmaste hållplatser.
  • MMM-Pollenrapport– visar pollenrapporten från närmaste mätstation.
  • MMM-Fibaro – visar temperatur och energiförbrukning från vårt hemautomationssystem Fibaro HC2.

En lista med fler tredjepartsmoduler finns här.

MMM-ResRobot är allra klurigast av alla modulerna, eftersom den behöver en API-nyckel som inte är helt självklar att få tag i.

  1. Skaffa ett konto på www.trafiklab.se .
  2. Starta ett nytt projekt och fyll i all efterfrågad information.
  3. Gå till fliken API-nycklar och hämta hem nyckeln.
  4. Hitta de hållplatser du vill använda på sidan www.trafiklab.se/api/resrobot-reseplanerare/konsol
    1. Välj metoden ”Platsuppslag”
    2. Fyll i namnet på din hållplats
    3. Tryck på ”Anropa APIet”
    4. Tryck på ”API-svar”
    5. ID för din hållplats visas i Body. I vårt fall”740053855”
    6. Gör på samma sätt för alla hållplatser du vill använda.

Modulerna kan placeras på följande olika positioner:

top_bar, top_left, top_center, top_right, upper_third, middle_center, 
lower_third, bottom_left, bottom_center, bottom_right, bottom_bar, 
fullscreen_above, fullscreen_below 

Det är inte särskilt väl dokumenterat vilken som hamnar var, så man får testa sig fram.

Nästan högst upp i config-filen lade vi även till följande lokala förändringar:

language: ”sv”
timeFormat: 24, 
units: ”metric”,

Det finns oändligt många inställningar man kan göra ide olika modulerna, men det är inte svårt och det går fort att starta om MM för att se ändringarna.

Uppdatera moduler

När spegeln väl är klar är det smidigt att kunna uppdatera den. Det händer ju, till exempel, att det släpps nya versioner av modulerna. Antingen kan man då välja att dölja uppdateringsinformationen (genom att stänga av modulen Alerts) eller också faktiskt göra uppdateringen. 🙂

Vill man inte koppla in mus och tangentbord till spegeln där den sitter, kan man SSH:a sig in till den med valfri SSH-klient. Vi använde PuTTY.

Ta reda på vilket IP-nummer Pi:en fått på nätverket och anslut.

När en modul behöver uppdateras, gå till den modulen (exempel: cd ~/modules/MMM-Fibaro) skriv ”git status” för att kolla status. Använd kommandot ”git pull” för att uppdatera din lokala kopia av modulen.

För att uppdatera själva MagicMirror2 till senaste version, gå till mappen MagicMirror och skriv

 git pull && npm install 

Om du inte ändrat något annat än config-filen eller modulerna så ska det gå bra. Gör det inte det kan du testa att ta bort dina lokala ändringar med kommandot

git reset --hard

Starta om Pi:en med kommandot ”sudo reboot now”. Det räcker att göra så eftersom MagicMirror automatstartas.

Passa på att göra en backup på minneskortet. Vi beskriver hur man kan göra det smidigt i det här blogginlägget.

Montering

När du är nöjd med hur din MagicMirror fungerar i prototypkopplingen är det äntligen dags att börja bygga ihop spegeln.

Spegelfilmen

Vi hade turen att hitta en ram med riktigt glas i och det är förmodligen det bästa för att spegelfilmen ska se bra ut. Det är säkert också hjälpsamt att ha fäst spegelfilm någon gång förut, men det hade inte vi… 🙂

Hantera filmen varsamt, för om det blir repor i den kommer de synas på den färdiga spegeln.

En envägsspegel släpper igenom olika mycket ljus från de olika hållen. Testa vilken sida som ska vara utåt för att skärmen ska synas igenom så bra som möjligt. Vi fäste filmen på insidan av glaset.

Filmen har en klistrig sida med skyddsplast på, som är den som ska fästas på glaset. Rengör glaset noggrant. Skär till en bit film som är något större än glaset för att det blir enklare att placera den rätt då. Spraya vatten både på filmen och på glaset för att underlätta appliceringen. Använd cirka fyra händer för att lägga filmen på plats. Vattnet gör att den inte fäster omedelbart, men det bidrar även till en del bubblor i filmen. Det går att försiktigt skrapa ut de större bubblorna till kanten med ett busskort eller liknande och ännu fler bubblor försvinner när vattnet avdunstar. När filmen är på plats går det enkelt att skära bort resterna av filmen längs kanterna på glaset.

Skärmen

Vi strippade skärmen på allt oväsentligt för vårt projekt (såsom ytterhölje, knappar och högtalare). Då fick displayen plats mellan glaset och ramens bakstycke och det räckte att klämma fast den där för att den skulle hålla sig på plats. Skärmens elektronik fäste vi på bakstycket och flatkabeln mellan displayen och elektroniken kunde utan problem gå runt ramens bakstycke.

Eftersom spegelfilmen delvis släpper igenom ljus, passade vi på att lägga svart kartong närmast glaset, med ett utskuret hål för skärmen att titta ut igenom. Genom att anpassa hålet till bara den skärmytan man faktiskt vill se, slipper man även se eventuella statuslysdioder.

Den svarta kartongen gör att spegeln ser mer homogen ut. När skärmen är släckt ser den faktiskt ut som en helt vanlig spegel.

Elektroniken

Det som fick styra placeringen av elektroniken var HDMI-kabeln, eftersom den har en egen stark vilja. 🙂

Vi limmade, helt enkelt, fast HDMI-kabelns kontakter på ramens bakstycke med smältlim. Det räckte för att hålla Raspberryn och skärmelektroniken på plats. På det här sättet blir det enkelt att plocka bort någon eller båda av dem ifall man vill göra något annat med dem i framtiden eller om man behöver ta bort korten av någon annan anledning.

Vi märkte att Raspberryn blev varm vid användning och eftersom den kommer sitta bakom spegeln nära väggen, satte vi dit en kylfläns.

Rörelsesensorn

Eftersom spegeln inte behöver ha skärmen tänd när ingen är i närheten, använde vi en rörelsesensor av PIR-typ att styra den med. Det finns ett fint färdigt script att använda i MMM-PIR-Sensor-modulen. Scriptet lyssnar på event från rörelsesensorn och låter skärmen vara tänd i någon minut när den registrerat rörelse.

Rörelsesensorn kopplas in med jumperkablar till Pi:en. Följ anvisningarna i produktinformationen och se till att pinnen för signalen stämmer med vad som anges i MMM-PIR-Sensor-modulen (i vårt fall pinne 18).

Rörelsesensorn är vit och vi tyckte inte det blev snyggt att sätta den direkt utanpå vår svarta spegelram. Därför designade vi och skrev ut en liten låda till den. Vi använde Tinkercad för att designa den och vår 3D-skrivare Lulzbot Mini för att skriva ut lådan i svart PET-G.

Lådan designades så enkel som möjligt och har därför öppen baksida. Vi monterade den med smältlim på ramens undersida och drog sedan kablarna igenom ett litet hack som vi sågade i den nedre kanten av ramen.

Slutmonteringen

Vi sågade en liten urgröpning i kanten av ramen för att enkelt kunna dra ut spänningsmatningskablarna mellan ramen och väggen. Eftersom vi har tillgång till el ovanför spegeln drog vi kablarna uppåt och täckte kablarna med en kabellist.

Med vår lösning kunde vi fortfarande använda ramens originalupphängning, vilket var väldigt smidigt.

Färdigt!

Till vardags använder vi numera spegeln till att kolla utomhustemperatur/väder, busstider och veckonummer. Dessutom hälsar den förstås välkommen till m vilket är trevligt!

Koden

Nedan följer vår config-fil.

/* Magic Mirror Config Sample
 *
 * By Michael Teeuw http://michaelteeuw.nl
 * MIT Licensed.
 *
 * For more information how you can configurate this file
 * See https://github.com/MichMich/MagicMirror#configuration
 *
 */

var config = {
	address: "localhost", // Address to listen on, can be:
	                      // - "localhost", "127.0.0.1", "::1" to listen on loopback interface
	                      // - another specific IPv4/6 to listen on a specific interface
	                      // - "", "0.0.0.0", "::" to listen on any interface
	                      // Default, when address config is left out, is "localhost"
	port: 8080,
	ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], // Set [] to allow all IP addresses
	                                                       // or add a specific IPv4 of 192.168.1.5 :
	                                                       // ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.1.5"],
	                                                       // or IPv4 range of 192.168.3.0 --> 192.168.3.15 use CIDR format :
	                                                       // ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.3.0/28"],

	language: "sv",
	timeFormat: 24,
	units: "metric",

	modules: [
		{
			module: "alert",
			config: {
				display_time: 1000,
				timer: 1000
				}
		},
		{
			module: "MMM-PIR-Sensor",
			config: {
				sensorPin: 18,
				powerSavingDelay: 60,
				powerSavingNotification: false,
				powerSavingMessage: "Går ner i strömsparläge"
			}
		},
		{
			module: "updatenotification",
			position: "top_bar"
		},
		{	module: "compliments",
			position: "top_center",
			config: {
				compliments: {
					anytime: [
						"Välkommen till m!",
						"m gillar dig!"
					],
					morning: [
						"Godmorgon!"
					],
					afternoon: [
						"Chip och välkommen till m!"
					],
					evening: [
						"Svårt att lämna m? Förståeligt!"
					]
				}
			}

		},
		{
			module: "clock",
			position: "middle_center",
			config: {
				showWeek: true,
				displayType: "digital", //digital, analog eller both
				clockBold: false
				
			}
		},
		{
			module: "MMM-ResRobot",
			position: "top_right",
			header: "Bussen",
			config: {
				routes: [
					{from: "740054292", to: "740040961"},
					{from: "740053855", to: "740010956"}
				],
				skipMinutes: 0,
				maximumEntries: 6,
				truncateAfter: 5,
				apiKey: "fyll i din api-nyckel här"
			}
		},
		{
			module: "MMM-Pollenrapport",
			position: "bottom_left",
			header: "Pollenrapport Nkpg",
			config: {
				city: 94
			}
		},
		{
			module: "currentweather",
			position: "top_left",
			config: {
				location: "Linköping",
				locationID: "2694762",  //ID from http://www.openweathermap.org/help/city_list.txt
				appid: "fyll i ditt appid här",
				showWindDirectionAsArrow: true
			}
		},
		{
			module: "weatherforecast",
			position: "top_left",
			header: "Prognos",
			config: {
				location: "Linköping",
				locationID: "2694762",  //ID from http://www.openweathermap.org/help/city_list.txt
				appid: "fyll i ditt appid här",
				roundTemp: true,
				showRainAmount: true,
				fade: false,
				colored: true
			}
		},
		{
			module: "MMM-Fibaro",
			position: "bottom_right",
			config: {
				updateInterval: 45,
				apiBase: '192.168.5.17',
				apiPort: 80,
				apiEndpoint: 'api/interface/data',
				apiUser: "info@m.nu",
				apiPw: "lösenord",
				moduleTitle: "inomhustemp",
				energyTitle: "Energiförbrukning",
				energyNow: "momentan",
				energyTotal: "total energi",
				showItems: ['temperature','energy']
			} 
		},
		{
			module: "newsfeed",
			position: "bottom_bar",
			config: {
				feeds: [
					{
						title: "SVT nyheter",
						url: "https://www.svt.se/nyheter/rss.xml"
					},
					{
						title: "Corren",
						url: "http://corren.se/nyheter/rss/"
					}
				],
				showSourceTitle: true,
				showPublishDate: true
			}
		},
	]

};

/*************** DO NOT EDIT THE LINE BELOW ***************/
if (typeof module !== "undefined") {module.exports = config;}