Go Down

Topic: Temperaturdaten (mit DS1820) von Arduino über Ethernet an FHEM übermitteln ?! (Read 4289 times) previous topic - next topic

Alex_85

Hallo zusammen,

ich suche nach einer Möglichkeit Temperaturdaten, welche von DS1820 1-Wire Sensoren erfasst und an ein Arduino Ethernet Board übermittelt werden in FHEM einzubinden.
Mir fehlt momentan der passende Sketch für das Arduino.
Was ich bereits habe ist die Temperaturübermittlung der Daten der DS1820 an das Arduino (webinterface + serial monitor). (das funktioniert einwandfrei)

Ich habe bereits etwas gefunden, was das ganze ermöglichen sollte:
18_WBS.pm und 99_CGI_RAWMSG.pm (FHEM-Module)
Das ganze soll dann über Web Based Sensors in FHEM erfasst werden. ->In Kombination der beiden Module soll man Sensordaten per HTTP-Aufruf bei FHEM abgeben können.

siehe hierzu:https://groups.google.com/forum/?fromgroups#!searchin/fhem-users/web$20based$20sensors/fhem-users/hYfsCOw837E/BcPU_OHCCdgJ

Falls jemand eine andere Möglichkeit kennt / bereits umgesetzt hat - Ich bin da nicht auf die oben genannte Lösung fixiert.
Mein Ziel ist einfach nur die Temperaturdaten in FHEM in einem logfile zu haben... :-)
Kann hier jemand weiterhelfen (Arduino Sketch)?!

Hardware & Software:
•Arduino Ethernet (WizNet W5100 TCP/IP-Ethernet-Controller)
•Temperatur-Sensor Hygrosens Temp.-Sensor DS 1820-BT
•Fhem 5.2 (DEVELOPMENT), $Id: fhem.pl 1996 2012-10-20 07:11:56Z

Der Sketch bisher:

#include <SPI.h>
#include <Ethernet.h>
#include "time.h"
#include "OneWire.h"
#include "DallasTemperature.h"


#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { <DEVICE-ADRESS-1> };
DeviceAddress outsideThermometer = { <DEVICE-ADRESS-2> };

const byte MaxArrayElement=252;

byte mac[] = { MAC };
byte ip[] = {IP};
const byte bPort = 80;

EthernetServer server(80);

char c,cMstRecentCmnd='/';

char cLineBuffer[MaxArrayElement];
byte bPlaceInBuffer;

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  }


void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);

    //Serial.print(" F: ");
    //Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop()

{
  delay(2000);
   Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
 
 
  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  Serial.print("Outside temperature is: ");
  printTemperature(outsideThermometer);
  Serial.print("\n\r\n\r");

EthernetClient client = server.available();
  if (client) {//2
    boolean currentLineIsBlank = true;//3
    bPlaceInBuffer=0;
    char cCmnd='H';
     cMstRecentCmnd='H';

    while (client.connected()) {//4
      if (client.available()) {//5
         c = client.read();//6
         if ((c!='\n') && (c!='\r')){
           cLineBuffer[bPlaceInBuffer]=c;
           if (bPlaceInBuffer<MaxArrayElement) {bPlaceInBuffer++;};
           }
            client.println();//10
            client.println("<html>");
            client.println("<head>");
            client.print("<title>ArduinoTemperatur-1Wire</title>");
            client.println("</head>");
            client.println("</head>");
            client.println();
            client.println("<body>");
            client.println("<center>");
            client.print("<h2>Temperatur: Messergebnisse");
            client.println("</h2>");
            client.println("</center>");
            client.println();
            client.println("<br>");
           
              DeviceAddress insideThermometer = { 0x10, 0x55, 0xF2, 0x56, 0x02, 0x08, 0x00, 0xF3 };
              DeviceAddress outsideThermometer = { 0x10, 0xB5, 0xDB, 0x56, 0x02, 0x08, 0x00, 0xD1 };
              float tempI = sensors.getTempC(insideThermometer);
              float tempA = sensors.getTempC(outsideThermometer);
             
               client.println("<center><b>");
               client.print("<br>Temperatur, innen C: <b>");
               client.print(tempI);
               client.print("<br>");
               client.println("<center>");
               client.print("<br>Temperatur, aussen C: <b>");
               client.print(tempA);
      }
          client.println("</body>");
          client.println("</html>");

          break;//15
         }
     delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

pylon

Bitte korrigiere Deinen Post und mache Code-Tags (#-Knopf im Formular) um die Code-Teile.


Alex_85

Hallo zusammen,

ich suche nach einer Möglichkeit Temperaturdaten, welche von DS1820 1-Wire Sensoren erfasst und an ein Arduino Ethernet Board übermittelt werden in FHEM einzubinden.
Mir fehlt momentan der passende Sketch für das Arduino.
Was ich bereits habe ist die Temperaturübermittlung der Daten der DS1820 an das Arduino (webinterface + serial monitor). (das funktioniert einwandfrei)

Ich habe bereits etwas gefunden, was das ganze ermöglichen sollte:
18_WBS.pm und 99_CGI_RAWMSG.pm (FHEM-Module)
Das ganze soll dann über Web Based Sensors in FHEM erfasst werden. ->In Kombination der beiden Module soll man Sensordaten per HTTP-Aufruf bei FHEM abgeben können.

siehe hierzu:https://groups.google.com/forum/?fromgroups#!searchin/fhem-users/web$20based$20sensors/fhem-users/hYfsCOw837E/BcPU_OHCCdgJ

Falls jemand eine andere Möglichkeit kennt / bereits umgesetzt hat - Ich bin da nicht auf die oben genannte Lösung fixiert.
Mein Ziel ist einfach nur die Temperaturdaten in FHEM in einem logfile zu haben... :-)
Kann hier jemand weiterhelfen (Arduino Sketch)?!

Hardware & Software:
•Arduino Ethernet (WizNet W5100 TCP/IP-Ethernet-Controller)
•Temperatur-Sensor Hygrosens Temp.-Sensor DS 1820-BT
•Fhem 5.2 (DEVELOPMENT), $Id: fhem.pl 1996 2012-10-20 07:11:56Z

Der Sketch bisher:

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include "time.h"
#include "OneWire.h"
#include "DallasTemperature.h"


#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { <DEVICE-ADRESS-1> };
DeviceAddress outsideThermometer = { <DEVICE-ADRESS-2> };

const byte MaxArrayElement=252;

byte mac[] = { MAC };
byte ip[] = {IP};
const byte bPort = 80;

EthernetServer server(80);

char c,cMstRecentCmnd='/';

char cLineBuffer[MaxArrayElement];
byte bPlaceInBuffer;

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  }


void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);

    //Serial.print(" F: ");
    //Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop()

{
  delay(2000);
   Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
 
 
  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  Serial.print("Outside temperature is: ");
  printTemperature(outsideThermometer);
  Serial.print("\n\r\n\r");

EthernetClient client = server.available();
  if (client) {//2
    boolean currentLineIsBlank = true;//3
    bPlaceInBuffer=0;
    char cCmnd='H';
     cMstRecentCmnd='H';

    while (client.connected()) {//4
      if (client.available()) {//5
         c = client.read();//6
         if ((c!='\n') && (c!='\r')){
           cLineBuffer[bPlaceInBuffer]=c;
           if (bPlaceInBuffer<MaxArrayElement) {bPlaceInBuffer++;};
           }
            client.println();//10
            client.println("<html>");
            client.println("<head>");
            client.print("<title>ArduinoTemperatur-1Wire</title>");
            client.println("</head>");
            client.println("</head>");
            client.println();
            client.println("<body>");
            client.println("<center>");
            client.print("<h2>Temperatur: Messergebnisse");
            client.println("</h2>");
            client.println("</center>");
            client.println();
            client.println("<br>");
           
              DeviceAddress insideThermometer = { 0x10, 0x55, 0xF2, 0x56, 0x02, 0x08, 0x00, 0xF3 };
              DeviceAddress outsideThermometer = { 0x10, 0xB5, 0xDB, 0x56, 0x02, 0x08, 0x00, 0xD1 };
              float tempI = sensors.getTempC(insideThermometer);
              float tempA = sensors.getTempC(outsideThermometer);
             
               client.println("<center><b>");
               client.print("<br>Temperatur, innen C: <b>");
               client.print(tempI);
               client.print("<br>");
               client.println("<center>");
               client.print("<br>Temperatur, aussen C: <b>");
               client.print(tempA);
      }
          client.println("</body>");
          client.println("</html>");

          break;//15
         }
     delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

pylon

Das WBS-Plugin erwartet die Sensor-Werte per Web eingeliefert, es holt sie nicht beim Arduino ab.
Somit ist hier nicht das Webserver-Beispiel gefragt, sondern das Web-Client-Beispiel.

Die Beispiel-URL aus dem WBS-Script spricht hier deutliche Worte:

http://[MY_FHEMWEB:xxxx]/fhem/rawmsg?WBS:1032D8ED01080011:23.32

Die gute Nachricht für Dich: das dürfte wesentlich einfach sein, als ein bestimmtes Verhalten als Webserver zu imitieren.

Alex_85

Ok, also das ganze in einen WebClient umwandeln...
Trotzdem fehlt mir noch der (Arduino-) Code zum senden der Daten an FHEM.
Das ist momentan der Hauptknackpunkt...

pylon

Also: nimm den Web-Client-Code, ändere die URL in diejenige aus meinem letzten Post, wobei Du natürlich die ID anpassen und die Temperatur am Schluss durch den Messwert ersetzen musst. Versuche das mal, wenn Du auf Probleme stösst, poste Deinen Code und wir versuchen Dir zu helfen.

Alex_85

Naja, genau da liegt das Problem.

Ich kann im WebClient die IP angeben: 192.168.2.1
wie implementiere ich die URL die gefordert wird? Das entspricht momentan : http://192.168.2.1:8083/fhem/rawmsg

das hier ist der FHEM Code dafür:
define W01 WBS temperature 1234
define FileLog_W01 FileLog ./log/W01-%Y.log W01
attr FileLog_W01 logtype text

welchen Code brauche ich dafür, damit das Arduino als Web Client dahin die Temperaturdaten übermittelt?!
Die Syntax dafür ist genau mein Problem :-)
Ich denke so langsam daran, dass es sinnvoller wäre einfach Homematic Temperatursensoren zu kaufen und diese einzubinden... Das ist bedeutend einfacher (leider aber auch teurer)

pylon

Damit hast Du doch schon praktisch alles:

IP: 192.168.2.1
Port: 8083
GET-Path: /fhem/rawmsg?WSB:1234:XXX.XX

Du musst jetzt nur noch die XXX.XX durch die Temperatur ersetzen und das in das WebClient-Beispiel einbauen.

Wir helfen Dir hier, aber wir schreiben nicht den ganzen Code für Dich.

Alex_85

Hallo pylon,

ich stand bissl aufm Schlauch. Hätte mir das WebClient Beispiel mal genauer anschauen sollen, dann ist wirklich alles zimelich klar. :-)
Ich habe es mal ganz simpel mit dem WebClient-Code getestet:

Code: [Select]

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


byte mac[] = { MAC (Client) }; //MAC des WebClients
byte ip[] = { IP (Client) }; //IP-Adresse des WebClients
byte server[] = { IP (Server) }; // FHEM-Server

EthernetClient client;

void setup()
{
   Ethernet.begin(mac, ip);
   Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 8083)) {
     Serial.println("connected");
     client.println("GET /fhem/rawmsg?WBS:1234:18.00");
     //client.println("GET /fhem/rawmsg?WBS:1234:XXX.XX");
     client.println();
   } else {
     Serial.println("connection failed");
   }
}

void loop()
{
   if (client.available()) {
     char c = client.read();
     Serial.print(c);
   }

  if (!client.connected()) {
     Serial.println();
     Serial.println("disconnecting.");
     client.stop();
     for(;;)
       ;
   }
}



und siehe da, in meinem FHEM Logfile kommt folgendes an:
2012-10-29_11:49:06 W01 temperature:18.00

Danke für deine Hilfe!

Gruß,
Alex

Go Up