-
-
Notifications
You must be signed in to change notification settings - Fork 507
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: Add support for HERF inverters
- Loading branch information
Showing
22 changed files
with
301 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
|
||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Copyright (C) 2022-2024 Thomas Basler and others | ||
*/ | ||
#include "HERF_2CH.h" | ||
|
||
static const byteAssign_t byteAssignment[] = { | ||
{ TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, | ||
{ TYPE_DC, CH0, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, | ||
{ TYPE_DC, CH0, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, | ||
{ TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, | ||
{ TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, | ||
{ TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_CH_IRR, CH0, CMD_CALC, false, 3 }, | ||
|
||
{ TYPE_DC, CH1, FLD_UDC, UNIT_V, 4, 2, 10, false, 1 }, | ||
{ TYPE_DC, CH1, FLD_IDC, UNIT_A, 8, 2, 100, false, 2 }, | ||
{ TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, | ||
{ TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, | ||
{ TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, | ||
{ TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_CH_IRR, CH1, CMD_CALC, false, 3 }, | ||
|
||
{ TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, | ||
{ TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, | ||
{ TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, | ||
{ TYPE_AC, CH0, FLD_Q, UNIT_VAR, 32, 2, 10, false, 1 }, | ||
{ TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, | ||
{ TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, | ||
|
||
{ TYPE_INV, CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 }, | ||
{ TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 }, | ||
|
||
{ TYPE_INV, CH0, FLD_YD, UNIT_WH, CALC_TOTAL_YD, 0, CMD_CALC, false, 0 }, | ||
{ TYPE_INV, CH0, FLD_YT, UNIT_KWH, CALC_TOTAL_YT, 0, CMD_CALC, false, 3 }, | ||
{ TYPE_INV, CH0, FLD_PDC, UNIT_W, CALC_TOTAL_PDC, 0, CMD_CALC, false, 1 }, | ||
{ TYPE_INV, CH0, FLD_EFF, UNIT_PCT, CALC_TOTAL_EFF, 0, CMD_CALC, false, 3 } | ||
}; | ||
|
||
HERF_2CH::HERF_2CH(HoymilesRadio* radio, const uint64_t serial) | ||
: HM_Abstract(radio, serial) {}; | ||
|
||
bool HERF_2CH::isValidSerial(const uint64_t serial) | ||
{ | ||
// serial >= 0x282100000000 && serial <= 0x282199999999 | ||
uint16_t preSerial = (serial >> 32) & 0xffff; | ||
return preSerial == 0x2821; | ||
} | ||
|
||
String HERF_2CH::typeName() const | ||
{ | ||
return "HERF-800-2T"; | ||
} | ||
|
||
const byteAssign_t* HERF_2CH::getByteAssignment() const | ||
{ | ||
return byteAssignment; | ||
} | ||
|
||
uint8_t HERF_2CH::getByteAssignmentSize() const | ||
{ | ||
return sizeof(byteAssignment) / sizeof(byteAssignment[0]); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
#pragma once | ||
|
||
#include "HM_Abstract.h" | ||
|
||
class HERF_2CH : public HM_Abstract { | ||
public: | ||
explicit HERF_2CH(HoymilesRadio* radio, const uint64_t serial); | ||
static bool isValidSerial(const uint64_t serial); | ||
String typeName() const; | ||
const byteAssign_t* getByteAssignment() const; | ||
uint8_t getByteAssignmentSize() const; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Copyright (C) 2022-2024 Thomas Basler and others | ||
*/ | ||
#include "HERF_4CH.h" | ||
|
||
HERF_4CH::HERF_4CH(HoymilesRadio* radio, const uint64_t serial) | ||
: HM_4CH(radio, serial) {}; | ||
|
||
bool HERF_4CH::isValidSerial(const uint64_t serial) | ||
{ | ||
// serial >= 0x280100000000 && serial <= 0x280199999999 | ||
uint16_t preSerial = (serial >> 32) & 0xffff; | ||
return preSerial == 0x2801; | ||
} | ||
|
||
String HERF_4CH::typeName() const | ||
{ | ||
return "HERF-1600/1800-4T"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
#pragma once | ||
|
||
#include "HM_4CH.h" | ||
|
||
class HERF_4CH : public HM_4CH { | ||
public: | ||
explicit HERF_4CH(HoymilesRadio* radio, const uint64_t serial); | ||
static bool isValidSerial(const uint64_t serial); | ||
String typeName() const; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
<template> | ||
<input v-model="inputSerial" type="text" :id="id" :required="required" class="form-control" :class="inputClass" /> | ||
<BootstrapAlert show :variant="formatShow" v-if="formatHint">{{ formatHint }}</BootstrapAlert> | ||
</template> | ||
|
||
<script lang="ts"> | ||
import BootstrapAlert from './BootstrapAlert.vue'; | ||
import { defineComponent } from 'vue'; | ||
const chars32 = '0123456789ABCDEFGHJKLMNPRSTUVWXY'; | ||
export default defineComponent({ | ||
components: { | ||
BootstrapAlert, | ||
}, | ||
props: { | ||
'modelValue': { type: [String, Number], required: true }, | ||
'id': String, | ||
'inputClass': String, | ||
'required': Boolean, | ||
}, | ||
data() { | ||
return { | ||
inputSerial: "", | ||
formatHint: "", | ||
formatShow: "info", | ||
}; | ||
}, | ||
computed: { | ||
model: { | ||
get(): any { | ||
return this.modelValue; | ||
}, | ||
set(value: any) { | ||
this.$emit('update:modelValue', value); | ||
}, | ||
}, | ||
}, | ||
watch: { | ||
modelValue: function (val) { | ||
this.inputSerial = val; | ||
}, | ||
inputSerial: function (val) { | ||
const serial = val.toString().toUpperCase(); // Convert to lowercase for case-insensitivity | ||
if (serial == "") { | ||
this.formatHint = ""; | ||
this.model = ""; | ||
return; | ||
} | ||
this.formatShow = "info"; | ||
// Contains only numbers | ||
if (/^[\d]{12}$/.test(serial)) { | ||
this.model = serial; | ||
this.formatHint = this.$t('inputserial.format_hoymiles'); | ||
} | ||
// Contains numbers and hex characters but at least one number | ||
else if (/^(?=.*\d)[\dA-F]{12}$/.test(serial)) { | ||
this.model = serial; | ||
this.formatHint = this.$t('inputserial.format_converted'); | ||
} | ||
// Has format: xxxxxxxxx-xxx | ||
else if (/^((A01)|(A11)|(A21))[\dA-HJ-NR-YP]{6}-[\dA-HJ-NP-Z]{3}$/.test(serial)) { | ||
if (this.checkHerfChecksum(serial)) { | ||
this.model = this.convertHerfToHoy(serial); | ||
this.$nextTick(() => { | ||
this.formatHint = this.$t('inputserial.format_herf_valid', { serial: this.model }); | ||
}); | ||
} else { | ||
this.formatHint = this.$t('inputserial.format_herf_invalid'); | ||
this.formatShow = "danger"; | ||
} | ||
// Any other format | ||
} else { | ||
this.formatHint = this.$t('inputserial.format_unknown'); | ||
this.formatShow = "danger"; | ||
} | ||
} | ||
}, | ||
methods: { | ||
checkHerfChecksum(sn: string) { | ||
const chars64 = 'HMFLGW5XC301234567899Z67YRT2S8ABCDEFGHJKDVEJ4KQPUALMNPRSTUVWXYNB'; | ||
const checksum = sn.substring(sn.indexOf("-") + 1); | ||
const serial = sn.substring(0, sn.indexOf("-")); | ||
const first_char = '1'; | ||
const i = chars32.indexOf(first_char) | ||
const sum1: number = Array.from(serial).reduce((sum, c) => sum + c.charCodeAt(0), 0) & 31; | ||
const sum2: number = Array.from(serial).reduce((sum, c) => sum + chars32.indexOf(c), 0) & 31; | ||
const ext = first_char + chars64[sum1 + i] + chars64[sum2 + i]; | ||
return checksum == ext; | ||
}, | ||
convertHerfToHoy(sn: string) { | ||
let sn_int: bigint = 0n; | ||
for (let i = 0; i < 9; i++) { | ||
const pos: bigint = BigInt(chars32.indexOf(sn[i].toUpperCase())); | ||
const shift: bigint = BigInt(42 - 5 * i - (i <= 2 ? 0 : 2)); | ||
sn_int |= (pos << shift); | ||
} | ||
return sn_int.toString(16); | ||
} | ||
}, | ||
}); | ||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.