Canapé connecté

Bonjour,

je viens présenter mon canapé connecté DIY

basé sur cette idée :

c’est un simple condensateur variable fait a partir d’une feuille de papier A4 90g et de 2 feuilles de papier métal (épais)
un 4093 qui va faire monostable et créer une fréquence qui va varier en fonction de la valeur du condensateur, donc si on est assis ou non
enfin un Wemos qui va mesurer la fréquence et déduire si on est assis ou non

et le schéma :

J’ai fait quelques tests avec différents types de paper mail le 90g classique reste le meilleur, l’ensemble dans une pochette plastique, un fil maintenu sur chaque feuille de métal
Pour le moment il fonctionne depuis plus d’1 mois, après quelques réglages de départ, cela me semble assez fiable compte tenu du prix des capteurs !

je posterai le code dans un prochain message
si cela vous intéresse, n’hésitez pas a me demander des détaills

Stéphane

8 « J'aime »

Excellente idée !!!

J’adore l’idée !!!
En fait c’est surtout la manière de construire le capteur qui m’a bluffé, comme quoi avec pas grand-chose on peut sortir des données. Reste maintenant à savoir quoi faire avec ces infos, pas vraiment d’idée pour le moment hormis en soirée, ça peut être cool pour les copains :slight_smile:

Hello

A savoir combien de temps tu squatte le canapé …
A savoir avec le poids qui est assis et à lancé ta serie prefere sur netflix.
:grinning: :grinning:

1 « J'aime »

Mettre en pause ladite série quand tu vas faire un tour aux toilettes !

2 « J'aime »

Ça sent l’ancien avec ce discours ! :joy::joy::joy:

2 « J'aime »

J’ai pas parlé d’incontinence non plus hein :sweat_smile: il n’y a pas de détecteur de fuite dans ce projet :yum:

1 « J'aime »

Pour les utilisations, pour le moment je bloque l’extinction de la télé tent que je suis assis
Mais j’ai aussi prévu un message pour ma fille quand elle est seule à la maison et assise sur le canapé depuis 1h
Et allumer la télé pour ma femme le lundi quand elle fais sa pause

Après on peut trouver une multitude d’idées

Par contre ce n’est pas assez précis pour savoir qui est assis !

allé, un peu de code :

esphome:
  name: canape01

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"
  services:
    - service: play_rtttl
      variables:
        song_str: string
      then:
        - rtttl.play:
            rtttl: !lambda 'return song_str;'


ota:
  password: "xxx"

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

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

captive_portal:


#bipbip montant >> levé
#leve:d=4,o=5,b=160:16c6,16f6
#bipbip descendant >> assis
#assis:d=4,o=5,b=160:16f6,16c6





sensor:
  - platform: pulse_width
    pin: D3
    internal: true
#    device_class: "frequency"
    unit_of_measurement: "kHz"
    icon: "mdi:sine-wave"
    update_interval: 3s
    name: Pulse Width Sensor Droite
    filters:
    - lambda: return ( 1 / (x*2) ) / 1000;
    - median:
        window_size: 5
        send_every: 3
        send_first_at: 3
    on_value_range:
#      - above: 0
#        below: 0.2
#        then:
#          - switch.turn_off: presence_canape_dr_sw
#          - switch.turn_off: presence_canape_dr_led
#          - text_sensor.template.publish:
#              id: canape_tele_dr
#              state: "incident"    
#      - above: 0
      - below: 2.2
        then:
          - if:
              condition:
               # lambda: 'return id(presence_canape_dr_sw).state = 0;'
                - switch.is_off: presence_canape_dr_sw
              then:
                - switch.turn_on: presence_canape_dr_sw
                - switch.turn_on: presence_canape_dr_led
                - text_sensor.template.publish:
                    id: canape_tele_dr
                    state: "occupé"
                - rtttl.play: 'assis:d=4,o=5,b=160:16f6,16c6'
#              else:
#                 - logger.log: 'état déjà occupé sur canapé droite ...'
      - above: 2.8
        below: 40
        then:
          - if:
              condition:
                #lambda: 'return id(presence_canape_dr_sw).state = 1;'
                - switch.is_on: presence_canape_dr_sw
              then:
                - switch.turn_off: presence_canape_dr_sw
                - switch.turn_off: presence_canape_dr_led
                - text_sensor.template.publish:
                    id: canape_tele_dr
                    state: "libre"
                - rtttl.play: 'leve:d=4,o=5,b=160:16c6,16f6'
#              else:
#                - logger.log: 'état déjà libre sur canapé droite ...'
#      - above: 50
#        below: 100
#        then:
#          - switch.turn_off: presence_canape_dr_sw
#          - switch.turn_off: presence_canape_dr_led
#          - text_sensor.template.publish:
#              id: canape_tele_dr
#              state: "incident"

  - platform: pulse_width
    pin: D2
    internal: true
#    device_class: "frequency"
    unit_of_measurement: "kHz"
    icon: "mdi:sine-wave"
    update_interval: 3s
    name: Pulse Width Sensor Centre
    id: pulse_width_sensor_centre
    filters:
    - lambda: return ( 1 / (x*2) ) / 1000;
#    - quantile:
#        window_size: 5
#        send_every: 3
#        send_first_at: 1
#        quantile: .8
    - median:
        window_size: 5
        send_every: 3
        send_first_at: 3
    on_value_range:



#      - above: 0
#        below: 0.2
#        then:
#          - switch.turn_off: presence_canape_ce_sw
#          - switch.turn_off: presence_canape_ce_led
#          - text_sensor.template.publish:
#              id: canape_tele_ce
#              state: "incident"
#          - logger.log: 'return id(pulse_width_sensor_centre).state'
#      - above: 0
      - below: 2.6
        then:
          - if:
              condition:
                #lambda: 'return id(presence_canape_dr_sw).state = 1;'
                - switch.is_off: presence_canape_ce_sw
              then:
              - switch.turn_on: presence_canape_ce_sw
              - switch.turn_on: presence_canape_ce_led
              - text_sensor.template.publish:
                  id: canape_tele_ce
                  state: "occupé"
              - rtttl.play: 'assis:d=4,o=5,b=160:16f6,16c6'
      - above: 3.0
        below: 40
        then:
          - if:
              condition:
                #lambda: 'return id(presence_canape_dr_sw).state = 1;'
                - switch.is_on: presence_canape_ce_sw
              then:
          - switch.turn_off: presence_canape_ce_sw
          - switch.turn_off: presence_canape_ce_led
          - text_sensor.template.publish:
              id: canape_tele_ce
              state: "libre"
          - rtttl.play: 'leve:d=4,o=5,b=160:16c6,16f6'
#      - above: 50
#        below: 100
#        then:
#          - switch.turn_off: presence_canape_ce_sw
#          - switch.turn_off: presence_canape_ce_led
#          - text_sensor.template.publish:
#              id: canape_tele_ce
#              state: "incident"
#          - logger.log: 'return id(pulse_width_sensor_centre).state'

  - platform: pulse_width
    pin: D1
    internal: true
#    device_class: "frequency"
    unit_of_measurement: "kHz"
    icon: "mdi:sine-wave"
    update_interval: 3s
    name: Pulse Width Sensor Gauche
    filters:
    - lambda: return ( 1 / (x*2) ) / 1000;
    - median:
        window_size: 5
        send_every: 3
        send_first_at: 3
    on_value_range:
      - below: 2.6
        then:
          - if:
              condition:
                #lambda: 'return id(presence_canape_dr_sw).state = 1;'
                - switch.is_off: presence_canape_ga_sw
              then:
          - switch.turn_on: presence_canape_ga_sw
          - switch.turn_on: presence_canape_ga_led
          - text_sensor.template.publish:
              id: canape_tele_ga
              state: "occupé"
          - rtttl.play: 'assis:d=4,o=5,b=160:16f6,16c6'
      - above: 3.0
        below: 40
        then:
          - if:
              condition:
                #lambda: 'return id(presence_canape_dr_sw).state = 1;'
                - switch.is_on: presence_canape_ga_sw
              then:
          - switch.turn_off: presence_canape_ga_sw
          - switch.turn_off: presence_canape_ga_led
          - text_sensor.template.publish:
              id: canape_tele_ga
              state: "libre"
          - rtttl.play: 'leve:d=4,o=5,b=160:16c6,16f6'









output:
  - platform: esp8266_pwm
    pin: D8
    id: rtttl_canape


switch:
  - platform: template
    optimistic: true
    restore_state: true
    id: presence_canape_dr_sw
    name: "Présence canapé droite"
  - platform: template
    optimistic: true
    restore_state: true
    id: presence_canape_ce_sw
    name: "Présence canapé centre"
  - platform: template
    optimistic: true
    restore_state: true
    id: presence_canape_ga_sw
    name: "Présence canapé gauche"
    



  - platform: gpio
    id: presence_canape_dr_led
 #   restore_state: true
    pin: GPIO12       # D6
    inverted: false
  - platform: gpio
    id: presence_canape_ce_led
 #   restore_state: true
    pin: GPIO14       # D5
    inverted: false
  - platform: gpio
    id: presence_canape_ga_led
 #   restore_state: true
    pin: GPIO16       # D0
    inverted: false


binary_sensor:

rtttl:
  output: rtttl_canape
  on_finished_playback:
    - logger.log: 'Fin de lecture ...'


# 
text_sensor:
  - platform: template
    name: "Canapé s.télé Droite"
    id: canape_tele_dr
  - platform: template
    name: "Canapé s.télé Centre"
    id: canape_tele_ce
  - platform: template
    name: "Canapé s.télé Gauche"
    id: canape_tele_ga

voilà pour la partie code,
comme vous le verez, il y a pas mal d’essais en commentaires,
les valeurs de fréquences haute et basse sont a adapter sur des essais réels et cela va dépendre de l’épaisseur du coussin qui va appuyer sur le condensateur quand il y a personne

j’ai aussi du utiliser une fonction pour ‹ lisser › les résultats pour éviter les erreurs de lecture, cela donne un résultat pratiquement sans erreur mais un peu plus lent !
et pour répndre a @Pulpy-Luke je ne peut pas vraiement mettre en pause la série dès le lever a cause de ce décalage de quelques secondes, en moyenne je suis a 10/20s de décalage
je voulais mettre une fonction du genre ‹ trend › que l’on trouve danbs HA mais elle n’existe visiblement pas dans esphome, cela m’aurais permis d’aller plus vite dans la détection

bonne lecture,
Stéphane

J’imagine que tu dois pouvoir détecter des patterns d’utilisation du canapé « anormal » et détecter qu’une activité non euh … conforme ou adéquate au canapé est faite de celui ci, et déclencher une demande de passer dans une chambre…

Bien entendu, je parle des enfants qui sautent sur le canapé, vous aviez compris !

Bon plus sérieusement l’idee est vraiment excellente !

1 « J'aime »

Dommage mais logique.
C’est pas applicable partout mais tu peux faire pause + rembobinage 20sec?

Bonjour,
c’est une bonne idée mais vu le décalage de traitement, il faudrait peut etre augmenter le nombre de mesures mais je pense qu’il serait aussi difficile de détecter des sauts qu’une différence de poids !

Oui, c’est pratique :grin:
Mais comme il y a 3 détecteurs, il va falloir synchroniser les pauses pipi :joy:.

2 « J'aime »

MDR. J’adore !!
Comme quoi, pas de limite à l’imagination dans la domotique. Reste à déposer le brevet :sweat_smile: :sweat_smile: :sweat_smile:

1 « J'aime »

Prendre une photo de mon chien quand il monte sur le canapé pendant la nuit pour dormir.

Afin de pouvoir l’engueuler, car le matin il retourne dans son panier avant le réveil pour pas se faire choper :joy:

Fini l’impunité canin !!

4 « J'aime »

détection de personnes sur un lit :slight_smile: permet de lancer un scénario si les deux personnes sont au lit :slight_smile: