Plus: I learned that the callback page needs to be called exactly as specified, so I tried also with http://127.0.0.1:8888/
with ending slash, without, even with https - all to no avail.
Thanks again
Markus
Plus: I learned that the callback page needs to be called exactly as specified, so I tried also with http://127.0.0.1:8888/
with ending slash, without, even with https - all to no avail.
Thanks again
Markus
@Vizulize thanks a lot!
In the meantime I came a little further.
So about the package.json: Yes, can confirm, @sdetweil 's solution works perfectly.
I did go the other route: after the git clone, I did an npm init, this resolved the prob in the package.json and package-lock.json - this worked, too.
My next problem was when calling the init.sh, I found out I had no pip installed, so the required libraries could not be installed.
So I installed pip, then init.sh ran fine and installed what was required.
I also came to the conclusion that the oauth authentification would probably work better locally rather than over ssh.
So I ran auth.sh, was told that server was now listening on http://127.0.01/8888 - which was also what I entered when registering the app at fitbit. Looked good so far.
No browser was opened though. So restarted MM with an invalid config.js, hooked up a keyboard/mouse on the mirror-raspberry locally and opened electron from a local terminal like so:
/home/pi/MagicMirror/node_modules/electron/dist/electron http://localhost:8888
That’s when the serverside reported
127.0.0.1 - - [04/Dec/2023:20:19:56] "GET / HTTP/1.1" 404 2019 "" "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.228 Electron/26.6.2 Safari/537.36"
So, 404.
On the electron window, this was shown:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cpdispatch.py", line 54, in __call__
return self.callable(*self.args, **self.kwargs)
TypeError: index() missing 1 required positional argument: 'state'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cprequest.py", line 628, in respond
self._do_respond(path_info)
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cprequest.py", line 687, in _do_respond
response.body = self.handler()
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\lib\encoding.py", line 219, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cpdispatch.py", line 60, in __call__
raise sys.exc_info()[1]
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cpdispatch.py", line 58, in __call__
test_callable_spec(self.callable, self.args, self.kwargs)
File "C:\ProgramData\Anaconda3\lib\site-packages\cherrypy\_cpdispatch.py", line 157, in test_callable_spec
raise cherrypy.HTTPError(404, message=message)
cherrypy._cperror.HTTPError: (404, 'Missing parameters: state')
Pls note: this is not exactly my error, looks like this is coming from a windows machine:
This came up as the first result when entering “missing parameters state” in the google search. But it is close enough to my error (just replace C:\ProgramData… with home/pi/.local/lib/python3.7… - I could not be bothered to type it all off of my mirror :-D )
There was no solution given, though, so that is where I am stuck now…
Thanks again for your help,
Markus
So, quick update:
I tried inist.sh with the modified package.json
The result was just the same - I don’t see any input dialog open.
I believe the module is installed properly and the dependencies are ok.
Thanks
Markus
Yes, right.
Must have looked into the package.json after doing the npm init - my bad. Did another git clone and it is as you said.
Meanwhile it turned out I had pip not installed. After installing pip and running ./init.sh again (after npm init) libraries were installed, and also auth.sh was able to start (only saw it when I called the python script directly rather than from auth.sh)
So auth.sh was now able to “Open a Web browser” (at least according to its logs), I just don’t see any dialog.
Anyway, will now try init with the modified package.json and see if it makes a difference - will report back.
Thanks so far
Markus
@sdetweil yeah, so I renamed MMM-Fitbit2, cloned fresh.
In the package.json there is no such a line that you mentioned (I guess @Vizulize must have fixed it already)
Did npm init, then ./init seemingly went through.
With ./auth.sh same thing as before - no dialog showing up.
I hope @Vizulize sees it and helps out :-)
Thanks
Markus
Thanks, Sam!
Had it googled in the meantime, had renamed the package-lock.json und run npm init
It braught no further error, I called auth.sh and that’s where I’m stuck now.
After entering the credentials, no browser dialog opens and I’m not quite sure where to search it.
Am logged in over ssh and in addition have a browser open to :8080
Neither on the mirror, nor on the pc, there is any dialog appearing.
I guess I’ll start from scratch, remove the module folder, clone new from git, and try your suggested method with the original package.json?
Thanks again
Markus
Hi, updated MM and now Google-Fit can no longer be installed, so I gave MMM-Fitbit2 a go.
Thanks @Vizulize for your work, I’d really like to get it running.
I have the same error that is reported in the github:
npm ERR! must provide string spec
To reproduce, just try to install it on an updated MM system.
It happens when calling ./init.sh as per your instructions on github
Have you/has anybody figured out a way to initialize the module?
Thanks
Markus
Hallo @HansB
danke fürs Lob, sorry für die superspäte Antwort…
Ich verwende das MMM_Webradio Modul. Habe es ein wenig verändert, um die Logos für die Radiostationen anzuzeigen. Aber so wie es ist funktioniert es auch gut (habe ehrlich gesagt schon lange nicht mehr meine Module aktualisiert, weiß daher nicht, wie es aktuell tut)
Viel Erfolg und liebe Grüße
hi @bachoo786
sorry for the late late reply, haven’t been on the forum for quite some time.
Yes, I did have problems with dropping wifi. Not quite sure what it caused, might be the aluminium frame, maybe the mirror coating on the glass, idk. Had to replace the wifi module. Best of luck and cheers
Markus
Since my Magic Mirror went live, it received 2 major upgrades:
The monitor died and was replaced
Still not sure on how it died. I suspect that the button control caused a short circuit with the metal casing of the monitor control box. Or maybe it was moisture that got into it after all.
Anyway, I replaced it with a much slimmer monitor of the same size. Another advantage was that it had a well sealed external power brick instead of the somewhat sketchily mounted power board of the original monitor.
This is what I got:
https://www.amazon.de/gp/product/B07C4B1ZXC/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1
Very cheap, very slim, way lighter, way better sealed and brighter than the first monitor I head
The Raspberry is now running from HDD
The raspberry 2 kept crashing. All the time, every other day at least. Checked and changed power supply, no improvement. Re-wrote image on sd-card, no improvement. Updated os and mm, no improvement. I even set up a cron job to reboot once per night. Nothing helped.
So I investigated and read a lot on how an sd card isn’t really suitable to run an os over a long time (at least that is what I made of it). So I decided to run it from a hdd. Was originally planning to go for an sdd, but decided well I don’t want to spend another 50-100 EUR, including an usb adapter. So I digged up a 2.5’’ HDD which I had laying around (to be precise: being uselessly sticked to the back of my tv). Looked up a bunch of tutorials on how to run a raspberry 2 from HDD. (Note: it actually still boots from sd, but hands over control to HDD immediately after startup). It involves:
After that you should expand the size of the filesystem on the HDD, since it has initially only the size of the image you burned on it. Note, this can’t be done with raspi-config, but with fdisk
It looks like (and honestly is) quite some task to get it to run (at least it was for me, a half-experienced Linux user). I found it worth to investigate though, educate myself about Linux, the file system, and other aspects and spend some time with trial and error.
You will find plenty of instructions on the internet, some more useful than others, but you will find your way through it, too.
Finally it is running really fine now. I had no crashes since (and it is over a week running now), so I guess it is worth the effort. :-)
Sure, I could have thrown out the Raspberry pi 2 and replaced it with a 4, seeing if that helps, but I really wanted to see if I can make it work with the good old pi2.
So I ended up installing the mm from scratch (now on HDD), thereby getting the latest version, fetching the latest versions of the modules I use, redoing the modifications I did to them, re- and re- and rearranging the modules until I finally had it running as I wanted it to.
Here is a pic with the new monitor, the HDD and some cleaning up:

And here is the front, one more time:

Here is a current snapshot from the browser (with the webradio running):

Cheers!
@cyberphox sure, no problem, here you go:
{
module: 'MMM-Screencast',
position: 'bottom_right', // This position is for a hidden <div /> and not the screencast window
config: {
position: 'bottomCenter',
height: 800,
width: 1200,
}
},
cheers
Markus
@banbutcher cool that you got it to work :-)
About weight graph: Well the GoogleFit module would have to be extended with this functionality, it would have to be coded (nothing that could be done with a quick fix, I’m afraid ;-) )
Hi @patrickgruber da hab ich eigentlich nix groß gemacht dran. Nur die Konfig angepasst.
Probier mal diese aus:
{
module: "MMM-WienerLinien",
position: "top_right",
config: {
api_key: "",
stations: ["941","3185"],
shortenDestination: 20
}
},
Danke fürs Lob :-)
Hi,
open: /home/pi/MagicMirror/modules/MMM-GoogleFit/MMM-GoogleFit.js in a notepad.
Change line 112 from
total = total.toFixed(0);
to
total = total.toFixed(1);
Just tried it out, it works (I also like it ;-) )
But please note that any change in a module will be overwritten as soon as you do an update of the module.
Cheers
Markus
This is part 2 of my bathroom mirror build, part 1 is here:
Frameless Bathroom Mirror - Part 1
I hope it is ok to use 2 threads.
First of all, here is me with the final product :-)
et voila
Last month, the glass has arrived from https://www.glas-star.de/
The basis of this project was my original bathroom mirror. It consisted of a 110 x 80 cm frame of 2 x 4 cm aluminium profiles and the mirror glass glued to the frame with double-sided mirror tape. In the next picture I freed the frame from the old mirror.
frame with shards
and here cleaned and tidied up for the fitting of the spy glass. For this I used a hot air gun and a untility knife blade.
clean frame
You can see here that the old mirror had some electric wiring (for an in-built neon tube lighting), which I salvaged for the magic mirror project.
After glueing the new glass to the frame with 2-K-epoxy-glue, I covered the parts of the mirror that would later not be covered by the monitor.
I used black window film for this, here is an amazon link:
https://www.amazon.de/gp/product/B0785D9LCM/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1
glass covered
Since the frame only leaves 4cm space, I had to disassemble the monitor, so that the display and the electronics would fit.
I used tinsnips to dismantle the housing of the monitor’s electronics and soldered extensions to the led backlights.
controls for monitor
I screwed brackets for the display panel and the monitor electronics into the aluminum frame and used power tape to support. I used adhesive bases and zipties to tidy up the wirings. I used a junction box for the mains connections (to which I later added additional lighting)
frame with display and mains box
I have adapted the MMM-buttons module to read a toggle switch to switch on and off the MMM_Webradio module, 3 momentary switches are used to control the volume and select the next radio station, you can see them in the next picture, here is a link to the buttons that I used:
https://www.amazon.de/gp/product/B07RXK544N/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1
radio buttons
You can also see the microwave sensor here, which I use to detect people in front of the mirror from behind the glass.
Finally, I have added 2 additional LED lamps. The reason for this is that the original neon light was not strong enough to shine through the tinted glass. (For the neon light I had left out a stripe in the mirror foil, which I then covered with frosted glass film.)
mirror with LED lamps
Things I changed during the build:
It turned out that the wlan dongle whith which I had tested was too weak and slow once the mirror was monted on the wall. Therefore I got a 5GHz Wlan dongle, which works fine, no drivers required for the raspberry:
https://www.amazon.de/gp/product/B00LLIOT34/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
Behind the glass lamps are too weak to give proper light. Instead, I added these to the mirror:
https://www.amazon.de/gp/product/B07YD5NGVJ/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1
In addition to what I described in part 1 (link), I have added a bluetooth dongle to stream the webradio to a bluetooth speaker:
https://www.amazon.de/gp/product/B0096Y2HFW/ref=ppx_yo_dt_b_asin_title_o02_s01?ie=UTF8&psc=1
Final thoughts on the glass: The reflection is absolutely fine, albeit a little less bright and clear than a “real” mirror. The visibility of the text is ok, but you should set the monitor to the brightest level. The look and feel of the glass comes really close to an ordinary mirror.
@linsenpago The mirror has arrived like 2 weeks ago, and I have already finished the project, just preparing an update to my original post. Will describe everything there, how it worked, what I think about the glass etc (the glass is great by the way!)
@linsenpago
Hi, no, unfortunately I’m still waiting… It’s been over a month now, and no news. I wrote a mail yesterday with no response yet :-(
Nein, leider immer noch nicht da. Habe gestern mail geschrieben, bis jetzt noch keine Reaktion. Werde morgen mal anrufen…
Grüße zurück aus Wien!
Edit: it is announced to arrive tomorrow! Die Spedition kommt morgen :-) Yeeeyy!
@ironman_DK , I had the same challenge. I would like to add to add another possible solution to @sdetweil 's :
By just creating additional instances of the calendar module, you can even give each its own header, which I find adds to clarity. You may want to look at my configuration which I posted here (unfortunately still a prototype, still waiting for the glass to arrive ;-) )
https://forum.magicmirror.builders/topic/12104/glass-on-the-way-but-still-eager-to-share-my-first-try
So here’s how I configured it:
{
module: "calendar",
header: "Familie",
position: "top_left",
config: {
maximumEntries: "5",
calendars: [
{
symbol: "calendar-check-o ",
url: "https://calendar.google.com/calendar/ical/XXXXXXXXXXXXXXXX/basic.ics"
}
]
}
},
{
module: "calendar",
header: "Markus",
position: "top_left",
config: {
maximumEntries: "5",
calendars: [
{
symbol: "calendar-check-o ",
url: "https://calendar.google.com/calendar/ical/markusXXXXXXXXXXXXX.ics"
}
]
}
},
Hope it helps
@Lx said in Glass on the way, but still eager to share my first try:
Would you mind sharing the module’s code from your config file, as well as the modified MMM-iFrameReload.js ?
Absolutely no problem, glad if I can help :-)
Here is the MMM-iFrameReload configuration in config/config.js:
{
module: 'MMM-iFrameReload',
position: 'top_right', // This can be any of the regions.
config: {
url: "https://www.google.com/maps/embed?pb=!1m28!1m12!1m3!1d42533.999773346404!2d16.411988327113605!3d48.2186535328082!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!4m13!3e0!4m5!1s0x476d015a39ef4d09%3A0x9517276e2c623b28!2sGunertweg%204%2C%201220%20Wien%2C%20%C3%96sterreich!3m2!1d48.249941799999995!2d16.4780513!4m5!1s0x476d00ab0878e79f%3A0x27ed9084b744849a!2sErdbergstra%C3%9Fe%20236%2C%20Wien!3m2!1d48.1851841!2d16.4259021!5e0!3m2!1sde!2sat!4v1581209652324!5m2!1sde!2sat",
width: "100%", // Optional. Default: 400px
height: "400px", // Optional. Default: 800px
refreshInterval: 900 //Optional. Default: 3600 = 1 hour
}
},
So this shows the way from my home to my office. To show a route of your own liking, process as follows:
Now you should see a colorful map after saving and restarting mm.
If you want to have the dark-grey appearance, go into the MMM-iFrameReload.js in ~/MagicMirror/modules/MMM-iFrameReload/
Find the line iframe.style = “border:0” and replace it with
iframe.style = "border:0;filter: grayscale(95%) invert(100%);"
Hope this helps, pls let me know if it worked!
Cheers
Markus
@samson_82 did it work? Hat’s geklappt?