A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.
  • PIR / MQTT - Presence sensor(s) revived

    37
    5 Votes
    37 Posts
    4k Views
    R
    MMM-PresenceScreenControl — two new releases (ecoMode + Notification API) Dear all a small but meaningful round of updates for MMM-PresenceScreenControl just landed on main. Both started from a single GitHub issue, so I thought I’d write up the chain of reasoning rather than just drop a changelog — maybe useful for anyone evaluating a migration from MMM-Pir, and definitely useful as a reminder to myself to check the parent project’s feature surface more carefully when forking. Part 1 — ecoMode (Issue #5) Rocket78 opened issue #5 with a really well-argued request: even with the screen physically off, Electron keeps repainting hidden DOM. On a Pi 3 with X11, MMM-PresenceScreenControl was leaving things like Newsfeed cross-fades running every 20 seconds — and those repaints showed up clearly as CPU spikes in his graph. He asked for an equivalent of MMM-Pir’s ecoMode, which hides every other module while the screen is off, so the browser skips layout/paint/composite for them. So I built it, but tried to keep it lean: ecoMode: false, // opt-in, default off → no surprise ecoModeIgnore: [] // module names to keep visible Implementation notes that might interest other module authors: Rocket78 also dropped a great ddcutil snippet in the issue for monitors that show a “no signal” splash when the video output is cut — that splash is genuinely immersion-breaking, and ddcutil setvcp D6 sends the actual DDC/CI power command, which is much closer to pressing the hardware power button: onCommand: ddcutil setvcp D6 1 --skip-ddc-checks offCommand: ddcutil setvcp D6 5 --skip-ddc-checks Added to the README’s offCommand examples. The --skip-ddc-checks is needed because some monitors stop responding to DDC queries when powered off but still process incoming power-on commands — so the check would fail before the command is even sent. → Issue #5 closed, commit 42b68a6. Part 2 — what else did I miss? Closing the issue could have been the end of it. But Rocket78’s request raised an uncomfortable question: I never used ecoMode in MMM-Pir myself, so I didn’t notice it was missing. What else did I overlook when reviving MMM-Pir? Three items jumped out as actual gaps that other modules in the ecosystem could legitimately depend on: MMM_PIR-USER_PRESENCE — MMM-Pir broadcasts this notification on presence transitions. Other modules (Remote-Control, voice assistants, smart-home bridges) can listen for it. MMM_PIR-WAKEUP / LOCK / UNLOCK / END — incoming notifications that let other modules control the screen logic externally. MMM_PIR-SCREEN_POWERSTATUS — broadcast when the physical screen turns on or off. Without these, anyone migrating from MMM-Pir to my fork would suddenly find their automations dead — because they’d be listening for MMM_PIR-USER_PRESENCE and nothing was coming through. Even worse, they wouldn’t know why it stopped working; the screen-on/off behavior would seem fine, but cross-module integration would be silently broken. So I built a parallel notification API, namespaced MMM_PSC-* rather than impersonating MMM-Pir’s MMM_PIR-*: Outgoing notifications — emitted on state transitions only: MMM_PSC-USER_PRESENCE payload: true / false fires when combined presence changes MMM_PSC-SCREEN_POWERSTATUS payload: true / false fires when physical screen turns on/off Both fire only on actual transitions — no spam every poll cycle. Incoming notifications — consumed by the module MMM_PSC-WAKEUP wake screen, reset timer (equivalent to a touch) MMM_PSC-END force screen off immediately MMM_PSC-LOCK freeze presence handling — sensors are still tracked internally, but no longer change screen state MMM_PSC-UNLOCK resume normal presence handling and re-evaluate the current sensor state Implementation detail worth flagging: the LOCK guard sits in updatePresence(), which is the single funnel through which all sensor inputs (PIR, MQTT, touch, external wakeup socket) eventually pass. So whatever the trigger source, it’s correctly suppressed while locked. UNLOCK calls updatePresence() again, which re-evaluates the current sensor state — so if you’ve unlocked while a person is still in front of the PIR, the screen comes back on immediately. No need for the caller to send a WAKEUP after UNLOCK. Useful patterns this enables: // Wake the mirror when a doorbell event arrives: this.sendNotification("MMM_PSC-WAKEUP"); // Force-off cleanly from outside (smart-home rule, etc.) without // bypassing the module and going straight to the screen command: this.sendNotification("MMM_PSC-END"); // Take exclusive control of the display for a video call, // then hand it back when done: this.sendNotification("MMM_PSC-LOCK"); // ... your module is showing its full-screen content ... this.sendNotification("MMM_PSC-UNLOCK"); END is the clean way to force-off the screen from outside without touching offCommand directly — the module’s internal state stays consistent, all the right outgoing notifications still fire, and any other listeners (logging, analytics, smart home) see the transition. Tested live end-to-end via MMM-Remote-Control’s notification API: curl -X GET "http://localhost:8080/api/notification/MMM_PSC-LOCK" curl -X GET "http://localhost:8080/api/notification/MMM_PSC-END" → screen off, stays off curl -X GET "http://localhost:8080/api/notification/MMM_PSC-WAKEUP" → ignored (locked) curl -X GET "http://localhost:8080/api/notification/MMM_PSC-UNLOCK" → screen back on All four routes verified, log trace clean, outgoing notifications fired in the right order on every transition. → Commit 10000ca. Update / install If you’re already on the module: cd ~/MagicMirror/modules/MMM-PresenceScreenControl rm -rf node_modules git pull npm install Both changes are backwards-compatible. ecoMode is opt-in (default false), and the new notifications are additive — nothing existing is modified. So you can update without touching your config and pick up only what you need. A genuine thank-you to Rocket78 for the well-reasoned issue and the ddcutil tip — it triggered the full audit, which in turn closed a much bigger latent gap. Exactly the kind of feedback that improves a fork. If you’ve migrated from MMM-Pir and notice anything else missing that you’d consider load-bearing, please open an issue. Hope you find it useful. Warmest regards, Ralf
  • MM-Watcher - MagicMirror Config.js Auto-Refresh Script

    13
    1 Votes
    13 Posts
    2k Views
    C
    @magicmikael Hi, I think I fixed it. Please see updated module description. On Wayland you need ydotool - all described in the readme. Please feedback if it is solved! Link: MM-Watcher
  • Swedish Weather provider SMHI has deprecated their API and replaced it

    3
    1 Votes
    3 Posts
    354 Views
    C
    @sdetweil Yes, done and merged now!
  • 0 Votes
    6 Posts
    232 Views
    S
    @jpiatt ok, let us know. Big calendar rewrite coming next Wednesday My cal is 12 yrs old, oops actually 17 yrs.
  • MMM-OnlineImagesViewer not showing webcams

    1
    1 Votes
    1 Posts
    99 Views
    R
    Hello, I try to show webcams with MMM-OnlineImagesViewer but they do not show. If I point to a picture it does come up. Looking in the tools console I do not see an error related to this module. I only see module.js:372 Parameter mismatch in module.hide: callback is not an optional parameter! The module is up to date. I run Trixie on a py 4 and the latest MM version. This is in my config { module: “MMM-OnlineImagesViewer”, classes: ‘page1’, position: ‘bottom_left’, header: “Webcams”, config: { images: [ “https://dinosaurdracula.com/wp-content/uploads/2013/09/115.jpg”, “https://www.itfryskegea.nl/bezienswaardigheden/wildcam-zeearend/” ], random: false, updateInterval: 30 * 1 * 1000, // every 5 mins showAll: false, maxWidth: “300px”, random: true, numColumns: 1 } },
  • MMM-Hello-Mirror ERROR

    6
    0 Votes
    6 Posts
    329 Views
    S
    @renevandenbroek I am not aware of another working voice module
  • MMM-HomeAssistant

    20
    3 Votes
    20 Posts
    9k Views
    R
    @sdetweil I found out that it stil asked for the user password when performing sudo. I had this statement in /etc/sudoers magicmirror ALL=(ALL:ALL) ALL And this in /etc/sudoers.d/magicmirror magicmirror ALL=(ALL) NOPASSWD: /usr/bin/vbetool For now i removed the line in /etc/sudoers
  • RCWL-0516 Microwave Radar Motion Sensor Module

    3
    1 Votes
    3 Posts
    485 Views
    S
    @videogame95 the PIR module was reconstructed by https://github.com/Coernel82/MMM-Pir apologize, please use periods at end of sentences, and new lines… ca you confirm, the sensor works with its python code, outside MM
  • MMMLogfileViewer - View your logs on your MagicMirror

    1
    1
    2 Votes
    1 Posts
    401 Views
    S
    Description: A MagicMirror² module that displays real-time log file content with tail -f functionality. Monitor your system logs, application logs, or any text file with live updates and beautiful log-level color coding. Key features include: 📁 Real-time Log Monitoring: Watch log files for changes and display updates instantly with tail -f behavior 🎨 Log Level Color Coding: Automatic color coding for ERROR, WARN, INFO, and DEBUG levels 🔧 Flexible Styling: Support for any CSS property through configuration 📏 Configurable Font Sizes: Predefined sizes (small/medium/large) or custom CSS values like “16px”, “1.2em” ⚡ Performance Optimized: Uses chokidar with optimal settings for efficient file watching 🌐 Cross-Platform: Works seamlessly on Windows, macOS, and Linux Screenshots: [image: 1761517583478-19414464-2e56-4ae4-ad82-4bef1bc9c2f5-image.png] Download: Download from: https://github.com/schlomm/MMM-LogfileViewer
  • pm2 flush with crontab

    3
    0 Votes
    3 Posts
    663 Views
    C
    Many thanks @sdetweil , I will try!
  • MMM-MQTTScreenOnOff - alternative to PIR

    8
    4 Votes
    8 Posts
    3k Views
    R
    @sdetweil said in MMM-MQTTScreenOnOff - alternative to PIR: fun stuff yes, definitely! Ralf
  • Updated MMM-Dynamic-Modules

    1
    2
    1 Votes
    1 Posts
    784 Views
    G
    If anyone’s interested I updated MMM-Dynamic-Modules and added some functionality. Orginal module by Toreke (https://github.com/Toreke/) Magic Mirror² Module: MMM-Dynamic-Modules MMM-Dynamic-Modules moves modules without need to restart Magic Mirror. Module also allows to hide or show modules. Module has method to change configured positions back. Can also dynamically adjust based on screen orientation and update based on notifications received that aren’t sent specifically to the module. Example These use the same config file and only minimal changes to CSS for landscape. My primary screen that’s on all the time is in portrait. The clock and MMM-BMW-PW was shifted from top_bar to upper_third. The newsfeed was moved from bottom_left to bottom_bar. MMM-News-QR was moved from bottom_right to bottom_bar. More drastic maneuvirng can be accomplished by incorporating CSS changes like the example posted here https://forum.magicmirror.builders/topic/13197/change-the-regions-positions PORTRAIT: [image: 1740962110869-screenshot-portrait-resized.png] LANDSCAPE: [image: 1740962120685-screenshot-landscape-resized.png] Installation cd ~/MagicMirror/modules git clone https://github.com/gonzonia/MMM-Dynamic-Modules.git Config The entry in config.js can include the following options: Option | Description swapOrientation | true or false, whether to move modules based on the screen orientation LandscapeConfig | JSON string for moving/hiding when in landscape PortraitConfig | JSON string for moving/hiding when in portrait UpdateNotifications | List of notifications that will trigger the update based on orientation. (Will always include the system, "DOM_OBJECTS_CREATED") { module: "MMM-Dynamic-Modules", classes: 'SceneFamily SceneSam', config: { swapOrientation: true, LandscapeConfig: '{"newsfeed":{"position": "bottom_bar","visible": true},"MMM-News-QR":{"position":"bottom_bar"},"MMM-BMW-PW":{"position":"upper_third"},"clock":{"position": "upper_third"}}', UpdateNotifications:"NEWS_FEED_UPDATE" }, }, How to use Module can be used by sending an change notification with a payload: this.sendNotification('CHANGE_POSITIONS', modules = { 'clock':{ visible: 'true', position: 'top_right', }, 'MMM-WeeklySchedule':{ visible: 'true', position: 'top_left', }, 'MMM-AirQuality':{ visible: 'true', position: 'bottom_bar', } } ); Sending a notification to reset to positions according to your config: this.sendNotification(CHANGE_POSITIONS_DEFAULTS); OR move based on orientation the Config passed to LanscapeConfig or PortraitConfig must be valid JSON in a format like the one below. The slightest typo and it won’t work. swapOrientation: true, LandscapeConfig: '{"newsfeed":{"position": "bottom_bar","visible": true},"MMM-News-QR":{"position":"bottom_bar"},"MMM-BMW-PW":{"position":"upper_third"},"clock":{"position": "upper_third"}}', Order of the modules matters. If there is multiple modules in the same position, first module will be top, second module under it, and so on. If multiple instances of a module are being used, they will ALL be moved or hidden. Tips: Best when used in conjunction with CSS. Use @media (orientation: landscape) { } and @media (orientation: portrait) { } to create stylesheets for specific screen orientations. You can also add and (max-width: 3840px) to either one if you want to create something that is for 4K. This would come in handy if say your main mirror is 1080p but you want to have a separate browser somewhere else showing the mirror on a TV or higher resolution monitor.
  • Bonjour, chez moi le lien Github ne fonctionne pas

    2
    0 Votes
    2 Posts
    557 Views
    S
    @Ottosophie see https://forum.magicmirror.builders/topic/19362/googleassistant-and-related-modules
  • MMM-Pir alternative for bookworm

    8
    0 Votes
    8 Posts
    2k Views
    S
    @Muffex awesome! your prior post wasn’t clear to me
  • MMM-Scenes2

    23
    2 Votes
    23 Posts
    9k Views
    M
    @sdetweil Thanks, it works.
  • MMM - AutoDimmer not dimming entire screen

    1
    0 Votes
    1 Posts
    624 Views
    D
    Re: MMM-AutoDimmer It looks like it doesn’t dim my entire screen. It looks like an Inverse letterbox so to speak. Anyone else having this problem?
  • MMM-Keyboard (a virtual touch keyboard)

    Moved
    10
    2 Votes
    10 Posts
    4k Views
    S
    @reverendz this is NOT a config.js set of code. from the module readme The keyboard works with MagicMirror’s notification system. You can broadcast notifications from ====>another module<===== using the following parameters this.sendNotification("KEYBOARD", { key: "uniqueKey", style: "default", data: {}, }); and in the parms swype boolean false Activate swipe mode (experimental!) (not implemented yet) alwaysShow boolean false Always show keyboard. (not implemented yet) note, NOT IMPLEMENTED YET so, you SOME other module to invoke the notification maybe command to notification ( so you could do it from a terminal window/ssh session) see the third party list (linked in the header above) and put notification in the search field there are a lot to choose from
  • MagicMirror regions

    8
    0 Votes
    8 Posts
    2k Views
    S
    @DanClarkCBET3 for the next release I have submitted a pull request to detect the regions used in index.html instead of hard coded…
  • MMM-Hotword2

    1
    2 Votes
    1 Posts
    857 Views
    M
    MMM-Hotword2 MagicMirror module withPicovoice’s Porcupine for Hotword detector. My previous MMM-Hotword module is deprecated due to that snowboy hot-word detecting engine closed its service. Fortunately, PICOVOICE’s Porcupine and its siblings would be good enough alternative. So I rebuilt the hot-word detector again. I know, there is other Porcupine modules already, but they may lack some features which I need to use. So I revamped my old one for my demands. [image: screenshot.png] Features Multi Hotwords/ Custom Hotwords supported Individual Hotword setting On detection, various works possible; Control other modules with custom notification Execute Shell command or scripts and get the result. Not only hotword, but also continuous utterance could be acauired.(as recorded wav file) The recorded file could be consumed on other STT / voice handling modules No need to rebuild for electron For more details; https://github.com/MMRIZE/MMM-Hotword2
  • MMM-Bash

    3
    1 Votes
    3 Posts
    823 Views
    KristjanESPERANTOK
    @draxiom Nice! Don’t forget to add it to the modules list: https://github.com/MagicMirrorOrg/MagicMirror/wiki/3rd-party-modules :-)