Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Controllers
  3. Domoticz
  4. Send value from Domoticz to MySensor node

Send value from Domoticz to MySensor node

Scheduled Pinned Locked Moved Domoticz
10 Posts 4 Posters 4.9k Views 5 Watching
  • 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.
  • moumout31M Offline
    moumout31M Offline
    moumout31
    wrote on last edited by
    #1

    Hello,

    I've tried to use the Power Meter Pulse example of MySensors website, but I can't initialize the first kwh value with the current meter index.
    Thus, I would like to send the index manually via Domoticz to initialize a variable in the Arduino sketch of the node.

    Do you know how I can set a value in Domoticz and send it to a MySensors node to store it in a variable please ?

    Thanks in advance for your help.

    Baptiste

    sundberg84S 1 Reply Last reply
    0
    • moumout31M moumout31

      Hello,

      I've tried to use the Power Meter Pulse example of MySensors website, but I can't initialize the first kwh value with the current meter index.
      Thus, I would like to send the index manually via Domoticz to initialize a variable in the Arduino sketch of the node.

      Do you know how I can set a value in Domoticz and send it to a MySensors node to store it in a variable please ?

      Thanks in advance for your help.

      Baptiste

      sundberg84S Offline
      sundberg84S Offline
      sundberg84
      Hardware Contributor
      wrote on last edited by
      #2

      @moumout31 - there are some discussions about this on the forum. Here is one for example: https://forum.mysensors.org/topic/2101/pulse-water-meter

      Controller: Proxmox VM - Home Assistant
      MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
      MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
      RFLink GW - Arduino Mega + RFLink Shield, 433mhz

      moumout31M 1 Reply Last reply
      0
      • sundberg84S sundberg84

        @moumout31 - there are some discussions about this on the forum. Here is one for example: https://forum.mysensors.org/topic/2101/pulse-water-meter

        moumout31M Offline
        moumout31M Offline
        moumout31
        wrote on last edited by
        #3

        @sundberg84 Thanks for your help.
        It seems to answer my problem, I will try what is done on this topic.

        1 Reply Last reply
        0
        • moumout31M Offline
          moumout31M Offline
          moumout31
          wrote on last edited by
          #4

          I tried to debug my sketch but when I request the last know value from gateway request(CHILD_ID_PMPINIT, V_KWH);, I have no answer from the gateway.

          Contrary to the MySensors example Power Meter Pulse, after several tries, I've created a new Child in order to store the init value of meter and to be able to update it via json.

          You can see the sketch here below.

          Thanks for your help.

          Baptiste

          #include "_04_Headers.h"
          #include "Arduino.h"
          #include <SPI.h>
          #include <SoftwareSerial.h>
          
          //**********Init MySensors**********
          // Enable debug prints to serial monitor
          #define MY_DEBUG
          
          // Enable and select radio type attached
          #define MY_RADIO_RFM69
          
          #define MY_RFM69_FREQUENCY RF69_433MHZ
          
          #define MY_RF69_IRQ_PIN 3
          #define MY_RF69_IRQ_NUM 1
          
          // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
          #if F_CPU == 8000000L
          #define MY_BAUD_RATE 38400
          #endif
          
          #include <MySensors.h>
          
          //**********Init téléinfo**********
          unsigned long loopCounter = 0L;
          unsigned long BASET=0;
          unsigned long BASETt=0; //BASET temporaire
          unsigned long PAPPT=0;
          unsigned long IINSTT=0;
          unsigned long Pcalc=0;
          unsigned long Conso=0;
          
          int j=1;
          int z=1;
          
          TeleInfo* myTeleInfo;
          
          #define CHILD_ID_COMPTEURPV 0
          #define CHILD_ID_COMPTEURPVVA 2
          #define CHILD_ID_COMPTEURPVI 3
          
          MyMessage kWhPVmsg(CHILD_ID_COMPTEURPV, V_KWH);
          MyMessage WPVmsg(CHILD_ID_COMPTEURPV, V_WATT);
          MyMessage VAPVmsg(CHILD_ID_COMPTEURPVVA, V_VA);
          MyMessage IPVmsg(CHILD_ID_COMPTEURPVI, V_CURRENT);
          
          unsigned long SENDstartTeleInfo=0;
          
          //**********Init température**********
          #include <OneWire.h>
          
          #define CHILD_ID_TEMP 1
          
          MyMessage TEMPmsg(CHILD_ID_TEMP, V_TEMP);
          
          unsigned long SENDstartTemp=0;
          
          const int DS18S20_Pin = 5; //DS18S20 Signal pin on digital 5
          const int DS18B20_ID = 0x28;
          OneWire ds(DS18S20_Pin);  // on digital pin 5
          
          //***********Init POWER METER PULSE**********
          #define DIGITAL_INPUT_SENSOR 2  // The digital input you attached your light sensor.  (Only 2 and 3 generates interrupt!)
          #define PULSE_FACTOR 1000       // Nummber of blinks per KWH of your meeter
          #define SLEEP_MODE false        // Watt-value can only be reported when sleep mode is false.
          #define MAX_WATT 10000          // Max watt value to report. This filetrs outliers.
          #define CHILD_ID_PMP 4             // Id of the sensor child
          #define CHILD_ID_PMPINIT 5
          
          unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
          double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
          bool pcReceived = false;
          volatile unsigned long pulseCount = 0;
          volatile unsigned long lastBlink = 0;
          volatile unsigned long watt = 0;
          unsigned long oldPulseCount = 0;
          unsigned long oldWatt = 0;
          double oldKwh;
          unsigned long lastSend;
          
          MyMessage wattMsg(CHILD_ID_PMP,V_WATT);
          MyMessage kwhMsg(CHILD_ID_PMP,V_KWH);
          MyMessage pcMsg(CHILD_ID_PMPINIT,V_KWH);
          
          void onPulse() {
              if (!SLEEP_MODE) {
                  unsigned long newBlink = micros();
                  unsigned long interval = newBlink-lastBlink;
                  if (interval<10000L) { // Sometimes we get interrupt on RISING
                      return;
                  }
                  watt = (3600000000.0 /interval) / ppwh;
                  lastBlink = newBlink;
              }
              pulseCount++;
          }
          
          float getTemp() {
          }
          
          void setup() 
          {
            //Serial.begin(57600);
            //Serial.println(F("\nStarting ..."));
            delay(300);
            // starting TeleInfo capture
            myTeleInfo = new TeleInfo(version);
          
            // Fetch last known pulse count value from gw
            request(CHILD_ID_PMPINIT, V_KWH);
          
            // Use the internal pullup to be able to hook up this sketch directly to an energy meter with S0 output
            // If no pullup is used, the reported usage will be too high because of the floating pin
            pinMode(DIGITAL_INPUT_SENSOR,INPUT_PULLUP);
            attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, RISING);
            lastSend=millis();
          }
          
          void presentation()
          {
            // Send the sketch version information to the gateway and Controller
            sendSketchInfo("Tableau electrique", "1.0");
          
            // Register all sensors to gateway (they will be created as child devices)
            present(CHILD_ID_COMPTEURPV, S_POWER);
            present(CHILD_ID_COMPTEURPVVA, S_POWER);
            present(CHILD_ID_COMPTEURPVI, S_MULTIMETER);
            present(CHILD_ID_TEMP, S_TEMP);
            present(CHILD_ID_PMP, S_POWER);
            present(CHILD_ID_PMPINIT, S_POWER);
          }
          
          void receive(const MyMessage &message)
          {
              if (message.type==V_KWH) {
                  pulseCount = oldPulseCount = message.getLong();
                  Serial.print("Received last pulse count from gw:");
                  Serial.println(pulseCount);
                  pcReceived = true;
              }
          }
          
          void loop() 
          {
          //**********1er cycle de calcul**********
            float temp;
            boolean teleInfoReceived;
            if (j==1) {
              temp = getTemp(); //acquisition température
              temp = getTemp();
              send(TEMPmsg.set(temp,1));
              while(z==1) //tant qu'on n'acquiert pas de téléinfo
              {
                teleInfoReceived = myTeleInfo->readTeleInfo();
                if(teleInfoReceived)
                {
                  BASET=myTeleInfo->BASET;
                  PAPPT=myTeleInfo->PAPPT;
                  IINSTT=myTeleInfo->IINSTT;
                  z=2;
                }
              }
              j=2;
            }
            
          //**********Téléinfo**********
          
            // we parse the teleInfo frame
            teleInfoReceived = myTeleInfo->readTeleInfo();
          
            if(teleInfoReceived)
            {
              BASETt=myTeleInfo->BASET;
              PAPPT=myTeleInfo->PAPPT;
              IINSTT=myTeleInfo->IINSTT;
          
              if((BASETt>BASET) && (BASETt-BASET<1000) && (BASETt<500000)) {
                BASET=BASETt;
              }
          
              //Calcul des informations
              //Puissance efficace instantannée en Watt
              Pcalc=IINSTT*(float)230;
              
              // Envoi des donnees
              if((millis() - SENDstartTeleInfo > 3000))
              {
                SENDstartTeleInfo=millis();
               
                send(kWhPVmsg.set(BASET/(float)1000,3));
                send(VAPVmsg.set(PAPPT));
                send(IPVmsg.set(IINSTT)); 
                send(WPVmsg.set(Pcalc)); 
              }
            }
          
            //**********Consommation électrique*********
            unsigned long now = millis();
            // Only send values at a maximum frequency or woken up from sleep
            bool sendTime = now - lastSend > SEND_FREQUENCY;
            if (pcReceived && (SLEEP_MODE || sendTime)) {
                // New watt value has been calculated
                if (!SLEEP_MODE && watt != oldWatt) {
                    // Check that we dont get unresonable large watt value.
                    // could hapen when long wraps or false interrupt triggered
                    if (watt<((unsigned long)MAX_WATT)) {
                        send(wattMsg.set(watt));  // Send watt value to gw
                    }
                    Serial.print("Watt:");
                    Serial.println(watt);
                    oldWatt = watt;
                }
          
                // Pulse cout has changed
                if (pulseCount != oldPulseCount) {
                    send(pcMsg.set(pulseCount));  // Send pulse count value to gw
                    double kwh = ((double)pulseCount/((double)PULSE_FACTOR));
                    oldPulseCount = pulseCount;
                    if (kwh != oldKwh) {
                        send(kwhMsg.set(kwh, 4));  // Send kwh value to gw
                        oldKwh = kwh;
                    }
                }
                lastSend = now;
            } else if (sendTime && !pcReceived) {
                // No count received. Try requesting it again
                request(CHILD_ID_PMPINIT, V_KWH);
                lastSend=now;
            }
          
            if (SLEEP_MODE) {
                sleep(SEND_FREQUENCY);
            }
            
            //**********Température**********
            float temp1 = getTemp(); //acquisition température
          
            if((millis() - SENDstartTemp > 30000) && (temp1 > (float)5))
              {
                temp=temp1;
                Serial.print("Temperature : ");
                Serial.println(temp);
                send(TEMPmsg.set(temp,1));
                SENDstartTemp=millis();
              }
          }```
          moumout31M 1 Reply Last reply
          0
          • moumout31M moumout31

            I tried to debug my sketch but when I request the last know value from gateway request(CHILD_ID_PMPINIT, V_KWH);, I have no answer from the gateway.

            Contrary to the MySensors example Power Meter Pulse, after several tries, I've created a new Child in order to store the init value of meter and to be able to update it via json.

            You can see the sketch here below.

            Thanks for your help.

            Baptiste

            #include "_04_Headers.h"
            #include "Arduino.h"
            #include <SPI.h>
            #include <SoftwareSerial.h>
            
            //**********Init MySensors**********
            // Enable debug prints to serial monitor
            #define MY_DEBUG
            
            // Enable and select radio type attached
            #define MY_RADIO_RFM69
            
            #define MY_RFM69_FREQUENCY RF69_433MHZ
            
            #define MY_RF69_IRQ_PIN 3
            #define MY_RF69_IRQ_NUM 1
            
            // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
            #if F_CPU == 8000000L
            #define MY_BAUD_RATE 38400
            #endif
            
            #include <MySensors.h>
            
            //**********Init téléinfo**********
            unsigned long loopCounter = 0L;
            unsigned long BASET=0;
            unsigned long BASETt=0; //BASET temporaire
            unsigned long PAPPT=0;
            unsigned long IINSTT=0;
            unsigned long Pcalc=0;
            unsigned long Conso=0;
            
            int j=1;
            int z=1;
            
            TeleInfo* myTeleInfo;
            
            #define CHILD_ID_COMPTEURPV 0
            #define CHILD_ID_COMPTEURPVVA 2
            #define CHILD_ID_COMPTEURPVI 3
            
            MyMessage kWhPVmsg(CHILD_ID_COMPTEURPV, V_KWH);
            MyMessage WPVmsg(CHILD_ID_COMPTEURPV, V_WATT);
            MyMessage VAPVmsg(CHILD_ID_COMPTEURPVVA, V_VA);
            MyMessage IPVmsg(CHILD_ID_COMPTEURPVI, V_CURRENT);
            
            unsigned long SENDstartTeleInfo=0;
            
            //**********Init température**********
            #include <OneWire.h>
            
            #define CHILD_ID_TEMP 1
            
            MyMessage TEMPmsg(CHILD_ID_TEMP, V_TEMP);
            
            unsigned long SENDstartTemp=0;
            
            const int DS18S20_Pin = 5; //DS18S20 Signal pin on digital 5
            const int DS18B20_ID = 0x28;
            OneWire ds(DS18S20_Pin);  // on digital pin 5
            
            //***********Init POWER METER PULSE**********
            #define DIGITAL_INPUT_SENSOR 2  // The digital input you attached your light sensor.  (Only 2 and 3 generates interrupt!)
            #define PULSE_FACTOR 1000       // Nummber of blinks per KWH of your meeter
            #define SLEEP_MODE false        // Watt-value can only be reported when sleep mode is false.
            #define MAX_WATT 10000          // Max watt value to report. This filetrs outliers.
            #define CHILD_ID_PMP 4             // Id of the sensor child
            #define CHILD_ID_PMPINIT 5
            
            unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
            double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
            bool pcReceived = false;
            volatile unsigned long pulseCount = 0;
            volatile unsigned long lastBlink = 0;
            volatile unsigned long watt = 0;
            unsigned long oldPulseCount = 0;
            unsigned long oldWatt = 0;
            double oldKwh;
            unsigned long lastSend;
            
            MyMessage wattMsg(CHILD_ID_PMP,V_WATT);
            MyMessage kwhMsg(CHILD_ID_PMP,V_KWH);
            MyMessage pcMsg(CHILD_ID_PMPINIT,V_KWH);
            
            void onPulse() {
                if (!SLEEP_MODE) {
                    unsigned long newBlink = micros();
                    unsigned long interval = newBlink-lastBlink;
                    if (interval<10000L) { // Sometimes we get interrupt on RISING
                        return;
                    }
                    watt = (3600000000.0 /interval) / ppwh;
                    lastBlink = newBlink;
                }
                pulseCount++;
            }
            
            float getTemp() {
            }
            
            void setup() 
            {
              //Serial.begin(57600);
              //Serial.println(F("\nStarting ..."));
              delay(300);
              // starting TeleInfo capture
              myTeleInfo = new TeleInfo(version);
            
              // Fetch last known pulse count value from gw
              request(CHILD_ID_PMPINIT, V_KWH);
            
              // Use the internal pullup to be able to hook up this sketch directly to an energy meter with S0 output
              // If no pullup is used, the reported usage will be too high because of the floating pin
              pinMode(DIGITAL_INPUT_SENSOR,INPUT_PULLUP);
              attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, RISING);
              lastSend=millis();
            }
            
            void presentation()
            {
              // Send the sketch version information to the gateway and Controller
              sendSketchInfo("Tableau electrique", "1.0");
            
              // Register all sensors to gateway (they will be created as child devices)
              present(CHILD_ID_COMPTEURPV, S_POWER);
              present(CHILD_ID_COMPTEURPVVA, S_POWER);
              present(CHILD_ID_COMPTEURPVI, S_MULTIMETER);
              present(CHILD_ID_TEMP, S_TEMP);
              present(CHILD_ID_PMP, S_POWER);
              present(CHILD_ID_PMPINIT, S_POWER);
            }
            
            void receive(const MyMessage &message)
            {
                if (message.type==V_KWH) {
                    pulseCount = oldPulseCount = message.getLong();
                    Serial.print("Received last pulse count from gw:");
                    Serial.println(pulseCount);
                    pcReceived = true;
                }
            }
            
            void loop() 
            {
            //**********1er cycle de calcul**********
              float temp;
              boolean teleInfoReceived;
              if (j==1) {
                temp = getTemp(); //acquisition température
                temp = getTemp();
                send(TEMPmsg.set(temp,1));
                while(z==1) //tant qu'on n'acquiert pas de téléinfo
                {
                  teleInfoReceived = myTeleInfo->readTeleInfo();
                  if(teleInfoReceived)
                  {
                    BASET=myTeleInfo->BASET;
                    PAPPT=myTeleInfo->PAPPT;
                    IINSTT=myTeleInfo->IINSTT;
                    z=2;
                  }
                }
                j=2;
              }
              
            //**********Téléinfo**********
            
              // we parse the teleInfo frame
              teleInfoReceived = myTeleInfo->readTeleInfo();
            
              if(teleInfoReceived)
              {
                BASETt=myTeleInfo->BASET;
                PAPPT=myTeleInfo->PAPPT;
                IINSTT=myTeleInfo->IINSTT;
            
                if((BASETt>BASET) && (BASETt-BASET<1000) && (BASETt<500000)) {
                  BASET=BASETt;
                }
            
                //Calcul des informations
                //Puissance efficace instantannée en Watt
                Pcalc=IINSTT*(float)230;
                
                // Envoi des donnees
                if((millis() - SENDstartTeleInfo > 3000))
                {
                  SENDstartTeleInfo=millis();
                 
                  send(kWhPVmsg.set(BASET/(float)1000,3));
                  send(VAPVmsg.set(PAPPT));
                  send(IPVmsg.set(IINSTT)); 
                  send(WPVmsg.set(Pcalc)); 
                }
              }
            
              //**********Consommation électrique*********
              unsigned long now = millis();
              // Only send values at a maximum frequency or woken up from sleep
              bool sendTime = now - lastSend > SEND_FREQUENCY;
              if (pcReceived && (SLEEP_MODE || sendTime)) {
                  // New watt value has been calculated
                  if (!SLEEP_MODE && watt != oldWatt) {
                      // Check that we dont get unresonable large watt value.
                      // could hapen when long wraps or false interrupt triggered
                      if (watt<((unsigned long)MAX_WATT)) {
                          send(wattMsg.set(watt));  // Send watt value to gw
                      }
                      Serial.print("Watt:");
                      Serial.println(watt);
                      oldWatt = watt;
                  }
            
                  // Pulse cout has changed
                  if (pulseCount != oldPulseCount) {
                      send(pcMsg.set(pulseCount));  // Send pulse count value to gw
                      double kwh = ((double)pulseCount/((double)PULSE_FACTOR));
                      oldPulseCount = pulseCount;
                      if (kwh != oldKwh) {
                          send(kwhMsg.set(kwh, 4));  // Send kwh value to gw
                          oldKwh = kwh;
                      }
                  }
                  lastSend = now;
              } else if (sendTime && !pcReceived) {
                  // No count received. Try requesting it again
                  request(CHILD_ID_PMPINIT, V_KWH);
                  lastSend=now;
              }
            
              if (SLEEP_MODE) {
                  sleep(SEND_FREQUENCY);
              }
              
              //**********Température**********
              float temp1 = getTemp(); //acquisition température
            
              if((millis() - SENDstartTemp > 30000) && (temp1 > (float)5))
                {
                  temp=temp1;
                  Serial.print("Temperature : ");
                  Serial.println(temp);
                  send(TEMPmsg.set(temp,1));
                  SENDstartTemp=millis();
                }
            }```
            moumout31M Offline
            moumout31M Offline
            moumout31
            wrote on last edited by
            #5

            @moumout31 Nobody knows how to help me please ?

            Thanks

            AWIA 1 Reply Last reply
            0
            • moumout31M moumout31

              @moumout31 Nobody knows how to help me please ?

              Thanks

              AWIA Offline
              AWIA Offline
              AWI
              Hero Member
              wrote on last edited by
              #6

              @moumout31 domoticz only responds to requests for a few types of sensors. KWh is not one of them. You can try to work with V_TEXT.

              moumout31M 1 Reply Last reply
              0
              • AWIA AWI

                @moumout31 domoticz only responds to requests for a few types of sensors. KWh is not one of them. You can try to work with V_TEXT.

                moumout31M Offline
                moumout31M Offline
                moumout31
                wrote on last edited by
                #7

                @AWI Thanks a lot for yout answer ! I will try this !

                K 1 Reply Last reply
                0
                • moumout31M moumout31

                  @AWI Thanks a lot for yout answer ! I will try this !

                  K Offline
                  K Offline
                  kimot
                  wrote on last edited by kimot
                  #8

                  @moumout31
                  I think it is not true, what AWI writes.
                  I try pulse meter example now on RS485 bus, and I am receiving last value from Domoticz when restarting node .
                  When I reset or power off node, it then continues sending form last value.
                  This value it must obtain from domoticz.

                  AWIA 1 Reply Last reply
                  0
                  • K kimot

                    @moumout31
                    I think it is not true, what AWI writes.
                    I try pulse meter example now on RS485 bus, and I am receiving last value from Domoticz when restarting node .
                    When I reset or power off node, it then continues sending form last value.
                    This value it must obtain from domoticz.

                    AWIA Offline
                    AWIA Offline
                    AWI
                    Hero Member
                    wrote on last edited by
                    #9

                    @kimot the pulse meter uses the V_VAR datatype. This can be written to and requested from Domoticz from the MySensors network. However there is no mechanism in Domoticz to set the value. So yes, a useful method for storing variables, but treated somewhat strange on the Domoticz side.

                    1 Reply Last reply
                    0
                    • moumout31M Offline
                      moumout31M Offline
                      moumout31
                      wrote on last edited by
                      #10

                      Thanks a lot, it works using V_TEXT instead of V_KWH !

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      24

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.1k

                      Posts


                      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • MySensors
                      • OpenHardware.io
                      • Categories
                      • Recent
                      • Tags
                      • Popular