Why are you using a usb to serial adapter to connect the arduino to the raspberry? The raspberry has an onboard uart at /dev/ttyAMA0. I am using the internal uart and cannot reproduce this kind of error.
Jan Gatzke
@Jan Gatzke
Best posts made by Jan Gatzke
-
RE: Serial Gateway connection to Openhab
-
RE: Your workshop :)
I am especially proud of my 20 years old analog soldering station.
-
MySensors controlled heating
I have made a node which measures the temperature using a DS18b20 and controls an electric heating valve (http://www.ebay.de/itm/350991304709?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT) using a MOC3023 optocoupler with triac output (little white chip, works like a solid state relay. Only for small currents, but very cheap). The power supply is the pcb of a usb power supply.
Pictures:
The code is a simple combination of the ds18b20 and the relay actuator examples.
Using openHAB I can set a target temperature. When the temperature is below the target temperature the valve is opened. Else the valve is closed. Since I am using a NC (normally closed) valve, the valve opens when connected to power.
-
RE: [Tutorial] openHAB with serial gateway
Nice tutorial. I discarded my own incoming rules and am now using this solution. I have extended the rule by a few additional sub types:
if (subType == V_LIGHT_LEVEL){ postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg) println ("Light item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " light: " + msg ) } if (subType == V_VOLTAGE){ postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg) println ("Voltage item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " voltage: " + msg ) } if (subType == V_LOCK_STATUS){ var String lockstatus="OPEN" if (msg=="1"){ lockstatus="CLOSED" } postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), lockstatus) println ("Door/Window item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Status: " + lockstatus ) } if (subType == V_TRIPPED){ var String tripped="OFF" if (msg=="1"){ tripped="ON" } postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), tripped) println ("Button/Contact item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Status: " + tripped ) } if (subType == V_LIGHT){ var String light="OFF" if (msg=="1"){ light="ON" } postUpdat(sensorToItemsMap.get( nodeId + ";" + childId + ";"), light) println ("Light item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Light: " + light ) }
-
RE: Newbie - Do not succeed to start
I think the generic board does not work because the default settings are not sufficient for ms. Be sure the settings match your actual esp8266 module.
Did you pull down gpio0 when you powered on the module? This activates the programming mode.
If you want to go the easy way just get a node mcu compatible board like wemos d1 mini. It has an onboard USB port and you don't have to manually put it in programming mode.
Mqtt adds complexity. If you don't need it you should choose plain ms. -
RE: Sketch works on Uno, but not pro mini
This could be a power problem. The UNO has a much better voltage regulator circuit. Did you connect a capacitor to the nrf24?
-
RE: Minding the robot
And how do you know where your wife is and whether she got stuck?
-
RE: Serial Gateway connection to Openhab
@jemish This is to basic to earn an answer. I suggest you start reading at http://www.mysensors.org .
-
RE: Radio FAIL after ~3 weeks [SOLVED]
@Reza
Which NRF Modules do you use? 50 meter with a wall in between wont function properly with the cheap ones. You need something like this for the Job:
Latest posts made by Jan Gatzke
-
RE: New version of the MySensors adapter
@Raig I must confest I have no clue what these custom values are good for and should look like. What kind of values do you expect? Strings? Numbers?
Out of the API description for V_Custom: "Custom messages used for controller/inter node specific commands"
So it seems totally unspecified what commands or data is inside a V_Custom message.
-
RE: π¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway
@gohan won't this option miss some features?
-
RE: π¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway
@gohan I know some controller are aware of ESP Easy via MQTT. If you controller does not support this directly, you have to integrate it manually (with node red). In my opinion scenarios, where MySensors with ESP Easy frontend would be of use, do still exist.
-
RE: π¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway
@dbemowsk You cannot because MQTT is just a transport and not a strict data format. You can however use MySenSors MQTT + ESP Easy MQTT + a broker + node red + a controller. Node Red can do data conversions and integrate everything.
-
RE: π¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway
It's a shame that we cannot have both, mysensors and the ESP Easy stuff. There has been a project for this: https://github.com/letscontrolit/ESPEasyMySensors
-
New version of the MySensors adapter
I have just commited some changes to the iobroker MySensors Adapter on github. All set command are send with ack flag now and the states in iobroker get an ack on successful transmission, too. The new version is not being published via the iobroker admin, yet. You have to download it from github and copy it to your iobroker directory. Please test and report any problems you are facing.
-
RE: π¬ OH MySensors RGBW Controller
The problem with the linear fading was that a value of 100 almost looked the same as 150. So the goal was to make the fading look more linear. The logarythmic calculations needed for this cannot be done on an atmega 328p. (I tried it)
This is why I calculated the values with MS Excel and put them in an array.Making the fading process alway take the same time would be nice. Feel free to post your implementation.
-
RE: π¬ OH MySensors RGBW Controller
I am using Domoticz. This was the only way reading initial values from the controller. Directly requesting the value of a child did not work for me. Meanwhile MySensors support in Domoticz seems extremly bugy and uncomplete to me. I am going to give OpenHAB2 a try.
-
RE: π¬ OH MySensors RGBW Controller
Yes, I did! This sketch is working for me:
/** Based on the MySensors Project: http://www.mysensors.org This sketch controls a (analog)RGBW strip by listening to new color values from a (domoticz) controller and then fading to the new color. Version 1.1 - Added save/restore of values to/from controller, removed non linear fading code Version 1.0 - Changed pins and gw definition Version 0.9 - Oliver Hilsky **/ #define MY_DEBUG #define SN "RGBW 01" #define SV "1.1" #define MY_RADIO_NRF24 #define MY_PARENT_NODE_ID 10 // change the pins to free up the pwm pin for led control #define MY_RF24_CE_PIN 4 //<-- NOTE!!! changed, the default is 9 #define MY_RF24_CS_PIN 10 // default is 10 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW //Uncomment to enable repeater mode //#define MY_REPEATER_FEATURE //Uncomment to assign static node ID //#define MY_NODE_ID 9 // Load mysensors library #include <MySensors.h> // Load Serial Peripheral Interface library #include <SPI.h> // Arduino pin attached to driver pins #define RED_PIN 3 #define WHITE_PIN 9 #define GREEN_PIN 5 #define BLUE_PIN 6 #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3... #define CHILD_ID 1 // Smooth stepping between the values #define STEP 1 #define INTERVAL 10 MyMessage lastvalueMsg(CHILD_ID, V_VAR1); MyMessage lastisonMsg(CHILD_ID, V_VAR2); MyMessage lastdimmMsg(CHILD_ID, V_VAR3); // Stores the current color settings byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN}; byte values[4] = {0, 0, 0, 0}; byte target_values[4] = {0, 0, 0, 0}; //Stores corrected values for each step from 0 to 255. See https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/ byte converted_values[256] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,17,17,17,18,18,19,19,20,20,20,21,21,22,22,23,23,24,24,25,26,26,27,27,28,29,29,30,31,31,32,33,34,34,35,36,37,38,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,54,55,56,57,58,60,61,62,64,65,67,68,70,71,73,75,76,78,80,81,83,85,87,89,91,93,95,97,99,101,104,106,108,111,113,116,118,121,123,126,129,132,135,138,141,144,147,150,154,157,161,164,168,171,175,179,183,187,191,195,200,204,209,213,218,223,228,233,238,243,249,255}; // stores dimming level byte dimming = 100; byte target_dimming = 100; // tracks if the strip should be on of off boolean isOn = false; // tracks if the strip's last status was off. This overrides isOn at startup boolean wasOff = true; //tracks if the old values have bben requested from the controller. This prevents the request from being send multipΓle times in the main loop. boolean valuesrequested = false; // time tracking for updates unsigned long lastupdate = millis(); void setup() { // Set all channels to output (pin number, type) for (int i = 0; i < NUM_CHANNELS; i++) { pinMode(channels[i], OUTPUT); } // debug if (isOn) { Serial.println("RGBW is running..."); } } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo(SN, SV); // Register this device as Waterflow sensor present(CHILD_ID, S_RGBW_LIGHT, SN, true); } void loop() { if (!valuesrequested) { // get old values if this is just a restart Serial.println("Requesting old values..."); //Request RGBW values request( CHILD_ID, V_VAR1 ); wait(200); //Request Status request( CHILD_ID, V_VAR2 ); wait(200); //Request dimm level request( CHILD_ID, V_VAR3 ); valuesrequested = true; } // set the new light colors if (millis() > lastupdate + INTERVAL) { updateLights(); lastupdate = millis(); } } // callback function for incoming messages void receive(const MyMessage &message) { Serial.print("Got a message - "); Serial.print("Messagetype is: "); Serial.println(message.type); // acknoledgment if (message.isAck()) { Serial.println("Got ack from gateway"); } // new dim level else if (message.type == V_DIMMER or message.type == V_VAR3) { Serial.println("Dimming to "); Serial.println(message.getString()); target_dimming = message.getByte(); send(lastdimmMsg.set(target_dimming)); if (!wasOff) { // a new dimmer value also means on, no seperate signal gets send (by domoticz) isOn = true; send(lastisonMsg.set(isOn)); } } // on / off message else if (message.type == V_STATUS or message.type == V_VAR2) { Serial.print("Turning light "); isOn = message.getInt(); if (isOn) { Serial.println("on"); wasOff = false; } else { Serial.println("off"); } send(lastisonMsg.set(isOn)); } // new color value else if (message.type == V_RGBW or message.type == V_VAR1) { const char * rgbvalues = message.getString(); send(lastvalueMsg.set(rgbvalues)); inputToRGBW(rgbvalues); if (!wasOff) { // a new color also means on, no seperate signal gets send (by domoticz); needed e.g. for groups isOn = true; send(lastisonMsg.set(isOn)); } } } // this gets called every INTERVAL milliseconds and updates the current pwm levels for all colors void updateLights() { int convertedvalue=0; // update pin values -debug //Serial.println(greenval); //Serial.println(redval); //Serial.println(blueval); //Serial.println(whiteval); //Serial.println(target_greenval); //Serial.println(target_redval); //Serial.println(target_blueval); //Serial.println(target_whiteval); //Serial.println("+++++++++++++++"); // for each color for (int v = 0; v < NUM_CHANNELS; v++) { if (values[v] < target_values[v]) { values[v] += STEP; if (values[v] > target_values[v]) { values[v] = target_values[v]; } } if (values[v] > target_values[v]) { values[v] -= STEP; if (values[v] < target_values[v]) { values[v] = target_values[v]; } } } // dimming if (dimming < target_dimming) { dimming += STEP; if (dimming > target_dimming) { dimming = target_dimming; } } if (dimming > target_dimming) { dimming -= STEP; if (dimming < target_dimming) { dimming = target_dimming; } } /* // debug - new values Serial.println(greenval); Serial.println(redval); Serial.println(blueval); Serial.println(whiteval); Serial.println(target_greenval); Serial.println(target_redval); Serial.println(target_blueval); Serial.println(target_whiteval); Serial.println("+++++++++++++++"); */ // set actual pin values for (int i = 0; i < NUM_CHANNELS; i++) { if (isOn) { // normal fading //analogWrite(channels[i], dimming / 100.0 * values[i]); //Fading with corrected values see https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/ analogWrite(channels[i], dimming / 100.0 * converted_values[values[i]]); } else { analogWrite(channels[i], 0); } } } // converts incoming color string to actual (int) values // ATTENTION this currently does nearly no checks, so the format needs to be exactly like domoticz sends the strings void inputToRGBW(const char * input) { Serial.print("Got color value of length: "); Serial.println(strlen(input)); if (strlen(input) == 6) { Serial.println("new rgb value"); target_values[0] = fromhex (& input [0]); target_values[1] = fromhex (& input [2]); target_values[2] = fromhex (& input [4]); target_values[3] = 0; } else if (strlen(input) == 9) { Serial.println("new rgbw value"); target_values[0] = fromhex (& input [1]); // ignore # as first sign target_values[1] = fromhex (& input [3]); target_values[2] = fromhex (& input [5]); target_values[3] = fromhex (& input [7]); } else { Serial.println("Wrong length of input"); } Serial.print("New color values: "); Serial.println(input); for (int i = 0; i < NUM_CHANNELS; i++) { Serial.print(target_values[i]); Serial.print(", "); } Serial.println(""); Serial.print("Dimming: "); Serial.println(dimming); } // converts hex char to byte byte fromhex (const char * str) { char c = str [0] - '0'; if (c > 9) c -= 7; int result = c; c = str [1] - '0'; if (c > 9) c -= 7; return (result << 4) | c; }