Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Für mich als "Nicht-Elektroniker" sind noch eine Fragen offen: Wie sieht dann so ein 1wire Netzwerk am Arduino bzw Wemos aus? An welche Pins kommt dann der DS2482-10 und wie geht es dann weiter zu den Sensoren?
Der Anschluss des Chips erfolgt via I2C Pins SDA und SCL. Bei Arduinos ist das vorgegeben, beim ESP8266 gibt es keine vordefinierten, dort nimmt man zwei beliebige Pins und definiert diese dann im Code entsprechend (siehe hier: https://learn.sparkfun.com/tutorials...-arduino-addon). Wemos habe ich leider nicht, musst du vermutlich mal nach I2C und Wemo gucken
Zu den Sensoren sieht man rechts in meinem Schaltbild. VDD (Betriebsspannung) = Rotes Kabel, GND(Masse) = Schwarz und OW (OneWire) = Gelb.
Bist Du mit der Überlegung hinsichtlich Sketches und Framework schon weitergekommen?
Wäre die Erweiterung von ESPEasy um KNX eine Option?
Macht es Sinn, dass in ein Repository bspw bei GitHub zu bringen?
Sisamiwe das steht noch auf meiner Liste, wird aber sicher nichts sein was kurzfristig passiert. Zum einen muss ich mich da auch mal in die Webserver Lib einarbeiten und zum anderen fehlt mir atm auch etwas die Zeit das intensiver zu betreiben.
Eine Einbindung in ESPEasy oder Tasmota wäre ne richtig feine Sache, doch übersteigt das nüchtern betrachtet meine Fähigkeiten
Aktuell habe ich nur die paar Sketche am laufen, die ich vorne gepostet habe. Werde die Tage noch im Wetterstations-Thread einen kurzen Sketch zur Messung von Temp/Hum/Lux posten, quasi ne Mini-Wetterstation.
Mit GitHub könnte man überlegen, glaube aber im Moment ist es noch überschaubar und wird sicher hier auch reichen.
Bzgl. Einbindung von der KNX-lib in ESPEasy habe ich meine Fühler ausgestreckt und bei GitHub einen entsprechenden Issue geöffnet.
Leider konnte ich dort bislang nicht überzeugen, dass sich der Aufwand lohnt. Vielleicht könnt ihr auch entsprechende Argumente vorbringen.
Das wäre Super!
Ich habe bei ESPEasy irgendwo gelesen, dass spätestens alle 20ms eine interne Routine aufgerufen werden muss. Das könnte die Engstelle sein, gerade wenn mal viel Bustraffic ist oder viele Leseanfragen auf einmal kommen...die Antwort auf Deine Anfrage ist da auch eindeutig: für zeitkritische Applikationen ist ESPEasy eher nicht geeignet.
Habe am Wochenende mal gebastelt. Mir fehlten als Segler schon immer der Luftdruck bei meiner KNX-Wetterstation.
Auf den Bildern ist ein BMP280, ESP8266 01 und ein 3.3V Step-Down-Regler. Was die Kramkiste im Keller so hergab.
Versorgt wird das über den Hilfsspannungsausgang der KNX-Spannungsversorgung und hängt provisorisch in der UV.
Der Luftdruck von BMP weicht um 1hPa von den aktuellen Angaben vom DWD in meiner Region ab. Das finde ich mehr als OK.
Habe mal nach bezahlbaren Ultraschall-Windsensoren gesucht aber nichts brauchbares gefunden.
Habe am Wochenende mal gebastelt. Mir fehlten als Segler schon immer der Luftdruck bei meiner KNX-Wetterstation.
Auf den Bildern ist ein BMP280, ESP8266 01 und ein 3.3V Step-Down-Regler. Was die Kramkiste im Keller so hergab.
Versorgt wird das über den Hilfsspannungsausgang der KNX-Spannungsversorgung und hängt provisorisch in der UV.
Der Luftdruck von BMP weicht um 1hPa von den aktuellen Angaben vom DWD in meiner Region ab. Das finde ich mehr als OK.
Habe mal nach bezahlbaren Ultraschall-Windsensoren gesucht aber nichts brauchbares gefunden.
Das klingt aus interessant. Kannst Du Deinen Aufbau und die Sketches noch etwas besser beschreiben?
Kein Hexenwerk! Habe nur das Beispiel angepasst.
Hier mein Sketch. Doku ist da quasi enthalten.
Der ESP befüllt dann über zwei KNX-Adressen ein HS-Archiv.
Wenn das Dein erstes ESP-Projekt ist, nimm den Node-muc oder den Wemos D1 mini aus dem Beispiel. Mit den wenigen Pin´s am ESP01 tut man sich da keinen Gefallen ;-)
Viel Spaß beim Nachbauen!
Geteste habe ich das mit einem ENERTEX-IP-Router.
Code:
/*
* * Stand 02.02.2018
* Quelle: https://github.com/envy/esp-knx-ip
* https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/1158719-esp8266-%C3%BCber-wlan-an-knx
* ChristianB
*
* ESP 8266 01
* Angepasst für BMP208 / I2C
*
* GiPO 0 --> GND => Flash
* CH_PD --> Vcc => RUN enable
* I2C Pin 0,2
* *************************
* RX VCC
* GIPO0 RESET
*ANT. GIPO2 CH_PD
* GND tx
* **************************
*/
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <esp-knx-ip.h>
//#define MULTICAST_IP IPAddress(192, 168, 2, 167)
// WiFi config here
const char* ssid = "DeineSSID";
const char* pass = "DeinPasswort";
#define UPDATE_INTERVAL 10000 // This is the default send interval ms
unsigned long next_change = 0;
config_id_t hostname_id;
config_id_t temp_rate_id;
config_id_t enable_sending_id;
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
// Register the group addresses where to send information to and the other config
hostname_id = knx.config_register_string("Hostname", 20, String("ESP-KNX"));
enable_sending_id = knx.config_register_bool("Enable periodic sending", true);
temp_rate_id = knx.config_register_int("Send rate (ms)", UPDATE_INTERVAL, show_periodic_options);
temp_ga = knx.config_register_ga("Temperature", show_periodic_options);
pres_ga = knx.config_register_ga("Pressure", show_periodic_options);
// Load previous values from EEPROM
knx.load();
// Init WiFi
WiFi.hostname(knx.config_get_string(hostname_id));
WiFi.begin(ssid, pass);
Serial.println("");
Serial.print("[Connecting]");
Serial.print(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Start knx
knx.start();
Serial.println();
Serial.println("Connected to wifi");
Serial.println(WiFi.localIP());
// Init Sensor
Wire.pins(0, 2);
Wire.begin(0, 2);
if (!bmp.begin(0x76)) {
Serial.println("Could not find a sensor, check wiring!");
//while (1) {} // wait
}
}
void loop() {
// Process knx events, e.g. webserver
knx.loop();
unsigned long now = millis();
if (next_change < now)
{
next_change = now + knx.config_get_int(temp_rate_id);
Serial.print("T: ");
float temp = bmp.readTemperature();
float pres = bmp.readPressure()/100.0f;
Serial.print(temp);
Serial.print("°C H: ");
Serial.print("% P: ");
Serial.print(pres);
Serial.println("hPa");
knx.write2ByteFloat(knx.config_get_ga(temp_ga), temp);
knx.write2ByteFloat(knx.config_get_ga(pres_ga), pres);
}
delay(50);
}
// This is a enable condition function that is checked by the webui to figure out if some config options should be hidden
bool show_periodic_options()
{
return knx.config_get_bool(enable_sending_id);
}
anbei noch wie angekündigt ein Code von mir. Mit diesem Script ist es möglich, 12stck DS12B18 Sensoren an einen ESP8266 anzuschließen und direkt auf den KNX Bus zu senden. GA'S werden wie in den anderen Scripten auch über Webinterface konfiguriert. Diese Kombination ist z.B perfekt um Temperaturen im FBHKV zu ermitteln.
Die Sensoren werden automatisch sortiert, Reihenfolge kann über den SerielMonitor ausgelesen werden oder einfach via Gruppenmonitor in der ETS getestet werden.
Code:
#include <esp-knx-ip.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------
//DS18B20
#define ONE_WIRE_BUS D3 //Pin to which is attached a temperature sensor
#define ONE_WIRE_MAX_DEV 12 //The maximum number of devices
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int numberOfDevices; //Number of temperature devices found
DeviceAddress devAddr[ONE_WIRE_MAX_DEV]; //An array device temperature sensors
float tempDev[ONE_WIRE_MAX_DEV]; //Saving the last measurement of temperature
float tempDevLast[ONE_WIRE_MAX_DEV]; //Previous temperature measurement
long lastTemp; //The last measurement
const int durationTemp = 5000; //The frequency of temperature measurement
//-------------------------------------------
// WiFi config
const char* ssid = "SSID";
const char* pass = "Kennwort";
#define LED_PIN LED_BUILTIN
#define UPDATE_INTERVAL 10000 // Default send and debug interval
unsigned long next_data_change = 0;
unsigned long next_debug_change = 0;
config_id_t temp1_ga, temp2_ga, temp3_ga, temp4_ga, temp5_ga, temp6_ga, temp7_ga, temp8_ga, temp9_ga, temp10_ga, temp11_ga, temp12_ga;
config_id_t hostname_id;
config_id_t temp_rate_id;
config_id_t debug_rate_id;
//------------------------------------------
//Device ID to string
String GetAddressToString(DeviceAddress deviceAddress){
String str = "";
for (uint8_t i = 0; i < 8; i++){
if( deviceAddress[i] < 16 ) str += String(0, HEX);
str += String(deviceAddress[i], HEX);
}
return str;
}
//Setup Sensor
void SetupDS18B20(){
DS18B20.begin();
Serial.print("Parasite power is: ");
if( DS18B20.isParasitePowerMode() ){
Serial.println("ON");
}else{
Serial.println("OFF");
}
numberOfDevices = DS18B20.getDeviceCount();
Serial.print( "Device count: " );
Serial.println( numberOfDevices );
lastTemp = millis();
DS18B20.requestTemperatures();
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++){
// Search the wire for address
if( DS18B20.getAddress(devAddr[i], i) ){
//devAddr[i] = tempDeviceAddress;
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: " + GetAddressToString(devAddr[i]));
Serial.println();
}else{
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
//Get resolution of DS18b20
Serial.print("Resolution: ");
Serial.print(DS18B20.getResolution( devAddr[i] ));
Serial.println();
//Read temperature from DS18b20
float tempC = DS18B20.getTempC( devAddr[i] );
Serial.print("Temp C: ");
Serial.println(tempC);
}
}
//Loop
void TempLoop(long now){
if( now - lastTemp > durationTemp ){ //Take a measurement at a fixed time (durationTemp = 5000ms, 5s)
for(int i=0; i<numberOfDevices; i++){
float tempC = DS18B20.getTempC( devAddr[i] ); //Measuring temperature in Celsius
tempDev[i] = tempC; //Save the measured value to the array
}
DS18B20.setWaitForConversion(false); //No waiting for measurement
DS18B20.requestTemperatures(); //Initiate the temperature measurement
lastTemp = millis(); //Remember the last time measurement
}
}
//------------------------------------------
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
// Registrierung Gruppenadressen
temp1_ga = knx.config_register_ga("Temperatur 1");
temp2_ga = knx.config_register_ga("Temperatur 2");
temp3_ga = knx.config_register_ga("Temperatur 3");
temp4_ga = knx.config_register_ga("Temperatur 4");
temp5_ga = knx.config_register_ga("Temperatur 5");
temp6_ga = knx.config_register_ga("Temperatur 6");
temp7_ga = knx.config_register_ga("Temperatur 7");
temp8_ga = knx.config_register_ga("Temperatur 8");
temp9_ga = knx.config_register_ga("Temperatur 9");
temp10_ga = knx.config_register_ga("Temperatur 10");
temp11_ga = knx.config_register_ga("Temperatur 11");
temp12_ga = knx.config_register_ga("Temperatur 12");
// And the config options
hostname_id = knx.config_register_string("Hostname", 20, String("env"));
temp_rate_id = knx.config_register_int("Send rate (ms)", UPDATE_INTERVAL);
debug_rate_id = knx.config_register_int("Serial debug rate (ms)", UPDATE_INTERVAL);
// Load previous values from EEPROM
knx.load();
// Init WiFi
WiFi.hostname(knx.config_get_string(hostname_id));
WiFi.begin(ssid, pass);
Serial.println("");
Serial.print("[Connecting]");
Serial.print(ssid);
digitalWrite(LED_PIN, HIGH);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_PIN, LOW);
delay(500);
Serial.print(".");
digitalWrite(LED_PIN, HIGH);
}
digitalWrite(LED_PIN, LOW);
// Start knx
knx.start();
Serial.println();
Serial.println("Connected to wifi");
Serial.println(WiFi.localIP());
Serial.println(" ");
//Setup DS18b20 temperature sensor
SetupDS18B20();
}
void loop() {
knx.loop();
long t = millis();
TempLoop( t );
unsigned long now = millis();
// Debug Loop
if (next_debug_change < now)
{
next_debug_change = now + knx.config_get_int(debug_rate_id); // Read debug rate setting
if (WiFi.status() != WL_CONNECTED)
{
digitalWrite(LED_PIN, HIGH);
Serial.println("WIFI ERROR");
}else
{
digitalWrite(LED_PIN, LOW);
Serial.println("WIFI OK");
}
}
// Data Loop Ausgabe
if (next_data_change < now)
{
next_data_change = now + knx.config_get_int(temp_rate_id);
knx.write2ByteFloat(knx.config_get_ga(temp1_ga), tempDev[0]);
knx.write2ByteFloat(knx.config_get_ga(temp2_ga), tempDev[1]);
knx.write2ByteFloat(knx.config_get_ga(temp3_ga), tempDev[2]);
knx.write2ByteFloat(knx.config_get_ga(temp4_ga), tempDev[3]);
knx.write2ByteFloat(knx.config_get_ga(temp5_ga), tempDev[4]);
knx.write2ByteFloat(knx.config_get_ga(temp6_ga), tempDev[5]);
knx.write2ByteFloat(knx.config_get_ga(temp7_ga), tempDev[6]);
knx.write2ByteFloat(knx.config_get_ga(temp8_ga), tempDev[7]);
delay(20);
knx.write2ByteFloat(knx.config_get_ga(temp9_ga), tempDev[8]);
knx.write2ByteFloat(knx.config_get_ga(temp10_ga), tempDev[9]);
knx.write2ByteFloat(knx.config_get_ga(temp11_ga), tempDev[10]);
knx.write2ByteFloat(knx.config_get_ga(temp12_ga), tempDev[11]);
}
delay(50);
}
das senden div. Daten hab ich jetzt schon gut hinbekommen.. was ich aber noch nicht kapier ist das senden,
bei einer Leseanforderung. Würde gern min Skript dahingehend erweitern. Leider haben meine Versuche
bis jetzt keinen wirklichen Erfolg gezeigt.. hat einer von euch ein einfaches Beispiel wie sowas auszusehen
hat ?
Gruß Martin
Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.
Moin Martin,
eine Leseanfrage verarbeitest du in einem Callback mit dem Aufruft als "KNX_CT_READ". Innerhalb der Callback-Funktion kannst du dann den Code ausführen. Im Beispiel antwortet eben diese GA auf die Anfrage. Analog zum beim "KNX_CT_WRITE"
hier mal ein Beispiel:
Code:
void Ch1State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data)
{
switch (ct)
{
case KNX_CT_READ: //Das passiert auf eine Leseanfrage
Ch1State = digitalRead(Ch1_Pin);
knx.answer1Bit(knx.config_get_ga(Ch1Ack_GA), Ch1State);
break;
case KNX_CT_WRITE:
//Das hier würde bei einem Schreiben auf die GA passieren
break;
}
}
Diesen Callback musst du natürlich noch in der void Setup() verknuspern:
Ich gehe davon aus, dass die Frage auf mich bezogen war. Die Sensoren werden direkt auf den NodeMCU angeklemmt. Hier ein Bild zum Anschluss für das Scipt oben.
anbei noch wie angekündigt ein Code von mir. Mit diesem Script ist es möglich, 12stck DS12B18 Sensoren an einen ESP8266 anzuschließen und direkt auf den KNX Bus zu senden. GA'S werden wie in den anderen Scripten auch über Webinterface konfiguriert.
Ich bin beeindruckt. Könntest du noch ein Screenshot vom Web-Interface der GA Konfiguration machen&schicken?
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar