pimatic-mysensors controller plugin
-
Hi,
After using OpenHAB for quite some time, I've made the transition to Pimatic.
I've got a pro mini 3V running on 2 AA batteries with a DS18B20-temp-sensor.
I would like to be able to display the battery level but am having some trouble.
I combined the temp and battery sensor into 1, but the battery status isn't being analyzed properly.
When I restart the node it transmits a value of 12 and shortly after that a value of 0.Any ideas how to solve this?
Is this related to pimatic and the format in which it receives battery data or is it simply a fault in my code?Thanks in advance!
This is my code:
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller * http://www.mysensors.org/build/temp */ #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. MySensor gw; float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; int node_id = 12; int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point int oldBatteryPcnt = 0; boolean receivedConfig = false; boolean metric = true; // Initialize temperature message MyMessage msg(0,V_TEMP); void setup() { // Startup up the OneWire library sensors.begin(); // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); // use the 1.1 V internal reference #if defined(__AVR_ATmega2560__) analogReference(INTERNAL1V1); #else analogReference(INTERNAL); #endif // Startup and initialize MySensors library. Set callback for incoming messages. gw.begin(NULL, node_id); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Temperature Sensor met battery", "1.0"); // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { gw.present(i, S_TEMP); } } void loop() { // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef DEBUG Serial.println(sensorValue); #endif // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 float batteryV = sensorValue * 0.003363075; int batteryPcnt = sensorValue / 10; #ifdef DEBUG Serial.print("Battery Voltage: "); Serial.print(batteryV); Serial.println(" V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif if (oldBatteryPcnt != batteryPcnt) { // Power up radio after sleep gw.sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt;} // Process incoming messages (like config from server) gw.process(); // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution()); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) gw.sleep(conversionTime); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature gw.send(msg.setSensor(i).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } gw.sleep(SLEEP_TIME); } -
Hi,
After using OpenHAB for quite some time, I've made the transition to Pimatic.
I've got a pro mini 3V running on 2 AA batteries with a DS18B20-temp-sensor.
I would like to be able to display the battery level but am having some trouble.
I combined the temp and battery sensor into 1, but the battery status isn't being analyzed properly.
When I restart the node it transmits a value of 12 and shortly after that a value of 0.Any ideas how to solve this?
Is this related to pimatic and the format in which it receives battery data or is it simply a fault in my code?Thanks in advance!
This is my code:
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller * http://www.mysensors.org/build/temp */ #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. MySensor gw; float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; int node_id = 12; int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point int oldBatteryPcnt = 0; boolean receivedConfig = false; boolean metric = true; // Initialize temperature message MyMessage msg(0,V_TEMP); void setup() { // Startup up the OneWire library sensors.begin(); // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); // use the 1.1 V internal reference #if defined(__AVR_ATmega2560__) analogReference(INTERNAL1V1); #else analogReference(INTERNAL); #endif // Startup and initialize MySensors library. Set callback for incoming messages. gw.begin(NULL, node_id); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Temperature Sensor met battery", "1.0"); // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { gw.present(i, S_TEMP); } } void loop() { // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef DEBUG Serial.println(sensorValue); #endif // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 float batteryV = sensorValue * 0.003363075; int batteryPcnt = sensorValue / 10; #ifdef DEBUG Serial.print("Battery Voltage: "); Serial.print(batteryV); Serial.println(" V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif if (oldBatteryPcnt != batteryPcnt) { // Power up radio after sleep gw.sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt;} // Process incoming messages (like config from server) gw.process(); // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution()); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) gw.sleep(conversionTime); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature gw.send(msg.setSensor(i).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } gw.sleep(SLEEP_TIME); }@BastienVH . check few things first.
- hardware wiring is correct and as per mysensor guide.
- what debug value "sensorValue" you are seeing on serial console if you debug your sensor node.
- check the debug log in pimatic
-
@BastienVH . check few things first.
- hardware wiring is correct and as per mysensor guide.
- what debug value "sensorValue" you are seeing on serial console if you debug your sensor node.
- check the debug log in pimatic
@Dheeraj
I feel so stupid now... I built this circuit on a breadboard and after fiddling around with it yesterday, I forgot to place the resistor for the battery in the right pin. It was now on a different row.
Saw it and fixed it. Now I get a battery percentage in Pimatic!Thanks for your help!
-
Good point. I had not, now I have. But still, there is absolutely 0 output from this. The only message I see is the "Gateway startup complete" stuff.
@karl261 Do you have any news ?
Which raspberry pi are you using ? PI 2 ?I experienced the same issue with domoticz on raspberry pi2 + serial gateway with RFM69 radio.
I really don't think that the issue is the controller. It seems that the radio is stuck cause when I debug my node after reset, all outgoing messages are marked with st=fail meaning that radios can't reach each other.
I don't know if it's my chinese arduino nano or raspberry pi 2 usb power or my radio module.
Investigation in progress. Something a reboot is not enough, I have to disconnect usb cable in order to make it work again. -
@fets Yes, indeed, I made some progress during the last weeks. Today I finally found a way to display these debug messages. Took me months. See this thread: http://forum.mysensors.org/topic/2392/how-to-properly-debug-serial-gateway-nrf24l01
I think my serial gateway was somehow badly connected. During the past weeks I verified everything, re-soldered, tested various power supplies and radio modules, etc. Now it seems to work usually stable. But not always. Now I am playing around with increasing the sending power of the radio modules.I am using a pi 2.
Interesting, your problem sounds very similar. Unfortunately I do not really have any advice. Maybe try to build a duplicate and see if this works better?
-
@fets Yes, indeed, I made some progress during the last weeks. Today I finally found a way to display these debug messages. Took me months. See this thread: http://forum.mysensors.org/topic/2392/how-to-properly-debug-serial-gateway-nrf24l01
I think my serial gateway was somehow badly connected. During the past weeks I verified everything, re-soldered, tested various power supplies and radio modules, etc. Now it seems to work usually stable. But not always. Now I am playing around with increasing the sending power of the radio modules.I am using a pi 2.
Interesting, your problem sounds very similar. Unfortunately I do not really have any advice. Maybe try to build a duplicate and see if this works better?
-
Hi everyone,
I installed Pimatic and it looks work just fine.
In the Config menu I added the codes below.
Saved and restarted the Pimatic.
I see "Light Unknown%" on the frontpage.
How can I fix that? Thanks....{ "plugin": "mysensors", "driver": "serialport", "protocols": "1.5.1", "startingNodeId": 1, "driverOptions": { "//": "'/dev/ttyUSB0' if using serial Gateway", "serialDevice": "/dev/ttyMySensorsGateway", "baudrate": 115200 } }],
"devices": [
{
"id": "Light",
"name": "Light",
"class": "MySensorsLight",
"nodeid": 15,
"batterySensor": false,
"sensorid": 2
}
], -
Hi everyone,
I installed Pimatic and it looks work just fine.
In the Config menu I added the codes below.
Saved and restarted the Pimatic.
I see "Light Unknown%" on the frontpage.
How can I fix that? Thanks....{ "plugin": "mysensors", "driver": "serialport", "protocols": "1.5.1", "startingNodeId": 1, "driverOptions": { "//": "'/dev/ttyUSB0' if using serial Gateway", "serialDevice": "/dev/ttyMySensorsGateway", "baudrate": 115200 } }],
"devices": [
{
"id": "Light",
"name": "Light",
"class": "MySensorsLight",
"nodeid": 15,
"batterySensor": false,
"sensorid": 2
}
],@fahrettine How does your sketch look? Does pimatic receive anything in de log?
-
Hi,
Thanks for the answer.
1-I installed Pimatic.
2-I installed Serial Gateway on the Arduino Nano.
3-I installed the Light sketch from MySensors on the Nano.Pimatic logs look like below. It seems it doesnt receive any signal.
I think there is someting wrong with the USB port...
Are my USB port settings coreect?
You can see MySensors plugin settings above.2016-04-05 19:23:46info [pimatic]: Listening for HTTP-request on port 80...
19:23:46info [pimatic-mobile-frontend]: rendering html finished
19:23:20info [pimatic-mobile-frontend]: rendering html
19:23:20info [pimatic-mobile-frontend]: packing static assets finished
19:23:18info [pimatic-mobile-frontend]: packing static assets
19:23:18info [pimatic]: New device "Light"...
19:23:08info [pimatic-cron]: the time is: Tue Apr 05 2016 14:23:08 GMT-0200 (GMT+2)
19:23:08info [pimatic]: Loading plugin: "pimatic-mysensors" (0.8.25)
19:23:02info [pimatic]: Loading plugin: "pimatic-mobile-frontend" (0.8.82)
19:22:59 -
@fahrettine said:
{ "plugin": "mysensors", "driver": "serialport", "protocols": "1.5.1", "startingNodeId": 1, "driverOptions": { "//": "'/dev/ttyUSB0' if using serial Gateway", "serialDevice": "/dev/ttyMySensorsGateway", "baudrate": 115200 } }You may want to double check that config.
It should be more like:{ "plugin": "mysensors", "driver": "serialport", "protocols": "1.5.1", "startingNodeId": 1, "driverOptions": { "serialDevice": "/dev/ttyUSB0", "baudrate": 115200 } }if, ttyUSB0 is your connected arduino nano.
-
I plugged the controller and light sensor on my pc.
The controller receives and the sensor transmits signals.
So, the hardware is OK.
I changed the USB setting as "serialDevice": "/dev/ttyUSB0"
But still no signal.
Because I am new on RPi I cant set the USB corectly.
My USB settings (lsusb -t) are like below:
What is my USB port? USB0 or USB1 or other else?pi@raspberrypi:~ $ lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M
|__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
|__ Port 2: Dev 4, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 2: Dev 4, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 3: Dev 5, If 0, Class=Vendor Specific Class, Driver=rtl8192cu, 480M
|__ Port 5: Dev 7, If 0, Class=Vendor Specific Class, Driver=ch341, 12M -
@fahrettine said:
What is my USB port? USB0 or USB1 or other else?
dmesg | grep ttyWill give you an output like:
ch341-uart converter now attached to ttyUSBXX -
Oitzu thank you very much.
I solved the problem.
It was the nodeID. I set the nodeID to on the sketch to 15 and the problem solved.
Thanks for your help... -
Hi everyone,
I installed Pimatic. It works fine...
I installed light sensor code from MySensor: http://www.mysensors.org/build/light
Light sensor works fine...
After that I intalled the Relay code: http://www.mysensors.org/build/relay
The relay doesnt work!!! Any idea for the problem???
When I turn the buton On/Off I can see the sending messages on debug.
Thanks!!!
Below are my Pimatic Config codes and debug messages:{ "id": "Switch", "name": "Switch", "class": "MySensorsSwitch", "nodeid": 10, "sensorid": 1 }
debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;1
21:21:09debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;0
21:21:01debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;1
21:20:56debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;0
21:20:26info [pimatic]: Listening for HTTP-request on port 80...
21:20:26info [pimatic-mobile-frontend]: rendering html finished -
Hi everyone,
I installed Pimatic. It works fine...
I installed light sensor code from MySensor: http://www.mysensors.org/build/light
Light sensor works fine...
After that I intalled the Relay code: http://www.mysensors.org/build/relay
The relay doesnt work!!! Any idea for the problem???
When I turn the buton On/Off I can see the sending messages on debug.
Thanks!!!
Below are my Pimatic Config codes and debug messages:{ "id": "Switch", "name": "Switch", "class": "MySensorsSwitch", "nodeid": 10, "sensorid": 1 }
debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;1
21:21:09debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;0
21:21:01debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;1
21:20:56debug [pimatic-mysensors]: -> Sending 10;1;1;1;2;0
21:20:26info [pimatic]: Listening for HTTP-request on port 80...
21:20:26info [pimatic-mobile-frontend]: rendering html finished@fahrettine said:
check whether you received any message ( serialport output ) on relay sensor node.
-
I've seen the "protocol" line. Is it suitable for 2.0.0beta sketches ?
-
I've seen the "protocol" line. Is it suitable for 2.0.0beta sketches ?
@rollercontainer the plug-in works fine with 2.0. You dont have to change the protocol value in the plug-in.
-
Do you plan to continue to develop this plugin? I will very pleased to see a mysensors button. Thank you!
@ricardot said in pimatic-mysensors controller plugin:
Do you plan to continue to develop this plugin? I will very pleased to see a mysensors button. Thank you!
I second this. And also see if we can lose the dependency on serialport 2.0.6 so that we can use Node.js > 4.9.1