Innehållsförteckning:

IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS: 8 Steg
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS: 8 Steg

Video: IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS: 8 Steg

Video: IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS: 8 Steg
Video: Indefinite Pitch PREMIERES. Mod.1 - Into The Circle [Linderluft Records] 2024, November
Anonim
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS

ASSIMILATE SENSOR/ACTOR Slaves bäddar in metadata som används för att definiera visualiseringar i Crouton. Denna konstruktion skiljer sig något från tidigare; det finns inga hårdvaruändringar. Den fasta programvaran stöder nu värd anpassade (rikare) redaktörer som kan integreras i den senaste versionen av AssimilateCrouton. Mer uppmärksamhet kommer att ges för att förklara firmware och MQTT -instrumentpanelen i den här artikeln.

En av fördelarna med att betjäna webbkomponenter från den enhet som de kontrollerar är att den mer avancerade kontrollen av enheten är begränsad till det nätverk som enheten är ansluten till: din WiFi -åtkomstpunkt. Även om när du väl använder en MQTT -server med autentisering finns det en likhet med skydd, men i offentliga nätverk om någon lämnar din webbläsare en stund (AssimilateCrouton -webbplatsen) kan någon hoppa in och styra dina automatiseringsenheter. Denna CORS WebComponent -funktion gör det möjligt att endast visa avläsningar (temp, ljusnivåer, fukt) offentligt och kommandofunktioner (på/av, schemaläggning) endast tillgängliga från enhetens nätverk.

På enheten stöds fortfarande alla webbserverfunktioner med autentisering och värd i SPIFFS, men särskilt fokus har gjorts för CORS (Cross Origin Resource Sharing) -stöd för Polymer WebComponents (Crouton använder Polymer 1.4.0).

I AssimilateCrouton (gaffeln av Crouton som används för Assimilate IOT Network) inkluderar ändringarna

  • stöd för ett enhetskort (assim-device) som bland annat visar och döljer, för en användare, individuella kort för en enhet
  • info -egenskap på alla kort som visar en skål med användbar kontextuell information för ett kort
  • stöd för CORS -webbkomponenter, i det här fallet som finns på webbservern på enheten (ESP8266).

Steg 1: CROUTON

CROUTON
CROUTON
CROUTON
CROUTON

Crouton är en instrumentpanel som låter dig visualisera och styra dina IOT -enheter med minimal installation. I huvudsak är det den enklaste instrumentpanelen att installera för alla IOT -hårdvaruentusiaster som bara använder MQTT och JSON.

ASSIMILATE SLAVES (sensorer och aktörer) har inbäddade metadata och egenskaper som mastern använder för att bygga upp deviceInfo json -paketet som Crouton använder för att bygga instrumentpanelen. Förmedlaren mellan ASSIMILATE NODES och Crouton är en MQTT -mäklare som är webbkontaktvänlig: Mosquito används för demoen.

Eftersom ASSIMILATE MASTER begär egenskaper formaterar den svarsvärdena i det format som krävs för Crouton -uppdateringar. AssimilateCrouton -gaffeln lägger till några funktioner som gör att du kan decentralisera affärsreglerna som kör din enhet, dvs IOT -enheten behöver inga inbyggda affärsregler, det är bara en pipeline för MQTT/I2C -kommunikation till de smartare (ATTINY -kontrollerade) slavaktörerna och sensorerna.

Steg 2: ASSIMILERA CROUTON

ASSIMILERA KRÖTON
ASSIMILERA KRÖTON

FÖRÄNDRINGAR AV CROUTON

Ändringar från den gafflade versionen inkluderar:

  • om en slutpunkt har en sökegenskap definierad gör webbkomponenten för kortet en HTMLImport för en CORS -resurs (webbservern på ESP8266 i denna version).
  • alla resurser uppströms från (beroende av) en CORS -webbkomponent refereras som om de serveras från Croutons webbplats; när de inte kan ladda en undantagshanterare avvisar sökvägarna och laddar om från webbplatsen.
  • en aktuell lokal tid visas högst upp till höger, användbar för schemaläggning av verifiering.

POLYMERBESKRIVNING OCH CORS

Bladet i ett polymerberoendeträd kan vara värd i CORS. Eftersom rotberoendena kan användas flera gånger i en app kan de inte refereras till från två platser (webbplatsen och enheten) eftersom Polymer Module Loader behandlar dem som 2 separata resurser och flera registreringsfel snabbt smädar ett program.

Av denna anledning är webbkomponenten för ett kort (HTML -fil i 1.4.0) och den associerade CSS -filen de enda filerna som finns på enheten. De andra beroendena refereras som om WebComponent finns i "html" -mappen på den ursprungliga webbplatsen, vilket gör det enkelt att utveckla WebComponents från den mappen tills den är klar att ladda upp till SPIFFS på ESP8266. AssimilateCrouton kommer att ta reda på hur man får rätt filer.

SPRIDNING

edfungus skapare av den ursprungliga Crouton skrev källan i Pug/Less och hade en NPM/Grunt verktygskedja. Jag gjorde Pug/Less som HTML/css och redigerade/distribuerade bara de renderade filerna. Detta bröt NPM/Grunt -verktygskedjan. Att åtgärda detta täcks i avsnittet FRAMTID.

Du kan testa instrumentpanelen lokalt i din DEV -låda:

  • Från kommandoraden i rotmappen
  • npm start
  • lite-servern snurras upp för https:// localhost: 10001

Distribuera till en statisk webbserver:

  • kopiera alla mappar utom nod_moduler
  • kopiera index.html (och eventuellt web.config)

FRAMTIDA

Ett av huvudmålen är att uppgradera till Polymer3 och arbeta från Polymer CLI. Att lägga till avancerade redaktörer och ramverk för IOT -utvecklare att utveckla egna är hög prioritet. Så småningom kommer avancerat automatiserat system att köras helt från fristående MQTT -klienter som AssimilateCrouton.

Ett exempel på deviceInfo-paketet som används för AssimilateCrouton:

{
"enhetsinformation": {
"endPoints": {
"CC_enhet": {
"device_name": "ash_mezz_A3",
"card-type": "assim-device",
"ssid": "Corelines_2",
"ip_addr": "192.168.8.104",
"slutpunkter": [
{
"title": "Grow Lights",
"card-type": "crouton-simple-toggle",
"endpoint": "switch"
},
{
"title": "Planteringsljus",
"card-type": "crouton-assim-weekview",
"endpoint": "CC_switch"
}
]
},
"CC_switch": {
"card-type": "assim-weekview",
"info": "Slå på eller släcka lamporna inom 15 minuters tidsluckor",
"sökväg": "https://192.168.8.104/cors",
"title": "Planteringsljus",
"interval_min": 15,
"värden": {
"värde": ""
}
},
"switch": {
"title": "Grow Lights",
"card-type": "crouton-simple-toggle",
"info": "Slå på eller av lampor på ad hoc -basis",
"etiketter": {
"false": "AV",
"true": "ON"
},
"ikoner": {
"false": "sun-o",
"true": "sun-o"
},
"värden": {
"värde": 0
}
}
},
"status": "bra",
"name": "ash_mezz_A3",
"description": "Office at Ashmore, Mezzanine, Area A2",
"color": "#4D90FE"
}
}

visa rawdeviceInfo.json värd med ❤ av GitHub

Steg 3: ENHETSMONTERING

ENHETSMONTERING
ENHETSMONTERING
ENHETSMONTERING
ENHETSMONTERING
ENHETSMONTERING
ENHETSMONTERING

Eftersom det inte finns några hårdvaruändringar, här är länkarna till relevant information:

  • Skalmontering
  • Material och verktyg
  • MCU -förberedelse
  • Förberedelse för MCU -bostäder
  • Bygga Slavarna Lågsidesbrytare/ÅTERSTÄLL Dotterbräda
  • Montering av huvudkomponenterna

Steg 4: FIRMWARE

FIRMWARE
FIRMWARE
FIRMWARE
FIRMWARE
FIRMWARE
FIRMWARE
FIRMWARE
FIRMWARE

Huvudförändringar i denna byggnad

För att AssimilateCrouton -applikationen ska kunna använda CORS -resurser från enheten måste svarshuvuden konfigureras på ett visst sätt. Detta implementerades i den här versionen av firmware (static_server.ino => server_file_read ()).

Också den huvudsakliga beroendediagrammet för Polymer behövde komma från ett enda ursprung. En strategi användes för att lägga till en onerror -hanterare (corsLinkOnError) till SPIFFS CORS -filerna för att ladda om resurserna från AssimilateCrouton -webbplatsen när de inte hittas på enheten.

Det finns två nya konventioner som läggs till i SPIFFS -filsystemet för att anpassa slutpunkterna som skapas i deviceInfo - som AssimilateCrouton använder för att skapa instrumentpanelskorten:

  • /config/user_card_base.json Slutpunktsdefinition med körtidsvariabler som först byts:,,. Det är vanligtvis här som kortet med assim-enhet läggs till. Detta kommunicerar inte tillbaka med enheten.
  • /config/user_card_#.json Slutpunktsdefinition med körtidsvariabler som först byts:,,. Det är vanligtvis här de rika redaktörerna som assim-weekview-kortet kommer att läggas till anslutna till I2C-slaven (skådespelare/sensor) som hänför sig till #.

SKETSEN/BIBLIOTEKET

I detta skede har projektet förpackats som ett exempel för AssimilateBus Arduino -biblioteket. Detta är främst för att göra alla nödvändiga filer enkla att komma åt från Arduino IDE. Huvudkodartefakterna är:

  • mqtt_crouton_esp8266_cors_webcomponents.ino - huvudingången.
  • assimilate_bus.h/assimilate_bus.cpp - biblioteket som hanterar I2C -kommunikationen med Slave Sensor/Actors
  • VizJson.h/VizJson.cpp - biblioteket som formaterar/bygger alla JSON som publiceras via MQTT
  • config.h/config.cpp - biblioteket som läser/boxar/skriver konfigurationsfiler på SPIFFS
  • static_i2c_callbacks.ino - I2C -återuppringningar för en egenskap som tas emot och slavcykeln för slavförfrågningar är fullständiga static_mqtt.ino - MQTT -funktionerna
  • static_server.ino - webbserverfunktionerna
  • static_utility.ino - hjälpfunktioner

De statiska INO -funktionerna användes (i stället för bibliotek) av olika anledningar, men främst för att webbserver- och MQTT -funktionerna skulle kunna spela bra tillsammans.

SPIFFSRESSURSERNA

Detaljerade förklaringar av SPIFFS -filerna hittar du här.

  • favicon.ico - resurs som används av Ace Editor
  • config

    • device.json - konfigurationen för enheten (Wifi, MQTT …)
    • slave_metas _#. json - genererat vid körning för varje slavadressnummer (#)
    • user_card _#. json - anpassad slutpunkt som ska integreras i deviceInfo för varje slavadressnummer (#)
    • user_card_base.json - anpassad slutpunkt som ska integreras i deviceInfo för enheten
    • user_meta _#. json - anpassade metadata åsidosätter slavarnas för varje slavadressnummer (#)
    • user_props.json - anpassade egendomsnamn för att åsidosätta de som finns i metadata för slavarna
  • kors

    • card -webcomponent.css - formatmall för olika anpassade kort
    • card -webcomponent.html - webbkomponent för olika anpassade kort
  • redaktör

    • assimilate -logo-p.webp" />
    • edit.htm.gz - gzip av Ace Editor HTML
    • edit.htm.src - original HTML för Ace Editor
    • favicon -32x32-p.webp" />

UPPLADNING AV FIRMWARE

  • Kodförvaret finns här (ögonblicksbild).
  • En ZIP -fil av biblioteket finns här (ögonblicksbild).
  • Instruktioner för "Importera ett ZIP -bibliotek" här.
  • När biblioteket är installerat kan du öppna exemplet "mqtt_crouton_esp8266_cors_webcomponents".
  • Instruktioner för installation av Arduino för Wemos D1 Mini här.
  • Beroenden: ArduinoJson, TimeLib, PubSubClient, NeoTimer (se bilagor om du bryter ändringar i lagringsplatser).

LADDA UPP TILL SPIFFS

När koden har laddats in i Arduino IDE, öppna device.json i data/config -mappen:

  • Ändra värdet av wifi_ssid med ditt WiFi SSID.
  • Ändra värdet av wifi_key med din WiFi -nyckel.
  • Ändra värdet på mqtt_device_name med din föredragna enhetsidentifiering (ingen koppling behövs).
  • Ändra värdet på mqtt_device_description med din föredragna enhetsbeskrivning (i Crouton).
  • Spara device.json.
  • Ladda upp datafilerna till SPIFFS.

Huvudinträdespunkten för AssimilateBus-exemplet:

/*
*
*VERKSAMHETSREGLERNA FÖR DIN ENHET FÖRVÄNTAS ATT KONTROLLeras VIA MQTT - INTE HÅRDT INBAKAD I DENNA FIRMWARE
*
* Annat än installation och loop i den här filen
* de viktiga rörliga delarna är
* on_bus_received och on_bus_complete i static_i2c_callbacks.ino
* och
* mqtt_publish och mqtt_callback i static_mqtt.ino
*
*/
#inkludera "types.h"
#inkludera "VizJson.h"
#inkludera "assimilate_bus.h"
#inkludera "debug.h"
#inkludera "config.h"
#omfatta
#omfatta

// ställ in MQTT_MAX_PACKET_SIZE till ~ 3000 (eller dina behov för deviceInfo json)

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
// --------------------------------- MINNESFÖRKLARINGAR
// ------------------------------------------------ - definierar
#defineDBG_OUTPUT_FLAG2 // 0, 1, 2 MINIMUM, RELEASE, FULL
#define_mqtt_pub_topic "utbox" // CROUTON CONVENTIONS
#define_mqtt_sub_topic "inkorg"
// ------------------------------------------------ - klassobjekt
Debug _debug (DBG_OUTPUT_FLAG);
AssimilateBus _assimilate_bus;
VizJson _viz_json;
Config _config_data;
WiFiClient _esp_client;
PubSubClient _client (_esp_client);
WiFiUDP Udp;
ESP8266WebServer _server (80);
Neotimer _timer_property_request = Neotimer (5000);
// ------------------------------------------------ - datastrukturer / variabel
RuntimeDeviceData _runtime_device_data;
PropertyDto _dto_props [50]; // max 10 slavar x max 5 fastigheter
// ------------------------------------------------ -- styrningsflöde
volatilebool _sent_device_info = false;
byte _dto_props_index = 0;
bool _fatal_error = false;
// --------------------------------- FUNKTIONSOMRÅDE FÖRKLARINGAR
// ------------------------------------------------ - static_i2c_callbacks.ino
voidon_bus_received (byte slave_address, byte prop_index, Rollroll, char name [16], char value [16]);
voidon_bus_complete ();
// ------------------------------------------------ - static_mqtt.ino
voidmqtt_callback (char* topic, byte* nyttolast, osignerad längd);
voidmqtt_loop ();
int8_tmqtt_get_topic_index (char* topic);
voidmqtt_init (constchar* wifi_ssid, constchar* wifi_password, constchar* mqtt_broker, int mqtt_port);
voidmqtt_create_subscriptions ();
voidmqtt_publish (char *root_topic, char *deviceName, char *endpoint, constchar *nyttolast);
boolmqtt_ensure_connect ();
voidmqtt_subscribe (char *root_topic, char *deviceName, char *endpoint);
voidi2c_set_and_get (byte -adress, byte -kod, constchar *param);
// ------------------------------------------------ - statisk_server.ino
String server_content_type_get (String filnamn);
boolserver_path_in_auth_exclusion (strängväg);
boolserver_auth_read (strängväg);
boolserver_file_read (strängväg);
voidserver_file_upload ();
voidserver_file_delete ();
voidserver_file_create ();
voidserver_file_list ();
voidserver_init ();
voidtime_services_init (char *ntp_server_name, byte time_zone);
time_tget_ntp_time ();
voidsend_ntp_packet (IPAddress & address);
char *time_stamp_get ();
// ------------------------------------------------ - static_utility.ino
String spiffs_file_list_build (String sökväg);
voidreport_deserialize_error ();
voidreport_spiffs_error ();
boolcheck_fatal_error ();
boolget_json_card_type (byte slave_address, byte prop_index, char *card_type);
boolget_struct_card_type (byte slave_address, byte prop_index, char *card_type);
boolget_json_is_series (byte slave_address, byte prop_index);
voidstr_replace (char *src, constchar *oldchars, char *newchars);
byte get_prop_dto_idx (byte slave_address, byte prop_index);
// --------------------------------- HUVUD
voidsetup () {
DBG_OUTPUT_PORT.start (115200);
SetupDeviceData device_data;
Serial.println (); Serial.println (); // marginal för konsolskräp
fördröjning (5000);
om (DBG_OUTPUT_FLAG == 2) DBG_OUTPUT_PORT.setDebugOutput (true);
_debug.out_fla (F ("setup"), true, 2);
// få obligatorisk konfiguration
if (SPIFFS.begin ()) {
_debug.out_str (spiffs_file_list_build ("/"), true, 2);
if (! _config_data.get_device_data (device_data, _runtime_device_data)) {
report_deserialize_error ();
lämna tillbaka;
}
}annan{
report_spiffs_error ();
lämna tillbaka;
}
// använd timervärde som anges i device.json
_timer_property_request.set (device_data.sensor_interval);
mqtt_init (device_data.wifi_ssid, device_data.wifi_key, device_data.mqtt_broker, device_data.mqtt_port);
time_services_init (device_data.ntp_server_name, device_data.time_zone);
server_init ();
// starta metadata -samlingen
_assimilate_bus.get_metadata ();
_assimilate_bus.print_metadata_details ();
mqtt_ensure_connect ();
// behöver sensoregenskap (namn) för att slutföra metadatainsamling
_assimilate_bus.get_properties (on_bus_received, on_bus_complete);
_timer_property_request.reset (); // kan förfalla märkbar tid till denna punkt, så börja om igen
}
voidloop () {
if (! check_fatal_error ()) return;
mqtt_loop ();
_server.handleClient ();
if (_timer_property_request.repeat ()) {
_assimilate_bus.get_properties (on_bus_received, on_bus_complete);
}
}

visa rawmqtt_crouton_esp8266_cors_webcomponents.ino värd med ❤ av GitHub

Steg 5: ENHETSKORT

ENHETSKORT
ENHETSKORT
ENHETSKORT
ENHETSKORT
ENHETSKORT
ENHETSKORT
ENHETSKORT
ENHETSKORT

Enhetskortet (korttyp: assim-device) finns på webbplatsen och det är inte nödvändigt att betjäna det från enheten (CORS).

Dess standardsida listar:

  • MQTT -ämnen för läsning och skrivning till enheten
  • Den åtkomstpunkt som enheten är ansluten till
  • En länk till SPIFFS -filredigeraren som finns på enheten med ACE EDITOR
  • En ögonikon som visar sidan Visa/dölj kort.

På sidan Visa/dölj kort listas:

  • Varje kort som ett separat objekt
  • Djärvt blått teckensnitt när det visas
  • Svart normalt teckensnitt när det är dolt
  • En ikon som visar typen av kort.

Kortet kan döljas genom att klicka på döljknappen på korten eller genom att klicka på ett blått fetstil-objekt i listan. Korten kan visas genom att klicka på ett svart-normalt-typsnitt i listan.

Löst relaterad till den här funktionen är informationskålarna. Om någon av slutpunkterna i deviceInfo har en info -egenskap tilldelad, visas en info -knapp bredvid dölj -knappen på kortet. När du klickar kommer den kontextuella informationen som definieras i slutpunkten att "rostas" till fönstret.

Om enhetskortet inte är definierat visas inte döljknapparna på korten. Detta beror på att när det är dolt finns det inget sätt att visa dem igen.

Se ENDPOINT CUSTOMIZATION för detaljerad information om hur assim-enhetskortet kan läggas till via SPIFFS-filerna på ESP8266.

AssimilateCrouton WebComponent

järnsignaler>
div>
VISA Dölj ikonen
i> span>
ENHETSFORM
MQTT TOPICSdiv>
/utbox/{{endPointJson.device_name}}/*div>
/inkorg/{{endPointJson.device_name}}/*div>
WIFI SSIDdiv>
{{endPointJson.ssid}} div>
IP -ADRESSdiv>
{{endPointJson.ip_addr}} a> div>
div>
VISA Dölj lista
element>pappersartikel>
mall>
papperslista>
div>
crouton-kort>
mall>
dom-modul>

visa rawassim-device.html värd med ❤ av GitHub

Steg 6: VECKOKORT

VECKOKORT
VECKOKORT
VECKOKORT
VECKOKORT
VECKOKORT
VECKOKORT

Weekview-kortet (korttyp: assim-weekview) finns på enheten (mappen cors). Det injiceras i deviceInfo -paketet som publiceras för AssimilateCrouton, genom att lägga till en fil config/user_card _#. Json till SPIFFS (i det här fallet user_card_9.json).

ÖVERSIKT

Vardagarna presenteras som listor över tidsluckor. Tidsluckans granularitet ställs in med egenskapen "interval_mins" i config/user_card _#. Json. Det behöver vara en bråkdel av en timme eller multiplar av en timme t.ex. 10, 15, 20, 30, 60, 120, 360. Om du klickar på en tidslucka ser du till att ett på-tillstånd kommanderas för den associerade enheten under den tiden. Om tidsluckan är nu skickas (publiceras) ett kommando omedelbart för enheten. Normalt kontrolleras/publiceras staten varje minut. Urval sparas i LocalStorage, så tiderna kommer att laddas om med en uppdatering av webbläsaren.

ANVÄND FALL

I sitt nuvarande tillstånd är veckovyn lämplig för enheter som kan använda en omkopplare för att visualisera deras tillstånd, dvs de är antingen på eller av och efter att de har ställts in förblir de i det tillståndet. Ljus, fläktar och varmvattenberedare är bra kandidater.

BEGRÄNSNINGAR/GRANSKNINGAR

  • Intervallet_min måste vara ett av de värden som nämns ovan
  • Veckovyningen stöder inte tillfälliga åtgärder som också är schemalagda, till exempel att slå på en kran kort (5 sekunder) två gånger om dagen.

FRAMTIDA

  • Det förväntas att tillfälliga åtgärder kommer att stödjas.
  • Synkroniserad lagring mellan enheter, för schemaläggningen övervägs.

Steg 7: ENDPOINT -ANPASSNING

Som nämnts i FIRMWARE har två nya konventioner lagts till i SPIFFS -filsystemet för att anpassa slutpunkterna. JSON -filerna är fragment som läggs till i egenskapen slutpunkter i deviceInfo -paketet som skickas till MQTT -mäklaren som blir instrumentpanelens definition.

Nycklarna till slutpunkterna genereras i firmware:

  • CC_device (anpassat kort) för user_card_base.json
  • CC_SLAVE_ENDPOINT NAME för user_card _#. Json (# är slavadress)

Som nämnts tidigare finns det variabler som ersätts med värden vid körning:

  • mqtt_device_name
  • wifi_ssid
  • local_ip

user_card_base.json

Ett exempel:

user_card _#. json

Ett exempel:

Steg 8: VIDEOS

Rekommenderad: