Vinnerliste
Populært innhold
Viser innholdet med mest poeng fra 18. april 2023 i alle områder
-
Da jeg var innom et shoppingsenter i Berlin i fjor sommer fant så jeg disse klokkene: Jeg ble kjempefasinert, særlig fordi det slo meg at dette var noe jeg selv kunne klare å lage. Da jeg kom hjem fant jeg dem på nettet hos Nordiska Galleriet og de var ikke akkurat billige 😮 (Sjekk DEN prisen) Enda en grunn til å lage dem selv. Jeg har alltid være fasinert (og litt stolt) over måten vi normenn angir tiden med "avstanden til nærmeste halve time": - 5 over 2 - 5 på halv 3 - 5 over halv 3 -5 på 4 osv Utlendinger går i fella hele tiden og mange tror at "halv 7" er 07:30 🙂 I tillegg ville jeg selvfølgelig ha minutters nøyaktighet (og ikke 5 min nøyaktighet som de kjøpeklokkene hadde) og også tekst på "halv" og "kvart". Etter å ha sittet noen kvelder og stablet sammen ord på rutepapir (Trenger ikke egen TO når du kan tenne de 2 første bokstavene i TOLV etc) endte jeg opp med en matrise på 12x12 bokstaver. Jeg hadde da også plass til "KLOKKA ER NÅ" og litt Service ord som "WIFI" og "DOT" Jeg var litt usikker på angivelsen av minuttene mellom xx:15 og xx:20 (og xx:40 og xx:45). -Sier vi "tolv minutter over halv" eller "atten minutter på" ? (Antakeligvis ingen av delene 🙂 ) Jeg tok en sjefsavgjørelse og bestemte meg for 1..19 minutter på og over hel time, og 1..10 minutter på/over halv time Å frese ut så små bokstaver i aluminium er ikke bare-bare og det prosjektet arbeider jeg fortsatt med, -MEN jeg har jo en laser 😉 ! Og laserskårene Times New Roman (Med seriff og greier) ble skikkelig fint i svart kartong (Fra Ark bokhandel) Måtte jobbe litt i CAD for å få bokstavene til å bli "stencil-type" men det ble jo ferdig til slutt. De nye adresserbare LED stripene er jo helt perfekte til slikt og jeg valgte en 5V stripe med RGBW slik at jeg kunne kjøre dem på en USB kabel og kunne få litt varmt gult lys. Med 30 stk på meteren ble det 3.33cm på hver bokstav som var helt passe. Så da var det bare å klippe dem opp og lime dem på bakplata og lodde dem sammen med strøm og data slik at alle kom etterhverandre: "Avstands plata" ble det jo en del arbeid med. Den måtte freses nøyaktig og ha utsparinger til loddingene: Her er et glimt fra produsjonen IMG_0096.mp4 Med plata montert og ESP32'en på plass så det slik ut: Hadde ikke lyst til å sette av noe plass til en "reset knapp" så den ble bare 2 kabler på baksiden 🙂 : For at kartong-bokstavene skulle holde seg flate måtte jeg ha plastplate både over og under. Jula hadde noen fine i 2mm og 4mm. Jeg prøvde meg med hvit plast fra Biltema for å gjøre lyset diffust men det "lakk" for mye over til nabobokstaven så løsningen ble faktisk helt vanlig printerpapir (2 x A3) som ble lagt under bokstavene: En venn av meg foreslo svart silkepapir som difusjonspapir og det ble også ganske fint. -Da ser en ikke bokstavene så godt før de lyser opp og det gir en annen effekt (men jeg synes det er litt kult å se dem ellers også) 2 x 6mm MDF + 2mm plast + 4mm plast = 18mm Til slutt hadde jeg litt flaks og fant alu-profiler hos Maxbo som var perfekte. Disse var rett under 18 og kunne klemmes på som eneste festemåte etter at de var skåret i gjerdesaga. Siden jeg bruke 5m USB kabler til strømforskyning var det jo ingen grunn til ikke å la den USB'en også være plugget i ESP32'en slik at en kan reprogrammere om en vil. Men jeg turte ikke å ta strøm til LED'ene fra ESP32'en så kablene ble klippet opp og tappet for 5V. Så var det programvaren da. Minimums konfigurasjonen fikk WiFi Manager som setter opp en SSID = "BokstavKlokke" med samme passord for å sette opp husets WiFi. Den leser så klokka fra nettet med NTP og "tidssone" = CET-1CEST,M3.5.0,M10.5.0/3 Det skal gi riktig sommertid også så vidt jeg forstår. Når du trykker "reset" (kortslutter de to kablene på baksiden) går den i AP mode igjen og viser "WIFI" på displayet Når den starter tester den alle LEDene i alle farger og så "tekster" den ut IP adressen 🙂 Untitled Video - Made With Clipchamp (2).mp4 Mulighetene herfra er mange: - Flere konfigurerings-parametere i WiFi Manager: Justering av bokstav-farger og intensitet Modi med andre farger om natta Feiring av hel/halv time med farger - MQTT support fra Smarthuset Blinker klokka om noe skjer Styrer fargene avhengig av sol opp/ned MEN alt dette må jeg jo spille ball med dere på forumet om ! Jeg opretter en tråd på Mikroprosessor-forumet og tar imot ideer og kode der. (Min kode skal dere selvfølgelig få). Jeg har brukt så mange timer på dette prosjektet at det ville være dumt å ikke dele det med flere. Så jeg har laget noen få komplette som er lagt ut på finn. (Søk på bokstavklokke) Til dere som liker å gjøre ting selv men ikke har fres og/eller laser tenkte jeg å tilby et "byggesett" med de delene som er vanskelige å lage. Egentlig er det bare de to MDF platene og bokstavkartongen men jeg er redd kartongen ikke overlever postgang om jeg ikke legger den mellom plastplatene. Kontakt meg her eller på Finn om dere er interessert. Og hva er neste skritt? Vel, jeg har ikke gitt opp å frese ut bokstavene i aluminiumsplate. Da kan den øverste plastplaten skippes og difusjonspapiret bør byttes ut med plastfolie. Jeg HAR allerede forsøkt å bruke noe annet enn svart kartong i laseren. Jeg har prøvd meg på tapet, både med og uten mønster. Det ble veldig kult men min laser er egentlig bare en fres med påmontert laser og brenner derfor et lite hull hver gang den starter en skjæring. Jeg har kjøpt inn en ny controller som kan ta M11P1/M10P1 koder (skru på laseren først når aksen begynner å bevege seg) så når den er montert får vi se mere på tapeter.1 poeng
-
1 poeng
-
Har lett litt etter en ferdig løsning for å få litt status fra "Robert" inn i NodeRed og endte opp med å ta en Gardena-løsning og modifisere litt. Legger bare ut det mest grunleggende her så kan en selv bygge videre om en vil... Du trenger brukernavn/passord (samme som i appen) og api_key og api_secret (som en finner på https://developer.husqvarnagroup.cloud/applications/) Resultatet ser slik ut: [{"id":"ec4f37957f88a213","type":"inject","z":"8603c38cd8dca9a1","name":"InitialToken","props":[],"repeat":"300","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":220,"y":100,"wires":[["5a76f5f24753307f"]]},{"id":"ef52311e418fa6cd","type":"http request","z":"8603c38cd8dca9a1","name":"http request","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":610,"y":160,"wires":[["1c85b2910f1c6f49","d89c283dd29ecf4e","1c19f3206acd6d3f","9a8a81a102fe4394"]]},{"id":"6b818ceca37c4778","type":"function","z":"8603c38cd8dca9a1","name":"Get Mowers","func":"flow.set(\"access_token\", msg.oauth2Response.access_token);\nflow.set(\"refresh_token\", msg.oauth2Response.refresh_token);\nflow.set(\"user_id\", msg.oauth2Response.user_id)\n\nvar mytoken = flow.get(\"access_token\"); \nvar myapi = flow.get(\"api_key\"); \nvar url = \"https://api.amc.husqvarna.dev/v1/mowers\";\n\nmsg.headers = {\n\t'Authorization': 'Bearer '+mytoken,\n\t'Authorization-Provider': 'husqvarna',\n\t'X-Api-Key': myapi,\n\t'Content-Type': 'application/vnd.api+json',\n};\n\nmsg.url = url;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":160,"wires":[["ef52311e418fa6cd"]]},{"id":"1c85b2910f1c6f49","type":"debug","z":"8603c38cd8dca9a1","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1030,"y":160,"wires":[]},{"id":"5a76f5f24753307f","type":"function","z":"8603c38cd8dca9a1","name":"Credentials","func":"flow.set(\"gard_login\", \"[email protected]\");\nflow.set(\"gard_pass\", \"xxxxxx\");\nflow.set(\"api_key\", \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\");\nflow.set(\"api_secret\", \"zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz\");\n\n\nvar mylogin = flow.get(\"gard_login\");\nvar mypass = flow.get(\"gard_pass\"); \nvar myrefresh = flow.get(\"refresh_token\"); \nvar myapi = flow.get(\"api_key\"); \nvar mysecret = flow.get(\"api_secret\"); \n\nmsg.oauth2Request = { \n\"access_token_url\": \"https://api.authentication.husqvarnagroup.dev/v1/oauth2/token\", \n\"credentials\": {\n \"grant_type\": \"password\",\n \"username\": mylogin,\n \"password\": mypass,\n \"client_id\": myapi,\n \"client_secret\": mysecret,\n \"scope\": \"openid\"\n }\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":100,"wires":[["88e8d4ddd3a7e099"]]},{"id":"498b21e243819b76","type":"debug","z":"8603c38cd8dca9a1","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"oauth2Response","targetType":"msg","statusVal":"","statusType":"auto","x":1060,"y":100,"wires":[]},{"id":"88e8d4ddd3a7e099","type":"oauth2","z":"8603c38cd8dca9a1","name":"","container":"oauth2Response","grant_type":"set_by_credentials","access_token_url":"","authorization_endpoint":"","open_authentication":"","username":"","password":"","client_id":"","client_secret":"","scope":"","proxy":"","senderr":false,"client_credentials_in_body":true,"rejectUnauthorized":true,"headers":{},"x":660,"y":100,"wires":[["6b818ceca37c4778","498b21e243819b76"]]},{"id":"d89c283dd29ecf4e","type":"change","z":"8603c38cd8dca9a1","name":"Extract Mower activity","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[\"data\"][0][\"attributes\"][\"mower\"].activity","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":240,"wires":[["55ea77bc8dc2844a"]]},{"id":"0d70166c691efcee","type":"ui_text","z":"8603c38cd8dca9a1","group":"a7f439d7b1e0bbd4","order":1,"width":0,"height":0,"name":"","label":"Act:","format":"{{msg.payload}}","layout":"row-left","className":"","x":1010,"y":240,"wires":[]},{"id":"55ea77bc8dc2844a","type":"show-value","z":"8603c38cd8dca9a1","name":"","path":"","x":820,"y":240,"wires":[["0d70166c691efcee"]]},{"id":"1c19f3206acd6d3f","type":"change","z":"8603c38cd8dca9a1","name":"Extract Mower state","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[\"data\"][0][\"attributes\"][\"mower\"].state","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":280,"wires":[["12a6948a8805bccf"]]},{"id":"0ec1d3574e80d05f","type":"ui_text","z":"8603c38cd8dca9a1","group":"a7f439d7b1e0bbd4","order":1,"width":0,"height":0,"name":"","label":"State:","format":"{{msg.payload}}","layout":"row-left","className":"","x":1010,"y":280,"wires":[]},{"id":"12a6948a8805bccf","type":"show-value","z":"8603c38cd8dca9a1","name":"","path":"","x":820,"y":280,"wires":[["0ec1d3574e80d05f"]]},{"id":"80c2164fda5b93c9","type":"ui_table","z":"8603c38cd8dca9a1","group":"a7f439d7b1e0bbd4","name":"","order":2,"width":"8","height":"11","columns":[],"outputs":0,"cts":false,"x":1010,"y":200,"wires":[]},{"id":"9a8a81a102fe4394","type":"function","z":"8603c38cd8dca9a1","name":"2array.of.obj","func":"var newObj = {}\nlet arr = []\nvar lastDate = 0;\nvar options = { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' };\nvar lastDateFormatted = 0;\nvar system = [msg.payload.data[0].attributes.system]\nvar mower = [msg.payload.data[0].attributes.mower]\nvar battery = [msg.payload.data[0].attributes.battery]\nvar metadata = [msg.payload.data[0].attributes.metadata]\nvar planner = [msg.payload.data[0].attributes.planner]\nvar calendar = [msg.payload.data[0].attributes.calendar.tasks[0]]\n\nnewObj = { Status: \"Name: \" + system[0].name }\narr.push(newObj)\nnewObj = { Status: \"Model: \" + system[0].model }\narr.push(newObj)\nnewObj = { Status: \"Serial: \" + system[0].serialNumber }\narr.push(newObj)\n\nnewObj = { Status: \"Override: \" + planner[0].override.action }\narr.push(newObj)\n\n//Calendar\nvar cald = \"\";\nif (calendar[0].monday == true) cald = \"M\"; else cald = \"_\";\nif (calendar[0].tuesday == true) cald += \"T\"; else cald += \"_\";\nif (calendar[0].wednesday == true) cald += \"W\"; else cald += \"_\";\nif (calendar[0].thursday == true) cald += \"T\"; else cald += \"_\";\nif (calendar[0].friday == true) cald += \"F\"; else cald += \"_\";\nif (calendar[0].saturday == true) cald += \"S\"; else cald += \"_\";\nif (calendar[0].sunday == true) cald += \"S\"; else cald += \"_\";\nnewObj = { Status: \"Calendar: \" + cald }\narr.push(newObj)\n\nnewObj = { Status: \"Connected: \" + metadata[0].connected }\narr.push(newObj)\n\nlastDate = new Date(metadata[0].statusTimestamp);\nlastDateFormatted = lastDate.toLocaleDateString('nb-NO', options);\nnewObj = { Status: \"StatusTS: \" + lastDateFormatted}\narr.push(newObj)\n\nnewObj = {Status: \"Mode: \" + mower[0].mode}\narr.push(newObj)\nnewObj = { Status: \"Activity: \" + mower[0].activity}\narr.push(newObj)\nnewObj = { Status: \"State: \" + mower[0].state }\narr.push(newObj)\nnewObj = { Status: \"ErrorCode: \" + mower[0].errorCode }\narr.push(newObj)\nlastDate = new Date(mower[0].errorCodeTimestamp);\nlastDateFormatted = lastDate.toLocaleDateString('nb-NO', options);\nnewObj = { Status: \"ErrorCodeTS: \" + lastDateFormatted}\narr.push(newObj)\nnewObj = { Status: \"Battery: \" + battery[0].batteryPercent }\narr.push(newObj)\n\nnode.warn(arr)\nmsg.payload = arr\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":200,"wires":[["80c2164fda5b93c9","1c85b2910f1c6f49"]]},{"id":"afa6c1e45f377316","type":"comment","z":"8603c38cd8dca9a1","name":"Input your credentials","info":"","x":470,"y":70,"wires":[]},{"id":"a7f439d7b1e0bbd4","type":"ui_group","name":"Status","tab":"55b4bf40cf1e815d","order":1,"disp":true,"width":"8","collapse":false,"className":""},{"id":"55b4bf40cf1e815d","type":"ui_tab","name":"Robert","icon":"android","order":21,"disabled":false,"hidden":false}]1 poeng
Vinnerlisten er satt til Oslo/GMT+01:00