Meine Wohnung weiß wann ich im Bett bin

Moin,
so einen Sensor habe ich noch rum liegen.
Damit kann man gut den Fahrstil von unterschiedlichen Fahrern im Auto erkennen. :wink:
Die Idee den unters Lattenrost zu pappen ist schon nett.
Mich würde interessieren, ob er erkennt, wann Weihnachten rum ist.
Man müsste jedoch die Haustiere und Kinder, die in aller Regelmäßigkeit ins Bett gekrochen kommen, rausrechnen.

Bettsensor → TodoListe

1 „Gefällt mir“

Ich habe 2 Stück davon installiert.

Ohne DMP direkt im ESP Home umgerechnet (danke für den Link @xsasmo )

esphome: 
  name: esphome-web-d21fec
  friendly_name: Bettsensoren

esp32:
  board: nodemcu-32s

.... secrets ...

i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a

sensor:
  - platform: mpu6050
    address: 0x68
    accel_x:
      name: "MPU6050 1 Accel X"
      id: ax1
      unit_of_measurement: m/s²
    accel_y:
      name: "MPU6050 1 Accel Y"
      id: ay1
      unit_of_measurement: m/s²
    accel_z:
      name: "MPU6050 1 Accel Z"
      id: az1
      unit_of_measurement: m/s²
    gyro_x:
      name: "MPU6050 1 Gyro X"
      unit_of_measurement: °/s
    gyro_y:
      name: "MPU6050 1 Gyro Y"
      unit_of_measurement: °/s
    gyro_z:
      name: "MPU6050 1 Gyro Z"
      unit_of_measurement: °/s
    temperature:
      name: "MPU6050 1 68"
      unit_of_measurement: °C
    update_interval: 5000ms
    

  - platform: mpu6050
    address: 0x69
    accel_x:
      name: "MPU6050 2 Accel X"
      id: ax2
      unit_of_measurement: m/s²
    accel_y:
      name: "MPU6050 2 Accel Y"
      id: ay2
      unit_of_measurement: m/s²
    accel_z:
      name: "MPU6050 2 Accel Z"
      id: az2
      unit_of_measurement: m/s²
    gyro_x:
      name: "MPU6050 2 Gyro X"
      unit_of_measurement: °/s
    gyro_y:
      name: "MPU6050 2 Gyro Y"
      unit_of_measurement: °/s
    gyro_z:
      name: "MPU6050 2 Gyro Z"
      unit_of_measurement: °/s
    temperature:
      name: "MPU6050 2 69"
      unit_of_measurement: °C
    update_interval: 5000ms

  - platform: template
    id: roll1
    name: roll1
    accuracy_decimals: 2
    lambda: |-
      return  (atan( id(ay1).state / sqrt( pow( id(ax1).state , 2) + pow( id(az1).state , 2) ) ) * 180 / PI) ;
    update_interval: 5000ms
    unit_of_measurement: °

  - platform: template
    id: pitch1
    name: pitch1
    accuracy_decimals: 2
    lambda: |-
      return  (atan(-1 * id(ax1).state / sqrt(pow(id(ay1).state, 2) + pow(id(az1).state, 2))) * 180 / PI);
    update_interval: 5000ms
    unit_of_measurement: °

  - platform: template
    id: roll2
    name: roll2
    accuracy_decimals: 2
    lambda: |-
      return  (atan( id(ay2).state / sqrt( pow( id(ax2).state , 2) + pow( id(az2).state , 2) ) ) * 180 / PI) ;
    update_interval: 5000ms
    unit_of_measurement: °

  - platform: template
    id: pitch2
    name: pitch2
    accuracy_decimals: 2
    lambda: |-
      return  (atan(-1 * id(ax2).state / sqrt(pow(id(ay2).state, 2) + pow(id(az2).state, 2))) * 180 / PI);
    update_interval: 5000ms
    unit_of_measurement: °

Das Schwanken der Werte Filter ich raus. @Toolmaster

- platform: filter
  name: roll1_filtered
  entity_id: sensor.esphome_web_d21fec_roll1
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 2
      
- platform: filter
  name: roll2_filtered
  entity_id: sensor.esphome_web_d21fec_roll2
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 2
  
- platform: filter
  name: pitch1_filtered
  entity_id: sensor.esphome_web_d21fec_pitch1
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 2
      
- platform: filter
  name: pitch2_filtered
  entity_id: sensor.esphome_web_d21fec_pitch2
  filters:
    - filter: lowpass
      time_constant: 10
      precision: 2

- platform: template
  sensors:
    schlaf_andreas:
      friendly_name: "Schlaf Andreas"
      value_template: >-
        {% if states('sensor.roll1_filtered')|float <= -2 %}
          nicht im Bett
        {% elif states('sensor.roll2_filtered')|float <= -1.3 %}
          Seite
        {% else %}
          Rücken
        {% endif %}

- platform: template
  sensors:
    schlaf_conny:
      friendly_name: "Schlaf Conny"
      value_template: >-
        {% if states('sensor.roll2_filtered')|float <= -2 %}
          nicht im Bett
        {% elif states('sensor.roll2_filtered')|float <= 1.3 %}
          Seite
        {% else %}
          Rücken
        {% endif %}



- platform: history_stats
  type: time
  name: "schlaf Andreas nachts"
  entity_id: sensor.schlaf_andreas
  state: "im Bett"
  start: "{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}"
  end: "{{ now() }}"

- platform: history_stats
  type: time
  name: "schlaf Conny nachts"
  entity_id: sensor.schlaf_conny
  state: "im Bett"
  start: "{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}"
  end: "{{ now() }}"

Mit History-Stats kann ich dann jeden Zustand loggen und mit Apex anzeigen. Hier fehlt allerdings noch das feintuning.

Die Dashboard sind unspektakulär, da wir ja noch nicht viel geschlafen haben.

Die Befestigung ist mit diesen dicken doppelseitigen wieder ablösbaren Klebestreifen gemacht, die man eh für allerhand Batterie-Taster und so Zeugs braucht.


4 „Gefällt mir“

Wie sind inzwischen die Erfahrungen mit der Möglichkeit der Auswertung / Genauigkeit der Ergebnisse?

Ich habe gestern einen Aqara FP2 ausgepackt, der seit Monaten hier herum lag. Und dieser steht aktuell testweise im Schlafzimmer.

Hier habe ich das Bett als Zone eingerichtet. Und mit max. 2 Sekunden nicht Erkennung, wobei der Sensor auch noch nicht optimal ausgerichtet (nicht einmal festgeschraubt) ist, ist die Erkennung auf den ersten Blick sehr zuverlässig.

Das Teil bietet auch eine Schlafüberwachung an, die aber nur Anwesenheit und nicht Schlaf an HA überträgt.

Zu sagen wann ich im Bett bin, ist also keine Schwierigkeit mehr. Nun will ich wissen wann im besten Fall wie ich schlafe.

Kann dies der Sensor (verlässlich) erkennen? Alternative wäre aktuell die Überlegung zu Withings zu greifen, welcher mit rund 150 € und Cloud doch eine andere Hausnummer ist…

Sorry für die etwas verspätete Antwort, aber über die Ostertage habe ich endlich mal wieder etwas Zeit.
Mir persönlich reicht meine Umsetzung mit dem Gyrosensor vollkommen.

Hier sieht man gut die Einschlafphase, die Zeiten an denen ich mich umgedreht bzw. bewegt habe, wann ich kurz im Bad war (kurz vor 4 Uhr) und wann ich aufgewacht und aufgestanden bin.

Das ist alles ganz interessant, doch letztendlich geht es mir eigentlich nur darum, dass HA weiss wann ich im Bett bin und wann nicht um andere Automationen triggern zu können.

Um meine Schlafqualität zu überwachen nutze ich Autosleep mit der Apple Watch wenn ich das wissen möchte (kommt aber selten vor und verwende ich nur, wenn mir der Gyrosensor anzeigt, dass ich ein paar Nächte unruhig geschlafen habe).

LG und noch einen schönen Osterfeiertag :slight_smile:

Chris

1 „Gefällt mir“

Hallo zusammen,

ich hatte mir dieses Projekt schon vor einiger Zeit mal abgespeichert, bin aber jetzt erst dazu gekommen es auch wirklich umzusetzen. Und zwar habe ich das ganze mit einem ESP32 gemacht. Dazu den Code hier zusammen kopiert und der sieht jetzt wie folgt aus:

esphome:
  name: schlafsensor
  friendly_name: Schlafsensor

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:
  - platform: esphome
    password: "xxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Schlafsensor Fallback Hotspot"
    password: "xxx"

captive_portal:

i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a

sensor:
  - platform: mpu6050
    address: 0x68
    accel_x:
      name: "MPU6050 1 Accel X"
      id: ax1
      unit_of_measurement: m/s²
    accel_y:
      name: "MPU6050 1 Accel Y"
      id: ay1
      unit_of_measurement: m/s²
    accel_z:
      name: "MPU6050 1 Accel Z"
      id: az1
      unit_of_measurement: m/s²
    gyro_x:
      name: "MPU6050 1 Gyro X"
      unit_of_measurement: °/s
    gyro_y:
      name: "MPU6050 1 Gyro Y"
      unit_of_measurement: °/s
    gyro_z:
      name: "MPU6050 1 Gyro Z"
      unit_of_measurement: °/s
    temperature:
      name: "MPU6050 1 68"
      unit_of_measurement: °C
    update_interval: 5000ms      

  - platform: template
    id: roll1
    name: roll1
    accuracy_decimals: 2
    lambda: |-
      return  (atan( id(ay1).state / sqrt( pow( id(ax1).state , 2) + pow( id(az1).state , 2) ) ) * 180 / PI) ;
    update_interval: 5000ms
    unit_of_measurement: °

  - platform: template
    id: pitch1
    name: pitch1
    accuracy_decimals: 2
    lambda: |-
      return  (atan(-1 * id(ax1).state / sqrt(pow(id(ay1).state, 2) + pow(id(az1).state, 2))) * 180 / PI);
    update_interval: 5000ms
    unit_of_measurement: °

Das liefert mir folgende Entitäten in HomeAssistant:
Bildschirmfoto vom 2024-07-07 19-47-54

Aber wo kriegt ihr denn jetzt so tolle Grafiken her?
Bei mir ist das einfach nur ein wildes hin und her ohne erkennbare Systematik. Insbesondere wenn keiner im Bett liegt hätte ich ja eine mehr oder weniger gerade Linie erwartet.

Wo liegt mein Fehler?

Beste Grüße

Moin,

also dickere Matratzen geben schlechtere Werte, wenn dein Sensor am Lattenrost ist.
Zu leicht darfst du auch nicht sein.
Wir haben 18cm dicke Matratzen und 6cm Topper drauf bei mir ist mit 75kg kaum was sinnvolles mehr zu messen.
Die Winkeländerung an der Seite des Lattenrostes ist größer als in der Mitte.
Beträgt aber auch dort manchmal nur 1 Grad.
Grundsätzlich sollten es Federleisten sein, Rollroste kannst du vergessen.
Der Sensor sollte am Körperschwerpunkt liegen.
Ein Hebel oder andere geeignete Übersetzung brächte ein breiteres Spektrum zum Messen.
Das Gezappel kann man mit der der Filterfunktion eingrenzen. Schau in meinen Beitrag oben, da nutze ich einen Filter.

Grüße, Andreas

Moin,

ich habe den Sensor exakt so nachgebaut und muss sagen das funktioniert wirklich sehr gut und verlässlich.

Ich habe nur ein Problem mit dem Zeitsensor…
Er “behält” die Zeit immer bis 0:00Uhr und resettet sich dann.
Das verfälscht die Werte natürlich. Wie kann ich das ändern, dass er z.B. mittags um 12:00 resettet, oder dann wenn ich mich ins Bett lege?

Falls du eine bestimmt Zeit (z.B. 22-6 Uhr) tracken möchtest setze den Timer so:

start: “{{ now().replace(hour=22, minute=0, second=0) }}”
end: “{{ now().replace(hour=6, minute=0, second=0) + timedelta(days=1) }}”

Hallo, das Thema ist zwar schon etwas älter, aber ich wollte auch noch eine Möglichkeit der “Bett Belegt Erkennung” einbringen.
Ich habe mir bei dem bekannten Chinesen einen Autositz Druck Sensor und einen Zigbee Wasser Sensor bestellt. (siehe Bilder)
Den Kopf am Wassersensor entfernt und dann mit den zwei Kabeln des Drucksensors verbunden.
Mit einer Kunstoffplatte auf das Lattenrost wird die Bettbelegung in HA als Wassererkennung angezeigt ( kann natürlich umbenannt werden )
Screenshot 2025-01-24 at 07-49-51 Ewelink zigbee 3 0 wassers ensor alarm wasser leck detektor hochwasser alarm überlauf sicherheits alarmsystem funktioniert mit zigbee gateway - AliExpress 30
Screenshot 2025-01-24 at 07-49-21 Auto Sitz Druck Sensor Universal Sicherheit Gürtel Warnung Erinnerung Pad Besetzten Sitzt Alarm Zubehör 2 Typ - AliExpress 34

5 „Gefällt mir“