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.

    Timer on Module

    Scheduled Pinned Locked Moved Unsolved Troubleshooting
    22 Posts 4 Posters 6.3k Views 4 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.
    • D Offline
      dsmtweaker @Guest
      last edited by

      @sean Thank you, and everyone else for all the help. It’s refreshing to find a forum that doesn’t automatically start bashing beginners.

      I think my knowledge is just not ready for something this advanced yet. I used your code, and tried changes here and there to make it work, but still no luck. I am no longer getting any errors in the console. But nothing happens(ie- no video ever loads/plays) this is where I got the code so far…

      Module.register(“MMM-htmlvideo”,{

      // Default module config.
      defaults: {
      	videoSRC: 'https://www.mid-americantitle.com/wp-content/uploads/output_HD7205.mp4',
      	loop: true,
      		},
      
      // get stylesheet
      getStyles: function() {
      	return ["htmlvideo.css"];
      },
      
      
      
      start: function() {
        this.timer = null  
        this.videoDom = null
      },
      getDom: function() {
       var container =  document.createElement("div")
       var video = document.createElement("video")
       video.src = this.config.videoSRC;
      video.id = "VIDEO"
      video.style.display = "none"
      video.autoplay = true
       video.loop = this.config.loop
       container.appendChild(video)
       this.videoDom = video
       return container 
      // Just create DOMs in getDom(). It's better to control DOMs outside of getDom().
      },
      notificationReceived: function(noti, payload, sender) {
       if (noti == "DOM_OBJECT_CREATED") this.work()
      //DOM_OBJECT_CREATED would be the best time to start your job. Your DOM would be created and be ready to work on that message.
      },
      work: function(src = null, interval = null) {
       clearTimer(this.timer)
       interval = (interval) ? interval : 30000
       src = (src) ? src : this.config.videoSRC
        this.playVideo(src)
        this.timer = setTimeout(()=>{
         this.work()
        }, interval)
      //setTimeout is better than setInterval.
      // you can repeat this function by interval. you can change interval and src with parameters of this function.
      },
      playVideo: function(src) {
      this.videoDom.src = src
       if (this.videoDom.style.display == "none") this.videoDom.style.display = "block"
        this.videoDom.play()
        // assign src to your videoDom and play it.
      },
      
      });
      

      I tried changing “interval” with actual numbers, as well as changing the source in multiple locations. Still just get a black screen.

      ? 1 Reply Last reply Reply Quote 0
      • ? Offline
        A Former User @dsmtweaker
        last edited by A Former User

        @dsmtweaker
        Sorry there were another mistypes. DOM_OBJECT_CREATED => DOM_OBJECTS_CREATED (and clearTimer => clearTimeout)

        use this. tested.

        Module.register("test",{
          defaults: {
            videoSRC: 'https://www.mid-americantitle.com/wp-content/uploads/output_HD7205.mp4',
            loop: true,
            interval: 36000,
          },
        
          start: function() {
            this.timer = null
            this.videoDom = null
          },
        
          getDom: function() {
            var container =  document.createElement("div")
            var video = document.createElement("video")
            video.id = "VIDEO"
            video.style.display = "none"
            video.autoplay = true
            video.loop = this.config.loop
            container.appendChild(video)
            this.videoDom = video
            return container
          },
          notificationReceived: function(noti, payload, sender) {
            if (noti == "DOM_OBJECTS_CREATED") this.work()
          },
          work: function(src = null, interval = null) {
            clearTimeout(this.timer)
            interval = (interval) ? interval : this.config.interval
            src = (src) ? src : this.config.videoSRC
            this.playVideo(src)
            this.timer = setTimeout(()=>{
              this.work()
            }, interval)
          },
          playVideo: function(src) {
            this.videoDom.src = src
            if (this.videoDom.style.display == "none") this.videoDom.style.display = "block"
            this.videoDom.play()
          },
        })
        

        Anyway, your video is already repeating by loop: true, why you need to repeat it with timer?

        D 2 Replies Last reply Reply Quote 0
        • D Offline
          dsmtweaker @Guest
          last edited by

          @sean You are a genius, thank you so much.

          Extra bonus, do you know of anyway to use a local source, instead of a web source?

          IE- videoSRC: “/home/pi/content/videos/video1.mp4”

          It’s not necessary, I just figured running something locally instead of from the web
          would help reduce lag/buffer/tearing etc.

          ? 1 Reply Last reply Reply Quote 0
          • D Offline
            dsmtweaker @Guest
            last edited by

            @sean said in Timer on Module:

            Anyway, your video is already repeating by loop: true, why you need to repeat it with timer?

            Because I don’t want it to loop. I want it to play in intervals. Like maybe every 15 minutes it runs the video(once)

            1 Reply Last reply Reply Quote 0
            • ? Offline
              A Former User @dsmtweaker
              last edited by

              @dsmtweaker
              If your local content locates under MagicMirror and it’s sub directory, you can contact via http.
              ~/MagicMirror/YOUR_RESOURCE => http://localhost:8080/YOUR_RESOURCE
              ~/MagicMirror/modules/MMM-SOMETHING/SOMEWHERE/SOME => http://localhost:8080/modules/MMM-SOMETHING/SOMEWHERE/SOME

              But other location… hmmm I’m not sure whether symbolic_link would work. If not so, you need another approach. - more complex… just to move your content under MagicMirror would be simpler.

              1 Reply Last reply Reply Quote 0
              • 1
              • 2
              • 3
              • 2 / 3
              • First post
                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