Umstieg iobroker - HA - Script für Zeitzähler für "Onlinezeit"

Hallo zusammen,

ich möchte schon seit langem auf HA umsteigen, aber meine umfangreichen in Blockly gebauten Scripte in iobroker und meine Probleme mit dem “Nachbau” in HA haben das bisher verhindert.
Um den letzten Schritt gehen zu können, brauche ich Hilfe bei dem gleich folgenden Blockly und die Hilfe eines versierten Mitglieds hier. Vielleicht findet sich ja jemand :slight_smile:

Zur Erklärung: Die PC-Zeit meiner Kinder wird bei mir durch iobroker geregelt, wo ich entsprechende Zeiten vorgeben und die PCs beim erreichen der Laufzeit quasi abgeschaltet werde. Die Kinder werden 10+5 Minuten vorab informiert und können sich entsprechend von den Freunden verabschieden und die PCs entsprechend herunterfahren. Falls sie das nicht tun, geht der PC einfach aus… ja, soll man nicht machen, aber was solls.
Sollten sich die Kinder mehr PC-Zeit “verdient” haben, kann ich die Zeiten über mein Dashboard entsprechend verlängern. Aber das ist erstmal zweitrangig. Das bastle ich sobald das Grundkonzept auch in HA funktioniert. Ich scheitere in HA an der Zählung/Berechnung der “verbrauchten” Zeit.


geht bestimmt alles auch eleganter, aber ist Marke Eigenbau, bzw umfunktioniert und für mich angepasstes “Waschmaschienenscrip” und funktioniert für mich in iobroker, seit 3 Jahren so. Solltet das jemand eleganter können, bin ich für Vorschläge offen. Ich bastle gern, aber kann leider nicht wie ein Programmierer denken :confused:

Ich habe mich in HA an einer Automation versucht, die schaut ob der PC / die IP des PCs 1 Minute verbunden ist, die dann einen Helfer um 1 erhöht. Das funktioniert aber nicht. Die Automation löst 1x aus (wenn das Gerät/die IP verbunden ist) und dann halt nicht mehr. Ich habe eine Wiederholung eingebaut der Abfrage eingebaut, aber da sich der Status ja nicht ändert (Verbunden), zählt der Zähler nicht hoch und ich steh auf dem Schlauch.

Kann und mag mir jemand helfen?

Ob der Rechner eingeschaltet ist, überprüftet Du über einen Ping.
In dem Fall die Ping Integration.

Wenn ein Rechner online geht, kannst Du einen Timer starten (Helfer), die Timer Laufzeit kannst Du variabel gestalten.

Wenn Timer abläuft, schaltest Du den Rechner aus, in dem Fall wahrscheinlich einen Switch, richtig.

Hier mal ein Bsp.

  • Ping Sensor des Computers: binary_sensor.computer

  • Helfer Timer: timer.onlinezeit

  • Helfer Input Number als Zeitvorgabe in Minuten für den Timer: nput_number.onlinezeit_vorgabe

  • Geht der Rechner Online, wird der Timer gestartet. Fortgeführt wenn pausiert oder neu gestartet mit der Zeit von Input Number

  • Geht der Rechner Offline, während der Timer noch Läuft, wird der Timer pausiert.

  • Endet der Timer, wird die Benachrichtigung abgesetzt und 10 min später der switch ausgeschaltet

  • Um 00:00 Uhr wird Timer abgebrochen. So das der Timer am nächsten Tag in seiner vollen Länge starten kann, wenn der Rechner wieder Online ist.

Die Benachrichtigung kannst Du wie im Bsp. mit Ablauf des Timer ausgeben und mit 10 Min Verzögerung dann den Switch ausschalten. Dann wäre die Onlinezeit 10 min länger als die Vorgabe.
Oder Du tust den Timer 10 min kürzer als die Vorgabe laufen.

duration: "{{ (states('input_number.onlinezeit_vorgabe') | int * 60) - (10*60) }}"
alias: Onlinezeit
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.computer
    from: "off"
    to: "on"
    id: online
  - platform: state
    entity_id:
      - binary_sensor.computer
    from: "on"
    to: "off"
    id: offline
  - platform: time
    at: "00:00:00"
    id: reset
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.onlinezeit
    id: ausschalten
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - online
        sequence:
          - if:
              - condition: state
                entity_id: timer.onlinezeit
                state: paused
            then:
              - service: timer.start
                metadata: {}
                data: {}
                target:
                  entity_id: timer.onlinezeit
            else:
              - service: timer.start
                metadata: {}
                data:
                  duration: "{{ states('input_number.onlinezeit_vorgabe') | int * 60 }}"
                target:
                  entity_id: timer.onlinezeit
      - conditions:
          - condition: trigger
            id:
              - offline
          - condition: state
            entity_id: timer.onlinezeit
            state: active
        sequence:
          - service: timer.pause
            metadata: {}
            data: {}
            target:
              entity_id: timer.onlinezeit
      - conditions:
          - condition: trigger
            id:
              - ausschalten
          - condition: state
            entity_id: switch.computer
            state: "on"
        sequence:
          - service: tts.speak
            metadata: {}
            data:
              cache: true
              media_player_entity_id: media_player.bad
              message: Achtung! Der PC wird in 10 Minuten ausgeschaltet
            target:
              entity_id: tts.piper
          - delay:
              hours: 0
              minutes: 10
              seconds: 0
              milliseconds: 0
          - service: switch.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: switch.computer
      - conditions:
          - condition: trigger
            id:
              - reset
        sequence:
          - service: timer.cancel
            metadata: {}
            data: {}
            target:
              entity_id: timer.onlinezeit
mode: single

Gruß
Osorkon

Moin,

Zu dem, was @Osorkon da wiedermal großartig erstellt hat, bin ich jemand, der das Rad nicht immer neu erfindet und schaut, ob es da nicht schon was gibt, dabei bin ich auf dieses Blueprint gestoßen

Vielleicht ist da ja was für Dich dabei!

VG
Bernd

Vielen Dank schon mal für die Anregungen und Tipps. Ich werde mir das in Ruhe anschauen und dann Rückmeldung geben!

ok, nachdem ich mir das heute mal mit Zeit anschauen konnte und nachdem ich Osorkons Ansatz ausprobiert und halbwegs nachvollziehen konnte, habe ich meine Lösung zusammenbasteln können!

Mein Zähler zählt jetzt munter jede Minute +1 und ich kann weiterbasteln! Vielen Dank!

alias: Kind1_PC_Zeitzähler
description: ""
trigger:
  - type: connected
    platform: device
    device_id: 3bf73bf7306e0ebe6d8727f8f2770b12
    entity_id: d62d50d93cf40384491f69e56ad33cf4
    domain: binary_sensor
    for:
      hours: 0
      minutes: 0
      seconds: 1
condition: []
action:
  - repeat:
      sequence:
        - delay:
            hours: 0
            minutes: 1
            seconds: 0
            milliseconds: 0
        - service: counter.increment
          metadata: {}
          data: {}
          target:
            entity_id: counter.kind1_pc_verbrauchte_zeit
      until:
        - type: is_not_connected
          condition: device
          device_id: 3bf73bf7306e0ebe6d8727f8f2770b12
          entity_id: d62d50d93cf40384491f69e56ad33cf4
          domain: binary_sensor
          for:
            hours: 0
            minutes: 0
            seconds: 5
mode: single

Um die tägliche Online Zeit ermitteln, dazu kannst Du aber auch ganz einfach einen History stats Sensor nutzen. Warum ich diesen nicht gleich zu Beginn ins Spiel gebracht habe, muss wohl am meinem fortgeschrittenen Alter liegen. :see_no_evil:

Deine Automatisierung hat den Nachteil, dass dieser während der gesamten Online Zeit läuft und ein Neustart von Home Assistant diese unterbricht. Auch musst Du manuell oder durch eine zusätzliche Automatisierung, jeden Tag den Zähler auf 0 setzen.

Gruß
Osorkon