diff --git a/interface/src/project/deviceValue.ts b/interface/src/project/deviceValue.ts index eb27a6f71..3134bdca3 100644 --- a/interface/src/project/deviceValue.ts +++ b/interface/src/project/deviceValue.ts @@ -31,7 +31,7 @@ export function formatValue( uom: DeviceValueUOM ) { if (typeof value !== 'number') { - return ''; + return value; } switch (uom) { case DeviceValueUOM.HOURS: @@ -41,10 +41,7 @@ export function formatValue( case DeviceValueUOM.SECONDS: return LL.NUM_SECONDS({ num: value }); case DeviceValueUOM.NONE: - if (typeof value === 'number') { - return new Intl.NumberFormat().format(value); - } - return value; + return new Intl.NumberFormat().format(value); case DeviceValueUOM.DEGREES: case DeviceValueUOM.DEGREES_R: case DeviceValueUOM.FAHRENHEIT: diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 3b2ab1c08..338fe5dfb 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -91,6 +91,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x4A5, "HPFan", true, MAKE_PF_CB(process_HpFan)); } + // some gas boilers, see #1701 + if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) { + register_telegram_type(0x2E, "Meters", false, MAKE_PF_CB(process_Meters)); + register_telegram_type(0x3B, "Energy", false, MAKE_PF_CB(process_Energy)); + } + if (model() == EMSdevice::EMS_DEVICE_FLAG_HIU) { register_telegram_type(0x772, "HIUSettings", false, MAKE_PF_CB(process_HIUSettings)); register_telegram_type(0x779, "HIUMonitor", false, MAKE_PF_CB(process_HIUMonitor)); @@ -389,6 +395,29 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const 99); } */ + if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) { + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &meterHeat_, + DeviceValueType::UINT24, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(meterHeat), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DHW1, &meterWw_, DeviceValueType::UINT24, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(meterWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &gasMeterHeat_, + DeviceValueType::UINT24, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(gasMeterHeat), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DHW1, &gasMeterWw_, DeviceValueType::UINT24, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(gasMeterWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &nrgHeat2_, + DeviceValueType::UINT24, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(nrgHeat2), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DHW1, &nrgWw2_, DeviceValueType::UINT24, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(nrgWw2), DeviceValueUOM::KWH); + } // heatpump info if (model() == EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) { @@ -617,7 +646,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(auxHeaterOff), DeviceValueUOM::NONE, MAKE_CF_CB(set_additionalHeater)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxHeaterStatus_, DeviceValueType::BOOL, FL_(auxHeaterStatus), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxHeaterStatus_, DeviceValueType::UINT8, FL_(auxHeaterStatus), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxHeaterDelay_, DeviceValueType::UINT16, @@ -1134,10 +1163,12 @@ void Boiler::process_UBAFactory(std::shared_ptr telegram) { if (nomPower > 0 && nomPower_ == 0) { has_update(nomPower_, nomPower); } - set_minmax(&burnMinPower_, 0, max); - set_minmax(&burnMaxPower_, min, max); - set_minmax(&wwMaxPower_, min, max); - set_minmax(&selBurnPow_, 0, max); + if (min <= max) { + set_minmax(&burnMinPower_, 0, max); + set_minmax(&burnMaxPower_, min, max); + set_minmax(&wwMaxPower_, min, max); + set_minmax(&selBurnPow_, 0, max); + } } // 0x18 @@ -1562,14 +1593,15 @@ void Boiler::process_UBAEnergySupplied(std::shared_ptr telegram) //XR1A050001 A05 Pump Heat circuit (1.0 ) 1 >> 1 & 0x01 ? //XR1A040001 A04 Pump Cold circuit (1.0 ) 1 & 0x1 ? void Boiler::process_HpPower(std::shared_ptr telegram) { - has_update(telegram, hpPower_, 11); + has_bitupdate(telegram, hpSwitchValve_, 0, 4); has_bitupdate(telegram, hpCompOn_, 3, 4); has_bitupdate(telegram, hpEA0_, 3, 6); - has_update(telegram, hpBrinePumpSpd_, 5); - has_update(telegram, hpCompSpd_, 17); has_update(telegram, hpCircSpd_, 4); - has_bitupdate(telegram, hpSwitchValve_, 0, 4); + has_update(telegram, hpBrinePumpSpd_, 5); + has_update(telegram, auxHeaterStatus_, 6); has_update(telegram, hpActivity_, 7); + has_update(telegram, hpPower_, 11); + has_update(telegram, hpCompSpd_, 17); // has_update(hpHeatingOn_, hpActivity_ == 1 ? 0xFF : 0); // has_update(hpCoolingOn_, hpActivity_ == 2 ? 0xFF : 0); @@ -1861,7 +1893,7 @@ void Boiler::process_HpSilentMode(std::shared_ptr telegram) { // Boiler(0x08) -B-> All(0x00), ?(0x0488), data: 8E 00 00 00 00 00 01 03 void Boiler::process_HpValve(std::shared_ptr telegram) { - has_bitupdate(telegram, auxHeaterStatus_, 0, 2); + // has_bitupdate(telegram, auxHeaterStatus_, 0, 2); has_update(telegram, auxHeatMixValve_, 7); } @@ -1948,6 +1980,20 @@ void Boiler::process_HpFan(std::shared_ptr telegram) { has_update(telegram, fan_, 9); } +// Boiler(0x08) -B-> All(0x00), ?(0x2E), data: 00 00 1C CE 00 00 05 E8 00 00 00 18 00 00 00 02 +void Boiler::process_Meters(std::shared_ptr telegram) { + has_update(telegram, gasMeterHeat_, 0); + has_update(telegram, gasMeterWw_, 4); + has_update(telegram, meterHeat_, 8); + has_update(telegram, meterWw_, 12); +} + +// boiler(0x08) -B-> All(0x00), ?(0x3B), data: 00 00 1B D1 00 00 05 7F +void Boiler::process_Energy(std::shared_ptr telegram) { + has_update(telegram, nrgHeat2_, 0); + has_update(telegram, nrgWw2_, 4); +} + // HIU unit // boiler(0x08) -B-> All(0x00), ?(0x0779), data: 06 05 01 01 AD 02 EF FF FF 00 00 7F FF diff --git a/src/devices/boiler.h b/src/devices/boiler.h index eb984b401..cc44873db 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -225,11 +225,15 @@ class Boiler : public EMSdevice { uint32_t nrgTotal_; uint32_t nrgWw_; uint32_t nrgHeat_; + uint32_t nrgWw2_; + uint32_t nrgHeat2_; uint32_t meterTotal_; uint32_t meterComp_; uint32_t meterEHeat_; uint32_t meterHeat_; uint32_t meterWw_; + uint32_t gasMeterHeat_; + uint32_t gasMeterWw_; uint8_t hpEA0_; uint8_t hpPumpMode_; uint8_t hpSetDiffPress_; @@ -367,6 +371,10 @@ class Boiler : public EMSdevice { void process_HpMeters(std::shared_ptr telegram); void process_WeatherComp(std::shared_ptr telegram); void process_HpFan(std::shared_ptr telegram); + + void process_Meters(std::shared_ptr telegram); + void process_Energy(std::shared_ptr telegram); + // HIU void process_HIUSettings(std::shared_ptr telegram); void process_HIUMonitor(std::shared_ptr telegram); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 3fb3f64c9..59a2049d6 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1203,6 +1203,12 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { // type 02F6 // RC300WWmode(0x2F6), data: 02 FF 04 00 00 00 08 05 00 08 04 00 00 00 00 00 00 00 00 00 01 void Thermostat::process_RC300WW2mode(std::shared_ptr telegram) { + telegram->read_value(wwCircuit2_, 0); + if (wwCircuit2_ == 0) { + toggle_fetch(telegram->type_id, false); + return; + } + toggle_fetch(telegram->type_id, true); has_update(telegram, wwCircPump2_, 1); // FF=off, 0=on ? if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) { @@ -1227,6 +1233,9 @@ void Thermostat::process_RC300WW2mode(std::shared_ptr telegram) // types 0x31D and 0x31E // RC300WWmode2(0x31D), data: 00 00 09 07 void Thermostat::process_RC300WWmode2(std::shared_ptr telegram) { + if (telegram->type_id == 0x31E && wwCircuit2_ == 0) { + return; + } // 0x31D for WW system 1, 0x31E for WW system 2 // pos 1 = holiday mode // pos 2 = current status of DHW setpoint @@ -3887,7 +3896,7 @@ void Thermostat::register_device_values() { DeviceValueUOM::MINUTES, MAKE_CF_CB(set_wwchargeduration)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwCharge_, DeviceValueType::BOOL, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); - register_device_value(DeviceValueTAG::TAG_DHW1, &wwExtra1_, DeviceValueType::UINT8, FL_(wwExtra1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwExtra1_, DeviceValueType::UINT8, FL_(wwExtra), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DHW1, &wwDisinfecting_, DeviceValueType::BOOL, @@ -3940,7 +3949,7 @@ void Thermostat::register_device_values() { DeviceValueUOM::MINUTES, MAKE_CF_CB(set_wwchargeduration)); register_device_value(DeviceValueTAG::TAG_DHW2, &wwCharge2_, DeviceValueType::BOOL, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); - register_device_value(DeviceValueTAG::TAG_DHW2, &wwExtra2_, DeviceValueType::UINT8, FL_(wwExtra2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DHW2, &wwExtra2_, DeviceValueType::UINT8, FL_(wwExtra), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DHW2, &wwDisinfecting2_, DeviceValueType::BOOL, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index aa75d7a38..35654ea4c 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -220,6 +220,7 @@ class Thermostat : public EMSdevice { uint8_t humidity_; uint8_t battery_; + uint8_t wwCircuit2_ = EMS_VALUE_UINT8_NOTSET; // not published, initialize here uint8_t wwExtra1_; // wwExtra active for wwSystem 1 uint8_t wwExtra2_; uint8_t wwMode_; diff --git a/src/locale_translations.h b/src/locale_translations.h index 46422f8ba..5aad2920a 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -543,12 +543,16 @@ MAKE_TRANSLATION(releaseWait, "releasewait", "boiler release wait time", "Wartez MAKE_TRANSLATION(nrgTotal, "nrgtotal", "total energy", "Energie gesamt", "", "", "całkowita energia", "", "", "", "", "celková energia") // TODO translate MAKE_TRANSLATION(nrgHeat, "nrgheat", "energy heating", "Energie Heizen", "", "", "energia na ogrzewanie", "", "", "ısıtma enerjisi", "", "energetické vykurovanie") // TODO translate MAKE_TRANSLATION(nrgWw, "nrgdhw", "energy", "Energie", "", "", "energia", "", "", "sıcak kullanım suyu enerjisi", "", "energia") // TODO translate +MAKE_TRANSLATION(nrgHeat2, "nrgheat2", "energy heating 2", "Energie Heizen 2", "", "", "energia na ogrzewanie 2", "", "", "ısıtma enerjisi 2", "", "energetické vykurovanie") // TODO translate +MAKE_TRANSLATION(nrgWw2, "nrgdhw2", "energy 2", "Energie 2", "", "", "energia 2", "", "", "sıcak kullanım suyu enerjisi 2", "", "energia 2") // TODO translate MAKE_TRANSLATION(nomPower, "nompower", "nominal Power", "Brennerleistung", "", "", "moc nominalna", "", "", "nominal güç", "", "nominálny výkon") // TODO translate MAKE_TRANSLATION(meterTotal, "metertotal", "meter total", "Messung gesamt", "", "", "licznik całkowity", "", "", "", "", "meter celkom") // TODO translate MAKE_TRANSLATION(meterComp, "metercomp", "meter compressor", "Messung Kompressor", "", "", "licznik sprężarki", "", "", "", "", "meter kompresor") // TODO translate MAKE_TRANSLATION(meterEHeat, "metereheat", "meter e-heater", "Messung E-Heizer", "", "", "licznik dogrzewacza", "", "", "", "", "elektrický ohrievač") // TODO translate MAKE_TRANSLATION(meterHeat, "meterheat", "meter heating", "Messung Heizen", "", "", "licznik ogrzewania", "", "", "", "", "") // TODO translate MAKE_TRANSLATION(meterWw, "meterdhw", "meter", "Messung", "", "", "licznik", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(gasMeterHeat, "gasmeterheat", "gas meter heating", "Gas Messung Heizen", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(gasMeterWw, "gasmeterdhw", "gas meter", "Gas Messung", "", "", "", "", "", "", "", "") // TODO translate // HIU MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp", "System Vorlauftemperatur", "Netto aanvoertemperatuur", "", "temp. zasilania sieci cieplnej", "", "", "ısıtma şebekesi akış derecesi", "temperatura di mandata della rete di riscaldamento", "teplota prívodu tepelnej siete") // TODO translate @@ -636,8 +640,7 @@ MAKE_TRANSLATION(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabse MAKE_TRANSLATION(wwMode, "mode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode", "mod", "modalità", "režim") MAKE_TRANSLATION(wwSetTempLow, "settemplow", "set low temperature", "untere Solltemperatur", "Onderste streeftemperatuur", "Nedre Börvärde", "zadana temperatura obniżona", "nedre settverdi", "réglage température basse", "hedef düşük sıcaklık", "imposta bassa temperatura", "nastaviť nízku teplotu") MAKE_TRANSLATION(wwWhenModeOff, "whenmodeoff", "when thermostat mode off", "bei Thermostatmodus AUS", "Als Thermostaat op UIT", "när Termostatläge är AV", "gdy wyłączono na termostacie", "når modus er av", "lorsque mode thermostat off", "termostat modu kapalı olduğunda", "quando termostato modalita OFF", "keď je režim termostatu vypnutý") -MAKE_TRANSLATION(wwExtra1, "extra1", "circuit 1 extra", "Kreis 1 Extra", "Circuit 1 extra", "Krets 1 Extra", "obieg dodatkowy 1", "ekstra krets 1", "circuit 1 extra", "devre 1 ekstra", "Circuito 1 extra", "okruh 1 extra") -MAKE_TRANSLATION(wwExtra2, "extra2", "circuit 2 extra", "Kreis 2 Extra", "Circuit 2 extra", "Kets 2 Extra", "obieg dodatkowy 2", "ekstra krets 2", "circuit 2 extra", "devre 2 ekstra", "Circuito 2 extra", "okruh 2 extra") +MAKE_TRANSLATION(wwExtra, "extra", "extra", "Extra", "extra", "Extra", "obieg", "ekstra", "extra", "ekstra", "extra", "extra") MAKE_TRANSLATION(wwCharge, "charge", "charge", "Laden", "Laden", "Ladda", "grzanie", "lade", "charge", "doldurma", "carica", "nabiť") MAKE_TRANSLATION(wwChargeDuration, "chargeduration", "charge duration", "Ladedauer", "Laadtijd", "Laddtid", "czas grzania dodatkowej ciepłej wody", "ladetid", "durée charge", "doldurma süresi", "durata carica", "doba nabíjania") MAKE_TRANSLATION(wwDisinfect, "disinfect", "disinfection", "Desinfektion", "Desinfectie", "Desinfektion", "dezynfekcja termiczna", "desinfeksjon", "désinfection", "dezenfeksiyon", "disinfezione", "dezinfekcia")