Verschiedenes > MySensors

Sketch MAX44009+Measuring

<< < (2/3) > >>

Beta-User:
Nicht nur. Geht auch um power für zwei Sendungen. Ein wait könnte auch helfen.

TomLee:
wenn das wait hier gemeint war (immer noch ohne Kondensator)


--- Code: ---sleep(SLEEP_TIME);
  wait(200);
--- Ende Code ---

dann keine Änderung.

Es bringt mir auch nichts auf dem Gateway zu schauen was dort ankommt, oder ? Was auf dem Gateway ankommt, sieht auch MQTT2_Server ?

Ich bleib ja immer noch bei meiner Vermutung mit MyMessage.

Beta-User:
Also nochmal die Langform:

Senden kostet Energie. Du hast in deinem 2. Sketch zwei Messages drin, die versendet werden, nämlich den Lichtlevel und den Batterie-Level. Das erste ist eine "normale" Message, das andere eine "interne", daher sieht der Sendebefehl anders aus (den Basiscode dazu hattest du ja irgendwo rauskopiert, den Teil habe ich nicht näher geprüft, ist aber z.B. bei heartbeat genauso; was mir aber komisch vorkommt ist der "bool"-Teil in presentation(). Bitte ggf. mal die REferenz raussuchen, wo das her ist (ich verwende keine Batterie-Geräte) und habe damit daher keine Erfahrungen, außer dass es vom Hörensagen her klar ist, dass es geht).

Wenn du den Kondensator bei der ersten Message "leersaugst", ist die Sendeleistung dann ggf. für die zweite zu gering (aus dem ersten Post war zu sehen, dass auch da schon Messages verloren gegangen waren, die Verbindung ist also an sich schon grenzwertig).

Ergo kannst du entweder die beiden Senderoutinen tauschen (dann kommt evtl. nur noch der Batteriewert), oder eben ein wait() einfügen - zwischen den Sendungen. Z.B. so:

--- Code: ---/**
 * connect the sensor as follows :
 *
 *   VCC  >>> 5V
 *   Gnd  >>> Gnd
 *   ADDR >>> NC or GND
 *   SCL  >>> A5
 *   SDA  >>> A4

 */


// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#include <MySensors.h>
#include <MAX44009.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 2
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)

MAX44009 light;

// V_LIGHT_LEVEL should only be used for uncalibrated light level 0-100%.
// If your controller supports the new V_LEVEL variable, use this instead for
// transmitting LUX light level.
MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
// MyMessage msg(CHILD_ID_LIGHT, V_LEVEL);
uint16_t lastlux;

// Battery Measuring
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
// uint32_t SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

void setup()
{
  light.begin();
  // Battery Measuring use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
  analogReference(INTERNAL1V1);
#else
  analogReference(INTERNAL);
#endif
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("LightMaxMeasSensor", "1.0");

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);

  bool sendBatteryLevel(uint8_t level, bool echo);
}

void loop()     
{     
  uint16_t lux = light.get_lux();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msglight.set(lux));
      lastlux = lux;
  }
// Battery Measuring get the battery Voltage
  int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef MY_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

  int batteryPcnt = sensorValue / 10;

#ifdef MY_DEBUG
  float batteryV  = sensorValue * 0.003363075;
  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
    wait(250);
    sendBatteryLevel(batteryPcnt);
    oldBatteryPcnt = batteryPcnt;
  }
  sleep(SLEEP_TIME);
}
--- Ende Code ---

In jedem Fall bitte erst mal GW und Node relativ nahe beieinander lassen.

Die internen Messages scheinen auch etwas weniger "abgesichert" zu werden, was das Versenden (bzw. den bestätigten Empfang) angeht, das ist eher ein anonymer Broadcast.

TomLee:
Arg >:( :'( ;D, sry "noise" um nix.

Wenn ich die DEF der beiden MQTT2_DEVICEs ändere ist doch klar das alle späteren neuen topics wieder in einem neuen Gerät landen, mit der alten CID  ::).

Das mit dem bool Teil hab ich wohl einfach nicht richtig gelesen und zusätzlich noch ein Mix mit Presentation gemacht  ;D.
Das wait braucht man gar nicht batteryPcnt wird auch so übertragen.

heartbeat hab ich jetzt einfach mal in loop rein, jetzt bekomm ich in dem Reading eine aufsteigende Zeit die wieder von vorne beginnt sollte die Node die Verbindung zum Gateway verloren haben, ist das so korrekt ?

So sieht jetzt der Sketch aus:


--- Code: ---// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#include <MySensors.h> 
#include <MAX44009.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 2
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)
MAX44009 light;

MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
uint16_t lastlux;

// Battery Measuring
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
// uint32_t SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

void setup() 
{
  light.begin();
  // Battery Measuring use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
  analogReference(INTERNAL1V1);
#else
  analogReference(INTERNAL);
#endif
}

void presentation()  {
 
  sendSketchInfo("LightMaxMeasSensor", "1.0");
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
 
}

void loop()     
{     
  uint16_t lux = light.get_lux();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msglight.set(lux));
      lastlux = lux;
  }

  int sensorValue = analogRead(BATTERY_SENSE_PIN);
  int batteryPcnt = sensorValue / 10;
 
#ifdef MY_DEBUG
  Serial.println(sensorValue);
  float batteryV  = sensorValue * 0.003363075;
  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
    sendBatteryLevel(batteryPcnt);
    oldBatteryPcnt = batteryPcnt;
  }
  sendHeartbeat();
  sleep(SLEEP_TIME);
}
--- Ende Code ---


--- Code: ---defmod MQTT2_MYSENSORS_MAX44009 MQTT2_DEVICE mysensors_MAX44009
attr MQTT2_MYSENSORS_MAX44009 IODev MQTT2_Server
attr MQTT2_MYSENSORS_MAX44009 readingList mygateway1-out/0/255/0/0/18:.* MYSENSORS_GW_VERSION\
mygateway1-out/2/255/0/0/17:.* MYSENSORS_VERSION\
mygateway1-out/2/255/3/0/6:.* 0_6\
mygateway1-out/2/255/3/0/11:.* SKETCH_NAME\
mygateway1-out/2/255/3/0/12:.* SKETCH_VERSION\
mygateway1-out/2/2/0/0/16:.* 0_16\
mygateway1-out/2/2/1/0/23:.* brightness\
mygateway1-out/2/255/3/0/0:.* battery\
mygateway1-out/2/255/3/0/22:.* heartbeat
attr MQTT2_MYSENSORS_MAX44009 room MQTT2_DEVICE
attr MQTT2_MYSENSORS_MAX44009 stateFormat Helligkeit: brightness lux<br>Batterie: battery %

setstate MQTT2_MYSENSORS_MAX44009 Helligkeit: 100 lux<br>Batterie: 101 %
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 0_16
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:36 0_6 0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:36:45 MYSENSORS_GW_VERSION 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:36 MYSENSORS_VERSION 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 SKETCH_NAME LightMaxMeasSensor
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 SKETCH_VERSION 1.0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:22 battery 101
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:25 brightness 100
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:25 heartbeat 2644
--- Ende Code ---

Das mit der bridgeRegexp seh ich ja ein, beschäftige mich damit. ...irgendwann...

Trotzdem Danke für die Erläuterungen.

Beta-User:
 ;D nevermind...

Mir ging es eher darum abzusichern, dass niemand einen (berechtigten) Grund findet, meine grundsätzliche Aussage in Zweifel zu ziehen, dass MySensors "an sich" einfach ist ::) . (Dass man natürlich trotzdem über viele Details stolpern kann, ist klar, vor allem, wenn man "neue Wege" (im FHEM-Kontext) geht... Was MQTT angeht: kannst gerne den Weg weiter gehen, mußt dich aber eben ziemlich alleine durchkämpfen.)

Das mit der payload von heartbeat ist  interessant, ich habe bisher nur ausgewertet, DASS etwas (zurück-) kommt, mich aber nie dafür interessiert, WAS. Müßte mal im Quellcode nachsehen, würde aber eher vermuten, dass das die uptime in Sekunden ist (hmm, nee, kann eigentlich auch nicht, das Ding schläft ja). Hmm, ein andermal ::) .

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln