1-wire kostengünstig an Homematic

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

g60vx
Beiträge: 170
Registriert: 16.04.2015, 21:48
Hat sich bedankt: 12 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von g60vx » 01.10.2017, 18:49

So ich habe nun alles aufgebaut und installiert. Die Sensoren werden im Serialmonitor erkannt nur die Temperatur ist immer 0.0

Anbei die Ausgabe vom Serialmonitor:

Code: Alles auswählen

Gefundene Sensoren
 28 FF 2 50 A4 16 4 5C 0 40 78 C2 Wert: 0.00
(⸮P⸮\ Wert: 0.00
⸮⸮?⸮⸮⸮?ZF @ Wert: 0.00

Definierte Sensoren:

Nicht definierte Sensoren:
 28 FF 2 50 A4 16 4 5C 0 40 78 C2 Wert: 0.00
(⸮P⸮\ Wert: 0.00
000:01:00  Zeitintervall erreicht: 
StrSensor: HKV_EG_VL und Sensor: Sensor1
StrSensor: HKV_EG_RL und Sensor: Sensor2
StrSensor: HK_EG_1 und Sensor: Sensor3
StrSensor: HK_EG_2 und Sensor: Sensor4
StrSensor: HK_EG_3 und Sensor: Sensor5
StrSensor: HK_EG_4 und Sensor: Sensor6
StrSensor: HK_EG_5 und Sensor: Sensor7
StrSensor: HK_EG_6 und Sensor: Sensor8
StrSensor: HK_EG_7 und Sensor: Sensor9
StrSensor: HK_EG_8 und Sensor: Sensor10
StrSensor: HK_EG_9 und Sensor: Sensor11
StrSensor: HK_EG_10 und Sensor: Sensor12
Und mein geändertes Sketch.Ich habe natürlich scon versucht es auf die 12bit Sensoren umzustellen aber mit wenig erfolg. Habt ihr noch tips wo ich was anpassen muss?

Code: Alles auswählen

#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Umlaute.h>
#include <DallasTemperature.h>


// DS18S20 Temperaturchip i/o
OneWire ds(D1);  // an pin D1

//Hier die Adressen von den Sensoren eingeben



#define HKV_EG_VL     "28 FF 2 50 A4 16 4 5C E8 92 FE 3F"  //Dies sind nur Beispiele, Wichtig hier keine Umlaute verwenden
#define HKV_EG_RL     ""
#define HK_EG_1       ""
#define HK_EG_2       ""
#define HK_EG_3       ""
#define HK_EG_4       ""
#define HK_EG_5       ""
#define HK_EG_6       ""
#define HK_EG_7       ""
#define HK_EG_8       ""
#define HK_EG_9       ""
#define HK_EG_10      ""

#define SENSOR1 HKV_EG_VL     //Dies sind nur Beispiele, Wichtig hier keine Umlaute verwenden
#define SENSOR2 HKV_EG_RL
#define SENSOR3 HK_EG_1
#define SENSOR4 HK_EG_2
#define SENSOR5 HK_EG_3
#define SENSOR6 HK_EG_4
#define SENSOR7 HK_EG_5
#define SENSOR8 HK_EG_6
#define SENSOR9 HK_EG_7
#define SENSOR10 HK_EG_8
#define SENSOR11 HK_EG_9
#define SENSOR12 HK_EG_10

// Einstellungen für Messungen und Meldungen
#define ZEITINTERVALL_MESSUNGEN 10       //Abfragezyklus der Sensoren in Sekunden
#define ZEITINTERVALL_MELDUNGEN 60       //Sendeintervall an die Homematic in Sekunden
#define DELTA_TEMPERATURSCHWELLWERT 1    //Temperaturdifferenz zum senden an die Homematic in °C


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "Skynet";                                        // SSID des vorhandenen WLANs
const char* password = "";                           // Passwort für das vorhandene WLAN
IPAddress gateway(192, 168, 1, 1);                                  // IP-Adresse des WLAN-Gateways
IPAddress subnet(255, 255, 255, 0);                                 // Subnetzmaske
IPAddress ip(192, 168, 1, 8);                                       // feste IP-Adresse für den WeMos
const char* host = "192.168.1.5";                                   // IP-Adresse der CCU
ESP8266WebServer server(80);                                        // Webserver initialisieren auf Port 80
// convert String object from UTF8 String to Extended ASCII


void MeldeWert(char* Sensor, float Temp)
{
  String strSensor;
  if (Contains(Sensor, "Sensor1")) strSensor = "HKV_EG_VL";         //hier dürfen auch Umlaute (ä,ü,ö) verwendet werden, das sind die Systemvariablen für die Homematic
  if (Contains(Sensor, "Sensor2")) strSensor = "HKV_EG_RL";
  if (Contains(Sensor, "Sensor3")) strSensor = "HK_EG_1";
  if (Contains(Sensor, "Sensor4")) strSensor = "HK_EG_2";
  if (Contains(Sensor, "Sensor5")) strSensor = "HK_EG_3";
  if (Contains(Sensor, "Sensor6")) strSensor = "HK_EG_4";
  if (Contains(Sensor, "Sensor7")) strSensor = "HK_EG_5";
  if (Contains(Sensor, "Sensor8")) strSensor = "HK_EG_6";
  if (Contains(Sensor, "Sensor9")) strSensor = "HK_EG_7";
  if (Contains(Sensor, "Sensor10")) strSensor = "HK_EG_8";
  if (Contains(Sensor, "Sensor11")) strSensor = "HK_EG_9";
  if (Contains(Sensor, "Sensor12")) strSensor = "HK_EG_10";
  strSensor = utf8ascii(strSensor);
  Serial.println("StrSensor: " + strSensor + " und " + "Sensor: " + Sensor);
  String meldung = "";
  WiFiClient client;                                                // Webclient initialisieren
  if (!client.connect(host, 8181)) {                                // mit dem CCU-Port 8181 verbinden
    Serial.println("  Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
    delay(50);
    return;
  }
  meldung = meldung + "GET /eriwan.exe?befehl=dom.GetObject('" + strSensor + "').State('" + Temp + "')";
  meldung = meldung + " HTTP/1.1\r\n" + "Host: " + host + ":8181"  + "\r\n" +  "Connection: close\r\n\r\n";
  client.print(meldung);                                            // Daten an CCU melden
}




char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN;       //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN;       // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT;                      // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};


String zeitstempel()
{ // Betriebszeit als Stunde:Minute:Sekunde
  char stempel[10];
  int lfdStunden = millis() / 3600000;
  int lfdMinuten = millis() / 60000 - lfdStunden * 60;
  int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
  sprintf (stempel, "%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
  return stempel;
}


void WLANVerbindung()
{
  // WLAN-Verbindung herstellen
  WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
  WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau");


  Serial.println("erfolgreich!");
  Serial.println("");
  Serial.print("Verbunden mit: ");
  Serial.println(ssid);
  Serial.print("Signalstaerke: ");
  int rssi = WiFi.RSSI();
  Serial.print(rssi);
  Serial.println(" dBm");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  sprintf(ConnectString, "</br></br>Verbunden mit: %s </br>Signalstaerke: %d dBm  </br></br>", ssid, rssi);

  server.on("/", Hauptseite);
  // HTTP-Server starten
  server.begin();
}

void setup(void)
{
  // inputs/outputs initialisieren
  // seriellen port starten
  Serial.begin(9600);
  //ListSensors();
  WLANVerbindung();
}
bool Contains(String s, String search)
{
  int max = s.length() - search.length();

  for (int i = 0; i <= max; i++) {
    if (s.substring(i) == search) return true; // or i
  }

  return false; //or -1
}



void ListSensors(void)
{
  int count = 0, i = 0;
  byte addr[12];
  float Temp = 0.0;

  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 12; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr[i]);
    }
    count++;
  }
  Antwort += "Gefundene Sensoren \n</br>";
  Serial.print("\nGefundene Sensoren\n");
  for (count = 0; count < 12; count++)
  {
    if (strcmp(Adress[count], ""))
    {
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
    }
  }

  Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Definierte Sensoren:\n</br>";
  Serial.print("Definierte Sensoren:\n");

  for (count = 0; count < 12; count++)
  {
    if (Contains(Adress[count], SENSOR1) && strcmp(Adress[count], "") && strcmp(SENSOR1, ""))
    {
      Antwort += "SENSOR1: ";
      Serial.print("SENSOR1: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor1", Temp);

      OldTemp[0] = NewTemp[0];
      NewTemp[0] = Temp;
      if (OldTemp[0] == -255) OldTemp[0] = Temp;
    }
    else if (Contains(Adress[count], SENSOR2) && strcmp(Adress[count], "") && strcmp(SENSOR2, ""))
    {
      Antwort += "SENSOR2: ";
      Serial.print("SENSOR2: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor2", Temp);
      OldTemp[1] = NewTemp[1];
      NewTemp[1] = Temp;
      if (OldTemp[1] == -255) OldTemp[1] = Temp;
    }
    else if (Contains(Adress[count], SENSOR3) && strcmp(Adress[count], "") && strcmp(SENSOR3, ""))
    {
      Antwort += "SENSOR3: ";
      Serial.print("SENSOR3: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor3", Temp);
      OldTemp[2] = NewTemp[2];
      NewTemp[2] = Temp;
      if (OldTemp[2] == -255) OldTemp[2] = Temp;
    }
    else if (Contains(Adress[count], SENSOR4) && strcmp(Adress[count], "") && strcmp(SENSOR4, ""))
    {
      Antwort += "SENSOR4: ";
      Serial.print("SENSOR4: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor4", Temp);
      OldTemp[3] = NewTemp[3];
      NewTemp[3] = Temp;
      if (OldTemp[3] == -255) OldTemp[3] = Temp;
    }
    else if (Contains(Adress[count], SENSOR5) && strcmp(Adress[count], "") && strcmp(SENSOR5, ""))
    {
      Antwort += "SENSOR5: ";
      Serial.print("SENSOR5: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor5", Temp);
      OldTemp[4] = NewTemp[4];
      NewTemp[4] = Temp;
      if (OldTemp[4] == -255) OldTemp[4] = Temp;
    }
    else if (Contains(Adress[count], SENSOR6) && strcmp(Adress[count], "") && strcmp(SENSOR6, ""))
    {
      Antwort += "SENSOR6: ";
      Serial.print("SENSOR6: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor6", Temp);
      OldTemp[5] = NewTemp[5];
      NewTemp[5] = Temp;
      if (OldTemp[5] == -255) OldTemp[5] = Temp;
    }
    else if (Contains(Adress[count], SENSOR7) && strcmp(Adress[count], "") && strcmp(SENSOR7, ""))
    {
      Antwort += "SENSOR7: ";
      Serial.print("SENSOR7: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor7", Temp);
      OldTemp[6] = NewTemp[6];
      NewTemp[6] = Temp;
      if (OldTemp[6] == -255) OldTemp[6] = Temp;
    }
    else if (Contains(Adress[count], SENSOR8) && strcmp(Adress[count], "") && strcmp(SENSOR8, ""))
    {
      Antwort += "SENSOR8: ";
      Serial.print("SENSOR8: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor8", Temp);
      OldTemp[7] = NewTemp[7];
      NewTemp[7] = Temp;
      if (OldTemp[7] == -255) OldTemp[7] = Temp;
    }
    else if (Contains(Adress[count], SENSOR9) && strcmp(Adress[count], "") && strcmp(SENSOR9, ""))
    {
      Antwort += "SENSOR9: ";
      Serial.print("SENSOR9: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor9", Temp);
      OldTemp[8] = NewTemp[8];
      NewTemp[8] = Temp;
      if (OldTemp[8] == -255) OldTemp[8] = Temp;
    }
    else if (Contains(Adress[count], SENSOR10) && strcmp(Adress[count], "") && strcmp(SENSOR10, ""))
    {
      Antwort += "SENSOR10: ";
      Serial.print("SENSOR10: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor10", Temp);
      OldTemp[9] = NewTemp[9];
      NewTemp[9] = Temp;
      if (OldTemp[9] == -255) OldTemp[9] = Temp;
    }
    else if (Contains(Adress[count], SENSOR11) && strcmp(Adress[count], "") && strcmp(SENSOR11, ""))
    {
      Antwort += "SENSOR11: ";
      Serial.print("SENSOR11: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor11", Temp);
      OldTemp[10] = NewTemp[10];
      NewTemp[10] = Temp;
      if (OldTemp[10] == -255) OldTemp[10] = Temp;
    }
    else if (Contains(Adress[count], SENSOR12) && strcmp(Adress[count], "") && strcmp(SENSOR12, ""))
    {
      Antwort += "SENSOR12: ";
      Serial.print("SENSOR12: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor12", Temp);
      OldTemp[11] = NewTemp[11];
      NewTemp[11] = Temp;
      if (OldTemp[11] == -255) OldTemp[11] = Temp;
    }
  }

  Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Nicht definierte Sensoren:\n</br>";
  Serial.print("Nicht definierte Sensoren:\n");

  for (count = 0; count < 12; count++)
  {
    //Serial.print(Adress[count]);
    if (!(Contains(Adress[count], SENSOR1) && strcmp(SENSOR1, "")) &&
        !(Contains(Adress[count], SENSOR2) && strcmp(SENSOR2, "")) &&
        !(Contains(Adress[count], SENSOR3) && strcmp(SENSOR3, "")) &&
        !(Contains(Adress[count], SENSOR4) && strcmp(SENSOR4, "")) &&
        !(Contains(Adress[count], SENSOR5) && strcmp(SENSOR5, "")) &&
        !(Contains(Adress[count], SENSOR6) && strcmp(SENSOR6, "")) &&
        !(Contains(Adress[count], SENSOR7) && strcmp(SENSOR7, "")) &&
        !(Contains(Adress[count], SENSOR8) && strcmp(SENSOR8, "")) &&
        !(Contains(Adress[count], SENSOR9) && strcmp(SENSOR9, "")) &&
        !(Contains(Adress[count], SENSOR10) && strcmp(SENSOR10, "")) &&
        !(Contains(Adress[count], SENSOR11) && strcmp(SENSOR11, "")) &&
        !(Contains(Adress[count], SENSOR12) && strcmp(SENSOR12, "")))
    {
      if (strcmp(Adress[count], ""))
      {
        Antwort += Adress[count];
        Serial.print(Adress[count]);
        Antwort += " Wert: ";
        Serial.print(" Wert: ");
        Temp = GetRoomTemperature(Adress[count], true);
        Antwort += Temp;
        Serial.print(Temp);
        Antwort += "\n</br>";
        Serial.print("\n");
      }
    }
  }
  letzteMessungMillis = jetztMillis;
  ds.reset_search();
}

void Hauptseite()
{
  Antwort = "";


  Antwort += "<meta http-equiv='refresh' content='60'/>";
  ListSensors();
  Antwort += ConnectString;
  //Antwort += "</body></html>";

  server.send ( 300, "text/html", Antwort );
  delay(100);

  //server.send(300, "text/plain", Antwort);
  //delay(150);
}

float GetRoomTemperature(char adress[255], bool doreset)
{
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i, present = 0, data[12], addr[8];
  char stradd[255];
  while (ds.search(addr))
  {
    sprintf(stradd, "");
    //Serial.print("\nR=");
    for ( i = 0; i < 12; i++)
    {
      sprintf(stradd, "%s %X", stradd, addr[i]);
    }
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1);        // start Konvertierung, mit power-on am Ende

    delay(50);     // 750ms sollten ausreichen
    // man sollte ein ds.depower() hier machen, aber ein reset tut das auch

    present = ds.reset();
    ds.select(addr);
    ds.write(0xBE);         // Wert lesen

    for ( i = 0; i < 12; i++)
    {
      // 9 bytes
      data[i] = ds.read();
    }

    if (Contains(stradd, adress))
    {
      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // test most sig bit

      if (SignBit) // negative
      {
        TReading = (TReading ^ 0xffff) + 1; // 2's comp
      }
      Tc_100 = (TReading * 100 / 2); // mal (100 * 0.0625) oder 6.25
      /* Für DS18S20 folgendes verwenden Tc_100 = (TReading*100/2);    */
      Whole = Tc_100 / 100;  // Ganzzahlen und Brüche trennen
      Fract = Tc_100 % 100;

      if (SignBit) // negative Werte ermitteln
      {
        //Serial.print("-");
      }


      if (doreset)ds.reset_search();
      return (float)Whole + ((float)Fract / 100);
    }
  }
}
char Sensor[16];
void loop(void)
{
  server.handleClient(); // auf HTTP-Anfragen warten

  jetztMillis = millis();

  // neue Messung falls Zeitintervall erreicht
  if (jetztMillis - letzteMessungMillis > deltaMessungMillis)
  {
    ListSensors();
  }

  for (int c = 0; c < 12; c++)
  {
    if (deltaTemp != 0 && abs(OldTemp[c] - NewTemp[c]) > deltaTemp)
    {
      Serial.print("Temperaturänderung bei Sensor: ");
      Serial.print(c + 1);
      Serial.print(" erreicht.");
      OldTemp[c] = NewTemp[c];
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }

  // neue Meldung an die CCU falls Zeitintervall erreicht
  if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis)
  {
    Serial.print(zeitstempel() + "  Zeitintervall erreicht: \n");
    letzteMeldungMillis = jetztMillis;
    //melde_CCU();

    for (int c = 0; c < 12; c++)
    {
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }
}

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von dondaik » 01.10.2017, 18:59

was sagt den das testprge aus den Beispielen zum sensor ?
- erkennen der sn - nummern und der Temperatur ...
Daten hätten da sein sollen und wenn an falschen stellen ;-)


im prg schaue ich gerade.... den zähler
mag sein das die letzten beiden werte um 2 Felder erhät werden müssen ...da wo der Inhalt -255 ist suche ich gerade ( Vari. max ? )

da dürfte der "trick" sein - die 12 auf 14 und [13][13] nach muster 10/11 befüllen und 10/11 wie die Vorgänger


byte addr[12];
  float Temp = 0.0;

  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 12; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr);
    }
    count++;
  }
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

g60vx
Beiträge: 170
Registriert: 16.04.2015, 21:48
Hat sich bedankt: 12 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von g60vx » 01.10.2017, 19:52

dondaik hat geschrieben:was sagt den das testprge aus den Beispielen zum sensor ?
- erkennen der sn - nummern und der Temperatur ...
Daten hätten da sein sollen und wenn an falschen stellen ;-)

Code: Alles auswählen

ROM = 28 FF 2 50 A4 16 4 5C
  Chip = DS18B20
  Data = 1 65 1 4B 46 7F FF C 10 42  CRC=42
  Temperature = 22.31 Celsius, 72.16 Fahrenheit
No more addresses.
dondaik hat geschrieben:im prg schaue ich gerade.... den zähler
mag sein das die letzten beiden werte um 2 Felder erhät werden müssen ...da wo der Inhalt -255 ist suche ich gerade ( Vari. max ? )
das verstehe ich leider nicht, wo und was ;) behandel mich bitte wie ein SuperDAU, das sind meine ersten Schritte
dondaik hat geschrieben:da dürfte der "trick" sein - die 12 auf 14 und [13][13] nach muster 10/11 befüllen und 10/11 wie die Vorgänger
hier weiß ich auch nicht wo und was du meinst.
dondaik hat geschrieben:byte addr[12];
  float Temp = 0.0;

  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 12; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr);
    }
    count++;
  }

Hab ich gemacht kommt das Ergebnis:

Code: Alles auswählen

Gefundene Sensoren
 28 FF 2 50 A4 16 4 5C EF FE 26 1F Wert: 0.00
(⸮P⸮\⸮⸮& @0 Wert: 0.00
⸮⸮⸮&⸮?) @ Wert: 0.00

Definierte Sensoren:

Nicht definierte Sensoren:
 28 FF 2 50 A4 16 4 5C EF FE 26 1F Wert: 0.00
(⸮P⸮\⸮⸮& @ Wert: 0.00

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von dondaik » 01.10.2017, 20:35

machen wir mal langsam... dann trage erst einmal in alle variablen den einen namen für die sensor ein ...
und erhöhe diese wie beschrieben - dann sehen wir weiter.
( bin im Moment nicht in der lage es im text zu zeigen da der rechner out off order ist )
die 12 beschreibt die max anzahl von variablen ist könnten aber 12 + 2 "dummys sein also 14

hoffe christianm meldet sich .. :-)
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

g60vx
Beiträge: 170
Registriert: 16.04.2015, 21:48
Hat sich bedankt: 12 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von g60vx » 02.10.2017, 00:51

Ich habe alle Änderungen Schritt für Schritt rückgängig gemacht, dabei ist mir aufgefallen das ich die Temperaturberechnung beim float für DS18S20 geändert hatte. Nach der Änderung sind alle Sensoren im Seriellenmonitor und in Homematic bis ich Sensor 11 anschließe, danach wird Sensor 2 nicht mehr erkannt. Woran liegt das?

Code: Alles auswählen

Gefundene Sensoren
 28 FF 90 4F A4 16 4 CA Wert: 22.93
 28 FF 88 86 A4 16 4 22 Wert: 22.68
 28 FF 9C 4D A4 16 4 EC Wert: 22.68
 28 FF 5C 86 A4 16 4 63 Wert: 23.12
 28 FF DC 4F A4 16 4 2 Wert: 22.43
 28 FF 2 50 A4 16 4 5C Wert: 22.62
 28 FF 16 3B A4 16 4 3B Wert: 22.43
 28 FF 76 AD A4 16 5 9C Wert: 22.43
 28 FF 5D 87 A4 16 4 21 Wert: 22.50
 28 FF 43 31 A4 16 4 67 Wert: 22.50

Definierte Sensoren:
SENSOR10:  28 FF 90 4F A4 16 4 CA Wert: 23.00
SENSOR8:  28 FF 88 86 A4 16 4 22 Wert: 22.68
SENSOR4:  28 FF 9C 4D A4 16 4 EC Wert: 22.68
SENSOR9:  28 FF 5C 86 A4 16 4 63 Wert: 23.12
SENSOR6:  28 FF DC 4F A4 16 4 2 Wert: 22.50
SENSOR1:  28 FF 2 50 A4 16 4 5C Wert: 22.62
SENSOR7:  28 FF 16 3B A4 16 4 3B Wert: 22.43
SENSOR5:  28 FF 76 AD A4 16 5 9C Wert: 22.43
SENSOR3:  28 FF 5D 87 A4 16 4 21 Wert: 22.50
SENSOR2:  28 FF 43 31 A4 16 4 67 Wert: 22.50

Nicht definierte Sensoren:
Temperaturänderung bei Sensor: 1 erreicht.StrSensor: HKV_EG_VL und Sensor: Sensor1
Temperaturänderung bei Sensor: 11 erreicht.StrSensor: HK_EG_9 und Sensor: Sensor11

Gefundene Sensoren
 28 FF 90 4F A4 16 4 CA Wert: 23.00
 28 FF 50 AD A4 16 5 F8 Wert: 22.56
 28 FF 88 86 A4 16 4 22 Wert: 22.68
 28 FF 9C 4D A4 16 4 EC Wert: 22.68
 28 FF 5C 86 A4 16 4 63 Wert: 23.18
 28 FF DC 4F A4 16 4 2 Wert: 22.43
 28 FF 2 50 A4 16 4 5C Wert: 22.62
 28 FF 16 3B A4 16 4 3B Wert: 22.43
 28 FF 76 AD A4 16 5 9C Wert: 22.43
 28 FF 5D 87 A4 16 4 21 Wert: 22.50
 28 FF 43 31 A4 16 4 67 Wert: 22.50

Definierte Sensoren:
SENSOR10:  28 FF 90 4F A4 16 4 CA Wert: 23.00
SENSOR11:  28 FF 50 AD A4 16 5 F8 Wert: 22.56
SENSOR8:  28 FF 88 86 A4 16 4 22 Wert: 22.68
SENSOR4:  28 FF 9C 4D A4 16 4 EC Wert: 22.68
SENSOR9:  28 FF 5C 86 A4 16 4 63 Wert: 23.18
SENSOR6:  28 FF DC 4F A4 16 4 2 Wert: 22.43
SENSOR1:  28 FF 2 50 A4 16 4 5C Wert: 22.62
SENSOR7:  28 FF 16 3B A4 16 4 3B Wert: 22.43
SENSOR5:  28 FF 76 AD A4 16 5 9C Wert: 22.43
SENSOR3:  28 FF 5D 87 A4 16 4 21 Wert: 22.50

Nicht definierte Sensoren:
 2 Wert: 22.43
Alle Sensoren liegen recht nahe beieinander, könnte man beim Sensor 10 und 9 den Offset anpassen?

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von dondaik » 02.10.2017, 06:52

da wird der zähler für die anzahl der sensoren noch erhöht werden müssen.
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

g60vx
Beiträge: 170
Registriert: 16.04.2015, 21:48
Hat sich bedankt: 12 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von g60vx » 02.10.2017, 12:46

So heute auf ein Neues :lol:
Ich habe mal versucht an den Stellen zu drehen wo ich denke die Anzahl der Sensoren zu erhöhen.
Als erstes insgesamt 11 Sensoren definiert:

Code: Alles auswählen

#define HKV_EG_VL     "28 FF 2 50 A4 16 4 5C"  //Dies sind nur Beispiele, Wichtig hier keine Umlaute verwenden
#define HKV_EG_RL     "28 FF 43 31 A4 16 4 67"
#define HK_EG_1       "28 FF 5D 87 A4 16 4 21"
#define HK_EG_2       "28 FF 9C 4D A4 16 4 EC"
#define HK_EG_3       "28 FF 76 AD A4 16 5 9C"
#define HK_EG_4       "28 FF DC 4F A4 16 4 2"
#define HK_EG_5       "28 FF 16 3B A4 16 4 3B"
#define HK_EG_6       "28 FF 88 86 A4 16 4 22"
#define HK_EG_7       "28 FF 5C 86 A4 16 4 63"
#define HK_EG_8       "28 FF 90 4F A4 16 4 CA"
#define HK_EG_9       "28 FF 50 AD A4 16 5 F8"         //Sensor 11
//#define HK_EG_10      ""
//#define HK_EG_11      ""
//#define HK_EG_12      ""

#define SENSOR1 HKV_EG_VL     //Dies sind nur Beispiele, Wichtig hier keine Umlaute verwenden
#define SENSOR2 HKV_EG_RL
#define SENSOR3 HK_EG_1
#define SENSOR4 HK_EG_2
#define SENSOR5 HK_EG_3
#define SENSOR6 HK_EG_4
#define SENSOR7 HK_EG_5
#define SENSOR8 HK_EG_6
#define SENSOR9 HK_EG_7
#define SENSOR10 HK_EG_8
#define SENSOR11 HK_EG_9      //Sensor 11
//#define SENSOR12 HK_EG_10
//#define SENSOR13 HK_EG_11
//#define SENSOR14 HK_EG_12

void MeldeWert(char* Sensor, float Temp)
{
  String strSensor;
  if (Contains(Sensor, "Sensor1")) strSensor = "HKV_EG_VL";         //hier dürfen auch Umlaute (ä,ü,ö) verwendet werden, das sind die Systemvariablen für die Homematic
  if (Contains(Sensor, "Sensor2")) strSensor = "HKV_EG_RL";
  if (Contains(Sensor, "Sensor3")) strSensor = "HK_EG_1";
  if (Contains(Sensor, "Sensor4")) strSensor = "HK_EG_2";
  if (Contains(Sensor, "Sensor5")) strSensor = "HK_EG_3";
  if (Contains(Sensor, "Sensor6")) strSensor = "HK_EG_4";
  if (Contains(Sensor, "Sensor7")) strSensor = "HK_EG_5";
  if (Contains(Sensor, "Sensor8")) strSensor = "HK_EG_6";
  if (Contains(Sensor, "Sensor9")) strSensor = "HK_EG_7";
  if (Contains(Sensor, "Sensor10")) strSensor = "HK_EG_8";
  if (Contains(Sensor, "Sensor11")) strSensor = "HK_EG_9";         //Sensor 11
  //if (Contains(Sensor, "Sensor12")) strSensor = "HK_EG_10";
  //if (Contains(Sensor, "Sensor13")) strSensor = "HK_EG_11";
  //if (Contains(Sensor, "Sensor14")) strSensor = "HK_EG_12";
Muss hier noch was angepasst werden?

Code: Alles auswählen

char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT; // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};     //10>11?
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};       //10>11
Hier habe ich von 10 auf 11 erhöht, count 11. Muss hier auch die char Address angepasst werden?

Code: Alles auswählen

void ListSensors(void)
{
  int count = 0, i = 0;
  byte addr[8];
  float Temp = 0.0;

[color=#FF0000]  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};[/color]
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 8; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr[i]);
    }
    count++;
  }
  Antwort += "Gefundene Sensoren \n</br>";
  Serial.print("\nGefundene Sensoren\n");
  for (count = 0; count < 11; count++)
  .
  .
  .
  Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Definierte Sensoren:\n</br>";
  Serial.print("Definierte Sensoren:\n");

  for (count = 0; count < 11; count++)
    else if (Contains(Adress[count], SENSOR11) && strcmp(Adress[count], "") && strcmp(SENSOR11, ""))
    {
      Antwort += "SENSOR11: ";
      Serial.print("SENSOR11: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n</br>";
      Serial.print("\n");
      //MeldeWert("Sensor11", Temp);
      OldTemp[10] = NewTemp[10];
      NewTemp[10] = Temp;
      if (OldTemp[10] == -255) OldTemp[10] = Temp;
    }

Code: Alles auswählen

  Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Nicht definierte Sensoren:\n</br>";
  Serial.print("Nicht definierte Sensoren:\n");

  for (count = 0; count < 11; count++)
  {
    //Serial.print(Adress[count]);
    if (!(Contains(Adress[count], SENSOR1) && strcmp(SENSOR1, "")) &&
        !(Contains(Adress[count], SENSOR2) && strcmp(SENSOR2, "")) &&
        !(Contains(Adress[count], SENSOR3) && strcmp(SENSOR3, "")) &&
        !(Contains(Adress[count], SENSOR4) && strcmp(SENSOR4, "")) &&
        !(Contains(Adress[count], SENSOR5) && strcmp(SENSOR5, "")) &&
        !(Contains(Adress[count], SENSOR6) && strcmp(SENSOR6, "")) &&
        !(Contains(Adress[count], SENSOR7) && strcmp(SENSOR7, "")) &&
        !(Contains(Adress[count], SENSOR8) && strcmp(SENSOR8, "")) &&
        !(Contains(Adress[count], SENSOR9) && strcmp(SENSOR9, "")) &&
        !(Contains(Adress[count], SENSOR10) && strcmp(SENSOR10, "")) &&
        !(Contains(Adress[count], SENSOR11) && strcmp(SENSOR11, "")))

Code: Alles auswählen

char Sensor[16];
void loop(void)
{
  server.handleClient(); // auf HTTP-Anfragen warten

  jetztMillis = millis();

  // neue Messung falls Zeitintervall erreicht
  if (jetztMillis - letzteMessungMillis > deltaMessungMillis)
  {
    ListSensors();
  }

  for (int c = 0; c < 11; c++)
  {
    if (deltaTemp != 0 && abs(OldTemp[c] - NewTemp[c]) > deltaTemp)
    {
      Serial.print("Temperatur änderung bei Sensor: ");
      Serial.print(c + 1);
      Serial.print(" erreicht.");
      OldTemp[c] = NewTemp[c];
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }

  // neue Meldung an die CCU falls Zeitintervall erreicht
  if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis)
  {
    Serial.print(zeitstempel() + "  Zeitintervall erreicht: \n");
    letzteMeldungMillis = jetztMillis;
    //melde_CCU();

    for (int c = 0; c < 11; c++)
    {
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von dondaik » 02.10.2017, 13:44

dennke auch das:
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};     //10>11?
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255}; 

das hier muss ggf auch auf "12" oder "13" gesetzt werden
und dann sollten da noch schleifen sein die zu erhöhen sind
sowas zb : for (int c = 0; c < 11; c++) // aus 11 - 13
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

g60vx
Beiträge: 170
Registriert: 16.04.2015, 21:48
Hat sich bedankt: 12 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von g60vx » 02.10.2017, 14:07

dondaik hat geschrieben: das hier muss ggf auch auf "12" oder "13" gesetzt werden
und dann sollten da noch schleifen sein die zu erhöhen sind
sowas zb : for (int c = 0; c < 11; c++) // aus 11 - 13
Ich hab jetzt alles hin und her geändert aber ich bekomme es nicht ans laufen.
Warum eigentlich 13 bei 11 Sensoren? Das habe ich noch nicht verstanden?
Ich liste mal alle Schleifen und Char´s auf:

Code: Alles auswählen

char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT; // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};

Code: Alles auswählen

void ListSensors(void)
{
  int count = 0, i = 0;
  byte addr[8];
  float Temp = 0.0;

  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 8; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr[i]);
    }
    count++;
  }
  Antwort += "Gefundene Sensoren \n</br>";
  Serial.print("\nGefundene Sensoren\n");
  for (count = 0; count < 11; count++)

Code: Alles auswählen

 Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Definierte Sensoren:\n</br>";
  Serial.print("Definierte Sensoren:\n");

  for (count = 0; count < 11; count++)

Code: Alles auswählen

Antwort += "</br>";
  Serial.print("\n");
  Antwort += "Nicht definierte Sensoren:\n</br>";
  Serial.print("Nicht definierte Sensoren:\n");

  for (count = 0; count < 11; count++)

Code: Alles auswählen

    ListSensors();
  }

  for (int c = 0; c < 11; c++)
  {
    if (deltaTemp != 0 && abs(OldTemp[c] - NewTemp[c]) > deltaTemp)
    {
      Serial.print("Temperatur änderung bei Sensor: ");
      Serial.print(c + 1);
      Serial.print(" erreicht.");
      OldTemp[c] = NewTemp[c];
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }

  // neue Meldung an die CCU falls Zeitintervall erreicht
  if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis)
  {
    Serial.print(zeitstempel() + "  Zeitintervall erreicht: \n");
    letzteMeldungMillis = jetztMillis;
    //melde_CCU();

    for (int c = 0; c < 11; c++)
    {
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: 1-wire kostengünstig an Homematic

Beitrag von dondaik » 02.10.2017, 15:00

das: // ist immer ein komentar
also ist das
//#define HK_EG_10     
//#define HK_EG_11     
//#define HK_EG_12     

hier schon mal zu entfernen .. dann weiter .. sonst ggf mal per TW und phone
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“