Magic Mirror 2

Inledning

Många har gjort detta innan men kan känna att det kanske behövs en bra guide till på svenska. Så här kommer min guide till den magiska spegeln.

Det du kommer behöva är:

En Raspberry Pi
En skärm
Glas
En ram
Spegelfilm

Spegelfilmen är köpt på MDP i Mölndal. Praktiskt då jag bor nära. Glaset fick jag av en vän som är glasmästare. Skärmen är från Elgiganten och kostade 800:- på Black Friday (Acer K242HLbd 24″). Virket är hyvlat och kan köpas lite varstans.

Förutom detta behövs grundläggande kunskaper i Linux och finsnickeri.

Mjukvara

Börja med att sätta ihop din PI.  Koppla den till en TV och anslut via SSH till den. Nedan finns detaljerade intruktioner exakt hur man med ett kommando installerar allt så jag tänker inte skriva detta här med.

https://github.com/MichMich/MagicMirror/blob/master/README.md

Är allt på plats nu kan du logga in via ssh och starta den med:

DISPLAY=:0 nohup npm start &

Du bör nu se default layouten på skärmen. Nu vill vi fixa till lite egna moduler. Det finns en del att välja mellan men vi kommer installera:

ResRobot

För att kunna se avgångar för Västtrafik.  Fungerar med en del andra med.

https://github.com/Alvinger/MMM-ResRobot

Wunderlist

För att kunna skriva in to do saker på spegeln

RSS – SVT Nyheter

För att se nyheter

Kalender

För att kunna lägga till *.ics kalendrar

Just kalendern gör att man kan få lite roliga funktioner. Nedan ser man tex att man kan hämta:

Alla Sveriges (nästan) skolmatsedlar – http://skolmaten.se/

Träningstider för barnen från Laget.se

 

Jag hade lite problem med dokumentationen om hur man startar automatiskt med pm2 som finns dokumenterat på sidan. Det man även behöver göra är att skriva “pm2 autostart”. Detta genererar en kodsträng som måste köras som root med.

Bygga ramen

Då var det dags att bygga ramen. Den nya fina 24″ skärmen ser ut så här.

Och det första man gör efter att ha packat upp den är att göra sönder den. Det är inte helt enkelt att få loss den. Ta en stor skruvmejsel och bryt upp i ett hörnet. Det kommer klicka till och man kan sen efter hand lossa hela ramen.  Man kan ju ta bort resten med men tror det räcker att ha det så här.

Glasskivan kan kapas lite större än skärmen om man vill. Jag har byggt ramen med 43*20 mm. Såga med geringslåda. Limma. Ungefär som i bilderna ovan. Filmen är inte helt lätt att få på plats. Börja med att göra rent glasen. Gör detta väldigt noga. Ett litet dammkorn gör en bubbla. Ta sen en tejpbit och dra loss skyddsplasten. Spray med såpvatten på filmen och glaset. Lägg på filmen och press ut bubblorna med en gummi fönsterskrapa. Om den kommer helt fel dra INTE upp den igen. Det kommer skapas små fula bubblor.

Skärmen kommer komma kloss an mot väggen och man kan tänka sig att det kommer bli för varmt. Tog en bild med värmekameran och man ser att det är min Raspberry som är det som är varmast. Den syns längst ner på bilden.

El och annat

Vanligtvis hade man kanske placerat Raspberryn i ramen och dragit en sladd från ramen. Nu var det så att jag kunde borra rakt igenom väggen och ta strömmen från andra sidan. Och kom på att datorn fick stå på den sidan med. Hur man än gör kommer alltså ramen bygga ut ca 40mm om man inte bygger in hela spegeln i väggen. Så här ser det färdiga resultatet ut. Jag har inte satt in några hål för ventilation vilket kanske kommer behövas sen.

Bonus

När allt är klart finns det lite extra saker man kan göra. Tex att koppla ihop den med sin Synology Surveillance station. Man kan installera Remote Control som ger ett GUI för att starta/stoppa osv. Denna kan sen användas för att automatisera spegeln och spara ström. Börja med att lägga in denna nedan.

https://github.com/Jopyth/MMM-Remote-Control

http://192.168.xxx.xxx:8080/remote?action=MONITORON
http://192.168.xxx.xxx:8080/remote?action=MONITOROFF

Jag kommer använda dessa kommandon ovan i åtgärdsregler i SSS. Jag har alltså en webbkamera kopplad till denna som jag använder som larm hemma för att upptäcka rörelser. Denna är alltså på då jag inte är hemma och av då jag är hemma. Så effekten är alltså att skärmen stänger av sig då man aktiverar kameran och slår på då man kommer hem.

 

Man kanske även vill att spegeln (skärmen) skall släckas på kvällen och tändas på morgonen. Man behöver då schemalägga detta. Detta kan skilja sig lite beroende på om man använder HDMI, VGA osv. Jag har skrivit

chrontab -e

 

00 22 * * */opt/vc/bin/tvservice -o
30 6 * * * /opt/vc/bin/tvservice -p

Starta sedan om. Detta gör att skärmen går av vid 22:00 och på vid 06:30.

 

Slutsatser och lärdommar

Lite saker man kan tänka på och några saker jag märkt.

  • Beställ ett glas istället för film om du har råd. Filmen blir bubblig hur man än gör.
  • Köp en ny skärm. Använder du en begagnad några år gammal skärm bygger den ut bra mycket mer.
  • Gör du spegeln större än skärmen så kan man se igenom den på sidorna.
  • Det är svårt att få ramen rak. Ha många tvingar redo.

Min config.js fil nedan. Jag har tagit bort saker som api id.

/* Magic Mirror Config Sample
 *
 * By Michael Teeuw http://michaelteeuw.nl
 * MIT Licensed.
 */

var config = {
	port: 8080,
	ipWhitelist: ["192.168.0.0/24", "::ffff:192.168.0.0/24", "::1"],
	language: 'sv',
	timeFormat: 24,
	units: 'metric',
		
				modules: [
		// -------------------------------------------------------
		{
			module: 'alert',
		},
		// -------------------------------------------------------
		
		// -------------------------------------------------------
		{
			module: 'clock',
			position: 'top_left',
			config: {
				displayType: 'both',
				analogFace: 'face-003',
				secondsColor: '#880000',
				}
			
			
		},
	// -------------------------------------------------------	
		
	// -------------------------------------------------------
		{
			module: "updatenotification",
			position: "top_bar"
		},
   
    // -------------------------------------------------------
		
	// -------------------------------------------------------
		{
			module: 'MMM-Matsedel',
			header: 'Skolan',
			position: 'bottom_left',
			config: {
			url: 'http://skolmaten.se/minskola/rss/'
      }
		},
    // -------------------------------------------------------
	   
	// -------------------------------------------------------
		{
			module: 'MMM-Remote-Control',
		},
   
    // -------------------------------------------------------
		
	// -------------------------------------------------------	
		{
			module: 'calendar',
			header: 'Min Kalender',
			position: 'bottom_right',
			config: {
				maxTitleLength :50,
				calendars: [
					{
						symbol: 'fa-soccer-ball-o',
						url: 'webcal://cal.laget.se/XXXXXX.ics'
					},
					{
						symbol: 'fa-soccer-ball-o ',
						url: 'webcal://cal.laget.se/XXXXXX.ics'
					},
					{
						symbol: 'calendar',
						url: 'https://calendar.google.com/calendar/ical/mylink.ics'
					},
					{
						symbol: 'glass ',
						url: 'https://calendar.google.com/calendar/ical/sv.swedish%23holiday%40group.v.calendar.google.com/public/basic.ics'
					}

				],
				timeFormat: 'absolute',
				getRelative: "3000"
			}
		},
	// -------------------------------------------------------	
	

	// -------------------------------------------------------		  
		  {
        module: 'MMM-Wunderlist',
        position: 'top_left',  // This can be any of the regions. Best results in left or right regions.
        header: 'ATT GÖRA LISTA', // This is optional
        config: {
			accessToken:"f9856f45adafcc70fa31df830138e733eb20d4be37de23f4b4b26b2440ed",
			clientID:"e3f564de0ace6331981b",
			
            // See 'Configuration options' for more information.
        }
		},
	// -------------------------------------------------------	
		
	// -------------------------------------------------------	
		{
			module: 'currentweather',
			position: 'top_right',
			config: {
				location: 'Mölnlycke,Sweden',
				locationID: '',  //ID from http://www.openweathermap.org
				appid: '443249c4f4f1sdfsdfsdrwerwe354a15f236e9bf31e423d65cdc8ad8bbf'
			}
		},
	// -------------------------------------------------------	
	
	// -------------------------------------------------------	
{
    module: 'MMM-Globe',
    position: 'middle_center',
    config: {
        style: 'natColor',
        imageSize: 600,
        ownImagePath:'',
        updateInterval: 10*60*1000
    }
},
	// -------------------------------------------------------	
	
	
	// -------------------------------------------------------	
  {
        module: "MMM-ResRobot",
        position: "left",
        header: "Buss från Sommarhemsvägen",
        config: {
            from: "740061214",   // ResRobot Station ID (or a comma-separated string of IDs)
            to: "740015578", // ResRobot Station ID of destination (or a comma-separated string of IDs)
            maximumEntries: 6,  // Number of departures to show on screen
            truncateAfter: 5,   // A value > 0 will truncate direction name at first space after <value> characters. 0 = no truncation
            apiKey: "werwerwerwefsdfsdffsdfsdrwerwer"  // Your ResRobot apiKey
        }
    },
	// -------------------------------------------------------	

	// -------------------------------------------------------	
		{
			module: 'weatherforecast',
			position: 'top_right',
			header: 'Väder',
			config: {
	            location: 'Mölnlycke,Sweden',
				maxNumberOfDays: 15,
				locationID: '',  //ID from http://www.openweathermap.org
	            appid: 'gsdfsdfwewerw3rwerte9bf31ed65cdc8ad8bbf'
			}
		},
	// -------------------------------------------------------	
	
	// -------------------------------------------------------	
		{
			module: 'newsfeed',
			position: 'bottom_bar',
			config: {
				showDescription: "true",
				updateInterval: "300000",
				maxNewsItems: "0",
				feeds: [
					{
						title: "SVT Nyheter",
						url: "http://www.svt.se/nyheter/rss.xml"
					}
				],
				showSourceTitle: true,
				showPublishDate: true
				
			}
		},
	]

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

Uppdaterad config fil Oktober 2018. Detta är den jag använder nu.

var config = {
	address: "0.0.0.0", // 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: [], // 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",
		},
		{
			module: "updatenotification",
			position: "top_bar"
		},
		{
			module: "clock",
			position: "top_left"
		},
		
		{
			module: "MMM-Skolmaten",
			header: "Hogadalskolan",
			position: "bottom_left",
			config: {
				url: "http://skolmaten.se/minskola/rss/"
			}
		},
	
	
	{
		module: 'MMM-SystemStats',
		position: 'top_center', // This can be any of the regions.
		classes: 'small dimmed', // Add your own styling. Optional.
		config: {
			updateInterval: 10000,
			animationSpeed: 0,
			align: 'right', // align labels
			//header: 'System Stats', // This is optional
		}
	},
	
	
			{
			module: "calendar",
			header: "Allas Kalender",
			position: "bottom_right",
			config: {
				maxTitleLength: 50,
				dateFormat: "dd D/M, H:mm",
				fullDayEventDateFormat: "dd D/M",
				urgency: 0,
				timeFormat: "absolute",
				getRelative: "0",
				calendars: [
					{
						symbol: "male",
						url: "kalenderlänk/basic.ics"
					},
					{
						symbol: "calendar",
						url: "kalenderlänk/basic.ics"
					},
					{
						symbol: "female",
						url: "kalenderlänk/basic.ics"
					},
					{
						symbol: "glass",
						url: "kalenderlänk/basic.ics"
					},
				],
				titleReplace: {
					"De verjaardag van ": "",
					"'s birthday": ""
				},
				excludedEvents: [

				]
			}
		},
		
		{
			module: "MMM-Remote-Control",
			config: {
			}
		},

{
	module: 'MMM-YrThen',
	position: 'top_left',
	config: {
		location: 'X-XXXXXXX',
	}
},


	]

};

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