• 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
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

Clock format

Scheduled Pinned Locked Moved Unsolved Troubleshooting
41 Posts 2 Posters 15.8k Views 2 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    louise
    last edited by sdetweil Dec 2, 2021, 10:15 PM Dec 2, 2021, 10:14 PM

    @sdetweil Sorry, I tired to use block but again, 1st time so it didn’t work. But this si what I have:

    language: "en",
    	locale: "en-US",
    	logLevel: ["INFO", "LOG", "WARN", "ERROR"], // Add "DEBUG" for even more logging
    	timeFormat: 12,
    	units: "imperial"
    
    S 1 Reply Last reply Dec 2, 2021, 10:14 PM Reply Quote 0
    • S Offline
      sdetweil @louise
      last edited by Dec 2, 2021, 10:14 PM

      @louise and what do you have in the clock config?

      Sam

      How to add modules

      learning how to use browser developers window for css changes

      L S 2 Replies Last reply Dec 2, 2021, 10:16 PM Reply Quote 0
      • L Offline
        louise @sdetweil
        last edited by Dec 2, 2021, 10:16 PM

        @sdetweil /* global SunCalc */

        /* Magic Mirror

        • Module: Clock

        • By Michael Teeuw https://michaelteeuw.nl

        • MIT Licensed.
          */
          Module.register(“clock”, {
          // Module config defaults.
          defaults: {
          displayType: “digital”, // options: digital, analog, both

           timeFormat: config.timeFormat,
           timezone: null,
          
           displaySeconds: true,
           showPeriod: true,
           showPeriodUpper: false,
           clockBold: false,
           showDate: true,
           showTime: true,
           showWeek: false,
           dateFormat: "dddd, LL",
          
           /* specific to the analog clock */
           analogSize: "175px",
           analogFace: "simple", // options: 'none', 'simple', 'face-###' (where ### is 001 to 012 inclusive)
           analogPlacement: "bottom", // options: 'top', 'bottom', 'left', 'right'
           analogShowDate: "top", // OBSOLETE, can be replaced with analogPlacement and showTime, options: false, 'top', or 'bottom'
           secondsColor: "#888888",
          
           showSunTimes: false,
           showMoonTimes: false,
           lat: 47.630539,
           lon: -122.344147
          

          },
          // Define required scripts.
          getScripts: function () {
          return [“moment.js”, “moment-timezone.js”, “suncalc.js”];
          },
          // Define styles.
          getStyles: function () {
          return [“clock_styles.css”];
          },
          // Define start sequence.
          start: function () {
          Log.info("Starting module: " + this.name);

           // Schedule update interval.
           this.second = moment().second();
           this.minute = moment().minute();
          
           // Calculate how many ms should pass until next update depending on if seconds is displayed or not
           const delayCalculator = (reducedSeconds) => {
           	const EXTRA_DELAY = 50; // Deliberate imperceptible delay to prevent off-by-one timekeeping errors
          
           	if (this.config.displaySeconds) {
           		return 1000 - moment().milliseconds() + EXTRA_DELAY;
           	} else {
           		return (60 - reducedSeconds) * 1000 - moment().milliseconds() + EXTRA_DELAY;
           	}
           };
          
           // A recursive timeout function instead of interval to avoid drifting
           const notificationTimer = () => {
           	this.updateDom();
          
           	// If seconds is displayed CLOCK_SECOND-notification should be sent (but not when CLOCK_MINUTE-notification is sent)
           	if (this.config.displaySeconds) {
           		this.second = moment().second();
           		if (this.second !== 0) {
           			this.sendNotification("CLOCK_SECOND", this.second);
           			setTimeout(notificationTimer, delayCalculator(0));
           			return;
           		}
           	}
          
           	// If minute changed or seconds isn't displayed send CLOCK_MINUTE-notification
           	this.minute = moment().minute();
           	this.sendNotification("CLOCK_MINUTE", this.minute);
           	setTimeout(notificationTimer, delayCalculator(0));
           };
          
           // Set the initial timeout with the amount of seconds elapsed as reducedSeconds so it will trigger when the minute changes
           setTimeout(notificationTimer, delayCalculator(this.second));
          
           // Set locale.
           moment.locale(config.language);
          

          },
          // Override dom generator.
          getDom: function () {
          const wrapper = document.createElement(“div”);
          wrapper.classList.add(“clockGrid”);

           /************************************
            * Create wrappers for analog and digital clock
            */
           const analogWrapper = document.createElement("div");
           analogWrapper.className = "clockCircle";
           const digitalWrapper = document.createElement("div");
           digitalWrapper.className = "digital";
           digitalWrapper.style.gridArea = "center";
          
           /************************************
            * Create wrappers for DIGITAL clock
            */
           const dateWrapper = document.createElement("div");
           const timeWrapper = document.createElement("div");
           const secondsWrapper = document.createElement("sup");
           const periodWrapper = document.createElement("span");
           const sunWrapper = document.createElement("div");
           const moonWrapper = document.createElement("div");
           const weekWrapper = document.createElement("div");
          
           // Style Wrappers
           dateWrapper.className = "date normal medium";
           timeWrapper.className = "time bright large light";
           secondsWrapper.className = "seconds dimmed";
           sunWrapper.className = "sun dimmed small";
           moonWrapper.className = "moon dimmed small";
           weekWrapper.className = "week dimmed medium";
          
           // Set content of wrappers.
           // The moment().format("h") method has a bug on the Raspberry Pi.
           // So we need to generate the timestring manually.
           // See issue: https://github.com/MichMich/MagicMirror/issues/181
           let timeString;
           const now = moment();
           if (this.config.timezone) {
           	now.tz(this.config.timezone);
           }
          
           let hourSymbol = "HH";
           if (this.config.timeFormat !== 12) {
           	hourSymbol = "h";
           }
          
           if (this.config.clockBold) {
           	timeString = now.format(hourSymbol + '[<span class="bold">]mm[</span>]');
           } else {
           	timeString = now.format(hourSymbol + ":mm");
           }
          
           if (this.config.showDate) {
           	dateWrapper.innerHTML = now.format(this.config.dateFormat);
           	digitalWrapper.appendChild(dateWrapper);
           }
          
           if (this.config.displayType !== "analog" && this.config.showTime) {
           	timeWrapper.innerHTML = timeString;
           	secondsWrapper.innerHTML = now.format("ss");
           	if (this.config.showPeriodUpper) {
           		periodWrapper.innerHTML = now.format("A");
           	} else {
           		periodWrapper.innerHTML = now.format("a");
           	}
           	if (this.config.displaySeconds) {
           		timeWrapper.appendChild(secondsWrapper);
           	}
           	if (this.config.showPeriod && this.config.timeFormat !== 24) {
           		timeWrapper.appendChild(periodWrapper);
           	}
           	digitalWrapper.appendChild(timeWrapper);
           }
          
           /**
            * Format the time according to the config
            *
            * @param {object} config The config of the module
            * @param {object} time time to format
            * @returns {string} The formatted time string
            */
           function formatTime(config, time) {
           	let formatString = hourSymbol + ":mm";
           	if (config.showPeriod && config.timeFormat !== 12) {
           		formatString += config.showPeriodUpper ? "A" : "a";
           	}
           	return moment(time).format(formatString);
           }
          
           /****************************************************************
            * Create wrappers for Sun Times, only if specified in config
            */
           if (this.config.showSunTimes) {
           	const sunTimes = SunCalc.getTimes(now, this.config.lat, this.config.lon);
           	const isVisible = now.isBetween(sunTimes.sunrise, sunTimes.sunset);
           	let nextEvent;
           	if (now.isBefore(sunTimes.sunrise)) {
           		nextEvent = sunTimes.sunrise;
           	} else if (now.isBefore(sunTimes.sunset)) {
           		nextEvent = sunTimes.sunset;
           	} else {
           		const tomorrowSunTimes = SunCalc.getTimes(now.clone().add(1, "day"), this.config.lat, this.config.lon);
           		nextEvent = tomorrowSunTimes.sunrise;
           	}
           	const untilNextEvent = moment.duration(moment(nextEvent).diff(now));
           	const untilNextEventString = untilNextEvent.hours() + "h " + untilNextEvent.minutes() + "m";
           	sunWrapper.innerHTML =
           		'<span class="' +
           		(isVisible ? "bright" : "") +
           		'"><i class="fa fa-sun-o" aria-hidden="true"></i> ' +
           		untilNextEventString +
           		"</span>" +
           		'<span><i class="fa fa-arrow-up" aria-hidden="true"></i> ' +
           		formatTime(this.config, sunTimes.sunrise) +
           		"</span>" +
           		'<span><i class="fa fa-arrow-down" aria-hidden="true"></i> ' +
           		formatTime(this.config, sunTimes.sunset) +
           		"</span>";
           	digitalWrapper.appendChild(sunWrapper);
           }
          
           /****************************************************************
            * Create wrappers for Moon Times, only if specified in config
            */
           if (this.config.showMoonTimes) {
           	const moonIllumination = SunCalc.getMoonIllumination(now.toDate());
           	const moonTimes = SunCalc.getMoonTimes(now, this.config.lat, this.config.lon);
           	const moonRise = moonTimes.rise;
           	let moonSet;
           	if (moment(moonTimes.set).isAfter(moonTimes.rise)) {
           		moonSet = moonTimes.set;
           	} else {
           		const nextMoonTimes = SunCalc.getMoonTimes(now.clone().add(1, "day"), this.config.lat, this.config.lon);
           		moonSet = nextMoonTimes.set;
           	}
           	const isVisible = now.isBetween(moonRise, moonSet) || moonTimes.alwaysUp === true;
           	const illuminatedFractionString = Math.round(moonIllumination.fraction * 100) + "%";
           	moonWrapper.innerHTML =
           		'<span class="' +
           		(isVisible ? "bright" : "") +
           		'"><i class="fa fa-moon-o" aria-hidden="true"></i> ' +
           		illuminatedFractionString +
           		"</span>" +
           		'<span><i class="fa fa-arrow-up" aria-hidden="true"></i> ' +
           		(moonRise ? formatTime(this.config, moonRise) : "...") +
           		"</span>" +
           		'<span><i class="fa fa-arrow-down" aria-hidden="true"></i> ' +
           		(moonSet ? formatTime(this.config, moonSet) : "...") +
           		"</span>";
           	digitalWrapper.appendChild(moonWrapper);
           }
          
           if (this.config.showWeek) {
           	weekWrapper.innerHTML = this.translate("WEEK", { weekNumber: now.week() });
           	digitalWrapper.appendChild(weekWrapper);
           }
          
           /****************************************************************
            * Create wrappers for ANALOG clock, only if specified in config
            */
           if (this.config.displayType !== "digital") {
           	// If it isn't 'digital', then an 'analog' clock was also requested
          
           	// Calculate the degree offset for each hand of the clock
           	if (this.config.timezone) {
           		now.tz(this.config.timezone);
           	}
           	const second = now.seconds() * 6,
           		minute = now.minute() * 6 + second / 60,
           		hour = ((now.hours() % 12) / 12) * 360 + 90 + minute / 12;
          
           	// Create wrappers
           	analogWrapper.style.width = this.config.analogSize;
           	analogWrapper.style.height = this.config.analogSize;
          
           	if (this.config.analogFace !== "" && this.config.analogFace !== "simple" && this.config.analogFace !== "none") {
           		analogWrapper.style.background = "url(" + this.data.path + "faces/" + this.config.analogFace + ".svg)";
           		analogWrapper.style.backgroundSize = "100%";
          
           		// The following line solves issue: https://github.com/MichMich/MagicMirror/issues/611
           		// analogWrapper.style.border = "1px solid black";
           		analogWrapper.style.border = "rgba(0, 0, 0, 0.1)"; //Updated fix for Issue 611 where non-black backgrounds are used
           	} else if (this.config.analogFace !== "none") {
           		analogWrapper.style.border = "2px solid white";
           	}
           	const clockFace = document.createElement("div");
           	clockFace.className = "clockFace";
          
           	const clockHour = document.createElement("div");
           	clockHour.id = "clockHour";
           	clockHour.style.transform = "rotate(" + hour + "deg)";
           	clockHour.className = "clockHour";
           	const clockMinute = document.createElement("div");
           	clockMinute.id = "clockMinute";
           	clockMinute.style.transform = "rotate(" + minute + "deg)";
           	clockMinute.className = "clockMinute";
          
           	// Combine analog wrappers
           	clockFace.appendChild(clockHour);
           	clockFace.appendChild(clockMinute);
          
           	if (this.config.displaySeconds) {
           		const clockSecond = document.createElement("div");
           		clockSecond.id = "clockSecond";
           		clockSecond.style.transform = "rotate(" + second + "deg)";
           		clockSecond.className = "clockSecond";
           		clockSecond.style.backgroundColor = this.config.secondsColor;
           		clockFace.appendChild(clockSecond);
           	}
           	analogWrapper.appendChild(clockFace);
           }
          
           /*******************************************
            * Update placement, respect old analogShowDate even if its not needed anymore
            */
           if (this.config.displayType === "analog") {
           	// Display only an analog clock
           	if (this.config.analogShowDate === "top") {
           		wrapper.classList.add("clockGrid--bottom");
           	} else if (this.config.analogShowDate === "bottom") {
           		wrapper.classList.add("clockGrid--top");
           	} else {
           		//analogWrapper.style.gridArea = "center";
           	}
           } else if (this.config.displayType === "both") {
           	wrapper.classList.add("clockGrid--" + this.config.analogPlacement);
           }
          
           wrapper.appendChild(analogWrapper);
           wrapper.appendChild(digitalWrapper);
          
           // Return the wrapper to the dom.
           return wrapper;
          

          }
          });

        S 1 Reply Last reply Dec 2, 2021, 10:19 PM Reply Quote 0
        • S Offline
          sdetweil @sdetweil
          last edited by Dec 2, 2021, 10:16 PM

          @sdetweil on the code block

          has to be a blank line before and after
          and the character was ~ not `

          did u do that manually, type in the chars of hit the </> after selecting the text ?

          Sam

          How to add modules

          learning how to use browser developers window for css changes

          L 1 Reply Last reply Dec 2, 2021, 10:18 PM Reply Quote 0
          • L Offline
            louise @sdetweil
            last edited by Dec 2, 2021, 10:18 PM

            @sdetweil I just did a ctrl a then copy and pasted

            S 1 Reply Last reply Dec 2, 2021, 10:21 PM Reply Quote 0
            • S Offline
              sdetweil @louise
              last edited by sdetweil Dec 2, 2021, 10:19 PM Dec 2, 2021, 10:19 PM

              @louise

              NEVER change the CODE

              in config.js

              		{
              			module: "clock",
              			position: "top_left"
              		},
              

              whatever u need to configure goes inside a config:{} section,…

              if not there, add one

              		{
              			module: "clock",
              			position: "top_left",
                                     config: {
                                          .... whatever 
                                    }
              		},
              

              Sam

              How to add modules

              learning how to use browser developers window for css changes

              L 1 Reply Last reply Dec 2, 2021, 10:20 PM Reply Quote 0
              • L Offline
                louise @sdetweil
                last edited by Dec 2, 2021, 10:20 PM

                @sdetweil I didn’t think I did change anything.

                1 Reply Last reply Reply Quote 0
                • S Offline
                  sdetweil @louise
                  last edited by Dec 2, 2021, 10:21 PM

                  @louise after the paste

                  select the text in the message, and the push the </> button above the editor
                  Screenshot at 2021-12-02 16-20-19.png

                  Sam

                  How to add modules

                  learning how to use browser developers window for css changes

                  L 1 Reply Last reply Dec 2, 2021, 10:23 PM Reply Quote 0
                  • L Offline
                    louise @sdetweil
                    last edited by Dec 2, 2021, 10:23 PM

                    @sdetweil OH, that’s what you meant by block.
                    But as far as changing anything in the code I didn’t, except the 12 and imperial

                    L S 2 Replies Last reply Dec 2, 2021, 10:25 PM Reply Quote 0
                    • L Offline
                      louise @louise
                      last edited by sdetweil Dec 2, 2021, 10:28 PM Dec 2, 2021, 10:25 PM

                      @louise

                      deleted  sam
                      
                      S 1 Reply Last reply Dec 2, 2021, 10:27 PM Reply Quote 0
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      • 1 / 5
                      1 / 5
                      • First post
                        7/41
                        Last post
                      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