mirror of
https://github.com/UtilitechAS/amsreader-firmware.git
synced 2026-03-11 21:15:30 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c936f605d6 | ||
|
|
9d0ceb9ca8 | ||
|
|
b33273e3cc | ||
|
|
ab016fff93 | ||
|
|
a215aa7766 | ||
|
|
30d73c3a6e | ||
|
|
bd905c3595 | ||
|
|
1a2e70b1fb | ||
|
|
d6da7b2715 | ||
|
|
059a430f9a | ||
|
|
8ade50c2a6 | ||
|
|
5b94d8ff61 | ||
|
|
232b9c279d | ||
|
|
9b6a6af6ec | ||
|
|
9671e1eba3 | ||
|
|
2ddfc16d6a |
14
.github/workflows/release.yml
vendored
14
.github/workflows/release.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
id: release_tag
|
||||
env:
|
||||
GITHUB_REF: ${{ github.ref }}
|
||||
run: echo ::set-output name=tag::$(echo ${GITHUB_REF:11})
|
||||
run: echo ::set-env name=GITHUB_TAG::$(echo ${GITHUB_REF:11})
|
||||
- name: Cache Python dependencies
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
draft: false
|
||||
prerelease: false
|
||||
- name: Upload hw1esp12e binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
@@ -61,7 +61,7 @@ jobs:
|
||||
asset_name: ams2mqtt-hw1esp12e-${{ steps.release_tag.outputs.tag }}.bin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload esp12e binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
asset_name: ams2mqtt-esp12e-${{ steps.release_tag.outputs.tag }}.bin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload d1mini binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
@@ -79,7 +79,7 @@ jobs:
|
||||
asset_name: ams2mqtt-d1mini-${{ steps.release_tag.outputs.tag }}.bin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload esp32 binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
@@ -88,7 +88,7 @@ jobs:
|
||||
asset_name: ams2mqtt-esp32-${{ steps.release_tag.outputs.tag }}.bin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload lolind32 binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
@@ -97,7 +97,7 @@ jobs:
|
||||
asset_name: ams2mqtt-lolind32-${{ steps.release_tag.outputs.tag }}.bin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload featheresp32 binary to release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
|
||||
@@ -7,6 +7,9 @@ There is also a web interface available on runtime, showing meter data in real t
|
||||
|
||||
<img src="webui.jpg" width="480">
|
||||
|
||||
## Hardware options
|
||||
Look in [hardware section](/hardware) for more details about supported hardware
|
||||
|
||||
## Release binaries
|
||||
|
||||
In the [Release section](https://github.com/gskjold/AmsToMqttBridge/releases) of this repository, you will find precompiled binaries for some common boards.
|
||||
|
||||
BIN
doc/Aidon-HAN-Interface-Description-v11A-ID-34331.pdf
Normal file
BIN
doc/Aidon-HAN-Interface-Description-v11A-ID-34331.pdf
Normal file
Binary file not shown.
@@ -1,7 +1,7 @@
|
||||
import os
|
||||
|
||||
FILENAME_VERSION_H = 'src/version.h'
|
||||
version = os.environ.get('GITHUB_REF')
|
||||
version = os.environ.get('GITHUB_TAG')
|
||||
if version == None:
|
||||
version = "SNAPSHOT"
|
||||
|
||||
|
||||
@@ -163,10 +163,12 @@ void AmsData::extractFromAidon(HanReader& hanReader, int listSize) {
|
||||
activeExportPower = hanReader.getInt( (int)Aidon_List3PhaseIT::ActiveExportPower);
|
||||
reactiveExportPower = hanReader.getInt( (int)Aidon_List3PhaseIT::ReactiveExportPower);
|
||||
l1current = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::CurrentL1)) / 10;
|
||||
l2current = 0;
|
||||
l3current = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::CurrentL3)) / 10;
|
||||
l1voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL1)) / 10;
|
||||
l2voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL2)) / 10;
|
||||
l3voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL3)) / 10;
|
||||
//l2current = ((activeImportPower * sqrt(3)) - (l1voltage * l1current) - (l3voltage * l3current)) / l2voltage;
|
||||
threePhase = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -48,15 +48,15 @@ public:
|
||||
bool isThreePhase();
|
||||
|
||||
private:
|
||||
unsigned long lastUpdateMillis;
|
||||
int listType;
|
||||
unsigned long packageTimestamp;
|
||||
unsigned long lastUpdateMillis = 0;
|
||||
int listType = 0;
|
||||
unsigned long packageTimestamp = 0;
|
||||
String listId, meterId, meterType;
|
||||
unsigned long meterTimestamp;
|
||||
int activeImportPower, reactiveImportPower, activeExportPower, reactiveExportPower;
|
||||
double l1voltage, l2voltage, l3voltage, l1current, l2current, l3current;
|
||||
double activeImportCounter, reactiveImportCounter, activeExportCounter, reactiveExportCounter;
|
||||
bool threePhase;
|
||||
unsigned long meterTimestamp = 0;
|
||||
int activeImportPower = 0, reactiveImportPower = 0, activeExportPower = 0, reactiveExportPower = 0;
|
||||
double l1voltage = 0, l2voltage = 0, l3voltage = 0, l1current = 0, l2current = 0, l3current = 0;
|
||||
double activeImportCounter = 0, reactiveImportCounter = 0, activeExportCounter = 0, reactiveExportCounter = 0;
|
||||
bool threePhase = false;
|
||||
|
||||
void extractFromKaifa(HanReader& hanReader, int listSize);
|
||||
void extractFromAidon(HanReader& hanReader, int listSize);
|
||||
|
||||
@@ -1,8 +1,20 @@
|
||||
/*
|
||||
Name: AmsToMqttBridge.ino
|
||||
Created: 3/13/2018 7:40:28 PM
|
||||
Author: roarf
|
||||
*/
|
||||
/**
|
||||
* @brief ESP8266 based program to receive data from AMS electric meters and send to MQTT
|
||||
*
|
||||
* @details Originally developed by Roar Fredriksen, this program was created to receive data from
|
||||
* AMS electric meters via M-Bus, decode and send to a MQTT broker. The data packet structure
|
||||
* supported by this software is specific to Norwegian meters, but may also support data from
|
||||
* electricity providers in other countries. It was originally based on ESP8266, but have also been
|
||||
* adapted to work with ESP32.
|
||||
*
|
||||
* @author Roar Fredriksen (@roarfred)
|
||||
* The original developer for this project
|
||||
* https://github.com/roarfred/AmsToMqttBridge
|
||||
*
|
||||
* @author Gunnar Skjold (@gskjold)
|
||||
* Maintainer of current code
|
||||
* https://github.com/gskjold/AmsToMqttBridge
|
||||
*/
|
||||
|
||||
#include "AmsToMqttBridge.h"
|
||||
#include <ArduinoJson.h>
|
||||
@@ -33,7 +45,7 @@ AmsConfiguration config;
|
||||
AmsWebServer ws;
|
||||
|
||||
WiFiClient *client;
|
||||
MQTTClient mqtt(384);
|
||||
MQTTClient mqtt(512);
|
||||
|
||||
Stream* debugger = NULL;
|
||||
|
||||
@@ -172,24 +184,26 @@ int lastError = 0;
|
||||
|
||||
void loop() {
|
||||
unsigned long now = millis();
|
||||
if (digitalRead(AP_BUTTON_PIN) == LOW) {
|
||||
if (buttonActive == false) {
|
||||
buttonActive = true;
|
||||
buttonTimer = now;
|
||||
}
|
||||
|
||||
if ((now - buttonTimer > longPressTime) && (longPressActive == false)) {
|
||||
longPressActive = true;
|
||||
swapWifiMode();
|
||||
}
|
||||
} else {
|
||||
if (buttonActive == true) {
|
||||
if (longPressActive == true) {
|
||||
longPressActive = false;
|
||||
} else {
|
||||
// Single press action
|
||||
if(AP_BUTTON_PIN != INVALID_BUTTON_PIN) {
|
||||
if (digitalRead(AP_BUTTON_PIN) == LOW) {
|
||||
if (buttonActive == false) {
|
||||
buttonActive = true;
|
||||
buttonTimer = now;
|
||||
}
|
||||
|
||||
if ((now - buttonTimer > longPressTime) && (longPressActive == false)) {
|
||||
longPressActive = true;
|
||||
swapWifiMode();
|
||||
}
|
||||
} else {
|
||||
if (buttonActive == true) {
|
||||
if (longPressActive == true) {
|
||||
longPressActive = false;
|
||||
} else {
|
||||
// Single press action
|
||||
}
|
||||
buttonActive = false;
|
||||
}
|
||||
buttonActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,11 @@ double HwTools::getVcc() {
|
||||
#if defined(ARDUINO_ESP8266_WEMOS_D1MINI)
|
||||
return (((double) ESP.getVcc()) / 900); // This board has a voltage divider on VCC. Yes, 900 is correct
|
||||
#elif defined(ESP8266)
|
||||
return ((double) ESP.getVcc()) / 1024;
|
||||
#if defined(ESP_VCC_CALIB_FACTOR)
|
||||
return ((double) ESP.getVcc()) / 1024 * ESP_VCC_CALIB_FACTOR;
|
||||
#else
|
||||
return ((double) ESP.getVcc()) / 1024;
|
||||
#endif
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -293,7 +293,7 @@ void AmsWebServer::dataJson() {
|
||||
StaticJsonDocument<768> json;
|
||||
|
||||
String jsonStr;
|
||||
if(data.getActiveImportPower() > 0) {
|
||||
if(data.getLastUpdateMillis() > 0) {
|
||||
int maxPwr = this->maxPwr;
|
||||
if(maxPwr == 0) {
|
||||
if(data.isThreePhase()) {
|
||||
@@ -357,10 +357,10 @@ void AmsWebServer::dataJson() {
|
||||
json["meterType"] = config->getMeterType();
|
||||
json["currentMillis"] = now;
|
||||
double vcc = hw.getVcc();
|
||||
json["vcc"] = vcc > 0 ? vcc : 0;
|
||||
json["vcc"] = serialized(String(vcc, 3));
|
||||
|
||||
double temp = hw.getTemperature();
|
||||
json["temp"] = temp;
|
||||
json["temp"] = serialized(String(temp, 2));
|
||||
|
||||
json.createNestedObject("wifi");
|
||||
float rssi = WiFi.RSSI();
|
||||
@@ -383,13 +383,12 @@ void AmsWebServer::dataJson() {
|
||||
}
|
||||
json["status"]["esp"] = espStatus;
|
||||
|
||||
unsigned long lastHan = json.isNull() ? 0 : json["up"].as<unsigned long>();
|
||||
String hanStatus;
|
||||
if(config->getMeterType() == 0) {
|
||||
hanStatus = "secondary";
|
||||
} else if(now - lastHan < 15000) {
|
||||
} else if(now - data.getLastUpdateMillis() < 15000) {
|
||||
hanStatus = "success";
|
||||
} else if(now - lastHan < 30000) {
|
||||
} else if(now - data.getLastUpdateMillis() < 30000) {
|
||||
hanStatus = "warning";
|
||||
} else {
|
||||
hanStatus = "danger";
|
||||
@@ -464,8 +463,6 @@ void AmsWebServer::handleSave() {
|
||||
config->setMqttSubscribeTopic(server.arg("mqttSubscribeTopic"));
|
||||
config->setMqttUser(server.arg("mqttUser"));
|
||||
config->setMqttPassword(server.arg("mqttPassword"));
|
||||
config->setAuthUser(server.arg("authUser"));
|
||||
config->setAuthPassword(server.arg("authPassword"));
|
||||
} else {
|
||||
config->clearMqtt();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user