Modul 98_NSPC - Nintendo Switch Parental Control - alpha Version

Begonnen von KernSani, 04 Januar 2020, 01:46:10

Vorheriges Thema - Nächstes Thema

KernSani

Liebe Eltern von Kindern, die eine Nintendo Switch besitzen...

Ich hatte schon lange vor die Zeitbeschränkungen der Nintendo Switch in FHEM zu integrieren, mit Hilfe von Google und mitmproxy konnte ich die Kommunikation jetzt größtenteils entschlüsseln und habe ein Modul gebastelt, das bisher folgendes kann:
* Spielzeit der letzten x Tage auslesen
* Aktuelle Beschränkungen auslesen (Spieldauer pro Tag, Gute-Nacht Alarm etc..)
* Beschränkungen ändern (Alarme für heute deaktivieren, einzelne Tage/jeden Tag ändern etc...)
* Direkt-Befehle um Spielzeit und Gute-Nacht-Zeit  für heute zu ändern

Das Modul ist coding-mäßig stark optimierbar, offene Punkte sind vor allem:
* keine Doku (CommandRef)
* aktuell sind die API-Abfragen blockierend ein paar weniger wichtige Abfragen sind noch blockierend
* Es muss manuell ein Session-Token erstellt werden - mir fehlt die Langzeit-Erfahrung, wie häufig das gemacht werden muss (bei mir läuft das Ding jetzt seit > 1 Monat ohne neu-Generierung, scheint also kein wirklich kritisches Thema zu sein)
* Die Fehlerbehandlung ist noch nicht überall sauber

Das Modul benötigt MIME::Base64::URLSafe, installieren über cpan oder mit:

sudo apt-get install libmime-base64-urlsafe-perl


Define einfach über

define switch NSPC


dann muss das Session token generiert werden,


get switch getUrl


danach wird eine URL angezeigt, diese in den Browser pasten, bei Nintendo anmelden, mit der rechten Maustaste auf "Diesen Account verwenden" klicken und die Link Adresse kopieren. Anschließend:

get switch sessionCode <kopierter Link>


Nun können erstmalig die Daten abgefragt werden:

get switch query


Set Kommandos
alarmState, ist das, was in der Switch App "Disable Alarms for today" heisst. Die doppelte Verneinung vermeiden wir hier, "on" heißt, Beschränkungen aktiviert, "off" heißt keine Beschränkugen
bedtimeDay setzt die Gute Nacht Zeit und erwartet einen Komma-getrennte Liste der Form: Wochentag|Uhrzeit, als Wochentage erlaubt sind mo,tu,we,th,fr,sa,su und all (für die allgemeine Einstellung), also z.B.:

set switch bedtimeDay mo|21:00,tu|20:00 all|21:00

maxtimeDay setzt die maximale Spieldauer und erwartet einen Komma-getrennte Liste der Form: Wochentag|Minuten, als Wochentage erlaubt sind mo,tu,we,th,fr,sa,su und all (für die allgemeine Einstellung), also z.B.:

set switch maxtimeDay sa|120,su|120,all|60

restrictionMode setzt den Modus (nur benachrichtigen oder pausieren) und mit
timerMode wird eingestellt, ob die generellen Einstellungen oder tages-indiviuelle Einstellungen aktiv sind.
addBedtimeToday und addMaxtimeTodayerwarten einen Wert in Minuten und erhöhen/reduzieren (negative Werte sind möglich) die maximale Spieldauer/Gute-Nacht-Zeit um den jeweiligen Wert.

Attribute
ns_interval, das (in Sekunden) angibt wie häufig der Status abgerufen werden soll (letztendlich das selbe wie get query nur timer-gesteuert)
ns_summaryDays für wieviele Tage werden die Spielzeiten abgerufen (default 7)

Readings

* xx_date und xx_time enthalten die Tages-Statistiken (Spielzeit) für die letzten n Tage
* playtimeToday, bedtimeToday und maxtimeToday enthalten die jeweiligen Werte für den aktuellen Tag
* account.* und device.* enthalten ein paar Infos zum Nintendo-Account bzw. zum Switch-Device (derzeit wird jeweils nur ein Account/eine Switch unterstützt)
* pc_.* enthalten Informationen zu den aktuellen Spieldauer-Einstellungen

Das Modul ist noch in der Entwicklungs-Phase aber bei mir im produktiven Einsatz. Ich hätte gerne Feedback, ob das überhaupt jemand braucht und wie es genutzt wird, daher die aktuelle Version angehängt...

Grüße,

Oli




RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KernSani

#1
Da sich das Interesse noch in Grenzen hält, habe ich für mich ein bisschen weiter gebastelt (Anhang im ersten Post) und
* einen Großteil der API-Aufrufe auf nonBlocking umgestellt
* ein paar Komfortfunktionen gebastelt:
- separate Readings für aktuelle und maximale Spielzeit und Gute-Nacht-Zeit für den aktuellen Tag
- Direktbefehle um Spielzeit/Gute-Nacht-Zeit für den heutigen Tag zu ändern

Neben dem neuen Direktbefehl (heute 30 Minuten verlängern) nutze ich das Modul vor allem, um jede Nacht, meine default-Werte wieder herzustellen.


defmod ev_switch_default DOIF ([03:00])((set switch bedtimeDay mo|20:00,tu|20:00,we|20:00,th|20:00,fr|20:00,sa|21:00,su|21:00))\
    ((set switch maxtimeDay mo|60,tu|60,we|60,th|60,fr|60,sa|120,su|120,all|60))\

attr ev_switch_default do always
attr ev_switch_default wait 0,5

Edit: Angepasstes DOIF, mit Verzögerung, da sich die beiden set-Befehle sonst in die Quere kommen.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Det20



caldir65

Moin,
hört sich interessant an - schaue ich mir auch mal an

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

KernSani

Ich hatte kürzlich etwas Probleme mit "malformed JSON", was zum FHEM-Neustart geführt hat, daher habe ich die Fehlerbehandlung verbessert. Aktualisierte Version im ersten Post.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

caldir65

Moin,

ich habe jetzt verucht, das Modul einzubinden - leider klappt ab dem get token nicht mehr - im Log erscheint dann:


2020.03.13 19:35:25.502 5: [switch] Get Token
2020.03.13 19:35:25.502 5: [switch] GetBearer - Session Token is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2020.03.13 19:35:32.201 1: [switch] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/98_NSPC.pm line 1036.

2020.03.13 19:35:32.201 5: [switch] GetMe - Access Token is
2020.03.13 19:35:39.556 5: [switch] GetMe - received <html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
</body>
</html>

2020.03.13 19:35:39.557 1: [switch] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at ./FHEM/98_NSPC.pm line 1036.

2020.03.13 19:35:39.557 5: [switch] GetDevice - Starting Blocking Call
2020.03.13 19:35:39.560 5: [switch] Get Summary

Mehr passiert leider nicht.

Die Config

Internals:
   AUTHCODE   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   FUUID      5e63b1d4-f33f-378b-bbb4-092d0063e25581d9
   NAME       switch
   NR         1909
   SESSIONTOKEN exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   STATE      pc_alarm playtimeToday/maxtimeToday bedtimeToday
   TYPE       NSPC
   READINGS:
     2020-03-13 19:33:18   code            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     2020-03-13 19:35:41   error           not_found
     2020-03-13 19:35:41   error_description HTTP 404 Not Found
     2020-03-13 19:33:18   session_token   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

   helper:
Attributes:
   ns_interval 3600
   ns_summaryDays 7
   room       Web
   stateFormat pc_alarm playtimeToday/maxtimeToday bedtimeToday
   verbose    5


Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

KernSani

Zitat von: caldir65 am 13 März 2020, 19:41:18
Moin,

ich habe jetzt verucht, das Modul einzubinden - leider klappt ab dem get token nicht mehr - im Log erscheint dann:


Ich habe gerade eine aktualisierte Version am ersten Post angehängt. Probier die bitte mal (wahrscheinlich musst du die komplette Prozedur von Anfang an wiederholen)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

caldir65

Moin,

bin erst jetzt dazu gekommen, das neue Modul einzubinden (und neu zu definieren wie oben), und jetzt scheint es zu funktionieren - allerdings habe ich erst nach einem reload der Seite im Browser plötzlich auch Readings, die vorher nicht kamen.

Werde weiter testen

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

KernSani

Zitat von: caldir65 am 19 März 2020, 10:36:27
Moin,

bin erst jetzt dazu gekommen, das neue Modul einzubinden (und neu zu definieren wie oben), und jetzt scheint es zu funktionieren - allerdings habe ich erst nach einem reload der Seite im Browser plötzlich auch Readings, die vorher nicht kamen.

Werde weiter testen

Gruß, Christoph
Neue Readings werden bei FHEM immer erst nach einem page reload dargestellt. Nur die Aktualisierung bereits existierender Readings findet "live" statt. Sollte also kein Problem sein.

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

fhem-mn

#10
Danke ;D, ich finde das sehr gelungen und werde es weiter ausprobieren. Die Installation hat schon mal geklappt.
Welches Konto empfielt sich zu verwenden, das Kinder oder das Parent-Konto (habe ich derzeit gewählt)?
Welche Parameter ließen sich vielleicht noch einstellen bzw. auslesen: Welcher User hat die Switch verwendet? Welches Programm? (Das zeigt die Switch App am Handy an).
Für mich wäre interessant, die Daten so zu bekommen, dass ich das Logfile (mit regex) gut auswerten kann: d.h. Spielzeit heute getrennt nach User und Programm.
Zuletzt noch eine Frage, ließe sich das auch für die XboxOne umsetzen (ich habe 2 Kinder  :o)?

KernSani

Hallo fhem-mn,

willkommen im Forum. Ist ja mutig, dass du dich bei deinem ersten Post gleich an ein als "Alpha-Version" tituliertes Modul wagst ;-)
Das Parent-Konto ist das Richtige, also das, mit dem du dich auch an der App angemeldet hast.
Die Daten die du möchtest kann ich ich definitiv mit einlesen. Ich habe nur gerade keine wirklich zündende Idee, wie ich diese dann vernünftig in Readings darstelle. Ich mach mir mal ein paar Gedankem. Kann aber ein bisschen dauern, bis ich es umgesetzt habe.

Und dir wird in der App aufgefallen sein, dass das alles mit einer gewissen Verzögerung aktualisiert wird. Das wird das Modul nicht besser können, d.h. im Nachhinein auswerten ist ok, quasi in realtime zu steuern welches Kind wieviel spielen darf geht nicht.
XBox habe ich nicht. Gibt es da auch eine "Parental Control" App? Dann geht es wahrscheinlich, es muß sich nur jemand finden, der es bastelt ;-)

Grüße,

Oli 
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

masterpete23


KernSani

Zitat von: masterpete23 am 12 April 2021, 12:21:09
HI, wie ist hierzu der aktuelle Stand?
Aktuelle Stand ist, dass ich das Modul weiterhin persönlich nutze und seit ewigen Zeiten auf der Todo-Liste habe, das mal "rund" zu machen. Anregungen sind immer willkommen.
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

caldir65

Moin,

ist mir aufgefallen beim fhem-Update - es wird eine Fehlermeldung ausgeworfen:Calling /usr/bin/perl ./contrib/commandref_join.pl -noWarnings, this may take a while
*** EN FHEM/98_NSPC.pm: ignoring text due to DOS encoding
*** DE FHEM/98_NSPC.pm: ignoring text due to DOS encoding

Mir ist aber nichts aufgefallen, was soweit nicht (mehr) funktioniert ...

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.