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. My Project
  3. LCD Clock and Text sensor node with new V_TEXT

LCD Clock and Text sensor node with new V_TEXT

Scheduled Pinned Locked Moved My Project
39 Posts 11 Posters 30.2k Views 21 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.
  • Q Qu3Uk

    @NiklasO I have something similar running on MYS 2.0 and can paste the code. I'm using a 4x1 display and using V_VAR-1-4 to send each line over.
    If that's useful to you I can post it.

    NiklasON Offline
    NiklasON Offline
    NiklasO
    wrote on last edited by NiklasO
    #26

    @Qu3Uk said:

    @NiklasO I have something similar running on MYS 2.0 and can paste the code. I'm using a 4x1 display and using V_VAR-1-4 to send each line over.
    If that's useful to you I can post it.

    Yes please. I ported to 2.0 late yesterday and it works ok. I have 4 lines, 20 chars.

    Q 1 Reply Last reply
    0
    • Marc-Olivier ChaubetM Marc-Olivier Chaubet

      Hi,
      i try to send message but nothing change on LcdDisplay.

      I d'ont undestant what is wrong.

      Can you help me pls.

      send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok:
      send: 49-49-20-0 s=9,c=2,t=47,pt=0,l=0,sg=0,st=ok:
      read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test
      send: 49-49-20-0 s=9,c=1,t=16,pt=0,l=4,sg=0,st=ok:test
      send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok:
      
      AWIA Offline
      AWIA Offline
      AWI
      Hero Member
      wrote on last edited by AWI
      #27

      @Marc-Olivier-Chaubet Can you post a little more information (the sketch)?

      The text seems to be arriving at the node. So first check if the information comes in on serial (Serial.print(....)).
      And next: is your display working? just print something it in the local sketch.

      1 Reply Last reply
      0
      • NiklasON NiklasO

        @Qu3Uk said:

        @NiklasO I have something similar running on MYS 2.0 and can paste the code. I'm using a 4x1 display and using V_VAR-1-4 to send each line over.
        If that's useful to you I can post it.

        Yes please. I ported to 2.0 late yesterday and it works ok. I have 4 lines, 20 chars.

        Q Offline
        Q Offline
        Qu3Uk
        wrote on last edited by
        #28

        @NiklasO

        Here is it.

        // Enable debug prints to serial monitor
        //#define MY_DEBUG
        
        //#define MY_NODE_ID 200
        #define MY_SENSOR_ID 1
        
        // Enable and select radio type attached
        #define MY_RADIO_NRF24
        //#define MY_RADIO_RFM69
        
        // Enable repeater functionality for this node
        #define MY_REPEATER_FEATURE
        
        // LCD includes
        #include <Wire.h> 
        #include <LiquidCrystal_I2C.h>
        
        // MYS includes
        #include <SPI.h>
        #include <MySensors.h>
        
        #define LCD_ON 1  // GPIO value to write to turn on attached relay
        #define LCD_OFF 0 // GPIO value to write to turn off attached relay
        
        LiquidCrystal_I2C lcd(0x3f, 20, 4); //0x3f is the LCD address.
        String LINE_BLANK = "                    ";
        
        void before() {
        }
        
        void setup() {
          // Set off  LCD module
          lcd.begin (); 
          lcd.backlight();
        
          lcd.setCursor(0, 0); //
          lcd.print("Ready!"); // We expect the controller to remove this from display.
        }
        
        void presentation()
        {
          // Send the sketch version information to the gateway and Controller
          sendSketchInfo("LCD Display", "1.0");
        
          present(MY_SENSOR_ID, S_INFO);
        }
        
        
        void loop()
        {
          // extra processing if required.
        }
        
        void receive(const MyMessage &message) {
          // We only expect one type of message from controller. But we better check anyway.
          if (message.type == V_STATUS) {
            // Use V_STATUS to turn on/off the LCD display
            // if supported by LCD.
          }
        
          // temp string, probably don't need this.
          if (message.type == V_VAR1) {
            writeScreen(0, message.data);
          }
        
          if (message.type == V_VAR2) {
            writeScreen(1, message.data);
          }
        
          if (message.type == V_VAR3) {
            writeScreen(2, message.data);
          }
        
          if (message.type == V_VAR4) {
            writeScreen(3, message.data);
          }
        }
        
        void writeScreen(int line, String text)
        {
          // Trim whitespace from incoming text.
          text.trim();
        
          // Remove anything over 20 char in text.
          if(text.length() > 19)
          {
              text.remove(20);
          }
          
          // Clear the line
          lcd.setCursor(0, line);
          lcd.print(LINE_BLANK);
        
          // Set Line
          lcd.setCursor(0, line);
          lcd.print(text);
        }
        
        user1306U 1 Reply Last reply
        0
        • Marc-Olivier ChaubetM Offline
          Marc-Olivier ChaubetM Offline
          Marc-Olivier Chaubet
          wrote on last edited by Marc-Olivier Chaubet
          #29

          Hi AWI,
          Yes my display is working, i can see the date and "Line 1 - First....."

          I think what i send is not correct....0_o
          This is from the serial monitor

          read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test
          

          Should it be something like this

          read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:Line1=test
          

          this is the sketch.

          
          /*
           PROJECT: MySensors / LCD display for text from controller
           PROGRAMMER: AWI
           DATE: september 8, 2015/ last update: september 8, 2015
           FILE: AWI_LCD_49.ino
           LICENSE: Public domain
          
           Hardware: tbd ..MYS Ceech - ATmega328p board w/ NRF24l01
              and MySensors 1.5 ()
                  
          Special:
              MySensors - Development (as of sept 2015)
              
          SUMMARY:
              display time & 2 lines of text from Controller Text sensors
          */
          
          #include <MyMessage.h>
          #include <MySensor.h>                       // Mysensor network
          #include <SPI.h>
          #include <LiquidCrystal_I2C.h>
          #include <Time.h>                           //http://playground.arduino.cc/Code/Time
          #include <Wire.h>                           
          
          // uncomment if you are using the DEVELOPMENT version with V_TEXT & V_INFO defined (better to use development MyMessage.h)
          const byte V_TEXT = 47 ;                  // values taken from development edition MyMessage.h
          const byte S_INFO = 36 ;
          
          const byte nodeId = 49 ;                    // MySensors fixed node id
          const byte LCD1_CHILD = 8 ;                 // LCD line 1
          const byte LCD2_CHILD = 9 ;                 // LCD line 2
          
          char lastLCD1[21] = "Line1 - first   ";     // define & init before first receive
          char lastLCD2[21] = "Line2 - second  ";
          
          boolean timeReceived = false ;
          // timers for loop delays
          unsigned long lastUpdate=0, lastRequest=0, lastDisplay=0;
          int display_no = 0 ;                        // current display
          
          // *** Definition and initialisation
          // define the MySensor network
          MyTransportNRF24 transport(9,10);           // Sensoduino (8,7) Ceech board, 3.3v (7,8)  (pin default 9,10)
          MySensor gw(transport);  
          
          // Initialize messages for sensor network
          MyMessage textMsg(0, V_TEXT);
          //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
          LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
          
          // OPTIONAL: Custom characters for display - Units)
          byte heart[8] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000};
          
          void setup(void){
              //Serial in Sensor network = 115200
              gw.begin(incomingMessage, nodeId);                  // this node is 49 fixed 
              //Send the sensor node sketch version information to the gateway
              gw.sendSketchInfo("AWI_LCD text 49", "1.1");
              gw.present(LCD1_CHILD, S_INFO, "LCD_line1");        // new S_type 20150905 (not know by domoticz)
              gw.present(LCD2_CHILD, S_INFO, "LCD_line2");
              gw.send(textMsg.setSensor(LCD1_CHILD).set("-"));    // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
              gw.send(textMsg.setSensor(LCD2_CHILD).set("-"));        
          
              // Initializations
              gw.requestTime(receiveTime);                        // get the time from controller (handled by receiveTime)
              
              // ** LCD display **
              Wire.begin();                                       // I2C
              lcd.begin(16, 2);                                   // LCD 2 lines * 16 char.
              lcd.setBacklight(HIGH);
              lcd.setCursor(0, 0);
              lcd.createChar(1, heart);
          
              // lcd.write(byte(0)); // write units
          }
          
          void loop(void){
              // timer for loop delays
              unsigned long now = millis();
              gw.process() ;
              // If no time has been received yet, request it every 10 second from controller
              // When time has been received, request update every hour
              if ((!timeReceived && (now-lastRequest > 10*1000)) ||   
                  (now-lastRequest > 3600000UL)){                 // request update every hour to keep in sync
                 // Request time from controller. 
                 Serial.println("requesting time");
                 timeReceived = false;
                 gw.requestTime(receiveTime);  
                 lastRequest = now;
                  }
              // Change display and update sensors every 5 seconds (default = 5000)
              if (now-lastDisplay > 5000){
                  lastDisplay = now;
                  gw.request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
                  gw.request(LCD2_CHILD, V_TEXT, 0);                ;// request new values from controller
                  // change display 
                  display_no++;
                      if (display_no >= 2){ // wrap for number of different displays for second line
                      display_no = 0;
                      }
                  }
              // Update display every second
              if (now-lastUpdate > 1000) {
                  LCD_local_display();
                  lastUpdate = now;
                  }
              }
          
          // This is called when a new time value was received
          void receiveTime(unsigned long controllerTime) {
              Serial.print("Time value received: ");
              Serial.println(controllerTime);
              setTime(controllerTime);                            // time from controller
              timeReceived = true;
              }
          
          // This is called when a message is received 
          void incomingMessage(const MyMessage &message) {
              if (message.type==V_TEXT) {                         // Text messages only
               // Write some debug info
               Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
              if (message.sensor == LCD1_CHILD ) {
                  snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
                  }
              else if (message.sensor == LCD2_CHILD){
                  snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
                  }
              } 
          }
          
          void LCD_local_display(void){
          // take car of LCD display information
              char buf[17]; // temp buffer for max 16 char display
              // start with location & time on first line
              snprintf(buf, sizeof buf, "%02d:%02d:%02d %02d-%02d", hour(), minute(), second(), day(), month());
              lcd.setCursor(0, 0);
              lcd.print(buf);
              lcd.setCursor(0, 1);
              if (display_no == 0){
                lcd.print(lastLCD1);                          // second line is text value from controller
              } else {                                        // display == 2
                lcd.print(lastLCD2);
              }
          }
          
          

          Thxs

          AWIA 1 Reply Last reply
          0
          • Marc-Olivier ChaubetM Marc-Olivier Chaubet

            Hi AWI,
            Yes my display is working, i can see the date and "Line 1 - First....."

            I think what i send is not correct....0_o
            This is from the serial monitor

            read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test
            

            Should it be something like this

            read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:Line1=test
            

            this is the sketch.

            
            /*
             PROJECT: MySensors / LCD display for text from controller
             PROGRAMMER: AWI
             DATE: september 8, 2015/ last update: september 8, 2015
             FILE: AWI_LCD_49.ino
             LICENSE: Public domain
            
             Hardware: tbd ..MYS Ceech - ATmega328p board w/ NRF24l01
                and MySensors 1.5 ()
                    
            Special:
                MySensors - Development (as of sept 2015)
                
            SUMMARY:
                display time & 2 lines of text from Controller Text sensors
            */
            
            #include <MyMessage.h>
            #include <MySensor.h>                       // Mysensor network
            #include <SPI.h>
            #include <LiquidCrystal_I2C.h>
            #include <Time.h>                           //http://playground.arduino.cc/Code/Time
            #include <Wire.h>                           
            
            // uncomment if you are using the DEVELOPMENT version with V_TEXT & V_INFO defined (better to use development MyMessage.h)
            const byte V_TEXT = 47 ;                  // values taken from development edition MyMessage.h
            const byte S_INFO = 36 ;
            
            const byte nodeId = 49 ;                    // MySensors fixed node id
            const byte LCD1_CHILD = 8 ;                 // LCD line 1
            const byte LCD2_CHILD = 9 ;                 // LCD line 2
            
            char lastLCD1[21] = "Line1 - first   ";     // define & init before first receive
            char lastLCD2[21] = "Line2 - second  ";
            
            boolean timeReceived = false ;
            // timers for loop delays
            unsigned long lastUpdate=0, lastRequest=0, lastDisplay=0;
            int display_no = 0 ;                        // current display
            
            // *** Definition and initialisation
            // define the MySensor network
            MyTransportNRF24 transport(9,10);           // Sensoduino (8,7) Ceech board, 3.3v (7,8)  (pin default 9,10)
            MySensor gw(transport);  
            
            // Initialize messages for sensor network
            MyMessage textMsg(0, V_TEXT);
            //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
            LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
            
            // OPTIONAL: Custom characters for display - Units)
            byte heart[8] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000};
            
            void setup(void){
                //Serial in Sensor network = 115200
                gw.begin(incomingMessage, nodeId);                  // this node is 49 fixed 
                //Send the sensor node sketch version information to the gateway
                gw.sendSketchInfo("AWI_LCD text 49", "1.1");
                gw.present(LCD1_CHILD, S_INFO, "LCD_line1");        // new S_type 20150905 (not know by domoticz)
                gw.present(LCD2_CHILD, S_INFO, "LCD_line2");
                gw.send(textMsg.setSensor(LCD1_CHILD).set("-"));    // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
                gw.send(textMsg.setSensor(LCD2_CHILD).set("-"));        
            
                // Initializations
                gw.requestTime(receiveTime);                        // get the time from controller (handled by receiveTime)
                
                // ** LCD display **
                Wire.begin();                                       // I2C
                lcd.begin(16, 2);                                   // LCD 2 lines * 16 char.
                lcd.setBacklight(HIGH);
                lcd.setCursor(0, 0);
                lcd.createChar(1, heart);
            
                // lcd.write(byte(0)); // write units
            }
            
            void loop(void){
                // timer for loop delays
                unsigned long now = millis();
                gw.process() ;
                // If no time has been received yet, request it every 10 second from controller
                // When time has been received, request update every hour
                if ((!timeReceived && (now-lastRequest > 10*1000)) ||   
                    (now-lastRequest > 3600000UL)){                 // request update every hour to keep in sync
                   // Request time from controller. 
                   Serial.println("requesting time");
                   timeReceived = false;
                   gw.requestTime(receiveTime);  
                   lastRequest = now;
                    }
                // Change display and update sensors every 5 seconds (default = 5000)
                if (now-lastDisplay > 5000){
                    lastDisplay = now;
                    gw.request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
                    gw.request(LCD2_CHILD, V_TEXT, 0);                ;// request new values from controller
                    // change display 
                    display_no++;
                        if (display_no >= 2){ // wrap for number of different displays for second line
                        display_no = 0;
                        }
                    }
                // Update display every second
                if (now-lastUpdate > 1000) {
                    LCD_local_display();
                    lastUpdate = now;
                    }
                }
            
            // This is called when a new time value was received
            void receiveTime(unsigned long controllerTime) {
                Serial.print("Time value received: ");
                Serial.println(controllerTime);
                setTime(controllerTime);                            // time from controller
                timeReceived = true;
                }
            
            // This is called when a message is received 
            void incomingMessage(const MyMessage &message) {
                if (message.type==V_TEXT) {                         // Text messages only
                 // Write some debug info
                 Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
                if (message.sensor == LCD1_CHILD ) {
                    snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
                    }
                else if (message.sensor == LCD2_CHILD){
                    snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
                    }
                } 
            }
            
            void LCD_local_display(void){
            // take car of LCD display information
                char buf[17]; // temp buffer for max 16 char display
                // start with location & time on first line
                snprintf(buf, sizeof buf, "%02d:%02d:%02d %02d-%02d", hour(), minute(), second(), day(), month());
                lcd.setCursor(0, 0);
                lcd.print(buf);
                lcd.setCursor(0, 1);
                if (display_no == 0){
                  lcd.print(lastLCD1);                          // second line is text value from controller
                } else {                                        // display == 2
                  lcd.print(lastLCD2);
                }
            }
            
            

            Thxs

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

            @Marc-Olivier-Chaubet You should be receiving the TEXT value coming from the controller. Is node showing other information on serial?

            // This is called when a message is received 
            void incomingMessage(const MyMessage &message) {
                 // Write some debug info
                 Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
                if (message.type==V_TEXT) {                         // Text messages only
                 // Write some debug info
                 Serial.print("Text Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
                if (message.sensor == LCD1_CHILD ) {
                    snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
                    }
                else if (message.sensor == LCD2_CHILD){
                    snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
                    }
                } 
            }
            

            In incomingmessage routing add a print statement to show which messages are coming in (see above).

            1 Reply Last reply
            0
            • Marc-Olivier ChaubetM Offline
              Marc-Olivier ChaubetM Offline
              Marc-Olivier Chaubet
              wrote on last edited by
              #31

              Hi,
              I've change this line with "!=" and it work. but i dont undestand why....?

              
              void incomingMessage(const MyMessage &message) {
                  if (message.type!=V_TEXT) {                         // Text messages only
              
              AWIA 1 Reply Last reply
              0
              • Marc-Olivier ChaubetM Marc-Olivier Chaubet

                Hi,
                I've change this line with "!=" and it work. but i dont undestand why....?

                
                void incomingMessage(const MyMessage &message) {
                    if (message.type!=V_TEXT) {                         // Text messages only
                
                AWIA Offline
                AWIA Offline
                AWI
                Hero Member
                wrote on last edited by
                #32

                @Marc-Olivier-Chaubet A closer look at what happens on you seria outputl:
                0_1476200021647_upload-770a6b42-dfb9-43dc-b647-0957e02cc9b8

                • on the first 2 lines there are 2 requests for values from your controller. The "t=47' indicates that the type is V_TEXT.
                • on the the third line you receive a value with payload "test". however the 't=16' indicates that this is a V_TRIPPED value. (see Serial Protocol).

                So there is something completely wrong. What is your controller and does it show the right types of sensors?

                1 Reply Last reply
                0
                • Q Qu3Uk

                  @NiklasO

                  Here is it.

                  // Enable debug prints to serial monitor
                  //#define MY_DEBUG
                  
                  //#define MY_NODE_ID 200
                  #define MY_SENSOR_ID 1
                  
                  // Enable and select radio type attached
                  #define MY_RADIO_NRF24
                  //#define MY_RADIO_RFM69
                  
                  // Enable repeater functionality for this node
                  #define MY_REPEATER_FEATURE
                  
                  // LCD includes
                  #include <Wire.h> 
                  #include <LiquidCrystal_I2C.h>
                  
                  // MYS includes
                  #include <SPI.h>
                  #include <MySensors.h>
                  
                  #define LCD_ON 1  // GPIO value to write to turn on attached relay
                  #define LCD_OFF 0 // GPIO value to write to turn off attached relay
                  
                  LiquidCrystal_I2C lcd(0x3f, 20, 4); //0x3f is the LCD address.
                  String LINE_BLANK = "                    ";
                  
                  void before() {
                  }
                  
                  void setup() {
                    // Set off  LCD module
                    lcd.begin (); 
                    lcd.backlight();
                  
                    lcd.setCursor(0, 0); //
                    lcd.print("Ready!"); // We expect the controller to remove this from display.
                  }
                  
                  void presentation()
                  {
                    // Send the sketch version information to the gateway and Controller
                    sendSketchInfo("LCD Display", "1.0");
                  
                    present(MY_SENSOR_ID, S_INFO);
                  }
                  
                  
                  void loop()
                  {
                    // extra processing if required.
                  }
                  
                  void receive(const MyMessage &message) {
                    // We only expect one type of message from controller. But we better check anyway.
                    if (message.type == V_STATUS) {
                      // Use V_STATUS to turn on/off the LCD display
                      // if supported by LCD.
                    }
                  
                    // temp string, probably don't need this.
                    if (message.type == V_VAR1) {
                      writeScreen(0, message.data);
                    }
                  
                    if (message.type == V_VAR2) {
                      writeScreen(1, message.data);
                    }
                  
                    if (message.type == V_VAR3) {
                      writeScreen(2, message.data);
                    }
                  
                    if (message.type == V_VAR4) {
                      writeScreen(3, message.data);
                    }
                  }
                  
                  void writeScreen(int line, String text)
                  {
                    // Trim whitespace from incoming text.
                    text.trim();
                  
                    // Remove anything over 20 char in text.
                    if(text.length() > 19)
                    {
                        text.remove(20);
                    }
                    
                    // Clear the line
                    lcd.setCursor(0, line);
                    lcd.print(LINE_BLANK);
                  
                    // Set Line
                    lcd.setCursor(0, line);
                    lcd.print(text);
                  }
                  
                  user1306U Offline
                  user1306U Offline
                  user1306
                  wrote on last edited by
                  #33

                  @Qu3Uk

                  thank you very much for sharing your code.
                  sorry this might be simple but i'm not sure how do you send text to the display? How do you update V_VAR1 in domoticz?

                  thanks

                  AWIA 1 Reply Last reply
                  0
                  • NiklasON Offline
                    NiklasON Offline
                    NiklasO
                    wrote on last edited by NiklasO
                    #34

                    This is my test code. Not optimized, just testing. I have just started to play with arduino (got my first ever this month) so I can't say I know what I am doing. ;) Made som changes in the code below, not tested yet. It compiles, guess that's good. ;)

                    I have commented out stuff related to line1 because that is always showing the time and date, in code, from GW/controller. Enable if you want to control all 4 lines from Domoticz.

                    Update display by using the domoticz api:
                    json.htm?type=command&param=udevice&idx=XXXX&nvalue=0&svalue=Banana
                    Replace XXXX with the IDX for each of the 3 lines. You'll see it when adding the 3 text devices in Domoticz. Then use the Event-system in Domoticz to add Lua-script to update the display as example in this thread.

                    //Credits: https://forum.mysensors.org/topic/1957/lcd-clock-and-text-sensor-node-with-new-v_text
                    
                    //Soft signing.
                    //#define MY_SIGNING_SOFT
                    //#define MY_SIGNING_REQUEST_SIGNATURES
                    //#define MY_SIGNING_SOFT_RANDOMSEED_PIN 7
                    
                    #define MY_RADIO_NRF24
                    #define MY_REPEATER_FEATURE
                    #define MY_DEBUG
                    
                    #include <TimeLib.h>
                    #include <Wire.h>
                    #include <LiquidCrystal_I2C.h>
                    #include <SPI.h>
                    #include <MySensors.h>
                    
                    //char lastLCD1[21] = "Line1"; //Line 1 always showing current time
                    char lastLCD2[21] = "Line2";
                    char lastLCD3[21] = "Line3";
                    char lastLCD4[21] = "Line4";
                    
                    //20 whitespace characters used to clear your LCD line before printing to it.
                    //Change to fit your LCD. Don't forget to change number of chars in the writeScreen function if needed.
                    String LINE_BLANK = "                    ";
                    
                    boolean timeReceived = false ;
                    unsigned long lastUpdate = 0, lastRequest = 0, lastDisplay = 0;
                    
                    //const byte LCD1_CHILD = 1;                          // Child ID for LCD line 1
                    const byte LCD2_CHILD = 2;                          // Child ID for LCD line 2
                    const byte LCD3_CHILD = 3;                          // Child ID for LCD line 3
                    const byte LCD4_CHILD = 4;                          // Child ID for LCD line 4
                    
                    MyMessage textMsg(0, V_TEXT);
                    
                    // Initialize display. Google the correct settings for your display.
                    // The follwoing setting should work for the recommended display in the MySensors "shop".
                    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
                    
                    void before() {
                      Wire.begin();                                       // I2C.
                      lcd.begin(20, 4);                                   // LCD with 20 chars, 4 lines.
                      lcd.setBacklight(HIGH);                             // Make sure backlight is on.
                      writeScreen(0, "Waiting for GW...");                // Print initial text before contact with GW.                 
                    }
                    
                    void setup(void)
                    {
                      Serial.begin(115200);                               // Start serial.
                      requestTime();                                      // Request time from controller.
                    }
                    
                    void presentation()  {
                    
                      sendSketchInfo("Domoticz LCD", "1.0");                    // Send the sketch version information to the gateway and Controller
                    
                      //present(LCD1_CHILD, S_INFO, "LCD_line1");
                      //wait(500);
                      present(LCD2_CHILD, S_INFO, "LCD_line2");
                      wait(500);
                      present(LCD3_CHILD, S_INFO, "LCD_line3");
                      wait(500);
                      present(LCD4_CHILD, S_INFO, "LCD_line4");
                      wait(500);
                      //send(textMsg.setSensor(LCD1_CHILD).set("-"));      // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
                      send(textMsg.setSensor(LCD2_CHILD).set("-"));
                      send(textMsg.setSensor(LCD3_CHILD).set("-"));
                      send(textMsg.setSensor(LCD4_CHILD).set("-"));
                    }
                    
                    void loop()     {
                      // timer for loop delays
                      unsigned long now = millis();
                      // If no time has been received yet, request it every 10 second from controller
                      // When time has been received, request update every hour
                      if ((!timeReceived && (now - lastRequest > 10 * 1000)) ||
                          (now - lastRequest > 3600000UL)) {              // request update from GW every hour to keep in sync
                        // Request time from controller.
                        Serial.println("Requesting time...");
                        timeReceived = false;
                        requestTime();
                        lastRequest = now;
                      }
                    
                      // Update sensors every 5 seconds
                      if (now - lastDisplay > 5000) {
                        lastDisplay = now;
                        //request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
                        request(LCD2_CHILD, V_TEXT, 0);                  // request new values from controller
                        request(LCD3_CHILD, V_TEXT, 0);                  // request new values from controller
                        request(LCD4_CHILD, V_TEXT, 0);                  // request new values from controller
                      }
                    
                      // Update LCD time every second
                      if (now - lastUpdate > 1000) {
                        LCD_time();
                        lastUpdate = now;
                      }
                    }
                    
                    // This is called when a message is received
                    void receive(const MyMessage &message) {
                      if (message.type == V_TEXT) {                       // Text messages only
                        Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());     // Write some debug info
                        //if (message.sensor == LCD1_CHILD) {
                        //  writeScreen(0, message.data);
                        //}
                    
                    // Don't forget to change "if" to "else if" when controlling all 4 lines:
                        if (message.sensor == LCD2_CHILD) {
                          writeScreen(1, message.data);
                        }
                        else if (message.sensor == LCD3_CHILD) {
                          writeScreen(2, message.data);
                        }
                        else if (message.sensor == LCD4_CHILD) {
                          writeScreen(3, message.data);
                        }
                      }
                    }
                    
                    void receiveTime(unsigned long ts) {
                      setTime(ts);
                      timeReceived = true;
                    }
                    
                    void LCD_time(void) {
                      lcd.setCursor(0, 0);
                      if (timeReceived) {
                        lcd.print(year());
                        lcd.print("-");
                        printDigits(month());
                        lcd.print("-");
                        printDigits(day());
                        lcd.print("     ");
                        printDigits(hour());
                        lcd.print(":");
                        printDigits(minute());
                      } else {
                        writeScreen(0, "Waiting for time...");
                      }
                    }
                    
                    void printDigits(int digits) {
                    //add leading 0 if digit = 0-9
                      if (digits < 10)
                        lcd.print('0');
                      lcd.print(digits);
                    }
                    
                    void writeScreen(int line, String text)
                    {
                      // Remove anything over 20 char in text.
                      if (text.length() > 19)
                      {
                        text.remove(20);
                      }
                    
                      // Clear the line
                      lcd.setCursor(0, line);
                      lcd.print(LINE_BLANK);
                    
                      // Set Line
                      lcd.setCursor(0, line);
                      lcd.print(text);
                    }
                    
                    1 Reply Last reply
                    1
                    • user1306U user1306

                      @Qu3Uk

                      thank you very much for sharing your code.
                      sorry this might be simple but i'm not sure how do you send text to the display? How do you update V_VAR1 in domoticz?

                      thanks

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

                      @user1306 V_VAR1 in Domoticz can not be updated or changed in Domotics (Blockly/ Lua/ Json, etc.). It's can only be used to store and retrieve values from MySensors. You should use V_TEXT as in the original example.

                      1 Reply Last reply
                      0
                      • user1306U Offline
                        user1306U Offline
                        user1306
                        wrote on last edited by
                        #36

                        thanks guy for the help,
                        what i'm trying to do, is send text to the display (16x2) using both lines (dont really need the time on top), and attach a 4 button keypad on it. then have these buttons sends commands (on.off) to Domoticz which will trigger Event and send that data/text back to the display.
                        if i manage to figure it out i'll post my code.

                        1 Reply Last reply
                        0
                        • AndurilA Offline
                          AndurilA Offline
                          Anduril
                          wrote on last edited by
                          #37

                          Is there a limitation in text length? I plan to use a bigger display and want to maybe send strings with 30+ chars. Is it impossible (maybe then split this into two strings) or is it internally seperated in 2 messages (as nrf-payload is 32 byte - 7 byte MySensors-header)?

                          AWIA 1 Reply Last reply
                          0
                          • AndurilA Anduril

                            Is there a limitation in text length? I plan to use a bigger display and want to maybe send strings with 30+ chars. Is it impossible (maybe then split this into two strings) or is it internally seperated in 2 messages (as nrf-payload is 32 byte - 7 byte MySensors-header)?

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

                            @Anduril The text length is limited to the maximum payload size. So I guess you need to do some tweaking ;)

                            sellierS 1 Reply Last reply
                            0
                            • AWIA AWI

                              @Anduril The text length is limited to the maximum payload size. So I guess you need to do some tweaking ;)

                              sellierS Offline
                              sellierS Offline
                              sellier
                              wrote on last edited by
                              #39

                              Re: LCD Clock and Text sensor node with new V_TEXT
                              Hello ,
                              I have done the same exercise also with the LCD 4*20 and use the same program. It is great.
                              It works but only I have the first line with the date.
                              The lines 2,3,4 are empty.
                              In Domoticz my V_TEXT are created and filled in.
                              It seems that I can not read correctly the information LCD_line2, LCD_line3,LCD_line4
                              0_1510218378199_Screen Shot 2017-11-09 at 9.56.27 AM.png
                              0_1510218403691_Screen Shot 2017-11-09 at 9.55.50 AM.png
                              we can see that on the line READ , the text is V_TEXT but nothing is received.
                              Why ?
                              0_1510218424508_Screen Shot 2017-11-09 at 9.50.27 AM.png

                              Thanks

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


                              9

                              Online

                              11.7k

                              Users

                              11.2k

                              Topics

                              113.0k

                              Posts


                              Copyright 2019 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