mirror of
https://github.com/UtilitechAS/amsreader-firmware.git
synced 2026-02-05 16:16:13 +00:00
Merge DIYglenn
This commit is contained in:
121
Debugging/Code/Arduino/KaifaTest/KaifaTest.ino
Normal file
121
Debugging/Code/Arduino/KaifaTest/KaifaTest.ino
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Simple sketch to simulate reading data from a Kamstrup
|
||||
* AMS Meter.
|
||||
*
|
||||
* Created 24. October 2017 by Roar Fredriksen
|
||||
*/
|
||||
|
||||
#include <HanReader.h>
|
||||
#include <Kaifa.h>
|
||||
|
||||
// The HAN Port reader
|
||||
HanReader hanReader;
|
||||
|
||||
byte samples[] =
|
||||
{
|
||||
// List #1
|
||||
0x7E, 0xA0, 0x27, 0x01, 0x02, 0x01, 0x10, 0x5A, 0x87, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x00, 0x03, 0x98, 0xAB, 0xAD, 0x7E,
|
||||
|
||||
// List#2
|
||||
0x7E, 0xA0, 0x79, 0x01, 0x02, 0x01, 0x10, 0x80, 0x93, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x13, 0x1F, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x0D, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41, 0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x05, 0x64, 0x06, 0x00, 0x00, 0x0C, 0x92, 0x06, 0x00, 0x00, 0x0C, 0x49, 0x06, 0x00, 0x00, 0x09, 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4E, 0x1F, 0x85, 0x7E,
|
||||
|
||||
// List#3
|
||||
0x7E, 0xA0, 0x9B, 0x01, 0x02, 0x01, 0x10, 0xEE, 0xAE, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x12, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x37, 0x35, 0x33, 0x39, 0x38, 0x35, 0x09, 0x08, 0x4D, 0x41, 0x33, 0x30, 0x34, 0x48, 0x33, 0x45, 0x06, 0x00, 0x00, 0x03, 0xFE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x07, 0x91, 0x06, 0x00, 0x00, 0x0C, 0x9D, 0x06, 0x00, 0x00, 0x0D, 0x66, 0x06, 0x00, 0x00, 0x09, 0x41, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x4C, 0x09, 0x0C, 0x07, 0xE1, 0x09, 0x0E, 0x04, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x06, 0x00, 0x02, 0xBF, 0x69, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x3F, 0xFC, 0x71, 0x71, 0x7E
|
||||
};
|
||||
int sampleIndex = 0;
|
||||
|
||||
void setup() {
|
||||
setupDebugPort();
|
||||
|
||||
// initialize the HanReader
|
||||
// (passing no han port, as we are feeding data manually, but provide Serial for debugging)
|
||||
hanReader.setup(NULL, &Serial);
|
||||
hanReader.compensateFor09HeaderBug = true;
|
||||
}
|
||||
|
||||
void setupDebugPort()
|
||||
{
|
||||
// Initialize the Serial port for debugging
|
||||
Serial.begin(115200);
|
||||
while (!Serial) {}
|
||||
Serial.setDebugOutput(true);
|
||||
Serial.println("Serial1");
|
||||
Serial.println("Serial debugging port initialized");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Read one byte from the "port", and see if we got a full package
|
||||
if (hanReader.read(samples[sampleIndex++]))
|
||||
{
|
||||
// Get the list identifier
|
||||
int listSize = hanReader.getListSize();
|
||||
|
||||
Serial.println("");
|
||||
Serial.print("List size: ");
|
||||
Serial.print(listSize);
|
||||
Serial.print(": ");
|
||||
|
||||
// Only care for the ACtive Power Imported, which is found in the first list
|
||||
if (listSize == (int)Kaifa::List1 || listSize == (int)Kaifa::List2 || listSize == (int)Kaifa::List3)
|
||||
{
|
||||
if (listSize == (int)Kaifa::List1)
|
||||
{
|
||||
Serial.println(" (list #1 has no ID)");
|
||||
}
|
||||
else
|
||||
{
|
||||
String id = hanReader.getString((int)Kaifa_List2::ListVersionIdentifier);
|
||||
Serial.println(id);
|
||||
}
|
||||
|
||||
time_t time = hanReader.getPackageTime();
|
||||
Serial.print("Time of the package is: ");
|
||||
Serial.println(time);
|
||||
|
||||
if (listSize == (int)Kaifa::List1)
|
||||
{
|
||||
int power = hanReader.getInt((int)Kaifa_List1::ActivePowerImported);
|
||||
Serial.print("Power consumtion is right now: ");
|
||||
Serial.print(power);
|
||||
Serial.println(" W");
|
||||
}
|
||||
else
|
||||
{
|
||||
float current[3];
|
||||
current[0] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL1) / 1000.0;
|
||||
current[1] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL2) / 1000.0;
|
||||
current[2] = (float)hanReader.getInt((int)Kaifa_List2::CurrentL3) / 1000.0;
|
||||
|
||||
int voltage[3];
|
||||
voltage[0] = hanReader.getInt((int)Kaifa_List2::VoltageL1);
|
||||
voltage[1] = hanReader.getInt((int)Kaifa_List2::VoltageL2);
|
||||
voltage[2] = hanReader.getInt((int)Kaifa_List2::VoltageL3);
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
Serial.print("L");
|
||||
Serial.print(i + 1);
|
||||
Serial.print(" is ");
|
||||
Serial.print(voltage[i]);
|
||||
Serial.print(" V (");
|
||||
Serial.print(current[i]);
|
||||
Serial.println(" A)");
|
||||
}
|
||||
|
||||
if (listSize == (int)Kaifa::List3)
|
||||
{
|
||||
time_t clock = hanReader.getTime((int)Kaifa_List3::MeterClock);
|
||||
Serial.print("Clock is: ");
|
||||
Serial.println(clock);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delay(10);
|
||||
if (sampleIndex >= sizeof(samples))
|
||||
{
|
||||
delay(2000);
|
||||
sampleIndex = 0;
|
||||
}
|
||||
}
|
||||
31
Debugging/Code/Arduino/KaifaTest/KaifaTest.sln
Normal file
31
Debugging/Code/Arduino/KaifaTest/KaifaTest.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26730.16
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KaifaTest", "KaifaTest.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "..\HanReader\HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SharedMSBuildProjectFiles) = preSolution
|
||||
..\HanReader\HanReader.vcxitems*{c5f80730-f44f-4478-bdae-6634efc2ca88}*SharedItemsImports = 4
|
||||
..\HanReader\HanReader.vcxitems*{cd0f5364-923b-49e4-8be5-ea7d8a60df80}*SharedItemsImports = 9
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {35D8A583-E857-4E42-B780-543F324B8851}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
93
Debugging/Code/Arduino/KaifaTest/KaifaTest.vcxproj
Normal file
93
Debugging/Code/Arduino/KaifaTest/KaifaTest.vcxproj
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{C5F80730-F44F-4478-BDAE-6634EFC2CA88}</ProjectGuid>
|
||||
<RootNamespace>KaifaTest</RootNamespace>
|
||||
<ProjectName>KaifaTest</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>
|
||||
</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>
|
||||
</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
<Import Project="..\HanReader\HanReader.vcxitems" Label="Shared" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)..\KaifaTest;$(ProjectDir)..\HanReader\src;$(ProjectDir)..\..\..\..\..\..\..\..\..\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\..\..\..\Google Drive\Private\Elektronikk\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ForcedIncludeFiles>$(ProjectDir)__vm\.KaifaTest.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
|
||||
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
|
||||
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=106012;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ProjectCapability Include="VisualMicro" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<None Include="KaifaTest.ino">
|
||||
<FileType>CppCode</FileType>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="__vm\.KaifaTest.vsarduino.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
25
Debugging/Code/Arduino/KaifaTest/KaifaTest.vcxproj.filters
Normal file
25
Debugging/Code/Arduino/KaifaTest/KaifaTest.vcxproj.filters
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="KaifaTest.ino" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="__vm\.KaifaTest.vsarduino.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
128
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.ino
Normal file
128
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.ino
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Simple sketch to simulate reading data from a Kamstrup
|
||||
* AMS Meter.
|
||||
*
|
||||
* Created 24. October 2017 by Roar Fredriksen
|
||||
*/
|
||||
|
||||
#include <HanReader.h>
|
||||
#include <Kamstrup.h>
|
||||
|
||||
// The HAN Port reader
|
||||
HanReader hanReader;
|
||||
|
||||
byte samples[] =
|
||||
// [2017-10-20 04.43.32.368 - Received 229 (0xE5) bytes]
|
||||
{
|
||||
// List #1
|
||||
0x7E, 0xA0, 0xE2, 0x2B, 0x21, 0x13, 0x23, 0x9A, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x14, 0x3B,
|
||||
0x32, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x19, 0x0A, 0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
|
||||
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37, 0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30,
|
||||
0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01, 0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
|
||||
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x11, 0x28, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07,
|
||||
0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x84, 0x09, 0x06, 0x01, 0x01,
|
||||
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x66, 0x09, 0x06,
|
||||
0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x5A,
|
||||
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06, 0x01, 0x01, 0x34, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0x09, 0x06,
|
||||
0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0xA1, 0xD8, 0x7E,
|
||||
|
||||
// List #2
|
||||
0x7E, 0xA1, 0x2C, 0x2B, 0x21, 0x13, 0xFC, 0x04, 0xE6, 0xE7, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07, 0x15, 0x00,
|
||||
0x05, 0xFF, 0x80, 0x00, 0x00, 0x02, 0x23, 0x0A, 0x0E, 0x4B, 0x61, 0x6D, 0x73, 0x74, 0x72, 0x75, 0x70, 0x5F, 0x56, 0x30, 0x30, 0x30, 0x31, 0x09,
|
||||
0x06, 0x01, 0x01, 0x00, 0x00, 0x05, 0xFF, 0x0A, 0x10, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0x37, 0x32, 0x37, 0x34, 0x33, 0x38, 0x39, 0x37, 0x30,
|
||||
0x32, 0x09, 0x06, 0x01, 0x01, 0x60, 0x01, 0x01, 0xFF, 0x0A, 0x12, 0x36, 0x38, 0x34, 0x31, 0x31, 0x32, 0x31, 0x42, 0x4E, 0x32, 0x34, 0x33, 0x31,
|
||||
0x30, 0x31, 0x30, 0x34, 0x30, 0x09, 0x06, 0x01, 0x01, 0x01, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x0E, 0x3B, 0x09, 0x06, 0x01, 0x01, 0x02, 0x07,
|
||||
0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x86, 0x09, 0x06, 0x01, 0x01,
|
||||
0x04, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x1F, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x04, 0x21, 0x09, 0x06,
|
||||
0x01, 0x01, 0x33, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x03, 0x0C, 0x09, 0x06, 0x01, 0x01, 0x47, 0x07, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x04, 0x1C,
|
||||
0x09, 0x06, 0x01, 0x01, 0x20, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE2, 0x09, 0x06, 0x01, 0x01, 0x34, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xE0, 0x09, 0x06,
|
||||
0x01, 0x01, 0x48, 0x07, 0x00, 0xFF, 0x12, 0x00, 0xDF, 0x09, 0x06, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x09, 0x0C, 0x07, 0xE2, 0x03, 0x04, 0x07,
|
||||
0x15, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x01, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x1A, 0x40, 0x49, 0x09, 0x06, 0x01, 0x01,
|
||||
0x02, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x01, 0x03, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x05, 0x64, 0x09, 0x06,
|
||||
0x01, 0x01, 0x04, 0x08, 0x00, 0xFF, 0x06, 0x00, 0x02, 0x7B, 0x21, 0x20, 0x92, 0x7E
|
||||
};
|
||||
|
||||
int sampleIndex = 0;
|
||||
|
||||
void setup() {
|
||||
setupDebugPort();
|
||||
|
||||
// initialize the HanReader
|
||||
// (passing no han port, as we are feeding data manually, but provide Serial for debugging)
|
||||
hanReader.setup(NULL, &Serial);
|
||||
}
|
||||
|
||||
void setupDebugPort()
|
||||
{
|
||||
// Initialize the Serial port for debugging
|
||||
Serial.begin(115200);
|
||||
while (!Serial) {}
|
||||
Serial.setDebugOutput(true);
|
||||
Serial.println("Serial1");
|
||||
Serial.println("Serial debugging port initialized");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Read one byte from the "port", and see if we got a full package
|
||||
if (hanReader.read(samples[sampleIndex++]))
|
||||
{
|
||||
// Get the list identifier
|
||||
int listSize = hanReader.getListSize();
|
||||
|
||||
Serial.println("");
|
||||
Serial.print("List size: ");
|
||||
Serial.print(listSize);
|
||||
Serial.print(": ");
|
||||
|
||||
// Only care for the ACtive Power Imported, which is found in the first list
|
||||
if (listSize == (int)Kamstrup::List1 || listSize == (int)Kamstrup::List2)
|
||||
{
|
||||
String id = hanReader.getString((int)Kamstrup_List1::ListVersionIdentifier);
|
||||
Serial.println(id);
|
||||
|
||||
time_t time = hanReader.getPackageTime();
|
||||
Serial.print("Time of the package is: ");
|
||||
Serial.println(time);
|
||||
|
||||
int power = hanReader.getInt((int)Kamstrup_List1::ActiveImportPower);
|
||||
Serial.print("Power consumtion is right now: ");
|
||||
Serial.print(power);
|
||||
Serial.println(" W");
|
||||
|
||||
float current[3];
|
||||
current[0] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL1) / 100.0;
|
||||
current[1] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL2) / 100.0;
|
||||
current[2] = (float)hanReader.getInt((int)Kamstrup_List1::CurrentL3) / 100.0;
|
||||
|
||||
int voltage[3];
|
||||
voltage[0] = hanReader.getInt((int)Kamstrup_List1::VoltageL1);
|
||||
voltage[1] = hanReader.getInt((int)Kamstrup_List1::VoltageL2);
|
||||
voltage[2] = hanReader.getInt((int)Kamstrup_List1::VoltageL3);
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
Serial.print("L");
|
||||
Serial.print(i + 1);
|
||||
Serial.print(" is ");
|
||||
Serial.print(voltage[i]);
|
||||
Serial.print(" V (");
|
||||
Serial.print(current[i]);
|
||||
Serial.println(" A)");
|
||||
}
|
||||
|
||||
if (listSize == (int)Kamstrup::List2)
|
||||
{
|
||||
time_t clock = hanReader.getTime((int)Kamstrup_List2::MeterClock);
|
||||
Serial.print("Clock is: ");
|
||||
Serial.println(clock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delay(10);
|
||||
if (sampleIndex >= sizeof(samples))
|
||||
{
|
||||
delay(2000);
|
||||
sampleIndex = 0;
|
||||
}
|
||||
}
|
||||
31
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.sln
Normal file
31
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26730.16
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KamstrupTest", "KamstrupTest.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HanReader", "..\HanReader\HanReader.vcxitems", "{CD0F5364-923B-49E4-8BE5-EA7D8A60DF80}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SharedMSBuildProjectFiles) = preSolution
|
||||
..\HanReader\HanReader.vcxitems*{c5f80730-f44f-4478-bdae-6634efc2ca88}*SharedItemsImports = 4
|
||||
..\HanReader\HanReader.vcxitems*{cd0f5364-923b-49e4-8be5-ea7d8a60df80}*SharedItemsImports = 9
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {852F88D2-3495-4048-9662-E3DDE77A7FD7}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
99
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.vcxproj
Normal file
99
Debugging/Code/Arduino/KamstrupTest/KamstrupTest.vcxproj
Normal file
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{C5F80730-F44F-4478-BDAE-6634EFC2CA88}</ProjectGuid>
|
||||
<RootNamespace>
|
||||
</RootNamespace>
|
||||
<ProjectName>KamstrupTest</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>
|
||||
</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>
|
||||
</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
<Import Project="..\HanReader\HanReader.vcxitems" Label="Shared" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)..\KamstrupTest;$(ProjectDir)..\HanReader\src;$(ProjectDir)..\..\..\..\..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\53ggn0bh.0i3\Micro Platforms\visualmicro\ide\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries;$(ProjectDir)..\..\..\..\..\Arduino\libraries;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\libb64;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\spiffs;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\generic;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lwip\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\..\..\..\..\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ForcedIncludeFiles>$(ProjectDir)__vm\.KamstrupTest.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
|
||||
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
|
||||
<PreprocessorDefinitions>__ESP8266_ESp8266__;__ESP8266_ESP8266__;_VMDEBUG=1;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;ARDUINO=10801;ARDUINO_ESP8266_ESP01;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ProjectCapability Include="VisualMicro" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="KamstrupTest.ino">
|
||||
<FileType>CppCode</FileType>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="__vm\.KamstrupTest.vsarduino.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<UserProperties custom_esp8266_generic_UploadSpeed="115200" arduino.upload.port="COM3" />
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
</Project>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="KamstrupTest.ino" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="__vm\.KamstrupTest.vsarduino.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
33
Debugging/Code/Arduino/SelfService/README.md
Normal file
33
Debugging/Code/Arduino/SelfService/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Setup
|
||||
|
||||
1. Copy AmsToMqttBridge\Code\Arduino\HanReader\src to Arduino\libraries
|
||||
2. Download the following libraries and put them in Arduino\libraries
|
||||
- ESP8266WiFi
|
||||
- PubSubClient
|
||||
- ArduinoJson
|
||||
|
||||
The device will boot as an AP (Access Point) the first time it starts.
|
||||
Connect to the AP (ESP-AMS-MQTT) and browse to the Web page http://192.168.4.1/
|
||||
|
||||
Fill inn the form on the Web page and hit 'Submit'
|
||||
The ESP will reboot and connect to your network, publishing it's Firmware version to the 'esp/ams/fw/version' topic.
|
||||
|
||||
The ESP can be reset trough the topic 'esp/ams/reset' or by pulling GPIO 13 LOW.
|
||||
|
||||
# Firmware Over The Air upgrade
|
||||
|
||||
The ESP now supports FOTA upgrades. Compile your Arduino sketch to binary (Sketch > Export compiled binary)
|
||||
Upload the .bin file to a Web Server and create a version file.
|
||||
|
||||
Example:
|
||||
If your .bin file is named 'ams.bin', create a 'ams.version' in the same folder and write a version number different from the
|
||||
version published on the 'esp/ams/fw/version' topic.
|
||||
|
||||
Then send the URL of the file, exluding the file ending, to the 'esp/ams/fw/update' topic like this:
|
||||
`mosquitto_pub -t 'esp/ams/fw/update' -m 'http://your.local.webserver/ams'` if the bin and version file is in the root folder.
|
||||
|
||||
The ESP will publish upgrade information to the 'esp/ams/fw/info' topic.
|
||||
|
||||
# Output
|
||||
|
||||
All output is published on `esp/ams/#`
|
||||
524
Debugging/Code/Arduino/SelfService/ams-mqtt.ino
Normal file
524
Debugging/Code/Arduino/SelfService/ams-mqtt.ino
Normal file
@@ -0,0 +1,524 @@
|
||||
/*
|
||||
* Template sketch for a selv managed ESP8266 WiFi - MQTT setup.
|
||||
*
|
||||
* The ESP will boot and try to connect to a WiFi network.
|
||||
* If it's not able to connect, it will boot up as an Access Point (AP).
|
||||
*
|
||||
* The user can then connect to the AP and browse to http://192.168.4.1
|
||||
* and fill inn SSID/password, MQTT IP and meter type.
|
||||
*
|
||||
* The ESP will then store the information in EEPROM for later use.
|
||||
* It is possible to reset the ESP trough MQTT or pulling GPIO13 HIGH.
|
||||
*
|
||||
* The sketch also supports Firmware OTA.
|
||||
*
|
||||
* Created 01. march 2017 by Ruben Andreassen
|
||||
*/
|
||||
|
||||
/**
|
||||
* EEPROM
|
||||
*/
|
||||
#include <EEPROM.h>
|
||||
|
||||
struct SettingsObject {
|
||||
char ssid[51];
|
||||
char password[51];
|
||||
char mqtt[16];
|
||||
int meter;
|
||||
};
|
||||
SettingsObject customSettings;
|
||||
|
||||
/**
|
||||
* WIFI
|
||||
*/
|
||||
#include <ESP8266WiFi.h>
|
||||
WiFiClient espClient;
|
||||
|
||||
const char* ssid_ap = "ESP-AMS-MQTT";
|
||||
|
||||
/**
|
||||
* Access Point
|
||||
*/
|
||||
#include <ESP8266WebServer.h>
|
||||
ESP8266WebServer server(80); //Server on port 80
|
||||
bool apMode = false;
|
||||
|
||||
const char MAIN_page[] PROGMEM = R"=====(
|
||||
<html>
|
||||
<head>
|
||||
<title>AMS - MQTT Bridge</title>
|
||||
</head>
|
||||
<body>
|
||||
<form method="post" action="/store">
|
||||
SSID <input type="text" name="ssid" /><br/>
|
||||
Password <input type="text" name="password" /><br/>
|
||||
MQTT IP <input type="text" name="mqtt" /><br/>
|
||||
Meter <select name="meter">
|
||||
<option value="0">Kamstrup</option>
|
||||
<option value="1">Kaifa</option>
|
||||
<!-- <option value="2">Aidon</option> -->
|
||||
</select><br/>
|
||||
<input type="submit" value="Submit" />
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
)=====";
|
||||
|
||||
/**
|
||||
* Firmware updater
|
||||
*/
|
||||
#include <ESP8266HTTPClient.h>
|
||||
#include <ESP8266httpUpdate.h>
|
||||
|
||||
const int FW_VERSION = 1010;
|
||||
|
||||
/**
|
||||
* MQTT
|
||||
*/
|
||||
#include <PubSubClient.h>
|
||||
PubSubClient client(espClient);
|
||||
|
||||
const char* mqtt_topic_fw_version = "esp/ams/fw/version";
|
||||
const char* mqtt_topic_fw_update = "esp/ams/fw/update";
|
||||
const char* mqtt_topic_fw_info = "esp/ams/fw/info";
|
||||
const char* mqtt_topic_reset = "esp/ams/reset";
|
||||
|
||||
/**
|
||||
* AMS
|
||||
*/
|
||||
|
||||
#include <HanReader.h>
|
||||
#include <Kamstrup.h>
|
||||
#include <Kaifa.h>
|
||||
|
||||
// The HAN Port reader
|
||||
HanReader hanReader;
|
||||
|
||||
const char* mqtt_topic = "esp/ams";
|
||||
const char* mqtt_topic_PackageTime = "esp/ams/packagetime";
|
||||
const char* mqtt_topic_ListSize = "esp/ams/listsize";
|
||||
const char* mqtt_topic_ListVersionIdentifier = "esp/ams/listversionidentifier";
|
||||
const char* mqtt_topic_MeterID = "esp/ams/meterid";
|
||||
const char* mqtt_topic_MeterType = "esp/ams/metertype";
|
||||
const char* mqtt_topic_ActiveImportPower = "esp/ams/activeimportpower";
|
||||
const char* mqtt_topic_ActiveExportPower = "esp/ams/activeExportpower";
|
||||
const char* mqtt_topic_ReactiveImportPower = "esp/ams/reactiveimportpower";
|
||||
const char* mqtt_topic_ReactiveExportPower = "esp/ams/reactiveexportpower";
|
||||
const char* mqtt_topic_CurrentL1 = "esp/ams/currentl1";
|
||||
const char* mqtt_topic_CurrentL2 = "esp/ams/currentl2";
|
||||
const char* mqtt_topic_CurrentL3 = "esp/ams/currentl3";
|
||||
const char* mqtt_topic_VoltageL1 = "esp/ams/voltagel1";
|
||||
const char* mqtt_topic_VoltageL2 = "esp/ams/voltagel2";
|
||||
const char* mqtt_topic_VoltageL3 = "esp/ams/voltagel3";
|
||||
const char* mqtt_topic_MeterClock = "esp/ams/meterclock";
|
||||
const char* mqtt_topic_CumulativeActiveImportEnergy = "esp/ams/cumulativeactiveimportenergy";
|
||||
const char* mqtt_topic_CumulativeActiveExportEnergy = "esp/ams/cumulativeactiveexportenergy";
|
||||
const char* mqtt_topic_CumulativeReactiveImportEnergy = "esp/ams/cumulativereactiveimportenergy";
|
||||
const char* mqtt_topic_CumulativeReactiveExportEnergy = "esp/ams/cumulativereactiveexportenergy";
|
||||
|
||||
String last_PackageTime = "";
|
||||
String last_ListVersionIdentifier = "";
|
||||
String last_MeterID = "";
|
||||
String last_MeterType = "";
|
||||
int last_ActiveImportPower = 0;
|
||||
int last_ActiveExportPower = 0;
|
||||
int last_ReactiveImportPower = 0;
|
||||
int last_ReactiveExportPower = 0;
|
||||
int last_CurrentL1 = 0;
|
||||
int last_CurrentL2 = 0;
|
||||
int last_CurrentL3 = 0;
|
||||
int last_VoltageL1 = 0;
|
||||
int last_VoltageL2 = 0;
|
||||
int last_VoltageL3 = 0;
|
||||
|
||||
/**
|
||||
* Setup and loop
|
||||
*/
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
pinMode(13, INPUT); //Reset PIN
|
||||
|
||||
loadCredentials();
|
||||
if (!setupWiFi()) {
|
||||
setupAP();
|
||||
} else {
|
||||
setupMqtt();
|
||||
setupAms();
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (apMode) {
|
||||
server.handleClient(); //Handle client requests
|
||||
} else {
|
||||
if (digitalRead(13) == LOW) {
|
||||
clearCredentials();
|
||||
}
|
||||
|
||||
loopMqtt();
|
||||
|
||||
if (customSettings.meter == 0) {
|
||||
loopAmsKamstrup();
|
||||
} else if (customSettings.meter == 1) {
|
||||
loopAmsKaifa();
|
||||
} /*else if (customSettings.meter == 2) {
|
||||
Serial.println("Aidon selected");
|
||||
// Not yet supported
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* EEPROM
|
||||
*/
|
||||
|
||||
void clearCredentials() {
|
||||
EEPROM.begin(512);
|
||||
// write a 0 to all 512 bytes of the EEPROM
|
||||
for (int i = 0; i < 512; i++) {
|
||||
EEPROM.write(i, (char)0);
|
||||
}
|
||||
EEPROM.end();
|
||||
|
||||
for( int i = 0; i < sizeof(customSettings.ssid); ++i) {
|
||||
customSettings.ssid[i] = (char)0;
|
||||
customSettings.password[i] = (char)0;
|
||||
}
|
||||
for( int i = 0; i < sizeof(customSettings.mqtt); ++i) {
|
||||
customSettings.mqtt[i] = (char)0;
|
||||
}
|
||||
customSettings.meter = -1;
|
||||
|
||||
WiFi.disconnect(1);
|
||||
}
|
||||
|
||||
/** Load WLAN credentials from EEPROM */
|
||||
void loadCredentials() {
|
||||
EEPROM.begin(512);
|
||||
EEPROM.get(0, customSettings);
|
||||
|
||||
customSettings.ssid[strlen(customSettings.ssid)] = '\0';
|
||||
customSettings.password[strlen(customSettings.password)] = '\0';
|
||||
|
||||
EEPROM.end();
|
||||
}
|
||||
|
||||
/** Store WLAN credentials to EEPROM */
|
||||
void saveCredentials() {
|
||||
EEPROM.begin(512);
|
||||
EEPROM.put(0, customSettings);
|
||||
EEPROM.commit();
|
||||
EEPROM.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* WIFI
|
||||
*/
|
||||
|
||||
bool setupWiFi()
|
||||
{
|
||||
int retryCount = 0;
|
||||
delay(10);
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin((char*)customSettings.ssid, (char*)customSettings.password);
|
||||
|
||||
while (WiFi.status() != WL_CONNECTED && retryCount < 20) {
|
||||
delay(500);
|
||||
Serial.println("Trying to connect to WiFi");
|
||||
Serial.println(WiFi.status());
|
||||
retryCount++;
|
||||
}
|
||||
|
||||
Serial.println(WiFi.status());
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
Serial.println("Could not connect");
|
||||
return false;
|
||||
} else {
|
||||
Serial.println("Connected!");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Access Point
|
||||
*/
|
||||
void setupAP()
|
||||
{
|
||||
WiFi.mode(WIFI_AP); //Only Access point
|
||||
WiFi.softAP(ssid_ap); //Start HOTspot removing password will disable security
|
||||
|
||||
IPAddress myIP = WiFi.softAPIP(); //Get IP address
|
||||
Serial.print("HotSpt IP:");
|
||||
Serial.println(myIP);
|
||||
|
||||
server.on("/", handleRoot); //Which routine to handle at root location
|
||||
server.on("/store", handleSubmit); //Which routine to handle at root location
|
||||
server.begin(); //Start server
|
||||
|
||||
apMode = true;
|
||||
}
|
||||
|
||||
void handleRoot() {
|
||||
String s = MAIN_page;
|
||||
server.send(200, "text/html", s);
|
||||
}
|
||||
|
||||
void handleSubmit() {
|
||||
clearCredentials();
|
||||
|
||||
strncpy(customSettings.ssid, server.arg("ssid").c_str(), 51);
|
||||
strncpy(customSettings.password, server.arg("password").c_str(), 51);
|
||||
strncpy(customSettings.mqtt, server.arg("mqtt").c_str(), 16);
|
||||
//strncpy(customSettings.meter, server.arg("meter").c_str(), 1);
|
||||
customSettings.meter = server.arg("meter").toInt();
|
||||
|
||||
saveCredentials();
|
||||
server.send(200, "text/plain", "Rebooting and connecting to your WiFi....");
|
||||
delay(2000);
|
||||
|
||||
ESP.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Firmware updater
|
||||
*/
|
||||
|
||||
void checkForUpdates(String fwURL) {
|
||||
String fwVersionURL = fwURL;
|
||||
fwVersionURL.concat( ".version" );
|
||||
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Checking for firmware updates.").c_str());
|
||||
client.publish(mqtt_topic_fw_info, fwVersionURL.c_str());
|
||||
|
||||
HTTPClient httpClient;
|
||||
httpClient.begin( fwVersionURL );
|
||||
int httpCode = httpClient.GET();
|
||||
if( httpCode == 200 ) {
|
||||
String newFWVersion = httpClient.getString();
|
||||
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Current firmware version").c_str());
|
||||
client.publish(mqtt_topic_fw_info, ((String)FW_VERSION).c_str());
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Available firmware version").c_str());
|
||||
client.publish(mqtt_topic_fw_info, newFWVersion.c_str());
|
||||
|
||||
int newVersion = newFWVersion.toInt();
|
||||
|
||||
if( newVersion > FW_VERSION ) {
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Preparing to update").c_str());
|
||||
|
||||
String fwImageURL = fwURL;
|
||||
fwImageURL.concat( ".bin" );
|
||||
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Downloading new firmware.").c_str());
|
||||
client.publish(mqtt_topic_fw_info, fwImageURL.c_str());
|
||||
|
||||
t_httpUpdate_return ret = ESPhttpUpdate.update( fwImageURL );
|
||||
|
||||
switch(ret) {
|
||||
case HTTP_UPDATE_FAILED:
|
||||
//Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
|
||||
client.publish(mqtt_topic_fw_info, ((String)HTTP_UPDATE_FAILED).c_str());
|
||||
client.publish(mqtt_topic_fw_info, ((String)ESPhttpUpdate.getLastError()).c_str());
|
||||
client.publish(mqtt_topic_fw_info, ESPhttpUpdate.getLastErrorString().c_str());
|
||||
break;
|
||||
case HTTP_UPDATE_NO_UPDATES:
|
||||
client.publish(mqtt_topic_fw_info, ((String)HTTP_UPDATE_NO_UPDATES).c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Already on latest version").c_str());
|
||||
}
|
||||
}
|
||||
else {
|
||||
client.publish(mqtt_topic_fw_info, ((String)"Firmware version check failed, got HTTP response code").c_str());
|
||||
client.publish(mqtt_topic_fw_info, ((String)httpCode).c_str());
|
||||
}
|
||||
httpClient.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* MQTT
|
||||
*/
|
||||
|
||||
void setupMqtt()
|
||||
{
|
||||
String input = (String)customSettings.mqtt;
|
||||
// Define number of pieces
|
||||
const int numberOfPieces = 4;
|
||||
String pieces[numberOfPieces];
|
||||
|
||||
// Keep track of current position in array
|
||||
int counter = 0;
|
||||
|
||||
// Keep track of the last comma so we know where to start the substring
|
||||
int lastIndex = 0;
|
||||
|
||||
Serial.println(input);
|
||||
Serial.println(input.length());
|
||||
|
||||
for (int i = 0; i < input.length(); i++) {
|
||||
// Loop through each character and check if it's a comma
|
||||
if (input.substring(i, i+1) == ".") {
|
||||
// Grab the piece from the last index up to the current position and store it
|
||||
pieces[counter] = input.substring(lastIndex, i);
|
||||
// Update the last position and add 1, so it starts from the next character
|
||||
lastIndex = i + 1;
|
||||
// Increase the position in the array that we store into
|
||||
counter++;
|
||||
}
|
||||
|
||||
// If we're at the end of the string (no more commas to stop us)
|
||||
if (i == input.length() - 1) {
|
||||
// Grab the last part of the string from the lastIndex to the end
|
||||
pieces[counter] = input.substring(lastIndex, i+1);
|
||||
}
|
||||
}
|
||||
|
||||
IPAddress server(pieces[0].toInt(), pieces[1].toInt(), pieces[2].toInt(), pieces[3].toInt());
|
||||
|
||||
client.setServer(server, 1883);
|
||||
client.setCallback(callbackMqtt);
|
||||
}
|
||||
|
||||
// Ensure the MQTT lirary gets some attention too
|
||||
void loopMqtt()
|
||||
{
|
||||
if (!client.connected()) {
|
||||
reconnectMqtt();
|
||||
}
|
||||
client.loop();
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void callbackMqtt(char* topic, byte* payload, unsigned int length) {
|
||||
/*for (int i = 0; i < length; i++) {
|
||||
Serial.print((char)payload[i]);
|
||||
}*/
|
||||
if (strcmp(topic, mqtt_topic_fw_update) == 0) {
|
||||
String fwURL = "";
|
||||
for (int i = 0; i < length; i++) {
|
||||
fwURL.concat( (char)payload[i] );
|
||||
}
|
||||
|
||||
checkForUpdates(fwURL);
|
||||
} else if (strcmp(topic, mqtt_topic_reset) == 0) {
|
||||
clearCredentials();
|
||||
delay(1000);
|
||||
ESP.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void reconnectMqtt() {
|
||||
// Loop until we're reconnected
|
||||
while (!client.connected()) {
|
||||
// Create a random client ID
|
||||
String clientId = "ESP8266Client-";
|
||||
clientId += String(random(0xffff), HEX);
|
||||
|
||||
Serial.println("MQTT reconnect");
|
||||
// Attempt to connect
|
||||
if (client.connect(clientId.c_str())) {
|
||||
client.subscribe(mqtt_topic_reset);
|
||||
client.subscribe(mqtt_topic_fw_update);
|
||||
client.publish(mqtt_topic_fw_version, ((String)FW_VERSION).c_str());
|
||||
}
|
||||
else {
|
||||
// Wait 5 seconds before retrying
|
||||
delay(5000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* AMS
|
||||
*/
|
||||
|
||||
void setupAms() {
|
||||
// initialize the HanReader
|
||||
if (customSettings.meter == 0) {
|
||||
Serial.println("Kamstup selected");
|
||||
hanReader.setup(&Serial, 2400, SERIAL_8N1, NULL);
|
||||
}else if (customSettings.meter == 1) {
|
||||
Serial.println("Kaifa selected");
|
||||
hanReader.setup(&Serial);
|
||||
} /*else if (customSettings.meter == 2) {
|
||||
Serial.println("Aidon selected");
|
||||
// Not yet supported
|
||||
}*/ else {
|
||||
Serial.println("Unknown meter type");
|
||||
}
|
||||
}
|
||||
|
||||
void loopAmsKamstrup() {
|
||||
// Read one byte from the port, and see if we got a full package
|
||||
if (hanReader.read())
|
||||
{
|
||||
// Get the list identifier
|
||||
int listSize = hanReader.getListSize();
|
||||
|
||||
if (listSize == (int)Kamstrup::List1 || listSize == (int)Kamstrup::List2)
|
||||
{
|
||||
//Publish uptime to let the world know i'm alive
|
||||
client.publish(mqtt_topic, ((String)millis()).c_str());
|
||||
|
||||
last_ListVersionIdentifier = publishNewValue(hanReader.getString((int)Kamstrup_List1::ListVersionIdentifier), last_ListVersionIdentifier, listSize, (int)Kamstrup::List2, mqtt_topic_ListVersionIdentifier);
|
||||
last_MeterID = publishNewValue(hanReader.getString((int)Kamstrup_List1::MeterID), last_MeterID, listSize, (int)Kamstrup::List2, mqtt_topic_MeterID);
|
||||
last_MeterType = publishNewValue(hanReader.getString((int)Kamstrup_List1::MeterType), last_MeterType, listSize, (int)Kamstrup::List2, mqtt_topic_MeterType);
|
||||
last_PackageTime = publishNewValue((String)hanReader.getPackageTime(), last_PackageTime, listSize, (int)Kamstrup::List2, mqtt_topic_PackageTime);
|
||||
|
||||
last_ActiveImportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ActiveImportPower), last_ActiveImportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ActiveImportPower);
|
||||
last_ActiveExportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ActiveExportPower), last_ActiveExportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ActiveExportPower);
|
||||
last_ReactiveImportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ReactiveImportPower), last_ReactiveImportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ReactiveImportPower);
|
||||
last_ReactiveExportPower = publishNewValue(hanReader.getInt((int)Kamstrup_List1::ReactiveExportPower), last_ReactiveExportPower, listSize, (int)Kamstrup::List2, mqtt_topic_ReactiveExportPower);
|
||||
|
||||
last_CurrentL1 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL1) / 100.0), last_CurrentL1, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL1);
|
||||
last_CurrentL2 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL2) / 100.0), last_CurrentL2, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL2);
|
||||
last_CurrentL3 = publishNewValue(((float)hanReader.getInt((int)Kamstrup_List1::CurrentL3) / 100.0), last_CurrentL3, listSize, (int)Kamstrup::List2, mqtt_topic_CurrentL3);
|
||||
|
||||
last_VoltageL1 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL1), last_VoltageL1, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL1);
|
||||
last_VoltageL2 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL2), last_VoltageL2, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL2);
|
||||
last_VoltageL3 = publishNewValue(hanReader.getInt((int)Kamstrup_List1::VoltageL3), last_VoltageL3, listSize, (int)Kamstrup::List2, mqtt_topic_VoltageL3);
|
||||
|
||||
if (listSize == (int)Kamstrup::List2)
|
||||
{
|
||||
client.publish(mqtt_topic_MeterClock, ((String)hanReader.getTime((int)Kamstrup_List2::MeterClock)).c_str());
|
||||
client.publish(mqtt_topic_CumulativeActiveImportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeActiveImportEnergy)).c_str());
|
||||
client.publish(mqtt_topic_CumulativeActiveExportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeActiveExportEnergy)).c_str());
|
||||
client.publish(mqtt_topic_CumulativeReactiveImportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeReactiveImportEnergy)).c_str());
|
||||
client.publish(mqtt_topic_CumulativeReactiveExportEnergy, ((String)hanReader.getInt((int)Kamstrup_List2::CumulativeReactiveExportEnergy)).c_str());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void loopAmsKaifa() {
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* Only publish new values or when a spesific list size occours
|
||||
*/
|
||||
int publishNewValue(int currentValue, int lastValue, int currentListSize, int publishListSize, const char* topic) {
|
||||
if (currentValue != lastValue || currentListSize == publishListSize) {
|
||||
client.publish(topic, ((String)currentValue).c_str());
|
||||
}
|
||||
return currentValue;
|
||||
}
|
||||
|
||||
float publishNewValue(float currentValue, float lastValue, int currentListSize, int publishListSize, const char* topic) {
|
||||
if (currentValue != lastValue || currentListSize == publishListSize) {
|
||||
client.publish(topic, ((String)currentValue).c_str());
|
||||
}
|
||||
return currentValue;
|
||||
}
|
||||
|
||||
String publishNewValue(String currentValue, String lastValue, int currentListSize, int publishListSize, const char* topic) {
|
||||
if (currentValue != lastValue || currentListSize == publishListSize) {
|
||||
client.publish(topic, currentValue.c_str());
|
||||
}
|
||||
return currentValue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user