• Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular

    Hour Meter

    Dashboard
    custom widget script javascript hour meter generator
    3
    11
    4076
    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.
    • jkandasa
      jkandasa @esawyja last edited by jkandasa

      @esawyja To achieve this we can create a script, rules, and template, repository variable, uid tag.

      • Create Uid tag for your generator status variable.
        0_1489559343501_upload-bfb87465-6aca-485a-b3eb-6c4641dae107

      • Create repository variable to store and calculate usage. Note: when you want to reset your calculation, update all these values as 0
        0_1489559393152_upload-6285b400-2d4f-4520-9a93-a0f786da66be

      • Create script,
        0_1489559482727_upload-c30a6a6e-0506-40ad-bb9b-949a97cbd388

      //To run this script you need to pass the following bindings
      // {"deviceUid":"generator-status", "repositoryKey":"generator-hour-meter"}
      var myImports = new JavaImporter(java.lang, java.util, org.mycontroller.standalone.utils.McUtils);
      
      with(myImports) {
        var generator = mcApi.uidTag().getByUid(deviceUid).getResource();
        var meter = mcApi.variable().get(repositoryKey);
        var status = {};
        var saveChanges = false;
      
        // If user requested to reset.
        if(meter.value2 === '0'){
          status.enabled = 0;
          status.start = 0;
          status.end = 0;
          meter.value = 0;
          meter.value2 = Date.now();
          meter.value3 = JSON.stringify(status);
          meter.save();
        }
      
        //Copy caclulation data from repository
        status = JSON.parse(meter.value3);
      
        if(generator.value === '1' && status.enabled == 0){
          status.start = Date.now();
          status.enabled = 1;
          saveChanges = true;
        }else if(generator.value === '0' && status.enabled == 1){
          status.end = Date.now();
          status.enabled = 0;
          meter.value = parseInt(meter.value) + (status.end - status.start);
          saveChanges = true;
        }
        //Save changes to repository
        if(saveChanges){
          meter.value3 = JSON.stringify(status);
          meter.save();
        }
      
        //Calculate usage and update to display
        var time = {};
        time.raw =  (status.enabled == 0 ? 0 : Date.now() - status.start) + parseInt(meter.value);
        time.hour = 0;
        time.minute = 0;
        time.second = 0;
        var timeTemp = time.raw;
        //Update hour
        if(timeTemp > McUtils.HOUR){
          time.hour = (timeTemp / McUtils.HOUR) | 0;
          timeTemp %= McUtils.HOUR;
        }
        //Update minute
        if(timeTemp > McUtils.MINUTE){
          time.minute = (timeTemp / McUtils.MINUTE) | 0;
          timeTemp %= McUtils.MINUTE;
        }
        //Update second
        if(timeTemp > McUtils.SECOND){
          time.second = (timeTemp / McUtils.SECOND) | 0;
        }
        time.str = {};
        //Update time as string value
        time.str.hour = (time.hour < 10 ? '0' : '') + time.hour.toString();
        time.str.minute = (time.minute < 10 ? '0' : '') + time.minute.toString();
        time.str.second = (time.second < 10 ? '0' : '') + time.second.toString();
      }
      
      • Create an Operation with bindings to execute this script, Bindings: {"deviceUid":"generator-status", "repositoryKey":"generator-hour-meter"}
        0_1489559628728_upload-86906c91-f2de-4e16-8c09-315907a64230

      • Create Rule to trigger this script, when there is a change on your generator,
        Rule#1:
        0_1489559828355_upload-b44da7d4-1604-45e5-99ef-7fcb9f2d6ba3
        Rule#2:
        0_1489559903375_upload-ecc69498-0327-409f-9274-1cb8ead7f92e

      • Create HTML template to display on dashboard,
        0_1489559972617_upload-311776a0-ebe1-4b7d-9a3c-00064af31708

      <div class="adf-myct">
          <div class="adf-myct-time">${time.str.hour}:${time.str.minute}:${time.str.second}</div>
          <div class="adf-myct-date"><small><I>Since:</I> {{ ${(meter.value2)!"Never"} | date:mchelper.cfg.dateFormat:mchelper.cfg.timezone}}</small></div>
      </div>
      
      • Configure your template and script on Dashboard,
        0_1489560051207_upload-96b76abe-ab4b-4f90-8e9e-0ee4fe98a756

      0_1489560138288_upload-05bc75a0-d4a3-49d9-93c1-1e303d482948

      Displaying time format: hour:minute:second

      E 1 Reply Last reply Reply Quote 1
      • E
        esawyja @jkandasa last edited by

        @jkandasa BRILLIANT, thank you soooo much!!, I will test this out over the weekend and give some feedback!

        1 Reply Last reply Reply Quote 1
        • E
          esawyja last edited by

          I must be doing something wrong, I have a CT on my water heater and I tried to use that as a trigger, I see the clock, but does not run
          0_1489929047443_image.png
          0_1489929075370_image.png
          0_1489929101621_image.png
          0_1489929123342_image.png
          0_1489929216819_image.png
          0_1489929246220_image.png
          0_1489929290177_image.png
          0_1489929324956_image.png

          If I look at the rules I can see that they were triggered, but the clock does not want to update
          0_1489929376722_image.png

          Please would you check my implementation and let me know what I'm doing wrong
          Regards

          jkandasa 1 Reply Last reply Reply Quote 0
          • jkandasa
            jkandasa @esawyja last edited by

            @esawyja

            0_1489929047443_image.png
            Please would you check my implementation and let me know what I'm doing wrong

            Use Geyser Status NOT Watt

            1 Reply Last reply Reply Quote 0
            • E
              esawyja last edited by

              Hi
              Thank you, Let me try that, I just thought that detecting the watts used will be a good enough trigger
              Regards

              1 Reply Last reply Reply Quote 0
              • E
                esawyja last edited by

                @jkandasa It works when I use status, but any reason why my logic on watts used does not work please? I would like to understand, is this written only for state?
                Regards

                jkandasa 1 Reply Last reply Reply Quote 0
                • jkandasa
                  jkandasa @esawyja last edited by

                  @esawyja

                  so if I can send the start of the generator to MyController and start the hourmeter and stop when the generator turns off?

                  Yes, based on your requirement. You have asked to do with status of generator. However you can modify this script as like you want.

                  1 Reply Last reply Reply Quote 0
                  • E
                    esawyja last edited by

                    Thanks so much

                    1 Reply Last reply Reply Quote 0
                    • D
                      Daniele last edited by

                      This is really great!
                      Would it be possible to track a status usage like this, but on a daily basis, so that I can monitor the daily usage in a chart?

                      jkandasa 1 Reply Last reply Reply Quote 0
                      • jkandasa
                        jkandasa @Daniele last edited by

                        @daniele You may need to create a dummy sensor and update sensor value everyday night via a script.

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        0
                        Online

                        647
                        Users

                        505
                        Topics

                        3.3k
                        Posts

                        Copyright © 2015-2022 MyController.org | Contributors | Localization