pull/170/head
Fredrik Öhrström 2020-09-02 14:38:47 +02:00
commit 92c003f4b5
11 zmienionych plików z 292 dodań i 12 usunięć

Wyświetl plik

@ -0,0 +1,26 @@
name: Promote snap from edge to stable channel
on:
push:
tags:
- '*'
jobs:
initial_sleep:
runs-on: ubuntu-latest
steps:
- name: Sleep for 30 minutes
uses: jakejarvis/wait-action@master
with:
time: '30m'
promote:
needs: initial_sleep
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: git fetch --prune --unshallow
- name: Install Snapcraft
uses: samuelmeuli/action-snapcraft@v1
with:
snapcraft_token: ${{ secrets.snapcraft_token }}
- name: Run promote script
run: bash snap/promote_snap.sh

Wyświetl plik

@ -1,3 +1,12 @@
Avandorp added support for the AquaMetro / Integra Topas Es Kr water meter.
Thanks Avandorp!
IzeCube added the Techem Compact V heatmeter!
Thanks IzeCube! Though we still need an example telegram for
testing this meter to prevent regressions. So it is currently
not as well supported as the other meters.
Version 0.9.35: 2020-08-23
Added support for alarms (shell command triggered)

Wyświetl plik

@ -139,6 +139,7 @@ METER_OBJS:=\
$(BUILD)/meter_rfmamb.o \
$(BUILD)/meter_rfmtx1.o \
$(BUILD)/meter_supercom587.o \
$(BUILD)/meter_topaseskr.o \
$(BUILD)/meter_vario451.o \
$(BUILD)/meter_waterstarm.o \
$(BUILD)/printer.o \

Wyświetl plik

@ -222,34 +222,36 @@ rtl_wmbus (rtlwmbus)
rtl_433 (rtl433)
Supported water meters:
Apator at-wmbus-08 (apator08) (non-standard protocol)
Apator at-wmbus-16-2 (apator162) (non-standard protocol)
Aquametro/Integra Topas Es Kr (topaseskr)
Bmeters Hydrodigit (hydrodigit) (partly non-standard protocol)
Diehl/Sappel IZAR RC 868 I R4 PL (izar) (non-standard protocol)
Diehl HYDRUS (hydrus)
Honeywell Q400 (q400)
Kamstrup Multical 21 (multical21)
Kamstrup flowIQ 3100 (flowiq3100)
Sontex Supercom 587 (supercom587)
Sensus iPERL (iperl)
Apator at-wmbus-08 (apator08) (non-standard protocol)
Apator at-wmbus-16-2 (apator162) (non-standard protocol)
Techem MK Radio 3 (mkradio3) (non-standard protocol)
Diehl/Sappel IZAR RC 868 I R4 PL (izar) (non-standard protocol)
Diehl HYDRUS (hydrus)
Bmeters Hydrodigit (hydrodigit) (partly non-standard protocol)
Honeywell Q400 (q400)
Waterstar M (waterstarm)
Supported heat cost allocators:
Qundis Q caloric (qcaloric)
Innotas EurisII (eurisii)
Qundis Q caloric (qcaloric)
Techem FHKV data II/III (fhkvdataiii)
Supported heat meter:
Heat meter Techem Compact V (compact5) (non-standard protocol)
(compact5 is unfortunately not quite supported since we lack a test telegram to prevent regressions)
Heat meter Techem Vario 4 (vario451) (non-standard protocol)
Heat meter Kamstrup Multical 302 (multical302) (in C1 mode, please open issue for T1 mode)
Heat and Cooling meter Kamstrup Multical 403 (multical403) (in C1 mode)
Supported room sensors:
Lansen Thermometer/Hygrometer (lansenth)
Bmeters RFM-AMB Thermometer/Hygrometer (rfmamb)
Elvaco CMa12w Thermometer (cma12w)
Lansen Thermometer/Hygrometer (lansenth)
Supported smoke detectors:
Lansen Smoke Detector (lansensm)
@ -261,10 +263,10 @@ Supported pulse counter:
Lansen Pulse Counter (lansenpu)
Supported electricity meters:
Tauron Amiplus (amiplus) (includes vendor apator and echelon)
EMH Metering (ehzp)
Easy Meter ESYS-WM20 (esyswm)
eBZ wMB-E01 (ebzwmbe)
EMH Metering (ehzp)
Tauron Amiplus (amiplus) (includes vendor apator and echelon)
```
The wmbus dongles imst871a can listen to one type of wmbus telegrams

Wyświetl plik

@ -153,3 +153,9 @@ telegram=|4644B4097172737405077AA5000610|1115F78184AB0F1D1E200000005904103103208
telegram=|3944FA122162092002067A3600202567C94D48D00DC47B11213E23383DB51968A705AAFA60C60E263D50CD259D7C9A03FD0C08000002FD0B0011|
{"media":"warm water","meter":"waterstarm","name":"Woter","id":"20096221","meter_timestamp":"2020-07-30 10:40","total_m3":0.106,"total_backwards_m3":0,"current_status":"OK","meter_version":"000008","parameter_set":"1100","timestamp":"1111-11-11T11:11:11Z"}
|Woter;20096221;0.106000;0.000000;OK;1111-11-11 11:11.11
# Test topaseskr water meter
telegram=|4E44B40512345678F1077A310040052F2F|01FD08040C13991848004C1359423500CC101300000000CC201359423500426C7F2C0B3B00000002FD74DA10025AD300C4016D3B179F27CC011387124600|
{"media":"water","meter":"topaseskr","name":"Witer","id":"78563412","total_m3":481.899,"temperature_c":21.1,"current_flow_m3h":0,"battery_life_days_remaining_remaining":"4314","volume_year_period_m3":354.259,"reverse_volume_year_period_m3":0,"meter_year_period_start_date":"2019-12-31","volume_month_period_m3":461.287,"meter_month_period_start_datetime":"2020-07-31 23:59","timestamp":"1111-11-11T11:11:11Z"}
|Witer;78563412;481.899000;21.100000;0.000000;354.259000;0.000000;2019-12-31;461.287000;2020-07-31 23:59;1111-11-11 11:11.11

Wyświetl plik

@ -0,0 +1,38 @@
#!/bin/bash
SNAP_NAME="wmbusmeters"
ARCH_LIST="arm64 armhf amd64"
if [ -n "$(git describe --tags | grep -)" ]; then
GIT_REV="$(git describe --tags | cut -f1,2 -d'-')"
echo "$GIT_REV is branch not tag release, exiting.."
exit 1
else
GIT_VER="$(git describe --tags)"
echo "This is release - $GIT_VER"
fi
for arch in $ARCH_LIST
do
snap_build_version="$(snapcraft status --arch $arch $SNAP_NAME | grep edge | awk '{print $2}')"
c=0
while [[ "$GIT_VER" != "$snap_build_version" && $c -lt 10 ]]; do
echo "GIT release version "$GIT_VER" != snap latest edge version at snapcraft for $arch "$snap_build_version", iter : $c";
((c = $c + 1));
sleep 300;
snap_build_version="$(snapcraft status --arch $arch $SNAP_NAME | grep edge | awk '{print $2}')"
done
if [[ "$GIT_VER" != "$snap_build_version" ]]; then
echo "GIT release version "$GIT_VER" != snap latest edge version on snapcraft for $arch "$snap_build_version", exiting..";
exit 1
fi
done
for arch in $ARCH_LIST
do
snap_build_id="$(snapcraft status --arch $arch $SNAP_NAME | grep edge | awk '{print $3}')"
echo "Snap build id for arch $arch - $snap_build_id, promoting to stable release"
snapcraft release $SNAP_NAME $snap_build_id stable
done

Wyświetl plik

@ -35,7 +35,7 @@ parts:
source-type: git
override-pull: |
snapcraftctl pull
if [ -n $(git describe --tags | grep -) ]; then
if [ -n "$(git describe --tags | grep -)" ]; then
GIT_REV="$(git describe --tags | cut -f1,2 -d'-')"
snapcraftctl set-version "$GIT_REV"
snapcraftctl set-grade devel

Wyświetl plik

@ -0,0 +1,191 @@
/*
Copyright (C) 2017-2020 Fredrik Öhrström
2020 Avandorp
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include"dvparser.h"
#include"meters.h"
#include"meters_common_implementation.h"
#include"wmbus.h"
#include"wmbus_utils.h"
#include"util.h"
using namespace std;
/*
AquaMetro / Integra water meter "TOPAS ES KR"
Models TOPAS ES KR 95077 95056 95345 95490 95373 95059 95065 95068 95071 95074 should be compatible. Only 95059 in one configuration tested.
Identifies itself with Manufacturer "AMT" and Version "f1"
Product leaflet and observation says the following values are sent:
Current total volume
Total volume at end of year-period day (that means: current total volume - total volume at end of year-period day = current year-periods volume up until now)
Total backward volume on end of year-period day or total backward volume in current year-period. Backward volume remains untested (luckily only 0 values encountered).
Date of end of last year-period day
Total volume at end of last month-period dateTime
DateTime of end of last month-period
Current flow rate
Battery life (days left)
Water temperature
Example telegram:
telegram=|4E44B40512345678F1077A310040052F2F|01FD08040C13991848004C1359423500CC101300000000CC201359423500426C7F2C0B3B00000002FD74DA10025AD300C4016D3B179F27CC011387124600|+2
*/
struct MeterTopasEsKr : public virtual WaterMeter, public virtual MeterCommonImplementation {
MeterTopasEsKr(MeterInfo &mi);
double totalWaterConsumption(Unit u);
bool hasTotalWaterConsumption();
double flowTemperature(Unit u);
bool hasFlowTemperature();
private:
void processContent(Telegram *t);
double total_water_consumption_m3_ {};
double flow_temperature_ {};
double current_flow_m3h_ {};
string battery_life_days_remaining_ {};
double volume_year_period_m3_ {};
double reverse_volume_year_period_m3_ {};
double volume_month_period_m3_ {};
string meter_yearly_period_date_;
string meter_month_period_datetime_;
};
unique_ptr<WaterMeter> createTopasEsKr(MeterInfo &mi)
{
return unique_ptr<WaterMeter>(new MeterTopasEsKr(mi));
}
MeterTopasEsKr::MeterTopasEsKr(MeterInfo &mi) :
MeterCommonImplementation(mi, MeterType::TOPASESKR, MANUFACTURER_AMT)
{
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
addMedia(0x06); // specified temperature range is 0°C to 50 °C, not sure it ever reports 0x06 for warm water, possibly configurable
addMedia(0x07);
addLinkMode(LinkMode::T1);
addExpectedVersion(0xf1);
addPrint("total", Quantity::Volume,
[&](Unit u){ return totalWaterConsumption(u); },
"The total water consumption recorded by this meter.",
true, true);
addPrint("temperature", Quantity::Temperature,
[&](Unit u){ return flowTemperature(u); },
"Current water temperature recorded by this meter.",
true, true);
addPrint("current_flow", Quantity::Flow,
[&](Unit u){ return current_flow_m3h_; },
"Current flow.",
true, true);
addPrint("battery_life_days_remaining_remaining", Quantity::Text,
[&](){ return battery_life_days_remaining_; },
"Battery life [days remaining].",
false, true);
addPrint("volume_year_period", Quantity::Volume,
[&](Unit u){ return volume_year_period_m3_; },
"Volume up to end of last year-period.",
true, true);
addPrint("reverse_volume_year_period", Quantity::Volume,
[&](Unit u){ return reverse_volume_year_period_m3_; },
"Reverse volume in this year-period (?).",
true, true);
addPrint("meter_year_period_start_date", Quantity::Text,
[&](){ return meter_yearly_period_date_; },
"Meter date for year-period start.",
true, true);
addPrint("volume_month_period", Quantity::Volume,
[&](Unit u){ return volume_month_period_m3_; },
"Volume up to end of last month-period.",
true, true);
addPrint("meter_month_period_start_datetime", Quantity::Text,
[&](){ return meter_month_period_datetime_; },
"Meter timestamp for month-period start.",
true, true);
}
void MeterTopasEsKr::processContent(Telegram *t)
{
int offset;
string key;
if(findKey(MeasurementType::Unknown, ValueInformation::Volume, 0, 0, &key, &t->values)) {
extractDVdouble(&t->values, key, &offset, &total_water_consumption_m3_);
t->addMoreExplanation(offset, " total consumption (%f m3)", total_water_consumption_m3_);
}
if(findKey(MeasurementType::Unknown, ValueInformation::FlowTemperature, 0, 0, &key, &t->values)) {
extractDVdouble(&t->values, key, &offset, &flow_temperature_);
t->addMoreExplanation(offset, " water temperature (%f °C)", flow_temperature_);
}
if(findKey(MeasurementType::Unknown, ValueInformation::VolumeFlow, 0, 0, &key, &t->values)) {
extractDVdouble(&t->values, key, &offset, &current_flow_m3h_);
t->addMoreExplanation(offset, " current flow (%f m3/h)", current_flow_m3h_);
}
extractDVdouble(&t->values, "4C13", &offset, &volume_year_period_m3_);
t->addMoreExplanation(offset, " volume up to end of last year-period (%f m3)", volume_year_period_m3_);
extractDVdouble(&t->values, "CC1013", &offset, &reverse_volume_year_period_m3_);
t->addMoreExplanation(offset, " reverse volume in this year-period (?) (%f m3)", reverse_volume_year_period_m3_);
struct tm date;
extractDVdate(&t->values, "426C", &offset, &date);
meter_yearly_period_date_ = strdate(&date);
t->addMoreExplanation(offset, " meter_start_year_period_date (%s)", meter_yearly_period_date_.c_str());
extractDVdouble(&t->values, "CC0113", &offset, &volume_month_period_m3_);
t->addMoreExplanation(offset, " volume up to end of last month-period (%f m3)", volume_month_period_m3_);
struct tm datetime;
extractDVdate(&t->values, "C4016D", &offset, &datetime);
meter_month_period_datetime_ = strdatetime(&datetime);
t->addMoreExplanation(offset, " meter_start_month_period_datetime (%s)", meter_month_period_datetime_.c_str());
uint16_t tmp16;
extractDVuint16(&t->values, "02FD74", &offset, &tmp16);
strprintf(battery_life_days_remaining_, "%u", (unsigned int)tmp16);
t->addMoreExplanation(offset, " battery life (%s days remaining)", battery_life_days_remaining_.c_str());
vector<uchar> data;
t->extractMfctData(&data);
}
double MeterTopasEsKr::totalWaterConsumption(Unit u)
{
assertQuantity(u, Quantity::Volume);
return convert(total_water_consumption_m3_, Unit::M3, u);
}
bool MeterTopasEsKr::hasTotalWaterConsumption()
{
return true;
}
double MeterTopasEsKr::flowTemperature(Unit u)
{
assertQuantity(u, Quantity::Temperature);
return convert(flow_temperature_, Unit::C, u);
}
bool MeterTopasEsKr::hasFlowTemperature()
{
return true;
}

Wyświetl plik

@ -57,6 +57,8 @@
X(supercom587,T1_bit, Water, SUPERCOM587, Supercom587) \
X(vario451, T1_bit, Heat, VARIO451, Vario451) \
X(waterstarm, C1_bit|T1_bit, Water,WATERSTARM, WaterstarM) \
X(topaseskr, T1_bit, Water, TOPASESKR, TopasEsKr) \
enum class MeterType {
@ -254,6 +256,7 @@ unique_ptr<WaterMeter> createRfmTX1(MeterInfo &m);
unique_ptr<ElectricityMeter> createEHZP(MeterInfo &m);
unique_ptr<ElectricityMeter> createESYSWM(MeterInfo &m);
unique_ptr<ElectricityMeter> createEBZWMBE(MeterInfo &m);
unique_ptr<WaterMeter> createTopasEsKr(MeterInfo &m);
GenericMeter *createGeneric(MeterInfo &m);
#endif

Wyświetl plik

@ -105,6 +105,9 @@ Received telegram from: 74737271
Received telegram from: 20096221
manufacturer: (DWZ) Lorenz, Germany
device type: Warm Water (30°C-90°C) meter
Received telegram from: 78563412
manufacturer: (AMT) INTEGRA METERING
device type: Water meter
EOF
RES=$($PROG --logfile=$LOGFILE --t1 simulations/simulation_t1.txt 2>&1)

Wyświetl plik

@ -32,7 +32,8 @@ METERS="MyWarmWater supercom587 12345678 NOKEY
Elen3 ehzp 55995599 NOKEY
Vatten apator08 004444dd NOKEY
Wasser rfmtx1 74737271 NOKEY
Woter waterstarm 20096221 BEDB81B52C29B5C143388CBB0D15A051"
Woter waterstarm 20096221 BEDB81B52C29B5C143388CBB0D15A051
Witer topaseskr 78563412 NOKEY"
cat simulations/simulation_t1.txt | grep '^{' > $TEST/test_expected.txt
$PROG --format=json simulations/simulation_t1.txt $METERS > $TEST/test_output.txt