Temperatur und Luftfeuchtigkeit mit Arduino messen und in FHEM anzeigen

Begonnen von FHEMatic, 19 Juni 2016, 16:08:04

Vorheriges Thema - Nächstes Thema

FHEMatic

Sehr geehrte Forenteilnehmer!

Mein Aufbau:
.)Raspberry Pi als FHEM-Server
.)Arduino Uno, D5100 Ethernetshield, DHT22 Sensor
.)Verbindung via Ethernet

Ziel:
Ich möchte mit dem Arduino Temp und Feuchtigkeitsmessung vornehmen und am FHEM-Server anzeigen lassen, bzw. grafisch darstellen.

Zukünftig:
Ausbau auf 3 Arduinos (mehrer Räume eventuell auch aussen)
Umstieg von DHT22 auf BME280 Sensoren


Testhalber habe ich die Messwerte mit folgenden Sketch via seriellen Montior abgefragt:
Dies hat funktioniert, Verdrahtung daher soweit richtig.

//DHT22-TEST

#include "DHT.h"

//Digital PIN an dem Datenleitung angeschlossen wurde
#define DHTPIN 2
//Sensortyp DHT11, DHT21, DHT22
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(9600);
  Serial.println("DHT22 - Test!");

  dht.begin();
}

void loop()
{

  // Wait a few seconds between measurements.
  delay(2000);
  //Luftfeuchte auslesen
  float h = dht.readHumidity();   
  //Temperatur auslesen
  float t = dht.readTemperature(); 

  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  if (isnan(t) || isnan(h))
  {
    Serial.println("DHT22 konnte nicht ausgelesen werden");
  }
  else
  {
    Serial.print("Luftfeuchte: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatur: ");
    Serial.print(t);
    Serial.println(" C");
  }
}



Im nächsten Schritt wollte ich nun die Verbindung zwischen Arduino und FHEM-Server herstellen und habe folgendes Sketch verwendet:



//FIRMATA
/*
* Firmata is a generic protocol for communicating with microcontrollers
* from software on a host computer. It is intended to work with
* any host computer software package.
*
* To download a host software package, please click on the following link
* to open the download page in your default browser.
*
* http://firmata.org/wiki/Download
*/

/*
  Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved.
  Copyright (C) 2010-2011 Paul Stoffregen.  All rights reserved.
  Copyright (C) 2009 Shigeru Kobayashi.  All rights reserved.
  Copyright (C) 2009-2013 Jeff Hoefs.  All rights reserved.
  Copyright (C) 2013 Norbert Truchsess. All rights reserved.
  Copyright (C) 2014 Nicolas Panel. All rights reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  See file LICENSE.txt for further informations on licensing terms.

  formatted using the GNU C formatting and indenting
*/


#include <Firmata.h>

/*
* by default Firmata uses the Serial-port (over USB) of Arduino.
* ConfigurableFirmata may also comunicate over ethernet using tcp/ip.
* To configure this 'Network Firmata' to use the original WIZ5100-based
* ethernet-shield or Arduino Ethernet uncomment the includes of 'SPI.h' and 'Ethernet.h':
*/

#include <SPI.h>
#include <Ethernet.h>

/*
* To configure 'Network Firmata' to use an ENC28J60 based board include
* 'UIPEthernet.h' (no SPI.h required). The UIPEthernet-library can be downloaded
* from: https://github.com/ntruchsess/arduino_uip
*/

//#include <UIPEthernet.h>
//Wird nur für das ENC28J60 Ethernetshield benötigt (W5100 über Ethernet.h)

/*
* To execute Network Firmata on Yun uncomment Bridge.h and YunClient.h.
* Do not include Ethernet.h or SPI.h in this case.
* On Yun there's no need to configure local_ip and mac in the sketch
* as this is configured on the linux-side of Yun.
*/

//#include <Bridge.h>
//#include <YunClient.h>

#if defined ethernet_h || defined UIPETHERNET_H || defined _YUN_CLIENT_H_
/*==============================================================================
* Network configuration for Network Firmata
*============================================================================*/
#define NETWORK_FIRMATA
//IP-Adresse FHEM-Server
#define remote_ip IPAddress(192,168,xxx,xxx)
//Port auf dem FHEM-Server lauscht
#define remote_port 3030
//IP-Adresse Arduino
#define local_ip IPAddress(192,168,xxx,xxx)
//MAC-Adresse Arduino
const byte mac[] = {0x70, 0x9A, 0xA7, xxxx, xxxx, xxxx};
#endif

// To configure, save this file to your working directory so you can edit it
// then comment out the include and declaration for any features that you do
// not need below.

// Also note that the current compile size for an Arduino Uno with all of the
// following features enabled is about 22.4k. If you are using an older Arduino
// or other microcontroller with less memory you will not be able to include
// all of the following feature classes.

#include <utility/DigitalInputFirmata.h>
DigitalInputFirmata digitalInput;

#include <utility/DigitalOutputFirmata.h>
DigitalOutputFirmata digitalOutput;

#include <utility/AnalogInputFirmata.h>
AnalogInputFirmata analogInput;

#include <utility/AnalogOutputFirmata.h>
AnalogOutputFirmata analogOutput;

//#include <Servo.h> //wouldn't load from ServoFirmata.h in Arduino1.0.3
//#include <utility/ServoFirmata.h>
//ServoFirmata servo;

//#include <Wire.h> //wouldn't load from I2CFirmata.h in Arduino1.0.3
//#include <utility/I2CFirmata.h>
//I2CFirmata i2c;

//#include <utility/OneWireFirmata.h>
//OneWireFirmata oneWire;

//#include <utility/StepperFirmata.h>
//StepperFirmata stepper;

#include <utility/FirmataExt.h>
FirmataExt firmataExt;

#include <utility/FirmataScheduler.h>
FirmataScheduler scheduler;

#include <utility/EncoderFirmata.h>
EncoderFirmata encoder;


// dependencies. Do not comment out the following lines
#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
#include <utility/AnalogWrite.h>
#endif

#if defined AnalogInputFirmata_h || defined I2CFirmata_h || defined EncoderFirmata_h
#include <utility/FirmataReporting.h>
FirmataReporting reporting;
#endif

// dependencies for Network Firmata. Do not comment out.
#ifdef NETWORK_FIRMATA
#if defined remote_ip && defined remote_host
#error "cannot define both remote_ip and remote_host at the same time!"
#endif
#include <utility/EthernetClientStream.h>
#ifdef _YUN_CLIENT_H_
YunClient client;
#else
EthernetClient client;
#endif
#if defined remote_ip && !defined remote_host
#ifdef local_ip
EthernetClientStream stream(client, local_ip, remote_ip, NULL, remote_port);
#else
EthernetClientStream stream(client, IPAddress(0, 0, 0, 0), remote_ip, NULL, remote_port);
#endif
#endif
#if !defined remote_ip && defined remote_host
#ifdef local_ip
EthernetClientStream stream(client, local_ip, IPAddress(0, 0, 0, 0), remote_host, remote_port);
#else
EthernetClientStream stream(client, IPAddress(0, 0, 0, 0), IPAddress(0, 0, 0, 0), remote_host, remote_port);
#endif
#endif
#endif

/*==============================================================================
* FUNCTIONS
*============================================================================*/

void systemResetCallback()
{
  // initialize a defalt state

  // pins with analog capability default to analog input
  // otherwise, pins default to digital output
  for (byte i = 0; i < TOTAL_PINS; i++) {
    if (IS_PIN_ANALOG(i)) {
#ifdef AnalogInputFirmata_h
      // turns off pullup, configures everything
      Firmata.setPinMode(i, ANALOG);
#endif
    } else if (IS_PIN_DIGITAL(i)) {
#ifdef DigitalOutputFirmata_h
      // sets the output to 0, configures portConfigInputs
      Firmata.setPinMode(i, OUTPUT);
#endif
    }
  }

#ifdef FirmataExt_h
  firmataExt.reset();
#endif
}

/*==============================================================================
* SETUP()
*============================================================================*/

void setup()
{
#ifdef NETWORK_FIRMATA
#ifdef _YUN_CLIENT_H_
  Bridge.begin();
#else
#ifdef local_ip
  Ethernet.begin((uint8_t *)mac, local_ip); //start ethernet
#else
  Ethernet.begin((uint8_t *)mac); //start ethernet using dhcp
#endif
#endif
  delay(1000);
#endif
  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);

#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
  /* analogWriteCallback is declared in AnalogWrite.h */
  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
#endif

#ifdef FirmataExt_h
#ifdef DigitalInputFirmata_h
  firmataExt.addFeature(digitalInput);
#endif
#ifdef DigitalOutputFirmata_h
  firmataExt.addFeature(digitalOutput);
#endif
#ifdef AnalogInputFirmata_h
  firmataExt.addFeature(analogInput);
#endif
#ifdef AnalogOutputFirmata_h
  firmataExt.addFeature(analogOutput);
#endif
#ifdef ServoFirmata_h
  firmataExt.addFeature(servo);
#endif
#ifdef I2CFirmata_h
  firmataExt.addFeature(i2c);
#endif
#ifdef OneWireFirmata_h
  firmataExt.addFeature(oneWire);
#endif
#ifdef StepperFirmata_h
  firmataExt.addFeature(stepper);
#endif
#ifdef FirmataReporting_h
  firmataExt.addFeature(reporting);
#endif
#ifdef FirmataScheduler_h
  firmataExt.addFeature(scheduler);
#endif
#ifdef EncoderFirmata_h
  firmataExt.addFeature(encoder);
#endif
#endif
  /* systemResetCallback is declared here (in ConfigurableFirmata.ino) */
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  // Network Firmata communicates with Ethernet-shields over SPI. Therefor all
  // SPI-pins must be set to IGNORE. Otherwise Firmata would break SPI-communication.
  // add Pin 10 and configure pin 53 as output if using a MEGA with Ethernetshield.
  // No need to ignore pin 10 on MEGA with ENC28J60, as here pin 53 should be connected to SS:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i = 0; i < TOTAL_PINS; i++) {
    if (IS_PIN_SPI(i)
        || 4 == i
        // || 10==i //explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
       ) {
      Firmata.setPinMode(i, IGNORE);
    }
  }
  //  pinMode(PIN_TO_DIGITAL(53), OUTPUT); configure hardware-SS as output on MEGA
  pinMode(PIN_TO_DIGITAL(4), OUTPUT); // switch off SD-card bypassing Firmata
  digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;

  // start up Network Firmata:
  Firmata.begin(stream);
#else
  // start up the default Firmata using Serial interface:
  Firmata.begin(57600);
#endif
  systemResetCallback();  // reset to default config
}

/*==============================================================================
* LOOP()
*============================================================================*/
void loop()
{
#ifdef DigitalInputFirmata_h
  /* DIGITALREAD - as fast as possible, check for changes and output them to the
   * stream buffer using Firmata.write()  */
  digitalInput.report();
#endif

  /* STREAMREAD - processing incoming messagse as soon as possible, while still
   * checking digital inputs.  */
  while (Firmata.available()) {
    Firmata.processInput();
#ifdef FirmataScheduler_h
    if (!Firmata.isParsingMessage()) {
      goto runtasks;
    }
  }
  if (!Firmata.isParsingMessage()) {
runtasks: scheduler.runTasks();
#endif
  }

  /* SEND STREAM WRITE BUFFER - TO DO: make sure that the stream buffer doesn't go over
   * 60 bytes. use a timer to sending an event character every 4 ms to
   * trigger the buffer to dump. */

#ifdef FirmataReporting_h
  if (reporting.elapsed()) {
#ifdef AnalogInputFirmata_h
    /* ANALOGREAD - do all analogReads() at the configured sampling interval */
    analogInput.report();
#endif
#ifdef I2CFirmata_h
    // report i2c data for all device with read continuous mode enabled
    i2c.report();
#endif
#ifdef EncoderFirmata_h
    // report encoders positions if reporting enabled.
    encoder.report();
#endif
  }
#endif
#ifdef StepperFirmata_h
  stepper.update();
#endif
#if defined NETWORK_FIRMATA && !defined local_ip &&!defined _YUN_CLIENT_H_
  if (Ethernet.maintain())
  {
    stream.maintain(Ethernet.localIP());
  }
#endif
}






Am FHEM-Server habe ich folgendes definiert:



define TestRaspi.DHT22 dummy
attr TestRaspi.DHT22 stateFormat T: Temperature H: Humidity

define FIRMATA FRM 3030 global
attr FIRMATA sampling-interval 3000
define AZ.HUM FRM_IN 2
attr AZ.HUM IODev FIRMATA
attr AZ.HUM event-min-interval reading:180
attr AZ.HUM stateFormat reading



Am FHEM-Server ist FIRMATA  "Initialized" und folgende Pins werden angezeigt:
analog_pins 14,15,16,17,18,19
input_pins 2,3,5,6,7,8,9,14,15,16,17,18,19
output_pins 2,3,5,6,7,8,9,14,15,16,17,18,19


Ich weiß jetzt jedoch nicht weiter.
Was muss ich als nächstes tun?
Muss man Teile des Codes von "DHT22-Test" Sketch in den "FIRMATA" Sketch integrieren, oder muss man
dass ausschließlich im FHEM konfigurieren, damit  die Temperatur und die Feuchtigkeitswerte in FHEM angezeigt werden?


Vielen Dank!

FHEMatic

Hallo!

Über jegliche Informationen, die mich weiterbringen könnten, wäre ich sehr dankbar.

Vielen Dank im Voraus!

lg
Markus

MadMax-FHEM

Hallo,

bzgl. Firmata kann ich nicht helfen.

Allerdings gibt es viele andere Wege die Daten nach fhem zu bekommen.

Wenn also Firmata nicht zwingend ist, lass hören..


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)

ernst1024

Kann ich dir auch nicht weiter helfen. Wie viele andere hier habe ich einen DHT-22 an einem ESP-8266 hängen und Daten werden per HTTPMOD ausgetauscht. Den ESP kannst du auch in der Arduino Umgebung programmieren, da hast du ja schon ein wenig reingeschnuppert. Wenn du da interessiert bist hier in der Bastelecke UB ESP8266 kannst du dich u.a informieren.
Gruß Ernst

FHEMatic

Zitat von: MadMax-FHEM am 23 Juni 2016, 15:37:56
Hallo,

bzgl. Firmata kann ich nicht helfen.

Allerdings gibt es viele andere Wege die Daten nach fhem zu bekommen.

Wenn also Firmata nicht zwingend ist, lass hören..


Gruß, Joachim

Hallo Joachim!

Firmata ist nicht zwingend notwendig, was würdest du unter der Berücksichtigung der vorhandenen HW und Anforderung vorschlagen?

Vielen Dank!

FHEMatic

Zitat von: ernst1024 am 23 Juni 2016, 17:16:28
Kann ich dir auch nicht weiter helfen. Wie viele andere hier habe ich einen DHT-22 an einem ESP-8266 hängen und Daten werden per HTTPMOD ausgetauscht. Den ESP kannst du auch in der Arduino Umgebung programmieren, da hast du ja schon ein wenig reingeschnuppert. Wenn du da interessiert bist hier in der Bastelecke UB ESP8266 kannst du dich u.a informieren.

Hallo Ernst!

Ich habe mich bewusst gegen die WLAN-Variante entschieden, da ich dort, wo die Arduions montiert werden sollen, einen Netzauslass habe.

Vielen Dank!

MadMax-FHEM

Hi,

ich habe auch einen Ethernetshield und damit folgende Varianten probiert:

Basis war das Webserver-Beispiel.
Bei Aufruf über Client die Messung durchgeführt und per HTTP-Antwort geschickt.
In fhem dann per HTTPMOD eingebunden.

Andere Variante:

Zyklisch Messungen durchführen und per HTTP-GET Aufruf in fhem ein Reading bei einem dummy setzen.


Allerdings habe ich auf ESP8266 umgestellt, da die total günstig sind und praktisch Arduino (bzw. MC) und WLAN-Shield in einem sind...
...und dabei so günstig (günstiger) wie der Arduino alleine...

Daher weiß ich nicht, ob ich die Sketche noch habe.
Aber im Prinzip habe ich immer eines der Beispiele angepasst (HTTP-Server bzw. HTTP-Client-Request).

Den HTTP-Get Aufruf zum Setzen eines dummy Readings könnte ich aber bei Interesse sicher noch finden...

Im Prinzip so ähnlich: GET /fhem?setreading%20DUMMYNAME%20READINGNAME%20VALUE

Aber wenn du die Shields und Arduinos eh schon hast ist es ja egal...
...außer dem Platzverbrauch ;-)

Wie Ernst schon angemerkt hat kann auch der ESP per Arduino-IDE programmiert werden (mache ich auch).

Ansonsten kann auch noch mit MQTT (glaube ich heißt so) angebunden werden (habe ich aber noch nicht verwendet aber die Suche wird dir helfen)...
...ruhig auch mal bzgl. ESP suchen, lässt sich bestimmt auch (einfach) auf den Arduino mit Shield anpassen...

Und bestimmt gibt es noch weitere Möglichkeiten (die ich aber auch nicht kenne)...

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)

FHEMatic

Hey!

Ich würde gerne die zyklische Messung durchführen.

Ich habe jetzt testhalber das WebServer-Sketch verwendet. (Arduino ist pingbar)
Danach habe ich in FHEM den Eintrag:

define TestArduino HTTPMOD http://192.168.1.119/ 10

gesetzt.

Danach habe ich im FHEM-Eventmonitor geschaut und gewartet ob irgendein Signal ankommt.
Vom Arduino Sensor kam aber nichts an.

Kannst du mir eventuell das HTTP-Get Aufruf zum Setzen eines dummy Readings zur Verfügung stellen?
Wenn möglich auch das Sketch das du derzeit benutzt, damit ich sehe wie das aussehen müsste?

Vielen Dank für die Hilfe!

MadMax-FHEM

Hallo,

was kommt denn, wenn du die URL direkt in den Browser eingibst?
Kommt eine Antwort wie erwartet?

Hast du auch

attr HTTPMODNAME userattr reading01Name reading01Regex
attr HTTPMODNAME reading01Name MeinReading
attr HTTPMODNAME reading01Regex REGEXFÜRMEINEDATEN

definiert??

Siehe Commandref zu HTTPMOD...

Die Regex muss halt auf die Antwort auf den Webaufruf passen.

Leider habe ich keinen Sketch mehr für Arduino mit Webserver...
...aber wie gesagt ich habe auch nur im Webserverbeispiel beim Ankommen einer Clientanfrage (HTTP-GET) meine Messung durchgeführt und beim Senden der "Antwort" die gemessenen Werte in die Antwort eingetragen.

Aber hier der HTTP-Get Aufruf:


"GET /fhem?cmd=setreading%%20<FHEM_DUMMY_NAME>%%20<READING_NAME>%%20<VALUE>&XHR=1\r\n HTTP/1.1\r\nHost: www.local.lan\r\nConnection: close\r\nAccept: */*\r\n\r\n"


Du musst halt die Werte '<FHEM_DUMMY_NAME>' (so heißt der dummy in fhem bei dem das Reading gesetzt werden soll), '<READING_NAME>' (so wird das Reading beim dummy heißen) und '<VALUE>' (das ist dann der Wert auf den das Reading gesetzt wird).

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)

FHEMatic

Hallo!

Ich bin ein Stück weiter aber noch nicht ganz am Ziel.
Folgendes habe ich bis jetzt:

Am Arduino läuft ein Webserver. Wenn man diesen im Browser aufruft erscheint die Temperatur und Luftfeuchtigkeit:

#include <DHT.h>

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

#include <SPI.h>
#include <Ethernet.h>


//MAC and IP address and Server Port:

   byte mac[] = { meine MAC };
   IPAddress ip(Meine IP);
   EthernetServer server(80);

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  dht.begin();

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();


// Ausgabe am Seriellen Monitor
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
       
         
// Ausgabe am Webserver
       
          client.print("Humidity: ");
          client.print(h);
          client.print(" %\t");
          client.println("<p />");
          client.print("Temperature: "); 
          client.print(t);
          client.println(" *C");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}





Am FHEM-Server sieht man mit der HTTPMOD Definition:

define TestArduino HTTPMOD http://MeineIP/ 10


nun ebenfalls schon die Luftfeuchtigkeit und Temperaturwerte (siehe Screenshot).


Im nächsten Schritt wollte ich nun das Reading setzen:

attr TestArduino readingsName_Temperature Temperature
attr TestArduino readingsName_Humidity Humidity
attr TestArduino readingsRegex_Temperature Temperature
attr TestArduino readingsRegex_Humidity Humidity
attr TestArduino stateFormat T: Temperature H: Humidity


Das funktioniert jedoch überhaupt nicht.
Könntet ihr mit bitte nochmal helfen?

Vielen Dank!

MadMax-FHEM

Hi,

poste doch mal die "plain-Antwort" des Webservers...

Also was im Buffer des HTTPMOD ankommt.

Allerdings müsste die Definition eher so lauten:


define TestArduino HTTPMOD http://MeineIP/ 10
attr TestArduino userattr reading01Name reading01Regex reading02Name reading02Regex
attr TestArduino reading01Name Temperature
attr TestArduino reading01Regex REGEX_DIE_MATCHED
attr TestArduino reading02Name Humidity Humidity
attr TestArduino reading02Regex REGEX_DIE_MATCHED


Statt REGEX_DIE_MATCHED muss nat eine passende regex formuliert werden, daher mal posten was der Server liefert...

http://www.fhemwiki.de/wiki/HTTPMOD

Ich nehme mal an sowas wie:

Humidity: 50%
Temperature: 28.7

Du kannst auch hier mal testen:

https://regex101.com/

Habe etwas ähnliches (Wasserstand), der ist wie folgt definiert:


define Wasserstand HTTPMOD http://192.168.1.244/ 300
attr Wasserstand userattr reading01Name reading01Regex
attr Wasserstand reading01Name Wasserstand
attr Wasserstand reading01Regex depth:.([\d\.]+)


Bei mir kommt sowas zurück:

depth: 14.5

Könnte also sein, dass das (oder so ähnlich) bei dir auch passt...

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)

FHEMatic

Hallo!

Die "plain-Antwort" des Webservers lautet:


HTTP/1.1 200 OK Content-Type: text/html Connection: close Refresh: 5 <!DOCTYPE HTML> <html> Humidity: 51.20 % <p> Temperature: 27.20 *C </html>

MadMax-FHEM

Hi,

probier mal:


define TestArduino HTTPMOD http://MeineIP/ 10
attr TestArduino userattr reading01Name reading01Regex reading02Name reading02Regex
attr TestArduino reading01Name Temperature
attr TestArduino reading01Regex Temperature:.([\d\.]+)
attr TestArduino reading02Name Humidity Humidity
attr TestArduino reading02Regex Humidity:.([\d\.]+)


Sollte dir ein Reading mit Namen Temperature und dem Wert 27.20 und ein Reading Humidity mit dem Wert 51.20 liefern.

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)

MadMax-FHEM

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)

FHEMatic

Zitat von: MadMax-FHEM am 09 Juli 2016, 20:48:30
Hi,

probier mal:


define TestArduino HTTPMOD http://MeineIP/ 10
attr TestArduino userattr reading01Name reading01Regex reading02Name reading02Regex
attr TestArduino reading01Name Temperature
attr TestArduino reading01Regex Temperature:.([\d\.]+)
attr TestArduino reading02Name Humidity Humidity
attr TestArduino reading02Regex Humidity:.([\d\.]+)


Sollte dir ein Reading mit Namen Temperature und dem Wert 27.20 und ein Reading Humidity mit dem Wert 51.20 liefern.

Gruß, Joachim


Hallo Joachim!

Vielen Dank, jetzt funktioniert es.
Ich habe es noch ein wenig angepasst:

define TestArduino HTTPMOD http://MeineIP/ 10
attr TestArduino userattr reading01Name reading01Regex reading02Name reading02Regex
attr TestArduino reading01Name Temperature
attr TestArduino reading01Regex Temperature:.([\d\.]+)
attr TestArduino reading02Name Humidity
attr TestArduino reading02Regex Humidity:.([\d\.]+)
attr TestArduino stateFormat T: Temperature H: Humidity