Read the statement by Michael Teeuw here.
My Magic Mirror - 100x70cm
-
Here is my full config.js file (without private info):
/* * The location of the module in which the module will be loaded. Possible values are top_ bar, top_left, top_center, top_right, upper_third, * middle_center, lower_third, bottom_left, bottom_center, bottom_right, bottom_bar, fullscreen_above, and fullscreen_below. * This field is optional but most modules require this field to set. Check the documentation of the module for more information. * Multiple modules with the same position will be ordered based on the order in the configuration file. */ var config = { address: "0.0.0.0", port: 8080, ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "192.168.1.11"], language: "nl", timeFormat: 24, units: "metric", modules: [ { module: 'MMM-Carousel', position: 'bottom_bar', // Only required to show navigation config: { transitionInterval: 0, ignoreModules: ['clock', 'alert'], mode: 'slides', showPageIndicators: true, showPageControls: true, slides: [ ['MMM-cryptocurrency', 'worldclock', 'MMM-WunderGround', 'MMM-MyCommute', 'MMM-MirrorMirrorOnTheWall', 'MMM-Hue', 'MMM-NetworkScanner', 'domoticz', 'MMM-syslog', 'alert', 'updatenotification', 'clock', 'calendar', 'compliments', 'newsfeed'], ['MMM-MovieListings', 'MMM-Scrobbler', 'MMM-ping', 'calendar_monthly', 'MMM-Globe', 'MMM-Tools', 'MMM-soccer', 'clock', 'MMM-syslog', 'alert', 'updatenotification', 'MagicMirror-QuoteCatalog', 'currentweather', 'weatherforecast', 'MMM-rainfc'] ], keyBindingsMode: "DEFAULT", keyBindings: { NextSlide: "ArrowRight", PrevSlide: "ArrowLeft", Slide0: "Home" } } }, { module: 'MMM-KeyBindings', config: { enableNotifyServer: false, enableMousetrap: true, } }, { module: "currentweather", position: "top_right", header: "", config: { location: "Almere Stad", locationID: "xxxxxxxx", //ID from http://www.openweathermap.org/help/city_list.txt appid: "xxxxxxxxxxxxxxxxxxxxxxxxx", decimalSymbol: "," } }, { module: "weatherforecast", position: "top_right", header: "Weersvoorspelling", config: { location: "Almere Stad", locationID: "xxxxxxxx", //ID from http://www.openweathermap.org/help/city_list.txt appid: "xxxxxxxxxxxxxxxxxxxxxxxxx", decimalSymbol: "," } }, { module: "alert", }, { module: "updatenotification", position: "top_bar" }, { module: "clock", position: "top_left", config: { displayType: "both", analogSize: "150px", analogFace: "simple", analogPlacement: "right", showWeek: "true" } }, { module: "calendar", header: "Kalender", position: "top_left", config: { calendars: [ { symbol: "calendar-check-o ", url: "webcal://ical.mac.com/ical/Dutch32Holidays.ics", }, { symbol: "calendar-check-o ", url: "https://.ics", }, { symbol: "calendar-check-o ", url: "https://basic.ics", }, { symbol: "calendar-check-o ", url: "https://calendar.ics", } ] } }, { module: "compliments", position: "middle_center" }, { module: 'MMM-MyCommute', header: 'Het Verkeer', position: 'bottom_right', config: { apikey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', origin: 'xxxx, 1111 xx xxxx', startTime: '00:00', endTime: '23:59', // hideDays: [0,6], destinations: [ { destination: 'Amsterdam Centraal, Stationsplein, Amsterdam', label: 'Amsterdam', mode: 'driving', color: '#82E5AA' }, { destination: 'Schiphol Airport, Schiphol Boulevard, Amsterdam', label: 'Schiphol', mode: 'driving', color: '#82E5AA' }, { destination: 'Utrecht Centraal, Utrecht', label: 'Utrecht', mode: 'driving', color: '#82E5AA' }, { destination: 'Centrum Almere Buiten, Almere', label: 'Almere-Buiten', mode: 'bicycling' } ] } }, { module: 'MMM-domoticz/domoticz', header: 'Smart Home', position: 'bottom_left', config: { apiBase: "http://192.168.1.12", apiPort: "80", sensors: [ { idx: "71", //Device IDX symbolon: "fa fa-lock", //font-awesome icon if device is On symboloff: "fa fa-unlock-alt", //font-awesome icon if device is Off (this will also be used if it is a temperature-de hiddenon: true, //true = hide if device is on (default: false) hiddenoff: false, //frue = hide if device is off (default: false) customTitle: "Alarm Status", }, { idx: "235", symbolon: "fa fa-circle-o-notch fa-spin", symboloff: "fa fa-circle-o-notch", customTitle: "Voordeur", }, { idx: "252", symbolon: "fa fa-circle-o-notch fa-spin", symboloff: "fa fa-circle-o-notch", hiddenoff: false, customTitle: "Achterdeur", }, { idx: "257", symbolon: "fa fa-circle-o-notch fa-spin", symboloff: "fa fa-circle-o-notch", customTitle: "Schuurdeur", }, { idx: "262", symbolon: "fa fa-circle-o-notch fa-spin", symboloff: "fa fa-circle-o-notch", hiddenoff: false, customTitle: "Raam Beneden", }, ], } }, { module: 'MMM-Hue', position: 'bottom_left', config:{ bridgeip: "192.168.1.155", userid: "xxxxxxxxxxxxxxxxxx", colour: true } }, { module: 'MMM-NetworkScanner', header: "Who's Home", position: 'bottom_left', config: { devices: [ // { ipAddress: "github.com", name: "Github", icon: "globe"}, // { macAddress: "1a:1b:1c:1a:1b:1c", name: "Server", icon: "server"}, // { macAddress: "2a:2b:2c:2a:2b:2c", name: "Desktop", icon: "desktop"}, // { ipAddress: "10.1.1.10", name: "Laptop", icon: "laptop"}, { macAddress: "xx:xx:xx:xx:xx:xx", name: "Galaxy-S8", icon: "mobile"}, ], showUnknown: false, showOffline: true, keepAlive: 600, updateInterval: 300, } }, { module: "MMM-soccer", header: "", position: "bottom_right", config: { api_key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", colored: "false", focus_on: "false", max_teams: "10", leagues: {"EREDIVISIE": 449}, show: "EREDIVISIE" } }, { module: 'MMM-ping', position: 'bottom_left', header: 'Network Status', config: { colored: 'yes', display: 'both', updateInterval: '5', font: 'medium', hosts: [ 'Domoticz', 'Bedroom', 'Guestroom', 'NAS', 'NAS2', 'NAS3' ] } }, { module: 'MMM-Globe', position: 'middle_center', config: { style: 'geoColor', imageSize: 200, ownImagePath:'', updateInterval: 10*60*1000 } }, { module: "MMM-cryptocurrency", header: "", position: "top_left", config: { currency: ["bitcoin"], conversion: "EUR", showUSD: false, headers: ['change24h', 'change1h', 'change7d'], displayType: "logo", coloredLogos: "true", showGraphs: true, fontSize: "medium" } }, { module: 'MMM-syslog', header: " ", position: 'bottom_bar', config: { max: "1", // format: ["DD:MM HH:mm"], types: {INFO: "dimmed", WARNING: "normal", ERROR: "bright"}, alert: "true" } }, { module: 'MagicMirror-QuoteCatalog', header: '', position: 'lower_third', config: { timeFormat: "20", fadeSpeed: "5" } }, { module: 'MMM-WunderGround', position: 'top_right', config: { apikey: 'xxxxxxxxxxxxxxxxxx', pws: 'pws:XXXXXX00', hourly: '1', fctext: '1', fcdaycount: "4", fcdaystart: "0", hourlyinterval: "3", hourlycount: "2", alerttime: 10000, alerttruncatestring: "english:", roundTmpDecs: 1, coloricon: true, daily:1, iconset: "colourful", UseCardinals: 0, layout: "horizontal", debug: 1, sysstat: 0 } }, { module: "MMM-rainfc", position: "top_right", header: "Regenvoorspelling", config: { lat: "52.39", lon: "5.29", width: 200, height: 100, lineWidth: 2, lineColor: "#e0ffe0", fillColor: "#e0ffe0", maxPower: 300, rainText: "Tot: ", noRainText: "Geen regen tot: ", nrOfTimeLabels: 5 // advised values: 2-5 } }, { module: "newsfeed", position: "lower_third", showSourceTitle: true, showPublishDate: true, config: { startTags: "['video','Video','VIDEO']", feeds: [ { title: "NU Algemeen", url: "http://www.nu.nl/rss/Algemeen" }, { title: "NU Internet", url: "http://www.nu.nl/rss/Internet" }, { title: "NU Sport", url: "http://www.nu.nl/rss/Sport" }, { title: "Ajax Nieuws", url: "http://ajax.netwerk.to/nieuws/rss.xml" }, { title: "Tweakers.net", url: "http://feeds.feedburner.com/tweakers/nieuws" }, ] } }, { module: 'MMM-MirrorMirrorOnTheWall', position: "middle_center", config: {} }, { module: 'calendar_monthly', position: 'top_left', config: { showHeader: "true", } }, { module: 'worldclock', position: 'bottom_center', header: '', config: { timeFormat: 'HH:mm A', //defined in moment.js format() style: 'left', //predefined 4 styles; 'top', 'left','right','bottom' clocks: [ { title: "Amsterdam", timezone: "Europe/Amsterdam", flag: "nl", }, { title: "London", timezone: "Europe/London", flag: "gb", }, { title: "San Jose", timezone: "America/Los_Angeles", flag: "us", }, { title: "Dubai", timezone: "Asia/Dubai", flag: "ae", }, ] } }, { module: 'MMM-MovieListings', position: 'bottom_center', config: { apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx', region: 'NL', language: 'nl-NL', interface: 'poster', //'list', 'poster', 'detailed' includeMoviePlot: true, maxPlotLength: 198, header: 'Movies Near You', moviesPerPage: 0, refreshInterval: 1000 * 60 * 60 * 24, //Once a day baseUrl: 'https://api.themoviedb.org/3/movie/now_playing', animationSpeed: 2.5 * 1000, pageChangeInterval: 35 * 1000 } }, { module: 'MMM-Scrobbler', position: 'upper_third', config: { username: 'marcnlx', apikey: '1a71a102c5d07a998a44bd2d9dfaf513', //time interval to search for new song (every 15 seconds) updateInterval: 15 * 1000, //how often should we try to retrieve a song if not listening delayCount: 5, //time interval to search for new song if the 5 times not listening is received. //set this to the same number as updateInterval to ignore this option delayInterval: 120*1000, animationSpeed: 1000, showAlbumArt: true, showMetaData: true, //Determines the position of the meta text. Possible values: top, bottom, left, right alignment: "right", } }, ] }; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") {module.exports = config;}
-
I’m impressed. A nice and clean build, well written documentation, some nice pictures to look at and everything with markups and such. Very well done, this is how more Showrooms should look like :)
-
@yawns said in My Magic Mirror - 100x70cm:
I’m impressed. A nice and clean build, well written documentation, some nice pictures to look at and everything with markups and such. Very well done, this is how more Showrooms should look like :)
Thanks! If you know how many hours I spent “extra” on my laptop because of not so well written documentation, no markups and such…I thought I would save everybody some time ;)
-
Yes, I can imagine that.
I guess the mirror glass is mounted directly on top of the frame, right? I cannot see any ventilation drills. Did/do you somehow monitor heat inside the frame? -
@yawns You are correct. It’s mounted directly on top of the frame.
I didn’t notice heat is really a problem, except a little bit for the monitor board…although it now has way more room to let air out then when the back part of the monitor was still on it!
I was thinking about drilling some holes in the top of the frame to let the hot air out. There is also a small gap between the frame and the wall itself. On the RPi you can monitor temp as follows:pi@mirror:~ $ vcgencmd measure_temp temp=54.7'C pi@mirror:~ $
I use a small script that shows temperature, but also shows it in Domoticz and sends a Telegram notification if the temperature gets too high:
pi@mirror:~ $ ./myscripts/rpitemp.sh Raspberry Pi Temperature (domoticz) is 54.6 °C
pi@mirror:~ $ cat ./myscripts/rpitemp.sh #!/bin/sh domoticzip=192.168.1.12 user=xxxx pass=xxxx tempidx=204 maxtemp=70 RED='\033[0;31m' NC='\033[0m' val_temp=`vcgencmd measure_temp | cut -c 6-9` val_temp2=`vcgencmd measure_temp | cut -c 6-9 | cut -c 1-2` curl -s 'http://'$user':'$pass'@'$domoticzip'/json.htm?type=command¶m=udevice&idx='$tempidx'&nvalue=0&svalue='$val_temp'' > /dev/null if [ $val_temp2 -gt $maxtemp ]; then echo "${RED}Raspberry Pi Temperature ($(hostname)) is $val_temp °C ${NC}" curl -s -X POST "https://api.telegram.org/botxxxxxxxxxxxxxxxxxxxxxxxxxxxx/sendMessage" -F chat_id=xxxxxxxx -F text="Raspberry Pi Temperature ($(hostname)) is $val_temp °C" else echo "Raspberry Pi Temperature ($(hostname)) is $val_temp °C" fi exit pi@mirror:~ $
-
Very nice job!
You live in the Netherlands, like me; can I ask you some questions by mail?
You have some things in your mirror that make me very curious how you did it!
Peter -
@Peter said in My Magic Mirror - 100x70cm:
Very nice job!
You live in the Netherlands, like me; can I ask you some questions by mail?
You have some things in your mirror that make me very curious how you did it!
PeterThanks! Yeah sure, no problem.
-
@marcnlx said in My Magic Mirror - 100x70cm:
the only thing was that 30min after hanging it on the wall, “version 1” came off the wall completely
This gave me a good laugh, thanks. :-)
I agree. Well thought out (the 2nd one), nicely executed, well documented, pictures and a story. I commend you. Fantastic! :-)
-
@Mykle1 said in My Magic Mirror - 100x70cm:
@marcnlx said in My Magic Mirror - 100x70cm:
the only thing was that 30min after hanging it on the wall, “version 1” came off the wall completely
This gave me a good laugh, thanks. :-)
I agree. Well thought out (the 2nd one), nicely executed, well documented, pictures and a story. I commend you. Fantastic! :-)
After I realized I could’ve expected this with “version 1” and saw the screen was still okay…same here :)
Thanks! I just created a post the way I personally like to read it ;) I spend at least a week setting up everything, testing things out, seeing the “please create config file” after a restart a million times after making a change and forgetting an { [ , ’ or " somewhere :)
I hope this will give people a bit of a Quick Start in configuring all modules and how I got everything working together ;) -
@marcnlx, well done and kudos to you on your magic mirror. I’m moving to a new place soon always have this thought that i want to build one of this bad boy as a home accessories. With you details guides of building the magic mirror is going to be very helpful and thanks for that.
you mind if i ping you separately if i hit the wall and hoping you can shed some lights.