Din varukorg är för närvarande tom!
Tekniker som hjälper dig skapa ett smartare och tryggare hem.
Så felsöker och Loggar vi Zigbee2mqtt
Kategori:
– Taggar:
Det här inlägget är både en guide och ett exempel på hur vi felsöker om Zigbee enheter upplevs som långsamma på att svara, eller beter sig konstig. Det problem vi ska berätta om nu uppkom på grund av en IKEA lampa och en batteridriven zigbee display. Du kommer få all info som behövs för att själv kunna sätta upp motsvarande loggning med.
Flera har efterfrågat våra flöden i Node-Red, så dom finns nu delade här med. Kom gärna med feedback och tips på hur flödet och presentation skulle gå att göra bättre och snyggare som kommentarer längst ner på sidan.
En IKEA lampa började skicka enorma mängder zigbee meddelanden, signalstyrkan hoppa i samband med detta åt alla håll och kanter. Kunde även se att en Zigbee display började bete sig konstigt och hade slutat skicka korrekt data i samband med detta. Att bara gå in i Zigbee2mqtt hade kanske kunnat ge en hint, men risken är att vi fått börja starta om saker för att lösa detta om vi inte haft vår loggning. Nu räckte det med en omstart av en IKEA lampa och Zigbee displayen, vilket vi hittade med hjälp av våra loggar.
Nu ska vi börja med att säga att det absolut största Zigbee nätet hemma är i Zigbee2Mqtt (~150 enheter). Det vi kör i Homey Pro 2023 och andra kontrollers innehåller bara några få enheter. Därav så kommer den här felsökningen visa hur jag både loggar och hanterar information för att kunna upptäcka avvikelser i mitt Zigbee2mqtt nät. Nu säger vi inte att det här är rätt sätt, eller det bästa. Men det ger oss en mycket enkel bild över när någon sensor beter sig avvikande.
Med den här informationen får vi även följande insikter:
- Vilken signalstyrka har zigbee enheter i snitt över tid. En egenskap vi använder för att förbättra förutsättningar, något som i förlängningen sparar batteri för sensorena.
- Hur frekvent anropar Zigbee enheter in till Zigbee2mqtt. Detta ger både en insikt om hur frekvent något görs, men även när något slutar skicka och när det hände. Vilket i förlängningen även ger en insikt om vilka andra enheter som påverkades när den här sensorn slutade fungera.
- Hur många sensorer vi som aktivt skickar under perioder, detta var en av de faktorer jag använder för att se vilken enhet som börjat strula.
Summeringen av det här inlägget:
Nästan direkt kunde se vilken enhet som fick mitt zigbee nätverk att bete sig långsamt. Kollar vi enhet H110L nedan så ser vi hur den började skicka mycket oftare än andra enheter.
Insikten är: Vi ser längst upp på bilden när vi filtrerar på de senaste två dagarna att en med namnet H110L har 23096 anrop, vilket är mer än 2X mer än den näst högsta. H121M har i sin tur mer än 5X mer än den nästa. Så vi kunde rätt snabbt avgöra redan på dessa siffror att dom här enheterna troligen har något problem.
När vi sedan kollar grafen på mitten av bilden så ser vi att sensorn H121M verkar ha fått något fel vid 04.30 på morgonen och börjat rapportera mycket oftare än normalt. sedan vid 09.00 börjar H110L skicka mängder med paket.
Vi filtrerar då ut den nedersta grafen på just sensorn ”H110L”, vi ser att signalstyrkan för den enheten hoppar väldigt mycket precis under den perioden. Lösningen för oss var att helt enkelt bryta strömmen till den lampan och starta den igen, tyvärr inte någon insikt om varför den började bete sig så i övrigt. Sedan tog vi även ut batteriet ur H121M och kopplade in det igen. Nu var nätet åter stabilt och frekvensen för sensorerna normala och svarstid i realtid på knappar.
Det påverkade alla andra enheter i nätverket och gjorde det dessutom mycket svårt att få fram en zigbee karta. Informationen nedan baserar sig på att vi lagrar varje meddelande på Zigbee2mqtt på vår MosquittoMQTT kö. Sedan väljer vi att skicka med signalstyrkan som ett värde varje gång sensorn rapporterar något. Så vi sparar inte själva sensordatat i den här vyn. Utan det hanteras i Home Assistant och andra flöden i Node-Red.
Nu kanske du vill veta hur vi satt upp detta för att automatiskt få den här insikten varje gång vi adderar en sensor? För den graf vi gjort i Grafana lägger automatiskt till nya sensorer om dom dyker upp i InfluxDB. Vi har dessutom gjort så att varje sensor som läggs till i Zigbee2Mqtt automatiskt hämtas upp av Node-Red via Mosquitto MQTT och sätter taggen till det namn sensorn fått. Vilket är ett namn som följer vår namnstandard du kan läsa mer om här.
Detta behöver du för att kunna sätta upp övervakningen som oss
Om du vill komma igång från start så har vi en uppdelad serie där alla komponenter vi nu använder finns beskrivna. Där får du sammanhang och en förklaring om varför vi gör varje del & vilket värde det tillför. – Guide för nybörjare med fokus på Home Assistant och Homey.
Är du däremot redan igång och bara intresserad av att se att du har alla bitar som behövs så kan du kolla tabellen nedan. De komponenterna är det vi använder idag .
Home Assitant | Vi kör nu allt detta på vår Home Assistant installation, du kan även köra detta fristående. Men vi har valt att köra det som addons i Home Assistant för att göra det enklare. |
Zigbee2mqtt | Källan för mina Zigbee enheter, länken är till vår guide där du får all info för att installera den och hur Zigbee2mqtt fungerar. |
Zigbee2mqtt & MosquittoMQTT – snabbguide | Här har vi en guide som ingår i en serie där alla de komponenter vi nämner i just detta inlägg finns beskrivna steg för steg. MoquittoMQTT är den meddelandehanteraren vi valt att köra, men du kan använda andra med så länge du via Node-Red kan lyssna på köerna. |
InfluxDB & Grafana | Här hittar du guiden för att installera InfluxDB och Grafana, vilket är de komponenter som presenterar och lagrar all data från Node-Red |
Node-Red Installation och guide | Just Node-Red är hjärtat i den här lösningen när det gäller att lyssna och konvertera informationen till ett format som InfluxDB förstår. |
Med alla förutsättningar på plats så kan vi nu visa hur vi valt att lösa själva flödet i Node-Red. Vill du kopiera flödet så finns det längst ned i inlägget. Men vi börjar med att förklara hur varje block ser ut och varför vi valt att gör så här.
Längst ned på sidan har vi delat koden för att de block vi använder ((( länk här ))), vi valde dock att inte ta med biten med ”msg-speed”, vilket är en del vi använder för att se hur mycket meddelanden som respektive MQTT producerar med ett visst intervall.
Node-Red – Steg för steg
Det första vi gör är att läsa från en speciell MosquittoMQTT kö. Detta sker genom att vi lyssnar på topic:en Zigbee2mqtt/# – Genom att lyssna på just den ”topic:en” så får vi allt som vår Zigbee2mqtt skickar. Nu behöver du eventuellt bekräfta att du har samma sökväg satt i Zigbee2mqtt för att publicera på MosquttoMQTT, men tror det är standard.
Nästa block med en ”switch” används för att filtrera bort allt som innehåller ”availability”, det är information som Zigbee2mqtt skickar på den här topic:en för att visa om en sensor är ok eller inte. Detta innehåller inte signalstyrkan, så det väljer vi att filtrera ut.
Blocket ”Sorterar fram sensorer” har vi skapat och kan använda eftersom vi har en namnstandard i hela vår Zigbee2mqtt installation. Alla detaljer om det finns på länken, men i praktiken så innebär det att alla våra sensorer börjar med H{000} – dvs ”H110L” är enhet 110 och en Lampa. Har du en annan namnstandard så kommer det här blocket troligen inte fungera, utan då behöver du ändra till ett filter som matchar din standard.
När vi väl fått rätt sensor så konverterar vi till från ett JSON objekt till objekt i vår payload och fortsätter till nästa switch. Här är vi inte längre intresserad av msg.topic, utan nu har vi ett nytt objekt med msg.payload.linkquality. Här säger vi att enheter med ”undefined” ska filteras bort och resten ska fortsätta via ”otherwise”
Nu har vi alla sensorer vi är intresserade av med en signalstyrka, utifrån det vi sett när vi kollat vad som går genom MQTT kön så kan vi se att en sensor ALLTID har en signalstyrka oavsett vilken typ av information dom förmedlar på zigbee nätet. vilket är precis det vi är ute efter att veta.
Nu är det dags att göra ett eget funktionsblock som gör om paketet vi fått från zigbee2mqtt till en InfluxDB postning. På bilden ovan så skickar vi samma information till två destinationer, både en lokal InfluxDB på vår Home Assistant och en extern InfluxDB. Den kod vi gjort i funktionsblocket innehåller en signalstyrka, vilket namn enheten har ( tag1 ), vi tar fram bara sensornamnet där.. Sedan sätter vi en tag2 hårt som är just Signalstyrka. Det här formatet är säkerligen inte det bästa eller mest optimala, men det fungerar för oss och vi får en egen InfluxDB med den struktur vi behöver.
msg.payload = [{
signalstyrka: msg.payload.linkquality,
},
{
tag1:msg.topic.split("/")[1],
tag2:"Signalstyrka"
}];
return msg;
Nu när du har alla delar så kvarstår det bara att lämna över informationen till din InfluxDB för presentation i Grafana!
Node-Red kod för att lyssna på signalstyrka
[
{
"id": "316a2433e9dfa388",
"type": "mqtt in",
"z": "4d57dd643538c10d",
"name": "Läser allt från zigbee2mqtt topic",
"topic": "zigbee2mqtt/#",
"qos": "0",
"datatype": "auto",
"broker": "17af55b38335493a",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 330,
"y": 1000,
"wires": [
[
"d755dedf1ed82b2a"
]
]
},
{
"id": "fd9224906cb7f000",
"type": "switch",
"z": "4d57dd643538c10d",
"name": "",
"property": "topic",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "availability",
"vt": "str"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 590,
"y": 900,
"wires": [
[
"c5c2e98f3cead326"
],
[
"9e35d9db0b7ec8bc"
]
]
},
{
"id": "9e35d9db0b7ec8bc",
"type": "switch",
"z": "4d57dd643538c10d",
"name": "Sorterar fram sensorer",
"property": "topic",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "zigbee2mqtt/H",
"vt": "str"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 802.9999923706055,
"y": 905.9999904632568,
"wires": [
[
"224f5906e9c8f1ba",
"665ffb10d75fc207"
],
[
"3064688175f7d32d"
]
]
},
{
"id": "224f5906e9c8f1ba",
"type": "json",
"z": "4d57dd643538c10d",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1070,
"y": 900,
"wires": [
[
"03993faa259f06d7",
"5b38343671b79d65"
]
]
},
{
"id": "5b38343671b79d65",
"type": "switch",
"z": "4d57dd643538c10d",
"name": "",
"property": "payload.linkquality",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "undefined",
"vt": "str"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 1170,
"y": 800,
"wires": [
[
"155204dd0261e82d",
"f2c5d85b50fe6ab3"
],
[
"be5c4ef31c571a6b"
]
]
},
{
"id": "be5c4ef31c571a6b",
"type": "function",
"z": "4d57dd643538c10d",
"name": "",
"func": "msg.payload = [{\n signalstyrka: msg.payload.linkquality,\n},\n{\n tag1:msg.topic.split(\"/\")[1],\n tag2:\"Signalstyrka\"\n}];\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1400,
"y": 900,
"wires": [
[
"a216d568a79df753",
"315ce1e5d54c1b1d",
"44e3baa76a415e7a"
]
]
},
{
"id": "f2c5d85b50fe6ab3",
"type": "switch",
"z": "4d57dd643538c10d",
"name": "",
"property": "payload.state",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "ON",
"vt": "str"
},
{
"t": "cont",
"v": "OFF",
"vt": "str"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 3,
"x": 1330,
"y": 800,
"wires": [
[
"d5e6103abf3f37e7"
],
[
"cfb5b643f1547170"
],
[
"24d8674508f723a3"
]
]
},
{
"id": "cfb5b643f1547170",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1570,
"y": 700,
"wires": []
},
{
"id": "d5e6103abf3f37e7",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1570,
"y": 660,
"wires": []
},
{
"id": "24d8674508f723a3",
"type": "function",
"z": "4d57dd643538c10d",
"name": "",
"func": "msg.payload = [{\n signalstyrka: 0,\n},\n{\n tag1:msg.topic.split(\"/\")[1],\n tag2:\"Signalstyrka\"\n}];\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1580,
"y": 780,
"wires": [
[
"0dea728f0f89751c"
]
]
},
{
"id": "0dea728f0f89751c",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1710,
"y": 780,
"wires": []
},
{
"id": "44e3baa76a415e7a",
"type": "influxdb out",
"z": "4d57dd643538c10d",
"influxdb": "4c3dc92821f3039d",
"name": "Bloggens Data",
"measurement": "msg.data",
"precision": "",
"retentionPolicy": "",
"database": "database",
"precisionV18FluxV20": "ms",
"retentionPolicyV18Flux": "",
"org": "organisation",
"bucket": "bucket",
"x": 1700,
"y": 940,
"wires": []
},
{
"id": "386aa798eed29f69",
"type": "comment",
"z": "4d57dd643538c10d",
"name": "Tar fram sensorn och signalstyrka",
"info": "OBS\n\nkolla så att sensorn heter det du filtrerar på",
"x": 1410,
"y": 960,
"wires": []
},
{
"id": "4e57729d3fcb33b7",
"type": "comment",
"z": "4d57dd643538c10d",
"name": "Filtrerar bort on / OFF",
"info": "OBS\n\nkolla så att sensorn heter det du filtrerar på",
"x": 1240,
"y": 700,
"wires": []
},
{
"id": "96ab0d85f848c425",
"type": "comment",
"z": "4d57dd643538c10d",
"name": "Sorterar fram alla sensorer under Zigbee2mqtt/0X",
"info": "OBS\n\nkolla så att sensorn heter det du filtrerar på",
"x": 720,
"y": 780,
"wires": []
},
{
"id": "caabd30e9278b66f",
"type": "comment",
"z": "4d57dd643538c10d",
"name": "Loggar händelser på MQTT",
"info": "Den här loggar och presenterar allt som händer på MQTT\nOBS den får inte skrivas tillbaka till MQTT eller direkt kopplas mot Home Assistant eftersom den då skapar en loop!. \n",
"x": 320,
"y": 940,
"wires": []
},
{
"id": "30053acd879ce572",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 590,
"y": 960,
"wires": []
},
{
"id": "c5c2e98f3cead326",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 730,
"y": 820,
"wires": []
},
{
"id": "665ffb10d75fc207",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 970,
"y": 840,
"wires": []
},
{
"id": "3064688175f7d32d",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 990,
"y": 960,
"wires": []
},
{
"id": "03993faa259f06d7",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1190,
"y": 960,
"wires": []
},
{
"id": "155204dd0261e82d",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1190,
"y": 740,
"wires": []
},
{
"id": "a216d568a79df753",
"type": "debug",
"z": "4d57dd643538c10d",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1670,
"y": 900,
"wires": []
},
{
"id": "17af55b38335493a",
"type": "mqtt-broker",
"name": "lohalHomeAssisant",
"broker": "127.0.0.1",
"port": "1883",
"clientid": "NodeRedMain",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"autoUnsubscribe": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
},
{
"id": "4c3dc92821f3039d",
"type": "influxdb",
"hostname": "127.0.0.1",
"port": "8086",
"protocol": "http",
"database": "BloggensData",
"name": "LokalDemoData",
"usetls": false,
"tls": "",
"influxdbVersion": "1.x",
"url": "http://localhost:8086",
"rejectUnauthorized": true
}
]
Grafana och filter
Den sökfråga vi använder inne i Grafana är följande:
SELECT count("signalstyrka") FROM "msg.data" WHERE ("tag2" = 'Signalstyrka') AND time >= now() - 1h and time <= now() GROUP BY time(1s), "tag1"::tag fill(none)
Visuellt så ser frågan ut så här:
Nu är den här guiden inte helt klar tyvärr
Som du märker så finns inte alla steg för grafana ännu, har du koll på Grafana så löser du det lätt redan nu. Känner att det börjar bli sent på fredag kväll och hinner inte mer idag. Men vi vill ha feedback på inlägget och ge dom som efterfrågade just Node-Red flödet svar. Vi kommer uppdatera det här inlägget med mer detaljer om just grafana delen om så önskas.
Men innan dess så tar vi gärna feedback och frågor, då kan vi passa på att förtydliga saker om du upplever saker som konstiga eller felande. Om möjligt lägg det som kommenterar, då kan vi flytta upp det i inlägget när vi uppdaterar och andra ser det med. Skulle det vara bättre och enklare med en film på detta?
Vill du veta när nästa del kommer så kan du prenumerera på inlägg för att inte missa.
Genom att prenumerera på bloggen så får du hela inlägg som mail varje gång vi publicerar något.
Tycker du det var bra information och uppskattera det vi gör så stötta oss gärna. Stort tack till er som stöttat bloggen och bjuder/bjudit på Swish-kaffe på 0705470065. Det uppskattas och vi använder det för att köpa kaffe, driva bloggen och köpa enheter att skriva om.
Vill du stötta bloggen på andra sätt? Vi har designat egna hållare och 3D-printat till den här sensorn. Om någon köper hållare så går alla pengar uteslutande till att driva och köpa innehåll att skriva om på bloggen, så det gynnar dig igen
Du kan även följ oss på Instagram ( https://www.instagram.com/automatiserar/ (extern länk), där brukar vi dela vad som händer löpande och om vi hittar några erbjudanden på roliga tekniker. Sen har vi Facebook med där vi delar snarlik information som på Instagram – https://www.facebook.com/automatiserar/ (extern länk)
I mer än 10 år har Markus Jakobsson delat med sig av erfarenhet inom smarta hem på bloggen. Markus har testa det mesta och lärt sig massor på vägen, kunskaper och erfarenheter han delat med dig här på bloggen.
Favoriter inom smarta hem just nu:
Xiaomi Mi Flora
Raspberry Pi 5
Homey
Home Assistant
Displayen LYWSD03MMC
Hoppas du uppskattade innehållet och fick nytta kunskapen vi delat med oss på Automatiserar.se.
Stort tack för att du tog dig tid att läsa vårt inlägg.
Med vänliga hälsningar Markus Jakobsson
Allt går att automatisera!
Har du precis börjat med smarta hem eller redan kommit en bit på resan? Läs mina dedikerade guider om smarta hem. Dom ger dig kunskaper och insikter som hjälper dig fatta rätt beslut i din resa.
Kommentarer
Intressanta sensorer på bloggen
Jag har testat många sensorer på bloggen, här ser du några av dom. Är du intresserad av att veta vad vi tycker om respektive sensor så klicka på bilden för att få veta mer.
Vill du lära dig mer om smarta hem
och inte riskera missa några nyheter?
prenumerera då på bloggen via mail.
Gör ditt hem Smartare med några av dessa tillbehör
Jag har testat många enheter som gör min vardag lite enklare och smartare, vissa bra och vissa mindre bra. Många är helt vanliga enheter som fått smarta funktioner eller tekniker installerad. Något som jag sedan försöker använda för att göra familjens vardag enklare och vårt hem smartare. Är du intresserad av att se vad du kan göra med dessa enheter så klicka på bilden för att läsa mer om hur vi upplever den.
Gateway / Kontrollers & mjukvaror
Det finns idag en uppsjö tekniker och enheter på marknaden, tyvärr så finns det inte någon perfekt lösning ännu, utan varje lösning har sina styrkor och svagheter. För att du lättare ska kunna välja vilket spår som passar dig så har jag samlat alla tekniker jag testat och en bra sammanfattning om dom. Utifrån det kan du själv avgöra vad du anser mest lämpat. Är du osäker på vart du ska börja så kolla in min nybörjarguide om smarta hem, där får du tips på vad du ska leta efter och fundera över innan du kör igång.
Lämna ett svar