Archiv der Kategorie: IT

Informationstechnologie, IT, EDV, Web, Netzwerktechnik, IP, Blog, CMS, SEO

Linux-NAS Erfahrungen mit OSS

Da mein altes NAS keinen Support mehr vom Hersteller bekommt, musste ich mich nach einer neuen Lösung umsehen. Anforderung ist OpenSource, ZFS, Backupmmöglichkeiten, Verschlüsselung und geringer Energieverbrauch. ZFS ist angeblich leistungsfähiger als BTRFS. Meine Erfahrungen damit könnt ihr hier nachlesen

Hardware

Zum Einsatz kommt die Empfehlung von http://www.technikaffe.de/anleitung-178-eigenbau_nas_anleitungen_fuer_4_bis_16_festplatten_auf_einen_blick mit dem NAS 3.0 Apollo Lake mit 4 x SATA

Software

Nas4Free:

Die Testinstallation viel trotz der ansprechenden Oberfläche letztendlich wegen Unübersichtlichkeit durch.

Freenas:

Ich testete die beiden aktuellen Versionen 9 und 11. Version 9 erzeugte grundsätzlich eine unauffällige Last wohin gegen die 11er eine Grundlast von über 1 anzeigte. Ich testete dann weiter mit der 9er Version. Leider habe ich nichts über die Supportzeit gefunden. Bei diesem System funktionierte leider nicht richtig die  Energiesparmodi der Platten. ZFS wird standardmäßig mit Verschlüsselungsmöglichkeit vorgesehen. Ein Backup kann man per Remote oder auch lokal mit Snapshots erstellen. Leider ist keine Mini-DLNA-Server einfach installierbar.

Openmediavault 3

Hier funktioniert fast alles ohne Probleme: Energiemanagement, ZFS, Backup über Rsnapshot. Einziges Manko ist, das die Verschlüsselung für ZFS nicht korrekt arbeitet, da LUKS manuell bei jedem Neustart entsperrt werden muss und dadurch alle folgenden Stufen (Freigaben, SAMBA) Probleme haben. Das lässt sich allerdings manuell heilen. Energieverbrauch liegt bei abgeschalteten Platten bei 12 Watt. In Betrieb sind es dann so zwischen 20 und kurzzeitig 30 Watt. Ich habe Hoffnung, dass die Verschlüsselung bald ordentlich implementiert wird.

ENGLISH

Because my old NAS gets no more support of the manufacturer, I had to look around after a new solution. Requirement is OpenSource, ZFS, Backupmmöglichkeiten, encoding and low energy consumption. ZFS is supposedly more efficient than BTRFS. With it you can read up my experiences here

Hardware

For the application comes the recommendation from http://www.technikaffe.de/anleitung-178-eigenbau_nas_anleitungen_fuer_4_bis_16_festplatten_auf_einen_blick with the NAS 3.0 Apollo Lake with 4 x SATA

Software

Nas4Free:

The test installation a lot in spite of the attractive surface at last because of vagueness by.

Freenas:

I tested both current versions 9th and 11th version 9 an unobtrusive load where against the 11th generated basically a basic load from more than 1 registered. Then I further tested with the 9th version. Unfortunately, I have found nothing for the support time. Unfortunately, with this system did not function properly the energy savings modes of the records. ZFS is planned by default with encoding possibility. One can provide a backup by Remote or also locally with Snapshots. Unfortunately, it is simply installable no Mini DLNA servers.

Openmediavault 3

Here almost everything functions without problems: Energy management, ZFS, backup about Rsnapshot. The only deficiency is which does not work the encoding for ZFS correctly, because of HATCH must be unlocked by hand with every restart and thereby all following steps (releases, SAMBA) problems have. However, this can be cured by hand. Energy consumption lies with switched off records with 12 watts. Then in company these are thus between 20 and for a short time 30 watts. I have hope that the encoding is soon implemented substantially.

6.6.17

Macht man sich wirklich verdächtig, wenn man E-Mails verschlüsselt oder OMEMO nutzt? Ist doch nichts anderes, als wenn ich mit einer anderen Person unter vier Augen rede…

Geniale Ordnung im PROSODY-Repo Mercury HG … Jeder Defekt, jede Anforderung exakt kategorisiert mit Meilenstein,  Datum, Status…. genial

Feinstaubsensor fast eingetroffen

Tests mit Musik-Video-Kanälen im SAT-TV und im Netz als Motivator für Ausdauer-Training @home. Fazit: SAT-TV ist out, die Kanäle kann man auch über das Internet streamen, auch solche die über ASTRA nicht zu empfangen sind, wie Fashion-TV.

 

 

Chat Server Ursache für fehlende Nachrichten?

Ausgangssituation der vorhanden XMPP-Chat-Konfiguration

Ich betreibe einen XMPP-Chat-Server (Prosody). Als Clienten verwende ich Gajim und Conversations. Zur Verschlüsselung des Chats kommt OMEMO zum Einsatz. Außerdem verwende ich die Module mod_mam, mod_muc_mam und die Speicherung der Nachrichten in eine MYSQL/MariaDB-Datenbank.

Probleme beim Chat

Ständig hatte ich einen unterschiedlichen Datenstand bei den Nachrichten auf den unterschiedlichen Clients, obwohl diese immer synchron sein müssten. Häufig sind Clients nicht verbunden, wie Gajim auf dem Desktop. Die Synchronisation nach Einschalten des Rechner funktioniert, aber es gab immer fehlende Nachrichten. Durch die XMPP Standards dürfte so etwas nicht passieren. Als Ursache habe ich viele Dinge in Betracht gezogen.

Ursachen für fehlende/unsynchrone Nachrichten

Letztendlich hat sich heraus gestellt, dass als Ursache zu viele instabile Module und ständige Serverneustarts zu den Unsynchronitäten geführt haben. Aufgefallen ist mir zufällig, dass die Schlüssel meiner Clienten bei Serverneustart u. U. nicht wieder aktiviert wurden. Dadurch werden dann Nachrichten nicht mehr angezeigt, weil die Schlüssel inaktiv sind und es kommt zum Nachrichtenverlust beim Chat.

Lösung

Ich habe alle nicht notwendigen Module deaktiviert. Quasi sind nur noch die in Conversations angezeigten XMPP-Server-XEPs aktiv. Außerdem habe ich am Server Änderungen bei der Update-Politik vorgenommen. So starte ich meine Server nicht mehr neu. Dies kann man mit der autom. Installation zum Einen bewerkstelligen. Die notwendigen Neustarts des Systems bei Kernelaktualisierungen lassen sich dann mit dem Verfahren Kernel Live Patching (KLP) unter Ubuntu/Linux zum Anderen verhindern. Somit ist ein Hochverfügbarkeitsbetrieb mit einfachen Mitteln z. B. auch im Heim möglich. Seit dem habe ich eine sehr zuverlässige Funktion meines Prosody-Servers, mit dem alle Beteiligten viel Freude haben.

Weitere Lösung für die XMPP-Standards

Gut wäre infolge dessen, wenn Prosody die Aktivierung der Schlüssel nach Neustart erhalten könnte. Leider ist OMEMO nur Client-seitig implementiert. Wahrscheinlich müssen die XMPP-Clients die Aktivierung der OMEMO-Keys sichern. Somit sollte dann der Betrieb auch bei einem Neustart abgefangen werden (können).

Initial situation of the existing XMPP chat configuration

I am running an XMPP chat server (prosody). As clients I use Gajim and Conversations. OMEMO is used to encrypt the chat. I also use modules mod_mam, mod_muc_mam and storing the messages in a MYSQL / MariaDB database.

Chat problems

I always had a different dataset in the messages on the different clients, although these should always be synchronous. Frequently, clients are not connected, such as Gajim on the desktop. Synchronization after power on works, but there was always missing messages. The XMPP standards should not happen. As a cause I have considered many things.


Causes for missing / unsynchronous messages

In the end, it turned out that too many unstable modules and constant server restartes led to the unsynchronization. It is a coincidence that the keys of my clients might not have been activated again during server reboot. This means that messages are no longer displayed because the keys are inactive and there is a loss of messages during the chat.

Solution

I have disabled all unnecessary modules. Quasi, only the XMPP server XEPs displayed in conversations are active. I also made changes to the update policy on the server. So I do not restart my servers. This can be done with the autom. Installation on the one hand. The necessary reboots of the system during kernel updates can then be prevented with the procedure Kernel Live Patching (KLP) under Ubuntu / Linux on the other. Thus, a high-availability operation is possible with simple means, eg also in the home. Since then I have a very reliable function of my prosody server, with which all involved have a lot of fun.

Another solution for the XMPP standards

Good would be if Prosody could get the key activation after reboot. Unfortunately, OMEMO is only implemented on the client side. It is likely that the XMPP clients must back up the activation of the OMEMO keys. Thus, the operation should be intercepted (also) during a restart.

Nutzung der whatsapp Alternative XMPP aka Jabber auf gleisnetze.de mit Freunden

Einleitung – Nicht  nur whatsapp ist unsicher

Wegen der bekannten Probleme bei der Nutzung von whatsapp bin ich umgestiegen. Mittlerweile ist bekannt, dass generell Daten auf dem Handy abgefangen werden können (Sicherheitslücken in Systemen). Die verschlüsselte Ende zu Ende Übertragung ist nur ein Aspekt der Angreifbarkeit.

Privatheit

Ich nutze XMPP mit Prosody, Conversations und Gajim. Ich schalte auf dem Handy den Datendienst und WLAN ab um Datenabgriff zu verhindern. Restzugänge gibt es sicher immer noch. Vielleicht lässt sich auch mit dem Verschlüsseln der Speicher etwas erreichen. Nebeneffekt ist, dass ich das Ladegerät nur noch ein mal wöchentlich benötige und ich bin auch sicher nicht Handy-abhängig. Außerdem lebe ich damit ruhiger.

Freundschaften

Was mich aber mehr beschäftigt ist die Frage, kann und will ich meine Freunde mit dem Verhalten … verkraulen … abstoßen? Ich bin ja nicht mehr ständig auf herkömmlichen Kanälen greifbar. Manche Bekannte erreichen mich nur noch per SMS, Telefon oder Email. Natürlich will ich das nicht. Aber man kommt schon ins grübeln.

Zeitaufwand für die Privatheit im Netz

Kann man es eigentlich auf Dauer aushalten, seine Privatheit-Auferlegungen durchzuhalten? Es benötigt viel Zeit und Nerven. Ich könnte fast den ganzen Tag dran sitzen. Immer hat man das Gefühl, dass es noch offene oder fehlerhafte Konfigurationen zu korrigieren gibt. Es ist schwer einen Schlussstrich zu finden. Den gibt es ja eh nicht. Wahrscheinlich ist es am Besten für jeden Tag einen Zeitraum einzuhalten.

Multi (5) Sensor für smarthome Arduino FHEM MYSENSORS

Einleitung

Heute veröffentliche ich die Version 0.11. des Sensor-Sketches. Änderung ist die Korrektur des Sketchteils für den Bewegungssensors.

 Sensoren

HC-SR501 (Motion)

DHT-22 (Temperature/Humidity)

MQ135 (Airquality)

MH-Z19 (CO2) –> demnächst

 

Entscheidung MQ135 / MH-Z19(14)

Die Entscheidung welcher CO2 Wert verwendet wird ist für den MH-Z14(19) gefallen. Dieser liefert deutlich plausiblere Werte. So ist  eine Übereinstimmung beider Kurven ist grob gegeben. Aber der MQ135 reagiert eben dennoch auf eine Menge andere Gase, so dass ich ihn vorerst weiter verwende und im Sketch belasse. Zukünftig teste ich mit dem MH-Z14 der bei Lieferung durch den MH-Z19 ersetzt und auf die Platine integriert wird.

 

//Sens4Sketch (Motion, Temperature, Humidity, CO2)

//v0.xx MH-Z19 integration
//v0.11 Motion corrected
//v0.10 ---- installation co2 value specification outside----under construction
//v0.9 Autoset r0 off, vaule < 400 possible!!!!
//v0.8 Corr. Lib von rstoica (set r0, correction) impl
//v0.7 set r0 to eeprom
//v0.6 SetR0-Button
//v0.5 Motion
//v0.4 autosetr0 if co2<400
//v0.3 api 2.0, redesign
//v0.2 CorrectedRZero basis for calculating r0
//G. Krocker K.-H. Wind et. al. ++++JH
//Caution: The Sketch erorder an amended mq135.h Library

//#define MY_DEBUG    // Enables debug messages in the serial log
#define MY_RADIO_NRF24
#define MY_REPEATER_FEATURE  // Enables repeater functionality for a radio node
#include <SPI.h>
#include <MySensors.h>
#include <DHT.h>
#include <MQ135.h>
//----------------------------------------------------------------------------
// Timer
unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
//-----------------------------------------------------------------------------
//MOTION
#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
#define INTERRUPT DIGITAL_INPUT_SENSOR-3 // Usually the interrupt = pin -2 (on uno/nano anyway)
#define CHILD_ID_MOTION 16   // Id of the sensor child
MyMessage msgMotion(CHILD_ID_MOTION, V_TRIPPED);
//-----------------------------------------------------------------------------
// DHT22
#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1
#define HUMIDITY_SENSOR_DIGITAL_PIN 4
DHT dht;
float lastTemp;
float lastHum;
boolean metric = true; 
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
//-----------------------------------------------------------------------------
// MQ135
#define CHILD_ID_CO2C 24
#define CHILD_ID_CO2 25
#define CHILD_ID_R0C 26
#define CHILD_ID_R0 27
#define EEPROM_R0C 0
int C02;
int CO2C;
float R0;
float R0C;
float R02;
MQ135 gasSensor = MQ135(0);//PIN0 
MyMessage msgCO2C(CHILD_ID_CO2C, V_VAR1);
MyMessage msgCO2(CHILD_ID_CO2, V_VAR1);
MyMessage msgR0C(CHILD_ID_R0C, V_VAR1);
MyMessage msgR0(CHILD_ID_R0, V_VAR1);
//-----------------------------------------------------------------------------
void setup() {
//--------------------------------------------------------------------- 
 //R0C aus EEPROM sonst 55
dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
pinMode(DIGITAL_INPUT_SENSOR, INPUT);
uint8_t R02 = loadState(EEPROM_R0C);
// get R0C from EEPROM
float R0C = R02 * 2;
if (R0C > 1.0 && R0C < 500.0)
{
Serial.print(F("Setting R0 from EEPROM: "));
}
else
{
Serial.print(F("Setting default R0C: "));
R0C = 50;
}
Serial.print(R0C);
Serial.println(F(""));
gasSensor.setRZero(R0C);
}
//-----------------------------------------------------------------------------
void presentation(){
sendSketchInfo("Sens4", "v0.7");
present(CHILD_ID_TEMP, S_TEMP);
present(CHILD_ID_HUM, S_HUM);
present(CHILD_ID_CO2C, S_CUSTOM);
present(CHILD_ID_CO2, S_CUSTOM);
present(CHILD_ID_R0C, S_CUSTOM);
present(CHILD_ID_R0, S_CUSTOM);
present(CHILD_ID_MOTION, S_MOTION);
}
//-----------------------------------------------------------------------------



void loop(){



//-----------------------------------------------------------------------------
//TEMP_FEUCHTE 

wait(dht.getMinimumSamplingPeriod());// TheoL
  float temperature = dht.getTemperature();
  if (isnan(temperature)) {
      Serial.println("Failed reading temperature from DHT");
  } else if (temperature != lastTemp) {
    lastTemp = temperature;
    if (!metric) {
      temperature = dht.toFahrenheit(temperature);
    }
   send(msgTemp.set(temperature, 1));
    Serial.print("T: ");
    Serial.println(temperature);
  }
  
  float humidity = dht.getHumidity();
  if (isnan(humidity)) {
      Serial.println("Failed reading humidity from DHT");
  } else if (humidity != lastHum) {
      lastHum = humidity;
      send(msgHum.set(humidity, 1));
      Serial.print("H: ");
      Serial.println(humidity);
  }
//-----------------------------------------------------------------------------  
//CO2
  float R0 = gasSensor.getRZero();
  float R0C = gasSensor.getCorrectedRZero(temperature, humidity);
  float CO2 = gasSensor.getPPM();
  float CO2C = gasSensor.getCorrectedPPM(temperature, humidity);
  
  Serial.print("R0: "); 
  Serial.println(R0);
  send(msgR0.set(R0,1));

  Serial.print("R0C: ");
  Serial.println(R0C);
  send(msgR0C.set(R0C,1));

  Serial.print("CO2: ");
  Serial.println(CO2);
  send(msgCO2.set(CO2,1));

  Serial.print("CO2C: ");
  Serial.println(CO2C);
  send(msgCO2C.set(CO2C,1));
  
  Serial.println();
//-----------------------------------------------------------------------------
//Read digital motion value
boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
 Serial.print("Motion: ");
Serial.println(tripped);
send(msgMotion.set(tripped?"1":"0"));  
//-----------------------------------------------------------------------------
wait(SLEEP_TIME); //sleep/wait for: sleepTime // byTheo: Changed
}
//-----------------------------------------------------------------------------
//incomingMessage
void receive(const MyMessage& message){
 Serial.println(F("Incoming Message:"));

if (message.isAck())
{
Serial.println(F("This is an ack from gateway"));
}

uint8_t sensor = message.sensor;
if (sensor == CHILD_ID_R0C)
{
float R0C = message.getFloat();

Serial.print(F("Incoming R0C: "));
Serial.print(R0C);
Serial.println(F(""));

saveState(EEPROM_R0C, (uint8_t)(R0C/2));
gasSensor.setRZero(R0C);
send(msgR0.set(R0C, 2));
}
}
//-----------------------------------------------------------------------------

 

Dallas DS18B20 Temperaturmessung MYSENSORS API 2.0 und FHEM

Überwachung der Wassertemperatur im Aussentank

Hier nun die 2.1 Version zur API 2.0. Basis ist der Sketch von MYSENSORS.ORG. Über den Debug-Modus habe ich herausgefunden, dass von FHEM keine Node-ID vergeben wurde. Dies habe ich dann mit #define MY_NODE_ID fest eingestellt. Damit lief dann alles. Im Original-Sketch wird der Arduino noch für die Übertragungszeit schlafen gelegt. Die Funktion habe ich erst mal deaktiviert. Vielleicht kümmere ich mich später darum. Ich verwende den Sketch, um mit einem wasserdichten DS18B20 die Temperatur im Außenwassertank zu überwachen.

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * DESCRIPTION
 *
 * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller
 * http://www.mysensors.org/build/temp
 */

//v2.1 Anpassung auf API 2.0 von JH
#define MY_RADIO_NRF24
#define MY_DEBUG    // Enables debug messages in the serial log 
#define MY_NODE_ID 42 // Sets a static id for a node
#include <MySensors.h>  
#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No

#define ONE_WIRE_BUS 4 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 16
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 

float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
boolean receivedConfig = false;
boolean metric = true; 
// Initialize temperature message
MyMessage msg(0,V_TEMP);

void setup()  
{ 
sensors.setResolution(TEMP_12_BIT); // Genauigkeit auf 12-Bit setzen
  
}
void presentation(){
  
  // Startup up the OneWire library
  sensors.begin();
  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);

  // Startup and initialize MySensors library. Set callback for incoming messages. 
  

  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Temperature Sensor", "2.1");

  // Fetch the number of attached temperature sensors  
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
  present(i, S_TEMP);
  }
}


void loop()     
{     
  

  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  //int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  //sleep(conversionTime);

  // Read temperatures and send them to controller 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
 
    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
 
    // Only send data if temperature has changed and no error
    #if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif
 
      // Send in the new temperature
      send(msg.setSensor(i).set(temperature,2));
      // Save new temperatures for next compare
      lastTemperature[i]=temperature;
    }
  }
  sleep(SLEEP_TIME);
}

 

MYSENSORS Zählermodul für Gaszähler API 2.0

Hier schon einmal der Sketch. Mit ihm erzeuge ich die Zählimpulse in MYSENSORS. In FHEM verwende ich dann das Modul Gascalculator zur weiteren Berechnung. Als Kontakt verwende ich einen einfach Reedkontakt.

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * DESCRIPTION
 *
 * Simple binary switch example 
 * Connect button or door/window reed switch between 
 * digitial I/O pin 3 (BUTTON_PIN below) and GND.
 * http://www.mysensors.org/build/binary
 */
#define MY_RADIO_NRF24

#include <MySensors.h>
#include <SPI.h>
#include <Bounce2.h>

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

 Bounce debouncer = Bounce(); 
int oldValue=-1;

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

void setup()  
{  

  
  // Setup the button
  pinMode(BUTTON_PIN,INPUT);
  // Activate internal pull-up
  digitalWrite(BUTTON_PIN,HIGH);
  
  // After setting up the button, setup debouncer
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(5);
}
void presentation(){
sendSketchInfo("DOOR", "v0.1");
  // Register binary input sensor to gw (they will be created as child devices)
  // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. 
  // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
 present(CHILD_ID, S_DOOR);  
}


//  Check if digital input has changed and send in new value
void loop() 
{
 
  debouncer.update();
  // Get the update value
  int value = debouncer.read();
 
  if (value != oldValue) {
     // Send in the new value
     send(msg.set(value==HIGH ? 1 : 0));
     oldValue = value;
  }
} 

https://smarthome.gleisnetze.de