Innehållsförteckning:
- Steg 1: CROUTON
- Steg 2: ASSIMILERA CROUTON
- Steg 3: ENHETSMONTERING
- Steg 4: FIRMWARE
- Steg 5: ENHETSKORT
- Steg 6: VECKOKORT
- Steg 7: ENDPOINT -ANPASSNING
- Steg 8: VIDEOS
Video: IOT123 - ASSIMILATE SENSOR HUB: ICOS10 CORS WEBCOMPONENTS: 8 Steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-31 10:25
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 ä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
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
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
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
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
VISA Dölj ikonen |
ENHETSFORM |
div> |
VISA Dölj lista |
mall> |
papperslista> |
div> |
crouton-kort> |
mall> |
dom-modul> |
visa rawassim-device.html värd med ❤ av GitHub
Steg 6: 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:
Billig NMEA/AIS Hub - RS232 till Wifi Bridge för användning ombord: 6 steg
Billig NMEA /AIS -hubb - RS232 till Wifi Bridge för användning ombord: Uppdatering 9 januari 2021 - Tillagd extra TCP -anslutning och återanvänd den sista anslutningen Om fler klienter ansluter Uppdaterad 13 december 2020 - Tillagde ingen konfigurationsversion av koden för båtar med befintliga routrar Inledning Denna NMEA / AIS RS232 till WiFi -bron är
Arduino Solar Powered Temperature and Humidity Sensor As 433mhz Oregon Sensor: 6 Steg
Arduino Solar Powered Temperature and Humidity Sensor As 433mhz Oregon Sensor: Detta är byggnaden av en soldriven temperatur- och fuktighetssensor. Sensorn emulerar en 433mhz Oregon-sensor och är synlig i Telldus Net-gateway. Vad du behöver: 1x " 10-LED Solar Power Motion Sensor " från Ebay. Se till att det står 3,7v smet
RaspberryPi 3 Magnet Sensor Med Mini Reed Sensor: 6 steg
RaspberryPi 3 Magnet Sensor With Mini Reed Sensor: I denna Instructable kommer vi att skapa en IoT -magnet sensor med en RaspberryPi 3. Sensorn består av en LED och en summer, som båda tänds när en magnet avkänns av mini reed sensorn
Particle Photon - BH1715 Digital Ambient Light Sensor Sensor Handledning: 4 steg
Particle Photon - BH1715 Digital Ambient Light Sensor Sensor Handledning: BH1715 är en digital Ambient Light Sensor med ett I²C -bussgränssnitt. BH1715 används vanligtvis för att erhålla data från omgivande ljus för justering av LCD- och knappsatsens bakgrundsbelysning för mobila enheter. Den här enheten har en 16-bitars upplösning och en justering
IOT123 - MONTERINGSSENSORHUB: ICOS10 GENERISK SKAL (IDC) MONTERING: 6 steg
IOT123 - ASSIMILATE SENSOR HUB: ICOS10 GENERIC SHELL (IDC) MONTERING: NOTET detta är en förbättrad (kretsstyrka) version av ASSIMILATE SENSOR HUB: ICOS10 GENERIC SHELL (HOOKUP WIRE) Assembly. Den monteras snabbare och har en krets av högre kvalitet, men kostar mer (~ $ 10 extra om den stöder 10 sensorer). Den huvudsakliga fe