FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Clyde am 09 Dezember 2018, 14:19:46

Titel: Internetbudget der Kinder per FHEM regeln
Beitrag von: Clyde am 09 Dezember 2018, 14:19:46
Aus Gründen "möchte" ich den Internetzugang der Kinder leistungsorientiert zuteilen.
Über die Fritzbox Möglichkeiten bin ich etwas genervt.

Möglichkeit A: GastWLAN
ist zwar schaltbar per FHEM, aber die Geräte landen in einem nicht mehr erreichbaren Subnetz, weshalb sie von der vorhandenen Haussteuerung abgetrennt werden. Das finde ich unschön.

Möglichkeit B: Tickets
Zugang per Fritzbox-Tickets ist mit viel Handarbeit verbunden, da sie sich per FHEM nicht auslesen lassen.

Möglichkeit C: externe Geräte
Da schreckt mich momentan der Konfigurationsaufwand und das nicht vorhandene Wissen ab. Wäre aber vielleicht die einzige Alternative.

Wie macht ihr das mit mehreren Kindern?
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: CoolTux am 09 Dezember 2018, 15:55:08
Ich beschränke per iptables Packetregeln und squidguard Proxy. Die entsprechenden Änderungen erfolgen durch FHEM. Je nach Tageszeit, Wochentag und Feier/Ferientage.
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Mundus am 09 Dezember 2018, 22:01:14
Hi,
Ich habe für meinen Fernseher ein Zeitbudget eingerichtet. Wenn gewünscht, kann ich das Konstrukt posten.

Das lässt sich problemlos auf verschiede Geräte adaptieren (feste IP vorausgesetzt).

Gruß Mundus
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Clyde am 10 Dezember 2018, 17:38:55
Habe gerade entdeckt, das das Fritzboxmodul immer ein Zeitticket als Reading bereitstellt. Damit hab ich dann keine Handarbeit mehr und kann es per FTUI anzeigen bzw. AMAD ansagen lassen.

Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Morgennebel am 10 Dezember 2018, 18:03:57
Warum machst Du das nicht auf dem Endgerät?

Android: Family Link mit Zeitbudget
iOS: Kindersicherung
Linux: CPU-Zeit limitieren für User-Account
Windows: gibts bestimmt auch...

Ciao, -MN
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: KernSani am 10 Dezember 2018, 21:23:23
Zitat von: Morgennebel am 10 Dezember 2018, 18:03:57
Warum machst Du das nicht auf dem Endgerät?
Ich mache es z.Z auf dem Endgerät, bin aber auch noch am grübeln, wie man das zentral hinbekommt. Heute werden z.B. IPad und Nintendo je auf eine halbe Stunde an Wochentagen beschränkt. Manchmal wollen die Jungs aber gerne länger an der Nintendo zocken und verzichten aufs Ipad, das muss ich dann manuell schalten (nachdem sie mich bei der Arbeit angerufen haben). Schöner wäre es daher eine Stunde zentral zu vergeben und dann ist egal welches Endgerät... Dazu fehlt mir aber noch einiges (eigentlich kann mein FHEM in der Hinsicht noch garnichts)


Gesendet von iPhone mit Tapatalk
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Mundus am 10 Dezember 2018, 22:17:18
Hi, das würde bei meiner Lösung auch gehen.gleichwohl wäre es IP basiert. Heißt, bei zwei Benutzern, die sich ihre Zeit teilen, müsstest du noch Ideen einbringen....

Gruß

Mundus
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: KernSani am 10 Dezember 2018, 23:26:07
Zitat von: Mundus am 09 Dezember 2018, 22:01:14
Wenn gewünscht, kann ich das Konstrukt posten.
Poste doch mal... Vielleicht kann ich es tatsächlich für meine Zwecke adaptieren.
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Clyde am 11 Dezember 2018, 09:10:33
Die Kinder haben ein eigenes Profil, wo morgens und abends immer ne Stunde frei ist. Dazwischen können sie sich Tickets mit "Talern" kaufen. Die Taler müssen sie sich "erarbeiten". (Lernen, Sport, Zimmer aufräumen, ...)
Das Taler-Budget wird per FTUI Oberfläche geführt, wo sie auch die Tickets kaufen können.

Weiterer unschätzbarer Vorteil:
Der Ticket-Taler-Preis variert dank FHEM  ;)
Abends wirds teurer. Morgens wieder günstiger.
Und auch bzgl. "Nachfrage" ändert sich der Preis.

Dank des Fritzbox Moduls kann ich das gut automatisieren.

Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: JoWiemann am 11 Dezember 2018, 12:43:04
Hm, Morgens zwischen 06:00 und 07:00 willst Du nicht gestört werden  ;).  Und Abends zwischen 19:00 und 20:00 in Ruhe Nachrichten sehen oder so.

Grüße Jörg
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: raiderxxl am 11 Dezember 2018, 15:14:56
Hi,

Bei mir frisst das iPad der kleinen das Kontigent auf, da das Gerät ja ständig online ist.

Wie macht ihr das?

Grüßle

Pascal
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: tomster am 11 Dezember 2018, 16:05:05
Zitat von: Clyde am 11 Dezember 2018, 09:10:33
Die Kinder haben ein eigenes Profil, wo morgens und abends immer ne Stunde frei ist. Dazwischen können sie sich Tickets mit "Talern" kaufen. Die Taler müssen sie sich "erarbeiten". (Lernen, Sport, Zimmer aufräumen, ...)
Das Taler-Budget wird per FTUI Oberfläche geführt, wo sie auch die Tickets kaufen können.

Weiterer unschätzbarer Vorteil:
Der Ticket-Taler-Preis variert dank FHEM  ;)
Abends wirds teurer. Morgens wieder günstiger.
Und auch bzgl. "Nachfrage" ändert sich der Preis.

Dank des Fritzbox Moduls kann ich das gut automatisieren.

Das klingt interessant, wenn auch mit viel Spielerei ;-)
Prinzipiell würd mich aber die Umsetzung schon interessieren...
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Clyde am 11 Dezember 2018, 16:08:23
Es geht darum, nicht ständig diskutieren zu müssen. Ich kann dann eher mal großzügig sein.

Auch das iPad kann an der Sperre der Fritzbox nicht vorbei oder hat es Mobilfunk? Du mußt dem Gerät in der FB ein Profil zuweisen und in diesem dann die Zeit einschränken. Darüber hinaus mit Tickets arbeiten.
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Mundus am 12 Dezember 2018, 00:02:48
Komme leider erst morgen dazu, meine Lösung zu posten. Sorry.
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Det20 am 12 Dezember 2018, 14:28:58
Zitat von: Clyde am 10 Dezember 2018, 17:38:55
Habe gerade entdeckt, das das Fritzboxmodul immer ein Zeitticket als Reading bereitstellt. Damit hab ich dann keine Handarbeit mehr und kann es per FTUI anzeigen bzw. AMAD ansagen lassen.

Meinst du den einmaligen, 6 stelligen Code? Wo finde ich das Reading?

Edit: userTicket01. Wie geil.
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: tomster am 12 Dezember 2018, 14:37:56
Ganz unten im Fritzbox Device userticket01
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Det20 am 12 Dezember 2018, 14:42:02
 :)
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Clyde am 13 Dezember 2018, 09:01:51
Ja genau den meine ich. Das eröffnet Möglichkeiten...
Titel: Antw:Internetbudget der Kinder per FHEM regeln
Beitrag von: Mundus am 16 Dezember 2018, 14:07:53
Hallo,

leider habe ich erst jetzt Zeit mein Konstrukt (evtl. umständlich) darzustellen. Mein Wunsch war, dass unser Fernseher nach einer bestimmten Zeit (Budget) ausgeht. Das Budget sollte zwischengespeichert werden und erhöht als auch reduziert werden können.

Zunächst habe ich den Fernseher in FHEM eingebunden und mittels presence überwacht, welchen Zustand er hat. Sobald Presence einen neuen Status vom Fernseher empfängt, wird ein Notify ausgelöst
Zitatdefmod nt_SamsungTV notify pr_SamsungTV:.* {\
   my $prSamsung = Value('pr_SamsungTV');;\
   my $readTimerTV = ReadingsVal("dTimerTV","TV","off");;\
   if ($prSamsung eq "present") {\
      fhem "setstate SamsungTV POWERON";;\
      if ($readTimerTV eq "off"){\
         fhem "setreading dTimerTV TV on";;\
      }\
   } else {\
      fhem "setstate SamsungTV POWEROFF";;\
      if ($readTimerTV eq "on") {\
         fhem "setreading dTimerTV TV off";;\
      }\
   }\
}
attr nt_SamsungTV group Helfer
attr nt_SamsungTV room Wohnzimmer
attr nt_SamsungTV verbose 0

Hinweis: Die Wenn-Dann-Abfragen $readTimerTV eq "on" bzw. "off" habe ich eingebaut, da das Presence-Modul zwischenzeitlich neue Status meldet, obgleich diese nicht eingetreten sind.

Dieses o.g. Notify schreibt in den Dummy "dTimerTV" den Status des Fernsehers. Das Dummy speichert zusätzlich das Zeitbudget und hat einen Ein- und Ausschalter.
Hier das list von dem Dummy
ZitatInternals:
   NAME       dTimerTV
   NR         98
   STATE      off
   TYPE       dummy
   READINGS:
     2018-12-16 11:11:35   TV              off
     2018-12-16 05:00:00   ZeitBudgetTV    00:30:00
     2018-12-16 05:01:00   state           off
Attributes:
   devStateIcon off:ios-off:on on:ios-on-for-timer-green:off
   group      TimerTV
   room       Wohnzimmer
   setList    state:on,off

Der Dummy wird von zwei Notifys überwacht. Erstens wenn der Fernseher eingeschaltet wird
Zitat
Internals:
   DEF        dTimerTV:TV:.* {
   my $Timer = "dTimerTV";
   Log3 $Timer,3,"Event lautet $EVENT";
   Log3 $Timer,3,"EventPart1 lautet $EVTPART1";
   my $DevAnAus = "SamsungTV";
   my $tempValue = Value("$Timer");
   if ($tempValue eq "on"){
      if ($EVTPART1 eq "on"){
         timerAnlegen($Timer,$DevAnAus);
         }
      }
   if ($EVTPART1 eq "off") {
         timerAusschalten ($Timer);
      }
}
   NAME       nt_TV_AnAus_Timer
   NOTIFYDEV  dTimerTV
   NR         99
   NTFY_ORDER 50-nt_TV_AnAus_Timer
   REGEXP     dTimerTV:TV:.*
   STATE      2018-12-16 11:11:35
   TYPE       notify
   READINGS:
     2018-08-13 23:27:36   state           active
Attributes:
   group      TimerTV
   room       Wohnzimmer
und zweitens, wenn der Timer Ein-/bzw. Ausgeschaltet wird
Zitat
Internals:
   DEF        dTimerTV.* {
   my $Timer = "dTimerTV";
   my $DevAnAus = "SamsungTV";
   my $readTimer = ReadingsVal("$Timer","TV","on");
   
   #if ($valueDevAnAus eq "on"){
   if ($readTimer eq "on"){
      if ($EVENT eq "on"){
         timerAnlegen($Timer,$DevAnAus)
         }
   }
   if ($EVENT eq "off") {
         timerAusschalten ($Timer)
         }
}
   NAME       nt_TV_Timer_AnAus
   NOTIFYDEV  dTimerTV.*
   NR         102
   NTFY_ORDER 50-nt_TV_Timer_AnAus
   REGEXP     dTimerTV.*
   STATE      2018-12-16 11:11:35
   TYPE       notify
   READINGS:
     2018-08-13 23:27:36   state           active
Attributes:
   group      TimerTV
   room       Wohnzimmer

Hinweis: Diese beiden Notifys können sicherlich zusammengefasst werden, das war mir aber zu unübersichtlich

Die beiden Notifys rufen ein Script auf, in dem die weitere Abhandlung stattfindet. Das Skript folgt hier
Zitatpackage main;
use strict;
use warnings;
use POSIX;

my $nameValTimer = "ZeitBudgetTV";
######################################################################################
sub
timerUtil_Initialize($$)
{
  my ($hash) = @_;
}
###################################################################################
#################Funktion zum Anlegen eines Timers
sub
timerAnlegen($$){
   #Übergabe dummy_Timers (u.a. ist hier BugetZeit gespeichert) und des zu schaltenden Device
   my ($deviceTimer,$deviceAnAus) = @_;
   
   #at Name wird festgelegt
   my $atTimer = "at_$deviceTimer.timer";
   #Werte aus dummy_Timer auslesen (BudgetZeit, Attribute)
   my $ausschaltzeit = ReadingsVal("$deviceTimer","$nameValTimer","00:00:00");
   my $attrRoom = AttrVal($deviceTimer,"room","");
   my $attrGroup = AttrVal($deviceTimer,"group","");
   
   #at anlegen
   fhem "define $atTimer at +$ausschaltzeit set $deviceAnAus POWEROFF;;setreading $deviceTimer $nameValTimer 00:00:00";
   fhem "attr $atTimer room $attrRoom";
   fhem "attr $atTimer group $attrGroup";
}
sub
timerAusschalten($){
   #Übergabe dummy_Timers (u.a. ist hier BudgetZeit gespeichert)
   my ($deviceTimer) = @_;
   #at Name wird festgelegt
   my $atTimer = "at_$deviceTimer.timer";
   
   #prüfen ob at erstellt wurde
   if (Value($atTimer)ne ""){
      #errechnen des neuen BudgetWertes (Min = 0)
      my $currentOffTime = InternalVal("$atTimer","TRIGGERTIME",0)-time;
      $currentOffTime =~ s/\.\d+//;
      if ($currentOffTime < 0){
         $currentOffTime = 0;
         }         
      my $umgerechneterWert = sek2hhmmss($currentOffTime);
      #zurückschreiben des neuen BudgetWertes
      fhem "setreading $deviceTimer $nameValTimer $umgerechneterWert";
      #löschen des at
      fhem "delete $atTimer";
      #Return Wert
      return "on";
   }
}
sub
timerPlusMinus($$$){
#Übergabe dummy_Timers (u.a. ist hier BugetZeit gespeichert), des zu schaltenden Device und + bzw -
my ($deviceTimer,$deviceAnAus,$plusMinus) = @_;
my $timeValue = 600;

#alten Timer Ausschalten (wenn an, dann $var = on)
my $timerExists = timerAusschalten($deviceTimer);
my $tTimer = hhmmss2sek(ReadingsVal($deviceTimer,$nameValTimer,"00:00:00"));

#Bei Plus wird Zeit addiert; bei Minus subtrahiert, Min Wert ist 0!
if ($plusMinus eq "plus") {
   $timeValue=sek2hhmmss($tTimer + $timeValue);
} elsif ($plusMinus eq "minus") {
   $timeValue=$tTimer - $timeValue;
   if ($timeValue < 0) {
      $timeValue = 0;
   }
   $timeValue=sek2hhmmss($timeValue);
}   

#neue Zeit zurückschreiben
fhem "setreading $deviceTimer $nameValTimer $timeValue";
#Timer aktivieren, sofern Dev und Timer on
if ($timerExists eq "on") {
   timerAnlegen($deviceTimer,$deviceAnAus);
   }
}
1;

Hinweis: Für das formatieren der Zeiten habe ich ein zweites Skript
Zitat
package main;
use strict;
use warnings;
use POSIX;
######################################################################################
sub
myTimeUtil_Initialize($$)
{
  my ($hash) = @_;
}
###################################################################################
# Funktion zur Berechnung von Sekunden in das Format hh:mm:ss

sub
sek2hhmmss($) {
   
   my ($sektime) = @_;
   
   my $m = int $sektime/60;
   my $s = $sektime - ($m * 60);
   my $h = int $m / 60;
   $m = $m - ($h *60);
   
   my $umgerechneterWert = sprintf("%02d:%02d:%02d",$h,$m,$s);
   return $umgerechneterWert;
}
sub hhmmss2sek($) {
   my ($hhmmsstime) = @_;
   my @time = split (/:/,$hhmmsstime);
   my $h = shift @time;
   my $m = shift @time;
   my $s = shift @time;
   
   my $umgerechneterWert = $h * 3600 + $m * 60 + $s;
   return $umgerechneterWert;
}
1;

So, damit sind wir schon fast am Ende meines Konstruktes. Es fehlt lediglich das Erhöhen und reduzieren des Zeitbudgets. In dem o.g. Skript ist bereits eine Funktion abgebildet, die die tatsächliche Berechnung durchführt. Auf FHEM habe ich dafür dann noch einen Dummy und ein Notify angelegt.
ZitatInternals:
   NAME       dTimerTV_p_m
   NR         100
   STATE      plus
   TYPE       dummy
   READINGS:
     2018-10-11 07:41:49   state           plus
Attributes:
   devStateIcon plus:control_plus@green minus:control_minus@red
   group      TimerTV
   room       Wohnzimmer
   setList    state:plus,minus
   webCmd     plus:minus
Und das Notify
ZitatInternals:
   DEF        dTimerTV_p_m.* {
   my $Timer = "dTimerTV";
   my $DevAnAus = "SamsungTV";
   my $dTimerOn = Value("$Timer");

   timerPlusMinus($Timer,$DevAnAus,$EVENT);
}
   NAME       nt_TV_Timer_p_m
   NOTIFYDEV  dTimerTV_p_m.*
   NR         101
   NTFY_ORDER 50-nt_TV_Timer_p_m
   REGEXP     dTimerTV_p_m.*
   STATE      2018-10-11 07:41:49
   TYPE       notify
   READINGS:
     2018-08-13 23:27:36   state           active
Attributes:
   group      TimerTV
   room       Wohnzimmer

So und damit ist es schon fertig.

Evtl. hilft dir dies weiter und du kannst meine Lösung für dein Problem modifizieren und nutzen.

Gruß

Mundus