стабилизация кода

This commit is contained in:
vpodberezsky
2026-01-10 11:04:15 +03:00
parent ec07c6ab7d
commit 2544275792
320 changed files with 9018 additions and 64119 deletions

5
Devices/main-module/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -0,0 +1,20 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:d1_mini]
platform = espressif8266
board = d1_mini
build_flags = -Wl,-Teagle.flash.4m1m.ld
framework = arduino
board_build.filesystem = littlefs
monitor_speed = 115200
upload_speed = 256000
;lib_deps = bblanchon/ArduinoJson@^6.19.4
lib_deps = bblanchon/ArduinoJson@^7.0.3

View File

@@ -0,0 +1,39 @@
#pragma once
#include <Arduino.h>
#include <ArduinoJson.h>
#include "HalConfigBase.h"
class Config : public HalConfigBase
{
private:
public:
int cnt = 123;
inline String getFileName()
{
return F("/config.json");
}
String convertToString()
{
String config = "";
StaticJsonDocument<1024> doc;
//JsonObject json = doc.createNestedObject();
_toJson(doc);
doc["cnt"] = cnt;
serializeJson(doc, config);
return config;
}
bool convertFromString(String json)
{
StaticJsonDocument<1024> doc;
DeserializationError error = deserializeJson(doc, json);
if (error)
return false;
cnt = doc[0]["cnt"];
_fromJson(doc);
return true;
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
#pragma once
#include <Arduino.h>
#include <ArduinoJson.h>
class HalConfigBase
{
public:
String version;
String ssid;
String pass;
String ssidAP;
String passAP;
String updateUrl;
String token;
String chatId;
// void ToJson(JsonObject &json);
// void FromJson(JsonObject &json);
protected:
void _toJson(JsonDocument &json)
{
json["version"] = version;
json["ssid"] = ssid;
json["pass"] = pass;
json["ssidAP"] = ssidAP;
json["passAP"] = passAP;
json["updateUrl"] = updateUrl;
json["token"] = token;
json["chatId"] = chatId;
}
void _fromJson(JsonDocument &json)
{
version = json[0]["version"].as<String>();
ssid = json[0]["ssid"].as<String>();
pass = json[0]["pass"].as<String>();
ssidAP = json[0]["ssidAP"].as<String>();
passAP = json[0]["passAP"].as<String>();
updateUrl = json[0]["updateUrl"].as<String>();
token = json[0]["token"].as<String>();
chatId = json[0]["chatId"].as<String>();
}
private:
};

View File

@@ -0,0 +1,200 @@
#pragma once
#include <Arduino.h>
#include "pca9554.h"
#include "config.h"
#include <ArduinoJson.h>
#define i2c_address 0x20
#define CHANNELS 8
#define SWITCH_DELAY 500
struct RelItem
{
unsigned long Code = 0;
bool State = false;
u8 Mode = 0;
unsigned long Delay = 0;
};
class HalRelays
{
private:
PCA9554 io;
inline String _configFileName() { return F("/relay.json"); }
bool (*_saveFunction)(String, String){};
String (*_loadFunction)(String){};
String _convertToString()
{
String config = "";
StaticJsonDocument<512> doc;
for (byte i = 0; i < CHANNELS; i++)
{
JsonObject jo = doc.createNestedObject();
jo["Code"] = Channels[i].Code;
jo["Mode"] = Channels[i].Mode;
jo["State"] = Channels[i].State;
}
serializeJson(doc, config);
return config;
}
bool _convertFromString(String config_str)
{
// StaticJsonDocument<512> doc;
JsonDocument doc;
DeserializationError error = deserializeJson(doc, config_str);
if (error)
{
return false;
}
for (byte i = 0; i < CHANNELS; i++)
{
Channels[i].Code = doc[i]["Code"];
Channels[i].Mode = doc[i]["Mode"];
Channels[i].State = doc[i]["State"];
}
return true;
}
void _switch(u8 number)
{
if (millis() - Channels[number].Delay > SWITCH_DELAY)
{
Serial.print("RELAY [" + (String)number + "] set ");
// bool value = io.digitalRead(number);
if (Channels[number].State == true)
{
off(number);
Channels[number].State = false;
Serial.println("OFF");
}
else
{
on(number);
Channels[number].State = true;
Serial.println("ON");
}
Channels[number].Delay = millis();
}
}
public:
RelItem Channels[CHANNELS];
HalRelays(byte sda, byte scl, bool (*saveFunction)(String, String), String (*loadFunction)(String))
{
io = PCA9554(i2c_address, sda, scl);
_saveFunction = saveFunction;
_loadFunction = loadFunction;
}
bool cmd(unsigned long code)
{
for (byte i = 0; i < CHANNELS; i++)
{
if (code == Channels[i].Code)
{
_switch(i);
return true;
}
}
Serial.println("Code [" + (String)code + "] not found");
return false;
}
void switchState(u8 number)
{
_switch(number);
}
void printChannels()
{
Serial.println("CHANNELS");
for (byte i = 0; i < CHANNELS; i++)
{
Serial.println((String)i + " :: " + (String)Channels[i].Code);
}
}
String printChannelsToString()
{
String str = "CHANNELS";
for (byte i = 0; i < CHANNELS; i++)
{
str += ((String)i + " :: " + (String)Channels[i].Code);
}
return str;
}
void save()
{
String config_str = _convertToString();
if (!_saveFunction(config_str, _configFileName()))
{
Serial.println(F("RELAYS SAVE :: ERROR"));
return;
}
Serial.println(F("RELAYS SAVE :: OK"));
printChannels();
}
bool load()
{
String configStr = _loadFunction(_configFileName());
Serial.println("DBG");
Serial.println(configStr);
Serial.println("DBG");
if (!_convertFromString(configStr))
{
Serial.println(F("RELAYS LOAD :: ERROR"));
return false;
}
Serial.println(F("RELAYS LOAD :: OK"));
printChannels();
return true;
}
void init()
{
// io.portMode(ALLINPUT);
// offAll();
io.portMode(ALLOUTPUT);
offAll();
if (!load())
{
Serial.println(F("Relay ERROR: config not load."));
}
}
void on(u8 number)
{
io.digitalWrite(number, HIGH);
}
void onAll()
{
io.digitalWritePort(0xFF);
// for (u8 i = 0; i < 8; i++)
// io.digitalWrite(i, HIGH);
}
void off(u8 number)
{
io.digitalWrite(number, LOW);
}
void offAll()
{
io.digitalWritePort(0x0);
// for (u8 i = 0; i < 8; i++)
// io.digitalWrite(i, LOW);
}
};

View File

@@ -0,0 +1,79 @@
#pragma once
#include "Arduino.h"
class HalTimer
{
private:
unsigned long _period;
unsigned long _last_millis;
bool _init_first;
void (*_function)(){};
bool _isRun = false;
public:
HalTimer()
{
}
HalTimer(unsigned long period)
{
_period = period;
}
HalTimer(unsigned long period, void (*function)())
{
_period = period;
_function = function;
_init_first = true;
_last_millis = millis();
}
HalTimer(unsigned long period, void (*function)(), bool autostart)
{
_period = period;
_function = function;
_init_first = true;
_last_millis = millis();
if (autostart)
start();
}
void start()
{
_isRun = true;
}
void stop()
{
_isRun = false;
}
void tick()
{
if (!_isRun)
return;
if (millis() - _last_millis > _period)
{
if (_init_first)
_last_millis = millis();
_function();
if (!_init_first)
_last_millis = millis();
}
}
void begin(unsigned long period, void (*function)(), bool init_first)
{
_period = period;
begin(function, init_first);
}
void begin(void (*function)(), bool init_first)
{
_function = function;
_init_first = init_first;
_last_millis = millis();
}
};

View File

@@ -0,0 +1,701 @@
/*
RCSwitch - Arduino libary for remote control outlet switches
Copyright (c) 2011 Suat Özgür. All right reserved.
Contributors:
- Andre Koehler / info(at)tomate-online(dot)de
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
- Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=46
- Dominik Fischer / dom_fischer(at)web(dot)de
- Frank Oltmanns / <first name>.<last name>(at)gmail(dot)com
- Andreas Steinel / A.<lastname>(at)gmail(dot)com
- Max Horn / max(at)quendi(dot)de
- Robert ter Vehn / <first name>.<last name>(at)gmail(dot)com
- Johann Richard / <first name>.<last name>(at)gmail(dot)com
- Vlad Gheorghe / <first name>.<last name>(at)gmail(dot)com https://github.com/vgheo
Project home: https://github.com/sui77/rc-switch/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "RCSwitch.h"
#ifdef RaspberryPi
// PROGMEM and _P functions are for AVR based microprocessors,
// so we must normalize these for the ARM processor:
#define PROGMEM
#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
#endif
#if defined(ESP8266) || defined(ESP32)
// interrupt handler and related code must be in RAM on ESP8266,
// according to issue #46.
#define RECEIVE_ATTR ICACHE_RAM_ATTR
#else
#define RECEIVE_ATTR
#endif
/* Format for protocol definitions:
* {pulselength, Sync bit, "0" bit, "1" bit}
*
* pulselength: pulse length in microseconds, e.g. 350
* Sync bit: {1, 31} means 1 high pulse and 31 low pulses
* (perceived as a 31*pulselength long pulse, total length of sync bit is
* 32*pulselength microseconds), i.e:
* _
* | |_______________________________ (don't count the vertical bars)
* "0" bit: waveform for a data bit of value "0", {1, 3} means 1 high pulse
* and 3 low pulses, total length (1+3)*pulselength, i.e:
* _
* | |___
* "1" bit: waveform for a data bit of value "1", e.g. {3,1}:
* ___
* | |_
*
* These are combined to form Tri-State bits when sending or receiving codes.
*/
#if defined(ESP8266) || defined(ESP32)
static const RCSwitch::Protocol proto[] = {
#else
static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
{ 350, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 1
{ 650, { 1, 10 }, { 1, 2 }, { 2, 1 }, false }, // protocol 2
{ 100, { 30, 71 }, { 4, 11 }, { 9, 6 }, false }, // protocol 3
{ 380, { 1, 6 }, { 1, 3 }, { 3, 1 }, false }, // protocol 4
{ 500, { 6, 14 }, { 1, 2 }, { 2, 1 }, false }, // protocol 5
{ 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
{ 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false } // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
};
enum {
numProto = sizeof(proto) / sizeof(proto[0])
};
#if not defined( RCSwitchDisableReceiving )
volatile unsigned long RCSwitch::nReceivedValue = 0;
volatile unsigned int RCSwitch::nReceivedBitlength = 0;
volatile unsigned int RCSwitch::nReceivedDelay = 0;
volatile unsigned int RCSwitch::nReceivedProtocol = 0;
int RCSwitch::nReceiveTolerance = 60;
const unsigned int RCSwitch::nSeparationLimit = 4300;
// separationLimit: minimum microseconds between received codes, closer codes are ignored.
// according to discussion on issue #14 it might be more suitable to set the separation
// limit to the same time as the 'low' part of the sync signal for the current protocol.
unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES];
#endif
RCSwitch::RCSwitch() {
this->nTransmitterPin = -1;
this->setRepeatTransmit(10);
this->setProtocol(1);
#if not defined( RCSwitchDisableReceiving )
this->nReceiverInterrupt = -1;
this->setReceiveTolerance(60);
RCSwitch::nReceivedValue = 0;
#endif
}
/**
* Sets the protocol to send.
*/
void RCSwitch::setProtocol(Protocol protocol) {
this->protocol = protocol;
}
/**
* Sets the protocol to send, from a list of predefined protocols
*/
void RCSwitch::setProtocol(int nProtocol) {
if (nProtocol < 1 || nProtocol > numProto) {
nProtocol = 1; // TODO: trigger an error, e.g. "bad protocol" ???
}
#if defined(ESP8266) || defined(ESP32)
this->protocol = proto[nProtocol-1];
#else
memcpy_P(&this->protocol, &proto[nProtocol-1], sizeof(Protocol));
#endif
}
/**
* Sets the protocol to send with pulse length in microseconds.
*/
void RCSwitch::setProtocol(int nProtocol, int nPulseLength) {
setProtocol(nProtocol);
this->setPulseLength(nPulseLength);
}
/**
* Sets pulse length in microseconds
*/
void RCSwitch::setPulseLength(int nPulseLength) {
this->protocol.pulseLength = nPulseLength;
}
/**
* Sets Repeat Transmits
*/
void RCSwitch::setRepeatTransmit(int nRepeatTransmit) {
this->nRepeatTransmit = nRepeatTransmit;
}
/**
* Set Receiving Tolerance
*/
#if not defined( RCSwitchDisableReceiving )
void RCSwitch::setReceiveTolerance(int nPercent) {
RCSwitch::nReceiveTolerance = nPercent;
}
#endif
/**
* Enable transmissions
*
* @param nTransmitterPin Arduino Pin to which the sender is connected to
*/
void RCSwitch::enableTransmit(int nTransmitterPin) {
this->nTransmitterPin = nTransmitterPin;
pinMode(this->nTransmitterPin, OUTPUT);
}
/**
* Disable transmissions
*/
void RCSwitch::disableTransmit() {
this->nTransmitterPin = -1;
}
/**
* Switch a remote switch on (Type D REV)
*
* @param sGroup Code of the switch group (A,B,C,D)
* @param nDevice Number of the switch itself (1..3)
*/
void RCSwitch::switchOn(char sGroup, int nDevice) {
this->sendTriState( this->getCodeWordD(sGroup, nDevice, true) );
}
/**
* Switch a remote switch off (Type D REV)
*
* @param sGroup Code of the switch group (A,B,C,D)
* @param nDevice Number of the switch itself (1..3)
*/
void RCSwitch::switchOff(char sGroup, int nDevice) {
this->sendTriState( this->getCodeWordD(sGroup, nDevice, false) );
}
/**
* Switch a remote switch on (Type C Intertechno)
*
* @param sFamily Familycode (a..f)
* @param nGroup Number of group (1..4)
* @param nDevice Number of device (1..4)
*/
void RCSwitch::switchOn(char sFamily, int nGroup, int nDevice) {
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, true) );
}
/**
* Switch a remote switch off (Type C Intertechno)
*
* @param sFamily Familycode (a..f)
* @param nGroup Number of group (1..4)
* @param nDevice Number of device (1..4)
*/
void RCSwitch::switchOff(char sFamily, int nGroup, int nDevice) {
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, false) );
}
/**
* Switch a remote switch on (Type B with two rotary/sliding switches)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOn(int nAddressCode, int nChannelCode) {
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, true) );
}
/**
* Switch a remote switch off (Type B with two rotary/sliding switches)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOff(int nAddressCode, int nChannelCode) {
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, false) );
}
/**
* Deprecated, use switchOn(const char* sGroup, const char* sDevice) instead!
* Switch a remote switch on (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..5)
*/
void RCSwitch::switchOn(const char* sGroup, int nChannel) {
const char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" };
this->switchOn(sGroup, code[nChannel]);
}
/**
* Deprecated, use switchOff(const char* sGroup, const char* sDevice) instead!
* Switch a remote switch off (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..5)
*/
void RCSwitch::switchOff(const char* sGroup, int nChannel) {
const char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" };
this->switchOff(sGroup, code[nChannel]);
}
/**
* Switch a remote switch on (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111")
*/
void RCSwitch::switchOn(const char* sGroup, const char* sDevice) {
this->sendTriState( this->getCodeWordA(sGroup, sDevice, true) );
}
/**
* Switch a remote switch off (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111")
*/
void RCSwitch::switchOff(const char* sGroup, const char* sDevice) {
this->sendTriState( this->getCodeWordA(sGroup, sDevice, false) );
}
/**
* Returns a char[13], representing the code word to be send.
*
*/
char* RCSwitch::getCodeWordA(const char* sGroup, const char* sDevice, bool bStatus) {
static char sReturn[13];
int nReturnPos = 0;
for (int i = 0; i < 5; i++) {
sReturn[nReturnPos++] = (sGroup[i] == '0') ? 'F' : '0';
}
for (int i = 0; i < 5; i++) {
sReturn[nReturnPos++] = (sDevice[i] == '0') ? 'F' : '0';
}
sReturn[nReturnPos++] = bStatus ? '0' : 'F';
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Encoding for type B switches with two rotary/sliding switches.
*
* The code word is a tristate word and with following bit pattern:
*
* +-----------------------------+-----------------------------+----------+------------+
* | 4 bits address | 4 bits address | 3 bits | 1 bit |
* | switch group | switch number | not used | on / off |
* | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | FFF | on=F off=0 |
* +-----------------------------+-----------------------------+----------+------------+
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
* @param bStatus Whether to switch on (true) or off (false)
*
* @return char[13], representing a tristate code word of length 12
*/
char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, bool bStatus) {
static char sReturn[13];
int nReturnPos = 0;
if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) {
return 0;
}
for (int i = 1; i <= 4; i++) {
sReturn[nReturnPos++] = (nAddressCode == i) ? '0' : 'F';
}
for (int i = 1; i <= 4; i++) {
sReturn[nReturnPos++] = (nChannelCode == i) ? '0' : 'F';
}
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Like getCodeWord (Type C = Intertechno)
*/
char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, bool bStatus) {
static char sReturn[13];
int nReturnPos = 0;
int nFamily = (int)sFamily - 'a';
if ( nFamily < 0 || nFamily > 15 || nGroup < 1 || nGroup > 4 || nDevice < 1 || nDevice > 4) {
return 0;
}
// encode the family into four bits
sReturn[nReturnPos++] = (nFamily & 1) ? 'F' : '0';
sReturn[nReturnPos++] = (nFamily & 2) ? 'F' : '0';
sReturn[nReturnPos++] = (nFamily & 4) ? 'F' : '0';
sReturn[nReturnPos++] = (nFamily & 8) ? 'F' : '0';
// encode the device and group
sReturn[nReturnPos++] = ((nDevice-1) & 1) ? 'F' : '0';
sReturn[nReturnPos++] = ((nDevice-1) & 2) ? 'F' : '0';
sReturn[nReturnPos++] = ((nGroup-1) & 1) ? 'F' : '0';
sReturn[nReturnPos++] = ((nGroup-1) & 2) ? 'F' : '0';
// encode the status code
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Encoding for the REV Switch Type
*
* The code word is a tristate word and with following bit pattern:
*
* +-----------------------------+-------------------+----------+--------------+
* | 4 bits address | 3 bits address | 3 bits | 2 bits |
* | switch group | device number | not used | on / off |
* | A=1FFF B=F1FF C=FF1F D=FFF1 | 1=0FF 2=F0F 3=FF0 | 000 | on=10 off=01 |
* +-----------------------------+-------------------+----------+--------------+
*
* Source: http://www.the-intruder.net/funksteckdosen-von-rev-uber-arduino-ansteuern/
*
* @param sGroup Name of the switch group (A..D, resp. a..d)
* @param nDevice Number of the switch itself (1..3)
* @param bStatus Whether to switch on (true) or off (false)
*
* @return char[13], representing a tristate code word of length 12
*/
char* RCSwitch::getCodeWordD(char sGroup, int nDevice, bool bStatus) {
static char sReturn[13];
int nReturnPos = 0;
// sGroup must be one of the letters in "abcdABCD"
int nGroup = (sGroup >= 'a') ? (int)sGroup - 'a' : (int)sGroup - 'A';
if ( nGroup < 0 || nGroup > 3 || nDevice < 1 || nDevice > 3) {
return 0;
}
for (int i = 0; i < 4; i++) {
sReturn[nReturnPos++] = (nGroup == i) ? '1' : 'F';
}
for (int i = 1; i <= 3; i++) {
sReturn[nReturnPos++] = (nDevice == i) ? '1' : 'F';
}
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = bStatus ? '1' : '0';
sReturn[nReturnPos++] = bStatus ? '0' : '1';
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* @param sCodeWord a tristate code word consisting of the letter 0, 1, F
*/
void RCSwitch::sendTriState(const char* sCodeWord) {
// turn the tristate code word into the corresponding bit pattern, then send it
unsigned long code = 0;
unsigned int length = 0;
for (const char* p = sCodeWord; *p; p++) {
code <<= 2L;
switch (*p) {
case '0':
// bit pattern 00
break;
case 'F':
// bit pattern 01
code |= 1L;
break;
case '1':
// bit pattern 11
code |= 3L;
break;
}
length += 2;
}
this->send(code, length);
}
/**
* @param sCodeWord a binary code word consisting of the letter 0, 1
*/
void RCSwitch::send(const char* sCodeWord) {
// turn the tristate code word into the corresponding bit pattern, then send it
unsigned long code = 0;
unsigned int length = 0;
for (const char* p = sCodeWord; *p; p++) {
code <<= 1L;
if (*p != '0')
code |= 1L;
length++;
}
this->send(code, length);
}
/**
* Transmit the first 'length' bits of the integer 'code'. The
* bits are sent from MSB to LSB, i.e., first the bit at position length-1,
* then the bit at position length-2, and so on, till finally the bit at position 0.
*/
void RCSwitch::send(unsigned long code, unsigned int length) {
if (this->nTransmitterPin == -1)
return;
#if not defined( RCSwitchDisableReceiving )
// make sure the receiver is disabled while we transmit
int nReceiverInterrupt_backup = nReceiverInterrupt;
if (nReceiverInterrupt_backup != -1) {
this->disableReceive();
}
#endif
for (int nRepeat = 0; nRepeat < nRepeatTransmit; nRepeat++) {
for (int i = length-1; i >= 0; i--) {
if (code & (1L << i))
this->transmit(protocol.one);
else
this->transmit(protocol.zero);
}
this->transmit(protocol.syncFactor);
}
// Disable transmit after sending (i.e., for inverted protocols)
digitalWrite(this->nTransmitterPin, LOW);
#if not defined( RCSwitchDisableReceiving )
// enable receiver again if we just disabled it
if (nReceiverInterrupt_backup != -1) {
this->enableReceive(nReceiverInterrupt_backup);
}
#endif
}
/**
* Transmit a single high-low pulse.
*/
void RCSwitch::transmit(HighLow pulses) {
uint8_t firstLogicLevel = (this->protocol.invertedSignal) ? LOW : HIGH;
uint8_t secondLogicLevel = (this->protocol.invertedSignal) ? HIGH : LOW;
digitalWrite(this->nTransmitterPin, firstLogicLevel);
delayMicroseconds( this->protocol.pulseLength * pulses.high);
digitalWrite(this->nTransmitterPin, secondLogicLevel);
delayMicroseconds( this->protocol.pulseLength * pulses.low);
}
#if not defined( RCSwitchDisableReceiving )
/**
* Enable receiving data
*/
void RCSwitch::enableReceive(int interrupt) {
this->nReceiverInterrupt = interrupt;
this->enableReceive();
}
void RCSwitch::enableReceive() {
if (this->nReceiverInterrupt != -1) {
RCSwitch::nReceivedValue = 0;
RCSwitch::nReceivedBitlength = 0;
#if defined(RaspberryPi) // Raspberry Pi
wiringPiISR(this->nReceiverInterrupt, INT_EDGE_BOTH, &handleInterrupt);
#else // Arduino
attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE);
#endif
}
}
/**
* Disable receiving data
*/
void RCSwitch::disableReceive() {
#if not defined(RaspberryPi) // Arduino
detachInterrupt(this->nReceiverInterrupt);
#endif // For Raspberry Pi (wiringPi) you can't unregister the ISR
this->nReceiverInterrupt = -1;
}
bool RCSwitch::available() {
return RCSwitch::nReceivedValue != 0;
}
void RCSwitch::resetAvailable() {
RCSwitch::nReceivedValue = 0;
}
unsigned long RCSwitch::getReceivedValue() {
return RCSwitch::nReceivedValue;
}
unsigned int RCSwitch::getReceivedBitlength() {
return RCSwitch::nReceivedBitlength;
}
unsigned int RCSwitch::getReceivedDelay() {
return RCSwitch::nReceivedDelay;
}
unsigned int RCSwitch::getReceivedProtocol() {
return RCSwitch::nReceivedProtocol;
}
unsigned int* RCSwitch::getReceivedRawdata() {
return RCSwitch::timings;
}
/* helper function for the receiveProtocol method */
static inline unsigned int diff(int A, int B) {
return abs(A - B);
}
/**
*
*/
bool RECEIVE_ATTR RCSwitch::receiveProtocol(const int p, unsigned int changeCount) {
#if defined(ESP8266) || defined(ESP32)
const Protocol &pro = proto[p-1];
#else
Protocol pro;
memcpy_P(&pro, &proto[p-1], sizeof(Protocol));
#endif
unsigned long code = 0;
//Assuming the longer pulse length is the pulse captured in timings[0]
const unsigned int syncLengthInPulses = ((pro.syncFactor.low) > (pro.syncFactor.high)) ? (pro.syncFactor.low) : (pro.syncFactor.high);
const unsigned int delay = RCSwitch::timings[0] / syncLengthInPulses;
const unsigned int delayTolerance = delay * RCSwitch::nReceiveTolerance / 100;
/* For protocols that start low, the sync period looks like
* _________
* _____________| |XXXXXXXXXXXX|
*
* |--1st dur--|-2nd dur-|-Start data-|
*
* The 3rd saved duration starts the data.
*
* For protocols that start high, the sync period looks like
*
* ______________
* | |____________|XXXXXXXXXXXXX|
*
* |-filtered out-|--1st dur--|--Start data--|
*
* The 2nd saved duration starts the data
*/
const unsigned int firstDataTiming = (pro.invertedSignal) ? (2) : (1);
for (unsigned int i = firstDataTiming; i < changeCount - 1; i += 2) {
code <<= 1;
if (diff(RCSwitch::timings[i], delay * pro.zero.high) < delayTolerance &&
diff(RCSwitch::timings[i + 1], delay * pro.zero.low) < delayTolerance) {
// zero
} else if (diff(RCSwitch::timings[i], delay * pro.one.high) < delayTolerance &&
diff(RCSwitch::timings[i + 1], delay * pro.one.low) < delayTolerance) {
// one
code |= 1;
} else {
// Failed
return false;
}
}
if (changeCount > 7) { // ignore very short transmissions: no device sends them, so this must be noise
RCSwitch::nReceivedValue = code;
RCSwitch::nReceivedBitlength = (changeCount - 1) / 2;
RCSwitch::nReceivedDelay = delay;
RCSwitch::nReceivedProtocol = p;
return true;
}
return false;
}
void RECEIVE_ATTR RCSwitch::handleInterrupt() {
static unsigned int changeCount = 0;
static unsigned long lastTime = 0;
static unsigned int repeatCount = 0;
const long time = micros();
const unsigned int duration = time - lastTime;
if (duration > RCSwitch::nSeparationLimit) {
// A long stretch without signal level change occurred. This could
// be the gap between two transmission.
if (diff(duration, RCSwitch::timings[0]) < 200) {
// This long signal is close in length to the long signal which
// started the previously recorded timings; this suggests that
// it may indeed by a a gap between two transmissions (we assume
// here that a sender will send the signal multiple times,
// with roughly the same gap between them).
repeatCount++;
if (repeatCount == 2) {
for(unsigned int i = 1; i <= numProto; i++) {
if (receiveProtocol(i, changeCount)) {
// receive succeeded for protocol i
break;
}
}
repeatCount = 0;
}
}
changeCount = 0;
}
// detect overflow
if (changeCount >= RCSWITCH_MAX_CHANGES) {
changeCount = 0;
repeatCount = 0;
}
RCSwitch::timings[changeCount++] = duration;
lastTime = time;
}
#endif

View File

@@ -0,0 +1,184 @@
/*
RCSwitch - Arduino libary for remote control outlet switches
Copyright (c) 2011 Suat Özgür. All right reserved.
Contributors:
- Andre Koehler / info(at)tomate-online(dot)de
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
- Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=46
- Dominik Fischer / dom_fischer(at)web(dot)de
- Frank Oltmanns / <first name>.<last name>(at)gmail(dot)com
- Max Horn / max(at)quendi(dot)de
- Robert ter Vehn / <first name>.<last name>(at)gmail(dot)com
Project home: https://github.com/sui77/rc-switch/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _RCSwitch_h
#define _RCSwitch_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#elif defined(ENERGIA) // LaunchPad, FraunchPad and StellarPad specific
#include "Energia.h"
#elif defined(RPI) // Raspberry Pi
#define RaspberryPi
// Include libraries for RPi:
#include <string.h> /* memcpy */
#include <stdlib.h> /* abs */
#include <wiringPi.h>
#elif defined(SPARK)
#include "application.h"
#else
#include "WProgram.h"
#endif
#include <stdint.h>
// At least for the ATTiny X4/X5, receiving has to be disabled due to
// missing libm depencies (udivmodhi4)
#if defined( __AVR_ATtinyX5__ ) or defined ( __AVR_ATtinyX4__ )
#define RCSwitchDisableReceiving
#endif
// Number of maximum high/Low changes per packet.
// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync
#define RCSWITCH_MAX_CHANGES 67
class RCSwitch {
public:
RCSwitch();
void switchOn(int nGroupNumber, int nSwitchNumber);
void switchOff(int nGroupNumber, int nSwitchNumber);
void switchOn(const char* sGroup, int nSwitchNumber);
void switchOff(const char* sGroup, int nSwitchNumber);
void switchOn(char sFamily, int nGroup, int nDevice);
void switchOff(char sFamily, int nGroup, int nDevice);
void switchOn(const char* sGroup, const char* sDevice);
void switchOff(const char* sGroup, const char* sDevice);
void switchOn(char sGroup, int nDevice);
void switchOff(char sGroup, int nDevice);
void sendTriState(const char* sCodeWord);
void send(unsigned long code, unsigned int length);
void send(const char* sCodeWord);
#if not defined( RCSwitchDisableReceiving )
void enableReceive(int interrupt);
void enableReceive();
void disableReceive();
bool available();
void resetAvailable();
unsigned long getReceivedValue();
unsigned int getReceivedBitlength();
unsigned int getReceivedDelay();
unsigned int getReceivedProtocol();
unsigned int* getReceivedRawdata();
#endif
void enableTransmit(int nTransmitterPin);
void disableTransmit();
void setPulseLength(int nPulseLength);
void setRepeatTransmit(int nRepeatTransmit);
#if not defined( RCSwitchDisableReceiving )
void setReceiveTolerance(int nPercent);
#endif
/**
* Description of a single pule, which consists of a high signal
* whose duration is "high" times the base pulse length, followed
* by a low signal lasting "low" times the base pulse length.
* Thus, the pulse overall lasts (high+low)*pulseLength
*/
struct HighLow {
uint8_t high;
uint8_t low;
};
/**
* A "protocol" describes how zero and one bits are encoded into high/low
* pulses.
*/
struct Protocol {
/** base pulse length in microseconds, e.g. 350 */
uint16_t pulseLength;
HighLow syncFactor;
HighLow zero;
HighLow one;
/**
* If true, interchange high and low logic levels in all transmissions.
*
* By default, RCSwitch assumes that any signals it sends or receives
* can be broken down into pulses which start with a high signal level,
* followed by a a low signal level. This is e.g. the case for the
* popular PT 2260 encoder chip, and thus many switches out there.
*
* But some devices do it the other way around, and start with a low
* signal level, followed by a high signal level, e.g. the HT6P20B. To
* accommodate this, one can set invertedSignal to true, which causes
* RCSwitch to change how it interprets any HighLow struct FOO: It will
* then assume transmissions start with a low signal lasting
* FOO.high*pulseLength microseconds, followed by a high signal lasting
* FOO.low*pulseLength microseconds.
*/
bool invertedSignal;
};
void setProtocol(Protocol protocol);
void setProtocol(int nProtocol);
void setProtocol(int nProtocol, int nPulseLength);
private:
char* getCodeWordA(const char* sGroup, const char* sDevice, bool bStatus);
char* getCodeWordB(int nGroupNumber, int nSwitchNumber, bool bStatus);
char* getCodeWordC(char sFamily, int nGroup, int nDevice, bool bStatus);
char* getCodeWordD(char group, int nDevice, bool bStatus);
void transmit(HighLow pulses);
#if not defined( RCSwitchDisableReceiving )
static void handleInterrupt();
static bool receiveProtocol(const int p, unsigned int changeCount);
int nReceiverInterrupt;
#endif
int nTransmitterPin;
int nRepeatTransmit;
Protocol protocol;
#if not defined( RCSwitchDisableReceiving )
static int nReceiveTolerance;
volatile static unsigned long nReceivedValue;
volatile static unsigned int nReceivedBitlength;
volatile static unsigned int nReceivedDelay;
volatile static unsigned int nReceivedProtocol;
const static unsigned int nSeparationLimit;
/*
* timings[0] contains sync timing, followed by a number of bits
*/
static unsigned int timings[RCSWITCH_MAX_CHANGES];
#endif
};
#endif

View File

@@ -0,0 +1,150 @@
#pragma once
#include <Arduino.h>
enum FB_FileType {
FB_PHOTO,
FB_AUDIO,
FB_DOC,
FB_VIDEO,
FB_GIF,
FB_VOICE,
};
struct FB_msg {
String& userID; // ID юзера
String& username; // ник (в API это first_name)
String& chatID; // ID чата
int32_t messageID; // ID сообщения
String& text; // текст
String& data; // callback дата
bool query; // запрос
bool& edited; // сообщение отредактировано
bool isBot; // сообщение от бота
bool OTA; // запрос на OTA обновление
uint32_t unix; // время сообщения
String& fileName; // имя файла
String& replyText; // текст ответа, если он есть
bool isFile; // это файл
String& fileUrl; // адрес файла для загрузки
// legacy
String& usrID; // ID юзера
String& first_name; // имя
String& last_name; // фамилия
int32_t ID; // ID сообщения
// вся информация одной строкой
String toString() {
String s;
s.reserve(200);
s += F("userID: ");
s += userID;
s += F(", username: ");
s += username;
s += F(", isBot: ");
s += isBot;
s += '\n';
s += F("chatID: ");
s += chatID;
s += F(", messageID: ");
s += messageID;
s += F(", edited: ");
s += edited;
s += '\n';
s += F("text: ");
s += text;
s += F(", replyText: ");
s += replyText;
s += '\n';
s += F("query: ");
s += query;
s += F(", data: ");
s += data;
s += '\n';
s += F("isFile: ");
s += isFile;
s += F(", fileName: ");
s += fileName;
s += F(", OTA: ");
s += OTA;
s += '\n';
s += F("fileUrl: ");
s += fileUrl;
s += '\n';
s += F("unix: ");
s += unix;
s += '\n';
return s;
}
};
struct FB_Time {
FB_Time(uint32_t unix = 0, int16_t gmt = 0) {
if (!unix) return;
if (abs(gmt) <= 12) gmt *= 60;
unix += gmt * 60L;
second = unix % 60ul;
unix /= 60ul;
minute = unix % 60ul;
unix /= 60ul;
hour = unix % 24ul;
unix /= 24ul;
dayWeek = (unix + 4) % 7;
if (!dayWeek) dayWeek = 7;
unix += 719468;
uint8_t era = unix / 146097ul;
uint16_t doe = unix - era * 146097ul;
uint16_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
year = yoe + era * 400;
uint16_t doy = doe - (yoe * 365 + yoe / 4 - yoe / 100);
uint16_t mp = (doy * 5 + 2) / 153;
day = doy - (mp * 153 + 2) / 5 + 1;
month = mp + (mp < 10 ? 3 : -9);
year += (month <= 2);
}
uint8_t second = 0;
uint8_t minute = 0;
uint8_t hour = 0;
uint8_t day = 0;
uint8_t month = 0;
uint8_t dayWeek = 0;
uint16_t year = 0;
// получить строку времени формата ЧЧ:ММ:СС
String timeString() {
String str;
if (!year) return str = F("Not sync");
str.reserve(8);
if (hour < 10) str += '0';
str += hour;
str += ':';
if (minute < 10) str += '0';
str += minute;
str += ':';
if (second < 10) str += '0';
str += second;
return str;
}
// получить строку даты формата ДД.ММ.ГГГГ
String dateString() {
String str;
if (!year) return str = F("Not sync");
str.reserve(10);
if (day < 10) str += '0';
str += day;
str += '.';
if (month < 10) str += '0';
str += month;
str += '.';
str += year;
return str;
}
};

View File

@@ -0,0 +1,551 @@
#include <Arduino.h>
#include <LittleFS.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>
#include "main.h"
#include "RCSwitch.h"
#include "pca9554.h"
#include "HalRelays.h"
#include "HalTimer.h"
#include "config.h"
#include "FastBot.h"
// Set i2c address
#define sda 12
#define scl 14
/*
Received 6277048 / 24bit Protocol: 1
Received 6277044 / 24bit Protocol: 1
Received 6277042 / 24bit Protocol: 1
Received 6277041 / 24bit Protocol: 1
*/
RCSwitch mySwitch = RCSwitch();
int rfPin = D1;
// PCA9554 io(0x38, sda, scl);
// PCA9554 io(0x20, sda, scl);
// HalRelays _rel(sda, scl, _rel_save, _rel_load);
HalRelays _rel(sda, scl, _fs_write, _fs_read);
Config _config;
FastBot _bot;
ESP8266WebServer _web(80);
unsigned long _radio_last_value;
void _timer1_handler()
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
HalTimer timer1(1 * 1000, _timer1_handler, true);
void _timer2_handler()
{
if (WiFi.status() == WL_CONNECTED)
{
_bot.tick();
}
}
HalTimer timer2(3 * 1000, _timer2_handler, true);
void sendHello()
{
String hi = F("Power On ") + (String)_config.version;
uint8 status = _bot.sendMessage(hi, _config.chatId);
Serial.println("Power On [" + (String)status + "]");
}
void bot_handler(FB_msg &msg)
{
Serial.print(msg.chatID); // ID чата
Serial.print(", ");
Serial.print(msg.username); // логин
Serial.print(", ");
Serial.println(msg.text); // текст
if (msg.OTA && msg.text == "-update")
{
String upd = F("update...");
Serial.println(upd);
_bot.update();
Serial.println(upd + "OK");
}
if (msg.text == "-this")
{
_config.chatId = msg.chatID;
_config_save();
_bot.sendMessage(F("Set this OK"), msg.chatID);
}
if (msg.text == "-reset")
{
// ESP.reset();
}
if (msg.text == "/set")
{
String hi = F("Настройки [") + (String)_config.version + "]\r\n";
_bot.sendMessage(hi, _config.chatId);
_bot.sendMessage(_rel.printChannelsToString(), _config.chatId);
}
if (msg.text == "/radio")
{
Serial.print(F("Radio Last: "));
Serial.println((String)_radio_last_value);
_bot.sendMessage(((String)_radio_last_value), msg.chatID);
_rel.printChannels();
Serial.print(F("load"));
_rel.load();
_rel.printChannels();
}
if (msg.text.startsWith(F("/r-")))
{
int number = (msg.text.substring(msg.text.indexOf("-") + 1, msg.text.length())).toInt();
if (0 <= number && number <= 7)
{
_rel.switchState(number);
}
}
if (msg.text.startsWith(F("/radio rel=")))
{
int number = (msg.text.substring(msg.text.indexOf("=") + 1, msg.text.length())).toInt();
if (0 <= number && number <= 7)
{
_rel.Channels[number].Code = _radio_last_value;
_rel.save();
String str = F("Set radio [") + (String)_radio_last_value + F("] to channel: [") + (String)number + F("]");
Serial.println(str);
_bot.sendMessage(str, msg.chatID);
}
}
}
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
pinMode(rfPin, INPUT);
// delay(100);
_fs_init();
_rel.init();
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println(F("SYSTEM: HAL9000"));
Serial.println(F("UNIT: HOMEON"));
if (!_config_load())
{
Serial.println(F("setup DEFAULT config"));
_config.ssidAP = "HomeOn";
_config.passAP = "012345678";
_config.ssid = "paranetm";
_config.pass = "78515169";
_config.version = VERSION;
_config.updateUrl = "http://iot.paranet.ru/cloudupdate/getup/?platform=HomeOn";
_config.token = "314329238:AAHIQa9Jvae3bnfAQBiOoC6kJZ70jtkYLks";
// 314329238:AAHIQa9Jvae3bnfAQBiOoC6kJZ70jtkYLks
_config.chatId = "";
_config_save();
}
_config.version = VERSION;
// String _rel_conf = _rel_load();
_rel.load();
_wifi_check();
_web_init();
if (WiFi.status() == WL_CONNECTED)
{
Serial.println(F("set token : ") + _config.token);
_bot.setToken(_config.token);
_bot.detach();
_bot.attach(bot_handler);
sendHello();
}
mySwitch.enableReceive(rfPin);
}
bool radio()
{
if (mySwitch.available())
{
_radio_last_value = mySwitch.getReceivedValue();
Serial.print(F("Received: "));
Serial.println(_radio_last_value);
mySwitch.resetAvailable();
if (_rel.cmd(_radio_last_value))
{
String text = F("Переключение: ") + (String)_radio_last_value;
_bot.sendMessage(text, _config.chatId);
}
return true;
}
return false;
}
void loop()
{
radio();
timer1.tick();
radio();
timer2.tick();
// if (WiFi.status() == WL_CONNECTED)
// {
// _bot.tick();
// }
radio();
//_web.handleClient();
}
void loop2()
{
delay(5000);
Serial.println(F("ping"));
// io.digitalWrite(pin, LOW);
_rel.offAll();
delay(5000);
// io.digitalWrite(pin, HIGH);
_rel.onAll();
return;
if (mySwitch.available())
{
/*
Received 6277044 / 24bit Protocol: 1
Received 6277042 / 24bit Protocol: 1
Received 6277041 / 24bit Protocol: 1
Received 6277048 / 24bit Protocol: 1
*/
/**
unsigned long code = mySwitch.getReceivedValue();
int pin = -1;
int le = sizeof(codes) / sizeof(unsigned long);
Serial.println("RC: " + (String)code);
for (byte i = 0; i < le; i++)
{
if (code == codes[i])
{
pin = i + 1;
if (pin == 3)
{
Serial.println("set off-timer");
off_timer = 6;
}
}
}
**/
Serial.print("Received ");
Serial.print(mySwitch.getReceivedValue());
Serial.print(" / ");
Serial.print(mySwitch.getReceivedBitlength());
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println(mySwitch.getReceivedProtocol());
mySwitch.resetAvailable();
}
}
/** base rutine **/
void _wifi_init(void)
{
// Попытка подключения к точке доступа
WiFi.setAutoConnect(false);
WiFi.BSSID(0);
WiFi.mode(WIFI_STA);
byte tries = 17;
String _ssid = _config.ssid;
String _pass = _config.pass;
Serial.print("MAC address: ");
Serial.println(WiFi.macAddress());
Serial.println("SSID: " + _ssid);
Serial.println("PASS: " + _pass);
WiFi.begin(_ssid.c_str(), _pass.c_str());
// Делаем проверку подключения до тех пор пока счетчик tries не станет равен нулю или не получим подключение
while (--tries && WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
if (WiFi.status() != WL_CONNECTED)
{
// Если не удалось подключиться запускаем в режиме AP
Serial.println("");
Serial.println("WiFi up AP");
_wifi_apmode();
}
else
{
// Иначе удалось подключиться отправляем сообщение о подключении и выводим адрес IP
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
WiFi.setAutoReconnect(true);
_isApMode = false;
}
//_config.ip = WiFi.localIP().toString();
}
bool _wifi_apmode()
{
String _ssidAP = _config.ssidAP;
String _passAP = _config.passAP;
Serial.println("AP SSID: " + _ssidAP);
Serial.println("AP PASS: " + _passAP);
// Отключаем WIFI
WiFi.disconnect();
// Меняем режим на режим точки доступа
WiFi.mode(WIFI_AP);
// Задаем настройки сети
Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(IPAddress(192, 168, 10, 1), IPAddress(192, 168, 10, 1), IPAddress(255, 255, 255, 0)) ? "Ready" : "Failed!");
// Включаем WIFI в режиме точки доступа с именем и паролем
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP(_ssidAP.c_str(), _passAP.c_str()) ? "AP Ready" : "AP Failed!");
// Serial.println(WiFi.softAP("test1", "12345678") ? "AP Ready" : "AP Failed!");
_isApMode = true;
return true;
}
void _wifi_check()
{
if (WiFi.status() != WL_CONNECTED)
{
_wifi_init();
return;
}
if (_isApMode)
{
_wifi_init();
}
}
bool _config_load(void)
{
String str = _fs_read(_config.getFileName());
if (!_config.convertFromString(str))
{
return false;
}
Serial.println(F("LOAD CONFING"));
Serial.println(str);
return true;
}
bool _config_save(void)
{
String str = _config.convertToString();
Serial.println(F("SAVE CONFING"));
return _fs_write(str, _config.getFileName());
}
void _web_init(void)
{
_web.on("/get", HTTP_GET, _handle_get);
_web.on("/gett", HTTP_GET, _handle_gett);
_web.on("/list", HTTP_GET, _handle_file_list);
_web.on("/set", HTTP_GET, _handle_set);
_web.onNotFound([]()
{
if (!_handle_file_read(_web.uri())) _web.send(404, "text/plain", "File Not Found: " + _web.uri()); });
_web.begin();
}
void _handle_set(void)
{
_config.ssid = _web.arg("ssid");
_config.pass = _web.arg("pass");
_config.token = _web.arg("bottoken");
_config.updateUrl = _web.arg("updateurl");
if (_config_save())
{
_web.send(200, "text/plain", "SUCCESS");
ESP.restart();
}
else
{
_web.send(500, "text/plain", "ERROR");
}
}
void _handle_get(void)
{
/***
String root = "{}";
DynamicJsonBuffer jsonBuffer;
JsonObject &json = jsonBuffer.parseObject(root);
_config.ToJson(json);
// Помещаем созданный json в переменную root
root = "";
json.printTo(root);
_web.send(200, "text/json", root);
***/
}
void _handle_gett(void)
{
/***
String root = "{}";
DynamicJsonBuffer jsonBuffer;
JsonObject &json = jsonBuffer.parseObject(root);
// Помещаем созданный json в переменную root
root = "";
json.printTo(root);
_web.send(200, "text/json", root);
***/
}
void _handle_file_list(void)
{
String path = "/";
if (_web.hasArg("dir"))
path += _web.arg("dir");
Dir dir = LittleFS.openDir(path);
path = String();
String output = "[";
while (dir.next())
{
File entry = dir.openFile("r");
if (output != "[")
output += ',';
bool isDir = false;
output += "{\"type\":\"";
output += (isDir) ? "dir" : "file";
output += "\",\"name\":\"";
output += String(entry.name()); //.substring(1);
output += "\"}";
entry.close();
}
output += "]";
_web.send(200, "text/json", output);
}
bool _handle_file_read(String path)
{
if (path.endsWith("/"))
path += "index.html";
String contentType = _getContentType(path);
String pathWithGz = path + ".gz";
if (LittleFS.exists(pathWithGz) || LittleFS.exists(path))
{
if (LittleFS.exists(pathWithGz))
path += ".gz";
File file = LittleFS.open(path, "r");
size_t sent = _web.streamFile(file, contentType);
file.close();
return true;
}
return false;
}
String _getContentType(String filename)
{
if (_web.hasArg("download"))
return "application/octet-stream";
else if (filename.endsWith(".htm"))
return "text/html";
else if (filename.endsWith(".html"))
return "text/html";
else if (filename.endsWith(".json"))
return "application/json";
else if (filename.endsWith(".css"))
return "text/css";
else if (filename.endsWith(".js"))
return "application/javascript";
else if (filename.endsWith(".png"))
return "image/png";
else if (filename.endsWith(".gif"))
return "image/gif";
else if (filename.endsWith(".jpg"))
return "image/jpeg";
else if (filename.endsWith(".ico"))
return "image/x-icon";
else if (filename.endsWith(".xml"))
return "text/xml";
else if (filename.endsWith(".pdf"))
return "application/x-pdf";
else if (filename.endsWith(".zip"))
return "application/x-zip";
else if (filename.endsWith(".gz"))
return "application/x-gzip";
return "text/plain";
}
void _fs_init(void)
{
LittleFS.begin();
{
Dir dir = LittleFS.openDir("/");
while (dir.next())
{
String fileName = dir.fileName();
size_t fileSize = dir.fileSize();
}
}
}
bool _fs_write(String str, String file_name)
{
File file = LittleFS.open(file_name, "w");
if (!file)
{
Serial.println(F("Failed to open file for writing"));
file.close();
return false;
}
file.print(str);
file.close();
Serial.println(F("SAVE FILE:"));
Serial.println(str);
return true;
}
String _fs_read(String file_name)
{
String str = "";
File file = LittleFS.open(file_name, "r");
if (!file)
return str;
str = file.readString();
file.close();
return str;
}

View File

@@ -0,0 +1,27 @@
#pragma once
#define VERSION "20260109:1"
bool _isApMode = false;
String _rel_load(void);
bool _rel_save(String config);
void _fs_init(void);
bool _fs_write(String str, String file_name);
String _fs_read(String file_name);
void _web_init(void);
void _wifi_init(void);
bool _handle_file_read(String path);
bool _wifi_apmode(void);
void _handle_get(void);
void _handle_gett(void);
void _handle_file_list(void);
void _handle_set(void);
bool _config_load(void);
String _getContentType(String filename);
bool _config_save(void);
int sensor_run(void);
void _termostat();
void _wifi_check();

View File

@@ -0,0 +1,150 @@
#pragma once
#include <Arduino.h>
#include <Wire.h>
// PCA9554 Addressing
// Address A2 A1 A0
// 0x20 L L L
// 0x21 L L H
// 0x22 L H L
// 0x23 L H H
// 0x24 H L L
// 0x25 H L H
// 0x26 H H L
// 0x27 H H H
#define INPUTPORT 0x00
#define OUTPUTPORT 0x01
#define POLINVPORT 0x02
#define CONFIGPORT 0x03
#define ALLOUTPUT 0x00
#define ALLINPUT 0xFF
class PCA9554
{
private:
int _address;
byte _sda = SDA;
byte _scl = SCL;
TwoWire *_wire;
bool twiRead(byte &registerAddress)
{
_wire->beginTransmission(_address);
_wire->write(registerAddress);
if (_wire->endTransmission() == 0)
{
delay(15);
_wire->requestFrom(_address, 1, true);
while (_wire->available() < 1)
;
registerAddress = _wire->read();
return true;
}
return false;
}
bool twiWrite(byte registerAddress, byte dataWrite)
{
_wire->beginTransmission(_address);
_wire->write(registerAddress);
_wire->write(dataWrite);
if (_wire->endTransmission() == 0)
return true;
return false;
}
public:
PCA9554() {}
PCA9554(byte address, byte sda, byte scl)
{
_wire = &Wire;
_address = address;
_sda = sda;
_scl = scl;
_wire->begin(_sda, _scl);
}
bool pinMode(byte pinNumber, bool state)
{
byte oldValue = CONFIGPORT;
if (this->twiRead(oldValue) && (pinNumber <= 7))
{
if (!state)
{
oldValue |= (1 << pinNumber);
if (this->portMode(oldValue))
return true;
return false;
}
else if (state)
{
oldValue &= ~(1 << pinNumber);
if (this->portMode(oldValue))
return true;
return false;
}
}
return false;
}
bool portMode(byte value)
{
if (this->twiWrite(CONFIGPORT, value))
return true;
return false;
}
bool digitalWrite(byte pinNumber, bool state)
{
byte oldValue = OUTPUTPORT;
if (this->twiRead(oldValue) && pinNumber <= 7)
{
if (state)
{
oldValue |= (1 << pinNumber);
if (this->digitalWritePort(oldValue))
return true;
return false;
}
else if (!state)
{
oldValue &= ~(1 << pinNumber);
if (this->digitalWritePort(oldValue))
return true;
return false;
}
}
return false;
}
bool digitalWritePort(byte value)
{
if (this->twiWrite(OUTPUTPORT, value))
return true;
return false;
}
bool digitalRead(byte &pinNumber)
{
byte oldValue = INPUTPORT;
if (this->twiRead(oldValue) && (pinNumber <= 7))
{
oldValue &= (1 << pinNumber);
if (oldValue > 0)
pinNumber = 1;
else
pinNumber = 0;
return true;
}
return false;
}
bool digitalReadPort(byte &value)
{
value = INPUTPORT;
if (this->twiRead(value))
return true;
return false;
}
};

View File

@@ -0,0 +1,109 @@
#include "utils.h"
void FB_escHTML(String& s) {
String out;
out.reserve(s.length());
for (uint16_t i = 0; i < s.length(); i++) {
switch (s[i]) {
case '<': out += F("&lt;"); break;
case '>': out += F("&gt;"); break;
case '&': out += F("&amp;"); break;
default: out += s[i]; break;
}
}
s = out;
}
static const char FB_escList[] = ">-={}.!";
void FB_escMarkdown(String& s) {
String out;
out.reserve(s.length());
for (uint16_t i = 0; i < s.length(); i++) {
if (strchr(FB_escList, s[i]) != 0) out += '\\';
out += s[i];
}
Serial.println(out);
s = out;
}
int64_t FB_str64(const String &s) {
return atoll(s.c_str());
}
String FB_64str(int64_t id) {
String s;
int32_t s1 = (int64_t)id % 1000000000;
int32_t s2 = (int64_t)id / 1000000000;
if (s2) {
s += s2;
s += abs(s1);
} else {
s += s1;
}
return s;
}
// упрощённый urlencode (до 38 ASCII + space)
// по хорошему нужно пропускать только a-Z, 0-9 и -_.!~*'()
void FB_urlencode(const String& s, String& dest) {
dest.reserve(s.length() + 10);
char c;
for (uint16_t i = 0; i < s.length(); i++) {
c = s[i];
if (c == ' ') dest += '+';
else if (c <= 38 || c == '+') {
dest += '%';
dest += (char)((c >> 4) + (((c >> 4) > 9) ? 87 : 48));
dest += (char)((c & 0xF) + (((c & 0xF) > 9) ? 87 : 48));
}
else dest += c;
}
}
// разработано Глебом Жуковым, допилено AlexGyver
// https://vk.com/wall-97877471_783011
void FB_unicode(String &uStr) {
if (!uStr.length()) return;
String out;
out.reserve(uStr.length() / 3);
int32_t uBytes, buf = 0;
char x0[] = "\0x";
for (uint16_t i = 0; i < uStr.length(); i++) {
if (uStr[i] != '\\') out += uStr[i];
else {
switch (uStr[++i]) {
case '0': break;
case 'n': out += '\n'; break;
case 'r': out += '\r'; break;
case 't': out += '\t'; break;
case 'u':
uBytes = strtol(uStr.c_str() + i + 1, NULL, HEX);
i += 4;
if ((uBytes >= 0xD800) && (uBytes <= 0xDBFF)) buf = uBytes;
else if ((uBytes >= 0xDC00) && (uBytes <= 0xDFFF)) {
uBytes = (0x10000 + ((buf - 0xD800) * 0x0400) + (uBytes - 0xDC00));
out += (char)(0b11110000 | ((uBytes >> 18) & 0b111));
out += x0;
out += (char)(0b10000000 | ((uBytes >> 12) & 0b111111));
out += x0;
out += (char)(0b10000000 | ((uBytes >> 6) & 0b111111));
out += x0;
out += (char)(0b10000000 | (uBytes & 0b111111));
} else if (uBytes < 0x800) {
out += (char)(0b11000000 | ((uBytes >> 6) & 0b11111));
out += x0;
out += (char)(0b10000000 | (uBytes & 0b111111));
} else if (uBytes >= 0x800) {
out += (char)(0b11100000 | ((uBytes >> 12) & 0b1111));
out += x0;
out += (char)(0b10000000 | ((uBytes >> 6) & 0b111111));
out += x0;
out += (char)(0b10000000 | (uBytes & 0b111111));
}
break;
default: out += uStr[i]; break;
}
}
}
uStr = out;
}

View File

@@ -0,0 +1,49 @@
#pragma once
#include <Arduino.h>
void FB_unicode(String &uStr);
void FB_urlencode(const String& s, String& dest);
void FB_escHTML(String& s);
void FB_escMarkdown(String& s);
int64_t FB_str64(const String &s);
String FB_64str(int64_t id);
struct FB_Parser {
FB_Parser() {
str.reserve(20);
}
bool parseNT(const String& s) {
while (!end) {
char c1 = s[++i];
if (c1 == '\t' || c1 == '\n' || c1 == '\0') {
int to = i;
if (s[to - 1] == ' ') to--;
if (s[from] == ' ') from++;
str = s.substring(from, to);
from = i + 1;
end = (c1 == '\0');
div = c1;
return 1;
}
}
return 0;
}
bool parse(const String& s) {
if (i >= (int)s.length() - 1) return 0;
i = s.indexOf(',', from);
if (i < 0) i = s.length();
int to = i;
if (s[to - 1] == ' ') to--;
if (s[from] == ' ') from++;
str = s.substring(from, to);
from = i + 1;
return 1;
}
int i = 0, from = 0;
char div;
bool end = false;
String str;
};

5
Devices/rancho/meteo-out/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -20,3 +20,9 @@ lib_deps =
isobit/ArduinoNATS@^1.1.2
; https://gitflic.ru/project/vpodberezsky/hal9000.git#1.1
https://github.com/GyverLibs/FastBot2#1.2.4
arduino-libraries/NTPClient@^3.2.1
; bblanchon/ArduinoJson@^7.2.1
milesburton/DallasTemperature@^3.11.0
https://gitflic.ru/project/vpodberezsky/hal9000.git#1.1
; knolleary/PubSubClient@^2.8

View File

@@ -0,0 +1,263 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ArduinoNATS.h>
#include <FastBot2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
FastBot2 bot;
String WIFI_SSID[] = {
"fazenda",
"paranetm",
};
#define hello_str "MeteoOut is online [20251203]"
#define WIFI_PASS "78515169"
#define BOT_TOKEN "5363807811:AAHRz_rDIY5AV2NpEzS9jy0xXwjScAJyUOs"
#define CHAT_ID "317081354"
#define ONE_WIRE_BUS D3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
WiFiClient clientNats;
NATS nats(
&clientNats,
"nats.paranet.ru", NATS_DEFAULT_PORT);
float currentT;
void getTemper()
{
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
float tempC = sensors.getTempCByIndex(0);
// Check if reading was successful
if (tempC != DEVICE_DISCONNECTED_C)
{
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(tempC);
}
else
{
Serial.println("Error: Could not read temperature data");
}
currentT = tempC;
}
String bot_last_message;
String bot_chat_id;
void updateh(fb::Update &u)
{
// Serial.println("NEW MESSAGE");
// Serial.println(u.message().from().username());
// Serial.println(u.message().text());
if (u.message().text() == "update meteoout" && u.message().document().name().endsWith(".bin"))
{ // .bin - значит это ОТА
bot.sendMessage(fb::Message("OTA begin", u.message().chat().id()));
// между downloadFile и updateFlash/updateFS/writeTo не должно быть отправки сообщений!
// OTA обновление тип 1
// bot.updateFlash(u.message().document(), u.message().chat().id());
// OTA обновление тип 2
fb::Fetcher fetch = bot.downloadFile(u.message().document().id());
if (fetch)
{
if (fetch.updateFlash())
{
Serial.println("OTA done");
bot.sendMessage(fb::Message("OTA done", u.message().chat().id()), true);
}
else
{
Serial.println("OTA error");
bot.sendMessage(fb::Message("OTA error", u.message().chat().id()), true);
}
}
}
String text = u.message().text();
String id = u.message().chat().id();
bot_last_message = text;
bot_chat_id = id;
// #1
// отправить обратно в чат (эхо)
// bot.sendMessage(fb::Message(u.message().text(), u.message().chat().id()));
// #2
// String text = u.message().text();
// text += " - ответ";
// bot.sendMessage(fb::Message(text, u.message().chat().id()));
// #3
// fb::Message msg;
// msg.text = u.message().text();
// msg.text += " - ответ";
// msg.chatID = u.message().chat().id();
// bot.sendMessage(msg);
}
void nats_blink_handler(NATS::msg msg)
{
// nats.publish(msg.reply, msg.data);
String str = F("reply\n");
str += msg.reply;
str += F("\ndata\n");
str += msg.data;
Serial.println(str);
// _telegram.send(str, _config.CHAT_ID);
// int count = atoi(msg.data);
// while (count-- > 0)
// {
// digitalWrite(LED_BUILTIN, LOW);
// delay(100);
// digitalWrite(LED_BUILTIN, HIGH);
// delay(100);
// }
}
void nats_on_connect()
{
nats.subscribe("switches/k1", nats_blink_handler);
}
void wifi_check()
{
if (WiFi.status() != WL_CONNECTED)
{
for (byte i = 0; i < WIFI_SSID->length(); i++)
{
Serial.println("");
Serial.print("try connected... ");
Serial.println(WIFI_SSID[i]);
byte tries = 20;
WiFi.begin(WIFI_SSID[i], WIFI_PASS);
while (tries-- > 0 && WiFi.status() != WL_CONNECTED)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(500);
Serial.print(".");
yield();
}
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("");
return;
}
}
return;
}
}
void setup()
{
delay(1000);
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println(F("SYSTEM: HAL9000"));
Serial.println(F("Module: MeteoOut"));
sensors.begin();
sensors.setResolution(9);
getTemper();
wifi_check();
Serial.println("WiFi connected");
// ============
bot.attachUpdate(updateh); // подключить обработчик обновлений
bot.setToken(F(BOT_TOKEN)); // установить токен
// режим опроса обновлений. Самый быстрый - Long
// особенности читай тут в самом низу
// https://github.com/GyverLibs/FastBot2/blob/main/docs/3.start.md
// bot.setPollMode(fb::Poll::Sync, 4000); // умолч
// bot.setPollMode(fb::Poll::Async, 4000);
bot.setPollMode(fb::Poll::Long, 60000);
// поприветствуем админа
bot.sendMessage(fb::Message(hello_str, CHAT_ID));
Serial.print("connect NATS...");
nats.on_connect = nats_on_connect;
if (nats.connect())
{
Serial.println(" OK");
bot.sendMessage(fb::Message("NATS connected.", CHAT_ID));
}
}
ulong ticks_1000 = 0;
ulong ticks_10000 = 0;
ulong ticks_10mins = 0;
ulong ticks_60mins = 0;
void telegram_handler()
{
String text = bot_last_message;
if (text.length() > 0)
{
Serial.println(F("CMD: ") + text);
Serial.println(F("from chat: ") + bot_chat_id);
if (text == "/get-meteo-out")
{
String msg = "T: " + (String)currentT;
bot.sendMessage(fb::Message(msg, bot_chat_id));
Serial.println("send to chat > " + bot_chat_id);
}
bot_last_message = "";
}
}
void loop()
{
if (millis() - ticks_1000 > 1000)
{
ticks_1000 = millis();
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
wifi_check();
telegram_handler();
}
if (millis() - ticks_10000 > 10000)
{
ticks_10000 = millis();
getTemper();
// Serial.println("t = " + (String)currentT);
}
if (millis() - ticks_10mins > 600000UL)
{
ticks_10mins = millis();
Serial.println("send to nats... ");
nats.publish("/sensors/meteoout", ((String)currentT).c_str());
Serial.println("OK");
}
if (millis() - ticks_60mins > 3600000UL)
{
ticks_60mins = millis();
bot.sendMessage(fb::Message("MeteoOut T: " + (String)currentT, bot_chat_id));
}
bot.tick();
nats.process();
yield();
}

View File

@@ -1,140 +0,0 @@
{
"Version": 1,
"WorkspaceRootPath": "D:\\_local_git\\HomeOnApp\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "Program.cs",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Program.cs",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
"RelativeToolTip": "Api.Services.DataBus\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-11-23T12:42:55.827Z",
"IsPinned": true,
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "App.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\App.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\App.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:12:12.287Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "Routes.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Routes.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Routes.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:12:00.693Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "Home.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Home.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Home.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:11:36.038Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "Program.cs",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
"RelativeDocumentMoniker": "Services.Web.UI\\Program.cs",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
"RelativeToolTip": "Services.Web.UI\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-11-23T13:10:49.152Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "launchSettings.json",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Properties\\launchSettings.json",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
"RelativeToolTip": "Api.Services.DataBus\\Properties\\launchSettings.json",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2025-11-23T12:57:22.581Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "Api.Services.DataBus.http",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Api.Services.DataBus.http",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
"RelativeToolTip": "Api.Services.DataBus\\Api.Services.DataBus.http",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003502|",
"WhenOpened": "2025-11-23T12:56:50.808Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@@ -1,174 +0,0 @@
{
"Version": 1,
"WorkspaceRootPath": "D:\\_local_git\\HomeOnApp\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\weather.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\weather.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\counter.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\counter.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
},
{
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}",
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "Program.cs",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Program.cs",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
"RelativeToolTip": "Api.Services.DataBus\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-11-23T12:42:55.827Z",
"IsPinned": true,
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "Weather.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Weather.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Weather.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Weather.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Weather.razor",
"ViewState": "AgIAABsAAAAAAAAAAAAAABkAAAAqAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:14:14.338Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "Counter.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Counter.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Counter.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Counter.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Counter.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:13:49.614Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "App.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\App.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\App.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:12:12.287Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "Routes.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Routes.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Routes.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:12:00.693Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "Home.razor",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Home.razor",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Home.razor",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2025-11-23T13:11:36.038Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "Program.cs",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
"RelativeDocumentMoniker": "Services.Web.UI\\Program.cs",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
"RelativeToolTip": "Services.Web.UI\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-11-23T13:10:49.152Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "launchSettings.json",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Properties\\launchSettings.json",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
"RelativeToolTip": "Api.Services.DataBus\\Properties\\launchSettings.json",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2025-11-23T12:57:22.581Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "Api.Services.DataBus.http",
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
"RelativeDocumentMoniker": "Api.Services.DataBus\\Api.Services.DataBus.http",
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
"RelativeToolTip": "Api.Services.DataBus\\Api.Services.DataBus.http",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003502|",
"WhenOpened": "2025-11-23T12:56:50.808Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
</ItemGroup>
</Project>

View File

@@ -1,6 +0,0 @@
@Api.Services.DataBus_HostAddress = http://localhost:5173
GET {{Api.Services.DataBus_HostAddress}}/weatherforecast/
Accept: application/json
###

View File

@@ -1,39 +0,0 @@
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast");
app.Run();
internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

View File

@@ -1,14 +0,0 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5173",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\vpodberezsky\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\vpodberezsky\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
</Project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.openapi\10.0.0\build\Microsoft.AspNetCore.OpenApi.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.openapi\10.0.0\build\Microsoft.AspNetCore.OpenApi.targets')" />
</ImportGroup>
</Project>

View File

@@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Api.Services.DataBus")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Api.Services.DataBus")]
[assembly: System.Reflection.AssemblyTitleAttribute("Api.Services.DataBus")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@@ -1 +0,0 @@
6fcfe52902469cd4a11fcdbd9675f02c70468f27aad962caca4dee55c91a9eaf

View File

@@ -1,17 +0,0 @@
// <auto-generated/>
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Routing;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Net.Http.Json;
global using System.Threading;
global using System.Threading.Tasks;

View File

@@ -1 +0,0 @@
{"GlobalPropertiesHash":"U5WhPJPIVoIchpLJ3IU+ENky8hcmTH8TR740SONAzR0=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["UYWt3os4Ukb1Rre\u002Bm\u002BQCaM/HDRckO9F2SwlcwE2e4PI=","79/nlzCC2T1MKLzeg09cQdb4EPmlGLoouwFfqAZfm/w="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1,577 +0,0 @@
{
"version": 3,
"targets": {
"net10.0": {
"Microsoft.AspNetCore.OpenApi/10.0.0": {
"type": "package",
"dependencies": {
"Microsoft.OpenApi": "2.0.0"
},
"compile": {
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll": {
"related": ".xml"
}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
],
"build": {
"build/Microsoft.AspNetCore.OpenApi.targets": {}
}
},
"Microsoft.OpenApi/2.0.0": {
"type": "package",
"compile": {
"lib/net8.0/Microsoft.OpenApi.dll": {
"related": ".pdb;.xml"
}
},
"runtime": {
"lib/net8.0/Microsoft.OpenApi.dll": {
"related": ".pdb;.xml"
}
}
}
}
},
"libraries": {
"Microsoft.AspNetCore.OpenApi/10.0.0": {
"sha512": "0aqIF1t+sA2T62LIeMtXGSiaV7keGQaJnvwwmu+htQdjCaKYARfXAeqp4nHH9y2etpilyZ/tnQzZg4Ilmo/c4Q==",
"type": "package",
"path": "microsoft.aspnetcore.openapi/10.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"PACKAGE.md",
"THIRD-PARTY-NOTICES.TXT",
"analyzers/dotnet/cs/Microsoft.AspNetCore.OpenApi.SourceGenerators.dll",
"build/Microsoft.AspNetCore.OpenApi.targets",
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll",
"lib/net10.0/Microsoft.AspNetCore.OpenApi.xml",
"microsoft.aspnetcore.openapi.10.0.0.nupkg.sha512",
"microsoft.aspnetcore.openapi.nuspec"
]
},
"Microsoft.OpenApi/2.0.0": {
"sha512": "GGYLfzV/G/ct80OZ45JxnWP7NvMX1BCugn/lX7TH5o0lcVaviavsLMTxmFV2AybXWjbi3h6FF1vgZiTK6PXndw==",
"type": "package",
"path": "microsoft.openapi/2.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"README.md",
"lib/net8.0/Microsoft.OpenApi.dll",
"lib/net8.0/Microsoft.OpenApi.pdb",
"lib/net8.0/Microsoft.OpenApi.xml",
"lib/netstandard2.0/Microsoft.OpenApi.dll",
"lib/netstandard2.0/Microsoft.OpenApi.pdb",
"lib/netstandard2.0/Microsoft.OpenApi.xml",
"microsoft.openapi.2.0.0.nupkg.sha512",
"microsoft.openapi.nuspec"
]
}
},
"projectFileDependencyGroups": {
"net10.0": [
"Microsoft.AspNetCore.OpenApi >= 10.0.0"
]
},
"packageFolders": {
"C:\\Users\\vpodberezsky\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
"projectName": "Api.Services.DataBus",
"projectPath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
"packagesPath": "C:\\Users\\vpodberezsky\\.nuget\\packages\\",
"outputPath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\vpodberezsky\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net10.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net10.0": {
"targetAlias": "net10.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "10.0.100"
},
"frameworks": {
"net10.0": {
"targetAlias": "net10.0",
"dependencies": {
"Microsoft.AspNetCore.OpenApi": {
"target": "Package",
"version": "[10.0.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.AspNetCore.App": {
"privateAssets": "none"
},
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100/PortableRuntimeIdentifierGraph.json",
"packagesToPrune": {
"Microsoft.AspNetCore": "(,10.0.32767]",
"Microsoft.AspNetCore.Antiforgery": "(,10.0.32767]",
"Microsoft.AspNetCore.App": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication.BearerToken": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication.Cookies": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication.Core": "(,10.0.32767]",
"Microsoft.AspNetCore.Authentication.OAuth": "(,10.0.32767]",
"Microsoft.AspNetCore.Authorization": "(,10.0.32767]",
"Microsoft.AspNetCore.Authorization.Policy": "(,10.0.32767]",
"Microsoft.AspNetCore.Components": "(,10.0.32767]",
"Microsoft.AspNetCore.Components.Authorization": "(,10.0.32767]",
"Microsoft.AspNetCore.Components.Endpoints": "(,10.0.32767]",
"Microsoft.AspNetCore.Components.Forms": "(,10.0.32767]",
"Microsoft.AspNetCore.Components.Server": "(,10.0.32767]",
"Microsoft.AspNetCore.Components.Web": "(,10.0.32767]",
"Microsoft.AspNetCore.Connections.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.CookiePolicy": "(,10.0.32767]",
"Microsoft.AspNetCore.Cors": "(,10.0.32767]",
"Microsoft.AspNetCore.Cryptography.Internal": "(,10.0.32767]",
"Microsoft.AspNetCore.Cryptography.KeyDerivation": "(,10.0.32767]",
"Microsoft.AspNetCore.DataProtection": "(,10.0.32767]",
"Microsoft.AspNetCore.DataProtection.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.DataProtection.Extensions": "(,10.0.32767]",
"Microsoft.AspNetCore.Diagnostics": "(,10.0.32767]",
"Microsoft.AspNetCore.Diagnostics.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Diagnostics.HealthChecks": "(,10.0.32767]",
"Microsoft.AspNetCore.HostFiltering": "(,10.0.32767]",
"Microsoft.AspNetCore.Hosting": "(,10.0.32767]",
"Microsoft.AspNetCore.Hosting.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Hosting.Server.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Html.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Http": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Connections": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Connections.Common": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Extensions": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Features": "(,10.0.32767]",
"Microsoft.AspNetCore.Http.Results": "(,10.0.32767]",
"Microsoft.AspNetCore.HttpLogging": "(,10.0.32767]",
"Microsoft.AspNetCore.HttpOverrides": "(,10.0.32767]",
"Microsoft.AspNetCore.HttpsPolicy": "(,10.0.32767]",
"Microsoft.AspNetCore.Identity": "(,10.0.32767]",
"Microsoft.AspNetCore.Localization": "(,10.0.32767]",
"Microsoft.AspNetCore.Localization.Routing": "(,10.0.32767]",
"Microsoft.AspNetCore.Metadata": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.ApiExplorer": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Core": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Cors": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.DataAnnotations": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Formatters.Json": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Formatters.Xml": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Localization": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.Razor": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.RazorPages": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.TagHelpers": "(,10.0.32767]",
"Microsoft.AspNetCore.Mvc.ViewFeatures": "(,10.0.32767]",
"Microsoft.AspNetCore.OutputCaching": "(,10.0.32767]",
"Microsoft.AspNetCore.RateLimiting": "(,10.0.32767]",
"Microsoft.AspNetCore.Razor": "(,10.0.32767]",
"Microsoft.AspNetCore.Razor.Runtime": "(,10.0.32767]",
"Microsoft.AspNetCore.RequestDecompression": "(,10.0.32767]",
"Microsoft.AspNetCore.ResponseCaching": "(,10.0.32767]",
"Microsoft.AspNetCore.ResponseCaching.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.ResponseCompression": "(,10.0.32767]",
"Microsoft.AspNetCore.Rewrite": "(,10.0.32767]",
"Microsoft.AspNetCore.Routing": "(,10.0.32767]",
"Microsoft.AspNetCore.Routing.Abstractions": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.HttpSys": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.IIS": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.IISIntegration": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.Kestrel": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.Kestrel.Core": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Quic": "(,10.0.32767]",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "(,10.0.32767]",
"Microsoft.AspNetCore.Session": "(,10.0.32767]",
"Microsoft.AspNetCore.SignalR": "(,10.0.32767]",
"Microsoft.AspNetCore.SignalR.Common": "(,10.0.32767]",
"Microsoft.AspNetCore.SignalR.Core": "(,10.0.32767]",
"Microsoft.AspNetCore.SignalR.Protocols.Json": "(,10.0.32767]",
"Microsoft.AspNetCore.StaticAssets": "(,10.0.32767]",
"Microsoft.AspNetCore.StaticFiles": "(,10.0.32767]",
"Microsoft.AspNetCore.WebSockets": "(,10.0.32767]",
"Microsoft.AspNetCore.WebUtilities": "(,10.0.32767]",
"Microsoft.CSharp": "(,4.7.32767]",
"Microsoft.Extensions.Caching.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Caching.Memory": "(,10.0.32767]",
"Microsoft.Extensions.Configuration": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.Binder": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.CommandLine": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.FileExtensions": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.Ini": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.Json": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.KeyPerFile": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.UserSecrets": "(,10.0.32767]",
"Microsoft.Extensions.Configuration.Xml": "(,10.0.32767]",
"Microsoft.Extensions.DependencyInjection": "(,10.0.32767]",
"Microsoft.Extensions.DependencyInjection.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Diagnostics": "(,10.0.32767]",
"Microsoft.Extensions.Diagnostics.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Diagnostics.HealthChecks": "(,10.0.32767]",
"Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Features": "(,10.0.32767]",
"Microsoft.Extensions.FileProviders.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.FileProviders.Composite": "(,10.0.32767]",
"Microsoft.Extensions.FileProviders.Physical": "(,10.0.32767]",
"Microsoft.Extensions.FileSystemGlobbing": "(,10.0.32767]",
"Microsoft.Extensions.Hosting": "(,10.0.32767]",
"Microsoft.Extensions.Hosting.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Http": "(,10.0.32767]",
"Microsoft.Extensions.Identity.Core": "(,10.0.32767]",
"Microsoft.Extensions.Identity.Stores": "(,10.0.32767]",
"Microsoft.Extensions.Localization": "(,10.0.32767]",
"Microsoft.Extensions.Localization.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Logging": "(,10.0.32767]",
"Microsoft.Extensions.Logging.Abstractions": "(,10.0.32767]",
"Microsoft.Extensions.Logging.Configuration": "(,10.0.32767]",
"Microsoft.Extensions.Logging.Console": "(,10.0.32767]",
"Microsoft.Extensions.Logging.Debug": "(,10.0.32767]",
"Microsoft.Extensions.Logging.EventLog": "(,10.0.32767]",
"Microsoft.Extensions.Logging.EventSource": "(,10.0.32767]",
"Microsoft.Extensions.Logging.TraceSource": "(,10.0.32767]",
"Microsoft.Extensions.ObjectPool": "(,10.0.32767]",
"Microsoft.Extensions.Options": "(,10.0.32767]",
"Microsoft.Extensions.Options.ConfigurationExtensions": "(,10.0.32767]",
"Microsoft.Extensions.Options.DataAnnotations": "(,10.0.32767]",
"Microsoft.Extensions.Primitives": "(,10.0.32767]",
"Microsoft.Extensions.Validation": "(,10.0.32767]",
"Microsoft.Extensions.WebEncoders": "(,10.0.32767]",
"Microsoft.JSInterop": "(,10.0.32767]",
"Microsoft.Net.Http.Headers": "(,10.0.32767]",
"Microsoft.VisualBasic": "(,10.4.32767]",
"Microsoft.Win32.Primitives": "(,4.3.32767]",
"Microsoft.Win32.Registry": "(,5.0.32767]",
"runtime.any.System.Collections": "(,4.3.32767]",
"runtime.any.System.Diagnostics.Tools": "(,4.3.32767]",
"runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]",
"runtime.any.System.Globalization": "(,4.3.32767]",
"runtime.any.System.Globalization.Calendars": "(,4.3.32767]",
"runtime.any.System.IO": "(,4.3.32767]",
"runtime.any.System.Reflection": "(,4.3.32767]",
"runtime.any.System.Reflection.Extensions": "(,4.3.32767]",
"runtime.any.System.Reflection.Primitives": "(,4.3.32767]",
"runtime.any.System.Resources.ResourceManager": "(,4.3.32767]",
"runtime.any.System.Runtime": "(,4.3.32767]",
"runtime.any.System.Runtime.Handles": "(,4.3.32767]",
"runtime.any.System.Runtime.InteropServices": "(,4.3.32767]",
"runtime.any.System.Text.Encoding": "(,4.3.32767]",
"runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]",
"runtime.any.System.Threading.Tasks": "(,4.3.32767]",
"runtime.any.System.Threading.Timer": "(,4.3.32767]",
"runtime.aot.System.Collections": "(,4.3.32767]",
"runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]",
"runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]",
"runtime.aot.System.Globalization": "(,4.3.32767]",
"runtime.aot.System.Globalization.Calendars": "(,4.3.32767]",
"runtime.aot.System.IO": "(,4.3.32767]",
"runtime.aot.System.Reflection": "(,4.3.32767]",
"runtime.aot.System.Reflection.Extensions": "(,4.3.32767]",
"runtime.aot.System.Reflection.Primitives": "(,4.3.32767]",
"runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]",
"runtime.aot.System.Runtime": "(,4.3.32767]",
"runtime.aot.System.Runtime.Handles": "(,4.3.32767]",
"runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]",
"runtime.aot.System.Text.Encoding": "(,4.3.32767]",
"runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]",
"runtime.aot.System.Threading.Tasks": "(,4.3.32767]",
"runtime.aot.System.Threading.Timer": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]",
"runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]",
"runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]",
"runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]",
"runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]",
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
"runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]",
"runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
"runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]",
"runtime.unix.System.Console": "(,4.3.32767]",
"runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]",
"runtime.unix.System.IO.FileSystem": "(,4.3.32767]",
"runtime.unix.System.Net.Primitives": "(,4.3.32767]",
"runtime.unix.System.Net.Sockets": "(,4.3.32767]",
"runtime.unix.System.Private.Uri": "(,4.3.32767]",
"runtime.unix.System.Runtime.Extensions": "(,4.3.32767]",
"runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]",
"runtime.win.System.Console": "(,4.3.32767]",
"runtime.win.System.Diagnostics.Debug": "(,4.3.32767]",
"runtime.win.System.IO.FileSystem": "(,4.3.32767]",
"runtime.win.System.Net.Primitives": "(,4.3.32767]",
"runtime.win.System.Net.Sockets": "(,4.3.32767]",
"runtime.win.System.Runtime.Extensions": "(,4.3.32767]",
"runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
"runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
"runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
"runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]",
"runtime.win7.System.Private.Uri": "(,4.3.32767]",
"runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]",
"System.AppContext": "(,4.3.32767]",
"System.Buffers": "(,5.0.32767]",
"System.Collections": "(,4.3.32767]",
"System.Collections.Concurrent": "(,4.3.32767]",
"System.Collections.Immutable": "(,10.0.32767]",
"System.Collections.NonGeneric": "(,4.3.32767]",
"System.Collections.Specialized": "(,4.3.32767]",
"System.ComponentModel": "(,4.3.32767]",
"System.ComponentModel.Annotations": "(,4.3.32767]",
"System.ComponentModel.EventBasedAsync": "(,4.3.32767]",
"System.ComponentModel.Primitives": "(,4.3.32767]",
"System.ComponentModel.TypeConverter": "(,4.3.32767]",
"System.Console": "(,4.3.32767]",
"System.Data.Common": "(,4.3.32767]",
"System.Data.DataSetExtensions": "(,4.4.32767]",
"System.Diagnostics.Contracts": "(,4.3.32767]",
"System.Diagnostics.Debug": "(,4.3.32767]",
"System.Diagnostics.DiagnosticSource": "(,10.0.32767]",
"System.Diagnostics.EventLog": "(,10.0.32767]",
"System.Diagnostics.FileVersionInfo": "(,4.3.32767]",
"System.Diagnostics.Process": "(,4.3.32767]",
"System.Diagnostics.StackTrace": "(,4.3.32767]",
"System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]",
"System.Diagnostics.Tools": "(,4.3.32767]",
"System.Diagnostics.TraceSource": "(,4.3.32767]",
"System.Diagnostics.Tracing": "(,4.3.32767]",
"System.Drawing.Primitives": "(,4.3.32767]",
"System.Dynamic.Runtime": "(,4.3.32767]",
"System.Formats.Asn1": "(,10.0.32767]",
"System.Formats.Cbor": "(,10.0.32767]",
"System.Formats.Tar": "(,10.0.32767]",
"System.Globalization": "(,4.3.32767]",
"System.Globalization.Calendars": "(,4.3.32767]",
"System.Globalization.Extensions": "(,4.3.32767]",
"System.IO": "(,4.3.32767]",
"System.IO.Compression": "(,4.3.32767]",
"System.IO.Compression.ZipFile": "(,4.3.32767]",
"System.IO.FileSystem": "(,4.3.32767]",
"System.IO.FileSystem.AccessControl": "(,4.4.32767]",
"System.IO.FileSystem.DriveInfo": "(,4.3.32767]",
"System.IO.FileSystem.Primitives": "(,4.3.32767]",
"System.IO.FileSystem.Watcher": "(,4.3.32767]",
"System.IO.IsolatedStorage": "(,4.3.32767]",
"System.IO.MemoryMappedFiles": "(,4.3.32767]",
"System.IO.Pipelines": "(,10.0.32767]",
"System.IO.Pipes": "(,4.3.32767]",
"System.IO.Pipes.AccessControl": "(,5.0.32767]",
"System.IO.UnmanagedMemoryStream": "(,4.3.32767]",
"System.Linq": "(,4.3.32767]",
"System.Linq.AsyncEnumerable": "(,10.0.32767]",
"System.Linq.Expressions": "(,4.3.32767]",
"System.Linq.Parallel": "(,4.3.32767]",
"System.Linq.Queryable": "(,4.3.32767]",
"System.Memory": "(,5.0.32767]",
"System.Net.Http": "(,4.3.32767]",
"System.Net.Http.Json": "(,10.0.32767]",
"System.Net.NameResolution": "(,4.3.32767]",
"System.Net.NetworkInformation": "(,4.3.32767]",
"System.Net.Ping": "(,4.3.32767]",
"System.Net.Primitives": "(,4.3.32767]",
"System.Net.Requests": "(,4.3.32767]",
"System.Net.Security": "(,4.3.32767]",
"System.Net.ServerSentEvents": "(,10.0.32767]",
"System.Net.Sockets": "(,4.3.32767]",
"System.Net.WebHeaderCollection": "(,4.3.32767]",
"System.Net.WebSockets": "(,4.3.32767]",
"System.Net.WebSockets.Client": "(,4.3.32767]",
"System.Numerics.Vectors": "(,5.0.32767]",
"System.ObjectModel": "(,4.3.32767]",
"System.Private.DataContractSerialization": "(,4.3.32767]",
"System.Private.Uri": "(,4.3.32767]",
"System.Reflection": "(,4.3.32767]",
"System.Reflection.DispatchProxy": "(,6.0.32767]",
"System.Reflection.Emit": "(,4.7.32767]",
"System.Reflection.Emit.ILGeneration": "(,4.7.32767]",
"System.Reflection.Emit.Lightweight": "(,4.7.32767]",
"System.Reflection.Extensions": "(,4.3.32767]",
"System.Reflection.Metadata": "(,10.0.32767]",
"System.Reflection.Primitives": "(,4.3.32767]",
"System.Reflection.TypeExtensions": "(,4.3.32767]",
"System.Resources.Reader": "(,4.3.32767]",
"System.Resources.ResourceManager": "(,4.3.32767]",
"System.Resources.Writer": "(,4.3.32767]",
"System.Runtime": "(,4.3.32767]",
"System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]",
"System.Runtime.CompilerServices.VisualC": "(,4.3.32767]",
"System.Runtime.Extensions": "(,4.3.32767]",
"System.Runtime.Handles": "(,4.3.32767]",
"System.Runtime.InteropServices": "(,4.3.32767]",
"System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]",
"System.Runtime.Loader": "(,4.3.32767]",
"System.Runtime.Numerics": "(,4.3.32767]",
"System.Runtime.Serialization.Formatters": "(,4.3.32767]",
"System.Runtime.Serialization.Json": "(,4.3.32767]",
"System.Runtime.Serialization.Primitives": "(,4.3.32767]",
"System.Runtime.Serialization.Xml": "(,4.3.32767]",
"System.Security.AccessControl": "(,6.0.32767]",
"System.Security.Claims": "(,4.3.32767]",
"System.Security.Cryptography.Algorithms": "(,4.3.32767]",
"System.Security.Cryptography.Cng": "(,5.0.32767]",
"System.Security.Cryptography.Csp": "(,4.3.32767]",
"System.Security.Cryptography.Encoding": "(,4.3.32767]",
"System.Security.Cryptography.OpenSsl": "(,5.0.32767]",
"System.Security.Cryptography.Primitives": "(,4.3.32767]",
"System.Security.Cryptography.X509Certificates": "(,4.3.32767]",
"System.Security.Cryptography.Xml": "(,10.0.32767]",
"System.Security.Principal": "(,4.3.32767]",
"System.Security.Principal.Windows": "(,5.0.32767]",
"System.Security.SecureString": "(,4.3.32767]",
"System.Text.Encoding": "(,4.3.32767]",
"System.Text.Encoding.CodePages": "(,10.0.32767]",
"System.Text.Encoding.Extensions": "(,4.3.32767]",
"System.Text.Encodings.Web": "(,10.0.32767]",
"System.Text.Json": "(,10.0.32767]",
"System.Text.RegularExpressions": "(,4.3.32767]",
"System.Threading": "(,4.3.32767]",
"System.Threading.AccessControl": "(,10.0.32767]",
"System.Threading.Channels": "(,10.0.32767]",
"System.Threading.Overlapped": "(,4.3.32767]",
"System.Threading.RateLimiting": "(,10.0.32767]",
"System.Threading.Tasks": "(,4.3.32767]",
"System.Threading.Tasks.Dataflow": "(,10.0.32767]",
"System.Threading.Tasks.Extensions": "(,5.0.32767]",
"System.Threading.Tasks.Parallel": "(,4.3.32767]",
"System.Threading.Thread": "(,4.3.32767]",
"System.Threading.ThreadPool": "(,4.3.32767]",
"System.Threading.Timer": "(,4.3.32767]",
"System.ValueTuple": "(,4.5.32767]",
"System.Xml.ReaderWriter": "(,4.3.32767]",
"System.Xml.XDocument": "(,4.3.32767]",
"System.Xml.XmlDocument": "(,4.3.32767]",
"System.Xml.XmlSerializer": "(,4.3.32767]",
"System.Xml.XPath": "(,4.3.32767]",
"System.Xml.XPath.XDocument": "(,5.0.32767]"
}
}
}
}
}

View File

@@ -1,11 +0,0 @@
{
"version": 2,
"dgSpecHash": "SXLztkQN/uI=",
"success": true,
"projectFilePath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
"expectedPackageFiles": [
"C:\\Users\\vpodberezsky\\.nuget\\packages\\microsoft.aspnetcore.openapi\\10.0.0\\microsoft.aspnetcore.openapi.10.0.0.nupkg.sha512",
"C:\\Users\\vpodberezsky\\.nuget\\packages\\microsoft.openapi\\2.0.0\\microsoft.openapi.2.0.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -1,4 +0,0 @@
<Solution>
<Project Path="Api.Services.DataBus/Api.Services.DataBus.csproj" />
<Project Path="Services.Web.UI/Services.Web.UI.csproj" Id="186cadb7-6d07-4958-b0b6-99e644e43568" />
</Solution>

View File

@@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<ResourcePreloader />
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
<link rel="stylesheet" href="@Assets["app.css"]" />
<link rel="stylesheet" href="@Assets["Services.Web.UI.styles.css"]" />
<ImportMap />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
</head>
<body>
<Routes />
<ReconnectModal />
<script src="@Assets["_framework/blazor.web.js"]"></script>
</body>
</html>

View File

@@ -1,23 +0,0 @@
@inherits LayoutComponentBase
<div class="page">
<div class="sidebar">
<NavMenu />
</div>
<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>
<div id="blazor-error-ui" data-nosnippet>
An unhandled error has occurred.
<a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span>
</div>

View File

@@ -1,98 +0,0 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}
.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}

View File

@@ -1,30 +0,0 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">Services.Web.UI</a>
</div>
</div>
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<nav class="nav flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="weather">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
</NavLink>
</div>
</nav>
</div>

View File

@@ -1,105 +0,0 @@
.navbar-toggler {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand {
font-size: 1.1rem;
}
.bi {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item ::deep a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item ::deep .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler {
display: none;
}
.nav-scrollable {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}

View File

@@ -1,31 +0,0 @@
<script type="module" src="@Assets["Components/Layout/ReconnectModal.razor.js"]"></script>
<dialog id="components-reconnect-modal" data-nosnippet>
<div class="components-reconnect-container">
<div class="components-rejoining-animation" aria-hidden="true">
<div></div>
<div></div>
</div>
<p class="components-reconnect-first-attempt-visible">
Rejoining the server...
</p>
<p class="components-reconnect-repeated-attempt-visible">
Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.
</p>
<p class="components-reconnect-failed-visible">
Failed to rejoin.<br />Please retry or reload the page.
</p>
<button id="components-reconnect-button" class="components-reconnect-failed-visible">
Retry
</button>
<p class="components-pause-visible">
The session has been paused by the server.
</p>
<button id="components-resume-button" class="components-pause-visible">
Resume
</button>
<p class="components-resume-failed-visible">
Failed to resume the session.<br />Please reload the page.
</p>
</div>
</dialog>

View File

@@ -1,157 +0,0 @@
.components-reconnect-first-attempt-visible,
.components-reconnect-repeated-attempt-visible,
.components-reconnect-failed-visible,
.components-pause-visible,
.components-resume-failed-visible,
.components-rejoining-animation {
display: none;
}
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible,
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation,
#components-reconnect-modal.components-reconnect-paused .components-pause-visible,
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible,
#components-reconnect-modal.components-reconnect-retrying,
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible,
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation,
#components-reconnect-modal.components-reconnect-failed,
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible {
display: block;
}
#components-reconnect-modal {
background-color: white;
width: 20rem;
margin: 20vh auto;
padding: 2rem;
border: 0;
border-radius: 0.5rem;
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
animation: components-reconnect-modal-fadeOutOpacity 0.5s both;
&[open]
{
animation: components-reconnect-modal-slideUp 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity 0.5s ease-in-out 0.3s;
animation-fill-mode: both;
}
}
#components-reconnect-modal::backdrop {
background-color: rgba(0, 0, 0, 0.4);
animation: components-reconnect-modal-fadeInOpacity 0.5s ease-in-out;
opacity: 1;
}
@keyframes components-reconnect-modal-slideUp {
0% {
transform: translateY(30px) scale(0.95);
}
100% {
transform: translateY(0);
}
}
@keyframes components-reconnect-modal-fadeInOpacity {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes components-reconnect-modal-fadeOutOpacity {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.components-reconnect-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
#components-reconnect-modal p {
margin: 0;
text-align: center;
}
#components-reconnect-modal button {
border: 0;
background-color: #6b9ed2;
color: white;
padding: 4px 24px;
border-radius: 4px;
}
#components-reconnect-modal button:hover {
background-color: #3b6ea2;
}
#components-reconnect-modal button:active {
background-color: #6b9ed2;
}
.components-rejoining-animation {
position: relative;
width: 80px;
height: 80px;
}
.components-rejoining-animation div {
position: absolute;
border: 3px solid #0087ff;
opacity: 1;
border-radius: 50%;
animation: components-rejoining-animation 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.components-rejoining-animation div:nth-child(2) {
animation-delay: -0.5s;
}
@keyframes components-rejoining-animation {
0% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
4.9% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
5% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 80px;
height: 80px;
opacity: 0;
}
}

View File

@@ -1,63 +0,0 @@
// Set up event handlers
const reconnectModal = document.getElementById("components-reconnect-modal");
reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
const retryButton = document.getElementById("components-reconnect-button");
retryButton.addEventListener("click", retry);
const resumeButton = document.getElementById("components-resume-button");
resumeButton.addEventListener("click", resume);
function handleReconnectStateChanged(event) {
if (event.detail.state === "show") {
reconnectModal.showModal();
} else if (event.detail.state === "hide") {
reconnectModal.close();
} else if (event.detail.state === "failed") {
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
} else if (event.detail.state === "rejected") {
location.reload();
}
}
async function retry() {
document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
try {
// Reconnect will asynchronously return:
// - true to mean success
// - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
// - exception to mean we didn't reach the server (this can be sync or async)
const successful = await Blazor.reconnect();
if (!successful) {
// We have been able to reach the server, but the circuit is no longer available.
// We'll reload the page so the user can continue using the app as quickly as possible.
const resumeSuccessful = await Blazor.resumeCircuit();
if (!resumeSuccessful) {
location.reload();
} else {
reconnectModal.close();
}
}
} catch (err) {
// We got an exception, server is currently unavailable
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
}
}
async function resume() {
try {
const successful = await Blazor.resumeCircuit();
if (!successful) {
location.reload();
}
} catch {
location.reload();
}
}
async function retryWhenDocumentBecomesVisible() {
if (document.visibilityState === "visible") {
await retry();
}
}

View File

@@ -1,19 +0,0 @@
@page "/counter"
@rendermode InteractiveServer
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

View File

@@ -1,36 +0,0 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
@code{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private string? RequestId { get; set; }
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
protected override void OnInitialized() =>
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
}

View File

@@ -1,7 +0,0 @@
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.

View File

@@ -1,5 +0,0 @@
@page "/not-found"
@layout MainLayout
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>

View File

@@ -1,64 +0,0 @@
@page "/weather"
@attribute [StreamRendering]
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th aria-label="Temperature in Celsius">Temp. (C)</th>
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
// Simulate asynchronous loading to demonstrate streaming rendering
await Task.Delay(500);
var startDate = DateOnly.FromDateTime(DateTime.Now);
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
}).ToArray();
}
private class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@@ -1,6 +0,0 @@
<Router AppAssembly="typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
<FocusOnNavigate RouteData="routeData" Selector="h1" />
</Found>
</Router>

View File

@@ -1,11 +0,0 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using Services.Web.UI
@using Services.Web.UI.Components
@using Services.Web.UI.Components.Layout

View File

@@ -1,23 +0,0 @@
using Services.Web.UI.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();

View File

@@ -1,14 +0,0 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5005",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
</PropertyGroup>
</Project>

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@@ -1,23 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"Services.Web.UI/1.0.0": {
"runtime": {
"Services.Web.UI.dll": {}
}
}
}
},
"libraries": {
"Services.Web.UI/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -1,20 +0,0 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]

View File

@@ -1,7 +0,0 @@
// <auto-generated/>
namespace Microsoft.CodeAnalysis
{
internal sealed partial class EmbeddedAttribute : global::System.Attribute
{
}
}

View File

@@ -1 +0,0 @@
0fd3d213865069afa70276e8e0a449eeb6d9ccec5e68af262fd6217090a0beaa

View File

@@ -1,67 +0,0 @@
is_global = true
build_property.TargetFramework = net10.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v10.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Services.Web.UI
build_property.RootNamespace = Services.Web.UI
build_property.ProjectDir = D:\_local_git\HomeOnApp\Services.Web.UI\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = D:\_local_git\HomeOnApp\Services.Web.UI
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 10.0
build_property.EnableCodeStyleSeverity =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Counter.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xDb3VudGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Error.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Home.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/NotFound.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xOb3RGb3VuZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Weather.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xXZWF0aGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-b7z843j4an
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-10f9sjp7g2
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/ReconnectModal.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcUmVjb25uZWN0TW9kYWwucmF6b3I=
build_metadata.AdditionalFiles.CssScope = b-qecnd4893z

View File

@@ -1,18 +0,0 @@
// <auto-generated/>
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Routing;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Validation.Embedded;
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Net.Http.Json;
global using System.Threading;
global using System.Threading.Tasks;

View File

@@ -1 +0,0 @@
8b253c730d04bcc7f796b1e39e2fd9c50b082df7e5648c5755dd2bbf54d94de6

View File

@@ -1,86 +0,0 @@
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\appsettings.Development.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\appsettings.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.staticwebassets.runtime.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.staticwebassets.endpoints.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.exe
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.deps.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.runtimeconfig.json
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.dll
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.pdb
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\EmbeddedAttribute.cs
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\ValidatableTypeAttribute.cs
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rpswa.dswa.cache.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.GeneratedMSBuildEditorConfig.editorconfig
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.AssemblyInfoInputs.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.AssemblyInfo.cs
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.csproj.CoreCompileInputs.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.MvcApplicationPartsAssemblyInfo.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjimswa.dswa.cache.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\bundle\Services.Web.UI.styles.css
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\projectbundle\Services.Web.UI.bundle.scp.css
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\6inyiqriln-{0}-khy4lop6wu-khy4lop6wu.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\hmbp8a9ulp-{0}-bqjiyaj88i-bqjiyaj88i.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\20jrdl7v0m-{0}-c2jlpeoesf-c2jlpeoesf.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\nxofaul20s-{0}-erw9l3u2r3-erw9l3u2r3.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\gzge0qp92n-{0}-aexeepp0ev-aexeepp0ev.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\tjyakvr08z-{0}-d7shbmvgxk-d7shbmvgxk.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\k6yguwujws-{0}-ausgxo2sd3-ausgxo2sd3.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\3xc5ijmsxl-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\8b10j3f4y2-{0}-cosvhxvwiu-cosvhxvwiu.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\7egys43gt0-{0}-ub07r2b239-ub07r2b239.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fmxyhv0omy-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\irr29ze55g-{0}-b7pk76d08c-b7pk76d08c.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\j4opn3fa2c-{0}-fsbi9cje9m-fsbi9cje9m.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\2c00zfkiuk-{0}-rzd6atqjts-rzd6atqjts.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fmr0cxw0uu-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\zrh7n0790h-{0}-dxx9fxp4il-dxx9fxp4il.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fgwvpyxxm2-{0}-jd9uben2k1-jd9uben2k1.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ew009nvlkd-{0}-khv3u5hwcm-khv3u5hwcm.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\v481mp9rla-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\0sbw7ab88i-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\1dgaxq65ea-{0}-c2oey78nd0-c2oey78nd0.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\s914px96k5-{0}-tdbxkamptv-tdbxkamptv.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\vu0y7uz67w-{0}-j5mq2jizvt-j5mq2jizvt.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\p02uz3djyl-{0}-06098lyss8-06098lyss8.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\31xzmz1e90-{0}-nvvlpmu67g-nvvlpmu67g.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\bcv1xa6swt-{0}-s35ty4nyc5-s35ty4nyc5.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\nnvkmv6cxp-{0}-pj5nd1wqec-pj5nd1wqec.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\wmlzz3tays-{0}-46ein0sx1k-46ein0sx1k.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\es4n3sf9n1-{0}-v0zj4ognzu-v0zj4ognzu.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\26ribrs2gi-{0}-37tfw0ft22-37tfw0ft22.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\r9su7mfsvn-{0}-hrwsygsryq-hrwsygsryq.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\rffyskjq5s-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ytm89rzqdu-{0}-ft3s53vfgj-ft3s53vfgj.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\hhm818r0kj-{0}-6cfz1n2cew-6cfz1n2cew.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\alztba1cvi-{0}-6pdc2jztkx-6pdc2jztkx.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\td7yorkvlc-{0}-493y06b0oq-493y06b0oq.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\dmmaczyciw-{0}-iovd86k7lj-iovd86k7lj.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5j4tezq3pg-{0}-vr1egmr9el-vr1egmr9el.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\wkac3rph5j-{0}-kbrnm935zg-kbrnm935zg.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\1nclrf1wwj-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ufdyvu9wcl-{0}-y7v9cxd14o-y7v9cxd14o.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\mp7jpy0093-{0}-notf2xhcfb-notf2xhcfb.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\vr6mh8x7t3-{0}-h1s4sie4z3-h1s4sie4z3.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\pzoqk5xx2g-{0}-63fj8s7r0e-63fj8s7r0e.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5osd3ok777-{0}-0j3bgjxly4-0j3bgjxly4.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\o3e6ljboo5-{0}-13ja33weya-13ja33weya.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5zfzpq56du-{0}-j8lzlu28q6-j8lzlu28q6.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\rudqj3kokb-{0}-u1n4jc5v46-u1n4jc5v46.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\y4l0phloz3-{0}-x276jubixu-x276jubixu.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\669yyh6ini-{0}-x276jubixu-x276jubixu.gz
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.json.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.development.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.endpoints.json
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\swae.build.ex.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.upToDateCheck.txt
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.dll
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\refint\Services.Web.UI.dll
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.pdb
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.genruntimeconfig.cache
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\ref\Services.Web.UI.dll

View File

@@ -1 +0,0 @@
b31a03823e60a345a44794327c62af0180c2fd21b6380425a9542a4b8edf2592

View File

@@ -1,9 +0,0 @@
// <auto-generated/>
namespace Microsoft.Extensions.Validation.Embedded
{
[global::Microsoft.CodeAnalysis.EmbeddedAttribute]
[global::System.AttributeUsage(global::System.AttributeTargets.Class)]
internal sealed class ValidatableTypeAttribute : global::System.Attribute
{
}
}

Some files were not shown because too many files have changed in this diff Show More