35 explicit OneWireBus(uint8_t pinNumber)
36 : pin(pinNumber), nextBus(
nullptr), lastReadTime(0), oneWire(pinNumber) {
37 SUPLA_LOG_DEBUG(
"Initializing OneWire bus at pin %d", pinNumber);
38 sensors.setOneWire(&oneWire);
40 if (sensors.isParasitePowerMode()) {
41 SUPLA_LOG_DEBUG(
"OneWire(pin %d) Parasite power is ON", pinNumber);
43 SUPLA_LOG_DEBUG(
"OneWire(pin %d) Parasite power is OFF", pinNumber);
47 "OneWire(pin %d) Found %d devices:",
49 sensors.getDeviceCount());
53 DeviceAddress address;
55 for (
int i = 0; i < sensors.getDeviceCount(); i++) {
56 if (!sensors.getAddress(address, i)) {
57 SUPLA_LOG_DEBUG(
"Unable to find address for Device %d", i);
60 strAddr,
sizeof(strAddr),
61 "{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}",
70 SUPLA_LOG_DEBUG(
"Index %d - address %s", i, strAddr);
71 sensors.setResolution(address, 12);
75 sensors.setWaitForConversion(
true);
76 sensors.requestTemperatures();
77 sensors.setWaitForConversion(
false);
80 int8_t getIndex(uint8_t *deviceAddress) {
81 DeviceAddress address;
82 for (
int i = 0; i < sensors.getDeviceCount(); i++) {
83 if (sensors.getAddress(address, i)) {
85 for (
int j = 0; j < 8; j++) {
86 if (deviceAddress[j] != address[j]) {
100 uint32_t lastReadTime;
101 DallasTemperature sensors;
107class DS18B20 :
public Thermometer {
109 explicit DS18B20(uint8_t pin, uint8_t *deviceAddress =
nullptr) {
113 lastValidValue = TEMPERATURE_NOT_AVAILABLE;
118 if (bus->pin == pin) {
129 SUPLA_LOG_DEBUG(
"Creating OneWire bus for pin: %d", pin);
132 prevBus->nextBus = myBus;
137 if (deviceAddress ==
nullptr) {
139 "Device address not provided. Using device from index 0");
141 memcpy(address, deviceAddress, 8);
146 if (millis() - myBus->lastReadTime > 10000) {
147 myBus->sensors.requestTemperatures();
148 myBus->lastReadTime = millis();
150 if (millis() - myBus->lastReadTime > 5000 &&
151 (lastReadTime != myBus->lastReadTime)) {
152 channel.setNewValue(getValue());
153 lastReadTime = myBus->lastReadTime;
158 double value = TEMPERATURE_NOT_AVAILABLE;
159 if (address[0] == 0) {
160 value = myBus->sensors.getTempCByIndex(0);
162 value = myBus->sensors.getTempC(address);
165 if (value == DEVICE_DISCONNECTED_C || value == 85.0) {
166 value = TEMPERATURE_NOT_AVAILABLE;
169 if (value == TEMPERATURE_NOT_AVAILABLE) {
171 if (retryCounter > 3) {
174 value = lastValidValue;
179 lastValidValue = value;
184 DallasTemperature &getHwSensors() {
185 return myBus->sensors;
189 static OneWireBus *oneWireBus;
191 DeviceAddress address;
193 double lastValidValue;