Mysensors Batteriebetriebener Fenstersensor

Begonnen von Niko1987, 23 März 2016, 15:10:54

Vorheriges Thema - Nächstes Thema

Niko1987

Hallo zusammen,

habe heute mal 3 Batteriebetriebene Fenstersensoren (Reedkontakte) mit Batteriestatus gebastelt.

Verwendet hab ich dafür einen

Arduino Pro mini 328  8mhz 5v
1M Widerstand zwischen D3 und VCC
Reedkontakt D3 und GND
Batteriegehäuse
NRF24L01+
4,7 uF Konensator am NRF24L01+ zw. GND und VCC

Die Power LED hab ich weggezwickt und vom 3,3 Volt Power Regulator hab ich den V out Pin abgezwickt,
da der Sensor sowie nur die 3V von den 2 AA Batterien bekommt.
(Achtung beim Hochladen des Sketches darf der NRF24L01+ noch nicht angeschlossen sein da die 5V vom USB Port des Teil killen würden. Ausser Ihr habt einen 3,3V Pro mini)
Somit braucht der Sensor im Sleepmodus 0,02 mAh und hält therotisch einige Jahre.

Der Sensor schläft eigentlich immer und wird ein mal am Tag aufgeweckt um den  Batteriestatus an den Gateway zu senden.
Und natürlich bei Statusänderung des Reedkontakts.


define FFlurOG MYSENSORS_DEVICE 124
attr FFlurOG IODev gateway
attr FFlurOG alias Flur.OG
attr FFlurOG devStateIcon .*off:fts_window_1w@green .*on:fts_window_1w_open@red
attr FFlurOG group Fenster
attr FFlurOG icon fts_window_1w
attr FFlurOG mapReading_armed3 3 armed
attr FFlurOG mapReading_tripped3 3 tripped
attr FFlurOG mode node
attr FFlurOG room Flur
attr FFlurOG stateFormat tripped3
attr FFlurOG version 1.4.2
[/size]

Vielleicht hat jemand Lust das nachzubasteln.

Sketch kann ich bei Interesse gern mit einstellen.

Gruß
Flo

fh555

#1
Hallo Niko1987,

ich habe auch mehrere MySensors Fensterkontakte seit Mitte vorigen Jahres im Einsatz.
So einfach wie Du dir das vorstellst ist das eigentlich nicht.
Ich habe mir da auch schon den Kopf zerbrochen und die wahrscheinliche Batterielebensdauer ausgerechnet.

Den Widerstand brauchst Du eigentlich nicht, da du ja die internen "Pullup"'s nehmen kannst.
Ich gehe mal davon aus, dass du den Arduino schlafen legst und ihn per Interrupt wieder weckst, sonst wäre er ja immer wach!

Bei der Berechnung der Batterielaufzeit, darfst du nicht von 0V - 3,3V ausgehen, sondern nur die minimalste Spannung von der Komponente nehmen, welche diese benötigt. Des weiteren sendet dein Arduino auch (wenn auch nur kurzzeitig).

Der NRF braucht glaube ich als minimale VCC 1,9V, der ATmega328P mit 0-10Mhz ist "stable" mit VCC min = 2,7V angegeben, also bleibt Dir nur für die Berechnung der Batterie von 2,7V = 0% und 3,3V =100% (wenn deine 2 Batterien 3,3V haben sollte).
Das heißt, Du hast nur 0,6V von 0-100, wo dein System lt. Datenblätter stabil läuft.

Weiterhin hast du eine höhere Stromaufnahme (denke ich), wenn der Schalter entweder geschlossen oder offen ist (Stromfluß durch den Pullup) auch wenn der Arduino dann nicht sendet.

Also jetzt mal rein theoretisch :-)
er schläft (du sagst) = 0,020 mA
der andere Schaltzustand (Verbrauch so lange bis Erstzstand wieder erreicht ist) = ich denke * Faktor 10 = 0,200 mA
der Arduino ist wach und macht was = 4 mA
das NRF-Modul sendet = ca. 20mA

Dann errechnest du den Durchschnittsverbauch, nimmst deine Batteriekapazität oder besser ein Datenblatt und schaust bei wieviel mA Entnahme + Selbstentladung, die Spannung noch bei 1,35V pro Zelle vorhanden ist.

Wie schon gesagt, ich habe mir da auch wirklich den Kopf zerbrochen, wie ich das mache und das es noch so "klein" wird, dass ich es in ein Gehäuse über die Fenster montieren kann.

Gruß Jens

Niko1987

Hallo Jens,

Ich habe das ganze mal mit verbrauchten Batterien versucht. Der Sensor hat bei 20% noch top gearbeitet.
Mir geht es auch garnicht darum, so selten wie möglich die Batterien zu tauschen sondern einfach darum einen groben Wert zu haben.
Wenn die Batterien ein Jahr durchhalten bin ich happy.

Wenn einem das Smart Home Fiber mal gekackt hat geht es sowieso in die tausende Euro. Da sind mir 60 Cent für die Batterien egal.


Ich freue mich natürlich auch über konstruktive Kritik.

hier mal der  Sketch.

#include <avr/sleep.h>    // Sleep Modes
#include <MySensor.h>
#include <SPI.h>


#define CHILD_ID 3
#define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
MySensor gw;

#define INTERRUPT_SENSOR  1 // Interrupt 1 is on DIGITAL PIN 3!
#define BATTERY_SENSE_PIN 
#define SLEEP_IN_MS 86400000 // 1 day

byte val;
int oldBatLevel;

// Change to V_LIGHT if you use S_LIGHT in presentation below
MyMessage msg(CHILD_ID,V_TRIPPED);

void setup()
{
  gw.begin();

  pinMode(BUTTON_PIN,INPUT);
  digitalWrite (BUTTON_PIN, LOW);   

  pinMode(2,INPUT);
  digitalWrite (2, LOW);

  pinMode(4,INPUT);
  digitalWrite (4, LOW);

  pinMode(5,INPUT);
  digitalWrite (5, LOW);

  pinMode(6,INPUT);
  digitalWrite (6, LOW);

  pinMode(7,INPUT);
  digitalWrite (7, LOW);

  pinMode(8,INPUT);
  digitalWrite (8, LOW);

  gw.present(CHILD_ID, S_DOOR);

  val = digitalRead(BUTTON_PIN);
  oldBatLevel = -1; 
 
  sendValue();
}

void loop ()
{   
  gw.sleep(INTERRUPT_SENSOR, CHANGE, SLEEP_IN_MS);
  val = digitalRead(BUTTON_PIN);

  sendValue();

  gw.sleep(200);
}  // end of loop

void sendValue()
{
  gw.powerUp(); 
  gw.send(msg.set(val==HIGH ? 1 : 0));

  gw.powerDown(); 

  int batLevel = getBatteryLevel();
  if (oldBatLevel != batLevel)
  {
    gw.powerUp(); 
    gw.sendBatteryLevel(batLevel);   
    oldBatLevel = batLevel;
  }
}

// Battery measure
int getBatteryLevel ()
{
  int results = (readVcc() - 2000)  / 10;   

  if (results > 100)
    results = 100;
  if (results < 0)
    results = 0;
  return results;
} // end of getBandgap

// when ADC completed, take an interrupt
EMPTY_INTERRUPT (ADC_vect);

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  noInterrupts ();
  // start the conversion
  ADCSRA |= _BV (ADSC) | _BV (ADIE);
  set_sleep_mode (SLEEP_MODE_ADC);    // sleep during sample
  interrupts ();
  sleep_mode ();
  // reading should be done, but better make sure
  // maybe the timer interrupt fired
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV

  return result;
}

Gruß
Flo

MadMax-FHEM

Hallo,

klingt sehr interessant!!

Dank diesem Thread bin ich (nochmals) auf MySensors aufmerksam geworden...

Hatte bislang versucht mit dem ESP8266 einen Füllstandssensor (Tank auf dem Balkon für's autom. Blumengießen per Blumat) umzusetzen.

War zu Beginn total begeistert, da dieser WLAN kann und ich WLAN halt einfach zur Verfügung hab... ;-)
...und einbinden in FHEM total easy (GET /fhem?cmd=setreading...)

Leider musste ich fesstellen, dass das mit Batterien praktisch unmöglich ist, da der ESP deutlich gute 500mA verbrät wenn er wach ist...

Aktuell habe ich einen ESP mit Temp/Hum-Sensor an einer Powerbank laufen, wecke ihn alle 3min für ca. 6-8sek auf und komme kaum über einen Monat.

Mein gewünschter Aufbau mit Ultraschall an Batterien (2xAA) schafft auch nicht mehr, weil bei ca. 2.7V der Batterien der notwendige StepUp den Strom den der ESP beim "Booten" bzw. Verbinden zieht nicht schafft.
Auch Kondensatoren etc. helfen da nicht :-|
Und der wacht nur alle 10min auf...

Äh, sorry für's Abschweifen! ;-)

Jetzt hoffe ich, dass ich auf Basis von MySensors weiter komme.

Ich würde gerne alle (halbe) Stunde den Füllstand senden...

Werde das mal demnächst (wenn die Funkmodule da sind) aufbauen und testen...

Hoffentlich mit Erfolg!!

Euch weiterhin viel Spaß/Erfolg!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

fh555

Hallo Joachim,

der Stromverbrauch von MySensors ist schon wirklich gut.
Ich habe auch schon einige Sachen damit umgesetzt und ich war DER, welcher hier im Forum die Integration losgetreten hat.

Vielen Dank, an all die Entwickler, welche das ermöglicht haben  ;D

Du kannst ja auch im MySensors Netzwerk einige Sensoren als Repeater nutzen, wenn sie mit Netzteil betrieben werden, ansonsten einfach einen Repeater als Stand-Alone konfigurieren.

Wenn du Ideen brauchst oder Fragen hast, kannst du gerne auf mich zukommen.

--------------------------------------------------------------------------------------------------------

Hallo Floh,
ich versuche mir mal deinen Sketch morgen genauer anzuschauen.

Naja es geht ja nicht nur um das Geld der Batterien  ;) bei mir sind die Sensoren in Gehäuse eingebaut (also halbwegs schick verpackt) und verrichten brav ihre Arbeit Autag. Ein Batteriewechsel ist da schon mit ein wenig Arbeit verbunden ... und solange sie durchhalten um so besser für mich.

Gruß Jens



MadMax-FHEM

Hallo Jens,

dann: vielen DANK!!!

Ich kann's kaum erwarten meine Funkmodule zu bekommen und los zu legen!

Langsam wird's Frühling und ich will den Tank wieder in Betrieb nehmen...
...und diesmal mit Füllstandsmesser! :-)

Dann schon mal vielen Dank für die angebotene Hilfe!
(hoffe nicht, dass ich sie brauche aber man weiß ja nie ;-)  )

Bis denn, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

gnimpf

Hallo
ich bekomme den Sensor nicht im Fhem dazu ein anderen Endfänger zu schalten
ich habe die anzeige tripped3 on oder tripped3 off
aber ich bekomme es nicht hin das M_Test sich an und aus schalten zu lassen

bis denn Carsten

Niko1987

Servus Gnimpf,

du kannst es über notify oder über doif machen.

Hier mal ein Notify:
define MotionOn notify NameDeinesSensors:tripped3:.*on set M_Test on
define MotionOff notify NameDeinesSensors:tripped3:.*off set M_Test off

Besser wär natürlich ein Doif:
define MotionDoif doif ([NameDeinesSensors:tripped3] eq "on") (set  M_Test on) DOELSE (set  M_Test off)

Die Codes sind ungetestet ;)

Meld dich wenns nicht klappt.

Gruß
Flo

gnimpf

Hallo Flo

Es hat nicht geklappt.

habe von my sensor das Relais , Den Regensensor und den Temperaturfühler gebaut alles funktionier
aber den Schalter bekomme ich nicht hin.

vielleicht hast du noch eine Idee

Gruß

Carsten

Beta-User

Zitat von: gnimpf am 25 August 2019, 15:01:20
Es hat nicht geklappt.
Zum einen:
Der Hinweis, dass soundsolange in einem Thread nix passiert ist, hat einen Zweck, man sollte ihn nicht einfach ignorieren...

Zum anderen:
wie soll man aus deinen Angaben rausfinden, was "der Stand der Dinge" ist?
"Funktioniert nicht", ist keine Fehlerbeschreibung, siehe angepinnten Beitrag im Anfängerbereich ("Vor dem Posten beachten..." osä).

Bitte also lists oder (für MySensors m.E. besser) RAW-Definitionen liefern und beschreiben, was eigentlich gewollt ist und wo (vermeintlich) das Problem liegt...

Das notify (falls der Sensor dazu genutzt werden soll, ein Licht einzuschalten), sollte m.E. auch etwas anders aussehen (da wäre ggf. die Nutzung des Event-Monitors eine gute Idee ;) ):
define MotionOnOff notify NameDeinesSensors.tripped3:.(on|off) set M_Test $EVENT
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