Här ser du hela vårt Zigbee2mqtt nät

Så felsöker och Loggar vi Zigbee2mqtt

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.

Med Grafana kan du enkelt visa hur signalstyrkan på respektive Zigbee2mqtt sensor haft över tid.
Med olika inställningar i Grafana så går det enkelt att se vilka Zigbee enheter som verkar ändra sin mesh eller över tid har haft dålig signal.

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.

Utan någon speciell anledning så börjad det ta 3 - 10 sekunder innan olika kommandon tog på enheter när det skickades i mitt Zigbee nät.
Utan någon speciell anledning så börjad det ta 3 – 10 sekunder innan olika zigbee kommandon tog på enheter när det skickades i mitt Zigbee nät.

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.

När vi började med den här loggningen så var det för att se vilka sensorer vi behöver stötta för att få bättre signalstyrka, grafen är medelsignalen under 24 timmar. Men i samband med att vi började med LYWSD03MMC så ville vi se hur frekvent saker skickade med för att räkna på batteritid. och kunde då återanvända 100% av datat vi redan hade och ändra frågan i grafana!

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.

Med bra information går det enkelt att snabbt hitta ett fel i Zigbee nätverket.

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.

När vi testade att generera en nätverskarta i Zigbee2mqtt så tog det mer än 15 minuter utan att något visades när IKEA lampan felade.

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

Kompatibla sensorer

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 AssitantVi 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.
Zigbee2mqttKä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 & MosquittoMQTTsnabbguide 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 & GrafanaHä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 guideJust 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

Vi börjar med att säga att det här går att göra 100ggr snyggare, men vi har över tid byggt på det här flödet och inte reviderat det. Vilket vi borde göra, men svårt att motivera sig till att laga något som är helt med…

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.

Om du just skapat det här blocket så behöver du lägga till ”server” och där ange uppgifterna till din installation av MosquittoMQTT.

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.

Här ser du vårt filter, att det fungerar så bra för oss är på grund av att alla sensorer alltid börjar på ”H”, troligen så behöver du anpassa det här till din namnstandard eller hitta ett regex som fungerar för dig.

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

Signalstyrka för Zigbee
Här presenterar vi snittet på signalstyrkan för alla våra zigbee enheter automatiskt på ett 24 timmars intervall. Som du ser finns det några som är väldigt låg i signalstyrka, men i snitt så är det ganska ok.

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:

Så här ser sedan den utsökning och grupper ut. Det ger oss bilden som du ser strax ovanför den här. Vi har några fler inställningar på det visuella med. Men för att få ut presentationen av signalstyrkan för varje ny sensor så gör vi så här. där ”Alias” är just $tag_tag1 – Och tag ett är namnet på sensorn vi satte i InfluDB meddelandet.

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)

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *