Mehrere Sensoren mit einer node

Begonnen von The-Holgi, 05 Januar 2019, 18:45:49

Vorheriges Thema - Nächstes Thema

The-Holgi

Hallo,
versuche gerade aus den beiden Beispiel-scatchen SI7021 und LightSensor einen scatch zu basteln.
So siehts bisher aus:


// Enable debug prints
#define MY_DEBUG

// Enable REPORT_BATTERY_LEVEL to measure battery level and send changes to gateway
//#define REPORT_BATTERY_LEVEL

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
//#define MY_RS485

#include <MySensors.h> 

#define CHILD_ID_HUM  0
#define CHILD_ID_TEMP 1
#define CHILD_ID_LIGHT 2
#define LIGHT_SENSOR_ANALOG_PIN 0

static bool metric = true;

// Sleep time between sensor updates (in milliseconds)
static const uint64_t UPDATE_INTERVAL = 60000;


int lastLightLevel;

#include <SI7021.h>
static SI7021 sensor;

#ifdef REPORT_BATTERY_LEVEL
#include <Vcc.h>
static uint8_t oldBatteryPcnt = 200;  // Initialize to 200 to assure first time value will be sent.
const float VccMin        = 1.8;      // Minimum expected Vcc level, in Volts: Brownout at 1.8V    -> 0%
const float VccMax        = 2.0*1.6;  // Maximum expected Vcc level, in Volts: 2xAA fresh Alkaline -> 100%
const float VccCorrection = 1.0;      // Measured Vcc by multimeter divided by reported Vcc
static Vcc vcc(VccCorrection);
#endif

void presentation() 
{
  // Send the sketch info to the gateway
  sendSketchInfo("TemperatureAndHumidity", "1.0");

  // Present sensors as children to gateway
  present(CHILD_ID_HUM, S_HUM,   "Humidity");
  present(CHILD_ID_TEMP, S_TEMP, "Temperature");
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);

  metric = getControllerConfig().isMetric;
}

void setup()
{
  while (not sensor.begin())
  {
    Serial.println(F("Sensor not detected!"));
    delay(5000);
  }
}


void loop()     

  // Read temperature & humidity from sensor.
  const float temperature = float( metric ? sensor.getCelsiusHundredths() : sensor.getFahrenheitHundredths() ) / 100.0;
  const float humidity    = float( sensor.getHumidityBasisPoints() ) / 100.0;

#ifdef MY_DEBUG
  Serial.print(F("Temp "));
  Serial.print(temperature);
  Serial.print(metric ? 'C' : 'F');
  Serial.print(F("\tHum "));
  Serial.println(humidity);
#endif

  static MyMessage msgHum( CHILD_ID_HUM,  V_HUM );
  static MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
  static MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);

  send(msgTemp.set(temperature, 2));
  send(msgHum.set(humidity, 2));
  send(msg.set(lastLightLevel, 2));
#ifdef REPORT_BATTERY_LEVEL
  const uint8_t batteryPcnt = static_cast<uint8_t>(0.5 + vcc.Read_Perc(VccMin, VccMax));

#ifdef MY_DEBUG
  Serial.print(F("Vbat "));
  Serial.print(vcc.Read_Volts());
  Serial.print(F("\tPerc "));
  Serial.println(batteryPcnt);
#endif

  // Battery readout should only go down. So report only when new value is smaller than previous one.
  if ( batteryPcnt < oldBatteryPcnt )
  {
      sendBatteryLevel(batteryPcnt);
      oldBatteryPcnt = batteryPcnt;
  }
#endif

{
  int16_t lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
  Serial.println(lightLevel);
  if (lightLevel != lastLightLevel) {
    send(msg.set(lightLevel));
    lastLightLevel = lightLevel;
  }

  // Sleep until next update to save energy
  sleep(UPDATE_INTERVAL);
}
}


Vielleicht kann sich mal jemand den code ansehen.
Flashen konnte ich das ganze testen wegen "noch" fehlenden Sensoren jedoch nicht.

Gruß Holger
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Beta-User

ZitatVielleicht kann sich mal jemand den code ansehen.
Flashen konnte ich das ganze testen wegen "noch" fehlenden Sensoren jedoch nicht.
Sowas solltest du vermeiden, erwünscht sind konkrete Fragen bei Problemen. Siehe dazu im Anfängerbereich die angepinnten Beiträge, da gibt es einen Link auf "Wie stelle ich gute Fragen?".
Weiter gehört die Sketcherei gehört eigentlich nach MySensors.org - es ist nicht das Ziel, hier ein 2. Forum dazu zu haben; das ist im Notfall ok, aber bitte nicht "präventiv".

Auf die Schnelle würde ich aber trotzdem anmerken, dass die erste der Licht-Sendeanweisungen ("send(msg.set(lastLightLevel, 2));" vor "#ifdef REPORT_BATTERY_LEVEL") vermutlich zu Irritationen führen wird, weil erst der alte und später dann der neue Wert gesendet werden...


Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

The-Holgi

Ok, dachte nur das hier vielleicht jemand langeweile hat  ;)

Gruß Holger
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Dondolo

Hi,

habe zwar keine Langeweile, konnte aber eine ähnliche Konfiguration herstellen.

node (nano) mit nrf24L01+ mit Si7021 und BH1750
ESP8266 als Wlan gateway
Rasberry mit Fhem 5.9

Mit Hilfe aus dem Forum kann ich jetzt alle Sensorwerte in Fhem sehen.

Als Ergänzung würde ich noch im Arduino Sketch folgendes mit aufnehmen::


#define MY_NODE_ID 2    // ID natürlich wählbar


The-Holgi

Hallo Dondoloo,
wie sieht denn dein sketch aus?

Gruß Holger
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

Beta-User

Ähm, Frage: gibt es hier noch was zu diskutieren?

Wenn nein, bitte mal ein [gelöst] vor den Thread-Titel...

@Dondolo:
Ob man eine NodeID vergeben will oder FHEM das machen soll/darf, ist eine pers. Entscheidung, muß jeder selbst wissen (mal abgesehen von RS485, da muß man das (einmalig) tun):
https://wiki.fhem.de/wiki/MySensors_Starter_Guide#Vergabe_der_NodeID

Vielleicht magst du dir den ganzen Artikel mal ansehen, da steht (an anderer Stelle) auch, wo das define hin muß ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Dondolo

...klar gibt doch immer was zu diskutieren vielleicht auch ein Erfahrungsaustausch.

Bin noch im Urlaub kann nächste Woche den Sketch einstellen.

Die Festlegung der NodeId hatte ich als Tipp/Hinweis übernommen. Funktioniert allerdings sehr gut und als Anfänger konnte ich damit die Devise Einstellungen verstehen.

Dank für den Link.