Heizungssteuerung mithilfe Fhem und Arduino steuern

Begonnen von butaluk, 05 Dezember 2017, 15:54:23

Vorheriges Thema - Nächstes Thema

butaluk

Hallo,
ich habe vor die Stellantriebe meiner Fußbodenheizung mit Fhem zu steuern.
Die Ansteuerung soll folgendermaßen ablaufen:

Raspberry Pi wird mit dem Arduino verbunden. (Welche Schnittstelle ist dafür besser geeignet?)
Der Arduino wird per BUS Leitung (sind ca. 20 bis 30 Meter) mithilfe MAX485 Modul mit einem weiteren Arduino verbunden der die Aktoren ansteuert.
Der Status der Aktoren soll im Fhem dargestellt werden.

So eine Konstellation habe ich im NET bis lang nicht gefunden.
Mit welchem Modul ist sowas besser zu realisieren,  ECMD oder Firmata?

Bin sehr für Eure Unterstützung dankbar!

Beta-User

Die Konstruktion klingt eher nach MySensors@RS485 oder eventuell HomeBrewWired (Tutorial von T. Pferdekaemper).

Die MAX487-Module sind übrigens - jedenfalls vom Hörensagen her - besser ;) .

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

abc2006

Hi,
ich habe das ganze über LAN versucht (Nano + W5100 + Relaiskarte). Leider überhaupt gar nicht zufriedenstellend, der Arduino hat irgendwann nicht mehr geantwortet. Ich habe leider nicht herausgefunden, woran es liegt, mein 1W-Busmaster auf Basis Arduino Nano und W5100 funktioniert seit der Entwicklung fehlerfrei.

Dafür hatte ich mir dann selbst nonBlocking-Sende und Empfangsroutinen geschrieben, über die ich eine Art set-Befehl schicken konnte.

War jetzt wahtscheinlich nicht so hilfreich, sollte vllt eher ein Erfahrungsbericht sein.
Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Morgennebel

Zitat von: butaluk am 05 Dezember 2017, 15:54:23
ich habe vor die Stellantriebe meiner Fußbodenheizung mit Fhem zu steuern.
[...]
Der Arduino wird per BUS Leitung (sind ca. 20 bis 30 Meter) mithilfe MAX485 Modul mit einem weiteren Arduino verbunden der die Aktoren ansteuert.

Stellantriebe - Nur AN/AUS mit PWM/PWMR oder prozentual? Woher kommen die IST/SOLL-Werte der einzelnen Kreise?

Für mich schreit das ganze nach 1-Wire. Den Bus für 1-Wire, am Ziel (FB-Verteiler) eine Hutschiene und ein 1-Wire Relaismodul (8fach), ein USB-Stecker für den Pi. Keine Arduinos. Viel einfacher, schneller und billiger...

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

butaluk

ZitatStellantriebe - Nur AN/AUS mit PWM/PWMR oder prozentual? Woher kommen die IST/SOLL-Werte der einzelnen Kreise?

Das sind Digitale 230V Stellantriebe (AN/AUS). Die Fhem misst die Temperatur in den einzelnen Zimmern und je nach IST/SOLL zustand soll Fhem die Stellantriebe ansteuern.

Werde das ganze probieren mit "HomeBrewWired" realisieren. Habe mir schon den USB/RS484 Adapter für Arduino bestellt.

Morgennebel

Ehrlich gesagt bleibe ich bei meiner 1-Wire-Empfehlung.

Sowas: http://www.ebay.de/itm/1-Wire-Relais-Karte-8-Relais-relays-220V-mit-DS2408-chipset-DIN-Rail-BOX/171711545773
und einen Haufen WAGO-Verbindungsklemmen auf eine Hutschiene, das vorhandene Kabel zum Pi nutzen.

Es geht um Heizung, d.h. eine Fehlfunktion kostet Geld. Mach es einfach (keine handgebauten Arduinio-Lösungen), damit Du im Fehlerfall schnell Probleme lösen kannst oder Hardware tauschen kannst. Fang nicht kompliziert an.

Wenn Du dann in einem Jahr FHEM, PWM/PWMR und TabletUI verstanden hast, kannst Du das immer noch in Arduinios machen.

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Thorsten Pferdekaemper

Zitat von: butaluk am 08 Dezember 2017, 10:53:57Werde das ganze probieren mit "HomeBrewWired" realisieren. Habe mir schon den USB/RS484 Adapter für Arduino bestellt.
Warum denn das? Die USB-Seite (am besten das Digitus-Ding aus dem Wiki) kommt an den RasPi und für den Arduino brauchst Du nur einen MAX487. Damit sparst Du Dir auch den zweiten Arduino und ziemlich viel Aufwand.
Siehe auch hier:
https://forum.fhem.de/index.php/topic,61780.0.html

Ich würde mir ehrlich gesagt aber gar nicht so viel Aufwand machen. Einfach ein HMW-IO-12-Sw7-DR rein und gut ist.

Gruß,
   Thorsten
FUIP

butaluk

Zitat
ZitatZitat von: butaluk am Heute um 10:53:57

    Werde das ganze probieren mit "HomeBrewWired" realisieren. Habe mir schon den USB/RS484 Adapter für Arduino bestellt.

Warum denn das? Die USB-Seite (am besten das Digitus-Ding aus dem Wiki) kommt an den RasPi

Ich meite eigentlich für RasPi :)

Bezüglich "Max487": Was ist mit Max 485? Habe 5 fertige Module schon in der Schublade liegen.
Bezüglich "HMW-IO-12-Sw7-DR": Habe eigene Triac Aktoren "Eigenbau".

Thorsten Pferdekaemper

Zitat von: butaluk am 08 Dezember 2017, 12:14:35Bezüglich "Max487": Was ist mit Max 485? Habe 5 fertige Module schon in der Schublade liegen.
MAX485 geht natürlich auch, erlaubt aber nur 32 Geräte am Bus. Mit MAX487 gehen bis zu 128.

Zitat
Bezüglich "HMW-IO-12-Sw7-DR": Habe eigene Triac Aktoren "Eigenbau".
Na dann sollte es für Dich nicht sooo schwierig sein, diese Teile mit Hilfe des Tutorials an den HMW-Bus zu bringen.

Gruß,
    Thorsten
FUIP

butaluk

Hallo miteinander.

Es ist etwas hier als das Thema hier eröffnet habe. Hatte leider nicht die Zeit gehabt meinen Vorhaben umzusetzen. Jetzt aber... :)
Habe mir eine Testschaltung so aufgebaut, wie in dem Tutorial dargestellt ist. Allerdings anstatt dem MAX487 verwende ich fertiges Modul TTL-RS 485 https://www.ebay.de/itm/TTL-RS-485-Konverter-Modul-Max485-Adapter-Bus-Modbus-Arduino-Raspberry-Pi/252712534559?hash=item3ad6d7421f:g:FQwAAOSw1cNaD3It

Den Sketch auf die Arduino aufzuspielen hat ohne Probleme Geklappt. Die HomeMatic Wired Installation hat auch keine Probleme bereitet.

Wenn das Testaufbau gestartet wird, im Serial Monitor sehe ich das die Arduino etwas raus schickt. Das wars aber auch. Vom FHEM bekomme ich keinen Antwort.

Mane Frage ist, benötigt man die 24V Versorgung?  In seinem Tutorial schrieb Thorsten dass wenn der DIGIDUS Dongel verwendet wird, benötigt man die 24V Versorgung nicht.

Thorsten Pferdekaemper

Hi,

die 24V-Versorgung brauchst Du für HBW nicht. (Wo würdest Du die überhaupt anschließen wollen?)
Das, was Du da beschreibst, kann ziemlich viele Ursachen haben. Da ist ja noch der TTL-RS 485-Umsetzer dazwischen, das Kabel der Digitus-Stick, der USB-Port am RasPi, der hm485d in FHEM, die FHEM-Konfig etc. Der serielle Monitor sagt Dir ja nur, dass etwas auf der seriellen Schnittstelle des Arduino rausgeschickt wird.
Jetzt muss man mal Stück für Stück sehen, wo es hängt. 

Als erstes würde ich mal empfehlen, ein Standard-HMW-Gerät dranzuhängen (das braucht dann natürlich 24V), um auszuschließen, dass es an der HBW-Hardware hängt.
Falls das nicht geht, dann bitte folgendes hier reinstellen:
1. Den Sketch, der auf dem Arduino läuft
2. Ein Foto der Verkabelung
3. Ein "list" des IO-Device (also des HM485_LAN).
4. Ein Level-5-Log des IO-Device in FHEM während Du die "Kontaktaufnahme" versuchst.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten.

Danke dass du mich unterstützt!

ZitatAls erstes würde ich mal empfehlen, ein Standard-HMW-Gerät dranzuhängen (das braucht dann natürlich 24V), um auszuschließen, dass es an der HBW-Hardware hängt.
Falls das nicht geht, dann bitte folgendes hier reinstellen:
Einen Standard-HMW-Gerät habe ich leider nicht.

Zitat1. Den Sketch, der auf dem Arduino läuft

Ich habe den Mini-Sketch aus deinen Tutorial eins zu eins kopiert und in die Arduino Nano aufgespielt:
#define HMW_DEVICETYPE 0xAB

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0100

#include "HBWSoftwareSerial.h"
#include "HBWired.h"

#define RS485_RXD 4   // Receive-Pin
#define RS485_TXD 2   // Transmit-Pin
#define RS485_TXEN 3  // Transmit-Enable

struct hbw_config {
  uint8_t  logging_time;     // 0x0001
  uint32_t central_address;  // 0x0002 - 0x0005
} config;


HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD);
HBWDevice* device = NULL;

void setup()
{
  Serial.begin(19200);
  rs485.begin();

  device = new HBWDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(config),&config,0,NULL,&Serial,
                         NULL, NULL);
  hbwdebug(F("B: 2A\n"));
}

void loop()
{
  // call the HBW loop
  device->loop();
};


Zitat2. Ein Foto der Verkabelung
Bild im Anhang.

Zitat3. Ein "list" des IO-Device (also des HM485_LAN).
In Fhem habe ich nur das HomeMatic Wired nach deinem Tutorial installiert. Habe sonst nichts definiert. Aus deinem Tutorial ist nicht ersichtlich was man Genau in FHEM machen muß. Oder ich habe etwas übesehen. :)

Zitat4. Ein Level-5-Log des IO-Device in FHEM während Du die "Kontaktaufnahme" versuchst.
Beim hochfahren vom RaspPi mit eingestecktem DIGITUS Dongel wird folgendes in die Logfile eingetragen:
2018.02.18 11:16:20 1: usb create starting
2018.02.18 11:16:20 3: Probing CUL device /dev/ttyAMA0
2018.02.18 11:16:20 3: Probing TCM_ESP3 device /dev/ttyAMA0
2018.02.18 11:16:21 3: Probing ZWDongle device /dev/ttyAMA0
2018.02.18 11:16:21 3: Probing FRM device /dev/ttyAMA0
2018.02.18 11:16:26 3: Probing TCM_ESP3 device /dev/ttyUSB0
2018.02.18 11:16:26 3: Probing TCM_ESP2 device /dev/ttyUSB0
2018.02.18 11:16:26 3: Probing FHZ device /dev/ttyUSB0
2018.02.18 11:16:27 3: Probing TRX device /dev/ttyUSB0
2018.02.18 11:16:27 3: Probing ZWDongle device /dev/ttyUSB0
2018.02.18 11:16:28 3: Probing FRM device /dev/ttyUSB0
2018.02.18 11:16:33 1: usb create end

Wenn der RaspPi läuft und der Arduino gestartet wird, sind keine Einträge in dem "Event Monitor" zu sehen.

Gruß,
  Vitalij

Thorsten Pferdekaemper

Hi,
Bei dem Tutorial geht's um HomebrewWired, also ist nicht jedes Detail der Einrichtung von HM485 beschrieben.
Aber: Im ersten Beitrag des Tutorials dem ersten Link folgen und dann dort entsprechend Deiner Hardware weitermachen, also das hier:
https://wiki.fhem.de/wiki/Serial/Netzwerk-RS485-Adapter
Dort v.A. "Einbindung in FHEM". Du müsstest dann ein HM485_LAN Device haben. Falls das nicht der Fall ist, dann mach das erstmal.
Gruß,
   Thorsten

FUIP

butaluk

Hallo Thorsten,

HM485_LAN Device habe ich angelegt. (sehe Anhang)
Nun wenn ich die Discovery Funktion ausführe, findet FHEM keine Geräte:
hm485: Discovery - canceled. No results found within 10 seconds!


Gruß.

Thorsten Pferdekaemper

Hi,
discovery ist bei den HBW-Teilen nicht implementiert. Du musst den Arduino mal kurz durchstarten, also z.B. vom Strom trennen und wieder anschließen.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
habe ich versurcht, ohne erfolg.

Gruß
   Vitalij

Thorsten Pferdekaemper

Hi,
Dein HM485_LAN device zeigt "disconnected". D.h. der Daemon läuft nicht oder irgendwas anderes geht sonst schief. Das müssen wir zuerst hinbekommen. ...also versuch mal ein "set hm485 HM485d restart" oder so (über die Oberfläche, ich weiß gerade nicht ganz genau die Syntax.)
Das Reading state sollte dann "opened" oder so anzeigen.
Falls das nicht geht: Ist der Daemon (also das Programm HM485d.pl) ausführbar? Den Pfad findest Du in Deinem Screenshot. Das Ding muss ausführbar sein, siehe auch hier:
https://wiki.fhem.de/wiki/HomeMatic_Wired#Installation_und_Upgrade_in_FHEM
Es kann damit auch andere Probleme geben, dann müsste aber was im FHEM Log erscheinen. Unter Umständen hilft "attr hm485 verbose 5", um genauer zu sehen, was denn eigentlich los ist.
Gruß,
   Thorsten
FUIP

butaluk

#17
Hallo Thorsten,

Jetzt habe ich es hin gekriegt dass der Status "opened" angezeigt wird.
Musste noch die Rechte anpassen.
https://forum.fhem.de/index.php?topic=28560.0

Wird das Arduino gestartet, sehe ich im Logfile vom FHEM dass da was geschick und epfangen wird.
2018.02.19 18:56:39 0: Featurelevel: 5.8
2018.02.19 18:56:39 0: Server started with 10 defined entities (fhem.pl:16170/2018-02-13 perl:5.024001 os:linux user:fhem pid:479)
2018.02.19 18:56:39 3: hm485: Start HM485d with command line: ./FHEM/lib/HM485/HM485d/HM485d.pl --hmwId 00000001 --serialNumber SGW0123456 --device /dev/ttyUSB0 --localPort 2000 --verbose 5
2018.02.19 18:56:40 3: hm485: HM485d was started with PID:   825
2018.02.19 18:56:40 3: hm485: Connect to HM485d delayed for 5 seconds
2018.02.19 18:56:40.451 3: HM485d: port 2000 opened
2018.02.19 18:56:40.452 3: HM485d: server waiting for client connection on port 2000
2018.02.19 18:56:40.452 3: Opening SERIAL device /dev/ttyUSB0
2018.02.19 18:56:40.499 3: SERIAL device opened
2018.02.19 18:56:40.502 3: HM485d: SERIALbaudrate=19200, databits=8, parity=even, stopbits=1, handshake=none
2018.02.19 18:56:40.502 2: HM485d: SERIAL connected to device /dev/ttyUSB0
2018.02.19 18:56:40.503 1: HM485d: Server started ...
2018.02.19 18:56:45 3: Opening hm485 device localhost:2000
2018.02.19 18:56:45.120 4: Connection accepted from HM485d_127.0.0.1_35518
2018.02.19 18:56:45.121 4: HM485d: Tx: H00,01,HMW-SOFT-GW,0.2.2,SGW0123456

2018.02.19 18:56:45 3: hm485: connected to device localhost:2000
2018.02.19 18:56:45 3: hm485 device opened
2018.02.19 18:56:45 3: hm485: Lan Device Information
2018.02.19 18:56:45 3: hm485: Protocol-Version: 01
2018.02.19 18:56:45 3: hm485: Interface-Type: HMW-SOFT-GW
2018.02.19 18:56:45 3: hm485: Firmware-Version: 0.2.2
2018.02.19 18:56:45 3: hm485: Serial-Number: SGW0123456
2018.02.19 18:56:45 3: hm485: Initialize the interface
2018.02.19 18:56:45.134 4: HM485d: Rx: FD3E30312C303030300D0A
2018.02.19 18:57:12.082 4: HM485d: Rx: FD02024B
2018.02.19 18:57:12.082 4: HM485d: Tx: FD03026100
2018.02.19 18:57:32.091 4: HM485d: Rx: FD02034B
2018.02.19 18:57:32.092 4: HM485d: Tx: FD03036100
2018.02.19 18:57:52.110 4: HM485d: Rx: FD02044B
2018.02.19 18:57:52.110 4: HM485d: Tx: FD03046100
2018.02.19 18:58:12.128 4: HM485d: Rx: FD02054B
2018.02.19 18:58:12.129 4: HM485d: Tx: FD03056100

Allerdings im Serail Monitor vom Arduino sehe ich nur das etwas geschickt aber nicht empfangen wird.

Wenn ich Discovery ausführe, wir folgendes in Logfile eingetragen:
2018.02.19 19:33:21.496 4: HM485d: Rx: FD0D6F53C8FFFFFFFF98000000017A
2018.02.19 19:33:21.498 5: SW: fdffffffff9800000001037a6d72
2018.02.19 19:33:21.500 3: HM485d: Tx: (111:1) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 7A(z)  {6D72}
2018.02.19 19:33:21.601 4: HM485d: Rx: FD0D7053C8FFFFFFFF98000000017A
2018.02.19 19:33:21.603 5: SW: fdffffffff9800000001037a6d72
2018.02.19 19:33:21.605 3: HM485d: Tx: (112:1) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 7A(z)  {6D72}
2018.02.19 19:33:21.707 4: HM485d: Rx: FD04714400FF
2018.02.19 19:33:21.707 3: Discovery mode started.
2018.02.19 19:33:22.309 5: SW: fd0000000003026c76
2018.02.19 19:33:22.311 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 00000000
2018.02.19 19:33:22.323 5: SW: fd0000000003026c76
2018.02.19 19:33:22.324 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 00000000
2018.02.19 19:33:22.336 5: SW: fd0000000003026c76
2018.02.19 19:33:22.337 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 00000000
2018.02.19 19:33:22.348 5: SW: fd800000000302cf68
2018.02.19 19:33:22.350 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 80000000
2018.02.19 19:33:22.361 5: SW: fd800000000302cf68
2018.02.19 19:33:22.363 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 80000000
2018.02.19 19:33:22.374 5: SW: fd800000000302cf68
2018.02.19 19:33:22.375 3: HM485d: Tx: DISCOVERY(1) 00000000 -> 80000000
2018.02.19 19:33:22.376 4: HM485d: Tx: FD057163000000
2018.02.19 19:33:22.378 3: HM485d: Discovery: END
2018.02.19 19:33:22.379 4: HM485d: Rx: FD0D7253C8FFFFFFFF98000000015A
2018.02.19 19:33:22.381 5: SW: fdffffffff9800000001035a4d36
2018.02.19 19:33:22.382 3: HM485d: Tx: (114:1) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 5A(Z)  {4D36}
2018.02.19 19:33:22.485 4: HM485d: Rx: FD0D7353C8FFFFFFFF98000000015A
2018.02.19 19:33:22.487 5: SW: fdffffffff9800000001035a4d36
2018.02.19 19:33:22.489 3: HM485d: Tx: (115:1) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 5A(Z)  {4D36}


Im Anhang ist noch mal das Screen von der HM485 Config.

Gruß
   Vitalij


Thorsten Pferdekaemper

Hi,
das sieht so aus als ob Du sowohl FHEM als auch den Arduino neu gestartet hast. Mach mal folgendes:

1. FHEM starten, aber den Arduino nicht (Stecker aus dem Arduino ziehen)
2. Drei Minuten warten
3. Jetzt den Arduino starten (Stecker reinstecken)

Sollte das aus irgendwelchen Gründen nicht gehen (Arduino fest verkabelt), dann so:

1. FHEM starten
2. Drei Minuten warten
3. Reset-Taste am Arduino drücken

Wenn das Device dann immer noch nicht in FHEM angelegt wird, dann hätte ich gerne ein Level-5-Log vom HM485_LAN Device, aber nur von Schritt 3 oben.
Noch zwei Bemerkungen:
1. Ich hatte schon gesagt, dass Discovery nicht implementiert ist. Das wird auch so bleiben, wenn Du es noch ein paar Mal probierst.
2. Statt Screenshots bitte ein "list" posten. Screenshots enthalten weniger Information und sind für copy&paste ganz schlecht.

Gruß,
   Thorsten


FUIP

butaluk

Hallo Thorsten,

Es hat geklappt!
Das Arduino wurde erkannt und als neues Gerät im FHEM angelegt.
Danke für deine Unterstützung!

Habe deinen Tutorial soweit durch. Hast dir wirklich mühe gegeben das ganze auf die Beine zu stellen.

Mir ist aufgefallen dass die lange Tastendrücke funktionieren nicht. Habe die "HBWSwitch.h" in der Lid vergliechen, die sind identisch.

Wie kann man die XML umstricken dass beim Tastendruck der Status vom Taster angezeigt wird (on; off), anstatt den Zähler hoch zu zählen?

Und noch eine Frage. Ich möchte 1Wire Temperatur Sensoren an das Arduino anschließen und die Temperatur am Fhem übermitteln. Hast du einen Beispiel?

Gruß
   Vitalij

Thorsten Pferdekaemper

Zitat von: butaluk am 20 Februar 2018, 07:25:54
Mir ist aufgefallen dass die lange Tastendrücke funktionieren nicht. Habe die "HBWSwitch.h" in der Lid vergliechen, die sind identisch.
Die HBWSwitch hat nichts mit Tastendrücken zu tun. Das wäre dann HBWKey. ...und was meinst Du mit "funktionieren nicht". Was erwartest Du und was passiert?

Zitat
Wie kann man die XML umstricken dass beim Tastendruck der Status vom Taster angezeigt wird (on; off), anstatt den Zähler hoch zu zählen?
Das wäre dann kein Taster mehr, sondern ein Kontaktsensor oder so. Es reicht auch nicht, die XML umzubauen. Da muss noch mehr passieren. Ich habe dazu leider momentan kein Beispiel. Hier gibt es was ähnliches:
https://github.com/ThorstenPferdekaemper/HBWired/tree/master/HBW-Sen-Key-12
Da wird zumindest ein "Key release" gesendet.

Zitat
Und noch eine Frage. Ich möchte 1Wire Temperatur Sensoren an das Arduino anschließen und die Temperatur am Fhem übermitteln. Hast du einen Beispiel?
Ja, aber das ist nicht auf die neuen Libraries umgebaut. Schau mal hier, vielleicht kannst Du was damit anfangen:
https://github.com/kc-GitHub/HM485-Lib/tree/thorsten/HBW-1W-T10
Außerdem hat der 6fach-Taster einen Temperatursensor:
https://github.com/haus-bus/HBW-Devices/tree/HM-Wired
Zu letzterem gebe ich aber keinerlei weitere Kommentare oder Support, da mich das Verhalten der beteiligten Personen sehr geärgert hat.
Gruß,
   Thorsten
FUIP

butaluk

Hi,

Zitat...und was meinst Du mit "funktionieren nicht".
Ich meine wenn die Taste lange gedrückt wird, ändert sich nichts in dem Status.

ZitatDie HBWSwitch hat nichts mit Tastendrücken zu tun.
In deinem Tutorial hast du geschrieben...
Zitatwomöglich hat jemand auch lange Tastendrücke ausprobiert. Im Prinzip hätte das funktionieren sollen, hat es aber nicht.
Da war noch ein Fehler in der HBWSwitch.h, der jetzt korrigiert ist.
Aufgrund dessen habe ich die "HBWSwitch.h" Datei aus dem Tutorial mit der Datei aus Librari verglichen.

Thorsten Pferdekaemper

Ah, ok. Das kann sein, dass das im Zusammenhang mit "Keys" nach "Switches" war. Da hatte ich wohl einen Fehler bei der Konfiguration, der dazu geführt hat, dass in dem Fall tatsächlich die langen Tastendrücke nicht gehen.
Kannst Du mal ein "list" des Tasterkanals schicken?
Ist das genau das Device aus dem Tutorial?
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,

habe gestern mich mit der XML bescheftigt und bisschen rum gespielt, jetzt funktioniert das mit dem "long-press".
Auf der Arduino Seite habe ich nichts verändert.
Vorher lief es aber nicht.
ZitatIst das genau das Device aus dem Tutorial?
Ja.

Gruß
  Vitalij

butaluk

#24
Hallo Thorsten,

Danke für den Tipp!
ZitatDas wäre dann kein Taster mehr, sondern ein Kontaktsensor oder so. Es reicht auch nicht, die XML umzubauen. Da muss noch mehr passieren. Ich habe dazu leider momentan kein Beispiel. Hier gibt es was ähnliches:
https://github.com/ThorstenPferdekaemper/HBWired/tree/master/HBW-Sen-Key-12
Genau das was ich suche.

Bezüglich 1-Wire, hast du eventuell Lust mich bei der Umsetzung zu unterstützen?
Wäre echt Toll!

Gruß
  Vitalij

butaluk

Hallo zusammen.

Habe mir jetzt einen HBW Gerät mit Thorstens Hilfe gebaut.
Das Gerät hat 9 Ausgang Kanäle, die zum ansteuern der Fußbodenheizung Ventile verwendet werden.

Lege die beiden Dateien hier raus falls einer so etwas braucht.
#define HMW_DEVICETYPE 0xAB

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0100
#define NUM_CHANNELS 9

#include "HBWSoftwareSerial.h"
#include "HBWired.h"
#include "HBWSwitch.h"
#include "HBWKey.h"

#define RS485_RXD 4   // Receive-Pin
#define RS485_TXD 2   // Transmit-Pin
#define RS485_TXEN 3  // Transmit-Enable
#define PIN_ARRAY uint8_t pins[NUM_CHANNELS] = {5, 6, 7, 8, 9, 10, 11, 12, 13}; //Hier zu verwendete Pins eintragen.

struct hbw_config {
  uint8_t  logging_time;     // 0x0001
  uint32_t central_address;  // 0x0002 - 0x0005
  // NEU: Mehrere switches
  hbw_config_switch switchcfg[NUM_CHANNELS];  // 0x0006 - 0x0016
  // NEU: Mehrere keys
  //hbw_config_key keycfg[2];        // 0x000E - 0x0011
} config;


HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD);
HBWDevice* device = NULL;

//NEU (9 Kanaele)
HBWChannel* channels[NUM_CHANNELS];

void setup()
{
  Serial.begin(19200);
  rs485.begin();
  // create channels
   PIN_ARRAY
  // NEU: Definition mehrerer Kanaele pro Typ
  for(uint8_t i = 0; i < NUM_CHANNELS; i++){
      channels[i] = new HBWSwitch(pins[i], &(config.switchcfg[i]));
   };
  //channels[0] = new HBWSwitch(5,&(config.switchcfg[0]));
  //channels[1] = new HBWSwitch(6,&(config.switchcfg[1]));
  //channels[2] = new HBWSwitch(7,&(config.switchcfg[2]));
  //channels[3] = new HBWSwitch(8,&(config.switchcfg[3]));
  //channels[4] = new HBWSwitch(9,&(config.switchcfg[4]));
  //channels[5] = new HBWSwitch(10,&(config.switchcfg[5]));
  //channels[6] = new HBWSwitch(11,&(config.switchcfg[6]));
  //channels[7] = new HBWSwitch(12,&(config.switchcfg[7]));
  //channels[8] = new HBWSwitch(13,&(config.switchcfg[8]));

  device = new HBWDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(config),&config,
                         // NEU (9 Kanaele)
                         NUM_CHANNELS,channels,
                         &Serial,
                         NULL, NULL);
  hbwdebug(F("B: 2A\n"));
}


void loop()
{
  // call the HBW loop
  device->loop();
};

Die Lib's für Arduino können von Thorstens Tutorial bezogen werden.

Und XML
<?xml version="1.0"?>
<device eep_size="1024" version="01">
<supported_types>
<type priority="2" id="HIZUNG-AKTOR-DO-9" name="Heizung Aktor mit 9 Digitalen Ausgaengen">
<parameter const_value="0xAB" size="1" index="0"/>
<parameter const_value="0" size="1" index="1"/>
</type>
</supported_types>

<paramset id="HIZUNG-AKTOR-DO-9_dev_master" type="MASTER">
<parameter id="LOGGING_TIME">
<logical type="float" unit="s" default="5.0" max="25.5" min="0.1"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="0x0001"/>
</physical>
<conversion type="float_integer_scale" offset="0.0" factor="10"/>
</parameter>
<parameter id="CENTRAL_ADDRESS" hidden="true">
<logical type="integer"/>
<physical size="4" type="integer" interface="eeprom">
<address index="0x0002"/>
</physical>
</parameter>
<enforce id="CENTRAL_ADDRESS" value="1"/>
</paramset>

<!-- NEU: frames -->
<frames>
<frame id="LEVEL_SET" type="#x" channel_field="10" direction="to_device">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
<frame id="LEVEL_GET" type="#S" channel_field="10" direction="to_device"/>
<frame id="INFO_LEVEL" type="#i" channel_field="10" direction="from_device" event="true">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
</frames>

<channels>
<channel index="0" type="MAINTENANCE" count="1" class="maintenance" ui_flags="internal">
</channel>
<channel index="1" type="SWITCH" count="9" physical_index_offset="-1">
        <!-- NEU: Beschreibung des Kanals -->
      <paramset id="hmw_switch_ch_master" type="MASTER" address_step="2" address_start="0x06">
<parameter id="LOGGING">
<logical type="option">
<option id="OFF"/>
<option id="ON" default="false"/>
</logical>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0"/>
</physical>
</parameter>
</paramset>
<paramset id="hmw_switch_ch_values" type="VALUES">
<parameter id="STATE" operations="read,write,event" control="SWITCH.STATE">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="LEVEL">
<set request="LEVEL_SET"/>
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
</physical>
<conversion type="boolean_integer" true="200" false="0" threshold="1"/>
</parameter>
</paramset>
</channel>
</channels>

</device>


Gruß
   Vitalij

Thorsten Pferdekaemper

Zitat von: butaluk am 21 Februar 2018, 21:34:27
Bezüglich 1-Wire, hast du eventuell Lust mich bei der Umsetzung zu unterstützen?
Wäre echt Toll!
Also so wirklich viel Zeit habe ich momentan nicht übrig.
Was fehlt Dir denn dabei? Hier gibt es eine Umsetzung mit den alten Libraries:
https://github.com/kc-GitHub/HM485-Lib/tree/thorsten/HBW-1W-T10
Da sollte klar werden, wie das mit dem 1-Wire Krams geht. Die Sachen in den XMLs hat sich nicht geändert, da das sowieso vorgegeben ist.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
ZitatWas fehlt Dir denn dabei?

Ich wollte die 1-Wire Funktion in die "HIZUNG-AKTOR-DO-9" Funktion, die ich gepostet habe, integrieren.
Das HBW-1W-T10 Gerät in dem von dir gepostetem Link sieht ganz schön kompliziert aus.

Gruß
   Vitalij

Morgennebel

Warum willst Du überhaupt 1-Wire mit Arduinio machen? Warum selbstfrickeln?

Nimm nen USB-Stick und fertig...

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Thorsten Pferdekaemper

Zitat von: butaluk am 26 Februar 2018, 18:13:05
Ich wollte die 1-Wire Funktion in die "HIZUNG-AKTOR-DO-9" Funktion, die ich gepostet habe, integrieren.
Das ist schon klar. Ich meinte nur, ob Dein Problem der 1-Wire-Teil, das XML oder der HBW-spezifische Teil im Arduino ist.
Das HBW-1W-T10 ist etwas komplex, da es die alten Libraries verwendet. Dich dürfte aber erstmal nur alles interessieren, was "onewire" (oder so ähnlich) im Namen hat.
Was Du aus dem XML brauchst müsste nach der Erklärung zum XML aus dem Tutorial einigermaßen klar sein.
...dann bleibt nur noch ein selbstgebastelter Sensor-Kanal, der so ähnlich wie ein Taster-Kanal aussieht (also HBWKey oder so), nur dass er die Temperatur anstatt den Tastendruck sendet.
Gruß,
    Thorsten
FUIP

butaluk

Hallo Thorsten.
Zitatob Dein Problem der 1-Wire-Teil, das XML oder der HBW-spezifische Teil im Arduino ist.
Setze mich gerade mit dem Arduino Teil auseinander.
Da habe ich eine Frage.
Wo finde ich die Dateien
// debug-Funktion
//#include "HMWDebug.h"

// HM Wired Protokoll
#include "HMWRS485.h"

// default module methods
#include "HMWModule.h"


Habe sonst Schwierigkeiten mit dem kompilieren.

Gruß
  Vitalij

Thorsten Pferdekaemper

Hi,
die brauchst Du nicht, die gehören zu den alten Libraries.
Gruß,
    Thorsten
FUIP

butaluk

Muß ich die einfach auskomentieren?

Gruß
  Vitalij

Thorsten Pferdekaemper

Einfach nicht in Dein Coding übernehmen.
Ich sagte doch, von dem Kram ist für Dich nur das interessant, was "onewire" oder ähnlich im Namen hat.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
Zitatvon dem Kram ist für Dich nur das interessant, was "onewire" oder ähnlich im Namen hat
Habe es versucht, aber ohne Erfolg.
Kannst du bitte mir die Richtigen Stellen Posten?
Das wäre sehr nett.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
sag' lieber mal genauer, was Du versucht hast und was daran nicht funktioniert hat.
Ich glaube ja kaum, dass Du es nicht geschafft hast, "onewire" im Coding zu finden.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
im Anhang ist der Sketch für den Arduino mit dem ich versucht habe die 1-Wire Funktion zum Laufen zu bringen.
Die hbw_1w_t10.xml Datei habe ich unter /opt/fhem/FHEM/lib/HM485/Devices/xml, sowie unter /opt/fhem/FHEM/firmware/hs485types abgelegt.

MfG
  Vitalij

sash.sc

Hallo zusammen.

Habe das ganze bei mir mit einem wemos und einer relais Karte umgesetzt und steuere das ganze über pwm/pwmr inkl pid Regler.

Läuft erstaunlicher Weise ganz gut..

Gruß Sascha

Gesendet von meinem...... was auch immer

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Thorsten Pferdekaemper

Zitat von: butaluk am 04 März 2018, 13:58:41im Anhang ist der Sketch für den Arduino mit dem ich versucht habe die 1-Wire Funktion zum Laufen zu bringen.
Das ist ja im Prinzip mein Original-Sketch. Das wird so nicht gehen.
Fang doch erstmal klein an und baue einen Sketch, der einfach nur die Temperatur ermittelt und sie auf dem seriellen Monitor anzeigt, ohne den ganzen HMW-Kram.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
das habe ich schon gemacht.
#include <OneWire.h>
OneWire ds(10);

byte data[2];
float celsius;

void setup() {
Serial.begin(9600);

}

void loop() {


ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
//int Temp = (data[1]<< 8)+data[0];
//Temp = Temp>>4;
//Serial.println(Temp);
int16_t raw = (data[1] << 8) | data[0];
celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
}

Das funktioniert auch soweit.

MfG
Vitalij

Thorsten Pferdekaemper

Hi,
...und jetzt das ganze ohne delay. Das ist nämlich der eigentliche Witz bei der Sache.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
Zitat...und jetzt das ganze ohne delay. Das ist nämlich der eigentliche Witz bei der Sache.

#include <OneWire.h>
OneWire ds(10);

byte data[2];
float celsius;
long lastUpdateTime = 0;
const int TEMP_UPDATE_TIME = 1000;
void setup() {
Serial.begin(9600);

}

void loop() {


  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
  {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    int16_t raw = (data[1] << 8) | data[0];
    celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
  }
}


Ok. wie geht es weiter?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
funktioniert das wirklich? Du hämmerst im Millisekundentakt (oder so) das hier raus:

  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);

Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

...und außerdem: Deine Konversion von "raw" zu Celsius sieht mir zu einfach aus. Ich habe da das hier:

  for ( byte i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = myWire.read();
  }
  // CRC check  TODO: if this happens only once, maybe don't do it
  if(OneWire::crc8(data, 8) != data[8])
  return ERROR_TEMP;

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (sensors[channel].address[0] == 0x10) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {   // DS18S20 or old DS1820
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }

D.h. es werden 9 Bytes gelesen und ein paar davon sogar benutzt. Ok, den Teil für "DS18S20 or old DS1820" muss man nicht unbedingt beachten, aber der Rest erscheint mir schon irgendwie wichtig.
...aber das kann man vielleicht später noch einbauen.

Ich denke mal, das geschickteste wird sein, eine eigene Klasse (also wie HBWKey) für die Dinger zu bauen. Ich lass mir das mal durch den Kopf gehen.

Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
ich habe jetzt mal ein bisschen gebastelt. Dabei ist die hier dranhängende Library rausgekommen. Das Ding implementiert einen DS18B20-Kanal. Die Klasse HBWDS18B20 wird im Prinzip genauso verwendet wie HBWKey. Momentan kann der zweite Parameter des Konstruktors einfach auf 0 gesetzt werden.
Als XML kannst Du die Datei vom HBW-1W-T10 verwenden.
Ich habe das überhaupt nicht getestet, aber theoretisch müsste das dann alle 10 Sekunden die Temperatur über den Bus schicken.
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
bist Du damit weitergekommen?
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
Zitatbist Du damit weitergekommen?
habe gerade keine Möglichkeit, bin unterwegs.
Aber den Code habe angeschaut und da habe ich eine Frage.
Wie wird die Funktion ausgeführt? man muß der Funktion den Kanal übergeben an dem die 1-Wire Sensoren dran Sind.
Bin nich so mechtig in der C++ wie du :D

MfG
Vitalij

Thorsten Pferdekaemper

Im Prinzip genauso wie HBWSwitch bzw. HBWKey im Tutorial.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,

So... bin wieder am Ball
Beim kompilieren von dem Programm schmeißt der Compiler folgendes Fehler:
HBWDS18B20.cpp:31:45: error: no matching function for call to 'HBWDevice::sendInfoMessage(uint8_t&, int, uint16_t*)'

   device->sendInfoMessage(channel, 2, &value); 


Das gesamte Programm sieht so aus:
#define HMW_DEVICETYPE 0xAB

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0100

#include "HBWSoftwareSerial.h"
#include "HBWired.h"

#include "HBWDS18B20.h"

#define RS485_RXD 4   // Receive-Pin
#define RS485_TXD 2   // Transmit-Pin
#define RS485_TXEN 3  // Transmit-Enable

struct hbw_config {
  uint8_t  logging_time;     // 0x0001
  uint32_t central_address;  // 0x0002 - 0x0005
  hbw_config_ds18b20 ds18b20cfg;  // 0x0006
} config;


HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD);
HBWDevice* device = NULL;

HBWChannel* channels[1];

void setup()
{
  Serial.begin(19200);
  rs485.begin();

  channels[0] = new HBWDS18B20(10,&(config.ds18b20cfg));

  device = new HBWDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(config),&config,
                         // NEU
                         1,channels,
                         &Serial,
                         NULL, NULL);
}


void loop()
{
  // call the HBW loop
  device->loop();
};

Kannst du dir das noch mal angucken? Danke!

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
kannst Du mal Zeile 31 in HBWDS18B20.cpp auf das hier ändern:

device->sendInfoMessage(channel, 2, (uint8_t*)(&value));    

Ich kann das gerade nicht ausprobieren, ist also eher ein Versuchsballon.
Gruß,
   Thorsten
FUIP

butaluk

#50
Hi,
Mit dem Kompilieren hat es jetzt geklappt.
Das Arduino sendet jetzt sekündlich Daten ans Fhem:
T: FD:FF:FF:FF:FF:F8:42:FF:FF:FF:06:69:00:F3:7D:10:22
T: FD:FF:FF:FF:FF:F8:42:FF:FF:FF:06:69:00:F3:7D:10:22

Im Fhem wird aber ein anderes Gerät erkannt.
Siehe Screenshot.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
Das ist doch schonmal gut.
Ändere mal den HMW_DEVICETYPE am Anfang Deiner Datei von 0xAB auf 0x81, also so:

#define HMW_DEVICETYPE 0x81

Nachdem Du das Teil neu geflasht hast löschst Du das Device in FHEM am besten wieder und "resettest" den Arduino, so dass FHEM das Ding neu erkennen kann. Es müsste dann ein HBW-1W-T10 "entstehen" und die Temperatur müsste im ersten Kanal ankommen. (Oder so etwas ähnliches.)
...dann sehen wir weiter.
Gruß,
   Thorsten
FUIP

butaluk

Hi Thorsten,
Es klappt!!!!!!!!
Allerdings bekomme ich falsche Temperatur Werte, hängt das mit den min max Werten in der XML Datei?
<logical type="float" min="-273.15" max="327.67" unit="℃"/>
Und die Temperatur wird sekündlich vom Arduino gesendet.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
sag mir mal, was so ungefähr die richtige Temperatur wäre, am besten zusammen mit der falschen und dem Log, das der Arduino ausspuckt. Ich glaube, da ist eher was mit der Reihenfolge der Bytes durcheinander geraten.
Kommt die Temperatur wirklich jede Sekunde? Eigentlich sollte es alle 10 Sekunden sein.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
Es sind ca. 23°C. Der HBW_1W_T10 anzeigt -32,03 °C
Am Seriellen Port vom Arduino sind folgende Daten zu sehen:
R: ACK
T: FD:00:00:00:01:98:42:FF:FF:FF:06:69:00:F3:7D:A5:32
R: FD:42:FF:FF:FF:19:00:00:00:01:02:F5:06

Im Fhem Event Monitor sieht man:

2018-03-26 15:40:11 HM485 HBW_1W_T10_HBW4073471_01 temperature: -32.03
2018-03-26 15:40:11 HM485 HBW_1W_T10_HBW4073471_01 temperature_-32.03

Ich habe festgestellt dass wenn das DS18B20 Temperatursensor erwärmt wird, ändert sich die anzeige nicht.

Habe die "else if" Bedingung in der .cpp Datei so angepasst:
else if(state == 1 && (now -lastUpdateTime >= 1000))
Jetzt kommen die Werte ein mal in 10sec. Allerdings ist der Temperaturwert immer noch falsch und beträgt 296.08 °C.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
ja, Dein Fix für die 10 Sekunden ist schonmal gut. Das gibt auch dem Teil die Chance, die Temperatur tatsächlich korrekt zu liefern.
Jetzt noch in der Zeile hier das " + 27315" weglassen:

uint16_t value = raw * 100 / 16 + 27315; 

...dann müsste die Temperatur richtig ankommen. Ich hatte da anscheinend was falsch in Erinnerung.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
die Temperatur wird immer noch falsch angezeigt.
Der Wert ändert sich auch ganz schön extrem:
2018-03-26 19:04:01 HM485 HBW_1W_T10_HBW4073471_01 temperature: -31.98
2018-03-26 19:04:01 HM485 HBW_1W_T10_HBW4073471_01 temperature_-31.98
2018-03-26 19:04:11 HM485 HBW_1W_T10_HBW4073471_01 temperature: 131.68
2018-03-26 19:04:11 HM485 HBW_1W_T10_HBW4073471_01 temperature_131.68
2018-03-26 19:04:21 HM485 HBW_1W_T10_HBW4073471_01 temperature: 295.33
2018-03-26 19:04:21 HM485 HBW_1W_T10_HBW4073471_01 temperature_295.33
2018-03-26 19:04:31 HM485 HBW_1W_T10_HBW4073471_01 temperature: 131.43
2018-03-26 19:04:31 HM485 HBW_1W_T10_HBW4073471_01 temperature_131.43
2018-03-26 19:04:41 HM485 HBW_1W_T10_HBW4073471_01 temperature: 131.68
2018-03-26 19:04:41 HM485 HBW_1W_T10_HBW4073471_01 temperature_131.68
2018-03-26 19:04:51 HM485 HBW_1W_T10_HBW4073471_01 temperature: 295.58
2018-03-26 19:04:51 HM485 HBW_1W_T10_HBW4073471_01 temperature_295.58
2018-03-26 19:05:01 HM485 HBW_1W_T10_HBW4073471_01 temperature: -32.23
2018-03-26 19:05:01 HM485 HBW_1W_T10_HBW4073471_01 temperature_-32.23
2018-03-26 19:05:11 HM485 HBW_1W_T10_HBW4073471_01 temperature: 295.33
2018-03-26 19:05:11 HM485 HBW_1W_T10_HBW4073471_01 temperature_295.33
2018-03-26 19:05:21 HM485 HBW_1W_T10_HBW4073471_01 temperature: -32.48
2018-03-26 19:05:21 HM485 HBW_1W_T10_HBW4073471_01 temperature_-32.48
2018-03-26 19:05:31 HM485 HBW_1W_T10_HBW4073471_01 temperature: -32.48
2018-03-26 19:05:31 HM485 HBW_1W_T10_HBW4073471_01 temperature_-32.48


MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
stell mal den momentanen Stand der HBWDS18B20.cpp hier rein.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
Zitatstell mal den momentanen Stand der HBWDS18B20.cpp hier rein.
siehe Anhang.
MfG
  Vitalij

Thorsten Pferdekaemper

Sehr seltsam. Bist Du Dir auch ganz sicher, dass der Stand auf dem Arduino genau dem entspricht? Vielleicht ist da was beim Hochladen schief gegangen?
...zumindest manchmal sollte doch die richtige Temperatur ankommen.
FUIP

butaluk

Hi,
ich habe den Arduino Scetsh, den ich weiter oben gepostet habe, Testweise aufgespielt.
Der liefert richtige werte. So ist ausgeschlossen dass die Hardware nicht richtig läuft.
Laut Datenblatt vom DS18B20 sind die Messbare Temperaturbereiche von -55°C to +125°C.
Muss da nicht die XML Datei angepasst werden?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
nein, da muss nichts angepasst werden. Das passt schon so. Im Prinzip ist 295.33 der richtige Wert, nur halt dass da das "+273.15" anscheinend noch dabei war. Ansonsten entspricht das 22.18. Deswegen hatte ich gedacht, dass irgendwie die "+273.15" noch aktiv waren.
Kannst Du nochmal übersetzen und aufspielen?
Gruß,
   Thorsten
FUIP

butaluk

Hi
habe die .cpp Datei entsprechend angepasst:
#include "HBWDS18B20.h"

// Class HBWDS18B20
HBWDS18B20::HBWDS18B20(uint8_t _pin, hbw_config_ds18b20* _config) {
pin = _pin;
config = _config;
owbus = new OneWire(pin);
state = 0;
lastUpdateTime = 0;
}


void HBWDS18B20::loop(HBWDevice* device, uint8_t channel) {
uint32_t now = millis();
if(state == 0 && (now - lastUpdateTime >= 9000)) {
// start measurement
owbus->reset();
owbus->write(0xCC);
owbus->write(0x44);
state = 1;
lastUpdateTime = now;
}
else if(state == 1 && (now -lastUpdateTime >= 1000)) {
// read temperature
owbus->reset();
owbus->write(0xCC);
owbus->write(0xBE);
// TODO: CRC check, different resolutions etc.
//////////////
//////////////
byte data[2];
/////////////
//////////////
data[0] = owbus->read();
data[1] = owbus->read();
int16_t raw = (data[1] << 8) | data[0];

//int16_t raw = owbus->read() + owbus->read() << 8;
int16_t value = raw / 16;// + 27315; 
// send data via wired bus    
device->sendInfoMessage(channel, 2, (uint8_t*)(&value));
state = 0;
lastUpdateTime = now;
};
}


Nun kommen einigermassen stabile Werte, aber etwas zu hoch.

2018-03-27 18:58:25 HM485 HBW_1W_T10_HBW4073471_01 temperature: 58.88
2018-03-27 18:58:25 HM485 HBW_1W_T10_HBW4073471_01 temperature_58.88
2018-03-27 18:58:35 HM485 HBW_1W_T10_HBW4073471_01 temperature: 71.68
2018-03-27 18:58:35 HM485 HBW_1W_T10_HBW4073471_01 temperature_71.68
2018-03-27 18:58:45 HM485 HBW_1W_T10_HBW4073471_01 temperature: 69.12
2018-03-27 18:58:45 HM485 HBW_1W_T10_HBW4073471_01 temperature_69.12
2018-03-27 18:58:55 HM485 HBW_1W_T10_HBW4073471_01 temperature: 66.56
2018-03-27 18:58:55 HM485 HBW_1W_T10_HBW4073471_01 temperature_66.56
2018-03-27 18:59:05 HM485 HBW_1W_T10_HBW4073471_01 temperature: 64.00
2018-03-27 18:59:05 HM485 HBW_1W_T10_HBW4073471_01 temperature_64.00
2018-03-27 18:59:15 HM485 HBW_1W_T10_HBW4073471_01 temperature: 64.00
2018-03-27 18:59:15 HM485 HBW_1W_T10_HBW4073471_01 temperature_64.00
2018-03-27 18:59:25 HM485 HBW_1W_T10_HBW4073471_01 temperature: 61.44
t
Der Temp. Anstieg kommt vom leichten erwärmen mit dem Finger.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
irgendwie kann ich nicht erkennen, was da jetzt wirklich anders sein soll, bis darauf, dass Du die Nachkommastellen abschneidest und dann nicht mit 100 multiplizierst. D.h. Deine Ausgabe entspricht so in etwa der Temperatur auf der Oberfläche der Sonne. Aber in der Tat ist es "stabiler".
Ich glaube, dass wir basierend darauf weitermachen können. Es scheinen mir im Wesentlichen Low- und High-Byte vertauscht zu sein.
Versuch's mal so:

                data[0] = owbus->read();
data[1] = owbus->read();
int32_t value = (data[1] << 8) | data[0];
                value = value * 100 / 16;
                // high byte first
                data[0] = value >> 8;
                data[1] = value & 0xFF;
// send data via wired bus    
device->sendInfoMessage(channel, 2, data);

Gruß,
    Thorsten
FUIP

butaluk

Hallo Thorsten,

das sieht jetzt ganz GUT aus:
2018-03-28 09:56:20 HM485 HBW_1W_T10_HBW4073471_01 temperature: 23.12
2018-03-28 09:56:20 HM485 HBW_1W_T10_HBW4073471_01 temperature_23.12
2018-03-28 09:56:30 HM485 HBW_1W_T10_HBW4073471_01 temperature: 28.81
2018-03-28 09:56:30 HM485 HBW_1W_T10_HBW4073471_01 temperature_28.81
2018-03-28 09:56:40 HM485 HBW_1W_T10_HBW4073471_01 temperature: 30.68
2018-03-28 09:56:40 HM485 HBW_1W_T10_HBW4073471_01 temperature_30.68
2018-03-28 09:56:50 HM485 HBW_1W_T10_HBW4073471_01 temperature: 28.50
2018-03-28 09:56:50 HM485 HBW_1W_T10_HBW4073471_01 temperature_28.50
2018-03-28 09:57:00 HM485 HBW_1W_T10_HBW4073471_01 temperature: 26.06
2018-03-28 09:57:00 HM485 HBW_1W_T10_HBW4073471_01 temperature_26.06
2018-03-28 09:57:10 HM485 HBW_1W_T10_HBW4073471_01 temperature: 25.06
2018-03-28 09:57:10 HM485 HBW_1W_T10_HBW4073471_01 temperature_25.06
2018-03-28 09:57:20 HM485 HBW_1W_T10_HBW4073471_01 temperature: 24.62
2018-03-28 09:57:20 HM485 HBW_1W_T10_HBW4073471_01 temperature_24.62

Die Temperatur wird nun richtig und stabil übermittelt.

Danke!

Nun würde ich gerne weitere Temp. Sensoren an den 1-Wire Bus anschließen und die Temp. Werte mit weiteren Kanälen an den RaspPi übermitteln.
Und noch eine Frage, wie integriere ich die Einstellungen von den Sensor Einstellungen im Fhem?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
ich fahr jetzt ein paar Tage weg...
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
zu Deiner Mail: Ich will mir das jetzt nicht alles zusammensuchen müssen. Könntest Du mal den aktuellen Haupt-Sketch dranhängen sowie die aktuelle XML-Datei?
Gruß,
   Thorsten
FUIP

butaluk

Hi,
im Anhang sind die Aktuellen Daten...

MfG
   Vitalij

Thorsten Pferdekaemper

Hi,
ist es für Dich akzeptabel, wenn die einzelnen Sensoren an unterschiedlichen Pins hängen? Die Sache mit den Adressen der einzelnen Sensoren, wenn sie nacheinander am selben Bus hängen, ist etwas kompliziert und das ganze würde einiges an Änderungen brauchen. Die Zeit habe ich momentan nicht.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
für meinen Heizungssteuerkreis Erdgeschoss, der aus 9 kreisen besteht, benötige ich 9 Ausgänge vom Arduino um jeden Kreis einzeln anzusteuern. Desweiteren bebötige ich 9 1-Wire Temperatursensoren um die Rücktemperatur zu messen. Das ganze vollte ich an einem Arduino Nano realisieren. Wenn die Temperatursensoren an unterschiedlichen Pins hängen werden, ist der Arduino kommplet belegt und ich habe keine reserven mehr.
Ich würde gerne die Heizungssteuerung  mit einem 1-Wire Bus Anschluss realisieren.


MfG
  Vitalij

Beta-User

Die DS80x20 si d sowieso Bus-Geräte. Da müsste ein Pin reichen, dann die einzenen Sensoren am besten über die HW-Adresse ansprechen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Thorsten Pferdekaemper

Hi,
@Beta-User: Ja, das ist klar, aber das ganze dann zu integrieren ist gar nicht so einfach, wenn die Programmierkenntnisse eher begrenzt sind.

@butaluk: Schau Dir mal an, wie das in der angehängten Datei läuft. Im Prinzip ist in sensorAddressesGet zu sehen, wie man die Adressen der Devices am 1-Wire-Bus ermittelt. Die musst Du dann benutzen, um jeweils einen bestimmten Sensor zu addressieren. Wie das wiederum geht kann man sehen in oneWireStartConversion bzw. oneWireReadTemp.

Gruß,
   Thorsten
FUIP