!!!ABGELÖST!!! [74_XiaomiFlowerSens.pm] Xiaomi Flower Monitor

Begonnen von CoolTux, 17 November 2016, 13:25:06

Vorheriges Thema - Nächstes Thema

KernSani

Zitat von: mi.ke am 26 März 2017, 14:05:21
Ich hab seit einem halben Jahr einen direkt im Beet (volle Umwelteinflüsse), einen etwas geschützt im Blumenkübel und einen direkt an die Hauswand genagelt (in die pralle Sonne)

Nach einem halbel Jahr incl. Schnee und reichlich Minusgraden, sowie jetzt in der direkten Sonneneinstahlung :
Bisher keine Ausfälle, Batterie bei 82%.
Hmmm... Dann vielleicht doch mal einen bestellen, wenn Ali wieder welche hat... Bleibt noch die Frage mit der Reichweite, aber im Zweifelsfall kann ich mir ja noch einen RasPi in den Schuppen hängen... 
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

mi.ke

Zitat von: KernSani am 27 März 2017, 00:14:56
vielleicht doch mal einen bestellen, wenn Ali wieder welche hat...

ich bestell immer 5er-weise bei:
https://www.fasttech.com/product/5258000-authentic-xiaomi-mi-bluetooth-v4-1-flower-care

Die ersten 15 kamen ohne Umweg direkt und ohne Nachforderungen nach 6-8 Wochen an  8)

Zitat von: KernSani am 27 März 2017, 00:14:56
Bleibt noch die Frage mit der Reichweite, aber im Zweifelsfall kann ich mir ja noch einen RasPi in den Schuppen hängen... 

naja: Bluetooth ca/ungefähr 10 m
bei mir ist der "schlechteste" Empfang durch 2 Wänden bei ca. 7m.
Ich frag alle Std. ab, selbst bei 2-3 Ausfällen pro Tag, die Feuchtigkeit ist ja nicht sofort/plötzlich weg (Topfpflanze).
Bei der für mich "zeitkritischen" Abfrage (wie Lux/Beschattung) ist nur ein Fenster und ein paar Meter dazwischen und somit kein Problem. Allerdings hab ich meine RPi's auch strategisch gut verteilt. ;D

Hope this helps

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

CoolTux

minLux und maxLux sind nun enthalten. Ab morgen früh per Update.

Hat schon jemand Erfahrung mit einem Event machen können?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ToM_ToM

Hey CoolTux,

super. Vielen Dank! :)

Und zum Thema: Sensoren bei Ali...
Da gibt's doch jede Menge von so vielen verschiedenen Händlern.... Verstehe nicht warum die "ausverkauft" sein sollen.... :o
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

andi11

Zitat von: CoolTux am 27 März 2017, 11:06:57
minLux und maxLux sind nun enthalten. Ab morgen früh per Update.

Hat schon jemand Erfahrung mit einem Event machen können?
Seh ich das recht im Source dass mit min und maxlux immer der Luxwert überprüft wird, unabhängig davon ob gerade Tag/Nacht ist?

CoolTux

Zitat von: andi11 am 27 März 2017, 18:50:11
Seh ich das recht im Source dass mit min und maxlux immer der Luxwert überprüft wird, unabhängig davon ob gerade Tag/Nacht ist?

Korrekt. Den Rest muss der User entscheiden. Es wäre ja auch möglich das der Sensor in Gewächshäusern mit speziellen Lampen verwendet werden soll.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andi11

Zitat von: CoolTux am 27 März 2017, 18:54:58
Korrekt. Den Rest muss der User entscheiden. Es wäre ja auch möglich das der Sensor in Gewächshäusern mit speziellen Lampen verwendet werden soll.
Meine Pflänzchen kriegen noch etwas Kunstlicht. Aber auch da kriegt kein Pflänzchen 24h Licht ;)

nesges

Hier zwei Funktionen die ich mit den Werten des Moduls nutze.

"flower_icon" zeigt die aktuellen "Bedürfnisse" meiner Pflanzen an. "flower_today" addiert die Zeiten an denen ein Reading (typischerweise "lux") über dem min-Schwellwert gelegen hat auf. Es wird ein umfangreiches Set an User-Attributen benötigt:

iconPriority iconColor fertilityRange moistureRange temperatureRange luxRange fertilityIcon moistureIcon temperatureIcon luxIcon fertilityColor moistureColor temperatureColor luxColor fertilityText moistureText temperatureText luxText

Die Range-Attribute können durch die neuen min/max-Attribute ersetzt werden (diese hätten auch Priorität ggü. *Range). Allen Attributen mit Reading-Bezug (moistureRange, moistureColor, moistureColor...) gemein ist, dass sie ein kommagetrenntes Wertepaar aus min- und max-Schwellwert für das Reading erwarten, zB:

attr FLOWER temperatureIcon temp_temperature_min,temp_temperature_max

Jeder Wert kann auch weg gelassen werden. Bei "lux" ist eine Obergrenze idR nicht sinnvoll, man definiert daher zB:

attr FLOWER luxRange 4000,

Ansonsten hoffe ich, dass die Attribute selbsterklärend sind, wenn man weiss dass sie a) zur Darstellung eines "Bedürfnisses" als gefärbtes devStateIcon und b) als Texthinweis genutzt werden. Der Screenshot im Anhang verdeutlicht die Anwendung: "Olof Palme" ist vor allem zu trocken (das hellblaue Tropfenicon) aber ihm ist es auch zu "hell" und der Boden ist "ausgelaugt". Welches Bedürfnis vorrangig als Icon dargestellt werden soll, wird über das Attribut iconPriority gesteuert. Der Standard ist: "temperature lux fertility moisture" (aufsteigende Priorität). "iconColor" (Default "green") kommt zum tragen, wenn alle Readings im Wunschbereich sind und das Standardicon (Attribut "icon" sonst "weather_pollen") angezeigt wird.  (BTW webCmd zur Anzeige von Text zu verwenden ist missbräuchlich, wenn jemand eine bessere Alternative hat, baue ich das gerne um).

Für alle *Icon *Color *Text-Attribute sind Defaults vorbelegt, es sind nur *Range bzw min* und max* zu setzen. Minimal-Beispiel:

devStateIcon { flower_icon($name) }
maxFertility 2000
maxMoisture 60
maxTemp    32
minFertility 500
minLux     4000
minMoisture 20
minTemp    5
userReadings luxToday:lux.* { flower_today($name, 'lux') }


Maximal-Beispiel:

devStateIcon { flower_icon($name) }
fertilityColor brown,red
fertilityIcon poop,poop
fertilityRange 500,2000
fertilityText ausgelaugt,überdüngt
icon       leaf
iconPriority temperature lux fertility moisture
luxColor   orange,red
luxIcon    sun-o,sun-o
luxRange   4000,
luxText    dunkel,hell
moistureColor lightblue,red
moistureIcon tint,tint
moistureRange 20,60
moistureText trocken,nass
temperatureColor lightblue,red
temperatureIcon temp_temperature_min,temp_temperature_max
temperatureRange 5,32
temperatureText kalt,heiss
userReadings luxToday:lux.* { flower_today($name, 'lux') }, luxWeek:lux.* monotonic {ReadingsNum($name,'luxToday',0)}, luxMonth:lux.* monotonic {ReadingsNum($name,'luxToday',0)}
userattr   iconPriority iconColor fertilityRange moistureRange temperatureRange luxRange fertilityIcon moistureIcon temperatureIcon luxIcon fertilityColor moistureColor temperatureColor luxColor fertilityText moistureText temperatureText luxText


Und hier die beiden Funktionen:

sub flower_icon($;$$) {
    my $name = shift;
    my $icon = shift || AttrVal($name, 'icon', 'weather_pollen');
    my $color = shift || AttrVal($name, 'iconColor', 'green');

    my %r;
    $r{fertility}   = ReadingsVal($name, 'fertility', undef);
    $r{moisture}    = ReadingsVal($name, 'moisture', undef);
    $r{temperature} = ReadingsVal($name, 'temperature', undef);
    $r{lux}         = ReadingsVal($name, 'lux', undef);

    my %range;
    @{$range{fertility}}    = split(/,/, AttrVal($name, 'fertilityRange', undef));
    @{$range{moisture}}     = split(/,/, AttrVal($name, 'moistureRange', undef));
    @{$range{temperature}}  = split(/,/, AttrVal($name, 'temperatureRange', undef));
    @{$range{lux}}          = split(/,/, AttrVal($name, 'luxRange', undef));
   
    # new min/max*-attributes overwrite *Range-attributes
    $range{fertility}[0]    = AttrVal($name, 'minFertility', $range{fertility}[0]);
    $range{fertility}[1]    = AttrVal($name, 'maxFertility', $range{fertility}[1]);
    $range{moisture}[0]     = AttrVal($name, 'minMoisture', $range{moisture}[0]);
    $range{moisture}[1]     = AttrVal($name, 'maxMoisture', $range{moisture}[1]);
    $range{temperature}[0]  = AttrVal($name, 'minTemp', $range{temperature}[0]);
    $range{temperature}[1]  = AttrVal($name, 'maxTemp', $range{temperature}[1]);
    $range{lux}[0]          = AttrVal($name, 'minLux', $range{lux}[0]);
    $range{lux}[1]          = AttrVal($name, 'maxLux', $range{lux}[1]);
   
    my %icon;
    @{$icon{fertility}}     = split(/,/, AttrVal($name, 'fertilityIcon', 'scene_toilet_alternat,scene_toilet_alternat'));
    @{$icon{moisture}}      = split(/,/, AttrVal($name, 'moistureIcon', 'sani_irrigation,humidity'));
    @{$icon{temperature}}   = split(/,/, AttrVal($name, 'temperatureIcon', 'temp_temperature_min,temp_temperature_max'));
    @{$icon{lux}}           = split(/,/, AttrVal($name, 'luxIcon', 'weather_sun,weather_sun'));
   
    my %color;
    @{$color{fertility}}    = split(/,/, AttrVal($name, 'fertilityColor', 'brown,red'));
    @{$color{moisture}}     = split(/,/, AttrVal($name, 'moistureColor', 'lightblue,red'));
    @{$color{temperature}}  = split(/,/, AttrVal($name, 'temperatureColor', 'lightblue,red'));
    @{$color{lux}}          = split(/,/, AttrVal($name, 'luxColor', 'orange,red'));
   
    my %text;
    @{$text{fertility}}     = split(/,/, AttrVal($name, 'fertilityText', 'ausgelaugt,ueberduengt'));
    @{$text{moisture}}      = split(/,/, AttrVal($name, 'moistureText', 'trocken,nass'));
    @{$text{temperature}}   = split(/,/, AttrVal($name, 'temperatureText', 'kalt,heiss'));
    @{$text{lux}}           = split(/,/, AttrVal($name, 'luxText', 'dunkel,hell'));

    my @priority  = split(/ /, AttrVal($name, 'iconPriority', 'temperature lux fertility moisture'));
   
    my @webcmd;
    foreach my $reading (@priority) {
        if(defined($range{$reading}[0]) && $r{$reading} < $range{$reading}[0]) {
            $icon = $icon{$reading}[0];
            $color = $color{$reading}[0];
            push @webcmd, $text{$reading}[0];
        } elsif(defined($range{$reading}[1]) && $r{$reading} > $range{$reading}[1]) {
            $icon = $icon{$reading}[1];
            $color = $color{$reading}[1];
            push @webcmd, $text{$reading}[1];
        }
    }
   
    $attr{$name}{webCmd} = join(":", @webcmd);
    return '.*:'.$icon.'@'.$color;
}

sub flower_today($$;$$) {
    my $device = shift;
    my $reading = shift || 'lux';
    my $todayr = shift || $reading.'Today';
    my $ranger = shift || $reading.'Range';
   
    my ($low,$high) = split(',', AttrVal($device, $ranger, '0,0'));
    # new min/max*-attributes overwrite *Range-attributes
    $low = AttrVal($device, 'min'.ucfirst($reading), $low);
    $high = AttrVal($device, 'max'.ucfirst($reading), $high);
    my $age=ReadingsAge($device, $reading, undef);
    my $value = ReadingsNum($device, $reading, 0);
    my $today = ReadingsNum($device, $todayr, 0);
   
    # addiere age zu today
    # WENN low nicht gesetzt ODER value >= low
    # UND high nicht gesetzt ODER value <= high
    if((!$low || $value >= $low) && (!$high || $value <= $high)) {
        return $today + $age;
    }
    # sonst nur today
    return $today;
}

roedert

Hast du noch das gplot-File dazu? Wie bekomme ich den Bereich zwischen min und max wie in dem ersten Plot violett eingefärbt?

nesges

Die gplot-Files im Anhang sind etwas erweitert. Dazu gehört jeweils ein Attribut plotReplace mit folgendem Inhalt (entsprechend anpassen):

SVG_DBLOG1_W_FLOWER_TEMPLATE_Boden:
NAME=Maibaum
DEVICE=W_FLOWER_Birke
DEVICE_THERMO=A_HUMID
MINFERTILITY=500
MAXFERTILITY=2000
MINMOISTURE=20
MAXMOISTURE=60


SVG_DBLOG1_W_FLOWER_TEMPLATE_Temperatur:
NAME=Maibaum
DEVICE=W_FLOWER_Birke
DEVICE_THERMO=A_HUMID
MINTEMP=5
MAXTEMP=32


SVG_DBLOG1_W_FLOWER_TEMPLATE_Licht:
NAME=Maibaum
DEVICE=W_FLOWER_Birke
MINLUX=4000


DBLOG1 dürfte klar sein, LP muss ggf. umbenannt oder angelegt werden:
define LP logProxy

Damit die Templates genau so funktionieren wird darüber hinaus folgendes benötigt:

Das Licht-Template benötigt die Funktion zur Umrechnung von s in min:
sub logproxyDiv60($$) {     
    my($devspec,$array) = @_;
    foreach my $point ( @{$array} ) {
        $point->[1] /= 60;
    }   
    return $array;
}


flower_today() habe ich etwas erweitert:
sub flower_today($$;$$) {
    my $device = shift;
    my $reading = shift || 'lux';
    my $ranger = shift || $reading.'Range';
    my $todayr = shift || $reading.'Today';
   
    my $today = ReadingsNum($device, $todayr, 0);
    my $age=ReadingsAge($device, $reading, undef);
   
    if($ranger ne 'ignore') {
        my ($low,$high) = split(',', AttrVal($device, $ranger, '0,0'));
        # new min/max*-attributes overwrite *Range-attributes
        $low = AttrVal($device, 'min'.ucfirst($reading), $low);
        $high = AttrVal($device, 'max'.ucfirst($reading), $high);
        my $value = ReadingsNum($device, $reading, 0);
       
        # addiere age zu today
        # WENN low nicht gesetzt ODER value >= low
        # UND high nicht gesetzt ODER value <= high
        if((!$low || $value >= $low) && (!$high || $value <= $high)) {
            return $today + $age;
        }
    } else {
        return $today + $age;
    }
    # sonst nur today
    return $today;
}


Das Userreading luxTodayFull erhält man mit:
luxTodayFull { flower_today($name, 'lux', 'ignore', 'luxTodayFull') },

Beispiel-Def:
define SVG_DBLOG1_W_FLOWER_Birke SVG LP:SVG_DBLOG1_W_FLOWER_TEMPLATE_Boden:HISTORY
attr SVG_DBLOG1_W_FLOWER_Birke plotReplace NAME=Maibaum\
DEVICE=W_FLOWER_Birke\
DEVICE_THERMO=A_HUMID\
MINFERTILITY=500\
MAXFERTILITY=2000\
MINMOISTURE=20\
MAXMOISTURE=60
attr SVG_DBLOG1_W_FLOWER_Birke room Pflanzen


Die Templates nicht im SVG-Editor bearbeiten, der löscht y3 und damit die Anzeige der Nachtstunden.

sash.sc

Was soll eigentlich passieren, wenn die min und max Werte, z.b.bei moisture, gesetzt sind, und diese unterschritten werden?

Gruß Sascha

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

roedert

Steht in der Doku.....
erzeugt zusätzlich einen Low bzw High-Event

sash.sc

Steht zwar drin, wird bei mir aber nicht so angezeigt !


Internals:
   BTMAC      C4:7C:8D:62:A2:A9
   DEF        C4:7C:8D:62:A2:A9
   INTERVAL   900
   NAME       blume
   NR         420
   STATE      active
   TYPE       XiaomiFlowerSens
   VERSION    1.0.1
   Readings:
     2017-03-31 21:30:30   battery         ok
     2017-03-31 21:30:30   batteryLevel    66
     2017-03-31 21:30:30   fertility       355
     2017-03-31 21:30:30   firmware        2.9.2
     2017-03-31 18:32:37   lastGattError   Unknown Error, look at verbose 5 output
     2017-03-31 21:30:30   lux             0
     2017-03-31 21:30:30   moisture        28
     2017-03-31 21:30:30   state           active
     2017-03-31 21:30:30   temperature     22.7
   Helper:
Attributes:
   devStateIcon active:scene_garden@lime unreachable:scene_garden@red
   event-min-interval .*:900
   event-on-change-reading .*
   hciDevice  hci0
   interval   900
   maxMoisture 65
   minMoisture 40
   room       FlowerSens
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

roedert

Es wird ein Event ausgelöst ... das siehst du doch nicht in den Internals. Sieht im Eventviewer zB so aus (die letzten beiden Zeilen):

2017-03-31 21:32:55 XiaomiFlowerSens Wohnzimmer.Geldbaum call data
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum batteryLevel: 100
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum battery: ok
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum temperature: 21
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum lux: 0
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum moisture: 7
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum fertility: 5
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum firmware: 2.6.2
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum active
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum minMoisture low
2017-03-31 21:32:58 XiaomiFlowerSens Wohnzimmer.Geldbaum maxMoisture ok

CoolTux

Wie bereits korrekt gesagt wird lediglich ein Event ausgelöst, jedoch kein Reading gesetzt. Das ist auch nicht nötig.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net