21 : pin(pinNumber), nextBus(
nullptr), lastReadTime(0), oneWire(pinNumber) {
22 SUPLA_LOG_DEBUG(
"Initializing OneWire bus at pin %d", pinNumber);
23 sensors.setOneWire(&oneWire);
25 if (sensors.isParasitePowerMode()) {
26 SUPLA_LOG_DEBUG(
"OneWire(pin %d) Parasite power is ON", pinNumber);
28 SUPLA_LOG_DEBUG(
"OneWire(pin %d) Parasite power is OFF", pinNumber);
32 "OneWire(pin %d) Found %d devices:",
34 sensors.getDeviceCount());
38 DeviceAddress address;
40 for (
int i = 0; i < sensors.getDeviceCount(); i++) {
41 if (!sensors.getAddress(address, i)) {
42 SUPLA_LOG_DEBUG(
"Unable to find address for Device %d", i);
45 strAddr,
sizeof(strAddr),
46 "{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}",
55 SUPLA_LOG_DEBUG(
"Index %d - address %s", i, strAddr);
56 sensors.setResolution(address, 12);
60 sensors.setWaitForConversion(
true);
61 sensors.requestTemperatures();
62 sensors.setWaitForConversion(
false);
65 int8_t getIndex(uint8_t *deviceAddress) {
66 DeviceAddress address;
67 for (
int i = 0; i < sensors.getDeviceCount(); i++) {
68 if (sensors.getAddress(address, i)) {
70 for (
int j = 0; j < 8; j++) {
71 if (deviceAddress[j] != address[j]) {
85 uint32_t lastReadTime;
86 DallasTemperature sensors;
94 explicit DS18B20(uint8_t pin, uint8_t *deviceAddress =
nullptr) {
98 lastValidValue = TEMPERATURE_NOT_AVAILABLE;
103 if (bus->pin == pin) {
114 SUPLA_LOG_DEBUG(
"Creating OneWire bus for pin: %d", pin);
117 prevBus->nextBus = myBus;
122 if (deviceAddress ==
nullptr) {
124 "Device address not provided. Using device from index 0");
126 memcpy(address, deviceAddress, 8);
131 if (millis() - myBus->lastReadTime > 10000) {
132 myBus->sensors.requestTemperatures();
133 myBus->lastReadTime = millis();
135 if (millis() - myBus->lastReadTime > 5000 &&
136 (lastReadTime != myBus->lastReadTime)) {
137 channel.setNewValue(getValue());
138 lastReadTime = myBus->lastReadTime;
143 double value = TEMPERATURE_NOT_AVAILABLE;
144 if (address[0] == 0) {
145 value = myBus->sensors.getTempCByIndex(0);
147 value = myBus->sensors.getTempC(address);
150 if (value == DEVICE_DISCONNECTED_C || value == 85.0) {
151 value = TEMPERATURE_NOT_AVAILABLE;
154 if (value == TEMPERATURE_NOT_AVAILABLE) {
156 if (retryCounter > 3) {
159 value = lastValidValue;
164 lastValidValue = value;
169 DallasTemperature &getHwSensors() {
170 return myBus->sensors;
174 static OneWireBus *oneWireBus;
176 DeviceAddress address;
178 double lastValidValue;