• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
  1. Home
  2. bumrocks
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.
B
Offline
  • Profile
  • Following 1
  • Followers 0
  • Topics 1
  • Posts 15
  • Groups 0

bumrocks

@bumrocks

0
Reputation
12
Profile views
15
Posts
0
Followers
1
Following
Joined May 31, 2020, 5:07 PM
Last Online Nov 14, 2020, 9:43 PM

bumrocks Unfollow Follow

Latest posts made by bumrocks

  • RE: Webcam for MM build?

    @sdetweil , my apologies for not thanking you sooner! I have too many "projects in the works at any given moment and I caved to my frustration with the mirror and took a break. Intended to be a present to my wife, I am now hoping that I can get this the way I want before her birthday comes around again facepalm

    Anyways, I am back to being committed and frustration slaps me in the face immediately…I added the line that was missing (not sure how I did that when I copy and pasted it to begin with) and now I get this error…

    [2020-10-01 23:26:22.548] [INFO]   Checking file...  /home/pi/MagicMirror/config/config.js
    [2020-10-01 23:26:24.211] [LOG]    Line 1 col 1 Definition for rule 'prettier/prettier' was not found.
    /home/pi/MagicMirror/js/check_config.js:66
    			throw new Error("Wrong syntax in config file!");
    			^
    
    Error: Wrong syntax in config file!
        at /home/pi/MagicMirror/js/check_config.js:66:10
        at FSReqWrap.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:53:3)
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! magicmirror@2.12.0 config:check: `node js/check_config.js`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the magicmirror@2.12.0 config:check script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /home/pi/.npm/_logs/2020-10-02T05_26_24_231Z-debug.log
    
    
    

    Here is my config file from top to bottom as it is now…

    /* Magic Mirror Config Sample
     *
     * By Michael Teeuw http://michaelteeuw.nl
     * MIT Licensed.
     *
     * For more information on how you can configure 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 or empty, 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"],
    
    	useHttps: false, 		// Support HTTPS or not, default "false" will use HTTP
    	httpsPrivateKey: "", 	// HTTPS private key path, only require when useHttps is true
    	httpsCertificate: "", 	// HTTPS Certificate path, only require when useHttps is true
    
    	language: "en",
    	timeFormat: 24,
    	units: "imperial",
    	// serverOnly:  true/false/"local" ,
    			     // local for armv6l processors, default
    			     //   starts serveronly and then starts chrome browser
    			     // false, default for all  NON-armv6l devices
    			     // true, force serveronly mode, because you want to.. no UI on this device
    
    	modules: [
    		{
    			module: "alert",
    		},
    		{
    			module: "updatenotification",
    			position: "top_bar"
    		},
    		{
    			module: "clock",
    			position: "top_left"
    		},
    		{
    			module: "calendar",
    			header: "US Holidays",
    			position: "top_left",
    			config: {
    				calendars: [
    					{
    						symbol: "calendar-check",
    						url: "webcal://www.calendarlabs.com/ical-calendar/ics/76/US_Holidays.ics"					}
    				]
    			}
    		},
    		{
    			module: "currentweather",
    			position: "top_right",
    			config: {
    				location: "Colorado Springs",
    				locationID: "5417598", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
    				appid: "cf2de0d28398c756b6bad589d8e33c2a"
    			}
    		},
    		{
    			module: "weatherforecast",
    			position: "top_right",
    			header: "Weather Forecast",
    			config: {
    				location: "Colorado Springs",
    				locationID: "5417598", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
    				appid: "cf2de0d28398c756b6bad589d8e33c2a"
    			}
    		},
    		{
    			module: "newsfeed",
    			position: "bottom_bar",
    			config: {
    				feeds: [
    					{
    						title: "BBC Top News Stories",
    						url: "http://feeds.bbci.co.uk/news/rss.xml"
    					}
    				],
    				showSourceTitle: true,
    				showPublishDate: true,
    				broadcastNewsFeeds: true,
    				broadcastNewsUpdates: true
    			}
    		},
    {
        module: 'MMM-SleepWake',
        config:{
           delay:  15,               // default
           mode:  Hide
        }
    		},
    	]
    };
    
    /*************** DO NOT EDIT THE LINE BELOW ***************/
    if (typeof module !== "undefined") {module.exports = config;}
    

    Lastly, did I understand that if I am using an energy star lcd tv with floating “no signal” message when Pi is off that I should use "mode: Hide " ?

    posted in Hardware
    B
    bumrocks
    Oct 2, 2020, 5:45 AM
  • RE: Webcam for MM build?

    @sdetweil , :) Thank you! It appears I have made the necessary changes and will test here shortly! :crossed_fingers_light_skin_tone:

    Ug! I have apparently edited my config file improperly…Message I get after checking it…

    pi@mm2:~/MagicMirror $ npm run config:check
    
    > magicmirror@2.12.0 config:check /home/pi/MagicMirror
    > node js/check_config.js
    
    [2020-09-06 01:16:00.192] [INFO]   Checking file...  /home/pi/MagicMirror/config/config.js
    [2020-09-06 01:16:00.266] [LOG]    Line 101 col 16 Parsing error: Unexpected token below
    /home/pi/MagicMirror/js/check_config.js:66
    			throw new Error("Wrong syntax in config file!");
    			^
    
    Error: Wrong syntax in config file!
        at /home/pi/MagicMirror/js/check_config.js:66:10
        at FSReqWrap.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:53:3)
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! magicmirror@2.12.0 config:check: `node js/check_config.js`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the magicmirror@2.12.0 config:check script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /home/pi/.npm/_logs/2020-09-06T07_16_00_294Z-debug.log
    
    

    Here are the lines in question…

        module: 'MMM-SleepWake',
        delay:  15,               // default
        source: 'external',
        mode:  see below,
         // detectionDir: folder containing externally generated file when motion starts
         //               will be created if needed
         // detectionFile:  filename generated for motion start. default = 'detected'
    
    }
    },
    	]
    

    “mode: see below,” is line 101 as referenced in file check above…

    posted in Hardware
    B
    bumrocks
    Sep 6, 2020, 7:12 AM
  • RE: Webcam for MM build?

    @sdetweil , well my issue of the moment is it will not let me save the changes made to the motion.conf file, arg! I tried to change the files attributes to “anyone” and I get…

    Error setting permissions: Operation not permitted
    
    posted in Hardware
    B
    bumrocks
    Sep 6, 2020, 12:37 AM
  • RE: Webcam for MM build?

    @sdetweil , I am unclear where or how to turn off recording images and video and where the “start/stop” commands are noted within the module instructions…

    I want to use my logitech usb camera for mic control and the camera for detection as well. I have already installed your sleepwake module as well…Just need it all configured at this point and struggling on my own, apparently…

    Also note, in my /usr/share/doc/motion/ it does not contain a motion_guide.html

    Here is my config file…

    Edited to reflect that I believe I made the changes you mention on your SleepWake page to the motion file…

    # Rename this distribution example file to motion.conf
    #
    # This config file was generated by motion 4.1.1
    # Documentation:  /usr/share/doc/motion/motion_guide.html
    
    ############################################################
    # Daemon
    ############################################################
    
    # Start in daemon (background) mode and release terminal (default: off)
    daemon off
    
    # File to store the process ID, also called pid file. (default: not defined)
    process_id_file /var/run/motion/motion.pid
    
    ############################################################
    # Basic Setup Mode
    ############################################################
    
    # Start in Setup-Mode, daemon disabled. (default: off)
    setup_mode off
    
    
    # Use a file to save logs messages, if not defined stderr and syslog is used. (default: not defined)
    logfile /var/log/motion/motion.log
    
    # Level of log messages [1..9] (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL). (default: 6 / NTC)
    log_level 6
    
    # Filter to log messages by type (COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL). (default: ALL)
    log_type all
    
    ###########################################################
    # Capture device options
    ############################################################
    
    # Videodevice to be used for capturing  (default /dev/video0)
    # for FreeBSD default is /dev/bktr0
    videodevice /dev/video0
    
    # v4l2_palette allows one to choose preferable palette to be use by motion
    # See motion_guide.html for the valid options and values.  (default: 17)
    v4l2_palette 17
    
    # Tuner device to be used for capturing using tuner as source (default /dev/tuner0)
    # This is ONLY used for FreeBSD. Leave it commented out for Linux
    ; tunerdevice /dev/tuner0
    
    # The video input to be used (default: -1)
    # Should normally be set to 0 or 1 for video/TV cards, and -1 for USB cameras
    # Set to 0 for uvideo(4) on OpenBSD
    input -1
    
    # The video norm to use (only for video capture and TV tuner cards)
    # Values: 0 (PAL), 1 (NTSC), 2 (SECAM), 3 (PAL NC no colour). Default: 0 (PAL)
    norm 0
    
    # The frequency to set the tuner to (kHz) (only for TV tuner cards) (default: 0)
    frequency 0
    
    # Override the power line frequency for the webcam. (normally not necessary)
    # Values:
    # -1 : Do not modify device setting
    # 0  : Power line frequency Disabled
    # 1  : 50hz
    # 2  : 60hz
    # 3  : Auto
    power_line_frequency -1
    
    # Rotate image this number of degrees. The rotation affects all saved images as
    # well as movies. Valid values: 0 (default = no rotation), 90, 180 and 270.
    rotate 0
    
    # Flip image over a given axis (vertical or horizontal), vertical means from left to right
    # horizontal means top to bottom. Valid values: none, v and h.
    flip_axis none
    
    # Image width (pixels). Valid range: Camera dependent, default: 320
    width 320
    
    # Image height (pixels). Valid range: Camera dependent, default: 240
    height 240
    
    # Maximum number of frames to be captured per second.
    # Valid range: 2-100. Default: 100 (almost no limit).
    framerate 2
    
    # Minimum time in seconds between capturing picture frames from the camera.
    # Default: 0 = disabled - the capture rate is given by the camera framerate.
    # This option is used when you want to capture images at a rate lower than 2 per second.
    minimum_frame_time 0
    
    # Full Network Camera URL.  Valid Services: http:// ftp:// mjpg:// rtsp:// mjpeg:// file:// rtmp://
    ; netcam_url value
    
    # Username and password for network camera if required. Syntax is user:password
    ; netcam_userpass value
    
    # The setting for keep-alive of network socket, should improve performance on compatible net cameras.
    # off:   The historical implementation using HTTP/1.0, closing the socket after each http request.
    # force: Use HTTP/1.0 requests with keep alive header to reuse the same connection.
    # on:    Use HTTP/1.1 requests that support keep alive as default.
    # Default: off
    netcam_keepalive off
    
    # URL to use for a netcam proxy server, if required, e.g. "http://myproxy".
    # If a port number other than 80 is needed, use "http://myproxy:1234".
    # Default: not defined
    ; netcam_proxy value
    
    # Set less strict jpeg checks for network cameras with a poor/buggy firmware.
    # Default: off
    netcam_tolerant_check off
    
    # RTSP connection uses TCP to communicate to the camera. Can prevent image corruption.
    # Default: on
    rtsp_uses_tcp on
    
    # Name of camera to use if you are using a camera accessed through OpenMax/MMAL
    # Default: Not defined
    ; mmalcam_name vc.ril.camera
    
    # Camera control parameters (see raspivid/raspistill tool documentation)
    # Default: Not defined
    ; mmalcam_control_params -hf
    
    # Let motion regulate the brightness of a video device (default: off).
    # The auto_brightness feature uses the brightness option as its target value.
    # If brightness is zero auto_brightness will adjust to average brightness value 128.
    # Only recommended for cameras without auto brightness
    auto_brightness off
    
    # Set the initial brightness of a video device.
    # If auto_brightness is enabled, this value defines the average brightness level
    # which Motion will try and adjust to.
    # Valid range 0-255, default 0 = disabled
    brightness 0
    
    # Set the contrast of a video device.
    # Valid range 0-255, default 0 = disabled
    contrast 0
    
    # Set the saturation of a video device.
    # Valid range 0-255, default 0 = disabled
    saturation 0
    
    # Set the hue of a video device (NTSC feature).
    # Valid range 0-255, default 0 = disabled
    hue 0
    
    
    ############################################################
    # Round Robin (multiple inputs on same video device name)
    ############################################################
    
    # Number of frames to capture in each roundrobin step (default: 1)
    roundrobin_frames 1
    
    # Number of frames to skip before each roundrobin step (default: 1)
    roundrobin_skip 1
    
    # Try to filter out noise generated by roundrobin (default: off)
    switchfilter off
    
    
    ############################################################
    # Motion Detection Settings:
    ############################################################
    
    # Threshold for number of changed pixels in an image that
    # triggers motion detection (default: 1500)
    threshold 1500
    
    # Automatically tune the threshold down if possible (default: off)
    threshold_tune off
    
    # Noise threshold for the motion detection (default: 32)
    noise_level 32
    
    # Automatically tune the noise threshold (default: on)
    noise_tune on
    
    # Despeckle motion image using (e)rode or (d)ilate or (l)abel (Default: not defined)
    # Recommended value is EedDl. Any combination (and number of) of E, e, d, and D is valid.
    # (l)abeling must only be used once and the 'l' must be the last letter.
    # Comment out to disable
    despeckle_filter EedDl
    
    # Detect motion in predefined areas (1 - 9). Areas are numbered like that:  1 2 3
    # A script (on_area_detected) is started immediately when motion is         4 5 6
    # detected in one of the given areas, but only once during an event.        7 8 9
    # One or more areas can be specified with this option. Take care: This option
    # does NOT restrict detection to these areas! (Default: not defined)
    ; area_detect value
    
    # PGM file to use as a sensitivity mask.
    # Full path name to. (Default: not defined)
    ; mask_file value
    
    # PGM file to completely mask out a area of image.
    # Full path name to. (Default: not defined)
    # mask_privacy value
    
    # Dynamically create a mask file during operation (default: 0)
    # Adjust speed of mask changes from 0 (off) to 10 (fast)
    smart_mask_speed 0
    
    # Ignore sudden massive light intensity changes given as a percentage of the picture
    # area that changed intensity. Valid range: 0 - 100 , default: 0 = disabled
    lightswitch 0
    
    # Picture frames must contain motion at least the specified number of frames
    # in a row before they are detected as true motion. At the default of 1, all
    # motion is detected. Valid range: 1 to thousands, recommended 1-5
    minimum_motion_frames 1
    
    # Specifies the number of pre-captured (buffered) pictures from before motion
    # was detected that will be output at motion detection.
    # Recommended range: 0 to 5 (default: 0)
    # Do not use large values! Large values will cause Motion to skip video frames and
    # cause unsmooth movies. To smooth movies use larger values of post_capture instead.
    pre_capture 0
    
    # Number of frames to capture after motion is no longer detected (default: 0)
    post_capture 0
    
    # Event Gap is the seconds of no motion detection that triggers the end of an event.
    # An event is defined as a series of motion images taken within a short timeframe.
    # Recommended value is 60 seconds (Default). The value -1 is allowed and disables
    # events causing all Motion to be written to one single movie file and no pre_capture.
    # If set to 0, motion is running in gapless mode. Movies don't have gaps anymore. An
    # event ends right after no more motion is detected and post_capture is over.
    event_gap 60
    
    # Maximum length in seconds of a movie
    # When value is exceeded a new movie file is created. (Default: 0 = infinite)
    max_movie_time 0
    
    # Always save images even if there was no motion (default: off)
    emulate_motion off
    
    
    ############################################################
    # Image File Output
    ############################################################
    
    # Output 'normal' pictures when motion is detected (default: off)
    # Valid values: on, off, first, best, center
    # When set to 'first', only the first picture of an event is saved.
    # Picture with most motion of an event is saved when set to 'best'.
    # Picture with motion nearest center of picture is saved when set to 'center'.
    # Can be used as preview shot for the corresponding movie.
    output_pictures off
    
    # Output pictures with only the pixels moving object (ghost images) (default: off)
    output_debug_pictures off
    
    # The quality (in percent) to be used by the jpeg and webp compression (default: 75)
    quality 75
    
    # Type of output images
    # Valid values: jpeg, ppm or webp (default: jpeg)
    picture_type jpeg
    
    ############################################################
    
    # Use ffmpeg to encode videos of motion (default: off)
    ffmpeg_output_movies on
    
    # Use ffmpeg to make videos showing the moving pixels (ghost images) (default: off)
    ffmpeg_output_debug_movies off
    
    # Bitrate to be used by the ffmpeg encoder (default: 400000)
    # This option is ignored if ffmpeg_variable_bitrate is not 0 (disabled)
    ffmpeg_bps 400000
    
    # Enables and defines variable bitrate for the ffmpeg encoder.
    # ffmpeg_bps is ignored if variable bitrate is enabled.
    # Valid values: 0 (default) = fixed bitrate defined by ffmpeg_bps,
    # or the range 1 - 100 where 1 means worst quality and 100 is best.
    ffmpeg_variable_bitrate 0
    
    # Container/Codec output videos
    # Valid values: mpeg4, msmpeg4, swf,flv, ffv1, mov, mp4, mkv, hevc
    ffmpeg_video_codec mkv
    
    # When creating videos, should frames be duplicated in order
    # to keep up with the requested frames per second
    # (default: true)
    ffmpeg_duplicate_frames true
    
    # Interval in seconds between timelapse captures.  Default: 0 = off
    timelapse_interval 0
    
    # Timelapse file rollover mode. See motion_guide.html for options and uses.
    timelapse_mode daily
    
    # Frame rate for timelapse playback
    timelapse_fps 30
    
    # Container/Codec for timelapse video. Valid values: mpg or mpeg4
    timelapse_codec mpg
    
    ############################################################
    # External pipe to video encoder
    # Replacement for FFMPEG builtin encoder for ffmpeg_output_movies only.
    # The options movie_filename and timelapse_filename are also used
    # by the ffmpeg feature
    #############################################################
    
    # Bool to enable or disable extpipe (default: off)
    use_extpipe off
    
    # External program (full path and opts) to pipe raw video to
    # Generally, use '-' for STDIN...
    ;extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:i420 -ovc x264 -x264encopts bframes=4:frameref=1:subq=1:scenecut=-1:nob_adapt:threads=1:keyint=1000:8x8dct:vbv_bufsize=4000:crf=24:partitions=i8x8,i4x4:vbv_maxrate=800:no-chroma-me -vf denoise3d=16:12:48:4,pp=lb -of   avi -o %f.avi - -fps %fps
    ;extpipe x264 - --input-res %wx%h --fps %fps --bitrate 2000 --preset ultrafast --quiet -o %f.mp4
    ;extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:fps=%fps -ovc x264 -x264encopts preset=ultrafast -of lavf -o %f.mp4 - -fps %fps
    ;extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size %wx%h -framerate %fps -i pipe:0 -vcodec libx264 -preset ultrafast -f mp4 %f.mp4
    
    
    ############################################################
    # Snapshots (Traditional Periodic Webcam File Output)
    ############################################################
    
    # Make automated snapshot every N seconds (default: 0 = disabled)
    snapshot_interval 0
    
    
    ############################################################
    # Text Display
    # %Y = year, %m = month, %d = date,
    # %H = hour, %M = minute, %S = second, %T = HH:MM:SS,
    # %v = event, %q = frame number, %t = camera id number,
    # %D = changed pixels, %N = noise level, \n = new line,
    # %i and %J = width and height of motion area,
    # %K and %L = X and Y coordinates of motion center
    # %C = value defined by text_event - do not use with text_event!
    # You can put quotation marks around the text to allow
    # leading spaces
    ############################################################
    
    # Locate and draw a box around the moving object.
    # Valid values: on, off, preview (default: off)
    # Set to 'preview' will only draw a box in preview_shot pictures.
    locate_motion_mode off
    
    # Set the look and style of the locate box if enabled.
    # Valid values: box, redbox, cross, redcross (default: box)
    # Set to 'box' will draw the traditional box.
    # Set to 'redbox' will draw a red box.
    # Set to 'cross' will draw a little cross to mark center.
    # Set to 'redcross' will draw a little red cross to mark center.
    locate_motion_style box
    
    # Draws the timestamp using same options as C function strftime(3)
    # Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock
    # Text is placed in lower right corner
    text_right %Y-%m-%d\n%T-%q
    
    # Draw a user defined text on the images using same options as C function strftime(3)
    # Default: Not defined = no text
    # Text is placed in lower left corner
    ; text_left CAMERA %t
    
    # Draw the number of changed pixed on the images (default: off)
    # Will normally be set to off except when you setup and adjust the motion settings
    # Text is placed in upper right corner
    text_changes off
    
    # This option defines the value of the special event conversion specifier %C
    # You can use any conversion specifier in this option except %C. Date and time
    # values are from the timestamp of the first image in the current event.
    # Default: %Y%m%d%H%M%S
    # The idea is that %C can be used filenames and text_left/right for creating
    # a unique identifier for each event.
    text_event %Y%m%d%H%M%S
    
    # Draw characters at twice normal size on images. (default: off)
    text_double off
    
    
    # Text to include in a JPEG EXIF comment
    # May be any text, including conversion specifiers.
    # The EXIF timestamp is included independent of this text.
    ;exif_text %i%J/%K%L
    
    ############################################################
    # Target Directories and filenames For Images And Films
    # For the options snapshot_, picture_, movie_ and timelapse_filename
    # you can use conversion specifiers
    # %Y = year, %m = month, %d = date,
    # %H = hour, %M = minute, %S = second,
    # %v = event, %q = frame number, %t = camera id number,
    # %D = changed pixels, %N = noise level,
    # %i and %J = width and height of motion area,
    # %K and %L = X and Y coordinates of motion center
    # %C = value defined by text_event
    # Quotation marks round string are allowed.
    ############################################################
    
    # Target base directory for pictures and films
    # Recommended to use absolute path. (Default: current working directory)
    target_dir /var/lib/motion
    
    # File path for snapshots (jpeg, ppm or webp) relative to target_dir
    # Default: %v-%Y%m%d%H%M%S-snapshot
    # Default value is equivalent to legacy oldlayout option
    # For Motion 3.0 compatible mode choose: %Y/%m/%d/%H/%M/%S-snapshot
    # File extension .jpg, .ppm or .webp is automatically added so do not include this.
    # Note: A symbolic link called lastsnap.jpg created in the target_dir will always
    # point to the latest snapshot, unless snapshot_filename is exactly 'lastsnap'
    snapshot_filename %v-%Y%m%d%H%M%S-snapshot
    
    # File path for motion triggered images (jpeg, ppm or .webp) relative to target_dir
    # Default: %v-%Y%m%d%H%M%S-%q
    # Default value is equivalent to legacy oldlayout option
    # For Motion 3.0 compatible mode choose: %Y/%m/%d/%H/%M/%S-%q
    # File extension .jpg, .ppm or .webp is automatically added so do not include this
    # Set to 'preview' together with best-preview feature enables special naming
    # convention for preview shots. See motion guide for details
    picture_filename %v-%Y%m%d%H%M%S-%q
    
    # File path for motion triggered ffmpeg films (movies) relative to target_dir
    # Default: %v-%Y%m%d%H%M%S
    # File extensions(.mpg .avi) are automatically added so do not include them
    movie_filename %v-%Y%m%d%H%M%S
    
    # File path for timelapse movies relative to target_dir
    # Default: %Y%m%d-timelapse
    # File extensions(.mpg .avi) are automatically added so do not include them
    timelapse_filename %Y%m%d-timelapse
    
    ############################################################
    # Global Network Options
    ############################################################
    # Enable IPv6 (default: off)
    ipv6_enabled off
    
    ############################################################
    # Live Stream Server
    ############################################################
    
    # The mini-http server listens to this port for requests (default: 0 = disabled)
    stream_port 8081
    
    # 50% scaled down substream (default: 0 = disabled)
    # substream_port 8082
    
    # Quality of the jpeg (in percent) images produced (default: 50)
    stream_quality 50
    
    # Output frames at 1 fps when no motion is detected and increase to the
    # rate given by stream_maxrate when motion is detected (default: off)
    stream_motion off
    
    # Maximum framerate for stream streams (default: 1)
    stream_maxrate 1
    
    # Restrict stream connections to localhost only (default: on)
    stream_localhost on
    
    # Limits the number of images per connection (default: 0 = unlimited)
    # Number can be defined by multiplying actual stream rate by desired number of seconds
    # Actual stream rate is the smallest of the numbers framerate and stream_maxrate
    stream_limit 0
    
    # Set the authentication method (default: 0)
    # 0 = disabled
    # 1 = Basic authentication
    # 2 = MD5 digest (the safer authentication)
    stream_auth_method 0
    
    # Authentication for the stream. Syntax username:password
    # Default: not defined (Disabled)
    ; stream_authentication username:password
    
    # Percentage to scale the stream image for preview
    # This is scaled on the browser side, motion will keep sending full frames
    # Default: 25
    ; stream_preview_scale 25
    
    # Have stream preview image start on a new line
    # Default: no
    ; stream_preview_newline no
    
    ############################################################
    # HTTP Based Control
    ############################################################
    
    # TCP/IP port for the http server to listen on (default: 0 = disabled)
    webcontrol_port 8080
    
    # Restrict control connections to localhost only (default: on)
    webcontrol_localhost on
    
    # Output for http server, select off to choose raw text plain (default: on)
    webcontrol_html_output on
    
    # Authentication for the http based control. Syntax username:password
    # Default: not defined (Disabled)
    ; webcontrol_authentication username:password
    
    # Parameters to include on webcontrol.  0=none, 1=limited, 2=advanced, 3=restricted
    # Default: 0 (none)
    webcontrol_parms 0
    
    
    ############################################################
    # Tracking (Pan/Tilt)
    #############################################################
    
    # Type of tracker (0=none (default), 1=stepper, 2=iomojo, 3=pwc, 4=generic, 5=uvcvideo, 6=servo)
    # The generic type enables the definition of motion center and motion size to
    # be used with the conversion specifiers for options like on_motion_detected
    track_type 0
    
    # Enable auto tracking (default: off)
    track_auto off
    
    # Serial port of motor (default: none)
    ;track_port /dev/ttyS0
    
    # Motor number for x-axis (default: 0)
    ;track_motorx 0
    
    # Set motorx reverse (default: 0)
    ;track_motorx_reverse 0
    
    # Motor number for y-axis (default: 0)
    ;track_motory 1
    
    # Set motory reverse (default: 0)
    ;track_motory_reverse 0
    
    # Maximum value on x-axis (default: 0)
    ;track_maxx 200
    
    # Minimum value on x-axis (default: 0)
    ;track_minx 50
    
    # Maximum value on y-axis (default: 0)
    ;track_maxy 200
    
    # Minimum value on y-axis (default: 0)
    ;track_miny 50
    
    # Center value on x-axis (default: 0)
    ;track_homex 128
    
    # Center value on y-axis (default: 0)
    ;track_homey 128
    
    # ID of an iomojo camera if used (default: 0)
    track_iomojo_id 0
    
    # Angle in degrees the camera moves per step on the X-axis
    # with auto-track (default: 10)
    # Currently only used with pwc type cameras
    track_step_angle_x 10
    
    # Angle in degrees the camera moves per step on the Y-axis
    # with auto-track (default: 10)
    # Currently only used with pwc type cameras
    track_step_angle_y 10
    
    # Delay to wait for after tracking movement as number
    # of picture frames (default: 10)
    track_move_wait 10
    
    # Speed to set the motor to (stepper motor option) (default: 255)
    track_speed 255
    
    # Number of steps to make (stepper motor option) (default: 40)
    track_stepsize 40
    
    
    ############################################################
    # External Commands, Warnings and Logging:
    # You can use conversion specifiers for the on_xxxx commands
    # %Y = year, %m = month, %d = date,
    # %H = hour, %M = minute, %S = second,
    # %v = event, %q = frame number, %t = camera id number,
    # %D = changed pixels, %N = noise level,
    # %i and %J = width and height of motion area,
    # %K and %L = X and Y coordinates of motion center
    # %C = value defined by text_event
    # %f = filename with full path
    # %n = number indicating filetype
    # Both %f and %n are only defined for on_picture_save,
    # on_movie_start and on_movie_end
    # Quotation marks round string are allowed.
    ############################################################
    
    # Do not sound beeps when detecting motion (default: on)
    # Note: Motion never beeps when running in daemon mode.
    quiet on
    
    # Command to be executed when an event starts. (default: none)
    # An event starts at first motion detected after a period of no motion defined by event_gap
    ; on_event_start /home/pi/MagicMirror/modules/MMM-SleepWake/external_motion started
    
    # Command to be executed when an event ends after a period of no motion
    # (default: none). The period of no motion is defined by option event_gap.
    ; on_event_end /home/pi/MagicMirror/modules/MMM-SleepWake/external_motion ended
    
    # Command to be executed when a picture (.ppm|.jpg) is saved (default: none)
    # To give the filename as an argument to a command append it with %f
    ; on_picture_save value
    
    # Command to be executed when a motion frame is detected (default: none)
    ; on_motion_detected value
    
    # Command to be executed when motion in a predefined area is detected
    # Check option 'area_detect'.   (default: none)
    ; on_area_detected value
    
    # Command to be executed when a movie file (.mpg|.avi) is created. (default: none)
    # To give the filename as an argument to a command append it with %f
    ; on_movie_start value
    
    # Command to be executed when a movie file (.mpg|.avi) is closed. (default: none)
    # To give the filename as an argument to a command append it with %f
    ; on_movie_end value
    
    # Command to be executed when a camera can't be opened or if it is lost
    # NOTE: There is situations when motion don't detect a lost camera!
    # It depends on the driver, some drivers dosn't detect a lost camera at all
    # Some hangs the motion thread. Some even hangs the PC! (default: none)
    ; on_camera_lost value
    
    # Command to be executed when a camera that was lost has been found (default: none)
    # NOTE: If motion doesn't properly detect a lost camera, it also won't know it found one.
    ; on_camera_found value
    
    #####################################################################
    # Common Options for database features.
    # Options require database options to be active also.
    #####################################################################
    
    # Log to the database when creating motion triggered picture file  (default: on)
    ; sql_log_picture on
    
    # Log to the database when creating a snapshot image file (default: on)
    ; sql_log_snapshot on
    
    # Log to the database when creating motion triggered movie file (default: off)
    ; sql_log_movie off
    
    # Log to the database when creating timelapse movies file (default: off)
    ; sql_log_timelapse off
    
    # SQL query string that is sent to the database
    # Use same conversion specifiers has for text features
    # Additional special conversion specifiers are
    # %n = the number representing the file_type
    # %f = filename with full path
    # Default value:
    # Create tables :
    ##
    # Mysql
    # CREATE TABLE security (camera int, filename char(80) not null, frame int, file_type int, time_stamp timestamp(14), event_time_stamp timestamp(14));
    #
    # Postgresql
    # CREATE TABLE security (camera int, filename char(80) not null, frame int, file_type int, time_stamp timestamp without time zone, event_time_stamp timestamp without time zone);
    #
    # insert into security(camera, filename, frame, file_type, time_stamp, text_event) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
    ; sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
    
    
    ############################################################
    # Database Options
    ############################################################
    
    # database type : mysql, postgresql, sqlite3 (default : not defined)
    ; database_type value
    
    # database to log to (default: not defined)
    # for sqlite3, the full path and name for the database.
    ; database_dbname value
    
    # The host on which the database is located (default: localhost)
    ; database_host value
    
    # User account name for database (default: not defined)
    ; database_user value
    
    # User password for database (default: not defined)
    ; database_password value
    
    # Port on which the database is located
    #  mysql 3306 , postgresql 5432 (default: not defined)
    ; database_port value
    
    # Database wait time in milliseconds for locked database to
    # be unlocked before returning database locked error (default 0)
    ; database_busy_timeout 0
    
    
    
    ############################################################
    # Video Loopback Device (vloopback project)
    ############################################################
    
    # Output images to a video4linux loopback device
    # Specify the device associated with the loopback device
    # For example /dev/video1 (default: not defined)
    ; video_pipe value
    
    # Output motion images to a video4linux loopback device
    # Specify the device associated with the loopback device
    # For example /dev/video1 (default: not defined)
    ; motion_video_pipe value
    
    
    ##############################################################
    # camera config files - One for each camera.
    # Except if only one camera - You only need this config file.
    # If you have more than one camera you MUST define one camera
    # config file for each camera in addition to this config file.
    ##############################################################
    
    # Remember: If you have more than one camera you must have one
    # camera file for each camera. E.g. 2 cameras requires 3 files:
    # This motion.conf file AND camera1.conf and camera2.conf.
    # Only put the options that are unique to each camera in the
    # camera config files.
    ; camera /etc/motion/camera1.conf
    ; camera /etc/motion/camera2.conf
    ; camera /etc/motion/camera3.conf
    ; camera /etc/motion/camera4.conf
    
    
    ##############################################################
    # Camera config directory
    # Any files ending in '.conf' in this directory will be read
    # as a camera config file.
    ##############################################################
    
    ; camera_dir /etc/motion/conf.d
    
    
    
    posted in Hardware
    B
    bumrocks
    Sep 5, 2020, 10:31 PM
  • RE: MMM-awesome-alexa

    @sdetweil , you are a good guy. Much appreciated all that you obviously do and in areas that you don’t necessarily have to. Thank you very much 😁

    posted in Utilities
    B
    bumrocks
    Jun 26, 2020, 9:21 AM
  • RE: MMM-awesome-alexa

    @sdetweil said in MMM-awesome-alexa:

    @vlatko_jordanov I am trying to set this up but my brain cannot figure out what I am supposed to put in as the return url in the AVS setup…
    …
    edit: DOAH… read the instructions!!! lol… it is EPEXCTED to FAIL to connect… read the text from the failing url

    got that… BUT then next step fails for me…

     Enter your Authorization code (from previous step): ANMJShcLPpSKjJkKLbzj
      ◡ Getting response from Amazon...(node:2772) UnhandledPromiseRejectionWarning: StatusCodeError: 400 - {"error_description":"The request has an invalid grant parameter : code","error":"invalid_grant"}
    

    @sdetweil , man am I happy to see you in here…First things first, I searched within your github page for a way to make a donation to you fir your help and efforts but found nothing…Point me in the right direction to do so please! Once you do, I will gladly show some appreciation to you ;)

    Once that is done I hope you might help in the above situation. I get to this point in the Configuration Helper Tool and have no clue as to what I should enter for a Redirect uri and I never read anywhere about it supposed to fail. And then in advance I’ll ask about the next part you mention where you say the next step fails for you. Did you figure that out?

    Thank you!

    Note: I do have an echo dot device in my home and from reading numerous comments, this seems to help in some way…

    Also, when adding the recommended line to the elctron.js file is it supposed to simply look like this?

    });
    
    // Start the core application if server is run on localhost
    // This starts all node helpers and starts the webserver.
    if (["localhost", "127.0.0.1", "::1", "::ffff:127.0.0.1", undefined].indexOf(config.address) > -1) {
    	core.start(function(c) {
    		config = c;
    	});
    app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required");
    }
    
    

    It does not appear so…As if it is too simple…

    posted in Utilities
    B
    bumrocks
    Jun 25, 2020, 11:48 PM
  • RE: Need Help - Absolute Beginner - Code Posted!

    @sdetweil , oh crap…I was not typing anything. I was copying and pasting but being my noobness in terminal is shining through I was only copying and pasting from within the quotes. I think before that I had copied…

    -c "$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)"
    

    …without the “bash” and therefore got an error code…I then guessed that I should try the code within the quotes facepalm My bad!

    I will come back and let you know if I have outsmarted myself again or succeded in progressing, lol!

    posted in Troubleshooting
    B
    bumrocks
    Jun 17, 2020, 5:40 PM
  • RE: Need Help - Absolute Beginner - Code Posted!

    @sdetweil , I am aware of your instructions. I promise I read them. I have not tried to guess or shortcut your help. If you go back to the 11th post here…

    https://forum.magicmirror.builders/topic/12964/need-help-absolute-beginner-code-posted/11

    …you can see where I stated what I did and what problems I ran into. Maybe those issues had something to do with something else I had done…Now that I have turned off and booted the Pi again things are different. I will try the script again here in a minute and report back if it went as it is supposed to…

    posted in Troubleshooting
    B
    bumrocks
    Jun 17, 2020, 5:25 PM
  • RE: Need Help - Absolute Beginner - Code Posted!

    @sdetweil, I have made more time again. Thank you again for helping. But your last comment has me slightly confused. Here is what i “think”…

    By changing the folder name as you suggested earlier, I sorta uninstalled it. At least made any script you directed me to, to not recognize it as already being there and therefore allowing the script to run as intended and install and check system as it normally would. But your last statement makes me think otherwise now. My confusion is why change a parameter? I really want to use your script as it is intended to do, install, check, etc as it is intended. I don’t want this to be any more difficult than it needs to be or for you to make special arrangements either as I am sure you have better things to do and you are opening yourself up for who knows what special requests in the future, lol.

    Next, I am confused when reading the full return code that I posted above…It says…

    echo -e "\e[91mSorry, your Raspberry Pi is not supported."
    		echo -e "\e[91mPlease run MagicMirror on a Raspberry Pi 2 or 3."
    

    I have a Rasberry Pi 4. There are other things it states as issues but those are almost irrelevant until the script can perform as normal with the install. I have even gone as far as to try and find magicmirror in the “add/remove” software but after browsing and trying specific searches for it, I have come up empty. More confusion upon confusion.

    I am at a loss as to what to do next outside of wiping this micro sdcard and starting over without the manual install…Please help! thank you!

    posted in Troubleshooting
    B
    bumrocks
    Jun 17, 2020, 4:48 PM
  • RE: Need Help - Absolute Beginner - Code Posted!

    Here is the full code as it is returned to me…

    pi@MagicMirror2:~ $ curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh
    #!/bin/bash
    # This is an installer script for MagicMirror2. It works well enough
    # that it can detect if you have Node installed, run a binary script
    # and then download and run MagicMirror2.
    
    if [ $USER == 'root' ]; then
    	 echo Please login as a user to execute the MagicMirror installation,  not root
    	 exit 1
    fi
    
    echo -e "\e[0m"
    echo '$$\      $$\                     $$\           $$\      $$\ $$\                                          $$$$$$\'
    echo '$$$\    $$$ |                    \__|          $$$\    $$$ |\__|                                        $$  __$$\'
    echo '$$$$\  $$$$ | $$$$$$\   $$$$$$\  $$\  $$$$$$$\ $$$$\  $$$$ |$$\  $$$$$$\   $$$$$$\   $$$$$$\   $$$$$$\  \__/  $$ |'
    echo '$$\$$\$$ $$ | \____$$\ $$  __$$\ $$ |$$  _____|$$\$$\$$ $$ |$$ |$$  __$$\ $$  __$$\ $$  __$$\ $$  __$$\  $$$$$$  |'
    echo '$$ \$$$  $$ | $$$$$$$ |$$ /  $$ |$$ |$$ /      $$ \$$$  $$ |$$ |$$ |  \__|$$ |  \__|$$ /  $$ |$$ |  \__|$$  ____/'
    echo '$$ |\$  /$$ |$$  __$$ |$$ |  $$ |$$ |$$ |      $$ |\$  /$$ |$$ |$$ |      $$ |      $$ |  $$ |$$ |      $$ |'
    echo '$$ | \_/ $$ |\$$$$$$$ |\$$$$$$$ |$$ |\$$$$$$$\ $$ | \_/ $$ |$$ |$$ |      $$ |      \$$$$$$  |$$ |      $$$$$$$$\'
    echo '\__|     \__| \_______| \____$$ |\__| \_______|\__|     \__|\__|\__|      \__|       \______/ \__|      \________|'
    echo '                       $$\   $$ |'
    echo '                       \$$$$$$  |'
    echo '                        \______/'
    echo -e "\e[0m"
    
    doInstall=1
    true=1
    false=0
    # Define the tested version of Node.js.
    NODE_TESTED="v10.1.0"
    NPM_TESTED="V6.0.0"
    USER=`whoami`
    PM2_FILE=pm2_MagicMirror.json
    forced_arch=
    pm2setup=$false
    
    trim() {
        local var="$*"
        # remove leading whitespace characters
        var="${var#"${var%%[![:space:]]*}"}"
        # remove trailing whitespace characters
        var="${var%"${var##*[![:space:]]}"}"
        echo -n "$var"
    }
    
    cd $HOME
    
    mac=$(uname -s)
    if [ 0 -eq 1 ]; then
    	if [ "$0" == "bash" ]; then
    		logdir=.
    	else
    		if [ $mac == 'Darwin' ]; then
    			echo this is a mac >> $logfile
    			logdir=$(dirname "$0")
    		else
    			# put the log where the script is located
    				logdir=$(dirname $(readlink -f "$0"))
    		fi
    	fi
    
    	# if the script was execute from the web
    	if [[ $logdir != *"MagicMirror/installers"* ]]; then
    		# use the MagicMirror/installers folder, if setup
    		if [ -d MagicMirror ]; then
    			cd ~/MagicMirror/installers >/dev/null
    				logdir=$(pwd)
    			cd - >/dev/null
    		else
    			# use the users home folder if initial install
    			logdir=$HOME
    		fi
    	fi
    fi
    logfile=$HOME/install.log
    echo install log being saved to $logfile
    
    # Determine which Pi is running.
    date +"install starting  - %a %b %e %H:%M:%S %Z %Y" >>$logfile
    ARM=$(uname -m)
    echo installing on $ARM processor system >>$logfile
    echo the os is $(lsb_release -a 2>/dev/null) >> $logfile
    OS=$(lsb_release -a 2>/dev/null | grep name: | awk '{print $2}')
    # Check the Raspberry Pi version.
    if [ "$ARM" != "armv7l" ]; then
      read -p "this appears not to be a Raspberry Pi 2 or 3, do you want to continue installation (y/N)?" choice
    	choice="${choice:-N}"
    	if [[ $choice =~ ^[Nn]$ ]]; then
    	  echo user stopped install on $ARM hardware  >>$logfile
    		echo -e "\e[91mSorry, your Raspberry Pi is not supported."
    		echo -e "\e[91mPlease run MagicMirror on a Raspberry Pi 2 or 3."
    		echo -e "\e[91mIf this is a Pi Zero, the setup will configure to run in server only mode wih a local browser."
    		exit;
    	fi
    fi
    
    # Define helper methods.
    function command_exists () { type "$1" &> /dev/null ;}
    function verlte() {  [ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ];}
    function verlt() { [ "$1" = "$2" ] && return 1 || verlte $1 $2 ;}
    
    # Update before first apt-get
    if [ $mac != 'Darwin' ]; then
    	echo -e "\e[96mUpdating packages ...\e[90m" | tee -a $logfile
    	upgrade=$false
    	update=$(sudo apt-get update 2>&1)
        # sudo apt-get update --allow-releaseinfo-change
    	echo $update >> $logfile
    	update_rc=$?
        if [ $(echo $update | grep -i "is not valid yet" | wc -l) -ne 0 ]; then
           echo -e "\e[91mSystem date/time is in the past, please correct ...\e[90m" | tee -a $logfile
           exit 1
        fi
    	if [ $update_rc -ne 0 ]; then
    
            echo -e "\e[91mUpdate failed, retrying installation ...\e[90m" | tee -a $logfile
            if [ $(echo $update | grep "apt-secure" | wc -l) -eq 1 ]; then
    	        update=$(sudo apt-get update --allow-releaseinfo-change 2>&1)
    	        update_rc=$?
    	        echo $update >> $logfile
    	        if [ $update_rc -ne 0 ]; then
    		        echo "second apt-get update failed" $update | tee -a $logfile
    		        exit 1
    	        else
    		        echo "second apt-get update completed ok" >> $logfile
    		        upgrade=$true
    	        fi
            fi
    	else
    		echo "apt-get update  completed ok" >> $logfile
    		upgrade=$true
    	fi
    	if [ $upgrade -eq $true ]; then
    	   echo "apt-get upgrade  started" >> $logfile
    	   upgrade_result=$(sudo apt-get --assume-yes upgrade  2>&1)
    		 upgrade_rc=$?
    		 echo apt upgrade result ="rc=$upgrade_rc $upgrade_result" >> $logfile
    	fi
    
    	# Installing helper tools
    	echo -e "\e[96mInstalling helper tools ...\e[90m" | tee -a $logfile
    	sudo apt-get --assume-yes install curl wget git build-essential unzip  >>$logfile
    fi
    
    # Check if we need to install or upgrade Node.js.
    echo -e "\e[96mCheck current Node installation ...\e[0m" | tee -a $logfile
    NODE_INSTALL=false
    if command_exists node; then
    	echo -e "\e[0mNode currently installed. Checking version number." | tee -a $logfile
    	NODE_CURRENT=$(node -v)
    	if [ "$NODE_CURRENT." == "." ]; then
    	   NODE_CURRENT="V1.0.0"
    		 echo forcing low Node version  >> $logfile
    	fi
    	echo -e "\e[0mMinimum Node version: \e[1m$NODE_TESTED\e[0m" | tee -a $logfile
    	echo -e "\e[0mInstalled Node version: \e[1m$NODE_CURRENT\e[0m" | tee -a $logfile
    	if verlte $NODE_CURRENT $NODE_TESTED; then
    		echo -e "\e[96mNode should be upgraded.\e[0m" | tee -a $logfile
    		NODE_INSTALL=true
    
    		# Check if a node process is currenlty running.
    		# If so abort installation.
    		if pgrep "node" > /dev/null; then
    			echo -e "\e[91mA Node process is currently running. Can't upgrade." | tee -a $logfile
    			echo "Please quit all Node processes and restart the installer." | tee -a $logfile
    			echo $(ps -ef | grep node | grep -v \-\-color) | tee -a $logfile
    			exit;
    		fi
    
    	else
    		echo -e "\e[92mNo Node.js upgrade necessary.\e[0m" | tee -a $logfile
    	fi
    
    else
    	echo -e "\e[93mNode.js is not installed.\e[0m" | tee -a $logfile
    	NODE_INSTALL=true
    fi
    # Install or upgrade node if necessary.
    if $NODE_INSTALL; then
    
    	echo -e "\e[96mInstalling Node.js ...\e[90m" | tee -a $logfile
    
    	# Fetch the latest version of Node.js from the selected branch
    	# The NODE_STABLE_BRANCH variable will need to be manually adjusted when a new branch is released. (e.g. 7.x)
    	# Only tested (stable) versions are recommended as newer versions could break MagicMirror.
    	if [ $mac == 'Darwin' ]; then
    	  brew install node
    	else
    		NODE_STABLE_BRANCH="10.x"
    		# sudo apt-get install --only-upgrade libstdc++6
    		node_info=$(curl -sL https://deb.nodesource.com/setup_$NODE_STABLE_BRANCH | sudo -E bash - )
    		echo Node release info = $node_info >> $logfile
    		if [ "$(echo $node_info | grep "not currently supported")." == "." ]; then
    			sudo apt-get install -y nodejs
    		else
    			echo node $NODE_STABLE_BRANCH version installer not available, doing manually >>$logfile
    			# no longer supported install
    			sudo apt-get install -y --only-upgrade libstdc++6 >> $logfile
    			# have to do it manually
    			node_vnum=$(echo $NODE_STABLE_BRANCH | awk -F. '{print $1}')
    			# get the highest release number in the stable branch line for this processor architecture
    			node_ver=$(curl -sL https://unofficial-builds.nodejs.org/download/release/index.tab | grep $ARM | grep -m 1 v$node_vnum | awk '{print $1}')
    			echo "latest release in the $NODE_STABLE_BRANCH family for $ARM is $node_ver" >> $logfile
    			curl -sL https://unofficial-builds.nodejs.org/download/release/$node_ver/node-$node_ver-linux-$ARM.tar.gz >node_release-$node_ver.tar.gz
    			cd /usr/local
    			echo using release tar file = node_release-$node_ver.tar.gz >> $logfile
    			sudo tar --strip-components 1 -xzf  $HOME/node_release-$node_ver.tar.gz
    			cd - >/dev/null
    			rm ./node_release-$node_ver.tar.gz
    		fi
    		# get the new node version number
    		new_ver=$(node -v 2>&1)
    		# if there is a failure to get it due to a missing library
    		if [ $(echo $new_ver | grep "not found" | wc -l) -ne 0 ]; then
    		  #
    			sudo apt-get install -y --only-upgrade libstdc++6 >> $logfile
    		fi
    		echo node version is $(node -v 2>&1 >>$logfile)
    	fi
    	echo -e "\e[92mNode.js installation Done! version=$(node -v)\e[0m" | tee -a $logfile
    fi
    # Check if we need to install or upgrade npm.
    echo -e "\e[96mCheck current NPM installation ...\e[0m" | tee -a $logfile
    NPM_INSTALL=false
    if command_exists npm; then
    	echo -e "\e[0mNPM currently installed. Checking version number." | tee -a $logfile
    	NPM_CURRENT='V'$(npm -v)
    	echo -e "\e[0mMinimum npm version: \e[1m$NPM_TESTED\e[0m" | tee -a $logfile
    	echo -e "\e[0mInstalled npm version: \e[1m$NPM_CURRENT\e[0m" | tee -a $logfile
    	if verlte $NPM_CURRENT $NPM_TESTED; then
    		echo -e "\e[96mnpm should be upgraded.\e[0m" | tee -a $logfile
    		NPM_INSTALL=true
    
    		# Check if a node process is currently running.
    		# If so abort installation.
    		if pgrep "npm" > /dev/null; then
    			echo -e "\e[91mA npm process is currently running. Can't upgrade." | tee -a $logfile
    			echo "Please quit all npm processes and restart the installer." | tee -a $logfile
    			exit;
    		fi
    	else
    		echo -e "\e[92mNo npm upgrade necessary.\e[0m" | tee -a $logfile
    	fi
    else
    	echo -e "\e[93mnpm is not installed.\e[0m" | tee -a $logfile
    	NPM_INSTALL=true
    fi
    
    # Install or upgrade node if necessary.
    if $NPM_INSTALL; then
    
    	echo -e "\e[96mInstalling npm ...\e[90m" | tee -a $logfile
    
    	# Fetch the latest version of npm from the selected branch
    	# The NODE_STABLE_BRANCH variable will need to be manually adjusted when a new branch is released. (e.g. 7.x)
    	# Only tested (stable) versions are recommended as newer versions could break MagicMirror.
    
    	#NODE_STABLE_BRANCH="9.x"
    	#curl -sL https://deb.nodesource.com/setup_$NODE_STABLE_BRANCH | sudo -E bash -
      #
    	# if this is a mac, npm was installed with node
    	if [ $mac != 'Darwin' ]; then
    		sudo apt-get install -y npm >>$logfile
    	fi
    	# update to the latest.
    	echo upgrading npm to latest >> $logfile
    	sudo npm i -g npm  >>$logfile
    	echo -e "\e[92mnpm installation Done! version=V$(npm -v)\e[0m" | tee -a $logfile
    fi
    
    # Install MagicMirror
    cd ~
    if [ $doInstall == 1 ]; then
    	if [ -d "$HOME/MagicMirror" ] ; then
    		echo -e "\e[93mIt seems like MagicMirror is already installed." | tee -a $logfile
    		echo -e "To prevent overwriting, the installer will be aborted." | tee -a $logfile
    		echo -e "Please rename the \e[1m~/MagicMirror\e[0m\e[93m folder and try again.\e[0m" | tee -a $logfile
    		echo ""
    		echo -e "If you want to upgrade your installation run \e[1m\e[97mupgrade-script\e[0m from the ~/MagicMirror/installers directory." | tee -a $logfile
    		echo ""
    		exit;
    	fi
    
    	echo -e "\e[96mCloning MagicMirror ...\e[90m" | tee -a $logfile
    	if git clone --depth=1 https://github.com/MichMich/MagicMirror.git; then
    		echo -e "\e[92mCloning MagicMirror Done!\e[90m" | tee -a $logfile
    		# replace faulty run-start.sh
    		curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/run-start.sh >MagicMirror/run-start.sh
    		chmod +x MagicMirror/run-start.sh
    	else
    		echo -e "\e[91mUnable to clone MagicMirror. \e[90m" | tee -a $logfile
    		exit;
    	fi
    
    	cd ~/MagicMirror  || exit
    	if [ $(grep version package.json | awk -F: '{print $2}') == '"2.9.0",' -a $ARM == 'armv6l' ]; then
    	    git fetch https://github.com/MichMich/MagicMirror.git develop >/dev/null 2>&1
    		git branch develop FETCH_HEAD > /dev/null 2>&1
    		git checkout develop > /dev/null 2>&1
    	fi
    	# if this is v 2.11 or higher
    	newver=$(grep -i version package.json | awk -F\" '{ print $4 }')
    	if verlte "2.11.0" $newver; then
    	  # if one of the older devices, fix the start script to execute in serveronly mode
    	  if [ "$ARM" == "armv6l" ]; then
    		  # fixup the start script
    		  sed '/start/ c \    "start\"\:\"./run-start.sh $1\",' < package.json 	>new_package.json
    		  if [ -s new_package.json ]; then
    		  	cp new_package.json package.json
    		  	rm new_package.json
    		  	echo "package.json update for armv6l completed ok" >>$logfile
    		  else
    		  	echo "package.json update for armv6l failed " >>$logfile
    		  fi
    		  curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/run-start.sh >run-start.sh
    		  chmod +x run-start.sh
    	  elif [ "$ARM" == "x86_64" -a "$OS" == 'buster' ]; then
    	  	cd fonts
    	  	   sed '/roboto-fontface/ c \    "roboto-fontface": "latest"' < package.json 	>new_package.json
    	  	   if [ -s new_package.json ]; then
    		  	cp new_package.json package.json
    		  	rm new_package.json
    		  	echo "package.json update for x86 fontface completed ok" >>$logfile
    		  fi
    	  	cd -
    	  elif [ $mac == 'Darwin' ]; then
    	  	   rm vendor/package-lock.json
    	  	   echo "erase vendor package-lock.json to allow later nan/fsevents install on mac" >>$logfile
    	  fi
    	fi
        if [ ! -e css/custom.css ]; then
           touch css/custom.css
        fi
    	echo -e "\e[96mInstalling dependencies ...\e[90m" | tee -a $logfile
    	rm package-lock.json 2>/dev/null
    	npm_i_r=$(npm install $forced_arch --only=prod)
        npm_i_rc=$?
        if [ $newver == '2.11.0' ]; then
          # fixup missing eslint (in dev dependencies)
      	  npm install eslint >>$logfile
    	fi
        if [ $npm_i_rc -eq 0 ]; then
    		echo -e "\e[92mDependencies installation Done!\e[90m" | tee -a $logfile
    	else
            if [ $(echo $npm_i_r | grep "CERT_NOT_YET_VALID" | wc -l) -ne 0 ]; then
                echo "\e[91mSystem date/time is in the past, please correct \e[90m" | tee -a $logfile
            fi
    		echo -e "\e[91mUnable to install dependencies! \e[90m" | tee -a $logfile
    		exit;
    	fi
    	# fixup permissions on sandbox file if it exists
    	if [ -f node_modules/electron/dist/chrome-sandbox ]; then
    		 echo "fixing sandbox permissions" >>$logfile
    		 sudo chown root node_modules/electron/dist/chrome-sandbox 2>/dev/null
    		 sudo chmod 4755 node_modules/electron/dist/chrome-sandbox 2>/dev/null
    	fi
    	# if this an armv6l device (pi 0/1)
    	# if [ $ARM == 'armv6l' ]; then
    	#	# if this is the updated release
    	#	if ! verlt $(grep -i version package.json | awk -F\" '{ print $4 }')  2.10; then
    	#		# replace the start command with the old one
    	#		grep -v start package.json  | sed '/"scripts": {/a \ \ \ \ "start":\ "bash run-start.sh",' >package.json
    	#	fi
    	# fi
    	# Use sample config for start MagicMirror
    	echo setting up initial config.js | tee -a $logfile
    	cp config/config.js.sample config/config.js
    fi
    # Check if plymouth is installed (default with PIXEL desktop environment), then install custom splashscreen.
    echo -e "\e[96mCheck plymouth installation ...\e[0m" | tee -a $logfile
    if command_exists plymouth; then
    	THEME_DIR="/usr/share/plymouth/themes"
    	echo -e "\e[90mSplashscreen: Checking themes directory.\e[0m" | tee -a $logfile
    	if [ -d $THEME_DIR ]; then
    		echo -e "\e[90mSplashscreen: Create theme directory if not exists.\e[0m" | tee -a $logfile
    		if [ ! -d $THEME_DIR/MagicMirror ]; then
    			sudo mkdir $THEME_DIR/MagicMirror
    		fi
    
    		if sudo cp ~/MagicMirror/splashscreen/splash.png $THEME_DIR/MagicMirror/splash.png && sudo cp ~/MagicMirror/splashscreen/MagicMirror.plymouth $THEME_DIR/MagicMirror/MagicMirror.plymouth && sudo cp ~/MagicMirror/splashscreen/MagicMirror.script $THEME_DIR/MagicMirror/MagicMirror.script; then
    			echo
    			if [ "$(which plymouth-set-default-theme)." != "." ]; then
    				if sudo plymouth-set-default-theme -R MagicMirror; then
    					echo -e "\e[92mSplashscreen: Changed theme to MagicMirror successfully.\e[0m" | tee -a $logfile
    				else
    					echo -e "\e[91mSplashscreen: Couldn't change theme to MagicMirror!\e[0m" | tee -a $logfile
    				fi
    			fi
    		else
    			echo -e "\e[91mSplashscreen: Copying theme failed!\e[0m" | tee -a $logfile
    		fi
    	else
    		echo -e "\e[91mSplashscreen: Themes folder doesn't exist!\e[0m" | tee -a $logfile
    	fi
    else
    	echo -e "\e[93mplymouth is not installed.\e[0m" | tee -a $logfile
    fi
    
    # Use pm2 control like a service MagicMirror
    read -p "Do you want use pm2 for auto starting of your MagicMirror (y/N)?" choice
    choice="${choice:-N}"
    if [[ $choice =~ ^[Yy]$ ]]; then
          echo install and setup pm2 | tee -a $logfile
     			# assume pm2 will be found on the path
    			pm2cmd=pm2
    			# check to see if already installed
    			pm2_installed=$(which $pm2cmd)
    			up=""
    			if [ $mac == 'Darwin' ]; then
    				 up="--unsafe-perm"
    				 launchctl=launchctl
    				 launchctl_path=$(which $launchctl)
    				 `export PATH=$PATH:${launchctl_path%/$launchctl}`
    			fi
    			# check to see if already installed
    			pm2_installed=$(which $pm2cmd)
    			if [  "$pm2_installed." != "." ]; then
    			    # does it work?
    					pm2_fails=$(pm2 list | grep -i -m 1 "uptime" | wc -l )
    					if [ $pm2_fails != 1 ]; then
    					   # uninstall it
    						 echo pm2 installed, but does not work, uninstalling >> $logfile
    					   sudo npm uninstall $up -g pm2 >> $logfile
    						 # force reinstall
    				     pm2_installed=
    					fi
    			fi
    			# if not installed
    			if [  "$pm2_installed." == "." ]; then
    				# install it.
    				echo pm2 not installed, installing >>$logfile
    				result=$(sudo npm install $up -g pm2 2>&1)
    				echo pm2 install result $result >>$logfile
    				# if this is a mac
    				if [ $mac == 'Darwin' ]; then
    					echo "this is a mac, fixup for path" >>$logfile
    					# get the location of pm2 install
    					# parse the npm install output to get the command
    					pm2cmd=`echo $result | awk -F -  '{print $1}' | tr -d '[:space:]'`
    					c='/pm2'
    					# get the path only
    					echo ${pm2cmd%$c} >installers/pm2path
    				fi
    			fi
    			echo "get the pm2 platform specific startup command" >>$logfile
    			# get the platform specific pm2 startup command
    			v=$($pm2cmd startup | tail -n 1)
    			if [ $mac != 'Darwin' ]; then
    				# check to see if we can get the OS package name (Ubuntu)
    				if [ $(which lsb_release| wc -l) >0 ]; then
    					# fix command
    					# if ubuntu 18.04, pm2 startup gets something wrong
    					if [ $(lsb_release  -r | grep -m1 18.04 | wc -l) > 0 ]; then
    						 v=$(echo $v | sed 's/\/bin/\/bin:\/bin/')
    					fi
    				fi
    			fi
    			echo "startup command = $v" >>$logfile
    			# execute the command returned
                $v 2>&1 >>$logfile
    			echo "pm2 startup command done" >>$logfile
    			# is this is mac
    			# need to fix pm2 startup, only on catalina
    			if [ $mac == 'Darwin' ]; then
                    if [ $(sw_vers -productVersion | head -c 6) == '10.15.' ]; then
    					# only do if the faulty tag is present (pm2 may fix this, before the script is fixed)
    					if [ $(grep -m 1 UserName /Users/$USER/Library/LaunchAgents/pm2.$USER.plist | wc -l) -eq 1 ]; then
    						# copy the pm2 startup file config
    						cp  /Users/$USER/Library/LaunchAgents/pm2.$USER.plist .
    						# edit out the UserName key/value strings
    						sed -e '/UserName/{N;d;}' pm2.$USER.plist > pm2.$USER.plist.new
    						# copy the file back
    						sudo cp pm2.$USER.plist.new /Users/$USER/Library/LaunchAgents/pm2.$USER.plist
    					fi
    				fi
    			fi
    		# if the user is no pi, we have to fixup the pm2 json file
    		echo "configure the pm2 config file for MagicMirror" >>$logfile
    		# if the files we need aren't here, get them
    		if [ ! -e installers/pm2_MagicMirror.json ]; then
    			curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/pm2_MagicMirror.json >installers/pm2_MagicMirror.json
    			curl -sl https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/mm.sh >installers/mm.sh
    			chmod +x installers/mm.sh
    		fi
    		if [ "$USER"  != "pi" ]; then
    			echo the user is not pi >>$logfile
    			# go to the installers folder
    			cd installers
    			# edit the startup script for the right user
    			echo change mm.sh >>$logfile
    			 if [ ! -e mm_temp.sh ]; then
    			   echo save copy of mm.sh >> $logfile
    			   cp mm.sh mm_temp.sh
    			 fi
    			 if [ $(grep pi mm_temp.sh | wc -l) -gt 0 ]; then
    			  echo change hard coded pi username  >> $logfile
    				sed 's/pi/'$USER'/g' mm_temp.sh >mm.sh
    			 else
    			  echo change relative home path to hard coded path >> $logfile
    			  hf=$(echo $HOME |sed 's/\//\\\//g')
    			  sed 's/\~/'$hf'/g' mm_temp.sh >mm.sh
    			 fi
    			# edit the pms config file for the right user
    			echo change $PM2_FILE >>$logfile
    			sed 's/pi/'$USER'/g' $PM2_FILE > pm2_MagicMirror_new.json
    			# make sure to use the updated file
    			PM2_FILE=pm2_MagicMirror_new.json
    			# if this is a mac
    			if [ $mac == 'Darwin' ]; then
    				 # copy the path file to the system paths list
    				 sudo cp ./pm2path /etc/paths.d
    				 # change the name of the home path for mac
    				 sed 's/home/Users/g' $PM2_FILE > pm2_MagicMirror_new1.json
    				 # make sure to use the updated file
    				 PM2_FILE=pm2_MagicMirror_new1.json
    			fi
    			echo now using this config file $PM2_FILE >>$logfile
    			# go back one cd level
    			cd - >/dev/null
    		fi
    		echo start MagicMirror via pm2 now >>$logfile
    		# tell pm2 to start the app defined in the config file
    		$pm2cmd start $HOME/MagicMirror/installers/$PM2_FILE
    		# tell pm2 to save that configuration, for start at boot
    		echo save MagicMirror pm2 config now  >>$logfile
    		$pm2cmd save
    		echo stop MagicMirror via pm2 now >>$logfile
    		#$pm2cmd stop MagicMirror
    		pm2setup=$true
    fi
    # Disable Screensaver
    
    read -p "Do you want to disable the screen saver? (y/N)?" choice
    choice="${choice:-Y}"
    if [[ $choice =~ ^[Yy]$ ]]; then
      # if this is a mac
    	if [ $mac == 'Darwin' ]; then
    	  # get the current setting
    	  setting=$(defaults -currentHost read com.apple.screensaver idleTime)
    		# if its on
    		if [ "$setting" != 0 ] ; then
    		  # turn it off
    			echo disable screensaver via mac profile >> $logfile
    			defaults -currentHost write com.apple.screensaver idleTime 0
    		else
    			echo mac profile screen saver already disabled >> $logfile
    		fi
    	else
    	  # find out if some screen saver running
    
    		# get just the running processes and args
    		# just want the program name (1st token)
    		# find the 1st with 'saver' in it (should only be one)
    		# parse with path char, get the last field ( the actual pgm name)
    
    	  screen_saver_running=$(ps -A -o args | awk '{print $1}' | grep -m1 [s]aver | awk -F\/ '{print $NF}');
    
    		# if we found something
    		if [ "$screen_saver_running." != "." ]; then
    		  # some screensaver running
    			case "$screen_saver_running" in
    			 mate-screensaver) echo 'mate screen saver' >>$logfile
    						gsettings set org.mate.screensaver lock-enabled false	 2>/dev/null
    						gsettings set org.mate.screensaver idle-activation-enabled false	 2>/dev/null
    						gsettings set org.mate.screensaver lock_delay 0	 2>/dev/null
    				 echo " $screen_saver_running disabled" >> $logfile
    				 DISPLAY=:0  mate-screensaver  >/dev/null 2>&1 &
    				 ;;
    			 gnome-screensaver) echo 'gnome screen saver' >>$logfile
    			   gnome_screensaver-command -d >/dev/null 2>&1
    				 echo " $screen_saver_running disabled" >> $logfile
    			   ;;
    			 xscreensaver) echo 'xscreensaver running' | tee -a $logfile
    			   xsetting=$(grep -m1 'mode:' ~/.xscreensaver )
    				 if [ $(echo $xsetting | awk '{print $2}') != 'off' ]; then
    					 sed -i "s/$xsetting/mode: off/" "$HOME/.xscreensaver"
    					 echo " xscreensaver set to off" >> $logfile
    				 else
    				   echo " xscreensaver already disabled" >> $logfile
    				 fi
    			   ;;
    			 gsd-screensaver | gsd-screensaver-proxy)
    					setting=$(gsettings get org.gnome.desktop.screensaver lock-enabled 2>/dev/null)
    					setting1=$(gsettings get org.gnome.desktop.session idle-delay 2>/dev/null)
    					if [ "$setting. $setting1." != '. .' ]; then
    						if [ "$setting $setting1" != 'false uint32 0' ]; then
    							echo "disable screensaver via gsettings was $setting and $setting1" >> $logfile
    							gsettings set org.gnome.desktop.screensaver lock-enabled false
    							gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
    							gsettings set org.gnome.desktop.session idle-delay 0
    						else
    							echo "gsettings screen saver already disabled" >> $logfile
    						fi
    					fi
    					;;
    			 *) echo "some other screensaver $screen_saver_running" found | tee -a $logfile
    			    echo "please configure it manually" | tee -a $logfile
    			   ;;
    		  esac
    		fi
    		if [ $(which gsettings | wc -l) == 1 ]; then
    			setting=$(gsettings get org.gnome.desktop.screensaver lock-enabled 2>/dev/null)
    			setting1=$(gsettings get org.gnome.desktop.session idle-delay 2>/dev/null)
    			if [ "$setting. $setting1." != '. .' ]; then
    				if [ "$setting $setting1" != 'false uint32 0' ]; then
    					echo "disable screensaver via gsettings was $setting and $setting1">> $logfile
    					gsettings set org.gnome.desktop.screensaver lock-enabled false
    					gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
    					gsettings set org.gnome.desktop.session idle-delay 0
    				else
    					echo "gsettings screen saver already disabled" >> $logfile
    				fi
    			fi
    		fi
    		if [ -e "/etc/lightdm/lightdm.conf" ]; then
    		  # if screen saver NOT already disabled?
    			if [ $(grep 'xserver-command=X -s 0 -dpms' /etc/lightdm/lightdm.conf | wc -l) == 0 ]; then
    			  echo "disable screensaver via lightdm.conf" >> $logfile
    				sudo sed -i '/^\[Seat:/a xserver-command=X -s 0 -dpms' /etc/lightdm/lightdm.conf
    			else
    			  echo "screensaver via lightdm already disabled" >> $logfile
    			fi
    		fi
    		if [ -d "/etc/xdg/lxsession/LXDE-pi" ]; then
    		  currently_set=$(grep -m1 '\-dpms' /etc/xdg/lxsession/LXDE-pi/autostart)
    			if [ "$currently_set." == "." ]; then
    				echo "disable screensaver via lxsession" >> $logfile
    				# turn it off for the future
    				sudo su -c "echo -e '@xset s noblank\n@xset s off\n@xset -dpms' >> /etc/xdg/lxsession/LXDE-pi/autostart"
    				# turn it off now
    				export DISPLAY=:0; xset s noblank;xset s off;xset -dpms
    			else
    			  echo "lxsession screen saver already disabled" >> $logfile
    			fi
    		fi
    	fi
    fi
    echo " "
    if [ $pm2setup -eq $true ]; then
    	rmessage="pm2 start MagicMirror"
    else
      rmessage="DISPLAY=:0 npm start"
    fi
    echo -e "\e[92mWe're ready! Run \e[1m\e[97m$rmessage\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror.\e[0m" | tee -a $logfile
    
    echo " "
    echo " "
    
    date +"install completed - %a %b %e %H:%M:%S %Z %Y" >>$logfile
    pi@MagicMirror2:~ $ 
    
    
    posted in Troubleshooting
    B
    bumrocks
    Jun 6, 2020, 6:25 PM
Enjoying MagicMirror? Please consider a donation!
MagicMirror created by Michael Teeuw.
Forum managed by Sam, technical setup by Karsten.
This forum is using NodeBB as its core | Contributors
Contact | Privacy Policy