Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

Fundgrube - Interessante Sketche und Lösungsansätze

Begonnen von Beta-User, 26 Juli 2017, 14:06:18

Vorheriges Thema - Nächstes Thema

Beta-User

Ziel dieses Threads soll sein, gute Sketche (bzw. manchmal auch nur Lösungsansätze) zu teilen.

Vorab: Einfach mal alle "offiziellen" Beispiele in Ruhe durchzusehen, lohnt sich, da sind m.E. die Grundbausteine für alle möglichen Dinge vorhanden, die Schwierigkeit ist oft nur, diese sinnvoll zu kombinieren. Für einen ersten Einstieg in "kombinierte" Sensoren würde ich den "offiziellen" BMP180-Sketch empfehlen.

Postings hier können einfach nur Links sein, ein kleiner Kommentar wäre aber natürlich willkommen ;) .

Have fun!

Beispiel 1:
Bed Occupancy Sensor
(ist zwar noch 1.5-er Version), aber eine lustige Idee. Man kann daraus vermutlich auch einen Touch-Input mit bis zu 12 Flächen machen.
Es wird gezeigt, wie man interne Logik aufbaut und die erhaltene und verdichtete Info dann an den Controller sendet.

Beispiel 2:
Multi-Button-Relay Sketch
Schönes Beispiel mit Einsatz von Array-Funktionen, um Beschränkungen des Hardware-Designs elegant zu umgehen und dabei code zu sparen.

Beispiel 3:
Kühl- und Gefrierscharanküberwachung
Noch mehr Arrays und eine mögliche Antwort auf die Frage, wie man 1-Wire DS18B20 zuverlässig an eine ChildID binden kann.
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

Beta-User

#1
Doppelgaragentoröffner von SensorMane - einschließlich der Darstellung in FHEMWEB mittel readingsGroup.
Lichtschalter (Taster mit 12V MOSFET), der auch ohne Verbindung zum GW startet und regelmäßig den Status mit dem Controller abgleicht (Aktualisierung nach Verbindungsverlust).
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

Beta-User

#2
(Untested:) Tester-Node für nRF-Chips mit LCD-Anzeige

Es darf ruhig auch jemand anderes sowas hier verlinken, insbesondere, wenn er es selbst getestet hat ;) ).

Ergänzender Hinweis: Lt. Berichten auf der MySensors.org-Seite gibt es bei den Modulen teilweise erhebliche Serienstreuungen. Will heißen: Auch wenn man eine Platine mit mehreren zusammenhängenden nRF-Modulen bekommt, darf man leider nicht davon ausgehen, dass alle gleich gut (oder schlecht) funktionieren  >:( . (Jedenfalls, wenn es keine "Blob"-Module sind, die sind zuverlässig schlecht  ::) ).
Testen macht also tatsächlich Sinn (wenn man Zeit dafür hat oder sie sich nimmt, weil man die nicht in Fehlersuche investieren will).

Edit: Hier gibts was ähnliches für RFM69: Tester-Node
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

Markus.

Hab mal einen SI7021 Sensor Sketch für RFM69 und Batteriemonitor "gebastelt". Naja aus verschiedenen Quellen zusammen geklaut...;-) Eventuell kann's ja einer gebrauchen.


#define MY_DEBUG
#define MY_NODE_ID 104             // <<<<<<<<<<<<<<<<<<<<<<<<<<<   Enter Node_ID
#define MY_RADIO_RFM69
#define MY_RFM69_FREQUENCY RFM69_868MHZ
#define MY_BAUD_RATE 38400

#include <MySensors.h> 
#include <Wire.h>
#include <SI7021.h>
#include <SPI.h>
#include <RunningAverage.h>

//#define DEBUG

#ifdef MY_DEBUG
#define DEBUG_SERIAL(x) Serial.begin(x)
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_SERIAL(x)
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif

#define CHILD_ID_TEMP 0
#define CHILD_ID_HUM 1
#define VOLTAGE_CHILD_ID    3
//#define SLEEP_TIME 5000 // 5s for DEBUG
#define SLEEP_TIME 300000   // 5 min
#define FORCE_TRANSMIT_CYCLE 6  // 5min*12=1/hour, 5min*36=1/3hour
#define HUMI_TRANSMIT_THRESHOLD 3.0  // THRESHOLD tells how much the value should have changed since last time it was transmitted.
#define TEMP_TRANSMIT_THRESHOLD 0.5
#define AVERAGES 2

int measureCount = 0;
float lastTemperature = -100;
int lastHumidity = -100;

RunningAverage raHum(AVERAGES);
SI7021 humiditySensor;

MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
MyMessage msgHum(CHILD_ID_HUM,V_HUM);
MyMessage voltageMsg(VOLTAGE_CHILD_ID, V_VOLTAGE);

int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
float oldBatteryV = 0;

void presentation() 
{
  sendSketchInfo("SI7021-Powermonitor", "1.0 09.11.17");
  present(CHILD_ID_TEMP, S_TEMP);   // Present sensor to controller
  present(CHILD_ID_HUM, S_HUM);
  present(VOLTAGE_CHILD_ID, S_MULTIMETER);
// metric = getControllerConfig().isMetric;
  analogReference(INTERNAL);
}


void setup() {
  DEBUG_SERIAL(38400);    // <<<<<<<<<<<<<<<<<<<<<<<<<< Note BAUD_RATE in MySensors.h
  DEBUG_PRINTLN("Serial started");
  delay(500); // Allow time for radio if power useed as reset
  DEBUG_PRINT("Node and "); DEBUG_PRINTLN("3 children presented.");
   raHum.clear();
 
}

void loop() {

    measureCount ++;
    bool forceTransmit = false;
   
 
  if (measureCount > FORCE_TRANSMIT_CYCLE) {
   forceTransmit = true;
  }
  sendTempHumidityMeasurements(forceTransmit);
/*
  // Read and print internal temp
  float temperature0 = static_cast<float>(static_cast<int>((GetInternalTemp()+0.5) * 10.)) / 10.;
  DEBUG_PRINT("Internal Temp: "); DEBUG_PRINT(temperature0); DEBUG_PRINTLN(" *C");       
*/

sleep(SLEEP_TIME);
}

/*********************************************
* * Sends temperature and humidity from Si7021 sensor
* Parameters
* - force : Forces transmission of a value (even if it's the same as previous measurement)
*********************************************/

void sendTempHumidityMeasurements(bool force) {
  bool tx = force;

  si7021_env data = humiditySensor.getHumidityAndTemperature();
 
  float temperature = data.celsiusHundredths / 100.0;
  DEBUG_PRINT("T: ");DEBUG_PRINTLN(temperature);
  float diffTemp = abs(lastTemperature - temperature);
  DEBUG_PRINT(F("TempDiff :"));DEBUG_PRINTLN(diffTemp);
  if (diffTemp > TEMP_TRANSMIT_THRESHOLD || tx) {
    send(msgTemp.set(temperature,1));
    lastTemperature = temperature;
    measureCount = 0;
    DEBUG_PRINTLN("T sent!");
  }
 
  int humidity = data.humidityPercent;
  DEBUG_PRINT("H: ");DEBUG_PRINTLN(humidity);
  raHum.addValue(humidity);
  humidity = raHum.getAverage();  // MA sample imply reasonable fast sample frequency
  float diffHum = abs(lastHumidity - humidity); 
  DEBUG_PRINT(F("HumDiff  :"));DEBUG_PRINTLN(diffHum);
  if (diffHum > HUMI_TRANSMIT_THRESHOLD || tx) {
    send(msgHum.set(humidity));
    lastHumidity = humidity;
    measureCount = 0;
    DEBUG_PRINTLN("H sent!");
  }

  // get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
Serial.println(sensorValue);
// 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.004106;
int batteryPcnt = sensorValue / 10;
  Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");

// Power up radio after sleep
sendBatteryLevel(batteryPcnt);
send(voltageMsg.set(batteryV,2));
oldBatteryPcnt = batteryPcnt;
oldBatteryV = batteryV;


}






Batteriespannung wird fix alle 5 Minuten übertragen (Sleeping time), Luftfeuchtigkeit und Temperatur wird nach Abhängigkeit der Größe der Änderung des letzten Wertes oder nach einer gewissen Anzahl der Messzyklen gesendet. Glaube als Reading kann man noch die Differenz HUM und TEMP seit der letzten Messung einrichten, hab ich aber nicht gemacht.

Gruß

Markus

Ranseyer

Der Node-Manager sieht auch nicht schlecht aus: https://www.mysensors.org/download/node-manager
Hab ich zwar noch nie genutzt, hört sich aber easy an...

ZitatNodeManager is intended to take care on your behalf of all those common tasks a MySensors node has to accomplish, speeding up the development cycle of your projects.

NodeManager includes the following main components:

Sleep manager: allows managing automatically the complexity behind battery-powered sensors spending most of their time sleeping
Power manager: allows powering on your sensors only while the node is awake
Battery manager: provides common functionalities to read and report the battery level
Remote configuration: allows configuring remotely the node without the need to have physical access to it
Built-in sensors: for the most common sensors, provide embedded code so to allow their configuration with a single line

Features
Manage all the aspects of a sleeping cycle by leveraging smart sleep
Allow configuring the node and any attached sensors remotely
Allow waking up a sleeping node remotely at the end of a sleeping cycle
Allow powering on each connected sensor only while the node is awake to save battery
Report battery level periodically and automatically or on demand
Report signal level periodically and automatically or on demand
Calculate battery level without requiring an additional pin and the resistors
Allow rebooting the board remotely
Provide out-of-the-box sensors personalities and automatically execute their main task at each cycle
Allow collecting and averaging multiple samples, tracking the last value and forcing periodic updates for any sensor
Provide buil-in capabilities to handle interrupt-based sensors
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

Brasletti

Sollte das ganze nicht besser in einen eigenen Bereich? Dann wird das Ganze auch übersichtlich und derjenige, der den Sketch erstellt hat (falls es sich um eine Eigenentwicklung handelt) könnte auch besser Support leisten bzw Fragen dazu beantworten.

Viele Grüße
Armin

Beta-User

Zitat von: Brasletti am 15 Februar 2018, 11:35:04
Sollte das ganze nicht besser in einen eigenen Bereich? Dann wird das Ganze auch übersichtlich und derjenige, der den Sketch erstellt hat (falls es sich um eine Eigenentwicklung handelt) könnte auch besser Support leisten bzw Fragen dazu beantworten.
Na ja, den Thread hier hatte ich in der durchaus eigennützigen Absicht mal begonnen, eine Art "Linkliste" zu haben, die nur einen Überblick darstellt und das Wiederfinden erleichtert. Von daher sollten Diskussionen dazu dann tatsächlich auch nicht hier stattfinden, sondern eben in den verlinkten Threads und Fundstellen. Sollte sich aber tatsächlich zu einem (nur) hier geposteten Sketch oder Lösungsansatz eine Diskussion entwickeln, wäre mein Vorschlag, das dann abzutrennen und hier nur einen Link (ggf. mit kurzer Zusammenfassung) auf die abgetrennte Diskussion zu belassen.

Aber natürlich können wir auch andere konstruktive Vorgehensweisen diskutieren (und ggf. diese Diskussion dann abtrennen ;) ).
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

Beta-User

...dann doch mal wieder was neues: RFID-Leser.

Zwei Sketche, beide für RS485. Wer das mit einem anderen Transceiver kombinieren will, muß dafür sorgen, dass die Initialisierung des SPI-Bus für den Leser durch sein muß, bevor der Transport-Layer initialisiert wird (also in preHwInit() oder before()).

Hier einer für Wiegand-Lesegeräte (Tipp von @bob): https://forum.mysensors.org/topic/5248/rfid-card-reader-wiegand
Und den für MFRC522...
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