Oral B Zahnbürste einbinden

Begonnen von Hardlife, 10 Juni 2023, 00:02:09

Vorheriges Thema - Nächstes Thema

Hardlife

Hi liebe Com,

mit etwas Tüftelei und Trial&Error ist es mir gelungen, meine Oral B Zahnbürste in FHEM einzubinden.
Ich stelle das mal hier rein, falls es evenuell noch jemanden interessiert...

Vorab:
Bitte um Nachsicht - sicher kann man einiges eleganter lösen - Aber ich bin hier wirklich nicht der große Coder oder RegExer.

Mein Zahnbürste ist eine Oral-B Genius X - diese arbeitet mit Bluetooth als Brücke zur Handy-App.
Das Beispiel geht aber auch für andere Bluetooth-Oral-B-Zahnbürsten.

Ich steuere damit vorerst mal als kleinen Jux einen milight LED-Stripe und eine Sprachausgabe per Fully.
Erweiterungsmöglichkeiten aber wie immer je nach Gusto...

Für den Empfang wird benötigt:
https://github.com/vogler/smart-home/blob/master/toothbrush2mqtt.py
(Läuft bei mir auf dem FHEM-Raspberry Pi 4b, welcher Bluetooth aktiviert hat)

Anbei das Codeschnipsel für die fhem.cfg, bzw. hier nochmal eingebettet - ziemlich selbsterklärend:
# (Oral B Genius X - Eingebunden per Bluetoth über Raspberry Pi)
# siehe "https://github.com/vogler/smart-home/blob/master/toothbrush2mqtt.py"
### MQTT-Device definieren
#
define Zahnbuerste_OralB_GeniusX_Mario MQTT_DEVICE
attr Zahnbuerste_OralB_GeniusX_Mario IODev FHEM_Mosquito_MQTT_IO_Handler
attr Zahnbuerste_OralB_GeniusX_Mario subscribeReading_UNDEFINED Wohnung/Bad/Zahnbuerste/OralB_GeniusX_Zahnbuerste_Mario
attr Zahnbuerste_OralB_GeniusX_Mario publishSet_UNDEFINED Wohnung/Bad/Zahnbuerste/OralB_GeniusX_Zahnbuerste_Mario
attr Zahnbuerste_OralB_GeniusX_Mario icon tooth_1@14DDE0
attr Zahnbuerste_OralB_GeniusX_Mario alias Zahnbürste&nbspMario
attr Zahnbuerste_OralB_GeniusX_Mario event-on-change-reading .*
#attr Zahnbuerste_OralB_GeniusX_Mario room TEST
#attr Zahnbuerste_OralB_GeniusX_Mario sortby 02
attr Zahnbuerste_OralB_GeniusX_Mario group Zahnbürsten
#
#
### UserReadings per regex, um aus dem MQTT-Reading "UNDEFINED" etwas Passables zu extrahieren:
#
## Hier die Readings einzeln aufgelistet
## (müssen aber unter EINEM Attribut zusammengefassst werden,
## damit alle funktionieren - es gibt nur 1 "attr" userreadings)
#
### =>  Beispiel für false|true an/aus
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings Eingeschaltet {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"running":\s(false|true),\s/) {return $1}}
### => Beispiel für pressure
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings Anpressdruck {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"pressure":\s([0-9]|[0-9][0-9][0-9]),\s/) {return $1}}
### => Beispiel für time
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings Putzzeit {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"time":\s([0-9]|[0-9][0-9]|[0-9][0-9][0-9]),\s/) {return $1}}
### => Beispiel für mode
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings Putzmodus {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"mode":\s([0-9]),\s/) {return $1}}
### => Beispiel für quadrant
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings Quadrant {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"quadrant":\s([0-9]),\s/) {return $1}}
### => Beispiel für quadrant_percentage
#attr Zahnbuerste_OralB_GeniusX_Mario userReadings QuadrantFortschritt {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"quadrant_percentage":\s([0-9]|[0-9][0-9]|[0-9][0-9][0-9])}/) {return $1}}
#
### Passend für alle obigen Readings:
attr Zahnbuerste_OralB_GeniusX_Mario userReadings Eingeschaltet {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"running":\s(false|true),\s/) {return $1}}, Anpressdruck {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"pressure":\s([0-9]|[0-9][0-9][0-9]),\s/) {return $1}}, Putzzeit {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"time":\s([0-9]|[0-9][0-9]|[0-9][0-9][0-9]),\s/) {return $1}}, Putzmodus {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"mode":\s([0-9]),\s/) {return $1}}, Quadrant {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"quadrant":\s([0-9]),\s/) {return $1}}, QuadrantFortschritt {if (ReadingsVal($NAME,'UNDEFINED','0') =~ /"quadrant_percentage":\s([0-9]|[0-9][0-9]|[0-9][0-9][0-9])}/) {return $1}}

### Readingsgroup zur schönen Darstellung:
define rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator readingsGroup Zahnbuerste_OralB_GeniusX_Mario:<%tooth_1@14DDE0>,<Status>,Eingeschaltet,<Anpressdruck>,Anpressdruck,<Putzzeit>,Putzzeit,<Quadrant>,Quadrant,<Quadrant-Fortschritts-Prozente>,QuadrantFortschritt,<Putzmodus>,Putzmodus
attr rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator alias Marios-Zahnbürste
attr rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator group Zahnbürsten
attr rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator room Bad
attr rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator valueIcon {'Eingeschaltet.true' => 'general_an@green', 'Eingeschaltet.false' => 'general_aus@red','Anpressdruck.0' => 'message_ok@green','Anpressdruck.1' => 'message_ok@green', 'Anpressdruck.100' => 'message_attention@red'}
attr rg_Zahnbuerste_OralB_GeniusX_Mario_Indicator valueStyle style="text-align:right"

### LED Streifen im Bad nach Zeit schalten
define Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario notify Zahnbuerste_OralB_GeniusX_Mario:Eingeschaltet.* {\
if ((ReadingsVal("Zahnbuerste_OralB_GeniusX_Mario","Eingeschaltet","") eq "true") && (ReadingsVal("Urlaubs_Status_abwesend","state","") eq "NEIN")) { fhem ("set Bad_LED_Stripe HSV 0,100,80;; defmod Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Orange at +00:00:30 set Bad_LED_Stripe HSV 23,100,80;; defmod Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gelb at +00:01:00 set Bad_LED_Stripe HSV 60,100,80;; defmod Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen at +00:01:30 set Bad_LED_Stripe HSV 120,100,100;; defmod Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_off at +00:02:00 set Bad_LED_Stripe off;;");;}\
elsif ((ReadingsVal("Zahnbuerste_OralB_GeniusX_Mario","Eingeschaltet","") eq "false") && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Orange'})) && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gelb'})) && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen'}))) {fhem("delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Orange;; delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gelb;; delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen;; set Bad_LED_Stripe off");;}\
elsif ((ReadingsVal("Zahnbuerste_OralB_GeniusX_Mario","Eingeschaltet","") eq "false") && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gelb'})) && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen'}))) {fhem("delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gelb;; delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen;; set Bad_LED_Stripe off");;}\
elsif ((ReadingsVal("Zahnbuerste_OralB_GeniusX_Mario","Eingeschaltet","") eq "false") && (defined($defs{'Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen'}))) {fhem("delete Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario_Gruen;; set Bad_LED_Stripe off");;}\
elsif (ReadingsVal("Zahnbuerste_OralB_GeniusX_Mario","Eingeschaltet","") eq "false") {fhem("set Bad_LED_Stripe off");;}\
}
attr Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario group notify
#attr Bad_LED_Stripe_mit_Zahnbuerste_OralB_GeniusX_Mario room TEST

### Sprachansage auf Tablet im Bad
define DOIF_Zahnbuerste_OralB_GeniusX_Mario_FERTIG_Ansage DOIF ([Zahnbuerste_OralB_GeniusX_Mario:Eingeschaltet] eq "false" and [?Urlaubs_Status_abwesend] eq "NEIN") (set Haehne_Q86V_Tablet_Badezimmer_Fully speak 'Zähne fertig geputzt')
#attr DOIF_Zahnbuerste_OralB_GeniusX_Mario_FERTIG_Ansage room TEST
Raspi 4B
nanoCUL-868 & 433,JeeLink,milight,Signalduino,GPIO-433er-Sender/Empfänger, GPIO-Infrarot,GSM-Stick für SMS
MAX!-Heizungssteuerung,Intertechno-V1-Steckdosen + V3-Dimmer,"Flamingo FA21RF"-Funk-Rauchmelder
433er-China-Bewegungsmelder,"Voltcraft CO20"-Stick,LaCrosse-Temperatur,Revolt-NC5462