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.

    MMM-PIR - off delay

    Scheduled Pinned Locked Moved Development
    11 Posts 5 Posters 8.9k Views 6 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.
    • strawberry 3.141S Offline
      strawberry 3.141 Project Sponsor Module Developer @JamesMM
      last edited by strawberry 3.141

      @JamesMM

      1. If the pir watcher detects a change it will run the specified callback from line 55. https://github.com/paviro/MMM-PIR-Sensor/blob/master/node_helper.js#L55

      2. If you want to debug the node_helper put console.log(“message”) at the position you want and you will see the message in the terminal.

      3. If you change the config in the node_helper, you have to send the changes also to the main module by sending a socketnotification, as you did from the main loop to the node_helper.

      4. If you define a callback with function(){…} you switch the scope, so the reference of this is the callback and not longer the node_helper itself, that’s why the author saved this into the variable self upfront. I would personally define a callback as big arrow function () => {…}, the advantage of this is you will stay in the same scope and wouldn’t need a redundant variable.

      And I assume you want to use a timeout instead of an interval.

      this.pir.watch(function(err, value) {
              if (value == 1) {
                clearTimeout(self.timer);
                self.sendSocketNotification("USER_PRESENCE", true);
                if (self.config.powerSaving){
                  self.activateMonitor();
                }
               }
              else if (value == 0) {
                self.timer = setTimeout(function(){
                    self.sendSocketNotification("USER_PRESENCE", false);
                    if (self.config.powerSaving){
                      self.deactivateMonitor();
                    }
                }, self.config.offDelay);
              }
      });
      

      Please create a github issue if you need help, so I can keep track

      1 Reply Last reply Reply Quote 1
      • J Offline
        JamesMM
        last edited by

        Thanks for your pointers.

        So clearTimeout will throw an error because self.timer is not defined so I defined it as null at the top, and didn’t bother checking if it was null or not before clearing it.

        Once this was done we were in the same boat as before with a pir detection of 1 before the timeout has fired resulting in the mirror turning off and on again which is annoying. This is fixed by adding an onstate variable and simply not executing the activatemirror if its already activated. I just moved cleartimeout outside of that check otherwise it won’t work.

        My working code below since I find it annoying when people don’t come back when they solve a problem:

        // Subclass socketNotificationReceived received.
        socketNotificationReceived: function(notification, payload) {
        if (notification === ‘CONFIG’ && this.started == false) {
        const self = this;
        this.config = payload;
        self.timer = null;
        self.onState = 0;

          //Log.info('PIR: ' + this.name);
        
          //Setup pins
          this.pir = new Gpio(this.config.sensorPIN, 'in', 'both');
        
          if (this.config.relayPIN) {
            this.relay = new Gpio(this.config.relayPIN, 'out');
            this.relay.writeSync(this.config.relayOnState);
            exec("/opt/vc/bin/tvservice --preferred && sudo chvt 6 && sudo chvt 7", null);
          }
        
          //Detected movement
          this.pir.watch(function(err, value) {
            if (value == 1) {
             clearTimeout(self.timer);
            if(self.onState != 1){
              self.sendSocketNotification("USER_PRESENCE", true);
              if (self.config.powerSaving){
                self.activateMonitor();
                self.onState = 1;
              }
              }
             }
            else if (value == 0) {
              if(self.onState != 0){
               self.timer = setTimeout(function(){
                  self.sendSocketNotification("USER_PRESENCE", false);
                  if (self.config.powerSaving){
                    self.deactivateMonitor();
                    self.onState = 0;
                  }
              }, self.config.offDelay);
              }
            }
        

        });

          this.started = true;
        
        } else if (notification === 'SCREEN_WAKEUP') {
          this.activateMonitor();
        }
        

        }

        });

        1 Reply Last reply Reply Quote 2
        • J Offline
          JamesMM
          last edited by

          Sorry I didn’t quote the code properly.

          B 1 Reply Last reply Reply Quote 0
          • B Offline
            bibi @JamesMM
            last edited by

            @JamesMM hi! i also have pain to setup the PIR in hardware way and i would prefer your way. Is the code stated above working? thx

            J 1 Reply Last reply Reply Quote 0
            • L Offline
              lsfourwheeler
              last edited by

              @JamesMM Where is the “Config” section where you added the delay configuration? I’ve changed my node_helper.js file but I can’t find the configuration file you referenced.

              L 1 Reply Last reply Reply Quote 0
              • L Offline
                lsfourwheeler @lsfourwheeler
                last edited by

                @lsfourwheeler @JamesMM Actually, I see that you are referencing the Magic Mirror config for the delay setting. So where are you replacing the deactivateMonitor with timerID?

                J 1 Reply Last reply Reply Quote 0
                • J Offline
                  JamesMM @bibi
                  last edited by

                  @bibi it does. Perfectly.

                  B 1 Reply Last reply Reply Quote 0
                  • J Offline
                    JamesMM @lsfourwheeler
                    last edited by

                    @lsfourwheeler yes passed it in. Assumed that was how it was supposed to be done.

                    1 Reply Last reply Reply Quote 0
                    • B Offline
                      bibi @JamesMM
                      last edited by

                      @JamesMM ok thx! i don’t really get where exactly your code above should be placed :( can you give me a hint pls?

                      1 Reply Last reply Reply Quote 0
                      • troelsbuggeT Offline
                        troelsbugge
                        last edited by

                        Thank you for sharing @JamesMM - it works perfectly!

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