LCD Clock and Text sensor node with new V_TEXT
-
@hek @awi
The only thing i can think of at the moment is to have a message amount + sequence. When sequence is out of order throw away the message. and disregard the following messageOr start + termination bytes implemented. This byte could identify being a multi message or a single message. A single message has the termination byte set. A multi message starts with a start byte and the last with the termination byte. Problem is lost messages creates strange texts missing pieces.
Both methods will be able to determine new message because of the "start" byte. But the second proposal would be more error prone because if a message with a start bit is missed it would keep concatenating.
The first proposal seems to be the most logical one. All though it should be limited so it does not cause the node to go oom. And limit it to the V_TEXT type seems logical
I wish i had more time so i could help with it, but then i would pick up the MQTT gateway first (for example for battery level reporting) But we are in the middle of about 20 projects... Honored to be be invited, but time does not permit it.
Or a maybe bit hacky, but i think do-able is instead of putting these start-end bits in the header (to keep it small), sneaky inject them in the V_TEXT. It makes the content payload smaller, but it is multi message which then in the end makes the payload "bigger". All though it would then be possible that the last message only contains a termination byte.
I have been personally been thinking of sending multi text messages with a start and end character to be able to send longer IR codes around.
-
Just one idea that pops up in my head. We will be able to send/update authorized RFID code to an RFID connected to MySensors enabled Arduino?
-
@TheoL I don't see a reason why not. V_TEXT is a generic variable. It will depend mainly on the controllers abilities.
@AWI Thank you for your reply. I have thought about it a bit on my way home from work. When My guests will be leaving again - the weekend after this weekend - I'll start with a simple scene controller for Domoticz. It'll be an easy play ground for the v_text, just an arduino sketch which you and @GizMoCuz already made and some simple bash and lua scripts. Shouldn't take long.
When that works I'll start the proof of concept for sending valid RFID codes over MySensors to an RFID reader node. I ordered an RFID reader yesterday which was really cheap, about 5 dollar. So not sure if it'll work great.
My plan is to use an RFID reader as an replacement for the numeric keypad for turning on/off the alarm. I figured that RFID will be easier to use and remember than a pin code.
In the beginning I will store my valid RFID codes in an file on the filesystem of Domoticz. But maybe in the future I'll create a Node js application with a decent database for that. It's not very wise to store delegate keys like that not encrypted or decoded in a file on a fs.
-
@AWI I'm trying to register the sensor to domoticz. Here's the report in the serial monitor
send: 7-7-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5 send: 7-7-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0 read: 0-0-7 s=255,c=3,t=6,pt=0,l=1,sg=0:M sensor started, id=7, parent=0, distance=1 send: 7-7-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:Domotica Monitor send: 7-7-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0 send: 7-7-0-0 s=0,c=0,t=36,pt=0,l=10,sg=0,st=ok:Databridge send: 7-7-0-0 s=0,c=1,t=47,pt=0,l=1,sg=0,st=ok:- send: 7-7-0-0 s=255,c=3,t=1,pt=0,l=0,sg=0,st=ok:But I can't see the sensor in Domoticz - it's update to the latest stable release. I'm trying to get this to work with a Nokia 5110 LCD display. This sketch will tell me the date/time and outside and inside weather conditions. Did I miss something? Here's the sketch.
/** * Room condition display. * * This sketch is the Prototype Sketch for testing if we can combine a Nokia 5110 LCD display and MySensors. * The goal we're trying to achieve is to use the Nokia 5110 as a display for showing sensor values like: * - the current date and time (if we've some I2C pins left we'll hook up an I2C RTC) * - the current room temperature * - the current room hummidity * - the barometric pressure * - the outside temperature * - etc **/ #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <MySensor.h> // Mysensor network #include <Time.h> #define TEXT_NODE_CHILD_ID 0 #define NODE_ID 7 // use a static nodeID for this sensor. // 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; // Software SPI (slower updates, more flexible pin options): // pin 7 - Serial clock out (SCLK) // pin 6 - Serial data out (DIN) // pin 5 - Data/Command select (D/C) // pin 4 - LCD chip select (CS) // pin 3 - LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); MySensor gw; // Initialize messages for sensor network MyMessage textMsg( 0, V_TEXT ); boolean timeReceived = false ; void setup() { Serial.begin( 115200 ); // initialize 5110 LCD display.begin(); // initialize MySensor communication gw.begin(incomingMessage, NODE_ID); //Send the sensor node sketch version information to the gateway gw.sendSketchInfo("Domotica Monitor", "1.0"); gw.present(TEXT_NODE_CHILD_ID, S_INFO, "Databridge"); gw.send(textMsg.setSensor(TEXT_NODE_CHILD_ID).set("-")); // Initializations gw.requestTime(receiveTime); // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(50); displayDateAndTime(); } void displayDateAndTime() { display.clearDisplay(); // text display tests display.setTextSize(1); // display.setTextColor( WHITE, BLACK ); // 'inverted' text display.setTextColor( BLACK ); // 'inverted' text display.setCursor(0,0); display.println("Zo 20-09-2015"); display.setTextColor( BLACK ); // 'inverted' text display.setTextSize(2); display.setCursor(10,18); display.println("10:43"); display.display(); delay(2000); } void loop() { // do nothing yet } // This is called when a new time value was received void receiveTime(unsigned long controllerTime) { Serial.print("Time value received: "); Serial.println(controllerTime); timeReceived = true; } // This is called when a message is received void incomingMessage(const MyMessage &message) { if (message.type==V_TEXT) { // Write some debug info Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); } } -
@AWI I'm trying to register the sensor to domoticz. Here's the report in the serial monitor
send: 7-7-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5 send: 7-7-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0 read: 0-0-7 s=255,c=3,t=6,pt=0,l=1,sg=0:M sensor started, id=7, parent=0, distance=1 send: 7-7-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:Domotica Monitor send: 7-7-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0 send: 7-7-0-0 s=0,c=0,t=36,pt=0,l=10,sg=0,st=ok:Databridge send: 7-7-0-0 s=0,c=1,t=47,pt=0,l=1,sg=0,st=ok:- send: 7-7-0-0 s=255,c=3,t=1,pt=0,l=0,sg=0,st=ok:But I can't see the sensor in Domoticz - it's update to the latest stable release. I'm trying to get this to work with a Nokia 5110 LCD display. This sketch will tell me the date/time and outside and inside weather conditions. Did I miss something? Here's the sketch.
/** * Room condition display. * * This sketch is the Prototype Sketch for testing if we can combine a Nokia 5110 LCD display and MySensors. * The goal we're trying to achieve is to use the Nokia 5110 as a display for showing sensor values like: * - the current date and time (if we've some I2C pins left we'll hook up an I2C RTC) * - the current room temperature * - the current room hummidity * - the barometric pressure * - the outside temperature * - etc **/ #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <MySensor.h> // Mysensor network #include <Time.h> #define TEXT_NODE_CHILD_ID 0 #define NODE_ID 7 // use a static nodeID for this sensor. // 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; // Software SPI (slower updates, more flexible pin options): // pin 7 - Serial clock out (SCLK) // pin 6 - Serial data out (DIN) // pin 5 - Data/Command select (D/C) // pin 4 - LCD chip select (CS) // pin 3 - LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); MySensor gw; // Initialize messages for sensor network MyMessage textMsg( 0, V_TEXT ); boolean timeReceived = false ; void setup() { Serial.begin( 115200 ); // initialize 5110 LCD display.begin(); // initialize MySensor communication gw.begin(incomingMessage, NODE_ID); //Send the sensor node sketch version information to the gateway gw.sendSketchInfo("Domotica Monitor", "1.0"); gw.present(TEXT_NODE_CHILD_ID, S_INFO, "Databridge"); gw.send(textMsg.setSensor(TEXT_NODE_CHILD_ID).set("-")); // Initializations gw.requestTime(receiveTime); // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(50); displayDateAndTime(); } void displayDateAndTime() { display.clearDisplay(); // text display tests display.setTextSize(1); // display.setTextColor( WHITE, BLACK ); // 'inverted' text display.setTextColor( BLACK ); // 'inverted' text display.setCursor(0,0); display.println("Zo 20-09-2015"); display.setTextColor( BLACK ); // 'inverted' text display.setTextSize(2); display.setCursor(10,18); display.println("10:43"); display.display(); delay(2000); } void loop() { // do nothing yet } // This is called when a new time value was received void receiveTime(unsigned long controllerTime) { Serial.print("Time value received: "); Serial.println(controllerTime); timeReceived = true; } // This is called when a message is received void incomingMessage(const MyMessage &message) { if (message.type==V_TEXT) { // Write some debug info Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); } } -
@TheoL You should use the latest Domoticz beta release. It is a very new (beta) feature. Domoticz can (at the moment) not recognize the S_INFO but will create the sensor when a V_TEXT is sent.
@AWI Thanx for your quick reply. I'm able to add the sensor node to Domoticz. When I use the JSON url I get an Update OK from Domotoicz. But I can't see an incomming message. I added gw.process() to the main loop. Do I need to update the MySensors gateway as well?
-
@AWI Thanx for your quick reply. I'm able to add the sensor node to Domoticz. When I use the JSON url I get an Update OK from Domotoicz. But I can't see an incomming message. I added gw.process() to the main loop. Do I need to update the MySensors gateway as well?
-
I've gotten it to work. But the version of Domoticz I installed was very unstable. It caused the GUI to stall. At the end I had to burn a new installation on a SD card and had to setup everything from scratch. I have no spare Pi at the moment so I have to postpone this project for a while.
It's a pitty 'cause I was really looking forward to this project.
-
this is a great project thank you.
just a quick question is there a way to be able to turn on and off the backlight with text received from domoticz?
for example if i just send "1" then the back light goes on and "0" for off.thanks
@user1306 you can do anything with the text sent but be aware that this would imply you are making your own (non standard MySensors) protocol. V_TEXT is intended only for information.
I am the 'misusing' it myself but only where there is no MySensors solution. -
@user1306 you can do anything with the text sent but be aware that this would imply you are making your own (non standard MySensors) protocol. V_TEXT is intended only for information.
I am the 'misusing' it myself but only where there is no MySensors solution. -
@AWI
thank you for the info, i'm a bit new to arduino and my sensors, so i'm not really sure how to do that.
if possible could you let me know what piece of code i need to be able to do that?thanks
@user1306 This is a part from the routine where I read three values from a V_TEXT value (renamed to V_ORIENTATION) separated by a ";". (I think V_ORIENTATION would be a good addition for MySensors ;-) in addition to V_POSITION but I haven't suggested it officially yet)
Also be aware that Domoticz only sends the V_TEXT after it has been requested. So you need to send a
request(sensor_id, V_TEXT)first .#define V_ORIENTATION V_TEXT // Own (not existing in MySensors protocol) type for orientation (payload = Pitch ; Roll ; Yaw in degrees) #define S_ORIENTATION S_INFO // Yaw = 0 (north)to 360) ; Horizontal = 0 ;if (message.type==V_ORIENTATION) { char payload[12] ; // temporary buffer strcpy(payload, message.getString()); // read and copy payload Yaw = atoi(strtok(payload, ";")); // get variables from payload (; seperated int) Pitch = atoi(strtok(NULL, ";")); Roll = atoi(strtok(NULL, ";")); attachServos(true) ; // power up servo's servoH.write(map(-constrain(Yaw, -90, 90),-90, 90, 0, 180)); // servo middle 90 deg == 0 deg Yaw servoV.write(map(Pitch, -90, 90, 0, 180)); } -
On special request of @pepov attached a piece of LUA script for Domoticz. This demonstrates how to fill V_TEXT devices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more information on this special service.
-- script to read the virtual Weatherstation (Weather Underground) service and send it to "V_TEXT" MySensors devices -- Weather Underground values are in 'WUWeer' and 'WUWind' commandArray = {} ; --Weatherstation data: sWeatherTemp, sWeatherHumidity, sWeatherUV, sWeatherPressure, sWeatherUV2 = otherdevices_svalues['WUWeer']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWeatherTemp = tonumber(sWeatherTemp); sWeatherHumidity = tonumber(sWeatherHumidity); sWeatherUV = tonumber(sWeatherUV); sWeatherPressure = tonumber(sWeatherPressure); sWeatherUV2 = tonumber(sWeatherUV2); -- print to log print("Weather station: Temperature is " .. sWeatherTemp .. " "); print("Weather station: Humidity is " .. sWeatherHumidity .. " "); print("Weather station: UV is " .. sWeatherUV .. " "); print("Weather station: Pressure is " .. sWeatherPressure .. " "); print("Weather station: UV2 is " .. sWeatherUV2 .. " "); ------------------------------------------------------------------------ --Windmeter data: sWindDirectionDegrees, sWindDirection, sWindSpeed, sWindGust, sWindTemperature, sWindFeel = otherdevices_svalues['WUWind']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWindDirectionDegrees = tonumber(sWindDirectionDegrees); sWindDirection = (sWindDirection); sWindSpeed = tonumber(sWindSpeed); sWindGust = tonumber(sWindGust); sWindTemperature = tonumber(sWindTemperature); sWindFeel = tonumber(sWindFeel); print("Windmeter: Winddirection (in degrees) is: " .. sWindDirectionDegrees .. " "); print("Windmeter: Winddirection is: " .. sWindDirection .. " "); print("Windmeter: Windspeed is: " .. sWindSpeed .. " "); print("Windmeter: Windgust is: " .. sWindGust .. " "); print("Windmeter: Windtemperature is: " .. sWindTemperature .. " "); print("Windmeter: Windfeel is: " .. sWindFeel .. " "); -- device numbers 725/ 873 and 872 are V_TEXT commandArray[1] = {['UpdateDevice'] = string.format ("725|0|out %4.1f\01 %2d\07 %4d\02\03 ", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[2] = {['UpdateDevice'] = string.format ("873|0|%2.1f:%3d:%4.1f", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[3] = {['UpdateDevice'] = string.format ("872|0|%3d:%4.1f:%4.1f:%4.1f:%4.1f", sWindDirectionDegrees, sWindSpeed/10 , sWindGust/10, sWindTemperature, sWindFeel)} return commandArray -
On special request of @pepov attached a piece of LUA script for Domoticz. This demonstrates how to fill V_TEXT devices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more information on this special service.
-- script to read the virtual Weatherstation (Weather Underground) service and send it to "V_TEXT" MySensors devices -- Weather Underground values are in 'WUWeer' and 'WUWind' commandArray = {} ; --Weatherstation data: sWeatherTemp, sWeatherHumidity, sWeatherUV, sWeatherPressure, sWeatherUV2 = otherdevices_svalues['WUWeer']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWeatherTemp = tonumber(sWeatherTemp); sWeatherHumidity = tonumber(sWeatherHumidity); sWeatherUV = tonumber(sWeatherUV); sWeatherPressure = tonumber(sWeatherPressure); sWeatherUV2 = tonumber(sWeatherUV2); -- print to log print("Weather station: Temperature is " .. sWeatherTemp .. " "); print("Weather station: Humidity is " .. sWeatherHumidity .. " "); print("Weather station: UV is " .. sWeatherUV .. " "); print("Weather station: Pressure is " .. sWeatherPressure .. " "); print("Weather station: UV2 is " .. sWeatherUV2 .. " "); ------------------------------------------------------------------------ --Windmeter data: sWindDirectionDegrees, sWindDirection, sWindSpeed, sWindGust, sWindTemperature, sWindFeel = otherdevices_svalues['WUWind']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWindDirectionDegrees = tonumber(sWindDirectionDegrees); sWindDirection = (sWindDirection); sWindSpeed = tonumber(sWindSpeed); sWindGust = tonumber(sWindGust); sWindTemperature = tonumber(sWindTemperature); sWindFeel = tonumber(sWindFeel); print("Windmeter: Winddirection (in degrees) is: " .. sWindDirectionDegrees .. " "); print("Windmeter: Winddirection is: " .. sWindDirection .. " "); print("Windmeter: Windspeed is: " .. sWindSpeed .. " "); print("Windmeter: Windgust is: " .. sWindGust .. " "); print("Windmeter: Windtemperature is: " .. sWindTemperature .. " "); print("Windmeter: Windfeel is: " .. sWindFeel .. " "); -- device numbers 725/ 873 and 872 are V_TEXT commandArray[1] = {['UpdateDevice'] = string.format ("725|0|out %4.1f\01 %2d\07 %4d\02\03 ", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[2] = {['UpdateDevice'] = string.format ("873|0|%2.1f:%3d:%4.1f", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[3] = {['UpdateDevice'] = string.format ("872|0|%3d:%4.1f:%4.1f:%4.1f:%4.1f", sWindDirectionDegrees, sWindSpeed/10 , sWindGust/10, sWindTemperature, sWindFeel)} return commandArray@AWI said:
evices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more informati
Wow Thanks AWI!!!!
-
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: -
Does this work with MySensors 2.0? If someone has this running on 2.0, please share the code. :)
-
@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.