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
    Last Online

    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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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