Schon länger sind mir die Standard-Wecker auf die Nerven gegangen. Nachdem der alte Wecker kaputt gegangen ist, habe ich die Chance genutzt, mir meinen eigenen Wecker zu bauen.
Anforderungen:
- getrennte Weckzeiten für zwei Personen
- mehrere Weckzeiten für verschiedene Tage
- einfache Aktivierung und Deaktivierung des Alarms
- Anzeige der Uhrzeit und der beiden aktuellen Weckzeiten
- Schlafzimmer tauglich (Nachts nicht zu hell)
- Zeit soll über NTP geholt werden
- Steuerung über WLAN
- Weckzeiten aber auch per Tasten manuell änderbar
- MP3 oder ähnliches als Wecksound
- Ausreichender WAF (Woman acceptance factor)
Im folgenden dokumentiere ich die verschiedenen Versionen.
WLAN Wecker
-
- Site Admin
- Beiträge: 928
- Registriert: 14.09.2018, 19:05
- Hat sich bedankt: 33 Mal
- Danksagung erhalten: 146 Mal
-
- Site Admin
- Beiträge: 928
- Registriert: 14.09.2018, 19:05
- Hat sich bedankt: 33 Mal
- Danksagung erhalten: 146 Mal
Re: WLAN Wecker
Wo stehe ich mit dieser Version:
- getrennte Weckzeiten für zwei Personen ✓
- mehrere Weckzeiten für verschiedene Tage ✓
Mehr oder weniger beliebe Anzahl an Weckzeiten. (Neben den einzelnen Tagen, auch Sonderfälle wie täglich, Mo-Fr, Sa-So) - Anzeige der Uhrzeit und der beiden aktuellen Weckzeiten ✓
- einfache Aktivierung und Deaktivierung des Alarms ✓
Mit den Tasten links und rechts oben, können die aktuellen Werkzeiten aktiviert bzw. deaktiviert werden. - Schlafzimmer tauglich (Nachts nicht zu hell) ✓
Da ich die Anzeige nicht weit genug gedimmt bekommen habe, wird die Anzeige nach 30 sec deaktiviert und aktiviert sich wieder, wenn eine Taste gedruckt wird oder die Weckzeit erreicht wurde - Zeit soll über NTP geholt werden ✓
- Steuerung über WLAN ✓
Der Wecker holt sich die Zeiten über MQTT. Eine Steuerung über Node-Red, die über MQTT kommuniziert, ist implementiert. (siehe Foto) - Weckzeiten aber auch per Tasten manuell änderbar
ja, aber .... Bei dem Design der Platine sind die Tasten unter die Anzeige geruscht. So sind die Tasten nicht brauchbar - MP3 oder ähnliches als Wecksound
fehlt noch komplett. Im Moment nur ein Piepsen möglich - Ausreichender WAF (Woman acceptance factor)
Ist die Kiste nicht formschön ... ok, reden wir nicht weiter drüber.
Re: WLAN Wecker
Hallo little.yoda
ich mache mir schon länger Gedanken wie ich über node-red einen Lichtwecker programmieren könnte.
Leider weiß ich noch nicht wie ich die eingabe gestalten kann.
ich gehe davon aus das deine eingabe maske mit dem standard nord-red dshboard erstellt ist.
wärst du so nett den entsprechenden flow zu exportieren und online zu stellen oder mir als privat nachricht zukommen zu lassen? das würde mir wirklich sehr helfen.
Danke
ich mache mir schon länger Gedanken wie ich über node-red einen Lichtwecker programmieren könnte.
Leider weiß ich noch nicht wie ich die eingabe gestalten kann.
ich gehe davon aus das deine eingabe maske mit dem standard nord-red dshboard erstellt ist.
wärst du so nett den entsprechenden flow zu exportieren und online zu stellen oder mir als privat nachricht zukommen zu lassen? das würde mir wirklich sehr helfen.
Danke
-
- Site Admin
- Beiträge: 928
- Registriert: 14.09.2018, 19:05
- Hat sich bedankt: 33 Mal
- Danksagung erhalten: 146 Mal
Re: WLAN Wecker
Hi
Anbei der Flow ....
Über MQTT erhält der Wecker seine Informationen und erstellt daraus ein Template.
Wenn man auf "Setzen" klickt, wird wiederrum eine MQTT Message erzeugt, die an den Wecker geht.
Gruß,
Sven
Anbei der Flow ....
Über MQTT erhält der Wecker seine Informationen und erstellt daraus ein Template.
Wenn man auf "Setzen" klickt, wird wiederrum eine MQTT Message erzeugt, die an den Wecker geht.
Code: Alles auswählen
[{"id":"87868aca.6ebd48","type":"tab","label":"Steuerung: Wecker","disabled":false,"info":""},{"id":"b944f94b.d595a8","type":"csv","z":"87868aca.6ebd48","name":"","sep":";","hdrin":true,"hdrout":"","multi":"mult","ret":"\\n","temp":"","skip":"0","x":410,"y":120,"wires":[["53f743a5.bafa54"]]},{"id":"4e7095b7.e8223c","type":"mqtt in","z":"87868aca.6ebd48","name":"","topic":"IO/Device/Controll/Clock/Alarm/0","qos":"2","broker":"62c86144.724bf8","x":190,"y":120,"wires":[["b944f94b.d595a8"]]},{"id":"53f743a5.bafa54","type":"function","z":"87868aca.6ebd48","name":"create HTML Form","func":"var data = context.get('data') || Math.floor(Math.random() * 10000);\nvar tage = [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\", \"Mo-Fr\", \"Sa, So\", \"ganze Woche\"];\nmsg.payload.sort(function(a, b){return a.Weekday - b.Weekday});\nvar a = \"<div>\";\nfor (idx = 0; idx <= msg.payload.length; idx++) {\n var m;\n if (idx < msg.payload.length) {\n m = msg.payload[idx];\n } else {\n m = { Enable: false, Time: \"\", Weekday: 0};\n }\n a +=\"<div>\";\n \n a += `<input type=\"checkbox\" id=\"enable` + data + idx +`\" ` + ((m.Enable == \"true\") ? \"checked\" : \"\")+ `>`;\n \n a += `<input type=\"time\" id=\"time` + data + idx + `\" value=\"` + m.Time + `\" />`;\n \n \n a += `<select id=\"day` + data + idx + `\">`;\n \n for (w = 0; w < tage.length; w++) {\n a += `<option value=\"` + w + `\" ` + ((w == m.Weekday) ? \"selected\" : \"\")+ `>` + tage[w] + `</option>`;\n }\n \n\n a += `</select>`;\n \n a += `</div>`;\n}\na += \"</div>\";\n\na += `\n<script>\n// or overwrite value in your callback function ...\nthis.scope.action = function() { \n var value = \"Time;Weekday;Enable\" + String.fromCharCode(10);\n for (i=0; i < ` + (msg.payload.length + 1) + ` ; i++) {\n var v = document.getElementById('time` + data + `' + i).value;\n if (v == \"\") {\n continue;\n }\n value += v;\n value += \";\";\n var e = document.getElementById('day` + data + `' + i);\n value += e.options[e.selectedIndex].value;\n value += \";\";\n value += document.getElementById('enable` + data + `' + i).checked;\n value += String.fromCharCode(10)\n \n }\n return value;\n}\n</script>\n<md-button ng-click=\"send({payload:action()})\">\n Alaramzeiten setzen\n</md-button>\n\n`\ncontext.set('data',data);\n\nreturn {template: a}","outputs":1,"noerr":0,"x":590,"y":120,"wires":[["bf66d5a0.667fc8"]]},{"id":"bf66d5a0.667fc8","type":"ui_template","z":"87868aca.6ebd48","group":"c554cc6d.6192a","name":"","order":3,"width":"6","height":"10","format":"","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":780,"y":120,"wires":[["7717654a.78838c"]]},{"id":"7717654a.78838c","type":"mqtt out","z":"87868aca.6ebd48","name":"IO/Device/Controll/Clock/Alarm","topic":"IO/Device/Controll/Clock/Alarm/0","qos":"1","retain":"true","broker":"62c86144.724bf8","x":1010,"y":120,"wires":[]},{"id":"86dbd2f6.bfd088","type":"csv","z":"87868aca.6ebd48","name":"","sep":";","hdrin":true,"hdrout":"","multi":"mult","ret":"\\n","temp":"","skip":"0","x":410,"y":200,"wires":[["91375f10.b1fad8"]]},{"id":"7c6779c5.db96d","type":"mqtt in","z":"87868aca.6ebd48","name":"","topic":"IO/Device/Controll/Clock/Alarm/1","qos":"2","broker":"62c86144.724bf8","x":190,"y":200,"wires":[["86dbd2f6.bfd088"]]},{"id":"91375f10.b1fad8","type":"function","z":"87868aca.6ebd48","name":"create HTML Form","func":"var data = context.get('data') || Math.floor(Math.random() * 10000);\nvar tage = [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\", \"Mo-Fr\", \"Sa, So\", \"ganze Woche\"];\nmsg.payload.sort(function(a, b){return a.Weekday - b.Weekday});\nvar a = \"<div>\";\nfor (idx = 0; idx <= msg.payload.length; idx++) {\n var m;\n if (idx < msg.payload.length) {\n m = msg.payload[idx];\n } else {\n m = { Enable: false, Time: \"\", Weekday: 0};\n }\n a +=\"<div>\";\n \n a += `<input type=\"checkbox\" id=\"enable` + data + idx +`\" ` + ((m.Enable == \"true\") ? \"checked\" : \"\")+ `>`;\n \n a += `<input type=\"time\" id=\"time` + data + idx + `\" value=\"` + m.Time + `\" />`;\n \n \n a += `<select id=\"day` + data + idx + `\">`;\n \n for (w = 0; w < tage.length; w++) {\n a += `<option value=\"` + w + `\" ` + ((w == m.Weekday) ? \"selected\" : \"\")+ `>` + tage[w] + `</option>`;\n }\n \n\n a += `</select>`;\n \n a += `</div>`;\n}\na += \"</div>\";\n\na += `\n<script>\n// or overwrite value in your callback function ...\nthis.scope.action = function() { \n var value = \"Time;Weekday;Enable\" + String.fromCharCode(10);\n for (i=0; i < ` + (msg.payload.length + 1) + ` ; i++) {\n var v = document.getElementById('time` + data + `' + i).value;\n if (v == \"\") {\n continue;\n }\n value += v;\n value += \";\";\n var e = document.getElementById('day` + data + `' + i);\n value += e.options[e.selectedIndex].value;\n value += \";\";\n value += document.getElementById('enable` + data + `' + i).checked;\n value += String.fromCharCode(10)\n \n }\n return value;\n}\n</script>\n<md-button ng-click=\"send({payload:action()})\">\n Alaramzeiten setzen\n</md-button>\n\n`\ncontext.set('data',data);\n\nreturn {template: a}\n","outputs":1,"noerr":0,"x":590,"y":200,"wires":[["3c3ef0ca.98a5f8"]]},{"id":"3c3ef0ca.98a5f8","type":"ui_template","z":"87868aca.6ebd48","group":"c554cc6d.6192a","name":"","order":4,"width":"6","height":"10","format":"","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":780,"y":200,"wires":[["30096f95.556558"]]},{"id":"30096f95.556558","type":"mqtt out","z":"87868aca.6ebd48","name":"IO/Device/Controll/Clock/Alarm","topic":"IO/Device/Controll/Clock/Alarm/1","qos":"1","retain":"true","broker":"62c86144.724bf8","x":1010,"y":200,"wires":[]},{"id":"cbc614ef.2be7","type":"link in","z":"87868aca.6ebd48","name":"","links":["28c323ce.355664"],"x":120,"y":300,"wires":[["e30b66b6.63866"]]},{"id":"e30b66b6.63866","type":"function","z":"87868aca.6ebd48","name":"Alexa to Wecker Command","func":"mqtt = {\n topic: \"alexaio/ret/\" + msg.payload.id\n}\n\nif (!msg.payload.uhrzeit) {\n mqtt.payload = \"Ich habe leider die Zeit nicht verstanden!\";\n return [null, mqtt]\n}\nmqtt.payload = \"Alarm auf \" + msg.payload.uhrzeit + \" gesetzt!\";\nmsg.payload = \"wecker|\" + msg.payload.uhrzeit.replace(\":\",\"\");\n\nnode.warn([msg, mqtt]);\nreturn [msg, mqtt];","outputs":2,"noerr":0,"x":280,"y":300,"wires":[["58024719.7a43c8"],["7f45fd1a.54c654"]]},{"id":"58024719.7a43c8","type":"mqtt out","z":"87868aca.6ebd48","name":"","topic":"IO/Device/Controll/Clock/Alarm/Action","qos":"1","retain":"","broker":"62c86144.724bf8","x":610,"y":300,"wires":[]},{"id":"7f45fd1a.54c654","type":"mqtt out","z":"87868aca.6ebd48","name":"Alexa Response","topic":"","qos":"1","retain":"","broker":"62c86144.724bf8","x":540,"y":360,"wires":[]},{"id":"c61bf198.2b65b8","type":"comment","z":"87868aca.6ebd48","name":"Wecker","info":"","x":90,"y":60,"wires":[]},{"id":"765e5c43.b157fc","type":"mqtt in","z":"87868aca.6ebd48","name":"","topic":"IO/Device/Controll/Clock/CurrentAlarm/0","qos":"2","broker":"62c86144.724bf8","x":260,"y":460,"wires":[["44be1360.b7b08c"]]},{"id":"44be1360.b7b08c","type":"ui_text","z":"87868aca.6ebd48","group":"c554cc6d.6192a","order":1,"width":"6","height":"1","name":"","label":"","format":"{{msg.payload}}","layout":"col-center","x":560,"y":460,"wires":[]},{"id":"fc609998.c39d08","type":"mqtt in","z":"87868aca.6ebd48","name":"","topic":"IO/Device/Controll/Clock/CurrentAlarm/1","qos":"2","broker":"62c86144.724bf8","x":270,"y":500,"wires":[["edbddcd5.c18318"]]},{"id":"edbddcd5.c18318","type":"ui_text","z":"87868aca.6ebd48","group":"c554cc6d.6192a","order":2,"width":"6","height":"1","name":"","label":"","format":"{{msg.payload}}","layout":"col-center","x":550,"y":500,"wires":[]},{"id":"62c86144.724bf8","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"c554cc6d.6192a","type":"ui_group","z":"","name":"Wecker","tab":"b1c3c67a.326e48","order":3,"disp":true,"width":"12","collapse":false},{"id":"b1c3c67a.326e48","type":"ui_tab","z":"","name":"Tools","icon":"build","order":5}]
Sven
-
- Site Admin
- Beiträge: 928
- Registriert: 14.09.2018, 19:05
- Hat sich bedankt: 33 Mal
- Danksagung erhalten: 146 Mal
Re: WLAN Wecker
Mittlerweile ist ein von mir mit Openscad konstruiertes -- bzw. besser gesagt -- programmiertes Gehäuse dazugekommen.
Das Gehäuse habe ich mit meinem 3D Drucker gedruckt.
Das Gehäuse habe ich mit meinem 3D Drucker gedruckt.
Re: WLAN Wecker
Wow, das ist beeindruckend! Es scheint, dass du bei deinem Projekt schon weit gekommen bist. Jetzt fehlt nur noch die Integration eines MP3-Sounds für die Wecksignale und vielleicht eine Verbesserung des Designs, um den WAF zu erhöhen. Die Herausforderung mit den Tasten unter dem Display scheint schwierig zu sein, aber vielleicht kann eine Umgehungslösung oder eine Designänderung helfen. Auf jeden Fall weiter so, das ist wirklich ein tolles Projekt!