WLAN Wecker

Antworten
little.yoda
Site Admin
Beiträge: 928
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 33 Mal
Danksagung erhalten: 146 Mal

WLAN Wecker

Beitrag von little.yoda » 23.09.2018, 13:15

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.

little.yoda
Site Admin
Beiträge: 928
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 33 Mal
Danksagung erhalten: 146 Mal

Re: WLAN Wecker

Beitrag von little.yoda » 23.09.2018, 13:35

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.
Die Platine:
38b2f8ece625a5140ac993e79abb11cd190b47c8.jpg
38b2f8ece625a5140ac993e79abb11cd190b47c8.jpg (149.27 KiB) 32426 mal betrachtet
73debef0f83ac2c79659f22fa54f488a728c9c85.jpg
73debef0f83ac2c79659f22fa54f488a728c9c85.jpg (98.46 KiB) 32426 mal betrachtet
Formschön in einem alten Karton untergebracht:
a8337712461be74357c0df25dad20872ad367898.jpg
a8337712461be74357c0df25dad20872ad367898.jpg (89.08 KiB) 32426 mal betrachtet
c652fca541f4ef898c4295f4f7c95bd55ff5d021.jpg
c652fca541f4ef898c4295f4f7c95bd55ff5d021.jpg (91.89 KiB) 32426 mal betrachtet
Steuerung über Node-Red:
nodered.png
nodered.png (48.46 KiB) 32426 mal betrachtet

Jury_85
Beiträge: 1
Registriert: 22.03.2019, 09:32
Hat sich bedankt: 1 Mal

Re: WLAN Wecker

Beitrag von Jury_85 » 22.03.2019, 09:37

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

little.yoda
Site Admin
Beiträge: 928
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 33 Mal
Danksagung erhalten: 146 Mal

Re: WLAN Wecker

Beitrag von little.yoda » 22.03.2019, 12:06

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.

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}]
Gruß,
Sven

little.yoda
Site Admin
Beiträge: 928
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 33 Mal
Danksagung erhalten: 146 Mal

Re: WLAN Wecker

Beitrag von little.yoda » 08.01.2020, 19:26

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.

Gehäuse.png
Gehäuse.png (193.91 KiB) 31708 mal betrachtet
gehäuse2.jpg
gehäuse2.jpg (144.08 KiB) 31708 mal betrachtet
gehäuse.jpg
gehäuse.jpg (153.94 KiB) 31708 mal betrachtet

Noah2000
Beiträge: 1
Registriert: 15.08.2024, 14:07

Re: WLAN Wecker

Beitrag von Noah2000 » 15.08.2024, 14:12

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!

Antworten