[FHEM-Tablet-UI] Keypad für PIN-Eingabe?

Begonnen von alpha1974, 15 Januar 2016, 09:05:36

Vorheriges Thema - Nächstes Thema

alpha1974

Guten Morgen miteinander,

ich möchte gerne einen Homestatus-Button mit einer PIN-Eingabe "koppeln" und frage mich gerade, ob ich dazu das Rad neu erfinden muss oder ob es im unendlichen FHEM-Universum schon ein paar Code-Schnipsel als Vorlage gibt ;-)

Ziel: Der Homestatus soll im UI nur nach Eingabe eines PIN-Codes geändert werden können.

Simpelste Lösung ist es natürlich, am Endgerät (Tablet) eine PIN-Displaysperre einzurichten.

Eleganter, weil universeller, fände ich es aber, im Tablet-UI eine Art Keypad einzurichten (siehe Screenshot im Anhang). Die einzelnen Ziffern könnten Push- oder Button-Widgets sein, deren Data-Device jeweils ein Ziffern-Dummy-Device ist. FHEM müsste dann den Rest übernehmen, also die gedrückte PIN-Ziffer und alle folgenden PIN-Ziffern "merken" und auswerten und bei einem Match auf den richtigen PIN-Code den zuvor ausgewählten Homestatus aktivieren.

Meine Problem(chen) bisher:
1.
Wie kriege ich ein "Eintipp-Feeling" für jede einzelne Ziffer hin? Die Ziffer müsste kurz die Farbe ändern und dann wieder zurückspringen. Ich könnte dazu unter FHEM den state des Dummy-Devices nach z.B. 1 Sek. wieder zurücksetzen, aber das finde ich irgendwie "oversized". Vielleicht gibt es ja im Tablet-UI auch schon was Passendes?

2.
Wie mache ich die Veränderung des Homestatus von der vorherigen PIN-Eingabe abhängig? Im UI müsste sich beim Antippen auf einen anderen Homestatus das Keypad "aktivieren" oder zumindest ein entsprechender Hinweis erscheinen (ginge wohl über ein weiteres Dummy-Device, wenn FHEM ein Get auf den Homestatus erkennt und dann einen Hinweis-Dummy aktiviert, der im UI eine entsprechende Meldung anzeigt). Wenn dann die richtige PIN eingegeben ist, müsste FHEM den (zunächst nur vorläufigen) Homestatus "scharf" schalten. Also noch mehr Dummy-Devices, um die Zwischenzustände zu speichern?

Nach meinen bisherigen "absolute beginner"-Überlegungen ist das alles sehr FHEM-lastig und erfordert bei jedem Klick eine Menge Interaktion zwischen UI und FHEM. Aber vielleicht hat ja jemand schon etwas Ähnliches erfolgreich umgesetzt  ::)

Davon bin ich leider noch weit entfernt, weil mir jegliche Auswertung/Verknüpfung zwischen Homestatus und PIN fehlt:
<li data-row="1" data-col="4" data-sizex="3" data-sizey="3">
    <header>HOMESTATUS</header>
<div>
<div data-type="homestatus" data-device='homestatus'
data-get-on='["1","2","3","4"]'
       data-alias='["Home","Night","Away","Holiday"]'
       data-icons='["fa-home","fa-bed","fa-car","fa-suitcase"]'>
</div>
<div data-type="label" class="cell">PIN-Code</div>
     <div data-type="push" data-icon="" data-device="keypad1">1</div>
     <div data-type="push" data-icon="" data-device="keypad2">2</div>
     <div data-type="push" data-icon="" data-device="keypad3">3</div>
     <div data-type="push" data-icon="" data-device="keypad4">4</div>
     <div data-type="push" data-icon="" data-device="keypad5">5</div>
</div>
     <div data-type="push" data-icon="" data-device="keypad6">6</div>
     <div data-type="push" data-icon="" data-device="keypad7">7</div>
     <div data-type="push" data-icon="" data-device="keypad8">8</div>
     <div data-type="push" data-icon="" data-device="keypad9">9</div>
     <div data-type="push" data-icon="" data-device="keypad0">0</div>
     <div data-type="push" data-icon="fa-key" data-device="keypadenter"></div>
</li>


Besten Dank für hilfreiche Hinweise,
alpha1974
FHEM/Z-Wave USB-Dongle + div. Devices

CoolTux

Wenn ich Dich richtig verstehe, willst Du nicht das Homewidget zur umstellung verwenden (das soll wahrscheinlich nur den Status anzeigen, also readable) sondern Du willst ein 4-16 Zeichen Code und das pro Homestatus.

Nehmen wir mal den einfachsten Weg. 4 Zeichen. Soll ja sicher sein. das pro Status. Also wenigstens Home und Away. Muss sich also Deine Familie schon mal 2 Zahlenfolgen a 4 Zeichen merken.
Da fragt meine Frau als erstes für was der Quatsch gut sein soll und meine 13 jährige schüttelt verständlicher Weise den Kopf.

Vielleicht magst mal kurz die Hintergründe erklären damit die Lesenden und Helfenden welche sich dann Kopf machen verstehen wieso der Fragesteller, in meinen Augen, solch einen Blödsinn haben will/muss.

Wenn dann würde ich da wirklich über die Tablet Pin-Sperre gehen. Die kann man auch an und aus schalten. Das AMAD Modul unterstützt das z.B. seit kurzem in der Developerversion.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

alpha1974

#2
Hintergrund ist, dass ich mich frage, ob man software-mässig über das UI ein Keypad wie dieses nachbilden kann (natürlich ohne RFID). Ausreichend wäre dafür ein gemeinsamer PIN für alle Statusänderungen, also nicht für jeden Status ein eigener PIN. Denkbarer Anwendungsfall wäre z.B. eine pin-gesicherte Scharf(ab)schaltung von Einbruchmeldern über ein im Flur hängendes Tablet.

Abstrahiert liefe es darauf hinaus, dass das Schalten einzelner Devices pin-gesichert ist (im Unterschied zur Tablet-Display-Sperre oder auch zur Authentifizierung über den Web-Server).

"haben will/muss" ist es natürlich nicht, sondern eher "wissen wollen, ob". Für Frau und Kinder sind PIN-Sperren hier auch nicht nötig, aber für andere Personen (angefangen bei der Putzfrau bis hin zum Einbrecher mit technischem Grundverständnis) würde ich nicht nur auf edukative Maßnahmen setzen wollen ;D
FHEM/Z-Wave USB-Dongle + div. Devices

CoolTux

Ah also vorerst ein proof of concept.

Dann würde ich es anders nennen. Hoffe ich habe Dich korrekt verstanden. Vorerst geht es darum eine Nummerfeld ab zu bilden und des sinnvoller Weise in FHEM ein zu binden. Am Ende des ganzen soll dann ein Deaktivieren einer z.B. Alarmanlage stehen. Es geht also nicht darum den Homestatus pro Bewohner zu ändern, sondern etwas/ein einziges auf Basis einer Pineingabe zu schalten.

KORREKT?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

alpha1974

Korrekt!

Ablauf: Code im Keypad im UI eintippen + bestätigen (oder noch schöner: quick unlock ohne Bestätigen, wenn PIN richtig)-> FHEM macht $irgendwas (z.B. schaltet Alarm scharf/unscharf).

Ausbauvariante: Klick auf Push- oder Button-Widget im UI (z.B. "Alarmanlage ausschalten" oder "AV-Receiver/TV mit Ü18-Programm starten"  ;D)-> Keypad geht auf -> weiter wie oben

Der Homestatus-Button war nur mein Ausgangspunkt, weil er nach meinen Verständnis auch nichts anderes als ein Mehrfach-Schalter ist, der ein Device auf unterschiedliche States setzt (je nach Anwendungsszenario eben auch für jeden Bewohner separat).
FHEM/Z-Wave USB-Dongle + div. Devices

CoolTux

Lösungsansatz FHEM:

4 Dummys. der letzte Dummy wird von einem notify getriggert. Dieses notify holt sich die bereits eingegebenden Zahlen der 3 vorherrigen Dummys plus des vierten Dummys und vergleicht den erhaltenden String mit einem vorhanden. Passt der String wird irgendwas ausgelöst.

Lösungsansatz FTUI: Pro Dummy eine Nummerntastatur (das wird viel).

Das ist jetzt echt nur mal so aus Spaß an der Freude überlegt worden. Das mit den FTUI ist wohl noch mehr wie überdenkenswert     ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

kumue


Stril

Hallo!

Ich habe mir das auch schon überlegt und wollte es über eine Sequenz lösen:

Die Zahlen als einzelne Buttons definieren, die einen Dummy schalten. Wenn der Dummy dann die Sequenz
1234# erkennt, wird ein Dummy geschaltet, der wiederum per Notify nach 60s zurück gesetzt wird.

Ungetestet!

Gruß
Phil

alpha1974

Smartvisu mit auth_switch hatte ich mir auch schon angesehen, aber das übersteigt leider meine Fähigkeiten um ein Vielfaches  :-[

sequence-Device ist ein guter Hinweis. Die Commandref liest sich so, als könnte man das zur PIN-Erkennung zweckentfremden, wobei der richtige PIN (=Abfolge von Zahlen-Dummy-Schaltern) dann wohl hardkodiert in der Sequence definiert werden muss (fände ich aber nicht schlimm). Ich versuche mich mal daran...

Habe übrigens gerade noch einen anderen Thread gefunden, in dem nicht nur über die Sinnhaftigkeit eines PIN-Code-Schutzes sinniert wurde, sondern auch über Lösungsansätze, die dann aber nicht über FHEM, sondern von der Client-(Android)-Seite aus über Tasker angegangen wurden. Müsste dann aber auf allen Clients eingerichtet werden.
FHEM/Z-Wave USB-Dongle + div. Devices

alpha1974

#9
Just for the records: Das Keypad im Tablet-UI nachzubilden, war nicht besonders schwierig. Alle Tasten "schalten" auf dasselbe Dummy und weisen ihm den jeweiligen Zahlen-Wert zu. Ein Notify setzt den Tastendummy nach einem Event wieder auf "NUL" (als Pendant zum Push-Widget, das auch nur einen Tastendruck und kein Gedrückt-Halten suggeriert).

Für die Alarm-Scharfschaltung im UI gibt es ein Switch-Widget, das den Alarm-Status auf scharf schaltet. Da data-set-off leer ist, kann man über das Switch-Widget nur scharf, aber nicht unscharf schalten. Die Unscharf-Schaltung via PIN wird über FHEM geregelt: Ein sequence-Device triggert, wenn der Tastendummy die richtigen Zahlen in der richtigen Reihenfolge liefert (je nach DEF des sequence-Devices entweder mit "Enter"-Bestätigung oder als quick unlock nach der letzten richtigen PIN-Ziffer). Ein weiteres Notify-Device schaltet dann den Alarm-Status unscharf, wenn das sequence-Device triggert. UI- und FHEM-/Code siehe unten....

NOTA BENE: Funktioniert, ist aber vom Sicherheitsaspekt her vermutlich nicht mehr als eine hübsche Verpackung. Zum einen triggert das sequence-Device auch, wenn man zwischen zwei richtigen PIN-Ziffern eine falsche eingibt, solange alle Tasten-Events innerhalb der sequence-Zeitspanne liegen. Das kann man evtl. durch entsprechend kurze Zeitvorgaben etwas abmildern.

Zum anderen ist es eher sportlich, das Switch-Widget zum Scharf-Schalten allein dadurch am Unscharf-Schalten zu hindern, dass data-set-off leer bleibt. Etwas sicherer (aber auch nicht im Sinne von echter Absicherung) dürfte es sein, wenn FHEM den Alarm-Status nur dann auf Unscharf setzt, wenn vorher das sequence-Device getriggert hat. Aber auch das ist natürlich keine echte Hürde. Dazu bräuchte man FHEM-Boardmittel, um ein "set" auf ein beliebiges Device abzusichern. Dazu habe ich aber bislang noch nichts gefunden.

Andererseits reicht mir die bisherige Lösung für das Anwendungsszenario "Tablet im Flur". Der Durchschnittseinbrecher müsste, nachdem er "drin" ist und dabei einen Voralarm ausgelöst hat, innerhalb einer begrenzten Zeitspanne dahinter kommen, wie er das UI hackt und den Alarm-Status mit einem gezielten set auf unscharf setzt. 

Fazit für mich: Sieht hübsch aus und ist besser als nix, aber mehr auch nicht. Die Flexibilität von FHEM ist aber immer wieder faszinierend!

Hier noch der Code (PIN im sequence-Device: 1234 jeweils innerhalb von 5 Sekunden pro Ziffer).

Tablet-UI:
<li data-row="1" data-col="4" data-sizex="2" data-sizey="3">
    <header>ALARM-STATUS</header>

    <div class="cell">Alarm scharf schalten</div>
    <div data-type="switch" data-device="alarm_scharf" data-set-on="on" data-set-off="" data-icon="fa-exclamation-circle fa-lg" data-on-color="red" data-off-color="grey" class="big"></div>

    <div data-type="label" class="cell">Alarm unscharf schalten (PIN-Code)</div>
        <div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="1">1</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="2">2</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="3">3</div>
        </div>
        <div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="4">4</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="5">5</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="6">6</div>
        </div>
        <div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="7">7</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="8">8</div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="9">9</div>
        </div>
        <div>
             <div data-type="push" data-icon="" data-device="keypad_key" data-set-on="0">0</div>
             <div data-type="push" data-icon="fa-key" data-device="keypad_key" data-set-on="#"></div>
        </div>
</li>


FHEM:

define alarm_scharf dummy
define keypad_key dummy
define keypad_release notify keypad_key:[0-9|#] sleep 0.5; set keypad_key nul
define alarm_unscharf_pin sequence keypad_key:1 5 keypad_key:2 5 keypad_key:3 5 keypad_key:4
define alarm_unscharf_schalten notify alarm_unscharf_pin:trigger set alarm_scharf off
FHEM/Z-Wave USB-Dongle + div. Devices

setstate

Sehr schön gelöst, danke für dein Post.
Wäre das nicht ein Thema für die Snippet Sammlung im Wiki?

http://www.fhemwiki.de/wiki/Kategorie:Code_Snippets

alpha1974

Zitat von: setstate am 16 Januar 2016, 12:21:30
Sehr schön gelöst

Danke, aber keider nicht schön genug :-\ Das Notify-Device, das ich zum Zurücksetzen des "Tastendrucks" nutze (keypad_release), triggerte sich selbst = nach einer PIN-Eingabe setzte es keypad_key auf "nul", was wiederum als notify-Event erkannt wurde und in einer - geradezu verzweifelten - Endlosschleife mündete, wodurch die CPU-Last für perl auf 100 % hochging... Ich habe den Code in meinem letzten Posting jetzt geändert. Jetzt wird nur auf [0-9|#] reagiert.

Zitat
Wäre das nicht ein Thema für die Snippet Sammlung im Wiki?
http://www.fhemwiki.de/wiki/Kategorie:Code_Snippets
Wenn es denn mal richtig läuft...  :o
FHEM/Z-Wave USB-Dongle + div. Devices

Stril

Hallo!

Lasse doch das notify nur das Set ausführen, wenn der Dummy auf einer Ziffer steht [0-9]

alpha1974

Genau so habe ich es im Code (und im entsprechenden Posting) auch schon geändert (ergänzt um "#" als Enter-Taste)  ;)
define keypad_release notify keypad_key:[0-9|#] sleep 0.5; set keypad_key nul
FHEM/Z-Wave USB-Dongle + div. Devices

Stril

Eigenartig... Wird das notify laut Log zwei mal angestoßen?